diff --git a/src/server/scripts/Commands/cs_account.cpp b/src/server/scripts/Commands/cs_account.cpp index d025774bb..83acf9f15 100644 --- a/src/server/scripts/Commands/cs_account.cpp +++ b/src/server/scripts/Commands/cs_account.cpp @@ -100,35 +100,35 @@ public: AccountOpResult result = AccountMgr::CreateAccount(std::string(accountName), std::string(password)); switch (result) { - case AOR_OK: - handler->PSendSysMessage(LANG_ACCOUNT_CREATED, accountName); - if (handler->GetSession()) - { - sLog->outDebug(LOG_FILTER_WARDEN, "Account: %d (IP: %s) Character:[%s] (GUID: %u) Change Password.", - handler->GetSession()->GetAccountId(), handler->GetSession()->GetRemoteAddress().c_str(), - handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow()); - } - break; - case AOR_NAME_TOO_LONG: - handler->SendSysMessage(LANG_ACCOUNT_TOO_LONG); - handler->SetSentErrorMessage(true); - return false; - case AOR_PASS_TOO_LONG: - handler->SendSysMessage(LANG_ACCOUNT_PASS_TOO_LONG); - handler->SetSentErrorMessage(true); - return false; - case AOR_NAME_ALREDY_EXIST: - handler->SendSysMessage(LANG_ACCOUNT_ALREADY_EXIST); - handler->SetSentErrorMessage(true); - return false; - case AOR_DB_INTERNAL_ERROR: - handler->PSendSysMessage(LANG_ACCOUNT_NOT_CREATED_SQL_ERROR, accountName); - handler->SetSentErrorMessage(true); - return false; - default: - handler->PSendSysMessage(LANG_ACCOUNT_NOT_CREATED, accountName); - handler->SetSentErrorMessage(true); - return false; + case AOR_OK: + handler->PSendSysMessage(LANG_ACCOUNT_CREATED, accountName); + if (handler->GetSession()) + { + sLog->outDebug(LOG_FILTER_WARDEN, "Account: %d (IP: %s) Character:[%s] (GUID: %u) Change Password.", + handler->GetSession()->GetAccountId(), handler->GetSession()->GetRemoteAddress().c_str(), + handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow()); + } + break; + case AOR_NAME_TOO_LONG: + handler->SendSysMessage(LANG_ACCOUNT_TOO_LONG); + handler->SetSentErrorMessage(true); + return false; + case AOR_PASS_TOO_LONG: + handler->SendSysMessage(LANG_ACCOUNT_PASS_TOO_LONG); + handler->SetSentErrorMessage(true); + return false; + case AOR_NAME_ALREDY_EXIST: + handler->SendSysMessage(LANG_ACCOUNT_ALREADY_EXIST); + handler->SetSentErrorMessage(true); + return false; + case AOR_DB_INTERNAL_ERROR: + handler->PSendSysMessage(LANG_ACCOUNT_NOT_CREATED_SQL_ERROR, accountName); + handler->SetSentErrorMessage(true); + return false; + default: + handler->PSendSysMessage(LANG_ACCOUNT_NOT_CREATED, accountName); + handler->SetSentErrorMessage(true); + return false; } return true; @@ -171,21 +171,21 @@ public: AccountOpResult result = AccountMgr::DeleteAccount(accountId); switch (result) { - case AOR_OK: - handler->PSendSysMessage(LANG_ACCOUNT_DELETED, accountName.c_str()); - break; - case AOR_NAME_NOT_EXIST: - handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str()); - handler->SetSentErrorMessage(true); - return false; - case AOR_DB_INTERNAL_ERROR: - handler->PSendSysMessage(LANG_ACCOUNT_NOT_DELETED_SQL_ERROR, accountName.c_str()); - handler->SetSentErrorMessage(true); - return false; - default: - handler->PSendSysMessage(LANG_ACCOUNT_NOT_DELETED, accountName.c_str()); - handler->SetSentErrorMessage(true); - return false; + case AOR_OK: + handler->PSendSysMessage(LANG_ACCOUNT_DELETED, accountName.c_str()); + break; + case AOR_NAME_NOT_EXIST: + handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str()); + handler->SetSentErrorMessage(true); + return false; + case AOR_DB_INTERNAL_ERROR: + handler->PSendSysMessage(LANG_ACCOUNT_NOT_DELETED_SQL_ERROR, accountName.c_str()); + handler->SetSentErrorMessage(true); + return false; + default: + handler->PSendSysMessage(LANG_ACCOUNT_NOT_DELETED, accountName.c_str()); + handler->SetSentErrorMessage(true); + return false; } return true; @@ -227,9 +227,9 @@ public: { Field* fieldsLogin = resultLogin->Fetch(); handler->PSendSysMessage(LANG_ACCOUNT_LIST_LINE, - fieldsLogin[0].GetCString(), name.c_str(), fieldsLogin[1].GetCString(), - fieldsDB[2].GetUInt16(), fieldsDB[3].GetUInt16(), fieldsLogin[3].GetUInt8(), - fieldsLogin[2].GetUInt8()); + fieldsLogin[0].GetCString(), name.c_str(), fieldsLogin[1].GetCString(), + fieldsDB[2].GetUInt16(), fieldsDB[3].GetUInt16(), fieldsLogin[3].GetUInt8(), + fieldsLogin[2].GetUInt8()); } else handler->PSendSysMessage(LANG_ACCOUNT_LIST_ERROR, name.c_str()); @@ -367,19 +367,19 @@ public: AccountOpResult result = AccountMgr::ChangePassword(handler->GetSession()->GetAccountId(), std::string(newPassword)); switch (result) { - case AOR_OK: - handler->SendSysMessage(LANG_COMMAND_PASSWORD); - sScriptMgr->OnPasswordChange(handler->GetSession()->GetAccountId()); - break; - case AOR_PASS_TOO_LONG: - handler->SendSysMessage(LANG_PASSWORD_TOO_LONG); - sScriptMgr->OnFailedPasswordChange(handler->GetSession()->GetAccountId()); - handler->SetSentErrorMessage(true); - return false; - default: - handler->SendSysMessage(LANG_COMMAND_NOTCHANGEPASSWORD); - handler->SetSentErrorMessage(true); - return false; + case AOR_OK: + handler->SendSysMessage(LANG_COMMAND_PASSWORD); + sScriptMgr->OnPasswordChange(handler->GetSession()->GetAccountId()); + break; + case AOR_PASS_TOO_LONG: + handler->SendSysMessage(LANG_PASSWORD_TOO_LONG); + sScriptMgr->OnFailedPasswordChange(handler->GetSession()->GetAccountId()); + handler->SetSentErrorMessage(true); + return false; + default: + handler->SendSysMessage(LANG_COMMAND_NOTCHANGEPASSWORD); + handler->SetSentErrorMessage(true); + return false; } return true; @@ -438,7 +438,7 @@ public: // Let set addon state only for lesser (strong) security level // or to self account if (handler->GetSession() && handler->GetSession()->GetAccountId() != accountId && - handler->HasLowerSecurityAccount(nullptr, accountId, true)) + handler->HasLowerSecurityAccount(nullptr, accountId, true)) return false; int expansion = atoi(exp); //get int anyway (0 if error) @@ -628,21 +628,21 @@ public: switch (result) { - case AOR_OK: - handler->SendSysMessage(LANG_COMMAND_PASSWORD); - break; - case AOR_NAME_NOT_EXIST: - handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str()); - handler->SetSentErrorMessage(true); - return false; - case AOR_PASS_TOO_LONG: - handler->SendSysMessage(LANG_PASSWORD_TOO_LONG); - handler->SetSentErrorMessage(true); - return false; - default: - handler->SendSysMessage(LANG_COMMAND_NOTCHANGEPASSWORD); - handler->SetSentErrorMessage(true); - return false; + case AOR_OK: + handler->SendSysMessage(LANG_COMMAND_PASSWORD); + break; + case AOR_NAME_NOT_EXIST: + handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str()); + handler->SetSentErrorMessage(true); + return false; + case AOR_PASS_TOO_LONG: + handler->SendSysMessage(LANG_PASSWORD_TOO_LONG); + handler->SetSentErrorMessage(true); + return false; + default: + handler->SendSysMessage(LANG_COMMAND_NOTCHANGEPASSWORD); + handler->SetSentErrorMessage(true); + return false; } return true; } diff --git a/src/server/scripts/Commands/cs_arena.cpp b/src/server/scripts/Commands/cs_arena.cpp index d960633e5..bce5519c9 100644 --- a/src/server/scripts/Commands/cs_arena.cpp +++ b/src/server/scripts/Commands/cs_arena.cpp @@ -141,7 +141,7 @@ public: if (!*_args) return false; - char* args = (char *)_args; + char* args = (char*)_args; char const* oldArenaStr = handler->extractQuotedArg(args); if (!oldArenaStr) @@ -311,7 +311,7 @@ public: found = true; continue; } - } + } } if (!found) diff --git a/src/server/scripts/Commands/cs_ban.cpp b/src/server/scripts/Commands/cs_ban.cpp index 4ca9037ca..f35f33b89 100644 --- a/src/server/scripts/Commands/cs_ban.cpp +++ b/src/server/scripts/Commands/cs_ban.cpp @@ -109,26 +109,26 @@ public: switch (sBan->BanCharacter(name, durationStr, reasonStr, handler->GetSession() ? handler->GetSession()->GetPlayerName() : "")) { - case BAN_SUCCESS: - if (atoi(durationStr) > 0) - { - if (!sWorld->getBoolConfig(CONFIG_SHOW_BAN_IN_WORLD)) - handler->PSendSysMessage(LANG_BAN_YOUBANNED, name.c_str(), secsToTimeString(TimeStringToSecs(durationStr), true).c_str(), reasonStr); - } - else - { - if (!sWorld->getBoolConfig(CONFIG_SHOW_BAN_IN_WORLD)) - handler->PSendSysMessage(LANG_BAN_YOUPERMBANNED, name.c_str(), reasonStr); - } - break; - case BAN_NOTFOUND: - { - handler->PSendSysMessage(LANG_BAN_NOTFOUND, "character", name.c_str()); - handler->SetSentErrorMessage(true); - return false; - } - default: - break; + case BAN_SUCCESS: + if (atoi(durationStr) > 0) + { + if (!sWorld->getBoolConfig(CONFIG_SHOW_BAN_IN_WORLD)) + handler->PSendSysMessage(LANG_BAN_YOUBANNED, name.c_str(), secsToTimeString(TimeStringToSecs(durationStr), true).c_str(), reasonStr); + } + else + { + if (!sWorld->getBoolConfig(CONFIG_SHOW_BAN_IN_WORLD)) + handler->PSendSysMessage(LANG_BAN_YOUPERMBANNED, name.c_str(), reasonStr); + } + break; + case BAN_NOTFOUND: + { + handler->PSendSysMessage(LANG_BAN_NOTFOUND, "character", name.c_str()); + handler->SetSentErrorMessage(true); + return false; + } + default: + break; } return true; @@ -191,16 +191,16 @@ public: switch (mode) { - case BAN_ACCOUNT: - banReturn = sBan->BanAccount(nameOrIP, durationStr, reasonStr, handler->GetSession() ? handler->GetSession()->GetPlayerName() : ""); - break; - case BAN_CHARACTER: - banReturn = sBan->BanAccountByPlayerName(nameOrIP, durationStr, reasonStr, handler->GetSession() ? handler->GetSession()->GetPlayerName() : ""); - break; - case BAN_IP: - default: - banReturn = sBan->BanIP(nameOrIP, durationStr, reasonStr, handler->GetSession() ? handler->GetSession()->GetPlayerName() : ""); - break; + case BAN_ACCOUNT: + banReturn = sBan->BanAccount(nameOrIP, durationStr, reasonStr, handler->GetSession() ? handler->GetSession()->GetPlayerName() : ""); + break; + case BAN_CHARACTER: + banReturn = sBan->BanAccountByPlayerName(nameOrIP, durationStr, reasonStr, handler->GetSession() ? handler->GetSession()->GetPlayerName() : ""); + break; + case BAN_IP: + default: + banReturn = sBan->BanIP(nameOrIP, durationStr, reasonStr, handler->GetSession() ? handler->GetSession()->GetPlayerName() : ""); + break; } switch (banReturn) @@ -208,7 +208,7 @@ public: case BAN_SUCCESS: if (atoi(durationStr) > 0) { - if (!sWorld->getBoolConfig(CONFIG_SHOW_BAN_IN_WORLD)) + if (!sWorld->getBoolConfig(CONFIG_SHOW_BAN_IN_WORLD)) handler->PSendSysMessage(LANG_BAN_YOUBANNED, nameOrIP.c_str(), secsToTimeString(TimeStringToSecs(durationStr), true).c_str(), reasonStr); } else @@ -292,9 +292,8 @@ public: bool permanent = (fields[1].GetUInt64() == uint64(0)); std::string banTime = permanent ? handler->GetAcoreString(LANG_BANINFO_INFINITE) : secsToTimeString(fields[1].GetUInt64(), true); handler->PSendSysMessage(LANG_BANINFO_HISTORYENTRY, - fields[0].GetCString(), banTime.c_str(), active ? handler->GetAcoreString(LANG_YES) : handler->GetAcoreString(LANG_NO), fields[4].GetCString(), fields[5].GetCString()); - } - while (result->NextRow()); + fields[0].GetCString(), banTime.c_str(), active ? handler->GetAcoreString(LANG_YES) : handler->GetAcoreString(LANG_NO), fields[4].GetCString(), fields[5].GetCString()); + } while (result->NextRow()); return true; } @@ -340,9 +339,8 @@ public: bool permanent = (fields[1].GetUInt32() == uint32(0)); std::string banTime = permanent ? handler->GetAcoreString(LANG_BANINFO_INFINITE) : secsToTimeString(fields[1].GetUInt64(), true); handler->PSendSysMessage(LANG_BANINFO_HISTORYENTRY, - fields[0].GetCString(), banTime.c_str(), active ? handler->GetAcoreString(LANG_YES) : handler->GetAcoreString(LANG_NO), fields[4].GetCString(), fields[5].GetCString()); - } - while (result->NextRow()); + fields[0].GetCString(), banTime.c_str(), active ? handler->GetAcoreString(LANG_YES) : handler->GetAcoreString(LANG_NO), fields[4].GetCString(), fields[5].GetCString()); + } while (result->NextRow()); return true; } @@ -372,8 +370,8 @@ public: Field* fields = result->Fetch(); bool permanent = !fields[6].GetUInt64(); handler->PSendSysMessage(LANG_BANINFO_IPENTRY, - fields[0].GetCString(), fields[1].GetCString(), permanent ? handler->GetAcoreString(LANG_BANINFO_NEVER) : fields[2].GetCString(), - permanent ? handler->GetAcoreString(LANG_BANINFO_INFINITE) : secsToTimeString(fields[3].GetUInt64(), true).c_str(), fields[4].GetCString(), fields[5].GetCString()); + fields[0].GetCString(), fields[1].GetCString(), permanent ? handler->GetAcoreString(LANG_BANINFO_NEVER) : fields[2].GetCString(), + permanent ? handler->GetAcoreString(LANG_BANINFO_INFINITE) : secsToTimeString(fields[3].GetUInt64(), true).c_str(), fields[4].GetCString(), fields[5].GetCString()); return true; @@ -428,8 +426,7 @@ public: Field* fields2 = banResult->Fetch(); handler->PSendSysMessage("%s", fields2[0].GetCString()); } - } - while (result->NextRow()); + } while (result->NextRow()); } // Console wide output else @@ -466,8 +463,8 @@ public: if (fields2[0].GetUInt32() == fields2[1].GetUInt32()) { handler->PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d| permanent |%-15.15s|%-15.15s|", - accountName.c_str(), tmBan.tm_year%100, tmBan.tm_mon+1, tmBan.tm_mday, tmBan.tm_hour, tmBan.tm_min, - fields2[2].GetCString(), fields2[3].GetCString()); + accountName.c_str(), tmBan.tm_year % 100, tmBan.tm_mon + 1, tmBan.tm_mday, tmBan.tm_hour, tmBan.tm_min, + fields2[2].GetCString(), fields2[3].GetCString()); } else { @@ -475,15 +472,13 @@ public: tm tmUnban; localtime_r(&timeUnban, &tmUnban); handler->PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d|%02d-%02d-%02d %02d:%02d|%-15.15s|%-15.15s|", - accountName.c_str(), tmBan.tm_year%100, tmBan.tm_mon+1, tmBan.tm_mday, tmBan.tm_hour, tmBan.tm_min, - tmUnban.tm_year%100, tmUnban.tm_mon+1, tmUnban.tm_mday, tmUnban.tm_hour, tmUnban.tm_min, - fields2[2].GetCString(), fields2[3].GetCString()); + accountName.c_str(), tmBan.tm_year % 100, tmBan.tm_mon + 1, tmBan.tm_mday, tmBan.tm_hour, tmBan.tm_min, + tmUnban.tm_year % 100, tmUnban.tm_mon + 1, tmUnban.tm_mday, tmUnban.tm_hour, tmUnban.tm_min, + fields2[2].GetCString(), fields2[3].GetCString()); } - } - while (banInfo->NextRow()); + } while (banInfo->NextRow()); } - } - while (result->NextRow()); + } while (result->NextRow()); handler->SendSysMessage(" ==============================================================================="); } @@ -523,8 +518,7 @@ public: PreparedQueryResult banResult = CharacterDatabase.Query(stmt2); if (banResult) handler->PSendSysMessage("%s", (*banResult)[0].GetCString()); - } - while (result->NextRow()); + } while (result->NextRow()); } // Console wide output else @@ -555,8 +549,8 @@ public: if (banFields[0].GetUInt32() == banFields[1].GetUInt32()) { handler->PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d| permanent |%-15.15s|%-15.15s|", - char_name.c_str(), tmBan.tm_year%100, tmBan.tm_mon+1, tmBan.tm_mday, tmBan.tm_hour, tmBan.tm_min, - banFields[2].GetCString(), banFields[3].GetCString()); + char_name.c_str(), tmBan.tm_year % 100, tmBan.tm_mon + 1, tmBan.tm_mday, tmBan.tm_hour, tmBan.tm_min, + banFields[2].GetCString(), banFields[3].GetCString()); } else { @@ -564,15 +558,13 @@ public: tm tmUnban; localtime_r(&timeUnban, &tmUnban); handler->PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d|%02d-%02d-%02d %02d:%02d|%-15.15s|%-15.15s|", - char_name.c_str(), tmBan.tm_year%100, tmBan.tm_mon+1, tmBan.tm_mday, tmBan.tm_hour, tmBan.tm_min, - tmUnban.tm_year%100, tmUnban.tm_mon+1, tmUnban.tm_mday, tmUnban.tm_hour, tmUnban.tm_min, - banFields[2].GetCString(), banFields[3].GetCString()); + char_name.c_str(), tmBan.tm_year % 100, tmBan.tm_mon + 1, tmBan.tm_mday, tmBan.tm_hour, tmBan.tm_min, + tmUnban.tm_year % 100, tmUnban.tm_mon + 1, tmUnban.tm_mday, tmUnban.tm_hour, tmUnban.tm_min, + banFields[2].GetCString(), banFields[3].GetCString()); } - } - while (banInfo->NextRow()); + } while (banInfo->NextRow()); } - } - while (result->NextRow()); + } while (result->NextRow()); handler->SendSysMessage(" =============================================================================== "); } @@ -616,8 +608,7 @@ public: { Field* fields = result->Fetch(); handler->PSendSysMessage("%s", fields[0].GetCString()); - } - while (result->NextRow()); + } while (result->NextRow()); } // Console wide output else @@ -635,8 +626,8 @@ public: if (fields[1].GetUInt32() == fields[2].GetUInt32()) { handler->PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d| permanent |%-15.15s|%-15.15s|", - fields[0].GetCString(), tmBan.tm_year%100, tmBan.tm_mon+1, tmBan.tm_mday, tmBan.tm_hour, tmBan.tm_min, - fields[3].GetCString(), fields[4].GetCString()); + fields[0].GetCString(), tmBan.tm_year % 100, tmBan.tm_mon + 1, tmBan.tm_mday, tmBan.tm_hour, tmBan.tm_min, + fields[3].GetCString(), fields[4].GetCString()); } else { @@ -644,12 +635,11 @@ public: tm tmUnban; localtime_r(&timeUnban, &tmUnban); handler->PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d|%02d-%02d-%02d %02d:%02d|%-15.15s|%-15.15s|", - fields[0].GetCString(), tmBan.tm_year%100, tmBan.tm_mon+1, tmBan.tm_mday, tmBan.tm_hour, tmBan.tm_min, - tmUnban.tm_year%100, tmUnban.tm_mon+1, tmUnban.tm_mday, tmUnban.tm_hour, tmUnban.tm_min, - fields[3].GetCString(), fields[4].GetCString()); + fields[0].GetCString(), tmBan.tm_year % 100, tmBan.tm_mon + 1, tmBan.tm_mday, tmBan.tm_hour, tmBan.tm_min, + tmUnban.tm_year % 100, tmUnban.tm_mon + 1, tmUnban.tm_mday, tmUnban.tm_hour, tmUnban.tm_min, + fields[3].GetCString(), fields[4].GetCString()); } - } - while (result->NextRow()); + } while (result->NextRow()); handler->SendSysMessage(" ==============================================================================="); } @@ -737,26 +727,26 @@ public: switch (mode) { - case BAN_ACCOUNT: - if (sBan->RemoveBanAccount(nameOrIP)) - handler->PSendSysMessage(LANG_UNBAN_UNBANNED, nameOrIP.c_str()); - else - handler->PSendSysMessage(LANG_UNBAN_ERROR, nameOrIP.c_str()); - break; - case BAN_CHARACTER: - if (sBan->RemoveBanAccountByPlayerName(nameOrIP)) - handler->PSendSysMessage(LANG_UNBAN_UNBANNED, nameOrIP.c_str()); - else - handler->PSendSysMessage(LANG_UNBAN_ERROR, nameOrIP.c_str()); - break; - case BAN_IP: - if (sBan->RemoveBanIP(nameOrIP)) - handler->PSendSysMessage(LANG_UNBAN_UNBANNED, nameOrIP.c_str()); - else - handler->PSendSysMessage(LANG_UNBAN_ERROR, nameOrIP.c_str()); - break; - default: - break; + case BAN_ACCOUNT: + if (sBan->RemoveBanAccount(nameOrIP)) + handler->PSendSysMessage(LANG_UNBAN_UNBANNED, nameOrIP.c_str()); + else + handler->PSendSysMessage(LANG_UNBAN_ERROR, nameOrIP.c_str()); + break; + case BAN_CHARACTER: + if (sBan->RemoveBanAccountByPlayerName(nameOrIP)) + handler->PSendSysMessage(LANG_UNBAN_UNBANNED, nameOrIP.c_str()); + else + handler->PSendSysMessage(LANG_UNBAN_ERROR, nameOrIP.c_str()); + break; + case BAN_IP: + if (sBan->RemoveBanIP(nameOrIP)) + handler->PSendSysMessage(LANG_UNBAN_UNBANNED, nameOrIP.c_str()); + else + handler->PSendSysMessage(LANG_UNBAN_ERROR, nameOrIP.c_str()); + break; + default: + break; } return true; diff --git a/src/server/scripts/Commands/cs_cast.cpp b/src/server/scripts/Commands/cs_cast.cpp index 6046748b4..eddb9866c 100644 --- a/src/server/scripts/Commands/cs_cast.cpp +++ b/src/server/scripts/Commands/cs_cast.cpp @@ -26,7 +26,7 @@ public: std::vector GetCommands() const override { static std::vector castCommandTable = - { + { { "back", SEC_GAMEMASTER, false, &HandleCastBackCommand, "" }, { "dist", SEC_GAMEMASTER, false, &HandleCastDistCommand, "" }, { "self", SEC_GAMEMASTER, false, &HandleCastSelfCommand, "" }, diff --git a/src/server/scripts/Commands/cs_character.cpp b/src/server/scripts/Commands/cs_character.cpp index 09d697cb6..d762578c6 100644 --- a/src/server/scripts/Commands/cs_character.cpp +++ b/src/server/scripts/Commands/cs_character.cpp @@ -136,8 +136,7 @@ public: AccountMgr::GetName(info.accountId, info.accountName); info.deleteDate = time_t(fields[3].GetUInt32()); foundList.push_back(info); - } - while (result->NextRow()); + } while (result->NextRow()); } return true; @@ -168,12 +167,12 @@ public: if (!handler->GetSession()) handler->PSendSysMessage(LANG_CHARACTER_DELETED_LIST_LINE_CONSOLE, - itr->lowGuid, itr->name.c_str(), itr->accountName.empty() ? "" : itr->accountName.c_str(), - itr->accountId, dateStr.c_str()); + itr->lowGuid, itr->name.c_str(), itr->accountName.empty() ? "" : itr->accountName.c_str(), + itr->accountId, dateStr.c_str()); else handler->PSendSysMessage(LANG_CHARACTER_DELETED_LIST_LINE_CHAT, - itr->lowGuid, itr->name.c_str(), itr->accountName.empty() ? "" : itr->accountName.c_str(), - itr->accountId, dateStr.c_str()); + itr->lowGuid, itr->name.c_str(), itr->accountName.empty() ? "" : itr->accountName.c_str(), + itr->accountId, dateStr.c_str()); } if (!handler->GetSession()) @@ -284,8 +283,8 @@ public: continue; char const* activeStr = target && target->GetUInt32Value(PLAYER_CHOSEN_TITLE) == titleInfo->bit_index - ? handler->GetAcoreString(LANG_ACTIVE) - : ""; + ? handler->GetAcoreString(LANG_ACTIVE) + : ""; char titleNameStr[80]; snprintf(titleNameStr, 80, name.c_str(), targetName); @@ -885,10 +884,11 @@ public: QueryResult result = CharacterDatabase.PQuery("SELECT guid FROM characters"); if (!result) return true; - do{ + do + { uint64 _guid = result->Fetch()[0].GetUInt64(); char buff[20]; - sprintf(buff,"%u", (uint32)_guid); + sprintf(buff, "%u", (uint32)_guid); switch(PlayerDumpWriter().WriteDump(buff, uint32(_guid))) { case DUMP_SUCCESS: @@ -907,7 +907,7 @@ public: handler->SetSentErrorMessage(true); return false; } - }while(result->NextRow()); + } while(result->NextRow()); } if (!fileStr || !playerStr) @@ -985,11 +985,21 @@ public: switch (BagSlot) { - case 2: BagSlot = 19; break; - case 3: BagSlot = 20; break; - case 4: BagSlot = 21; break; - case 5: BagSlot = 22; break; - default: BagSlot = 1; break; + case 2: + BagSlot = 19; + break; + case 3: + BagSlot = 20; + break; + case 4: + BagSlot = 21; + break; + case 5: + BagSlot = 22; + break; + default: + BagSlot = 1; + break; } handler->PSendSysMessage("--------------------------------------"); diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index 0390b57d1..85110add9 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -451,7 +451,7 @@ public: char const* name = "test"; uint8 code = atoi(args); - WorldPacket data(SMSG_CHANNEL_NOTIFY, (1+10)); + WorldPacket data(SMSG_CHANNEL_NOTIFY, (1 + 10)); data << code; // notify type data << name; // channel name data << uint32(0); @@ -787,7 +787,7 @@ public: if (!target || target->IsTotem() || target->IsPet()) return false; - ThreatContainer::StorageType const &threatList = target->getThreatManager().getThreatList(); + ThreatContainer::StorageType const& threatList = target->getThreatManager().getThreatList(); ThreatContainer::StorageType::const_iterator itr; uint32 count = 0; handler->PSendSysMessage("Threat list of %s (guid %u)", target->GetName().c_str(), target->GetGUIDLow()); @@ -801,7 +801,7 @@ public: } handler->PSendSysMessage(" %u. %s (guid %u) - threat %f", ++count, unit->GetName().c_str(), unit->GetGUIDLow(), (*itr)->getThreat()); } - ThreatContainer::StorageType const &threatList2 = target->getThreatManager().getOfflineThreatList(); + ThreatContainer::StorageType const& threatList2 = target->getThreatManager().getOfflineThreatList(); for (itr = threatList2.begin(); itr != threatList2.end(); ++itr) { Unit* unit = (*itr)->getTarget(); @@ -1128,13 +1128,13 @@ public: if (isInt32) { uint32 value = (uint32)atoi(y); - target->SetUInt32Value(opcode , value); + target->SetUInt32Value(opcode, value); handler->PSendSysMessage(LANG_SET_UINT_FIELD, GUID_LOPART(guid), opcode, value); } else { float value = (float)atof(y); - target->SetFloatValue(opcode , value); + target->SetFloatValue(opcode, value); handler->PSendSysMessage(LANG_SET_FLOAT_FIELD, GUID_LOPART(guid), opcode, value); } diff --git a/src/server/scripts/Commands/cs_deserter.cpp b/src/server/scripts/Commands/cs_deserter.cpp index 20c4818b2..13b4d0d92 100644 --- a/src/server/scripts/Commands/cs_deserter.cpp +++ b/src/server/scripts/Commands/cs_deserter.cpp @@ -11,7 +11,7 @@ #include "SpellAuras.h" #include "SpellAuraEffects.h" - enum Spells +enum Spells { LFG_SPELL_DUNGEON_DESERTER = 71041, BG_SPELL_DESERTER = 26013 @@ -55,7 +55,7 @@ public: if (!*args) return false; - Player* targetPlayer = handler->getSelectedPlayer(); + Player* targetPlayer = handler->getSelectedPlayer(); if (!targetPlayer) { handler->SendSysMessage(LANG_NO_CHAR_SELECTED); @@ -71,24 +71,24 @@ public: } uint32 time = atoi(timeStr); - if (!time) - { + if (!time) + { handler->SendSysMessage(LANG_BAD_VALUE); handler->SetSentErrorMessage(true); return false; - } + } - Aura* aura = targetPlayer->AddAura(isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER, targetPlayer); + Aura* aura = targetPlayer->AddAura(isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER, targetPlayer); - if (!aura) - { + if (!aura) + { handler->SendSysMessage(LANG_BAD_VALUE); handler->SetSentErrorMessage(true); return false; - } + } aura->SetDuration(time * IN_MILLISECONDS); - return true; + return true; } static bool HandleDeserterRemove(ChatHandler* handler, char const* /*args*/, bool isInstance) @@ -101,9 +101,9 @@ public: return false; } - targetPlayer->RemoveAura(isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER); + targetPlayer->RemoveAura(isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER); - return true; + return true; } static bool HandleDeserterInstanceAdd(ChatHandler* handler, char const* args) @@ -127,7 +127,7 @@ public: } }; - void AddSC_deserter_commandscript() +void AddSC_deserter_commandscript() { new deserter_commandscript(); } diff --git a/src/server/scripts/Commands/cs_disable.cpp b/src/server/scripts/Commands/cs_disable.cpp index e39a7fec0..78c867161 100644 --- a/src/server/scripts/Commands/cs_disable.cpp +++ b/src/server/scripts/Commands/cs_disable.cpp @@ -79,71 +79,71 @@ public: switch (disableType) { case DISABLE_TYPE_SPELL: - { - if (!sSpellMgr->GetSpellInfo(entry)) { - handler->PSendSysMessage(LANG_COMMAND_NOSPELLFOUND); - handler->SetSentErrorMessage(true); - return false; + if (!sSpellMgr->GetSpellInfo(entry)) + { + handler->PSendSysMessage(LANG_COMMAND_NOSPELLFOUND); + handler->SetSentErrorMessage(true); + return false; + } + disableTypeStr = "spell"; + break; } - disableTypeStr = "spell"; - break; - } case DISABLE_TYPE_QUEST: - { - if (!sObjectMgr->GetQuestTemplate(entry)) { - handler->PSendSysMessage(LANG_COMMAND_QUEST_NOTFOUND, entry); - handler->SetSentErrorMessage(true); - return false; + if (!sObjectMgr->GetQuestTemplate(entry)) + { + handler->PSendSysMessage(LANG_COMMAND_QUEST_NOTFOUND, entry); + handler->SetSentErrorMessage(true); + return false; + } + disableTypeStr = "quest"; + break; } - disableTypeStr = "quest"; - break; - } case DISABLE_TYPE_MAP: - { - if (!sMapStore.LookupEntry(entry)) { - handler->PSendSysMessage(LANG_COMMAND_NOMAPFOUND); - handler->SetSentErrorMessage(true); - return false; + if (!sMapStore.LookupEntry(entry)) + { + handler->PSendSysMessage(LANG_COMMAND_NOMAPFOUND); + handler->SetSentErrorMessage(true); + return false; + } + disableTypeStr = "map"; + break; } - disableTypeStr = "map"; - break; - } case DISABLE_TYPE_BATTLEGROUND: - { - if (!sBattlemasterListStore.LookupEntry(entry)) { - handler->PSendSysMessage(LANG_COMMAND_NO_BATTLEGROUND_FOUND); - handler->SetSentErrorMessage(true); - return false; + if (!sBattlemasterListStore.LookupEntry(entry)) + { + handler->PSendSysMessage(LANG_COMMAND_NO_BATTLEGROUND_FOUND); + handler->SetSentErrorMessage(true); + return false; + } + disableTypeStr = "battleground"; + break; } - disableTypeStr = "battleground"; - break; - } case DISABLE_TYPE_OUTDOORPVP: - { - if (entry > MAX_OUTDOORPVP_TYPES) { - handler->PSendSysMessage(LANG_COMMAND_NO_OUTDOOR_PVP_FORUND); - handler->SetSentErrorMessage(true); - return false; + if (entry > MAX_OUTDOORPVP_TYPES) + { + handler->PSendSysMessage(LANG_COMMAND_NO_OUTDOOR_PVP_FORUND); + handler->SetSentErrorMessage(true); + return false; + } + disableTypeStr = "outdoorpvp"; + break; } - disableTypeStr = "outdoorpvp"; - break; - } case DISABLE_TYPE_VMAP: - { - if (!sMapStore.LookupEntry(entry)) { - handler->PSendSysMessage(LANG_COMMAND_NOMAPFOUND); - handler->SetSentErrorMessage(true); - return false; + if (!sMapStore.LookupEntry(entry)) + { + handler->PSendSysMessage(LANG_COMMAND_NOMAPFOUND); + handler->SetSentErrorMessage(true); + return false; + } + disableTypeStr = "vmap"; + break; } - disableTypeStr = "vmap"; - break; - } default: break; } diff --git a/src/server/scripts/Commands/cs_event.cpp b/src/server/scripts/Commands/cs_event.cpp index 97da2f6bf..8c531467d 100644 --- a/src/server/scripts/Commands/cs_event.cpp +++ b/src/server/scripts/Commands/cs_event.cpp @@ -111,8 +111,8 @@ public: std::string lengthStr = secsToTimeString(eventData.length * MINUTE, true); handler->PSendSysMessage(LANG_EVENT_INFO, eventId, eventData.description.c_str(), activeStr, - startTimeStr.c_str(), endTimeStr.c_str(), occurenceStr.c_str(), lengthStr.c_str(), - nextStr.c_str()); + startTimeStr.c_str(), endTimeStr.c_str(), occurenceStr.c_str(), lengthStr.c_str(), + nextStr.c_str()); return true; } diff --git a/src/server/scripts/Commands/cs_gm.cpp b/src/server/scripts/Commands/cs_gm.cpp index 6ca2f8b58..500e7dad6 100644 --- a/src/server/scripts/Commands/cs_gm.cpp +++ b/src/server/scripts/Commands/cs_gm.cpp @@ -115,7 +115,7 @@ public: { AccountTypes itrSec = itr->second->GetSession()->GetSecurity(); if ((itr->second->IsGameMaster() || (!AccountMgr::IsPlayerAccount(itrSec) && itrSec <= AccountTypes(sWorld->getIntConfig(CONFIG_GM_LEVEL_IN_GM_LIST)))) && - (!handler->GetSession() || itr->second->IsVisibleGloballyFor(handler->GetSession()->GetPlayer()))) + (!handler->GetSession() || itr->second->IsVisibleGloballyFor(handler->GetSession()->GetPlayer()))) { if (first) { diff --git a/src/server/scripts/Commands/cs_go.cpp b/src/server/scripts/Commands/cs_go.cpp index 501e4c572..e35355811 100644 --- a/src/server/scripts/Commands/cs_go.cpp +++ b/src/server/scripts/Commands/cs_go.cpp @@ -327,7 +327,7 @@ public: } if ((node->x == 0.0f && node->y == 0.0f && node->z == 0.0f) || - !MapManager::IsValidMapCoord(node->map_id, node->x, node->y, node->z)) + !MapManager::IsValidMapCoord(node->map_id, node->x, node->y, node->z)) { handler->PSendSysMessage(LANG_INVALID_TARGET_COORD, node->x, node->y, node->map_id); handler->SetSentErrorMessage(true); diff --git a/src/server/scripts/Commands/cs_gobject.cpp b/src/server/scripts/Commands/cs_gobject.cpp index 034a665b5..23f67baed 100644 --- a/src/server/scripts/Commands/cs_gobject.cpp +++ b/src/server/scripts/Commands/cs_gobject.cpp @@ -195,8 +195,8 @@ public: float z = player->GetPositionZ(); float ang = player->GetOrientation(); - float rot2 = sin(ang/2); - float rot3 = cos(ang/2); + float rot2 = sin(ang / 2); + float rot3 = cos(ang / 2); uint32 objectId = atoi(id); @@ -222,15 +222,15 @@ public: if (objectId) result = WorldDatabase.PQuery("SELECT guid, id, position_x, position_y, position_z, orientation, map, phaseMask, (POW(position_x - '%f', 2) + POW(position_y - '%f', 2) + POW(position_z - '%f', 2)) AS order_ FROM gameobject WHERE map = '%i' AND id = '%u' ORDER BY order_ ASC LIMIT 1", - player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetMapId(), objectId); + player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetMapId(), objectId); else { std::string name = id; WorldDatabase.EscapeString(name); result = WorldDatabase.PQuery( - "SELECT guid, id, position_x, position_y, position_z, orientation, map, phaseMask, (POW(position_x - %f, 2) + POW(position_y - %f, 2) + POW(position_z - %f, 2)) AS order_ " - "FROM gameobject, gameobject_template WHERE gameobject_template.entry = gameobject.id AND map = %i AND name " _LIKE_ " " _CONCAT3_("'%%'", "'%s'", "'%%'") " ORDER BY order_ ASC LIMIT 1", - player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetMapId(), name.c_str()); + "SELECT guid, id, position_x, position_y, position_z, orientation, map, phaseMask, (POW(position_x - %f, 2) + POW(position_y - %f, 2) + POW(position_z - %f, 2)) AS order_ " + "FROM gameobject, gameobject_template WHERE gameobject_template.entry = gameobject.id AND map = %i AND name " _LIKE_ " " _CONCAT3_("'%%'", "'%s'", "'%%'") " ORDER BY order_ ASC LIMIT 1", + player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetMapId(), name.c_str()); } } else @@ -256,10 +256,10 @@ public: eventFilter << ')'; result = WorldDatabase.PQuery("SELECT gameobject.guid, id, position_x, position_y, position_z, orientation, map, phaseMask, " - "(POW(position_x - %f, 2) + POW(position_y - %f, 2) + POW(position_z - %f, 2)) AS order_ FROM gameobject " - "LEFT OUTER JOIN game_event_gameobject on gameobject.guid = game_event_gameobject.guid WHERE map = '%i' %s ORDER BY order_ ASC LIMIT 10", - handler->GetSession()->GetPlayer()->GetPositionX(), handler->GetSession()->GetPlayer()->GetPositionY(), handler->GetSession()->GetPlayer()->GetPositionZ(), - handler->GetSession()->GetPlayer()->GetMapId(), eventFilter.str().c_str()); + "(POW(position_x - %f, 2) + POW(position_y - %f, 2) + POW(position_z - %f, 2)) AS order_ FROM gameobject " + "LEFT OUTER JOIN game_event_gameobject on gameobject.guid = game_event_gameobject.guid WHERE map = '%i' %s ORDER BY order_ ASC LIMIT 10", + handler->GetSession()->GetPlayer()->GetPositionX(), handler->GetSession()->GetPlayer()->GetPositionY(), handler->GetSession()->GetPlayer()->GetPositionZ(), + handler->GetSession()->GetPlayer()->GetMapId(), eventFilter.str().c_str()); } if (!result) @@ -685,7 +685,7 @@ public: object->SetByteValue(GAMEOBJECT_BYTES_1, objectType, objectState); else if (objectType == 4) { - WorldPacket data(SMSG_GAMEOBJECT_CUSTOM_ANIM, 8+4); + WorldPacket data(SMSG_GAMEOBJECT_CUSTOM_ANIM, 8 + 4); data << object->GetGUID(); data << (uint32)(objectState); object->SendMessageToSet(&data, true); diff --git a/src/server/scripts/Commands/cs_instance.cpp b/src/server/scripts/Commands/cs_instance.cpp index f5fddb549..7fee96a1b 100644 --- a/src/server/scripts/Commands/cs_instance.cpp +++ b/src/server/scripts/Commands/cs_instance.cpp @@ -136,7 +136,10 @@ public: uint32 dungeon = 0, battleground = 0, arena = 0, spectators = 0; sMapMgr->GetNumInstances(dungeon, battleground, arena); handler->PSendSysMessage("instances loaded: dungeons (%d), battlegrounds (%d), arenas (%d)", dungeon, battleground, arena); - dungeon = 0; battleground = 0; arena = 0; spectators = 0; + dungeon = 0; + battleground = 0; + arena = 0; + spectators = 0; sMapMgr->GetNumPlayersInInstances(dungeon, battleground, arena, spectators); handler->PSendSysMessage("players in instances: dungeons (%d), battlegrounds (%d), arenas (%d + %d spect)", dungeon, battleground, arena, spectators); diff --git a/src/server/scripts/Commands/cs_learn.cpp b/src/server/scripts/Commands/cs_learn.cpp index 261d4a49f..ceba65417 100644 --- a/src/server/scripts/Commands/cs_learn.cpp +++ b/src/server/scripts/Commands/cs_learn.cpp @@ -248,7 +248,7 @@ public: // search highest talent rank uint32 spellId = 0; - for (int8 rank = MAX_TALENT_RANK-1; rank >= 0; --rank) + for (int8 rank = MAX_TALENT_RANK - 1; rank >= 0; --rank) { if (talentInfo->RankID[rank] != 0) { @@ -306,7 +306,7 @@ public: continue; if ((skillInfo->categoryId == SKILL_CATEGORY_PROFESSION || skillInfo->categoryId == SKILL_CATEGORY_SECONDARY) && - skillInfo->canLink) // only prof. with recipes have + skillInfo->canLink) // only prof. with recipes have { HandleLearnSkillRecipesHelper(handler->GetSession()->GetPlayer(), skillInfo->id); } @@ -349,8 +349,8 @@ public: continue; if ((skillInfo->categoryId != SKILL_CATEGORY_PROFESSION && - skillInfo->categoryId != SKILL_CATEGORY_SECONDARY) || - !skillInfo->canLink) // only prof with recipes have set + skillInfo->categoryId != SKILL_CATEGORY_SECONDARY) || + !skillInfo->canLink) // only prof with recipes have set continue; int locale = handler->GetSessionDbcLocale(); diff --git a/src/server/scripts/Commands/cs_lfg.cpp b/src/server/scripts/Commands/cs_lfg.cpp index c7dd50de0..ff996259e 100644 --- a/src/server/scripts/Commands/cs_lfg.cpp +++ b/src/server/scripts/Commands/cs_lfg.cpp @@ -21,8 +21,8 @@ void GetPlayerInfo(ChatHandler* handler, Player* player) std::string const& state = lfg::GetStateString(sLFGMgr->GetState(guid)); handler->PSendSysMessage(LANG_LFG_PLAYER_INFO, player->GetName().c_str(), - state.c_str(), uint8(dungeons.size()), lfg::ConcatenateDungeons(dungeons).c_str(), - lfg::GetRolesString(sLFGMgr->GetRoles(guid)).c_str(), sLFGMgr->GetComment(guid).c_str()); + state.c_str(), uint8(dungeons.size()), lfg::ConcatenateDungeons(dungeons).c_str(), + lfg::GetRolesString(sLFGMgr->GetRoles(guid)).c_str(), sLFGMgr->GetComment(guid).c_str()); } class lfg_commandscript : public CommandScript @@ -76,7 +76,7 @@ public: uint64 guid = grp->GetGUID(); std::string const& state = lfg::GetStateString(sLFGMgr->GetState(guid)); handler->PSendSysMessage(LANG_LFG_GROUP_INFO, grp->isLFGGroup(), - state.c_str(), sLFGMgr->GetDungeon(guid)); + state.c_str(), sLFGMgr->GetDungeon(guid)); for (GroupReference* itr = grp->GetFirstMember(); itr != nullptr; itr = itr->next()) GetPlayerInfo(handler, itr->GetSource()); diff --git a/src/server/scripts/Commands/cs_list.cpp b/src/server/scripts/Commands/cs_list.cpp index 54b6fdb9b..917bfee77 100644 --- a/src/server/scripts/Commands/cs_list.cpp +++ b/src/server/scripts/Commands/cs_list.cpp @@ -84,11 +84,11 @@ public: { Player* player = handler->GetSession()->GetPlayer(); result = WorldDatabase.PQuery("SELECT guid, position_x, position_y, position_z, map, (POW(position_x - '%f', 2) + POW(position_y - '%f', 2) + POW(position_z - '%f', 2)) AS order_ FROM creature WHERE id = '%u' ORDER BY order_ ASC LIMIT %u", - player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), creatureId, count); + player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), creatureId, count); } else result = WorldDatabase.PQuery("SELECT guid, position_x, position_y, position_z, map FROM creature WHERE id = '%u' LIMIT %u", - creatureId, count); + creatureId, count); if (result) { @@ -105,8 +105,7 @@ public: handler->PSendSysMessage(LANG_CREATURE_LIST_CHAT, guid, guid, cInfo->Name.c_str(), x, y, z, mapId); else handler->PSendSysMessage(LANG_CREATURE_LIST_CONSOLE, guid, cInfo->Name.c_str(), x, y, z, mapId); - } - while (result->NextRow()); + } while (result->NextRow()); } handler->PSendSysMessage(LANG_COMMAND_LISTCREATUREMESSAGE, creatureId, creatureCount); @@ -185,8 +184,7 @@ public: itemPos = ""; handler->PSendSysMessage(LANG_ITEMLIST_SLOT, itemGuid, ownerName.c_str(), ownerGuid, ownerAccountId, itemPos); - } - while (result->NextRow()); + } while (result->NextRow()); uint32 resultCount = uint32(result->GetRowCount()); @@ -232,8 +230,7 @@ public: char const* itemPos = "[in mail]"; handler->PSendSysMessage(LANG_ITEMLIST_MAIL, itemGuid, itemSenderName.c_str(), itemSender, itemSenderAccountId, itemReceiverName.c_str(), itemReceiver, itemReceiverAccount, itemPos); - } - while (result->NextRow()); + } while (result->NextRow()); uint32 resultCount = uint32(result->GetRowCount()); @@ -276,8 +273,7 @@ public: char const* itemPos = "[in auction]"; handler->PSendSysMessage(LANG_ITEMLIST_AUCTION, itemGuid, ownerName.c_str(), owner, ownerAccountId, itemPos); - } - while (result->NextRow()); + } while (result->NextRow()); } // guild bank case @@ -307,8 +303,7 @@ public: char const* itemPos = "[in guild bank]"; handler->PSendSysMessage(LANG_ITEMLIST_GUILD, itemGuid, guildName.c_str(), guildGuid, itemPos); - } - while (result->NextRow()); + } while (result->NextRow()); uint32 resultCount = uint32(result->GetRowCount()); @@ -373,11 +368,11 @@ public: { Player* player = handler->GetSession()->GetPlayer(); result = WorldDatabase.PQuery("SELECT guid, position_x, position_y, position_z, map, id, (POW(position_x - '%f', 2) + POW(position_y - '%f', 2) + POW(position_z - '%f', 2)) AS order_ FROM gameobject WHERE id = '%u' ORDER BY order_ ASC LIMIT %u", - player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), gameObjectId, count); + player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), gameObjectId, count); } else result = WorldDatabase.PQuery("SELECT guid, position_x, position_y, position_z, map, id FROM gameobject WHERE id = '%u' LIMIT %u", - gameObjectId, count); + gameObjectId, count); if (result) { @@ -395,8 +390,7 @@ public: handler->PSendSysMessage(LANG_GO_LIST_CHAT, guid, entry, guid, gInfo->name.c_str(), x, y, z, mapId); else handler->PSendSysMessage(LANG_GO_LIST_CONSOLE, guid, gInfo->name.c_str(), x, y, z, mapId); - } - while (result->NextRow()); + } while (result->NextRow()); } handler->PSendSysMessage(LANG_COMMAND_LISTOBJMESSAGE, gameObjectId, objectCount); @@ -431,10 +425,10 @@ public: ss_name << "|cffffffff|Hspell:" << aura->GetId() << "|h[" << name << "]|h|r"; handler->PSendSysMessage(LANG_COMMAND_TARGET_AURADETAIL, aura->GetId(), (handler->GetSession() ? ss_name.str().c_str() : name), - aurApp->GetEffectMask(), aura->GetCharges(), aura->GetStackAmount(), aurApp->GetSlot(), - aura->GetDuration(), aura->GetMaxDuration(), (aura->IsPassive() ? passiveStr : ""), - (talent ? talentStr : ""), IS_PLAYER_GUID(aura->GetCasterGUID()) ? "player" : "creature", - GUID_LOPART(aura->GetCasterGUID())); + aurApp->GetEffectMask(), aura->GetCharges(), aura->GetStackAmount(), aurApp->GetSlot(), + aura->GetDuration(), aura->GetMaxDuration(), (aura->IsPassive() ? passiveStr : ""), + (talent ? talentStr : ""), IS_PLAYER_GUID(aura->GetCasterGUID()) ? "player" : "creature", + GUID_LOPART(aura->GetCasterGUID())); } if (!args || std::string(args) != "all") diff --git a/src/server/scripts/Commands/cs_lookup.cpp b/src/server/scripts/Commands/cs_lookup.cpp index 8cd13822b..545b45eee 100644 --- a/src/server/scripts/Commands/cs_lookup.cpp +++ b/src/server/scripts/Commands/cs_lookup.cpp @@ -125,7 +125,7 @@ public: // send area in "id - [name]" format std::ostringstream ss; if (handler->GetSession()) - ss << areaEntry->ID << " - |cffffffff|Harea:" << areaEntry->ID << "|h[" << name << ' ' << localeNames[locale]<< "]|h|r"; + ss << areaEntry->ID << " - |cffffffff|Harea:" << areaEntry->ID << "|h[" << name << ' ' << localeNames[locale] << "]|h|r"; else ss << areaEntry->ID << " - " << name << ' ' << localeNames[locale]; @@ -1025,7 +1025,7 @@ public: return true; } - static bool HandleLookupTaxiNodeCommand(ChatHandler* handler, const char * args) + static bool HandleLookupTaxiNodeCommand(ChatHandler* handler, const char* args) { if (!*args) return false; @@ -1082,10 +1082,10 @@ public: // send taxinode in "id - [name] (Map:m X:x Y:y Z:z)" format if (handler->GetSession()) handler->PSendSysMessage(LANG_TAXINODE_ENTRY_LIST_CHAT, id, id, name.c_str(), localeNames[locale], - nodeEntry->map_id, nodeEntry->x, nodeEntry->y, nodeEntry->z); + nodeEntry->map_id, nodeEntry->x, nodeEntry->y, nodeEntry->z); else handler->PSendSysMessage(LANG_TAXINODE_ENTRY_LIST_CONSOLE, id, name.c_str(), localeNames[locale], - nodeEntry->map_id, nodeEntry->x, nodeEntry->y, nodeEntry->z); + nodeEntry->map_id, nodeEntry->x, nodeEntry->y, nodeEntry->z); if (!found) found = true; @@ -1126,7 +1126,7 @@ public: uint32 maxResults = sWorld->getIntConfig(CONFIG_MAX_RESULTS_LOOKUP_COMMANDS); bool limitReached = false; - GameTeleContainer const & teleMap = sObjectMgr->GetGameTeleMap(); + GameTeleContainer const& teleMap = sObjectMgr->GetGameTeleMap(); for (GameTeleContainer::const_iterator itr = teleMap.begin(); itr != teleMap.end(); ++itr) { GameTele const* tele = &itr->second; @@ -1219,8 +1219,8 @@ public: char const* knownStr = target && target->HasTitle(titleInfo) ? handler->GetAcoreString(LANG_KNOWN) : ""; char const* activeStr = target && target->GetUInt32Value(PLAYER_CHOSEN_TITLE) == titleInfo->bit_index - ? handler->GetAcoreString(LANG_ACTIVE) - : ""; + ? handler->GetAcoreString(LANG_ACTIVE) + : ""; char titleNameStr[80]; snprintf(titleNameStr, 80, name.c_str(), targetName); @@ -1350,7 +1350,7 @@ public: int32 limit = limitStr ? atoi(limitStr) : -1; if (!Utf8ToUpperOnlyLatin - (account)) + (account)) return false; PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_LIST_BY_NAME); @@ -1428,15 +1428,13 @@ public: } if (plevel > 0 && prace > 0 && prace <= RACE_DRAENEI && pclass > 0 && pclass <= CLASS_DRUID) - handler->PSendSysMessage(" %s (GUID %u) - %s - %s - %u%s", name.c_str(), guid, name_races[prace-1], name_classes[pclass-1], plevel, (online ? " - [ONLINE]" : "")); + handler->PSendSysMessage(" %s (GUID %u) - %s - %s - %u%s", name.c_str(), guid, name_races[prace - 1], name_classes[pclass - 1], plevel, (online ? " - [ONLINE]" : "")); else handler->PSendSysMessage(LANG_LOOKUP_PLAYER_CHARACTER, name.c_str(), guid); ++counter; - } - while (result2->NextRow() && (limit == -1 || counter < limit)); + } while (result2->NextRow() && (limit == -1 || counter < limit)); } - } - while (result->NextRow()); + } while (result->NextRow()); if (counter == 0) // empty accounts only { diff --git a/src/server/scripts/Commands/cs_message.cpp b/src/server/scripts/Commands/cs_message.cpp index 7634be218..eaab0676e 100644 --- a/src/server/scripts/Commands/cs_message.cpp +++ b/src/server/scripts/Commands/cs_message.cpp @@ -91,7 +91,7 @@ public: std::string str = handler->GetAcoreString(LANG_GLOBAL_NOTIFY); str += args; - WorldPacket data(SMSG_NOTIFICATION, (str.size()+1)); + WorldPacket data(SMSG_NOTIFICATION, (str.size() + 1)); data << str; sWorld->SendGlobalMessage(&data); @@ -106,7 +106,7 @@ public: std::string str = handler->GetAcoreString(LANG_GM_NOTIFY); str += args; - WorldPacket data(SMSG_NOTIFICATION, (str.size()+1)); + WorldPacket data(SMSG_NOTIFICATION, (str.size() + 1)); data << str; sWorld->SendGlobalGMMessage(&data); diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index 17480baf3..7db39134a 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -189,7 +189,7 @@ public: return false; } - if (tokens.size() != uint16(count+2)) + if (tokens.size() != uint16(count + 2)) { handler->PSendSysMessage("Invalid number of nicknames for this bracket."); handler->SetSentErrorMessage(true); @@ -231,8 +231,8 @@ public: players[cnt++] = plr; } - for (uint8 i=0; iGetGUID() == players[j]->GetGUID()) { last_name = players[i]->GetName(); @@ -311,7 +311,7 @@ public: TeamId teamId1 = Player::TeamIdForRace(players[0]->getRace()); TeamId teamId2 = (teamId1 == TEAM_ALLIANCE ? TEAM_HORDE : TEAM_ALLIANCE); - for (uint8 i=0; iPSendSysMessage("no VMAP available for area info"); handler->PSendSysMessage(LANG_MAP_POSITION, - object->GetMapId(), (mapEntry ? mapEntry->name[handler->GetSessionDbcLocale()] : ""), - zoneId, (zoneEntry ? zoneEntry->area_name[handler->GetSessionDbcLocale()] : ""), - areaId, (areaEntry ? areaEntry->area_name[handler->GetSessionDbcLocale()] : ""), - object->GetPhaseMask(), - object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), object->GetOrientation(), - cell.GridX(), cell.GridY(), cell.CellX(), cell.CellY(), object->GetInstanceId(), - zoneX, zoneY, groundZ, floorZ, haveMap, haveVMap); + object->GetMapId(), (mapEntry ? mapEntry->name[handler->GetSessionDbcLocale()] : ""), + zoneId, (zoneEntry ? zoneEntry->area_name[handler->GetSessionDbcLocale()] : ""), + areaId, (areaEntry ? areaEntry->area_name[handler->GetSessionDbcLocale()] : ""), + object->GetPhaseMask(), + object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), object->GetOrientation(), + cell.GridX(), cell.GridY(), cell.CellX(), cell.CellY(), object->GetInstanceId(), + zoneX, zoneY, groundZ, floorZ, haveMap, haveVMap); LiquidData liquidStatus; ZLiquidStatus status = map->getLiquidStatus(object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), MAP_ALL_LIQUIDS, &liquidStatus); @@ -601,7 +601,7 @@ public: else _player->SaveRecallPosition(); - if (_player->TeleportTo(target->GetMapId(), target->GetPositionX(), target->GetPositionY(), target->GetPositionZ()+0.25f, _player->GetOrientation(), TELE_TO_GM_MODE, target)) + if (_player->TeleportTo(target->GetMapId(), target->GetPositionX(), target->GetPositionY(), target->GetPositionZ() + 0.25f, _player->GetOrientation(), TELE_TO_GM_MODE, target)) _player->SetPhaseMask(target->GetPhaseMask() | 1, false); } else @@ -696,8 +696,8 @@ public: // we are in an instance, and can only summon players in our group with us as leader if (!handler->GetSession()->GetPlayer()->GetGroup() || !target->GetGroup() || - (target->GetGroup()->GetLeaderGUID() != handler->GetSession()->GetPlayer()->GetGUID()) || - (handler->GetSession()->GetPlayer()->GetGroup()->GetLeaderGUID() != handler->GetSession()->GetPlayer()->GetGUID())) + (target->GetGroup()->GetLeaderGUID() != handler->GetSession()->GetPlayer()->GetGUID()) || + (handler->GetSession()->GetPlayer()->GetGroup()->GetLeaderGUID() != handler->GetSession()->GetPlayer()->GetGUID())) // the last check is a bit excessive, but let it be, just in case { handler->PSendSysMessage(LANG_CANNOT_SUMMON_TO_INST, nameLink.c_str()); @@ -738,12 +738,12 @@ public: // in point where GM stay Player::SavePositionInDB(handler->GetSession()->GetPlayer()->GetMapId(), - handler->GetSession()->GetPlayer()->GetPositionX(), - handler->GetSession()->GetPlayer()->GetPositionY(), - handler->GetSession()->GetPlayer()->GetPositionZ(), - handler->GetSession()->GetPlayer()->GetOrientation(), - handler->GetSession()->GetPlayer()->GetZoneId(), - targetGuid); + handler->GetSession()->GetPlayer()->GetPositionX(), + handler->GetSession()->GetPlayer()->GetPositionY(), + handler->GetSession()->GetPlayer()->GetPositionZ(), + handler->GetSession()->GetPlayer()->GetOrientation(), + handler->GetSession()->GetPlayer()->GetZoneId(), + targetGuid); } return true; @@ -775,8 +775,8 @@ public: // we are in instance, and can summon only player in our group with us as lead if (toInstance && ( - !handler->GetSession()->GetPlayer()->GetGroup() || (group->GetLeaderGUID() != handler->GetSession()->GetPlayer()->GetGUID()) || - (handler->GetSession()->GetPlayer()->GetGroup()->GetLeaderGUID() != handler->GetSession()->GetPlayer()->GetGUID()))) + !handler->GetSession()->GetPlayer()->GetGroup() || (group->GetLeaderGUID() != handler->GetSession()->GetPlayer()->GetGUID()) || + (handler->GetSession()->GetPlayer()->GetGroup()->GetLeaderGUID() != handler->GetSession()->GetPlayer()->GetGUID()))) // the last check is a bit excessive, but let it be, just in case { handler->SendSysMessage(LANG_CANNOT_SUMMON_TO_INST); @@ -1032,7 +1032,7 @@ public: { uint64 guid = handler->extractGuidFromLink((char*)args); if (guid) - obj = (WorldObject*)ObjectAccessor::GetObjectByTypeMask(*handler->GetSession()->GetPlayer(), guid, TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT); + obj = (WorldObject*)ObjectAccessor::GetObjectByTypeMask(*handler->GetSession()->GetPlayer(), guid, TYPEMASK_UNIT | TYPEMASK_GAMEOBJECT); if (!obj) { @@ -1258,7 +1258,7 @@ public: uint32 zoneId = player->GetZoneId(); AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(zoneId); - if (!areaEntry || areaEntry->zone !=0) + if (!areaEntry || areaEntry->zone != 0) { handler->PSendSysMessage(LANG_COMMAND_GRAVEYARDWRONGZONE, graveyardId, zoneId); handler->SetSentErrorMessage(true); @@ -1423,7 +1423,7 @@ public: if (itemNameStr && itemNameStr[0]) { - std::string itemName = itemNameStr+1; + std::string itemName = itemNameStr + 1; WorldDatabase.EscapeString(itemName); PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_ITEM_TEMPLATE_BY_NAME); @@ -1432,7 +1432,7 @@ public: if (!result) { - handler->PSendSysMessage(LANG_COMMAND_COULDNOTFIND, itemNameStr+1); + handler->PSendSysMessage(LANG_COMMAND_COULDNOTFIND, itemNameStr + 1); handler->SetSentErrorMessage(true); return false; } @@ -1500,12 +1500,12 @@ public: } /* [AC] Sunwell hack - if (handler->GetSession()->GetSecurity() < SEC_ADMINISTRATOR) - { - handler->PSendSysMessage("You may only remove items. Adding items is available for higher GMLevel."); - return false; - } - */ + if (handler->GetSession()->GetSecurity() < SEC_ADMINISTRATOR) + { + handler->PSendSysMessage("You may only remove items. Adding items is available for higher GMLevel."); + return false; + } + */ // Adding items uint32 noSpaceForCount = 0; @@ -1976,7 +1976,7 @@ public: // Output I. LANG_PINFO_PLAYER handler->PSendSysMessage(LANG_PINFO_PLAYER, target ? "" : handler->GetAcoreString(LANG_OFFLINE), nameLink.c_str(), GUID_LOPART(targetGuid)); - // Output II. LANG_PINFO_GM_ACTIVE if character is gamemaster + // Output II. LANG_PINFO_GM_ACTIVE if character is gamemaster if (target && target->IsGameMaster()) handler->PSendSysMessage(LANG_PINFO_GM_ACTIVE); @@ -2010,7 +2010,7 @@ public: handler->PSendSysMessage(LANG_PINFO_CHR_LEVEL_HIGH, level); // Output XI. LANG_PINFO_CHR_RACE - switch (raceid) + switch (raceid) { case RACE_HUMAN: raceStr = "Human"; @@ -2087,7 +2087,7 @@ public: // Output XIII. LANG_PINFO_CHR_PHASE if player is not in GM mode (GM is in every phase) if (target && !target->IsGameMaster()) // IsInWorld() returns false on loadingscreen, so it's more handler->PSendSysMessage(LANG_PINFO_CHR_PHASE, phase); // precise than just target (safer ?). - // However, as we usually just require a target here, we use target instead. + // However, as we usually just require a target here, we use target instead. // Output XIV. LANG_PINFO_CHR_MONEY uint32 gold = money / GOLD; uint32 silv = (money % GOLD) / SILVER; @@ -2144,7 +2144,7 @@ public: // Output XXI. LANG_INFO_CHR_MAILS if at least one mail is given if (totalmail >= 1) - handler->PSendSysMessage(LANG_PINFO_CHR_MAILS, readmail, totalmail); + handler->PSendSysMessage(LANG_PINFO_CHR_MAILS, readmail, totalmail); } return true; @@ -2324,7 +2324,7 @@ public: if (!*args) return false; - char *nameStr = strtok((char*)args, ""); + char* nameStr = strtok((char*)args, ""); if (!nameStr) return false; @@ -2349,7 +2349,7 @@ public: // helper for mutehistory static bool HandleMuteInfoHelper(uint32 accountId, char const* accountName, ChatHandler* handler) { - PreparedStatement *stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_MUTE_INFO); + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_MUTE_INFO); stmt->setUInt16(0, accountId); PreparedQueryResult result = LoginDatabase.Query(stmt); @@ -2421,53 +2421,53 @@ public: handler->SendSysMessage(LANG_MOVEGENS_CONFUSED); break; case CHASE_MOTION_TYPE: - { - Unit* target = nullptr; - if (unit->GetTypeId() == TYPEID_PLAYER) - target = static_cast const*>(movementGenerator)->GetTarget(); - else - target = static_cast const*>(movementGenerator)->GetTarget(); + { + Unit* target = nullptr; + if (unit->GetTypeId() == TYPEID_PLAYER) + target = static_cast const*>(movementGenerator)->GetTarget(); + else + target = static_cast const*>(movementGenerator)->GetTarget(); - if (!target) - handler->SendSysMessage(LANG_MOVEGENS_CHASE_NULL); - else if (target->GetTypeId() == TYPEID_PLAYER) - handler->PSendSysMessage(LANG_MOVEGENS_CHASE_PLAYER, target->GetName().c_str(), target->GetGUIDLow()); - else - handler->PSendSysMessage(LANG_MOVEGENS_CHASE_CREATURE, target->GetName().c_str(), target->GetGUIDLow()); - break; - } + if (!target) + handler->SendSysMessage(LANG_MOVEGENS_CHASE_NULL); + else if (target->GetTypeId() == TYPEID_PLAYER) + handler->PSendSysMessage(LANG_MOVEGENS_CHASE_PLAYER, target->GetName().c_str(), target->GetGUIDLow()); + else + handler->PSendSysMessage(LANG_MOVEGENS_CHASE_CREATURE, target->GetName().c_str(), target->GetGUIDLow()); + break; + } case FOLLOW_MOTION_TYPE: - { - Unit* target = nullptr; - if (unit->GetTypeId() == TYPEID_PLAYER) - target = static_cast const*>(movementGenerator)->GetTarget(); - else - target = static_cast const*>(movementGenerator)->GetTarget(); + { + Unit* target = nullptr; + if (unit->GetTypeId() == TYPEID_PLAYER) + target = static_cast const*>(movementGenerator)->GetTarget(); + else + target = static_cast const*>(movementGenerator)->GetTarget(); - if (!target) - handler->SendSysMessage(LANG_MOVEGENS_FOLLOW_NULL); - else if (target->GetTypeId() == TYPEID_PLAYER) - handler->PSendSysMessage(LANG_MOVEGENS_FOLLOW_PLAYER, target->GetName().c_str(), target->GetGUIDLow()); - else - handler->PSendSysMessage(LANG_MOVEGENS_FOLLOW_CREATURE, target->GetName().c_str(), target->GetGUIDLow()); - break; - } + if (!target) + handler->SendSysMessage(LANG_MOVEGENS_FOLLOW_NULL); + else if (target->GetTypeId() == TYPEID_PLAYER) + handler->PSendSysMessage(LANG_MOVEGENS_FOLLOW_PLAYER, target->GetName().c_str(), target->GetGUIDLow()); + else + handler->PSendSysMessage(LANG_MOVEGENS_FOLLOW_CREATURE, target->GetName().c_str(), target->GetGUIDLow()); + break; + } case HOME_MOTION_TYPE: - { - if (unit->GetTypeId() == TYPEID_UNIT) - handler->PSendSysMessage(LANG_MOVEGENS_HOME_CREATURE, x, y, z); - else - handler->SendSysMessage(LANG_MOVEGENS_HOME_PLAYER); - break; - } + { + if (unit->GetTypeId() == TYPEID_UNIT) + handler->PSendSysMessage(LANG_MOVEGENS_HOME_CREATURE, x, y, z); + else + handler->SendSysMessage(LANG_MOVEGENS_HOME_PLAYER); + break; + } case FLIGHT_MOTION_TYPE: handler->SendSysMessage(LANG_MOVEGENS_FLIGHT); break; case POINT_MOTION_TYPE: - { - handler->PSendSysMessage(LANG_MOVEGENS_POINT, x, y, z); - break; - } + { + handler->PSendSysMessage(LANG_MOVEGENS_POINT, x, y, z); + break; + } case FLEEING_MOTION_TYPE: handler->SendSysMessage(LANG_MOVEGENS_FEAR); break; @@ -2638,7 +2638,7 @@ public: //- TODO: Fix poor design SQLTransaction trans = CharacterDatabase.BeginTransaction(); MailDraft(subject, text) - .SendMailTo(trans, MailReceiver(target, GUID_LOPART(targetGuid)), sender); + .SendMailTo(trans, MailReceiver(target, GUID_LOPART(targetGuid)), sender); CharacterDatabase.CommitTransaction(trans); @@ -2796,8 +2796,8 @@ public: SQLTransaction trans = CharacterDatabase.BeginTransaction(); MailDraft(subject, text) - .AddMoney(money) - .SendMailTo(trans, MailReceiver(receiver, GUID_LOPART(receiverGuid)), sender); + .AddMoney(money) + .SendMailTo(trans, MailReceiver(receiver, GUID_LOPART(receiverGuid)), sender); CharacterDatabase.CommitTransaction(trans); @@ -2885,7 +2885,7 @@ public: } // prepare visual effect for levelup - pet->SetUInt32Value(UNIT_FIELD_LEVEL, creatureTarget->getLevel()-1); + pet->SetUInt32Value(UNIT_FIELD_LEVEL, creatureTarget->getLevel() - 1); pet->GetCharmInfo()->SetPetNumber(sObjectMgr->GeneratePetNumber(), true); // this enables pet details window (Shift+P) @@ -3028,7 +3028,7 @@ public: return true; } - static bool HandleUnFreezeCommand(ChatHandler* handler, char const*args) + static bool HandleUnFreezeCommand(ChatHandler* handler, char const* args) { std::string name; Player* player; diff --git a/src/server/scripts/Commands/cs_mmaps.cpp b/src/server/scripts/Commands/cs_mmaps.cpp index 9302779cc..2ba3d48c5 100644 --- a/src/server/scripts/Commands/cs_mmaps.cpp +++ b/src/server/scripts/Commands/cs_mmaps.cpp @@ -103,9 +103,9 @@ public: handler->PSendSysMessage("Building: %s", useStraightPath ? "StraightPath" : useStraightLine ? "Raycast" : "SmoothPath"); handler->PSendSysMessage("Result: %s - Length: " SZFMTD " - Type: %u", (result ? "true" : "false"), pointPath.size(), path.GetPathType()); - G3D::Vector3 const &start = path.GetStartPosition(); - G3D::Vector3 const &end = path.GetEndPosition(); - G3D::Vector3 const &actualEnd = path.GetActualEndPosition(); + G3D::Vector3 const& start = path.GetStartPosition(); + G3D::Vector3 const& end = path.GetEndPosition(); + G3D::Vector3 const& actualEnd = path.GetActualEndPosition(); handler->PSendSysMessage("StartPosition (%.3f, %.3f, %.3f)", start.x, start.y, start.z); handler->PSendSysMessage("EndPosition (%.3f, %.3f, %.3f)", end.x, end.y, end.z); diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index ccc97729e..3d77b47d8 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -167,8 +167,8 @@ public: // int32 manam = atoi(pmanaMax); // int32 mana = atoi(pmana); - int32 energy = atoi((char*)args)*10; - int32 energym = atoi((char*)args)*10; + int32 energy = atoi((char*)args) * 10; + int32 energym = atoi((char*)args) * 10; if (energy <= 0 || energym <= 0 || energym < energy) { @@ -189,9 +189,9 @@ public: if (handler->HasLowerSecurity(target, 0)) return false; - handler->PSendSysMessage(LANG_YOU_CHANGE_ENERGY, handler->GetNameLink(target).c_str(), energy/10, energym/10); + handler->PSendSysMessage(LANG_YOU_CHANGE_ENERGY, handler->GetNameLink(target).c_str(), energy / 10, energym / 10); if (handler->needReportToTarget(target)) - (ChatHandler(target->GetSession())).PSendSysMessage(LANG_YOURS_ENERGY_CHANGED, handler->GetNameLink().c_str(), energy/10, energym/10); + (ChatHandler(target->GetSession())).PSendSysMessage(LANG_YOURS_ENERGY_CHANGED, handler->GetNameLink().c_str(), energy / 10, energym / 10); target->SetMaxPower(POWER_ENERGY, energym); target->SetPower(POWER_ENERGY, energy); @@ -220,8 +220,8 @@ public: // int32 manam = atoi(pmanaMax); // int32 mana = atoi(pmana); - int32 rage = atoi((char*)args)*10; - int32 ragem = atoi((char*)args)*10; + int32 rage = atoi((char*)args) * 10; + int32 ragem = atoi((char*)args) * 10; if (rage <= 0 || ragem <= 0 || ragem < rage) { @@ -242,9 +242,9 @@ public: if (handler->HasLowerSecurity(target, 0)) return false; - handler->PSendSysMessage(LANG_YOU_CHANGE_RAGE, handler->GetNameLink(target).c_str(), rage/10, ragem/10); + handler->PSendSysMessage(LANG_YOU_CHANGE_RAGE, handler->GetNameLink(target).c_str(), rage / 10, ragem / 10); if (handler->needReportToTarget(target)) - (ChatHandler(target->GetSession())).PSendSysMessage(LANG_YOURS_RAGE_CHANGED, handler->GetNameLink().c_str(), rage/10, ragem/10); + (ChatHandler(target->GetSession())).PSendSysMessage(LANG_YOURS_RAGE_CHANGED, handler->GetNameLink().c_str(), rage / 10, ragem / 10); target->SetMaxPower(POWER_RAGE, ragem); target->SetPower(POWER_RAGE, rage); @@ -258,8 +258,8 @@ public: if (!*args) return false; - int32 rune = atoi((char*)args)*10; - int32 runem = atoi((char*)args)*10; + int32 rune = atoi((char*)args) * 10; + int32 runem = atoi((char*)args) * 10; if (rune <= 0 || runem <= 0 || runem < rune) { @@ -276,9 +276,9 @@ public: return false; } - handler->PSendSysMessage(LANG_YOU_CHANGE_RUNIC_POWER, handler->GetNameLink(target).c_str(), rune/10, runem/10); + handler->PSendSysMessage(LANG_YOU_CHANGE_RUNIC_POWER, handler->GetNameLink(target).c_str(), rune / 10, runem / 10); if (handler->needReportToTarget(target)) - (ChatHandler(target->GetSession())).PSendSysMessage(LANG_YOURS_RUNIC_POWER_CHANGED, handler->GetNameLink().c_str(), rune/10, runem/10); + (ChatHandler(target->GetSession())).PSendSysMessage(LANG_YOURS_RUNIC_POWER_CHANGED, handler->GetNameLink().c_str(), rune / 10, runem / 10); target->SetMaxPower(POWER_RUNIC_POWER, runem); target->SetPower(POWER_RUNIC_POWER, rune); @@ -315,7 +315,7 @@ public: uint32 factionid = atoi(pfactionid); uint32 flag; - char *pflag = strtok(nullptr, " "); + char* pflag = strtok(nullptr, " "); if (!pflag) flag = target->GetUInt32Value(UNIT_FIELD_FLAGS); else @@ -400,7 +400,7 @@ public: if (handler->needReportToTarget(target)) (ChatHandler(target->GetSession())).PSendSysMessage(LANG_YOURS_SPELLFLATID_CHANGED, handler->GetNameLink().c_str(), spellflatid, val, mark); - WorldPacket data(SMSG_SET_FLAT_SPELL_MODIFIER, (1+1+2+2)); + WorldPacket data(SMSG_SET_FLAT_SPELL_MODIFIER, (1 + 1 + 2 + 2)); data << uint8(spellflatid); data << uint8(op); data << uint16(val); @@ -736,217 +736,217 @@ public: num = atoi((char*)args); switch (num) { - case 1: - mId=14340; - break; - case 2: - mId=4806; - break; - case 3: - mId=6471; - break; - case 4: - mId=12345; - break; - case 5: - mId=6472; - break; - case 6: - mId=6473; - break; - case 7: - mId=10670; - break; - case 8: - mId=10719; - break; - case 9: - mId=10671; - break; - case 10: - mId=10672; - break; - case 11: - mId=10720; - break; - case 12: - mId=14349; - break; - case 13: - mId=11641; - break; - case 14: - mId=12244; - break; - case 15: - mId=12242; - break; - case 16: - mId=14578; - break; - case 17: - mId=14579; - break; - case 18: - mId=14349; - break; - case 19: - mId=12245; - break; - case 20: - mId=14335; - break; - case 21: - mId=207; - break; - case 22: - mId=2328; - break; - case 23: - mId=2327; - break; - case 24: - mId=2326; - break; - case 25: - mId=14573; - break; - case 26: - mId=14574; - break; - case 27: - mId=14575; - break; - case 28: - mId=604; - break; - case 29: - mId=1166; - break; - case 30: - mId=2402; - break; - case 31: - mId=2410; - break; - case 32: - mId=2409; - break; - case 33: - mId=2408; - break; - case 34: - mId=2405; - break; - case 35: - mId=14337; - break; - case 36: - mId=6569; - break; - case 37: - mId=10661; - break; - case 38: - mId=10666; - break; - case 39: - mId=9473; - break; - case 40: - mId=9476; - break; - case 41: - mId=9474; - break; - case 42: - mId=14374; - break; - case 43: - mId=14376; - break; - case 44: - mId=14377; - break; - case 45: - mId=2404; - break; - case 46: - mId=2784; - break; - case 47: - mId=2787; - break; - case 48: - mId=2785; - break; - case 49: - mId=2736; - break; - case 50: - mId=2786; - break; - case 51: - mId=14347; - break; - case 52: - mId=14346; - break; - case 53: - mId=14576; - break; - case 54: - mId=9695; - break; - case 55: - mId=9991; - break; - case 56: - mId=6448; - break; - case 57: - mId=6444; - break; - case 58: - mId=6080; - break; - case 59: - mId=6447; - break; - case 60: - mId=4805; - break; - case 61: - mId=9714; - break; - case 62: - mId=6448; - break; - case 63: - mId=6442; - break; - case 64: - mId=14632; - break; - case 65: - mId=14332; - break; - case 66: - mId=14331; - break; - case 67: - mId=8469; - break; - case 68: - mId=2830; - break; - case 69: - mId=2346; - break; - default: - handler->SendSysMessage(LANG_NO_MOUNT); - handler->SetSentErrorMessage(true); - return false; + case 1: + mId = 14340; + break; + case 2: + mId = 4806; + break; + case 3: + mId = 6471; + break; + case 4: + mId = 12345; + break; + case 5: + mId = 6472; + break; + case 6: + mId = 6473; + break; + case 7: + mId = 10670; + break; + case 8: + mId = 10719; + break; + case 9: + mId = 10671; + break; + case 10: + mId = 10672; + break; + case 11: + mId = 10720; + break; + case 12: + mId = 14349; + break; + case 13: + mId = 11641; + break; + case 14: + mId = 12244; + break; + case 15: + mId = 12242; + break; + case 16: + mId = 14578; + break; + case 17: + mId = 14579; + break; + case 18: + mId = 14349; + break; + case 19: + mId = 12245; + break; + case 20: + mId = 14335; + break; + case 21: + mId = 207; + break; + case 22: + mId = 2328; + break; + case 23: + mId = 2327; + break; + case 24: + mId = 2326; + break; + case 25: + mId = 14573; + break; + case 26: + mId = 14574; + break; + case 27: + mId = 14575; + break; + case 28: + mId = 604; + break; + case 29: + mId = 1166; + break; + case 30: + mId = 2402; + break; + case 31: + mId = 2410; + break; + case 32: + mId = 2409; + break; + case 33: + mId = 2408; + break; + case 34: + mId = 2405; + break; + case 35: + mId = 14337; + break; + case 36: + mId = 6569; + break; + case 37: + mId = 10661; + break; + case 38: + mId = 10666; + break; + case 39: + mId = 9473; + break; + case 40: + mId = 9476; + break; + case 41: + mId = 9474; + break; + case 42: + mId = 14374; + break; + case 43: + mId = 14376; + break; + case 44: + mId = 14377; + break; + case 45: + mId = 2404; + break; + case 46: + mId = 2784; + break; + case 47: + mId = 2787; + break; + case 48: + mId = 2785; + break; + case 49: + mId = 2736; + break; + case 50: + mId = 2786; + break; + case 51: + mId = 14347; + break; + case 52: + mId = 14346; + break; + case 53: + mId = 14576; + break; + case 54: + mId = 9695; + break; + case 55: + mId = 9991; + break; + case 56: + mId = 6448; + break; + case 57: + mId = 6444; + break; + case 58: + mId = 6080; + break; + case 59: + mId = 6447; + break; + case 60: + mId = 4805; + break; + case 61: + mId = 9714; + break; + case 62: + mId = 6448; + break; + case 63: + mId = 6442; + break; + case 64: + mId = 14632; + break; + case 65: + mId = 14332; + break; + case 66: + mId = 14331; + break; + case 67: + mId = 8469; + break; + case 68: + mId = 2830; + break; + case 69: + mId = 2346; + break; + default: + handler->SendSysMessage(LANG_NO_MOUNT); + handler->SetSentErrorMessage(true); + return false; } Player* target = handler->getSelectedPlayer(); @@ -968,14 +968,14 @@ public: target->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP); target->Mount(mId); - WorldPacket data(SMSG_FORCE_RUN_SPEED_CHANGE, (8+4+1+4)); + WorldPacket data(SMSG_FORCE_RUN_SPEED_CHANGE, (8 + 4 + 1 + 4)); data.append(target->GetPackGUID()); data << (uint32)0; data << (uint8)0; //new 2.1.0 data << float(speed); target->SendMessageToSet(&data, true); - data.Initialize(SMSG_FORCE_SWIM_SPEED_CHANGE, (8+4+4)); + data.Initialize(SMSG_FORCE_SWIM_SPEED_CHANGE, (8 + 4 + 4)); data.append(target->GetPackGUID()); data << (uint32)0; data << float(speed); @@ -1100,14 +1100,14 @@ public: return false; } - if (target->HasFlag(field, (1<<(bit-1)))) + if (target->HasFlag(field, (1 << (bit - 1)))) { - target->RemoveFlag(field, (1<<(bit-1))); + target->RemoveFlag(field, (1 << (bit - 1))); handler->PSendSysMessage(LANG_REMOVE_BIT, bit, field); } else { - target->SetFlag(field, (1<<(bit-1))); + target->SetFlag(field, (1 << (bit - 1))); handler->PSendSysMessage(LANG_SET_BIT, bit, field); } return true; @@ -1178,7 +1178,7 @@ public: uint32 factionId = atoi(factionTxt); int32 amount = 0; - char *rankTxt = strtok(nullptr, " "); + char* rankTxt = strtok(nullptr, " "); if (!factionTxt || !rankTxt) return false; @@ -1207,13 +1207,13 @@ public: if (wrank.substr(0, wrankStr.size()) == wrankStr) { - char *deltaTxt = strtok(nullptr, " "); + char* deltaTxt = strtok(nullptr, " "); if (deltaTxt) { int32 delta = atoi(deltaTxt); - if ((delta < 0) || (delta > ReputationMgr::PointsInRank[r] -1)) + if ((delta < 0) || (delta > ReputationMgr::PointsInRank[r] - 1)) { - handler->PSendSysMessage(LANG_COMMAND_FACTION_DELTA, (ReputationMgr::PointsInRank[r]-1)); + handler->PSendSysMessage(LANG_COMMAND_FACTION_DELTA, (ReputationMgr::PointsInRank[r] - 1)); handler->SetSentErrorMessage(true); return false; } @@ -1250,7 +1250,7 @@ public: target->GetReputationMgr().SetOneFactionReputation(factionEntry, amount, false); target->GetReputationMgr().SendState(target->GetReputationMgr().GetState(factionEntry)); handler->PSendSysMessage(LANG_COMMAND_MODIFY_REP, factionEntry->name[handler->GetSessionDbcLocale()], factionId, - handler->GetNameLink(target).c_str(), target->GetReputationMgr().GetReputation(factionEntry)); + handler->GetNameLink(target).c_str(), target->GetReputationMgr().GetReputation(factionEntry)); return true; } static bool HandleMorphTargetCommand(ChatHandler* handler, const char* args) diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index 952e6f196..2da722230 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -68,38 +68,38 @@ struct MechanicImmune MechanicImmune const mechanicImmunes[MAX_MECHANIC] = { - { MECHANIC_NONE , "MECHANIC_NONE" }, - { MECHANIC_CHARM , "MECHANIC_CHARM" }, - { MECHANIC_DISORIENTED , "MECHANIC_DISORIENTED" }, - { MECHANIC_DISARM , "MECHANIC_DISARM" }, - { MECHANIC_DISTRACT , "MECHANIC_DISTRACT" }, - { MECHANIC_FEAR , "MECHANIC_FEAR" }, - { MECHANIC_GRIP , "MECHANIC_GRIP" }, - { MECHANIC_ROOT , "MECHANIC_ROOT" }, - { MECHANIC_SLOW_ATTACK , "MECHANIC_SLOW_ATTACK" }, - { MECHANIC_SILENCE , "MECHANIC_SILENCE" }, - { MECHANIC_SLEEP , "MECHANIC_SLEEP" }, - { MECHANIC_SNARE , "MECHANIC_SNARE" }, - { MECHANIC_STUN , "MECHANIC_STUN" }, - { MECHANIC_FREEZE , "MECHANIC_FREEZE" }, - { MECHANIC_KNOCKOUT , "MECHANIC_KNOCKOUT" }, - { MECHANIC_BLEED , "MECHANIC_BLEED" }, - { MECHANIC_BANDAGE , "MECHANIC_BANDAGE" }, - { MECHANIC_POLYMORPH , "MECHANIC_POLYMORPH" }, - { MECHANIC_BANISH , "MECHANIC_BANISH" }, - { MECHANIC_SHIELD , "MECHANIC_SHIELD" }, - { MECHANIC_SHACKLE , "MECHANIC_SHACKLE" }, - { MECHANIC_MOUNT , "MECHANIC_MOUNT" }, - { MECHANIC_INFECTED , "MECHANIC_INFECTED" }, - { MECHANIC_TURN , "MECHANIC_TURN" }, - { MECHANIC_HORROR , "MECHANIC_HORROR" }, - { MECHANIC_INVULNERABILITY , "MECHANIC_INVULNERABILITY" }, - { MECHANIC_INTERRUPT , "MECHANIC_INTERRUPT" }, - { MECHANIC_DAZE , "MECHANIC_DAZE" }, - { MECHANIC_DISCOVERY , "MECHANIC_DISCOVERY" }, - { MECHANIC_IMMUNE_SHIELD , "MECHANIC_IMMUNE_SHIELD" }, - { MECHANIC_SAPPED , "MECHANIC_SAPPED" }, - { MECHANIC_ENRAGED , "MECHANIC_ENRAGED" }, + { MECHANIC_NONE, "MECHANIC_NONE" }, + { MECHANIC_CHARM, "MECHANIC_CHARM" }, + { MECHANIC_DISORIENTED, "MECHANIC_DISORIENTED" }, + { MECHANIC_DISARM, "MECHANIC_DISARM" }, + { MECHANIC_DISTRACT, "MECHANIC_DISTRACT" }, + { MECHANIC_FEAR, "MECHANIC_FEAR" }, + { MECHANIC_GRIP, "MECHANIC_GRIP" }, + { MECHANIC_ROOT, "MECHANIC_ROOT" }, + { MECHANIC_SLOW_ATTACK, "MECHANIC_SLOW_ATTACK" }, + { MECHANIC_SILENCE, "MECHANIC_SILENCE" }, + { MECHANIC_SLEEP, "MECHANIC_SLEEP" }, + { MECHANIC_SNARE, "MECHANIC_SNARE" }, + { MECHANIC_STUN, "MECHANIC_STUN" }, + { MECHANIC_FREEZE, "MECHANIC_FREEZE" }, + { MECHANIC_KNOCKOUT, "MECHANIC_KNOCKOUT" }, + { MECHANIC_BLEED, "MECHANIC_BLEED" }, + { MECHANIC_BANDAGE, "MECHANIC_BANDAGE" }, + { MECHANIC_POLYMORPH, "MECHANIC_POLYMORPH" }, + { MECHANIC_BANISH, "MECHANIC_BANISH" }, + { MECHANIC_SHIELD, "MECHANIC_SHIELD" }, + { MECHANIC_SHACKLE, "MECHANIC_SHACKLE" }, + { MECHANIC_MOUNT, "MECHANIC_MOUNT" }, + { MECHANIC_INFECTED, "MECHANIC_INFECTED" }, + { MECHANIC_TURN, "MECHANIC_TURN" }, + { MECHANIC_HORROR, "MECHANIC_HORROR" }, + { MECHANIC_INVULNERABILITY, "MECHANIC_INVULNERABILITY" }, + { MECHANIC_INTERRUPT, "MECHANIC_INTERRUPT" }, + { MECHANIC_DAZE, "MECHANIC_DAZE" }, + { MECHANIC_DISCOVERY, "MECHANIC_DISCOVERY" }, + { MECHANIC_IMMUNE_SHIELD, "MECHANIC_IMMUNE_SHIELD" }, + { MECHANIC_SAPPED, "MECHANIC_SAPPED" }, + { MECHANIC_ENRAGED, "MECHANIC_ENRAGED" }, }; class npc_commandscript : public CommandScript @@ -442,15 +442,15 @@ public: { if (((Pet*)creature)->getPetType() == HUNTER_PET) { - creature->SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, sObjectMgr->GetXPForLevel(lvl)/4); + creature->SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, sObjectMgr->GetXPForLevel(lvl) / 4); creature->SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, 0); } ((Pet*)creature)->GivePetLevel(lvl); } else { - creature->SetMaxHealth(100 + 30*lvl); - creature->SetHealth(100 + 30*lvl); + creature->SetMaxHealth(100 + 30 * lvl); + creature->SetHealth(100 + 30 * lvl); creature->SetLevel(lvl); creature->SaveToDB(); } @@ -722,7 +722,7 @@ public: uint32 nativeid = target->GetNativeDisplayId(); uint32 Entry = target->GetEntry(); - int64 curRespawnDelay = target->GetRespawnTimeEx()-time(nullptr); + int64 curRespawnDelay = target->GetRespawnTimeEx() - time(nullptr); if (curRespawnDelay < 0) curRespawnDelay = 0; std::string curRespawnDelayStr = secsToTimeString(uint64(curRespawnDelay), true); @@ -791,8 +791,7 @@ public: handler->PSendSysMessage(LANG_CREATURE_LIST_CHAT, guid, guid, creatureTemplate->Name.c_str(), x, y, z, mapId); ++count; - } - while (result->NextRow()); + } while (result->NextRow()); } handler->PSendSysMessage(LANG_COMMAND_NEAR_NPC_MESSAGE, distance, count); @@ -1122,7 +1121,7 @@ public: } MovementGeneratorType mtype = IDLE_MOTION_TYPE; - if (option >0.0f) + if (option > 0.0f) mtype = RANDOM_MOTION_TYPE; Creature* creature = handler->getSelectedCreature(); @@ -1214,9 +1213,15 @@ public: char lastchar = args[strlen(args) - 1]; switch (lastchar) { - case '?': creature->HandleEmoteCommand(EMOTE_ONESHOT_QUESTION); break; - case '!': creature->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION); break; - default: creature->HandleEmoteCommand(EMOTE_ONESHOT_TALK); break; + case '?': + creature->HandleEmoteCommand(EMOTE_ONESHOT_QUESTION); + break; + case '!': + creature->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION); + break; + default: + creature->HandleEmoteCommand(EMOTE_ONESHOT_TALK); + break; } return true; @@ -1386,7 +1391,7 @@ public: // place pet before player float x, y, z; player->GetClosePoint (x, y, z, creatureTarget->GetObjectSize(), CONTACT_DISTANCE); - pet->Relocate(x, y, z, M_PI-player->GetOrientation()); + pet->Relocate(x, y, z, M_PI - player->GetOrientation()); // set pet to defensive mode by default (some classes can't control controlled pets in fact). pet->SetReactState(REACT_DEFENSIVE); @@ -1442,7 +1447,7 @@ public: group_member = new FormationInfo; group_member->follow_angle = (creature->GetAngle(chr) - chr->GetOrientation()) * 180 / M_PI; - group_member->follow_dist = sqrtf(pow(chr->GetPositionX() - creature->GetPositionX(), int(2))+pow(chr->GetPositionY() - creature->GetPositionY(), int(2))); + group_member->follow_dist = sqrtf(pow(chr->GetPositionX() - creature->GetPositionX(), int(2)) + pow(chr->GetPositionY() - creature->GetPositionY(), int(2))); group_member->leaderGUID = leaderGUID; group_member->groupAI = 0; diff --git a/src/server/scripts/Commands/cs_quest.cpp b/src/server/scripts/Commands/cs_quest.cpp index f40dc69e8..ad08860cf 100644 --- a/src/server/scripts/Commands/cs_quest.cpp +++ b/src/server/scripts/Commands/cs_quest.cpp @@ -64,8 +64,8 @@ public: handler->SetSentErrorMessage(true); return false; } - - if (player->IsActiveQuest(entry)) + + if (player->IsActiveQuest(entry)) { handler->PSendSysMessage("This quest is already active!"); return false; @@ -181,11 +181,11 @@ public: uint32 curItemCount = player->GetItemCount(id, true); ItemPosCountVec dest; - uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, id, count-curItemCount); + uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, id, count - curItemCount); if (msg == EQUIP_ERR_OK) { Item* item = player->StoreNewItem(dest, id, true); - player->SendNewItem(item, count-curItemCount, true, false); + player->SendNewItem(item, count - curItemCount, true, false); } } diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp index e688845d1..3a18aaf7f 100644 --- a/src/server/scripts/Commands/cs_reload.cpp +++ b/src/server/scripts/Commands/cs_reload.cpp @@ -227,7 +227,7 @@ public: static bool HandleReloadAllNpcCommand(ChatHandler* handler, const char* args) { if (*args != 'a') // will be reloaded from all_gossips - HandleReloadNpcTrainerCommand(handler, "a"); + HandleReloadNpcTrainerCommand(handler, "a"); HandleReloadNpcVendorCommand(handler, "a"); HandleReloadPointsOfInterestCommand(handler, "a"); HandleReloadSpellClickSpellsCommand(handler, "a"); @@ -287,7 +287,7 @@ public: HandleReloadGossipMenuCommand(handler, "a"); HandleReloadGossipMenuOptionCommand(handler, "a"); if (*args != 'a') // already reload from all_scripts - HandleReloadPointsOfInterestCommand(handler, "a"); + HandleReloadPointsOfInterestCommand(handler, "a"); return true; } @@ -484,7 +484,7 @@ public: cInfo->SkinLootId = fields[45].GetUInt32(); for (uint8 i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i) - cInfo->resistance[i] = fields[46 + i -1].GetUInt16(); + cInfo->resistance[i] = fields[46 + i - 1].GetUInt16(); cInfo->spells[0] = fields[52].GetUInt32(); cInfo->spells[1] = fields[53].GetUInt32(); diff --git a/src/server/scripts/Commands/cs_reset.cpp b/src/server/scripts/Commands/cs_reset.cpp index 44ce04e8f..880dbcb1c 100644 --- a/src/server/scripts/Commands/cs_reset.cpp +++ b/src/server/scripts/Commands/cs_reset.cpp @@ -119,8 +119,8 @@ public: // set starting level uint32 startLevel = target->getClass() != CLASS_DEATH_KNIGHT - ? sWorld->getIntConfig(CONFIG_START_PLAYER_LEVEL) - : sWorld->getIntConfig(CONFIG_START_HEROIC_PLAYER_LEVEL); + ? sWorld->getIntConfig(CONFIG_START_PLAYER_LEVEL) + : sWorld->getIntConfig(CONFIG_START_HEROIC_PLAYER_LEVEL); target->_ApplyAllLevelScaleItemMods(false); target->SetLevel(startLevel); @@ -271,7 +271,7 @@ public: atLogin = AtLoginFlags(AT_LOGIN_RESET_TALENTS | AT_LOGIN_RESET_PET_TALENTS); sWorld->SendWorldText(LANG_RESETALL_TALENTS); if (!handler->GetSession()) - handler->SendSysMessage(LANG_RESETALL_TALENTS); + handler->SendSysMessage(LANG_RESETALL_TALENTS); } else { diff --git a/src/server/scripts/Commands/cs_server.cpp b/src/server/scripts/Commands/cs_server.cpp index 7796c7a68..e68d93e51 100644 --- a/src/server/scripts/Commands/cs_server.cpp +++ b/src/server/scripts/Commands/cs_server.cpp @@ -31,25 +31,25 @@ public: static std::vector serverIdleRestartCommandTable = { { "cancel", SEC_ADMINISTRATOR, true, &HandleServerShutDownCancelCommand, "" }, - { "" , SEC_ADMINISTRATOR, true, &HandleServerIdleRestartCommand, "" } + { "", SEC_ADMINISTRATOR, true, &HandleServerIdleRestartCommand, "" } }; static std::vector serverIdleShutdownCommandTable = { { "cancel", SEC_ADMINISTRATOR, true, &HandleServerShutDownCancelCommand, "" }, - { "" , SEC_ADMINISTRATOR, true, &HandleServerIdleShutDownCommand, "" } + { "", SEC_ADMINISTRATOR, true, &HandleServerIdleShutDownCommand, "" } }; static std::vector serverRestartCommandTable = { { "cancel", SEC_ADMINISTRATOR, true, &HandleServerShutDownCancelCommand, "" }, - { "" , SEC_ADMINISTRATOR, true, &HandleServerRestartCommand, "" } + { "", SEC_ADMINISTRATOR, true, &HandleServerRestartCommand, "" } }; static std::vector serverShutdownCommandTable = { { "cancel", SEC_ADMINISTRATOR, true, &HandleServerShutDownCancelCommand, "" }, - { "" , SEC_ADMINISTRATOR, true, &HandleServerShutDownCommand, "" } + { "", SEC_ADMINISTRATOR, true, &HandleServerShutDownCommand, "" } }; static std::vector serverSetCommandTable = @@ -75,7 +75,7 @@ public: { "togglequerylog", SEC_CONSOLE, true, &HandleServerToggleQueryLogging, "" } }; - static std::vector commandTable = + static std::vector commandTable = { { "server", SEC_PLAYER, true, nullptr, "", serverCommandTable } }; @@ -203,7 +203,7 @@ public: else sWorld->ShutdownServ(time, SHUTDOWN_MASK_RESTART, RESTART_EXIT_CODE); - return true; + return true; } static bool HandleServerIdleRestartCommand(ChatHandler* /*handler*/, char const* args) @@ -273,7 +273,7 @@ public: } else sWorld->ShutdownServ(time, SHUTDOWN_MASK_IDLE, SHUTDOWN_EXIT_CODE); - return true; + return true; } // Exit the realm diff --git a/src/server/scripts/Commands/cs_spectator.cpp b/src/server/scripts/Commands/cs_spectator.cpp index 5373a2361..626c9fcdc 100644 --- a/src/server/scripts/Commands/cs_spectator.cpp +++ b/src/server/scripts/Commands/cs_spectator.cpp @@ -152,7 +152,7 @@ bool ArenaSpectator::HandleSpectatorSpectateCommand(ChatHandler* handler, char c const Unit::VisibleAuraMap* va = player->GetVisibleAuras(); for (Unit::VisibleAuraMap::const_iterator itr = va->begin(); itr != va->end(); ++itr) if (Aura* aura = itr->second->GetBase()) - if (!itr->second->IsPositive() && !aura->IsPermanent() && aura->GetDuration() < HOUR*IN_MILLISECONDS) + if (!itr->second->IsPositive() && !aura->IsPermanent() && aura->GetDuration() < HOUR * IN_MILLISECONDS) { switch (aura->GetSpellInfo()->Id) { @@ -180,7 +180,7 @@ bool ArenaSpectator::HandleSpectatorSpectateCommand(ChatHandler* handler, char c bool bgPreparation = false; if ((!handler->GetSession()->GetSecurity() && bgmap->GetBG()->GetStatus() != STATUS_IN_PROGRESS) || - (handler->GetSession()->GetSecurity() && bgmap->GetBG()->GetStatus() != STATUS_WAIT_JOIN && bgmap->GetBG()->GetStatus() != STATUS_IN_PROGRESS)) + (handler->GetSession()->GetSecurity() && bgmap->GetBG()->GetStatus() != STATUS_WAIT_JOIN && bgmap->GetBG()->GetStatus() != STATUS_IN_PROGRESS)) { bgPreparation = true; handler->SendSysMessage("Arena is not in progress yet. You will be invited as soon as it starts."); @@ -192,7 +192,7 @@ bool ArenaSpectator::HandleSpectatorSpectateCommand(ChatHandler* handler, char c { handler->PSendSysMessage("To spectate, please fix the following:"); for (std::list::const_iterator itr = errors.begin(); itr != errors.end(); ++itr) - handler->PSendSysMessage("- %s",(*itr).c_str()); + handler->PSendSysMessage("- %s", (*itr).c_str()); return true; } @@ -203,7 +203,7 @@ bool ArenaSpectator::HandleSpectatorSpectateCommand(ChatHandler* handler, char c player->SetPendingSpectatorForBG(spectate->GetBattlegroundId()); player->SetBattlegroundId(spectate->GetBattlegroundId(), spectate->GetBattlegroundTypeId(), PLAYER_MAX_BATTLEGROUND_QUEUES, false, false, TEAM_NEUTRAL); player->SetEntryPoint(); - float z = spectate->GetMapId() == 618 ? std::max(28.27f, spectate->GetPositionZ()+0.25f) : spectate->GetPositionZ()+0.25f; + float z = spectate->GetMapId() == 618 ? std::max(28.27f, spectate->GetPositionZ() + 0.25f) : spectate->GetPositionZ() + 0.25f; player->TeleportTo(spectate->GetMapId(), spectate->GetPositionX(), spectate->GetPositionY(), z, spectate->GetOrientation(), TELE_TO_GM_MODE); return true; } diff --git a/src/server/scripts/Commands/cs_tele.cpp b/src/server/scripts/Commands/cs_tele.cpp index 0fc32d522..63deea797 100644 --- a/src/server/scripts/Commands/cs_tele.cpp +++ b/src/server/scripts/Commands/cs_tele.cpp @@ -86,7 +86,7 @@ public: if (!*args) return false; - // id, or string, or [name] Shift-click form |color|Htele:id|h[name]|h|r + // id, or string, or [name] Shift-click form |color|Htele:id|h[name]|h|r GameTele const* tele = handler->extractGameTeleFromLink((char*)args); if (!tele) { @@ -191,7 +191,7 @@ public: handler->PSendSysMessage(LANG_TELEPORTING_TO, nameLink.c_str(), handler->GetAcoreString(LANG_OFFLINE), tele->name.c_str()); Player::SavePositionInDB(tele->mapId, tele->position_x, tele->position_y, tele->position_z, tele->orientation, - sMapMgr->GetZoneId(tele->mapId, tele->position_x, tele->position_y, tele->position_z), target_guid); + sMapMgr->GetZoneId(tele->mapId, tele->position_x, tele->position_y, tele->position_z), target_guid); } return true; diff --git a/src/server/scripts/Commands/cs_ticket.cpp b/src/server/scripts/Commands/cs_ticket.cpp index 8706071d2..6e5c0e555 100644 --- a/src/server/scripts/Commands/cs_ticket.cpp +++ b/src/server/scripts/Commands/cs_ticket.cpp @@ -193,7 +193,7 @@ public: std::string const assignedName = ticket->GetAssignedToName(); std::string msg = ticket->FormatMessageString(*handler, assignedName.empty() ? nullptr : assignedName.c_str(), nullptr, nullptr, nullptr); - + msg += handler->PGetParseString(LANG_COMMAND_TICKETLISTADDCOMMENT, player ? player->GetName().c_str() : "Console", comment); handler->SendGlobalGMSysMessage(msg.c_str()); @@ -401,7 +401,7 @@ public: sTicketMgr->UpdateLastChange(); std::string msg = ticket->FormatMessageString(*handler, nullptr, assignedTo.c_str(), - handler->GetSession() ? handler->GetSession()->GetPlayer()->GetName().c_str() : "Console", nullptr); + handler->GetSession() ? handler->GetSession()->GetPlayer()->GetName().c_str() : "Console", nullptr); handler->SendGlobalGMSysMessage(msg.c_str()); return true; diff --git a/src/server/scripts/Commands/cs_wp.cpp b/src/server/scripts/Commands/cs_wp.cpp index fe5b33d24..350e64a9e 100644 --- a/src/server/scripts/Commands/cs_wp.cpp +++ b/src/server/scripts/Commands/cs_wp.cpp @@ -85,7 +85,7 @@ public: PreparedQueryResult result = WorldDatabase.Query(stmt); uint32 maxpathid = result->Fetch()->GetInt32(); - pathid = maxpathid+1; + pathid = maxpathid + 1; handler->PSendSysMessage("%s%s|r", "|cff00ff00", "New path started."); } } @@ -121,7 +121,7 @@ public: WorldDatabase.Execute(stmt); - handler->PSendSysMessage("%s%s%u%s%u%s|r", "|cff00ff00", "PathID: |r|cff00ffff", pathid, "|r|cff00ff00: Waypoint |r|cff00ffff", point+1, "|r|cff00ff00 created. "); + handler->PSendSysMessage("%s%s%u%s%u%s|r", "|cff00ff00", "PathID: |r|cff00ffff", pathid, "|r|cff00ff00: Waypoint |r|cff00ffff", point + 1, "|r|cff00ff00 created. "); return true; } // HandleWpAddCommand @@ -318,7 +318,7 @@ public: WorldDatabase.Execute(stmt); - handler->PSendSysMessage("%s%s%u|r", "|cff00ff00", "Wp Event: New waypoint event added: |r|cff00ffff", id+1); + handler->PSendSysMessage("%s%s%u|r", "|cff00ff00", "Wp Event: New waypoint event added: |r|cff00ffff", id + 1); } return true; @@ -365,8 +365,7 @@ public: a11 = fields[9].GetFloat(); handler->PSendSysMessage("|cffff33ffid:|r|cff00ffff %u|r|cff00ff00, guid: |r|cff00ffff%u|r|cff00ff00, delay: |r|cff00ffff%u|r|cff00ff00, command: |r|cff00ffff%u|r|cff00ff00, datalong: |r|cff00ffff%u|r|cff00ff00, datalong2: |r|cff00ffff%u|r|cff00ff00, datatext: |r|cff00ffff%s|r|cff00ff00, posx: |r|cff00ffff%f|r|cff00ff00, posy: |r|cff00ffff%f|r|cff00ff00, posz: |r|cff00ffff%f|r|cff00ff00, orientation: |r|cff00ffff%f|r", id, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); - } - while (result->NextRow()); + } while (result->NextRow()); } if (show == "del") @@ -428,8 +427,8 @@ public: std::string arg_string = arg_2; if ((arg_string != "setid") && (arg_string != "delay") && (arg_string != "command") - && (arg_string != "datalong") && (arg_string != "datalong2") && (arg_string != "dataint") && (arg_string != "posx") - && (arg_string != "posy") && (arg_string != "posz") && (arg_string != "orientation")) + && (arg_string != "datalong") && (arg_string != "datalong2") && (arg_string != "dataint") && (arg_string != "posx") + && (arg_string != "posy") && (arg_string != "posz") && (arg_string != "orientation")) { handler->SendSysMessage("|cffff33ffERROR: No valid argument present.|r"); return true; @@ -554,8 +553,8 @@ public: // Check // Remember: "show" must also be the name of a column! if ((show != "delay") && (show != "action") && (show != "action_chance") - && (show != "move_type") && (show != "del") && (show != "move") && (show != "wpadd") - ) + && (show != "move_type") && (show != "del") && (show != "move") && (show != "wpadd") + ) { return false; } @@ -619,8 +618,7 @@ public: Field* fields = result->Fetch(); pathid = fields[0].GetUInt32(); point = fields[1].GetUInt32(); - } - while (result->NextRow()); + } while (result->NextRow()); // We have the waypoint number and the GUID of the "master npc" // Text is enclosed in "<>", all other arguments not @@ -719,7 +717,7 @@ public: return true; } // move - const char *text = arg_str; + const char* text = arg_str; if (text == 0) { @@ -824,8 +822,7 @@ public: handler->PSendSysMessage("|cff00ff00Show info: Move flag: |r|cff00ffff%u|r", flag); handler->PSendSysMessage("|cff00ff00Show info: Waypoint event: |r|cff00ffff%u|r", ev_id); handler->PSendSysMessage("|cff00ff00Show info: Event chance: |r|cff00ffff%u|r", ev_chance); - } - while (result->NextRow()); + } while (result->NextRow()); return true; } @@ -881,8 +878,7 @@ public: creature->AddObjectToRemoveList(); } - } - while (result2->NextRow()); + } while (result2->NextRow()); if (hasError) { @@ -938,8 +934,7 @@ public: wpCreature->SetObjectScale(0.5f); wpCreature->SetLevel(point > STRONG_MAX_LEVEL ? STRONG_MAX_LEVEL : point); } - } - while (result->NextRow()); + } while (result->NextRow()); handler->SendSysMessage("|cff00ff00Showing the current creature's path.|r"); return true; @@ -1079,8 +1074,7 @@ public: creature->DeleteFromDB(); creature->AddObjectToRemoveList(); } - } - while (result->NextRow()); + } while (result->NextRow()); // set "wpguid" column to "empty" - no visual waypoint spawned stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_WAYPOINT_DATA_ALL_WPGUID); diff --git a/src/server/scripts/EasternKingdoms/AlteracValley/alterac_valley.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/alterac_valley.cpp index 48ada9d19..e85f7adbd 100644 --- a/src/server/scripts/EasternKingdoms/AlteracValley/alterac_valley.cpp +++ b/src/server/scripts/EasternKingdoms/AlteracValley/alterac_valley.cpp @@ -68,76 +68,76 @@ SpellPair const _auraPairs[MAX_SPELL_PAIRS] = class npc_av_marshal_or_warmaster : public CreatureScript { - public: - npc_av_marshal_or_warmaster() : CreatureScript("npc_av_marshal_or_warmaster") { } +public: + npc_av_marshal_or_warmaster() : CreatureScript("npc_av_marshal_or_warmaster") { } - struct npc_av_marshal_or_warmasterAI : public ScriptedAI + struct npc_av_marshal_or_warmasterAI : public ScriptedAI + { + npc_av_marshal_or_warmasterAI(Creature* creature) : ScriptedAI(creature) { } + + void Reset() { - npc_av_marshal_or_warmasterAI(Creature* creature) : ScriptedAI(creature) { } + events.Reset(); + events.ScheduleEvent(EVENT_CHARGE_TARGET, urand(2 * IN_MILLISECONDS, 12 * IN_MILLISECONDS)); + events.ScheduleEvent(EVENT_CLEAVE, urand(1 * IN_MILLISECONDS, 11 * IN_MILLISECONDS)); + events.ScheduleEvent(EVENT_DEMORALIZING_SHOUT, 2000); + events.ScheduleEvent(EVENT_WHIRLWIND, urand(5 * IN_MILLISECONDS, 20 * IN_MILLISECONDS)); + events.ScheduleEvent(EVENT_ENRAGE, urand(5 * IN_MILLISECONDS, 20 * IN_MILLISECONDS)); + events.ScheduleEvent(EVENT_CHECK_RESET, 5000); - void Reset() + _hasAura = false; + } + + void JustRespawned() + { + Reset(); + } + + void UpdateAI(uint32 diff) + { + // I have a feeling this isn't blizzlike, but owell, I'm only passing by and cleaning up. + if (!_hasAura) { - events.Reset(); - events.ScheduleEvent(EVENT_CHARGE_TARGET, urand(2 * IN_MILLISECONDS, 12 * IN_MILLISECONDS)); - events.ScheduleEvent(EVENT_CLEAVE, urand(1 * IN_MILLISECONDS, 11 * IN_MILLISECONDS)); - events.ScheduleEvent(EVENT_DEMORALIZING_SHOUT, 2000); - events.ScheduleEvent(EVENT_WHIRLWIND, urand(5 * IN_MILLISECONDS, 20 * IN_MILLISECONDS)); - events.ScheduleEvent(EVENT_ENRAGE, urand(5 * IN_MILLISECONDS, 20 * IN_MILLISECONDS)); - events.ScheduleEvent(EVENT_CHECK_RESET, 5000); + for (uint8 i = 0; i < MAX_SPELL_PAIRS; ++i) + if (_auraPairs[i].npcEntry == me->GetEntry()) + DoCast(me, _auraPairs[i].spellId); - _hasAura = false; + _hasAura = true; } - void JustRespawned() + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) { - Reset(); - } - - void UpdateAI(uint32 diff) - { - // I have a feeling this isn't blizzlike, but owell, I'm only passing by and cleaning up. - if (!_hasAura) + switch (eventId) { - for (uint8 i = 0; i < MAX_SPELL_PAIRS; ++i) - if (_auraPairs[i].npcEntry == me->GetEntry()) - DoCast(me, _auraPairs[i].spellId); - - _hasAura = true; - } - - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_CHARGE_TARGET: - DoCastVictim(SPELL_CHARGE); - events.ScheduleEvent(EVENT_CHARGE, urand(10 * IN_MILLISECONDS, 25 * IN_MILLISECONDS)); - break; - case EVENT_CLEAVE: - DoCastVictim(SPELL_CLEAVE); - events.ScheduleEvent(EVENT_CLEAVE, urand(10 * IN_MILLISECONDS, 16 * IN_MILLISECONDS)); - break; - case EVENT_DEMORALIZING_SHOUT: - DoCast(me, SPELL_DEMORALIZING_SHOUT); - events.ScheduleEvent(EVENT_DEMORALIZING_SHOUT, urand(10 * IN_MILLISECONDS, 15 * IN_MILLISECONDS)); - break; - case EVENT_WHIRLWIND: - DoCast(me, SPELL_WHIRLWIND); - events.ScheduleEvent(EVENT_WHIRLWIND, urand(10 * IN_MILLISECONDS, 25 * IN_MILLISECONDS)); - break; - case EVENT_ENRAGE: - DoCast(me, SPELL_ENRAGE); - events.ScheduleEvent(EVENT_ENRAGE, urand(10 * IN_MILLISECONDS, 30 * IN_MILLISECONDS)); - break; - case EVENT_CHECK_RESET: + case EVENT_CHARGE_TARGET: + DoCastVictim(SPELL_CHARGE); + events.ScheduleEvent(EVENT_CHARGE, urand(10 * IN_MILLISECONDS, 25 * IN_MILLISECONDS)); + break; + case EVENT_CLEAVE: + DoCastVictim(SPELL_CLEAVE); + events.ScheduleEvent(EVENT_CLEAVE, urand(10 * IN_MILLISECONDS, 16 * IN_MILLISECONDS)); + break; + case EVENT_DEMORALIZING_SHOUT: + DoCast(me, SPELL_DEMORALIZING_SHOUT); + events.ScheduleEvent(EVENT_DEMORALIZING_SHOUT, urand(10 * IN_MILLISECONDS, 15 * IN_MILLISECONDS)); + break; + case EVENT_WHIRLWIND: + DoCast(me, SPELL_WHIRLWIND); + events.ScheduleEvent(EVENT_WHIRLWIND, urand(10 * IN_MILLISECONDS, 25 * IN_MILLISECONDS)); + break; + case EVENT_ENRAGE: + DoCast(me, SPELL_ENRAGE); + events.ScheduleEvent(EVENT_ENRAGE, urand(10 * IN_MILLISECONDS, 30 * IN_MILLISECONDS)); + break; + case EVENT_CHECK_RESET: { Position const& _homePosition = me->GetHomePosition(); if (me->GetDistance2d(_homePosition.GetPositionX(), _homePosition.GetPositionY()) > 50.0f) @@ -148,21 +148,21 @@ class npc_av_marshal_or_warmaster : public CreatureScript events.ScheduleEvent(EVENT_CHECK_RESET, 5000); break; } - } } - - DoMeleeAttackIfReady(); } - private: - EventMap events; - bool _hasAura; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_av_marshal_or_warmasterAI(creature); + DoMeleeAttackIfReady(); } + + private: + EventMap events; + bool _hasAura; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_av_marshal_or_warmasterAI(creature); + } }; void AddSC_alterac_valley() diff --git a/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp index 22733c931..5bff2a0b7 100644 --- a/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp +++ b/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp @@ -61,7 +61,8 @@ public: { DoCastVictim(SPELL_WATERBOLT); waterBoltTimer = 5 * IN_MILLISECONDS; - } else waterBoltTimer -= diff; + } + else waterBoltTimer -= diff; // check if creature is not outside of building if (resetTimer < diff) @@ -70,7 +71,8 @@ public: if (me->GetDistance2d(pBalinda->GetHomePosition().GetPositionX(), pBalinda->GetHomePosition().GetPositionY()) > 50) EnterEvadeMode(); resetTimer = 5 * IN_MILLISECONDS; - } else resetTimer -= diff; + } + else resetTimer -= diff; DoMeleeAttackIfReady(); } @@ -145,31 +147,36 @@ public: if (summons.empty()) me->SummonCreature(NPC_WATER_ELEMENTAL, 0, 0, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 45 * IN_MILLISECONDS); waterElementalTimer = 50 * IN_MILLISECONDS; - } else waterElementalTimer -= diff; + } + else waterElementalTimer -= diff; if (arcaneExplosionTimer < diff) { DoCastVictim(SPELL_ARCANE_EXPLOSION); arcaneExplosionTimer = urand(5 * IN_MILLISECONDS, 15 * IN_MILLISECONDS); - } else arcaneExplosionTimer -= diff; + } + else arcaneExplosionTimer -= diff; if (coneOfColdTimer < diff) { DoCastVictim(SPELL_CONE_OF_COLD); coneOfColdTimer = urand(10 * IN_MILLISECONDS, 20 * IN_MILLISECONDS); - } else coneOfColdTimer -= diff; + } + else coneOfColdTimer -= diff; if (fireBoltTimer < diff) { DoCastVictim(SPELL_FIREBALL); fireBoltTimer = urand(5 * IN_MILLISECONDS, 9 * IN_MILLISECONDS); - } else fireBoltTimer -= diff; + } + else fireBoltTimer -= diff; if (frostboltTimer < diff) { DoCastVictim(SPELL_FROSTBOLT); frostboltTimer = urand(4 * IN_MILLISECONDS, 12 * IN_MILLISECONDS); - } else frostboltTimer -= diff; + } + else frostboltTimer -= diff; // check if creature is not outside of building if (resetTimer < diff) @@ -180,7 +187,8 @@ public: Talk(YELL_EVADE); } resetTimer = 5 * IN_MILLISECONDS; - } else resetTimer -= diff; + } + else resetTimer -= diff; DoMeleeAttackIfReady(); } diff --git a/src/server/scripts/EasternKingdoms/AlteracValley/boss_drekthar.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/boss_drekthar.cpp index dd1bbba5f..0ab64e019 100644 --- a/src/server/scripts/EasternKingdoms/AlteracValley/boss_drekthar.cpp +++ b/src/server/scripts/EasternKingdoms/AlteracValley/boss_drekthar.cpp @@ -73,31 +73,36 @@ public: { DoCastVictim(SPELL_WHIRLWIND); WhirlwindTimer = urand(8 * IN_MILLISECONDS, 18 * IN_MILLISECONDS); - } else WhirlwindTimer -= diff; + } + else WhirlwindTimer -= diff; if (Whirlwind2Timer <= diff) { DoCastVictim(SPELL_WHIRLWIND2); Whirlwind2Timer = urand(7 * IN_MILLISECONDS, 25 * IN_MILLISECONDS); - } else Whirlwind2Timer -= diff; + } + else Whirlwind2Timer -= diff; if (KnockdownTimer <= diff) { DoCastVictim(SPELL_KNOCKDOWN); KnockdownTimer = urand(10 * IN_MILLISECONDS, 15 * IN_MILLISECONDS); - } else KnockdownTimer -= diff; + } + else KnockdownTimer -= diff; if (FrenzyTimer <= diff) { DoCastVictim(SPELL_FRENZY); FrenzyTimer = urand(20 * IN_MILLISECONDS, 30 * IN_MILLISECONDS); - } else FrenzyTimer -= diff; + } + else FrenzyTimer -= diff; if (YellTimer <= diff) { Talk(YELL_RANDOM); YellTimer = urand(20 * IN_MILLISECONDS, 30 * IN_MILLISECONDS); //20 to 30 seconds - } else YellTimer -= diff; + } + else YellTimer -= diff; // check if creature is not outside of building if (ResetTimer <= diff) @@ -108,7 +113,8 @@ public: Talk(YELL_EVADE); } ResetTimer = 5 * IN_MILLISECONDS; - } else ResetTimer -= diff; + } + else ResetTimer -= diff; DoMeleeAttackIfReady(); } diff --git a/src/server/scripts/EasternKingdoms/AlteracValley/boss_galvangar.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/boss_galvangar.cpp index 3d62d819b..f23506c2e 100644 --- a/src/server/scripts/EasternKingdoms/AlteracValley/boss_galvangar.cpp +++ b/src/server/scripts/EasternKingdoms/AlteracValley/boss_galvangar.cpp @@ -67,31 +67,36 @@ public: { DoCastVictim(SPELL_CLEAVE); CleaveTimer = urand(10 * IN_MILLISECONDS, 16 * IN_MILLISECONDS); - } else CleaveTimer -= diff; + } + else CleaveTimer -= diff; if (FrighteningShoutTimer <= diff) { DoCastVictim(SPELL_FRIGHTENING_SHOUT); FrighteningShoutTimer = urand(10 * IN_MILLISECONDS, 15 * IN_MILLISECONDS); - } else FrighteningShoutTimer -= diff; + } + else FrighteningShoutTimer -= diff; if (Whirlwind1Timer <= diff) { DoCastVictim(SPELL_WHIRLWIND1); Whirlwind1Timer = urand(6 * IN_MILLISECONDS, 10 * IN_MILLISECONDS); - } else Whirlwind1Timer -= diff; + } + else Whirlwind1Timer -= diff; if (Whirlwind2Timer <= diff) { DoCastVictim(SPELL_WHIRLWIND2); Whirlwind2Timer = urand(10 * IN_MILLISECONDS, 25 * IN_MILLISECONDS); - } else Whirlwind2Timer -= diff; + } + else Whirlwind2Timer -= diff; if (MortalStrikeTimer <= diff) { DoCastVictim(SPELL_MORTAL_STRIKE); MortalStrikeTimer = urand(10 * IN_MILLISECONDS, 30 * IN_MILLISECONDS); - } else MortalStrikeTimer -= diff; + } + else MortalStrikeTimer -= diff; // check if creature is not outside of building if (ResetTimer <= diff) @@ -102,7 +107,8 @@ public: Talk(YELL_EVADE); } ResetTimer = 5 * IN_MILLISECONDS; - } else ResetTimer -= diff; + } + else ResetTimer -= diff; DoMeleeAttackIfReady(); } diff --git a/src/server/scripts/EasternKingdoms/AlteracValley/boss_vanndar.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/boss_vanndar.cpp index 82b94ab75..03cf7493b 100644 --- a/src/server/scripts/EasternKingdoms/AlteracValley/boss_vanndar.cpp +++ b/src/server/scripts/EasternKingdoms/AlteracValley/boss_vanndar.cpp @@ -11,8 +11,8 @@ enum Yells { YELL_AGGRO = 0, YELL_EVADE = 1, - //YELL_RESPAWN1 = -1810010, // Missing in database - //YELL_RESPAWN2 = -1810011, // Missing in database + //YELL_RESPAWN1 = -1810010, // Missing in database + //YELL_RESPAWN2 = -1810011, // Missing in database YELL_RANDOM = 2, YELL_SPELL = 3, }; @@ -62,25 +62,29 @@ public: { DoCastVictim(SPELL_AVATAR); AvatarTimer = urand(15 * IN_MILLISECONDS, 20 * IN_MILLISECONDS); - } else AvatarTimer -= diff; + } + else AvatarTimer -= diff; if (ThunderclapTimer <= diff) { DoCastVictim(SPELL_THUNDERCLAP); ThunderclapTimer = urand(5 * IN_MILLISECONDS, 15 * IN_MILLISECONDS); - } else ThunderclapTimer -= diff; + } + else ThunderclapTimer -= diff; if (StormboltTimer <= diff) { DoCastVictim(SPELL_STORMBOLT); StormboltTimer = urand(10 * IN_MILLISECONDS, 25 * IN_MILLISECONDS); - } else StormboltTimer -= diff; + } + else StormboltTimer -= diff; if (YellTimer <= diff) { Talk(YELL_RANDOM); YellTimer = urand(20 * IN_MILLISECONDS, 30 * IN_MILLISECONDS); //20 to 30 seconds - } else YellTimer -= diff; + } + else YellTimer -= diff; // check if creature is not outside of building if (ResetTimer <= diff) @@ -91,7 +95,8 @@ public: Talk(YELL_EVADE); } ResetTimer = 5 * IN_MILLISECONDS; - } else ResetTimer -= diff; + } + else ResetTimer -= diff; DoMeleeAttackIfReady(); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp index f40096754..93450e32a 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp @@ -29,18 +29,27 @@ public: else instance->SetData(TYPE_LYCEUM, IN_PROGRESS); // If used brazier open linked doors (North or South) - if (go->GetGUID() == instance->GetData64(DATA_SF_BRAZIER_N)) { - if (braziersUsed == 0) { + if (go->GetGUID() == instance->GetData64(DATA_SF_BRAZIER_N)) + { + if (braziersUsed == 0) + { braziersUsed = 1; - }else if(braziersUsed == 2){ + } + else if(braziersUsed == 2) + { instance->HandleGameObject(instance->GetData64(DATA_GOLEM_DOOR_N), true); instance->HandleGameObject(instance->GetData64(DATA_GOLEM_DOOR_S), true); braziersUsed = 0; } - }else if (go->GetGUID() == instance->GetData64(DATA_SF_BRAZIER_S)) { - if (braziersUsed == 0) { + } + else if (go->GetGUID() == instance->GetData64(DATA_SF_BRAZIER_S)) + { + if (braziersUsed == 0) + { braziersUsed = 2; - }else if (braziersUsed == 1) { + } + else if (braziersUsed == 1) + { instance->HandleGameObject(instance->GetData64(DATA_GOLEM_DOOR_N), true); instance->HandleGameObject(instance->GetData64(DATA_GOLEM_DOOR_S), true); braziersUsed = 0; @@ -66,7 +75,7 @@ uint32 theldrenTeam[] = 16053, 16055, 16050, 16051, 16049, 16052, 16054, 16058 }; -uint32 RingMob[]= +uint32 RingMob[] = { 8925, // Dredge Worm 8926, // Deep Stinger @@ -76,7 +85,7 @@ uint32 RingMob[]= 8932, // Borer Beetle }; -uint32 RingBoss[]= +uint32 RingBoss[] = { 9027, // Gorosh 9028, // Grizzle @@ -133,7 +142,7 @@ public: npc_grimstoneAI(Creature* creature) : npc_escortAI(creature), summons(me) { instance = creature->GetInstanceScript(); - MobSpawnId = rand()%6; + MobSpawnId = rand() % 6; eventPhase = 0; eventTimer = 1000; theldrenEvent = false; @@ -215,11 +224,11 @@ public: theldrenEvent = true; me->SummonCreature(NPC_THELDREN, 644.300f, -175.989f, -53.739f, 3.418f, TEMPSUMMON_DEAD_DESPAWN, 0); uint8 rand = urand(0, 4); - for (uint8 i = rand; i < rand+4; ++i) + for (uint8 i = rand; i < rand + 4; ++i) me->SummonCreature(theldrenTeam[i], 644.300f, -175.989f, -53.739f, 3.418f, TEMPSUMMON_DEAD_DESPAWN, 0); } else - me->SummonCreature(RingBoss[rand()%6], 644.300f, -175.989f, -53.739f, 3.418f, TEMPSUMMON_DEAD_DESPAWN, 0); + me->SummonCreature(RingBoss[rand() % 6], 644.300f, -175.989f, -53.739f, 3.418f, TEMPSUMMON_DEAD_DESPAWN, 0); } void UpdateEscortAI(uint32 diff) @@ -287,7 +296,7 @@ public: if (GameObject* go = me->SummonGameObject(GO_ARENA_SPOILS, 596.48f, -187.91f, -54.14f, 4.9f, 0.0f, 0.0f, 0.0f, 0.0f, 300)) go->SetOwnerGUID(0); - Map::PlayerList const &pl = me->GetMap()->GetPlayers(); + Map::PlayerList const& pl = me->GetMap()->GetPlayers(); for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) itr->GetSource()->KilledMonsterCredit(16166, 0); } @@ -351,7 +360,8 @@ public: { DoCastVictim(SPELL_THUNDERCLAP); ThunderClap_Timer = 10000; - } else ThunderClap_Timer -= diff; + } + else ThunderClap_Timer -= diff; //FireballVolley_Timer if (HealthBelowPct(51)) @@ -360,7 +370,8 @@ public: { DoCastVictim(SPELL_FIREBALLVOLLEY); FireballVolley_Timer = 15000; - } else FireballVolley_Timer -= diff; + } + else FireballVolley_Timer -= diff; } //MightyBlow_Timer @@ -368,7 +379,8 @@ public: { DoCastVictim(SPELL_MIGHTYBLOW); MightyBlow_Timer = 10000; - } else MightyBlow_Timer -= diff; + } + else MightyBlow_Timer -= diff; DoMeleeAttackIfReady(); } @@ -418,11 +430,11 @@ public: if (creature->IsVendor() && player->GetReputationRank(59) >= REP_FRIENDLY) AddGossipItemFor(player, 4781, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - + if (player->GetQuestRewardStatus(QUEST_A_BINDING_CONTRACT) != 1 && - !player->HasItemCount(ITEM_THRORIUM_BROTHERHOOD_CONTRACT, 1, true) && - player->HasItemCount(ITEM_SULFURON_INGOT)) + !player->HasItemCount(ITEM_THRORIUM_BROTHERHOOD_CONTRACT, 1, true) && + player->HasItemCount(ITEM_SULFURON_INGOT)) { AddGossipItemFor(player, 4781, 1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); } @@ -1173,7 +1185,8 @@ public: DoGo(DATA_GO_BAR_KEG, 0); BreakKeg_Timer = 0; BreakDoor_Timer = 1000; - } else BreakKeg_Timer -= diff; + } + else BreakKeg_Timer -= diff; } if (BreakDoor_Timer) @@ -1192,7 +1205,8 @@ public: instance->SetData(TYPE_BAR, DONE); BreakDoor_Timer = 0; - } else BreakDoor_Timer -= diff; + } + else BreakDoor_Timer -= diff; } npc_escortAI::UpdateAI(diff); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_ambassador_flamelash.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_ambassador_flamelash.cpp index d2290f9ef..dfe53b175 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_ambassador_flamelash.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_ambassador_flamelash.cpp @@ -38,7 +38,7 @@ const Position SummonPositions[7] = {1012.252747f, -206.696487f, -61.980618f, 3.617599f}, }; -vector gobjectDwarfRunesEntry { 170578, 170579, 170580, 170581, 170582, 170583, 170584 }; +vector gobjectDwarfRunesEntry { 170578, 170579, 170580, 170581, 170582, 170583, 170584 }; class boss_ambassador_flamelash : public CreatureScript { @@ -88,14 +88,14 @@ public: { // Active makes the runes burn, ready turns them off GOState state = mode ? GO_STATE_ACTIVE : GO_STATE_READY; - + for (int RuneEntry : gobjectDwarfRunesEntry) if (GameObject* dwarfRune = me->FindNearestGameObject(RuneEntry, 200.0f)) dwarfRune->SetGoState(state); } void EnterCombat(Unit* /*who*/) override - { + { _events.ScheduleEvent(EVENT_SPELL_FIREBLAST, 2 * IN_MILLISECONDS); // Spawn 7 Embers initially @@ -114,10 +114,10 @@ public: _events.Reset(); summons.DespawnAll(); } - + int getValidRandomPosition() { - /* Generate a random position which + /* Generate a random position which * have not been used in 4 summonings. * Since we are calling the event whenever the Spirit * dies and not all at the time, we need to save at @@ -182,7 +182,7 @@ public: //Return since we have no target if (!UpdateVictim()) return; - + _events.Update(diff); switch(_events.ExecuteEvent()) diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_anubshiah.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_anubshiah.cpp index e653c0e25..b059ae4ab 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_anubshiah.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_anubshiah.cpp @@ -58,7 +58,8 @@ public: { DoCastVictim(SPELL_SHADOWBOLT); ShadowBolt_Timer = 7000; - } else ShadowBolt_Timer -= diff; + } + else ShadowBolt_Timer -= diff; //CurseOfTongues_Timer if (CurseOfTongues_Timer <= diff) @@ -66,21 +67,24 @@ public: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_CURSEOFTONGUES); CurseOfTongues_Timer = 18000; - } else CurseOfTongues_Timer -= diff; + } + else CurseOfTongues_Timer -= diff; //CurseOfWeakness_Timer if (CurseOfWeakness_Timer <= diff) { DoCastVictim(SPELL_CURSEOFWEAKNESS); CurseOfWeakness_Timer = 45000; - } else CurseOfWeakness_Timer -= diff; + } + else CurseOfWeakness_Timer -= diff; //DemonArmor_Timer if (DemonArmor_Timer <= diff) { DoCast(me, SPELL_DEMONARMOR); DemonArmor_Timer = 300000; - } else DemonArmor_Timer -= diff; + } + else DemonArmor_Timer -= diff; //EnvelopingWeb_Timer if (EnvelopingWeb_Timer <= diff) @@ -88,7 +92,8 @@ public: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_ENVELOPINGWEB); EnvelopingWeb_Timer = 12000; - } else EnvelopingWeb_Timer -= diff; + } + else EnvelopingWeb_Timer -= diff; DoMeleeAttackIfReady(); } 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 6f0cdd346..bc2dfc36a 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 @@ -89,16 +89,18 @@ public: //else //{ HandOfThaurissan_Timer = 5000; - //Counter = 0; + //Counter = 0; //} - } else HandOfThaurissan_Timer -= diff; + } + else HandOfThaurissan_Timer -= diff; //AvatarOfFlame_Timer if (AvatarOfFlame_Timer <= diff) { DoCastVictim(SPELL_AVATAROFFLAME); AvatarOfFlame_Timer = 18000; - } else AvatarOfFlame_Timer -= diff; + } + else AvatarOfFlame_Timer -= diff; DoMeleeAttackIfReady(); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_general_angerforge.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_general_angerforge.cpp index 5784224ba..4d2314110 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_general_angerforge.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_general_angerforge.cpp @@ -68,21 +68,24 @@ public: { DoCastVictim(SPELL_MIGHTYBLOW); MightyBlow_Timer = 18000; - } else MightyBlow_Timer -= diff; + } + else MightyBlow_Timer -= diff; //HamString_Timer if (HamString_Timer <= diff) { DoCastVictim(SPELL_HAMSTRING); HamString_Timer = 15000; - } else HamString_Timer -= diff; + } + else HamString_Timer -= diff; //Cleave_Timer if (Cleave_Timer <= diff) { DoCastVictim(SPELL_CLEAVE); Cleave_Timer = 9000; - } else Cleave_Timer -= diff; + } + else Cleave_Timer -= diff; //Adds_Timer if (HealthBelowPct(21)) @@ -95,7 +98,8 @@ public: SummonAdds(me->GetVictim()); Adds_Timer = 25000; - } else Adds_Timer -= diff; + } + else Adds_Timer -= diff; } //Summon Medics diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_gorosh_the_dervish.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_gorosh_the_dervish.cpp index 161e90363..8f9e5ea29 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_gorosh_the_dervish.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_gorosh_the_dervish.cpp @@ -51,14 +51,16 @@ public: { DoCast(me, SPELL_WHIRLWIND); WhirlWind_Timer = 15000; - } else WhirlWind_Timer -= diff; + } + else WhirlWind_Timer -= diff; //MortalStrike_Timer if (MortalStrike_Timer <= diff) { DoCastVictim(SPELL_MORTALSTRIKE); MortalStrike_Timer = 15000; - } else MortalStrike_Timer -= diff; + } + else MortalStrike_Timer -= diff; DoMeleeAttackIfReady(); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_grizzle.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_grizzle.cpp index 4a58d0fa7..0adc7ae87 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_grizzle.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_grizzle.cpp @@ -34,7 +34,7 @@ public: void Reset() { GroundTremor_Timer = 12000; - Frenzy_Timer =0; + Frenzy_Timer = 0; } void EnterCombat(Unit* /*who*/) { } @@ -50,7 +50,8 @@ public: { DoCastVictim(SPELL_GROUNDTREMOR); GroundTremor_Timer = 8000; - } else GroundTremor_Timer -= diff; + } + else GroundTremor_Timer -= diff; //Frenzy_Timer if (HealthBelowPct(51)) @@ -61,7 +62,8 @@ public: Talk(EMOTE_FRENZY_KILL); Frenzy_Timer = 15000; - } else Frenzy_Timer -= diff; + } + else Frenzy_Timer -= diff; } DoMeleeAttackIfReady(); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_high_interrogator_gerstahn.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_high_interrogator_gerstahn.cpp index 88590fb11..45144eeba 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_high_interrogator_gerstahn.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_high_interrogator_gerstahn.cpp @@ -56,7 +56,8 @@ public: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_SHADOWWORDPAIN); ShadowWordPain_Timer = 7000; - } else ShadowWordPain_Timer -= diff; + } + else ShadowWordPain_Timer -= diff; //ManaBurn_Timer if (ManaBurn_Timer <= diff) @@ -64,21 +65,24 @@ public: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_MANABURN); ManaBurn_Timer = 10000; - } else ManaBurn_Timer -= diff; + } + else ManaBurn_Timer -= diff; //PsychicScream_Timer if (PsychicScream_Timer <= diff) { DoCastVictim(SPELL_PSYCHICSCREAM); PsychicScream_Timer = 30000; - } else PsychicScream_Timer -= diff; + } + else PsychicScream_Timer -= diff; //ShadowShield_Timer if (ShadowShield_Timer <= diff) { DoCast(me, SPELL_SHADOWSHIELD); ShadowShield_Timer = 25000; - } else ShadowShield_Timer -= diff; + } + else ShadowShield_Timer -= diff; DoMeleeAttackIfReady(); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_magmus.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_magmus.cpp index a045d6aa4..c372cb979 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_magmus.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_magmus.cpp @@ -38,7 +38,7 @@ public: void Reset() { FieryBurst_Timer = 5000; - WarStomp_Timer =0; + WarStomp_Timer = 0; } void EnterCombat(Unit* /*who*/) { } @@ -54,7 +54,8 @@ public: { DoCastVictim(SPELL_FIERYBURST); FieryBurst_Timer = 6000; - } else FieryBurst_Timer -= diff; + } + else FieryBurst_Timer -= diff; //WarStomp_Timer if (HealthBelowPct(51)) @@ -63,7 +64,8 @@ public: { DoCastVictim(SPELL_WARSTOMP); WarStomp_Timer = 8000; - } else WarStomp_Timer -= diff; + } + else WarStomp_Timer -= diff; } DoMeleeAttackIfReady(); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_moira_bronzebeard.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_moira_bronzebeard.cpp index 1c898322b..9501c8e97 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_moira_bronzebeard.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_moira_bronzebeard.cpp @@ -57,21 +57,24 @@ public: { DoCastVictim(SPELL_MINDBLAST); MindBlast_Timer = 14000; - } else MindBlast_Timer -= diff; + } + else MindBlast_Timer -= diff; //ShadowWordPain_Timer if (ShadowWordPain_Timer <= diff) { DoCastVictim(SPELL_SHADOWWORDPAIN); ShadowWordPain_Timer = 18000; - } else ShadowWordPain_Timer -= diff; + } + else ShadowWordPain_Timer -= diff; //Smite_Timer if (Smite_Timer <= diff) { DoCastVictim(SPELL_SMITE); Smite_Timer = 10000; - } else Smite_Timer -= diff; + } + else Smite_Timer -= diff; } }; }; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp index 441f6fea0..4c01bed67 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp @@ -53,7 +53,7 @@ public: if (InstanceScript* instance = creature->GetInstanceScript()) { //are 5 minutes expected? go template may have data to despawn when used at quest - instance->DoRespawnGameObject(instance->GetData64(DATA_GO_CHALICE), MINUTE*5); + instance->DoRespawnGameObject(instance->GetData64(DATA_GO_CHALICE), MINUTE * 5); } break; } @@ -189,7 +189,7 @@ public: return; _events.Update(diff); - + switch(_events.ExecuteEvent()) { case EVENT_SPELL_SHADOWBOLTVOLLEY: @@ -199,8 +199,8 @@ public: case EVENT_SPELL_IMMOLATE: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) { - DoCast(target, SPELL_IMMOLATE); - _events.ScheduleEvent(EVENT_SPELL_IMMOLATE, 25000); + DoCast(target, SPELL_IMMOLATE); + _events.ScheduleEvent(EVENT_SPELL_IMMOLATE, 25000); } // Didn't get a target, try again in 1s _events.ScheduleEvent(EVENT_SPELL_IMMOLATE, 1000); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp index dd6779c0d..00924ebff 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp @@ -152,21 +152,41 @@ public: { switch (creature->GetEntry()) { - case NPC_EMPEROR: EmperorGUID = creature->GetGUID(); break; - case NPC_PHALANX: PhalanxGUID = creature->GetGUID(); break; - case NPC_MOIRA: MoiraGUID = creature->GetGUID(); break; - case NPC_ANGERREL: TombBossGUIDs[0] = creature->GetGUID(); break; - case NPC_SEETHREL: TombBossGUIDs[1] = creature->GetGUID(); break; - case NPC_DOPEREL: TombBossGUIDs[2] = creature->GetGUID(); break; - case NPC_GLOOMREL: TombBossGUIDs[3] = creature->GetGUID(); break; - case NPC_VILEREL: TombBossGUIDs[4] = creature->GetGUID(); break; - case NPC_HATEREL: TombBossGUIDs[5] = creature->GetGUID(); break; - case NPC_DOOMREL: TombBossGUIDs[6] = creature->GetGUID(); break; - case NPC_MAGMUS: - MagmusGUID = creature->GetGUID(); - if (!creature->IsAlive()) - HandleGameObject(GetData64(DATA_THRONE_DOOR), true); // if Magmus is dead open door to last boss - break; + case NPC_EMPEROR: + EmperorGUID = creature->GetGUID(); + break; + case NPC_PHALANX: + PhalanxGUID = creature->GetGUID(); + break; + case NPC_MOIRA: + MoiraGUID = creature->GetGUID(); + break; + case NPC_ANGERREL: + TombBossGUIDs[0] = creature->GetGUID(); + break; + case NPC_SEETHREL: + TombBossGUIDs[1] = creature->GetGUID(); + break; + case NPC_DOPEREL: + TombBossGUIDs[2] = creature->GetGUID(); + break; + case NPC_GLOOMREL: + TombBossGUIDs[3] = creature->GetGUID(); + break; + case NPC_VILEREL: + TombBossGUIDs[4] = creature->GetGUID(); + break; + case NPC_HATEREL: + TombBossGUIDs[5] = creature->GetGUID(); + break; + case NPC_DOOMREL: + TombBossGUIDs[6] = creature->GetGUID(); + break; + case NPC_MAGMUS: + MagmusGUID = creature->GetGUID(); + if (!creature->IsAlive()) + HandleGameObject(GetData64(DATA_THRONE_DOOR), true); // if Magmus is dead open door to last boss + break; } } @@ -174,33 +194,73 @@ public: { switch (go->GetEntry()) { - case GO_ARENA1: GoArena1GUID = go->GetGUID(); break; - case GO_ARENA2: GoArena2GUID = go->GetGUID(); break; - case GO_ARENA3: GoArena3GUID = go->GetGUID(); break; - case GO_ARENA4: GoArena4GUID = go->GetGUID(); break; - case GO_SHADOW_LOCK: GoShadowLockGUID = go->GetGUID(); break; - case GO_SHADOW_MECHANISM: GoShadowMechGUID = go->GetGUID(); break; - case GO_SHADOW_GIANT_DOOR: GoShadowGiantGUID = go->GetGUID(); break; - case GO_SHADOW_DUMMY: GoShadowDummyGUID = go->GetGUID(); break; - case GO_BAR_KEG_SHOT: GoBarKegGUID = go->GetGUID(); break; - case GO_BAR_KEG_TRAP: GoBarKegTrapGUID = go->GetGUID(); break; - case GO_BAR_DOOR: GoBarDoorGUID = go->GetGUID(); break; - case GO_TOMB_ENTER: GoTombEnterGUID = go->GetGUID(); break; - case GO_TOMB_EXIT: - GoTombExitGUID = go->GetGUID(); - if (GhostKillCount >= 7) - HandleGameObject(0, true, go); - else - HandleGameObject(0, false, go); - break; - case GO_LYCEUM: GoLyceumGUID = go->GetGUID(); break; - case GO_SF_S: GoSFSGUID = go->GetGUID(); break; - case GO_SF_N: GoSFNGUID = go->GetGUID(); break; - case GO_GOLEM_ROOM_N: GoGolemNGUID = go->GetGUID(); break; - case GO_GOLEM_ROOM_S: GoGolemSGUID = go->GetGUID(); break; - case GO_THRONE_ROOM: GoThroneGUID = go->GetGUID(); break; - case GO_CHEST_SEVEN: GoChestGUID = go->GetGUID(); break; - case GO_SPECTRAL_CHALICE: GoSpectralChaliceGUID = go->GetGUID(); break; + case GO_ARENA1: + GoArena1GUID = go->GetGUID(); + break; + case GO_ARENA2: + GoArena2GUID = go->GetGUID(); + break; + case GO_ARENA3: + GoArena3GUID = go->GetGUID(); + break; + case GO_ARENA4: + GoArena4GUID = go->GetGUID(); + break; + case GO_SHADOW_LOCK: + GoShadowLockGUID = go->GetGUID(); + break; + case GO_SHADOW_MECHANISM: + GoShadowMechGUID = go->GetGUID(); + break; + case GO_SHADOW_GIANT_DOOR: + GoShadowGiantGUID = go->GetGUID(); + break; + case GO_SHADOW_DUMMY: + GoShadowDummyGUID = go->GetGUID(); + break; + case GO_BAR_KEG_SHOT: + GoBarKegGUID = go->GetGUID(); + break; + case GO_BAR_KEG_TRAP: + GoBarKegTrapGUID = go->GetGUID(); + break; + case GO_BAR_DOOR: + GoBarDoorGUID = go->GetGUID(); + break; + case GO_TOMB_ENTER: + GoTombEnterGUID = go->GetGUID(); + break; + case GO_TOMB_EXIT: + GoTombExitGUID = go->GetGUID(); + if (GhostKillCount >= 7) + HandleGameObject(0, true, go); + else + HandleGameObject(0, false, go); + break; + case GO_LYCEUM: + GoLyceumGUID = go->GetGUID(); + break; + case GO_SF_S: + GoSFSGUID = go->GetGUID(); + break; + case GO_SF_N: + GoSFNGUID = go->GetGUID(); + break; + case GO_GOLEM_ROOM_N: + GoGolemNGUID = go->GetGUID(); + break; + case GO_GOLEM_ROOM_S: + GoGolemSGUID = go->GetGUID(); + break; + case GO_THRONE_ROOM: + GoThroneGUID = go->GetGUID(); + break; + case GO_CHEST_SEVEN: + GoChestGUID = go->GetGUID(); + break; + case GO_SPECTRAL_CHALICE: + GoSpectralChaliceGUID = go->GetGUID(); + break; } } @@ -271,7 +331,7 @@ public: std::ostringstream saveStream; saveStream << encounter[0] << ' ' << encounter[1] << ' ' << encounter[2] << ' ' - << encounter[3] << ' ' << encounter[4] << ' ' << encounter[5] << ' ' << GhostKillCount; + << encounter[3] << ' ' << encounter[4] << ' ' << encounter[5] << ' ' << GhostKillCount; str_data = saveStream.str(); @@ -284,23 +344,23 @@ public: { switch (type) { - case TYPE_RING_OF_LAW: - return encounter[0]; - case TYPE_VAULT: - return encounter[1]; - case TYPE_BAR: - if (encounter[2] == IN_PROGRESS && BarAleCount == 3) - return SPECIAL; - else - return encounter[2]; - case TYPE_TOMB_OF_SEVEN: - return encounter[3]; - case TYPE_LYCEUM: - return encounter[4]; - case TYPE_IRON_HALL: - return encounter[5]; - case DATA_GHOSTKILL: - return GhostKillCount; + case TYPE_RING_OF_LAW: + return encounter[0]; + case TYPE_VAULT: + return encounter[1]; + case TYPE_BAR: + if (encounter[2] == IN_PROGRESS && BarAleCount == 3) + return SPECIAL; + else + return encounter[2]; + case TYPE_TOMB_OF_SEVEN: + return encounter[3]; + case TYPE_LYCEUM: + return encounter[4]; + case TYPE_IRON_HALL: + return encounter[5]; + case DATA_GHOSTKILL: + return GhostKillCount; } return 0; } @@ -309,40 +369,40 @@ public: { switch (data) { - case DATA_EMPEROR: - return EmperorGUID; - case DATA_PHALANX: - return PhalanxGUID; - case DATA_MOIRA: - return MoiraGUID; - case DATA_ARENA1: - return GoArena1GUID; - case DATA_ARENA2: - return GoArena2GUID; - case DATA_ARENA3: - return GoArena3GUID; - case DATA_ARENA4: - return GoArena4GUID; - case DATA_GO_BAR_KEG: - return GoBarKegGUID; - case DATA_GO_BAR_KEG_TRAP: - return GoBarKegTrapGUID; - case DATA_GO_BAR_DOOR: - return GoBarDoorGUID; - case DATA_EVENSTARTER: - return TombEventStarterGUID; - case DATA_SF_BRAZIER_N: - return GoSFNGUID; - case DATA_SF_BRAZIER_S: - return GoSFSGUID; - case DATA_THRONE_DOOR: - return GoThroneGUID; - case DATA_GOLEM_DOOR_N: - return GoGolemNGUID; - case DATA_GOLEM_DOOR_S: - return GoGolemSGUID; - case DATA_GO_CHALICE: - return GoSpectralChaliceGUID; + case DATA_EMPEROR: + return EmperorGUID; + case DATA_PHALANX: + return PhalanxGUID; + case DATA_MOIRA: + return MoiraGUID; + case DATA_ARENA1: + return GoArena1GUID; + case DATA_ARENA2: + return GoArena2GUID; + case DATA_ARENA3: + return GoArena3GUID; + case DATA_ARENA4: + return GoArena4GUID; + case DATA_GO_BAR_KEG: + return GoBarKegGUID; + case DATA_GO_BAR_KEG_TRAP: + return GoBarKegTrapGUID; + case DATA_GO_BAR_DOOR: + return GoBarDoorGUID; + case DATA_EVENSTARTER: + return TombEventStarterGUID; + case DATA_SF_BRAZIER_N: + return GoSFNGUID; + case DATA_SF_BRAZIER_S: + return GoSFSGUID; + case DATA_THRONE_DOOR: + return GoThroneGUID; + case DATA_GOLEM_DOOR_N: + return GoGolemNGUID; + case DATA_GOLEM_DOOR_S: + return GoGolemSGUID; + case DATA_GO_CHALICE: + return GoSpectralChaliceGUID; } return 0; } @@ -364,7 +424,7 @@ public: std::istringstream loadStream(in); loadStream >> encounter[0] >> encounter[1] >> encounter[2] >> encounter[3] - >> encounter[4] >> encounter[5] >> GhostKillCount; + >> encounter[4] >> encounter[5] >> GhostKillCount; for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) if (encounter[i] == IN_PROGRESS) @@ -400,7 +460,8 @@ public: if (Creature* boss = instance->GetCreature(TombBossGUIDs[i])) { if (!boss->IsAlive()) - {//do not call EnterEvadeMode(), it will create infinit loops + { + //do not call EnterEvadeMode(), it will create infinit loops boss->Respawn(); boss->RemoveAllAuras(); boss->DeleteThreatList(); @@ -450,11 +511,12 @@ public: { if (!boss->IsAlive()) { - GhostKillCount = i+1; - } + GhostKillCount = i + 1; + } } } - } else TombTimer -= diff; + } + else TombTimer -= diff; } if (GhostKillCount >= 7 && TombEventStarterGUID) TombOfSevenEnd(); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gizrul_the_slavener.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gizrul_the_slavener.cpp index d7a20661e..a050b8a66 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gizrul_the_slavener.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gizrul_the_slavener.cpp @@ -35,7 +35,7 @@ public: struct boss_gizrul_the_slavenerAI : public BossAI { - boss_gizrul_the_slavenerAI(Creature* creature) : BossAI(creature, DATA_GIZRUL_THE_SLAVENER) { } + boss_gizrul_the_slavenerAI(Creature* creature) : BossAI(creature, DATA_GIZRUL_THE_SLAVENER) { } void Reset() { @@ -50,8 +50,8 @@ public: void EnterCombat(Unit* /*who*/) { _EnterCombat(); - events.ScheduleEvent(EVENT_FATAL_BITE, urand(17000,20000)); - events.ScheduleEvent(EVENT_INFECTED_BITE, urand(10000,12000)); + events.ScheduleEvent(EVENT_FATAL_BITE, urand(17000, 20000)); + events.ScheduleEvent(EVENT_INFECTED_BITE, urand(10000, 12000)); } void JustDied(Unit* /*killer*/) @@ -75,11 +75,11 @@ public: { case EVENT_FATAL_BITE: DoCastVictim(SPELL_FATAL_BITE); - events.ScheduleEvent(EVENT_FATAL_BITE, urand(8000,10000)); + events.ScheduleEvent(EVENT_FATAL_BITE, urand(8000, 10000)); break; case EVENT_INFECTED_BITE: DoCast(me, SPELL_INFECTED_BITE); - events.ScheduleEvent(EVENT_FATAL_BITE, urand(8000,10000)); + events.ScheduleEvent(EVENT_FATAL_BITE, urand(8000, 10000)); break; default: break; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_halycon.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_halycon.cpp index ea04709cf..b46d7ba55 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_halycon.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_halycon.cpp @@ -45,8 +45,8 @@ public: void EnterCombat(Unit* /*who*/) { _EnterCombat(); - events.ScheduleEvent(EVENT_REND, urand(17000,20000)); - events.ScheduleEvent(EVENT_THRASH, urand(10000,12000)); + events.ScheduleEvent(EVENT_REND, urand(17000, 20000)); + events.ScheduleEvent(EVENT_THRASH, urand(10000, 12000)); } void JustDied(Unit* /*killer*/) @@ -73,7 +73,7 @@ public: { case EVENT_REND: DoCastVictim(SPELL_REND); - events.ScheduleEvent(EVENT_REND, urand(8000,10000)); + events.ScheduleEvent(EVENT_REND, urand(8000, 10000)); break; case EVENT_THRASH: DoCast(me, SPELL_THRASH); @@ -84,8 +84,8 @@ public: } DoMeleeAttackIfReady(); } - private: - bool Summoned; + private: + bool Summoned; }; CreatureAI* GetAI(Creature* creature) const diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_lord_valthalak.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_lord_valthalak.cpp index 0b53647fa..b91be2f5a 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_lord_valthalak.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_lord_valthalak.cpp @@ -47,8 +47,8 @@ public: void EnterCombat(Unit* /*who*/) { _EnterCombat(); - events.ScheduleEvent(EVENT_SUMMON_SPECTRAL_ASSASSIN, urand(6000,8000)); - events.ScheduleEvent(EVENT_SHADOW_WRATH, urand(9000,18000)); + events.ScheduleEvent(EVENT_SUMMON_SPECTRAL_ASSASSIN, urand(6000, 8000)); + events.ScheduleEvent(EVENT_SHADOW_WRATH, urand(9000, 18000)); } void JustDied(Unit* /*killer*/) @@ -72,15 +72,15 @@ public: { case EVENT_SUMMON_SPECTRAL_ASSASSIN: DoCast(me, SPELL_SUMMON_SPECTRAL_ASSASSIN); - events.ScheduleEvent(EVENT_SUMMON_SPECTRAL_ASSASSIN, urand(30000,35000)); + events.ScheduleEvent(EVENT_SUMMON_SPECTRAL_ASSASSIN, urand(30000, 35000)); break; case EVENT_SHADOW_BOLT_VOLLEY: DoCastVictim(SPELL_SHADOW_BOLT_VOLLEY); - events.ScheduleEvent(EVENT_SHADOW_BOLT_VOLLEY, urand(4000,6000)); + events.ScheduleEvent(EVENT_SHADOW_BOLT_VOLLEY, urand(4000, 6000)); break; case EVENT_SHADOW_WRATH: DoCastVictim(SPELL_SHADOW_WRATH); - events.ScheduleEvent(EVENT_SHADOW_WRATH, urand(19000,24000)); + events.ScheduleEvent(EVENT_SHADOW_WRATH, urand(19000, 24000)); break; default: break; @@ -102,16 +102,16 @@ public: if (HealthBelowPct(15)) { DoCast(me, SPELL_FRENZY); - events.ScheduleEvent(EVENT_SHADOW_BOLT_VOLLEY, urand(7000,14000)); + events.ScheduleEvent(EVENT_SHADOW_BOLT_VOLLEY, urand(7000, 14000)); frenzy15 = true; } } DoMeleeAttackIfReady(); } - private: - bool frenzy40; - bool frenzy15; + private: + bool frenzy40; + bool frenzy15; }; CreatureAI* GetAI(Creature* creature) const diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_pyroguard_emberseer.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_pyroguard_emberseer.cpp index c8aac2ac5..f3f2424e8 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_pyroguard_emberseer.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_pyroguard_emberseer.cpp @@ -92,13 +92,13 @@ public: events.ScheduleEvent(EVENT_PLAYER_CHECK, 5000); break; case 2: - // Close these two doors on Blackhand Incarcerators aggro - if (GameObject* door1 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_IN))) - if (door1->GetGoState() == GO_STATE_ACTIVE) - door1->SetGoState(GO_STATE_READY); - if (GameObject* door2 = me->GetMap()->GetGameObject(instance->GetData64(GO_DOORS))) - if (door2->GetGoState() == GO_STATE_ACTIVE) - door2->SetGoState(GO_STATE_READY); + // Close these two doors on Blackhand Incarcerators aggro + if (GameObject* door1 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_IN))) + if (door1->GetGoState() == GO_STATE_ACTIVE) + door1->SetGoState(GO_STATE_READY); + if (GameObject* door2 = me->GetMap()->GetGameObject(instance->GetData64(GO_DOORS))) + if (door2->GetGoState() == GO_STATE_ACTIVE) + door2->SetGoState(GO_STATE_READY); break; case 3: Reset(); @@ -152,19 +152,19 @@ public: } } - void OpenDoors(bool Boss_Killed) - { - // These two doors reopen on reset or boss kill - if (GameObject* door1 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_IN))) - door1->SetGoState(GO_STATE_ACTIVE); - if (GameObject* door2 = me->GetMap()->GetGameObject(instance->GetData64(GO_DOORS))) - door2->SetGoState(GO_STATE_ACTIVE); + void OpenDoors(bool Boss_Killed) + { + // These two doors reopen on reset or boss kill + if (GameObject* door1 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_IN))) + door1->SetGoState(GO_STATE_ACTIVE); + if (GameObject* door2 = me->GetMap()->GetGameObject(instance->GetData64(GO_DOORS))) + door2->SetGoState(GO_STATE_ACTIVE); - // This door opens on boss kill - if (Boss_Killed) - if (GameObject* door3 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_OUT))) + // This door opens on boss kill + if (Boss_Killed) + if (GameObject* door3 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_OUT))) door3->SetGoState(GO_STATE_ACTIVE); - } + } void UpdateRunes(GOState state) { @@ -196,35 +196,35 @@ public: switch (eventId) { case EVENT_RESPAWN: - { - // Respawn all Blackhand Incarcerators - std::list creatureList; - GetCreatureListWithEntryInGrid(creatureList, me, NPC_BLACKHAND_INCARCERATOR, 35.0f); - for (std::list::iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr) - if (Creature* creature = *itr) - { - if (!creature->IsAlive()) - creature->Respawn(); - - creature->AI()->SetData(1, 2); - } - me->AddAura(SPELL_ENCAGED_EMBERSEER, me); - instance->SetBossState(DATA_PYROGAURD_EMBERSEER, NOT_STARTED); - break; - } - case EVENT_PRE_FIGHT_1: - { - // Set data on all Blackhand Incarcerators - std::list creatureList; - GetCreatureListWithEntryInGrid(creatureList, me, NPC_BLACKHAND_INCARCERATOR, 35.0f); - for (std::list::iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr) { - if (Creature* creature = *itr) - creature->AI()->SetData(1, 1); + // Respawn all Blackhand Incarcerators + std::list creatureList; + GetCreatureListWithEntryInGrid(creatureList, me, NPC_BLACKHAND_INCARCERATOR, 35.0f); + for (std::list::iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr) + if (Creature* creature = *itr) + { + if (!creature->IsAlive()) + creature->Respawn(); + + creature->AI()->SetData(1, 2); + } + me->AddAura(SPELL_ENCAGED_EMBERSEER, me); + instance->SetBossState(DATA_PYROGAURD_EMBERSEER, NOT_STARTED); + break; + } + case EVENT_PRE_FIGHT_1: + { + // Set data on all Blackhand Incarcerators + std::list creatureList; + GetCreatureListWithEntryInGrid(creatureList, me, NPC_BLACKHAND_INCARCERATOR, 35.0f); + for (std::list::iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr) + { + if (Creature* creature = *itr) + creature->AI()->SetData(1, 1); + } + events.ScheduleEvent(EVENT_PRE_FIGHT_2, 32000); + break; } - events.ScheduleEvent(EVENT_PRE_FIGHT_2, 32000); - break; - } case EVENT_PRE_FIGHT_2: me->CastSpell(me, SPELL_FREEZE_ANIM); me->CastSpell(me, SPELL_EMBERSEER_GROWING); @@ -236,22 +236,22 @@ public: events.ScheduleEvent(EVENT_FIRE_SHIELD, 3000); break; case EVENT_PLAYER_CHECK: - { - // Check to see if all players in instance have aura SPELL_EMBERSEER_START before starting event - bool _hasAura = false; - Map::PlayerList const &players = me->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) - if (Player* player = itr->GetSource()->ToPlayer()) - if (player->HasAura(SPELL_EMBERSEER_OBJECT_VISUAL)) - _hasAura = true; - - if (_hasAura) { - events.ScheduleEvent(EVENT_PRE_FIGHT_1, 1000); - instance->SetBossState(DATA_PYROGAURD_EMBERSEER, IN_PROGRESS); + // Check to see if all players in instance have aura SPELL_EMBERSEER_START before starting event + bool _hasAura = false; + Map::PlayerList const& players = me->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + if (Player* player = itr->GetSource()->ToPlayer()) + if (player->HasAura(SPELL_EMBERSEER_OBJECT_VISUAL)) + _hasAura = true; + + if (_hasAura) + { + events.ScheduleEvent(EVENT_PRE_FIGHT_1, 1000); + instance->SetBossState(DATA_PYROGAURD_EMBERSEER, IN_PROGRESS); + } + break; } - break; - } case EVENT_ENTER_COMBAT: AttackStart(me->SelectNearestPlayer(30.0f)); break; @@ -323,7 +323,7 @@ public: void Reset() { - 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); if (Creature* Emberseer = me->FindNearestCreature(NPC_PYROGAURD_EMBERSEER, 30.0f, true)) Emberseer->AI()->SetData(1, 3); } @@ -337,7 +337,7 @@ public: { if (data == 1 && value == 1) { - 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->InterruptSpell(CURRENT_CHANNELED_SPELL); _events.CancelEvent(EVENT_ENCAGED_EMBERSEER); } @@ -378,14 +378,14 @@ public: switch (eventId) { case EVENT_ENCAGED_EMBERSEER: - { - if (me->GetPositionX() == me->GetHomePosition().GetPositionX()) - if (!me->HasAura(SPELL_ENCAGE_EMBERSEER)) - if (Creature* Emberseer = me->FindNearestCreature(NPC_PYROGAURD_EMBERSEER, 30.0f, true)) - DoCast(Emberseer, SPELL_ENCAGE_EMBERSEER); - break; + { + if (me->GetPositionX() == me->GetHomePosition().GetPositionX()) + if (!me->HasAura(SPELL_ENCAGE_EMBERSEER)) + if (Creature* Emberseer = me->FindNearestCreature(NPC_PYROGAURD_EMBERSEER, 30.0f, true)) + DoCast(Emberseer, SPELL_ENCAGE_EMBERSEER); + break; - } + } } } return; @@ -413,8 +413,8 @@ public: DoMeleeAttackIfReady(); } - private: - EventMap _events; + private: + EventMap _events; }; CreatureAI* GetAI(Creature* creature) const 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 3225f0857..11291c54b 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp @@ -61,7 +61,7 @@ struct Wave float y_pos; float z_pos; }; - + static Wave Wave1[] = // 22 sec { { 10447, 202.511f, -421.307f, 110.9877f }, @@ -70,14 +70,14 @@ static Wave Wave1[] = // 22 sec { 10442, 201.008f, -416.648f, 110.974f } }; -static Wave Wave2[]= // 22 sec +static Wave Wave2[] = // 22 sec { { 10447, 209.8637f, -428.2729f, 110.9877f }, { 10442, 209.3122f, -430.8724f, 110.9814f }, { 10442, 211.3309f, -425.9111f, 111.0006f } }; -static Wave Wave3[]= // 60 sec +static Wave Wave3[] = // 60 sec { { 10742, 208.6493f, -424.5787f, 110.9872f }, { 10447, 203.9482f, -428.9446f, 110.982f, }, @@ -85,7 +85,7 @@ static Wave Wave3[]= // 60 sec { 10442, 206.3079f, -424.7509f, 110.9943f } }; -static Wave Wave4[]= // 49 sec +static Wave Wave4[] = // 49 sec { { 10742, 212.3541f, -412.6826f, 111.0352f }, { 10447, 212.5754f, -410.2841f, 111.0296f }, @@ -93,7 +93,7 @@ static Wave Wave4[]= // 49 sec { 10442, 210.6568f, -412.1552f, 111.0124f } }; -static Wave Wave5[]= // 60 sec +static Wave Wave5[] = // 60 sec { { 10742, 210.2188f, -410.6686f, 111.0211f }, { 10447, 209.4078f, -414.13f, 111.0264f }, @@ -102,7 +102,7 @@ static Wave Wave5[]= // 60 sec { 10442, 208.0854f, -412.1505f, 111.0057f } }; -static Wave Wave6[]= // 27 sec +static Wave Wave6[] = // 27 sec { { 10742, 213.9138f, -426.512f, 111.0013f }, { 10447, 213.7121f, -429.8102f, 110.9888f }, @@ -334,12 +334,12 @@ public: victor->HandleEmoteCommand(EMOTE_ONESHOT_QUESTION); break; case EVENT_WAVES_EMOTE_2: - me->HandleEmoteCommand(EMOTE_ONESHOT_ROAR); + me->HandleEmoteCommand(EMOTE_ONESHOT_ROAR); break; case EVENT_WAVES_TEXT_1: events.ScheduleEvent(EVENT_TURN_TO_PLAYER, 0); if (Creature* victor = ObjectAccessor::GetCreature(*me, victorGUID)) - victor->AI()->Talk(SAY_NEFARIUS_2); + victor->AI()->Talk(SAY_NEFARIUS_2); me->HandleEmoteCommand(EMOTE_ONESHOT_TALK); events.ScheduleEvent(EVENT_TURN_TO_FACING_1, 4000); events.ScheduleEvent(EVENT_WAVES_EMOTE_1, 5000); @@ -413,22 +413,22 @@ public: me->SummonCreature(NPC_GYTH, 211.762f, -397.5885f, 111.1817f, 4.747295f); break; case EVENT_WAVE_1: - SummonWave(Wave1,4); + SummonWave(Wave1, 4); break; case EVENT_WAVE_2: - SummonWave(Wave2,3); + SummonWave(Wave2, 3); break; case EVENT_WAVE_3: - SummonWave(Wave3,4); + SummonWave(Wave3, 4); break; case EVENT_WAVE_4: - SummonWave(Wave4,4); + SummonWave(Wave4, 4); break; case EVENT_WAVE_5: - SummonWave(Wave5,5); + SummonWave(Wave5, 5); break; case EVENT_WAVE_6: - SummonWave(Wave6,5); + SummonWave(Wave6, 5); break; default: break; @@ -465,10 +465,10 @@ public: DoMeleeAttackIfReady(); } - private: - bool gythEvent; - uint64 victorGUID; - uint64 waveDoorGUID; + private: + bool gythEvent; + uint64 victorGUID; + uint64 waveDoorGUID; }; CreatureAI* GetAI(Creature* creature) const diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_the_beast.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_the_beast.cpp index f32e32014..5ac1c18ae 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_the_beast.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_the_beast.cpp @@ -59,7 +59,7 @@ public: if (!UpdateVictim()) return; - events.Update(diff); + events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_urok_doomhowl.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_urok_doomhowl.cpp index 3d18c7ef3..acc12d0db 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_urok_doomhowl.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_urok_doomhowl.cpp @@ -52,8 +52,8 @@ public: void EnterCombat(Unit* /*who*/) { _EnterCombat(); - events.ScheduleEvent(SPELL_REND, urand(17000,20000)); - events.ScheduleEvent(SPELL_STRIKE, urand(10000,12000)); + events.ScheduleEvent(SPELL_REND, urand(17000, 20000)); + events.ScheduleEvent(SPELL_STRIKE, urand(10000, 12000)); Talk(SAY_AGGRO); } @@ -78,11 +78,11 @@ public: { case SPELL_REND: DoCastVictim(SPELL_REND); - events.ScheduleEvent(SPELL_REND, urand(8000,10000)); + events.ScheduleEvent(SPELL_REND, urand(8000, 10000)); break; case SPELL_STRIKE: DoCastVictim(SPELL_STRIKE); - events.ScheduleEvent(SPELL_STRIKE, urand(8000,10000)); + events.ScheduleEvent(SPELL_STRIKE, urand(8000, 10000)); break; default: break; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp index fe03c3744..536c09612 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp @@ -71,12 +71,12 @@ public: { switch (creature->GetEntry()) { - case NPC_THE_BEAST: - if (loot == LOOT_SKINNING) - { - creature->CastSpell(creature, SPELL_FINKLE_IS_EINHORN, true); - } - break; + case NPC_THE_BEAST: + if (loot == LOOT_SKINNING) + { + creature->CastSpell(creature, SPELL_FINKLE_IS_EINHORN, true); + } + break; } } @@ -135,8 +135,8 @@ public: if (GetBossState(DATA_GYTH) == DONE) creature->DisappearAndDie(); break; - } - } + } + } void OnGameObjectCreate(GameObject* go) { @@ -274,7 +274,7 @@ public: break; } - return true; + return true; } void ProcessEvent(WorldObject* /*obj*/, uint32 eventId) @@ -409,7 +409,7 @@ public: Events.ScheduleEvent(EVENT_DARGONSPIRE_ROOM_CHECK, 3000); break; default: - break; + break; } } } @@ -497,8 +497,8 @@ public: } if (GetBossState(DATA_HALL_RUNE_1) == DONE && GetBossState(DATA_HALL_RUNE_2) == DONE && GetBossState(DATA_HALL_RUNE_3) == DONE && - GetBossState(DATA_HALL_RUNE_4) == DONE && GetBossState(DATA_HALL_RUNE_5) == DONE && GetBossState(DATA_HALL_RUNE_6) == DONE && - GetBossState(DATA_HALL_RUNE_7) == DONE) + GetBossState(DATA_HALL_RUNE_4) == DONE && GetBossState(DATA_HALL_RUNE_5) == DONE && GetBossState(DATA_HALL_RUNE_6) == DONE && + GetBossState(DATA_HALL_RUNE_7) == DONE) { SetBossState(DATA_DRAGONSPIRE_ROOM, DONE); if (GameObject* door1 = instance->GetGameObject(go_emberseerin)) @@ -554,33 +554,33 @@ public: OUT_LOAD_INST_DATA_COMPLETE; } - protected: - EventMap Events; - uint64 HighlordOmokk; - uint64 ShadowHunterVoshgajin; - uint64 WarMasterVoone; - uint64 MotherSmolderweb; - uint64 UrokDoomhowl; - uint64 QuartermasterZigris; - uint64 GizrultheSlavener; - uint64 Halycon; - uint64 OverlordWyrmthalak; - uint64 PyroguardEmberseer; - uint64 WarchiefRendBlackhand; - uint64 Gyth; - uint64 LordVictorNefarius; - uint64 TheBeast; - uint64 GeneralDrakkisath; - uint64 go_emberseerin; - uint64 go_doors; - uint64 go_emberseerout; - uint64 go_blackrockaltar; - uint64 go_roomrunes[7]; - uint64 go_emberseerrunes[7]; - uint64 runecreaturelist[7][5]; - uint64 go_portcullis_active; - uint64 go_portcullis_tobossrooms; - uint64 go_urok_pile; + protected: + EventMap Events; + uint64 HighlordOmokk; + uint64 ShadowHunterVoshgajin; + uint64 WarMasterVoone; + uint64 MotherSmolderweb; + uint64 UrokDoomhowl; + uint64 QuartermasterZigris; + uint64 GizrultheSlavener; + uint64 Halycon; + uint64 OverlordWyrmthalak; + uint64 PyroguardEmberseer; + uint64 WarchiefRendBlackhand; + uint64 Gyth; + uint64 LordVictorNefarius; + uint64 TheBeast; + uint64 GeneralDrakkisath; + uint64 go_emberseerin; + uint64 go_doors; + uint64 go_emberseerout; + uint64 go_blackrockaltar; + uint64 go_roomrunes[7]; + uint64 go_emberseerrunes[7]; + uint64 runecreaturelist[7][5]; + uint64 go_portcullis_active; + uint64 go_portcullis_tobossrooms; + uint64 go_urok_pile; }; InstanceScript* GetInstanceScript(InstanceMap* map) const diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp index 86e6f1cfe..41c78bce1 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp @@ -85,7 +85,7 @@ public: Breath2_Spell = SPELL_FROSTBURN; break; - // B1 - TL + // B1 - TL case 4: Breath1_Spell = SPELL_TIMELAPSE; Breath2_Spell = SPELL_INCINERATE; @@ -103,7 +103,7 @@ public: Breath2_Spell = SPELL_FROSTBURN; break; - //B1 - Acid + //B1 - Acid case 8: Breath1_Spell = SPELL_CORROSIVEACID; Breath2_Spell = SPELL_INCINERATE; @@ -121,7 +121,7 @@ public: Breath2_Spell = SPELL_FROSTBURN; break; - //B1 - Ignite + //B1 - Ignite case 12: Breath1_Spell = SPELL_IGNITEFLESH; Breath2_Spell = SPELL_INCINERATE; @@ -139,7 +139,7 @@ public: Breath2_Spell = SPELL_FROSTBURN; break; - //B1 - Frost + //B1 - Frost case 16: Breath1_Spell = SPELL_FROSTBURN; Breath2_Spell = SPELL_INCINERATE; @@ -214,30 +214,30 @@ public: break; } case EVENT_BREATH_1: - DoCastVictim(Breath1_Spell); - events.ScheduleEvent(EVENT_BREATH_1, 60000); - break; + DoCastVictim(Breath1_Spell); + events.ScheduleEvent(EVENT_BREATH_1, 60000); + break; case EVENT_BREATH_2: - DoCastVictim(Breath2_Spell); - events.ScheduleEvent(EVENT_BREATH_2, 60000); - break; + DoCastVictim(Breath2_Spell); + events.ScheduleEvent(EVENT_BREATH_2, 60000); + break; case EVENT_AFFLICTION: { - Map::PlayerList const &players = me->GetMap()->GetPlayers(); + Map::PlayerList const& players = me->GetMap()->GetPlayers(); for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) { if (Player* player = itr->GetSource()->ToPlayer()) { DoCast(player, RAND(SPELL_BROODAF_BLUE, SPELL_BROODAF_BLACK, SPELL_BROODAF_RED, SPELL_BROODAF_BRONZE, SPELL_BROODAF_GREEN), true); - if (player->HasAura(SPELL_BROODAF_BLUE) && + if (player->HasAura(SPELL_BROODAF_BLUE) && player->HasAura(SPELL_BROODAF_BLACK) && player->HasAura(SPELL_BROODAF_RED) && player->HasAura(SPELL_BROODAF_BRONZE) && player->HasAura(SPELL_BROODAF_GREEN)) - { - DoCast(player, SPELL_CHROMATIC_MUT_1); - } + { + DoCast(player, SPELL_CHROMATIC_MUT_1); + } } } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp index a981a1aa1..17138a12a 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp @@ -43,7 +43,7 @@ enum Says // BWL SAY_GAMESBEGIN_1 = 12, SAY_GAMESBEGIN_2 = 13, - // SAY_VAEL_INTRO = 14, Not used - when he corrupts Vaelastrasz + // SAY_VAEL_INTRO = 14, Not used - when he corrupts Vaelastrasz // Nefarian SAY_RANDOM = 0, @@ -65,8 +65,8 @@ enum Says enum Gossip { - GOSSIP_ID = 21332, - GOSSIP_OPTION_ID = 0 + GOSSIP_ID = 21332, + GOSSIP_OPTION_ID = 0 }; enum Paths @@ -127,10 +127,10 @@ enum Spells SPELL_ROGUE = 23414, // Paralise SPELL_DEATH_KNIGHT = 49576 // Death Grip -// 19484 -// 22664 -// 22674 -// 22666 + // 19484 + // 22664 + // 22674 + // 22666 }; Position const DrakeSpawnLoc[2] = // drakonid @@ -322,7 +322,7 @@ public: events.ScheduleEvent(EVENT_MIND_CONTROL, urand(30000, 35000)); break; case EVENT_SPAWN_ADD: - for (uint8 i=0; i<2; ++i) + for (uint8 i = 0; i < 2; ++i) { uint32 CreatureID; if (urand(0, 2) == 0) @@ -378,8 +378,8 @@ public: } } - private: - uint32 SpawnedAdds; + private: + uint32 SpawnedAdds; }; CreatureAI* GetAI(Creature* creature) const @@ -428,7 +428,7 @@ public: void KilledUnit(Unit* victim) { - if (rand()%5) + if (rand() % 5) return; Talk(SAY_SLAY, victim); @@ -458,7 +458,8 @@ public: for (std::list::const_iterator itr = constructList.begin(); itr != constructList.end(); ++itr) (*itr)->DespawnOrUnsummon(); - } else DespawnTimer -= diff; + } + else DespawnTimer -= diff; if (!UpdateVictim()) return; @@ -499,50 +500,50 @@ public: case EVENT_CLASSCALL: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) switch (target->getClass()) - { - case CLASS_MAGE: - Talk(SAY_MAGE); - DoCast(me, SPELL_MAGE); - break; - case CLASS_WARRIOR: - Talk(SAY_WARRIOR); - DoCast(me, SPELL_WARRIOR); - break; - case CLASS_DRUID: - Talk(SAY_DRUID); - DoCast(target, SPELL_DRUID); - break; - case CLASS_PRIEST: - Talk(SAY_PRIEST); - DoCast(me, SPELL_PRIEST); - break; - case CLASS_PALADIN: - Talk(SAY_PALADIN); - DoCast(me, SPELL_PALADIN); - break; - case CLASS_SHAMAN: - Talk(SAY_SHAMAN); - DoCast(me, SPELL_SHAMAN); - break; - case CLASS_WARLOCK: - Talk(SAY_WARLOCK); - DoCast(me, SPELL_WARLOCK); - break; - case CLASS_HUNTER: - Talk(SAY_HUNTER); - DoCast(me, SPELL_HUNTER); - break; - case CLASS_ROGUE: - Talk(SAY_ROGUE); - DoCast(me, SPELL_ROGUE); - break; - case CLASS_DEATH_KNIGHT: - Talk(SAY_DEATH_KNIGHT); - DoCast(me, SPELL_DEATH_KNIGHT); - break; - default: - break; - } + { + case CLASS_MAGE: + Talk(SAY_MAGE); + DoCast(me, SPELL_MAGE); + break; + case CLASS_WARRIOR: + Talk(SAY_WARRIOR); + DoCast(me, SPELL_WARRIOR); + break; + case CLASS_DRUID: + Talk(SAY_DRUID); + DoCast(target, SPELL_DRUID); + break; + case CLASS_PRIEST: + Talk(SAY_PRIEST); + DoCast(me, SPELL_PRIEST); + break; + case CLASS_PALADIN: + Talk(SAY_PALADIN); + DoCast(me, SPELL_PALADIN); + break; + case CLASS_SHAMAN: + Talk(SAY_SHAMAN); + DoCast(me, SPELL_SHAMAN); + break; + case CLASS_WARLOCK: + Talk(SAY_WARLOCK); + DoCast(me, SPELL_WARLOCK); + break; + case CLASS_HUNTER: + Talk(SAY_HUNTER); + DoCast(me, SPELL_HUNTER); + break; + case CLASS_ROGUE: + Talk(SAY_ROGUE); + DoCast(me, SPELL_ROGUE); + break; + case CLASS_DEATH_KNIGHT: + Talk(SAY_DEATH_KNIGHT); + DoCast(me, SPELL_DEATH_KNIGHT); + break; + default: + break; + } events.ScheduleEvent(EVENT_CLASSCALL, urand(30000, 35000)); break; } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp index 06e3a53f7..c812f794a 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp @@ -166,29 +166,29 @@ public: class spell_egg_event : public SpellScriptLoader { - public: - spell_egg_event() : SpellScriptLoader("spell_egg_event") { } +public: + spell_egg_event() : SpellScriptLoader("spell_egg_event") { } - class spell_egg_eventSpellScript : public SpellScript + class spell_egg_eventSpellScript : public SpellScript + { + PrepareSpellScript(spell_egg_eventSpellScript); + + void HandleOnHit() { - PrepareSpellScript(spell_egg_eventSpellScript); - - void HandleOnHit() - { - if (InstanceScript* instance = GetCaster()->GetInstanceScript()) - instance->SetData(DATA_EGG_EVENT, SPECIAL); - } - - void Register() - { - OnHit += SpellHitFn(spell_egg_eventSpellScript::HandleOnHit); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_egg_eventSpellScript(); + if (InstanceScript* instance = GetCaster()->GetInstanceScript()) + instance->SetData(DATA_EGG_EVENT, SPECIAL); } + + void Register() + { + OnHit += SpellHitFn(spell_egg_eventSpellScript::HandleOnHit); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_egg_eventSpellScript(); + } }; void AddSC_boss_razorgore() diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp index 95ced2f65..858d17930 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp @@ -12,26 +12,26 @@ enum Says { - SAY_LINE1 = 0, - SAY_LINE2 = 1, - SAY_LINE3 = 2, - SAY_HALFLIFE = 3, - SAY_KILLTARGET = 4 + SAY_LINE1 = 0, + SAY_LINE2 = 1, + SAY_LINE3 = 2, + SAY_HALFLIFE = 3, + SAY_KILLTARGET = 4 }; enum Gossip { - GOSSIP_ID = 21334, + GOSSIP_ID = 21334, }; enum Spells { - SPELL_ESSENCEOFTHERED = 23513, - SPELL_FLAMEBREATH = 23461, - SPELL_FIRENOVA = 23462, - SPELL_TAILSWIPE = 15847, - SPELL_BURNINGADRENALINE = 23620, - SPELL_CLEAVE = 20684 //Chain cleave is most likely named something different and contains a dummy effect + SPELL_ESSENCEOFTHERED = 23513, + SPELL_FLAMEBREATH = 23461, + SPELL_FIRENOVA = 23462, + SPELL_TAILSWIPE = 15847, + SPELL_BURNINGADRENALINE = 23620, + SPELL_CLEAVE = 20684 //Chain cleave is most likely named something different and contains a dummy effect }; enum Events @@ -99,7 +99,7 @@ public: void KilledUnit(Unit* victim) { - if (rand()%5) + if (rand() % 5) return; Talk(SAY_KILLTARGET, victim); @@ -213,9 +213,9 @@ public: } } - private: - uint64 PlayerGUID; - bool HasYelled; + private: + uint64 PlayerGUID; + bool HasYelled; }; CreatureAI* GetAI(Creature* creature) const diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp index effb7d2e6..b7a18afa1 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp @@ -198,7 +198,7 @@ public: nefarian->DespawnOrUnsummon(); break; case FAIL: - _events.ScheduleEvent(EVENT_RESPAWN_NEFARIUS, 15*IN_MILLISECONDS*MINUTE); + _events.ScheduleEvent(EVENT_RESPAWN_NEFARIUS, 15 * IN_MILLISECONDS * MINUTE); SetBossState(BOSS_NEFARIAN, NOT_STARTED); break; default: @@ -213,15 +213,24 @@ public: { switch (id) { - case DATA_RAZORGORE_THE_UNTAMED: return RazorgoreTheUntamedGUID; - case DATA_VAELASTRAZ_THE_CORRUPT: return VaelastraszTheCorruptGUID; - case DATA_BROODLORD_LASHLAYER: return BroodlordLashlayerGUID; - case DATA_FIRENAW: return FiremawGUID; - case DATA_EBONROC: return EbonrocGUID; - case DATA_FLAMEGOR: return FlamegorGUID; - case DATA_CHROMAGGUS: return ChromaggusGUID; - case DATA_LORD_VICTOR_NEFARIUS: return LordVictorNefariusGUID; - case DATA_NEFARIAN: return NefarianGUID; + case DATA_RAZORGORE_THE_UNTAMED: + return RazorgoreTheUntamedGUID; + case DATA_VAELASTRAZ_THE_CORRUPT: + return VaelastraszTheCorruptGUID; + case DATA_BROODLORD_LASHLAYER: + return BroodlordLashlayerGUID; + case DATA_FIRENAW: + return FiremawGUID; + case DATA_EBONROC: + return EbonrocGUID; + case DATA_FLAMEGOR: + return FlamegorGUID; + case DATA_CHROMAGGUS: + return ChromaggusGUID; + case DATA_LORD_VICTOR_NEFARIUS: + return LordVictorNefariusGUID; + case DATA_NEFARIAN: + return NefarianGUID; } return 0; @@ -234,7 +243,7 @@ public: switch (data) { case IN_PROGRESS: - _events.ScheduleEvent(EVENT_RAZOR_SPAWN, 45*IN_MILLISECONDS); + _events.ScheduleEvent(EVENT_RAZOR_SPAWN, 45 * IN_MILLISECONDS); EggEvent = data; EggCount = 0; break; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_baron_geddon.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_baron_geddon.cpp index f0bad68ff..970004430 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_baron_geddon.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_baron_geddon.cpp @@ -38,73 +38,73 @@ enum Events class boss_baron_geddon : public CreatureScript { - public: - boss_baron_geddon() : CreatureScript("boss_baron_geddon") { } +public: + boss_baron_geddon() : CreatureScript("boss_baron_geddon") { } - struct boss_baron_geddonAI : public BossAI + struct boss_baron_geddonAI : public BossAI + { + boss_baron_geddonAI(Creature* creature) : BossAI(creature, BOSS_BARON_GEDDON) { - boss_baron_geddonAI(Creature* creature) : BossAI(creature, BOSS_BARON_GEDDON) - { - } - - void EnterCombat(Unit* victim) - { - BossAI::EnterCombat(victim); - events.ScheduleEvent(EVENT_INFERNO, 45000); - events.ScheduleEvent(EVENT_IGNITE_MANA, 30000); - events.ScheduleEvent(EVENT_LIVING_BOMB, 35000); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - // If we are <2% hp cast Armageddon - if (!HealthAbovePct(2)) - { - me->InterruptNonMeleeSpells(true); - DoCast(me, SPELL_ARMAGEDDON); - Talk(EMOTE_SERVICE); - return; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_INFERNO: - DoCast(me, SPELL_INFERNO); - events.ScheduleEvent(EVENT_INFERNO, 45000); - break; - case EVENT_IGNITE_MANA: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_IGNITE_MANA)) - DoCast(target, SPELL_IGNITE_MANA); - events.ScheduleEvent(EVENT_IGNITE_MANA, 30000); - break; - case EVENT_LIVING_BOMB: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) - DoCast(target, SPELL_LIVING_BOMB); - events.ScheduleEvent(EVENT_LIVING_BOMB, 35000); - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_baron_geddonAI(creature); } + + void EnterCombat(Unit* victim) + { + BossAI::EnterCombat(victim); + events.ScheduleEvent(EVENT_INFERNO, 45000); + events.ScheduleEvent(EVENT_IGNITE_MANA, 30000); + events.ScheduleEvent(EVENT_LIVING_BOMB, 35000); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + // If we are <2% hp cast Armageddon + if (!HealthAbovePct(2)) + { + me->InterruptNonMeleeSpells(true); + DoCast(me, SPELL_ARMAGEDDON); + Talk(EMOTE_SERVICE); + return; + } + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_INFERNO: + DoCast(me, SPELL_INFERNO); + events.ScheduleEvent(EVENT_INFERNO, 45000); + break; + case EVENT_IGNITE_MANA: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_IGNITE_MANA)) + DoCast(target, SPELL_IGNITE_MANA); + events.ScheduleEvent(EVENT_IGNITE_MANA, 30000); + break; + case EVENT_LIVING_BOMB: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) + DoCast(target, SPELL_LIVING_BOMB); + events.ScheduleEvent(EVENT_LIVING_BOMB, 35000); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_baron_geddonAI(creature); + } }; void AddSC_boss_baron_geddon() diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_garr.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_garr.cpp index 391a33d72..b5a4769bc 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_garr.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_garr.cpp @@ -36,109 +36,109 @@ enum Events class boss_garr : public CreatureScript { - public: - boss_garr() : CreatureScript("boss_garr") { } +public: + boss_garr() : CreatureScript("boss_garr") { } - struct boss_garrAI : public BossAI + struct boss_garrAI : public BossAI + { + boss_garrAI(Creature* creature) : BossAI(creature, BOSS_GARR) { - boss_garrAI(Creature* creature) : BossAI(creature, BOSS_GARR) - { - } - - void EnterCombat(Unit* victim) - { - BossAI::EnterCombat(victim); - events.ScheduleEvent(EVENT_ANTIMAGIC_PULSE, 25000); - events.ScheduleEvent(EVENT_MAGMA_SHACKLES, 15000); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_ANTIMAGIC_PULSE: - DoCast(me, SPELL_ANTIMAGIC_PULSE); - events.ScheduleEvent(EVENT_ANTIMAGIC_PULSE, urand(10000, 15000)); - break; - case EVENT_MAGMA_SHACKLES: - DoCast(me, SPELL_MAGMA_SHACKLES); - events.ScheduleEvent(EVENT_MAGMA_SHACKLES, urand(8000, 12000)); - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_garrAI(creature); } + + void EnterCombat(Unit* victim) + { + BossAI::EnterCombat(victim); + events.ScheduleEvent(EVENT_ANTIMAGIC_PULSE, 25000); + events.ScheduleEvent(EVENT_MAGMA_SHACKLES, 15000); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_ANTIMAGIC_PULSE: + DoCast(me, SPELL_ANTIMAGIC_PULSE); + events.ScheduleEvent(EVENT_ANTIMAGIC_PULSE, urand(10000, 15000)); + break; + case EVENT_MAGMA_SHACKLES: + DoCast(me, SPELL_MAGMA_SHACKLES); + events.ScheduleEvent(EVENT_MAGMA_SHACKLES, urand(8000, 12000)); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_garrAI(creature); + } }; class npc_firesworn : public CreatureScript { - public: - npc_firesworn() : CreatureScript("npc_firesworn") { } +public: + npc_firesworn() : CreatureScript("npc_firesworn") { } - struct npc_fireswornAI : public ScriptedAI + struct npc_fireswornAI : public ScriptedAI + { + npc_fireswornAI(Creature* creature) : ScriptedAI(creature) { } + + uint32 immolateTimer; + + void Reset() { - npc_fireswornAI(Creature* creature) : ScriptedAI(creature) { } - - uint32 immolateTimer; - - void Reset() - { - immolateTimer = 4000; //These times are probably wrong - } - - void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) - { - uint32 const health10pct = me->CountPctFromMaxHealth(10); - uint32 health = me->GetHealth(); - if (int32(health) - int32(damage) < int32(health10pct)) - { - damage = 0; - DoCastVictim(SPELL_ERUPTION); - me->DespawnOrUnsummon(); - } - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - if (immolateTimer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(target, SPELL_IMMOLATE); - immolateTimer = urand(5000, 10000); - } - else - immolateTimer -= diff; - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_fireswornAI(creature); + immolateTimer = 4000; //These times are probably wrong } + + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) + { + uint32 const health10pct = me->CountPctFromMaxHealth(10); + uint32 health = me->GetHealth(); + if (int32(health) - int32(damage) < int32(health10pct)) + { + damage = 0; + DoCastVictim(SPELL_ERUPTION); + me->DespawnOrUnsummon(); + } + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + if (immolateTimer <= diff) + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + DoCast(target, SPELL_IMMOLATE); + immolateTimer = urand(5000, 10000); + } + else + immolateTimer -= diff; + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_fireswornAI(creature); + } }; void AddSC_boss_garr() diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_gehennas.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_gehennas.cpp index f42c17d83..f27e1a806 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_gehennas.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_gehennas.cpp @@ -32,64 +32,64 @@ enum Events class boss_gehennas : public CreatureScript { - public: - boss_gehennas() : CreatureScript("boss_gehennas") { } +public: + boss_gehennas() : CreatureScript("boss_gehennas") { } - struct boss_gehennasAI : public BossAI + struct boss_gehennasAI : public BossAI + { + boss_gehennasAI(Creature* creature) : BossAI(creature, BOSS_GEHENNAS) { - boss_gehennasAI(Creature* creature) : BossAI(creature, BOSS_GEHENNAS) - { - } - - void EnterCombat(Unit* victim) - { - BossAI::EnterCombat(victim); - events.ScheduleEvent(EVENT_GEHENNAS_CURSE, 12000); - events.ScheduleEvent(EVENT_RAIN_OF_FIRE, 10000); - events.ScheduleEvent(EVENT_SHADOW_BOLT, 6000); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_GEHENNAS_CURSE: - DoCastVictim(SPELL_GEHENNAS_CURSE); - events.ScheduleEvent(EVENT_GEHENNAS_CURSE, urand(22000, 30000)); - break; - case EVENT_RAIN_OF_FIRE: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(target, SPELL_RAIN_OF_FIRE); - events.ScheduleEvent(EVENT_RAIN_OF_FIRE, urand(4000, 12000)); - break; - case EVENT_SHADOW_BOLT: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1)) - DoCast(target, SPELL_SHADOW_BOLT); - events.ScheduleEvent(EVENT_SHADOW_BOLT, 7000); - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_gehennasAI(creature); } + + void EnterCombat(Unit* victim) + { + BossAI::EnterCombat(victim); + events.ScheduleEvent(EVENT_GEHENNAS_CURSE, 12000); + events.ScheduleEvent(EVENT_RAIN_OF_FIRE, 10000); + events.ScheduleEvent(EVENT_SHADOW_BOLT, 6000); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_GEHENNAS_CURSE: + DoCastVictim(SPELL_GEHENNAS_CURSE); + events.ScheduleEvent(EVENT_GEHENNAS_CURSE, urand(22000, 30000)); + break; + case EVENT_RAIN_OF_FIRE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + DoCast(target, SPELL_RAIN_OF_FIRE); + events.ScheduleEvent(EVENT_RAIN_OF_FIRE, urand(4000, 12000)); + break; + case EVENT_SHADOW_BOLT: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1)) + DoCast(target, SPELL_SHADOW_BOLT); + events.ScheduleEvent(EVENT_SHADOW_BOLT, 7000); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_gehennasAI(creature); + } }; void AddSC_boss_gehennas() diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_golemagg.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_golemagg.cpp index 21e4eaa21..275eec3ab 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_golemagg.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_golemagg.cpp @@ -42,144 +42,144 @@ enum Events class boss_golemagg : public CreatureScript { - public: - boss_golemagg() : CreatureScript("boss_golemagg") { } +public: + boss_golemagg() : CreatureScript("boss_golemagg") { } - struct boss_golemaggAI : public BossAI + struct boss_golemaggAI : public BossAI + { + boss_golemaggAI(Creature* creature) : BossAI(creature, BOSS_GOLEMAGG_THE_INCINERATOR) { - boss_golemaggAI(Creature* creature) : BossAI(creature, BOSS_GOLEMAGG_THE_INCINERATOR) - { - } - - void Reset() - { - BossAI::Reset(); - DoCast(me, SPELL_MAGMASPLASH, true); - } - - void EnterCombat(Unit* victim) - { - BossAI::EnterCombat(victim); - events.ScheduleEvent(EVENT_PYROBLAST, 7000); - - // The two ragers should join the fight alongside me against my foes. - std::list ragers; - me->GetCreaturesWithEntryInRange(ragers, 100, NPC_CORE_RAGER); - for (Creature * i : ragers) - { - if (i && i->IsAlive() && !i->IsInCombat()) - { - i->AI()->AttackStart(victim); - } - } - } - - void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask) - { - if (!HealthBelowPct(10) || me->HasAura(SPELL_ENRAGE)) - return; - - DoCast(me, SPELL_ENRAGE, true); - events.ScheduleEvent(EVENT_EARTHQUAKE, 3000); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_PYROBLAST: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(target, SPELL_PYROBLAST); - events.ScheduleEvent(EVENT_PYROBLAST, 7000); - break; - case EVENT_EARTHQUAKE: - DoCastVictim(SPELL_EARTHQUAKE); - events.ScheduleEvent(EVENT_EARTHQUAKE, 3000); - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_golemaggAI(creature); } + + void Reset() + { + BossAI::Reset(); + DoCast(me, SPELL_MAGMASPLASH, true); + } + + void EnterCombat(Unit* victim) + { + BossAI::EnterCombat(victim); + events.ScheduleEvent(EVENT_PYROBLAST, 7000); + + // The two ragers should join the fight alongside me against my foes. + std::list ragers; + me->GetCreaturesWithEntryInRange(ragers, 100, NPC_CORE_RAGER); + for (Creature* i : ragers) + { + if (i && i->IsAlive() && !i->IsInCombat()) + { + i->AI()->AttackStart(victim); + } + } + } + + void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask) + { + if (!HealthBelowPct(10) || me->HasAura(SPELL_ENRAGE)) + return; + + DoCast(me, SPELL_ENRAGE, true); + events.ScheduleEvent(EVENT_EARTHQUAKE, 3000); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_PYROBLAST: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + DoCast(target, SPELL_PYROBLAST); + events.ScheduleEvent(EVENT_PYROBLAST, 7000); + break; + case EVENT_EARTHQUAKE: + DoCastVictim(SPELL_EARTHQUAKE); + events.ScheduleEvent(EVENT_EARTHQUAKE, 3000); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_golemaggAI(creature); + } }; class npc_core_rager : public CreatureScript { - public: - npc_core_rager() : CreatureScript("npc_core_rager") { } +public: + npc_core_rager() : CreatureScript("npc_core_rager") { } - struct npc_core_ragerAI : public ScriptedAI + struct npc_core_ragerAI : public ScriptedAI + { + npc_core_ragerAI(Creature* creature) : ScriptedAI(creature) { - npc_core_ragerAI(Creature* creature) : ScriptedAI(creature) - { - instance = creature->GetInstanceScript(); - } - - void Reset() - { - mangleTimer = 7*IN_MILLISECONDS; // These times are probably wrong - } - - void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask) - { - if (HealthAbovePct(50) || !instance) - return; - - if (Creature* pGolemagg = instance->instance->GetCreature(instance->GetData64(BOSS_GOLEMAGG_THE_INCINERATOR))) - { - if (pGolemagg->IsAlive()) - { - me->AddAura(SPELL_GOLEMAGG_TRUST, me); - Talk(EMOTE_LOWHP); - me->SetFullHealth(); - } - } - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - // Mangle - if (mangleTimer <= diff) - { - DoCastVictim(SPELL_MANGLE); - mangleTimer = 10*IN_MILLISECONDS; - } - else - mangleTimer -= diff; - - DoMeleeAttackIfReady(); - } - - private: - InstanceScript* instance; - uint32 mangleTimer; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + instance = creature->GetInstanceScript(); } + + void Reset() + { + mangleTimer = 7 * IN_MILLISECONDS; // These times are probably wrong + } + + void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask) + { + if (HealthAbovePct(50) || !instance) + return; + + if (Creature* pGolemagg = instance->instance->GetCreature(instance->GetData64(BOSS_GOLEMAGG_THE_INCINERATOR))) + { + if (pGolemagg->IsAlive()) + { + me->AddAura(SPELL_GOLEMAGG_TRUST, me); + Talk(EMOTE_LOWHP); + me->SetFullHealth(); + } + } + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + // Mangle + if (mangleTimer <= diff) + { + DoCastVictim(SPELL_MANGLE); + mangleTimer = 10 * IN_MILLISECONDS; + } + else + mangleTimer -= diff; + + DoMeleeAttackIfReady(); + } + + private: + InstanceScript* instance; + uint32 mangleTimer; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; void AddSC_boss_golemagg() diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_lucifron.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_lucifron.cpp index b7c418daf..80b588dc2 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_lucifron.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_lucifron.cpp @@ -32,62 +32,62 @@ enum Events class boss_lucifron : public CreatureScript { - public: - boss_lucifron() : CreatureScript("boss_lucifron") { } +public: + boss_lucifron() : CreatureScript("boss_lucifron") { } - struct boss_lucifronAI : public BossAI + struct boss_lucifronAI : public BossAI + { + boss_lucifronAI(Creature* creature) : BossAI(creature, BOSS_LUCIFRON) { - boss_lucifronAI(Creature* creature) : BossAI(creature, BOSS_LUCIFRON) - { - } - - void EnterCombat(Unit* victim) - { - BossAI::EnterCombat(victim); - events.ScheduleEvent(EVENT_IMPENDING_DOOM, 10000); - events.ScheduleEvent(EVENT_LUCIFRON_CURSE, 20000); - events.ScheduleEvent(EVENT_SHADOW_SHOCK, 6000); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_IMPENDING_DOOM: - DoCastVictim(SPELL_IMPENDING_DOOM); - events.ScheduleEvent(EVENT_IMPENDING_DOOM, 20000); - break; - case EVENT_LUCIFRON_CURSE: - DoCastVictim(SPELL_LUCIFRON_CURSE); - events.ScheduleEvent(EVENT_LUCIFRON_CURSE, 15000); - break; - case EVENT_SHADOW_SHOCK: - DoCastVictim(SPELL_SHADOW_SHOCK); - events.ScheduleEvent(EVENT_SHADOW_SHOCK, 6000); - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_lucifronAI(creature); } + + void EnterCombat(Unit* victim) + { + BossAI::EnterCombat(victim); + events.ScheduleEvent(EVENT_IMPENDING_DOOM, 10000); + events.ScheduleEvent(EVENT_LUCIFRON_CURSE, 20000); + events.ScheduleEvent(EVENT_SHADOW_SHOCK, 6000); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_IMPENDING_DOOM: + DoCastVictim(SPELL_IMPENDING_DOOM); + events.ScheduleEvent(EVENT_IMPENDING_DOOM, 20000); + break; + case EVENT_LUCIFRON_CURSE: + DoCastVictim(SPELL_LUCIFRON_CURSE); + events.ScheduleEvent(EVENT_LUCIFRON_CURSE, 15000); + break; + case EVENT_SHADOW_SHOCK: + DoCastVictim(SPELL_SHADOW_SHOCK); + events.ScheduleEvent(EVENT_SHADOW_SHOCK, 6000); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_lucifronAI(creature); + } }; void AddSC_boss_lucifron() diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp index a5fae5983..476340c5e 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp @@ -4,12 +4,12 @@ * Copyright (C) 2005-2009 MaNGOS */ - /* ScriptData - SDName: Boss_Magmadar - SD%Complete: 75 - SDComment: Conflag on ground nyi - SDCategory: Molten Core - EndScriptData */ +/* ScriptData +SDName: Boss_Magmadar +SD%Complete: 75 +SDComment: Conflag on ground nyi +SDCategory: Molten Core +EndScriptData */ #include "ObjectMgr.h" #include "ScriptMgr.h" @@ -80,22 +80,22 @@ public: { switch (eventId) { - case EVENT_FRENZY: - Talk(EMOTE_FRENZY); - DoCast(me, SPELL_FRENZY); - events.ScheduleEvent(EVENT_FRENZY, 15000); - break; - case EVENT_PANIC: - DoCastVictim(SPELL_PANIC); - events.ScheduleEvent(EVENT_PANIC, 35000); - break; - case EVENT_LAVA_BOMB: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_LAVA_BOMB)) - DoCast(target, SPELL_LAVA_BOMB); - events.ScheduleEvent(EVENT_LAVA_BOMB, 12000); - break; - default: - break; + case EVENT_FRENZY: + Talk(EMOTE_FRENZY); + DoCast(me, SPELL_FRENZY); + events.ScheduleEvent(EVENT_FRENZY, 15000); + break; + case EVENT_PANIC: + DoCastVictim(SPELL_PANIC); + events.ScheduleEvent(EVENT_PANIC, 35000); + break; + case EVENT_LAVA_BOMB: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_LAVA_BOMB)) + DoCast(target, SPELL_LAVA_BOMB); + events.ScheduleEvent(EVENT_LAVA_BOMB, 12000); + break; + default: + break; } } @@ -122,11 +122,12 @@ public: } EventMap events; - std::list hounds; + std::list hounds; bool smoldering = false; Unit* killer; - void removeFeignDeath() { + void removeFeignDeath() + { me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29); me->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); @@ -161,11 +162,13 @@ public: } } - void Reset() { + void Reset() + { removeFeignDeath(); } - void JustDied(Unit* /*killer*/) { + void JustDied(Unit* /*killer*/) + { removeFeignDeath(); } @@ -185,47 +188,48 @@ public: { switch (eventId) { - case EVENT_SERRATED_BITE: - if (UpdateVictim() && !smoldering) { - DoCast(me->GetVictim(), SPELL_SERRATED_BITE); - events.ScheduleEvent(EVENT_SERRATED_BITE, 10000); // again, timer may be wrong - } - break; - case EVENT_IGNITE: - smoldering = false; - me->GetCreaturesWithEntryInRange(hounds, 80, NPC_CORE_HOUND); - for (Creature * i : hounds) - { - if (i && i->IsAlive() && i->IsInCombat() && !i->HasUnitState(UNIT_STATE_DIED)) + case EVENT_SERRATED_BITE: + if (UpdateVictim() && !smoldering) { - Talk(EMOTE_IGNITE); - me->SetFullHealth(); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29); - me->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); - me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_ROOT); - me->ClearUnitState(UNIT_STATE_DIED); - me->ClearUnitState(UNIT_STATE_CANNOT_AUTOATTACK); - me->DisableRotate(false); - me->AI()->AttackStart(i->GetVictim()); - return; + DoCast(me->GetVictim(), SPELL_SERRATED_BITE); + events.ScheduleEvent(EVENT_SERRATED_BITE, 10000); // again, timer may be wrong } - } - if (me->HasUnitState(UNIT_STATE_DIED)) - { - if (killer) + break; + case EVENT_IGNITE: + smoldering = false; + me->GetCreaturesWithEntryInRange(hounds, 80, NPC_CORE_HOUND); + for (Creature* i : hounds) { - me->Kill(killer, me); + if (i && i->IsAlive() && i->IsInCombat() && !i->HasUnitState(UNIT_STATE_DIED)) + { + Talk(EMOTE_IGNITE); + me->SetFullHealth(); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29); + me->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); + me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); + me->RemoveUnitMovementFlag(MOVEMENTFLAG_ROOT); + me->ClearUnitState(UNIT_STATE_DIED); + me->ClearUnitState(UNIT_STATE_CANNOT_AUTOATTACK); + me->DisableRotate(false); + me->AI()->AttackStart(i->GetVictim()); + return; + } } - else + if (me->HasUnitState(UNIT_STATE_DIED)) { - me->Kill(me, me); + if (killer) + { + me->Kill(killer, me); + } + else + { + me->Kill(me, me); + } } - } - break; - default: - break; + break; + default: + break; } } 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 32ab7c6d1..da8b0d966 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp @@ -56,147 +56,147 @@ enum Events class boss_majordomo : public CreatureScript { - public: - boss_majordomo() : CreatureScript("boss_majordomo") { } +public: + boss_majordomo() : CreatureScript("boss_majordomo") { } - struct boss_majordomoAI : public BossAI + struct boss_majordomoAI : public BossAI + { + boss_majordomoAI(Creature* creature) : BossAI(creature, BOSS_MAJORDOMO_EXECUTUS) { - boss_majordomoAI(Creature* creature) : BossAI(creature, BOSS_MAJORDOMO_EXECUTUS) - { - } + } - void KilledUnit(Unit* /*victim*/) override - { - if (urand(0, 99) < 25) - Talk(SAY_SLAY); - } + void KilledUnit(Unit* /*victim*/) override + { + if (urand(0, 99) < 25) + Talk(SAY_SLAY); + } - void EnterCombat(Unit* who) override - { - BossAI::EnterCombat(who); - Talk(SAY_AGGRO); - events.ScheduleEvent(EVENT_MAGIC_REFLECTION, 30000); - events.ScheduleEvent(EVENT_DAMAGE_REFLECTION, 15000); - events.ScheduleEvent(EVENT_BLAST_WAVE, 10000); - events.ScheduleEvent(EVENT_TELEPORT, 20000); - // Call every flamewaker around him - me->CallForHelp(30); - } + void EnterCombat(Unit* who) override + { + BossAI::EnterCombat(who); + Talk(SAY_AGGRO); + events.ScheduleEvent(EVENT_MAGIC_REFLECTION, 30000); + events.ScheduleEvent(EVENT_DAMAGE_REFLECTION, 15000); + events.ScheduleEvent(EVENT_BLAST_WAVE, 10000); + events.ScheduleEvent(EVENT_TELEPORT, 20000); + // Call every flamewaker around him + me->CallForHelp(30); + } - void UpdateAI(uint32 diff) override + void UpdateAI(uint32 diff) override + { + if (instance->GetBossState(BOSS_MAJORDOMO_EXECUTUS) != DONE) { - if (instance->GetBossState(BOSS_MAJORDOMO_EXECUTUS) != DONE) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (!me->FindNearestCreature(NPC_FLAMEWAKER_HEALER, 100.0f) && !me->FindNearestCreature(NPC_FLAMEWAKER_ELITE, 100.0f)) - { - me->GetMap()->UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, me->GetEntry(), me); - me->setFaction(35); - EnterEvadeMode(); - Talk(SAY_DEFEAT); - _JustDied(); - events.ScheduleEvent(EVENT_OUTRO_1, 32000); - return; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - if (HealthBelowPct(50)) - DoCast(me, SPELL_AEGIS_OF_RAGNAROS, true); - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_MAGIC_REFLECTION: - DoCast(me, SPELL_MAGIC_REFLECTION); - events.ScheduleEvent(EVENT_MAGIC_REFLECTION, 30000); - break; - case EVENT_DAMAGE_REFLECTION: - DoCast(me, SPELL_DAMAGE_REFLECTION); - events.ScheduleEvent(EVENT_DAMAGE_REFLECTION, 30000); - break; - case EVENT_BLAST_WAVE: - DoCastVictim(SPELL_BLAST_WAVE); - events.ScheduleEvent(EVENT_BLAST_WAVE, 10000); - break; - case EVENT_TELEPORT: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1)) - DoCast(target, SPELL_TELEPORT); - events.ScheduleEvent(EVENT_TELEPORT, 20000); - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); - } - else - { - events.Update(diff); - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_OUTRO_1: - me->NearTeleportTo(RagnarosTelePos.GetPositionX(), RagnarosTelePos.GetPositionY(), RagnarosTelePos.GetPositionZ(), RagnarosTelePos.GetOrientation()); - me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - break; - case EVENT_OUTRO_2: - instance->instance->SummonCreature(NPC_RAGNAROS, RagnarosSummonPos); - break; - case EVENT_OUTRO_3: - Talk(SAY_ARRIVAL2_MAJ); - break; - default: - break; - } - } - } - } - - void DoAction(int32 action) override - { - if (action == ACTION_START_RAGNAROS && events.GetNextEventTime(EVENT_OUTRO_2) == 0) - { - me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - Talk(SAY_SUMMON_MAJ); - events.ScheduleEvent(EVENT_OUTRO_2, 8000); - events.ScheduleEvent(EVENT_OUTRO_3, 24000); - } - else if (action == ACTION_START_RAGNAROS_ALT) + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (!me->FindNearestCreature(NPC_FLAMEWAKER_HEALER, 100.0f) && !me->FindNearestCreature(NPC_FLAMEWAKER_ELITE, 100.0f)) { + me->GetMap()->UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, me->GetEntry(), me); me->setFaction(35); - me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + EnterEvadeMode(); + Talk(SAY_DEFEAT); + _JustDied(); + events.ScheduleEvent(EVENT_OUTRO_1, 32000); + return; + } + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + if (HealthBelowPct(50)) + DoCast(me, SPELL_AEGIS_OF_RAGNAROS, true); + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_MAGIC_REFLECTION: + DoCast(me, SPELL_MAGIC_REFLECTION); + events.ScheduleEvent(EVENT_MAGIC_REFLECTION, 30000); + break; + case EVENT_DAMAGE_REFLECTION: + DoCast(me, SPELL_DAMAGE_REFLECTION); + events.ScheduleEvent(EVENT_DAMAGE_REFLECTION, 30000); + break; + case EVENT_BLAST_WAVE: + DoCastVictim(SPELL_BLAST_WAVE); + events.ScheduleEvent(EVENT_BLAST_WAVE, 10000); + break; + case EVENT_TELEPORT: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1)) + DoCast(target, SPELL_TELEPORT); + events.ScheduleEvent(EVENT_TELEPORT, 20000); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + else + { + events.Update(diff); + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_OUTRO_1: + me->NearTeleportTo(RagnarosTelePos.GetPositionX(), RagnarosTelePos.GetPositionY(), RagnarosTelePos.GetPositionZ(), RagnarosTelePos.GetOrientation()); + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + break; + case EVENT_OUTRO_2: + instance->instance->SummonCreature(NPC_RAGNAROS, RagnarosSummonPos); + break; + case EVENT_OUTRO_3: + Talk(SAY_ARRIVAL2_MAJ); + break; + default: + break; + } } } - }; - - bool OnGossipHello(Player* player, Creature* creature) override - { - AddGossipItemFor(player, 4093, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, GOSSIP_HELLO, creature->GetGUID()); - return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 /*action*/) override + void DoAction(int32 action) override { - CloseGossipMenuFor(player); - creature->AI()->DoAction(ACTION_START_RAGNAROS); - return true; + if (action == ACTION_START_RAGNAROS && events.GetNextEventTime(EVENT_OUTRO_2) == 0) + { + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + Talk(SAY_SUMMON_MAJ); + events.ScheduleEvent(EVENT_OUTRO_2, 8000); + events.ScheduleEvent(EVENT_OUTRO_3, 24000); + } + else if (action == ACTION_START_RAGNAROS_ALT) + { + me->setFaction(35); + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + } } + }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(creature); - } + bool OnGossipHello(Player* player, Creature* creature) override + { + AddGossipItemFor(player, 4093, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, GOSSIP_HELLO, creature->GetGUID()); + return true; + } + + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 /*action*/) override + { + CloseGossipMenuFor(player); + creature->AI()->DoAction(ACTION_START_RAGNAROS); + return true; + } + + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI(creature); + } }; void AddSC_boss_majordomo() diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp index 012c78dd7..50e473bbc 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp @@ -64,79 +64,79 @@ enum Events class boss_ragnaros : public CreatureScript { - public: - boss_ragnaros() : CreatureScript("boss_ragnaros") { } +public: + boss_ragnaros() : CreatureScript("boss_ragnaros") { } - struct boss_ragnarosAI : public BossAI + struct boss_ragnarosAI : public BossAI + { + boss_ragnarosAI(Creature* creature) : BossAI(creature, BOSS_RAGNAROS) { - boss_ragnarosAI(Creature* creature) : BossAI(creature, BOSS_RAGNAROS) - { - _introState = 0; - me->SetReactState(REACT_PASSIVE); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - } + _introState = 0; + me->SetReactState(REACT_PASSIVE); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + } - void Reset() override - { - BossAI::Reset(); - _emergeTimer = 90000; - _hasYelledMagmaBurst = false; - _hasSubmergedOnce = false; - _isBanished = false; - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); - } + void Reset() override + { + BossAI::Reset(); + _emergeTimer = 90000; + _hasYelledMagmaBurst = false; + _hasSubmergedOnce = false; + _isBanished = false; + me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); + } - void EnterCombat(Unit* victim) override - { - BossAI::EnterCombat(victim); - events.ScheduleEvent(EVENT_ERUPTION, 15000); - events.ScheduleEvent(EVENT_WRATH_OF_RAGNAROS, 30000); - events.ScheduleEvent(EVENT_HAND_OF_RAGNAROS, 25000); - events.ScheduleEvent(EVENT_LAVA_BURST, 10000); - events.ScheduleEvent(EVENT_ELEMENTAL_FIRE, 3000); - events.ScheduleEvent(EVENT_MAGMA_BLAST, 2000); - events.ScheduleEvent(EVENT_SUBMERGE, 180000); - } - - void JustDied(Unit* killer) override - { - BossAI::JustDied(killer); - me->SetFacingTo(DEATH_ORIENTATION); - } + void EnterCombat(Unit* victim) override + { + BossAI::EnterCombat(victim); + events.ScheduleEvent(EVENT_ERUPTION, 15000); + events.ScheduleEvent(EVENT_WRATH_OF_RAGNAROS, 30000); + events.ScheduleEvent(EVENT_HAND_OF_RAGNAROS, 25000); + events.ScheduleEvent(EVENT_LAVA_BURST, 10000); + events.ScheduleEvent(EVENT_ELEMENTAL_FIRE, 3000); + events.ScheduleEvent(EVENT_MAGMA_BLAST, 2000); + events.ScheduleEvent(EVENT_SUBMERGE, 180000); + } - void KilledUnit(Unit* /*victim*/) override - { - if (urand(0, 99) < 25) - Talk(SAY_KILL); - } + void JustDied(Unit* killer) override + { + BossAI::JustDied(killer); + me->SetFacingTo(DEATH_ORIENTATION); + } - void AttackStart(Unit* target) override - { - if (target && me->Attack(target, true)) - DoStartNoMovement(target); - } + void KilledUnit(Unit* /*victim*/) override + { + if (urand(0, 99) < 25) + Talk(SAY_KILL); + } - void UpdateAI(uint32 diff) override + void AttackStart(Unit* target) override + { + if (target && me->Attack(target, true)) + DoStartNoMovement(target); + } + + void UpdateAI(uint32 diff) override + { + if (_introState != 2) { - if (_introState != 2) + if (!_introState) { - if (!_introState) - { - me->HandleEmoteCommand(EMOTE_ONESHOT_EMERGE); - events.ScheduleEvent(EVENT_INTRO_1, 4000); - events.ScheduleEvent(EVENT_INTRO_2, 23000); - events.ScheduleEvent(EVENT_INTRO_3, 42000); - events.ScheduleEvent(EVENT_INTRO_4, 43000); - events.ScheduleEvent(EVENT_INTRO_5, 53000); - _introState = 1; - } + me->HandleEmoteCommand(EMOTE_ONESHOT_EMERGE); + events.ScheduleEvent(EVENT_INTRO_1, 4000); + events.ScheduleEvent(EVENT_INTRO_2, 23000); + events.ScheduleEvent(EVENT_INTRO_3, 42000); + events.ScheduleEvent(EVENT_INTRO_4, 43000); + events.ScheduleEvent(EVENT_INTRO_5, 53000); + _introState = 1; + } - events.Update(diff); + events.Update(diff); - while (uint32 eventId = events.ExecuteEvent()) + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) { - switch (eventId) - { case EVENT_INTRO_1: Talk(SAY_ARRIVAL1_RAG); break; @@ -158,76 +158,76 @@ class boss_ragnaros : public CreatureScript break; default: break; - } } } - else + } + else + { + if (_isBanished && ((_emergeTimer <= diff) || (instance->GetData(DATA_RAGNAROS_ADDS)) > 8)) { - if (_isBanished && ((_emergeTimer <= diff) || (instance->GetData(DATA_RAGNAROS_ADDS)) > 8)) - { - //Become unbanished again - me->SetReactState(REACT_AGGRESSIVE); - me->setFaction(14); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); - me->HandleEmoteCommand(EMOTE_ONESHOT_EMERGE); - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - AttackStart(target); - instance->SetData(DATA_RAGNAROS_ADDS, 0); - _isBanished = false; - } - else if (_isBanished) - { - _emergeTimer -= diff; - return; - } + //Become unbanished again + me->SetReactState(REACT_AGGRESSIVE); + me->setFaction(14); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); + me->HandleEmoteCommand(EMOTE_ONESHOT_EMERGE); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + AttackStart(target); + instance->SetData(DATA_RAGNAROS_ADDS, 0); + _isBanished = false; + } + else if (_isBanished) + { + _emergeTimer -= diff; + return; + } - if (!UpdateVictim()) - return; + if (!UpdateVictim()) + return; - events.Update(diff); + events.Update(diff); - while (uint32 eventId = events.ExecuteEvent()) + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) { - switch (eventId) - { - case EVENT_ERUPTION: - DoCastVictim(SPELL_ERRUPTION); - events.ScheduleEvent(EVENT_ERUPTION, urand(20000, 45000)); - break; - case EVENT_WRATH_OF_RAGNAROS: - DoCastVictim(SPELL_WRATH_OF_RAGNAROS); - if (urand(0, 1)) - Talk(SAY_WRATH); - events.ScheduleEvent(EVENT_WRATH_OF_RAGNAROS, 25000); - break; - case EVENT_HAND_OF_RAGNAROS: - DoCast(me, SPELL_HAND_OF_RAGNAROS); - if (urand(0, 1)) - Talk(SAY_HAND); - events.ScheduleEvent(EVENT_HAND_OF_RAGNAROS, 20000); - break; - case EVENT_LAVA_BURST: - DoCastVictim(SPELL_LAVA_BURST); - events.ScheduleEvent(EVENT_LAVA_BURST, 10000); - break; - case EVENT_ELEMENTAL_FIRE: - DoCastVictim(SPELL_ELEMENTAL_FIRE); - events.ScheduleEvent(EVENT_ELEMENTAL_FIRE, urand(10000, 14000)); - break; - case EVENT_MAGMA_BLAST: - if (!me->IsWithinMeleeRange(me->GetVictim())) + case EVENT_ERUPTION: + DoCastVictim(SPELL_ERRUPTION); + events.ScheduleEvent(EVENT_ERUPTION, urand(20000, 45000)); + break; + case EVENT_WRATH_OF_RAGNAROS: + DoCastVictim(SPELL_WRATH_OF_RAGNAROS); + if (urand(0, 1)) + Talk(SAY_WRATH); + events.ScheduleEvent(EVENT_WRATH_OF_RAGNAROS, 25000); + break; + case EVENT_HAND_OF_RAGNAROS: + DoCast(me, SPELL_HAND_OF_RAGNAROS); + if (urand(0, 1)) + Talk(SAY_HAND); + events.ScheduleEvent(EVENT_HAND_OF_RAGNAROS, 20000); + break; + case EVENT_LAVA_BURST: + DoCastVictim(SPELL_LAVA_BURST); + events.ScheduleEvent(EVENT_LAVA_BURST, 10000); + break; + case EVENT_ELEMENTAL_FIRE: + DoCastVictim(SPELL_ELEMENTAL_FIRE); + events.ScheduleEvent(EVENT_ELEMENTAL_FIRE, urand(10000, 14000)); + break; + case EVENT_MAGMA_BLAST: + if (!me->IsWithinMeleeRange(me->GetVictim())) + { + DoCastVictim(SPELL_MAGMA_BLAST); + if (!_hasYelledMagmaBurst) { - DoCastVictim(SPELL_MAGMA_BLAST); - if (!_hasYelledMagmaBurst) - { - Talk(SAY_MAGMABURST); - _hasYelledMagmaBurst = true; - } + Talk(SAY_MAGMABURST); + _hasYelledMagmaBurst = true; } - events.ScheduleEvent(EVENT_MAGMA_BLAST, 2500); - break; - case EVENT_SUBMERGE: + } + events.ScheduleEvent(EVENT_MAGMA_BLAST, 2500); + break; + case EVENT_SUBMERGE: { if (!_isBanished) { @@ -273,60 +273,60 @@ class boss_ragnaros : public CreatureScript events.ScheduleEvent(EVENT_SUBMERGE, 180000); break; } - default: - break; - } + default: + break; } - - DoMeleeAttackIfReady(); } + + DoMeleeAttackIfReady(); } - - private: - float const DEATH_ORIENTATION = 4.0f; - uint32 _emergeTimer; - uint8 _introState; - bool _hasYelledMagmaBurst; - bool _hasSubmergedOnce; - bool _isBanished; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); } + + private: + float const DEATH_ORIENTATION = 4.0f; + uint32 _emergeTimer; + uint8 _introState; + bool _hasYelledMagmaBurst; + bool _hasSubmergedOnce; + bool _isBanished; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class npc_son_of_flame : public CreatureScript { - public: - npc_son_of_flame() : CreatureScript("npc_SonOfFlame") { } +public: + npc_son_of_flame() : CreatureScript("npc_SonOfFlame") { } - struct npc_son_of_flameAI : public ScriptedAI + struct npc_son_of_flameAI : public ScriptedAI + { + npc_son_of_flameAI(Creature* creature) : ScriptedAI(creature) { - npc_son_of_flameAI(Creature* creature) : ScriptedAI(creature) - { - instance = me->GetInstanceScript(); - } - - void JustDied(Unit* /*killer*/) override { instance->SetData(DATA_RAGNAROS_ADDS, 1); } - - void UpdateAI(uint32 /*diff*/) override - { - if (!UpdateVictim()) - return; - - DoMeleeAttackIfReady(); - } - - private: - InstanceScript* instance; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + instance = me->GetInstanceScript(); } + + void JustDied(Unit* /*killer*/) override { instance->SetData(DATA_RAGNAROS_ADDS, 1); } + + void UpdateAI(uint32 /*diff*/) override + { + if (!UpdateVictim()) + return; + + DoMeleeAttackIfReady(); + } + + private: + InstanceScript* instance; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; void AddSC_boss_ragnaros() diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_shazzrah.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_shazzrah.cpp index fd04b9645..ddccfc56e 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_shazzrah.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_shazzrah.cpp @@ -31,128 +31,128 @@ enum Events class boss_shazzrah : public CreatureScript { - public: - boss_shazzrah() : CreatureScript("boss_shazzrah") { } +public: + boss_shazzrah() : CreatureScript("boss_shazzrah") { } - struct boss_shazzrahAI : public BossAI + struct boss_shazzrahAI : public BossAI + { + boss_shazzrahAI(Creature* creature) : BossAI(creature, BOSS_SHAZZRAH) { } + + void EnterCombat(Unit* target) { - boss_shazzrahAI(Creature* creature) : BossAI(creature, BOSS_SHAZZRAH) { } - - void EnterCombat(Unit* target) - { - BossAI::EnterCombat(target); - events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, 6000); - events.ScheduleEvent(EVENT_SHAZZRAH_CURSE, 10000); - events.ScheduleEvent(EVENT_MAGIC_GROUNDING, 24000); - events.ScheduleEvent(EVENT_COUNTERSPELL, 15000); - events.ScheduleEvent(EVENT_SHAZZRAH_GATE, 45000); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_ARCANE_EXPLOSION: - DoCastVictim(SPELL_ARCANE_EXPLOSION); - events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, urand(4000, 7000)); - break; - // Triggered subsequent to using "Gate of Shazzrah". - case EVENT_ARCANE_EXPLOSION_TRIGGERED: - DoCastVictim(SPELL_ARCANE_EXPLOSION); - break; - case EVENT_SHAZZRAH_CURSE: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_SHAZZRAH_CURSE)) - DoCast(target, SPELL_SHAZZRAH_CURSE); - events.ScheduleEvent(EVENT_SHAZZRAH_CURSE, urand(25000, 30000)); - break; - case EVENT_MAGIC_GROUNDING: - DoCast(me, SPELL_MAGIC_GROUNDING); - events.ScheduleEvent(EVENT_MAGIC_GROUNDING, 35000); - break; - case EVENT_COUNTERSPELL: - DoCastVictim(SPELL_COUNTERSPELL); - events.ScheduleEvent(EVENT_COUNTERSPELL, urand(16000, 20000)); - break; - case EVENT_SHAZZRAH_GATE: - DoResetThreat(); - DoCastAOE(SPELL_SHAZZRAH_GATE_DUMMY); - events.ScheduleEvent(EVENT_ARCANE_EXPLOSION_TRIGGERED, 2000); - events.RescheduleEvent(EVENT_ARCANE_EXPLOSION, urand(3000, 6000)); - events.ScheduleEvent(EVENT_SHAZZRAH_GATE, 45000); - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_shazzrahAI(creature); + BossAI::EnterCombat(target); + events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, 6000); + events.ScheduleEvent(EVENT_SHAZZRAH_CURSE, 10000); + events.ScheduleEvent(EVENT_MAGIC_GROUNDING, 24000); + events.ScheduleEvent(EVENT_COUNTERSPELL, 15000); + events.ScheduleEvent(EVENT_SHAZZRAH_GATE, 45000); } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_ARCANE_EXPLOSION: + DoCastVictim(SPELL_ARCANE_EXPLOSION); + events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, urand(4000, 7000)); + break; + // Triggered subsequent to using "Gate of Shazzrah". + case EVENT_ARCANE_EXPLOSION_TRIGGERED: + DoCastVictim(SPELL_ARCANE_EXPLOSION); + break; + case EVENT_SHAZZRAH_CURSE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_SHAZZRAH_CURSE)) + DoCast(target, SPELL_SHAZZRAH_CURSE); + events.ScheduleEvent(EVENT_SHAZZRAH_CURSE, urand(25000, 30000)); + break; + case EVENT_MAGIC_GROUNDING: + DoCast(me, SPELL_MAGIC_GROUNDING); + events.ScheduleEvent(EVENT_MAGIC_GROUNDING, 35000); + break; + case EVENT_COUNTERSPELL: + DoCastVictim(SPELL_COUNTERSPELL); + events.ScheduleEvent(EVENT_COUNTERSPELL, urand(16000, 20000)); + break; + case EVENT_SHAZZRAH_GATE: + DoResetThreat(); + DoCastAOE(SPELL_SHAZZRAH_GATE_DUMMY); + events.ScheduleEvent(EVENT_ARCANE_EXPLOSION_TRIGGERED, 2000); + events.RescheduleEvent(EVENT_ARCANE_EXPLOSION, urand(3000, 6000)); + events.ScheduleEvent(EVENT_SHAZZRAH_GATE, 45000); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_shazzrahAI(creature); + } }; // 23138 - Gate of Shazzrah class spell_shazzrah_gate_dummy : public SpellScriptLoader { - public: - spell_shazzrah_gate_dummy() : SpellScriptLoader("spell_shazzrah_gate_dummy") { } +public: + spell_shazzrah_gate_dummy() : SpellScriptLoader("spell_shazzrah_gate_dummy") { } - class spell_shazzrah_gate_dummy_SpellScript : public SpellScript + class spell_shazzrah_gate_dummy_SpellScript : public SpellScript + { + PrepareSpellScript(spell_shazzrah_gate_dummy_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_shazzrah_gate_dummy_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_SHAZZRAH_GATE)) - return false; - return true; - } - - void FilterTargets(std::list& targets) - { - if (targets.empty()) - return; - - WorldObject* target = acore::Containers::SelectRandomContainerElement(targets); - targets.clear(); - targets.push_back(target); - } - - void HandleScript(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - { - target->CastSpell(GetCaster(), SPELL_SHAZZRAH_GATE, true); - if (Creature* creature = GetCaster()->ToCreature()) - creature->AI()->AttackStart(target); // Attack the target which caster will teleport to. - } - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_shazzrah_gate_dummy_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - OnEffectHitTarget += SpellEffectFn(spell_shazzrah_gate_dummy_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_shazzrah_gate_dummy_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_SHAZZRAH_GATE)) + return false; + return true; } + + void FilterTargets(std::list& targets) + { + if (targets.empty()) + return; + + WorldObject* target = acore::Containers::SelectRandomContainerElement(targets); + targets.clear(); + targets.push_back(target); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + if (Unit* target = GetHitUnit()) + { + target->CastSpell(GetCaster(), SPELL_SHAZZRAH_GATE, true); + if (Creature* creature = GetCaster()->ToCreature()) + creature->AI()->AttackStart(target); // Attack the target which caster will teleport to. + } + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_shazzrah_gate_dummy_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_shazzrah_gate_dummy_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_shazzrah_gate_dummy_SpellScript(); + } }; void AddSC_boss_shazzrah() diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_sulfuron_harbinger.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_sulfuron_harbinger.cpp index 5c51c813d..0870bd510 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_sulfuron_harbinger.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_sulfuron_harbinger.cpp @@ -46,48 +46,48 @@ enum Events class boss_sulfuron : public CreatureScript { - public: - boss_sulfuron() : CreatureScript("boss_sulfuron") { } +public: + boss_sulfuron() : CreatureScript("boss_sulfuron") { } - struct boss_sulfuronAI : public BossAI + struct boss_sulfuronAI : public BossAI + { + boss_sulfuronAI(Creature* creature) : BossAI(creature, BOSS_SULFURON_HARBINGER) { - boss_sulfuronAI(Creature* creature) : BossAI(creature, BOSS_SULFURON_HARBINGER) + } + + void EnterCombat(Unit* victim) + { + BossAI::EnterCombat(victim); + events.ScheduleEvent(EVENT_DARK_STRIKE, 10000); + events.ScheduleEvent(EVENT_DEMORALIZING_SHOUT, 15000); + events.ScheduleEvent(EVENT_INSPIRE, 13000); + events.ScheduleEvent(EVENT_KNOCKDOWN, 6000); + events.ScheduleEvent(EVENT_FLAMESPEAR, 2000); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) { - } - - void EnterCombat(Unit* victim) - { - BossAI::EnterCombat(victim); - events.ScheduleEvent(EVENT_DARK_STRIKE, 10000); - events.ScheduleEvent(EVENT_DEMORALIZING_SHOUT, 15000); - events.ScheduleEvent(EVENT_INSPIRE, 13000); - events.ScheduleEvent(EVENT_KNOCKDOWN, 6000); - events.ScheduleEvent(EVENT_FLAMESPEAR, 2000); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) + switch (eventId) { - switch (eventId) - { - case EVENT_DARK_STRIKE: - DoCast(me, SPELL_DARK_STRIKE); - events.ScheduleEvent(EVENT_DARK_STRIKE, urand(15000, 18000)); - break; - case EVENT_DEMORALIZING_SHOUT: - DoCastVictim(SPELL_DEMORALIZING_SHOUT); - events.ScheduleEvent(EVENT_DEMORALIZING_SHOUT, urand(15000, 20000)); - break; - case EVENT_INSPIRE: + case EVENT_DARK_STRIKE: + DoCast(me, SPELL_DARK_STRIKE); + events.ScheduleEvent(EVENT_DARK_STRIKE, urand(15000, 18000)); + break; + case EVENT_DEMORALIZING_SHOUT: + DoCastVictim(SPELL_DEMORALIZING_SHOUT); + events.ScheduleEvent(EVENT_DEMORALIZING_SHOUT, urand(15000, 20000)); + break; + case EVENT_INSPIRE: { std::list healers = DoFindFriendlyMissingBuff(45.0f, SPELL_INSPIRE); if (!healers.empty()) @@ -97,104 +97,104 @@ class boss_sulfuron : public CreatureScript events.ScheduleEvent(EVENT_INSPIRE, urand(20000, 26000)); break; } - case EVENT_KNOCKDOWN: - DoCastVictim(SPELL_KNOCKDOWN); - events.ScheduleEvent(EVENT_KNOCKDOWN, urand(12000, 15000)); - break; - case EVENT_FLAMESPEAR: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) - DoCast(target, SPELL_FLAMESPEAR); - events.ScheduleEvent(EVENT_FLAMESPEAR, urand(12000, 16000)); - break; - default: - break; - } + case EVENT_KNOCKDOWN: + DoCastVictim(SPELL_KNOCKDOWN); + events.ScheduleEvent(EVENT_KNOCKDOWN, urand(12000, 15000)); + break; + case EVENT_FLAMESPEAR: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) + DoCast(target, SPELL_FLAMESPEAR); + events.ScheduleEvent(EVENT_FLAMESPEAR, urand(12000, 16000)); + break; + default: + break; } - - DoMeleeAttackIfReady(); } - }; - CreatureAI* GetAI(Creature* creature) const - { - return new boss_sulfuronAI(creature); + DoMeleeAttackIfReady(); } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_sulfuronAI(creature); + } }; class npc_flamewaker_priest : public CreatureScript { - public: - npc_flamewaker_priest() : CreatureScript("npc_flamewaker_priest") { } +public: + npc_flamewaker_priest() : CreatureScript("npc_flamewaker_priest") { } - struct npc_flamewaker_priestAI : public ScriptedAI + struct npc_flamewaker_priestAI : public ScriptedAI + { + npc_flamewaker_priestAI(Creature* creature) : ScriptedAI(creature) { - npc_flamewaker_priestAI(Creature* creature) : ScriptedAI(creature) - { - } - - void Reset() - { - events.Reset(); - } - - void JustDied(Unit* /*killer*/) - { - events.Reset(); - } - - void EnterCombat(Unit* victim) - { - ScriptedAI::EnterCombat(victim); - events.ScheduleEvent(EVENT_HEAL, urand(15000, 30000)); - events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 2000); - events.ScheduleEvent(EVENT_IMMOLATE, 8000); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_HEAL: - if (Unit* target = DoSelectLowestHpFriendly(60.0f, 1)) - DoCast(target, SPELL_HEAL); - events.ScheduleEvent(EVENT_HEAL, urand(15000, 20000)); - break; - case EVENT_SHADOW_WORD_PAIN: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_SHADOWWORDPAIN)) - DoCast(target, SPELL_SHADOWWORDPAIN); - events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, urand(18000, 26000)); - break; - case EVENT_IMMOLATE: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_IMMOLATE)) - DoCast(target, SPELL_IMMOLATE); - events.ScheduleEvent(EVENT_IMMOLATE, urand(15000, 25000)); - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); - } - - private: - EventMap events; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_flamewaker_priestAI(creature); } + + void Reset() + { + events.Reset(); + } + + void JustDied(Unit* /*killer*/) + { + events.Reset(); + } + + void EnterCombat(Unit* victim) + { + ScriptedAI::EnterCombat(victim); + events.ScheduleEvent(EVENT_HEAL, urand(15000, 30000)); + events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 2000); + events.ScheduleEvent(EVENT_IMMOLATE, 8000); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_HEAL: + if (Unit* target = DoSelectLowestHpFriendly(60.0f, 1)) + DoCast(target, SPELL_HEAL); + events.ScheduleEvent(EVENT_HEAL, urand(15000, 20000)); + break; + case EVENT_SHADOW_WORD_PAIN: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_SHADOWWORDPAIN)) + DoCast(target, SPELL_SHADOWWORDPAIN); + events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, urand(18000, 26000)); + break; + case EVENT_IMMOLATE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_IMMOLATE)) + DoCast(target, SPELL_IMMOLATE); + events.ScheduleEvent(EVENT_IMMOLATE, urand(15000, 25000)); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + + private: + EventMap events; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_flamewaker_priestAI(creature); + } }; void AddSC_boss_sulfuron() diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/instance_molten_core.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/instance_molten_core.cpp index bb051648b..e4b47f2df 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/instance_molten_core.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/instance_molten_core.cpp @@ -34,219 +34,220 @@ Position const SummonPositions[10] = class instance_molten_core : public InstanceMapScript { - public: - instance_molten_core() : InstanceMapScript("instance_molten_core", 409) { } +public: + instance_molten_core() : InstanceMapScript("instance_molten_core", 409) { } - struct instance_molten_core_InstanceMapScript : public InstanceScript + struct instance_molten_core_InstanceMapScript : public InstanceScript + { + instance_molten_core_InstanceMapScript(Map* map) : InstanceScript(map) { - instance_molten_core_InstanceMapScript(Map* map) : InstanceScript(map) + SetBossNumber(MAX_ENCOUNTER); + _golemaggTheIncineratorGUID = 0; + _majordomoExecutusGUID = 0; + _cacheOfTheFirelordGUID = 0; + _deadBossCount = 0; + _ragnarosAddDeaths = 0; + } + + void OnPlayerEnter(Player* /*player*/) override + { + if (CheckMajordomoExecutus()) + SummonMajordomoExecutus(); + } + + void OnCreatureCreate(Creature* creature) override + { + switch (creature->GetEntry()) { - SetBossNumber(MAX_ENCOUNTER); - _golemaggTheIncineratorGUID = 0; - _majordomoExecutusGUID = 0; - _cacheOfTheFirelordGUID = 0; - _deadBossCount = 0; - _ragnarosAddDeaths = 0; + case NPC_GOLEMAGG_THE_INCINERATOR: + _golemaggTheIncineratorGUID = creature->GetGUID(); + break; + case NPC_MAJORDOMO_EXECUTUS: + _majordomoExecutusGUID = creature->GetGUID(); + break; + default: + break; + } + } + + void OnGameObjectCreate(GameObject* go) override + { + switch (go->GetEntry()) + { + case GO_CACHE_OF_THE_FIRELORD: + _cacheOfTheFirelordGUID = go->GetGUID(); + break; + case GO_CIRCLE_BARON: + _circlesGUIDs[5] = go->GetGUID(); + break; + case GO_CIRCLE_GARR: + _circlesGUIDs[3] = go->GetGUID(); + break; + case GO_CIRCLE_GEHENNAS: + _circlesGUIDs[2] = go->GetGUID(); + break; + case GO_CIRCLE_GOLEMAGG: + _circlesGUIDs[7] = go->GetGUID(); + break; + case GO_CIRCLE_MAGMADAR: + _circlesGUIDs[1] = go->GetGUID(); + break; + case GO_CIRCLE_SHAZZRAH: + _circlesGUIDs[4] = go->GetGUID(); + break; + case GO_CIRCLE_SULFURON: + _circlesGUIDs[6] = go->GetGUID(); + break; + default: + break; + } + } + + void SetData(uint32 type, uint32 data) override + { + if (type == DATA_RAGNAROS_ADDS) + { + if (data == 1) + ++_ragnarosAddDeaths; + else if (data == 0) + _ragnarosAddDeaths = 0; + } + } + + uint32 GetData(uint32 type) const override + { + switch (type) + { + case DATA_RAGNAROS_ADDS: + return _ragnarosAddDeaths; } - void OnPlayerEnter(Player* /*player*/) override + return 0; + } + + uint64 GetData64(uint32 type) const override + { + switch (type) { + case BOSS_GOLEMAGG_THE_INCINERATOR: + return _golemaggTheIncineratorGUID; + case BOSS_MAJORDOMO_EXECUTUS: + return _majordomoExecutusGUID; + } + + return 0; + } + + bool SetBossState(uint32 bossId, EncounterState state) override + { + if (!InstanceScript::SetBossState(bossId, state)) + return false; + + if (state == DONE && bossId < BOSS_MAJORDOMO_EXECUTUS) + if (CheckMajordomoExecutus()) + SummonMajordomoExecutus(); + + if (bossId == BOSS_MAJORDOMO_EXECUTUS && state == DONE) + { + DoRespawnGameObject(_cacheOfTheFirelordGUID, 7 * DAY); + } + + return true; + } + + void SummonMajordomoExecutus() + { + if (_majordomoExecutusGUID) + return; + + if (GetBossState(BOSS_MAJORDOMO_EXECUTUS) != DONE) + { + instance->SummonCreature(NPC_MAJORDOMO_EXECUTUS, SummonPositions[0]); + instance->SummonCreature(NPC_FLAMEWAKER_HEALER, SummonPositions[1]); + instance->SummonCreature(NPC_FLAMEWAKER_HEALER, SummonPositions[2]); + instance->SummonCreature(NPC_FLAMEWAKER_HEALER, SummonPositions[3]); + instance->SummonCreature(NPC_FLAMEWAKER_HEALER, SummonPositions[4]); + instance->SummonCreature(NPC_FLAMEWAKER_ELITE, SummonPositions[5]); + instance->SummonCreature(NPC_FLAMEWAKER_ELITE, SummonPositions[6]); + instance->SummonCreature(NPC_FLAMEWAKER_ELITE, SummonPositions[7]); + instance->SummonCreature(NPC_FLAMEWAKER_ELITE, SummonPositions[8]); + } + else if (TempSummon* summon = instance->SummonCreature(NPC_MAJORDOMO_EXECUTUS, RagnarosTelePos)) + summon->AI()->DoAction(ACTION_START_RAGNAROS_ALT); + } + + bool CheckMajordomoExecutus() const + { + if (GetBossState(BOSS_RAGNAROS) == DONE) + return false; + + for (uint8 i = 0; i < BOSS_MAJORDOMO_EXECUTUS; ++i) + if (GetBossState(i) != DONE) + return false; + + return true; + } + + std::string GetSaveData() override + { + OUT_SAVE_INST_DATA; + + std::ostringstream saveStream; + saveStream << "M C " << GetBossSaveData(); + + OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); + } + + void Load(char const* data) override + { + if (!data) + { + OUT_LOAD_INST_DATA_FAIL; + return; + } + + OUT_LOAD_INST_DATA(data); + + char dataHead1, dataHead2; + + std::istringstream loadStream(data); + loadStream >> dataHead1 >> dataHead2; + + if (dataHead1 == 'M' && dataHead2 == 'C') + { + for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) + { + uint32 tmpState; + loadStream >> tmpState; + if (tmpState == IN_PROGRESS || tmpState > TO_BE_DECIDED) + tmpState = NOT_STARTED; + + SetBossState(i, EncounterState(tmpState)); + } + if (CheckMajordomoExecutus()) SummonMajordomoExecutus(); } + else + OUT_LOAD_INST_DATA_FAIL; - void OnCreatureCreate(Creature* creature) override - { - switch (creature->GetEntry()) - { - case NPC_GOLEMAGG_THE_INCINERATOR: - _golemaggTheIncineratorGUID = creature->GetGUID(); - break; - case NPC_MAJORDOMO_EXECUTUS: - _majordomoExecutusGUID = creature->GetGUID(); - break; - default: - break; - } - } - - void OnGameObjectCreate(GameObject* go) override - { - switch (go->GetEntry()) - { - case GO_CACHE_OF_THE_FIRELORD: - _cacheOfTheFirelordGUID = go->GetGUID(); - break; - case GO_CIRCLE_BARON: - _circlesGUIDs[5] = go->GetGUID(); - break; - case GO_CIRCLE_GARR: - _circlesGUIDs[3] = go->GetGUID(); - break; - case GO_CIRCLE_GEHENNAS: - _circlesGUIDs[2] = go->GetGUID(); - break; - case GO_CIRCLE_GOLEMAGG: - _circlesGUIDs[7] = go->GetGUID(); - break; - case GO_CIRCLE_MAGMADAR: - _circlesGUIDs[1] = go->GetGUID(); - break; - case GO_CIRCLE_SHAZZRAH: - _circlesGUIDs[4] = go->GetGUID(); - break; - case GO_CIRCLE_SULFURON: - _circlesGUIDs[6] = go->GetGUID(); - break; - default: - break; - } - } - - void SetData(uint32 type, uint32 data) override - { - if (type == DATA_RAGNAROS_ADDS) - { - if (data == 1) - ++_ragnarosAddDeaths; - else if (data == 0) - _ragnarosAddDeaths = 0; - } - } - - uint32 GetData(uint32 type) const override - { - switch (type) - { - case DATA_RAGNAROS_ADDS: - return _ragnarosAddDeaths; - } - - return 0; - } - - uint64 GetData64(uint32 type) const override - { - switch (type) - { - case BOSS_GOLEMAGG_THE_INCINERATOR: - return _golemaggTheIncineratorGUID; - case BOSS_MAJORDOMO_EXECUTUS: - return _majordomoExecutusGUID; - } - - return 0; - } - - bool SetBossState(uint32 bossId, EncounterState state) override - { - if (!InstanceScript::SetBossState(bossId, state)) - return false; - - if (state == DONE && bossId < BOSS_MAJORDOMO_EXECUTUS) - if (CheckMajordomoExecutus()) - SummonMajordomoExecutus(); - - if (bossId == BOSS_MAJORDOMO_EXECUTUS && state == DONE) { - DoRespawnGameObject(_cacheOfTheFirelordGUID, 7 * DAY); - } - - return true; - } - - void SummonMajordomoExecutus() - { - if (_majordomoExecutusGUID) - return; - - if (GetBossState(BOSS_MAJORDOMO_EXECUTUS) != DONE) - { - instance->SummonCreature(NPC_MAJORDOMO_EXECUTUS, SummonPositions[0]); - instance->SummonCreature(NPC_FLAMEWAKER_HEALER, SummonPositions[1]); - instance->SummonCreature(NPC_FLAMEWAKER_HEALER, SummonPositions[2]); - instance->SummonCreature(NPC_FLAMEWAKER_HEALER, SummonPositions[3]); - instance->SummonCreature(NPC_FLAMEWAKER_HEALER, SummonPositions[4]); - instance->SummonCreature(NPC_FLAMEWAKER_ELITE, SummonPositions[5]); - instance->SummonCreature(NPC_FLAMEWAKER_ELITE, SummonPositions[6]); - instance->SummonCreature(NPC_FLAMEWAKER_ELITE, SummonPositions[7]); - instance->SummonCreature(NPC_FLAMEWAKER_ELITE, SummonPositions[8]); - } - else if (TempSummon* summon = instance->SummonCreature(NPC_MAJORDOMO_EXECUTUS, RagnarosTelePos)) - summon->AI()->DoAction(ACTION_START_RAGNAROS_ALT); - } - - bool CheckMajordomoExecutus() const - { - if (GetBossState(BOSS_RAGNAROS) == DONE) - return false; - - for (uint8 i = 0; i < BOSS_MAJORDOMO_EXECUTUS; ++i) - if (GetBossState(i) != DONE) - return false; - - return true; - } - - std::string GetSaveData() override - { - OUT_SAVE_INST_DATA; - - std::ostringstream saveStream; - saveStream << "M C " << GetBossSaveData(); - - OUT_SAVE_INST_DATA_COMPLETE; - return saveStream.str(); - } - - void Load(char const* data) override - { - if (!data) - { - OUT_LOAD_INST_DATA_FAIL; - return; - } - - OUT_LOAD_INST_DATA(data); - - char dataHead1, dataHead2; - - std::istringstream loadStream(data); - loadStream >> dataHead1 >> dataHead2; - - if (dataHead1 == 'M' && dataHead2 == 'C') - { - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - { - uint32 tmpState; - loadStream >> tmpState; - if (tmpState == IN_PROGRESS || tmpState > TO_BE_DECIDED) - tmpState = NOT_STARTED; - - SetBossState(i, EncounterState(tmpState)); - } - - if (CheckMajordomoExecutus()) - SummonMajordomoExecutus(); - } - else - OUT_LOAD_INST_DATA_FAIL; - - OUT_LOAD_INST_DATA_COMPLETE; - } - - private: - uint64 _golemaggTheIncineratorGUID; - uint64 _majordomoExecutusGUID; - uint64 _cacheOfTheFirelordGUID; - uint8 _deadBossCount; - uint8 _ragnarosAddDeaths; - std::unordered_map _circlesGUIDs; - }; - - InstanceScript* GetInstanceScript(InstanceMap* map) const - { - return new instance_molten_core_InstanceMapScript(map); + OUT_LOAD_INST_DATA_COMPLETE; } + + private: + uint64 _golemaggTheIncineratorGUID; + uint64 _majordomoExecutusGUID; + uint64 _cacheOfTheFirelordGUID; + uint8 _deadBossCount; + uint8 _ragnarosAddDeaths; + std::unordered_map _circlesGUIDs; + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_molten_core_InstanceMapScript(map); + } }; void AddSC_instance_molten_core() diff --git a/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp b/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp index 6f27e7b7d..3607856a7 100644 --- a/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp +++ b/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp @@ -28,124 +28,124 @@ enum Spels class boss_mr_smite : public CreatureScript { - public: - boss_mr_smite() : CreatureScript("boss_mr_smite") { } +public: + boss_mr_smite() : CreatureScript("boss_mr_smite") { } - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } + + struct boss_mr_smiteAI : public ScriptedAI + { + boss_mr_smiteAI(Creature* creature) : ScriptedAI(creature) { - return GetInstanceAI(creature); } - struct boss_mr_smiteAI : public ScriptedAI + EventMap events; + bool health67; + bool health34; + + void Reset() { - boss_mr_smiteAI(Creature* creature) : ScriptedAI(creature) + health67 = false; + health34 = false; + me->LoadEquipment(EQUIP_SWORD); + me->SetCanDualWield(false); + me->SetStandState(UNIT_STAND_STATE_STAND); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED); + me->SetReactState(REACT_AGGRESSIVE); + } + + void EnterCombat(Unit* /*who*/) + { + events.ScheduleEvent(EVENT_CHECK_HEALTH1, 500); + events.ScheduleEvent(EVENT_CHECK_HEALTH2, 500); + events.ScheduleEvent(EVENT_SMITE_SLAM, 3000); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + switch (events.ExecuteEvent()) { + case EVENT_SMITE_SLAM: + me->CastSpell(me->GetVictim(), SPELL_SMITE_SLAM, false); + events.ScheduleEvent(EVENT_SMITE_SLAM, 15000); + break; + case EVENT_CHECK_HEALTH1: + if (me->HealthBelowPct(67) && !health67) + { + me->CastSpell(me, SPELL_SMITE_STOMP, false); + events.DelayEvents(10000); + me->GetMotionMaster()->Clear(); + me->GetMotionMaster()->MovePoint(EQUIP_TWO_SWORDS, 1.859f, -780.72f, 9.831f); + Talk(SAY_SWAP1); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED); + me->SetReactState(REACT_PASSIVE); + health67 = true; + break; + } + events.ScheduleEvent(EVENT_CHECK_HEALTH1, 500); + break; + case EVENT_CHECK_HEALTH2: + if (me->HealthBelowPct(34) && !health34) + { + me->CastSpell(me, SPELL_SMITE_STOMP, false); + events.DelayEvents(10000); + me->GetMotionMaster()->Clear(); + me->GetMotionMaster()->MovePoint(EQUIP_MACE, 1.859f, -780.72f, 9.831f); + Talk(SAY_SWAP2); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED); + me->SetReactState(REACT_PASSIVE); + health34 = true; + break; + } + events.ScheduleEvent(EVENT_CHECK_HEALTH2, 500); + break; + case EVENT_SWAP_WEAPON1: + me->LoadEquipment(EQUIP_TWO_SWORDS); + me->SetCanDualWield(true); + break; + case EVENT_SWAP_WEAPON2: + me->LoadEquipment(EQUIP_MACE); + me->SetCanDualWield(false); + break; + case EVENT_RESTORE_COMBAT: + me->SetReactState(REACT_AGGRESSIVE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED); + me->SetStandState(UNIT_STAND_STATE_STAND); + if (me->GetVictim()) + { + me->GetMotionMaster()->MoveChase(me->GetVictim()); + me->SetTarget(me->GetVictim()->GetGUID()); + } + break; + case EVENT_KNEEL: + me->SendMeleeAttackStop(me->GetVictim()); + me->SetStandState(UNIT_STAND_STATE_KNEEL); + break; } - EventMap events; - bool health67; - bool health34; + DoMeleeAttackIfReady(); + } - void Reset() - { - health67 = false; - health34 = false; - me->LoadEquipment(EQUIP_SWORD); - me->SetCanDualWield(false); - me->SetStandState(UNIT_STAND_STATE_STAND); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED); - me->SetReactState(REACT_AGGRESSIVE); - } + void MovementInform(uint32 type, uint32 point) + { + if (type != POINT_MOTION_TYPE) + return; - void EnterCombat(Unit* /*who*/) - { - events.ScheduleEvent(EVENT_CHECK_HEALTH1, 500); - events.ScheduleEvent(EVENT_CHECK_HEALTH2, 500); - events.ScheduleEvent(EVENT_SMITE_SLAM, 3000); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - switch (events.ExecuteEvent()) - { - case EVENT_SMITE_SLAM: - me->CastSpell(me->GetVictim(), SPELL_SMITE_SLAM, false); - events.ScheduleEvent(EVENT_SMITE_SLAM, 15000); - break; - case EVENT_CHECK_HEALTH1: - if (me->HealthBelowPct(67) && !health67) - { - me->CastSpell(me, SPELL_SMITE_STOMP, false); - events.DelayEvents(10000); - me->GetMotionMaster()->Clear(); - me->GetMotionMaster()->MovePoint(EQUIP_TWO_SWORDS, 1.859f, -780.72f, 9.831f); - Talk(SAY_SWAP1); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED); - me->SetReactState(REACT_PASSIVE); - health67 = true; - break; - } - events.ScheduleEvent(EVENT_CHECK_HEALTH1, 500); - break; - case EVENT_CHECK_HEALTH2: - if (me->HealthBelowPct(34) && !health34) - { - me->CastSpell(me, SPELL_SMITE_STOMP, false); - events.DelayEvents(10000); - me->GetMotionMaster()->Clear(); - me->GetMotionMaster()->MovePoint(EQUIP_MACE, 1.859f, -780.72f, 9.831f); - Talk(SAY_SWAP2); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED); - me->SetReactState(REACT_PASSIVE); - health34 = true; - break; - } - events.ScheduleEvent(EVENT_CHECK_HEALTH2, 500); - break; - case EVENT_SWAP_WEAPON1: - me->LoadEquipment(EQUIP_TWO_SWORDS); - me->SetCanDualWield(true); - break; - case EVENT_SWAP_WEAPON2: - me->LoadEquipment(EQUIP_MACE); - me->SetCanDualWield(false); - break; - case EVENT_RESTORE_COMBAT: - me->SetReactState(REACT_AGGRESSIVE); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED); - me->SetStandState(UNIT_STAND_STATE_STAND); - if (me->GetVictim()) - { - me->GetMotionMaster()->MoveChase(me->GetVictim()); - me->SetTarget(me->GetVictim()->GetGUID()); - } - break; - case EVENT_KNEEL: - me->SendMeleeAttackStop(me->GetVictim()); - me->SetStandState(UNIT_STAND_STATE_KNEEL); - break; - } - - DoMeleeAttackIfReady(); - } - - void MovementInform(uint32 type, uint32 point) - { - if (type != POINT_MOTION_TYPE) - return; - - me->SetTarget(0); - me->SetFacingTo(5.558f); - me->SetStandState(UNIT_STAND_STATE_KNEEL); - events.ScheduleEvent(point == EQUIP_TWO_SWORDS ? EVENT_SWAP_WEAPON1 : EVENT_SWAP_WEAPON2, 1500); - events.ScheduleEvent(EVENT_RESTORE_COMBAT, 3000); - events.ScheduleEvent(EVENT_KNEEL, 0); - } - }; + me->SetTarget(0); + me->SetFacingTo(5.558f); + me->SetStandState(UNIT_STAND_STATE_KNEEL); + events.ScheduleEvent(point == EQUIP_TWO_SWORDS ? EVENT_SWAP_WEAPON1 : EVENT_SWAP_WEAPON2, 1500); + events.ScheduleEvent(EVENT_RESTORE_COMBAT, 3000); + events.ScheduleEvent(EVENT_KNEEL, 0); + } + }; }; void AddSC_boss_mr_smite() diff --git a/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp b/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp index 3639208ba..feface843 100644 --- a/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp +++ b/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp @@ -8,83 +8,83 @@ class instance_deadmines : public InstanceMapScript { - public: - instance_deadmines() : InstanceMapScript("instance_deadmines", 36) { } +public: + instance_deadmines() : InstanceMapScript("instance_deadmines", 36) { } - struct instance_deadmines_InstanceMapScript : public InstanceScript + struct instance_deadmines_InstanceMapScript : public InstanceScript + { + instance_deadmines_InstanceMapScript(Map* map) : InstanceScript(map) { - instance_deadmines_InstanceMapScript(Map* map) : InstanceScript(map) - { - } - - void Initialize() - { - memset(&_encounters, 0, sizeof(_encounters)); - } - - void OnGameObjectCreate(GameObject* gameobject) - { - switch (gameobject->GetEntry()) - { - case GO_FACTORY_DOOR: - if (_encounters[TYPE_RHAHK_ZOR] == DONE) - gameobject->SetGoState(GO_STATE_ACTIVE); - break; - case GO_IRON_CLAD_DOOR: - if (_encounters[TYPE_CANNON] == DONE) - HandleGameObject(0, true, gameobject); - break; - } - } - - void SetData(uint32 type, uint32 data) - { - switch (type) - { - case TYPE_RHAHK_ZOR: - case TYPE_CANNON: - _encounters[type] = data; - break; - } - - if (data == DONE) - SaveToDB(); - } - - std::string GetSaveData() - { - std::ostringstream saveStream; - saveStream << "D E " << _encounters[0] << ' ' << _encounters[1]; - return saveStream.str(); - } - - void Load(const char* in) - { - if (!in) - return; - - char dataHead1, dataHead2; - std::istringstream loadStream(in); - loadStream >> dataHead1 >> dataHead2; - if (dataHead1 == 'D' && dataHead2 == 'E') - { - for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) - { - loadStream >> _encounters[i]; - if (_encounters[i] == IN_PROGRESS) - _encounters[i] = NOT_STARTED; - } - } - } - - private: - uint32 _encounters[MAX_ENCOUNTERS]; - }; - - InstanceScript* GetInstanceScript(InstanceMap* map) const - { - return new instance_deadmines_InstanceMapScript(map); } + + void Initialize() + { + memset(&_encounters, 0, sizeof(_encounters)); + } + + void OnGameObjectCreate(GameObject* gameobject) + { + switch (gameobject->GetEntry()) + { + case GO_FACTORY_DOOR: + if (_encounters[TYPE_RHAHK_ZOR] == DONE) + gameobject->SetGoState(GO_STATE_ACTIVE); + break; + case GO_IRON_CLAD_DOOR: + if (_encounters[TYPE_CANNON] == DONE) + HandleGameObject(0, true, gameobject); + break; + } + } + + void SetData(uint32 type, uint32 data) + { + switch (type) + { + case TYPE_RHAHK_ZOR: + case TYPE_CANNON: + _encounters[type] = data; + break; + } + + if (data == DONE) + SaveToDB(); + } + + std::string GetSaveData() + { + std::ostringstream saveStream; + saveStream << "D E " << _encounters[0] << ' ' << _encounters[1]; + return saveStream.str(); + } + + void Load(const char* in) + { + if (!in) + return; + + char dataHead1, dataHead2; + std::istringstream loadStream(in); + loadStream >> dataHead1 >> dataHead2; + if (dataHead1 == 'D' && dataHead2 == 'E') + { + for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) + { + loadStream >> _encounters[i]; + if (_encounters[i] == IN_PROGRESS) + _encounters[i] = NOT_STARTED; + } + } + } + + private: + uint32 _encounters[MAX_ENCOUNTERS]; + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_deadmines_InstanceMapScript(map); + } }; void AddSC_instance_deadmines() diff --git a/src/server/scripts/EasternKingdoms/Gnomeregan/instance_gnomeregan.cpp b/src/server/scripts/EasternKingdoms/Gnomeregan/instance_gnomeregan.cpp index ffee0f19c..0b7a358b2 100644 --- a/src/server/scripts/EasternKingdoms/Gnomeregan/instance_gnomeregan.cpp +++ b/src/server/scripts/EasternKingdoms/Gnomeregan/instance_gnomeregan.cpp @@ -10,20 +10,20 @@ class instance_gnomeregan : public InstanceMapScript { - public: - instance_gnomeregan() : InstanceMapScript("instance_gnomeregan", 90) { } +public: + instance_gnomeregan() : InstanceMapScript("instance_gnomeregan", 90) { } - InstanceScript* GetInstanceScript(InstanceMap* map) const + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_gnomeregan_InstanceMapScript(map); + } + + struct instance_gnomeregan_InstanceMapScript : public InstanceScript + { + instance_gnomeregan_InstanceMapScript(Map* map) : InstanceScript(map) { - return new instance_gnomeregan_InstanceMapScript(map); } - - struct instance_gnomeregan_InstanceMapScript : public InstanceScript - { - instance_gnomeregan_InstanceMapScript(Map* map) : InstanceScript(map) - { - } - }; + }; }; enum eKernobee @@ -33,83 +33,83 @@ enum eKernobee class npc_kernobee : public CreatureScript { - public: - npc_kernobee() : CreatureScript("npc_kernobee") { } +public: + npc_kernobee() : CreatureScript("npc_kernobee") { } - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const + { + return new npc_kernobeeAI(creature); + } + + bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) + { + if (quest->GetQuestId() == QUEST_A_FINE_MESS) { - return new npc_kernobeeAI(creature); + creature->SetStandState(UNIT_STAND_STATE_STAND); + creature->AI()->SetGUID(player->GetGUID(), 0); + creature->GetMotionMaster()->MoveFollow(player, PET_FOLLOW_DIST, M_PI, MOTION_SLOT_CONTROLLED); + } + return true; + } + + struct npc_kernobeeAI : public PassiveAI + { + npc_kernobeeAI(Creature* creature) : PassiveAI(creature) + { + playerGUID = 0; + checkTimer = 0; } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) + uint32 checkTimer; + uint64 playerGUID; + + void SetGUID(uint64 guid, int32) { - if (quest->GetQuestId() == QUEST_A_FINE_MESS) - { - creature->SetStandState(UNIT_STAND_STATE_STAND); - creature->AI()->SetGUID(player->GetGUID(), 0); - creature->GetMotionMaster()->MoveFollow(player, PET_FOLLOW_DIST, M_PI, MOTION_SLOT_CONTROLLED); - } - return true; + playerGUID = guid; } - struct npc_kernobeeAI : public PassiveAI + void UpdateAI(uint32 diff) { - npc_kernobeeAI(Creature* creature) : PassiveAI(creature) + checkTimer += diff; + if (checkTimer >= 2000) { - playerGUID = 0; checkTimer = 0; - } - - uint32 checkTimer; - uint64 playerGUID; - - void SetGUID(uint64 guid, int32) - { - playerGUID = guid; - } - - void UpdateAI(uint32 diff) - { - checkTimer += diff; - if (checkTimer >= 2000) + if (me->GetDistance(-332.2f, -2.8f, -152.8f) < 5.0f) { - checkTimer = 0; - if (me->GetDistance(-332.2f, -2.8f, -152.8f) < 5.0f) - { - if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) - player->GroupEventHappens(QUEST_A_FINE_MESS, me); - me->DespawnOrUnsummon(1000); - } + if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) + player->GroupEventHappens(QUEST_A_FINE_MESS, me); + me->DespawnOrUnsummon(1000); } } - }; + } + }; }; class spell_gnomeregan_radiation_bolt : public SpellScriptLoader { - public: - spell_gnomeregan_radiation_bolt() : SpellScriptLoader("spell_gnomeregan_radiation_bolt") { } +public: + spell_gnomeregan_radiation_bolt() : SpellScriptLoader("spell_gnomeregan_radiation_bolt") { } - class spell_gnomeregan_radiation_bolt_SpellScript : public SpellScript + class spell_gnomeregan_radiation_bolt_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gnomeregan_radiation_bolt_SpellScript); + + void HandleTriggerSpell(SpellEffIndex effIndex) { - PrepareSpellScript(spell_gnomeregan_radiation_bolt_SpellScript); - - void HandleTriggerSpell(SpellEffIndex effIndex) - { - if (roll_chance_i(80)) - PreventHitDefaultEffect(effIndex); - } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_gnomeregan_radiation_bolt_SpellScript::HandleTriggerSpell, EFFECT_1, SPELL_EFFECT_TRIGGER_SPELL); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gnomeregan_radiation_bolt_SpellScript; + if (roll_chance_i(80)) + PreventHitDefaultEffect(effIndex); } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_gnomeregan_radiation_bolt_SpellScript::HandleTriggerSpell, EFFECT_1, SPELL_EFFECT_TRIGGER_SPELL); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gnomeregan_radiation_bolt_SpellScript; + } }; void AddSC_instance_gnomeregan() diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_curator.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_curator.cpp index 1e5269ba2..be2a68d59 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_curator.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_curator.cpp @@ -35,93 +35,93 @@ enum Curator class boss_curator : public CreatureScript { - public: - boss_curator() : CreatureScript("boss_curator") { } +public: + boss_curator() : CreatureScript("boss_curator") { } - struct boss_curatorAI : public BossAI + struct boss_curatorAI : public BossAI + { + boss_curatorAI(Creature* creature) : BossAI(creature, DATA_CURATOR) { } + + void Reset() { - boss_curatorAI(Creature* creature) : BossAI(creature, DATA_CURATOR) { } + BossAI::Reset(); + me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_ARCANE, true); + me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_PERIODIC_MANA_LEECH, true); + me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_POWER_BURN, true); + me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_POWER_BURN, true); + } - void Reset() + void KilledUnit(Unit* /*victim*/) + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) { - BossAI::Reset(); - me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_ARCANE, true); - me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_PERIODIC_MANA_LEECH, true); - me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_POWER_BURN, true); - me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_POWER_BURN, true); + Talk(SAY_KILL); + events.ScheduleEvent(EVENT_KILL_TALK, 5000); + } + } + + void JustDied(Unit* killer) + { + BossAI::JustDied(killer); + Talk(SAY_DEATH); + } + + void EnterCombat(Unit* who) + { + BossAI::EnterCombat(who); + Talk(SAY_AGGRO); + + events.ScheduleEvent(EVENT_SPELL_HATEFUL_BOLT, 10000); + events.ScheduleEvent(EVENT_SPELL_ASTRAL_FLARE, 6000); + events.ScheduleEvent(EVENT_SPELL_BERSERK, 600000); + events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); + DoZoneInCombat(); + } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + if (Unit* target = summon->SelectNearbyTarget(nullptr, 40.0f)) + { + summon->AI()->AttackStart(target); + summon->AddThreat(target, 1000.0f); } - void KilledUnit(Unit* /*victim*/) + summon->SetInCombatWithZone(); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(SAY_KILL); - events.ScheduleEvent(EVENT_KILL_TALK, 5000); - } - } - - void JustDied(Unit* killer) - { - BossAI::JustDied(killer); - Talk(SAY_DEATH); - } - - void EnterCombat(Unit* who) - { - BossAI::EnterCombat(who); - Talk(SAY_AGGRO); - - events.ScheduleEvent(EVENT_SPELL_HATEFUL_BOLT, 10000); - events.ScheduleEvent(EVENT_SPELL_ASTRAL_FLARE, 6000); - events.ScheduleEvent(EVENT_SPELL_BERSERK, 600000); - events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); - DoZoneInCombat(); - } - - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - if (Unit* target = summon->SelectNearbyTarget(nullptr, 40.0f)) - { - summon->AI()->AttackStart(target); - summon->AddThreat(target, 1000.0f); - } - - summon->SetInCombatWithZone(); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_CHECK_HEALTH: - if (me->HealthBelowPct(16)) - { - events.CancelEvent(EVENT_SPELL_ASTRAL_FLARE); - me->CastSpell(me, SPELL_ARCANE_INFUSION, true); - Talk(SAY_ENRAGE); - break; - } - events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); - break; - case EVENT_SPELL_BERSERK: + case EVENT_CHECK_HEALTH: + if (me->HealthBelowPct(16)) + { + events.CancelEvent(EVENT_SPELL_ASTRAL_FLARE); + me->CastSpell(me, SPELL_ARCANE_INFUSION, true); Talk(SAY_ENRAGE); - me->InterruptNonMeleeSpells(true); - me->CastSpell(me, SPELL_ASTRAL_DECONSTRUCTION, true); break; - case EVENT_SPELL_HATEFUL_BOLT: - if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, urand(1, 2), 40.0f)) - me->CastSpell(target, SPELL_HATEFUL_BOLT, false); - events.ScheduleEvent(EVENT_SPELL_HATEFUL_BOLT, urand(5000, 7500) * (events.GetNextEventTime(EVENT_SPELL_BERSERK) == 0 ? 1 : 2)); - break; - case EVENT_SPELL_ASTRAL_FLARE: + } + events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); + break; + case EVENT_SPELL_BERSERK: + Talk(SAY_ENRAGE); + me->InterruptNonMeleeSpells(true); + me->CastSpell(me, SPELL_ASTRAL_DECONSTRUCTION, true); + break; + case EVENT_SPELL_HATEFUL_BOLT: + if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, urand(1, 2), 40.0f)) + me->CastSpell(target, SPELL_HATEFUL_BOLT, false); + events.ScheduleEvent(EVENT_SPELL_HATEFUL_BOLT, urand(5000, 7500) * (events.GetNextEventTime(EVENT_SPELL_BERSERK) == 0 ? 1 : 2)); + break; + case EVENT_SPELL_ASTRAL_FLARE: { me->CastSpell(me, RAND(SPELL_SUMMON_ASTRAL_FLARE1, SPELL_SUMMON_ASTRAL_FLARE2, SPELL_SUMMON_ASTRAL_FLARE3, SPELL_SUMMON_ASTRAL_FLARE4), false); int32 mana = CalculatePct(me->GetMaxPower(POWER_MANA), 10); @@ -144,16 +144,16 @@ class boss_curator : public CreatureScript break; } - } - - DoMeleeAttackIfReady(); } - }; - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + DoMeleeAttackIfReady(); } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; void AddSC_boss_curator() diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp index 4565ead4f..e14217e8d 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp @@ -28,84 +28,84 @@ enum MaidenOfVirtue class boss_maiden_of_virtue : public CreatureScript { - public: - boss_maiden_of_virtue() : CreatureScript("boss_maiden_of_virtue") { } +public: + boss_maiden_of_virtue() : CreatureScript("boss_maiden_of_virtue") { } - struct boss_maiden_of_virtueAI : public BossAI + struct boss_maiden_of_virtueAI : public BossAI + { + boss_maiden_of_virtueAI(Creature* creature) : BossAI(creature, DATA_MAIDEN) { } + + void Reset() { - boss_maiden_of_virtueAI(Creature* creature) : BossAI(creature, DATA_MAIDEN) { } - - void Reset() - { - BossAI::Reset(); - } - - void KilledUnit(Unit* /*victim*/) - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(SAY_SLAY); - events.ScheduleEvent(EVENT_KILL_TALK, 5000); - } - } - - void JustDied(Unit* killer) - { - BossAI::JustDied(killer); - Talk(SAY_DEATH); - } - - void EnterCombat(Unit* who) - { - BossAI::EnterCombat(who); - Talk(SAY_AGGRO); - - me->CastSpell(me, SPELL_HOLY_GROUND, true); - events.ScheduleEvent(EVENT_SPELL_REPENTANCE, 25000); - events.ScheduleEvent(EVENT_SPELL_HOLY_FIRE, 8000); - events.ScheduleEvent(EVENT_SPELL_HOLY_WRATH, 15000); - events.ScheduleEvent(EVENT_SPELL_ENRAGE, 600000); - DoZoneInCombat(); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_REPENTANCE: - me->CastSpell(me, SPELL_REPENTANCE, true); - events.ScheduleEvent(EVENT_SPELL_REPENTANCE, urand(25000, 35000)); - break; - case EVENT_SPELL_HOLY_FIRE: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true)) - me->CastSpell(target, SPELL_HOLY_FIRE, true); - events.ScheduleEvent(EVENT_SPELL_HOLY_FIRE, urand(8000, 18000)); - break; - case EVENT_SPELL_HOLY_WRATH: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true)) - me->CastSpell(target, SPELL_HOLY_WRATH, true); - events.ScheduleEvent(EVENT_SPELL_HOLY_WRATH, urand(20000, 25000)); - break; - case EVENT_SPELL_ENRAGE: - me->CastSpell(me, SPELL_BERSERK, true); - break; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + BossAI::Reset(); } + + void KilledUnit(Unit* /*victim*/) + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + { + Talk(SAY_SLAY); + events.ScheduleEvent(EVENT_KILL_TALK, 5000); + } + } + + void JustDied(Unit* killer) + { + BossAI::JustDied(killer); + Talk(SAY_DEATH); + } + + void EnterCombat(Unit* who) + { + BossAI::EnterCombat(who); + Talk(SAY_AGGRO); + + me->CastSpell(me, SPELL_HOLY_GROUND, true); + events.ScheduleEvent(EVENT_SPELL_REPENTANCE, 25000); + events.ScheduleEvent(EVENT_SPELL_HOLY_FIRE, 8000); + events.ScheduleEvent(EVENT_SPELL_HOLY_WRATH, 15000); + events.ScheduleEvent(EVENT_SPELL_ENRAGE, 600000); + DoZoneInCombat(); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_SPELL_REPENTANCE: + me->CastSpell(me, SPELL_REPENTANCE, true); + events.ScheduleEvent(EVENT_SPELL_REPENTANCE, urand(25000, 35000)); + break; + case EVENT_SPELL_HOLY_FIRE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true)) + me->CastSpell(target, SPELL_HOLY_FIRE, true); + events.ScheduleEvent(EVENT_SPELL_HOLY_FIRE, urand(8000, 18000)); + break; + case EVENT_SPELL_HOLY_WRATH: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true)) + me->CastSpell(target, SPELL_HOLY_WRATH, true); + events.ScheduleEvent(EVENT_SPELL_HOLY_WRATH, urand(20000, 25000)); + break; + case EVENT_SPELL_ENRAGE: + me->CastSpell(me, SPELL_BERSERK, true); + break; + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; void AddSC_boss_maiden_of_virtue() diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp index fec694a32..b848239da 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp @@ -68,381 +68,381 @@ enum eMisc class boss_midnight : public CreatureScript { - public: - boss_midnight() : CreatureScript("boss_midnight") { } +public: + boss_midnight() : CreatureScript("boss_midnight") { } - struct boss_midnightAI : public BossAI + struct boss_midnightAI : public BossAI + { + boss_midnightAI(Creature* creature) : BossAI(creature, DATA_ATTUMEN) { } + + void Reset() { - boss_midnightAI(Creature* creature) : BossAI(creature, DATA_ATTUMEN) { } - - void Reset() - { - BossAI::Reset(); - me->SetVisible(true); - _healthPct = 100.0f; - } - - void EnterCombat(Unit* who) - { - BossAI::EnterCombat(who); - events.ScheduleEvent(EVENT_CHECK_HEALTH_95, 0); - events.ScheduleEvent(EVENT_SPELL_KNOCKDOWN, 6000); - DoZoneInCombat(); - } - - void KilledUnit(Unit* /*victim*/) - { - if (Creature* attumen = summons.GetCreatureWithEntry(NPC_ATTUMEN_THE_HUNTSMAN)) - attumen->AI()->Talk(SAY_ATTUMEN_MIDNIGHT_KILL); - } - - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - summon->SetInCombatWithZone(); - - if (summon->GetEntry() == NPC_ATTUMEN_THE_HUNTSMAN_MOUNTED) - { - summon->SetHealth(summon->CountPctFromMaxHealth(_healthPct)); - summon->CastSpell(summon, SPELL_SPAWN_SMOKE2, true); - } - else - summon->CastSpell(summon, SPELL_SPAWN_SMOKE1, true); - } - - void SetData(uint32 type, uint32 /*data*/) - { - if (type == DATA_ATTUMEN_READY) - events.ScheduleEvent(EVENT_SUMMON_ATTUMEN_MOUNTED, 0); - } - - void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) - { - if (summon->GetEntry() == NPC_ATTUMEN_THE_HUNTSMAN_MOUNTED) - { - summons.clear(); - Unit::Kill(me, me); - } - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_CHECK_HEALTH_95: - if (me->HealthBelowPct(96)) - { - me->CastSpell(me, SPELL_SUMMON_ATTUMEN, true); - events.ScheduleEvent(EVENT_CHECK_HEALTH_25, 0); - break; - } - events.ScheduleEvent(EVENT_CHECK_HEALTH_95, 500); - break; - case EVENT_CHECK_HEALTH_25: - if (me->HealthBelowPct(25)) - { - Talk(SAY_MIDNIGHT_EMOTE); - me->CastSpell(me, SPELL_MOUNT_TARGET_ATTUMEN, true); - break; - } - events.ScheduleEvent(EVENT_CHECK_HEALTH_25, 500); - break; - case EVENT_SPELL_KNOCKDOWN: - me->CastSpell(me->GetVictim(), SPELL_KNOCKDOWN, false); - events.ScheduleEvent(EVENT_SPELL_KNOCKDOWN, 20000); - break; - case EVENT_SUMMON_ATTUMEN_MOUNTED: - if (Creature* attumen = summons.GetCreatureWithEntry(NPC_ATTUMEN_THE_HUNTSMAN)) - { - _healthPct = std::max(me->GetHealthPct(), attumen->GetHealthPct()); - attumen->DespawnOrUnsummon(); - } - - me->CastSpell(me, SPELL_SUMMON_ATTUMEN_MOUNTED, true); - me->SetVisible(false); - break; - } - - if (me->IsVisible()) - DoMeleeAttackIfReady(); - EnterEvadeIfOutOfCombatArea(); - } - - bool CheckEvadeIfOutOfCombatArea() const - { - return me->GetHomePosition().GetExactDist2d(me) > 50.0f || me->GetPositionZ() > 60.0f; - } - - private: - float _healthPct; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + BossAI::Reset(); + me->SetVisible(true); + _healthPct = 100.0f; } + + void EnterCombat(Unit* who) + { + BossAI::EnterCombat(who); + events.ScheduleEvent(EVENT_CHECK_HEALTH_95, 0); + events.ScheduleEvent(EVENT_SPELL_KNOCKDOWN, 6000); + DoZoneInCombat(); + } + + void KilledUnit(Unit* /*victim*/) + { + if (Creature* attumen = summons.GetCreatureWithEntry(NPC_ATTUMEN_THE_HUNTSMAN)) + attumen->AI()->Talk(SAY_ATTUMEN_MIDNIGHT_KILL); + } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + summon->SetInCombatWithZone(); + + if (summon->GetEntry() == NPC_ATTUMEN_THE_HUNTSMAN_MOUNTED) + { + summon->SetHealth(summon->CountPctFromMaxHealth(_healthPct)); + summon->CastSpell(summon, SPELL_SPAWN_SMOKE2, true); + } + else + summon->CastSpell(summon, SPELL_SPAWN_SMOKE1, true); + } + + void SetData(uint32 type, uint32 /*data*/) + { + if (type == DATA_ATTUMEN_READY) + events.ScheduleEvent(EVENT_SUMMON_ATTUMEN_MOUNTED, 0); + } + + void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) + { + if (summon->GetEntry() == NPC_ATTUMEN_THE_HUNTSMAN_MOUNTED) + { + summons.clear(); + Unit::Kill(me, me); + } + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_CHECK_HEALTH_95: + if (me->HealthBelowPct(96)) + { + me->CastSpell(me, SPELL_SUMMON_ATTUMEN, true); + events.ScheduleEvent(EVENT_CHECK_HEALTH_25, 0); + break; + } + events.ScheduleEvent(EVENT_CHECK_HEALTH_95, 500); + break; + case EVENT_CHECK_HEALTH_25: + if (me->HealthBelowPct(25)) + { + Talk(SAY_MIDNIGHT_EMOTE); + me->CastSpell(me, SPELL_MOUNT_TARGET_ATTUMEN, true); + break; + } + events.ScheduleEvent(EVENT_CHECK_HEALTH_25, 500); + break; + case EVENT_SPELL_KNOCKDOWN: + me->CastSpell(me->GetVictim(), SPELL_KNOCKDOWN, false); + events.ScheduleEvent(EVENT_SPELL_KNOCKDOWN, 20000); + break; + case EVENT_SUMMON_ATTUMEN_MOUNTED: + if (Creature* attumen = summons.GetCreatureWithEntry(NPC_ATTUMEN_THE_HUNTSMAN)) + { + _healthPct = std::max(me->GetHealthPct(), attumen->GetHealthPct()); + attumen->DespawnOrUnsummon(); + } + + me->CastSpell(me, SPELL_SUMMON_ATTUMEN_MOUNTED, true); + me->SetVisible(false); + break; + } + + if (me->IsVisible()) + DoMeleeAttackIfReady(); + EnterEvadeIfOutOfCombatArea(); + } + + bool CheckEvadeIfOutOfCombatArea() const + { + return me->GetHomePosition().GetExactDist2d(me) > 50.0f || me->GetPositionZ() > 60.0f; + } + + private: + float _healthPct; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class boss_attumen : public CreatureScript { - public: - boss_attumen() : CreatureScript("boss_attumen") { } +public: + boss_attumen() : CreatureScript("boss_attumen") { } - struct boss_attumenAI : public ScriptedAI + struct boss_attumenAI : public ScriptedAI + { + boss_attumenAI(Creature* creature) : ScriptedAI(creature) { - boss_attumenAI(Creature* creature) : ScriptedAI(creature) - { - } - - void Reset() - { - _events.Reset(); - } - - void EnterCombat(Unit* /*who*/) - { - Talk(SAY_ATTUMEN1_APPEAR); - _events.ScheduleEvent(EVENT_CHECK_HEALTH_25, 0); - _events.ScheduleEvent(EVENT_SPELL_SHADOW_CLEAVE, 6000); - _events.ScheduleEvent(EVENT_SPELL_INTANGIBLE_PRESENCE, 15000); - _events.ScheduleEvent(EVENT_RANDOM_YELL, urand(25000, 45000)); - } - - void KilledUnit(Unit* /*victim*/) - { - if (_events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - _events.ScheduleEvent(EVENT_KILL_TALK, 5000); - Talk(SAY_ATTUMEN_KILL); - } - } - - void SpellHit(Unit* /*caster*/, const SpellInfo* spellInfo) - { - if (spellInfo->Mechanic == MECHANIC_DISARM && _events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - _events.ScheduleEvent(EVENT_KILL_TALK, 5000); - Talk(SAY_ATTUMEN_DISARM); - } - else if (spellInfo->Id == SPELL_MOUNT_TARGET_ATTUMEN) - { - me->CastSpell(me, SPELL_MOUNT_TARGET_MIDNIGHT, true); - } - } - - void SpellHitTarget(Unit* target, const SpellInfo* spellInfo) - { - if (spellInfo->Id == SPELL_MOUNT_TARGET_MIDNIGHT) - { - Talk(SAY_ATTUMEN1_MOUNT); - _events.Reset(); - me->GetMotionMaster()->MovePoint(POINT_MOVE_TO_MIDNIGHT, target->GetPositionX() + 2.0f*cos(target->GetAngle(me)), target->GetPositionY() + 2.0f*sin(target->GetAngle(me)), target->GetPositionZ()+0.2f, true, true, MOTION_SLOT_CONTROLLED); - } - } - - void MovementInform(uint32 type, uint32 point) - { - if (type == POINT_MOTION_TYPE && point == POINT_MOVE_TO_MIDNIGHT) - { - if (TempSummon* summon = me->ToTempSummon()) - if (Unit* midnight = summon->GetSummoner()) - midnight->GetAI()->SetData(DATA_ATTUMEN_READY, 0); - } - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - _events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (_events.ExecuteEvent()) - { - case EVENT_SPELL_SHADOW_CLEAVE: - me->CastSpell(me->GetVictim(), SPELL_SHADOW_CLEAVE, false); - _events.ScheduleEvent(EVENT_SPELL_SHADOW_CLEAVE, urand(9000, 14000)); - break; - case EVENT_SPELL_INTANGIBLE_PRESENCE: - me->CastSpell(me->GetVictim(), SPELL_INTANGIBLE_PRESENCE, false); - _events.ScheduleEvent(EVENT_SPELL_INTANGIBLE_PRESENCE, 30000); - break; - case EVENT_RANDOM_YELL: - Talk(SAY_ATTUMEN_RANDOM); - _events.ScheduleEvent(EVENT_RANDOM_YELL, urand(30000, 70000)); - break; - case EVENT_CHECK_HEALTH_25: - if (me->HealthBelowPct(25)) - { - me->CastSpell(me, SPELL_MOUNT_TARGET_MIDNIGHT, true); - break; - } - _events.ScheduleEvent(EVENT_CHECK_HEALTH_25, 500); - break; - } - - DoMeleeAttackIfReady(); - } - - private: - EventMap _events; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); } + + void Reset() + { + _events.Reset(); + } + + void EnterCombat(Unit* /*who*/) + { + Talk(SAY_ATTUMEN1_APPEAR); + _events.ScheduleEvent(EVENT_CHECK_HEALTH_25, 0); + _events.ScheduleEvent(EVENT_SPELL_SHADOW_CLEAVE, 6000); + _events.ScheduleEvent(EVENT_SPELL_INTANGIBLE_PRESENCE, 15000); + _events.ScheduleEvent(EVENT_RANDOM_YELL, urand(25000, 45000)); + } + + void KilledUnit(Unit* /*victim*/) + { + if (_events.GetNextEventTime(EVENT_KILL_TALK) == 0) + { + _events.ScheduleEvent(EVENT_KILL_TALK, 5000); + Talk(SAY_ATTUMEN_KILL); + } + } + + void SpellHit(Unit* /*caster*/, const SpellInfo* spellInfo) + { + if (spellInfo->Mechanic == MECHANIC_DISARM && _events.GetNextEventTime(EVENT_KILL_TALK) == 0) + { + _events.ScheduleEvent(EVENT_KILL_TALK, 5000); + Talk(SAY_ATTUMEN_DISARM); + } + else if (spellInfo->Id == SPELL_MOUNT_TARGET_ATTUMEN) + { + me->CastSpell(me, SPELL_MOUNT_TARGET_MIDNIGHT, true); + } + } + + void SpellHitTarget(Unit* target, const SpellInfo* spellInfo) + { + if (spellInfo->Id == SPELL_MOUNT_TARGET_MIDNIGHT) + { + Talk(SAY_ATTUMEN1_MOUNT); + _events.Reset(); + me->GetMotionMaster()->MovePoint(POINT_MOVE_TO_MIDNIGHT, target->GetPositionX() + 2.0f * cos(target->GetAngle(me)), target->GetPositionY() + 2.0f * sin(target->GetAngle(me)), target->GetPositionZ() + 0.2f, true, true, MOTION_SLOT_CONTROLLED); + } + } + + void MovementInform(uint32 type, uint32 point) + { + if (type == POINT_MOTION_TYPE && point == POINT_MOVE_TO_MIDNIGHT) + { + if (TempSummon* summon = me->ToTempSummon()) + if (Unit* midnight = summon->GetSummoner()) + midnight->GetAI()->SetData(DATA_ATTUMEN_READY, 0); + } + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + _events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (_events.ExecuteEvent()) + { + case EVENT_SPELL_SHADOW_CLEAVE: + me->CastSpell(me->GetVictim(), SPELL_SHADOW_CLEAVE, false); + _events.ScheduleEvent(EVENT_SPELL_SHADOW_CLEAVE, urand(9000, 14000)); + break; + case EVENT_SPELL_INTANGIBLE_PRESENCE: + me->CastSpell(me->GetVictim(), SPELL_INTANGIBLE_PRESENCE, false); + _events.ScheduleEvent(EVENT_SPELL_INTANGIBLE_PRESENCE, 30000); + break; + case EVENT_RANDOM_YELL: + Talk(SAY_ATTUMEN_RANDOM); + _events.ScheduleEvent(EVENT_RANDOM_YELL, urand(30000, 70000)); + break; + case EVENT_CHECK_HEALTH_25: + if (me->HealthBelowPct(25)) + { + me->CastSpell(me, SPELL_MOUNT_TARGET_MIDNIGHT, true); + break; + } + _events.ScheduleEvent(EVENT_CHECK_HEALTH_25, 500); + break; + } + + DoMeleeAttackIfReady(); + } + + private: + EventMap _events; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class boss_attumen_midnight : public CreatureScript { - public: - boss_attumen_midnight() : CreatureScript("boss_attumen_midnight") { } +public: + boss_attumen_midnight() : CreatureScript("boss_attumen_midnight") { } - struct boss_attumen_midnightAI : public ScriptedAI + struct boss_attumen_midnightAI : public ScriptedAI + { + boss_attumen_midnightAI(Creature* creature) : ScriptedAI(creature) { - boss_attumen_midnightAI(Creature* creature) : ScriptedAI(creature) - { - } - - void Reset() - { - _events.Reset(); - } - - void EnterCombat(Unit* /*who*/) - { - _events.ScheduleEvent(EVENT_SPELL_SHADOW_CLEAVE, 6000); - _events.ScheduleEvent(EVENT_SPELL_INTANGIBLE_PRESENCE, 15000); - _events.ScheduleEvent(EVENT_RANDOM_YELL, urand(25000, 45000)); - _events.ScheduleEvent(EVENT_SPELL_CHARGE, 20000); - _events.ScheduleEvent(EVENT_SPELL_KNOCKDOWN, 11000); - } - - void KilledUnit(Unit* /*victim*/) - { - if (_events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - _events.ScheduleEvent(EVENT_KILL_TALK, 5000); - Talk(SAY_ATTUMEN_KILL); - } - } - - void JustDied(Unit* /*killer*/) - { - Talk(SAY_ATTUMEN2_DEATH); - } - - void SpellHit(Unit* /*caster*/, const SpellInfo* spellInfo) - { - if (spellInfo->Mechanic == MECHANIC_DISARM && _events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - _events.ScheduleEvent(EVENT_KILL_TALK, 5000); - Talk(SAY_ATTUMEN_DISARM); - } - } - - void MovementInform(uint32 type, uint32 point) - { - if (type == POINT_MOTION_TYPE && point == POINT_MOVE_TO_MIDNIGHT) - { - if (TempSummon* summon = me->ToTempSummon()) - if (Unit* midnight = summon->GetSummoner()) - midnight->GetAI()->SetData(DATA_ATTUMEN_READY, 0); - } - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - _events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (_events.ExecuteEvent()) - { - case EVENT_SPELL_SHADOW_CLEAVE: - me->CastSpell(me->GetVictim(), SPELL_SHADOW_CLEAVE, false); - _events.ScheduleEvent(EVENT_SPELL_SHADOW_CLEAVE, urand(9000, 14000)); - break; - case EVENT_SPELL_INTANGIBLE_PRESENCE: - me->CastSpell(me->GetVictim(), SPELL_INTANGIBLE_PRESENCE, false); - _events.ScheduleEvent(EVENT_SPELL_INTANGIBLE_PRESENCE, 30000); - break; - case EVENT_RANDOM_YELL: - Talk(SAY_ATTUMEN_RANDOM); - _events.ScheduleEvent(EVENT_RANDOM_YELL, urand(30000, 70000)); - break; - case EVENT_SPELL_CHARGE: - if (Unit* target = SelectTarget(SELECT_TARGET_FARTHEST, 0, 24.0f, true)) - me->CastSpell(target, SPELL_CHARGE_MIDNIGHT, false); - _events.ScheduleEvent(EVENT_SPELL_CHARGE, 20000); - break; - case EVENT_SPELL_KNOCKDOWN: - me->CastSpell(me->GetVictim(), SPELL_KNOCKDOWN, false); - _events.ScheduleEvent(EVENT_SPELL_KNOCKDOWN, 20000); - break; - } - - DoMeleeAttackIfReady(); - } - - private: - EventMap _events; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); } + + void Reset() + { + _events.Reset(); + } + + void EnterCombat(Unit* /*who*/) + { + _events.ScheduleEvent(EVENT_SPELL_SHADOW_CLEAVE, 6000); + _events.ScheduleEvent(EVENT_SPELL_INTANGIBLE_PRESENCE, 15000); + _events.ScheduleEvent(EVENT_RANDOM_YELL, urand(25000, 45000)); + _events.ScheduleEvent(EVENT_SPELL_CHARGE, 20000); + _events.ScheduleEvent(EVENT_SPELL_KNOCKDOWN, 11000); + } + + void KilledUnit(Unit* /*victim*/) + { + if (_events.GetNextEventTime(EVENT_KILL_TALK) == 0) + { + _events.ScheduleEvent(EVENT_KILL_TALK, 5000); + Talk(SAY_ATTUMEN_KILL); + } + } + + void JustDied(Unit* /*killer*/) + { + Talk(SAY_ATTUMEN2_DEATH); + } + + void SpellHit(Unit* /*caster*/, const SpellInfo* spellInfo) + { + if (spellInfo->Mechanic == MECHANIC_DISARM && _events.GetNextEventTime(EVENT_KILL_TALK) == 0) + { + _events.ScheduleEvent(EVENT_KILL_TALK, 5000); + Talk(SAY_ATTUMEN_DISARM); + } + } + + void MovementInform(uint32 type, uint32 point) + { + if (type == POINT_MOTION_TYPE && point == POINT_MOVE_TO_MIDNIGHT) + { + if (TempSummon* summon = me->ToTempSummon()) + if (Unit* midnight = summon->GetSummoner()) + midnight->GetAI()->SetData(DATA_ATTUMEN_READY, 0); + } + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + _events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (_events.ExecuteEvent()) + { + case EVENT_SPELL_SHADOW_CLEAVE: + me->CastSpell(me->GetVictim(), SPELL_SHADOW_CLEAVE, false); + _events.ScheduleEvent(EVENT_SPELL_SHADOW_CLEAVE, urand(9000, 14000)); + break; + case EVENT_SPELL_INTANGIBLE_PRESENCE: + me->CastSpell(me->GetVictim(), SPELL_INTANGIBLE_PRESENCE, false); + _events.ScheduleEvent(EVENT_SPELL_INTANGIBLE_PRESENCE, 30000); + break; + case EVENT_RANDOM_YELL: + Talk(SAY_ATTUMEN_RANDOM); + _events.ScheduleEvent(EVENT_RANDOM_YELL, urand(30000, 70000)); + break; + case EVENT_SPELL_CHARGE: + if (Unit* target = SelectTarget(SELECT_TARGET_FARTHEST, 0, 24.0f, true)) + me->CastSpell(target, SPELL_CHARGE_MIDNIGHT, false); + _events.ScheduleEvent(EVENT_SPELL_CHARGE, 20000); + break; + case EVENT_SPELL_KNOCKDOWN: + me->CastSpell(me->GetVictim(), SPELL_KNOCKDOWN, false); + _events.ScheduleEvent(EVENT_SPELL_KNOCKDOWN, 20000); + break; + } + + DoMeleeAttackIfReady(); + } + + private: + EventMap _events; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class spell_midnight_fixate : public SpellScriptLoader { - public: - spell_midnight_fixate() : SpellScriptLoader("spell_midnight_fixate") { } +public: + spell_midnight_fixate() : SpellScriptLoader("spell_midnight_fixate") { } - class spell_midnight_fixate_AuraScript : public AuraScript + class spell_midnight_fixate_AuraScript : public AuraScript + { + PrepareAuraScript(spell_midnight_fixate_AuraScript); + + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_midnight_fixate_AuraScript); - - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - if (Unit* caster = GetCaster()) - caster->TauntApply(target); - } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - if (Unit* caster = GetCaster()) - caster->TauntFadeOut(target); - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_midnight_fixate_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_midnight_fixate_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - - }; - - AuraScript* GetAuraScript() const - { - return new spell_midnight_fixate_AuraScript(); + Unit* target = GetTarget(); + if (Unit* caster = GetCaster()) + caster->TauntApply(target); } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + if (Unit* caster = GetCaster()) + caster->TauntFadeOut(target); + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_midnight_fixate_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_midnight_fixate_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + + }; + + AuraScript* GetAuraScript() const + { + return new spell_midnight_fixate_AuraScript(); + } }; void AddSC_boss_attumen() diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp index af62cc7fd..ca998c499 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp @@ -55,7 +55,7 @@ const Position GuestsPosition[4] = {-10976.38f, -1882.59f, 81.73f, 2.31f}, }; -const uint32 GuestEntries[6]= +const uint32 GuestEntries[6] = { 17007, 19872, @@ -67,217 +67,217 @@ const uint32 GuestEntries[6]= class boss_moroes : public CreatureScript { - public: - boss_moroes() : CreatureScript("boss_moroes") { } +public: + boss_moroes() : CreatureScript("boss_moroes") { } - struct boss_moroesAI : public BossAI + struct boss_moroesAI : public BossAI + { + boss_moroesAI(Creature* creature) : BossAI(creature, DATA_MOROES) { - boss_moroesAI(Creature* creature) : BossAI(creature, DATA_MOROES) - { - _activeGuests = 0; - instance = creature->GetInstanceScript(); - } - - InstanceScript* instance; - - void InitializeAI() - { - BossAI::InitializeAI(); - InitializeGuests(); - } - - void JustReachedHome() - { - BossAI::JustReachedHome(); - InitializeGuests(); - } - - void InitializeGuests() - { - if (!me->IsAlive()) - return; - - if (_activeGuests == 0) - { - _activeGuests |= 0x3F; - uint8 rand1 = RAND(0x01, 0x02, 0x04); - uint8 rand2 = RAND(0x08, 0x10, 0x20); - _activeGuests &= ~(rand1|rand2); - } - - for (uint8 i = 0; i < MAX_GUEST_COUNT; ++i) - if ((1 << i) & _activeGuests) - me->SummonCreature(GuestEntries[i], GuestsPosition[summons.size()], TEMPSUMMON_MANUAL_DESPAWN); - - _events2.Reset(); - _events2.ScheduleEvent(EVENT_GUEST_TALK, 10000); - } - - void Reset() - { - BossAI::Reset(); - me->CastSpell(me, SPELL_DUAL_WIELD, true); - } - - void EnterCombat(Unit* who) - { - BossAI::EnterCombat(who); - Talk(SAY_AGGRO); - - events.ScheduleEvent(EVENT_SPELL_VANISH, 30000); - events.ScheduleEvent(EVENT_SPELL_BLIND, 20000); - events.ScheduleEvent(EVENT_SPELL_GOUGE, 13000); - events.ScheduleEvent(EVENT_CHECK_HEALTH, 5000); - events.ScheduleEvent(EVENT_SPELL_ENRAGE, 600000); - - _events2.Reset(); - me->CallForHelp(20.0f); - DoZoneInCombat(); - } - - void KilledUnit(Unit* /*victim*/) - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(SAY_KILL); - events.ScheduleEvent(EVENT_KILL_TALK, 5000); - } - } - - void JustDied(Unit* killer) - { - summons.clear(); - BossAI::JustDied(killer); - Talk(SAY_DEATH); - instance->SetBossState(DATA_MOROES, DONE); - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_GARROTE); - } - - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - } - - Creature* GetRandomGuest() - { - std::list guestList; - for (SummonList::const_iterator i = summons.begin(); i != summons.end(); ++i) - if (Creature* summon = ObjectAccessor::GetCreature(*me, *i)) - guestList.push_back(summon); - - return acore::Containers::SelectRandomContainerElement(guestList); - } - - void UpdateAI(uint32 diff) - { - _events2.Update(diff); - switch (_events2.ExecuteEvent()) - { - case EVENT_GUEST_TALK: - if (Creature* guest = GetRandomGuest()) - guest->AI()->Talk(SAY_GUEST); - _events2.ScheduleEvent(EVENT_GUEST_TALK2, 5000); - break; - case EVENT_GUEST_TALK2: - Talk(SAY_OUT_OF_COMBAT); - _events2.ScheduleEvent(EVENT_GUEST_TALK, urand(60000, 120000)); - break; - } - - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_CHECK_HEALTH: - if (me->HealthBelowPct(31)) - { - me->CastSpell(me, SPELL_FRENZY, true); - break; - } - events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); - break; - case EVENT_SPELL_ENRAGE: - me->CastSpell(me, SPELL_BERSERK, true); - break; - case EVENT_SPELL_BLIND: - if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1, 10.0f, true)) - me->CastSpell(target, SPELL_BLIND, false); - events.ScheduleEvent(EVENT_SPELL_BLIND, urand(25000, 40000)); - break; - case EVENT_SPELL_GOUGE: - me->CastSpell(me->GetVictim(), SPELL_GOUGE, false); - events.ScheduleEvent(EVENT_SPELL_GOUGE, urand(25000, 40000)); - return; - case EVENT_SPELL_VANISH: - events.DelayEvents(9000); - events.SetPhase(1); - me->CastSpell(me, SPELL_VANISH, false); - events.ScheduleEvent(EVENT_SPELL_VANISH, 30000); - events.ScheduleEvent(EVENT_SPELL_GARROTE, urand(5000, 7000)); - return; - case EVENT_SPELL_GARROTE: - Talk(SAY_SPECIAL); - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - target->CastSpell(target, SPELL_GARROTE, true); - me->CastSpell(me, SPELL_VANISH_TELEPORT, false); - events.SetPhase(0); - break; - } - - // Xinef: not in vanish - if (events.GetPhaseMask() == 0) - DoMeleeAttackIfReady(); - } - - private: - EventMap _events2; - uint8 _activeGuests; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + _activeGuests = 0; + instance = creature->GetInstanceScript(); } + + InstanceScript* instance; + + void InitializeAI() + { + BossAI::InitializeAI(); + InitializeGuests(); + } + + void JustReachedHome() + { + BossAI::JustReachedHome(); + InitializeGuests(); + } + + void InitializeGuests() + { + if (!me->IsAlive()) + return; + + if (_activeGuests == 0) + { + _activeGuests |= 0x3F; + uint8 rand1 = RAND(0x01, 0x02, 0x04); + uint8 rand2 = RAND(0x08, 0x10, 0x20); + _activeGuests &= ~(rand1 | rand2); + } + + for (uint8 i = 0; i < MAX_GUEST_COUNT; ++i) + if ((1 << i) & _activeGuests) + me->SummonCreature(GuestEntries[i], GuestsPosition[summons.size()], TEMPSUMMON_MANUAL_DESPAWN); + + _events2.Reset(); + _events2.ScheduleEvent(EVENT_GUEST_TALK, 10000); + } + + void Reset() + { + BossAI::Reset(); + me->CastSpell(me, SPELL_DUAL_WIELD, true); + } + + void EnterCombat(Unit* who) + { + BossAI::EnterCombat(who); + Talk(SAY_AGGRO); + + events.ScheduleEvent(EVENT_SPELL_VANISH, 30000); + events.ScheduleEvent(EVENT_SPELL_BLIND, 20000); + events.ScheduleEvent(EVENT_SPELL_GOUGE, 13000); + events.ScheduleEvent(EVENT_CHECK_HEALTH, 5000); + events.ScheduleEvent(EVENT_SPELL_ENRAGE, 600000); + + _events2.Reset(); + me->CallForHelp(20.0f); + DoZoneInCombat(); + } + + void KilledUnit(Unit* /*victim*/) + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + { + Talk(SAY_KILL); + events.ScheduleEvent(EVENT_KILL_TALK, 5000); + } + } + + void JustDied(Unit* killer) + { + summons.clear(); + BossAI::JustDied(killer); + Talk(SAY_DEATH); + instance->SetBossState(DATA_MOROES, DONE); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_GARROTE); + } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + } + + Creature* GetRandomGuest() + { + std::list guestList; + for (SummonList::const_iterator i = summons.begin(); i != summons.end(); ++i) + if (Creature* summon = ObjectAccessor::GetCreature(*me, *i)) + guestList.push_back(summon); + + return acore::Containers::SelectRandomContainerElement(guestList); + } + + void UpdateAI(uint32 diff) + { + _events2.Update(diff); + switch (_events2.ExecuteEvent()) + { + case EVENT_GUEST_TALK: + if (Creature* guest = GetRandomGuest()) + guest->AI()->Talk(SAY_GUEST); + _events2.ScheduleEvent(EVENT_GUEST_TALK2, 5000); + break; + case EVENT_GUEST_TALK2: + Talk(SAY_OUT_OF_COMBAT); + _events2.ScheduleEvent(EVENT_GUEST_TALK, urand(60000, 120000)); + break; + } + + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_CHECK_HEALTH: + if (me->HealthBelowPct(31)) + { + me->CastSpell(me, SPELL_FRENZY, true); + break; + } + events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); + break; + case EVENT_SPELL_ENRAGE: + me->CastSpell(me, SPELL_BERSERK, true); + break; + case EVENT_SPELL_BLIND: + if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1, 10.0f, true)) + me->CastSpell(target, SPELL_BLIND, false); + events.ScheduleEvent(EVENT_SPELL_BLIND, urand(25000, 40000)); + break; + case EVENT_SPELL_GOUGE: + me->CastSpell(me->GetVictim(), SPELL_GOUGE, false); + events.ScheduleEvent(EVENT_SPELL_GOUGE, urand(25000, 40000)); + return; + case EVENT_SPELL_VANISH: + events.DelayEvents(9000); + events.SetPhase(1); + me->CastSpell(me, SPELL_VANISH, false); + events.ScheduleEvent(EVENT_SPELL_VANISH, 30000); + events.ScheduleEvent(EVENT_SPELL_GARROTE, urand(5000, 7000)); + return; + case EVENT_SPELL_GARROTE: + Talk(SAY_SPECIAL); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) + target->CastSpell(target, SPELL_GARROTE, true); + me->CastSpell(me, SPELL_VANISH_TELEPORT, false); + events.SetPhase(0); + break; + } + + // Xinef: not in vanish + if (events.GetPhaseMask() == 0) + DoMeleeAttackIfReady(); + } + + private: + EventMap _events2; + uint8 _activeGuests; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class spell_moroes_vanish : public SpellScriptLoader { - public: - spell_moroes_vanish() : SpellScriptLoader("spell_moroes_vanish") { } +public: + spell_moroes_vanish() : SpellScriptLoader("spell_moroes_vanish") { } - class spell_moroes_vanish_SpellScript : public SpellScript + class spell_moroes_vanish_SpellScript : public SpellScript + { + PrepareSpellScript(spell_moroes_vanish_SpellScript); + + void HandleDummy(SpellEffIndex effIndex) { - PrepareSpellScript(spell_moroes_vanish_SpellScript); - - void HandleDummy(SpellEffIndex effIndex) + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - { - Position pos; - target->GetFirstCollisionPosition(pos, 5.0f, M_PI); - GetCaster()->CastSpell(target, SPELL_GARROTE_DUMMY, true); - GetCaster()->RemoveAurasDueToSpell(SPELL_VANISH); - GetCaster()->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), target->GetOrientation()); - } - + Position pos; + target->GetFirstCollisionPosition(pos, 5.0f, M_PI); + GetCaster()->CastSpell(target, SPELL_GARROTE_DUMMY, true); + GetCaster()->RemoveAurasDueToSpell(SPELL_VANISH); + GetCaster()->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), target->GetOrientation()); } - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_moroes_vanish_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_moroes_vanish_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_moroes_vanish_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_moroes_vanish_SpellScript(); + } }; void AddSC_boss_moroes() diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp index e9da7857e..1ac98b30f 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp @@ -39,7 +39,8 @@ const float PortalCoord[3][3] = {-11094.493164f, -1591.969238f, 279.949188f} // Back side }; -enum Netherspite_Portal{ +enum Netherspite_Portal +{ RED_PORTAL = 0, // Perseverence GREEN_PORTAL = 1, // Serenity BLUE_PORTAL = 2 // Dominance @@ -68,7 +69,7 @@ public: { instance = creature->GetInstanceScript(); - for (int i=0; i<3; ++i) + for (int i = 0; i < 3; ++i) { PortalGUID[i] = 0; BeamTarget[i] = 0; @@ -107,12 +108,12 @@ public: if (dist(xn, yn, xh, yh) >= dist(xn, yn, xp, yp) || dist(xp, yp, xh, yh) >= dist(xn, yn, xp, yp)) return false; // check distance from the beam - return (abs((xn-xp)*yh+(yp-yn)*xh-xn*yp+xp*yn)/dist(xn, yn, xp, yp) < 1.5f); + return (abs((xn - xp) * yh + (yp - yn) * xh - xn * yp + xp * yn) / dist(xn, yn, xp, yp) < 1.5f); } float dist(float xa, float ya, float xb, float yb) // auxiliary method for distance { - return sqrt((xa-xb)*(xa-xb) + (ya-yb)*(ya-yb)); + return sqrt((xa - xb) * (xa - xb) + (ya - yb) * (ya - yb)); } void Reset() @@ -128,13 +129,13 @@ public: void SummonPortals() { - uint8 r = rand()%4; + uint8 r = rand() % 4; uint8 pos[3]; pos[RED_PORTAL] = ((r % 2) ? (r > 1 ? 2 : 1) : 0); pos[GREEN_PORTAL] = ((r % 2) ? 0 : (r > 1 ? 2 : 1)); pos[BLUE_PORTAL] = (r > 1 ? 1 : 2); // Blue Portal not on the left side (0) - for (int i=0; i<3; ++i) + for (int i = 0; i < 3; ++i) if (Creature* portal = me->SummonCreature(PortalID[i], PortalCoord[pos[i]][0], PortalCoord[pos[i]][1], PortalCoord[pos[i]][2], 0, TEMPSUMMON_TIMED_DESPAWN, 60000)) { PortalGUID[i] = portal->GetGUID(); @@ -144,7 +145,7 @@ public: void DestroyPortals() { - for (int i=0; i<3; ++i) + for (int i = 0; i < 3; ++i) { if (Creature* portal = ObjectAccessor::GetCreature(*me, PortalGUID[i])) portal->DisappearAndDie(); @@ -157,7 +158,7 @@ public: void UpdatePortals() // Here we handle the beams' behavior { - for (int j=0; j<3; ++j) // j = color + for (int j = 0; j < 3; ++j) // j = color if (Creature* portal = ObjectAccessor::GetCreature(*me, PortalGUID[j])) { // the one who's been cast upon before @@ -174,11 +175,11 @@ public: { Player* p = i->GetSource(); if (p && p->IsAlive() // alive - && (!target || target->GetDistance2d(portal)>p->GetDistance2d(portal)) // closer than current best - && !p->HasAura(PlayerDebuff[j], 0) // not exhausted - && !p->HasAura(PlayerBuff[(j+1)%3], 0) // not on another beam - && !p->HasAura(PlayerBuff[(j+2)%3], 0) - && IsBetween(me, p, portal)) // on the beam + && (!target || target->GetDistance2d(portal) > p->GetDistance2d(portal)) // closer than current best + && !p->HasAura(PlayerDebuff[j], 0) // not exhausted + && !p->HasAura(PlayerBuff[(j + 1) % 3], 0) // not on another beam + && !p->HasAura(PlayerBuff[(j + 2) % 3], 0) + && IsBetween(me, p, portal)) // on the beam target = p; } } @@ -208,7 +209,7 @@ public: } // aggro target if Red Beam if (j == RED_PORTAL && me->GetVictim() != target && target->GetTypeId() == TYPEID_PLAYER) - me->getThreatManager().addThreat(target, 100000.0f+DoGetThreat(me->GetVictim())); + me->getThreatManager().addThreat(target, 100000.0f + DoGetThreat(me->GetVictim())); } } @@ -268,7 +269,8 @@ public: { DoCast(SelectTarget(SELECT_TARGET_RANDOM, 1, 45, true), SPELL_VOIDZONE, true); VoidZoneTimer = 15000; - } else + } + else VoidZoneTimer -= diff; // NetherInfusion Berserk @@ -277,7 +279,8 @@ public: me->AddAura(SPELL_NETHER_INFUSION, me); DoCast(me, SPELL_NETHERSPITE_ROAR); Berserk = true; - } else + } + else NetherInfusionTimer -= diff; if (PortalPhase) // PORTAL PHASE @@ -287,7 +290,8 @@ public: { UpdatePortals(); PortalTimer = 1000; - } else + } + else PortalTimer -= diff; // Empowerment & Nether Burn @@ -296,7 +300,8 @@ public: DoCast(me, SPELL_EMPOWERMENT); me->AddAura(SPELL_NETHERBURN_AURA, me); EmpowermentTimer = 90000; - } else + } + else EmpowermentTimer -= diff; if (PhaseTimer <= diff) @@ -306,7 +311,8 @@ public: SwitchToBanishPhase(); return; } - } else + } + else PhaseTimer -= diff; } else // BANISH PHASE @@ -317,7 +323,8 @@ public: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40, true)) DoCast(target, SPELL_NETHERBREATH); NetherbreathTimer = urand(5000, 7000); - } else + } + else NetherbreathTimer -= diff; if (PhaseTimer <= diff) @@ -327,7 +334,8 @@ public: SwitchToPortalPhase(); return; } - } else + } + else PhaseTimer -= diff; } diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp index d3f2fbee7..451b31189 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp @@ -153,7 +153,7 @@ public: instance->SetData64(DATA_NIGHTBANE, IN_PROGRESS); HandleTerraceDoors(false); - Talk(YELL_AGGRO); + Talk(YELL_AGGRO); } void AttackStart(Unit* who) @@ -190,7 +190,7 @@ public: return; } - MovePhase = id+1; + MovePhase = id + 1; return; } @@ -205,7 +205,7 @@ public: } if (id < 8) - MovePhase = id+1; + MovePhase = id + 1; else { Phase = 1; @@ -239,7 +239,7 @@ public: RainofBonesTimer = 5000; //timer wrong (maybe) RainBones = false; Skeletons = false; - } + } void UpdateAI(uint32 diff) { @@ -295,14 +295,16 @@ public: { DoCastVictim(SPELL_BELLOWING_ROAR); BellowingRoarTimer = urand(30000, 40000); - } else + } + else BellowingRoarTimer -= diff; if (SmolderingBreathTimer <= diff) { DoCastVictim(SPELL_SMOLDERING_BREATH); SmolderingBreathTimer = 20000; - } else + } + else SmolderingBreathTimer -= diff; if (CharredEarthTimer <= diff) @@ -310,7 +312,8 @@ public: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_CHARRED_EARTH); CharredEarthTimer = 20000; - } else + } + else CharredEarthTimer -= diff; if (TailSweepTimer <= diff) @@ -319,7 +322,8 @@ public: if (!me->HasInArc(M_PI, target)) DoCast(target, SPELL_TAIL_SWEEP); TailSweepTimer = 15000; - } else + } + else TailSweepTimer -= diff; if (SearingCindersTimer <= diff) @@ -327,7 +331,8 @@ public: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_SEARING_CINDERS); SearingCindersTimer = 10000; - } else + } + else SearingCindersTimer -= diff; uint32 Prozent = uint32(me->GetHealthPct()); @@ -363,7 +368,8 @@ public: DoCastVictim(SPELL_RAIN_OF_BONES); RainBones = true; SmokingBlastTimer = 20000; - } else + } + else RainofBonesTimer -= diff; if (DistractingAshTimer <= diff) @@ -371,17 +377,19 @@ public: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_DISTRACTING_ASH); DistractingAshTimer = 2000; //timer wrong - } else + } + else DistractingAshTimer -= diff; } if (RainBones) { if (SmokingBlastTimer <= diff) - { + { DoCastVictim(SPELL_SMOKING_BLAST); SmokingBlastTimer = 1500; //timer wrong - } else + } + else SmokingBlastTimer -= diff; } @@ -390,7 +398,8 @@ public: if (Unit* target = SelectTarget(SELECT_TARGET_FARTHEST, 0)) DoCast(target, SPELL_FIREBALL_BARRAGE); FireballBarrageTimer = 20000; - } else + } + else FireballBarrageTimer -= diff; if (FlyTimer <= diff) //landing @@ -401,8 +410,9 @@ public: me->GetMotionMaster()->MovePoint(3, IntroWay[3][0], IntroWay[3][1], IntroWay[3][2]); Flying = true; - } else - FlyTimer -= diff; + } + else + FlyTimer -= diff; } } }; @@ -419,10 +429,10 @@ public: if (InstanceScript* pInstance = go->GetInstanceScript()) { if (pInstance->GetData(DATA_NIGHTBANE) != DONE && !go->FindNearestCreature(NPC_NIGHTBANE, 40.0f)) - if (Creature *cr = ObjectAccessor::GetCreature(*player, pInstance->GetData64(DATA_NIGHTBANE))) + if (Creature* cr = ObjectAccessor::GetCreature(*player, pInstance->GetData64(DATA_NIGHTBANE))) cr->GetMotionMaster()->MovePoint(0, IntroWay[0][0], IntroWay[0][1], IntroWay[0][2]); } - + return false; } }; diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp index 1c8ce4ed2..cff1edacb 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp @@ -94,7 +94,7 @@ public: uint32 HellfireTimer; uint32 CleanupTimer; uint64 malchezaar; - InfernalPoint *point; + InfernalPoint* point; void Reset() { } void EnterCombat(Unit* /*who*/) { } @@ -143,7 +143,7 @@ public: } } - void DamageTaken(Unit* done_by, uint32 &damage, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit* done_by, uint32& damage, DamageEffectType, SpellSchoolMask) { if (!done_by || done_by->GetGUID() != malchezaar) damage = 0; @@ -246,7 +246,7 @@ public: if (!info) return; - ThreatContainer::StorageType const &t_list = me->getThreatManager().getThreatList(); + ThreatContainer::StorageType const& t_list = me->getThreatManager().getThreatList(); std::vector targets; if (t_list.empty()) @@ -290,7 +290,7 @@ public: void SummonInfernal() { - InfernalPoint *point = 0; + InfernalPoint* point = 0; Position pos; if ((me->GetMapId() == 532)) @@ -442,82 +442,82 @@ public: } DoMeleeAttackIfReady(); - } - - }; - }; - - class prince_axes : public CreatureScript - { - public: - prince_axes() : CreatureScript("prince_axes") { } - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(creature); } - struct prince_axesAI : public ScriptedAI - { - - prince_axesAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - instance = creature->GetInstanceScript(); - } - - uint32 AxesTargetSwitchTimer; - InstanceScript* instance; - - - void Initialize() - { - AxesTargetSwitchTimer = 7500; - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->SetCanDualWield(true); - } - - void Reset() override - { - } - - void EnterCombat(Unit* /*who*/) override - { - DoZoneInCombat(); - } - - void changetarget() - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - { - if (me->GetVictim()) - DoModifyThreatPercent(me->GetVictim(), -100); - if (target) - me->AddThreat(target, 1000000.0f); - } - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - if (AxesTargetSwitchTimer <= diff) - { - AxesTargetSwitchTimer = urand(7500, 20000); - changetarget(); - } - else - AxesTargetSwitchTimer -= diff; - - DoMeleeAttackIfReady(); - } - }; }; +}; - void AddSC_boss_malchezaar() +class prince_axes : public CreatureScript +{ +public: + prince_axes() : CreatureScript("prince_axes") { } + + CreatureAI* GetAI(Creature* creature) const override { - new boss_malchezaar(); - new prince_axes(); - new netherspite_infernal(); + return GetInstanceAI(creature); } + + struct prince_axesAI : public ScriptedAI + { + + prince_axesAI(Creature* creature) : ScriptedAI(creature) + { + Initialize(); + instance = creature->GetInstanceScript(); + } + + uint32 AxesTargetSwitchTimer; + InstanceScript* instance; + + + void Initialize() + { + AxesTargetSwitchTimer = 7500; + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->SetCanDualWield(true); + } + + void Reset() override + { + } + + void EnterCombat(Unit* /*who*/) override + { + DoZoneInCombat(); + } + + void changetarget() + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) + { + if (me->GetVictim()) + DoModifyThreatPercent(me->GetVictim(), -100); + if (target) + me->AddThreat(target, 1000000.0f); + } + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + if (AxesTargetSwitchTimer <= diff) + { + AxesTargetSwitchTimer = urand(7500, 20000); + changetarget(); + } + else + AxesTargetSwitchTimer -= diff; + + DoMeleeAttackIfReady(); + } + }; +}; + +void AddSC_boss_malchezaar() +{ + new boss_malchezaar(); + new prince_axes(); + new netherspite_infernal(); +} diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_servant_quarters.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_servant_quarters.cpp index 84220f40c..c540669da 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_servant_quarters.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_servant_quarters.cpp @@ -37,126 +37,126 @@ enum ServantQuertersMisc class boss_servant_quarters : public CreatureScript { - public: - boss_servant_quarters() : CreatureScript("boss_servant_quarters") { } +public: + boss_servant_quarters() : CreatureScript("boss_servant_quarters") { } - struct boss_servant_quartersAI : public BossAI + struct boss_servant_quartersAI : public BossAI + { + boss_servant_quartersAI(Creature* creature) : BossAI(creature, DATA_SERVANT_QUARTERS) { } + + void Reset() { - boss_servant_quartersAI(Creature* creature) : BossAI(creature, DATA_SERVANT_QUARTERS) { } + events.Reset(); + me->SetVisible(false); + me->SetReactState(REACT_PASSIVE); + me->setFaction(35); + _events2.Reset(); + _events2.ScheduleEvent(EVENT_CHECK_VISIBILITY, 5000); + if (me->GetEntry() == NPC_HYAKISS_THE_LURKER) + me->CastSpell(me, SPELL_SNEAK, true); - void Reset() - { - events.Reset(); - me->SetVisible(false); - me->SetReactState(REACT_PASSIVE); - me->setFaction(35); - _events2.Reset(); - _events2.ScheduleEvent(EVENT_CHECK_VISIBILITY, 5000); - if (me->GetEntry() == NPC_HYAKISS_THE_LURKER) - me->CastSpell(me, SPELL_SNEAK, true); - - if (instance->GetData(DATA_SELECTED_RARE) != me->GetEntry()) - me->DespawnOrUnsummon(1); - } - - void EnterCombat(Unit* /*who*/) - { - me->setActive(true); - if (me->GetEntry() == NPC_HYAKISS_THE_LURKER) - { - events.ScheduleEvent(EVENT_SPELL_ACIDIC_FANG, 5000); - events.ScheduleEvent(EVENT_SPELL_HYAKISS_WEB, 9000); - } - else if (me->GetEntry() == NPC_SHADIKITH_THE_GLIDER) - { - events.ScheduleEvent(EVENT_SPELL_SONIC_BURST, 4000); - events.ScheduleEvent(EVENT_SPELL_WING_BUFFET, 7000); - events.ScheduleEvent(EVENT_SPELL_DIVE, 10000); - } - else // if (me->GetEntry() == NPC_ROKAD_THE_RAVAGER) - { - events.ScheduleEvent(EVENT_SPELL_RAVAGE, 3000); - } - } - - void JustDied(Unit* /*who*/) - { - } - - void MovementInform(uint32 type, uint32 point) - { - if (type == POINT_MOTION_TYPE && point == EVENT_CHARGE) - events.ScheduleEvent(EVENT_SPELL_FEAR, 0); - } - - void UpdateAI(uint32 diff) - { - _events2.Update(diff); - switch (_events2.ExecuteEvent()) - { - case EVENT_CHECK_VISIBILITY: - if (instance->GetBossState(DATA_SERVANT_QUARTERS) == DONE) - { - me->SetVisible(true); - me->SetReactState(REACT_AGGRESSIVE); - me->RestoreFaction(); - } - else - _events2.ScheduleEvent(EVENT_CHECK_VISIBILITY, 5000); - break; - } - - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_ACIDIC_FANG: - me->CastSpell(me->GetVictim(), SPELL_ACIDIC_FANG, false); - events.ScheduleEvent(EVENT_SPELL_ACIDIC_FANG, urand(12000, 18000)); - break; - case EVENT_SPELL_HYAKISS_WEB: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f)) - me->CastSpell(target, SPELL_HYAKISS_WEB, false); - events.ScheduleEvent(EVENT_SPELL_HYAKISS_WEB, 15000); - break; - case EVENT_SPELL_SONIC_BURST: - me->CastSpell(me, SPELL_SONIC_BURST, false); - events.ScheduleEvent(EVENT_SPELL_SONIC_BURST, urand(12000, 18000)); - break; - case EVENT_SPELL_WING_BUFFET: - me->CastSpell(me, SPELL_WING_BUFFET, false); - events.ScheduleEvent(EVENT_SPELL_WING_BUFFET, urand(12000, 18000)); - break; - case EVENT_SPELL_DIVE: - if (Unit* target = SelectTarget(SELECT_TARGET_FARTHEST, 0, FarthestTargetSelector(me, 40.0f, false, true))) - me->CastSpell(target, SPELL_DIVE, false); - events.ScheduleEvent(EVENT_SPELL_DIVE, 20000); - break; - case EVENT_SPELL_FEAR: - me->CastSpell(me->GetVictim(), SPELL_FEAR, false); - break; - case EVENT_SPELL_RAVAGE: - me->CastSpell(me->GetVictim(), SPELL_RAVAGE, false); - events.ScheduleEvent(EVENT_SPELL_RAVAGE, 10500); - break; - } - - DoMeleeAttackIfReady(); - } - - private: - EventMap _events2; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + if (instance->GetData(DATA_SELECTED_RARE) != me->GetEntry()) + me->DespawnOrUnsummon(1); } + + void EnterCombat(Unit* /*who*/) + { + me->setActive(true); + if (me->GetEntry() == NPC_HYAKISS_THE_LURKER) + { + events.ScheduleEvent(EVENT_SPELL_ACIDIC_FANG, 5000); + events.ScheduleEvent(EVENT_SPELL_HYAKISS_WEB, 9000); + } + else if (me->GetEntry() == NPC_SHADIKITH_THE_GLIDER) + { + events.ScheduleEvent(EVENT_SPELL_SONIC_BURST, 4000); + events.ScheduleEvent(EVENT_SPELL_WING_BUFFET, 7000); + events.ScheduleEvent(EVENT_SPELL_DIVE, 10000); + } + else // if (me->GetEntry() == NPC_ROKAD_THE_RAVAGER) + { + events.ScheduleEvent(EVENT_SPELL_RAVAGE, 3000); + } + } + + void JustDied(Unit* /*who*/) + { + } + + void MovementInform(uint32 type, uint32 point) + { + if (type == POINT_MOTION_TYPE && point == EVENT_CHARGE) + events.ScheduleEvent(EVENT_SPELL_FEAR, 0); + } + + void UpdateAI(uint32 diff) + { + _events2.Update(diff); + switch (_events2.ExecuteEvent()) + { + case EVENT_CHECK_VISIBILITY: + if (instance->GetBossState(DATA_SERVANT_QUARTERS) == DONE) + { + me->SetVisible(true); + me->SetReactState(REACT_AGGRESSIVE); + me->RestoreFaction(); + } + else + _events2.ScheduleEvent(EVENT_CHECK_VISIBILITY, 5000); + break; + } + + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_SPELL_ACIDIC_FANG: + me->CastSpell(me->GetVictim(), SPELL_ACIDIC_FANG, false); + events.ScheduleEvent(EVENT_SPELL_ACIDIC_FANG, urand(12000, 18000)); + break; + case EVENT_SPELL_HYAKISS_WEB: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f)) + me->CastSpell(target, SPELL_HYAKISS_WEB, false); + events.ScheduleEvent(EVENT_SPELL_HYAKISS_WEB, 15000); + break; + case EVENT_SPELL_SONIC_BURST: + me->CastSpell(me, SPELL_SONIC_BURST, false); + events.ScheduleEvent(EVENT_SPELL_SONIC_BURST, urand(12000, 18000)); + break; + case EVENT_SPELL_WING_BUFFET: + me->CastSpell(me, SPELL_WING_BUFFET, false); + events.ScheduleEvent(EVENT_SPELL_WING_BUFFET, urand(12000, 18000)); + break; + case EVENT_SPELL_DIVE: + if (Unit* target = SelectTarget(SELECT_TARGET_FARTHEST, 0, FarthestTargetSelector(me, 40.0f, false, true))) + me->CastSpell(target, SPELL_DIVE, false); + events.ScheduleEvent(EVENT_SPELL_DIVE, 20000); + break; + case EVENT_SPELL_FEAR: + me->CastSpell(me->GetVictim(), SPELL_FEAR, false); + break; + case EVENT_SPELL_RAVAGE: + me->CastSpell(me->GetVictim(), SPELL_RAVAGE, false); + events.ScheduleEvent(EVENT_SPELL_RAVAGE, 10500); + break; + } + + DoMeleeAttackIfReady(); + } + + private: + EventMap _events2; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; void AddSC_boss_servant_quarters() diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp index 2a4df43fc..2194ec07e 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp @@ -148,7 +148,7 @@ public: void FlameWreathEffect() { std::vector targets; - ThreatContainer::StorageType const &t_list = me->getThreatManager().getThreatList(); + ThreatContainer::StorageType const& t_list = me->getThreatManager().getThreatList(); if (t_list.empty()) return; @@ -192,7 +192,7 @@ public: instance->HandleGameObject(instance->GetData64(DATA_GO_LIBRARY_DOOR), false); CloseDoorTimer = 0; } - else + else CloseDoorTimer -= diff; } @@ -201,7 +201,7 @@ public: { if (ArcaneCooldown >= diff) ArcaneCooldown -= diff; - else + else ArcaneCooldown = 0; } @@ -209,7 +209,7 @@ public: { if (FireCooldown >= diff) FireCooldown -= diff; - else + else FireCooldown = 0; } @@ -217,7 +217,7 @@ public: { if (FrostCooldown >= diff) FrostCooldown -= diff; - else + else FrostCooldown = 0; } @@ -305,24 +305,24 @@ public: } NormalCastTimer = 1000; } - else + else NormalCastTimer -= diff; if (SecondarySpellTimer <= diff) { switch (urand(0, 1)) { - case 0: - DoCast(me, SPELL_AOE_CS); - break; - case 1: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - DoCast(target, SPELL_CHAINSOFICE); - break; + case 0: + DoCast(me, SPELL_AOE_CS); + break; + case 1: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) + DoCast(target, SPELL_CHAINSOFICE); + break; } SecondarySpellTimer = urand(5000, 20000); } - else + else SecondarySpellTimer -= diff; if (SuperCastTimer <= diff) @@ -331,60 +331,60 @@ public: switch (LastSuperSpell) { - case SUPER_AE: - Available[0] = SUPER_FLAME; - Available[1] = SUPER_BLIZZARD; - break; - case SUPER_FLAME: - Available[0] = SUPER_AE; - Available[1] = SUPER_BLIZZARD; - break; - case SUPER_BLIZZARD: - Available[0] = SUPER_FLAME; - Available[1] = SUPER_AE; - break; + case SUPER_AE: + Available[0] = SUPER_FLAME; + Available[1] = SUPER_BLIZZARD; + break; + case SUPER_FLAME: + Available[0] = SUPER_AE; + Available[1] = SUPER_BLIZZARD; + break; + case SUPER_BLIZZARD: + Available[0] = SUPER_FLAME; + Available[1] = SUPER_AE; + break; } LastSuperSpell = Available[urand(0, 1)]; switch (LastSuperSpell) { - case SUPER_AE: - Talk(SAY_EXPLOSION); + case SUPER_AE: + Talk(SAY_EXPLOSION); - DoCast(me, SPELL_BLINK_CENTER, true); - DoCast(me, SPELL_PLAYERPULL, true); - DoCast(me, SPELL_MASSSLOW, true); - DoCast(me, SPELL_AEXPLOSION, false); - break; + DoCast(me, SPELL_BLINK_CENTER, true); + DoCast(me, SPELL_PLAYERPULL, true); + DoCast(me, SPELL_MASSSLOW, true); + DoCast(me, SPELL_AEXPLOSION, false); + break; - case SUPER_FLAME: - Talk(SAY_FLAMEWREATH); + case SUPER_FLAME: + Talk(SAY_FLAMEWREATH); - FlameWreathTimer = 20000; - FlameWreathCheckTime = 500; + FlameWreathTimer = 20000; + FlameWreathCheckTime = 500; - FlameWreathTarget[0] = 0; - FlameWreathTarget[1] = 0; - FlameWreathTarget[2] = 0; + FlameWreathTarget[0] = 0; + FlameWreathTarget[1] = 0; + FlameWreathTarget[2] = 0; - FlameWreathEffect(); - break; + FlameWreathEffect(); + break; - case SUPER_BLIZZARD: - Talk(SAY_BLIZZARD); + case SUPER_BLIZZARD: + Talk(SAY_BLIZZARD); - if (Creature* pSpawn = me->SummonCreature(CREATURE_ARAN_BLIZZARD, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 25000)) - { - pSpawn->setFaction(me->getFaction()); - pSpawn->CastSpell(pSpawn, SPELL_CIRCULAR_BLIZZARD, false); - } - break; + if (Creature* pSpawn = me->SummonCreature(CREATURE_ARAN_BLIZZARD, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 25000)) + { + pSpawn->setFaction(me->getFaction()); + pSpawn->CastSpell(pSpawn, SPELL_CIRCULAR_BLIZZARD, false); + } + break; } SuperCastTimer = urand(35000, 40000); } - else + else SuperCastTimer -= diff; if (!ElementalsSpawned && HealthBelowPct(40)) @@ -479,7 +479,7 @@ public: BerserkTimer = 60000; } - else + else BerserkTimer -= diff; //Flame Wreath check @@ -487,7 +487,7 @@ public: { if (FlameWreathTimer >= diff) FlameWreathTimer -= diff; - else + else FlameWreathTimer = 0; if (FlameWreathCheckTime <= diff) @@ -507,7 +507,7 @@ public: } FlameWreathCheckTime = 500; } - else + else FlameWreathCheckTime -= diff; } @@ -515,7 +515,7 @@ public: DoMeleeAttackIfReady(); } - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) { if (!DrinkInturrupted && Drinking && damage) DrinkInturrupted = true; @@ -525,8 +525,8 @@ public: { //We only care about interrupt effects and only if they are durring a spell currently being cast if ((Spell->Effects[0].Effect != SPELL_EFFECT_INTERRUPT_CAST && - Spell->Effects[1].Effect != SPELL_EFFECT_INTERRUPT_CAST && - Spell->Effects[2].Effect != SPELL_EFFECT_INTERRUPT_CAST) || !me->IsNonMeleeSpellCast(false)) + Spell->Effects[1].Effect != SPELL_EFFECT_INTERRUPT_CAST && + Spell->Effects[2].Effect != SPELL_EFFECT_INTERRUPT_CAST) || !me->IsNonMeleeSpellCast(false)) return; //Interrupt effect @@ -537,9 +537,15 @@ public: switch (CurrentNormalSpell) { - case SPELL_ARCMISSLE: ArcaneCooldown = 5000; break; - case SPELL_FIREBALL: FireCooldown = 5000; break; - case SPELL_FROSTBOLT: FrostCooldown = 5000; break; + case SPELL_ARCMISSLE: + ArcaneCooldown = 5000; + break; + case SPELL_FIREBALL: + FireCooldown = 5000; + break; + case SPELL_FROSTBOLT: + FrostCooldown = 5000; + break; } } }; diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp index 80995c124..9fb6c9bc8 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp @@ -108,7 +108,8 @@ public: DoCastVictim(SPELL_AMPLIFY_FLAMES); AmplifyTimer = urand(10000, 20000); - } else + } + else AmplifyTimer -= diff; DoMeleeAttackIfReady(); @@ -166,7 +167,7 @@ public: struct npc_fiendish_portalAI : public PassiveAI { - npc_fiendish_portalAI(Creature* creature) : PassiveAI(creature), summons(me){ } + npc_fiendish_portalAI(Creature* creature) : PassiveAI(creature), summons(me) { } SummonList summons; @@ -223,7 +224,8 @@ public: { DoCastVictim(SPELL_FIREBOLT); FireboltTimer = 2200; - } else + } + else FireboltTimer -= diff; DoMeleeAttackIfReady(); @@ -302,7 +304,7 @@ public: DoCast(me, SPELL_SUMMON_IMP, true); } } - else + else DoCast(me, SPELL_SUMMON_IMP, true); } @@ -362,16 +364,16 @@ public: SummonKilrekTimer = 45000; } } - + if (SummonKilrekTimer <= diff) - { + { DoCast(me, SPELL_SUMMON_IMP, true); me->RemoveAura(SPELL_BROKEN_PACT); } - else + else SummonKilrekTimer -= diff; - + if (SacrificeTimer <= diff) { Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true); @@ -389,14 +391,16 @@ public: SacrificeTimer = 30000; } } - } else + } + else SacrificeTimer -= diff; if (ShadowboltTimer <= diff) { DoCast(SelectTarget(SELECT_TARGET_TOPAGGRO, 0), SPELL_SHADOW_BOLT); ShadowboltTimer = 10000; - } else + } + else ShadowboltTimer -= diff; if (SummonTimer <= diff) @@ -413,7 +417,8 @@ public: pPortal->CastSpell(me->GetVictim(), SPELL_SUMMON_FIENDISIMP, false); SummonTimer = 5000; } - } else + } + else SummonTimer -= diff; if (!Berserk) @@ -422,7 +427,8 @@ public: { DoCast(me, SPELL_BERSERK); Berserk = true; - } else + } + else BerserkTimer -= diff; } diff --git a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp index b7e47b302..136efdf41 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp @@ -193,7 +193,8 @@ public: { me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); AggroTimer = 0; - } else + } + else AggroTimer -= diff; } @@ -204,14 +205,16 @@ public: { DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0), SPELL_WATERBOLT); WaterBoltTimer = TitoDied ? 1500 : 5000; - } else + } + else WaterBoltTimer -= diff; if (FearTimer <= diff) { DoCastVictim(SPELL_SCREAM); FearTimer = 30000; - } else + } + else FearTimer -= diff; if (!SummonedTito) @@ -277,7 +280,8 @@ public: { DoCastVictim(SPELL_YIPPING); YipTimer = 10000; - } else + } + else YipTimer -= diff; DoMeleeAttackIfReady(); @@ -357,7 +361,7 @@ public: void SpellHit(Unit* /*caster*/, const SpellInfo* Spell) { - if ((Spell->SchoolMask == SPELL_SCHOOL_MASK_FIRE) && (!(rand()%10))) + if ((Spell->SchoolMask == SPELL_SCHOOL_MASK_FIRE) && (!(rand() % 10))) { /* if (not direct damage(aoe, dot)) @@ -388,7 +392,8 @@ public: { me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); AggroTimer = 0; - } else + } + else AggroTimer -= diff; } @@ -399,7 +404,8 @@ public: { DoCastVictim(SPELL_BRAIN_BASH); BrainBashTimer = 15000; - } else + } + else BrainBashTimer -= diff; if (BrainWipeTimer <= diff) @@ -407,7 +413,8 @@ public: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_BRAIN_WIPE); BrainWipeTimer = 20000; - } else + } + else BrainWipeTimer -= diff; DoMeleeAttackIfReady(); @@ -497,7 +504,8 @@ public: { me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); AggroTimer = 0; - } else + } + else AggroTimer -= diff; } @@ -508,7 +516,8 @@ public: { DoCastVictim(SPELL_CLEAVE); CleaveTimer = 5000; - } else + } + else CleaveTimer -= diff; if (RustCount < 8) @@ -519,7 +528,8 @@ public: Talk(EMOTE_RUST); DoCast(me, SPELL_RUST); RustTimer = 6000; - } else + } + else RustTimer -= diff; } @@ -608,7 +618,8 @@ public: { me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); AggroTimer = 0; - } else + } + else AggroTimer -= diff; } @@ -619,21 +630,24 @@ public: { DoCastVictim(SPELL_MANGLE); MangleTimer = urand(5000, 8000); - } else + } + else MangleTimer -= diff; if (ShredTimer <= diff) { DoCastVictim(SPELL_SHRED); ShredTimer = urand(10000, 15000); - } else + } + else ShredTimer -= diff; if (ScreamTimer <= diff) { DoCastVictim(SPELL_FRIGHTENED_SCREAM); ScreamTimer = urand(20000, 30000); - } else + } + else ScreamTimer -= diff; DoMeleeAttackIfReady(); @@ -677,7 +691,7 @@ public: void KilledUnit(Unit* /*victim*/) { - Talk(SAY_CRONE_SLAY); + Talk(SAY_CRONE_SLAY); } void EnterCombat(Unit* /*who*/) @@ -703,14 +717,16 @@ public: if (Creature* Cyclone = DoSpawnCreature(CREATURE_CYCLONE, float(urand(0, 9)), float(urand(0, 9)), 0, 0, TEMPSUMMON_TIMED_DESPAWN, 15000)) Cyclone->CastSpell(Cyclone, SPELL_CYCLONE_VISUAL, true); CycloneTimer = 22000; - } else + } + else CycloneTimer -= diff; if (ChainLightningTimer <= diff) { DoCastVictim(SPELL_CHAIN_LIGHTNING); ChainLightningTimer = 8000; - } else + } + else ChainLightningTimer -= diff; DoMeleeAttackIfReady(); @@ -757,7 +773,8 @@ public: me->GetRandomNearPosition(pos, 10); me->GetMotionMaster()->MovePoint(0, pos); MoveTimer = urand(3000, 5000); - } else + } + else MoveTimer -= diff; } }; @@ -795,7 +812,7 @@ public: ClearGossipMenuFor(player); if (action == GOSSIP_ACTION_INFO_DEF) { - if (Creature* pBigBadWolf = creature->SummonCreature(CREATURE_BIG_BAD_WOLF, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, HOUR*2*IN_MILLISECONDS)) + if (Creature* pBigBadWolf = creature->SummonCreature(CREATURE_BIG_BAD_WOLF, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, HOUR * 2 * IN_MILLISECONDS)) pBigBadWolf->AI()->AttackStart(player); creature->DespawnOrUnsummon(); @@ -915,7 +932,8 @@ public: ChaseTimer = 40000; } - } else + } + else ChaseTimer -= diff; if (IsChasing) @@ -925,14 +943,16 @@ public: { DoCastVictim(SPELL_TERRIFYING_HOWL); FearTimer = urand(25000, 35000); - } else + } + else FearTimer -= diff; if (SwipeTimer <= diff) { DoCastVictim(SPELL_WIDE_SWIPE); SwipeTimer = urand(25000, 30000); - } else + } + else SwipeTimer -= diff; } }; @@ -1007,8 +1027,8 @@ void Resurrect(Creature* target) target->GetMotionMaster()->MoveChase(target->GetVictim()); target->AI()->AttackStart(target->GetVictim()); } - else - target->GetMotionMaster()->Initialize(); + else + target->GetMotionMaster()->Initialize(); } class boss_julianne : public CreatureScript @@ -1112,7 +1132,7 @@ public: } } - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask); + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask); void JustDied(Unit*) { @@ -1123,7 +1143,7 @@ public: void KilledUnit(Unit* /*victim*/) { - Talk(SAY_JULIANNE_SLAY); + Talk(SAY_JULIANNE_SLAY); } void UpdateAI(uint32 diff); @@ -1185,7 +1205,7 @@ public: me->DespawnOrUnsummon(); } - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) { if (damage < me->GetHealth()) return; @@ -1293,7 +1313,8 @@ public: JulianneDead = false; ResurrectTimer = 10000; } - } else + } + else ResurrectTimer -= diff; } @@ -1305,14 +1326,16 @@ public: DoCast(target, SPELL_BACKWARD_LUNGE); BackwardLungeTimer = urand(15000, 30000); } - } else + } + else BackwardLungeTimer -= diff; if (DaringTimer <= diff) { DoCast(me, SPELL_DARING); DaringTimer = urand(20000, 40000); - } else + } + else DaringTimer -= diff; if (DeadlySwatheTimer <= diff) @@ -1320,14 +1343,16 @@ public: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_DEADLY_SWATHE); DeadlySwatheTimer = urand(15000, 25000); - } else + } + else DeadlySwatheTimer -= diff; if (PoisonThrustTimer <= diff) { DoCastVictim(SPELL_POISON_THRUST); PoisonThrustTimer = urand(10000, 20000); - } else + } + else PoisonThrustTimer -= diff; DoMeleeAttackIfReady(); @@ -1343,7 +1368,8 @@ void boss_julianne::boss_julianneAI::UpdateAI(uint32 diff) { Talk(SAY_JULIANNE_ENTER); EntryYellTimer = 0; - } else + } + else EntryYellTimer -= diff; } @@ -1355,7 +1381,8 @@ void boss_julianne::boss_julianneAI::UpdateAI(uint32 diff) me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->setFaction(16); AggroYellTimer = 0; - } else + } + else AggroYellTimer -= diff; } @@ -1368,7 +1395,8 @@ void boss_julianne::boss_julianneAI::UpdateAI(uint32 diff) Phase = PHASE_ROMULO; SummonRomuloTimer = 10000; DrinkPoisonTimer = 0; - } else + } + else DrinkPoisonTimer -= diff; } @@ -1376,7 +1404,7 @@ void boss_julianne::boss_julianneAI::UpdateAI(uint32 diff) { if (SummonRomuloTimer <= diff) { - if (Creature* pRomulo = me->SummonCreature(CREATURE_ROMULO, ROMULO_X, ROMULO_Y, me->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, HOUR*2*IN_MILLISECONDS)) + if (Creature* pRomulo = me->SummonCreature(CREATURE_ROMULO, ROMULO_X, ROMULO_Y, me->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, HOUR * 2 * IN_MILLISECONDS)) { RomuloGUID = pRomulo->GetGUID(); CAST_AI(boss_romulo::boss_romuloAI, pRomulo->AI())->JulianneGUID = me->GetGUID(); @@ -1386,7 +1414,8 @@ void boss_julianne::boss_julianneAI::UpdateAI(uint32 diff) pRomulo->setFaction(16); } SummonedRomulo = true; - } else + } + else SummonRomuloTimer -= diff; } @@ -1403,7 +1432,8 @@ void boss_julianne::boss_julianneAI::UpdateAI(uint32 diff) ResurrectSelfTimer = 0; ResurrectTimer = 1000; - } else + } + else ResurrectSelfTimer -= diff; } @@ -1423,7 +1453,8 @@ void boss_julianne::boss_julianneAI::UpdateAI(uint32 diff) RomuloDead = false; ResurrectTimer = 10000; } - } else + } + else ResurrectTimer -= diff; } @@ -1432,21 +1463,24 @@ void boss_julianne::boss_julianneAI::UpdateAI(uint32 diff) if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_BLINDING_PASSION); BlindingPassionTimer = urand(30000, 45000); - } else + } + else BlindingPassionTimer -= diff; if (DevotionTimer <= diff) { DoCast(me, SPELL_DEVOTION); DevotionTimer = urand(15000, 45000); - } else + } + else DevotionTimer -= diff; if (PowerfulAttractionTimer <= diff) { DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0), SPELL_POWERFUL_ATTRACTION); PowerfulAttractionTimer = urand(5000, 30000); - } else + } + else PowerfulAttractionTimer -= diff; if (EternalAffectionTimer <= diff) @@ -1456,16 +1490,18 @@ void boss_julianne::boss_julianneAI::UpdateAI(uint32 diff) Creature* Romulo = (ObjectAccessor::GetCreature((*me), RomuloGUID)); if (Romulo && Romulo->IsAlive() && !RomuloDead) DoCast(Romulo, SPELL_ETERNAL_AFFECTION); - } else DoCast(me, SPELL_ETERNAL_AFFECTION); + } + else DoCast(me, SPELL_ETERNAL_AFFECTION); EternalAffectionTimer = urand(45000, 60000); - } else + } + else EternalAffectionTimer -= diff; DoMeleeAttackIfReady(); } -void boss_julianne::boss_julianneAI::DamageTaken(Unit* /*done_by*/, uint32 &damage, DamageEffectType, SpellSchoolMask) +void boss_julianne::boss_julianneAI::DamageTaken(Unit* /*done_by*/, uint32& damage, DamageEffectType, SpellSchoolMask) { if (damage < me->GetHealth()) return; diff --git a/src/server/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp b/src/server/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp index bef4cf16f..8ef16fd73 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp @@ -68,36 +68,36 @@ public: switch (creature->GetEntry()) { - case NPC_COLDMIST_WIDOW: - case NPC_COLDMIST_STALKER: - case NPC_SHADOWBAT: - case NPC_VAMPIRIC_SHADOWBAT: - case NPC_GREATER_SHADOWBAT: - case NPC_PHASE_HOUND: - case NPC_DREADBEAST: - case NPC_SHADOWBEAST: - if (GetBossState(DATA_OPTIONAL_BOSS) == TO_BE_DECIDED) - { - ++OptionalBossCount; - if (OptionalBossCount == OPTIONAL_BOSS_REQUIRED_DEATH_COUNT) + case NPC_COLDMIST_WIDOW: + case NPC_COLDMIST_STALKER: + case NPC_SHADOWBAT: + case NPC_VAMPIRIC_SHADOWBAT: + case NPC_GREATER_SHADOWBAT: + case NPC_PHASE_HOUND: + case NPC_DREADBEAST: + case NPC_SHADOWBEAST: + if (GetBossState(DATA_OPTIONAL_BOSS) == TO_BE_DECIDED) { - switch (urand(NPC_HYAKISS_THE_LURKER, NPC_ROKAD_THE_RAVAGER)) + ++OptionalBossCount; + if (OptionalBossCount == OPTIONAL_BOSS_REQUIRED_DEATH_COUNT) { - case NPC_HYAKISS_THE_LURKER: - instance->SummonCreature(NPC_HYAKISS_THE_LURKER, OptionalSpawn[0]); - break; - case NPC_SHADIKITH_THE_GLIDER: - instance->SummonCreature(NPC_SHADIKITH_THE_GLIDER, OptionalSpawn[1]); - break; - case NPC_ROKAD_THE_RAVAGER: - instance->SummonCreature(NPC_ROKAD_THE_RAVAGER, OptionalSpawn[2]); - break; + switch (urand(NPC_HYAKISS_THE_LURKER, NPC_ROKAD_THE_RAVAGER)) + { + case NPC_HYAKISS_THE_LURKER: + instance->SummonCreature(NPC_HYAKISS_THE_LURKER, OptionalSpawn[0]); + break; + case NPC_SHADIKITH_THE_GLIDER: + instance->SummonCreature(NPC_SHADIKITH_THE_GLIDER, OptionalSpawn[1]); + break; + case NPC_ROKAD_THE_RAVAGER: + instance->SummonCreature(NPC_ROKAD_THE_RAVAGER, OptionalSpawn[2]); + break; + } } } - } - break; - default: - break; + break; + default: + break; } } @@ -105,12 +105,12 @@ public: { switch (type) { - case DATA_OPERA_OZ_DEATHCOUNT: - if (data == SPECIAL) - ++OzDeathCount; - else if (data == IN_PROGRESS) - OzDeathCount = 0; - break; + case DATA_OPERA_OZ_DEATHCOUNT: + if (data == SPECIAL) + ++OzDeathCount; + else if (data == IN_PROGRESS) + OzDeathCount = 0; + break; } } @@ -121,22 +121,22 @@ public: switch (type) { - case DATA_OPERA_PERFORMANCE: - if (state == DONE) - { - HandleGameObject(m_uiStageDoorLeftGUID, true); - HandleGameObject(m_uiStageDoorRightGUID, true); - if (GameObject* sideEntrance = instance->GetGameObject(m_uiSideEntranceDoor)) - sideEntrance->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); - instance->UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, 16812, nullptr); - } - break; - case DATA_CHESS: - if (state == DONE) - DoRespawnGameObject(DustCoveredChest, DAY); - break; - default: - break; + case DATA_OPERA_PERFORMANCE: + if (state == DONE) + { + HandleGameObject(m_uiStageDoorLeftGUID, true); + HandleGameObject(m_uiStageDoorRightGUID, true); + if (GameObject* sideEntrance = instance->GetGameObject(m_uiSideEntranceDoor)) + sideEntrance->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); + instance->UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, 16812, nullptr); + } + break; + case DATA_CHESS: + if (state == DONE) + DoRespawnGameObject(DustCoveredChest, DAY); + break; + default: + break; } return true; @@ -152,71 +152,71 @@ public: { switch (go->GetEntry()) { - case GO_STAGE_CURTAIN: - m_uiCurtainGUID = go->GetGUID(); - break; - case GO_STAGE_DOOR_LEFT: - m_uiStageDoorLeftGUID = go->GetGUID(); - if (GetBossState(DATA_OPERA_PERFORMANCE) == DONE) - go->SetGoState(GO_STATE_ACTIVE); - break; - case GO_STAGE_DOOR_RIGHT: - m_uiStageDoorRightGUID = go->GetGUID(); - if (GetBossState(DATA_OPERA_PERFORMANCE) == DONE) - go->SetGoState(GO_STATE_ACTIVE); - break; - case GO_PRIVATE_LIBRARY_DOOR: - m_uiLibraryDoor = go->GetGUID(); - break; - case GO_MASSIVE_DOOR: - m_uiMassiveDoor = go->GetGUID(); - if (GetBossState(DATA_ARAN) != IN_PROGRESS) - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); - else - go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); - break; - case GO_GAMESMAN_HALL_DOOR: - m_uiGamesmansDoor = go->GetGUID(); - break; - case GO_GAMESMAN_HALL_EXIT_DOOR: - m_uiGamesmansExitDoor = go->GetGUID(); - break; - case GO_NETHERSPACE_DOOR: - m_uiNetherspaceDoor = go->GetGUID(); - if (GetBossState(DATA_PRINCE) != IN_PROGRESS) - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); - else - go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); - break; - case GO_MASTERS_TERRACE_DOOR: - MastersTerraceDoor[0] = go->GetGUID(); - break; - case GO_MASTERS_TERRACE_DOOR2: - MastersTerraceDoor[1] = go->GetGUID(); - break; - case GO_SIDE_ENTRANCE_DOOR: - m_uiSideEntranceDoor = go->GetGUID(); - if (GetBossState(DATA_OPERA_PERFORMANCE) == DONE) - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); - else - go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); - break; - case GO_DUST_COVERED_CHEST: - DustCoveredChest = go->GetGUID(); - break; + case GO_STAGE_CURTAIN: + m_uiCurtainGUID = go->GetGUID(); + break; + case GO_STAGE_DOOR_LEFT: + m_uiStageDoorLeftGUID = go->GetGUID(); + if (GetBossState(DATA_OPERA_PERFORMANCE) == DONE) + go->SetGoState(GO_STATE_ACTIVE); + break; + case GO_STAGE_DOOR_RIGHT: + m_uiStageDoorRightGUID = go->GetGUID(); + if (GetBossState(DATA_OPERA_PERFORMANCE) == DONE) + go->SetGoState(GO_STATE_ACTIVE); + break; + case GO_PRIVATE_LIBRARY_DOOR: + m_uiLibraryDoor = go->GetGUID(); + break; + case GO_MASSIVE_DOOR: + m_uiMassiveDoor = go->GetGUID(); + if (GetBossState(DATA_ARAN) != IN_PROGRESS) + go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); + else + go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); + break; + case GO_GAMESMAN_HALL_DOOR: + m_uiGamesmansDoor = go->GetGUID(); + break; + case GO_GAMESMAN_HALL_EXIT_DOOR: + m_uiGamesmansExitDoor = go->GetGUID(); + break; + case GO_NETHERSPACE_DOOR: + m_uiNetherspaceDoor = go->GetGUID(); + if (GetBossState(DATA_PRINCE) != IN_PROGRESS) + go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); + else + go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); + break; + case GO_MASTERS_TERRACE_DOOR: + MastersTerraceDoor[0] = go->GetGUID(); + break; + case GO_MASTERS_TERRACE_DOOR2: + MastersTerraceDoor[1] = go->GetGUID(); + break; + case GO_SIDE_ENTRANCE_DOOR: + m_uiSideEntranceDoor = go->GetGUID(); + if (GetBossState(DATA_OPERA_PERFORMANCE) == DONE) + go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); + else + go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); + break; + case GO_DUST_COVERED_CHEST: + DustCoveredChest = go->GetGUID(); + break; } switch (OperaEvent) { /// @todo Set Object visibilities for Opera based on performance - case EVENT_OZ: - break; + case EVENT_OZ: + break; - case EVENT_HOOD: - break; + case EVENT_HOOD: + break; - case EVENT_RAJ: - break; + case EVENT_RAJ: + break; } } @@ -224,41 +224,41 @@ public: { switch (type) { - case DATA_OPERA_PERFORMANCE: - return OperaEvent; - case DATA_OPERA_OZ_DEATHCOUNT: - return OzDeathCount; + case DATA_OPERA_PERFORMANCE: + return OperaEvent; + case DATA_OPERA_OZ_DEATHCOUNT: + return OzDeathCount; - case DATA_KILREK: - return m_uiKilrekGUID; - case DATA_TERESTIAN: - return m_uiTerestianGUID; - case DATA_MOROES: - return m_uiMoroesGUID; - case DATA_GO_STAGEDOORLEFT: - return m_uiStageDoorLeftGUID; - case DATA_GO_STAGEDOORRIGHT: - return m_uiStageDoorRightGUID; - case DATA_GO_CURTAINS: - return m_uiCurtainGUID; - case DATA_GO_LIBRARY_DOOR: - return m_uiLibraryDoor; - case DATA_GO_MASSIVE_DOOR: - return m_uiMassiveDoor; - case DATA_GO_SIDE_ENTRANCE_DOOR: - return m_uiSideEntranceDoor; - case DATA_GO_GAME_DOOR: - return m_uiGamesmansDoor; - case DATA_GO_GAME_EXIT_DOOR: - return m_uiGamesmansExitDoor; - case DATA_GO_NETHER_DOOR: - return m_uiNetherspaceDoor; - case DATA_MASTERS_TERRACE_DOOR_1: - return MastersTerraceDoor[0]; - case DATA_MASTERS_TERRACE_DOOR_2: - return MastersTerraceDoor[1]; - case DATA_IMAGE_OF_MEDIVH: - return ImageGUID; + case DATA_KILREK: + return m_uiKilrekGUID; + case DATA_TERESTIAN: + return m_uiTerestianGUID; + case DATA_MOROES: + return m_uiMoroesGUID; + case DATA_GO_STAGEDOORLEFT: + return m_uiStageDoorLeftGUID; + case DATA_GO_STAGEDOORRIGHT: + return m_uiStageDoorRightGUID; + case DATA_GO_CURTAINS: + return m_uiCurtainGUID; + case DATA_GO_LIBRARY_DOOR: + return m_uiLibraryDoor; + case DATA_GO_MASSIVE_DOOR: + return m_uiMassiveDoor; + case DATA_GO_SIDE_ENTRANCE_DOOR: + return m_uiSideEntranceDoor; + case DATA_GO_GAME_DOOR: + return m_uiGamesmansDoor; + case DATA_GO_GAME_EXIT_DOOR: + return m_uiGamesmansExitDoor; + case DATA_GO_NETHER_DOOR: + return m_uiNetherspaceDoor; + case DATA_MASTERS_TERRACE_DOOR_1: + return MastersTerraceDoor[0]; + case DATA_MASTERS_TERRACE_DOOR_2: + return MastersTerraceDoor[1]; + case DATA_IMAGE_OF_MEDIVH: + return ImageGUID; } return 0; @@ -268,22 +268,38 @@ public: { switch (data) { - case DATA_KILREK: return m_uiKilrekGUID; - case DATA_TERESTIAN: return m_uiTerestianGUID; - case DATA_MOROES: return m_uiMoroesGUID; - case DATA_GO_STAGEDOORLEFT: return m_uiStageDoorLeftGUID; - case DATA_GO_STAGEDOORRIGHT: return m_uiStageDoorRightGUID; - case DATA_GO_CURTAINS: return m_uiCurtainGUID; - case DATA_GO_LIBRARY_DOOR: return m_uiLibraryDoor; - case DATA_GO_MASSIVE_DOOR: return m_uiMassiveDoor; - case DATA_GO_SIDE_ENTRANCE_DOOR: return m_uiSideEntranceDoor; - case DATA_GO_GAME_DOOR: return m_uiGamesmansDoor; - case DATA_GO_GAME_EXIT_DOOR: return m_uiGamesmansExitDoor; - case DATA_GO_NETHER_DOOR: return m_uiNetherspaceDoor; - case DATA_MASTERS_TERRACE_DOOR_1: return MastersTerraceDoor[0]; - case DATA_MASTERS_TERRACE_DOOR_2: return MastersTerraceDoor[1]; - case DATA_IMAGE_OF_MEDIVH: return ImageGUID; - case DATA_NIGHTBANE: return m_uiNightBaneGUID; + case DATA_KILREK: + return m_uiKilrekGUID; + case DATA_TERESTIAN: + return m_uiTerestianGUID; + case DATA_MOROES: + return m_uiMoroesGUID; + case DATA_GO_STAGEDOORLEFT: + return m_uiStageDoorLeftGUID; + case DATA_GO_STAGEDOORRIGHT: + return m_uiStageDoorRightGUID; + case DATA_GO_CURTAINS: + return m_uiCurtainGUID; + case DATA_GO_LIBRARY_DOOR: + return m_uiLibraryDoor; + case DATA_GO_MASSIVE_DOOR: + return m_uiMassiveDoor; + case DATA_GO_SIDE_ENTRANCE_DOOR: + return m_uiSideEntranceDoor; + case DATA_GO_GAME_DOOR: + return m_uiGamesmansDoor; + case DATA_GO_GAME_EXIT_DOOR: + return m_uiGamesmansExitDoor; + case DATA_GO_NETHER_DOOR: + return m_uiNetherspaceDoor; + case DATA_MASTERS_TERRACE_DOOR_1: + return MastersTerraceDoor[0]; + case DATA_MASTERS_TERRACE_DOOR_2: + return MastersTerraceDoor[1]; + case DATA_IMAGE_OF_MEDIVH: + return ImageGUID; + case DATA_NIGHTBANE: + return m_uiNightBaneGUID; } return 0; diff --git a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp index d4712181c..7e5df0fa3 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp @@ -1,8 +1,8 @@ - /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license: https://github.com/azerothcore/azerothcore-wotlk/blob/master/LICENSE-GPL2 - * Copyright (C) 2008-2016 TrinityCore - * Copyright (C) 2005-2009 MaNGOS - */ +/* +* Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license: https://github.com/azerothcore/azerothcore-wotlk/blob/master/LICENSE-GPL2 +* Copyright (C) 2008-2016 TrinityCore +* Copyright (C) 2005-2009 MaNGOS +*/ /* ScriptData SDName: Karazhan @@ -71,7 +71,7 @@ struct Dialogue uint32 timer; }; -static Dialogue OzDialogue[]= +static Dialogue OzDialogue[] = { {0, 6000}, {1, 18000}, @@ -79,7 +79,7 @@ static Dialogue OzDialogue[]= {3, 15000} }; -static Dialogue HoodDialogue[]= +static Dialogue HoodDialogue[] = { {4, 6000}, {5, 10000}, @@ -87,7 +87,7 @@ static Dialogue HoodDialogue[]= {7, 15000} }; -static Dialogue RAJDialogue[]= +static Dialogue RAJDialogue[] = { {8, 5000}, {9, 7000}, @@ -96,7 +96,7 @@ static Dialogue RAJDialogue[]= }; // Entries and spawn locations for creatures in Oz event -float Spawns[6][2]= +float Spawns[6][2] = { {17535, -10896}, // Dorothee {17546, -10891}, // Roar @@ -175,8 +175,8 @@ public: SetEscortPaused(true); if (Creature* spotlight = me->SummonCreature(NPC_SPOTLIGHT, - me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0.0f, - TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000)) + me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0.0f, + TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000)) { spotlight->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); spotlight->CastSpell(spotlight, SPELL_SPOTLIGHT, false); @@ -202,7 +202,7 @@ public: { case EVENT_OZ: if (OzDialogue[count].textid) - text = OzDialogue[count].textid; + text = OzDialogue[count].textid; if (OzDialogue[count].timer) TalkTimer = OzDialogue[count].timer; break; @@ -215,15 +215,15 @@ public: break; case EVENT_RAJ: - if (RAJDialogue[count].textid) - text = RAJDialogue[count].textid; + if (RAJDialogue[count].textid) + text = RAJDialogue[count].textid; if (RAJDialogue[count].timer) TalkTimer = RAJDialogue[count].timer; break; } if (text) - CreatureAI::Talk(text); + CreatureAI::Talk(text); } void PrepareEncounter() @@ -242,11 +242,11 @@ public: break; case EVENT_HOOD: index = 4; - count = index+1; + count = index + 1; break; case EVENT_RAJ: index = 5; - count = index+1; + count = index + 1; break; } @@ -255,7 +255,7 @@ public: uint32 entry = ((uint32)Spawns[index][0]); float PosX = Spawns[index][1]; - if (Creature* creature = me->SummonCreature(entry, PosX, SPAWN_Y, SPAWN_Z, SPAWN_O, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, HOUR*2*IN_MILLISECONDS)) + if (Creature* creature = me->SummonCreature(entry, PosX, SPAWN_Y, SPAWN_Z, SPAWN_O, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, HOUR * 2 * IN_MILLISECONDS)) { // In case database has bad flags creature->SetUInt32Value(UNIT_FIELD_FLAGS, 0); @@ -285,7 +285,8 @@ public: Talk(TalkCount); ++TalkCount; - } else TalkTimer -= diff; + } + else TalkTimer -= diff; } if (PerformanceReady) @@ -298,7 +299,7 @@ public: if (!map->IsDungeon()) return; - Map::PlayerList const &PlayerList = map->GetPlayers(); + Map::PlayerList const& PlayerList = map->GetPlayers(); if (PlayerList.isEmpty()) return; @@ -320,7 +321,8 @@ public: } WipeTimer = 15000; - } else WipeTimer -= diff; + } + else WipeTimer -= diff; } } } @@ -334,7 +336,7 @@ public: switch (action) { case GOSSIP_ACTION_INFO_DEF+1: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, OZ_GOSSIP2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, OZ_GOSSIP2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); SendGossipMenuFor(player, 8971, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+2: @@ -479,80 +481,80 @@ public: { switch(Step) { - case 1: - me->MonsterYell(SAY_DIALOG_MEDIVH_1, LANG_UNIVERSAL, 0); - return 10000; - case 2: - if (Creature* arca = ObjectAccessor::GetCreature((*me), ArcanagosGUID)) - arca->MonsterYell(SAY_DIALOG_ARCANAGOS_2, LANG_UNIVERSAL, 0); - return 20000; - case 3: - me->MonsterYell(SAY_DIALOG_MEDIVH_3, LANG_UNIVERSAL, 0); - return 10000; - case 4: - if (Creature* arca = ObjectAccessor::GetCreature((*me), ArcanagosGUID)) - arca->MonsterYell(SAY_DIALOG_ARCANAGOS_4, LANG_UNIVERSAL, 0); - return 20000; - case 5: - me->MonsterYell(SAY_DIALOG_MEDIVH_5, LANG_UNIVERSAL, 0); - return 20000; - case 6: - if (Creature* arca = ObjectAccessor::GetCreature((*me), ArcanagosGUID)) - arca->MonsterYell(SAY_DIALOG_ARCANAGOS_6, LANG_UNIVERSAL, 0); + case 1: + me->MonsterYell(SAY_DIALOG_MEDIVH_1, LANG_UNIVERSAL, 0); + return 10000; + case 2: + if (Creature* arca = ObjectAccessor::GetCreature((*me), ArcanagosGUID)) + arca->MonsterYell(SAY_DIALOG_ARCANAGOS_2, LANG_UNIVERSAL, 0); + return 20000; + case 3: + me->MonsterYell(SAY_DIALOG_MEDIVH_3, LANG_UNIVERSAL, 0); + return 10000; + case 4: + if (Creature* arca = ObjectAccessor::GetCreature((*me), ArcanagosGUID)) + arca->MonsterYell(SAY_DIALOG_ARCANAGOS_4, LANG_UNIVERSAL, 0); + return 20000; + case 5: + me->MonsterYell(SAY_DIALOG_MEDIVH_5, LANG_UNIVERSAL, 0); + return 20000; + case 6: + if (Creature* arca = ObjectAccessor::GetCreature((*me), ArcanagosGUID)) + arca->MonsterYell(SAY_DIALOG_ARCANAGOS_6, LANG_UNIVERSAL, 0); - ATimer = 5500; - MTimer = 6600; - return 10000; - case 7: - return 1000; - case 8: - me->CastSpell(me, SPELL_MANA_SHIELD, true); - return 5500; - case 9: - me->MonsterTextEmote(EMOTE_DIALOG_MEDIVH_7, 0, false); - me->CastSpell(me, 30972, true); - return 10000; - case 10: - me->RemoveAurasDueToSpell(30972); - if (Creature* arca = ObjectAccessor::GetCreature((*me), ArcanagosGUID)) - me->CastSpell(arca, SPELL_CONFLAGRATION_BLAST, false); - return 1000; - case 11: - if (Creature* arca = ObjectAccessor::GetCreature((*me), ArcanagosGUID)) - arca->MonsterYell(SAY_DIALOG_ARCANAGOS_8, LANG_UNIVERSAL, 0); - return 5000; - case 12: - if (Creature* arca = ObjectAccessor::GetCreature((*me), ArcanagosGUID)) - { - arca->SetSpeed(MOVE_RUN, 2.0f); - arca->GetMotionMaster()->MovePoint(0, -11010.82f, -1761.18f, 156.47f); - arca->InterruptNonMeleeSpells(true); - } - return 10000; - case 13: - me->MonsterYell(SAY_DIALOG_MEDIVH_9, LANG_UNIVERSAL, 0); - return 10000; - case 14: - if (me->GetMap()->IsDungeon()) - { - InstanceMap::PlayerList const &PlayerList = me->GetMap()->GetPlayers(); - for (InstanceMap::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) + ATimer = 5500; + MTimer = 6600; + return 10000; + case 7: + return 1000; + case 8: + me->CastSpell(me, SPELL_MANA_SHIELD, true); + return 5500; + case 9: + me->MonsterTextEmote(EMOTE_DIALOG_MEDIVH_7, 0, false); + me->CastSpell(me, 30972, true); + return 10000; + case 10: + me->RemoveAurasDueToSpell(30972); + if (Creature* arca = ObjectAccessor::GetCreature((*me), ArcanagosGUID)) + me->CastSpell(arca, SPELL_CONFLAGRATION_BLAST, false); + return 1000; + case 11: + if (Creature* arca = ObjectAccessor::GetCreature((*me), ArcanagosGUID)) + arca->MonsterYell(SAY_DIALOG_ARCANAGOS_8, LANG_UNIVERSAL, 0); + return 5000; + case 12: + if (Creature* arca = ObjectAccessor::GetCreature((*me), ArcanagosGUID)) { - if (i->GetSource()->GetQuestStatus(9645) == QUEST_STATUS_INCOMPLETE) + arca->SetSpeed(MOVE_RUN, 2.0f); + arca->GetMotionMaster()->MovePoint(0, -11010.82f, -1761.18f, 156.47f); + arca->InterruptNonMeleeSpells(true); + } + return 10000; + case 13: + me->MonsterYell(SAY_DIALOG_MEDIVH_9, LANG_UNIVERSAL, 0); + return 10000; + case 14: + if (me->GetMap()->IsDungeon()) + { + InstanceMap::PlayerList const& PlayerList = me->GetMap()->GetPlayers(); + for (InstanceMap::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) { - i->GetSource()->GroupEventHappens(9645, me); - break; + if (i->GetSource()->GetQuestStatus(9645) == QUEST_STATUS_INCOMPLETE) + { + i->GetSource()->GroupEventHappens(9645, me); + break; + } } } - } - me->DespawnOrUnsummon(100); - if (Creature* arca = ObjectAccessor::GetCreature((*me), ArcanagosGUID)) - arca->DespawnOrUnsummon(100); + me->DespawnOrUnsummon(100); + if (Creature* arca = ObjectAccessor::GetCreature((*me), ArcanagosGUID)) + arca->DespawnOrUnsummon(100); - return 5000; - default: - return 2000; + return 5000; + default: + return 2000; } } @@ -564,7 +566,8 @@ public: { if (EventStarted) YellTimer = NextStep(Step++); - } else YellTimer -= diff; + } + else YellTimer -= diff; if (Step >= 7 && Step <= 8) { diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp index c94dab2af..d4443a048 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp @@ -94,7 +94,7 @@ public: summons.DespawnAll(); me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, false); instance->SetData(DATA_KAELTHAS_EVENT, NOT_STARTED); - 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); } void JustSummoned(Creature* summon) @@ -108,7 +108,7 @@ public: void InitializeAI() { ScriptedAI::InitializeAI(); - 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); } void JustDied(Unit*) @@ -146,11 +146,11 @@ public: { if (damage >= me->GetHealth()) { - damage = me->GetHealth()-1; + damage = me->GetHealth() - 1; if (me->isRegeneratingHealth()) { me->SetRegeneratingHealth(false); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE|UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); me->CombatStop(); me->SetReactState(REACT_PASSIVE); LapseAction(ACTION_REMOVE_FLY); @@ -160,7 +160,7 @@ public: } } } - + void LapseAction(uint8 action) { uint8 counter = 0; @@ -169,7 +169,7 @@ public: if (Player* player = itr->GetSource()) { if (action == ACTION_TELEPORT_PLAYERS) - me->CastSpell(player, SPELL_GRAVITY_LAPSE_PLAYER+counter, true); + me->CastSpell(player, SPELL_GRAVITY_LAPSE_PLAYER + counter, true); else if (action == ACTION_KNOCKUP) player->CastSpell(player, SPELL_GRAVITY_LAPSE_DOT, true, nullptr, nullptr, me->GetGUID()); else if (action == ACTION_ALLOW_FLY) @@ -188,7 +188,7 @@ public: switch (events2.ExecuteEvent()) { case EVENT_INIT_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); if (Unit* target = SelectTargetFromPlayerList(50.0f)) AttackStart(target); return; @@ -285,29 +285,29 @@ public: class spell_mt_phoenix_burn : public SpellScriptLoader { - public: - spell_mt_phoenix_burn() : SpellScriptLoader("spell_mt_phoenix_burn") { } +public: + spell_mt_phoenix_burn() : SpellScriptLoader("spell_mt_phoenix_burn") { } - class spell_mt_phoenix_burn_SpellScript : public SpellScript + class spell_mt_phoenix_burn_SpellScript : public SpellScript + { + PrepareSpellScript(spell_mt_phoenix_burn_SpellScript); + + void HandleAfterCast() { - PrepareSpellScript(spell_mt_phoenix_burn_SpellScript); - - void HandleAfterCast() - { - uint32 damage = CalculatePct(GetCaster()->GetMaxHealth(), 5); - Unit::DealDamage(GetCaster(), GetCaster(), damage); - } - - void Register() - { - AfterCast += SpellCastFn(spell_mt_phoenix_burn_SpellScript::HandleAfterCast); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_mt_phoenix_burn_SpellScript(); + uint32 damage = CalculatePct(GetCaster()->GetMaxHealth(), 5); + Unit::DealDamage(GetCaster(), GetCaster(), damage); } + + void Register() + { + AfterCast += SpellCastFn(spell_mt_phoenix_burn_SpellScript::HandleAfterCast); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_mt_phoenix_burn_SpellScript(); + } }; void AddSC_boss_felblood_kaelthas() diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp index 05167e1f5..8a3cc5cbb 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp @@ -33,7 +33,7 @@ enum Misc MAX_HELPERS_COUNT = 8 }; -const Position helpersLocations[MAX_ACTIVE_HELPERS]= +const Position helpersLocations[MAX_ACTIVE_HELPERS] = { {123.77f, 17.6007f, -19.921f, 4.98f}, {131.731f, 15.0827f, -19.921f, 4.98f}, @@ -163,7 +163,7 @@ public: { Talk(SAY_DEATH); - if (HelpersKilled == MAX_ACTIVE_HELPERS+1) + if (HelpersKilled == MAX_ACTIVE_HELPERS + 1) instance->SetData(DATA_DELRISSA_EVENT, DONE); } @@ -197,28 +197,34 @@ public: events.ScheduleEvent(EVENT_SPELL_RENEW, 7000); break; case EVENT_SPELL_PW_SHIELD: - { - std::list cList = DoFindFriendlyMissingBuff(40.0f, DUNGEON_MODE(SPELL_POWER_WORD_SHIELD_N, SPELL_POWER_WORD_SHIELD_H)); - if (Unit* target = acore::Containers::SelectRandomContainerElement(cList)) - me->CastSpell(target, DUNGEON_MODE(SPELL_POWER_WORD_SHIELD_N, SPELL_POWER_WORD_SHIELD_H), false); - events.ScheduleEvent(EVENT_SPELL_PW_SHIELD, 10000); - break; - } - case EVENT_SPELL_DISPEL: - { - Unit* target = nullptr; - switch (urand(0, 2)) { - case 0: target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30, true); break; - case 1: target = me; break; - case 2: target = ObjectAccessor::GetCreature(*me, acore::Containers::SelectRandomContainerElement(summons)); break; + std::list cList = DoFindFriendlyMissingBuff(40.0f, DUNGEON_MODE(SPELL_POWER_WORD_SHIELD_N, SPELL_POWER_WORD_SHIELD_H)); + if (Unit* target = acore::Containers::SelectRandomContainerElement(cList)) + me->CastSpell(target, DUNGEON_MODE(SPELL_POWER_WORD_SHIELD_N, SPELL_POWER_WORD_SHIELD_H), false); + events.ScheduleEvent(EVENT_SPELL_PW_SHIELD, 10000); + break; } + case EVENT_SPELL_DISPEL: + { + Unit* target = nullptr; + switch (urand(0, 2)) + { + case 0: + target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30, true); + break; + case 1: + target = me; + break; + case 2: + target = ObjectAccessor::GetCreature(*me, acore::Containers::SelectRandomContainerElement(summons)); + break; + } - if (target) - me->CastSpell(target, SPELL_DISPEL_MAGIC, false); - events.ScheduleEvent(EVENT_SPELL_DISPEL, 12000); - break; - } + if (target) + me->CastSpell(target, SPELL_DISPEL_MAGIC, false); + events.ScheduleEvent(EVENT_SPELL_DISPEL, 12000); + break; + } case EVENT_SPELL_IMMUNITY: if (me->HasUnitState(UNIT_STATE_LOST_CONTROL)) { @@ -269,11 +275,12 @@ struct boss_priestess_lackey_commonAI : public ScriptedAI float GetThreatMod(float dist, float /*armor*/, uint32 health, uint32 /*maxhealth*/, Unit* target) { float unimportant_dist = (aiType == AI_TYPE_MELEE ? 5.0f : 25.0f); - if (dist > unimportant_dist) dist -= unimportant_dist; else dist = 0.0f; + if (dist > unimportant_dist) dist -= unimportant_dist; + else dist = 0.0f; const float dist_factor = (aiType == AI_TYPE_MELEE ? 15.0f : 25.0f); - float mod_dist = dist_factor/(dist_factor + dist); // 0.2 .. 1.0 - float mod_health = health > 20000 ? 2.0f : (40000-health)/10000.0f; // 2.0 .. 4.0 - float mod_armor = aiType == AI_TYPE_MELEE ? Unit::CalcArmorReducedDamage(me, target, 10000, nullptr)/10000.0f : 1.0f; + float mod_dist = dist_factor / (dist_factor + dist); // 0.2 .. 1.0 + float mod_health = health > 20000 ? 2.0f : (40000 - health) / 10000.0f; // 2.0 .. 4.0 + float mod_armor = aiType == AI_TYPE_MELEE ? Unit::CalcArmorReducedDamage(me, target, 10000, nullptr) / 10000.0f : 1.0f; return mod_dist * mod_health * mod_armor; } @@ -299,7 +306,7 @@ struct boss_priestess_lackey_commonAI : public ScriptedAI summons.DespawnAll(); actualEventId = 0; } - + void JustSummoned(Creature* summon) { summons.Summon(summon); @@ -496,7 +503,7 @@ enum WarlockEnum EVENT_SPELL_IMMOLATE = 1, EVENT_SPELL_SHADOW_BOLT = 2, - EVENT_SPELL_SEED_OF_CORRUPTION= 3, + EVENT_SPELL_SEED_OF_CORRUPTION = 3, EVENT_SPELL_CURSE_OF_AGONY = 4, EVENT_SPELL_FEAR = 5, }; @@ -721,22 +728,22 @@ public: events.ScheduleEvent(EVENT_SPELL_FROSTBOLT, 8000); break; case EVENT_SPELL_BLINK: - { - bool InMeleeRange = false; - ThreatContainer::StorageType const &t_list = me->getThreatManager().getThreatList(); - for (ThreatContainer::StorageType::const_iterator itr = t_list.begin(); itr!= t_list.end(); ++itr) - if (Unit* target = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid())) - if (target->IsWithinMeleeRange(me)) - { - InMeleeRange = true; - break; - } + { + bool InMeleeRange = false; + ThreatContainer::StorageType const& t_list = me->getThreatManager().getThreatList(); + for (ThreatContainer::StorageType::const_iterator itr = t_list.begin(); itr != t_list.end(); ++itr) + if (Unit* target = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid())) + if (target->IsWithinMeleeRange(me)) + { + InMeleeRange = true; + break; + } - if (InMeleeRange) - me->CastSpell(me, SPELL_BLINK, false); - events.ScheduleEvent(EVENT_SPELL_BLINK, 15000); - break; - } + if (InMeleeRange) + me->CastSpell(me, SPELL_BLINK, false); + events.ScheduleEvent(EVENT_SPELL_BLINK, 15000); + break; + } } DoMeleeAttackIfReady(); @@ -1083,17 +1090,17 @@ public: events.ScheduleEvent(EVENT_SPELL_IRON_BOMB, 20000); break; case EVENT_SPELL_RECOMBOBULATE: - { - std::list cList = DoFindFriendlyMissingBuff(30.0f, SPELL_RECOMBOBULATE); - for (std::list::const_iterator itr = cList.begin(); itr != cList.end(); ++itr) - if ((*itr)->IsPolymorphed()) - { - me->CastSpell(*itr, SPELL_RECOMBOBULATE, false); - break; - } - events.ScheduleEvent(EVENT_SPELL_RECOMBOBULATE, 10000); - break; - } + { + std::list cList = DoFindFriendlyMissingBuff(30.0f, SPELL_RECOMBOBULATE); + for (std::list::const_iterator itr = cList.begin(); itr != cList.end(); ++itr) + if ((*itr)->IsPolymorphed()) + { + me->CastSpell(*itr, SPELL_RECOMBOBULATE, false); + break; + } + events.ScheduleEvent(EVENT_SPELL_RECOMBOBULATE, 10000); + break; + } case EVENT_SPELL_EXPLOSIVE_SHEEP: me->CastSpell(me, SPELL_HIGH_EXPLOSIVE_SHEEP, false); events.ScheduleEvent(EVENT_SPELL_EXPLOSIVE_SHEEP, 60000); diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp index bc4569e08..069e05208 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp @@ -106,10 +106,10 @@ public: events.ScheduleEvent(EVENT_SPELL_DRAIN_LIFE, 2500, 1); events.ScheduleEvent(EVENT_SPELL_FEL_EXPLOSION, 2000); events.ScheduleEvent(EVENT_DRAIN_CRYSTAL, 14000); - + if (IsHeroic()) events.ScheduleEvent(EVENT_SPELL_DRAIN_MANA, 7500, 1); - } + } void KilledUnit(Unit* victim) { diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp index b45cd20ea..fd129ad9f 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp @@ -140,7 +140,7 @@ public: me->CastSpell(me, SPELL_OVERLOAD, true); return; } - + Talk(SAY_ENERGY); Talk(EMOTE_DISCHARGE_ENERGY); diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp index b54c5f57a..cd1c09961 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp @@ -30,7 +30,7 @@ public: void Initialize() { memset(&Encounter, 0, sizeof(Encounter)); - + VexallusDoorGUID = 0; SelinDoorGUID = 0; SelinEncounterDoorGUID = 0; @@ -130,7 +130,7 @@ public: HandleGameObject(0, true, go); VexallusDoorGUID = go->GetGUID(); break; - + case GO_DELRISSA_DOOR: if (GetData(DATA_DELRISSA_EVENT) == DONE) HandleGameObject(0, true, go); diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp index 4a941b241..2690930f4 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp @@ -72,7 +72,7 @@ public: void SetControl(Player* player, bool on) { - WorldPacket data(SMSG_CLIENT_CONTROL_UPDATE, me->GetPackGUID().size()+1); + WorldPacket data(SMSG_CLIENT_CONTROL_UPDATE, me->GetPackGUID().size() + 1); data.append(me->GetPackGUID()); data << uint8(on ? 1 : 0); player->GetSession()->SendPacket(&data); @@ -100,16 +100,16 @@ public: Talk(EYE_TEXT_LAUNCH, me->GetCharmerOrOwnerPlayerOrPlayerItself()); break; case EVENT_LAUNCH: - { - me->SetSpeed(MOVE_FLIGHT, 5.0f, true); + { + me->SetSpeed(MOVE_FLIGHT, 5.0f, true); - const Position EYE_DESTINATION_1 = { me->GetPositionX()-40.0f, me->GetPositionY(), me->GetPositionZ()+10.0f, 0.0f }; - const Position EYE_DESTINATION_2 = { 1768.0f, -5876.0f, 153.0f, 0.0f }; + const Position EYE_DESTINATION_1 = { me->GetPositionX() - 40.0f, me->GetPositionY(), me->GetPositionZ() + 10.0f, 0.0f }; + const Position EYE_DESTINATION_2 = { 1768.0f, -5876.0f, 153.0f, 0.0f }; - me->GetMotionMaster()->MovePoint(EYE_POINT_DESTINATION_1, EYE_DESTINATION_1); - me->GetMotionMaster()->MovePoint(EYE_POINT_DESTINATION_2, EYE_DESTINATION_2); - break; - } + me->GetMotionMaster()->MovePoint(EYE_POINT_DESTINATION_1, EYE_DESTINATION_1); + me->GetMotionMaster()->MovePoint(EYE_POINT_DESTINATION_2, EYE_DESTINATION_2); + break; + } case EVENT_REGAIN_CONTROL: if (Player* player = me->GetCharmerOrOwnerPlayerOrPlayerItself()) { @@ -127,30 +127,30 @@ public: class spell_q12641_death_comes_from_on_high_summon_ghouls : public SpellScriptLoader { - public: - spell_q12641_death_comes_from_on_high_summon_ghouls() : SpellScriptLoader("spell_q12641_death_comes_from_on_high_summon_ghouls") { } +public: + spell_q12641_death_comes_from_on_high_summon_ghouls() : SpellScriptLoader("spell_q12641_death_comes_from_on_high_summon_ghouls") { } - class spell_q12641_death_comes_from_on_high_summon_ghouls_SpellScript : public SpellScript + class spell_q12641_death_comes_from_on_high_summon_ghouls_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q12641_death_comes_from_on_high_summon_ghouls_SpellScript); + + void HandleScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_q12641_death_comes_from_on_high_summon_ghouls_SpellScript); - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitEffect(effIndex); - if (Unit* target = GetHitUnit()) - GetCaster()->CastSpell(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 54522, true); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_q12641_death_comes_from_on_high_summon_ghouls_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_q12641_death_comes_from_on_high_summon_ghouls_SpellScript(); + PreventHitEffect(effIndex); + if (Unit* target = GetHitUnit()) + GetCaster()->CastSpell(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 54522, true); } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_q12641_death_comes_from_on_high_summon_ghouls_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_q12641_death_comes_from_on_high_summon_ghouls_SpellScript(); + } }; enum deathsChallenge @@ -261,11 +261,11 @@ public: me->GetMotionMaster()->MoveFollow(caster, 2.0f, 0.0f); events.ScheduleEvent(EVENT_SPEAK, 3000); - events.ScheduleEvent(EVENT_SPEAK+1, 7000); - events.ScheduleEvent(EVENT_SPEAK+2, 8000); - events.ScheduleEvent(EVENT_SPEAK+3, 9000); - events.ScheduleEvent(EVENT_SPEAK+4, 10000); - events.ScheduleEvent(EVENT_SPEAK+5, 11000); + events.ScheduleEvent(EVENT_SPEAK + 1, 7000); + events.ScheduleEvent(EVENT_SPEAK + 2, 8000); + events.ScheduleEvent(EVENT_SPEAK + 3, 9000); + events.ScheduleEvent(EVENT_SPEAK + 4, 10000); + events.ScheduleEvent(EVENT_SPEAK + 5, 11000); } } @@ -279,7 +279,7 @@ public: { damage = 0; events.ScheduleEvent(EVENT_DUEL_LOST, 2000); - events.ScheduleEvent(EVENT_DUEL_LOST+1, 6000); + events.ScheduleEvent(EVENT_DUEL_LOST + 1, 6000); _duelGUID = 0; _duelInProgress = 0; @@ -315,16 +315,16 @@ public: Talk(SAY_DUEL, ObjectAccessor::GetPlayer(*me, _duelGUID)); break; case EVENT_SPEAK+1: - Talk(SAY_DUEL+1, ObjectAccessor::GetPlayer(*me, _duelGUID)); + Talk(SAY_DUEL + 1, ObjectAccessor::GetPlayer(*me, _duelGUID)); break; case EVENT_SPEAK+2: - Talk(SAY_DUEL+2, ObjectAccessor::GetPlayer(*me, _duelGUID)); + Talk(SAY_DUEL + 2, ObjectAccessor::GetPlayer(*me, _duelGUID)); break; case EVENT_SPEAK+3: - Talk(SAY_DUEL+3, ObjectAccessor::GetPlayer(*me, _duelGUID)); + Talk(SAY_DUEL + 3, ObjectAccessor::GetPlayer(*me, _duelGUID)); break; case EVENT_SPEAK+4: - Talk(SAY_DUEL+4, ObjectAccessor::GetPlayer(*me, _duelGUID)); + Talk(SAY_DUEL + 4, ObjectAccessor::GetPlayer(*me, _duelGUID)); break; case EVENT_SPEAK+5: me->setFaction(FACTION_HOSTILE); @@ -377,63 +377,63 @@ enum GiftOfTheHarvester class spell_item_gift_of_the_harvester : public SpellScriptLoader { - public: - spell_item_gift_of_the_harvester() : SpellScriptLoader("spell_item_gift_of_the_harvester") { } +public: + spell_item_gift_of_the_harvester() : SpellScriptLoader("spell_item_gift_of_the_harvester") { } - class spell_item_gift_of_the_harvester_SpellScript : public SpellScript + class spell_item_gift_of_the_harvester_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_gift_of_the_harvester_SpellScript); + + SpellCastResult CheckRequirement() { - PrepareSpellScript(spell_item_gift_of_the_harvester_SpellScript); - - SpellCastResult CheckRequirement() + std::list ghouls; + GetCaster()->GetAllMinionsByEntry(ghouls, NPC_GHOUL); + if (ghouls.size() >= MAX_GHOULS) { - std::list ghouls; - GetCaster()->GetAllMinionsByEntry(ghouls, NPC_GHOUL); - if (ghouls.size() >= MAX_GHOULS) - { - SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_TOO_MANY_GHOULS); - return SPELL_FAILED_CUSTOM_ERROR; - } - - return SPELL_CAST_OK; + SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_TOO_MANY_GHOULS); + return SPELL_FAILED_CUSTOM_ERROR; } - void Register() override - { - OnCheckCast += SpellCheckCastFn(spell_item_gift_of_the_harvester_SpellScript::CheckRequirement); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_item_gift_of_the_harvester_SpellScript(); + return SPELL_CAST_OK; } + + void Register() override + { + OnCheckCast += SpellCheckCastFn(spell_item_gift_of_the_harvester_SpellScript::CheckRequirement); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_item_gift_of_the_harvester_SpellScript(); + } }; class spell_q12698_the_gift_that_keeps_on_giving : public SpellScriptLoader { - public: - spell_q12698_the_gift_that_keeps_on_giving() : SpellScriptLoader("spell_q12698_the_gift_that_keeps_on_giving") { } +public: + spell_q12698_the_gift_that_keeps_on_giving() : SpellScriptLoader("spell_q12698_the_gift_that_keeps_on_giving") { } - class spell_q12698_the_gift_that_keeps_on_giving_SpellScript : public SpellScript + class spell_q12698_the_gift_that_keeps_on_giving_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q12698_the_gift_that_keeps_on_giving_SpellScript); + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_q12698_the_gift_that_keeps_on_giving_SpellScript); - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) - { - if (GetOriginalCaster() && GetHitUnit()) - GetOriginalCaster()->CastSpell(GetHitUnit(), urand(0, 1) ? GetEffectValue() : SPELL_SUMMON_SCARLET_GHOST, true); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_q12698_the_gift_that_keeps_on_giving_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_q12698_the_gift_that_keeps_on_giving_SpellScript(); + if (GetOriginalCaster() && GetHitUnit()) + GetOriginalCaster()->CastSpell(GetHitUnit(), urand(0, 1) ? GetEffectValue() : SPELL_SUMMON_SCARLET_GHOST, true); } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_q12698_the_gift_that_keeps_on_giving_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_q12698_the_gift_that_keeps_on_giving_SpellScript(); + } }; class npc_scarlet_ghoul : public CreatureScript @@ -507,7 +507,7 @@ public: me->SetReactState(REACT_DEFENSIVE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); if (Player* owner = me->GetCharmerOrOwnerPlayerOrPlayerItself()) - me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, frand(0.0f, 2*M_PI)); + me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, frand(0.0f, 2 * M_PI)); events.PopEvent(); events.ScheduleEvent(EVENT_GHOUL_CHECK_COMBAT, 1000); return; @@ -567,7 +567,7 @@ public: creature->CastSpell(owner, 52517, true); creature->AI()->SetGUID(me->GetGUID()); - creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); + creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); } } @@ -611,7 +611,7 @@ public: if (summonAttackers >= 15000) { for (uint8 i = 0; i < 15; ++i) - if (Creature* summon = me->SummonCreature(28834 /*NPC_SCARLET_FLEET_DEFENDER*/, 2192.56f+irand(-10, 10), -6147.90f+irand(-10, 10), 5.2f, 4.7f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 45000)) + if (Creature* summon = me->SummonCreature(28834 /*NPC_SCARLET_FLEET_DEFENDER*/, 2192.56f + irand(-10, 10), -6147.90f + irand(-10, 10), 5.2f, 4.7f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 45000)) { summon->SetHomePosition(me->GetHomePosition()); summon->AI()->AttackStart(me); @@ -770,103 +770,103 @@ public: { switch (phase) { - case PHASE_CHAINED: - if (!anchorGUID) - { - if (Creature* anchor = me->FindNearestCreature(29521, 30)) + case PHASE_CHAINED: + if (!anchorGUID) { - anchor->AI()->SetGUID(me->GetGUID()); - anchor->CastSpell(me, SPELL_SOUL_PRISON_CHAIN, true); - anchorGUID = anchor->GetGUID(); - } - - float dist = 99.0f; - GameObject* prison = nullptr; - - for (uint8 i = 0; i < 12; ++i) - { - if (GameObject* temp_prison = me->FindNearestGameObject(acherus_soul_prison[i], 100)) + if (Creature* anchor = me->FindNearestCreature(29521, 30)) { - if (temp_prison && me->IsWithinDist(temp_prison, dist, false)) + anchor->AI()->SetGUID(me->GetGUID()); + anchor->CastSpell(me, SPELL_SOUL_PRISON_CHAIN, true); + anchorGUID = anchor->GetGUID(); + } + + float dist = 99.0f; + GameObject* prison = nullptr; + + for (uint8 i = 0; i < 12; ++i) + { + if (GameObject* temp_prison = me->FindNearestGameObject(acherus_soul_prison[i], 100)) { - dist = me->GetDistance2d(temp_prison); - prison = temp_prison; + if (temp_prison && me->IsWithinDist(temp_prison, dist, false)) + { + dist = me->GetDistance2d(temp_prison); + prison = temp_prison; + } } } + + if (prison) + prison->ResetDoorOrButton(); + } + break; + case PHASE_TO_EQUIP: + if (wait_timer) + { + if (wait_timer > diff) + wait_timer -= diff; + else + { + me->GetMotionMaster()->MovePoint(1, anchorX, anchorY, me->GetPositionZ()); + //sLog->outDebug(LOG_FILTER_TSCR, "npc_unworthy_initiateAI: move to %f %f %f", anchorX, anchorY, me->GetPositionZ()); + phase = PHASE_EQUIPING; + wait_timer = 0; + } + } + break; + case PHASE_TO_ATTACK: + if (wait_timer) + { + if (wait_timer > diff) + wait_timer -= diff; + else + { + me->setFaction(14); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + phase = PHASE_ATTACKING; + + if (Player* target = ObjectAccessor::GetPlayer(*me, playerGUID)) + AttackStart(target); + wait_timer = 0; + } + } + break; + case PHASE_ATTACKING: + if (!UpdateVictim()) + return; + + events.Update(diff); + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_ICY_TOUCH: + DoCastVictim(SPELL_ICY_TOUCH); + events.DelayEvents(1000, GCD_CAST); + events.ScheduleEvent(EVENT_ICY_TOUCH, 5000, GCD_CAST); + break; + case EVENT_PLAGUE_STRIKE: + DoCastVictim(SPELL_PLAGUE_STRIKE); + events.DelayEvents(1000, GCD_CAST); + events.ScheduleEvent(EVENT_PLAGUE_STRIKE, 5000, GCD_CAST); + break; + case EVENT_BLOOD_STRIKE: + DoCastVictim(SPELL_BLOOD_STRIKE); + events.DelayEvents(1000, GCD_CAST); + events.ScheduleEvent(EVENT_BLOOD_STRIKE, 5000, GCD_CAST); + break; + case EVENT_DEATH_COIL: + DoCastVictim(SPELL_DEATH_COIL); + events.DelayEvents(1000, GCD_CAST); + events.ScheduleEvent(EVENT_DEATH_COIL, 5000, GCD_CAST); + break; + } } - if (prison) - prison->ResetDoorOrButton(); - } - break; - case PHASE_TO_EQUIP: - if (wait_timer) - { - if (wait_timer > diff) - wait_timer -= diff; - else - { - me->GetMotionMaster()->MovePoint(1, anchorX, anchorY, me->GetPositionZ()); - //sLog->outDebug(LOG_FILTER_TSCR, "npc_unworthy_initiateAI: move to %f %f %f", anchorX, anchorY, me->GetPositionZ()); - phase = PHASE_EQUIPING; - wait_timer = 0; - } - } - break; - case PHASE_TO_ATTACK: - if (wait_timer) - { - if (wait_timer > diff) - wait_timer -= diff; - else - { - me->setFaction(14); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - phase = PHASE_ATTACKING; - - if (Player* target = ObjectAccessor::GetPlayer(*me, playerGUID)) - AttackStart(target); - wait_timer = 0; - } - } - break; - case PHASE_ATTACKING: - if (!UpdateVictim()) - return; - - events.Update(diff); - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_ICY_TOUCH: - DoCastVictim(SPELL_ICY_TOUCH); - events.DelayEvents(1000, GCD_CAST); - events.ScheduleEvent(EVENT_ICY_TOUCH, 5000, GCD_CAST); - break; - case EVENT_PLAGUE_STRIKE: - DoCastVictim(SPELL_PLAGUE_STRIKE); - events.DelayEvents(1000, GCD_CAST); - events.ScheduleEvent(EVENT_PLAGUE_STRIKE, 5000, GCD_CAST); - break; - case EVENT_BLOOD_STRIKE: - DoCastVictim(SPELL_BLOOD_STRIKE); - events.DelayEvents(1000, GCD_CAST); - events.ScheduleEvent(EVENT_BLOOD_STRIKE, 5000, GCD_CAST); - break; - case EVENT_DEATH_COIL: - DoCastVictim(SPELL_DEATH_COIL); - events.DelayEvents(1000, GCD_CAST); - events.ScheduleEvent(EVENT_DEATH_COIL, 5000, GCD_CAST); - break; - } - } - - DoMeleeAttackIfReady(); - break; - default: - break; + DoMeleeAttackIfReady(); + break; + default: + break; } } }; @@ -942,7 +942,7 @@ public: { npc_scarlet_miner_cartAI(Creature* creature) : PassiveAI(creature), minerGUID(0) { - me->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); + me->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); me->setFaction(35); me->SetDisplayId(me->GetCreatureTemplate()->Modelid1); // Modelid2 is a horse. } @@ -965,7 +965,7 @@ public: me->SetSpeed(MOVE_RUN, 1.25f); me->GetMotionMaster()->MoveFollow(miner, 1.0f, 0); - me->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); + me->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); me->setFaction(35); } } @@ -1076,7 +1076,7 @@ public: { me->SetFacingToObject(car); // xinef: add some flags - car->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); + car->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); car->setFaction(35); } Talk(SAY_SCARLET_MINER_0); @@ -1118,7 +1118,8 @@ public: car->AI()->DoAction(0); IntroPhase = 0; } - } else IntroTimer-=diff; + } + else IntroTimer -= diff; } npc_escortAI::UpdateAI(diff); } @@ -1158,7 +1159,7 @@ public: } } } - + return true; } diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp index 310173113..7eda24340 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp @@ -139,7 +139,8 @@ public: ++speechCounter; DoCastAOE(SPELL_THREAT_PULSE, true); - } else + } + else speechTimer -= diff; return; @@ -347,29 +348,29 @@ public: m_uiWave_Timer = 1000; break; case 4: - { - Creature* temp = ObjectAccessor::GetCreature(*me, m_uiValrothGUID); + { + Creature* temp = ObjectAccessor::GetCreature(*me, m_uiValrothGUID); - if (!temp || !temp->IsAlive()) - { - Talk(SAY_BREAKOUT8); - m_uiWave_Timer = 5000; - } - else - { - // xinef: despawn check - Player* player = GetPlayerForEscort(); - if (!player || me->GetDistance(player) > 60.0f) + if (!temp || !temp->IsAlive()) { - me->DespawnOrUnsummon(); - return; + Talk(SAY_BREAKOUT8); + m_uiWave_Timer = 5000; } + else + { + // xinef: despawn check + Player* player = GetPlayerForEscort(); + if (!player || me->GetDistance(player) > 60.0f) + { + me->DespawnOrUnsummon(); + return; + } - m_uiWave_Timer = 2500; - return; //return, we don't want m_uiWave to increment now + m_uiWave_Timer = 2500; + return; //return, we don't want m_uiWave to increment now + } + break; } - break; - } case 5: Talk(SAY_BREAKOUT9); me->RemoveAurasDueToSpell(SPELL_ANTI_MAGIC_ZONE); @@ -450,25 +451,26 @@ public: { switch (uiStage) { - case 1: - me->SetWalk(true); - if (GameObject* tree = me->FindNearestGameObject(GO_INCONSPICUOUS_TREE, 40.0f)) - { - Talk(SAY_TREE1); - float x, y, z; - tree->GetContactPoint(me, x, y, z); - me->GetMotionMaster()->MovePoint(1, x, y, z); - } - break; - case 2: - if (GameObject* tree = me->FindNearestGameObject(GO_INCONSPICUOUS_TREE, 40.0f)) - if (Unit* unit = tree->GetOwner()) - AttackStart(unit); - break; + case 1: + me->SetWalk(true); + if (GameObject* tree = me->FindNearestGameObject(GO_INCONSPICUOUS_TREE, 40.0f)) + { + Talk(SAY_TREE1); + float x, y, z; + tree->GetContactPoint(me, x, y, z); + me->GetMotionMaster()->MovePoint(1, x, y, z); + } + break; + case 2: + if (GameObject* tree = me->FindNearestGameObject(GO_INCONSPICUOUS_TREE, 40.0f)) + if (Unit* unit = tree->GetOwner()) + AttackStart(unit); + break; } uiStage_timer = 3000; uiStage = 0; - } else uiStage_timer -= diff; + } + else uiStage_timer -= diff; } if (!UpdateVictim()) @@ -484,7 +486,7 @@ public: enum valroth { - //SAY_VALROTH1 = 0, Unused + //SAY_VALROTH1 = 0, Unused SAY_VALROTH_AGGRO = 1, SAY_VALROTH_RAND = 2, SAY_VALROTH_DEATH = 3, @@ -532,28 +534,31 @@ public: Shout(); DoCast(me, SPELL_RENEW); uiRenew_timer = urand(1000, 6000); - } else uiRenew_timer -= diff; + } + else uiRenew_timer -= diff; if (uiInquisitor_Penance_timer <= diff) { Shout(); DoCastVictim(SPELL_INQUISITOR_PENANCE); uiInquisitor_Penance_timer = urand(2000, 7000); - } else uiInquisitor_Penance_timer -= diff; + } + else uiInquisitor_Penance_timer -= diff; if (uiValroth_Smite_timer <= diff) { Shout(); DoCastVictim(SPELL_VALROTH_SMITE); uiValroth_Smite_timer = urand(1000, 6000); - } else uiValroth_Smite_timer -= diff; + } + else uiValroth_Smite_timer -= diff; DoMeleeAttackIfReady(); } void Shout() { - if (rand()%100 < 15) + if (rand() % 100 < 15) Talk(SAY_VALROTH_RAND); } @@ -737,14 +742,30 @@ public: case RACE_HUMAN: switch (ExecuteSpeech_Counter) { - case 0: Talk(SAY_EXEC_START_1, player); break; - case 1: me->SetStandState(UNIT_STAND_STATE_STAND); break; - case 2: Talk(SAY_EXEC_PROG_5, player); break; - case 3: Talk(SAY_EXEC_NAME_1, player); break; - case 4: Talk(SAY_EXEC_RECOG_1, player); break; - case 5: Talk(SAY_EXEC_NOREM_5, player); break; - case 6: Talk(SAY_EXEC_THINK_7, player); break; - case 7: Talk(SAY_EXEC_LISTEN_1, player); break; + case 0: + Talk(SAY_EXEC_START_1, player); + break; + case 1: + me->SetStandState(UNIT_STAND_STATE_STAND); + break; + case 2: + Talk(SAY_EXEC_PROG_5, player); + break; + case 3: + Talk(SAY_EXEC_NAME_1, player); + break; + case 4: + Talk(SAY_EXEC_RECOG_1, player); + break; + case 5: + Talk(SAY_EXEC_NOREM_5, player); + break; + case 6: + Talk(SAY_EXEC_THINK_7, player); + break; + case 7: + Talk(SAY_EXEC_LISTEN_1, player); + break; case 8: if (Creature* Plaguefist = GetClosestCreatureWithEntry(me, NPC_PLAGUEFIST, 85.0f)) Plaguefist->AI()->Talk(SAY_PLAGUEFIST, player); @@ -767,14 +788,30 @@ public: case RACE_ORC: switch (ExecuteSpeech_Counter) { - case 0: Talk(SAY_EXEC_START_1, player); break; - case 1: me->SetStandState(UNIT_STAND_STATE_STAND); break; - case 2: Talk(SAY_EXEC_PROG_6, player); break; - case 3: Talk(SAY_EXEC_NAME_1, player); break; - case 4: Talk(SAY_EXEC_RECOG_1, player); break; - case 5: Talk(SAY_EXEC_NOREM_7, player); break; - case 6: Talk(SAY_EXEC_THINK_8, player); break; - case 7: Talk(SAY_EXEC_LISTEN_1, player); break; + case 0: + Talk(SAY_EXEC_START_1, player); + break; + case 1: + me->SetStandState(UNIT_STAND_STATE_STAND); + break; + case 2: + Talk(SAY_EXEC_PROG_6, player); + break; + case 3: + Talk(SAY_EXEC_NAME_1, player); + break; + case 4: + Talk(SAY_EXEC_RECOG_1, player); + break; + case 5: + Talk(SAY_EXEC_NOREM_7, player); + break; + case 6: + Talk(SAY_EXEC_THINK_8, player); + break; + case 7: + Talk(SAY_EXEC_LISTEN_1, player); + break; case 8: if (Creature* Plaguefist = GetClosestCreatureWithEntry(me, NPC_PLAGUEFIST, 85.0f)) Plaguefist->AI()->Talk(SAY_PLAGUEFIST, player); @@ -797,14 +834,30 @@ public: case RACE_DWARF: switch (ExecuteSpeech_Counter) { - case 0: Talk(SAY_EXEC_START_2, player); break; - case 1: me->SetStandState(UNIT_STAND_STATE_STAND); break; - case 2: Talk(SAY_EXEC_PROG_2, player); break; - case 3: Talk(SAY_EXEC_NAME_1, player); break; - case 4: Talk(SAY_EXEC_RECOG_3, player); break; - case 5: Talk(SAY_EXEC_NOREM_2, player); break; - case 6: Talk(SAY_EXEC_THINK_5, player); break; - case 7: Talk(SAY_EXEC_LISTEN_2, player); break; + case 0: + Talk(SAY_EXEC_START_2, player); + break; + case 1: + me->SetStandState(UNIT_STAND_STATE_STAND); + break; + case 2: + Talk(SAY_EXEC_PROG_2, player); + break; + case 3: + Talk(SAY_EXEC_NAME_1, player); + break; + case 4: + Talk(SAY_EXEC_RECOG_3, player); + break; + case 5: + Talk(SAY_EXEC_NOREM_2, player); + break; + case 6: + Talk(SAY_EXEC_THINK_5, player); + break; + case 7: + Talk(SAY_EXEC_LISTEN_2, player); + break; case 8: if (Creature* Plaguefist = GetClosestCreatureWithEntry(me, NPC_PLAGUEFIST, 85.0f)) Plaguefist->AI()->Talk(SAY_PLAGUEFIST, player); @@ -827,14 +880,30 @@ public: case RACE_NIGHTELF: switch (ExecuteSpeech_Counter) { - case 0: Talk(SAY_EXEC_START_1, player); break; - case 1: me->SetStandState(UNIT_STAND_STATE_STAND); break; - case 2: Talk(SAY_EXEC_PROG_5, player); break; - case 3: Talk(SAY_EXEC_NAME_1, player); break; - case 4: Talk(SAY_EXEC_RECOG_1, player); break; - case 5: Talk(SAY_EXEC_NOREM_6, player); break; - case 6: Talk(SAY_EXEC_THINK_2, player); break; - case 7: Talk(SAY_EXEC_LISTEN_1, player); break; + case 0: + Talk(SAY_EXEC_START_1, player); + break; + case 1: + me->SetStandState(UNIT_STAND_STATE_STAND); + break; + case 2: + Talk(SAY_EXEC_PROG_5, player); + break; + case 3: + Talk(SAY_EXEC_NAME_1, player); + break; + case 4: + Talk(SAY_EXEC_RECOG_1, player); + break; + case 5: + Talk(SAY_EXEC_NOREM_6, player); + break; + case 6: + Talk(SAY_EXEC_THINK_2, player); + break; + case 7: + Talk(SAY_EXEC_LISTEN_1, player); + break; case 8: if (Creature* Plaguefist = GetClosestCreatureWithEntry(me, NPC_PLAGUEFIST, 85.0f)) Plaguefist->AI()->Talk(SAY_PLAGUEFIST, player); @@ -857,14 +926,30 @@ public: case RACE_UNDEAD_PLAYER: switch (ExecuteSpeech_Counter) { - case 0: Talk(SAY_EXEC_START_1, player); break; - case 1: me->SetStandState(UNIT_STAND_STATE_STAND); break; - case 2: Talk(SAY_EXEC_PROG_3, player); break; - case 3: Talk(SAY_EXEC_NAME_1, player); break; - case 4: Talk(SAY_EXEC_RECOG_4, player); break; - case 5: Talk(SAY_EXEC_NOREM_3, player); break; - case 6: Talk(SAY_EXEC_THINK_1, player); break; - case 7: Talk(SAY_EXEC_LISTEN_3, player); break; + case 0: + Talk(SAY_EXEC_START_1, player); + break; + case 1: + me->SetStandState(UNIT_STAND_STATE_STAND); + break; + case 2: + Talk(SAY_EXEC_PROG_3, player); + break; + case 3: + Talk(SAY_EXEC_NAME_1, player); + break; + case 4: + Talk(SAY_EXEC_RECOG_4, player); + break; + case 5: + Talk(SAY_EXEC_NOREM_3, player); + break; + case 6: + Talk(SAY_EXEC_THINK_1, player); + break; + case 7: + Talk(SAY_EXEC_LISTEN_3, player); + break; case 8: if (Creature* Plaguefist = GetClosestCreatureWithEntry(me, NPC_PLAGUEFIST, 85.0f)) Plaguefist->AI()->Talk(SAY_PLAGUEFIST, player); @@ -887,14 +972,30 @@ public: case RACE_TAUREN: switch (ExecuteSpeech_Counter) { - case 0: Talk(SAY_EXEC_START_1, player); break; - case 1: me->SetStandState(UNIT_STAND_STATE_STAND); break; - case 2: Talk(SAY_EXEC_PROG_1, player); break; - case 3: Talk(SAY_EXEC_NAME_1, player); break; - case 4: Talk(SAY_EXEC_RECOG_5, player); break; - case 5: Talk(SAY_EXEC_NOREM_8, player); break; - case 6: Talk(SAY_EXEC_THINK_9, player); break; - case 7: Talk(SAY_EXEC_LISTEN_1, player); break; + case 0: + Talk(SAY_EXEC_START_1, player); + break; + case 1: + me->SetStandState(UNIT_STAND_STATE_STAND); + break; + case 2: + Talk(SAY_EXEC_PROG_1, player); + break; + case 3: + Talk(SAY_EXEC_NAME_1, player); + break; + case 4: + Talk(SAY_EXEC_RECOG_5, player); + break; + case 5: + Talk(SAY_EXEC_NOREM_8, player); + break; + case 6: + Talk(SAY_EXEC_THINK_9, player); + break; + case 7: + Talk(SAY_EXEC_LISTEN_1, player); + break; case 8: if (Creature* Plaguefist = GetClosestCreatureWithEntry(me, NPC_PLAGUEFIST, 85.0f)) Plaguefist->AI()->Talk(SAY_PLAGUEFIST, player); @@ -917,14 +1018,30 @@ public: case RACE_GNOME: switch (ExecuteSpeech_Counter) { - case 0: Talk(SAY_EXEC_START_1, player); break; - case 1: me->SetStandState(UNIT_STAND_STATE_STAND); break; - case 2: Talk(SAY_EXEC_PROG_4, player); break; - case 3: Talk(SAY_EXEC_NAME_1, player); break; - case 4: Talk(SAY_EXEC_RECOG_1, player); break; - case 5: Talk(SAY_EXEC_NOREM_4, player); break; - case 6: Talk(SAY_EXEC_THINK_6, player); break; - case 7: Talk(SAY_EXEC_LISTEN_1, player); break; + case 0: + Talk(SAY_EXEC_START_1, player); + break; + case 1: + me->SetStandState(UNIT_STAND_STATE_STAND); + break; + case 2: + Talk(SAY_EXEC_PROG_4, player); + break; + case 3: + Talk(SAY_EXEC_NAME_1, player); + break; + case 4: + Talk(SAY_EXEC_RECOG_1, player); + break; + case 5: + Talk(SAY_EXEC_NOREM_4, player); + break; + case 6: + Talk(SAY_EXEC_THINK_6, player); + break; + case 7: + Talk(SAY_EXEC_LISTEN_1, player); + break; case 8: if (Creature* Plaguefist = GetClosestCreatureWithEntry(me, NPC_PLAGUEFIST, 85.0f)) Plaguefist->AI()->Talk(SAY_PLAGUEFIST, player); @@ -947,14 +1064,30 @@ public: case RACE_TROLL: switch (ExecuteSpeech_Counter) { - case 0: Talk(SAY_EXEC_START_3, player); break; - case 1: me->SetStandState(UNIT_STAND_STATE_STAND); break; - case 2: Talk(SAY_EXEC_PROG_7, player); break; - case 3: Talk(SAY_EXEC_NAME_2, player); break; - case 4: Talk(SAY_EXEC_RECOG_6, player); break; - case 5: Talk(SAY_EXEC_NOREM_9, player); break; - case 6: Talk(SAY_EXEC_THINK_10, player); break; - case 7: Talk(SAY_EXEC_LISTEN_4, player); break; + case 0: + Talk(SAY_EXEC_START_3, player); + break; + case 1: + me->SetStandState(UNIT_STAND_STATE_STAND); + break; + case 2: + Talk(SAY_EXEC_PROG_7, player); + break; + case 3: + Talk(SAY_EXEC_NAME_2, player); + break; + case 4: + Talk(SAY_EXEC_RECOG_6, player); + break; + case 5: + Talk(SAY_EXEC_NOREM_9, player); + break; + case 6: + Talk(SAY_EXEC_THINK_10, player); + break; + case 7: + Talk(SAY_EXEC_LISTEN_4, player); + break; case 8: if (Creature* Plaguefist = GetClosestCreatureWithEntry(me, NPC_PLAGUEFIST, 85.0f)) Plaguefist->AI()->Talk(SAY_PLAGUEFIST, player); @@ -977,14 +1110,28 @@ public: case RACE_BLOODELF: switch (ExecuteSpeech_Counter) { - case 0: Talk(SAY_EXEC_START_1, player); break; - case 1: me->SetStandState(UNIT_STAND_STATE_STAND); break; - case 2: Talk(SAY_EXEC_PROG_1, player); break; - case 3: Talk(SAY_EXEC_NAME_1, player); break; - case 4: Talk(SAY_EXEC_RECOG_1, player); break; + case 0: + Talk(SAY_EXEC_START_1, player); + break; + case 1: + me->SetStandState(UNIT_STAND_STATE_STAND); + break; + case 2: + Talk(SAY_EXEC_PROG_1, player); + break; + case 3: + Talk(SAY_EXEC_NAME_1, player); + break; + case 4: + Talk(SAY_EXEC_RECOG_1, player); + break; //case 5: //unknown - case 6: Talk(SAY_EXEC_THINK_3, player); break; - case 7: Talk(SAY_EXEC_LISTEN_1, player); break; + case 6: + Talk(SAY_EXEC_THINK_3, player); + break; + case 7: + Talk(SAY_EXEC_LISTEN_1, player); + break; case 8: if (Creature* Plaguefist = GetClosestCreatureWithEntry(me, NPC_PLAGUEFIST, 85.0f)) Plaguefist->AI()->Talk(SAY_PLAGUEFIST, player); @@ -1007,14 +1154,30 @@ public: case RACE_DRAENEI: switch (ExecuteSpeech_Counter) { - case 0: Talk(SAY_EXEC_START_1, player); break; - case 1: me->SetStandState(UNIT_STAND_STATE_STAND); break; - case 2: Talk(SAY_EXEC_PROG_1, player); break; - case 3: Talk(SAY_EXEC_NAME_1, player); break; - case 4: Talk(SAY_EXEC_RECOG_2, player); break; - case 5: Talk(SAY_EXEC_NOREM_1, player); break; - case 6: Talk(SAY_EXEC_THINK_4, player); break; - case 7: Talk(SAY_EXEC_LISTEN_1, player); break; + case 0: + Talk(SAY_EXEC_START_1, player); + break; + case 1: + me->SetStandState(UNIT_STAND_STATE_STAND); + break; + case 2: + Talk(SAY_EXEC_PROG_1, player); + break; + case 3: + Talk(SAY_EXEC_NAME_1, player); + break; + case 4: + Talk(SAY_EXEC_RECOG_2, player); + break; + case 5: + Talk(SAY_EXEC_NOREM_1, player); + break; + case 6: + Talk(SAY_EXEC_THINK_4, player); + break; + case 7: + Talk(SAY_EXEC_LISTEN_1, player); + break; case 8: if (Creature* Plaguefist = GetClosestCreatureWithEntry(me, NPC_PLAGUEFIST, 85.0f)) Plaguefist->AI()->Talk(SAY_PLAGUEFIST, player); @@ -1052,29 +1215,29 @@ public: class spell_q12779_an_end_to_all_things : public SpellScriptLoader { - public: - spell_q12779_an_end_to_all_things() : SpellScriptLoader("spell_q12779_an_end_to_all_things") { } +public: + spell_q12779_an_end_to_all_things() : SpellScriptLoader("spell_q12779_an_end_to_all_things") { } - class spell_q12779_an_end_to_all_things_SpellScript : public SpellScript + class spell_q12779_an_end_to_all_things_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q12779_an_end_to_all_things_SpellScript); + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_q12779_an_end_to_all_things_SpellScript); - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) - { - if (GetHitUnit()) - GetHitUnit()->CastSpell(GetCaster(), GetEffectValue(), true); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_q12779_an_end_to_all_things_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_q12779_an_end_to_all_things_SpellScript(); + if (GetHitUnit()) + GetHitUnit()->CastSpell(GetCaster(), GetEffectValue(), true); } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_q12779_an_end_to_all_things_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_q12779_an_end_to_all_things_SpellScript(); + } }; void AddSC_the_scarlet_enclave_c2() diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp index f14e5df10..63e41b220 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp @@ -302,19 +302,19 @@ const Position LightOfDawnFightPos[] = class DelayedSummonEvent : public BasicEvent { - public: - DelayedSummonEvent(Unit* owner, uint32 entry, Position pos) : _owner(owner), _entry(entry), _pos(pos) { } +public: + DelayedSummonEvent(Unit* owner, uint32 entry, Position pos) : _owner(owner), _entry(entry), _pos(pos) { } - bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/) - { - _owner->SummonCreature(_entry, _pos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000); - return true; - } + bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/) + { + _owner->SummonCreature(_entry, _pos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000); + return true; + } - private: - Unit* _owner; - uint32 _entry; - Position _pos; +private: + Unit* _owner; + uint32 _entry; + Position _pos; }; class npc_highlord_darion_mograine : public CreatureScript @@ -334,7 +334,7 @@ public: if (player->GetQuestStatus(12801) == QUEST_STATUS_INCOMPLETE && !creature->AI()->GetData(WORLD_STATE_SOLDIERS_ENABLE)) AddGossipItemFor(player, 9795, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - + SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); return true; @@ -342,7 +342,7 @@ public: bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override { - if (action == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF + 1) { ClearGossipMenuFor(player); CloseGossipMenuFor(player); @@ -356,8 +356,8 @@ public: npc_highlord_darion_mograineAI(Creature* creature) : ScriptedAI(creature), summons(me) { battleStarted = ENCOUNTER_STATE_NONE; - me->SetCorpseDelay(3*60); - me->SetRespawnTime(3*60); + me->SetCorpseDelay(3 * 60); + me->SetRespawnTime(3 * 60); resetExecuted = false; } @@ -403,12 +403,18 @@ public: { switch (type) { - case WORLD_STATE_DEFENDERS_COUNT: return defendersRemaining; - case WORLD_STATE_SCOURGE_COUNT: return scourgeRemaining; - case WORLD_STATE_SOLDIERS_ENABLE: return me->IsAlive() && (startTimeRemaining || battleStarted); - case WORLD_STATE_COUNTDOWN_ENABLE: return me->IsAlive() && startTimeRemaining; - case WORLD_STATE_COUNTDOWN_TIME: return startTimeRemaining; - case WORLD_STATE_EVENT_BEGIN_ENABLE: return me->IsAlive() && !startTimeRemaining && battleStarted; + case WORLD_STATE_DEFENDERS_COUNT: + return defendersRemaining; + case WORLD_STATE_SCOURGE_COUNT: + return scourgeRemaining; + case WORLD_STATE_SOLDIERS_ENABLE: + return me->IsAlive() && (startTimeRemaining || battleStarted); + case WORLD_STATE_COUNTDOWN_ENABLE: + return me->IsAlive() && startTimeRemaining; + case WORLD_STATE_COUNTDOWN_TIME: + return startTimeRemaining; + case WORLD_STATE_EVENT_BEGIN_ENABLE: + return me->IsAlive() && !startTimeRemaining && battleStarted; } return 0; } @@ -449,7 +455,7 @@ public: if (battleStarted == ENCOUNTER_STATE_OUTRO && cr->GetEntry() == NPC_DEFENDER_OF_THE_LIGHT) { cr->SetReactState(REACT_PASSIVE); - cr->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); + cr->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); cr->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY1H); cr->HandleEmoteCommand(EMOTE_STATE_READY1H); } @@ -480,8 +486,8 @@ public: void JustDied(Unit*) override { summons.DespawnAll(); - me->SetCorpseDelay(3*60); - me->SetRespawnTime(3*60); + me->SetCorpseDelay(3 * 60); + me->SetRespawnTime(3 * 60); } void FinishFight() @@ -530,8 +536,8 @@ public: events.Reset(); summons.DespawnAll(); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); - me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP|UNIT_NPC_FLAG_QUESTGIVER); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); me->SetStandState(UNIT_STAND_STATE_STAND); me->SetVisible(true); me->setActive(true); @@ -634,27 +640,27 @@ public: summons.DoAction(ACTION_PLAY_EMOTE); break; case EVENT_START_COUNTDOWN_13: - { - uint8 first = 1; - for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) { - if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr)) + uint8 first = 1; + for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) { - Position pos = LightOfDawnPos[first]; - summon->SetHomePosition(pos); - summon->GetMotionMaster()->MovePoint(1, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), true, false); + if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr)) + { + Position pos = LightOfDawnPos[first]; + summon->SetHomePosition(pos); + summon->GetMotionMaster()->MovePoint(1, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), true, false); + } + first = first == 0 ? 1 : 0; } - first = first == 0 ? 1 : 0; + Position pos = LightOfDawnPos[first]; + me->SetHomePosition(pos); + me->SetWalk(false); + me->GetMotionMaster()->MovePoint(1, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), true, true); + me->CastSpell(me, SPELL_THE_MIGHT_OF_MOGRAINE, true); + break; } - Position pos = LightOfDawnPos[first]; - me->SetHomePosition(pos); - me->SetWalk(false); - me->GetMotionMaster()->MovePoint(1, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), true, true); - me->CastSpell(me, SPELL_THE_MIGHT_OF_MOGRAINE, true); - break; - } case EVENT_START_COUNTDOWN_14: - 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->SummonCreatureGroup(5); return; case EVENT_FINISH_FIGHT_1: @@ -662,45 +668,45 @@ public: battleStarted = ENCOUNTER_STATE_OUTRO; break; case EVENT_FINISH_FIGHT_2: - { - summons.DespawnEntry(NPC_RAMPAGING_ABOMINATION); - summons.DespawnEntry(NPC_ACHERUS_GHOUL); - summons.DespawnEntry(NPC_WARRIOR_OF_THE_FROZEN_WASTES); - summons.DespawnEntry(NPC_FLESH_BEHEMOTH); - summons.DespawnEntry(NPC_DEFENDER_OF_THE_LIGHT); - - if (Creature* orbaz = GetEntryFromSummons(NPC_ORBAZ_BLOODBANE)) { - orbaz->SetReactState(REACT_PASSIVE); - orbaz->AI()->Talk(EMOTE_LIGHT_OF_DAWN04); - orbaz->GetMotionMaster()->MovePoint(2, LightOfDawnPos[2], true, true); - orbaz->DespawnOrUnsummon(7000); - } + summons.DespawnEntry(NPC_RAMPAGING_ABOMINATION); + summons.DespawnEntry(NPC_ACHERUS_GHOUL); + summons.DespawnEntry(NPC_WARRIOR_OF_THE_FROZEN_WASTES); + summons.DespawnEntry(NPC_FLESH_BEHEMOTH); + summons.DespawnEntry(NPC_DEFENDER_OF_THE_LIGHT); - for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) - if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr)) + if (Creature* orbaz = GetEntryFromSummons(NPC_ORBAZ_BLOODBANE)) { - summon->CombatStop(true); - summon->DeleteThreatList(); - summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); - summon->SetReactState(REACT_PASSIVE); - summon->GetMotionMaster()->Clear(false); + orbaz->SetReactState(REACT_PASSIVE); + orbaz->AI()->Talk(EMOTE_LIGHT_OF_DAWN04); + orbaz->GetMotionMaster()->MovePoint(2, LightOfDawnPos[2], true, true); + orbaz->DespawnOrUnsummon(7000); } - me->CombatStop(true); - me->DeleteThreatList(); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); - me->SetReactState(REACT_PASSIVE); - me->GetMotionMaster()->Clear(false); - // Position main stars - summons.DoAction(ACTION_POSITION_NPCS); + for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) + if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr)) + { + summon->CombatStop(true); + summon->DeleteThreatList(); + summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + summon->SetReactState(REACT_PASSIVE); + summon->GetMotionMaster()->Clear(false); + } + me->CombatStop(true); + me->DeleteThreatList(); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + me->SetReactState(REACT_PASSIVE); + me->GetMotionMaster()->Clear(false); - me->SummonCreature(NPC_DEFENDER_OF_THE_LIGHT, 2276.66f, -5273.60f, 81.86f, 5.14f, TEMPSUMMON_CORPSE_DESPAWN); - me->SummonCreature(NPC_DEFENDER_OF_THE_LIGHT, 2272.11f, -5279.08f, 82.01f, 5.69f, TEMPSUMMON_CORPSE_DESPAWN); - me->SummonCreature(NPC_DEFENDER_OF_THE_LIGHT, 2285.11f, -5276.73f, 82.08f, 4.23f, TEMPSUMMON_CORPSE_DESPAWN); - me->SummonCreature(NPC_DEFENDER_OF_THE_LIGHT, 2290.06f, -5286.41f, 82.51f, 3.16f, TEMPSUMMON_CORPSE_DESPAWN); - break; - } + // Position main stars + summons.DoAction(ACTION_POSITION_NPCS); + + me->SummonCreature(NPC_DEFENDER_OF_THE_LIGHT, 2276.66f, -5273.60f, 81.86f, 5.14f, TEMPSUMMON_CORPSE_DESPAWN); + me->SummonCreature(NPC_DEFENDER_OF_THE_LIGHT, 2272.11f, -5279.08f, 82.01f, 5.69f, TEMPSUMMON_CORPSE_DESPAWN); + me->SummonCreature(NPC_DEFENDER_OF_THE_LIGHT, 2285.11f, -5276.73f, 82.08f, 4.23f, TEMPSUMMON_CORPSE_DESPAWN); + me->SummonCreature(NPC_DEFENDER_OF_THE_LIGHT, 2290.06f, -5286.41f, 82.51f, 3.16f, TEMPSUMMON_CORPSE_DESPAWN); + break; + } case EVENT_FINISH_FIGHT_3: if (Creature* koltira = GetEntryFromSummons(NPC_KOLTIRA_DEATHWEAVER)) { @@ -927,7 +933,7 @@ public: if (summon->GetEntry() <= NPC_RIMBLAT_EARTHSHATTER && summon->GetEntry() != NPC_HIGHLORD_TIRION_FORDRING) { float o = lk->GetAngle(summon); - summon->GetMotionMaster()->MovePoint(3, lk->GetPositionX() + 2.0f*cos(o), lk->GetPositionY() + 2.0f*sin(o), lk->GetPositionZ()); + summon->GetMotionMaster()->MovePoint(3, lk->GetPositionX() + 2.0f * cos(o), lk->GetPositionY() + 2.0f * sin(o), lk->GetPositionZ()); summon->ToTempSummon()->SetTempSummonType(TEMPSUMMON_MANUAL_DESPAWN); } } @@ -1011,7 +1017,7 @@ public: { tirion->CastSpell(tirion, SPELL_TIRION_CHARGE, true); tirion->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY2H); - tirion->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); + tirion->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); } break; case EVENT_OUTRO_SCENE_44: @@ -1036,7 +1042,7 @@ public: if (Creature* tirion = GetEntryFromSummons(NPC_HIGHLORD_TIRION_FORDRING)) { float o = me->GetAngle(tirion); - tirion->GetMotionMaster()->MovePoint(4, me->GetPositionX() + 2.0f*cos(o), me->GetPositionY() + 2.0f*sin(o), me->GetPositionZ(), false); + tirion->GetMotionMaster()->MovePoint(4, me->GetPositionX() + 2.0f * cos(o), me->GetPositionY() + 2.0f * sin(o), me->GetPositionZ(), false); tirion->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); tirion->setFaction(35); } @@ -1107,17 +1113,17 @@ public: me->SetStandState(UNIT_STAND_STATE_STAND); break; case EVENT_OUTRO_SCENE_60: - { - Map::PlayerList const &PlayerList = me->GetMap()->GetPlayers(); - if (!PlayerList.isEmpty()) { - for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) - if (i->GetSource()->IsAlive() && me->IsWithinDistInMap(i->GetSource(), 100)) - i->GetSource()->CastSpell(i->GetSource(), SPELL_THE_LIGHT_OF_DAWN_Q, false); + Map::PlayerList const& PlayerList = me->GetMap()->GetPlayers(); + if (!PlayerList.isEmpty()) + { + for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) + if (i->GetSource()->IsAlive() && me->IsWithinDistInMap(i->GetSource(), 100)) + i->GetSource()->CastSpell(i->GetSource(), SPELL_THE_LIGHT_OF_DAWN_Q, false); + } + me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); + break; } - me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP|UNIT_NPC_FLAG_QUESTGIVER); - break; - } case EVENT_OUTRO_SCENE_61: summons.DespawnAll(); me->DespawnOrUnsummon(1); @@ -1162,68 +1168,68 @@ public: class spell_chapter5_light_of_dawn_aura : public SpellScriptLoader { - public: - spell_chapter5_light_of_dawn_aura() : SpellScriptLoader("spell_chapter5_light_of_dawn_aura") { } +public: + spell_chapter5_light_of_dawn_aura() : SpellScriptLoader("spell_chapter5_light_of_dawn_aura") { } - class spell_chapter5_light_of_dawn_aura_AuraScript : public AuraScript + class spell_chapter5_light_of_dawn_aura_AuraScript : public AuraScript + { + PrepareAuraScript(spell_chapter5_light_of_dawn_aura_AuraScript); + + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_chapter5_light_of_dawn_aura_AuraScript); - - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetUnitOwner()->Dismount(); - GetUnitOwner()->SetCanFly(true); - GetUnitOwner()->SetDisableGravity(true); - GetUnitOwner()->AddUnitMovementFlag(MOVEMENTFLAG_FLYING); - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetUnitOwner()->SetCanFly(false); - GetUnitOwner()->SetDisableGravity(false); - GetUnitOwner()->RemoveUnitMovementFlag(MOVEMENTFLAG_FLYING); - GetUnitOwner()->GetMotionMaster()->MoveFall(); - } - - void Register() override - { - OnEffectApply += AuraEffectApplyFn(spell_chapter5_light_of_dawn_aura_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_chapter5_light_of_dawn_aura_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_chapter5_light_of_dawn_aura_AuraScript(); + GetUnitOwner()->Dismount(); + GetUnitOwner()->SetCanFly(true); + GetUnitOwner()->SetDisableGravity(true); + GetUnitOwner()->AddUnitMovementFlag(MOVEMENTFLAG_FLYING); } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetUnitOwner()->SetCanFly(false); + GetUnitOwner()->SetDisableGravity(false); + GetUnitOwner()->RemoveUnitMovementFlag(MOVEMENTFLAG_FLYING); + GetUnitOwner()->GetMotionMaster()->MoveFall(); + } + + void Register() override + { + OnEffectApply += AuraEffectApplyFn(spell_chapter5_light_of_dawn_aura_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_chapter5_light_of_dawn_aura_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_chapter5_light_of_dawn_aura_AuraScript(); + } }; class spell_chapter5_rebuke : public SpellScriptLoader { - public: - spell_chapter5_rebuke() : SpellScriptLoader("spell_chapter5_rebuke") { } +public: + spell_chapter5_rebuke() : SpellScriptLoader("spell_chapter5_rebuke") { } - class spell_chapter5_rebuke_SpellScript : public SpellScript + class spell_chapter5_rebuke_SpellScript : public SpellScript + { + PrepareSpellScript(spell_chapter5_rebuke_SpellScript); + + void HandleLeapBack(SpellEffIndex effIndex) { - PrepareSpellScript(spell_chapter5_rebuke_SpellScript); - - void HandleLeapBack(SpellEffIndex effIndex) - { - PreventHitEffect(effIndex); - if (Unit* unitTarget = GetHitUnit()) - unitTarget->KnockbackFrom(2282.86f, -5263.45f, 40.0f, 8.0f); - } - - void Register() override - { - OnEffectLaunchTarget += SpellEffectFn(spell_chapter5_rebuke_SpellScript::HandleLeapBack, EFFECT_0, SPELL_EFFECT_LEAP_BACK); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_chapter5_rebuke_SpellScript(); + PreventHitEffect(effIndex); + if (Unit* unitTarget = GetHitUnit()) + unitTarget->KnockbackFrom(2282.86f, -5263.45f, 40.0f, 8.0f); } + + void Register() override + { + OnEffectLaunchTarget += SpellEffectFn(spell_chapter5_rebuke_SpellScript::HandleLeapBack, EFFECT_0, SPELL_EFFECT_LEAP_BACK); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_chapter5_rebuke_SpellScript(); + } }; void AddSC_the_scarlet_enclave_c5() diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp index a9adb0302..1eb7eb52c 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp @@ -108,7 +108,8 @@ public: break; } ++phase; - } else FlyBackTimer-=diff; + } + else FlyBackTimer -= diff; } }; diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp index d497ac46f..8431a31b5 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp @@ -106,7 +106,9 @@ public: switch (go->GetEntry()) { //case ENTRY_PUMPKIN_SHRINE: PumpkinShrineGUID = go->GetGUID(); break; - case DOOR_HIGH_INQUISITOR_ID: DoorHighInquisitorGUID = go->GetGUID(); break; + case DOOR_HIGH_INQUISITOR_ID: + DoorHighInquisitorGUID = go->GetGUID(); + break; } } @@ -114,8 +116,12 @@ public: { switch (creature->GetEntry()) { - case NPC_COMMANDER_MOGRAINE: MograineGUID = creature->GetGUID(); break; - case NPC_INQUISITOR_WHITEMANE: WhitemaneGUID = creature->GetGUID(); break; + case NPC_COMMANDER_MOGRAINE: + MograineGUID = creature->GetGUID(); + break; + case NPC_INQUISITOR_WHITEMANE: + WhitemaneGUID = creature->GetGUID(); + break; } } @@ -123,20 +129,20 @@ public: { switch(type) { - case TYPE_MOGRAINE_AND_WHITE_EVENT: - if (data == IN_PROGRESS) - { - DoUseDoorOrButton(DoorHighInquisitorGUID); - encounter = IN_PROGRESS; - } - if (data == FAIL) - { - DoUseDoorOrButton(DoorHighInquisitorGUID); - encounter = FAIL; - } - if (data == SPECIAL) - encounter = SPECIAL; - break; + case TYPE_MOGRAINE_AND_WHITE_EVENT: + if (data == IN_PROGRESS) + { + DoUseDoorOrButton(DoorHighInquisitorGUID); + encounter = IN_PROGRESS; + } + if (data == FAIL) + { + DoUseDoorOrButton(DoorHighInquisitorGUID); + encounter = FAIL; + } + if (data == SPECIAL) + encounter = SPECIAL; + break; } } @@ -144,9 +150,12 @@ public: { switch (type) { - case DATA_MOGRAINE: return MograineGUID; - case DATA_WHITEMANE: return WhitemaneGUID; - case DATA_DOOR_WHITEMANE: return DoorHighInquisitorGUID; + case DATA_MOGRAINE: + return MograineGUID; + case DATA_WHITEMANE: + return WhitemaneGUID; + case DATA_DOOR_WHITEMANE: + return DoorHighInquisitorGUID; } return 0; } @@ -284,57 +293,57 @@ public: switch (uiSteps) { - case 1: - me->GetMotionMaster()->MovePoint(0, 1152.039795f, 1398.405518f, 32.527878f); - return 2 * IN_MILLISECONDS; - case 2: - me->SetSheath(SHEATH_STATE_UNARMED); - me->SetStandState(UNIT_STAND_STATE_KNEEL); - return 2 * IN_MILLISECONDS; - case 3: - Talk(3); - return 10 * IN_MILLISECONDS; - case 4: - me->SummonCreature(NPC_HIGHLORD_MOGRAINE, 1065.130737f, 1399.350586f, 30.763723f, 6.282961f, TEMPSUMMON_TIMED_DESPAWN, 400000)->SetName("Highlord Mograine"); - me->FindNearestCreature(NPC_HIGHLORD_MOGRAINE, 200.0f)->setFaction(FACTION_FRIENDLY_TO_ALL); - return 30 * IN_MILLISECONDS; - case 5: - mograine->StopMovingOnCurrentPos(); - mograine->AI()->Talk(0); - mograine->HandleEmoteCommand(EMOTE_ONESHOT_POINT); - return 4 * IN_MILLISECONDS; - case 6: - me->SetStandState(UNIT_STAND_STATE_STAND); - return 2 * IN_MILLISECONDS; - case 7: - Talk(4); - return 4 * IN_MILLISECONDS; - case 8: - mograine->AI()->Talk(1); - return 11 * IN_MILLISECONDS; - case 9: - mograine->HandleEmoteCommand(EMOTE_ONESHOT_BATTLE_ROAR); - return 4 * IN_MILLISECONDS; - case 10: - me->SetSheath(SHEATH_STATE_UNARMED); - me->SetStandState(UNIT_STAND_STATE_KNEEL); - Talk(5); - return 2 * IN_MILLISECONDS; - case 11: - mograine->CastSpell(me, SPELL_FORGIVENESS, false); - return 1 * IN_MILLISECONDS; - case 12: - mograine->CastSpell(me, SPELL_COSMETIC_CHAIN, true); - return 0.5 * IN_MILLISECONDS; - case 13: - mograine->AI()->Talk(2); - mograine->DespawnOrUnsummon(3 * IN_MILLISECONDS); - mograine->Kill(me, me, true); - return 0; - default: - if(mograine) - mograine->DespawnOrUnsummon(0); - return 0; + case 1: + me->GetMotionMaster()->MovePoint(0, 1152.039795f, 1398.405518f, 32.527878f); + return 2 * IN_MILLISECONDS; + case 2: + me->SetSheath(SHEATH_STATE_UNARMED); + me->SetStandState(UNIT_STAND_STATE_KNEEL); + return 2 * IN_MILLISECONDS; + case 3: + Talk(3); + return 10 * IN_MILLISECONDS; + case 4: + me->SummonCreature(NPC_HIGHLORD_MOGRAINE, 1065.130737f, 1399.350586f, 30.763723f, 6.282961f, TEMPSUMMON_TIMED_DESPAWN, 400000)->SetName("Highlord Mograine"); + me->FindNearestCreature(NPC_HIGHLORD_MOGRAINE, 200.0f)->setFaction(FACTION_FRIENDLY_TO_ALL); + return 30 * IN_MILLISECONDS; + case 5: + mograine->StopMovingOnCurrentPos(); + mograine->AI()->Talk(0); + mograine->HandleEmoteCommand(EMOTE_ONESHOT_POINT); + return 4 * IN_MILLISECONDS; + case 6: + me->SetStandState(UNIT_STAND_STATE_STAND); + return 2 * IN_MILLISECONDS; + case 7: + Talk(4); + return 4 * IN_MILLISECONDS; + case 8: + mograine->AI()->Talk(1); + return 11 * IN_MILLISECONDS; + case 9: + mograine->HandleEmoteCommand(EMOTE_ONESHOT_BATTLE_ROAR); + return 4 * IN_MILLISECONDS; + case 10: + me->SetSheath(SHEATH_STATE_UNARMED); + me->SetStandState(UNIT_STAND_STATE_KNEEL); + Talk(5); + return 2 * IN_MILLISECONDS; + case 11: + mograine->CastSpell(me, SPELL_FORGIVENESS, false); + return 1 * IN_MILLISECONDS; + case 12: + mograine->CastSpell(me, SPELL_COSMETIC_CHAIN, true); + return 0.5 * IN_MILLISECONDS; + case 13: + mograine->AI()->Talk(2); + mograine->DespawnOrUnsummon(3 * IN_MILLISECONDS); + mograine->Kill(me, me, true); + return 0; + default: + if(mograine) + mograine->DespawnOrUnsummon(0); + return 0; } } @@ -659,88 +668,88 @@ public: switch (uiAction) { - case 1: - creature->HandleEmoteCommand(1); - AddGossipItemFor(player, 0, "Mograine?", GOSSIP_SENDER_MAIN, 2); - SendGossipMenuFor(player, 100101, creature->GetGUID()); - return true; - case 2: - creature->HandleEmoteCommand(1); - AddGossipItemFor(player, 0, "What do you mean?", GOSSIP_SENDER_MAIN, 3); - SendGossipMenuFor(player, 100102, creature->GetGUID()); - return true; - case 3: - creature->HandleEmoteCommand(1); - AddGossipItemFor(player, 0, "I still do not fully understand.", GOSSIP_SENDER_MAIN, 4); - SendGossipMenuFor(player, 100103, creature->GetGUID()); - return true; - case 4: - creature->HandleEmoteCommand(1); - AddGossipItemFor(player, 0, "Incredible story. So how did he die?", GOSSIP_SENDER_MAIN, 5); - SendGossipMenuFor(player, 100104, creature->GetGUID()); - return true; - case 5: - creature->HandleEmoteCommand(1); - AddGossipItemFor(player, 0, "You mean...", GOSSIP_SENDER_MAIN, 6); - SendGossipMenuFor(player, 100105, creature->GetGUID()); - return true; - case 6: - creature->HandleEmoteCommand(1); - AddGossipItemFor(player, 0, "How do you know all of this?", GOSSIP_SENDER_MAIN, 7); - SendGossipMenuFor(player, 100106, creature->GetGUID()); - return true; - case 7: - creature->HandleEmoteCommand(1); - AddGossipItemFor(player, 0, "A thousand? For one man?", GOSSIP_SENDER_MAIN, 8); - SendGossipMenuFor(player, 100107, creature->GetGUID()); - return true; - case 8: - creature->HandleEmoteCommand(5); - AddGossipItemFor(player, 0, "Yet? Yet what?", GOSSIP_SENDER_MAIN, 9); - SendGossipMenuFor(player, 100108, creature->GetGUID()); - return true; - case 9: - creature->HandleEmoteCommand(1); - AddGossipItemFor(player, 0, "And did he?", GOSSIP_SENDER_MAIN, 10); - SendGossipMenuFor(player, 100109, creature->GetGUID()); - return true; - case 10: - creature->HandleEmoteCommand(274); - AddGossipItemFor(player, 0, "Continue please, Fairbanks.", GOSSIP_SENDER_MAIN, 11); - SendGossipMenuFor(player, 100110, creature->GetGUID()); - return true; - case 11: - creature->HandleEmoteCommand(1); - AddGossipItemFor(player, 0, "You mean...", GOSSIP_SENDER_MAIN, 12); - SendGossipMenuFor(player, 100111, creature->GetGUID()); - return true; - case 12: - creature->HandleEmoteCommand(1); - AddGossipItemFor(player, 0, "You were right, Fairbanks. That is tragic.", GOSSIP_SENDER_MAIN, 13); - SendGossipMenuFor(player, 100112, creature->GetGUID()); - return true; - case 13: - creature->HandleEmoteCommand(1); - AddGossipItemFor(player, 0, "And you did...", GOSSIP_SENDER_MAIN, 14); - SendGossipMenuFor(player, 100113, creature->GetGUID()); - return true; - case 14: - creature->HandleEmoteCommand(1); - AddGossipItemFor(player, 0, "You tell an incredible tale, Fairbanks. What of the blade? Is it beyond redemption?", GOSSIP_SENDER_MAIN, 15); - SendGossipMenuFor(player, 100114, creature->GetGUID()); - return true; - case 15: - creature->HandleEmoteCommand(1); - AddGossipItemFor(player, 0, "But his son is dead.", GOSSIP_SENDER_MAIN, 16); - SendGossipMenuFor(player, 100115, creature->GetGUID()); - return true; - case 16: - SendGossipMenuFor(player, 100116, creature->GetGUID()); - // todo: we need to play these 3 emote in sequence, we play only the last one right now. - creature->HandleEmoteCommand(274); - creature->HandleEmoteCommand(1); - creature->HandleEmoteCommand(397); - return true; + case 1: + creature->HandleEmoteCommand(1); + AddGossipItemFor(player, 0, "Mograine?", GOSSIP_SENDER_MAIN, 2); + SendGossipMenuFor(player, 100101, creature->GetGUID()); + return true; + case 2: + creature->HandleEmoteCommand(1); + AddGossipItemFor(player, 0, "What do you mean?", GOSSIP_SENDER_MAIN, 3); + SendGossipMenuFor(player, 100102, creature->GetGUID()); + return true; + case 3: + creature->HandleEmoteCommand(1); + AddGossipItemFor(player, 0, "I still do not fully understand.", GOSSIP_SENDER_MAIN, 4); + SendGossipMenuFor(player, 100103, creature->GetGUID()); + return true; + case 4: + creature->HandleEmoteCommand(1); + AddGossipItemFor(player, 0, "Incredible story. So how did he die?", GOSSIP_SENDER_MAIN, 5); + SendGossipMenuFor(player, 100104, creature->GetGUID()); + return true; + case 5: + creature->HandleEmoteCommand(1); + AddGossipItemFor(player, 0, "You mean...", GOSSIP_SENDER_MAIN, 6); + SendGossipMenuFor(player, 100105, creature->GetGUID()); + return true; + case 6: + creature->HandleEmoteCommand(1); + AddGossipItemFor(player, 0, "How do you know all of this?", GOSSIP_SENDER_MAIN, 7); + SendGossipMenuFor(player, 100106, creature->GetGUID()); + return true; + case 7: + creature->HandleEmoteCommand(1); + AddGossipItemFor(player, 0, "A thousand? For one man?", GOSSIP_SENDER_MAIN, 8); + SendGossipMenuFor(player, 100107, creature->GetGUID()); + return true; + case 8: + creature->HandleEmoteCommand(5); + AddGossipItemFor(player, 0, "Yet? Yet what?", GOSSIP_SENDER_MAIN, 9); + SendGossipMenuFor(player, 100108, creature->GetGUID()); + return true; + case 9: + creature->HandleEmoteCommand(1); + AddGossipItemFor(player, 0, "And did he?", GOSSIP_SENDER_MAIN, 10); + SendGossipMenuFor(player, 100109, creature->GetGUID()); + return true; + case 10: + creature->HandleEmoteCommand(274); + AddGossipItemFor(player, 0, "Continue please, Fairbanks.", GOSSIP_SENDER_MAIN, 11); + SendGossipMenuFor(player, 100110, creature->GetGUID()); + return true; + case 11: + creature->HandleEmoteCommand(1); + AddGossipItemFor(player, 0, "You mean...", GOSSIP_SENDER_MAIN, 12); + SendGossipMenuFor(player, 100111, creature->GetGUID()); + return true; + case 12: + creature->HandleEmoteCommand(1); + AddGossipItemFor(player, 0, "You were right, Fairbanks. That is tragic.", GOSSIP_SENDER_MAIN, 13); + SendGossipMenuFor(player, 100112, creature->GetGUID()); + return true; + case 13: + creature->HandleEmoteCommand(1); + AddGossipItemFor(player, 0, "And you did...", GOSSIP_SENDER_MAIN, 14); + SendGossipMenuFor(player, 100113, creature->GetGUID()); + return true; + case 14: + creature->HandleEmoteCommand(1); + AddGossipItemFor(player, 0, "You tell an incredible tale, Fairbanks. What of the blade? Is it beyond redemption?", GOSSIP_SENDER_MAIN, 15); + SendGossipMenuFor(player, 100114, creature->GetGUID()); + return true; + case 15: + creature->HandleEmoteCommand(1); + AddGossipItemFor(player, 0, "But his son is dead.", GOSSIP_SENDER_MAIN, 16); + SendGossipMenuFor(player, 100115, creature->GetGUID()); + return true; + case 16: + SendGossipMenuFor(player, 100116, creature->GetGUID()); + // todo: we need to play these 3 emote in sequence, we play only the last one right now. + creature->HandleEmoteCommand(274); + creature->HandleEmoteCommand(1); + creature->HandleEmoteCommand(397); + return true; } return true; diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp index 2749b201e..4c51557c2 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp @@ -44,7 +44,7 @@ enum Misc WEAPON_KIRTONOS_STAFF = 11365, POINT_KIRTONOS_LAND = 13, KIRTONOS_PATH = 105061, - + EMOTE_SUMMONED = 0 }; @@ -56,163 +56,164 @@ Position const PosMove[2] = class boss_kirtonos_the_herald : public CreatureScript { - public: boss_kirtonos_the_herald() : CreatureScript("boss_kirtonos_the_herald") { } +public: + boss_kirtonos_the_herald() : CreatureScript("boss_kirtonos_the_herald") { } - struct boss_kirtonos_the_heraldAI : public ScriptedAI + struct boss_kirtonos_the_heraldAI : public ScriptedAI + { + boss_kirtonos_the_heraldAI(Creature* creature) : ScriptedAI(creature) { - boss_kirtonos_the_heraldAI(Creature* creature) : ScriptedAI(creature) - { - instance = me->GetInstanceScript(); - } - - EventMap events; - EventMap events2; - InstanceScript* instance; - - void EnterCombat(Unit* /*who*/) - { - events.Reset(); - events.ScheduleEvent(EVENT_SHADOW_BOLT_VOLLEY, 2000); - events.ScheduleEvent(EVENT_CURSE_OF_TONGUES, 6000); - events.ScheduleEvent(EVENT_DOMINATE_MIND, 20000); - events.ScheduleEvent(EVENT_KIRTONOS_TRANSFORM, 5000); - } - - void JustDied(Unit* /*killer*/) - { - if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_GATE_KIRTONOS))) - gate->SetGoState(GO_STATE_ACTIVE); - - instance->SetData(DATA_KIRTONOS_THE_HERALD, DONE); - } - - void EnterEvadeMode() - { - if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_GATE_KIRTONOS))) - gate->SetGoState(GO_STATE_ACTIVE); - - instance->SetData(DATA_KIRTONOS_THE_HERALD, NOT_STARTED); - me->DespawnOrUnsummon(1); - } - - void IsSummonedBy(Unit* /*summoner*/) - { - events2.Reset(); - events2.ScheduleEvent(INTRO_1, 500); - me->SetDisableGravity(true); - me->SetReactState(REACT_PASSIVE); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); - Talk(EMOTE_SUMMONED); - } - - void MovementInform(uint32 type, uint32 id) - { - if (type == WAYPOINT_MOTION_TYPE && id == POINT_KIRTONOS_LAND) - { - events2.ScheduleEvent(INTRO_2, 1500); - events2.ScheduleEvent(INTRO_3, 2500); - events2.ScheduleEvent(INTRO_4, 5500); - events2.ScheduleEvent(INTRO_5, 6500); - events2.ScheduleEvent(INTRO_6, 11500); - } - } - - void UpdateAI(uint32 diff) - { - events2.Update(diff); - switch (events2.ExecuteEvent()) - { - case INTRO_1: - me->GetMotionMaster()->MovePath(KIRTONOS_PATH, false); - break; - case INTRO_2: - me->GetMotionMaster()->MovePoint(0, PosMove[0]); - break; - case INTRO_3: - if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_GATE_KIRTONOS))) - gate->SetGoState(GO_STATE_READY); - me->SetFacingTo(0.01745329f); - break; - case INTRO_4: - me->SetWalk(true); - me->SetDisableGravity(false); - me->CastSpell(me, SPELL_KIRTONOS_TRANSFORM, true); - me->SetCanFly(false); - break; - case INTRO_5: - me->HandleEmoteCommand(EMOTE_ONESHOT_ROAR); - me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_KIRTONOS_STAFF)); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); - me->SetReactState(REACT_AGGRESSIVE); - break; - case INTRO_6: - me->GetMotionMaster()->MovePoint(0, PosMove[1]); - break; - } - - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SWOOP: - me->CastSpell(me->GetVictim(), SPELL_SWOOP, false); - events.ScheduleEvent(EVENT_SWOOP, 15000); - break; - case EVENT_WING_FLAP: - me->CastSpell(me, SPELL_WING_FLAP, false); - events.ScheduleEvent(EVENT_WING_FLAP, 13000); - break; - case EVENT_PIERCE_ARMOR: - me->CastSpell(me->GetVictim(), SPELL_PIERCE_ARMOR, false); - events.ScheduleEvent(EVENT_PIERCE_ARMOR, 12000); - break; - case EVENT_DISARM: - me->CastSpell(me->GetVictim(), SPELL_DISARM, false); - events.ScheduleEvent(EVENT_DISARM, 11000); - break; - case EVENT_SHADOW_BOLT_VOLLEY: - me->CastSpell(me, SPELL_SHADOW_BOLT_VOLLEY, false); - events.ScheduleEvent(EVENT_SHADOW_BOLT_VOLLEY, 10000); - break; - case EVENT_CURSE_OF_TONGUES: - me->CastSpell(me, SPELL_CURSE_OF_TONGUES, false); - events.ScheduleEvent(EVENT_CURSE_OF_TONGUES, 20000); - break; - case EVENT_DOMINATE_MIND: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 20.0f, true)) - me->CastSpell(target, SPELL_DOMINATE_MIND, false); - events.ScheduleEvent(EVENT_DOMINATE_MIND, urand(44000, 48000)); - break; - case EVENT_KIRTONOS_TRANSFORM: - if (me->HealthBelowPct(50)) - { - events.Reset(); - events.ScheduleEvent(EVENT_SWOOP, 4000); - events.ScheduleEvent(EVENT_WING_FLAP, 7000); - events.ScheduleEvent(EVENT_PIERCE_ARMOR, 11000); - events.ScheduleEvent(EVENT_DISARM, 15000); - me->RemoveAura(SPELL_KIRTONOS_TRANSFORM); - me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(0)); - break; - } - - events.ScheduleEvent(EVENT_KIRTONOS_TRANSFORM, 2000); - break; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + instance = me->GetInstanceScript(); } + + EventMap events; + EventMap events2; + InstanceScript* instance; + + void EnterCombat(Unit* /*who*/) + { + events.Reset(); + events.ScheduleEvent(EVENT_SHADOW_BOLT_VOLLEY, 2000); + events.ScheduleEvent(EVENT_CURSE_OF_TONGUES, 6000); + events.ScheduleEvent(EVENT_DOMINATE_MIND, 20000); + events.ScheduleEvent(EVENT_KIRTONOS_TRANSFORM, 5000); + } + + void JustDied(Unit* /*killer*/) + { + if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_GATE_KIRTONOS))) + gate->SetGoState(GO_STATE_ACTIVE); + + instance->SetData(DATA_KIRTONOS_THE_HERALD, DONE); + } + + void EnterEvadeMode() + { + if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_GATE_KIRTONOS))) + gate->SetGoState(GO_STATE_ACTIVE); + + instance->SetData(DATA_KIRTONOS_THE_HERALD, NOT_STARTED); + me->DespawnOrUnsummon(1); + } + + void IsSummonedBy(Unit* /*summoner*/) + { + events2.Reset(); + events2.ScheduleEvent(INTRO_1, 500); + me->SetDisableGravity(true); + me->SetReactState(REACT_PASSIVE); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); + Talk(EMOTE_SUMMONED); + } + + void MovementInform(uint32 type, uint32 id) + { + if (type == WAYPOINT_MOTION_TYPE && id == POINT_KIRTONOS_LAND) + { + events2.ScheduleEvent(INTRO_2, 1500); + events2.ScheduleEvent(INTRO_3, 2500); + events2.ScheduleEvent(INTRO_4, 5500); + events2.ScheduleEvent(INTRO_5, 6500); + events2.ScheduleEvent(INTRO_6, 11500); + } + } + + void UpdateAI(uint32 diff) + { + events2.Update(diff); + switch (events2.ExecuteEvent()) + { + case INTRO_1: + me->GetMotionMaster()->MovePath(KIRTONOS_PATH, false); + break; + case INTRO_2: + me->GetMotionMaster()->MovePoint(0, PosMove[0]); + break; + case INTRO_3: + if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_GATE_KIRTONOS))) + gate->SetGoState(GO_STATE_READY); + me->SetFacingTo(0.01745329f); + break; + case INTRO_4: + me->SetWalk(true); + me->SetDisableGravity(false); + me->CastSpell(me, SPELL_KIRTONOS_TRANSFORM, true); + me->SetCanFly(false); + break; + case INTRO_5: + me->HandleEmoteCommand(EMOTE_ONESHOT_ROAR); + me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_KIRTONOS_STAFF)); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); + me->SetReactState(REACT_AGGRESSIVE); + break; + case INTRO_6: + me->GetMotionMaster()->MovePoint(0, PosMove[1]); + break; + } + + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_SWOOP: + me->CastSpell(me->GetVictim(), SPELL_SWOOP, false); + events.ScheduleEvent(EVENT_SWOOP, 15000); + break; + case EVENT_WING_FLAP: + me->CastSpell(me, SPELL_WING_FLAP, false); + events.ScheduleEvent(EVENT_WING_FLAP, 13000); + break; + case EVENT_PIERCE_ARMOR: + me->CastSpell(me->GetVictim(), SPELL_PIERCE_ARMOR, false); + events.ScheduleEvent(EVENT_PIERCE_ARMOR, 12000); + break; + case EVENT_DISARM: + me->CastSpell(me->GetVictim(), SPELL_DISARM, false); + events.ScheduleEvent(EVENT_DISARM, 11000); + break; + case EVENT_SHADOW_BOLT_VOLLEY: + me->CastSpell(me, SPELL_SHADOW_BOLT_VOLLEY, false); + events.ScheduleEvent(EVENT_SHADOW_BOLT_VOLLEY, 10000); + break; + case EVENT_CURSE_OF_TONGUES: + me->CastSpell(me, SPELL_CURSE_OF_TONGUES, false); + events.ScheduleEvent(EVENT_CURSE_OF_TONGUES, 20000); + break; + case EVENT_DOMINATE_MIND: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 20.0f, true)) + me->CastSpell(target, SPELL_DOMINATE_MIND, false); + events.ScheduleEvent(EVENT_DOMINATE_MIND, urand(44000, 48000)); + break; + case EVENT_KIRTONOS_TRANSFORM: + if (me->HealthBelowPct(50)) + { + events.Reset(); + events.ScheduleEvent(EVENT_SWOOP, 4000); + events.ScheduleEvent(EVENT_WING_FLAP, 7000); + events.ScheduleEvent(EVENT_PIERCE_ARMOR, 11000); + events.ScheduleEvent(EVENT_DISARM, 15000); + me->RemoveAura(SPELL_KIRTONOS_TRANSFORM); + me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(0)); + break; + } + + events.ScheduleEvent(EVENT_KIRTONOS_TRANSFORM, 2000); + break; + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; void AddSC_boss_kirtonos_the_herald() diff --git a/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp b/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp index 22d596ec5..a7fe6efef 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp @@ -12,245 +12,245 @@ class instance_scholomance : public InstanceMapScript { - public: - instance_scholomance() : InstanceMapScript("instance_scholomance", 289) { } +public: + instance_scholomance() : InstanceMapScript("instance_scholomance", 289) { } - InstanceScript* GetInstanceScript(InstanceMap* map) const + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_scholomance_InstanceMapScript(map); + } + + struct instance_scholomance_InstanceMapScript : public InstanceScript + { + instance_scholomance_InstanceMapScript(Map* map) : InstanceScript(map), + GateKirtonosGUID { 0 }, + GateMiliciaGUID { 0 }, + GateTheolenGUID { 0 }, + GatePolkeltGUID { 0 }, + GateRavenianGUID { 0 }, + GateBarovGUID { 0 }, + GateIlluciaGUID { 0 }, + _kirtonosState { 0 }, + _miniBosses { 0 }, + _rasHuman { 0 } + { } + + void OnGameObjectCreate(GameObject* go) { - return new instance_scholomance_InstanceMapScript(map); + switch (go->GetEntry()) + { + case GO_GATE_KIRTONOS: + GateKirtonosGUID = go->GetGUID(); + break; + case GO_GATE_MALICIA: + GateMiliciaGUID = go->GetGUID(); + break; + case GO_GATE_THEOLEN: + GateTheolenGUID = go->GetGUID(); + break; + case GO_GATE_POLKELT: + GatePolkeltGUID = go->GetGUID(); + break; + case GO_GATE_RAVENIAN: + GateRavenianGUID = go->GetGUID(); + break; + case GO_GATE_BAROV: + GateBarovGUID = go->GetGUID(); + break; + case GO_GATE_ILLUCIA: + GateIlluciaGUID = go->GetGUID(); + break; + } } - struct instance_scholomance_InstanceMapScript : public InstanceScript + uint64 GetData64(uint32 type) const { - instance_scholomance_InstanceMapScript(Map* map) : InstanceScript(map), - GateKirtonosGUID { 0 }, - GateMiliciaGUID { 0 }, - GateTheolenGUID { 0 }, - GatePolkeltGUID { 0 }, - GateRavenianGUID { 0 }, - GateBarovGUID { 0 }, - GateIlluciaGUID { 0 }, - _kirtonosState { 0 }, - _miniBosses { 0 }, - _rasHuman { 0 } - { } - - void OnGameObjectCreate(GameObject* go) + switch (type) { - switch (go->GetEntry()) - { - case GO_GATE_KIRTONOS: - GateKirtonosGUID = go->GetGUID(); - break; - case GO_GATE_MALICIA: - GateMiliciaGUID = go->GetGUID(); - break; - case GO_GATE_THEOLEN: - GateTheolenGUID = go->GetGUID(); - break; - case GO_GATE_POLKELT: - GatePolkeltGUID = go->GetGUID(); - break; - case GO_GATE_RAVENIAN: - GateRavenianGUID = go->GetGUID(); - break; - case GO_GATE_BAROV: - GateBarovGUID = go->GetGUID(); - break; - case GO_GATE_ILLUCIA: - GateIlluciaGUID = go->GetGUID(); - break; - } + case GO_GATE_KIRTONOS: + return GateKirtonosGUID; + case GO_GATE_MALICIA: + return GateMiliciaGUID; + case GO_GATE_THEOLEN: + return GateTheolenGUID; + case GO_GATE_POLKELT: + return GatePolkeltGUID; + case GO_GATE_RAVENIAN: + return GateRavenianGUID; + case GO_GATE_BAROV: + return GateBarovGUID; + case GO_GATE_ILLUCIA: + return GateIlluciaGUID; } - uint64 GetData64(uint32 type) const - { - switch (type) - { - case GO_GATE_KIRTONOS: - return GateKirtonosGUID; - case GO_GATE_MALICIA: - return GateMiliciaGUID; - case GO_GATE_THEOLEN: - return GateTheolenGUID; - case GO_GATE_POLKELT: - return GatePolkeltGUID; - case GO_GATE_RAVENIAN: - return GateRavenianGUID; - case GO_GATE_BAROV: - return GateBarovGUID; - case GO_GATE_ILLUCIA: - return GateIlluciaGUID; - } + return 0; + } - return 0; + void SetData(uint32 type, uint32 data) + { + switch (type) + { + case DATA_KIRTONOS_THE_HERALD: + _kirtonosState = data; + break; + case DATA_MINI_BOSSES: + ++_miniBosses; + break; + case DATA_RAS_HUMAN: + _rasHuman = data; + break; } - void SetData(uint32 type, uint32 data) + SaveToDB(); + } + + uint32 GetData(uint32 type) const + { + switch (type) { - switch (type) - { - case DATA_KIRTONOS_THE_HERALD: - _kirtonosState = data; - break; - case DATA_MINI_BOSSES: - ++_miniBosses; - break; - case DATA_RAS_HUMAN: - _rasHuman = data; - break; - } - - SaveToDB(); + case DATA_KIRTONOS_THE_HERALD: + return _kirtonosState; + case DATA_MINI_BOSSES: + return _miniBosses; + case DATA_RAS_HUMAN: + return _rasHuman; } + return 0; + } - uint32 GetData(uint32 type) const + std::string GetSaveData() + { + std::ostringstream saveStream; + saveStream << "S O " << _kirtonosState << ' ' << _miniBosses; + return saveStream.str(); + } + + void Load(const char* str) + { + if (!str) + return; + + char dataHead1, dataHead2; + std::istringstream loadStream(str); + loadStream >> dataHead1 >> dataHead2; + + if (dataHead1 == 'S' && dataHead2 == 'O') { - switch (type) - { - case DATA_KIRTONOS_THE_HERALD: - return _kirtonosState; - case DATA_MINI_BOSSES: - return _miniBosses; - case DATA_RAS_HUMAN: - return _rasHuman; - } - return 0; + loadStream >> _kirtonosState; + loadStream >> _miniBosses; + + if (_kirtonosState == IN_PROGRESS) + _kirtonosState = NOT_STARTED; } + } - std::string GetSaveData() - { - std::ostringstream saveStream; - saveStream << "S O " << _kirtonosState << ' ' << _miniBosses; - return saveStream.str(); - } + protected: + uint64 GateKirtonosGUID; + uint64 GateMiliciaGUID; + uint64 GateTheolenGUID; + uint64 GatePolkeltGUID; + uint64 GateRavenianGUID; + uint64 GateBarovGUID; + uint64 GateIlluciaGUID; - void Load(const char* str) - { - if (!str) - return; - - char dataHead1, dataHead2; - std::istringstream loadStream(str); - loadStream >> dataHead1 >> dataHead2; - - if (dataHead1 == 'S' && dataHead2 == 'O') - { - loadStream >> _kirtonosState; - loadStream >> _miniBosses; - - if (_kirtonosState == IN_PROGRESS) - _kirtonosState = NOT_STARTED; - } - } - - protected: - uint64 GateKirtonosGUID; - uint64 GateMiliciaGUID; - uint64 GateTheolenGUID; - uint64 GatePolkeltGUID; - uint64 GateRavenianGUID; - uint64 GateBarovGUID; - uint64 GateIlluciaGUID; - - uint32 _kirtonosState; - uint32 _miniBosses; - uint32 _rasHuman; - }; + uint32 _kirtonosState; + uint32 _miniBosses; + uint32 _rasHuman; + }; }; class spell_scholomance_fixate : public SpellScriptLoader { - public: - spell_scholomance_fixate() : SpellScriptLoader("spell_scholomance_fixate") { } +public: + spell_scholomance_fixate() : SpellScriptLoader("spell_scholomance_fixate") { } - class spell_scholomance_fixate_AuraScript : public AuraScript + class spell_scholomance_fixate_AuraScript : public AuraScript + { + PrepareAuraScript(spell_scholomance_fixate_AuraScript); + + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_scholomance_fixate_AuraScript); - - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - if (Unit* caster = GetCaster()) - caster->TauntApply(target); - } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - if (Unit* caster = GetCaster()) - caster->TauntFadeOut(target); - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_scholomance_fixate_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_scholomance_fixate_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - - }; - - AuraScript* GetAuraScript() const - { - return new spell_scholomance_fixate_AuraScript(); + Unit* target = GetTarget(); + if (Unit* caster = GetCaster()) + caster->TauntApply(target); } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + if (Unit* caster = GetCaster()) + caster->TauntFadeOut(target); + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_scholomance_fixate_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_scholomance_fixate_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + + }; + + AuraScript* GetAuraScript() const + { + return new spell_scholomance_fixate_AuraScript(); + } }; class spell_kormok_summon_bone_mages : SpellScriptLoader { - public: - spell_kormok_summon_bone_mages() : SpellScriptLoader("spell_kormok_summon_bone_mages") { } +public: + spell_kormok_summon_bone_mages() : SpellScriptLoader("spell_kormok_summon_bone_mages") { } - class spell_kormok_summon_bone_magesSpellScript : public SpellScript + class spell_kormok_summon_bone_magesSpellScript : public SpellScript + { + PrepareSpellScript(spell_kormok_summon_bone_magesSpellScript); + + void HandleScript(SpellEffIndex effIndex) { - PrepareSpellScript(spell_kormok_summon_bone_magesSpellScript); - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - for (uint8 i = 0; i < 2; ++i) - GetCaster()->CastSpell(GetCaster(), SPELL_SUMMON_BONE_MAGE_FRONT_LEFT+urand(0, 3), true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_kormok_summon_bone_magesSpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_kormok_summon_bone_magesSpellScript(); + PreventHitDefaultEffect(effIndex); + for (uint8 i = 0; i < 2; ++i) + GetCaster()->CastSpell(GetCaster(), SPELL_SUMMON_BONE_MAGE_FRONT_LEFT + urand(0, 3), true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_kormok_summon_bone_magesSpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_kormok_summon_bone_magesSpellScript(); + } }; class spell_kormok_summon_bone_minions : SpellScriptLoader { - public: - spell_kormok_summon_bone_minions() : SpellScriptLoader("spell_kormok_summon_bone_minions") { } +public: + spell_kormok_summon_bone_minions() : SpellScriptLoader("spell_kormok_summon_bone_minions") { } - class spell_kormok_summon_bone_minionsSpellScript : public SpellScript + class spell_kormok_summon_bone_minionsSpellScript : public SpellScript + { + PrepareSpellScript(spell_kormok_summon_bone_minionsSpellScript); + + void HandleScript(SpellEffIndex effIndex) { - PrepareSpellScript(spell_kormok_summon_bone_minionsSpellScript); + PreventHitDefaultEffect(effIndex); - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - - for (uint32 i = 0; i < 4; ++i) - GetCaster()->CastSpell(GetCaster(), SPELL_SUMMON_BONE_MINION1+i, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_kormok_summon_bone_minionsSpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_kormok_summon_bone_minionsSpellScript(); + for (uint32 i = 0; i < 4; ++i) + GetCaster()->CastSpell(GetCaster(), SPELL_SUMMON_BONE_MINION1 + i, true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_kormok_summon_bone_minionsSpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_kormok_summon_bone_minionsSpellScript(); + } }; enum Rooms @@ -266,93 +266,93 @@ enum Rooms class spell_scholomance_shadow_portal : public SpellScriptLoader { - public: - spell_scholomance_shadow_portal() : SpellScriptLoader("spell_scholomance_shadow_portal") { } +public: + spell_scholomance_shadow_portal() : SpellScriptLoader("spell_scholomance_shadow_portal") { } - class spell_scholomance_shadow_portal_SpellScript : public SpellScript + class spell_scholomance_shadow_portal_SpellScript : public SpellScript + { + PrepareSpellScript(spell_scholomance_shadow_portal_SpellScript); + + bool Load() { - PrepareSpellScript(spell_scholomance_shadow_portal_SpellScript); + return GetCaster()->GetTypeId() == TYPEID_UNIT; + } - bool Load() + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Creature* caster = GetCaster()->ToCreature(); + uint8 attempts = 0; + uint8 room = urand(ROOM_HALL_OF_SECRETS, ROOM_VAULT_OF_THE_RAVENIAN); + uint32 spellId = 0; + + while (attempts < ROOM_MAX) { - return GetCaster()->GetTypeId() == TYPEID_UNIT; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Creature* caster = GetCaster()->ToCreature(); - uint8 attempts = 0; - uint8 room = urand(ROOM_HALL_OF_SECRETS, ROOM_VAULT_OF_THE_RAVENIAN); - uint32 spellId = 0; - - while (attempts < ROOM_MAX) + switch (room) { - switch (room) - { - case ROOM_HALL_OF_SECRETS: - if (InstanceScript* instance = caster->GetInstanceScript()) - if (GameObject* gate = ObjectAccessor::GetGameObject(*caster, instance->GetData64(GO_GATE_RAVENIAN))) - if (gate->GetGoState() == GO_STATE_ACTIVE) - spellId = SPELL_SHADOW_PORTAL_HALLOFSECRETS; - break; - case ROOM_HALL_OF_THE_DAMNED: - if (InstanceScript* instance = caster->GetInstanceScript()) - if (GameObject* gate = ObjectAccessor::GetGameObject(*caster, instance->GetData64(GO_GATE_THEOLEN))) - if (gate->GetGoState() == GO_STATE_ACTIVE) - spellId = SPELL_SHADOW_PORTAL_HALLOFTHEDAMNED; - break; - case ROOM_THE_COVEN: - if (InstanceScript* instance = caster->GetInstanceScript()) - if (GameObject* gate = ObjectAccessor::GetGameObject(*caster, instance->GetData64(GO_GATE_MALICIA))) - if (gate->GetGoState() == GO_STATE_ACTIVE) - spellId = SPELL_SHADOW_PORTAL_THECOVEN; - break; - case ROOM_THE_SHADOW_VAULT: - if (InstanceScript* instance = caster->GetInstanceScript()) - if (GameObject* gate = ObjectAccessor::GetGameObject(*caster, instance->GetData64(GO_GATE_ILLUCIA))) - if (gate->GetGoState() == GO_STATE_ACTIVE) - spellId = SPELL_SHADOW_PORTAL_THESHADOWVAULT; - break; - case ROOM_BAROV_FAMILY_VAULT: - if (InstanceScript* instance = caster->GetInstanceScript()) - if (GameObject* gate = ObjectAccessor::GetGameObject(*caster, instance->GetData64(GO_GATE_BAROV))) - if (gate->GetGoState() == GO_STATE_ACTIVE) - spellId = SPELL_SHADOW_PORTAL_BAROVFAMILYVAULT; - break; - case ROOM_VAULT_OF_THE_RAVENIAN: - if (InstanceScript* instance = caster->GetInstanceScript()) - if (GameObject* gate = ObjectAccessor::GetGameObject(*caster, instance->GetData64(GO_GATE_POLKELT))) - if (gate->GetGoState() == GO_STATE_ACTIVE) - spellId = SPELL_SHADOW_PORTAL_VAULTOFTHERAVENIAN; - break; - } - - if (spellId) - { - caster->CastSpell(GetHitUnit(), spellId, true); + case ROOM_HALL_OF_SECRETS: + if (InstanceScript* instance = caster->GetInstanceScript()) + if (GameObject* gate = ObjectAccessor::GetGameObject(*caster, instance->GetData64(GO_GATE_RAVENIAN))) + if (gate->GetGoState() == GO_STATE_ACTIVE) + spellId = SPELL_SHADOW_PORTAL_HALLOFSECRETS; break; - } - else - { - room = (room+1)%ROOM_MAX; - ++attempts; - } + case ROOM_HALL_OF_THE_DAMNED: + if (InstanceScript* instance = caster->GetInstanceScript()) + if (GameObject* gate = ObjectAccessor::GetGameObject(*caster, instance->GetData64(GO_GATE_THEOLEN))) + if (gate->GetGoState() == GO_STATE_ACTIVE) + spellId = SPELL_SHADOW_PORTAL_HALLOFTHEDAMNED; + break; + case ROOM_THE_COVEN: + if (InstanceScript* instance = caster->GetInstanceScript()) + if (GameObject* gate = ObjectAccessor::GetGameObject(*caster, instance->GetData64(GO_GATE_MALICIA))) + if (gate->GetGoState() == GO_STATE_ACTIVE) + spellId = SPELL_SHADOW_PORTAL_THECOVEN; + break; + case ROOM_THE_SHADOW_VAULT: + if (InstanceScript* instance = caster->GetInstanceScript()) + if (GameObject* gate = ObjectAccessor::GetGameObject(*caster, instance->GetData64(GO_GATE_ILLUCIA))) + if (gate->GetGoState() == GO_STATE_ACTIVE) + spellId = SPELL_SHADOW_PORTAL_THESHADOWVAULT; + break; + case ROOM_BAROV_FAMILY_VAULT: + if (InstanceScript* instance = caster->GetInstanceScript()) + if (GameObject* gate = ObjectAccessor::GetGameObject(*caster, instance->GetData64(GO_GATE_BAROV))) + if (gate->GetGoState() == GO_STATE_ACTIVE) + spellId = SPELL_SHADOW_PORTAL_BAROVFAMILYVAULT; + break; + case ROOM_VAULT_OF_THE_RAVENIAN: + if (InstanceScript* instance = caster->GetInstanceScript()) + if (GameObject* gate = ObjectAccessor::GetGameObject(*caster, instance->GetData64(GO_GATE_POLKELT))) + if (gate->GetGoState() == GO_STATE_ACTIVE) + spellId = SPELL_SHADOW_PORTAL_VAULTOFTHERAVENIAN; + break; + } + + if (spellId) + { + caster->CastSpell(GetHitUnit(), spellId, true); + break; + } + else + { + room = (room + 1) % ROOM_MAX; + ++attempts; } } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_scholomance_shadow_portal_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_scholomance_shadow_portal_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_scholomance_shadow_portal_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_scholomance_shadow_portal_SpellScript(); + } }; -Position const SummonPos[3*ROOM_MAX] = +Position const SummonPos[3 * ROOM_MAX] = { // Hall of Secrects { 230.80f, 0.138f, 85.23f, 0.0f }, @@ -382,131 +382,131 @@ Position const SummonPos[3*ROOM_MAX] = class spell_scholomance_shadow_portal_rooms : public SpellScriptLoader { - public: - spell_scholomance_shadow_portal_rooms() : SpellScriptLoader("spell_scholomance_shadow_portal_rooms") { } +public: + spell_scholomance_shadow_portal_rooms() : SpellScriptLoader("spell_scholomance_shadow_portal_rooms") { } - class spell_scholomance_shadow_portal_rooms_SpellScript : public SpellScript + class spell_scholomance_shadow_portal_rooms_SpellScript : public SpellScript + { + PrepareSpellScript(spell_scholomance_shadow_portal_rooms_SpellScript); + + bool Load() { - PrepareSpellScript(spell_scholomance_shadow_portal_rooms_SpellScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_UNIT; - } - - void HandleSendEvent(SpellEffIndex effIndex) - { - PreventHitEffect(effIndex); - Creature* caster = GetCaster()->ToCreature(); - - uint8 summonPos = 0; - uint32 gateId = 0; - - switch (GetSpellInfo()->Id) - { - case SPELL_SHADOW_PORTAL_HALLOFSECRETS: - summonPos = ROOM_HALL_OF_SECRETS*3; - gateId = GO_GATE_POLKELT; - break; - case SPELL_SHADOW_PORTAL_HALLOFTHEDAMNED: - summonPos = ROOM_HALL_OF_THE_DAMNED*3; - gateId = GO_GATE_THEOLEN; - break; - case SPELL_SHADOW_PORTAL_THECOVEN: - summonPos = ROOM_THE_COVEN*3; - gateId = GO_GATE_MALICIA; - break; - case SPELL_SHADOW_PORTAL_THESHADOWVAULT: - summonPos = ROOM_THE_SHADOW_VAULT*3; - gateId = GO_GATE_ILLUCIA; - break; - case SPELL_SHADOW_PORTAL_BAROVFAMILYVAULT: - summonPos = ROOM_BAROV_FAMILY_VAULT*4; - gateId = GO_GATE_BAROV; - break; - case SPELL_SHADOW_PORTAL_VAULTOFTHERAVENIAN: - summonPos = ROOM_VAULT_OF_THE_RAVENIAN*3; - gateId = GO_GATE_RAVENIAN; - break; - } - - if (gateId && (GetCaster()->GetMap()->GetId() == 289)) - { - for (uint8 i = 0; i < 3; ++i) - { - if (Creature* summon = GetCaster()->SummonCreature(NPC_RISEN_GUARDIAN, SummonPos[summonPos+i], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000)) - { - summon->GetMotionMaster()->MoveRandom(8.0f); - summon->AI()->SetData(0, summonPos/3 + 1); - } - } - - if (InstanceScript* instance = GetCaster()->GetInstanceScript()) - if (GameObject* gate = ObjectAccessor::GetGameObject(*caster, instance->GetData64(gateId))) - { - gate->SetGoState(GO_STATE_READY); - gate->AI()->SetData(1, 1); - } - } - } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_scholomance_shadow_portal_rooms_SpellScript::HandleSendEvent, EFFECT_1, SPELL_EFFECT_SEND_EVENT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_scholomance_shadow_portal_rooms_SpellScript(); + return GetCaster()->GetTypeId() == TYPEID_UNIT; } + + void HandleSendEvent(SpellEffIndex effIndex) + { + PreventHitEffect(effIndex); + Creature* caster = GetCaster()->ToCreature(); + + uint8 summonPos = 0; + uint32 gateId = 0; + + switch (GetSpellInfo()->Id) + { + case SPELL_SHADOW_PORTAL_HALLOFSECRETS: + summonPos = ROOM_HALL_OF_SECRETS * 3; + gateId = GO_GATE_POLKELT; + break; + case SPELL_SHADOW_PORTAL_HALLOFTHEDAMNED: + summonPos = ROOM_HALL_OF_THE_DAMNED * 3; + gateId = GO_GATE_THEOLEN; + break; + case SPELL_SHADOW_PORTAL_THECOVEN: + summonPos = ROOM_THE_COVEN * 3; + gateId = GO_GATE_MALICIA; + break; + case SPELL_SHADOW_PORTAL_THESHADOWVAULT: + summonPos = ROOM_THE_SHADOW_VAULT * 3; + gateId = GO_GATE_ILLUCIA; + break; + case SPELL_SHADOW_PORTAL_BAROVFAMILYVAULT: + summonPos = ROOM_BAROV_FAMILY_VAULT * 4; + gateId = GO_GATE_BAROV; + break; + case SPELL_SHADOW_PORTAL_VAULTOFTHERAVENIAN: + summonPos = ROOM_VAULT_OF_THE_RAVENIAN * 3; + gateId = GO_GATE_RAVENIAN; + break; + } + + if (gateId && (GetCaster()->GetMap()->GetId() == 289)) + { + for (uint8 i = 0; i < 3; ++i) + { + if (Creature* summon = GetCaster()->SummonCreature(NPC_RISEN_GUARDIAN, SummonPos[summonPos + i], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000)) + { + summon->GetMotionMaster()->MoveRandom(8.0f); + summon->AI()->SetData(0, summonPos / 3 + 1); + } + } + + if (InstanceScript* instance = GetCaster()->GetInstanceScript()) + if (GameObject* gate = ObjectAccessor::GetGameObject(*caster, instance->GetData64(gateId))) + { + gate->SetGoState(GO_STATE_READY); + gate->AI()->SetData(1, 1); + } + } + } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_scholomance_shadow_portal_rooms_SpellScript::HandleSendEvent, EFFECT_1, SPELL_EFFECT_SEND_EVENT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_scholomance_shadow_portal_rooms_SpellScript(); + } }; class spell_scholomance_boon_of_life : public SpellScriptLoader { - public: - spell_scholomance_boon_of_life() : SpellScriptLoader("spell_scholomance_boon_of_life") { } +public: + spell_scholomance_boon_of_life() : SpellScriptLoader("spell_scholomance_boon_of_life") { } - class spell_scholomance_boon_of_life_AuraScript : public AuraScript + class spell_scholomance_boon_of_life_AuraScript : public AuraScript + { + PrepareAuraScript(spell_scholomance_boon_of_life_AuraScript); + + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_scholomance_boon_of_life_AuraScript); - - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) - if (Unit* target = GetTarget()) - if (Creature* creature = target->ToCreature()) - { - creature->AI()->AttackStart(caster); - creature->AddThreat(caster, 10000.0f); - } - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { + if (Unit* caster = GetCaster()) if (Unit* target = GetTarget()) if (Creature* creature = target->ToCreature()) - if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_CANCEL) - { - creature->AI()->Talk(TALK_RAS_HUMAN); - creature->SetDisplayId(MODEL_RAS_HUMAN); - creature->SetHealth(target->GetMaxHealth()); - if (InstanceScript* instance = creature->GetInstanceScript()) - instance->SetData(DATA_RAS_HUMAN,1); + { + creature->AI()->AttackStart(caster); + creature->AddThreat(caster, 10000.0f); } - } - - void Register() - { - OnEffectRemove += AuraEffectRemoveFn(spell_scholomance_boon_of_life_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); - AfterEffectApply += AuraEffectApplyFn(spell_scholomance_boon_of_life_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_scholomance_boon_of_life_AuraScript(); } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* target = GetTarget()) + if (Creature* creature = target->ToCreature()) + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_CANCEL) + { + creature->AI()->Talk(TALK_RAS_HUMAN); + creature->SetDisplayId(MODEL_RAS_HUMAN); + creature->SetHealth(target->GetMaxHealth()); + if (InstanceScript* instance = creature->GetInstanceScript()) + instance->SetData(DATA_RAS_HUMAN, 1); + } + } + + void Register() + { + OnEffectRemove += AuraEffectRemoveFn(spell_scholomance_boon_of_life_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + AfterEffectApply += AuraEffectApplyFn(spell_scholomance_boon_of_life_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_scholomance_boon_of_life_AuraScript(); + } }; void AddSC_instance_scholomance() diff --git a/src/server/scripts/EasternKingdoms/ShadowfangKeep/instance_shadowfang_keep.cpp b/src/server/scripts/EasternKingdoms/ShadowfangKeep/instance_shadowfang_keep.cpp index 818eb9bd3..a12200e7b 100644 --- a/src/server/scripts/EasternKingdoms/ShadowfangKeep/instance_shadowfang_keep.cpp +++ b/src/server/scripts/EasternKingdoms/ShadowfangKeep/instance_shadowfang_keep.cpp @@ -19,126 +19,126 @@ enum Creatures class instance_shadowfang_keep : public InstanceMapScript { - public: - instance_shadowfang_keep() : InstanceMapScript("instance_shadowfang_keep", 33) { } +public: + instance_shadowfang_keep() : InstanceMapScript("instance_shadowfang_keep", 33) { } - InstanceScript* GetInstanceScript(InstanceMap* map) const + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_shadowfang_keep_InstanceMapScript(map); + } + + struct instance_shadowfang_keep_InstanceMapScript : public InstanceScript + { + instance_shadowfang_keep_InstanceMapScript(Map* map) : InstanceScript(map) { } + + void Initialize() { - return new instance_shadowfang_keep_InstanceMapScript(map); + memset(&_encounters, 0, sizeof(_encounters)); } - struct instance_shadowfang_keep_InstanceMapScript : public InstanceScript + void OnGameObjectCreate(GameObject* gameobject) { - instance_shadowfang_keep_InstanceMapScript(Map* map) : InstanceScript(map) { } - - void Initialize() + switch (gameobject->GetEntry()) { - memset(&_encounters, 0, sizeof(_encounters)); + case GO_COURTYARD_DOOR: + if (_encounters[TYPE_COURTYARD] == DONE) + HandleGameObject(0, true, gameobject); + break; + case GO_SORCERER_DOOR: + if (_encounters[TYPE_FENRUS_THE_DEVOURER] == DONE) + HandleGameObject(0, true, gameobject); + break; + case GO_ARUGAL_DOOR: + if (_encounters[TYPE_WOLF_MASTER_NANDOS] == DONE) + HandleGameObject(0, true, gameobject); + break; + } + } + + void SetData(uint32 type, uint32 data) + { + switch (type) + { + case TYPE_COURTYARD: + case TYPE_FENRUS_THE_DEVOURER: + case TYPE_WOLF_MASTER_NANDOS: + _encounters[type] = data; + break; } - void OnGameObjectCreate(GameObject* gameobject) + if (data == DONE) + SaveToDB(); + } + + std::string GetSaveData() + { + std::ostringstream saveStream; + saveStream << "S K " << _encounters[0] << ' ' << _encounters[1] << ' ' << _encounters[2]; + return saveStream.str(); + } + + void Load(const char* in) + { + if (!in) + return; + + char dataHead1, dataHead2; + std::istringstream loadStream(in); + loadStream >> dataHead1 >> dataHead2; + if (dataHead1 == 'S' && dataHead2 == 'K') { - switch (gameobject->GetEntry()) + for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) { - case GO_COURTYARD_DOOR: - if (_encounters[TYPE_COURTYARD] == DONE) - HandleGameObject(0, true, gameobject); - break; - case GO_SORCERER_DOOR: - if (_encounters[TYPE_FENRUS_THE_DEVOURER] == DONE) - HandleGameObject(0, true, gameobject); - break; - case GO_ARUGAL_DOOR: - if (_encounters[TYPE_WOLF_MASTER_NANDOS] == DONE) - HandleGameObject(0, true, gameobject); - break; + loadStream >> _encounters[i]; + if (_encounters[i] == IN_PROGRESS) + _encounters[i] = NOT_STARTED; } } + } - void SetData(uint32 type, uint32 data) - { - switch (type) - { - case TYPE_COURTYARD: - case TYPE_FENRUS_THE_DEVOURER: - case TYPE_WOLF_MASTER_NANDOS: - _encounters[type] = data; - break; - } - - if (data == DONE) - SaveToDB(); - } - - std::string GetSaveData() - { - std::ostringstream saveStream; - saveStream << "S K " << _encounters[0] << ' ' << _encounters[1] << ' ' << _encounters[2]; - return saveStream.str(); - } - - void Load(const char* in) - { - if (!in) - return; - - char dataHead1, dataHead2; - std::istringstream loadStream(in); - loadStream >> dataHead1 >> dataHead2; - if (dataHead1 == 'S' && dataHead2 == 'K') - { - for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) - { - loadStream >> _encounters[i]; - if (_encounters[i] == IN_PROGRESS) - _encounters[i] = NOT_STARTED; - } - } - } - - private: - uint32 _encounters[MAX_ENCOUNTERS]; - }; + private: + uint32 _encounters[MAX_ENCOUNTERS]; + }; }; class spell_shadowfang_keep_haunting_spirits : public SpellScriptLoader { - public: - spell_shadowfang_keep_haunting_spirits() : SpellScriptLoader("spell_shadowfang_keep_haunting_spirits") { } +public: + spell_shadowfang_keep_haunting_spirits() : SpellScriptLoader("spell_shadowfang_keep_haunting_spirits") { } - class spell_shadowfang_keep_haunting_spirits_AuraScript : public AuraScript + class spell_shadowfang_keep_haunting_spirits_AuraScript : public AuraScript + { + PrepareAuraScript(spell_shadowfang_keep_haunting_spirits_AuraScript); + + void CalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude) { - PrepareAuraScript(spell_shadowfang_keep_haunting_spirits_AuraScript); - - void CalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude) - { - isPeriodic = true; - amplitude = irand(30*IN_MILLISECONDS, 90*IN_MILLISECONDS); - } - - void HandleDummyTick(AuraEffect const* aurEff) - { - GetTarget()->CastSpell((Unit*)NULL, aurEff->GetAmount(), true); - } - - void HandleUpdatePeriodic(AuraEffect* aurEff) - { - aurEff->CalculatePeriodic(GetCaster()); - } - - void Register() - { - DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_shadowfang_keep_haunting_spirits_AuraScript::CalcPeriodic, EFFECT_0, SPELL_AURA_DUMMY); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_shadowfang_keep_haunting_spirits_AuraScript::HandleDummyTick, EFFECT_0, SPELL_AURA_DUMMY); - OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_shadowfang_keep_haunting_spirits_AuraScript::HandleUpdatePeriodic, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_shadowfang_keep_haunting_spirits_AuraScript(); + isPeriodic = true; + amplitude = irand(30 * IN_MILLISECONDS, 90 * IN_MILLISECONDS); } + + void HandleDummyTick(AuraEffect const* aurEff) + { + GetTarget()->CastSpell((Unit*)NULL, aurEff->GetAmount(), true); + } + + void HandleUpdatePeriodic(AuraEffect* aurEff) + { + aurEff->CalculatePeriodic(GetCaster()); + } + + void Register() + { + DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_shadowfang_keep_haunting_spirits_AuraScript::CalcPeriodic, EFFECT_0, SPELL_AURA_DUMMY); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_shadowfang_keep_haunting_spirits_AuraScript::HandleDummyTick, EFFECT_0, SPELL_AURA_DUMMY); + OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_shadowfang_keep_haunting_spirits_AuraScript::HandleUpdatePeriodic, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_shadowfang_keep_haunting_spirits_AuraScript(); + } }; enum ForsakenSpells @@ -149,51 +149,51 @@ enum ForsakenSpells class spell_shadowfang_keep_forsaken_skills : public SpellScriptLoader { - public: - spell_shadowfang_keep_forsaken_skills() : SpellScriptLoader("spell_shadowfang_keep_forsaken_skills") { } +public: + spell_shadowfang_keep_forsaken_skills() : SpellScriptLoader("spell_shadowfang_keep_forsaken_skills") { } - class spell_shadowfang_keep_forsaken_skills_AuraScript : public AuraScript + class spell_shadowfang_keep_forsaken_skills_AuraScript : public AuraScript + { + PrepareAuraScript(spell_shadowfang_keep_forsaken_skills_AuraScript); + + bool Load() { - PrepareAuraScript(spell_shadowfang_keep_forsaken_skills_AuraScript); - - bool Load() - { - _forsakenSpell = 0; - return true; - } - - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - _forsakenSpell = urand(SPELL_FORSAKEN_SKILL_SWORD, SPELL_FORSAKEN_SKILL_SHADOW); - if (_forsakenSpell == SPELL_FORSAKEN_SKILL_SHADOW - 1) - ++_forsakenSpell; - GetUnitOwner()->CastSpell(GetUnitOwner(), _forsakenSpell, true); - } - - void HandleDummyTick(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - GetUnitOwner()->RemoveAurasDueToSpell(_forsakenSpell); - _forsakenSpell = urand(SPELL_FORSAKEN_SKILL_SWORD, SPELL_FORSAKEN_SKILL_SHADOW); - if (_forsakenSpell == SPELL_FORSAKEN_SKILL_SHADOW - 1) - ++_forsakenSpell; - GetUnitOwner()->CastSpell(GetUnitOwner(), _forsakenSpell, true); - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_shadowfang_keep_forsaken_skills_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_shadowfang_keep_forsaken_skills_AuraScript::HandleDummyTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - - private: - uint32 _forsakenSpell; - }; - - AuraScript* GetAuraScript() const - { - return new spell_shadowfang_keep_forsaken_skills_AuraScript(); + _forsakenSpell = 0; + return true; } + + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + _forsakenSpell = urand(SPELL_FORSAKEN_SKILL_SWORD, SPELL_FORSAKEN_SKILL_SHADOW); + if (_forsakenSpell == SPELL_FORSAKEN_SKILL_SHADOW - 1) + ++_forsakenSpell; + GetUnitOwner()->CastSpell(GetUnitOwner(), _forsakenSpell, true); + } + + void HandleDummyTick(AuraEffect const* /*aurEff*/) + { + PreventDefaultAction(); + GetUnitOwner()->RemoveAurasDueToSpell(_forsakenSpell); + _forsakenSpell = urand(SPELL_FORSAKEN_SKILL_SWORD, SPELL_FORSAKEN_SKILL_SHADOW); + if (_forsakenSpell == SPELL_FORSAKEN_SKILL_SHADOW - 1) + ++_forsakenSpell; + GetUnitOwner()->CastSpell(GetUnitOwner(), _forsakenSpell, true); + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_shadowfang_keep_forsaken_skills_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_shadowfang_keep_forsaken_skills_AuraScript::HandleDummyTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + + private: + uint32 _forsakenSpell; + }; + + AuraScript* GetAuraScript() const + { + return new spell_shadowfang_keep_forsaken_skills_AuraScript(); + } }; void AddSC_instance_shadowfang_keep() diff --git a/src/server/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp b/src/server/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp index 2298ee34e..b84df0632 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp @@ -8,19 +8,19 @@ #include "stratholme.h" #include "Player.h" -const Position BlackGuardPos[10] = +const Position BlackGuardPos[10] = { - {4032.73f+0.0f, -3378.26f+0.0f, 119.76f, 4.67f}, - {4032.73f+2.0f, -3378.26f+2.0f, 119.76f, 4.67f}, - {4032.73f+2.0f, -3378.26f-2.0f, 119.76f, 4.67f}, - {4032.73f-2.0f, -3378.26f+2.0f, 119.76f, 4.67f}, - {4032.73f-2.0f, -3378.26f-2.0f, 119.76f, 4.67f}, - - {4032.73f+0.0f, -3407.38f+0.0f, 115.56f, 0.0f}, - {4032.73f+2.0f, -3407.38f+2.0f, 115.56f, 0.0f}, - {4032.73f+2.0f, -3407.38f-2.0f, 115.56f, 0.0f}, - {4032.73f-2.0f, -3407.38f+2.0f, 115.56f, 0.0f}, - {4032.73f-2.0f, -3407.38f-2.0f, 115.56f, 0.0f} + {4032.73f + 0.0f, -3378.26f + 0.0f, 119.76f, 4.67f}, + {4032.73f + 2.0f, -3378.26f + 2.0f, 119.76f, 4.67f}, + {4032.73f + 2.0f, -3378.26f - 2.0f, 119.76f, 4.67f}, + {4032.73f - 2.0f, -3378.26f + 2.0f, 119.76f, 4.67f}, + {4032.73f - 2.0f, -3378.26f - 2.0f, 119.76f, 4.67f}, + + {4032.73f + 0.0f, -3407.38f + 0.0f, 115.56f, 0.0f}, + {4032.73f + 2.0f, -3407.38f + 2.0f, 115.56f, 0.0f}, + {4032.73f + 2.0f, -3407.38f - 2.0f, 115.56f, 0.0f}, + {4032.73f - 2.0f, -3407.38f + 2.0f, 115.56f, 0.0f}, + {4032.73f - 2.0f, -3407.38f - 2.0f, 115.56f, 0.0f} }; // Creatures to be spawned during the trap events @@ -30,7 +30,7 @@ static const uint32 aPlaguedCritters[] = }; // Positions of the two Gate Traps -static const Position aGateTrap[] = +static const Position aGateTrap[] = { {3612.29f, -3335.39f, 124.077f, 3.14159f}, // Scarlet side {3919.88f, -3547.34f, 134.269f, 2.94961f} // Undead side @@ -40,221 +40,221 @@ static const Position aGateTrap[] = class instance_stratholme : public InstanceMapScript { - public: - instance_stratholme() : InstanceMapScript("instance_stratholme", 329) { } +public: + instance_stratholme() : InstanceMapScript("instance_stratholme", 329) { } - struct instance_stratholme_InstanceMapScript : public InstanceScript + struct instance_stratholme_InstanceMapScript : public InstanceScript + { + instance_stratholme_InstanceMapScript(Map* map) : InstanceScript(map) { - instance_stratholme_InstanceMapScript(Map* map) : InstanceScript(map) + } + + void Initialize() + { + _baronRunProgress = 0; + _baronRunTime = 0; + _zigguratState1 = 0; + _zigguratState2 = 0; + _zigguratState3 = 0; + _slaughterProgress = 0; + _slaughterNPCs = 0; + _postboxesOpened = 0; + + _zigguratDoorsGUID1 = 0; + _zigguratDoorsGUID2 = 0; + _zigguratDoorsGUID3 = 0; + _zigguratDoorsGUID4 = 0; + _zigguratDoorsGUID5 = 0; + _gauntletGateGUID = 0; + _slaughterGateGUID = 0; + _baronRivendareGUID = 0; + + _gateTrapsCooldown[0] = false; + _gateTrapsCooldown[1] = false; + + events.Reset(); + } + + void OnPlayerEnter(Player* player) + { + if (_baronRunTime > 0) + if (Aura* aura = player->AddAura(SPELL_BARON_ULTIMATUM, player)) + aura->SetDuration(_baronRunTime * MINUTE * IN_MILLISECONDS); + } + + void OnCreatureCreate(Creature* creature) + { + switch (creature->GetEntry()) { + case NPC_BARON_RIVENDARE: + _baronRivendareGUID = creature->GetGUID(); + break; + case NPC_VENOM_BELCHER: + case NPC_BILE_SPEWER: + if (_slaughterProgress == 0) + ++_slaughterNPCs; + break; + case NPC_RAMSTEIN_THE_GORGER: + if (_slaughterProgress == 1) + ++_slaughterNPCs; + break; + case NPC_MINDLESS_UNDEAD: + if (_slaughterProgress == 2) + ++_slaughterNPCs; + break; + case NPC_BLACK_GUARD: + if (_slaughterProgress == 3) + ++_slaughterNPCs; + break; } + } - void Initialize() + void ProcessSlaughterEvent() + { + if (_slaughterProgress == 1) { - _baronRunProgress = 0; - _baronRunTime = 0; - _zigguratState1 = 0; - _zigguratState2 = 0; - _zigguratState3 = 0; - _slaughterProgress = 0; - _slaughterNPCs = 0; - _postboxesOpened = 0; + if (Creature* baron = instance->GetCreature(_baronRivendareGUID)) + baron->AI()->Talk(SAY_BRAON_SUMMON_RAMSTEIN); - _zigguratDoorsGUID1 = 0; - _zigguratDoorsGUID2 = 0; - _zigguratDoorsGUID3 = 0; - _zigguratDoorsGUID4 = 0; - _zigguratDoorsGUID5 = 0; - _gauntletGateGUID = 0; - _slaughterGateGUID = 0; - _baronRivendareGUID = 0; - - _gateTrapsCooldown[0] = false; - _gateTrapsCooldown[1] = false; - - events.Reset(); + Position pos = {4032.20f, -3378.06f, 119.75f, 4.67f}; + instance->SummonCreature(NPC_RAMSTEIN_THE_GORGER, pos); } - - void OnPlayerEnter(Player* player) + if (_slaughterProgress == 2) { - if (_baronRunTime > 0) - if (Aura* aura = player->AddAura(SPELL_BARON_ULTIMATUM, player)) - aura->SetDuration(_baronRunTime*MINUTE*IN_MILLISECONDS); - } - - void OnCreatureCreate(Creature* creature) - { - switch (creature->GetEntry()) - { - case NPC_BARON_RIVENDARE: - _baronRivendareGUID = creature->GetGUID(); - break; - case NPC_VENOM_BELCHER: - case NPC_BILE_SPEWER: - if (_slaughterProgress == 0) - ++_slaughterNPCs; - break; - case NPC_RAMSTEIN_THE_GORGER: - if (_slaughterProgress == 1) - ++_slaughterNPCs; - break; - case NPC_MINDLESS_UNDEAD: - if (_slaughterProgress == 2) - ++_slaughterNPCs; - break; - case NPC_BLACK_GUARD: - if (_slaughterProgress == 3) - ++_slaughterNPCs; - break; - } - } - - void ProcessSlaughterEvent() - { - if (_slaughterProgress == 1) - { - if (Creature* baron = instance->GetCreature(_baronRivendareGUID)) - baron->AI()->Talk(SAY_BRAON_SUMMON_RAMSTEIN); - - Position pos = {4032.20f, -3378.06f, 119.75f, 4.67f}; - instance->SummonCreature(NPC_RAMSTEIN_THE_GORGER, pos); - } - if (_slaughterProgress == 2) - { - for (uint32 i = 0; i < 33; ++i) - events.ScheduleEvent(EVENT_SPAWN_MINDLESS, 5000 + i*210); - if (Creature* baron = instance->GetCreature(_baronRivendareGUID)) - if (GameObject* gate = baron->FindNearestGameObject(GO_SLAUGHTER_GATE_SIDE, 200.0f)) - gate->SetGoState(GO_STATE_ACTIVE); - } - if (_slaughterProgress == 3) - { - events.ScheduleEvent(EVENT_SPAWN_BLACK_GUARD, 20000); - } - if (_slaughterProgress == 4) - { - if (Creature* baron = instance->GetCreature(_baronRivendareGUID)) - baron->AI()->Talk(SAY_BARON_GUARD_DEAD); - if (GameObject* gate = instance->GetGameObject(_zigguratDoorsGUID5)) + for (uint32 i = 0; i < 33; ++i) + events.ScheduleEvent(EVENT_SPAWN_MINDLESS, 5000 + i * 210); + if (Creature* baron = instance->GetCreature(_baronRivendareGUID)) + if (GameObject* gate = baron->FindNearestGameObject(GO_SLAUGHTER_GATE_SIDE, 200.0f)) gate->SetGoState(GO_STATE_ACTIVE); - - } } - - void OnUnitDeath(Unit* unit) + if (_slaughterProgress == 3) { - switch (unit->GetEntry()) - { - case NPC_VENOM_BELCHER: - case NPC_BILE_SPEWER: - case NPC_RAMSTEIN_THE_GORGER: - case NPC_MINDLESS_UNDEAD: - case NPC_BLACK_GUARD: - if (--_slaughterNPCs == 0) - { - ++_slaughterProgress; - ProcessSlaughterEvent(); - SaveToDB(); - } - break; - } + events.ScheduleEvent(EVENT_SPAWN_BLACK_GUARD, 20000); } - - void OnGameObjectCreate(GameObject* go) + if (_slaughterProgress == 4) { - switch (go->GetEntry()) - { - case GO_ZIGGURAT_DOORS1: - _zigguratDoorsGUID1 = go->GetGUID(); - if (GetData(TYPE_ZIGGURAT1) >= 1) - go->SetGoState(GO_STATE_ACTIVE); - break; - case GO_ZIGGURAT_DOORS2: - _zigguratDoorsGUID2 = go->GetGUID(); - if (GetData(TYPE_ZIGGURAT2) >= 1) - go->SetGoState(GO_STATE_ACTIVE); - break; - case GO_ZIGGURAT_DOORS3: - _zigguratDoorsGUID3 = go->GetGUID(); - if (GetData(TYPE_ZIGGURAT3) >= 1) - go->SetGoState(GO_STATE_ACTIVE); - break; - case GO_GAUNTLET_GATE: - _gauntletGateGUID = go->GetGUID(); - if (_zigguratState1 == 2 && _zigguratState2 == 2 && _zigguratState3 == 2) - go->SetGoState(GO_STATE_ACTIVE); - break; - case GO_SLAUGTHER_GATE: - _slaughterGateGUID = go->GetGUID(); - if (_zigguratState1 == 2 && _zigguratState2 == 2 && _zigguratState3 == 2) - go->SetGoState(GO_STATE_ACTIVE); - break; - case GO_ZIGGURAT_DOORS4: - _zigguratDoorsGUID4 = go->GetGUID(); - if (_slaughterProgress == 4) - go->SetGoState(GO_STATE_ACTIVE); - break; - case GO_ZIGGURAT_DOORS5: - _zigguratDoorsGUID5 = go->GetGUID(); - if (_slaughterProgress == 4) - go->SetGoState(GO_STATE_ACTIVE); - break; - case GO_SLAUGHTER_GATE_SIDE: - if (_slaughterProgress >= 2) - go->SetGoState(GO_STATE_ACTIVE); - break; - case GO_PORT_TRAP_GATE_1: - _trapGatesGUIDs[0] = go->GetGUID(); - break; - case GO_PORT_TRAP_GATE_2: - _trapGatesGUIDs[1] = go->GetGUID(); - break; - case GO_PORT_TRAP_GATE_3: - _trapGatesGUIDs[2] = go->GetGUID(); - break; - case GO_PORT_TRAP_GATE_4: - _trapGatesGUIDs[3] = go->GetGUID(); - break; - } + if (Creature* baron = instance->GetCreature(_baronRivendareGUID)) + baron->AI()->Talk(SAY_BARON_GUARD_DEAD); + if (GameObject* gate = instance->GetGameObject(_zigguratDoorsGUID5)) + gate->SetGoState(GO_STATE_ACTIVE); + } + } - void CheckZiggurats() + void OnUnitDeath(Unit* unit) + { + switch (unit->GetEntry()) { - if (_zigguratState1 == 2 && _zigguratState2 == 2 && _zigguratState3 == 2) - { - instance->LoadGrid(4035.83f, -3336.31f); - if (Creature* baron = instance->GetCreature(_baronRivendareGUID)) - baron->AI()->Talk(SAY_BRAON_ZIGGURAT_FALL_YELL); - - if (GameObject* gate = instance->GetGameObject(_gauntletGateGUID)) - gate->SetGoState(GO_STATE_ACTIVE); - if (GameObject* gate = instance->GetGameObject(_slaughterGateGUID)) - gate->SetGoState(GO_STATE_ACTIVE); - } + case NPC_VENOM_BELCHER: + case NPC_BILE_SPEWER: + case NPC_RAMSTEIN_THE_GORGER: + case NPC_MINDLESS_UNDEAD: + case NPC_BLACK_GUARD: + if (--_slaughterNPCs == 0) + { + ++_slaughterProgress; + ProcessSlaughterEvent(); + SaveToDB(); + } + break; } + } - void DoSpawnPlaguedCritters(uint8 /*uiGate*/, Player* player) + void OnGameObjectCreate(GameObject* go) + { + switch (go->GetEntry()) { - if (!player) - return; - - - uint32 uiEntry = aPlaguedCritters[urand(0, 2)]; - for (uint8 i = 0; i < 30; ++i) - { - float x, y, z; - const Position pPos = { player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetOrientation() }; - player->GetRandomPoint(pPos, 8.0f, x, y, z); - z = player->GetPositionZ() + 1; - player->SummonCreature(uiEntry, x, y, z, 0, TEMPSUMMON_DEAD_DESPAWN, 0)->AI()->AttackStart(player); - } + case GO_ZIGGURAT_DOORS1: + _zigguratDoorsGUID1 = go->GetGUID(); + if (GetData(TYPE_ZIGGURAT1) >= 1) + go->SetGoState(GO_STATE_ACTIVE); + break; + case GO_ZIGGURAT_DOORS2: + _zigguratDoorsGUID2 = go->GetGUID(); + if (GetData(TYPE_ZIGGURAT2) >= 1) + go->SetGoState(GO_STATE_ACTIVE); + break; + case GO_ZIGGURAT_DOORS3: + _zigguratDoorsGUID3 = go->GetGUID(); + if (GetData(TYPE_ZIGGURAT3) >= 1) + go->SetGoState(GO_STATE_ACTIVE); + break; + case GO_GAUNTLET_GATE: + _gauntletGateGUID = go->GetGUID(); + if (_zigguratState1 == 2 && _zigguratState2 == 2 && _zigguratState3 == 2) + go->SetGoState(GO_STATE_ACTIVE); + break; + case GO_SLAUGTHER_GATE: + _slaughterGateGUID = go->GetGUID(); + if (_zigguratState1 == 2 && _zigguratState2 == 2 && _zigguratState3 == 2) + go->SetGoState(GO_STATE_ACTIVE); + break; + case GO_ZIGGURAT_DOORS4: + _zigguratDoorsGUID4 = go->GetGUID(); + if (_slaughterProgress == 4) + go->SetGoState(GO_STATE_ACTIVE); + break; + case GO_ZIGGURAT_DOORS5: + _zigguratDoorsGUID5 = go->GetGUID(); + if (_slaughterProgress == 4) + go->SetGoState(GO_STATE_ACTIVE); + break; + case GO_SLAUGHTER_GATE_SIDE: + if (_slaughterProgress >= 2) + go->SetGoState(GO_STATE_ACTIVE); + break; + case GO_PORT_TRAP_GATE_1: + _trapGatesGUIDs[0] = go->GetGUID(); + break; + case GO_PORT_TRAP_GATE_2: + _trapGatesGUIDs[1] = go->GetGUID(); + break; + case GO_PORT_TRAP_GATE_3: + _trapGatesGUIDs[2] = go->GetGUID(); + break; + case GO_PORT_TRAP_GATE_4: + _trapGatesGUIDs[3] = go->GetGUID(); + break; } + } - void SetData(uint32 type, uint32 data) + void CheckZiggurats() + { + if (_zigguratState1 == 2 && _zigguratState2 == 2 && _zigguratState3 == 2) { - switch (type) - { - case TYPE_BARON_RUN: + instance->LoadGrid(4035.83f, -3336.31f); + if (Creature* baron = instance->GetCreature(_baronRivendareGUID)) + baron->AI()->Talk(SAY_BRAON_ZIGGURAT_FALL_YELL); + + if (GameObject* gate = instance->GetGameObject(_gauntletGateGUID)) + gate->SetGoState(GO_STATE_ACTIVE); + if (GameObject* gate = instance->GetGameObject(_slaughterGateGUID)) + gate->SetGoState(GO_STATE_ACTIVE); + } + } + + void DoSpawnPlaguedCritters(uint8 /*uiGate*/, Player* player) + { + if (!player) + return; + + + uint32 uiEntry = aPlaguedCritters[urand(0, 2)]; + for (uint8 i = 0; i < 30; ++i) + { + float x, y, z; + const Position pPos = { player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetOrientation() }; + player->GetRandomPoint(pPos, 8.0f, x, y, z); + z = player->GetPositionZ() + 1; + player->SummonCreature(uiEntry, x, y, z, 0, TEMPSUMMON_DEAD_DESPAWN, 0)->AI()->AttackStart(player); + } + } + + void SetData(uint32 type, uint32 data) + { + switch (type) + { + case TYPE_BARON_RUN: { if (_baronRunProgress == DATA_BARON_RUN_NONE) { @@ -269,9 +269,9 @@ class instance_stratholme : public InstanceMapScript } break; } - case TYPE_ZIGGURAT1: + case TYPE_ZIGGURAT1: { - if (data == _zigguratState1+1) + if (data == _zigguratState1 + 1) ++_zigguratState1; if (_zigguratState1 == 1) @@ -281,9 +281,9 @@ class instance_stratholme : public InstanceMapScript CheckZiggurats(); break; } - case TYPE_ZIGGURAT2: + case TYPE_ZIGGURAT2: { - if (data == _zigguratState2+1) + if (data == _zigguratState2 + 1) ++_zigguratState2; if (_zigguratState2 == 1) @@ -291,11 +291,11 @@ class instance_stratholme : public InstanceMapScript ziggurat->SetGoState(GO_STATE_ACTIVE); CheckZiggurats(); - break; + break; } - case TYPE_ZIGGURAT3: + case TYPE_ZIGGURAT3: { - if (data == _zigguratState3+1) + if (data == _zigguratState3 + 1) ++_zigguratState3; if (_zigguratState3 == 1) @@ -305,151 +305,151 @@ class instance_stratholme : public InstanceMapScript CheckZiggurats(); break; } - case TYPE_BARON_FIGHT: + case TYPE_BARON_FIGHT: { if (GameObject* gate = instance->GetGameObject(_zigguratDoorsGUID5)) gate->SetGoState(data == IN_PROGRESS ? GO_STATE_READY : GO_STATE_ACTIVE); return; } - case TYPE_MALLOW: - ++_postboxesOpened; - break; - } - - SaveToDB(); + case TYPE_MALLOW: + ++_postboxesOpened; + break; } - std::string GetSaveData() + SaveToDB(); + } + + std::string GetSaveData() + { + std::ostringstream saveStream; + saveStream << "S T " << _baronRunProgress << ' ' << _baronRunTime << ' ' << _zigguratState1 << ' ' << _zigguratState2 << ' ' << _zigguratState3 << ' ' << _slaughterProgress << ' ' << _postboxesOpened; + return saveStream.str(); + } + + void Load(const char* in) + { + if (!in) + return; + + char dataHead1, dataHead2; + std::istringstream loadStream(in); + loadStream >> dataHead1 >> dataHead2; + if (dataHead1 == 'S' && dataHead2 == 'T') { - std::ostringstream saveStream; - saveStream << "S T " << _baronRunProgress << ' ' << _baronRunTime << ' ' << _zigguratState1 << ' ' << _zigguratState2 << ' ' << _zigguratState3 << ' ' << _slaughterProgress << ' ' << _postboxesOpened; - return saveStream.str(); + loadStream >> _baronRunProgress; + loadStream >> _baronRunTime; + loadStream >> _zigguratState1; + loadStream >> _zigguratState2; + loadStream >> _zigguratState3; + loadStream >> _slaughterProgress; + loadStream >> _postboxesOpened; } - void Load(const char* in) - { - if (!in) - return; + if (_baronRunTime > 0) + events.ScheduleEvent(EVENT_BARON_TIME, 60000); - char dataHead1, dataHead2; - std::istringstream loadStream(in); - loadStream >> dataHead1 >> dataHead2; - if (dataHead1 == 'S' && dataHead2 == 'T') + if (_slaughterProgress > 0 && _slaughterProgress < 4) + events.ScheduleEvent(EVENT_FORCE_SLAUGHTER_EVENT, 5000); + } + + uint32 GetData(uint32 type) const + { + switch (type) + { + case TYPE_ZIGGURAT1: + return _zigguratState1; + case TYPE_ZIGGURAT2: + return _zigguratState2; + case TYPE_ZIGGURAT3: + return _zigguratState3; + case TYPE_MALLOW: + return _postboxesOpened; + } + return 0; + } + + void Update(uint32 diff) + { + events.Update(diff); + + Map::PlayerList const& players = instance->GetPlayers(); + // Loop over the two Gate traps, each one has up to three timers (trap reset, gate opening delay, critters spawning delay) + for (uint8 i = 0; i < 2; i++) + { + // if the gate is in cooldown, skip the other checks + if (_gateTrapsCooldown[i]) + break; + + + // Check that the trap is not on cooldown, if so check if player/pet is in range + for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) { - loadStream >> _baronRunProgress; - loadStream >> _baronRunTime; - loadStream >> _zigguratState1; - loadStream >> _zigguratState2; - loadStream >> _zigguratState3; - loadStream >> _slaughterProgress; - loadStream >> _postboxesOpened; - } - - if (_baronRunTime > 0) - events.ScheduleEvent(EVENT_BARON_TIME, 60000); - - if (_slaughterProgress > 0 && _slaughterProgress < 4) - events.ScheduleEvent(EVENT_FORCE_SLAUGHTER_EVENT, 5000); - } - - uint32 GetData(uint32 type) const - { - switch (type) - { - case TYPE_ZIGGURAT1: - return _zigguratState1; - case TYPE_ZIGGURAT2: - return _zigguratState2; - case TYPE_ZIGGURAT3: - return _zigguratState3; - case TYPE_MALLOW: - return _postboxesOpened; - } - return 0; - } - - void Update(uint32 diff) - { - events.Update(diff); - - Map::PlayerList const& players = instance->GetPlayers(); - // Loop over the two Gate traps, each one has up to three timers (trap reset, gate opening delay, critters spawning delay) - for (uint8 i = 0; i < 2; i++) - { - // if the gate is in cooldown, skip the other checks - if (_gateTrapsCooldown[i]) - break; - - - // Check that the trap is not on cooldown, if so check if player/pet is in range - for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + if (Player* player = itr->GetSource()) { - if (Player* player = itr->GetSource()) + // should pet also trigger the trap? could not find any source for it + if (player && !player->IsGameMaster() && player->IsWithinDist2d(aGateTrap[i].m_positionX, aGateTrap[i].m_positionY, 5.5f)) { - // should pet also trigger the trap? could not find any source for it - if (player && !player->IsGameMaster() && player->IsWithinDist2d(aGateTrap[i].m_positionX, aGateTrap[i].m_positionY, 5.5f)) + // Check if timer was not already set by another player/pet a few milliseconds before + if (_gateTrapsCooldown[i]) + return; + + _gateTrapsCooldown[i] = true; + + // close the gates + if (_trapGatesGUIDs[2 * i]) + DoUseDoorOrButton(_trapGatesGUIDs[2 * i]); + if (_trapGatesGUIDs[2 * i + 1]) + DoUseDoorOrButton(_trapGatesGUIDs[2 * i + 1]); + + _trappedPlayerGUID = player->GetGUID(); + + if (i == 0) { - // Check if timer was not already set by another player/pet a few milliseconds before - if (_gateTrapsCooldown[i]) - return; - - _gateTrapsCooldown[i] = true; - - // close the gates - if (_trapGatesGUIDs[2 * i]) - DoUseDoorOrButton(_trapGatesGUIDs[2 * i]); - if (_trapGatesGUIDs[2 * i + 1]) - DoUseDoorOrButton(_trapGatesGUIDs[2 * i + 1]); - - _trappedPlayerGUID = player->GetGUID(); - - if (i == 0) - { - // set timer to reset the trap - events.ScheduleEvent(EVENT_GATE1_TRAP, 30 * MINUTE * IN_MILLISECONDS); - // set timer to reopen gates - events.ScheduleEvent(EVENT_GATE1_DELAY, 20 * IN_MILLISECONDS); - // set timer to spawn the plagued critters - events.ScheduleEvent(EVENT_GATE1_CRITTER_DELAY, 2 * IN_MILLISECONDS); - } - else if (i == 1) - { - // set timer to reset the trap - events.ScheduleEvent(EVENT_GATE2_TRAP, 30 * MINUTE * IN_MILLISECONDS); - // set timer to reopen gates - events.ScheduleEvent(EVENT_GATE2_DELAY, 20 * IN_MILLISECONDS); - // set timer to spawn the plagued critters - events.ScheduleEvent(EVENT_GATE2_CRITTER_DELAY, 2 * IN_MILLISECONDS); - } + // set timer to reset the trap + events.ScheduleEvent(EVENT_GATE1_TRAP, 30 * MINUTE * IN_MILLISECONDS); + // set timer to reopen gates + events.ScheduleEvent(EVENT_GATE1_DELAY, 20 * IN_MILLISECONDS); + // set timer to spawn the plagued critters + events.ScheduleEvent(EVENT_GATE1_CRITTER_DELAY, 2 * IN_MILLISECONDS); + } + else if (i == 1) + { + // set timer to reset the trap + events.ScheduleEvent(EVENT_GATE2_TRAP, 30 * MINUTE * IN_MILLISECONDS); + // set timer to reopen gates + events.ScheduleEvent(EVENT_GATE2_DELAY, 20 * IN_MILLISECONDS); + // set timer to spawn the plagued critters + events.ScheduleEvent(EVENT_GATE2_CRITTER_DELAY, 2 * IN_MILLISECONDS); } } } } + } - const int GATE1 = 0; - const int GATE2 = 1; + const int GATE1 = 0; + const int GATE2 = 1; - switch (events.ExecuteEvent()) - { - case EVENT_GATE1_TRAP: - _gateTrapsCooldown[GATE1] = false; - break; - case EVENT_GATE2_TRAP: - _gateTrapsCooldown[GATE2] = false; - break; - case EVENT_GATE1_DELAY: - gate_delay(GATE1); - break; - case EVENT_GATE2_DELAY: - gate_delay(GATE2); - break; - case EVENT_GATE1_CRITTER_DELAY: - gate_critter_delay(GATE1); - break; - case EVENT_GATE2_CRITTER_DELAY: - gate_critter_delay(GATE2); - break; - case EVENT_BARON_TIME: + switch (events.ExecuteEvent()) + { + case EVENT_GATE1_TRAP: + _gateTrapsCooldown[GATE1] = false; + break; + case EVENT_GATE2_TRAP: + _gateTrapsCooldown[GATE2] = false; + break; + case EVENT_GATE1_DELAY: + gate_delay(GATE1); + break; + case EVENT_GATE2_DELAY: + gate_delay(GATE2); + break; + case EVENT_GATE1_CRITTER_DELAY: + gate_critter_delay(GATE1); + break; + case EVENT_GATE2_CRITTER_DELAY: + gate_critter_delay(GATE2); + break; + case EVENT_BARON_TIME: { --_baronRunTime; instance->LoadGrid(4035.83f, -3336.31f); @@ -481,7 +481,7 @@ class instance_stratholme : public InstanceMapScript SaveToDB(); break; } - case EVENT_EXECUTE_PRISONER: + case EVENT_EXECUTE_PRISONER: { instance->LoadGrid(4035.83f, -3336.31f); Creature* baron = instance->GetCreature(_baronRivendareGUID); @@ -498,13 +498,13 @@ class instance_stratholme : public InstanceMapScript } break; } - case EVENT_SPAWN_MINDLESS: + case EVENT_SPAWN_MINDLESS: { Position pos = {3941.75f, -3393.06f, 119.70f, 0.0f}; instance->SummonCreature(NPC_MINDLESS_UNDEAD, pos); break; } - case EVENT_FORCE_SLAUGHTER_EVENT: + case EVENT_FORCE_SLAUGHTER_EVENT: { Map::PlayerList const& PlayerList = instance->GetPlayers(); if (!PlayerList.isEmpty()) @@ -515,18 +515,18 @@ class instance_stratholme : public InstanceMapScript ProcessSlaughterEvent(); return; } - + events.ScheduleEvent(EVENT_FORCE_SLAUGHTER_EVENT, 3000); break; } - case EVENT_SPAWN_BLACK_GUARD: + case EVENT_SPAWN_BLACK_GUARD: { for (uint8 i = 0; i < 5; ++i) if (Creature* guard = instance->SummonCreature(NPC_BLACK_GUARD, BlackGuardPos[i])) { guard->SetWalk(true); - guard->GetMotionMaster()->MovePoint(0, BlackGuardPos[i+5]); - guard->SetHomePosition(BlackGuardPos[i+5]); + guard->GetMotionMaster()->MovePoint(0, BlackGuardPos[i + 5]); + guard->SetHomePosition(BlackGuardPos[i + 5]); if (i == 0 && guard->AI()) guard->AI()->Talk(SAY_BLACK_GUARD_INIT); } @@ -535,62 +535,62 @@ class instance_stratholme : public InstanceMapScript gate->SetGoState(GO_STATE_ACTIVE); break; } - } } - - private: - uint32 _baronRunProgress; - uint32 _baronRunTime; - uint32 _zigguratState1; - uint32 _zigguratState2; - uint32 _zigguratState3; - uint32 _slaughterProgress; - uint32 _slaughterNPCs; - uint32 _postboxesOpened; - EventMap events; - - uint64 _zigguratDoorsGUID1; - uint64 _zigguratDoorsGUID2; - uint64 _zigguratDoorsGUID3; - uint64 _zigguratDoorsGUID4; - uint64 _zigguratDoorsGUID5; - uint64 _slaughterGateGUID; - uint64 _gauntletGateGUID; - uint64 _baronRivendareGUID; - - bool _gateTrapsCooldown[2]; - uint64 _trappedPlayerGUID; - uint64 _trapGatesGUIDs[4]; - - void gate_delay(int gate) - { - if (_trapGatesGUIDs[2 * gate]) - { - DoUseDoorOrButton(_trapGatesGUIDs[2 * gate]); - } - if (_trapGatesGUIDs[2 * gate + 1]) - { - DoUseDoorOrButton(_trapGatesGUIDs[2 * gate + 1]); - } - } - - void gate_critter_delay(int gate) - { - if (_trappedPlayerGUID) - { - if (Player* pPlayer = instance->GetPlayer(_trappedPlayerGUID)) - { - DoSpawnPlaguedCritters(gate, pPlayer); - } - } - } - }; - - - InstanceScript* GetInstanceScript(InstanceMap* map) const - { - return new instance_stratholme_InstanceMapScript(map); } + + private: + uint32 _baronRunProgress; + uint32 _baronRunTime; + uint32 _zigguratState1; + uint32 _zigguratState2; + uint32 _zigguratState3; + uint32 _slaughterProgress; + uint32 _slaughterNPCs; + uint32 _postboxesOpened; + EventMap events; + + uint64 _zigguratDoorsGUID1; + uint64 _zigguratDoorsGUID2; + uint64 _zigguratDoorsGUID3; + uint64 _zigguratDoorsGUID4; + uint64 _zigguratDoorsGUID5; + uint64 _slaughterGateGUID; + uint64 _gauntletGateGUID; + uint64 _baronRivendareGUID; + + bool _gateTrapsCooldown[2]; + uint64 _trappedPlayerGUID; + uint64 _trapGatesGUIDs[4]; + + void gate_delay(int gate) + { + if (_trapGatesGUIDs[2 * gate]) + { + DoUseDoorOrButton(_trapGatesGUIDs[2 * gate]); + } + if (_trapGatesGUIDs[2 * gate + 1]) + { + DoUseDoorOrButton(_trapGatesGUIDs[2 * gate + 1]); + } + } + + void gate_critter_delay(int gate) + { + if (_trappedPlayerGUID) + { + if (Player* pPlayer = instance->GetPlayer(_trappedPlayerGUID)) + { + DoSpawnPlaguedCritters(gate, pPlayer); + } + } + } + }; + + + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_stratholme_InstanceMapScript(map); + } }; void AddSC_instance_stratholme() diff --git a/src/server/scripts/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp b/src/server/scripts/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp index 2a7bee422..5c44eaf5e 100644 --- a/src/server/scripts/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp +++ b/src/server/scripts/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp @@ -11,185 +11,185 @@ class instance_sunken_temple : public InstanceMapScript { - public: - instance_sunken_temple() : InstanceMapScript("instance_sunken_temple", 109) { } +public: + instance_sunken_temple() : InstanceMapScript("instance_sunken_temple", 109) { } - struct instance_sunken_temple_InstanceMapScript : public InstanceScript + struct instance_sunken_temple_InstanceMapScript : public InstanceScript + { + instance_sunken_temple_InstanceMapScript(Map* map) : InstanceScript(map) { - instance_sunken_temple_InstanceMapScript(Map* map) : InstanceScript(map) - { - } - - void Initialize() - { - _statuePhase = 0; - _defendersKilled = 0; - memset(&_encounters, 0, sizeof(_encounters)); - - _forcefieldGUID = 0; - _jammalanGUID = 0; - } - - void OnCreatureCreate(Creature* creature) - { - switch (creature->GetEntry()) - { - case NPC_JAMMAL_AN_THE_PROPHET: - _jammalanGUID = creature->GetGUID(); - break; - } - - if (creature->IsAlive() && creature->GetDBTableGUIDLow() && creature->GetCreatureType() == CREATURE_TYPE_DRAGONKIN && creature->GetEntry() != NPC_SHADE_OF_ERANIKUS) - _dragonkinList.push_back(creature->GetGUID()); - } - - void OnUnitDeath(Unit* unit) - { - if (unit->GetTypeId() == TYPEID_UNIT && unit->GetCreatureType() == CREATURE_TYPE_DRAGONKIN && unit->GetEntry() != NPC_SHADE_OF_ERANIKUS) - _dragonkinList.remove(unit->GetGUID()); - } - - void OnGameObjectCreate(GameObject* gameobject) - { - switch (gameobject->GetEntry()) - { - case GO_ATALAI_STATUE1: - case GO_ATALAI_STATUE2: - case GO_ATALAI_STATUE3: - case GO_ATALAI_STATUE4: - case GO_ATALAI_STATUE5: - case GO_ATALAI_STATUE6: - if (gameobject->GetEntry() < GO_ATALAI_STATUE1+_statuePhase) - { - instance->SummonGameObject(GO_ATALAI_LIGHT2, gameobject->GetPositionX(), gameobject->GetPositionY(), gameobject->GetPositionZ(), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f); - gameobject->SetUInt32Value(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - } - break; - case GO_ATALAI_IDOL: - if (_statuePhase == MAX_STATUE_PHASE) - gameobject->SummonGameObject(GO_IDOL_OF_HAKKAR, -480.08f, 94.29f, -189.72f, 1.571f, 0.0f, 0.0f, 0.0f, 0.0f, 0); - break; - case GO_IDOL_OF_HAKKAR: - if (_encounters[TYPE_ATAL_ALARION] == DONE) - gameobject->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - break; - case GO_FORCEFIELD: - _forcefieldGUID = gameobject->GetGUID(); - if (_defendersKilled == DEFENDERS_COUNT) - gameobject->SetGoState(GO_STATE_ACTIVE); - } - } - - void SetData(uint32 type, uint32 data) - { - switch (type) - { - case DATA_STATUES: - _events.ScheduleEvent(DATA_STATUES, 0); - break; - case DATA_DEFENDER_KILLED: - ++_defendersKilled; - if (_defendersKilled == DEFENDERS_COUNT) - { - instance->LoadGrid(-425.89f, -86.07f); - if (Creature* jammal = instance->GetCreature(_jammalanGUID)) - jammal->AI()->Talk(0); - if (GameObject* forcefield = instance->GetGameObject(_forcefieldGUID)) - forcefield->SetGoState(GO_STATE_ACTIVE); - } - break; - case DATA_ERANIKUS_FIGHT: - for (std::list::const_iterator itr = _dragonkinList.begin(); itr != _dragonkinList.end(); ++itr) - { - if (Creature* creature = instance->GetCreature(*itr)) - if (instance->IsGridLoaded(creature->GetPositionX(), creature->GetPositionY())) - creature->SetInCombatWithZone(); - } - break; - case TYPE_ATAL_ALARION: - case TYPE_JAMMAL_AN: - case TYPE_HAKKAR_EVENT: - _encounters[type] = data; - break; - } - - SaveToDB(); - } - - uint32 GetData(uint32 type) const - { - switch (type) - { - case DATA_STATUES: - return _statuePhase; - case DATA_DEFENDER_KILLED: - return _defendersKilled; - case TYPE_ATAL_ALARION: - case TYPE_JAMMAL_AN: - case TYPE_HAKKAR_EVENT: - return _encounters[type]; - } - - return 0; - } - - void Update(uint32 diff) - { - _events.Update(diff); - switch (_events.ExecuteEvent()) - { - case DATA_STATUES: - ++_statuePhase; - if (_statuePhase == MAX_STATUE_PHASE) - instance->SummonGameObject(GO_IDOL_OF_HAKKAR, -480.08f, 94.29f, -189.72f, 1.571f, 0.0f, 0.0f, 0.0f, 0.0f, 0); - break; - } - } - - std::string GetSaveData() - { - std::ostringstream saveStream; - saveStream << "T A " << _encounters[0] << ' ' << _encounters[1] << ' ' << _encounters[2] << ' ' << _statuePhase << ' ' << _defendersKilled; - return saveStream.str(); - } - - void Load(const char* in) - { - if (!in) - return; - - char dataHead1, dataHead2; - std::istringstream loadStream(in); - loadStream >> dataHead1 >> dataHead2; - if (dataHead1 == 'T' && dataHead2 == 'A') - { - for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) - { - loadStream >> _encounters[i]; - if (_encounters[i] == IN_PROGRESS) - _encounters[i] = NOT_STARTED; - } - - loadStream >> _statuePhase; - loadStream >> _defendersKilled; - } - } - - private: - uint32 _statuePhase; - uint32 _defendersKilled; - uint32 _encounters[MAX_ENCOUNTERS]; - - uint64 _forcefieldGUID; - uint64 _jammalanGUID; - std::list _dragonkinList; - EventMap _events; - }; - - InstanceScript* GetInstanceScript(InstanceMap* map) const - { - return new instance_sunken_temple_InstanceMapScript(map); } + + void Initialize() + { + _statuePhase = 0; + _defendersKilled = 0; + memset(&_encounters, 0, sizeof(_encounters)); + + _forcefieldGUID = 0; + _jammalanGUID = 0; + } + + void OnCreatureCreate(Creature* creature) + { + switch (creature->GetEntry()) + { + case NPC_JAMMAL_AN_THE_PROPHET: + _jammalanGUID = creature->GetGUID(); + break; + } + + if (creature->IsAlive() && creature->GetDBTableGUIDLow() && creature->GetCreatureType() == CREATURE_TYPE_DRAGONKIN && creature->GetEntry() != NPC_SHADE_OF_ERANIKUS) + _dragonkinList.push_back(creature->GetGUID()); + } + + void OnUnitDeath(Unit* unit) + { + if (unit->GetTypeId() == TYPEID_UNIT && unit->GetCreatureType() == CREATURE_TYPE_DRAGONKIN && unit->GetEntry() != NPC_SHADE_OF_ERANIKUS) + _dragonkinList.remove(unit->GetGUID()); + } + + void OnGameObjectCreate(GameObject* gameobject) + { + switch (gameobject->GetEntry()) + { + case GO_ATALAI_STATUE1: + case GO_ATALAI_STATUE2: + case GO_ATALAI_STATUE3: + case GO_ATALAI_STATUE4: + case GO_ATALAI_STATUE5: + case GO_ATALAI_STATUE6: + if (gameobject->GetEntry() < GO_ATALAI_STATUE1 + _statuePhase) + { + instance->SummonGameObject(GO_ATALAI_LIGHT2, gameobject->GetPositionX(), gameobject->GetPositionY(), gameobject->GetPositionZ(), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f); + gameobject->SetUInt32Value(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + } + break; + case GO_ATALAI_IDOL: + if (_statuePhase == MAX_STATUE_PHASE) + gameobject->SummonGameObject(GO_IDOL_OF_HAKKAR, -480.08f, 94.29f, -189.72f, 1.571f, 0.0f, 0.0f, 0.0f, 0.0f, 0); + break; + case GO_IDOL_OF_HAKKAR: + if (_encounters[TYPE_ATAL_ALARION] == DONE) + gameobject->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + break; + case GO_FORCEFIELD: + _forcefieldGUID = gameobject->GetGUID(); + if (_defendersKilled == DEFENDERS_COUNT) + gameobject->SetGoState(GO_STATE_ACTIVE); + } + } + + void SetData(uint32 type, uint32 data) + { + switch (type) + { + case DATA_STATUES: + _events.ScheduleEvent(DATA_STATUES, 0); + break; + case DATA_DEFENDER_KILLED: + ++_defendersKilled; + if (_defendersKilled == DEFENDERS_COUNT) + { + instance->LoadGrid(-425.89f, -86.07f); + if (Creature* jammal = instance->GetCreature(_jammalanGUID)) + jammal->AI()->Talk(0); + if (GameObject* forcefield = instance->GetGameObject(_forcefieldGUID)) + forcefield->SetGoState(GO_STATE_ACTIVE); + } + break; + case DATA_ERANIKUS_FIGHT: + for (std::list::const_iterator itr = _dragonkinList.begin(); itr != _dragonkinList.end(); ++itr) + { + if (Creature* creature = instance->GetCreature(*itr)) + if (instance->IsGridLoaded(creature->GetPositionX(), creature->GetPositionY())) + creature->SetInCombatWithZone(); + } + break; + case TYPE_ATAL_ALARION: + case TYPE_JAMMAL_AN: + case TYPE_HAKKAR_EVENT: + _encounters[type] = data; + break; + } + + SaveToDB(); + } + + uint32 GetData(uint32 type) const + { + switch (type) + { + case DATA_STATUES: + return _statuePhase; + case DATA_DEFENDER_KILLED: + return _defendersKilled; + case TYPE_ATAL_ALARION: + case TYPE_JAMMAL_AN: + case TYPE_HAKKAR_EVENT: + return _encounters[type]; + } + + return 0; + } + + void Update(uint32 diff) + { + _events.Update(diff); + switch (_events.ExecuteEvent()) + { + case DATA_STATUES: + ++_statuePhase; + if (_statuePhase == MAX_STATUE_PHASE) + instance->SummonGameObject(GO_IDOL_OF_HAKKAR, -480.08f, 94.29f, -189.72f, 1.571f, 0.0f, 0.0f, 0.0f, 0.0f, 0); + break; + } + } + + std::string GetSaveData() + { + std::ostringstream saveStream; + saveStream << "T A " << _encounters[0] << ' ' << _encounters[1] << ' ' << _encounters[2] << ' ' << _statuePhase << ' ' << _defendersKilled; + return saveStream.str(); + } + + void Load(const char* in) + { + if (!in) + return; + + char dataHead1, dataHead2; + std::istringstream loadStream(in); + loadStream >> dataHead1 >> dataHead2; + if (dataHead1 == 'T' && dataHead2 == 'A') + { + for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) + { + loadStream >> _encounters[i]; + if (_encounters[i] == IN_PROGRESS) + _encounters[i] = NOT_STARTED; + } + + loadStream >> _statuePhase; + loadStream >> _defendersKilled; + } + } + + private: + uint32 _statuePhase; + uint32 _defendersKilled; + uint32 _encounters[MAX_ENCOUNTERS]; + + uint64 _forcefieldGUID; + uint64 _jammalanGUID; + std::list _dragonkinList; + EventMap _events; + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_sunken_temple_InstanceMapScript(map); + } }; enum MalfurionMisc @@ -200,84 +200,84 @@ enum MalfurionMisc class at_malfurion_stormrage : public AreaTriggerScript { - public: - at_malfurion_stormrage() : AreaTriggerScript("at_malfurion_stormrage") { } +public: + at_malfurion_stormrage() : AreaTriggerScript("at_malfurion_stormrage") { } - bool OnTrigger(Player* player, const AreaTrigger* /*at*/) - { - if (player->GetInstanceScript() && !player->FindNearestCreature(NPC_MALFURION_STORMRAGE, 15.0f) && + bool OnTrigger(Player* player, const AreaTrigger* /*at*/) + { + if (player->GetInstanceScript() && !player->FindNearestCreature(NPC_MALFURION_STORMRAGE, 15.0f) && player->GetQuestStatus(QUEST_THE_CHARGE_OF_DRAGONFLIGHTS) == QUEST_STATUS_REWARDED && player->GetQuestStatus(QUEST_ERANIKUS_TYRANT_OF_DREAMS) != QUEST_STATUS_REWARDED) - player->SummonCreature(NPC_MALFURION_STORMRAGE, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), -1.52f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 100000); - return false; - } + player->SummonCreature(NPC_MALFURION_STORMRAGE, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), -1.52f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 100000); + return false; + } }; class spell_temple_of_atal_hakkar_hex_of_jammal_an : public SpellScriptLoader { - public: - spell_temple_of_atal_hakkar_hex_of_jammal_an() : SpellScriptLoader("spell_temple_of_atal_hakkar_hex_of_jammal_an") { } +public: + spell_temple_of_atal_hakkar_hex_of_jammal_an() : SpellScriptLoader("spell_temple_of_atal_hakkar_hex_of_jammal_an") { } - class spell_temple_of_atal_hakkar_hex_of_jammal_an_AuraScript : public AuraScript + class spell_temple_of_atal_hakkar_hex_of_jammal_an_AuraScript : public AuraScript + { + PrepareAuraScript(spell_temple_of_atal_hakkar_hex_of_jammal_an_AuraScript); + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_temple_of_atal_hakkar_hex_of_jammal_an_AuraScript); - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) - if (caster->IsAlive() && caster->IsInCombat()) - { - caster->CastSpell(GetTarget(), HEX_OF_JAMMAL_AN, true); - caster->CastSpell(GetTarget(), HEX_OF_JAMMAL_AN_CHARM, true); - } - } - - void Register() - { - OnEffectRemove += AuraEffectRemoveFn(spell_temple_of_atal_hakkar_hex_of_jammal_an_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_temple_of_atal_hakkar_hex_of_jammal_an_AuraScript(); + if (Unit* caster = GetCaster()) + if (caster->IsAlive() && caster->IsInCombat()) + { + caster->CastSpell(GetTarget(), HEX_OF_JAMMAL_AN, true); + caster->CastSpell(GetTarget(), HEX_OF_JAMMAL_AN_CHARM, true); + } } + + void Register() + { + OnEffectRemove += AuraEffectRemoveFn(spell_temple_of_atal_hakkar_hex_of_jammal_an_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_temple_of_atal_hakkar_hex_of_jammal_an_AuraScript(); + } }; class spell_temple_of_atal_hakkar_awaken_the_soulflayer : public SpellScriptLoader { - public: - spell_temple_of_atal_hakkar_awaken_the_soulflayer() : SpellScriptLoader("spell_temple_of_atal_hakkar_awaken_the_soulflayer") { } +public: + spell_temple_of_atal_hakkar_awaken_the_soulflayer() : SpellScriptLoader("spell_temple_of_atal_hakkar_awaken_the_soulflayer") { } - class spell_temple_of_atal_hakkar_awaken_the_soulflayer_SpellScript : public SpellScript + class spell_temple_of_atal_hakkar_awaken_the_soulflayer_SpellScript : public SpellScript + { + PrepareSpellScript(spell_temple_of_atal_hakkar_awaken_the_soulflayer_SpellScript); + + void HandleSendEvent(SpellEffIndex effIndex) { - PrepareSpellScript(spell_temple_of_atal_hakkar_awaken_the_soulflayer_SpellScript); + PreventHitDefaultEffect(effIndex); + InstanceScript* instanceScript = GetCaster()->GetInstanceScript(); + Map* map = GetCaster()->FindMap(); + if (!map || !instanceScript || instanceScript->GetData(TYPE_HAKKAR_EVENT) != NOT_STARTED) + return; - void HandleSendEvent(SpellEffIndex effIndex) + Position pos = {-466.795f, 272.863f, -90.447f, 1.57f}; + if (TempSummon* summon = map->SummonCreature(NPC_SHADE_OF_HAKKAR, pos)) { - PreventHitDefaultEffect(effIndex); - InstanceScript* instanceScript = GetCaster()->GetInstanceScript(); - Map* map = GetCaster()->FindMap(); - if (!map || !instanceScript || instanceScript->GetData(TYPE_HAKKAR_EVENT) != NOT_STARTED) - return; - - Position pos = {-466.795f, 272.863f, -90.447f, 1.57f}; - if (TempSummon* summon = map->SummonCreature(NPC_SHADE_OF_HAKKAR, pos)) - { - summon->SetTempSummonType(TEMPSUMMON_MANUAL_DESPAWN); - instanceScript->SetData(TYPE_HAKKAR_EVENT, IN_PROGRESS); - } + summon->SetTempSummonType(TEMPSUMMON_MANUAL_DESPAWN); + instanceScript->SetData(TYPE_HAKKAR_EVENT, IN_PROGRESS); } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_temple_of_atal_hakkar_awaken_the_soulflayer_SpellScript::HandleSendEvent, EFFECT_0, SPELL_EFFECT_SEND_EVENT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_temple_of_atal_hakkar_awaken_the_soulflayer_SpellScript(); } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_temple_of_atal_hakkar_awaken_the_soulflayer_SpellScript::HandleSendEvent, EFFECT_0, SPELL_EFFECT_SEND_EVENT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_temple_of_atal_hakkar_awaken_the_soulflayer_SpellScript(); + } }; void AddSC_instance_sunken_temple() diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp index 1ab94834f..472d08170 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp @@ -75,7 +75,7 @@ public: Talk(YELL_AGGRO); BossAI::EnterCombat(who); - + events.ScheduleEvent(EVENT_SPELL_SLASH, 11000); events.ScheduleEvent(EVENT_SPELL_STOMP, 30000); events.ScheduleEvent(EVENT_SPELL_BURN, 45000); @@ -321,7 +321,7 @@ public: if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS))) { brutallus->SetDisableGravity(true); - brutallus->GetMotionMaster()->MovePoint(0, brutallus->GetPositionX(), brutallus->GetPositionY()-30.0f, brutallus->GetPositionZ()+15.0f, false, true); + brutallus->GetMotionMaster()->MovePoint(0, brutallus->GetPositionX(), brutallus->GetPositionY() - 30.0f, brutallus->GetPositionZ() + 15.0f, false, true); } events.ScheduleEvent(EVENT_MAD_15, 10000); break; @@ -392,138 +392,138 @@ public: class spell_madrigosa_activate_barrier : public SpellScriptLoader { - public: - spell_madrigosa_activate_barrier() : SpellScriptLoader("spell_madrigosa_activate_barrier") { } +public: + spell_madrigosa_activate_barrier() : SpellScriptLoader("spell_madrigosa_activate_barrier") { } - class spell_madrigosa_activate_barrier_SpellScript : public SpellScript + class spell_madrigosa_activate_barrier_SpellScript : public SpellScript + { + PrepareSpellScript(spell_madrigosa_activate_barrier_SpellScript); + + void HandleActivateObject(SpellEffIndex effIndex) { - PrepareSpellScript(spell_madrigosa_activate_barrier_SpellScript); - - void HandleActivateObject(SpellEffIndex effIndex) + PreventHitDefaultEffect(effIndex); + if (GameObject* go = GetHitGObj()) { - PreventHitDefaultEffect(effIndex); - if (GameObject* go = GetHitGObj()) + go->SetGoState(GO_STATE_READY); + if (Map* map = go->GetMap()) { - go->SetGoState(GO_STATE_READY); - if (Map* map = go->GetMap()) - { - Map::PlayerList const &PlayerList = map->GetPlayers(); - for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) - if (i->GetSource()) - { - UpdateData data; - WorldPacket pkt; - go->BuildValuesUpdateBlockForPlayer(&data, i->GetSource()); - data.BuildPacket(&pkt); - i->GetSource()->GetSession()->SendPacket(&pkt); - } - } + Map::PlayerList const& PlayerList = map->GetPlayers(); + for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) + if (i->GetSource()) + { + UpdateData data; + WorldPacket pkt; + go->BuildValuesUpdateBlockForPlayer(&data, i->GetSource()); + data.BuildPacket(&pkt); + i->GetSource()->GetSession()->SendPacket(&pkt); + } } } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_madrigosa_activate_barrier_SpellScript::HandleActivateObject, EFFECT_0, SPELL_EFFECT_ACTIVATE_OBJECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_madrigosa_activate_barrier_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_madrigosa_activate_barrier_SpellScript::HandleActivateObject, EFFECT_0, SPELL_EFFECT_ACTIVATE_OBJECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_madrigosa_activate_barrier_SpellScript(); + } }; class spell_madrigosa_deactivate_barrier : public SpellScriptLoader { - public: - spell_madrigosa_deactivate_barrier() : SpellScriptLoader("spell_madrigosa_deactivate_barrier") { } +public: + spell_madrigosa_deactivate_barrier() : SpellScriptLoader("spell_madrigosa_deactivate_barrier") { } - class spell_madrigosa_deactivate_barrier_SpellScript : public SpellScript + class spell_madrigosa_deactivate_barrier_SpellScript : public SpellScript + { + PrepareSpellScript(spell_madrigosa_deactivate_barrier_SpellScript); + + void HandleActivateObject(SpellEffIndex effIndex) { - PrepareSpellScript(spell_madrigosa_deactivate_barrier_SpellScript); - - void HandleActivateObject(SpellEffIndex effIndex) + PreventHitDefaultEffect(effIndex); + if (GameObject* go = GetHitGObj()) { - PreventHitDefaultEffect(effIndex); - if (GameObject* go = GetHitGObj()) + go->SetGoState(GO_STATE_ACTIVE); + if (Map* map = go->GetMap()) { - go->SetGoState(GO_STATE_ACTIVE); - if (Map* map = go->GetMap()) - { - Map::PlayerList const &PlayerList = map->GetPlayers(); - for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) - if (i->GetSource()) - { - UpdateData data; - WorldPacket pkt; - go->BuildValuesUpdateBlockForPlayer(&data, i->GetSource()); - data.BuildPacket(&pkt); - i->GetSource()->GetSession()->SendPacket(&pkt); - } - } + Map::PlayerList const& PlayerList = map->GetPlayers(); + for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) + if (i->GetSource()) + { + UpdateData data; + WorldPacket pkt; + go->BuildValuesUpdateBlockForPlayer(&data, i->GetSource()); + data.BuildPacket(&pkt); + i->GetSource()->GetSession()->SendPacket(&pkt); + } } } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_madrigosa_deactivate_barrier_SpellScript::HandleActivateObject, EFFECT_0, SPELL_EFFECT_ACTIVATE_OBJECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_madrigosa_deactivate_barrier_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_madrigosa_deactivate_barrier_SpellScript::HandleActivateObject, EFFECT_0, SPELL_EFFECT_ACTIVATE_OBJECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_madrigosa_deactivate_barrier_SpellScript(); + } }; class spell_brutallus_burn : public SpellScriptLoader { - public: - spell_brutallus_burn() : SpellScriptLoader("spell_brutallus_burn") { } +public: + spell_brutallus_burn() : SpellScriptLoader("spell_brutallus_burn") { } - class spell_brutallus_burn_SpellScript : public SpellScript + class spell_brutallus_burn_SpellScript : public SpellScript + { + PrepareSpellScript(spell_brutallus_burn_SpellScript); + + void HandleScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_brutallus_burn_SpellScript); - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - if (!target->HasAura(SPELL_BURN_DAMAGE)) - target->CastSpell(target, SPELL_BURN_DAMAGE, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_brutallus_burn_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_brutallus_burn_SpellScript(); + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) + if (!target->HasAura(SPELL_BURN_DAMAGE)) + target->CastSpell(target, SPELL_BURN_DAMAGE, true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_brutallus_burn_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_brutallus_burn_SpellScript(); + } }; class AreaTrigger_at_sunwell_madrigosa : public AreaTriggerScript { - public: +public: - AreaTrigger_at_sunwell_madrigosa() : AreaTriggerScript("at_sunwell_madrigosa") {} + AreaTrigger_at_sunwell_madrigosa() : AreaTriggerScript("at_sunwell_madrigosa") {} - bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/) - { - if (InstanceScript* instance = player->GetInstanceScript()) - if (instance->GetBossState(DATA_MADRIGOSA) != DONE) - { - instance->SetBossState(DATA_MADRIGOSA, NOT_STARTED); - instance->SetBossState(DATA_MADRIGOSA, DONE); - if (Creature* creature = ObjectAccessor::GetCreature(*player, instance->GetData64(NPC_MADRIGOSA))) - creature->AI()->DoAction(ACTION_START_EVENT); - } + bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/) + { + if (InstanceScript* instance = player->GetInstanceScript()) + if (instance->GetBossState(DATA_MADRIGOSA) != DONE) + { + instance->SetBossState(DATA_MADRIGOSA, NOT_STARTED); + instance->SetBossState(DATA_MADRIGOSA, DONE); + if (Creature* creature = ObjectAccessor::GetCreature(*player, instance->GetData64(NPC_MADRIGOSA))) + creature->AI()->DoAction(ACTION_START_EVENT); + } - return true; - } + return true; + } }; void AddSC_boss_brutallus() diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp index 3ba50d2a3..f1fd8e332 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp @@ -56,7 +56,7 @@ enum Misc EVENT_SPELL_SHADOW_BLADES = 1, EVENT_SPELL_SHADOW_NOVA = 2, - EVENT_SPELL_CONFOUNDING_BLOW= 3, + EVENT_SPELL_CONFOUNDING_BLOW = 3, EVENT_SHADOW_IMAGE = 4, EVENT_SPELL_ENRAGE = 5, EVENT_SPELL_CONFLAGRATION = 6, @@ -94,7 +94,7 @@ public: uint32 timer = events.GetNextEventTime(EVENT_SPELL_SHADOW_NOVA); events.CancelEvent(EVENT_SPELL_SHADOW_NOVA); - events.ScheduleEvent(EVENT_SPELL_CONFLAGRATION, timer-events.GetTimer()); + events.ScheduleEvent(EVENT_SPELL_CONFLAGRATION, timer - events.GetTimer()); } } @@ -126,7 +126,7 @@ public: void KilledUnit(Unit* victim) { - if (victim->GetTypeId() == TYPEID_PLAYER && urand(0,1)) + if (victim->GetTypeId() == TYPEID_PLAYER && urand(0, 1)) Talk(YELL_SAC_KILL); } @@ -178,29 +178,29 @@ public: events.ScheduleEvent(EVENT_SPELL_SHADOW_BLADES, 10000); break; case EVENT_SPELL_SHADOW_NOVA: - { - Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1, 100.0f); - if (!target) - target = me->GetVictim(); - Talk(EMOTE_SHADOW_NOVA, target); - Talk(YELL_SHADOW_NOVA); - me->CastSpell(target, SPELL_SHADOW_NOVA, false); - events.ScheduleEvent(EVENT_SPELL_SHADOW_NOVA, urand(30000, 35000)); - break; - } + { + Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1, 100.0f); + if (!target) + target = me->GetVictim(); + Talk(EMOTE_SHADOW_NOVA, target); + Talk(YELL_SHADOW_NOVA); + me->CastSpell(target, SPELL_SHADOW_NOVA, false); + events.ScheduleEvent(EVENT_SPELL_SHADOW_NOVA, urand(30000, 35000)); + break; + } case EVENT_SHADOW_IMAGE: me->SummonCreature(NPC_SHADOW_IMAGE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN, 12000); events.ScheduleEvent(EVENT_SHADOW_IMAGE, 6000); break; case EVENT_SPELL_CONFLAGRATION: - { - Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1, 100.0f); - if (!target) - target = me->GetVictim(); - me->CastSpell(target, SPELL_CONFLAGRATION, false); - events.ScheduleEvent(EVENT_SPELL_CONFLAGRATION, urand(30000, 35000)); - break; - } + { + Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1, 100.0f); + if (!target) + target = me->GetVictim(); + me->CastSpell(target, SPELL_CONFLAGRATION, false); + events.ScheduleEvent(EVENT_SPELL_CONFLAGRATION, urand(30000, 35000)); + break; + } } DoMeleeAttackIfReady(); @@ -242,7 +242,7 @@ public: uint32 timer = events.GetNextEventTime(EVENT_SPELL_CONFLAGRATION); events.CancelEvent(EVENT_SPELL_CONFLAGRATION); - events.ScheduleEvent(EVENT_SPELL_SHADOW_NOVA, timer-events.GetTimer()); + events.ScheduleEvent(EVENT_SPELL_SHADOW_NOVA, timer - events.GetTimer()); } } @@ -274,7 +274,7 @@ public: void KilledUnit(Unit* victim) { - if (victim->GetTypeId() == TYPEID_PLAYER && urand(0,1)) + if (victim->GetTypeId() == TYPEID_PLAYER && urand(0, 1)) Talk(YELL_SAC_KILL); } @@ -320,25 +320,25 @@ public: events.ScheduleEvent(EVENT_SPELL_BLAZE, 3800); break; case EVENT_SPELL_SHADOW_NOVA: - { - Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1, 100.0f); - if (!target) - target = me->GetVictim(); - me->CastSpell(target, SPELL_SHADOW_NOVA, false); - events.ScheduleEvent(EVENT_SPELL_SHADOW_NOVA, urand(30000, 35000)); - break; - } + { + Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1, 100.0f); + if (!target) + target = me->GetVictim(); + me->CastSpell(target, SPELL_SHADOW_NOVA, false); + events.ScheduleEvent(EVENT_SPELL_SHADOW_NOVA, urand(30000, 35000)); + break; + } case EVENT_SPELL_CONFLAGRATION: - { - Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1, 100.0f); - if (!target) - target = me->GetVictim(); - Talk(EMOTE_CONFLAGRATION, target); - Talk(YELL_CANFLAGRATION); - me->CastSpell(target, SPELL_CONFLAGRATION, false); - events.ScheduleEvent(EVENT_SPELL_CONFLAGRATION, urand(30000, 35000)); - break; - } + { + Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1, 100.0f); + if (!target) + target = me->GetVictim(); + Talk(EMOTE_CONFLAGRATION, target); + Talk(YELL_CANFLAGRATION); + me->CastSpell(target, SPELL_CONFLAGRATION, false); + events.ScheduleEvent(EVENT_SPELL_CONFLAGRATION, urand(30000, 35000)); + break; + } } DoMeleeAttackIfReady(); @@ -353,153 +353,153 @@ public: class spell_eredar_twins_apply_dark_touched : public SpellScriptLoader { - public: - spell_eredar_twins_apply_dark_touched() : SpellScriptLoader("spell_eredar_twins_apply_dark_touched") { } +public: + spell_eredar_twins_apply_dark_touched() : SpellScriptLoader("spell_eredar_twins_apply_dark_touched") { } - class spell_eredar_twins_apply_dark_touched_SpellScript : public SpellScript + class spell_eredar_twins_apply_dark_touched_SpellScript : public SpellScript + { + PrepareSpellScript(spell_eredar_twins_apply_dark_touched_SpellScript); + + void HandleApplyTouch() { - PrepareSpellScript(spell_eredar_twins_apply_dark_touched_SpellScript); - - void HandleApplyTouch() - { - if (Player* target = GetHitPlayer()) - target->CastSpell(target, SPELL_DARK_TOUCHED, true); - } - - void Register() - { - AfterHit += SpellHitFn(spell_eredar_twins_apply_dark_touched_SpellScript::HandleApplyTouch); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_eredar_twins_apply_dark_touched_SpellScript(); + if (Player* target = GetHitPlayer()) + target->CastSpell(target, SPELL_DARK_TOUCHED, true); } + + void Register() + { + AfterHit += SpellHitFn(spell_eredar_twins_apply_dark_touched_SpellScript::HandleApplyTouch); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_eredar_twins_apply_dark_touched_SpellScript(); + } }; class spell_eredar_twins_apply_flame_touched : public SpellScriptLoader { - public: - spell_eredar_twins_apply_flame_touched() : SpellScriptLoader("spell_eredar_twins_apply_flame_touched") { } +public: + spell_eredar_twins_apply_flame_touched() : SpellScriptLoader("spell_eredar_twins_apply_flame_touched") { } - class spell_eredar_twins_apply_flame_touched_SpellScript : public SpellScript + class spell_eredar_twins_apply_flame_touched_SpellScript : public SpellScript + { + PrepareSpellScript(spell_eredar_twins_apply_flame_touched_SpellScript); + + void HandleApplyTouch() { - PrepareSpellScript(spell_eredar_twins_apply_flame_touched_SpellScript); - - void HandleApplyTouch() - { - if (Player* target = GetHitPlayer()) - target->CastSpell(target, SPELL_FLAME_TOUCHED, true); - } - - void Register() - { - AfterHit += SpellHitFn(spell_eredar_twins_apply_flame_touched_SpellScript::HandleApplyTouch); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_eredar_twins_apply_flame_touched_SpellScript(); + if (Player* target = GetHitPlayer()) + target->CastSpell(target, SPELL_FLAME_TOUCHED, true); } + + void Register() + { + AfterHit += SpellHitFn(spell_eredar_twins_apply_flame_touched_SpellScript::HandleApplyTouch); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_eredar_twins_apply_flame_touched_SpellScript(); + } }; class spell_eredar_twins_handle_touch : public SpellScriptLoader { - public: - spell_eredar_twins_handle_touch() : SpellScriptLoader("spell_eredar_twins_handle_touch") { } +public: + spell_eredar_twins_handle_touch() : SpellScriptLoader("spell_eredar_twins_handle_touch") { } - class spell_eredar_twins_handle_touch_SpellScript : public SpellScript + class spell_eredar_twins_handle_touch_SpellScript : public SpellScript + { + PrepareSpellScript(spell_eredar_twins_handle_touch_SpellScript); + + SpellCastResult CheckCast() { - PrepareSpellScript(spell_eredar_twins_handle_touch_SpellScript); + if (GetCaster()->HasAura(SPELL_DARK_FLAME)) + return SPELL_FAILED_DONT_REPORT; - SpellCastResult CheckCast() + if (GetSpellInfo()->Id == SPELL_DARK_TOUCHED) { - if (GetCaster()->HasAura(SPELL_DARK_FLAME)) + if (GetCaster()->HasAura(SPELL_FLAME_TOUCHED)) + { + GetCaster()->RemoveAurasDueToSpell(SPELL_FLAME_TOUCHED); + GetCaster()->CastSpell(GetCaster(), SPELL_DARK_FLAME, true); return SPELL_FAILED_DONT_REPORT; - - if (GetSpellInfo()->Id == SPELL_DARK_TOUCHED) - { - if (GetCaster()->HasAura(SPELL_FLAME_TOUCHED)) - { - GetCaster()->RemoveAurasDueToSpell(SPELL_FLAME_TOUCHED); - GetCaster()->CastSpell(GetCaster(), SPELL_DARK_FLAME, true); - return SPELL_FAILED_DONT_REPORT; - } } - else // if (m_spellInfo->Id == SPELL_FLAME_TOUCHED) - { - if (GetCaster()->HasAura(SPELL_DARK_TOUCHED)) - { - GetCaster()->RemoveAurasDueToSpell(SPELL_DARK_TOUCHED); - GetCaster()->CastSpell(GetCaster(), SPELL_DARK_FLAME, true); - return SPELL_FAILED_DONT_REPORT; - } - } - return SPELL_CAST_OK; } - - void Register() + else // if (m_spellInfo->Id == SPELL_FLAME_TOUCHED) { - OnCheckCast += SpellCheckCastFn(spell_eredar_twins_handle_touch_SpellScript::CheckCast); + if (GetCaster()->HasAura(SPELL_DARK_TOUCHED)) + { + GetCaster()->RemoveAurasDueToSpell(SPELL_DARK_TOUCHED); + GetCaster()->CastSpell(GetCaster(), SPELL_DARK_FLAME, true); + return SPELL_FAILED_DONT_REPORT; + } } - }; - - SpellScript* GetSpellScript() const - { - return new spell_eredar_twins_handle_touch_SpellScript(); + return SPELL_CAST_OK; } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_eredar_twins_handle_touch_SpellScript::CheckCast); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_eredar_twins_handle_touch_SpellScript(); + } }; class spell_eredar_twins_blaze : public SpellScriptLoader { - public: - spell_eredar_twins_blaze() : SpellScriptLoader("spell_eredar_twins_blaze") { } +public: + spell_eredar_twins_blaze() : SpellScriptLoader("spell_eredar_twins_blaze") { } - class spell_eredar_twins_blaze_SpellScript : public SpellScript + class spell_eredar_twins_blaze_SpellScript : public SpellScript + { + PrepareSpellScript(spell_eredar_twins_blaze_SpellScript); + + void HandleScript(SpellEffIndex effIndex) { - PrepareSpellScript(spell_eredar_twins_blaze_SpellScript); - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - target->CastSpell(target, SPELL_BLAZE_SUMMON, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_eredar_twins_blaze_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_eredar_twins_blaze_SpellScript(); + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) + target->CastSpell(target, SPELL_BLAZE_SUMMON, true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_eredar_twins_blaze_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_eredar_twins_blaze_SpellScript(); + } }; class AreaTrigger_at_sunwell_eredar_twins : public AreaTriggerScript { - public: +public: - AreaTrigger_at_sunwell_eredar_twins() : AreaTriggerScript("at_sunwell_eredar_twins") {} + AreaTrigger_at_sunwell_eredar_twins() : AreaTriggerScript("at_sunwell_eredar_twins") {} - bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/) - { - if (InstanceScript* instance = player->GetInstanceScript()) - if (instance->GetBossState(DATA_EREDAR_TWINS_INTRO) != DONE) - { - instance->SetBossState(DATA_EREDAR_TWINS_INTRO, DONE); - if (Creature* creature = ObjectAccessor::GetCreature(*player, instance->GetData64(NPC_LADY_SACROLASH))) - creature->AI()->Talk(YELL_INTRO_SAC); - if (Creature* creature = ObjectAccessor::GetCreature(*player, instance->GetData64(NPC_GRAND_WARLOCK_ALYTHESS))) - creature->AI()->Talk(YELL_INTRO_ALY); - } + bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/) + { + if (InstanceScript* instance = player->GetInstanceScript()) + if (instance->GetBossState(DATA_EREDAR_TWINS_INTRO) != DONE) + { + instance->SetBossState(DATA_EREDAR_TWINS_INTRO, DONE); + if (Creature* creature = ObjectAccessor::GetCreature(*player, instance->GetData64(NPC_LADY_SACROLASH))) + creature->AI()->Talk(YELL_INTRO_SAC); + if (Creature* creature = ObjectAccessor::GetCreature(*player, instance->GetData64(NPC_GRAND_WARLOCK_ALYTHESS))) + creature->AI()->Talk(YELL_INTRO_ALY); + } - return true; - } + return true; + } }; void AddSC_boss_eredar_twins() diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp index e47714e43..40b508c4f 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp @@ -92,23 +92,23 @@ enum Misc class CorruptTriggers : public BasicEvent { - public: - CorruptTriggers(Unit* caster) : _caster(caster) - { - } +public: + CorruptTriggers(Unit* caster) : _caster(caster) + { + } - bool Execute(uint64 /*execTime*/, uint32 /*diff*/) - { - std::list cList; - _caster->GetCreaturesWithEntryInRange(cList, 70.0f, NPC_FOG_TRIGGER); - for (std::list::const_iterator itr = cList.begin(); itr != cList.end(); ++itr) - if (_caster->GetExactDist2d(*itr) <= 11.0f) - (*itr)->CastSpell(*itr, SPELL_FOG_OF_CORRUPTION, true); - return true; - } + bool Execute(uint64 /*execTime*/, uint32 /*diff*/) + { + std::list cList; + _caster->GetCreaturesWithEntryInRange(cList, 70.0f, NPC_FOG_TRIGGER); + for (std::list::const_iterator itr = cList.begin(); itr != cList.end(); ++itr) + if (_caster->GetExactDist2d(*itr) <= 11.0f) + (*itr)->CastSpell(*itr, SPELL_FOG_OF_CORRUPTION, true); + return true; + } - private: - Unit* _caster; +private: + Unit* _caster; }; class boss_felmyst : public CreatureScript @@ -244,7 +244,7 @@ public: events2.ScheduleEvent(EVENT_INTRO_3, 1500); break; case EVENT_INTRO_3: - me->GetMotionMaster()->MovePoint(POINT_AIR, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+10.0f, false, true); + me->GetMotionMaster()->MovePoint(POINT_AIR, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 10.0f, false, true); events2.ScheduleEvent(EVENT_INTRO_4, 2000); break; case EVENT_INTRO_4: @@ -322,23 +322,23 @@ public: events.ScheduleEvent(EVENT_LAND_FIGHT, 86000); break; case EVENT_FLIGHT_MOVE_UP: - me->GetMotionMaster()->MovePoint(POINT_AIR, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+15.0f, false, true); + me->GetMotionMaster()->MovePoint(POINT_AIR, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 15.0f, false, true); break; case EVENT_FLIGHT_VAPOR: me->CastSpell(me, SPELL_SUMMON_DEMONIC_VAPOR, true); break; case EVENT_FLIGHT_BREATH1: - { - Position pos = {1447.0f + urand(0, 2)*25.0f, 705.0f, 50.0f, 4.71f}; - me->GetMotionMaster()->MovePoint(POINT_AIR_BREATH_START1, pos, false, true); - break; - } + { + Position pos = {1447.0f + urand(0, 2) * 25.0f, 705.0f, 50.0f, 4.71f}; + me->GetMotionMaster()->MovePoint(POINT_AIR_BREATH_START1, pos, false, true); + break; + } case EVENT_FLIGHT_BREATH2: - { - Position pos = {1447.0f + urand(0, 2)*25.0f, 515.0f, 50.0f, 1.57f}; - me->GetMotionMaster()->MovePoint(POINT_AIR_BREATH_START2, pos, false, true); - break; - } + { + Position pos = {1447.0f + urand(0, 2) * 25.0f, 515.0f, 50.0f, 1.57f}; + me->GetMotionMaster()->MovePoint(POINT_AIR_BREATH_START2, pos, false, true); + break; + } case EVENT_FLIGHT_EMOTE: Talk(EMOTE_BREATH); break; @@ -356,11 +356,11 @@ public: break; case EVENT_FLIGHT_FLYOVER1: me->CastSpell(me, SPELL_FELMYST_SPEED_BURST, true); - me->GetMotionMaster()->MovePoint(POINT_AIR_BREATH_END1, me->GetPositionX(), me->GetPositionY()-200.0f, me->GetPositionZ()+5.0f, false, true); + me->GetMotionMaster()->MovePoint(POINT_AIR_BREATH_END1, me->GetPositionX(), me->GetPositionY() - 200.0f, me->GetPositionZ() + 5.0f, false, true); break; case EVENT_FLIGHT_FLYOVER2: me->CastSpell(me, SPELL_FELMYST_SPEED_BURST, true); - me->GetMotionMaster()->MovePoint(POINT_AIR_BREATH_END2, me->GetPositionX(), me->GetPositionY()+200.0f, me->GetPositionZ()+5.0f, false, true); + me->GetMotionMaster()->MovePoint(POINT_AIR_BREATH_END2, me->GetPositionX(), me->GetPositionY() + 200.0f, me->GetPositionZ() + 5.0f, false, true); break; case EVENT_LAND_FIGHT: me->GetMotionMaster()->MovePoint(POINT_GROUND, 1500.0f, 552.8f, 26.52f, false, true); @@ -438,7 +438,7 @@ public: me->CastSpell(me, SPELL_DEMONIC_VAPOR_TRAIL_PERIODIC, true); } - void SpellHitTarget(Unit* , const SpellInfo* spellInfo) + void SpellHitTarget(Unit*, const SpellInfo* spellInfo) { if (spellInfo->Id == SPELL_DEMONIC_VAPOR) me->CastSpell(me, SPELL_SUMMON_BLAZING_DEAD, true); @@ -467,103 +467,103 @@ public: class spell_felmyst_fog_of_corruption : public SpellScriptLoader { - public: - spell_felmyst_fog_of_corruption() : SpellScriptLoader("spell_felmyst_fog_of_corruption") { } +public: + spell_felmyst_fog_of_corruption() : SpellScriptLoader("spell_felmyst_fog_of_corruption") { } - class spell_felmyst_fog_of_corruption_SpellScript : public SpellScript + class spell_felmyst_fog_of_corruption_SpellScript : public SpellScript + { + PrepareSpellScript(spell_felmyst_fog_of_corruption_SpellScript); + + void HandleScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_felmyst_fog_of_corruption_SpellScript); - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - target->CastSpell(GetCaster(), SPELL_FOG_OF_CORRUPTION_CHARM, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_felmyst_fog_of_corruption_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_felmyst_fog_of_corruption_SpellScript(); + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) + target->CastSpell(GetCaster(), SPELL_FOG_OF_CORRUPTION_CHARM, true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_felmyst_fog_of_corruption_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_felmyst_fog_of_corruption_SpellScript(); + } }; class spell_felmyst_fog_of_corruption_charm : public SpellScriptLoader { - public: - spell_felmyst_fog_of_corruption_charm() : SpellScriptLoader("spell_felmyst_fog_of_corruption_charm") { } +public: + spell_felmyst_fog_of_corruption_charm() : SpellScriptLoader("spell_felmyst_fog_of_corruption_charm") { } - class spell_felmyst_fog_of_corruption_charm_AuraScript : public AuraScript + class spell_felmyst_fog_of_corruption_charm_AuraScript : public AuraScript + { + PrepareAuraScript(spell_felmyst_fog_of_corruption_charm_AuraScript); + + void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_felmyst_fog_of_corruption_charm_AuraScript); - - void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetTarget()->CastSpell(GetTarget(), SPELL_FOG_OF_CORRUPTION_CHARM2, true); - } - - void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetTarget()->RemoveAurasDueToSpell(SPELL_FOG_OF_CORRUPTION_CHARM); - GetTarget()->RemoveAurasDueToSpell(SPELL_FOG_OF_CORRUPTION_CHARM2); - Unit::Kill(GetCaster(), GetTarget(), false); - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_felmyst_fog_of_corruption_charm_AuraScript::HandleApply, EFFECT_0, SPELL_AURA_AOE_CHARM, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_felmyst_fog_of_corruption_charm_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_AOE_CHARM, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_felmyst_fog_of_corruption_charm_AuraScript(); + GetTarget()->CastSpell(GetTarget(), SPELL_FOG_OF_CORRUPTION_CHARM2, true); } + + void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->RemoveAurasDueToSpell(SPELL_FOG_OF_CORRUPTION_CHARM); + GetTarget()->RemoveAurasDueToSpell(SPELL_FOG_OF_CORRUPTION_CHARM2); + Unit::Kill(GetCaster(), GetTarget(), false); + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_felmyst_fog_of_corruption_charm_AuraScript::HandleApply, EFFECT_0, SPELL_AURA_AOE_CHARM, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_felmyst_fog_of_corruption_charm_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_AOE_CHARM, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_felmyst_fog_of_corruption_charm_AuraScript(); + } }; class DoorsGuidCheck { - public: - bool operator()(WorldObject* object) const - { - if (object->GetTypeId() != TYPEID_UNIT) - return true; +public: + bool operator()(WorldObject* object) const + { + if (object->GetTypeId() != TYPEID_UNIT) + return true; - Creature* cr = object->ToCreature(); - return cr->GetDBTableGUIDLow() != 54780 && cr->GetDBTableGUIDLow() != 54787 && cr->GetDBTableGUIDLow() != 54801; - } + Creature* cr = object->ToCreature(); + return cr->GetDBTableGUIDLow() != 54780 && cr->GetDBTableGUIDLow() != 54787 && cr->GetDBTableGUIDLow() != 54801; + } }; class spell_felmyst_open_brutallus_back_doors : public SpellScriptLoader { - public: - spell_felmyst_open_brutallus_back_doors() : SpellScriptLoader("spell_felmyst_open_brutallus_back_doors") { } +public: + spell_felmyst_open_brutallus_back_doors() : SpellScriptLoader("spell_felmyst_open_brutallus_back_doors") { } - class spell_felmyst_open_brutallus_back_doors_SpellScript : public SpellScript + class spell_felmyst_open_brutallus_back_doors_SpellScript : public SpellScript + { + PrepareSpellScript(spell_felmyst_open_brutallus_back_doors_SpellScript); + + void FilterTargets(std::list& unitList) { - PrepareSpellScript(spell_felmyst_open_brutallus_back_doors_SpellScript); - - void FilterTargets(std::list& unitList) - { - unitList.remove_if(DoorsGuidCheck()); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_felmyst_open_brutallus_back_doors_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_felmyst_open_brutallus_back_doors_SpellScript(); + unitList.remove_if(DoorsGuidCheck()); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_felmyst_open_brutallus_back_doors_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_felmyst_open_brutallus_back_doors_SpellScript(); + } }; void AddSC_boss_felmyst() diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp index dabdec392..3664515b0 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp @@ -604,15 +604,15 @@ public: class SpectralBlastCheck { - public: - SpectralBlastCheck(Unit* victim) : _victim(victim) { } +public: + SpectralBlastCheck(Unit* victim) : _victim(victim) { } - bool operator()(WorldObject* unit) - { - return unit->GetPositionZ() < 50.0f || unit->ToUnit()->HasAura(SPELL_SPECTRAL_EXHAUSTION) || unit->GetGUID() == _victim->GetGUID(); - } - private: - Unit* _victim; + bool operator()(WorldObject* unit) + { + return unit->GetPositionZ() < 50.0f || unit->ToUnit()->HasAura(SPELL_SPECTRAL_EXHAUSTION) || unit->GetGUID() == _victim->GetGUID(); + } +private: + Unit* _victim; }; class spell_kalecgos_spectral_blast_dummy : public SpellScriptLoader @@ -628,8 +628,8 @@ public: { targets.remove_if(SpectralBlastCheck(GetCaster()->GetVictim())); acore::Containers::RandomResizeList(targets, 1); - } - + } + void HandleDummy(SpellEffIndex effIndex) { PreventHitDefaultEffect(effIndex); @@ -656,100 +656,100 @@ public: class spell_kalecgos_curse_of_boundless_agony : public SpellScriptLoader { - public: - spell_kalecgos_curse_of_boundless_agony() : SpellScriptLoader("spell_kalecgos_curse_of_boundless_agony") { } +public: + spell_kalecgos_curse_of_boundless_agony() : SpellScriptLoader("spell_kalecgos_curse_of_boundless_agony") { } - class spell_kalecgos_curse_of_boundless_agony_AuraScript : public AuraScript + class spell_kalecgos_curse_of_boundless_agony_AuraScript : public AuraScript + { + PrepareAuraScript(spell_kalecgos_curse_of_boundless_agony_AuraScript); + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_kalecgos_curse_of_boundless_agony_AuraScript); - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (InstanceScript* instance = GetUnitOwner()->GetInstanceScript()) - if (instance->IsEncounterInProgress()) - GetUnitOwner()->CastCustomSpell(SPELL_CURSE_OF_BOUNDLESS_AGONY_PLR, SPELLVALUE_MAX_TARGETS, 1, GetUnitOwner(), true); - } - - void OnPeriodic(AuraEffect const* aurEff) - { - if (aurEff->GetTickNumber() > 1 && aurEff->GetTickNumber()%5 == 1) - GetAura()->GetEffect(aurEff->GetEffIndex())->SetAmount(aurEff->GetAmount()*2); - } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_kalecgos_curse_of_boundless_agony_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_kalecgos_curse_of_boundless_agony_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_kalecgos_curse_of_boundless_agony_AuraScript(); + if (InstanceScript* instance = GetUnitOwner()->GetInstanceScript()) + if (instance->IsEncounterInProgress()) + GetUnitOwner()->CastCustomSpell(SPELL_CURSE_OF_BOUNDLESS_AGONY_PLR, SPELLVALUE_MAX_TARGETS, 1, GetUnitOwner(), true); } + + void OnPeriodic(AuraEffect const* aurEff) + { + if (aurEff->GetTickNumber() > 1 && aurEff->GetTickNumber() % 5 == 1) + GetAura()->GetEffect(aurEff->GetEffIndex())->SetAmount(aurEff->GetAmount() * 2); + } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_kalecgos_curse_of_boundless_agony_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_kalecgos_curse_of_boundless_agony_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_kalecgos_curse_of_boundless_agony_AuraScript(); + } }; class spell_kalecgos_spectral_realm_dummy : public SpellScriptLoader { - public: - spell_kalecgos_spectral_realm_dummy() : SpellScriptLoader("spell_kalecgos_spectral_realm_dummy") { } +public: + spell_kalecgos_spectral_realm_dummy() : SpellScriptLoader("spell_kalecgos_spectral_realm_dummy") { } - class spell_kalecgos_spectral_realm_dummy_SpellScript : public SpellScript + class spell_kalecgos_spectral_realm_dummy_SpellScript : public SpellScript + { + PrepareSpellScript(spell_kalecgos_spectral_realm_dummy_SpellScript); + + SpellCastResult CheckCast() { - PrepareSpellScript(spell_kalecgos_spectral_realm_dummy_SpellScript); + if (GetCaster()->HasAura(SPELL_SPECTRAL_EXHAUSTION)) + return SPELL_FAILED_CASTER_AURASTATE; - SpellCastResult CheckCast() - { - if (GetCaster()->HasAura(SPELL_SPECTRAL_EXHAUSTION)) - return SPELL_FAILED_CASTER_AURASTATE; - - return SPELL_CAST_OK; - } - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetCaster()->CastSpell(GetCaster(), SPELL_TELEPORT_SPECTRAL, true); - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_kalecgos_spectral_realm_dummy_SpellScript::CheckCast); - OnEffectHitTarget += SpellEffectFn(spell_kalecgos_spectral_realm_dummy_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_kalecgos_spectral_realm_dummy_SpellScript(); + return SPELL_CAST_OK; } + + void HandleScriptEffect(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + GetCaster()->CastSpell(GetCaster(), SPELL_TELEPORT_SPECTRAL, true); + } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_kalecgos_spectral_realm_dummy_SpellScript::CheckCast); + OnEffectHitTarget += SpellEffectFn(spell_kalecgos_spectral_realm_dummy_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_kalecgos_spectral_realm_dummy_SpellScript(); + } }; class spell_kalecgos_spectral_realm : public SpellScriptLoader { - public: - spell_kalecgos_spectral_realm() : SpellScriptLoader("spell_kalecgos_spectral_realm") { } +public: + spell_kalecgos_spectral_realm() : SpellScriptLoader("spell_kalecgos_spectral_realm") { } - class spell_kalecgos_spectral_realm_AuraScript : public AuraScript + class spell_kalecgos_spectral_realm_AuraScript : public AuraScript + { + PrepareAuraScript(spell_kalecgos_spectral_realm_AuraScript); + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_kalecgos_spectral_realm_AuraScript); - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SPECTRAL_EXHAUSTION, true); - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_TELEPORT_NORMAL_REALM, true); - } - - void Register() - { - OnEffectRemove += AuraEffectRemoveFn(spell_kalecgos_spectral_realm_AuraScript::OnRemove, EFFECT_1, SPELL_AURA_MOD_INVISIBILITY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_kalecgos_spectral_realm_AuraScript(); + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SPECTRAL_EXHAUSTION, true); + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_TELEPORT_NORMAL_REALM, true); } + + void Register() + { + OnEffectRemove += AuraEffectRemoveFn(spell_kalecgos_spectral_realm_AuraScript::OnRemove, EFFECT_1, SPELL_AURA_MOD_INVISIBILITY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_kalecgos_spectral_realm_AuraScript(); + } }; void AddSC_boss_kalecgos() diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp index a5ba5056e..ca226ae8e 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp @@ -130,20 +130,20 @@ enum Misc class CastArmageddon : public BasicEvent { - public: - CastArmageddon(Creature* caster) : _caster(caster) - { - } +public: + CastArmageddon(Creature* caster) : _caster(caster) + { + } - bool Execute(uint64 /*execTime*/, uint32 /*diff*/) - { - _caster->CastSpell(_caster, SPELL_ARMAGEDDON_MISSILE, true); - _caster->SetPosition(_caster->GetPositionX(), _caster->GetPositionY(), _caster->GetPositionZ()-20.0f, 0.0f); - return true; - } + bool Execute(uint64 /*execTime*/, uint32 /*diff*/) + { + _caster->CastSpell(_caster, SPELL_ARMAGEDDON_MISSILE, true); + _caster->SetPosition(_caster->GetPositionX(), _caster->GetPositionY(), _caster->GetPositionZ() - 20.0f, 0.0f); + return true; + } - private: - Creature* _caster; +private: + Creature* _caster; }; class npc_kiljaeden_controller : public CreatureScript @@ -170,7 +170,7 @@ public: void ResetOrbs() { for (uint8 i = 0; i < 4; ++i) - if (GameObject* orb = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_1+i))) + if (GameObject* orb = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_1 + i))) orb->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); } @@ -184,7 +184,7 @@ public: me->SummonCreature(NPC_HAND_OF_THE_DECEIVER, 1702.62f, 611.19f, 27.66f, 1.81f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); me->SummonCreature(NPC_HAND_OF_THE_DECEIVER, 1684.099f, 618.848f, 27.67f, 0.589f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); me->SummonCreature(NPC_HAND_OF_THE_DECEIVER, 1688.38f, 641.10f, 27.50f, 5.43f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); - me->SummonCreature(NPC_ANVEENA, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+40.0f, 0.0f); + me->SummonCreature(NPC_ANVEENA, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 40.0f, 0.0f); me->CastSpell(me, SPELL_DESTROY_ALL_DRAKES, true); me->CastSpell(me, SPELL_ANVEENA_ENERGY_DRAIN, true); @@ -224,7 +224,7 @@ public: if (!summons.HasEntry(NPC_HAND_OF_THE_DECEIVER)) { me->RemoveAurasDueToSpell(SPELL_ANVEENA_ENERGY_DRAIN); - me->SummonCreature(NPC_KILJAEDEN, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+1.5f, 4.3f, TEMPSUMMON_MANUAL_DESPAWN); + me->SummonCreature(NPC_KILJAEDEN, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 1.5f, 4.3f, TEMPSUMMON_MANUAL_DESPAWN); me->SummonCreature(NPC_KALECGOS_KJ, 1726.80f, 661.43f, 138.65f, 3.95f, TEMPSUMMON_MANUAL_DESPAWN); } } @@ -241,19 +241,19 @@ public: events.ScheduleEvent(EVENT_RANDOM_TALK, urand(90000, 180000)); break; case EVENT_CHECK_PLAYERS: - { - Map::PlayerList const& players = me->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) - if (Player* player = itr->GetSource()) - if (!player->IsGameMaster() && me->GetDistance2d(player) < 60.0f && player->IsAlive()) - { - events.ScheduleEvent(EVENT_CHECK_PLAYERS, 1000); - return; - } + { + Map::PlayerList const& players = me->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + if (Player* player = itr->GetSource()) + if (!player->IsGameMaster() && me->GetDistance2d(player) < 60.0f && player->IsAlive()) + { + events.ScheduleEvent(EVENT_CHECK_PLAYERS, 1000); + return; + } - CreatureAI::EnterEvadeMode(); - break; - } + CreatureAI::EnterEvadeMode(); + break; + } } } }; @@ -373,7 +373,7 @@ public: summon->SetDisableGravity(true); summon->SetCanFly(true); summon->CastSpell(summon, SPELL_ARMAGEDDON_VISUAL, true); - summon->SetPosition(summon->GetPositionX(), summon->GetPositionY(), summon->GetPositionZ()+20.0f, 0.0f); + summon->SetPosition(summon->GetPositionX(), summon->GetPositionY(), summon->GetPositionZ() + 20.0f, 0.0f); summon->m_Events.AddEvent(new CastArmageddon(summon), summon->m_Events.CalculateTime(6000)); summon->DespawnOrUnsummon(10000); } @@ -486,7 +486,7 @@ public: events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; - + switch (events.ExecuteEvent()) { case EVENT_CHECK_HEALTH85: @@ -498,7 +498,7 @@ public: events2.ScheduleEvent(EVENT_TEXT_SPEACH22, 22000, EVENT_GROUP_SPEACH); events2.ScheduleEvent(EVENT_TEXT_SPEACH23, 28000, EVENT_GROUP_SPEACH); events2.RescheduleEvent(EVENT_EMPOWER_ORBS1, 35000); - + events.DelayEvents(2000); events.ScheduleEvent(EVENT_SPELL_SINISTER_REFLECTION, 500); events.ScheduleEvent(EVENT_SPELL_SHADOW_SPIKE, 1200); @@ -508,7 +508,7 @@ public: } events.ScheduleEvent(EVENT_CHECK_HEALTH85, 0); break; - + case EVENT_CHECK_HEALTH55: if (me->HealthBelowPct(55)) { @@ -518,7 +518,7 @@ public: events2.ScheduleEvent(EVENT_TEXT_SPEACH32, 22000, EVENT_GROUP_SPEACH); events2.ScheduleEvent(EVENT_TEXT_SPEACH33, 28000, EVENT_GROUP_SPEACH); events2.RescheduleEvent(EVENT_EMPOWER_ORBS2, 35000); - + events.DelayEvents(2000); events.ScheduleEvent(EVENT_SPELL_SINISTER_REFLECTION, 500); events.ScheduleEvent(EVENT_SPELL_SHADOW_SPIKE, 1200); @@ -528,7 +528,7 @@ public: } events.ScheduleEvent(EVENT_CHECK_HEALTH55, 0); break; - + case EVENT_CHECK_HEALTH25: if (me->HealthBelowPct(25)) { @@ -571,8 +571,8 @@ public: case EVENT_SUMMON_ORBS: for (uint8 i = 1; i < phase; ++i) { - float x = me->GetPositionX() + 18.0f*cos((i*2.0f-1.0f)*M_PI/3.0f); - float y = me->GetPositionY() + 18.0f*sin((i*2.0f-1.0f)*M_PI/3.0f); + float x = me->GetPositionX() + 18.0f * cos((i * 2.0f - 1.0f) * M_PI / 3.0f); + float y = me->GetPositionY() + 18.0f * sin((i * 2.0f - 1.0f) * M_PI / 3.0f); if (Creature* orb = me->SummonCreature(NPC_SHIELD_ORB, x, y, 40.0f, 0, TEMPSUMMON_CORPSE_DESPAWN)) { Movement::PointsArray movementArray; @@ -581,11 +581,11 @@ public: // generate movement array for (uint8 j = 1; j < 20; ++j) { - x = me->GetPositionX() + 18.0f*cos(((i*2.0f-1.0f)*M_PI/3.0f) + (j/20.0f*2*M_PI)); - y = me->GetPositionY() + 18.0f*sin(((i*2.0f-1.0f)*M_PI/3.0f) + (j/20.0f*2*M_PI)); + x = me->GetPositionX() + 18.0f * cos(((i * 2.0f - 1.0f) * M_PI / 3.0f) + (j / 20.0f * 2 * M_PI)); + y = me->GetPositionY() + 18.0f * sin(((i * 2.0f - 1.0f) * M_PI / 3.0f) + (j / 20.0f * 2 * M_PI)); movementArray.push_back(G3D::Vector3(x, y, 40.0f)); } - + Movement::MoveSplineInit init(orb); init.MovebyPath(movementArray); init.SetCyclic(); @@ -629,12 +629,12 @@ public: { for (uint8 i = 0; i < 4; ++i) { - if (GameObject* orb = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_1+i))) + if (GameObject* orb = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_1 + i))) { if (orb->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE)) { orb->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - if (Creature* trigger = me->SummonTrigger(orb->GetPositionX(), orb->GetPositionY(), orb->GetPositionZ(), 0, 10*MINUTE*IN_MILLISECONDS)) + if (Creature* trigger = me->SummonTrigger(orb->GetPositionX(), orb->GetPositionY(), orb->GetPositionZ(), 0, 10 * MINUTE * IN_MILLISECONDS)) { trigger->CastSpell(trigger, SPELL_RING_OF_BLUE_FLAMES, true, nullptr, nullptr, trigger->GetGUID()); if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_KILJAEDEN_CONTROLLER))) @@ -717,43 +717,43 @@ enum postEvent class MoveDelayed : public BasicEvent { - public: - MoveDelayed(Creature* owner, float x, float y, float z, float o) : _owner(owner), _x(x), _y(y), _z(z), _o(o) - { - } +public: + MoveDelayed(Creature* owner, float x, float y, float z, float o) : _owner(owner), _x(x), _y(y), _z(z), _o(o) + { + } - bool Execute(uint64 /*execTime*/, uint32 /*diff*/) - { - Movement::MoveSplineInit init(_owner); - init.MoveTo(_x, _y, _z, false, true); - init.SetFacing(_o); - init.Launch(); - return true; - } + bool Execute(uint64 /*execTime*/, uint32 /*diff*/) + { + Movement::MoveSplineInit init(_owner); + init.MoveTo(_x, _y, _z, false, true); + init.SetFacing(_o); + init.Launch(); + return true; + } - private: - Creature* _owner; - float _x, _y, _z, _o; +private: + Creature* _owner; + float _x, _y, _z, _o; }; class FixOrientation : public BasicEvent { - public: - FixOrientation(Creature* owner) : _owner(owner) - { - } +public: + FixOrientation(Creature* owner) : _owner(owner) + { + } - bool Execute(uint64 /*execTime*/, uint32 /*diff*/) - { - std::list cList; - _owner->GetCreaturesWithEntryInRange(cList, 20.0f, NPC_SHATTERED_SUN_SOLDIER); - for (std::list::const_iterator itr = cList.begin(); itr != cList.end(); ++itr) - (*itr)->SetFacingTo(_owner->GetOrientation()); - return true; - } + bool Execute(uint64 /*execTime*/, uint32 /*diff*/) + { + std::list cList; + _owner->GetCreaturesWithEntryInRange(cList, 20.0f, NPC_SHATTERED_SUN_SOLDIER); + for (std::list::const_iterator itr = cList.begin(); itr != cList.end(); ++itr) + (*itr)->SetFacingTo(_owner->GetOrientation()); + return true; + } - private: - Creature* _owner; +private: + Creature* _owner; }; class npc_kalecgos_kj : public CreatureScript @@ -818,7 +818,7 @@ public: if (Creature* riftwaker = summon->FindNearestCreature(NPC_SHATTERED_SUN_RIFTWAKER, 10.0f)) riftwaker->CastSpell(summon, SPELL_OPEN_PORTAL_FROM_SHATTRATH, false); summon->SetWalk(true); - summon->GetMotionMaster()->MovePoint(0, summon->GetPositionX(), summon->GetPositionY(), summon->GetPositionZ()+30.0f, false, true); + summon->GetMotionMaster()->MovePoint(0, summon->GetPositionX(), summon->GetPositionY(), summon->GetPositionZ() + 30.0f, false, true); } else if (summon->GetEntry() == NPC_INERT_PORTAL) summon->CastSpell(summon, SPELL_BOSS_ARCANE_PORTAL_STATE, true); @@ -846,21 +846,21 @@ public: { case EVENT_SCENE_01: Talk(SAY_KALECGOS_GOODBYE); - events.ScheduleEvent(eventId+1, 15000); + events.ScheduleEvent(eventId + 1, 15000); break; case EVENT_SCENE_02: me->SummonCreature(NPC_SHATTERED_SUN_RIFTWAKER, 1688.42f, 641.82f, 27.60f, 0.67f); me->SummonCreature(NPC_SHATTERED_SUN_RIFTWAKER, 1712.58f, 616.29f, 27.78f, 0.76f); - events.ScheduleEvent(eventId+1, 6000); + events.ScheduleEvent(eventId + 1, 6000); break; case EVENT_SCENE_03: - me->SummonCreature(NPC_SHATTRATH_PORTAL_DUMMY, 1727.08f+cos(5.14f), 656.82f+sin(5.14f), 28.37f+2.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 10000); - me->SummonCreature(NPC_SHATTRATH_PORTAL_DUMMY, 1738.84f+cos(2.0f), 627.32f+sin(2.0f), 28.26f+2.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 10000); - events.ScheduleEvent(eventId+1, 11000); + me->SummonCreature(NPC_SHATTRATH_PORTAL_DUMMY, 1727.08f + cos(5.14f), 656.82f + sin(5.14f), 28.37f + 2.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 10000); + me->SummonCreature(NPC_SHATTRATH_PORTAL_DUMMY, 1738.84f + cos(2.0f), 627.32f + sin(2.0f), 28.26f + 2.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 10000); + events.ScheduleEvent(eventId + 1, 11000); break; case EVENT_SCENE_04: me->SummonCreature(NPC_INERT_PORTAL, 1734.96f, 642.43f, 28.06f, 3.49f); - events.ScheduleEvent(eventId+1, 4000); + events.ScheduleEvent(eventId + 1, 4000); break; case EVENT_SCENE_05: if (Creature* first = me->SummonCreature(NPC_SHATTERED_SUN_SOLDIER, 1729.48f, 640.49f, 28.06f, 3.49f)) @@ -868,10 +868,10 @@ public: first->m_Events.AddEvent(new MoveDelayed(first, 1718.70f, 607.78f, 28.06f, 2.323f), first->m_Events.CalculateTime(5000)); first->m_Events.AddEvent(new FixOrientation(first), first->m_Events.CalculateTime(12000)); for (uint8 i = 0; i < 9; ++i) - if (Creature* follower = me->SummonCreature(NPC_SHATTERED_SUN_SOLDIER, 1729.48f+5*cos(i*2.0f*M_PI/9), 640.49f+5*sin(i*2.0f*M_PI/9), 28.06f, 3.49f)) + if (Creature* follower = me->SummonCreature(NPC_SHATTERED_SUN_SOLDIER, 1729.48f + 5 * cos(i * 2.0f * M_PI / 9), 640.49f + 5 * sin(i * 2.0f * M_PI / 9), 28.06f, 3.49f)) follower->GetMotionMaster()->MoveFollow(first, 3.0f, follower->GetAngle(first)); } - events.ScheduleEvent(eventId+1, 10000); + events.ScheduleEvent(eventId + 1, 10000); break; case EVENT_SCENE_06: if (Creature* first = me->SummonCreature(NPC_SHATTERED_SUN_SOLDIER, 1729.48f, 640.49f, 28.06f, 3.49f)) @@ -879,36 +879,36 @@ public: first->m_Events.AddEvent(new MoveDelayed(first, 1678.69f, 649.27f, 28.06f, 5.46f), first->m_Events.CalculateTime(5000)); first->m_Events.AddEvent(new FixOrientation(first), first->m_Events.CalculateTime(14500)); for (uint8 i = 0; i < 9; ++i) - if (Creature* follower = me->SummonCreature(NPC_SHATTERED_SUN_SOLDIER, 1729.48f+5*cos(i*2.0f*M_PI/9), 640.49f+5*sin(i*2.0f*M_PI/9), 28.06f, 3.49f)) + if (Creature* follower = me->SummonCreature(NPC_SHATTERED_SUN_SOLDIER, 1729.48f + 5 * cos(i * 2.0f * M_PI / 9), 640.49f + 5 * sin(i * 2.0f * M_PI / 9), 28.06f, 3.49f)) follower->GetMotionMaster()->MoveFollow(first, 3.0f, follower->GetAngle(first)); } - events.ScheduleEvent(eventId+1, 12000); + events.ScheduleEvent(eventId + 1, 12000); break; case EVENT_SCENE_07: me->SummonCreature(NPC_LADY_LIADRIN, 1719.87f, 644.265f, 28.06f, 3.83f); me->SummonCreature(NPC_PROPHET_VELEN, 1717.97f, 646.44f, 28.06f, 3.94f); - events.ScheduleEvent(eventId+1, 7000); + events.ScheduleEvent(eventId + 1, 7000); break; case EVENT_SCENE_08: if (Creature* velen = summons.GetCreatureWithEntry(NPC_PROPHET_VELEN)) velen->AI()->Talk(SAY_VELEN_01); - events.ScheduleEvent(eventId+1, 25000); + events.ScheduleEvent(eventId + 1, 25000); break; case EVENT_SCENE_09: if (Creature* velen = summons.GetCreatureWithEntry(NPC_PROPHET_VELEN)) velen->AI()->Talk(SAY_VELEN_02); - events.ScheduleEvent(eventId+1, 14500); + events.ScheduleEvent(eventId + 1, 14500); break; case EVENT_SCENE_10: if (Creature* velen = summons.GetCreatureWithEntry(NPC_PROPHET_VELEN)) velen->AI()->Talk(SAY_VELEN_03); - events.ScheduleEvent(eventId+1, 12500); + events.ScheduleEvent(eventId + 1, 12500); break; case EVENT_SCENE_11: me->SummonCreature(NPC_THE_CORE_OF_ENTROPIUS, 1698.86f, 628.73f, 92.83f, 0.0f); if (Creature* velen = summons.GetCreatureWithEntry(NPC_PROPHET_VELEN)) velen->CastSpell(velen, SPELL_CALL_ENTROPIUS, false); - events.ScheduleEvent(eventId+1, 8000); + events.ScheduleEvent(eventId + 1, 8000); break; case EVENT_SCENE_12: if (Creature* velen = summons.GetCreatureWithEntry(NPC_PROPHET_VELEN)) @@ -916,32 +916,32 @@ public: velen->InterruptNonMeleeSpells(false); velen->AI()->Talk(SAY_VELEN_04); } - events.ScheduleEvent(eventId+1, 20000); + events.ScheduleEvent(eventId + 1, 20000); break; case EVENT_SCENE_13: if (Creature* liadrin = summons.GetCreatureWithEntry(NPC_LADY_LIADRIN)) liadrin->GetMotionMaster()->MovePoint(0, 1711.28f, 637.29f, 27.29f); - events.ScheduleEvent(eventId+1, 6000); + events.ScheduleEvent(eventId + 1, 6000); break; case EVENT_SCENE_14: if (Creature* liadrin = summons.GetCreatureWithEntry(NPC_LADY_LIADRIN)) liadrin->AI()->Talk(SAY_LIADRIN_01); - events.ScheduleEvent(eventId+1, 10000); + events.ScheduleEvent(eventId + 1, 10000); break; case EVENT_SCENE_15: if (Creature* velen = summons.GetCreatureWithEntry(NPC_PROPHET_VELEN)) velen->AI()->Talk(SAY_VELEN_05); - events.ScheduleEvent(eventId+1, 14000); + events.ScheduleEvent(eventId + 1, 14000); break; case EVENT_SCENE_16: if (Creature* liadrin = summons.GetCreatureWithEntry(NPC_LADY_LIADRIN)) liadrin->AI()->Talk(SAY_LIADRIN_02); - events.ScheduleEvent(eventId+1, 2000); + events.ScheduleEvent(eventId + 1, 2000); break; case EVENT_SCENE_17: if (Creature* velen = summons.GetCreatureWithEntry(NPC_PROPHET_VELEN)) velen->AI()->Talk(SAY_VELEN_06); - events.ScheduleEvent(eventId+1, 3000); + events.ScheduleEvent(eventId + 1, 3000); break; case EVENT_SCENE_18: if (Creature* core = summons.GetCreatureWithEntry(NPC_THE_CORE_OF_ENTROPIUS)) @@ -949,7 +949,7 @@ public: core->RemoveAllAuras(); core->CastSpell(core, SPELL_BLAZE_TO_LIGHT, true); } - events.ScheduleEvent(eventId+1, 8000); + events.ScheduleEvent(eventId + 1, 8000); break; case EVENT_SCENE_19: if (Creature* core = summons.GetCreatureWithEntry(NPC_THE_CORE_OF_ENTROPIUS)) @@ -957,34 +957,34 @@ public: core->SetObjectScale(0.75f); core->GetMotionMaster()->MovePoint(0, core->GetPositionX(), core->GetPositionY(), 28.0f); } - events.ScheduleEvent(eventId+1, 2000); + events.ScheduleEvent(eventId + 1, 2000); break; case EVENT_SCENE_20: if (Creature* core = summons.GetCreatureWithEntry(NPC_THE_CORE_OF_ENTROPIUS)) core->CastSpell(core, SPELL_SUNWELL_IGNITION, true); - events.ScheduleEvent(eventId+1, 3000); + events.ScheduleEvent(eventId + 1, 3000); break; case EVENT_SCENE_21: if (Creature* velen = summons.GetCreatureWithEntry(NPC_PROPHET_VELEN)) velen->AI()->Talk(SAY_VELEN_07); - events.ScheduleEvent(eventId+1, 15000); + events.ScheduleEvent(eventId + 1, 15000); break; case EVENT_SCENE_22: if (Creature* liadrin = summons.GetCreatureWithEntry(NPC_LADY_LIADRIN)) liadrin->AI()->Talk(SAY_LIADRIN_03); - events.ScheduleEvent(eventId+1, 20000); + events.ScheduleEvent(eventId + 1, 20000); break; case EVENT_SCENE_23: if (Creature* velen = summons.GetCreatureWithEntry(NPC_PROPHET_VELEN)) velen->AI()->Talk(SAY_VELEN_08); if (Creature* liadrin = summons.GetCreatureWithEntry(NPC_LADY_LIADRIN)) liadrin->SetStandState(UNIT_STAND_STATE_KNEEL); - events.ScheduleEvent(eventId+1, 8000); + events.ScheduleEvent(eventId + 1, 8000); break; case EVENT_SCENE_24: if (Creature* velen = summons.GetCreatureWithEntry(NPC_PROPHET_VELEN)) velen->AI()->Talk(SAY_VELEN_09); - events.ScheduleEvent(eventId+1, 5000); + events.ScheduleEvent(eventId + 1, 5000); break; case EVENT_SCENE_25: if (Creature* velen = summons.GetCreatureWithEntry(NPC_PROPHET_VELEN)) @@ -992,7 +992,7 @@ public: velen->GetMotionMaster()->MovePoint(0, 1739.38f, 643.79f, 28.06f); velen->DespawnOrUnsummon(5000); } - events.ScheduleEvent(eventId+1, 3000); + events.ScheduleEvent(eventId + 1, 3000); break; case EVENT_SCENE_26: for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) @@ -1000,9 +1000,9 @@ public: if (summon->GetEntry() == NPC_SHATTERED_SUN_SOLDIER) { summon->GetMotionMaster()->MovePoint(0, 1739.38f, 643.79f, 28.06f); - summon->DespawnOrUnsummon(summon->GetExactDist2d(1734.96f, 642.43f)*100); + summon->DespawnOrUnsummon(summon->GetExactDist2d(1734.96f, 642.43f) * 100); } - events.ScheduleEvent(eventId+1, 7000); + events.ScheduleEvent(eventId + 1, 7000); break; case EVENT_SCENE_27: me->setActive(false); @@ -1016,303 +1016,303 @@ public: class spell_kiljaeden_shadow_spike : public SpellScriptLoader { - public: - spell_kiljaeden_shadow_spike() : SpellScriptLoader("spell_kiljaeden_shadow_spike") { } +public: + spell_kiljaeden_shadow_spike() : SpellScriptLoader("spell_kiljaeden_shadow_spike") { } - class spell_kiljaeden_shadow_spike_AuraScript : public AuraScript + class spell_kiljaeden_shadow_spike_AuraScript : public AuraScript + { + PrepareAuraScript(spell_kiljaeden_shadow_spike_AuraScript); + + void HandlePeriodic(AuraEffect const* aurEff) { - PrepareAuraScript(spell_kiljaeden_shadow_spike_AuraScript); - - void HandlePeriodic(AuraEffect const* aurEff) - { - PreventDefaultAction(); - if (Unit* target = GetUnitOwner()->GetAI()->SelectTarget(SELECT_TARGET_RANDOM, 0, 60.0f, true)) - GetUnitOwner()->CastSpell(target, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_kiljaeden_shadow_spike_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_kiljaeden_shadow_spike_AuraScript(); + PreventDefaultAction(); + if (Unit* target = GetUnitOwner()->GetAI()->SelectTarget(SELECT_TARGET_RANDOM, 0, 60.0f, true)) + GetUnitOwner()->CastSpell(target, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_kiljaeden_shadow_spike_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_kiljaeden_shadow_spike_AuraScript(); + } }; class spell_kiljaeden_sinister_reflection : public SpellScriptLoader { - public: - spell_kiljaeden_sinister_reflection() : SpellScriptLoader("spell_kiljaeden_sinister_reflection") { } +public: + spell_kiljaeden_sinister_reflection() : SpellScriptLoader("spell_kiljaeden_sinister_reflection") { } - class spell_kiljaeden_sinister_reflection_SpellScript : public SpellScript + class spell_kiljaeden_sinister_reflection_SpellScript : public SpellScript + { + PrepareSpellScript(spell_kiljaeden_sinister_reflection_SpellScript); + + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_kiljaeden_sinister_reflection_SpellScript); - - void FilterTargets(std::list& targets) - { - targets.remove_if(acore::UnitAuraCheck(true, SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT)); - } - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - { - target->CastSpell(target, SPELL_SINISTER_REFLECTION_SUMMON, true); - //target->CastSpell(target, SPELL_SINISTER_REFLECTION_CLONE, true); - } - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_kiljaeden_sinister_reflection_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - OnEffectHitTarget += SpellEffectFn(spell_kiljaeden_sinister_reflection_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_kiljaeden_sinister_reflection_SpellScript(); + targets.remove_if(acore::UnitAuraCheck(true, SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT)); } + + void HandleScriptEffect(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) + { + target->CastSpell(target, SPELL_SINISTER_REFLECTION_SUMMON, true); + //target->CastSpell(target, SPELL_SINISTER_REFLECTION_CLONE, true); + } + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_kiljaeden_sinister_reflection_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_kiljaeden_sinister_reflection_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_kiljaeden_sinister_reflection_SpellScript(); + } }; class spell_kiljaeden_sinister_reflection_clone : public SpellScriptLoader { - public: - spell_kiljaeden_sinister_reflection_clone() : SpellScriptLoader("spell_kiljaeden_sinister_reflection_clone") { } +public: + spell_kiljaeden_sinister_reflection_clone() : SpellScriptLoader("spell_kiljaeden_sinister_reflection_clone") { } - class spell_kiljaeden_sinister_reflection_clone_SpellScript : public SpellScript + class spell_kiljaeden_sinister_reflection_clone_SpellScript : public SpellScript + { + PrepareSpellScript(spell_kiljaeden_sinister_reflection_clone_SpellScript); + + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_kiljaeden_sinister_reflection_clone_SpellScript); + targets.sort(acore::ObjectDistanceOrderPred(GetCaster())); + WorldObject* target = targets.front(); - void FilterTargets(std::list& targets) + targets.clear(); + if (target && target->GetTypeId() == TYPEID_UNIT) { - targets.sort(acore::ObjectDistanceOrderPred(GetCaster())); - WorldObject* target = targets.front(); - - targets.clear(); - if (target && target->GetTypeId() == TYPEID_UNIT) - { - target->ToCreature()->AI()->SetData(1, GetCaster()->getClass()); - targets.push_back(target); - } + target->ToCreature()->AI()->SetData(1, GetCaster()->getClass()); + targets.push_back(target); } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_kiljaeden_sinister_reflection_clone_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_kiljaeden_sinister_reflection_clone_SpellScript(); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_kiljaeden_sinister_reflection_clone_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_kiljaeden_sinister_reflection_clone_SpellScript(); + } }; class spell_kiljaeden_flame_dart : public SpellScriptLoader { - public: - spell_kiljaeden_flame_dart() : SpellScriptLoader("spell_kiljaeden_flame_dart") { } +public: + spell_kiljaeden_flame_dart() : SpellScriptLoader("spell_kiljaeden_flame_dart") { } - class spell_kiljaeden_flame_dart_SpellScript : public SpellScript + class spell_kiljaeden_flame_dart_SpellScript : public SpellScript + { + PrepareSpellScript(spell_kiljaeden_flame_dart_SpellScript); + + void HandleSchoolDamage(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_kiljaeden_flame_dart_SpellScript); - - void HandleSchoolDamage(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - target->CastSpell(target, SPELL_FLAME_DART_EXPLOSION, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_kiljaeden_flame_dart_SpellScript::HandleSchoolDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_kiljaeden_flame_dart_SpellScript(); + if (Unit* target = GetHitUnit()) + target->CastSpell(target, SPELL_FLAME_DART_EXPLOSION, true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_kiljaeden_flame_dart_SpellScript::HandleSchoolDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_kiljaeden_flame_dart_SpellScript(); + } }; class spell_kiljaeden_darkness : public SpellScriptLoader { - public: - spell_kiljaeden_darkness() : SpellScriptLoader("spell_kiljaeden_darkness") { } +public: + spell_kiljaeden_darkness() : SpellScriptLoader("spell_kiljaeden_darkness") { } - class spell_kiljaeden_darkness_AuraScript : public AuraScript + class spell_kiljaeden_darkness_AuraScript : public AuraScript + { + PrepareAuraScript(spell_kiljaeden_darkness_AuraScript); + + void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_kiljaeden_darkness_AuraScript); + if (GetUnitOwner()->GetTypeId() == TYPEID_UNIT) + GetUnitOwner()->ToCreature()->AI()->DoAction(ACTION_NO_KILL_TALK); - void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (GetUnitOwner()->GetTypeId() == TYPEID_UNIT) - GetUnitOwner()->ToCreature()->AI()->DoAction(ACTION_NO_KILL_TALK); - - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_DARKNESS_OF_A_THOUSAND_SOULS_DAMAGE, true); - } - - void Register() - { - OnEffectRemove += AuraEffectRemoveFn(spell_kiljaeden_darkness_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_kiljaeden_darkness_AuraScript(); + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_DARKNESS_OF_A_THOUSAND_SOULS_DAMAGE, true); } + + void Register() + { + OnEffectRemove += AuraEffectRemoveFn(spell_kiljaeden_darkness_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_kiljaeden_darkness_AuraScript(); + } }; class spell_kiljaeden_power_of_the_blue_flight : public SpellScriptLoader { - public: - spell_kiljaeden_power_of_the_blue_flight() : SpellScriptLoader("spell_kiljaeden_power_of_the_blue_flight") { } +public: + spell_kiljaeden_power_of_the_blue_flight() : SpellScriptLoader("spell_kiljaeden_power_of_the_blue_flight") { } - class spell_kiljaeden_power_of_the_blue_flight_SpellScript : public SpellScript + class spell_kiljaeden_power_of_the_blue_flight_SpellScript : public SpellScript + { + PrepareSpellScript(spell_kiljaeden_power_of_the_blue_flight_SpellScript); + + void HandleScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_kiljaeden_power_of_the_blue_flight_SpellScript); - - void HandleScriptEffect(SpellEffIndex effIndex) + PreventHitDefaultEffect(effIndex); + if (Player* player = GetHitPlayer()) { - PreventHitDefaultEffect(effIndex); - if (Player* player = GetHitPlayer()) - { - player->CastSpell(player, SPELL_SUMMON_BLUE_DRAKE, true); - player->CastSpell(player, SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT, true); - } + player->CastSpell(player, SPELL_SUMMON_BLUE_DRAKE, true); + player->CastSpell(player, SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT, true); } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_kiljaeden_power_of_the_blue_flight_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_kiljaeden_power_of_the_blue_flight_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_kiljaeden_power_of_the_blue_flight_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_kiljaeden_power_of_the_blue_flight_SpellScript(); + } }; class spell_kiljaeden_vengeance_of_the_blue_flight : public SpellScriptLoader { - public: - spell_kiljaeden_vengeance_of_the_blue_flight() : SpellScriptLoader("spell_kiljaeden_vengeance_of_the_blue_flight") { } +public: + spell_kiljaeden_vengeance_of_the_blue_flight() : SpellScriptLoader("spell_kiljaeden_vengeance_of_the_blue_flight") { } - class spell_kiljaeden_vengeance_of_the_blue_flight_AuraScript : public AuraScript + class spell_kiljaeden_vengeance_of_the_blue_flight_AuraScript : public AuraScript + { + PrepareAuraScript(spell_kiljaeden_vengeance_of_the_blue_flight_AuraScript); + + void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_kiljaeden_vengeance_of_the_blue_flight_AuraScript); - - void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_POSSESS_DRAKE_IMMUNITY, true); - } - - void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetUnitOwner()->RemoveAurasDueToSpell(SPELL_POSSESS_DRAKE_IMMUNITY); - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_kiljaeden_vengeance_of_the_blue_flight_AuraScript::HandleApply, EFFECT_0, SPELL_AURA_MOD_POSSESS, AURA_EFFECT_HANDLE_REAL); - OnEffectApply += AuraEffectApplyFn(spell_kiljaeden_vengeance_of_the_blue_flight_AuraScript::HandleApply, EFFECT_2, SPELL_AURA_MOD_PACIFY_SILENCE, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_kiljaeden_vengeance_of_the_blue_flight_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_MOD_POSSESS, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_kiljaeden_vengeance_of_the_blue_flight_AuraScript::HandleRemove, EFFECT_2, SPELL_AURA_MOD_PACIFY_SILENCE, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_kiljaeden_vengeance_of_the_blue_flight_AuraScript(); + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_POSSESS_DRAKE_IMMUNITY, true); } + + void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetUnitOwner()->RemoveAurasDueToSpell(SPELL_POSSESS_DRAKE_IMMUNITY); + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_kiljaeden_vengeance_of_the_blue_flight_AuraScript::HandleApply, EFFECT_0, SPELL_AURA_MOD_POSSESS, AURA_EFFECT_HANDLE_REAL); + OnEffectApply += AuraEffectApplyFn(spell_kiljaeden_vengeance_of_the_blue_flight_AuraScript::HandleApply, EFFECT_2, SPELL_AURA_MOD_PACIFY_SILENCE, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_kiljaeden_vengeance_of_the_blue_flight_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_MOD_POSSESS, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_kiljaeden_vengeance_of_the_blue_flight_AuraScript::HandleRemove, EFFECT_2, SPELL_AURA_MOD_PACIFY_SILENCE, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_kiljaeden_vengeance_of_the_blue_flight_AuraScript(); + } }; class spell_kiljaeden_armageddon_periodic : public SpellScriptLoader { - public: - spell_kiljaeden_armageddon_periodic() : SpellScriptLoader("spell_kiljaeden_armageddon_periodic") { } +public: + spell_kiljaeden_armageddon_periodic() : SpellScriptLoader("spell_kiljaeden_armageddon_periodic") { } - class spell_kiljaeden_armageddon_periodic_AuraScript : public AuraScript + class spell_kiljaeden_armageddon_periodic_AuraScript : public AuraScript + { + PrepareAuraScript(spell_kiljaeden_armageddon_periodic_AuraScript); + + void HandlePeriodic(AuraEffect const* aurEff) { - PrepareAuraScript(spell_kiljaeden_armageddon_periodic_AuraScript); - - void HandlePeriodic(AuraEffect const* aurEff) - { - PreventDefaultAction(); - if (Unit* target = GetUnitOwner()->GetAI()->SelectTarget(SELECT_TARGET_RANDOM, 0, 60.0f, true)) - GetUnitOwner()->CastSpell(target, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_kiljaeden_armageddon_periodic_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_kiljaeden_armageddon_periodic_AuraScript(); + PreventDefaultAction(); + if (Unit* target = GetUnitOwner()->GetAI()->SelectTarget(SELECT_TARGET_RANDOM, 0, 60.0f, true)) + GetUnitOwner()->CastSpell(target, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_kiljaeden_armageddon_periodic_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_kiljaeden_armageddon_periodic_AuraScript(); + } }; class spell_kiljaeden_armageddon_missile : public SpellScriptLoader { - public: - spell_kiljaeden_armageddon_missile() : SpellScriptLoader("spell_kiljaeden_armageddon_missile") { } +public: + spell_kiljaeden_armageddon_missile() : SpellScriptLoader("spell_kiljaeden_armageddon_missile") { } - class spell_kiljaeden_armageddon_missile_SpellScript : public SpellScript + class spell_kiljaeden_armageddon_missile_SpellScript : public SpellScript + { + PrepareSpellScript(spell_kiljaeden_armageddon_missile_SpellScript); + + void SetDest(SpellDestination& dest) { - PrepareSpellScript(spell_kiljaeden_armageddon_missile_SpellScript); - - void SetDest(SpellDestination& dest) - { - Position const offset = { 0.0f, 0.0f, -20.0f, 0.0f }; - dest.RelocateOffset(offset); - } - - void Register() - { - OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_kiljaeden_armageddon_missile_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_kiljaeden_armageddon_missile_SpellScript(); + Position const offset = { 0.0f, 0.0f, -20.0f, 0.0f }; + dest.RelocateOffset(offset); } + + void Register() + { + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_kiljaeden_armageddon_missile_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_kiljaeden_armageddon_missile_SpellScript(); + } }; class spell_kiljaeden_dragon_breath : public SpellScriptLoader { - public: - spell_kiljaeden_dragon_breath() : SpellScriptLoader("spell_kiljaeden_dragon_breath") { } +public: + spell_kiljaeden_dragon_breath() : SpellScriptLoader("spell_kiljaeden_dragon_breath") { } - class spell_kiljaeden_dragon_breath_SpellScript : public SpellScript + class spell_kiljaeden_dragon_breath_SpellScript : public SpellScript + { + PrepareSpellScript(spell_kiljaeden_dragon_breath_SpellScript); + + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_kiljaeden_dragon_breath_SpellScript); - - void FilterTargets(std::list& targets) - { - targets.remove_if(acore::UnitAuraCheck(true, SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT)); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_kiljaeden_dragon_breath_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_CONE_ALLY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_kiljaeden_dragon_breath_SpellScript(); + targets.remove_if(acore::UnitAuraCheck(true, SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT)); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_kiljaeden_dragon_breath_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_CONE_ALLY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_kiljaeden_dragon_breath_SpellScript(); + } }; void AddSC_boss_kiljaeden() diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp index 378a3aa6b..1aa01533a 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp @@ -84,7 +84,7 @@ public: events.ScheduleEvent(EVENT_SPELL_ENRAGE, 600000); } - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) { if (damage >= me->GetHealth()) { @@ -104,7 +104,7 @@ public: if (summon->GetEntry() == NPC_ENTROPIUS) summon->AI()->SetData(DATA_ENRAGE_TIMER, events.GetNextEventTime(EVENT_SPELL_ENRAGE)); else - { + { if (!summon->IsTrigger()) summon->SetInCombatWithZone(); summons.Summon(summon); @@ -170,7 +170,7 @@ public: if (!muru->IsInEvadeMode()) muru->AI()->EnterEvadeMode(); - me->DespawnOrUnsummon(); + me->DespawnOrUnsummon(); } void EnterCombat(Unit* /*who*/) @@ -294,19 +294,19 @@ public: me->CastSpell(me, SPELL_BLACK_HOLE_PASSIVE, true); break; case EVENT_SWITCH_BLACK_HOLE_TARGET: - { - Map::PlayerList const& players = me->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) - if (Player* player = itr->GetSource()) - if (me->GetDistance2d(player) < 15.0f && player->GetPositionZ() < 72.0f && player->IsAlive() && !player->HasAura(SPELL_BLACK_HOLE_EFFECT)) - { - me->GetMotionMaster()->MovePoint(0, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), false, true); - events.ScheduleEvent(EVENT_SWITCH_BLACK_HOLE_TARGET, 5000); - return; - } - events.ScheduleEvent(EVENT_SWITCH_BLACK_HOLE_TARGET, 500); - break; - } + { + Map::PlayerList const& players = me->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + if (Player* player = itr->GetSource()) + if (me->GetDistance2d(player) < 15.0f && player->GetPositionZ() < 72.0f && player->IsAlive() && !player->HasAura(SPELL_BLACK_HOLE_EFFECT)) + { + me->GetMotionMaster()->MovePoint(0, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), false, true); + events.ScheduleEvent(EVENT_SWITCH_BLACK_HOLE_TARGET, 5000); + return; + } + events.ScheduleEvent(EVENT_SWITCH_BLACK_HOLE_TARGET, 500); + break; + } } } }; @@ -314,182 +314,182 @@ public: class spell_muru_summon_blood_elves_periodic : public SpellScriptLoader { - public: - spell_muru_summon_blood_elves_periodic() : SpellScriptLoader("spell_muru_summon_blood_elves_periodic") { } +public: + spell_muru_summon_blood_elves_periodic() : SpellScriptLoader("spell_muru_summon_blood_elves_periodic") { } - class spell_muru_summon_blood_elves_periodic_AuraScript : public AuraScript + class spell_muru_summon_blood_elves_periodic_AuraScript : public AuraScript + { + PrepareAuraScript(spell_muru_summon_blood_elves_periodic_AuraScript); + + void HandleApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_muru_summon_blood_elves_periodic_AuraScript); - - void HandleApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - // first tick after 10 seconds - GetAura()->GetEffect(aurEff->GetEffIndex())->SetPeriodicTimer(10000); - } - - void OnPeriodic(AuraEffect const* /*aurEff*/) - { - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_FURY_MAGE1, true); - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_FURY_MAGE2, true); - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_BERSERKER1, true); - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_BERSERKER2, true); - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_BERSERKER1, true); - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_BERSERKER2, true); - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_muru_summon_blood_elves_periodic_AuraScript::HandleApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_muru_summon_blood_elves_periodic_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_muru_summon_blood_elves_periodic_AuraScript(); + // first tick after 10 seconds + GetAura()->GetEffect(aurEff->GetEffIndex())->SetPeriodicTimer(10000); } + + void OnPeriodic(AuraEffect const* /*aurEff*/) + { + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_FURY_MAGE1, true); + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_FURY_MAGE2, true); + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_BERSERKER1, true); + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_BERSERKER2, true); + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_BERSERKER1, true); + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_BERSERKER2, true); + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_muru_summon_blood_elves_periodic_AuraScript::HandleApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_muru_summon_blood_elves_periodic_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_muru_summon_blood_elves_periodic_AuraScript(); + } }; class spell_muru_darkness : public SpellScriptLoader { - public: - spell_muru_darkness() : SpellScriptLoader("spell_muru_darkness") { } +public: + spell_muru_darkness() : SpellScriptLoader("spell_muru_darkness") { } - class spell_muru_darkness_AuraScript : public AuraScript + class spell_muru_darkness_AuraScript : public AuraScript + { + PrepareAuraScript(spell_muru_darkness_AuraScript); + + void OnPeriodic(AuraEffect const* aurEff) { - PrepareAuraScript(spell_muru_darkness_AuraScript); - - void OnPeriodic(AuraEffect const* aurEff) - { - if (aurEff->GetTickNumber() == 3) - for (uint8 i = 0; i < 8; ++i) - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_DARK_FIEND+i, true); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_muru_darkness_AuraScript::OnPeriodic, EFFECT_2, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_muru_darkness_AuraScript(); + if (aurEff->GetTickNumber() == 3) + for (uint8 i = 0; i < 8; ++i) + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_DARK_FIEND + i, true); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_muru_darkness_AuraScript::OnPeriodic, EFFECT_2, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_muru_darkness_AuraScript(); + } }; class spell_entropius_negative_energy : public SpellScriptLoader { - public: - spell_entropius_negative_energy() : SpellScriptLoader("spell_entropius_negative_energy") { } +public: + spell_entropius_negative_energy() : SpellScriptLoader("spell_entropius_negative_energy") { } - class spell_entropius_negative_energy_SpellScript : public SpellScript + class spell_entropius_negative_energy_SpellScript : public SpellScript + { + PrepareSpellScript(spell_entropius_negative_energy_SpellScript); + + bool Load() { - PrepareSpellScript(spell_entropius_negative_energy_SpellScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_UNIT; - } - - void FilterTargets(std::list& targets) - { - acore::Containers::RandomResizeList(targets, GetCaster()->GetAI()->GetData(DATA_NEGATIVE_ENERGY_TARGETS)); - } - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - GetCaster()->CastSpell(target, SPELL_NEGATIVE_ENERGY_CHAIN, true); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_entropius_negative_energy_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - OnEffectHitTarget += SpellEffectFn(spell_entropius_negative_energy_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_entropius_negative_energy_SpellScript(); + return GetCaster()->GetTypeId() == TYPEID_UNIT; } + + void FilterTargets(std::list& targets) + { + acore::Containers::RandomResizeList(targets, GetCaster()->GetAI()->GetData(DATA_NEGATIVE_ENERGY_TARGETS)); + } + + void HandleScriptEffect(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) + GetCaster()->CastSpell(target, SPELL_NEGATIVE_ENERGY_CHAIN, true); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_entropius_negative_energy_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_entropius_negative_energy_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_entropius_negative_energy_SpellScript(); + } }; class spell_entropius_void_zone_visual : public SpellScriptLoader { - public: - spell_entropius_void_zone_visual() : SpellScriptLoader("spell_entropius_void_zone_visual") { } +public: + spell_entropius_void_zone_visual() : SpellScriptLoader("spell_entropius_void_zone_visual") { } - class spell_entropius_void_zone_visual_AuraScript : public AuraScript + class spell_entropius_void_zone_visual_AuraScript : public AuraScript + { + PrepareAuraScript(spell_entropius_void_zone_visual_AuraScript); + + void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_entropius_void_zone_visual_AuraScript); - - void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - SetDuration(3000); - } - - void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_DARK_FIEND_ENTROPIUS, true); - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_entropius_void_zone_visual_AuraScript::HandleApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_entropius_void_zone_visual_AuraScript::HandleApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_entropius_void_zone_visual_AuraScript(); + SetDuration(3000); } + + void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_DARK_FIEND_ENTROPIUS, true); + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_entropius_void_zone_visual_AuraScript::HandleApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_entropius_void_zone_visual_AuraScript::HandleApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_entropius_void_zone_visual_AuraScript(); + } }; class spell_entropius_black_hole_effect : public SpellScriptLoader { - public: - spell_entropius_black_hole_effect() : SpellScriptLoader("spell_entropius_black_hole_effect") { } +public: + spell_entropius_black_hole_effect() : SpellScriptLoader("spell_entropius_black_hole_effect") { } - class spell_entropius_black_hole_effect_SpellScript : public SpellScript + class spell_entropius_black_hole_effect_SpellScript : public SpellScript + { + PrepareSpellScript(spell_entropius_black_hole_effect_SpellScript); + + void HandlePull(SpellEffIndex effIndex) { - PrepareSpellScript(spell_entropius_black_hole_effect_SpellScript); + PreventHitDefaultEffect(effIndex); + Unit* target = GetHitUnit(); + if (!target) + return; - void HandlePull(SpellEffIndex effIndex) + Position pos; + if (target->GetDistance(GetCaster()) < 5.0f) { - PreventHitDefaultEffect(effIndex); - Unit* target = GetHitUnit(); - if (!target) - return; - - Position pos; - if (target->GetDistance(GetCaster()) < 5.0f) - { - float o = frand(0, 2*M_PI); - pos.Relocate(GetCaster()->GetPositionX() + 4.0f*cos(o), GetCaster()->GetPositionY() + 4.0f*sin(o), GetCaster()->GetPositionZ()+frand(10.0f, 15.0f)); - } - else - pos.Relocate(GetCaster()->GetPositionX(), GetCaster()->GetPositionY(), GetCaster()->GetPositionZ()+1.0f); - - float speedXY = float(GetSpellInfo()->Effects[effIndex].MiscValue) * 0.1f; - float speedZ = target->GetDistance(pos) / speedXY * 0.5f * Movement::gravity; - - target->GetMotionMaster()->MoveJump(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), speedXY, speedZ); + float o = frand(0, 2 * M_PI); + pos.Relocate(GetCaster()->GetPositionX() + 4.0f * cos(o), GetCaster()->GetPositionY() + 4.0f * sin(o), GetCaster()->GetPositionZ() + frand(10.0f, 15.0f)); } + else + pos.Relocate(GetCaster()->GetPositionX(), GetCaster()->GetPositionY(), GetCaster()->GetPositionZ() + 1.0f); - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_entropius_black_hole_effect_SpellScript::HandlePull, EFFECT_0, SPELL_EFFECT_PULL_TOWARDS_DEST); - } - }; + float speedXY = float(GetSpellInfo()->Effects[effIndex].MiscValue) * 0.1f; + float speedZ = target->GetDistance(pos) / speedXY * 0.5f * Movement::gravity; - SpellScript* GetSpellScript() const - { - return new spell_entropius_black_hole_effect_SpellScript(); + target->GetMotionMaster()->MoveJump(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), speedXY, speedZ); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_entropius_black_hole_effect_SpellScript::HandlePull, EFFECT_0, SPELL_EFFECT_PULL_TOWARDS_DEST); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_entropius_black_hole_effect_SpellScript(); + } }; void AddSC_boss_muru() diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp index 73dfc0c0e..00cb516a8 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp @@ -20,286 +20,286 @@ DoorData const doorData[] = class instance_sunwell_plateau : public InstanceMapScript { - public: - instance_sunwell_plateau() : InstanceMapScript("instance_sunwell_plateau", 580) { } +public: + instance_sunwell_plateau() : InstanceMapScript("instance_sunwell_plateau", 580) { } - struct instance_sunwell_plateau_InstanceMapScript : public InstanceScript + struct instance_sunwell_plateau_InstanceMapScript : public InstanceScript + { + instance_sunwell_plateau_InstanceMapScript(Map* map) : InstanceScript(map) { - instance_sunwell_plateau_InstanceMapScript(Map* map) : InstanceScript(map) - { - SetBossNumber(MAX_ENCOUNTERS); - LoadDoorData(doorData); + SetBossNumber(MAX_ENCOUNTERS); + LoadDoorData(doorData); - KalecgosDragonGUID = 0; - SathrovarrGUID = 0; - BrutallusGUID = 0; - MadrigosaGUID = 0; - FelmystGUID = 0; - AlythessGUID = 0; - SacrolashGUID = 0; - MuruGUID = 0; - KilJaedenGUID = 0; - KilJaedenControllerGUID = 0; - AnveenaGUID = 0; - KalecgosKjGUID = 0; + KalecgosDragonGUID = 0; + SathrovarrGUID = 0; + BrutallusGUID = 0; + MadrigosaGUID = 0; + FelmystGUID = 0; + AlythessGUID = 0; + SacrolashGUID = 0; + MuruGUID = 0; + KilJaedenGUID = 0; + KilJaedenControllerGUID = 0; + AnveenaGUID = 0; + KalecgosKjGUID = 0; - IceBarrierGUID = 0; - memset(&blueFlightOrbGUID, 0, sizeof(blueFlightOrbGUID)); - } - - void OnPlayerEnter(Player* player) - { - instance->LoadGrid(1477.94f, 643.22f); - instance->LoadGrid(1641.45f, 988.08f); - if (GameObject* gobj = instance->GetGameObject(IceBarrierGUID)) - gobj->SendUpdateToPlayer(player); - } - - Player const* GetPlayerInMap() const - { - Map::PlayerList const& players = instance->GetPlayers(); - - if (!players.isEmpty()) - { - for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) - { - Player* player = itr->GetSource(); - if (player && !player->HasAura(45839, 0)) - return player; - } - } - //else - // TC_LOG_DEBUG("scripts", "Instance Sunwell Plateau: GetPlayerInMap, but PlayerList is empty!"); - - return nullptr; - } - - void OnCreatureCreate(Creature* creature) - { - if (creature->GetDBTableGUIDLow() > 0 || !IS_PLAYER_GUID(creature->GetOwnerGUID())) - creature->CastSpell(creature, SPELL_SUNWELL_RADIANCE, true); - - switch (creature->GetEntry()) - { - case NPC_KALECGOS: - KalecgosDragonGUID = creature->GetGUID(); - break; - case NPC_SATHROVARR: - SathrovarrGUID = creature->GetGUID(); - break; - case NPC_BRUTALLUS: - BrutallusGUID = creature->GetGUID(); - break; - case NPC_MADRIGOSA: - MadrigosaGUID = creature->GetGUID(); - break; - case NPC_FELMYST: - FelmystGUID = creature->GetGUID(); - break; - case NPC_GRAND_WARLOCK_ALYTHESS: - AlythessGUID = creature->GetGUID(); - break; - case NPC_LADY_SACROLASH: - SacrolashGUID = creature->GetGUID(); - break; - case NPC_MURU: - MuruGUID = creature->GetGUID(); - break; - case NPC_KILJAEDEN: - KilJaedenGUID = creature->GetGUID(); - break; - case NPC_KILJAEDEN_CONTROLLER: - KilJaedenControllerGUID = creature->GetGUID(); - break; - case NPC_ANVEENA: - AnveenaGUID = creature->GetGUID(); - break; - case NPC_KALECGOS_KJ: - KalecgosKjGUID = creature->GetGUID(); - break; - - // Xinef: Felmyst encounter - case NPC_DEMONIC_VAPOR_TRAIL: - case NPC_UNYIELDING_DEAD: - if (Creature* felmyst = instance->GetCreature(FelmystGUID)) - felmyst->AI()->JustSummoned(creature); - break; - - // Xinef: M'uru encounter - case NPC_DARKNESS: - case NPC_VOID_SENTINEL: - case NPC_VOID_SPAWN: - if (Creature* muru = instance->GetCreature(MuruGUID)) - muru->AI()->JustSummoned(creature); - break; - - // Xinef: Kil'jaeden encounter - case NPC_FELFIRE_PORTAL: - case NPC_VOLATILE_FELFIRE_FIEND: - case NPC_SHIELD_ORB: - case NPC_SINISTER_REFLECTION: - if (Creature* kiljaedenC = instance->GetCreature(KilJaedenControllerGUID)) - kiljaedenC->AI()->JustSummoned(creature); - break; - default: - break; - } - } - - void OnGameObjectCreate(GameObject* go) - { - switch (go->GetEntry()) - { - case GO_FORCE_FIELD: - case GO_BOSS_COLLISION_1: - case GO_BOSS_COLLISION_2: - case GO_FIRE_BARRIER: - case GO_MURUS_GATE_1: - case GO_MURUS_GATE_2: - AddDoor(go, true); - break; - case GO_ICE_BARRIER: - IceBarrierGUID = go->GetGUID(); - go->setActive(true); - break; - case GO_ORB_OF_THE_BLUE_DRAGONFLIGHT1: - blueFlightOrbGUID[0] = go->GetGUID(); - break; - case GO_ORB_OF_THE_BLUE_DRAGONFLIGHT2: - blueFlightOrbGUID[1] = go->GetGUID(); - break; - case GO_ORB_OF_THE_BLUE_DRAGONFLIGHT3: - blueFlightOrbGUID[2] = go->GetGUID(); - break; - case GO_ORB_OF_THE_BLUE_DRAGONFLIGHT4: - blueFlightOrbGUID[3] = go->GetGUID(); - break; - default: - break; - } - } - - void OnGameObjectRemove(GameObject* go) - { - switch (go->GetEntry()) - { - case GO_FIRE_BARRIER: - case GO_MURUS_GATE_1: - case GO_MURUS_GATE_2: - case GO_BOSS_COLLISION_1: - case GO_BOSS_COLLISION_2: - case GO_FORCE_FIELD: - AddDoor(go, false); - break; - default: - break; - } - } - - uint64 GetData64(uint32 id) const - { - switch (id) - { - case NPC_KALECGOS: - return KalecgosDragonGUID; - case NPC_SATHROVARR: - return SathrovarrGUID; - case NPC_BRUTALLUS: - return BrutallusGUID; - case NPC_MADRIGOSA: - return MadrigosaGUID; - case NPC_FELMYST: - return FelmystGUID; - case NPC_GRAND_WARLOCK_ALYTHESS: - return AlythessGUID; - case NPC_LADY_SACROLASH: - return SacrolashGUID; - case NPC_MURU: - return MuruGUID; - case NPC_ANVEENA: - return AnveenaGUID; - case NPC_KALECGOS_KJ: - return KalecgosKjGUID; - case NPC_KILJAEDEN_CONTROLLER: - return KilJaedenControllerGUID; - case NPC_KILJAEDEN: - return KilJaedenGUID; - - // Orbs - case DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_1: - case DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_2: - case DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_3: - case DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_4: - return blueFlightOrbGUID[id-DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_1]; - } - return 0; - } - - std::string GetSaveData() - { - OUT_SAVE_INST_DATA; - - std::ostringstream saveStream; - saveStream << "S P " << GetBossSaveData(); - - OUT_SAVE_INST_DATA_COMPLETE; - return saveStream.str(); - } - - void Load(char const* str) - { - 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 == 'S' && dataHead2 == 'P') - { - for (uint32 i = 0; i < MAX_ENCOUNTERS; ++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 KalecgosDragonGUID; - uint64 SathrovarrGUID; - uint64 BrutallusGUID; - uint64 MadrigosaGUID; - uint64 FelmystGUID; - uint64 AlythessGUID; - uint64 SacrolashGUID; - uint64 MuruGUID; - uint64 KilJaedenGUID; - uint64 KilJaedenControllerGUID; - uint64 AnveenaGUID; - uint64 KalecgosKjGUID; - - uint64 IceBarrierGUID; - uint64 blueFlightOrbGUID[4]; - }; - - InstanceScript* GetInstanceScript(InstanceMap* map) const - { - return new instance_sunwell_plateau_InstanceMapScript(map); + IceBarrierGUID = 0; + memset(&blueFlightOrbGUID, 0, sizeof(blueFlightOrbGUID)); } + + void OnPlayerEnter(Player* player) + { + instance->LoadGrid(1477.94f, 643.22f); + instance->LoadGrid(1641.45f, 988.08f); + if (GameObject* gobj = instance->GetGameObject(IceBarrierGUID)) + gobj->SendUpdateToPlayer(player); + } + + Player const* GetPlayerInMap() const + { + Map::PlayerList const& players = instance->GetPlayers(); + + if (!players.isEmpty()) + { + for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + { + Player* player = itr->GetSource(); + if (player && !player->HasAura(45839, 0)) + return player; + } + } + //else + // TC_LOG_DEBUG("scripts", "Instance Sunwell Plateau: GetPlayerInMap, but PlayerList is empty!"); + + return nullptr; + } + + void OnCreatureCreate(Creature* creature) + { + if (creature->GetDBTableGUIDLow() > 0 || !IS_PLAYER_GUID(creature->GetOwnerGUID())) + creature->CastSpell(creature, SPELL_SUNWELL_RADIANCE, true); + + switch (creature->GetEntry()) + { + case NPC_KALECGOS: + KalecgosDragonGUID = creature->GetGUID(); + break; + case NPC_SATHROVARR: + SathrovarrGUID = creature->GetGUID(); + break; + case NPC_BRUTALLUS: + BrutallusGUID = creature->GetGUID(); + break; + case NPC_MADRIGOSA: + MadrigosaGUID = creature->GetGUID(); + break; + case NPC_FELMYST: + FelmystGUID = creature->GetGUID(); + break; + case NPC_GRAND_WARLOCK_ALYTHESS: + AlythessGUID = creature->GetGUID(); + break; + case NPC_LADY_SACROLASH: + SacrolashGUID = creature->GetGUID(); + break; + case NPC_MURU: + MuruGUID = creature->GetGUID(); + break; + case NPC_KILJAEDEN: + KilJaedenGUID = creature->GetGUID(); + break; + case NPC_KILJAEDEN_CONTROLLER: + KilJaedenControllerGUID = creature->GetGUID(); + break; + case NPC_ANVEENA: + AnveenaGUID = creature->GetGUID(); + break; + case NPC_KALECGOS_KJ: + KalecgosKjGUID = creature->GetGUID(); + break; + + // Xinef: Felmyst encounter + case NPC_DEMONIC_VAPOR_TRAIL: + case NPC_UNYIELDING_DEAD: + if (Creature* felmyst = instance->GetCreature(FelmystGUID)) + felmyst->AI()->JustSummoned(creature); + break; + + // Xinef: M'uru encounter + case NPC_DARKNESS: + case NPC_VOID_SENTINEL: + case NPC_VOID_SPAWN: + if (Creature* muru = instance->GetCreature(MuruGUID)) + muru->AI()->JustSummoned(creature); + break; + + // Xinef: Kil'jaeden encounter + case NPC_FELFIRE_PORTAL: + case NPC_VOLATILE_FELFIRE_FIEND: + case NPC_SHIELD_ORB: + case NPC_SINISTER_REFLECTION: + if (Creature* kiljaedenC = instance->GetCreature(KilJaedenControllerGUID)) + kiljaedenC->AI()->JustSummoned(creature); + break; + default: + break; + } + } + + void OnGameObjectCreate(GameObject* go) + { + switch (go->GetEntry()) + { + case GO_FORCE_FIELD: + case GO_BOSS_COLLISION_1: + case GO_BOSS_COLLISION_2: + case GO_FIRE_BARRIER: + case GO_MURUS_GATE_1: + case GO_MURUS_GATE_2: + AddDoor(go, true); + break; + case GO_ICE_BARRIER: + IceBarrierGUID = go->GetGUID(); + go->setActive(true); + break; + case GO_ORB_OF_THE_BLUE_DRAGONFLIGHT1: + blueFlightOrbGUID[0] = go->GetGUID(); + break; + case GO_ORB_OF_THE_BLUE_DRAGONFLIGHT2: + blueFlightOrbGUID[1] = go->GetGUID(); + break; + case GO_ORB_OF_THE_BLUE_DRAGONFLIGHT3: + blueFlightOrbGUID[2] = go->GetGUID(); + break; + case GO_ORB_OF_THE_BLUE_DRAGONFLIGHT4: + blueFlightOrbGUID[3] = go->GetGUID(); + break; + default: + break; + } + } + + void OnGameObjectRemove(GameObject* go) + { + switch (go->GetEntry()) + { + case GO_FIRE_BARRIER: + case GO_MURUS_GATE_1: + case GO_MURUS_GATE_2: + case GO_BOSS_COLLISION_1: + case GO_BOSS_COLLISION_2: + case GO_FORCE_FIELD: + AddDoor(go, false); + break; + default: + break; + } + } + + uint64 GetData64(uint32 id) const + { + switch (id) + { + case NPC_KALECGOS: + return KalecgosDragonGUID; + case NPC_SATHROVARR: + return SathrovarrGUID; + case NPC_BRUTALLUS: + return BrutallusGUID; + case NPC_MADRIGOSA: + return MadrigosaGUID; + case NPC_FELMYST: + return FelmystGUID; + case NPC_GRAND_WARLOCK_ALYTHESS: + return AlythessGUID; + case NPC_LADY_SACROLASH: + return SacrolashGUID; + case NPC_MURU: + return MuruGUID; + case NPC_ANVEENA: + return AnveenaGUID; + case NPC_KALECGOS_KJ: + return KalecgosKjGUID; + case NPC_KILJAEDEN_CONTROLLER: + return KilJaedenControllerGUID; + case NPC_KILJAEDEN: + return KilJaedenGUID; + + // Orbs + case DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_1: + case DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_2: + case DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_3: + case DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_4: + return blueFlightOrbGUID[id - DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_1]; + } + return 0; + } + + std::string GetSaveData() + { + OUT_SAVE_INST_DATA; + + std::ostringstream saveStream; + saveStream << "S P " << GetBossSaveData(); + + OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); + } + + void Load(char const* str) + { + 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 == 'S' && dataHead2 == 'P') + { + for (uint32 i = 0; i < MAX_ENCOUNTERS; ++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 KalecgosDragonGUID; + uint64 SathrovarrGUID; + uint64 BrutallusGUID; + uint64 MadrigosaGUID; + uint64 FelmystGUID; + uint64 AlythessGUID; + uint64 SacrolashGUID; + uint64 MuruGUID; + uint64 KilJaedenGUID; + uint64 KilJaedenControllerGUID; + uint64 AnveenaGUID; + uint64 KalecgosKjGUID; + + uint64 IceBarrierGUID; + uint64 blueFlightOrbGUID[4]; + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_sunwell_plateau_InstanceMapScript(map); + } }; enum cataclysmBreath @@ -316,30 +316,30 @@ enum cataclysmBreath class spell_cataclysm_breath : public SpellScriptLoader { - public: - spell_cataclysm_breath() : SpellScriptLoader("spell_cataclysm_breath") { } +public: + spell_cataclysm_breath() : SpellScriptLoader("spell_cataclysm_breath") { } - class spell_cataclysm_breath_SpellScript : public SpellScript + class spell_cataclysm_breath_SpellScript : public SpellScript + { + PrepareSpellScript(spell_cataclysm_breath_SpellScript); + + void HandleAfterCast() { - PrepareSpellScript(spell_cataclysm_breath_SpellScript); - - void HandleAfterCast() - { - if (Unit* target = GetExplTargetUnit()) - for (uint8 i = 0; i < 4; ++i) - GetCaster()->CastSpell(target, RAND(SPELL_CORROSIVE_POISON, SPELL_FEVERED_FATIGUE, SPELL_HEX, SPELL_NECROTIC_POISON, SPELL_PIERCING_SHADOW, SPELL_SHRINK, SPELL_WAVERING_WILL, SPELL_WITHERED_TOUCH), true); - } - - void Register() - { - AfterCast += SpellCastFn(spell_cataclysm_breath_SpellScript::HandleAfterCast); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_cataclysm_breath_SpellScript(); + if (Unit* target = GetExplTargetUnit()) + for (uint8 i = 0; i < 4; ++i) + GetCaster()->CastSpell(target, RAND(SPELL_CORROSIVE_POISON, SPELL_FEVERED_FATIGUE, SPELL_HEX, SPELL_NECROTIC_POISON, SPELL_PIERCING_SHADOW, SPELL_SHRINK, SPELL_WAVERING_WILL, SPELL_WITHERED_TOUCH), true); } + + void Register() + { + AfterCast += SpellCastFn(spell_cataclysm_breath_SpellScript::HandleAfterCast); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_cataclysm_breath_SpellScript(); + } }; void AddSC_instance_sunwell_plateau() diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h b/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h index a9f725ac3..388c17028 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h @@ -53,7 +53,7 @@ enum CreatureIds NPC_VOID_SENTINEL = 25772, NPC_VOID_SPAWN = 25824, - + NPC_KILJAEDEN_CONTROLLER = 25608, NPC_KILJAEDEN = 25315, NPC_ANVEENA = 26046, diff --git a/src/server/scripts/EasternKingdoms/TheStockade/instance_the_stockade.cpp b/src/server/scripts/EasternKingdoms/TheStockade/instance_the_stockade.cpp index 4acc47cc5..d04dd907d 100644 --- a/src/server/scripts/EasternKingdoms/TheStockade/instance_the_stockade.cpp +++ b/src/server/scripts/EasternKingdoms/TheStockade/instance_the_stockade.cpp @@ -7,18 +7,18 @@ class instance_the_stockade : public InstanceMapScript { - public: - instance_the_stockade() : InstanceMapScript("instance_the_stockade", 34) { } +public: + instance_the_stockade() : InstanceMapScript("instance_the_stockade", 34) { } - InstanceScript* GetInstanceScript(InstanceMap* map) const - { - return new instance_the_stockade_InstanceMapScript(map); - } + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_the_stockade_InstanceMapScript(map); + } - struct instance_the_stockade_InstanceMapScript : public InstanceScript - { - instance_the_stockade_InstanceMapScript(Map* map) : InstanceScript(map) { } - }; + struct instance_the_stockade_InstanceMapScript : public InstanceScript + { + instance_the_stockade_InstanceMapScript(Map* map) : InstanceScript(map) { } + }; }; void AddSC_instance_the_stockade() diff --git a/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp b/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp index 0e3fa4d45..3b153c0d6 100644 --- a/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp +++ b/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp @@ -21,214 +21,214 @@ enum Events class instance_uldaman : public InstanceMapScript { - public: - instance_uldaman() : InstanceMapScript("instance_uldaman", 70) { } +public: + instance_uldaman() : InstanceMapScript("instance_uldaman", 70) { } - struct instance_uldaman_InstanceMapScript : public InstanceScript + struct instance_uldaman_InstanceMapScript : public InstanceScript + { + instance_uldaman_InstanceMapScript(Map* map) : InstanceScript(map) { } + + void Initialize() { - instance_uldaman_InstanceMapScript(Map* map) : InstanceScript(map) { } - - void Initialize() - { - memset(&_encounters, 0, sizeof(_encounters)); - archaedasTempleDoorGUID = 0; - ancientVaultDoorGUID = 0; - } - - void OnGameObjectCreate(GameObject* gameobject) - { - switch (gameobject->GetEntry()) - { - case GO_IRONAYA_SEAL_DOOR: - case GO_KEYSTONE: - if (_encounters[DATA_IRONAYA_DOORS] == DONE) - { - HandleGameObject(0, true, gameobject); - gameobject->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - } - break; - case GO_TEMPLE_DOOR: - if (_encounters[DATA_STONE_KEEPERS] == DONE) - HandleGameObject(0, true, gameobject); - break; - case GO_ANCIENT_VAULT_DOOR: - ancientVaultDoorGUID = gameobject->GetGUID(); - if (_encounters[DATA_ARCHAEDAS] == DONE) - HandleGameObject(0, true, gameobject); - break; - case GO_ARCHAEDAS_TEMPLE_DOOR: - archaedasTempleDoorGUID = gameobject->GetGUID(); - break; - } - } - - void SetData(uint32 type, uint32 data) - { - switch (type) - { - case DATA_IRONAYA_DOORS: - case DATA_STONE_KEEPERS: - _encounters[type] = data; - break; - case DATA_ARCHAEDAS: - _encounters[type] = data; - HandleGameObject(ancientVaultDoorGUID, data == DONE, nullptr); - HandleGameObject(archaedasTempleDoorGUID, data != IN_PROGRESS, nullptr); - break; - } - - if (data == DONE) - SaveToDB(); - } - - std::string GetSaveData() - { - std::ostringstream saveStream; - saveStream << "U D " << _encounters[DATA_IRONAYA_DOORS] << ' ' << _encounters[DATA_STONE_KEEPERS] << ' ' << _encounters[DATA_ARCHAEDAS]; - return saveStream.str(); - } - - void Load(const char* in) - { - if (!in) - return; - - char dataHead1, dataHead2; - std::istringstream loadStream(in); - loadStream >> dataHead1 >> dataHead2; - - if (dataHead1 == 'U' && dataHead2 == 'D') - { - for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) - { - loadStream >> _encounters[i]; - if (_encounters[i] == IN_PROGRESS) - _encounters[i] = NOT_STARTED; - } - } - } - - void OnCreatureCreate(Creature* creature) - { - switch (creature->GetEntry()) - { - case NPC_STONE_KEEPER: - if (_encounters[DATA_STONE_KEEPERS] != DONE && !creature->IsAlive()) - creature->Respawn(); - break; - } - } - - private: - uint32 _encounters[MAX_ENCOUNTERS]; - uint64 archaedasTempleDoorGUID; - uint64 ancientVaultDoorGUID; - }; - - InstanceScript* GetInstanceScript(InstanceMap* map) const - { - return new instance_uldaman_InstanceMapScript(map); + memset(&_encounters, 0, sizeof(_encounters)); + archaedasTempleDoorGUID = 0; + ancientVaultDoorGUID = 0; } + + void OnGameObjectCreate(GameObject* gameobject) + { + switch (gameobject->GetEntry()) + { + case GO_IRONAYA_SEAL_DOOR: + case GO_KEYSTONE: + if (_encounters[DATA_IRONAYA_DOORS] == DONE) + { + HandleGameObject(0, true, gameobject); + gameobject->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + } + break; + case GO_TEMPLE_DOOR: + if (_encounters[DATA_STONE_KEEPERS] == DONE) + HandleGameObject(0, true, gameobject); + break; + case GO_ANCIENT_VAULT_DOOR: + ancientVaultDoorGUID = gameobject->GetGUID(); + if (_encounters[DATA_ARCHAEDAS] == DONE) + HandleGameObject(0, true, gameobject); + break; + case GO_ARCHAEDAS_TEMPLE_DOOR: + archaedasTempleDoorGUID = gameobject->GetGUID(); + break; + } + } + + void SetData(uint32 type, uint32 data) + { + switch (type) + { + case DATA_IRONAYA_DOORS: + case DATA_STONE_KEEPERS: + _encounters[type] = data; + break; + case DATA_ARCHAEDAS: + _encounters[type] = data; + HandleGameObject(ancientVaultDoorGUID, data == DONE, nullptr); + HandleGameObject(archaedasTempleDoorGUID, data != IN_PROGRESS, nullptr); + break; + } + + if (data == DONE) + SaveToDB(); + } + + std::string GetSaveData() + { + std::ostringstream saveStream; + saveStream << "U D " << _encounters[DATA_IRONAYA_DOORS] << ' ' << _encounters[DATA_STONE_KEEPERS] << ' ' << _encounters[DATA_ARCHAEDAS]; + return saveStream.str(); + } + + void Load(const char* in) + { + if (!in) + return; + + char dataHead1, dataHead2; + std::istringstream loadStream(in); + loadStream >> dataHead1 >> dataHead2; + + if (dataHead1 == 'U' && dataHead2 == 'D') + { + for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) + { + loadStream >> _encounters[i]; + if (_encounters[i] == IN_PROGRESS) + _encounters[i] = NOT_STARTED; + } + } + } + + void OnCreatureCreate(Creature* creature) + { + switch (creature->GetEntry()) + { + case NPC_STONE_KEEPER: + if (_encounters[DATA_STONE_KEEPERS] != DONE && !creature->IsAlive()) + creature->Respawn(); + break; + } + } + + private: + uint32 _encounters[MAX_ENCOUNTERS]; + uint64 archaedasTempleDoorGUID; + uint64 ancientVaultDoorGUID; + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_uldaman_InstanceMapScript(map); + } }; class spell_uldaman_sub_boss_agro_keepers : public SpellScriptLoader { - public: - spell_uldaman_sub_boss_agro_keepers() : SpellScriptLoader("spell_uldaman_sub_boss_agro_keepers") { } +public: + spell_uldaman_sub_boss_agro_keepers() : SpellScriptLoader("spell_uldaman_sub_boss_agro_keepers") { } - class spell_uldaman_sub_boss_agro_keepers_SpellScript : public SpellScript + class spell_uldaman_sub_boss_agro_keepers_SpellScript : public SpellScript + { + PrepareSpellScript(spell_uldaman_sub_boss_agro_keepers_SpellScript); + + void HandleSendEvent(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_uldaman_sub_boss_agro_keepers_SpellScript); - - void HandleSendEvent(SpellEffIndex /*effIndex*/) - { - if (Creature* keeper = GetCaster()->FindNearestCreature(NPC_STONE_KEEPER, 100.0f, true)) - keeper->AI()->SetData(1, 1); - } - - void Register() - { - OnEffectLaunch += SpellEffectFn(spell_uldaman_sub_boss_agro_keepers_SpellScript::HandleSendEvent, EFFECT_0, SPELL_EFFECT_SEND_EVENT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_uldaman_sub_boss_agro_keepers_SpellScript(); + if (Creature* keeper = GetCaster()->FindNearestCreature(NPC_STONE_KEEPER, 100.0f, true)) + keeper->AI()->SetData(1, 1); } + + void Register() + { + OnEffectLaunch += SpellEffectFn(spell_uldaman_sub_boss_agro_keepers_SpellScript::HandleSendEvent, EFFECT_0, SPELL_EFFECT_SEND_EVENT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_uldaman_sub_boss_agro_keepers_SpellScript(); + } }; class spell_uldaman_stoned : public SpellScriptLoader { - public: - spell_uldaman_stoned() : SpellScriptLoader("spell_uldaman_stoned") { } +public: + spell_uldaman_stoned() : SpellScriptLoader("spell_uldaman_stoned") { } - class spell_uldaman_stoned_AuraScript : public AuraScript + class spell_uldaman_stoned_AuraScript : public AuraScript + { + PrepareAuraScript(spell_uldaman_stoned_AuraScript); + + bool Load() { - PrepareAuraScript(spell_uldaman_stoned_AuraScript); - - bool Load() - { - return GetUnitOwner()->GetTypeId() == TYPEID_UNIT; - } - - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Creature* target = GetUnitOwner()->ToCreature(); - target->SetReactState(REACT_PASSIVE); - target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); - } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Creature* target = GetUnitOwner()->ToCreature(); - target->SetReactState(REACT_AGGRESSIVE); - target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_uldaman_stoned_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_uldaman_stoned_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_uldaman_stoned_AuraScript(); + return GetUnitOwner()->GetTypeId() == TYPEID_UNIT; } + + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Creature* target = GetUnitOwner()->ToCreature(); + target->SetReactState(REACT_PASSIVE); + target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Creature* target = GetUnitOwner()->ToCreature(); + target->SetReactState(REACT_AGGRESSIVE); + target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_uldaman_stoned_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_uldaman_stoned_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_uldaman_stoned_AuraScript(); + } }; class spell_uldaman_boss_agro_archaedas : public SpellScriptLoader { - public: - spell_uldaman_boss_agro_archaedas() : SpellScriptLoader("spell_uldaman_boss_agro_archaedas") { } +public: + spell_uldaman_boss_agro_archaedas() : SpellScriptLoader("spell_uldaman_boss_agro_archaedas") { } - class spell_uldaman_boss_agro_archaedas_SpellScript : public SpellScript + class spell_uldaman_boss_agro_archaedas_SpellScript : public SpellScript + { + PrepareSpellScript(spell_uldaman_boss_agro_archaedas_SpellScript); + + void HandleSendEvent(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_uldaman_boss_agro_archaedas_SpellScript); + InstanceScript* instance = GetCaster()->GetInstanceScript(); + if (!instance || instance->GetData(DATA_ARCHAEDAS) == IN_PROGRESS) + return; - void HandleSendEvent(SpellEffIndex /*effIndex*/) - { - InstanceScript* instance = GetCaster()->GetInstanceScript(); - if (!instance || instance->GetData(DATA_ARCHAEDAS) == IN_PROGRESS) - return; - - instance->SetData(DATA_ARCHAEDAS, IN_PROGRESS); - if (Creature* archaedas = GetCaster()->FindNearestCreature(NPC_ARCHAEDAS, 100.0f, true)) - archaedas->AI()->SetData(1, 1); - } - - void Register() - { - OnEffectLaunch += SpellEffectFn(spell_uldaman_boss_agro_archaedas_SpellScript::HandleSendEvent, EFFECT_0, SPELL_EFFECT_SEND_EVENT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_uldaman_boss_agro_archaedas_SpellScript(); + instance->SetData(DATA_ARCHAEDAS, IN_PROGRESS); + if (Creature* archaedas = GetCaster()->FindNearestCreature(NPC_ARCHAEDAS, 100.0f, true)) + archaedas->AI()->SetData(1, 1); } + + void Register() + { + OnEffectLaunch += SpellEffectFn(spell_uldaman_boss_agro_archaedas_SpellScript::HandleSendEvent, EFFECT_0, SPELL_EFFECT_SEND_EVENT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_uldaman_boss_agro_archaedas_SpellScript(); + } }; void AddSC_instance_uldaman() diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp index c25dac1db..c15f0c082 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp @@ -69,159 +69,159 @@ enum Events class boss_akilzon : public CreatureScript { - public: - boss_akilzon() : CreatureScript("boss_akilzon") { } +public: + boss_akilzon() : CreatureScript("boss_akilzon") { } - struct boss_akilzonAI : public BossAI + struct boss_akilzonAI : public BossAI + { + boss_akilzonAI(Creature* creature) : BossAI(creature, DATA_AKILZONEVENT) { - boss_akilzonAI(Creature* creature) : BossAI(creature, DATA_AKILZONEVENT) + memset(BirdGUIDs, 0, sizeof(BirdGUIDs)); + } + + void Reset() + { + _Reset(); + + TargetGUID = 0; + CloudGUID = 0; + CycloneGUID = 0; + memset(BirdGUIDs, 0, sizeof(BirdGUIDs)); + StormCount = 0; + isRaining = false; + + if (instance) + instance->SetData(DATA_AKILZONEVENT, NOT_STARTED); + + SetWeather(WEATHER_STATE_FINE, 0.0f); + } + + void EnterCombat(Unit* /*who*/) + { + events.ScheduleEvent(EVENT_STATIC_DISRUPTION, urand(10000, 20000)); // 10 to 20 seconds (bosskillers) + events.ScheduleEvent(EVENT_GUST_OF_WIND, urand(20000, 30000)); // 20 to 30 seconds(bosskillers) + events.ScheduleEvent(EVENT_CALL_LIGHTNING, urand(10000, 20000)); // totaly random timer. can't find any info on this + events.ScheduleEvent(EVENT_ELECTRICAL_STORM, 60000); // 60 seconds(bosskillers) + events.ScheduleEvent(EVENT_RAIN, urand(47000, 52000)); + events.ScheduleEvent(EVENT_ENRAGE, 10 * MINUTE * IN_MILLISECONDS); // 10 minutes till enrage(bosskillers) + + Talk(SAY_AGGRO); + //DoZoneInCombat(); + + if (instance) + instance->SetData(DATA_AKILZONEVENT, IN_PROGRESS); + } + + void JustDied(Unit* /*killer*/) + { + Talk(SAY_DEATH); + _JustDied(); + if (instance) + instance->SetData(DATA_AKILZONEVENT, DONE); + } + + void KilledUnit(Unit* who) + { + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_KILL); + } + + void SetWeather(uint32 weather, float grade) + { + Map* map = me->GetMap(); + if (!map->IsDungeon()) + return; + + WorldPacket data(SMSG_WEATHER, (4 + 4 + 4)); + data << uint32(weather) << float(grade) << uint8(0); + + map->SendToPlayers(&data); + } + + void HandleStormSequence(Unit* Cloud) // 1: begin, 2-9: tick, 10: end + { + if (StormCount < 10 && StormCount > 1) { - memset(BirdGUIDs, 0, sizeof(BirdGUIDs)); + // deal damage + int32 bp0 = 800; + for (uint8 i = 2; i < StormCount; ++i) + bp0 *= 2; + + CellCoord p(acore::ComputeCellCoord(me->GetPositionX(), me->GetPositionY())); + Cell cell(p); + cell.SetNoCreate(); + + std::list tempUnitMap; + + { + acore::AnyAoETargetUnitInObjectRangeCheck u_check(me, me, SIZE_OF_GRIDS); + acore::UnitListSearcher searcher(me, tempUnitMap, u_check); + + TypeContainerVisitor, WorldTypeMapContainer > world_unit_searcher(searcher); + TypeContainerVisitor, GridTypeMapContainer > grid_unit_searcher(searcher); + + cell.Visit(p, world_unit_searcher, *me->GetMap(), *me, SIZE_OF_GRIDS); + cell.Visit(p, grid_unit_searcher, *me->GetMap(), *me, SIZE_OF_GRIDS); + } + + // deal damage + for (std::list::const_iterator i = tempUnitMap.begin(); i != tempUnitMap.end(); ++i) + { + if (Unit* target = (*i)) + { + if (Cloud && !Cloud->IsWithinDist(target, 6, false)) + Cloud->CastCustomSpell(target, SPELL_ZAP, &bp0, nullptr, nullptr, true, 0, 0, me->GetGUID()); + } + } + + // visual + float x, y, z; + z = me->GetPositionZ(); + for (uint8 i = 0; i < 5 + rand() % 5; ++i) + { + x = 343.0f + rand() % 60; + y = 1380.0f + rand() % 60; + if (Unit* trigger = me->SummonTrigger(x, y, z, 0, 2000)) + { + trigger->setFaction(35); + trigger->SetMaxHealth(100000); + trigger->SetHealth(100000); + trigger->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + if (Cloud) + Cloud->CastCustomSpell(trigger, /*43661*/SPELL_ZAP, &bp0, nullptr, nullptr, true, 0, 0, Cloud->GetGUID()); + } + } } - void Reset() - { - _Reset(); + ++StormCount; - TargetGUID = 0; + if (StormCount > 10) + { + StormCount = 0; // finish + events.ScheduleEvent(EVENT_SUMMON_EAGLES, 5000); + me->InterruptNonMeleeSpells(false); CloudGUID = 0; - CycloneGUID = 0; - memset(BirdGUIDs, 0, sizeof(BirdGUIDs)); - StormCount = 0; - isRaining = false; - - if (instance) - instance->SetData(DATA_AKILZONEVENT, NOT_STARTED); - + if (Cloud) + Unit::DealDamage(Cloud, Cloud, Cloud->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); SetWeather(WEATHER_STATE_FINE, 0.0f); + isRaining = false; } + events.ScheduleEvent(EVENT_STORM_SEQUENCE, 1000); + } - void EnterCombat(Unit* /*who*/) + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + while (uint32 eventId = events.ExecuteEvent()) { - events.ScheduleEvent(EVENT_STATIC_DISRUPTION, urand(10000, 20000)); // 10 to 20 seconds (bosskillers) - events.ScheduleEvent(EVENT_GUST_OF_WIND, urand(20000, 30000)); // 20 to 30 seconds(bosskillers) - events.ScheduleEvent(EVENT_CALL_LIGHTNING, urand(10000, 20000)); // totaly random timer. can't find any info on this - events.ScheduleEvent(EVENT_ELECTRICAL_STORM, 60000); // 60 seconds(bosskillers) - events.ScheduleEvent(EVENT_RAIN, urand(47000, 52000)); - events.ScheduleEvent(EVENT_ENRAGE, 10*MINUTE*IN_MILLISECONDS); // 10 minutes till enrage(bosskillers) - - Talk(SAY_AGGRO); - //DoZoneInCombat(); - - if (instance) - instance->SetData(DATA_AKILZONEVENT, IN_PROGRESS); - } - - void JustDied(Unit* /*killer*/) - { - Talk(SAY_DEATH); - _JustDied(); - if (instance) - instance->SetData(DATA_AKILZONEVENT, DONE); - } - - void KilledUnit(Unit* who) - { - if (who->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_KILL); - } - - void SetWeather(uint32 weather, float grade) - { - Map* map = me->GetMap(); - if (!map->IsDungeon()) - return; - - WorldPacket data(SMSG_WEATHER, (4+4+4)); - data << uint32(weather) << float(grade) << uint8(0); - - map->SendToPlayers(&data); - } - - void HandleStormSequence(Unit* Cloud) // 1: begin, 2-9: tick, 10: end - { - if (StormCount < 10 && StormCount > 1) + switch (eventId) { - // deal damage - int32 bp0 = 800; - for (uint8 i = 2; i < StormCount; ++i) - bp0 *= 2; - - CellCoord p(acore::ComputeCellCoord(me->GetPositionX(), me->GetPositionY())); - Cell cell(p); - cell.SetNoCreate(); - - std::list tempUnitMap; - - { - acore::AnyAoETargetUnitInObjectRangeCheck u_check(me, me, SIZE_OF_GRIDS); - acore::UnitListSearcher searcher(me, tempUnitMap, u_check); - - TypeContainerVisitor, WorldTypeMapContainer > world_unit_searcher(searcher); - TypeContainerVisitor, GridTypeMapContainer > grid_unit_searcher(searcher); - - cell.Visit(p, world_unit_searcher, *me->GetMap(), *me, SIZE_OF_GRIDS); - cell.Visit(p, grid_unit_searcher, *me->GetMap(), *me, SIZE_OF_GRIDS); - } - - // deal damage - for (std::list::const_iterator i = tempUnitMap.begin(); i != tempUnitMap.end(); ++i) - { - if (Unit* target = (*i)) + case EVENT_STATIC_DISRUPTION: { - if (Cloud && !Cloud->IsWithinDist(target, 6, false)) - Cloud->CastCustomSpell(target, SPELL_ZAP, &bp0, nullptr, nullptr, true, 0, 0, me->GetGUID()); - } - } - - // visual - float x, y, z; - z = me->GetPositionZ(); - for (uint8 i = 0; i < 5+rand()%5; ++i) - { - x = 343.0f+rand()%60; - y = 1380.0f+rand()%60; - if (Unit* trigger = me->SummonTrigger(x, y, z, 0, 2000)) - { - trigger->setFaction(35); - trigger->SetMaxHealth(100000); - trigger->SetHealth(100000); - trigger->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - if (Cloud) - Cloud->CastCustomSpell(trigger, /*43661*/SPELL_ZAP, &bp0, nullptr, nullptr, true, 0, 0, Cloud->GetGUID()); - } - } - } - - ++StormCount; - - if (StormCount > 10) - { - StormCount = 0; // finish - events.ScheduleEvent(EVENT_SUMMON_EAGLES, 5000); - me->InterruptNonMeleeSpells(false); - CloudGUID = 0; - if (Cloud) - Unit::DealDamage(Cloud, Cloud, Cloud->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); - SetWeather(WEATHER_STATE_FINE, 0.0f); - isRaining = false; - } - events.ScheduleEvent(EVENT_STORM_SEQUENCE, 1000); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_STATIC_DISRUPTION: - { Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1); if (!target) target = me->GetVictim(); @@ -235,218 +235,218 @@ class boss_akilzon : public CreatureScript SDisruptAOEVisual_Timer = 1000 + floor(dist / 30 * 1000.0f);*/ events.ScheduleEvent(EVENT_STATIC_DISRUPTION, urand(10000, 18000)); break; - } - case EVENT_GUST_OF_WIND: - { - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1); - if (!target) - target = me->GetVictim(); - if (target) - DoCast(target, SPELL_GUST_OF_WIND); - events.ScheduleEvent(EVENT_GUST_OF_WIND, urand(20000, 30000)); - break; - } - case EVENT_CALL_LIGHTNING: - DoCastVictim(SPELL_CALL_LIGHTNING); - events.ScheduleEvent(EVENT_CALL_LIGHTNING, urand(12000, 17000)); // totaly random timer. can't find any info on this + } + case EVENT_GUST_OF_WIND: + { + Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1); + if (!target) + target = me->GetVictim(); + if (target) + DoCast(target, SPELL_GUST_OF_WIND); + events.ScheduleEvent(EVENT_GUST_OF_WIND, urand(20000, 30000)); break; - case EVENT_ELECTRICAL_STORM: + } + case EVENT_CALL_LIGHTNING: + DoCastVictim(SPELL_CALL_LIGHTNING); + events.ScheduleEvent(EVENT_CALL_LIGHTNING, urand(12000, 17000)); // totaly random timer. can't find any info on this + break; + case EVENT_ELECTRICAL_STORM: + { + Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50, true); + if (!target) { - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50, true); - if (!target) - { - EnterEvadeMode(); - return; - } - target->CastSpell(target, 44007, true); // cloud visual - DoCast(target, SPELL_ELECTRICAL_STORM, false); // storm cyclon + visual - float x, y, z; - target->GetPosition(x, y, z); - /// @todo: fix it in correct way, that causes player to can fly until logout - /* - if (target) - { - target->SetDisableGravity(true); - target->MonsterMoveWithSpeed(x, y, me->GetPositionZ()+15, 0); - } - */ - - Unit* Cloud = me->SummonTrigger(x, y, me->GetPositionZ()+16, 0, 15000); - if (Cloud) - { - CloudGUID = Cloud->GetGUID(); - Cloud->SetDisableGravity(true); - Cloud->StopMoving(); - Cloud->SetObjectScale(1.0f); - Cloud->setFaction(35); - Cloud->SetMaxHealth(9999999); - Cloud->SetHealth(9999999); - Cloud->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - } - StormCount = 1; - events.ScheduleEvent(EVENT_ELECTRICAL_STORM, 60000); // 60 seconds(bosskillers) - events.ScheduleEvent(EVENT_RAIN, urand(47000, 52000)); - break; + EnterEvadeMode(); + return; } - case EVENT_RAIN: - if (!isRaining) - { - SetWeather(WEATHER_STATE_HEAVY_RAIN, 0.9999f); - isRaining = true; - } - else - events.ScheduleEvent(EVENT_RAIN, 1000); - break; - case EVENT_STORM_SEQUENCE: - { - Unit* target = ObjectAccessor::GetUnit(*me, CloudGUID); - if (!target || !target->IsAlive()) - { - EnterEvadeMode(); - return; - } - else if (Unit* Cyclone = ObjectAccessor::GetUnit(*me, CycloneGUID)) - Cyclone->CastSpell(target, SPELL_SAND_STORM, true); // keep casting or... - HandleStormSequence(target); - break; - } - case EVENT_SUMMON_EAGLES: - Talk(SAY_SUMMON); - + target->CastSpell(target, 44007, true); // cloud visual + DoCast(target, SPELL_ELECTRICAL_STORM, false); // storm cyclon + visual float x, y, z; - me->GetPosition(x, y, z); - - for (uint8 i = 0; i < 8; ++i) + target->GetPosition(x, y, z); + /// @todo: fix it in correct way, that causes player to can fly until logout + /* + if (target) { - Unit* bird = ObjectAccessor::GetUnit(*me, BirdGUIDs[i]); - if (!bird) //they despawned on die + target->SetDisableGravity(true); + target->MonsterMoveWithSpeed(x, y, me->GetPositionZ()+15, 0); + } + */ + + Unit* Cloud = me->SummonTrigger(x, y, me->GetPositionZ() + 16, 0, 15000); + if (Cloud) + { + CloudGUID = Cloud->GetGUID(); + Cloud->SetDisableGravity(true); + Cloud->StopMoving(); + Cloud->SetObjectScale(1.0f); + Cloud->setFaction(35); + Cloud->SetMaxHealth(9999999); + Cloud->SetHealth(9999999); + Cloud->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + } + StormCount = 1; + events.ScheduleEvent(EVENT_ELECTRICAL_STORM, 60000); // 60 seconds(bosskillers) + events.ScheduleEvent(EVENT_RAIN, urand(47000, 52000)); + break; + } + case EVENT_RAIN: + if (!isRaining) + { + SetWeather(WEATHER_STATE_HEAVY_RAIN, 0.9999f); + isRaining = true; + } + else + events.ScheduleEvent(EVENT_RAIN, 1000); + break; + case EVENT_STORM_SEQUENCE: + { + Unit* target = ObjectAccessor::GetUnit(*me, CloudGUID); + if (!target || !target->IsAlive()) + { + EnterEvadeMode(); + return; + } + else if (Unit* Cyclone = ObjectAccessor::GetUnit(*me, CycloneGUID)) + Cyclone->CastSpell(target, SPELL_SAND_STORM, true); // keep casting or... + HandleStormSequence(target); + break; + } + case EVENT_SUMMON_EAGLES: + Talk(SAY_SUMMON); + + float x, y, z; + me->GetPosition(x, y, z); + + for (uint8 i = 0; i < 8; ++i) + { + Unit* bird = ObjectAccessor::GetUnit(*me, BirdGUIDs[i]); + if (!bird) //they despawned on die + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - { - x = target->GetPositionX() + irand(-10, 10); - y = target->GetPositionY() + irand(-10, 10); - z = target->GetPositionZ() + urand(16, 20); - if (z > 95) - z = 95.0f - urand(0, 5); - } - Creature* creature = me->SummonCreature(NPC_SOARING_EAGLE, x, y, z, 0, TEMPSUMMON_CORPSE_DESPAWN, 0); - if (creature) - { - creature->AddThreat(me->GetVictim(), 1.0f); - creature->AI()->AttackStart(me->GetVictim()); - BirdGUIDs[i] = creature->GetGUID(); - } + x = target->GetPositionX() + irand(-10, 10); + y = target->GetPositionY() + irand(-10, 10); + z = target->GetPositionZ() + urand(16, 20); + if (z > 95) + z = 95.0f - urand(0, 5); + } + Creature* creature = me->SummonCreature(NPC_SOARING_EAGLE, x, y, z, 0, TEMPSUMMON_CORPSE_DESPAWN, 0); + if (creature) + { + creature->AddThreat(me->GetVictim(), 1.0f); + creature->AI()->AttackStart(me->GetVictim()); + BirdGUIDs[i] = creature->GetGUID(); } } - break; - case EVENT_ENRAGE: - Talk(SAY_ENRAGE); - DoCast(me, SPELL_BERSERK, true); - events.ScheduleEvent(EVENT_ENRAGE, 600000); - break; - default: - break; - } + } + break; + case EVENT_ENRAGE: + Talk(SAY_ENRAGE); + DoCast(me, SPELL_BERSERK, true); + events.ScheduleEvent(EVENT_ENRAGE, 600000); + break; + default: + break; } - - DoMeleeAttackIfReady(); } - private: - uint64 BirdGUIDs[8]; - uint64 TargetGUID; - uint64 CycloneGUID; - uint64 CloudGUID; - uint8 StormCount; - bool isRaining; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + DoMeleeAttackIfReady(); } + + private: + uint64 BirdGUIDs[8]; + uint64 TargetGUID; + uint64 CycloneGUID; + uint64 CloudGUID; + uint8 StormCount; + bool isRaining; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class npc_akilzon_eagle : public CreatureScript { - public: - npc_akilzon_eagle() : CreatureScript("npc_akilzon_eagle") { } +public: + npc_akilzon_eagle() : CreatureScript("npc_akilzon_eagle") { } - struct npc_akilzon_eagleAI : public ScriptedAI + struct npc_akilzon_eagleAI : public ScriptedAI + { + npc_akilzon_eagleAI(Creature* creature) : ScriptedAI(creature) { } + + uint32 EagleSwoop_Timer; + bool arrived; + uint64 TargetGUID; + + void Reset() { - npc_akilzon_eagleAI(Creature* creature) : ScriptedAI(creature) { } - - uint32 EagleSwoop_Timer; - bool arrived; - uint64 TargetGUID; - - void Reset() - { - EagleSwoop_Timer = urand(5000, 10000); - arrived = true; - TargetGUID = 0; - me->SetDisableGravity(true); - } - - void EnterCombat(Unit* /*who*/) - { - DoZoneInCombat(); - } - - void MoveInLineOfSight(Unit* /*who*/) { } - - - void MovementInform(uint32, uint32) - { - arrived = true; - if (TargetGUID) - { - if (Unit* target = ObjectAccessor::GetUnit(*me, TargetGUID)) - DoCast(target, SPELL_EAGLE_SWOOP, true); - TargetGUID = 0; - me->SetSpeed(MOVE_RUN, 1.2f); - EagleSwoop_Timer = urand(5000, 10000); - } - } - - void UpdateAI(uint32 diff) - { - if (EagleSwoop_Timer <= diff) - EagleSwoop_Timer = 0; - else - EagleSwoop_Timer -= diff; - - if (arrived) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - { - float x, y, z; - if (EagleSwoop_Timer) - { - x = target->GetPositionX() + irand(-10, 10); - y = target->GetPositionY() + irand(-10, 10); - z = target->GetPositionZ() + urand(10, 15); - if (z > 95) - z = 95.0f - urand(0, 5); - } - else - { - target->GetContactPoint(me, x, y, z); - z += 2; - me->SetSpeed(MOVE_RUN, 5.0f); - TargetGUID = target->GetGUID(); - } - me->GetMotionMaster()->MovePoint(0, x, y, z); - arrived = false; - } - } - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_akilzon_eagleAI(creature); + EagleSwoop_Timer = urand(5000, 10000); + arrived = true; + TargetGUID = 0; + me->SetDisableGravity(true); } + + void EnterCombat(Unit* /*who*/) + { + DoZoneInCombat(); + } + + void MoveInLineOfSight(Unit* /*who*/) { } + + + void MovementInform(uint32, uint32) + { + arrived = true; + if (TargetGUID) + { + if (Unit* target = ObjectAccessor::GetUnit(*me, TargetGUID)) + DoCast(target, SPELL_EAGLE_SWOOP, true); + TargetGUID = 0; + me->SetSpeed(MOVE_RUN, 1.2f); + EagleSwoop_Timer = urand(5000, 10000); + } + } + + void UpdateAI(uint32 diff) + { + if (EagleSwoop_Timer <= diff) + EagleSwoop_Timer = 0; + else + EagleSwoop_Timer -= diff; + + if (arrived) + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + { + float x, y, z; + if (EagleSwoop_Timer) + { + x = target->GetPositionX() + irand(-10, 10); + y = target->GetPositionY() + irand(-10, 10); + z = target->GetPositionZ() + urand(10, 15); + if (z > 95) + z = 95.0f - urand(0, 5); + } + else + { + target->GetContactPoint(me, x, y, z); + z += 2; + me->SetSpeed(MOVE_RUN, 5.0f); + TargetGUID = target->GetGUID(); + } + me->GetMotionMaster()->MovePoint(0, x, y, z); + arrived = false; + } + } + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_akilzon_eagleAI(creature); + } }; void AddSC_boss_akilzon() diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp index e63fbc495..956ee65dc 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp @@ -55,83 +55,83 @@ enum Yells class boss_halazzi : public CreatureScript { - public: - boss_halazzi() : CreatureScript("boss_halazzi") { } +public: + boss_halazzi() : CreatureScript("boss_halazzi") { } - struct boss_halazziAI : public ScriptedAI + struct boss_halazziAI : public ScriptedAI + { + boss_halazziAI(Creature* creature) : ScriptedAI(creature), summons(me) { - boss_halazziAI(Creature* creature) : ScriptedAI(creature), summons(me) + instance = creature->GetInstanceScript(); + } + + InstanceScript* instance; + SummonList summons; + PhaseHalazzi Phase; + + uint32 FrenzyTimer; + uint32 SaberlashTimer; + uint32 ShockTimer; + uint32 TotemTimer; + uint32 CheckTimer; + uint32 BerserkTimer; + uint32 TransformCount; + + uint64 LynxGUID; + + void Reset() + { + instance->SetData(DATA_HALAZZIEVENT, NOT_STARTED); + summons.DespawnAll(); + + LynxGUID = 0; + TransformCount = 0; + BerserkTimer = 600000; + CheckTimer = 1000; + + DoCast(me, SPELL_DUAL_WIELD, true); + + Phase = PHASE_NONE; + EnterPhase(PHASE_LYNX); + } + + void EnterCombat(Unit* /*who*/) + { + instance->SetData(DATA_HALAZZIEVENT, IN_PROGRESS); + Talk(SAY_AGGRO); + EnterPhase(PHASE_LYNX); + } + + void JustSummoned(Creature* summon) + { + summon->AI()->AttackStart(me->GetVictim()); + if (summon->GetEntry() == NPC_SPIRIT_LYNX) + LynxGUID = summon->GetGUID(); + summons.Summon(summon); + } + + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) + { + if (damage >= me->GetHealth() && Phase != PHASE_ENRAGE) + damage = 0; + } + + void SpellHit(Unit*, const SpellInfo* spell) + { + if (spell->Id == SPELL_TRANSFORM_SPLIT2) + EnterPhase(PHASE_HUMAN); + } + + void AttackStart(Unit* who) + { + if (Phase != PHASE_MERGE) + ScriptedAI::AttackStart(who); + } + + void EnterPhase(PhaseHalazzi NextPhase) + { + switch (NextPhase) { - instance = creature->GetInstanceScript(); - } - - InstanceScript* instance; - SummonList summons; - PhaseHalazzi Phase; - - uint32 FrenzyTimer; - uint32 SaberlashTimer; - uint32 ShockTimer; - uint32 TotemTimer; - uint32 CheckTimer; - uint32 BerserkTimer; - uint32 TransformCount; - - uint64 LynxGUID; - - void Reset() - { - instance->SetData(DATA_HALAZZIEVENT, NOT_STARTED); - summons.DespawnAll(); - - LynxGUID = 0; - TransformCount = 0; - BerserkTimer = 600000; - CheckTimer = 1000; - - DoCast(me, SPELL_DUAL_WIELD, true); - - Phase = PHASE_NONE; - EnterPhase(PHASE_LYNX); - } - - void EnterCombat(Unit* /*who*/) - { - instance->SetData(DATA_HALAZZIEVENT, IN_PROGRESS); - Talk(SAY_AGGRO); - EnterPhase(PHASE_LYNX); - } - - void JustSummoned(Creature* summon) - { - summon->AI()->AttackStart(me->GetVictim()); - if (summon->GetEntry() == NPC_SPIRIT_LYNX) - LynxGUID = summon->GetGUID(); - summons.Summon(summon); - } - - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask) - { - if (damage >= me->GetHealth() && Phase != PHASE_ENRAGE) - damage = 0; - } - - void SpellHit(Unit*, const SpellInfo* spell) - { - if (spell->Id == SPELL_TRANSFORM_SPLIT2) - EnterPhase(PHASE_HUMAN); - } - - void AttackStart(Unit* who) - { - if (Phase != PHASE_MERGE) - ScriptedAI::AttackStart(who); - } - - void EnterPhase(PhaseHalazzi NextPhase) - { - switch (NextPhase) - { case PHASE_LYNX: case PHASE_ENRAGE: if (Phase == PHASE_MERGE) @@ -175,191 +175,201 @@ class boss_halazzi : public CreatureScript break; default: break; - } - Phase = NextPhase; } + Phase = NextPhase; + } - void UpdateAI(uint32 diff) + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + if (BerserkTimer <= diff) { - if (!UpdateVictim()) - return; + Talk(SAY_BERSERK); + DoCast(me, SPELL_BERSERK, true); + BerserkTimer = 60000; + } + else BerserkTimer -= diff; - if (BerserkTimer <= diff) + if (Phase == PHASE_LYNX || Phase == PHASE_ENRAGE) + { + if (SaberlashTimer <= diff) { - Talk(SAY_BERSERK); - DoCast(me, SPELL_BERSERK, true); - BerserkTimer = 60000; - } else BerserkTimer -= diff; - - if (Phase == PHASE_LYNX || Phase == PHASE_ENRAGE) - { - if (SaberlashTimer <= diff) - { - // A tank with more than 490 defense skills should receive no critical hit - //DoCast(me, 41296, true); - DoCastVictim(SPELL_SABER_LASH, true); - //me->RemoveAurasDueToSpell(41296); - SaberlashTimer = 30000; - } else SaberlashTimer -= diff; - - if (FrenzyTimer <= diff) - { - DoCast(me, SPELL_FRENZY); - FrenzyTimer = urand(10000, 15000); - } else FrenzyTimer -= diff; - - if (Phase == PHASE_LYNX) - { - if (CheckTimer <= diff) - { - if (HealthBelowPct(25 * (3 - TransformCount))) - EnterPhase(PHASE_SPLIT); - CheckTimer = 1000; - } else CheckTimer -= diff; - } + // A tank with more than 490 defense skills should receive no critical hit + //DoCast(me, 41296, true); + DoCastVictim(SPELL_SABER_LASH, true); + //me->RemoveAurasDueToSpell(41296); + SaberlashTimer = 30000; } + else SaberlashTimer -= diff; - if (Phase == PHASE_HUMAN || Phase == PHASE_ENRAGE) + if (FrenzyTimer <= diff) { - if (TotemTimer <= diff) - { - DoCast(me, SPELL_SUMMON_TOTEM); - TotemTimer = 20000; - } else TotemTimer -= diff; - - if (ShockTimer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - { - if (target->IsNonMeleeSpellCast(false)) - DoCast(target, SPELL_EARTHSHOCK); - else - DoCast(target, SPELL_FLAMESHOCK); - ShockTimer = urand(10000, 15000); - } - } else ShockTimer -= diff; - - if (Phase == PHASE_HUMAN) - { - if (CheckTimer <= diff) - { - if (!HealthAbovePct(20) /*HealthBelowPct(10)*/) - EnterPhase(PHASE_MERGE); - else - { - Unit* Lynx = ObjectAccessor::GetUnit(*me, LynxGUID); - if (Lynx && !Lynx->HealthAbovePct(20) /*Lynx->HealthBelowPct(10)*/) - EnterPhase(PHASE_MERGE); - } - CheckTimer = 1000; - } else CheckTimer -= diff; - } + DoCast(me, SPELL_FRENZY); + FrenzyTimer = urand(10000, 15000); } + else FrenzyTimer -= diff; - if (Phase == PHASE_MERGE) + if (Phase == PHASE_LYNX) { if (CheckTimer <= diff) { - Unit* Lynx = ObjectAccessor::GetUnit(*me, LynxGUID); - if (Lynx) + if (HealthBelowPct(25 * (3 - TransformCount))) + EnterPhase(PHASE_SPLIT); + CheckTimer = 1000; + } + else CheckTimer -= diff; + } + } + + if (Phase == PHASE_HUMAN || Phase == PHASE_ENRAGE) + { + if (TotemTimer <= diff) + { + DoCast(me, SPELL_SUMMON_TOTEM); + TotemTimer = 20000; + } + else TotemTimer -= diff; + + if (ShockTimer <= diff) + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + { + if (target->IsNonMeleeSpellCast(false)) + DoCast(target, SPELL_EARTHSHOCK); + else + DoCast(target, SPELL_FLAMESHOCK); + ShockTimer = urand(10000, 15000); + } + } + else ShockTimer -= diff; + + if (Phase == PHASE_HUMAN) + { + if (CheckTimer <= diff) + { + if (!HealthAbovePct(20) /*HealthBelowPct(10)*/) + EnterPhase(PHASE_MERGE); + else { - Lynx->GetMotionMaster()->MoveFollow(me, 0, 0); - me->GetMotionMaster()->MoveFollow(Lynx, 0, 0); - if (me->IsWithinDistInMap(Lynx, 6.0f)) - { - if (TransformCount < 3) - EnterPhase(PHASE_LYNX); - else - EnterPhase(PHASE_ENRAGE); - } + Unit* Lynx = ObjectAccessor::GetUnit(*me, LynxGUID); + if (Lynx && !Lynx->HealthAbovePct(20) /*Lynx->HealthBelowPct(10)*/) + EnterPhase(PHASE_MERGE); } CheckTimer = 1000; - } else CheckTimer -= diff; + } + else CheckTimer -= diff; } - - DoMeleeAttackIfReady(); } - void KilledUnit(Unit* victim) + if (Phase == PHASE_MERGE) { - if (victim->GetTypeId() != TYPEID_PLAYER) - return; - - Talk(SAY_KILL); + if (CheckTimer <= diff) + { + Unit* Lynx = ObjectAccessor::GetUnit(*me, LynxGUID); + if (Lynx) + { + Lynx->GetMotionMaster()->MoveFollow(me, 0, 0); + me->GetMotionMaster()->MoveFollow(Lynx, 0, 0); + if (me->IsWithinDistInMap(Lynx, 6.0f)) + { + if (TransformCount < 3) + EnterPhase(PHASE_LYNX); + else + EnterPhase(PHASE_ENRAGE); + } + } + CheckTimer = 1000; + } + else CheckTimer -= diff; } - void JustDied(Unit* /*killer*/) - { - instance->SetData(DATA_HALAZZIEVENT, DONE); - Talk(SAY_DEATH); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + DoMeleeAttackIfReady(); } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() != TYPEID_PLAYER) + return; + + Talk(SAY_KILL); + } + + void JustDied(Unit* /*killer*/) + { + instance->SetData(DATA_HALAZZIEVENT, DONE); + Talk(SAY_DEATH); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; // Spirits Lynx AI class npc_halazzi_lynx : public CreatureScript { - public: - npc_halazzi_lynx() : CreatureScript("npc_halazzi_lynx") { } +public: + npc_halazzi_lynx() : CreatureScript("npc_halazzi_lynx") { } - struct npc_halazzi_lynxAI : public ScriptedAI + struct npc_halazzi_lynxAI : public ScriptedAI + { + npc_halazzi_lynxAI(Creature* creature) : ScriptedAI(creature) { } + + uint32 FrenzyTimer; + uint32 shredder_timer; + + void Reset() { - npc_halazzi_lynxAI(Creature* creature) : ScriptedAI(creature) { } + FrenzyTimer = urand(30000, 50000); //frenzy every 30-50 seconds + shredder_timer = 4000; + } - uint32 FrenzyTimer; - uint32 shredder_timer; + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) + { + if (damage >= me->GetHealth()) + damage = 0; + } - void Reset() + void AttackStart(Unit* who) + { + if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) + ScriptedAI::AttackStart(who); + } + + void EnterCombat(Unit* /*who*/) {/*DoZoneInCombat();*/ } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + if (FrenzyTimer <= diff) { + DoCast(me, SPELL_LYNX_FRENZY); FrenzyTimer = urand(30000, 50000); //frenzy every 30-50 seconds + } + else FrenzyTimer -= diff; + + if (shredder_timer <= diff) + { + DoCastVictim(SPELL_SHRED_ARMOR); shredder_timer = 4000; } + else shredder_timer -= diff; - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask) - { - if (damage >= me->GetHealth()) - damage = 0; - } - - void AttackStart(Unit* who) - { - if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) - ScriptedAI::AttackStart(who); - } - - void EnterCombat(Unit* /*who*/) {/*DoZoneInCombat();*/ } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - if (FrenzyTimer <= diff) - { - DoCast(me, SPELL_LYNX_FRENZY); - FrenzyTimer = urand(30000, 50000); //frenzy every 30-50 seconds - } else FrenzyTimer -= diff; - - if (shredder_timer <= diff) - { - DoCastVictim(SPELL_SHRED_ARMOR); - shredder_timer = 4000; - } else shredder_timer -= diff; - - DoMeleeAttackIfReady(); - } - - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_halazzi_lynxAI(creature); + DoMeleeAttackIfReady(); } + + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_halazzi_lynxAI(creature); + } }; void AddSC_boss_halazzi() diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp index 80688dd01..8fa85639a 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp @@ -123,7 +123,7 @@ enum Spells static float Pos_X[4] = {112.8827f, 107.8827f, 122.8827f, 127.8827f}; -static uint32 AddEntryList[8]= +static uint32 AddEntryList[8] = { 24240, //Alyson Antille 24241, //Thurg @@ -155,45 +155,55 @@ struct PlayerAbilityStruct static PlayerAbilityStruct PlayerAbility[][3] = { // 1 warrior - {{SPELL_WR_SPELL_REFLECT, ABILITY_TARGET_SELF, 10000}, - {SPELL_WR_WHIRLWIND, ABILITY_TARGET_SELF, 10000}, - {SPELL_WR_MORTAL_STRIKE, ABILITY_TARGET_VICTIM, 6000}}, + { {SPELL_WR_SPELL_REFLECT, ABILITY_TARGET_SELF, 10000}, + {SPELL_WR_WHIRLWIND, ABILITY_TARGET_SELF, 10000}, + {SPELL_WR_MORTAL_STRIKE, ABILITY_TARGET_VICTIM, 6000} + }, // 2 paladin - {{SPELL_PA_CONSECRATION, ABILITY_TARGET_SELF, 10000}, - {SPELL_PA_HOLY_LIGHT, ABILITY_TARGET_HEAL, 10000}, - {SPELL_PA_AVENGING_WRATH, ABILITY_TARGET_SELF, 10000}}, + { {SPELL_PA_CONSECRATION, ABILITY_TARGET_SELF, 10000}, + {SPELL_PA_HOLY_LIGHT, ABILITY_TARGET_HEAL, 10000}, + {SPELL_PA_AVENGING_WRATH, ABILITY_TARGET_SELF, 10000} + }, // 3 hunter - {{SPELL_HU_EXPLOSIVE_TRAP, ABILITY_TARGET_SELF, 10000}, - {SPELL_HU_FREEZING_TRAP, ABILITY_TARGET_SELF, 10000}, - {SPELL_HU_SNAKE_TRAP, ABILITY_TARGET_SELF, 10000}}, + { {SPELL_HU_EXPLOSIVE_TRAP, ABILITY_TARGET_SELF, 10000}, + {SPELL_HU_FREEZING_TRAP, ABILITY_TARGET_SELF, 10000}, + {SPELL_HU_SNAKE_TRAP, ABILITY_TARGET_SELF, 10000} + }, // 4 rogue - {{SPELL_RO_WOUND_POISON, ABILITY_TARGET_VICTIM, 3000}, - {SPELL_RO_SLICE_DICE, ABILITY_TARGET_SELF, 10000}, - {SPELL_RO_BLIND, ABILITY_TARGET_ENEMY, 10000}}, + { {SPELL_RO_WOUND_POISON, ABILITY_TARGET_VICTIM, 3000}, + {SPELL_RO_SLICE_DICE, ABILITY_TARGET_SELF, 10000}, + {SPELL_RO_BLIND, ABILITY_TARGET_ENEMY, 10000} + }, // 5 priest - {{SPELL_PR_PAIN_SUPP, ABILITY_TARGET_HEAL, 10000}, - {SPELL_PR_HEAL, ABILITY_TARGET_HEAL, 10000}, - {SPELL_PR_PSYCHIC_SCREAM, ABILITY_TARGET_SELF, 10000}}, + { {SPELL_PR_PAIN_SUPP, ABILITY_TARGET_HEAL, 10000}, + {SPELL_PR_HEAL, ABILITY_TARGET_HEAL, 10000}, + {SPELL_PR_PSYCHIC_SCREAM, ABILITY_TARGET_SELF, 10000} + }, // 5* shadow priest - {{SPELL_PR_MIND_CONTROL, ABILITY_TARGET_ENEMY, 15000}, - {SPELL_PR_MIND_BLAST, ABILITY_TARGET_ENEMY, 5000}, - {SPELL_PR_SW_DEATH, ABILITY_TARGET_ENEMY, 10000}}, + { {SPELL_PR_MIND_CONTROL, ABILITY_TARGET_ENEMY, 15000}, + {SPELL_PR_MIND_BLAST, ABILITY_TARGET_ENEMY, 5000}, + {SPELL_PR_SW_DEATH, ABILITY_TARGET_ENEMY, 10000} + }, // 7 shaman - {{SPELL_SH_FIRE_NOVA, ABILITY_TARGET_SELF, 10000}, - {SPELL_SH_HEALING_WAVE, ABILITY_TARGET_HEAL, 10000}, - {SPELL_SH_CHAIN_LIGHT, ABILITY_TARGET_ENEMY, 8000}}, + { {SPELL_SH_FIRE_NOVA, ABILITY_TARGET_SELF, 10000}, + {SPELL_SH_HEALING_WAVE, ABILITY_TARGET_HEAL, 10000}, + {SPELL_SH_CHAIN_LIGHT, ABILITY_TARGET_ENEMY, 8000} + }, // 8 mage - {{SPELL_MG_FIREBALL, ABILITY_TARGET_ENEMY, 5000}, - {SPELL_MG_FROSTBOLT, ABILITY_TARGET_ENEMY, 5000}, - {SPELL_MG_ICE_LANCE, ABILITY_TARGET_SPECIAL, 2000}}, + { {SPELL_MG_FIREBALL, ABILITY_TARGET_ENEMY, 5000}, + {SPELL_MG_FROSTBOLT, ABILITY_TARGET_ENEMY, 5000}, + {SPELL_MG_ICE_LANCE, ABILITY_TARGET_SPECIAL, 2000} + }, // 9 warlock - {{SPELL_WL_CURSE_OF_DOOM, ABILITY_TARGET_ENEMY, 10000}, - {SPELL_WL_RAIN_OF_FIRE, ABILITY_TARGET_ENEMY, 10000}, - {SPELL_WL_UNSTABLE_AFFL, ABILITY_TARGET_ENEMY, 10000}}, + { {SPELL_WL_CURSE_OF_DOOM, ABILITY_TARGET_ENEMY, 10000}, + {SPELL_WL_RAIN_OF_FIRE, ABILITY_TARGET_ENEMY, 10000}, + {SPELL_WL_UNSTABLE_AFFL, ABILITY_TARGET_ENEMY, 10000} + }, // 11 druid - {{SPELL_DR_LIFEBLOOM, ABILITY_TARGET_HEAL, 10000}, - {SPELL_DR_THORNS, ABILITY_TARGET_SELF, 10000}, - {SPELL_DR_MOONFIRE, ABILITY_TARGET_ENEMY, 8000}} + { {SPELL_DR_LIFEBLOOM, ABILITY_TARGET_HEAL, 10000}, + {SPELL_DR_THORNS, ABILITY_TARGET_SELF, 10000}, + {SPELL_DR_MOONFIRE, ABILITY_TARGET_ENEMY, 8000} + } }; struct boss_hexlord_addAI : public ScriptedAI @@ -226,420 +236,429 @@ struct boss_hexlord_addAI : public ScriptedAI class boss_hexlord_malacrass : public CreatureScript { - public: +public: - boss_hexlord_malacrass() - : CreatureScript("boss_hexlord_malacrass") + boss_hexlord_malacrass() + : CreatureScript("boss_hexlord_malacrass") + { + } + + struct boss_hex_lord_malacrassAI : public ScriptedAI + { + boss_hex_lord_malacrassAI(Creature* creature) : ScriptedAI(creature) { + instance = creature->GetInstanceScript(); + SelectAddEntry(); + for (uint8 i = 0; i < 4; ++i) + AddGUID[i] = 0; } - struct boss_hex_lord_malacrassAI : public ScriptedAI + InstanceScript* instance; + + uint64 AddGUID[4]; + uint32 AddEntry[4]; + + uint64 PlayerGUID; + + uint32 SpiritBolts_Timer; + uint32 DrainPower_Timer; + uint32 SiphonSoul_Timer; + uint32 PlayerAbility_Timer; + uint32 CheckAddState_Timer; + uint32 ResetTimer; + + uint32 PlayerClass; + + void Reset() override { - boss_hex_lord_malacrassAI(Creature* creature) : ScriptedAI(creature) + instance->SetData(DATA_HEXLORDEVENT, NOT_STARTED); + + SpiritBolts_Timer = 20000; + DrainPower_Timer = 60000; + SiphonSoul_Timer = 100000; + PlayerAbility_Timer = 99999; + CheckAddState_Timer = 5000; + ResetTimer = 5000; + + SpawnAdds(); + + me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 46916); + me->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE); + } + + void EnterCombat(Unit* /*who*/) override + { + instance->SetData(DATA_HEXLORDEVENT, IN_PROGRESS); + + DoZoneInCombat(); + Talk(SAY_AGGRO); + + for (uint8 i = 0; i < 4; ++i) { - instance = creature->GetInstanceScript(); - SelectAddEntry(); - for (uint8 i = 0; i < 4; ++i) - AddGUID[i] = 0; - } - - InstanceScript* instance; - - uint64 AddGUID[4]; - uint32 AddEntry[4]; - - uint64 PlayerGUID; - - uint32 SpiritBolts_Timer; - uint32 DrainPower_Timer; - uint32 SiphonSoul_Timer; - uint32 PlayerAbility_Timer; - uint32 CheckAddState_Timer; - uint32 ResetTimer; - - uint32 PlayerClass; - - void Reset() override - { - instance->SetData(DATA_HEXLORDEVENT, NOT_STARTED); - - SpiritBolts_Timer = 20000; - DrainPower_Timer = 60000; - SiphonSoul_Timer = 100000; - PlayerAbility_Timer = 99999; - CheckAddState_Timer = 5000; - ResetTimer = 5000; - - SpawnAdds(); - - me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 46916); - me->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE); - } - - void EnterCombat(Unit* /*who*/) override - { - instance->SetData(DATA_HEXLORDEVENT, IN_PROGRESS); - - DoZoneInCombat(); - Talk(SAY_AGGRO); - - for (uint8 i = 0; i < 4; ++i) + Creature* creature = ObjectAccessor::GetCreature(*me, AddGUID[i]); + if (creature && creature->IsAlive()) + creature->AI()->AttackStart(me->GetVictim()); + else { - Creature* creature = ObjectAccessor::GetCreature(*me, AddGUID[i]); - if (creature && creature->IsAlive()) - creature->AI()->AttackStart(me->GetVictim()); - else - { - EnterEvadeMode(); - break; - } + EnterEvadeMode(); + break; } } + } - void KilledUnit(Unit* /*victim*/) override + void KilledUnit(Unit* /*victim*/) override + { + switch (urand(0, 1)) { - switch (urand(0, 1)) + case 0: + Talk(SAY_KILL_ONE); + break; + case 1: + Talk(SAY_KILL_TWO); + break; + } + } + + void JustDied(Unit* /*killer*/) override + { + instance->SetData(DATA_HEXLORDEVENT, DONE); + + Talk(SAY_DEATH); + + for (uint8 i = 0; i < 4; ++i) + { + Unit* Temp = ObjectAccessor::GetUnit(*me, AddGUID[i]); + if (Temp && Temp->IsAlive()) + Unit::DealDamage(Temp, Temp, Temp->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); + } + } + + void SelectAddEntry() + { + std::vector AddList; + + for (uint8 i = 0; i < 8; ++i) + AddList.push_back(AddEntryList[i]); + + while (AddList.size() > 4) + AddList.erase(AddList.begin() + rand() % AddList.size()); + + uint8 i = 0; + for (std::vector::const_iterator itr = AddList.begin(); itr != AddList.end(); ++itr, ++i) + AddEntry[i] = *itr; + } + + void SpawnAdds() + { + for (uint8 i = 0; i < 4; ++i) + { + Creature* creature = (ObjectAccessor::GetCreature((*me), AddGUID[i])); + if (!creature || !creature->IsAlive()) { - case 0: - Talk(SAY_KILL_ONE); - break; - case 1: - Talk(SAY_KILL_TWO); - break; + if (creature) creature->setDeathState(DEAD); + creature = me->SummonCreature(AddEntry[i], Pos_X[i], POS_Y, POS_Z, ORIENT, TEMPSUMMON_DEAD_DESPAWN, 0); + if (creature) AddGUID[i] = creature->GetGUID(); + } + else + { + creature->AI()->EnterEvadeMode(); + creature->SetPosition(Pos_X[i], POS_Y, POS_Z, ORIENT); + creature->StopMovingOnCurrentPos(); } } + } - void JustDied(Unit* /*killer*/) override + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + if (ResetTimer <= diff) { - instance->SetData(DATA_HEXLORDEVENT, DONE); - - Talk(SAY_DEATH); - - for (uint8 i = 0; i < 4; ++i) + if (me->IsWithinDist3d(119.223f, 1035.45f, 29.4481f, 10)) { - Unit* Temp = ObjectAccessor::GetUnit(*me, AddGUID[i]); - if (Temp && Temp->IsAlive()) - Unit::DealDamage(Temp, Temp, Temp->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); - } - } - - void SelectAddEntry() - { - std::vector AddList; - - for (uint8 i = 0; i < 8; ++i) - AddList.push_back(AddEntryList[i]); - - while (AddList.size() > 4) - AddList.erase(AddList.begin()+rand()%AddList.size()); - - uint8 i = 0; - for (std::vector::const_iterator itr = AddList.begin(); itr != AddList.end(); ++itr, ++i) - AddEntry[i] = *itr; - } - - void SpawnAdds() - { - for (uint8 i = 0; i < 4; ++i) - { - Creature* creature = (ObjectAccessor::GetCreature((*me), AddGUID[i])); - if (!creature || !creature->IsAlive()) - { - if (creature) creature->setDeathState(DEAD); - creature = me->SummonCreature(AddEntry[i], Pos_X[i], POS_Y, POS_Z, ORIENT, TEMPSUMMON_DEAD_DESPAWN, 0); - if (creature) AddGUID[i] = creature->GetGUID(); - } - else - { - creature->AI()->EnterEvadeMode(); - creature->SetPosition(Pos_X[i], POS_Y, POS_Z, ORIENT); - creature->StopMovingOnCurrentPos(); - } - } - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) + EnterEvadeMode(); return; - - if (ResetTimer <= diff) - { - if (me->IsWithinDist3d(119.223f, 1035.45f, 29.4481f, 10)) - { - EnterEvadeMode(); - return; - } - ResetTimer = 5000; - } else ResetTimer -= diff; - - if (CheckAddState_Timer <= diff) - { - for (uint8 i = 0; i < 4; ++i) - if (Creature* temp = ObjectAccessor::GetCreature(*me, AddGUID[i])) - if (temp->IsAlive() && !temp->GetVictim()) - temp->AI()->AttackStart(me->GetVictim()); - - CheckAddState_Timer = 5000; - } else CheckAddState_Timer -= diff; - - if (DrainPower_Timer <= diff) - { - DoCast(me, SPELL_DRAIN_POWER, true); - Talk(SAY_DRAIN_POWER); - DrainPower_Timer = urand(40000, 55000); // must cast in 60 sec, or buff/debuff will disappear - } else DrainPower_Timer -= diff; - - if (SpiritBolts_Timer <= diff) - { - if (DrainPower_Timer < 12000) // channel 10 sec - SpiritBolts_Timer = 13000; // cast drain power first - else - { - DoCast(me, SPELL_SPIRIT_BOLTS, false); - Talk(SAY_SPIRIT_BOLTS); - SpiritBolts_Timer = 40000; - SiphonSoul_Timer = 10000; // ready to drain - PlayerAbility_Timer = 99999; - } - } else SpiritBolts_Timer -= diff; - - if (SiphonSoul_Timer <= diff) - { - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 70, true); - Unit* trigger = DoSpawnCreature(NPC_TEMP_TRIGGER, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 30000); - if (!target || !trigger) - { - EnterEvadeMode(); - return; - } - else - { - trigger->SetDisplayId(11686); - trigger->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - trigger->CastSpell(target, SPELL_SIPHON_SOUL, true); - trigger->GetMotionMaster()->MoveChase(me); - - //DoCast(target, SPELL_SIPHON_SOUL, true); - //me->SetUInt64Value(UNIT_FIELD_CHANNEL_OBJECT, target->GetGUID()); - //me->SetUInt32Value(UNIT_CHANNEL_SPELL, SPELL_SIPHON_SOUL); - - PlayerGUID = target->GetGUID(); - PlayerAbility_Timer = urand(8000, 10000); - PlayerClass = target->getClass() - 1; - - if (PlayerClass == CLASS_DRUID-1) - PlayerClass = CLASS_DRUID; - else if (PlayerClass == CLASS_PRIEST-1 && target->HasSpell(15473)) - PlayerClass = CLASS_PRIEST; // shadow priest - - SiphonSoul_Timer = 99999; // buff lasts 30 sec - } - } else SiphonSoul_Timer -= diff; - - if (PlayerAbility_Timer <= diff) - { - //Unit* target = ObjectAccessor::GetUnit(*me, PlayerGUID); - //if (target && target->IsAlive()) - //{ - UseAbility(); - PlayerAbility_Timer = urand(8000, 10000); - //} - } else PlayerAbility_Timer -= diff; - - DoMeleeAttackIfReady(); - } - - void UseAbility() - { - uint8 random = urand(0, 2); - Unit* target = nullptr; - switch (PlayerAbility[PlayerClass][random].target) - { - case ABILITY_TARGET_SELF: - target = me; - break; - case ABILITY_TARGET_VICTIM: - target = me->GetVictim(); - break; - case ABILITY_TARGET_ENEMY: - default: - target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); - break; - case ABILITY_TARGET_HEAL: - target = DoSelectLowestHpFriendly(50, 0); - break; - case ABILITY_TARGET_BUFF: - { - std::list templist = DoFindFriendlyMissingBuff(50, PlayerAbility[PlayerClass][random].spell); - if (!templist.empty()) - target = *(templist.begin()); - } - break; } - if (target) - DoCast(target, PlayerAbility[PlayerClass][random].spell, false); + ResetTimer = 5000; } - }; + else ResetTimer -= diff; - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(creature); + if (CheckAddState_Timer <= diff) + { + for (uint8 i = 0; i < 4; ++i) + if (Creature* temp = ObjectAccessor::GetCreature(*me, AddGUID[i])) + if (temp->IsAlive() && !temp->GetVictim()) + temp->AI()->AttackStart(me->GetVictim()); + + CheckAddState_Timer = 5000; + } + else CheckAddState_Timer -= diff; + + if (DrainPower_Timer <= diff) + { + DoCast(me, SPELL_DRAIN_POWER, true); + Talk(SAY_DRAIN_POWER); + DrainPower_Timer = urand(40000, 55000); // must cast in 60 sec, or buff/debuff will disappear + } + else DrainPower_Timer -= diff; + + if (SpiritBolts_Timer <= diff) + { + if (DrainPower_Timer < 12000) // channel 10 sec + SpiritBolts_Timer = 13000; // cast drain power first + else + { + DoCast(me, SPELL_SPIRIT_BOLTS, false); + Talk(SAY_SPIRIT_BOLTS); + SpiritBolts_Timer = 40000; + SiphonSoul_Timer = 10000; // ready to drain + PlayerAbility_Timer = 99999; + } + } + else SpiritBolts_Timer -= diff; + + if (SiphonSoul_Timer <= diff) + { + Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 70, true); + Unit* trigger = DoSpawnCreature(NPC_TEMP_TRIGGER, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 30000); + if (!target || !trigger) + { + EnterEvadeMode(); + return; + } + else + { + trigger->SetDisplayId(11686); + trigger->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + trigger->CastSpell(target, SPELL_SIPHON_SOUL, true); + trigger->GetMotionMaster()->MoveChase(me); + + //DoCast(target, SPELL_SIPHON_SOUL, true); + //me->SetUInt64Value(UNIT_FIELD_CHANNEL_OBJECT, target->GetGUID()); + //me->SetUInt32Value(UNIT_CHANNEL_SPELL, SPELL_SIPHON_SOUL); + + PlayerGUID = target->GetGUID(); + PlayerAbility_Timer = urand(8000, 10000); + PlayerClass = target->getClass() - 1; + + if (PlayerClass == CLASS_DRUID - 1) + PlayerClass = CLASS_DRUID; + else if (PlayerClass == CLASS_PRIEST - 1 && target->HasSpell(15473)) + PlayerClass = CLASS_PRIEST; // shadow priest + + SiphonSoul_Timer = 99999; // buff lasts 30 sec + } + } + else SiphonSoul_Timer -= diff; + + if (PlayerAbility_Timer <= diff) + { + //Unit* target = ObjectAccessor::GetUnit(*me, PlayerGUID); + //if (target && target->IsAlive()) + //{ + UseAbility(); + PlayerAbility_Timer = urand(8000, 10000); + //} + } + else PlayerAbility_Timer -= diff; + + DoMeleeAttackIfReady(); } + + void UseAbility() + { + uint8 random = urand(0, 2); + Unit* target = nullptr; + switch (PlayerAbility[PlayerClass][random].target) + { + case ABILITY_TARGET_SELF: + target = me; + break; + case ABILITY_TARGET_VICTIM: + target = me->GetVictim(); + break; + case ABILITY_TARGET_ENEMY: + default: + target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); + break; + case ABILITY_TARGET_HEAL: + target = DoSelectLowestHpFriendly(50, 0); + break; + case ABILITY_TARGET_BUFF: + { + std::list templist = DoFindFriendlyMissingBuff(50, PlayerAbility[PlayerClass][random].spell); + if (!templist.empty()) + target = *(templist.begin()); + } + break; + } + if (target) + DoCast(target, PlayerAbility[PlayerClass][random].spell, false); + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI(creature); + } }; class boss_thurg : public CreatureScript { - public: +public: - boss_thurg() - : CreatureScript("boss_thurg") + boss_thurg() + : CreatureScript("boss_thurg") + { + } + + struct boss_thurgAI : public boss_hexlord_addAI + { + + boss_thurgAI(Creature* creature) : boss_hexlord_addAI(creature) { } + + uint32 bloodlust_timer; + uint32 cleave_timer; + + void Reset() override { + bloodlust_timer = 15000; + cleave_timer = 10000; + + boss_hexlord_addAI::Reset(); } - struct boss_thurgAI : public boss_hexlord_addAI + void UpdateAI(uint32 diff) override { + if (!UpdateVictim()) + return; - boss_thurgAI(Creature* creature) : boss_hexlord_addAI(creature) { } - - uint32 bloodlust_timer; - uint32 cleave_timer; - - void Reset() override + if (bloodlust_timer <= diff) { - bloodlust_timer = 15000; - cleave_timer = 10000; - - boss_hexlord_addAI::Reset(); + std::list templist = DoFindFriendlyMissingBuff(50, SPELL_BLOODLUST); + if (!templist.empty()) + { + if (Unit* target = *(templist.begin())) + DoCast(target, SPELL_BLOODLUST, false); + } + bloodlust_timer = 12000; } + else bloodlust_timer -= diff; - void UpdateAI(uint32 diff) override + if (cleave_timer <= diff) { - if (!UpdateVictim()) - return; - - if (bloodlust_timer <= diff) - { - std::list templist = DoFindFriendlyMissingBuff(50, SPELL_BLOODLUST); - if (!templist.empty()) - { - if (Unit* target = *(templist.begin())) - DoCast(target, SPELL_BLOODLUST, false); - } - bloodlust_timer = 12000; - } else bloodlust_timer -= diff; - - if (cleave_timer <= diff) - { - DoCastVictim(SPELL_CLEAVE, false); - cleave_timer = 12000; //3 sec cast - } else cleave_timer -= diff; - - boss_hexlord_addAI::UpdateAI(diff); + DoCastVictim(SPELL_CLEAVE, false); + cleave_timer = 12000; //3 sec cast } - }; + else cleave_timer -= diff; - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(creature); + boss_hexlord_addAI::UpdateAI(diff); } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI(creature); + } }; class boss_alyson_antille : public CreatureScript { - public: +public: - boss_alyson_antille() - : CreatureScript("boss_alyson_antille") + boss_alyson_antille() + : CreatureScript("boss_alyson_antille") + { + } + + struct boss_alyson_antilleAI : public boss_hexlord_addAI + { + //Holy Priest + boss_alyson_antilleAI(Creature* creature) : boss_hexlord_addAI(creature) { } + + uint32 flashheal_timer; + uint32 dispelmagic_timer; + + void Reset() override { + flashheal_timer = 2500; + dispelmagic_timer = 10000; + + //AcquireGUID(); + + boss_hexlord_addAI::Reset(); } - struct boss_alyson_antilleAI : public boss_hexlord_addAI + void AttackStart(Unit* who) override { - //Holy Priest - boss_alyson_antilleAI(Creature* creature) : boss_hexlord_addAI(creature) { } + if (!who) + return; - uint32 flashheal_timer; - uint32 dispelmagic_timer; - - void Reset() override + if (who->isTargetableForAttack()) { - flashheal_timer = 2500; - dispelmagic_timer = 10000; - - //AcquireGUID(); - - boss_hexlord_addAI::Reset(); - } - - void AttackStart(Unit* who) override - { - if (!who) - return; - - if (who->isTargetableForAttack()) + if (me->Attack(who, false)) { - if (me->Attack(who, false)) - { - me->GetMotionMaster()->MoveChase(who, 20); - me->AddThreat(who, 0.0f); - } + me->GetMotionMaster()->MoveChase(who, 20); + me->AddThreat(who, 0.0f); } } + } - void UpdateAI(uint32 diff) override + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + if (flashheal_timer <= diff) { - if (!UpdateVictim()) - return; - - if (flashheal_timer <= diff) + Unit* target = DoSelectLowestHpFriendly(99, 30000); + if (target) { - Unit* target = DoSelectLowestHpFriendly(99, 30000); - if (target) - { - if (target->IsWithinDistInMap(me, 50)) - DoCast(target, SPELL_FLASH_HEAL, false); - else - { - // bugged - //me->GetMotionMaster()->Clear(); - //me->GetMotionMaster()->MoveChase(target, 20); - } - } + if (target->IsWithinDistInMap(me, 50)) + DoCast(target, SPELL_FLASH_HEAL, false); else { - if (urand(0, 1)) - target = DoSelectLowestHpFriendly(50, 0); - else - target = SelectTarget(SELECT_TARGET_RANDOM, 0); - if (target) - DoCast(target, SPELL_DISPEL_MAGIC, false); + // bugged + //me->GetMotionMaster()->Clear(); + //me->GetMotionMaster()->MoveChase(target, 20); } - flashheal_timer = 2500; - } else flashheal_timer -= diff; - - /*if (dispelmagic_timer <= diff) - { - if (urand(0, 1)) - { - Unit* target = SelectTarget(); - - DoCast(target, SPELL_DISPEL_MAGIC, false); } else - me->CastSpell(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_DISPEL_MAGIC, false); - - dispelmagic_timer = 12000; - } else dispelmagic_timer -= diff;*/ - - boss_hexlord_addAI::UpdateAI(diff); + { + if (urand(0, 1)) + target = DoSelectLowestHpFriendly(50, 0); + else + target = SelectTarget(SELECT_TARGET_RANDOM, 0); + if (target) + DoCast(target, SPELL_DISPEL_MAGIC, false); + } + flashheal_timer = 2500; } - }; + else flashheal_timer -= diff; - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(creature); + /*if (dispelmagic_timer <= diff) + { + if (urand(0, 1)) + { + Unit* target = SelectTarget(); + + DoCast(target, SPELL_DISPEL_MAGIC, false); + } + else + me->CastSpell(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_DISPEL_MAGIC, false); + + dispelmagic_timer = 12000; + } else dispelmagic_timer -= diff;*/ + + boss_hexlord_addAI::UpdateAI(diff); } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI(creature); + } }; struct boss_gazakrothAI : public boss_hexlord_addAI @@ -678,7 +697,8 @@ struct boss_gazakrothAI : public boss_hexlord_addAI { DoCastVictim(SPELL_FIREBOLT, false); firebolt_timer = 700; - } else firebolt_timer -= diff; + } + else firebolt_timer -= diff; boss_hexlord_addAI::UpdateAI(diff); } @@ -686,280 +706,285 @@ struct boss_gazakrothAI : public boss_hexlord_addAI class boss_lord_raadan : public CreatureScript { - public: +public: - boss_lord_raadan() - : CreatureScript("boss_lord_raadan") + boss_lord_raadan() + : CreatureScript("boss_lord_raadan") + { + } + + struct boss_lord_raadanAI : public boss_hexlord_addAI + { + boss_lord_raadanAI(Creature* creature) : boss_hexlord_addAI(creature) { } + + uint32 flamebreath_timer; + uint32 thunderclap_timer; + + void Reset() override { + flamebreath_timer = 8000; + thunderclap_timer = 13000; + + boss_hexlord_addAI::Reset(); + } - - struct boss_lord_raadanAI : public boss_hexlord_addAI + void UpdateAI(uint32 diff) override { - boss_lord_raadanAI(Creature* creature) : boss_hexlord_addAI(creature) { } + if (!UpdateVictim()) + return; - uint32 flamebreath_timer; - uint32 thunderclap_timer; - - void Reset() override + if (thunderclap_timer <= diff) { - flamebreath_timer = 8000; - thunderclap_timer = 13000; - - boss_hexlord_addAI::Reset(); - + DoCastVictim(SPELL_THUNDERCLAP, false); + thunderclap_timer = 12000; } - void UpdateAI(uint32 diff) override + else thunderclap_timer -= diff; + + if (flamebreath_timer <= diff) { - if (!UpdateVictim()) - return; - - if (thunderclap_timer <= diff) - { - DoCastVictim(SPELL_THUNDERCLAP, false); - thunderclap_timer = 12000; - } else thunderclap_timer -= diff; - - if (flamebreath_timer <= diff) - { - DoCastVictim(SPELL_FLAME_BREATH, false); - flamebreath_timer = 12000; - } else flamebreath_timer -= diff; - - boss_hexlord_addAI::UpdateAI(diff); + DoCastVictim(SPELL_FLAME_BREATH, false); + flamebreath_timer = 12000; } - }; + else flamebreath_timer -= diff; - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(creature); + boss_hexlord_addAI::UpdateAI(diff); } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI(creature); + } }; class boss_darkheart : public CreatureScript { - public: +public: - boss_darkheart() - : CreatureScript("boss_darkheart") + boss_darkheart() + : CreatureScript("boss_darkheart") + { + } + + struct boss_darkheartAI : public boss_hexlord_addAI + { + boss_darkheartAI(Creature* creature) : boss_hexlord_addAI(creature) { } + + uint32 psychicwail_timer; + + void Reset() override { + psychicwail_timer = 8000; + boss_hexlord_addAI::Reset(); } - - struct boss_darkheartAI : public boss_hexlord_addAI + void UpdateAI(uint32 diff) override { - boss_darkheartAI(Creature* creature) : boss_hexlord_addAI(creature) { } + if (!UpdateVictim()) + return; - uint32 psychicwail_timer; - - void Reset() override + if (psychicwail_timer <= diff) { - psychicwail_timer = 8000; - boss_hexlord_addAI::Reset(); + DoCastVictim(SPELL_PSYCHIC_WAIL, false); + psychicwail_timer = 12000; } - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + else psychicwail_timer -= diff; - if (psychicwail_timer <= diff) - { - DoCastVictim(SPELL_PSYCHIC_WAIL, false); - psychicwail_timer = 12000; - } else psychicwail_timer -= diff; - - boss_hexlord_addAI::UpdateAI(diff); - } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(creature); + boss_hexlord_addAI::UpdateAI(diff); } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI(creature); + } }; class boss_slither : public CreatureScript { - public: +public: - boss_slither() - : CreatureScript("boss_slither") + boss_slither() + : CreatureScript("boss_slither") + { + } + + struct boss_slitherAI : public boss_hexlord_addAI + { + boss_slitherAI(Creature* creature) : boss_hexlord_addAI(creature) { } + + uint32 venomspit_timer; + + void Reset() override { + venomspit_timer = 5000; + boss_hexlord_addAI::Reset(); } - struct boss_slitherAI : public boss_hexlord_addAI + void AttackStart(Unit* who) override { - boss_slitherAI(Creature* creature) : boss_hexlord_addAI(creature) { } + if (!who) + return; - uint32 venomspit_timer; - - void Reset() override + if (who->isTargetableForAttack()) { - venomspit_timer = 5000; - boss_hexlord_addAI::Reset(); - } - - void AttackStart(Unit* who) override - { - if (!who) - return; - - if (who->isTargetableForAttack()) + if (me->Attack(who, false)) { - if (me->Attack(who, false)) - { - me->GetMotionMaster()->MoveChase(who, 20); - me->AddThreat(who, 0.0f); - } + me->GetMotionMaster()->MoveChase(who, 20); + me->AddThreat(who, 0.0f); } } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - if (venomspit_timer <= diff) - { - if (Unit* victim = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - DoCast(victim, SPELL_VENOM_SPIT, false); - venomspit_timer = 2500; - } else venomspit_timer -= diff; - - boss_hexlord_addAI::UpdateAI(diff); - } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(creature); } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + if (venomspit_timer <= diff) + { + if (Unit* victim = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) + DoCast(victim, SPELL_VENOM_SPIT, false); + venomspit_timer = 2500; + } + else venomspit_timer -= diff; + + boss_hexlord_addAI::UpdateAI(diff); + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI(creature); + } }; class boss_fenstalker : public CreatureScript { - public: +public: - boss_fenstalker() - : CreatureScript("boss_fenstalker") + boss_fenstalker() + : CreatureScript("boss_fenstalker") + { + } + + struct boss_fenstalkerAI : public boss_hexlord_addAI + { + boss_fenstalkerAI(Creature* creature) : boss_hexlord_addAI(creature) { } + + uint32 volatileinf_timer; + + void Reset() override { + volatileinf_timer = 15000; + boss_hexlord_addAI::Reset(); + } - - struct boss_fenstalkerAI : public boss_hexlord_addAI + void UpdateAI(uint32 diff) override { - boss_fenstalkerAI(Creature* creature) : boss_hexlord_addAI(creature) { } + if (!UpdateVictim()) + return; - uint32 volatileinf_timer; - - void Reset() override + if (volatileinf_timer <= diff) { - volatileinf_timer = 15000; - boss_hexlord_addAI::Reset(); - + // core bug + me->GetVictim()->CastSpell(me->GetVictim(), SPELL_VOLATILE_INFECTION, false); + volatileinf_timer = 12000; } - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + else volatileinf_timer -= diff; - if (volatileinf_timer <= diff) - { - // core bug - me->GetVictim()->CastSpell(me->GetVictim(), SPELL_VOLATILE_INFECTION, false); - volatileinf_timer = 12000; - } else volatileinf_timer -= diff; - - boss_hexlord_addAI::UpdateAI(diff); - } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(creature); + boss_hexlord_addAI::UpdateAI(diff); } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI(creature); + } }; class boss_koragg : public CreatureScript { - public: +public: - boss_koragg() - : CreatureScript("boss_koragg") + boss_koragg() + : CreatureScript("boss_koragg") + { + } + + struct boss_koraggAI : public boss_hexlord_addAI + { + boss_koraggAI(Creature* creature) : boss_hexlord_addAI(creature) { } + + uint32 coldstare_timer; + uint32 mightyblow_timer; + + void Reset() override { + coldstare_timer = 15000; + mightyblow_timer = 10000; + boss_hexlord_addAI::Reset(); + } - - struct boss_koraggAI : public boss_hexlord_addAI + void UpdateAI(uint32 diff) override { - boss_koraggAI(Creature* creature) : boss_hexlord_addAI(creature) { } + if (!UpdateVictim()) + return; - uint32 coldstare_timer; - uint32 mightyblow_timer; - - void Reset() override + if (mightyblow_timer <= diff) { - coldstare_timer = 15000; - mightyblow_timer = 10000; - boss_hexlord_addAI::Reset(); - + DoCastVictim(SPELL_MIGHTY_BLOW, false); + mightyblow_timer = 12000; } - void UpdateAI(uint32 diff) override + if (coldstare_timer <= diff) { - if (!UpdateVictim()) - return; - - if (mightyblow_timer <= diff) - { - DoCastVictim(SPELL_MIGHTY_BLOW, false); - mightyblow_timer = 12000; - } - if (coldstare_timer <= diff) - { - if (Unit* victim = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - DoCast(victim, SPELL_COLD_STARE, false); - coldstare_timer = 12000; - } - - boss_hexlord_addAI::UpdateAI(diff); + if (Unit* victim = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) + DoCast(victim, SPELL_COLD_STARE, false); + coldstare_timer = 12000; } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(creature); + boss_hexlord_addAI::UpdateAI(diff); } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI(creature); + } }; class spell_hexlord_unstable_affliction : public SpellScriptLoader { - public: - spell_hexlord_unstable_affliction() : SpellScriptLoader("spell_hexlord_unstable_affliction") { } +public: + spell_hexlord_unstable_affliction() : SpellScriptLoader("spell_hexlord_unstable_affliction") { } - class spell_hexlord_unstable_affliction_AuraScript : public AuraScript + class spell_hexlord_unstable_affliction_AuraScript : public AuraScript + { + PrepareAuraScript(spell_hexlord_unstable_affliction_AuraScript); + + bool Validate(SpellInfo const* /*spell*/) override { - PrepareAuraScript(spell_hexlord_unstable_affliction_AuraScript); - - bool Validate(SpellInfo const* /*spell*/) override - { - if (!sSpellMgr->GetSpellInfo(SPELL_WL_UNSTABLE_AFFL_DISPEL)) - return false; - return true; - } - - void HandleDispel(DispelInfo* dispelInfo) - { - if (Unit* caster = GetCaster()) - caster->CastSpell(dispelInfo->GetDispeller(), SPELL_WL_UNSTABLE_AFFL_DISPEL, true, NULL, GetEffect(EFFECT_0)); - } - - void Register() override - { - AfterDispel += AuraDispelFn(spell_hexlord_unstable_affliction_AuraScript::HandleDispel); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_hexlord_unstable_affliction_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_WL_UNSTABLE_AFFL_DISPEL)) + return false; + return true; } + + void HandleDispel(DispelInfo* dispelInfo) + { + if (Unit* caster = GetCaster()) + caster->CastSpell(dispelInfo->GetDispeller(), SPELL_WL_UNSTABLE_AFFL_DISPEL, true, NULL, GetEffect(EFFECT_0)); + } + + void Register() override + { + AfterDispel += AuraDispelFn(spell_hexlord_unstable_affliction_AuraScript::HandleDispel); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_hexlord_unstable_affliction_AuraScript(); + } }; void AddSC_boss_hex_lord_malacrass() diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp index 456ed3f30..7e3d7f6d8 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp @@ -74,9 +74,9 @@ float JanalainPos[1][3] = float FireWallCoords[4][4] = { {-10.13f, 1149.27f, 19, 3.1415f}, - {-33.93f, 1123.90f, 19, 0.5f*3.1415f}, + {-33.93f, 1123.90f, 19, 0.5f * 3.1415f}, {-54.80f, 1150.08f, 19, 0}, - {-33.93f, 1175.68f, 19, 1.5f*3.1415f} + {-33.93f, 1175.68f, 19, 1.5f * 3.1415f} }; float hatcherway[2][5][3] = @@ -98,571 +98,578 @@ float hatcherway[2][5][3] = }; class boss_janalai : public CreatureScript { - public: +public: - boss_janalai() - : CreatureScript("boss_janalai") + boss_janalai() + : CreatureScript("boss_janalai") + { + } + + struct boss_janalaiAI : public ScriptedAI + { + boss_janalaiAI(Creature* creature) : ScriptedAI(creature) { + instance = creature->GetInstanceScript(); } - struct boss_janalaiAI : public ScriptedAI + InstanceScript* instance; + + uint32 FireBreathTimer; + uint32 BombTimer; + uint32 BombSequenceTimer; + uint32 BombCount; + uint32 HatcherTimer; + uint32 EnrageTimer; + + bool noeggs; + bool enraged; + bool isBombing; + + bool isFlameBreathing; + + uint64 FireBombGUIDs[40]; + + void Reset() { - boss_janalaiAI(Creature* creature) : ScriptedAI(creature) + instance->SetData(DATA_JANALAIEVENT, NOT_STARTED); + + FireBreathTimer = 8000; + BombTimer = 30000; + BombSequenceTimer = 1000; + BombCount = 0; + HatcherTimer = 10000; + EnrageTimer = MINUTE * 5 * IN_MILLISECONDS; + + noeggs = false; + isBombing = false; + enraged = false; + + isFlameBreathing = false; + + for (uint8 i = 0; i < 40; ++i) + FireBombGUIDs[i] = 0; + + HatchAllEggs(1); + } + + void JustDied(Unit* /*killer*/) + { + Talk(SAY_DEATH); + + instance->SetData(DATA_JANALAIEVENT, DONE); + } + + void KilledUnit(Unit* /*victim*/) + { + Talk(SAY_SLAY); + } + + void EnterCombat(Unit* /*who*/) + { + instance->SetData(DATA_JANALAIEVENT, IN_PROGRESS); + + Talk(SAY_AGGRO); + // DoZoneInCombat(); + } + + void DamageDealt(Unit* target, uint32& damage, DamageEffectType /*damagetype*/) + { + if (isFlameBreathing) { - instance = creature->GetInstanceScript(); + if (!me->HasInArc(M_PI / 6, target)) + damage = 0; } + } - InstanceScript* instance; - - uint32 FireBreathTimer; - uint32 BombTimer; - uint32 BombSequenceTimer; - uint32 BombCount; - uint32 HatcherTimer; - uint32 EnrageTimer; - - bool noeggs; - bool enraged; - bool isBombing; - - bool isFlameBreathing; - - uint64 FireBombGUIDs[40]; - - void Reset() + void FireWall() + { + uint8 WallNum; + Creature* wall = nullptr; + for (uint8 i = 0; i < 4; ++i) { - instance->SetData(DATA_JANALAIEVENT, NOT_STARTED); + if (i == 0 || i == 2) + WallNum = 3; + else + WallNum = 2; - FireBreathTimer = 8000; - BombTimer = 30000; - BombSequenceTimer = 1000; - BombCount = 0; - HatcherTimer = 10000; - EnrageTimer = MINUTE*5*IN_MILLISECONDS; - - noeggs = false; - isBombing =false; - enraged = false; - - isFlameBreathing = false; - - for (uint8 i = 0; i < 40; ++i) - FireBombGUIDs[i] = 0; - - HatchAllEggs(1); - } - - void JustDied(Unit* /*killer*/) - { - Talk(SAY_DEATH); - - instance->SetData(DATA_JANALAIEVENT, DONE); - } - - void KilledUnit(Unit* /*victim*/) - { - Talk(SAY_SLAY); - } - - void EnterCombat(Unit* /*who*/) - { - instance->SetData(DATA_JANALAIEVENT, IN_PROGRESS); - - Talk(SAY_AGGRO); - // DoZoneInCombat(); - } - - void DamageDealt(Unit* target, uint32 &damage, DamageEffectType /*damagetype*/) - { - if (isFlameBreathing) + for (uint8 j = 0; j < WallNum; j++) { - if (!me->HasInArc(M_PI/6, target)) - damage = 0; - } - } - - void FireWall() - { - uint8 WallNum; - Creature* wall = nullptr; - for (uint8 i = 0; i < 4; ++i) - { - if (i == 0 || i == 2) - WallNum = 3; + if (WallNum == 3) + wall = me->SummonCreature(NPC_FIRE_BOMB, FireWallCoords[i][0], FireWallCoords[i][1] + 5 * (j - 1), FireWallCoords[i][2], FireWallCoords[i][3], TEMPSUMMON_TIMED_DESPAWN, 15000); else - WallNum = 2; - - for (uint8 j = 0; j < WallNum; j++) - { - if (WallNum == 3) - wall = me->SummonCreature(NPC_FIRE_BOMB, FireWallCoords[i][0], FireWallCoords[i][1]+5*(j-1), FireWallCoords[i][2], FireWallCoords[i][3], TEMPSUMMON_TIMED_DESPAWN, 15000); - else - wall = me->SummonCreature(NPC_FIRE_BOMB, FireWallCoords[i][0]-2+4*j, FireWallCoords[i][1], FireWallCoords[i][2], FireWallCoords[i][3], TEMPSUMMON_TIMED_DESPAWN, 15000); - if (wall) wall->CastSpell(wall, SPELL_FIRE_WALL, true); - } + wall = me->SummonCreature(NPC_FIRE_BOMB, FireWallCoords[i][0] - 2 + 4 * j, FireWallCoords[i][1], FireWallCoords[i][2], FireWallCoords[i][3], TEMPSUMMON_TIMED_DESPAWN, 15000); + if (wall) wall->CastSpell(wall, SPELL_FIRE_WALL, true); } } + } - void SpawnBombs() + void SpawnBombs() + { + float dx, dy; + for (int i(0); i < 40; ++i) { - float dx, dy; - for (int i(0); i < 40; ++i) - { - dx = float(irand(-area_dx/2, area_dx/2)); - dy = float(irand(-area_dy/2, area_dy/2)); + dx = float(irand(-area_dx / 2, area_dx / 2)); + dy = float(irand(-area_dy / 2, area_dy / 2)); - Creature* bomb = DoSpawnCreature(NPC_FIRE_BOMB, dx, dy, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 15000); - if (bomb) - FireBombGUIDs[i] = bomb->GetGUID(); - } - BombCount = 0; + Creature* bomb = DoSpawnCreature(NPC_FIRE_BOMB, dx, dy, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 15000); + if (bomb) + FireBombGUIDs[i] = bomb->GetGUID(); + } + BombCount = 0; + } + + bool HatchAllEggs(uint32 action) //1: reset, 2: isHatching all + { + std::list templist; + float x, y, z; + me->GetPosition(x, y, z); + + { + CellCoord pair(acore::ComputeCellCoord(x, y)); + Cell cell(pair); + cell.SetNoCreate(); + + acore::AllCreaturesOfEntryInRange check(me, NPC_EGG, 100); + acore::CreatureListSearcher searcher(me, templist, check); + + TypeContainerVisitor, GridTypeMapContainer> cSearcher(searcher); + + cell.Visit(pair, cSearcher, *me->GetMap(), *me, me->GetGridActivationRange()); } - bool HatchAllEggs(uint32 action) //1: reset, 2: isHatching all + //TC_LOG_ERROR("scripts", "Eggs %d at middle", templist.size()); + if (templist.empty()) + return false; + + for (std::list::const_iterator i = templist.begin(); i != templist.end(); ++i) { - std::list templist; - float x, y, z; - me->GetPosition(x, y, z); + if (action == 1) + (*i)->SetDisplayId(10056); + else if (action == 2 && (*i)->GetDisplayId() != 11686) + (*i)->CastSpell(*i, SPELL_HATCH_EGG, false); + } + return true; + } + void Boom() + { + std::list templist; + float x, y, z; + me->GetPosition(x, y, z); + + { + CellCoord pair(acore::ComputeCellCoord(x, y)); + Cell cell(pair); + cell.SetNoCreate(); + + acore::AllCreaturesOfEntryInRange check(me, NPC_FIRE_BOMB, 100); + acore::CreatureListSearcher searcher(me, templist, check); + + TypeContainerVisitor, GridTypeMapContainer> cSearcher(searcher); + + cell.Visit(pair, cSearcher, *me->GetMap(), *me, me->GetGridActivationRange()); + } + for (std::list::const_iterator i = templist.begin(); i != templist.end(); ++i) + { + (*i)->CastSpell(*i, SPELL_FIRE_BOMB_DAMAGE, true); + (*i)->RemoveAllAuras(); + } + } + + void HandleBombSequence() + { + if (BombCount < 40) + { + if (Unit* FireBomb = ObjectAccessor::GetUnit(*me, FireBombGUIDs[BombCount])) { - CellCoord pair(acore::ComputeCellCoord(x, y)); - Cell cell(pair); - cell.SetNoCreate(); - - acore::AllCreaturesOfEntryInRange check(me, NPC_EGG, 100); - acore::CreatureListSearcher searcher(me, templist, check); - - TypeContainerVisitor, GridTypeMapContainer> cSearcher(searcher); - - cell.Visit(pair, cSearcher, *me->GetMap(), *me, me->GetGridActivationRange()); + FireBomb->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + DoCast(FireBomb, SPELL_FIRE_BOMB_THROW, true); + FireBomb->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } - - //TC_LOG_ERROR("scripts", "Eggs %d at middle", templist.size()); - if (templist.empty()) - return false; - - for (std::list::const_iterator i = templist.begin(); i != templist.end(); ++i) + ++BombCount; + if (BombCount == 40) { - if (action == 1) - (*i)->SetDisplayId(10056); - else if (action == 2 &&(*i)->GetDisplayId() != 11686) - (*i)->CastSpell(*i, SPELL_HATCH_EGG, false); + BombSequenceTimer = 5000; } - return true; + else BombSequenceTimer = 100; + } + else + { + Boom(); + isBombing = false; + BombTimer = urand(20000, 40000); + me->RemoveAurasDueToSpell(SPELL_FIRE_BOMB_CHANNEL); + if (EnrageTimer <= 10000) + EnrageTimer = 0; + else + EnrageTimer -= 10000; + } + } + + void UpdateAI(uint32 diff) + { + if (isFlameBreathing) + { + if (!me->IsNonMeleeSpellCast(false)) + isFlameBreathing = false; + else + return; } - void Boom() + if (isBombing) { - std::list templist; - float x, y, z; - me->GetPosition(x, y, z); - - { - CellCoord pair(acore::ComputeCellCoord(x, y)); - Cell cell(pair); - cell.SetNoCreate(); - - acore::AllCreaturesOfEntryInRange check(me, NPC_FIRE_BOMB, 100); - acore::CreatureListSearcher searcher(me, templist, check); - - TypeContainerVisitor, GridTypeMapContainer> cSearcher(searcher); - - cell.Visit(pair, cSearcher, *me->GetMap(), *me, me->GetGridActivationRange()); - } - for (std::list::const_iterator i = templist.begin(); i != templist.end(); ++i) - { - (*i)->CastSpell(*i, SPELL_FIRE_BOMB_DAMAGE, true); - (*i)->RemoveAllAuras(); - } + if (BombSequenceTimer <= diff) + HandleBombSequence(); + else + BombSequenceTimer -= diff; + return; } - void HandleBombSequence() + if (!UpdateVictim()) + return; + + //enrage if under 25% hp before 5 min. + if (!enraged && HealthBelowPct(25)) + EnrageTimer = 0; + + if (EnrageTimer <= diff) { - if (BombCount < 40) + if (!enraged) { - if (Unit* FireBomb = ObjectAccessor::GetUnit(*me, FireBombGUIDs[BombCount])) - { - FireBomb->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - DoCast(FireBomb, SPELL_FIRE_BOMB_THROW, true); - FireBomb->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - } - ++BombCount; - if (BombCount == 40) - { - BombSequenceTimer = 5000; - } else BombSequenceTimer = 100; + DoCast(me, SPELL_ENRAGE, true); + enraged = true; + EnrageTimer = 300000; } else { - Boom(); - isBombing = false; - BombTimer = urand(20000, 40000); - me->RemoveAurasDueToSpell(SPELL_FIRE_BOMB_CHANNEL); - if (EnrageTimer <= 10000) - EnrageTimer = 0; - else - EnrageTimer -= 10000; + Talk(SAY_BERSERK); + DoCast(me, SPELL_BERSERK, true); + EnrageTimer = 300000; } } + else EnrageTimer -= diff; - void UpdateAI(uint32 diff) + if (BombTimer <= diff) { - if (isFlameBreathing) - { - if (!me->IsNonMeleeSpellCast(false)) - isFlameBreathing = false; - else - return; - } + Talk(SAY_FIRE_BOMBS); - if (isBombing) - { - if (BombSequenceTimer <= diff) - HandleBombSequence(); - else - BombSequenceTimer -= diff; - return; - } + me->AttackStop(); + me->GetMotionMaster()->Clear(); + me->NearTeleportTo(JanalainPos[0][0], JanalainPos[0][1], JanalainPos[0][2], me->GetOrientation()); + me->StopMovingOnCurrentPos(); + DoCast(me, SPELL_FIRE_BOMB_CHANNEL, false); + //DoTeleportPlayer(me, JanalainPos[0][0], JanalainPos[0][1], JanalainPos[0][2], 0); + //DoCast(me, SPELL_TELE_TO_CENTER, true); - if (!UpdateVictim()) + FireWall(); + SpawnBombs(); + isBombing = true; + BombSequenceTimer = 100; + + //Teleport every Player into the middle + Map* map = me->GetMap(); + if (!map->IsDungeon()) return; - //enrage if under 25% hp before 5 min. - if (!enraged && HealthBelowPct(25)) - EnrageTimer = 0; + Map::PlayerList const& PlayerList = map->GetPlayers(); + for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) + if (Player* i_pl = i->GetSource()) + if (i_pl->IsAlive()) + DoTeleportPlayer(i_pl, JanalainPos[0][0] - 5 + rand() % 10, JanalainPos[0][1] - 5 + rand() % 10, JanalainPos[0][2], 0); + //DoCast(Temp, SPELL_SUMMON_PLAYERS, true) // core bug, spell does not work if too far + return; + } + else BombTimer -= diff; - if (EnrageTimer <= diff) + if (!noeggs) + { + if (HealthBelowPct(35)) { - if (!enraged) - { - DoCast(me, SPELL_ENRAGE, true); - enraged = true; - EnrageTimer = 300000; - } - else - { - Talk(SAY_BERSERK); - DoCast(me, SPELL_BERSERK, true); - EnrageTimer = 300000; - } - } else EnrageTimer -= diff; - - if (BombTimer <= diff) - { - Talk(SAY_FIRE_BOMBS); + Talk(SAY_ALL_EGGS); me->AttackStop(); me->GetMotionMaster()->Clear(); me->NearTeleportTo(JanalainPos[0][0], JanalainPos[0][1], JanalainPos[0][2], me->GetOrientation()); me->StopMovingOnCurrentPos(); - DoCast(me, SPELL_FIRE_BOMB_CHANNEL, false); - //DoTeleportPlayer(me, JanalainPos[0][0], JanalainPos[0][1], JanalainPos[0][2], 0); - //DoCast(me, SPELL_TELE_TO_CENTER, true); - - FireWall(); - SpawnBombs(); - isBombing = true; - BombSequenceTimer = 100; - - //Teleport every Player into the middle - Map* map = me->GetMap(); - if (!map->IsDungeon()) - return; - - Map::PlayerList const &PlayerList = map->GetPlayers(); - for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) - if (Player* i_pl = i->GetSource()) - if (i_pl->IsAlive()) - DoTeleportPlayer(i_pl, JanalainPos[0][0]-5+rand()%10, JanalainPos[0][1]-5+rand()%10, JanalainPos[0][2], 0); - //DoCast(Temp, SPELL_SUMMON_PLAYERS, true) // core bug, spell does not work if too far - return; - } else BombTimer -= diff; - - if (!noeggs) - { - if (HealthBelowPct(35)) - { - Talk(SAY_ALL_EGGS); - - me->AttackStop(); - me->GetMotionMaster()->Clear(); - me->NearTeleportTo(JanalainPos[0][0], JanalainPos[0][1], JanalainPos[0][2], me->GetOrientation()); - me->StopMovingOnCurrentPos(); - DoCast(me, SPELL_HATCH_ALL, false); - HatchAllEggs(2); - noeggs = true; - } - else if (HatcherTimer <= diff) - { - if (HatchAllEggs(0)) - { - Talk(SAY_SUMMON_HATCHER); - me->SummonCreature(NPC_AMANI_HATCHER, hatcherway[0][0][0], hatcherway[0][0][1], hatcherway[0][0][2], 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); - me->SummonCreature(NPC_AMANI_HATCHER, hatcherway[1][0][0], hatcherway[1][0][1], hatcherway[1][0][2], 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); - HatcherTimer = 90000; - } - else - noeggs = true; - } else HatcherTimer -= diff; + DoCast(me, SPELL_HATCH_ALL, false); + HatchAllEggs(2); + noeggs = true; } - - EnterEvadeIfOutOfCombatArea(); - - DoMeleeAttackIfReady(); - - if (FireBreathTimer <= diff) + else if (HatcherTimer <= diff) { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + if (HatchAllEggs(0)) { - me->AttackStop(); - me->GetMotionMaster()->Clear(); - DoCast(target, SPELL_FLAME_BREATH, false); - me->StopMoving(); - isFlameBreathing = true; + Talk(SAY_SUMMON_HATCHER); + me->SummonCreature(NPC_AMANI_HATCHER, hatcherway[0][0][0], hatcherway[0][0][1], hatcherway[0][0][2], 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); + me->SummonCreature(NPC_AMANI_HATCHER, hatcherway[1][0][0], hatcherway[1][0][1], hatcherway[1][0][2], 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); + HatcherTimer = 90000; } - FireBreathTimer = 8000; - } else FireBreathTimer -= diff; + else + noeggs = true; + } + else HatcherTimer -= diff; } - - bool CheckEvadeIfOutOfCombatArea() const - { - return me->GetPositionZ() <= 12.0f; - } - }; - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + EnterEvadeIfOutOfCombatArea(); + + DoMeleeAttackIfReady(); + + if (FireBreathTimer <= diff) + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + { + me->AttackStop(); + me->GetMotionMaster()->Clear(); + DoCast(target, SPELL_FLAME_BREATH, false); + me->StopMoving(); + isFlameBreathing = true; + } + FireBreathTimer = 8000; + } + else FireBreathTimer -= diff; } + + bool CheckEvadeIfOutOfCombatArea() const + { + return me->GetPositionZ() <= 12.0f; + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class npc_janalai_firebomb : public CreatureScript { - public: +public: - npc_janalai_firebomb() - : CreatureScript("npc_janalai_firebomb") + npc_janalai_firebomb() + : CreatureScript("npc_janalai_firebomb") + { + } + + struct npc_janalai_firebombAI : public ScriptedAI + { + npc_janalai_firebombAI(Creature* creature) : ScriptedAI(creature) { } + + void Reset() { } + + void SpellHit(Unit* /*caster*/, const SpellInfo* spell) { + if (spell->Id == SPELL_FIRE_BOMB_THROW) + DoCast(me, SPELL_FIRE_BOMB_DUMMY, true); } - struct npc_janalai_firebombAI : public ScriptedAI - { - npc_janalai_firebombAI(Creature* creature) : ScriptedAI(creature){ } + void EnterCombat(Unit* /*who*/) { } - void Reset() { } + void AttackStart(Unit* /*who*/) { } - void SpellHit(Unit* /*caster*/, const SpellInfo* spell) - { - if (spell->Id == SPELL_FIRE_BOMB_THROW) - DoCast(me, SPELL_FIRE_BOMB_DUMMY, true); - } - - void EnterCombat(Unit* /*who*/) { } - - void AttackStart(Unit* /*who*/) { } - - void MoveInLineOfSight(Unit* /*who*/) { } + void MoveInLineOfSight(Unit* /*who*/) { } - void UpdateAI(uint32 /*diff*/) { } - }; + void UpdateAI(uint32 /*diff*/) { } + }; - CreatureAI* GetAI(Creature* creature) const - { - return new npc_janalai_firebombAI(creature); - } + CreatureAI* GetAI(Creature* creature) const + { + return new npc_janalai_firebombAI(creature); + } }; class npc_janalai_hatcher : public CreatureScript { - public: +public: - npc_janalai_hatcher() - : CreatureScript("npc_janalai_hatcher") + npc_janalai_hatcher() + : CreatureScript("npc_janalai_hatcher") + { + } + + struct npc_janalai_hatcherAI : public ScriptedAI + { + npc_janalai_hatcherAI(Creature* creature) : ScriptedAI(creature) { + instance = creature->GetInstanceScript(); } - struct npc_janalai_hatcherAI : public ScriptedAI + InstanceScript* instance; + + uint32 waypoint; + uint32 HatchNum; + uint32 WaitTimer; + + bool side; + bool hasChangedSide; + bool isHatching; + + void Reset() { - npc_janalai_hatcherAI(Creature* creature) : ScriptedAI(creature) + me->SetWalk(true); + side = (me->GetPositionY() < 1150); + waypoint = 0; + isHatching = false; + hasChangedSide = false; + WaitTimer = 1; + HatchNum = 0; + } + + bool HatchEggs(uint32 num) + { + std::list templist; + float x, y, z; + me->GetPosition(x, y, z); + { - instance = creature->GetInstanceScript(); + CellCoord pair(acore::ComputeCellCoord(x, y)); + Cell cell(pair); + cell.SetNoCreate(); + + acore::AllCreaturesOfEntryInRange check(me, 23817, 50); + acore::CreatureListSearcher searcher(me, templist, check); + + TypeContainerVisitor, GridTypeMapContainer> cSearcher(searcher); + + cell.Visit(pair, cSearcher, *(me->GetMap()), *me, me->GetGridActivationRange()); } - InstanceScript* instance; + //TC_LOG_ERROR("scripts", "Eggs %d at %d", templist.size(), side); - uint32 waypoint; - uint32 HatchNum; - uint32 WaitTimer; + for (std::list::const_iterator i = templist.begin(); i != templist.end() && num > 0; ++i) + if ((*i)->GetDisplayId() != 11686) + { + (*i)->CastSpell(*i, SPELL_HATCH_EGG, false); + num--; + } - bool side; - bool hasChangedSide; - bool isHatching; + return num == 0; // if num == 0, no more templist + } - void Reset() + void EnterCombat(Unit* /*who*/) { } + void AttackStart(Unit* /*who*/) { } + void MoveInLineOfSight(Unit* /*who*/) { } + + void MovementInform(uint32, uint32) + { + if (waypoint == 5) { - me->SetWalk(true); - side =(me->GetPositionY() < 1150); - waypoint = 0; - isHatching = false; - hasChangedSide = false; + isHatching = true; + HatchNum = 1; + WaitTimer = 5000; + } + else WaitTimer = 1; - HatchNum = 0; - } - - bool HatchEggs(uint32 num) - { - std::list templist; - float x, y, z; - me->GetPosition(x, y, z); - - { - CellCoord pair(acore::ComputeCellCoord(x, y)); - Cell cell(pair); - cell.SetNoCreate(); - - acore::AllCreaturesOfEntryInRange check(me, 23817, 50); - acore::CreatureListSearcher searcher(me, templist, check); - - TypeContainerVisitor, GridTypeMapContainer> cSearcher(searcher); - - cell.Visit(pair, cSearcher, *(me->GetMap()), *me, me->GetGridActivationRange()); - } - - //TC_LOG_ERROR("scripts", "Eggs %d at %d", templist.size(), side); - - for (std::list::const_iterator i = templist.begin(); i != templist.end() && num > 0; ++i) - if ((*i)->GetDisplayId() != 11686) - { - (*i)->CastSpell(*i, SPELL_HATCH_EGG, false); - num--; - } - - return num == 0; // if num == 0, no more templist - } - - void EnterCombat(Unit* /*who*/) { } - void AttackStart(Unit* /*who*/) { } - void MoveInLineOfSight(Unit* /*who*/) { } - - void MovementInform(uint32, uint32) - { - if (waypoint == 5) - { - isHatching = true; - HatchNum = 1; - WaitTimer = 5000; - } - else - WaitTimer = 1; - } - - void UpdateAI(uint32 diff) - { - if (!instance || !(instance->GetData(DATA_JANALAIEVENT) == IN_PROGRESS)) - { - me->DisappearAndDie(); - return; - } - - if (!isHatching) - { - if (WaitTimer) - { - me->GetMotionMaster()->Clear(); - me->GetMotionMaster()->MovePoint(0, hatcherway[side][waypoint][0], hatcherway[side][waypoint][1], hatcherway[side][waypoint][2]); - ++waypoint; - WaitTimer = 0; - } - } - else - { - if (WaitTimer <= diff) - { - if (HatchEggs(HatchNum)) - { - ++HatchNum; - WaitTimer = 10000; - } - else if (!hasChangedSide) - { - side = side ? 0 : 1; - isHatching = false; - waypoint = 3; - WaitTimer = 1; - hasChangedSide = true; - } - else - me->DisappearAndDie(); - - } else WaitTimer -= diff; - } - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); } + + void UpdateAI(uint32 diff) + { + if (!instance || !(instance->GetData(DATA_JANALAIEVENT) == IN_PROGRESS)) + { + me->DisappearAndDie(); + return; + } + + if (!isHatching) + { + if (WaitTimer) + { + me->GetMotionMaster()->Clear(); + me->GetMotionMaster()->MovePoint(0, hatcherway[side][waypoint][0], hatcherway[side][waypoint][1], hatcherway[side][waypoint][2]); + ++waypoint; + WaitTimer = 0; + } + } + else + { + if (WaitTimer <= diff) + { + if (HatchEggs(HatchNum)) + { + ++HatchNum; + WaitTimer = 10000; + } + else if (!hasChangedSide) + { + side = side ? 0 : 1; + isHatching = false; + waypoint = 3; + WaitTimer = 1; + hasChangedSide = true; + } + else + me->DisappearAndDie(); + + } + else WaitTimer -= diff; + } + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class npc_janalai_hatchling : public CreatureScript { - public: +public: - npc_janalai_hatchling() - : CreatureScript("npc_janalai_hatchling") + npc_janalai_hatchling() + : CreatureScript("npc_janalai_hatchling") + { + } + + struct npc_janalai_hatchlingAI : public ScriptedAI + { + npc_janalai_hatchlingAI(Creature* creature) : ScriptedAI(creature) { + instance = creature->GetInstanceScript(); } - struct npc_janalai_hatchlingAI : public ScriptedAI + InstanceScript* instance; + uint32 BuffetTimer; + + void Reset() { - npc_janalai_hatchlingAI(Creature* creature) : ScriptedAI(creature) - { - instance = creature->GetInstanceScript(); - } + BuffetTimer = 7000; + if (me->GetPositionY() > 1150) + me->GetMotionMaster()->MovePoint(0, hatcherway[0][3][0] + rand() % 4 - 2, 1150.0f + rand() % 4 - 2, hatcherway[0][3][2]); + else + me->GetMotionMaster()->MovePoint(0, hatcherway[1][3][0] + rand() % 4 - 2, 1150.0f + rand() % 4 - 2, hatcherway[1][3][2]); - InstanceScript* instance; - uint32 BuffetTimer; - - void Reset() - { - BuffetTimer = 7000; - if (me->GetPositionY() > 1150) - me->GetMotionMaster()->MovePoint(0, hatcherway[0][3][0]+rand()%4-2, 1150.0f+rand()%4-2, hatcherway[0][3][2]); - else - me->GetMotionMaster()->MovePoint(0, hatcherway[1][3][0]+rand()%4-2, 1150.0f+rand()%4-2, hatcherway[1][3][2]); - - me->SetDisableGravity(true); - } - - void EnterCombat(Unit* /*who*/) {/*DoZoneInCombat();*/ } - - void UpdateAI(uint32 diff) - { - if (!instance || !(instance->GetData(DATA_JANALAIEVENT) == IN_PROGRESS)) - { - me->DisappearAndDie(); - return; - } - - if (!UpdateVictim()) - return; - - if (BuffetTimer <= diff) - { - DoCastVictim(SPELL_FLAMEBUFFET, false); - BuffetTimer = 10000; - } else BuffetTimer -= diff; - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + me->SetDisableGravity(true); } + + void EnterCombat(Unit* /*who*/) {/*DoZoneInCombat();*/ } + + void UpdateAI(uint32 diff) + { + if (!instance || !(instance->GetData(DATA_JANALAIEVENT) == IN_PROGRESS)) + { + me->DisappearAndDie(); + return; + } + + if (!UpdateVictim()) + return; + + if (BuffetTimer <= diff) + { + DoCastVictim(SPELL_FLAMEBUFFET, false); + BuffetTimer = 10000; + } + else BuffetTimer -= diff; + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class npc_janalai_egg : public CreatureScript @@ -677,7 +684,7 @@ public: struct npc_janalai_eggAI : public ScriptedAI { - npc_janalai_eggAI(Creature* creature) : ScriptedAI(creature){ } + npc_janalai_eggAI(Creature* creature) : ScriptedAI(creature) { } void Reset() { } diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp index 086fad73b..6b0b47ab8 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp @@ -1,8 +1,8 @@ - /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license: https://github.com/azerothcore/azerothcore-wotlk/blob/master/LICENSE-GPL2 - * Copyright (C) 2008-2016 TrinityCore - * Copyright (C) 2005-2009 MaNGOS - */ +/* +* Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license: https://github.com/azerothcore/azerothcore-wotlk/blob/master/LICENSE-GPL2 +* Copyright (C) 2008-2016 TrinityCore +* Copyright (C) 2005-2009 MaNGOS +*/ /* ScriptData SDName: Boss_Nalorakk @@ -69,384 +69,393 @@ enum Talks class boss_nalorakk : public CreatureScript { - public: +public: - boss_nalorakk() - : CreatureScript("boss_nalorakk") + boss_nalorakk() + : CreatureScript("boss_nalorakk") + { + } + + struct boss_nalorakkAI : public ScriptedAI + { + boss_nalorakkAI(Creature* creature) : ScriptedAI(creature) { + MoveEvent = true; + MovePhase = 0; + instance = creature->GetInstanceScript(); } - struct boss_nalorakkAI : public ScriptedAI + InstanceScript* instance; + + uint32 BrutalSwipe_Timer; + uint32 Mangle_Timer; + uint32 Surge_Timer; + + uint32 LaceratingSlash_Timer; + uint32 RendFlesh_Timer; + uint32 DeafeningRoar_Timer; + + uint32 ShapeShift_Timer; + uint32 Berserk_Timer; + + bool inBearForm; + bool MoveEvent; + bool inMove; + uint32 MovePhase; + uint32 waitTimer; + + void Reset() override { - boss_nalorakkAI(Creature* creature) : ScriptedAI(creature) - { - MoveEvent = true; - MovePhase = 0; - instance = creature->GetInstanceScript(); - } - - InstanceScript* instance; - - uint32 BrutalSwipe_Timer; - uint32 Mangle_Timer; - uint32 Surge_Timer; - - uint32 LaceratingSlash_Timer; - uint32 RendFlesh_Timer; - uint32 DeafeningRoar_Timer; - - uint32 ShapeShift_Timer; - uint32 Berserk_Timer; - - bool inBearForm; - bool MoveEvent; - bool inMove; - uint32 MovePhase; - uint32 waitTimer; - - void Reset() override - { - if (MoveEvent) - { - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - inMove = false; - waitTimer = 0; - me->SetSpeed(MOVE_RUN, 2); - me->SetWalk(false); - ResetMobs(); - } - else - { - (*me).GetMotionMaster()->MovePoint(0, NalorakkWay[7][0], NalorakkWay[7][1], NalorakkWay[7][2]); - } - - if (instance) - { - instance->SetData(DATA_NALORAKKEVENT, NOT_STARTED); - } - - Surge_Timer = urand(15000, 20000); - BrutalSwipe_Timer = urand(7000, 12000); - Mangle_Timer = urand(10000, 15000); - ShapeShift_Timer = urand(45000, 50000); - Berserk_Timer = 600000; - - inBearForm = false; - // me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, 5122); /// @todo find the correct equipment id - } - - void ResetMobs() - { - std::list templist; - float x, y, z; - me->GetPosition(x, y, z); - - { - CellCoord pair(acore::ComputeCellCoord(x, y)); - Cell cell(pair); - cell.SetNoCreate(); - - acore::AllFriendlyCreaturesInGrid check(me); - acore::CreatureListSearcher searcher(me, templist, check); - - TypeContainerVisitor, GridTypeMapContainer> cSearcher(searcher); - - cell.Visit(pair, cSearcher, *(me->GetMap()), *me, me->GetGridActivationRange()); - } - - if (templist.empty()) - return; - - for (std::list::const_iterator i = templist.begin(); i != templist.end(); ++i) - if ((*i) && me->GetGUID() != (*i)->GetGUID() && me->IsWithinDistInMap((*i), 25)) - (*i)->AI()->Reset(); - } - - void SendAttacker(Unit* target) - { - std::list templist; - float x, y, z; - me->GetPosition(x, y, z); - - { - CellCoord pair(acore::ComputeCellCoord(x, y)); - Cell cell(pair); - cell.SetNoCreate(); - - acore::AllFriendlyCreaturesInGrid check(me); - acore::CreatureListSearcher searcher(me, templist, check); - - TypeContainerVisitor, GridTypeMapContainer> cSearcher(searcher); - - cell.Visit(pair, cSearcher, *(me->GetMap()), *me, me->GetGridActivationRange()); - } - - if (templist.empty()) - return; - - for (std::list::const_iterator i = templist.begin(); i != templist.end(); ++i) - { - if ((*i) && me->IsWithinDistInMap((*i), 25)) - { - (*i)->SetNoCallAssistance(true); - (*i)->AI()->AttackStart(target); - } - } - } - - void AttackStart(Unit* who) override - { - if (!MoveEvent) - ScriptedAI::AttackStart(who); - } - - void MoveInLineOfSight(Unit* who) override - - { - if (!MoveEvent) - { - ScriptedAI::MoveInLineOfSight(who); - } - else - { - if (me->IsHostileTo(who)) - { - if (!inMove) - { - switch (MovePhase) - { - case 0: - if (me->IsWithinDistInMap(who, 50)) - { - Talk(SAY_WAVE1); - - (*me).GetMotionMaster()->MovePoint(1, NalorakkWay[1][0], NalorakkWay[1][1], NalorakkWay[1][2]); - MovePhase ++; - inMove = true; - - SendAttacker(who); - } - break; - case 2: - if (me->IsWithinDistInMap(who, 40)) - { - Talk(SAY_WAVE2); - - (*me).GetMotionMaster()->MovePoint(3, NalorakkWay[3][0], NalorakkWay[3][1], NalorakkWay[3][2]); - MovePhase ++; - inMove = true; - - SendAttacker(who); - } - break; - case 5: - if (me->IsWithinDistInMap(who, 40)) - { - Talk(SAY_WAVE3); - - (*me).GetMotionMaster()->MovePoint(6, NalorakkWay[6][0], NalorakkWay[6][1], NalorakkWay[6][2]); - MovePhase ++; - inMove = true; - - SendAttacker(who); - } - break; - case 7: - if (me->IsWithinDistInMap(who, 50)) - { - SendAttacker(who); - - Talk(SAY_WAVE4); - - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - - MoveEvent = false; - } - break; - } - } - } - } - } - - void EnterCombat(Unit* /*who*/) override - { - if (instance) - instance->SetData(DATA_NALORAKKEVENT, IN_PROGRESS); - - Talk(SAY_AGGRO); - DoZoneInCombat(); - } - - void JustDied(Unit* /*killer*/) override + if (MoveEvent) { + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + inMove = false; + waitTimer = 0; + me->SetSpeed(MOVE_RUN, 2); + me->SetWalk(false); ResetMobs(); - - if (instance) - instance->SetData(DATA_NALORAKKEVENT, DONE); - - Talk(SAY_DEATH); + } + else + { + (*me).GetMotionMaster()->MovePoint(0, NalorakkWay[7][0], NalorakkWay[7][1], NalorakkWay[7][2]); } - void KilledUnit(Unit* /*victim*/) override + if (instance) { - switch (urand(0, 1)) + instance->SetData(DATA_NALORAKKEVENT, NOT_STARTED); + } + + Surge_Timer = urand(15000, 20000); + BrutalSwipe_Timer = urand(7000, 12000); + Mangle_Timer = urand(10000, 15000); + ShapeShift_Timer = urand(45000, 50000); + Berserk_Timer = 600000; + + inBearForm = false; + // me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, 5122); /// @todo find the correct equipment id + } + + void ResetMobs() + { + std::list templist; + float x, y, z; + me->GetPosition(x, y, z); + + { + CellCoord pair(acore::ComputeCellCoord(x, y)); + Cell cell(pair); + cell.SetNoCreate(); + + acore::AllFriendlyCreaturesInGrid check(me); + acore::CreatureListSearcher searcher(me, templist, check); + + TypeContainerVisitor, GridTypeMapContainer> cSearcher(searcher); + + cell.Visit(pair, cSearcher, *(me->GetMap()), *me, me->GetGridActivationRange()); + } + + if (templist.empty()) + return; + + for (std::list::const_iterator i = templist.begin(); i != templist.end(); ++i) + if ((*i) && me->GetGUID() != (*i)->GetGUID() && me->IsWithinDistInMap((*i), 25)) + (*i)->AI()->Reset(); + } + + void SendAttacker(Unit* target) + { + std::list templist; + float x, y, z; + me->GetPosition(x, y, z); + + { + CellCoord pair(acore::ComputeCellCoord(x, y)); + Cell cell(pair); + cell.SetNoCreate(); + + acore::AllFriendlyCreaturesInGrid check(me); + acore::CreatureListSearcher searcher(me, templist, check); + + TypeContainerVisitor, GridTypeMapContainer> cSearcher(searcher); + + cell.Visit(pair, cSearcher, *(me->GetMap()), *me, me->GetGridActivationRange()); + } + + if (templist.empty()) + return; + + for (std::list::const_iterator i = templist.begin(); i != templist.end(); ++i) + { + if ((*i) && me->IsWithinDistInMap((*i), 25)) { - case 0: - Talk(SAY_KILL_ONE); - break; - case 1: - Talk(SAY_KILL_TWO); - break; + (*i)->SetNoCallAssistance(true); + (*i)->AI()->AttackStart(target); } } + } - void MovementInform(uint32 type, uint32 id) override + void AttackStart(Unit* who) override + { + if (!MoveEvent) + ScriptedAI::AttackStart(who); + } + + void MoveInLineOfSight(Unit* who) override + + { + if (!MoveEvent) { - if (MoveEvent) + ScriptedAI::MoveInLineOfSight(who); + } + else + { + if (me->IsHostileTo(who)) { - if (type != POINT_MOTION_TYPE) - return; - if (!inMove) - return; - - if (MovePhase != id) - return; - - switch (MovePhase) { - case 2: - me->SetOrientation(3.1415f*2); - inMove = false; - return; - case 1: - case 3: - case 4: - case 6: - MovePhase ++; - waitTimer = 1; - inMove = true; - return; - case 5: - me->SetOrientation(3.1415f*0.5f); - inMove = false; - return; - case 7: - me->SetOrientation(3.1415f*0.5f); - inMove = false; - return; - } + switch (MovePhase) + { + case 0: + if (me->IsWithinDistInMap(who, 50)) + { + Talk(SAY_WAVE1); + (*me).GetMotionMaster()->MovePoint(1, NalorakkWay[1][0], NalorakkWay[1][1], NalorakkWay[1][2]); + MovePhase ++; + inMove = true; + + SendAttacker(who); + } + break; + case 2: + if (me->IsWithinDistInMap(who, 40)) + { + Talk(SAY_WAVE2); + + (*me).GetMotionMaster()->MovePoint(3, NalorakkWay[3][0], NalorakkWay[3][1], NalorakkWay[3][2]); + MovePhase ++; + inMove = true; + + SendAttacker(who); + } + break; + case 5: + if (me->IsWithinDistInMap(who, 40)) + { + Talk(SAY_WAVE3); + + (*me).GetMotionMaster()->MovePoint(6, NalorakkWay[6][0], NalorakkWay[6][1], NalorakkWay[6][2]); + MovePhase ++; + inMove = true; + + SendAttacker(who); + } + break; + case 7: + if (me->IsWithinDistInMap(who, 50)) + { + SendAttacker(who); + + Talk(SAY_WAVE4); + + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + + MoveEvent = false; + } + break; + } + } } } + } - void UpdateAI(uint32 diff) override + void EnterCombat(Unit* /*who*/) override + { + if (instance) + instance->SetData(DATA_NALORAKKEVENT, IN_PROGRESS); + + Talk(SAY_AGGRO); + DoZoneInCombat(); + } + + void JustDied(Unit* /*killer*/) override + { + ResetMobs(); + + if (instance) + instance->SetData(DATA_NALORAKKEVENT, DONE); + + Talk(SAY_DEATH); + } + + void KilledUnit(Unit* /*victim*/) override + { + switch (urand(0, 1)) { - if (waitTimer && inMove) - { - if (waitTimer <= diff) - { - (*me).GetMotionMaster()->MovementExpired(); - (*me).GetMotionMaster()->MovePoint(MovePhase, NalorakkWay[MovePhase][0], NalorakkWay[MovePhase][1], NalorakkWay[MovePhase][2]); - waitTimer = 0; - } else waitTimer -= diff; - } + case 0: + Talk(SAY_KILL_ONE); + break; + case 1: + Talk(SAY_KILL_TWO); + break; + } + } - if (!UpdateVictim()) + void MovementInform(uint32 type, uint32 id) override + { + if (MoveEvent) + { + if (type != POINT_MOTION_TYPE) return; - if (Berserk_Timer <= diff) + if (!inMove) + return; + + if (MovePhase != id) + return; + + switch (MovePhase) { - DoCast(me, SPELL_BERSERK, true); - Talk(SAY_BERSERK); - Berserk_Timer = 600000; - } else Berserk_Timer -= diff; + case 2: + me->SetOrientation(3.1415f * 2); + inMove = false; + return; + case 1: + case 3: + case 4: + case 6: + MovePhase ++; + waitTimer = 1; + inMove = true; + return; + case 5: + me->SetOrientation(3.1415f * 0.5f); + inMove = false; + return; + case 7: + me->SetOrientation(3.1415f * 0.5f); + inMove = false; + return; + } - if (ShapeShift_Timer <= diff) + } + } + + void UpdateAI(uint32 diff) override + { + if (waitTimer && inMove) + { + if (waitTimer <= diff) { - if (inBearForm) - { - // me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, 5122); - Talk(SAY_SHIFTEDTOTROLL); - me->RemoveAurasDueToSpell(SPELL_BEARFORM); - Surge_Timer = urand(15000, 20000); - BrutalSwipe_Timer = urand(7000, 12000); - Mangle_Timer = urand(10000, 15000); - ShapeShift_Timer = urand(45000, 50000); - inBearForm = false; - } - else - { - // me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, 0); - Talk(SAY_SHIFTEDTOBEAR); - DoCast(me, SPELL_BEARFORM, true); - LaceratingSlash_Timer = 2000; // dur 18s - RendFlesh_Timer = 3000; // dur 5s - DeafeningRoar_Timer = urand(5000, 10000); // dur 2s - ShapeShift_Timer = urand(20000, 25000); // dur 30s - inBearForm = true; - } - } else ShapeShift_Timer -= diff; + (*me).GetMotionMaster()->MovementExpired(); + (*me).GetMotionMaster()->MovePoint(MovePhase, NalorakkWay[MovePhase][0], NalorakkWay[MovePhase][1], NalorakkWay[MovePhase][2]); + waitTimer = 0; + } + else waitTimer -= diff; + } - if (!inBearForm) + if (!UpdateVictim()) + return; + + if (Berserk_Timer <= diff) + { + DoCast(me, SPELL_BERSERK, true); + Talk(SAY_BERSERK); + Berserk_Timer = 600000; + } + else Berserk_Timer -= diff; + + if (ShapeShift_Timer <= diff) + { + if (inBearForm) { - if (BrutalSwipe_Timer <= diff) - { - DoCastVictim(SPELL_BRUTALSWIPE); - BrutalSwipe_Timer = urand(7000, 12000); - } else BrutalSwipe_Timer -= diff; - - if (Mangle_Timer <= diff) - { - if (me->GetVictim() && !me->GetVictim()->HasAura(SPELL_MANGLEEFFECT)) - { - DoCastVictim(SPELL_MANGLE); - Mangle_Timer = 1000; - } - else Mangle_Timer = urand(10000, 15000); - } else Mangle_Timer -= diff; - - if (Surge_Timer <= diff) - { - Talk(SAY_SURGE); - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 45, true); - if (target) - DoCast(target, SPELL_SURGE); - Surge_Timer = urand(15000, 20000); - } else Surge_Timer -= diff; + // me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, 5122); + Talk(SAY_SHIFTEDTOTROLL); + me->RemoveAurasDueToSpell(SPELL_BEARFORM); + Surge_Timer = urand(15000, 20000); + BrutalSwipe_Timer = urand(7000, 12000); + Mangle_Timer = urand(10000, 15000); + ShapeShift_Timer = urand(45000, 50000); + inBearForm = false; } else { - if (LaceratingSlash_Timer <= diff) - { - DoCastVictim(SPELL_LACERATINGSLASH); - LaceratingSlash_Timer = urand(18000, 23000); - } else LaceratingSlash_Timer -= diff; - - if (RendFlesh_Timer <= diff) - { - DoCastVictim(SPELL_RENDFLESH); - RendFlesh_Timer = urand(5000, 10000); - } else RendFlesh_Timer -= diff; - - if (DeafeningRoar_Timer <= diff) - { - DoCastVictim(SPELL_DEAFENINGROAR); - DeafeningRoar_Timer = urand(15000, 20000); - } else DeafeningRoar_Timer -= diff; + // me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, 0); + Talk(SAY_SHIFTEDTOBEAR); + DoCast(me, SPELL_BEARFORM, true); + LaceratingSlash_Timer = 2000; // dur 18s + RendFlesh_Timer = 3000; // dur 5s + DeafeningRoar_Timer = urand(5000, 10000); // dur 2s + ShapeShift_Timer = urand(20000, 25000); // dur 30s + inBearForm = true; } - - DoMeleeAttackIfReady(); } - }; + else ShapeShift_Timer -= diff; - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(creature); + if (!inBearForm) + { + if (BrutalSwipe_Timer <= diff) + { + DoCastVictim(SPELL_BRUTALSWIPE); + BrutalSwipe_Timer = urand(7000, 12000); + } + else BrutalSwipe_Timer -= diff; + + if (Mangle_Timer <= diff) + { + if (me->GetVictim() && !me->GetVictim()->HasAura(SPELL_MANGLEEFFECT)) + { + DoCastVictim(SPELL_MANGLE); + Mangle_Timer = 1000; + } + else Mangle_Timer = urand(10000, 15000); + } + else Mangle_Timer -= diff; + + if (Surge_Timer <= diff) + { + Talk(SAY_SURGE); + Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 45, true); + if (target) + DoCast(target, SPELL_SURGE); + Surge_Timer = urand(15000, 20000); + } + else Surge_Timer -= diff; + } + else + { + if (LaceratingSlash_Timer <= diff) + { + DoCastVictim(SPELL_LACERATINGSLASH); + LaceratingSlash_Timer = urand(18000, 23000); + } + else LaceratingSlash_Timer -= diff; + + if (RendFlesh_Timer <= diff) + { + DoCastVictim(SPELL_RENDFLESH); + RendFlesh_Timer = urand(5000, 10000); + } + else RendFlesh_Timer -= diff; + + if (DeafeningRoar_Timer <= diff) + { + DoCastVictim(SPELL_DEAFENINGROAR); + DeafeningRoar_Timer = urand(15000, 20000); + } + else DeafeningRoar_Timer -= diff; + } + + DoMeleeAttackIfReady(); } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI(creature); + } }; void AddSC_boss_nalorakk() diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp index a380e25f0..6be673dcf 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp @@ -113,189 +113,190 @@ static TransformStruct Transform[4] = class boss_zuljin : public CreatureScript { - public: +public: - boss_zuljin() - : CreatureScript("boss_zuljin") + boss_zuljin() + : CreatureScript("boss_zuljin") + { + } + + struct boss_zuljinAI : public ScriptedAI + { + boss_zuljinAI(Creature* creature) : ScriptedAI(creature), Summons(me) { + instance = creature->GetInstanceScript(); + } + InstanceScript* instance; + + uint64 SpiritGUID[4]; + uint64 ClawTargetGUID; + uint64 TankGUID; + + uint32 Phase; + uint32 health_20; + + uint32 Intro_Timer; + uint32 Berserk_Timer; + + uint32 Whirlwind_Timer; + uint32 Grievous_Throw_Timer; + + uint32 Creeping_Paralysis_Timer; + uint32 Overpower_Timer; + + uint32 Claw_Rage_Timer; + uint32 Lynx_Rush_Timer; + uint32 Claw_Counter; + uint32 Claw_Loop_Timer; + + uint32 Flame_Whirl_Timer; + uint32 Flame_Breath_Timer; + uint32 Pillar_Of_Fire_Timer; + + SummonList Summons; + + void Reset() + { + instance->SetData(DATA_ZULJINEVENT, NOT_STARTED); + + Phase = 0; + + health_20 = me->CountPctFromMaxHealth(20); + + Intro_Timer = 37000; + Berserk_Timer = 600000; + + Whirlwind_Timer = 7000; + Grievous_Throw_Timer = 8000; + + Creeping_Paralysis_Timer = 7000; + Overpower_Timer = 0; + + Claw_Rage_Timer = 5000; + Lynx_Rush_Timer = 14000; + Claw_Loop_Timer = 0; + Claw_Counter = 0; + + Flame_Whirl_Timer = 5000; + Flame_Breath_Timer = 6000; + Pillar_Of_Fire_Timer = 7000; + + ClawTargetGUID = 0; + TankGUID = 0; + + Summons.DespawnAll(); + + me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 33975); + //me->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, 218172674); + //me->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE); } - struct boss_zuljinAI : public ScriptedAI + void EnterCombat(Unit* /*who*/) { - boss_zuljinAI(Creature* creature) : ScriptedAI(creature), Summons(me) + instance->SetData(DATA_ZULJINEVENT, IN_PROGRESS); + + DoZoneInCombat(); + + Talk(YELL_INTRO); + SpawnAdds(); + EnterPhase(0); + } + + void KilledUnit(Unit* /*victim*/) + { + if (Intro_Timer) + return; + + Talk(YELL_KILL); + } + + void JustDied(Unit* /*killer*/) + { + instance->SetData(DATA_ZULJINEVENT, DONE); + + Talk(YELL_DEATH); + Summons.DespawnEntry(CREATURE_COLUMN_OF_FIRE); + + if (Unit* Temp = ObjectAccessor::GetUnit(*me, SpiritGUID[3])) + Temp->SetUInt32Value(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_DEAD); + } + + void AttackStart(Unit* who) + { + if (Phase == 2) + AttackStartNoMove(who); + else + ScriptedAI::AttackStart(who); + } + + void DoMeleeAttackIfReady() + { + if (!me->IsNonMeleeSpellCast(false)) { - instance = creature->GetInstanceScript(); - } - InstanceScript* instance; - - uint64 SpiritGUID[4]; - uint64 ClawTargetGUID; - uint64 TankGUID; - - uint32 Phase; - uint32 health_20; - - uint32 Intro_Timer; - uint32 Berserk_Timer; - - uint32 Whirlwind_Timer; - uint32 Grievous_Throw_Timer; - - uint32 Creeping_Paralysis_Timer; - uint32 Overpower_Timer; - - uint32 Claw_Rage_Timer; - uint32 Lynx_Rush_Timer; - uint32 Claw_Counter; - uint32 Claw_Loop_Timer; - - uint32 Flame_Whirl_Timer; - uint32 Flame_Breath_Timer; - uint32 Pillar_Of_Fire_Timer; - - SummonList Summons; - - void Reset() - { - instance->SetData(DATA_ZULJINEVENT, NOT_STARTED); - - Phase = 0; - - health_20 = me->CountPctFromMaxHealth(20); - - Intro_Timer = 37000; - Berserk_Timer = 600000; - - Whirlwind_Timer = 7000; - Grievous_Throw_Timer = 8000; - - Creeping_Paralysis_Timer = 7000; - Overpower_Timer = 0; - - Claw_Rage_Timer = 5000; - Lynx_Rush_Timer = 14000; - Claw_Loop_Timer = 0; - Claw_Counter = 0; - - Flame_Whirl_Timer = 5000; - Flame_Breath_Timer = 6000; - Pillar_Of_Fire_Timer = 7000; - - ClawTargetGUID = 0; - TankGUID = 0; - - Summons.DespawnAll(); - - me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 33975); - //me->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, 218172674); - //me->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE); - } - - void EnterCombat(Unit* /*who*/) - { - instance->SetData(DATA_ZULJINEVENT, IN_PROGRESS); - - DoZoneInCombat(); - - Talk(YELL_INTRO); - SpawnAdds(); - EnterPhase(0); - } - - void KilledUnit(Unit* /*victim*/) - { - if (Intro_Timer) - return; - - Talk(YELL_KILL); - } - - void JustDied(Unit* /*killer*/) - { - instance->SetData(DATA_ZULJINEVENT, DONE); - - Talk(YELL_DEATH); - Summons.DespawnEntry(CREATURE_COLUMN_OF_FIRE); - - if (Unit* Temp = ObjectAccessor::GetUnit(*me, SpiritGUID[3])) - Temp->SetUInt32Value(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_DEAD); - } - - void AttackStart(Unit* who) - { - if (Phase == 2) - AttackStartNoMove(who); - else - ScriptedAI::AttackStart(who); - } - - void DoMeleeAttackIfReady() - { - if (!me->IsNonMeleeSpellCast(false)) + if (me->isAttackReady() && me->IsWithinMeleeRange(me->GetVictim())) { - if (me->isAttackReady() && me->IsWithinMeleeRange(me->GetVictim())) + if (Phase == 1 && !Overpower_Timer) { - if (Phase == 1 && !Overpower_Timer) + uint32 health = me->GetVictim()->GetHealth(); + me->AttackerStateUpdate(me->GetVictim()); + if (me->GetVictim() && health == me->GetVictim()->GetHealth()) { - uint32 health = me->GetVictim()->GetHealth(); - me->AttackerStateUpdate(me->GetVictim()); - if (me->GetVictim() && health == me->GetVictim()->GetHealth()) - { - DoCastVictim(SPELL_OVERPOWER, false); - Overpower_Timer = 5000; - } - } else me->AttackerStateUpdate(me->GetVictim()); - me->resetAttackTimer(); - } - } - } - - void SpawnAdds() - { - Creature* creature = nullptr; - for (uint8 i = 0; i < 4; ++i) - { - creature = me->SummonCreature(SpiritInfo[i].entry, SpiritInfo[i].x, SpiritInfo[i].y, SpiritInfo[i].z, SpiritInfo[i].orient, TEMPSUMMON_DEAD_DESPAWN, 0); - if (creature) - { - creature->CastSpell(creature, SPELL_SPIRIT_AURA, true); - creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - SpiritGUID[i] = creature->GetGUID(); - } - } - } - - void DespawnAdds() - { - for (uint8 i = 0; i < 4; ++i) - { - if (SpiritGUID[i]) - { - if (Unit* temp = ObjectAccessor::GetUnit(*me, SpiritGUID[i])) - { - temp->SetVisible(false); - temp->setDeathState(DEAD); + DoCastVictim(SPELL_OVERPOWER, false); + Overpower_Timer = 5000; } } - SpiritGUID[i] = 0; + else me->AttackerStateUpdate(me->GetVictim()); + me->resetAttackTimer(); } } + } - void JustSummoned(Creature* summon) + void SpawnAdds() + { + Creature* creature = nullptr; + for (uint8 i = 0; i < 4; ++i) { - Summons.Summon(summon); - } - - void SummonedCreatureDespawn(Creature* summon) - { - Summons.Despawn(summon); - } - - void EnterPhase(uint32 NextPhase) - { - switch (NextPhase) + creature = me->SummonCreature(SpiritInfo[i].entry, SpiritInfo[i].x, SpiritInfo[i].y, SpiritInfo[i].z, SpiritInfo[i].orient, TEMPSUMMON_DEAD_DESPAWN, 0); + if (creature) { + creature->CastSpell(creature, SPELL_SPIRIT_AURA, true); + creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + SpiritGUID[i] = creature->GetGUID(); + } + } + } + + void DespawnAdds() + { + for (uint8 i = 0; i < 4; ++i) + { + if (SpiritGUID[i]) + { + if (Unit* temp = ObjectAccessor::GetUnit(*me, SpiritGUID[i])) + { + temp->SetVisible(false); + temp->setDeathState(DEAD); + } + } + SpiritGUID[i] = 0; + } + } + + void JustSummoned(Creature* summon) + { + Summons.Summon(summon); + } + + void SummonedCreatureDespawn(Creature* summon) + { + Summons.Despawn(summon); + } + + void EnterPhase(uint32 NextPhase) + { + switch (NextPhase) + { case 0: break; case 1: @@ -344,30 +345,31 @@ class boss_zuljin : public CreatureScript break; default: break; - } - Phase = NextPhase; + } + Phase = NextPhase; + } + + void UpdateAI(uint32 diff) + { + if (!TankGUID) + { + if (!UpdateVictim()) + return; + + if (me->GetHealth() < health_20 * (4 - Phase)) + EnterPhase(Phase + 1); } - void UpdateAI(uint32 diff) + if (Berserk_Timer <= diff) { - if (!TankGUID) - { - if (!UpdateVictim()) - return; + DoCast(me, SPELL_BERSERK, true); + Talk(YELL_BERSERK); + Berserk_Timer = 60000; + } + else Berserk_Timer -= diff; - if (me->GetHealth() < health_20 * (4 - Phase)) - EnterPhase(Phase + 1); - } - - if (Berserk_Timer <= diff) - { - DoCast(me, SPELL_BERSERK, true); - Talk(YELL_BERSERK); - Berserk_Timer = 60000; - } else Berserk_Timer -= diff; - - switch (Phase) - { + switch (Phase) + { case 0: if (Intro_Timer) { @@ -375,21 +377,24 @@ class boss_zuljin : public CreatureScript { Talk(YELL_AGGRO); Intro_Timer = 0; - } else Intro_Timer -= diff; + } + else Intro_Timer -= diff; } if (Whirlwind_Timer <= diff) { DoCast(me, SPELL_WHIRLWIND); Whirlwind_Timer = urand(15000, 20000); - } else Whirlwind_Timer -= diff; + } + else Whirlwind_Timer -= diff; if (Grievous_Throw_Timer <= diff) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_GRIEVOUS_THROW, false); Grievous_Throw_Timer = 10000; - } else Grievous_Throw_Timer -= diff; + } + else Grievous_Throw_Timer -= diff; break; case 1: @@ -397,13 +402,15 @@ class boss_zuljin : public CreatureScript { DoCast(me, SPELL_CREEPING_PARALYSIS); Creeping_Paralysis_Timer = 20000; - } else Creeping_Paralysis_Timer -= diff; + } + else Creeping_Paralysis_Timer -= diff; if (Overpower_Timer <= diff) { // implemented in DoMeleeAttackIfReady() Overpower_Timer = 0; - } else Overpower_Timer -= diff; + } + else Overpower_Timer -= diff; break; case 2: @@ -455,9 +462,11 @@ class boss_zuljin : public CreatureScript EnterEvadeMode(); // if (target) return; } - } else Claw_Loop_Timer -= diff; + } + else Claw_Loop_Timer -= diff; } //if (TankGUID) - } else Claw_Rage_Timer -= diff; + } + else Claw_Rage_Timer -= diff; if (Lynx_Rush_Timer <= diff) { @@ -503,7 +512,8 @@ class boss_zuljin : public CreatureScript return; } } //if (TankGUID) - } else Lynx_Rush_Timer -= diff; + } + else Lynx_Rush_Timer -= diff; break; case 4: @@ -511,14 +521,16 @@ class boss_zuljin : public CreatureScript { DoCast(me, SPELL_FLAME_WHIRL); Flame_Whirl_Timer = 12000; - }Flame_Whirl_Timer -= diff; + } + Flame_Whirl_Timer -= diff; if (Pillar_Of_Fire_Timer <= diff) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) DoCast(target, SPELL_SUMMON_PILLAR); Pillar_Of_Fire_Timer = 10000; - } else Pillar_Of_Fire_Timer -= diff; + } + else Pillar_Of_Fire_Timer -= diff; if (Flame_Breath_Timer <= diff) { @@ -526,59 +538,60 @@ class boss_zuljin : public CreatureScript me->SetInFront(target); DoCast(me, SPELL_FLAME_BREATH); Flame_Breath_Timer = 10000; - } else Flame_Breath_Timer -= diff; + } + else Flame_Breath_Timer -= diff; break; default: break; - } - - if (!TankGUID) - DoMeleeAttackIfReady(); } - }; - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + if (!TankGUID) + DoMeleeAttackIfReady(); } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class npc_zuljin_vortex : public CreatureScript { - public: +public: - npc_zuljin_vortex() - : CreatureScript("npc_zuljin_vortex") + npc_zuljin_vortex() + : CreatureScript("npc_zuljin_vortex") + { + } + + struct npc_zuljin_vortexAI : public ScriptedAI + { + npc_zuljin_vortexAI(Creature* creature) : ScriptedAI(creature) { } + + void Reset() { } + + void EnterCombat(Unit* /*target*/) { } + + void SpellHit(Unit* caster, const SpellInfo* spell) { + if (spell->Id == SPELL_ZAP_INFORM) + DoCast(caster, SPELL_ZAP_DAMAGE, true); } - struct npc_zuljin_vortexAI : public ScriptedAI + void UpdateAI(uint32 /*diff*/) { - npc_zuljin_vortexAI(Creature* creature) : ScriptedAI(creature) { } - - void Reset() { } - - void EnterCombat(Unit* /*target*/) { } - - void SpellHit(Unit* caster, const SpellInfo* spell) - { - if (spell->Id == SPELL_ZAP_INFORM) - DoCast(caster, SPELL_ZAP_DAMAGE, true); - } - - void UpdateAI(uint32 /*diff*/) - { - //if the vortex reach the target, it change his target to another player - if (me->IsWithinMeleeRange(me->GetVictim())) - AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0)); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_zuljin_vortexAI(creature); + //if the vortex reach the target, it change his target to another player + if (me->IsWithinMeleeRange(me->GetVictim())) + AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0)); } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_zuljin_vortexAI(creature); + } }; void AddSC_boss_zuljin() diff --git a/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp index 243e1a539..db04a015e 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp @@ -1,8 +1,8 @@ - /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license: https://github.com/azerothcore/azerothcore-wotlk/blob/master/LICENSE-GPL2 - * Copyright (C) 2008-2016 TrinityCore - * Copyright (C) 2005-2009 MaNGOS - */ +/* +* Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license: https://github.com/azerothcore/azerothcore-wotlk/blob/master/LICENSE-GPL2 +* Copyright (C) 2008-2016 TrinityCore +* Copyright (C) 2005-2009 MaNGOS +*/ /* ScriptData SDName: instance_zulaman @@ -46,323 +46,359 @@ Position const HarrisonJonesLoc = {120.687f, 1674.0f, 42.0217f, 1.59044f}; class instance_zulaman : public InstanceMapScript { - public: - instance_zulaman() - : InstanceMapScript("instance_zulaman", 568) +public: + instance_zulaman() + : InstanceMapScript("instance_zulaman", 568) + { + } + + struct instance_zulaman_InstanceMapScript : public InstanceScript + { + instance_zulaman_InstanceMapScript(Map* map) : InstanceScript(map) {} + + uint64 HarkorsSatchelGUID; + uint64 TanzarsTrunkGUID; + uint64 AshlisBagGUID; + uint64 KrazsPackageGUID; + uint64 StrangeGongGUID; + uint64 HarrisonJonesGUID; + + uint64 HexLordGateGUID; + uint64 ZulJinGateGUID; + uint64 MassiveGateGUID; + uint64 AkilzonDoorGUID; + uint64 ZulJinDoorGUID; + uint64 HalazziDoorGUID; + + uint32 QuestTimer; + uint16 BossKilled; + uint16 QuestMinute; + uint16 ChestLooted; + + uint32 m_auiEncounter[MAX_ENCOUNTER]; + uint32 RandVendor[RAND_VENDOR]; + + void Initialize() { + memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); + + HarkorsSatchelGUID = 0; + TanzarsTrunkGUID = 0; + AshlisBagGUID = 0; + KrazsPackageGUID = 0; + StrangeGongGUID = 0; + HexLordGateGUID = 0; + ZulJinGateGUID = 0; + MassiveGateGUID = 0; + AkilzonDoorGUID = 0; + HalazziDoorGUID = 0; + ZulJinDoorGUID = 0; + + HarrisonJonesGUID = 0; + + QuestTimer = 0; + QuestMinute = 0; + BossKilled = 0; + ChestLooted = 0; + + for (uint8 i = 0; i < RAND_VENDOR; ++i) + RandVendor[i] = NOT_STARTED; + + m_auiEncounter[DATA_GONGEVENT] = NOT_STARTED; } - struct instance_zulaman_InstanceMapScript : public InstanceScript + bool IsEncounterInProgress() const { - instance_zulaman_InstanceMapScript(Map* map) : InstanceScript(map) {} + for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) + if (m_auiEncounter[i] == IN_PROGRESS) + return true; - uint64 HarkorsSatchelGUID; - uint64 TanzarsTrunkGUID; - uint64 AshlisBagGUID; - uint64 KrazsPackageGUID; - uint64 StrangeGongGUID; - uint64 HarrisonJonesGUID; + return false; + } - uint64 HexLordGateGUID; - uint64 ZulJinGateGUID; - uint64 MassiveGateGUID; - uint64 AkilzonDoorGUID; - uint64 ZulJinDoorGUID; - uint64 HalazziDoorGUID; + void OnPlayerEnter(Player* /*player*/) + { + if (!HarrisonJonesGUID) + instance->SummonCreature(NPC_HARRISON_JONES, HarrisonJonesLoc); + } - uint32 QuestTimer; - uint16 BossKilled; - uint16 QuestMinute; - uint16 ChestLooted; - - uint32 m_auiEncounter[MAX_ENCOUNTER]; - uint32 RandVendor[RAND_VENDOR]; - - void Initialize() + void OnCreatureCreate(Creature* creature) + { + switch (creature->GetEntry()) { - memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); - - HarkorsSatchelGUID = 0; - TanzarsTrunkGUID = 0; - AshlisBagGUID = 0; - KrazsPackageGUID = 0; - StrangeGongGUID = 0; - HexLordGateGUID = 0; - ZulJinGateGUID = 0; - MassiveGateGUID = 0; - AkilzonDoorGUID = 0; - HalazziDoorGUID = 0; - ZulJinDoorGUID = 0; - - HarrisonJonesGUID = 0; - - QuestTimer = 0; - QuestMinute = 0; - BossKilled = 0; - ChestLooted = 0; - - for (uint8 i = 0; i < RAND_VENDOR; ++i) - RandVendor[i] = NOT_STARTED; - - m_auiEncounter[DATA_GONGEVENT] = NOT_STARTED; + case NPC_HARRISON_JONES: + HarrisonJonesGUID = creature->GetGUID(); + break; + case NPC_JANALAI: + case NPC_ZULJIN: + case NPC_HEXLORD: + case NPC_HALAZZI: + case NPC_NALORAKK: + default: + break; } + } - bool IsEncounterInProgress() const + void OnGameObjectCreate(GameObject* go) + { + switch (go->GetEntry()) { - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) - return true; + case GO_DOOR_HALAZZI: + HalazziDoorGUID = go->GetGUID(); + break; + case GO_GATE_ZULJIN: + ZulJinGateGUID = go->GetGUID(); + break; + case GO_GATE_HEXLORD: + HexLordGateGUID = go->GetGUID(); + break; + case GO_MASSIVE_GATE: + MassiveGateGUID = go->GetGUID(); + break; + case GO_DOOR_AKILZON: + AkilzonDoorGUID = go->GetGUID(); + break; + case GO_DOOR_ZULJIN: + ZulJinDoorGUID = go->GetGUID(); + break; - return false; + case GO_HARKORS_SATCHEL: + HarkorsSatchelGUID = go->GetGUID(); + break; + case GO_TANZARS_TRUNK: + TanzarsTrunkGUID = go->GetGUID(); + break; + case GO_ASHLIS_BAG: + AshlisBagGUID = go->GetGUID(); + break; + case GO_KRAZS_PACKAGE: + KrazsPackageGUID = go->GetGUID(); + break; + case GO_STRANGE_GONG: + StrangeGongGUID = go->GetGUID(); + break; + default: + break; } + CheckInstanceStatus(); + } - void OnPlayerEnter(Player* /*player*/) - { - if (!HarrisonJonesGUID) - instance->SummonCreature(NPC_HARRISON_JONES, HarrisonJonesLoc); - } + void SummonHostage(uint8 num) + { + if (!QuestMinute) + return; - void OnCreatureCreate(Creature* creature) + Map::PlayerList const& PlayerList = instance->GetPlayers(); + if (PlayerList.isEmpty()) + return; + + Map::PlayerList::const_iterator i = PlayerList.begin(); + if (Player* i_pl = i->GetSource()) { - switch (creature->GetEntry()) + if (Unit* Hostage = i_pl->SummonCreature(HostageInfo[num].npc, HostageInfo[num].x, HostageInfo[num].y, HostageInfo[num].z, HostageInfo[num].o, TEMPSUMMON_DEAD_DESPAWN, 0)) { - case NPC_HARRISON_JONES: - HarrisonJonesGUID = creature->GetGUID(); - break; - case NPC_JANALAI: - case NPC_ZULJIN: - case NPC_HEXLORD: - case NPC_HALAZZI: - case NPC_NALORAKK: - default: - break; + Hostage->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + Hostage->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); } } + } - void OnGameObjectCreate(GameObject* go) + void CheckInstanceStatus() + { + if (BossKilled >= DATA_HALAZZIEVENT) + HandleGameObject(HexLordGateGUID, true); + + if (BossKilled >= DATA_HEXLORDEVENT) + HandleGameObject(ZulJinGateGUID, true); + } + + std::string GetSaveData() + { + OUT_SAVE_INST_DATA; + + std::ostringstream ss; + ss << "S " << BossKilled << ' ' << ChestLooted << ' ' << QuestMinute; + + OUT_SAVE_INST_DATA_COMPLETE; + return ss.str(); + } + + void Load(const char* load) + { + if (!load) + return; + + std::istringstream ss(load); + //sLog->outError("Zul'aman loaded, %s.", ss.str().c_str()); + char dataHead; // S + uint16 data1, data2, data3; + ss >> dataHead >> data1 >> data2 >> data3; + //sLog->outError("Zul'aman loaded, %d %d %d.", data1, data2, data3); + if (dataHead == 'S') { - switch (go->GetEntry()) - { - case GO_DOOR_HALAZZI: HalazziDoorGUID = go->GetGUID(); break; - case GO_GATE_ZULJIN: ZulJinGateGUID = go->GetGUID(); break; - case GO_GATE_HEXLORD: HexLordGateGUID = go->GetGUID(); break; - case GO_MASSIVE_GATE: MassiveGateGUID = go->GetGUID(); break; - case GO_DOOR_AKILZON: AkilzonDoorGUID = go->GetGUID(); break; - case GO_DOOR_ZULJIN: ZulJinDoorGUID = go->GetGUID(); break; - - case GO_HARKORS_SATCHEL: HarkorsSatchelGUID = go->GetGUID(); break; - case GO_TANZARS_TRUNK: TanzarsTrunkGUID = go->GetGUID(); break; - case GO_ASHLIS_BAG: AshlisBagGUID = go->GetGUID(); break; - case GO_KRAZS_PACKAGE: KrazsPackageGUID = go->GetGUID(); break; - case GO_STRANGE_GONG: StrangeGongGUID = go->GetGUID(); break; - default: break; - } - CheckInstanceStatus(); + BossKilled = data1; + ChestLooted = data2; + QuestMinute = data3; } + else sLog->outError("Zul'aman: corrupted save data."); + } - void SummonHostage(uint8 num) + void SetData(uint32 type, uint32 data) + { + switch (type) { - if (!QuestMinute) - return; - - Map::PlayerList const &PlayerList = instance->GetPlayers(); - if (PlayerList.isEmpty()) - return; - - Map::PlayerList::const_iterator i = PlayerList.begin(); - if (Player* i_pl = i->GetSource()) - { - if (Unit* Hostage = i_pl->SummonCreature(HostageInfo[num].npc, HostageInfo[num].x, HostageInfo[num].y, HostageInfo[num].z, HostageInfo[num].o, TEMPSUMMON_DEAD_DESPAWN, 0)) + case DATA_GONGEVENT: + m_auiEncounter[DATA_GONGEVENT] = data; + if (data == IN_PROGRESS) + SaveToDB(); + else if (data == DONE) + QuestMinute = 21; + break; + case DATA_NALORAKKEVENT: + m_auiEncounter[DATA_NALORAKKEVENT] = data; + if (data == DONE) { - Hostage->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - Hostage->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - } - } - } - - void CheckInstanceStatus() - { - if (BossKilled >= DATA_HALAZZIEVENT) - HandleGameObject(HexLordGateGUID, true); - - if (BossKilled >= DATA_HEXLORDEVENT) - HandleGameObject(ZulJinGateGUID, true); - } - - std::string GetSaveData() - { - OUT_SAVE_INST_DATA; - - std::ostringstream ss; - ss << "S " << BossKilled << ' ' << ChestLooted << ' ' << QuestMinute; - - OUT_SAVE_INST_DATA_COMPLETE; - return ss.str(); - } - - void Load(const char* load) - { - if (!load) - return; - - std::istringstream ss(load); - //sLog->outError("Zul'aman loaded, %s.", ss.str().c_str()); - char dataHead; // S - uint16 data1, data2, data3; - ss >> dataHead >> data1 >> data2 >> data3; - //sLog->outError("Zul'aman loaded, %d %d %d.", data1, data2, data3); - if (dataHead == 'S') - { - BossKilled = data1; - ChestLooted = data2; - QuestMinute = data3; - } else sLog->outError("Zul'aman: corrupted save data."); - } - - void SetData(uint32 type, uint32 data) - { - switch (type) - { - case DATA_GONGEVENT: - m_auiEncounter[DATA_GONGEVENT] = data; - if (data == IN_PROGRESS) - SaveToDB(); - else if (data == DONE) - QuestMinute = 21; - break; - case DATA_NALORAKKEVENT: - m_auiEncounter[DATA_NALORAKKEVENT] = data; - if (data == DONE) - { - if (QuestMinute) - { - QuestMinute += 15; - DoUpdateWorldState(WORLDSTATE_TIME_TO_SACRIFICE, QuestMinute); - } - SummonHostage(0); - SaveToDB(); - } - break; - case DATA_AKILZONEVENT: - m_auiEncounter[DATA_AKILZONEVENT] = data; - HandleGameObject(AkilzonDoorGUID, data != IN_PROGRESS); - if (data == DONE) - { - if (QuestMinute) - { - QuestMinute += 10; - DoUpdateWorldState(WORLDSTATE_TIME_TO_SACRIFICE, QuestMinute); - } - SummonHostage(1); - SaveToDB(); - } - break; - case DATA_JANALAIEVENT: - m_auiEncounter[DATA_JANALAIEVENT] = data; - if (data == DONE) - SummonHostage(2); - SaveToDB(); - break; - case DATA_HALAZZIEVENT: - m_auiEncounter[DATA_HALAZZIEVENT] = data; - HandleGameObject(HalazziDoorGUID, data != IN_PROGRESS); - if (data == DONE) SummonHostage(3); - SaveToDB(); - break; - case DATA_HEXLORDEVENT: - m_auiEncounter[DATA_HEXLORDEVENT] = data; - if (data == IN_PROGRESS) - HandleGameObject(HexLordGateGUID, false); - else if (data == NOT_STARTED) - CheckInstanceStatus(); - SaveToDB(); - break; - case DATA_ZULJINEVENT: - m_auiEncounter[DATA_ZULJINEVENT] = data; - HandleGameObject(ZulJinDoorGUID, data != IN_PROGRESS); - SaveToDB(); - break; - case DATA_CHESTLOOTED: - ++ChestLooted; - SaveToDB(); - break; - case TYPE_RAND_VENDOR_1: - RandVendor[0] = data; - break; - case TYPE_RAND_VENDOR_2: - RandVendor[1] = data; - break; - } - - if (data == DONE) - { - ++BossKilled; - if (QuestMinute && BossKilled >= DATA_HALAZZIEVENT) - { - QuestMinute = 0; - DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 0); - } - CheckInstanceStatus(); - SaveToDB(); - } - } - - uint32 GetData(uint32 type) const - { - switch (type) - { - case DATA_GONGEVENT: return m_auiEncounter[DATA_GONGEVENT]; - case DATA_NALORAKKEVENT: return m_auiEncounter[DATA_NALORAKKEVENT]; - case DATA_AKILZONEVENT: return m_auiEncounter[DATA_AKILZONEVENT]; - case DATA_JANALAIEVENT: return m_auiEncounter[DATA_JANALAIEVENT]; - case DATA_HALAZZIEVENT: return m_auiEncounter[DATA_HALAZZIEVENT]; - case DATA_HEXLORDEVENT: return m_auiEncounter[DATA_HEXLORDEVENT]; - case DATA_ZULJINEVENT: return m_auiEncounter[DATA_ZULJINEVENT]; - case DATA_CHESTLOOTED: return ChestLooted; - case TYPE_RAND_VENDOR_1: return RandVendor[0]; - case TYPE_RAND_VENDOR_2: return RandVendor[1]; - default: return 0; - } - } - - void Update(uint32 diff) - { - if (QuestMinute) - { - if (QuestTimer <= diff) - { - QuestMinute--; - SaveToDB(); - QuestTimer += 60000; if (QuestMinute) { - DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 1); + QuestMinute += 15; DoUpdateWorldState(WORLDSTATE_TIME_TO_SACRIFICE, QuestMinute); - } else DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 0); + } + SummonHostage(0); + SaveToDB(); } - QuestTimer -= diff; - } + break; + case DATA_AKILZONEVENT: + m_auiEncounter[DATA_AKILZONEVENT] = data; + HandleGameObject(AkilzonDoorGUID, data != IN_PROGRESS); + if (data == DONE) + { + if (QuestMinute) + { + QuestMinute += 10; + DoUpdateWorldState(WORLDSTATE_TIME_TO_SACRIFICE, QuestMinute); + } + SummonHostage(1); + SaveToDB(); + } + break; + case DATA_JANALAIEVENT: + m_auiEncounter[DATA_JANALAIEVENT] = data; + if (data == DONE) + SummonHostage(2); + SaveToDB(); + break; + case DATA_HALAZZIEVENT: + m_auiEncounter[DATA_HALAZZIEVENT] = data; + HandleGameObject(HalazziDoorGUID, data != IN_PROGRESS); + if (data == DONE) SummonHostage(3); + SaveToDB(); + break; + case DATA_HEXLORDEVENT: + m_auiEncounter[DATA_HEXLORDEVENT] = data; + if (data == IN_PROGRESS) + HandleGameObject(HexLordGateGUID, false); + else if (data == NOT_STARTED) + CheckInstanceStatus(); + SaveToDB(); + break; + case DATA_ZULJINEVENT: + m_auiEncounter[DATA_ZULJINEVENT] = data; + HandleGameObject(ZulJinDoorGUID, data != IN_PROGRESS); + SaveToDB(); + break; + case DATA_CHESTLOOTED: + ++ChestLooted; + SaveToDB(); + break; + case TYPE_RAND_VENDOR_1: + RandVendor[0] = data; + break; + case TYPE_RAND_VENDOR_2: + RandVendor[1] = data; + break; } - uint64 GetData64(uint32 type) const + if (data == DONE) { - switch (type) + ++BossKilled; + if (QuestMinute && BossKilled >= DATA_HALAZZIEVENT) { - case GO_STRANGE_GONG: - return StrangeGongGUID; - case GO_MASSIVE_GATE: - return MassiveGateGUID; + QuestMinute = 0; + DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 0); } + CheckInstanceStatus(); + SaveToDB(); + } + } - return 0; + uint32 GetData(uint32 type) const + { + switch (type) + { + case DATA_GONGEVENT: + return m_auiEncounter[DATA_GONGEVENT]; + case DATA_NALORAKKEVENT: + return m_auiEncounter[DATA_NALORAKKEVENT]; + case DATA_AKILZONEVENT: + return m_auiEncounter[DATA_AKILZONEVENT]; + case DATA_JANALAIEVENT: + return m_auiEncounter[DATA_JANALAIEVENT]; + case DATA_HALAZZIEVENT: + return m_auiEncounter[DATA_HALAZZIEVENT]; + case DATA_HEXLORDEVENT: + return m_auiEncounter[DATA_HEXLORDEVENT]; + case DATA_ZULJINEVENT: + return m_auiEncounter[DATA_ZULJINEVENT]; + case DATA_CHESTLOOTED: + return ChestLooted; + case TYPE_RAND_VENDOR_1: + return RandVendor[0]; + case TYPE_RAND_VENDOR_2: + return RandVendor[1]; + default: + return 0; + } + } + + void Update(uint32 diff) + { + if (QuestMinute) + { + if (QuestTimer <= diff) + { + QuestMinute--; + SaveToDB(); + QuestTimer += 60000; + if (QuestMinute) + { + DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 1); + DoUpdateWorldState(WORLDSTATE_TIME_TO_SACRIFICE, QuestMinute); + } + else DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 0); + } + QuestTimer -= diff; + } + } + + uint64 GetData64(uint32 type) const + { + switch (type) + { + case GO_STRANGE_GONG: + return StrangeGongGUID; + case GO_MASSIVE_GATE: + return MassiveGateGUID; } - }; - - InstanceScript* GetInstanceScript(InstanceMap* map) const - { - return new instance_zulaman_InstanceMapScript(map); + return 0; } + + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_zulaman_InstanceMapScript(map); + } }; void AddSC_instance_zulaman() diff --git a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp index d34afa536..d661b8f23 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp @@ -36,7 +36,7 @@ enum ForestFrog SPELL_SUMMON_AMANI_CHARM_CHEST_2 = 43756, // Amani Charm Box (186734) SPELL_SUMMON_MONEY_BAG = 43774, // Money Bag (186736) SPELL_STEALTH_ = 34189, - + // Creatures NPC_FOREST_FROG = 24396, NPC_MANNUTH = 24397, @@ -116,235 +116,321 @@ enum ForestFrog class npc_forest_frog : public CreatureScript { - public: +public: - npc_forest_frog() : CreatureScript("npc_forest_frog") { } + npc_forest_frog() : CreatureScript("npc_forest_frog") { } - struct npc_forest_frogAI : public ScriptedAI + struct npc_forest_frogAI : public ScriptedAI + { + npc_forest_frogAI(Creature* creature) : ScriptedAI(creature) { - npc_forest_frogAI(Creature* creature) : ScriptedAI(creature) - { - instance = creature->GetInstanceScript(); - } - - InstanceScript* instance; - EventMap events; - uint8 eventTimer; - uint64 PlayerGUID; - - void Reset() override { } - - void EnterCombat(Unit* /*who*/) override { } - - void MovementInform(uint32 type, uint32 data) override - { - if (type == POINT_MOTION_TYPE && data == POINT_DESPAWN) - me->DespawnOrUnsummon(1000); - } - - void UpdateAI(uint32 diff) override - { - events.Update(diff); - if (eventTimer) - { - Player* player = me->GetMap()->GetPlayer(PlayerGUID); - switch (events.ExecuteEvent()) - { - case 1: - switch (me->GetEntry()) - { - case NPC_MANNUTH: Talk(SAY_MANNUTH_0, player); break; - case NPC_DEEZ: Talk(SAY_DEEZ_0, player); break; - case NPC_GALATHRYN: Talk(SAY_GALATHRYN_0, player); break; - case NPC_ADARRAH: Talk(SAY_ADARRAH_1, player); break; - case NPC_DARWEN: Talk(SAY_DARWEN_0, player); break; - case NPC_FUDGERICK: Talk(SAY_FUDGERICK_0, player); break; - case NPC_GUNTER: Talk(SAY_GUNTER_0, player); break; - case NPC_KYREN: Talk(SAY_KYREN_0, player); break; - case NPC_MITZI: Talk(SAY_MITZI_0, player); break; - case NPC_CHRISTIAN: Talk(SAY_CHRISTIAN_0, player); break; - case NPC_BRENNAN: Talk(SAY_BRENNAN_0, player); break; - case NPC_HOLLEE: Talk(SAY_HOLLEE_0, player); break; - } - eventTimer = 2; - events.ScheduleEvent(eventTimer, urand(4000, 5000)); - break; - case 2: - if (me->GetEntry() != NPC_GUNTER && me->GetEntry() != NPC_KYREN) // vendors don't kneel? - me->SetStandState(UNIT_STAND_STATE_KNEEL); - - switch (me->GetEntry()) - { - case NPC_MANNUTH: - DoCast(me, SPELL_SUMMON_AMANI_CHARM_CHEST_2, true); - Talk(SAY_MANNUTH_1, player); - break; - case NPC_DEEZ: - DoCast(me, SPELL_SUMMON_AMANI_CHARM_CHEST_2, true); - Talk(SAY_DEEZ_1, player); - break; - case NPC_GALATHRYN: - DoCast(me, SPELL_SUMMON_AMANI_CHARM_CHEST_2, true); - Talk(SAY_GALATHRYN_1, player); - break; - case NPC_ADARRAH: - DoCast(me, SPELL_SUMMON_AMANI_CHARM_CHEST_2, true); - Talk(SAY_ADARRAH_2, player); - break; - case NPC_DARWEN: - DoCast(me, SPELL_SUMMON_MONEY_BAG, true); - me->LoadEquipment(0, true); - Talk(SAY_DARWEN_1, player); - break; - case NPC_FUDGERICK: - DoCast(me, SPELL_SUMMON_MONEY_BAG, true); - me->LoadEquipment(0, true); - Talk(SAY_FUDGERICK_1, player); - break; - case NPC_GUNTER: - Talk(SAY_GUNTER_1, player); - break; - case NPC_KYREN: - Talk(SAY_KYREN_1, player); - break; - case NPC_MITZI: - DoCast(me, SPELL_SUMMON_AMANI_CHARM_CHEST_1, true); - Talk(SAY_MITZI_1, player); - break; - case NPC_CHRISTIAN: - DoCast(me, SPELL_SUMMON_AMANI_CHARM_CHEST_1, true); - Talk(SAY_CHRISTIAN_1, player); - break; - case NPC_BRENNAN: - DoCast(me, SPELL_SUMMON_AMANI_CHARM_CHEST_1, true); - Talk(SAY_BRENNAN_1, player); - break; - case NPC_HOLLEE: - DoCast(me, SPELL_SUMMON_AMANI_CHARM_CHEST_1, true); - Talk(SAY_HOLLEE_1, player); - break; - } - eventTimer = 3; - events.ScheduleEvent(eventTimer, urand(6000, 7000)); - break; - case 3: - me->SetStandState(EMOTE_ONESHOT_NONE); - switch (me->GetEntry()) - { - case NPC_MANNUTH: Talk(SAY_MANNUTH_2, player); break; - case NPC_DEEZ: Talk(SAY_DEEZ_2, player); break; - case NPC_GALATHRYN: Talk(SAY_GALATHRYN_2, player); break; - case NPC_ADARRAH: Talk(SAY_ADARRAH_3, player); break; - case NPC_DARWEN: Talk(SAY_DARWEN_2, player); break; - case NPC_FUDGERICK: Talk(SAY_FUDGERICK_2, player); break; - case NPC_GUNTER: Talk(SAY_GUNTER_2, player); break; - case NPC_KYREN: Talk(SAY_KYREN_2, player); break; - case NPC_MITZI: Talk(SAY_MITZI_2, player); break; - case NPC_CHRISTIAN: Talk(SAY_CHRISTIAN_2, player); break; - case NPC_BRENNAN: Talk(SAY_BRENNAN_2, player); break; - case NPC_HOLLEE: Talk(SAY_HOLLEE_2, player); break; - } - eventTimer = 4; - if (me->GetEntry() == NPC_GUNTER || me->GetEntry() == NPC_KYREN) - events.ScheduleEvent(eventTimer, 5*MINUTE*IN_MILLISECONDS); // vendors wait for 5 minutes before running away and despawning - else - events.ScheduleEvent(eventTimer, 6000); - break; - case 4: - me->HandleEmoteCommand(EMOTE_ONESHOT_WAVE); - switch (me->GetEntry()) - { - case NPC_MANNUTH: Talk(SAY_MANNUTH_3, player); break; - case NPC_DEEZ: Talk(SAY_DEEZ_3, player); break; - case NPC_GALATHRYN: Talk(SAY_GALATHRYN_3, player); break; - case NPC_ADARRAH: Talk(SAY_ADARRAH_4, player); break; - case NPC_DARWEN: Talk(SAY_DARWEN_3, player); break; - case NPC_FUDGERICK: Talk(SAY_FUDGERICK_3, player); break; - case NPC_MITZI: Talk(SAY_MITZI_3, player); break; - case NPC_CHRISTIAN: Talk(SAY_CHRISTIAN_3, player); break; - case NPC_BRENNAN: Talk(SAY_BRENNAN_3, player); break; - case NPC_HOLLEE: Talk(SAY_HOLLEE_3, player); break; - } - eventTimer = 5; - events.ScheduleEvent(eventTimer, 2000); - break; - case 5: - switch (me->GetEntry()) - { - case NPC_ADARRAH: - DoCast(me, SPELL_STEALTH_, true); - break; - } - if (me->GetPositionY() > 1290.0f) - me->GetMotionMaster()->MovePoint(POINT_DESPAWN, 118.2742f, 1400.657f, -9.118711f); - else - me->GetMotionMaster()->MovePoint(POINT_DESPAWN, 114.3155f, 1244.244f, -20.97606f); - eventTimer = 0; - break; - } - } - } - - void DoSpawnRandom() - { - if (instance) - { - uint32 cEntry = NPC_MANNUTH; - switch (urand(0, 9)) - { - case 1: cEntry = NPC_DEEZ; break; - case 2: cEntry = NPC_GALATHRYN; break; - case 3: cEntry = NPC_ADARRAH; break; - case 4: cEntry = NPC_FUDGERICK; break; - case 5: cEntry = NPC_DARWEN; break; - case 6: cEntry = NPC_MITZI; break; - case 7: cEntry = NPC_CHRISTIAN; break; - case 8: cEntry = NPC_BRENNAN; break; - case 9: cEntry = NPC_HOLLEE; break; - } - - if (!instance->GetData(TYPE_RAND_VENDOR_1) && roll_chance_i(10)) - { - cEntry = NPC_GUNTER; - instance->SetData(TYPE_RAND_VENDOR_1, DONE); - } - else if (!instance->GetData(TYPE_RAND_VENDOR_2) && roll_chance_i(10)) - { - cEntry = NPC_KYREN; - instance->SetData(TYPE_RAND_VENDOR_2, DONE); - } - - // start generic rp - eventTimer = 1; - events.ScheduleEvent(eventTimer, 3000); - - me->UpdateEntry(cEntry); - } - } - - void SpellHit(Unit* caster, SpellInfo const* spell) override - { - if (spell->Id == SPELL_REMOVE_AMANI_CURSE && caster->GetTypeId() == TYPEID_PLAYER && me->GetEntry() == NPC_FOREST_FROG) - { - me->GetMotionMaster()->MoveIdle(); - me->SetFacingToObject(caster); - PlayerGUID = caster->GetGUID(); - - if (roll_chance_i(2)) - { - DoCast(caster, SPELL_PUSH_MOJO, true); - me->GetMotionMaster()->MovePoint(POINT_DESPAWN, caster->GetPositionX(), caster->GetPositionY(), caster->GetPositionZ()); - } - else - DoSpawnRandom(); - } - } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(creature); + instance = creature->GetInstanceScript(); } + + InstanceScript* instance; + EventMap events; + uint8 eventTimer; + uint64 PlayerGUID; + + void Reset() override { } + + void EnterCombat(Unit* /*who*/) override { } + + void MovementInform(uint32 type, uint32 data) override + { + if (type == POINT_MOTION_TYPE && data == POINT_DESPAWN) + me->DespawnOrUnsummon(1000); + } + + void UpdateAI(uint32 diff) override + { + events.Update(diff); + if (eventTimer) + { + Player* player = me->GetMap()->GetPlayer(PlayerGUID); + switch (events.ExecuteEvent()) + { + case 1: + switch (me->GetEntry()) + { + case NPC_MANNUTH: + Talk(SAY_MANNUTH_0, player); + break; + case NPC_DEEZ: + Talk(SAY_DEEZ_0, player); + break; + case NPC_GALATHRYN: + Talk(SAY_GALATHRYN_0, player); + break; + case NPC_ADARRAH: + Talk(SAY_ADARRAH_1, player); + break; + case NPC_DARWEN: + Talk(SAY_DARWEN_0, player); + break; + case NPC_FUDGERICK: + Talk(SAY_FUDGERICK_0, player); + break; + case NPC_GUNTER: + Talk(SAY_GUNTER_0, player); + break; + case NPC_KYREN: + Talk(SAY_KYREN_0, player); + break; + case NPC_MITZI: + Talk(SAY_MITZI_0, player); + break; + case NPC_CHRISTIAN: + Talk(SAY_CHRISTIAN_0, player); + break; + case NPC_BRENNAN: + Talk(SAY_BRENNAN_0, player); + break; + case NPC_HOLLEE: + Talk(SAY_HOLLEE_0, player); + break; + } + eventTimer = 2; + events.ScheduleEvent(eventTimer, urand(4000, 5000)); + break; + case 2: + if (me->GetEntry() != NPC_GUNTER && me->GetEntry() != NPC_KYREN) // vendors don't kneel? + me->SetStandState(UNIT_STAND_STATE_KNEEL); + + switch (me->GetEntry()) + { + case NPC_MANNUTH: + DoCast(me, SPELL_SUMMON_AMANI_CHARM_CHEST_2, true); + Talk(SAY_MANNUTH_1, player); + break; + case NPC_DEEZ: + DoCast(me, SPELL_SUMMON_AMANI_CHARM_CHEST_2, true); + Talk(SAY_DEEZ_1, player); + break; + case NPC_GALATHRYN: + DoCast(me, SPELL_SUMMON_AMANI_CHARM_CHEST_2, true); + Talk(SAY_GALATHRYN_1, player); + break; + case NPC_ADARRAH: + DoCast(me, SPELL_SUMMON_AMANI_CHARM_CHEST_2, true); + Talk(SAY_ADARRAH_2, player); + break; + case NPC_DARWEN: + DoCast(me, SPELL_SUMMON_MONEY_BAG, true); + me->LoadEquipment(0, true); + Talk(SAY_DARWEN_1, player); + break; + case NPC_FUDGERICK: + DoCast(me, SPELL_SUMMON_MONEY_BAG, true); + me->LoadEquipment(0, true); + Talk(SAY_FUDGERICK_1, player); + break; + case NPC_GUNTER: + Talk(SAY_GUNTER_1, player); + break; + case NPC_KYREN: + Talk(SAY_KYREN_1, player); + break; + case NPC_MITZI: + DoCast(me, SPELL_SUMMON_AMANI_CHARM_CHEST_1, true); + Talk(SAY_MITZI_1, player); + break; + case NPC_CHRISTIAN: + DoCast(me, SPELL_SUMMON_AMANI_CHARM_CHEST_1, true); + Talk(SAY_CHRISTIAN_1, player); + break; + case NPC_BRENNAN: + DoCast(me, SPELL_SUMMON_AMANI_CHARM_CHEST_1, true); + Talk(SAY_BRENNAN_1, player); + break; + case NPC_HOLLEE: + DoCast(me, SPELL_SUMMON_AMANI_CHARM_CHEST_1, true); + Talk(SAY_HOLLEE_1, player); + break; + } + eventTimer = 3; + events.ScheduleEvent(eventTimer, urand(6000, 7000)); + break; + case 3: + me->SetStandState(EMOTE_ONESHOT_NONE); + switch (me->GetEntry()) + { + case NPC_MANNUTH: + Talk(SAY_MANNUTH_2, player); + break; + case NPC_DEEZ: + Talk(SAY_DEEZ_2, player); + break; + case NPC_GALATHRYN: + Talk(SAY_GALATHRYN_2, player); + break; + case NPC_ADARRAH: + Talk(SAY_ADARRAH_3, player); + break; + case NPC_DARWEN: + Talk(SAY_DARWEN_2, player); + break; + case NPC_FUDGERICK: + Talk(SAY_FUDGERICK_2, player); + break; + case NPC_GUNTER: + Talk(SAY_GUNTER_2, player); + break; + case NPC_KYREN: + Talk(SAY_KYREN_2, player); + break; + case NPC_MITZI: + Talk(SAY_MITZI_2, player); + break; + case NPC_CHRISTIAN: + Talk(SAY_CHRISTIAN_2, player); + break; + case NPC_BRENNAN: + Talk(SAY_BRENNAN_2, player); + break; + case NPC_HOLLEE: + Talk(SAY_HOLLEE_2, player); + break; + } + eventTimer = 4; + if (me->GetEntry() == NPC_GUNTER || me->GetEntry() == NPC_KYREN) + events.ScheduleEvent(eventTimer, 5 * MINUTE * IN_MILLISECONDS); // vendors wait for 5 minutes before running away and despawning + else + events.ScheduleEvent(eventTimer, 6000); + break; + case 4: + me->HandleEmoteCommand(EMOTE_ONESHOT_WAVE); + switch (me->GetEntry()) + { + case NPC_MANNUTH: + Talk(SAY_MANNUTH_3, player); + break; + case NPC_DEEZ: + Talk(SAY_DEEZ_3, player); + break; + case NPC_GALATHRYN: + Talk(SAY_GALATHRYN_3, player); + break; + case NPC_ADARRAH: + Talk(SAY_ADARRAH_4, player); + break; + case NPC_DARWEN: + Talk(SAY_DARWEN_3, player); + break; + case NPC_FUDGERICK: + Talk(SAY_FUDGERICK_3, player); + break; + case NPC_MITZI: + Talk(SAY_MITZI_3, player); + break; + case NPC_CHRISTIAN: + Talk(SAY_CHRISTIAN_3, player); + break; + case NPC_BRENNAN: + Talk(SAY_BRENNAN_3, player); + break; + case NPC_HOLLEE: + Talk(SAY_HOLLEE_3, player); + break; + } + eventTimer = 5; + events.ScheduleEvent(eventTimer, 2000); + break; + case 5: + switch (me->GetEntry()) + { + case NPC_ADARRAH: + DoCast(me, SPELL_STEALTH_, true); + break; + } + if (me->GetPositionY() > 1290.0f) + me->GetMotionMaster()->MovePoint(POINT_DESPAWN, 118.2742f, 1400.657f, -9.118711f); + else + me->GetMotionMaster()->MovePoint(POINT_DESPAWN, 114.3155f, 1244.244f, -20.97606f); + eventTimer = 0; + break; + } + } + } + + void DoSpawnRandom() + { + if (instance) + { + uint32 cEntry = NPC_MANNUTH; + switch (urand(0, 9)) + { + case 1: + cEntry = NPC_DEEZ; + break; + case 2: + cEntry = NPC_GALATHRYN; + break; + case 3: + cEntry = NPC_ADARRAH; + break; + case 4: + cEntry = NPC_FUDGERICK; + break; + case 5: + cEntry = NPC_DARWEN; + break; + case 6: + cEntry = NPC_MITZI; + break; + case 7: + cEntry = NPC_CHRISTIAN; + break; + case 8: + cEntry = NPC_BRENNAN; + break; + case 9: + cEntry = NPC_HOLLEE; + break; + } + + if (!instance->GetData(TYPE_RAND_VENDOR_1) && roll_chance_i(10)) + { + cEntry = NPC_GUNTER; + instance->SetData(TYPE_RAND_VENDOR_1, DONE); + } + else if (!instance->GetData(TYPE_RAND_VENDOR_2) && roll_chance_i(10)) + { + cEntry = NPC_KYREN; + instance->SetData(TYPE_RAND_VENDOR_2, DONE); + } + + // start generic rp + eventTimer = 1; + events.ScheduleEvent(eventTimer, 3000); + + me->UpdateEntry(cEntry); + } + } + + void SpellHit(Unit* caster, SpellInfo const* spell) override + { + if (spell->Id == SPELL_REMOVE_AMANI_CURSE && caster->GetTypeId() == TYPEID_PLAYER && me->GetEntry() == NPC_FOREST_FROG) + { + me->GetMotionMaster()->MoveIdle(); + me->SetFacingToObject(caster); + PlayerGUID = caster->GetGUID(); + + if (roll_chance_i(2)) + { + DoCast(caster, SPELL_PUSH_MOJO, true); + me->GetMotionMaster()->MovePoint(POINT_DESPAWN, caster->GetPositionX(), caster->GetPositionY(), caster->GetPositionZ()); + } + else + DoSpawnRandom(); + } + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI(creature); + } }; /*###### @@ -358,80 +444,80 @@ static uint32 ChestEntry[] = {186648, 187021, 186672, 186667}; class npc_zulaman_hostage : public CreatureScript { - public: - npc_zulaman_hostage() : CreatureScript("npc_zulaman_hostage") { } +public: + npc_zulaman_hostage() : CreatureScript("npc_zulaman_hostage") { } - struct npc_zulaman_hostageAI : public ScriptedAI + struct npc_zulaman_hostageAI : public ScriptedAI + { + npc_zulaman_hostageAI(Creature* creature) : ScriptedAI(creature) { - npc_zulaman_hostageAI(Creature* creature) : ScriptedAI(creature) - { - IsLoot = false; - } - - bool IsLoot; - uint64 PlayerGUID; - - void Reset() override { } - - void EnterCombat(Unit* /*who*/) override { } - - void JustDied(Unit* /*killer*/) override - { - if (Player* player = ObjectAccessor::GetPlayer(*me, PlayerGUID)) - player->SendLoot(me->GetGUID(), LOOT_CORPSE); - } - - void UpdateAI(uint32 /*diff*/) override - { - if (IsLoot) - DoCast(me, 7, false); - } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_zulaman_hostageAI(creature); + IsLoot = false; } - bool OnGossipHello(Player* player, Creature* creature) override + bool IsLoot; + uint64 PlayerGUID; + + void Reset() override { } + + void EnterCombat(Unit* /*who*/) override { } + + void JustDied(Unit* /*killer*/) override { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HOSTAGE1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + if (Player* player = ObjectAccessor::GetPlayer(*me, PlayerGUID)) + player->SendLoot(me->GetGUID(), LOOT_CORPSE); + } + + void UpdateAI(uint32 /*diff*/) override + { + if (IsLoot) + DoCast(me, 7, false); + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_zulaman_hostageAI(creature); + } + + bool OnGossipHello(Player* player, Creature* creature) override + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HOSTAGE1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + return true; + } + + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override + { + ClearGossipMenuFor(player); + + if (action == GOSSIP_ACTION_INFO_DEF + 1) + CloseGossipMenuFor(player); + + if (!creature->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP)) return true; - } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override + creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + + InstanceScript* instance = creature->GetInstanceScript(); + if (instance) { - ClearGossipMenuFor(player); - - if (action == GOSSIP_ACTION_INFO_DEF + 1) - CloseGossipMenuFor(player); - - if (!creature->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP)) - return true; - - creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - - InstanceScript* instance = creature->GetInstanceScript(); - if (instance) + //uint8 progress = instance->GetData(DATA_CHESTLOOTED); + instance->SetData(DATA_CHESTLOOTED, 0); + float x, y, z; + creature->GetPosition(x, y, z); + uint32 entry = creature->GetEntry(); + for (uint8 i = 0; i < 4; ++i) { - //uint8 progress = instance->GetData(DATA_CHESTLOOTED); - instance->SetData(DATA_CHESTLOOTED, 0); - float x, y, z; - creature->GetPosition(x, y, z); - uint32 entry = creature->GetEntry(); - for (uint8 i = 0; i < 4; ++i) + if (HostageEntry[i] == entry) { - if (HostageEntry[i] == entry) - { - creature->SummonGameObject(ChestEntry[i], x-2, y, z, 0, 0, 0, 0, 0, 0); - break; - } + creature->SummonGameObject(ChestEntry[i], x - 2, y, z, 0, 0, 0, 0, 0, 0); + break; } } - - return true; } + + return true; + } }; /*###### @@ -677,7 +763,7 @@ public: } } else - _gongTimer -= diff; + _gongTimer -= diff; } } }; @@ -690,29 +776,29 @@ public: class spell_banging_the_gong : public SpellScriptLoader { - public: - spell_banging_the_gong() : SpellScriptLoader("spell_banging_the_gong") { } +public: + spell_banging_the_gong() : SpellScriptLoader("spell_banging_the_gong") { } - class spell_banging_the_gong_SpellScript : public SpellScript + class spell_banging_the_gong_SpellScript : public SpellScript + { + PrepareSpellScript(spell_banging_the_gong_SpellScript); + + void Activate(SpellEffIndex index) { - PrepareSpellScript(spell_banging_the_gong_SpellScript); - - void Activate(SpellEffIndex index) - { - PreventHitDefaultEffect(index); - GetHitGObj()->SendCustomAnim(0); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_banging_the_gong_SpellScript::Activate, EFFECT_1, SPELL_EFFECT_ACTIVATE_OBJECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_banging_the_gong_SpellScript(); + PreventHitDefaultEffect(index); + GetHitGObj()->SendCustomAnim(0); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_banging_the_gong_SpellScript::Activate, EFFECT_1, SPELL_EFFECT_ACTIVATE_OBJECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_banging_the_gong_SpellScript(); + } }; void AddSC_zulaman() diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp index fe32f882b..7246046a1 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp @@ -77,124 +77,125 @@ Position const PosMoveOnSpawn[1] = class boss_arlokk : public CreatureScript { - public: boss_arlokk() : CreatureScript("boss_arlokk") { } +public: + boss_arlokk() : CreatureScript("boss_arlokk") { } - struct boss_arlokkAI : public BossAI + struct boss_arlokkAI : public BossAI + { + boss_arlokkAI(Creature* creature) : BossAI(creature, DATA_ARLOKK) { } + + void Reset() { - boss_arlokkAI(Creature* creature) : BossAI(creature, DATA_ARLOKK) { } + if (events.IsInPhase(PHASE_TWO)) + me->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, 35.0f, false); // hack + _Reset(); + _summonCountA = 0; + _summonCountB = 0; + me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_DAGGER)); + me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, uint32(WEAPON_DAGGER)); + me->SetWalk(false); + me->GetMotionMaster()->MovePoint(0, PosMoveOnSpawn[0]); + } - void Reset() + void JustDied(Unit* /*killer*/) + { + _JustDied(); + Talk(SAY_DEATH); + } + + void EnterCombat(Unit* /*who*/) + { + _EnterCombat(); + events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, urand(7000, 9000), 0, PHASE_ONE); + events.ScheduleEvent(EVENT_GOUGE, urand(12000, 15000), 0, PHASE_ONE); + events.ScheduleEvent(EVENT_SUMMON_PROWLERS, 6000, 0, PHASE_ALL); + events.ScheduleEvent(EVENT_MARK_OF_ARLOKK, urand(9000, 11000), 0, PHASE_ALL); + events.ScheduleEvent(EVENT_TRANSFORM, urand(15000, 20000), 0, PHASE_ONE); + Talk(SAY_AGGRO); + + // Sets up list of Panther spawners to cast on + std::list triggerList; + GetCreatureListWithEntryInGrid(triggerList, me, NPC_PANTHER_TRIGGER, 100.0f); + if (!triggerList.empty()) { - if (events.IsInPhase(PHASE_TWO)) - me->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, 35.0f, false); // hack - _Reset(); - _summonCountA = 0; - _summonCountB = 0; - me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_DAGGER)); - me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, uint32(WEAPON_DAGGER)); - me->SetWalk(false); - me->GetMotionMaster()->MovePoint(0, PosMoveOnSpawn[0]); - } - - void JustDied(Unit* /*killer*/) - { - _JustDied(); - Talk(SAY_DEATH); - } - - void EnterCombat(Unit* /*who*/) - { - _EnterCombat(); - events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, urand(7000, 9000), 0, PHASE_ONE); - events.ScheduleEvent(EVENT_GOUGE, urand(12000, 15000), 0, PHASE_ONE); - events.ScheduleEvent(EVENT_SUMMON_PROWLERS, 6000, 0, PHASE_ALL); - events.ScheduleEvent(EVENT_MARK_OF_ARLOKK, urand(9000, 11000), 0, PHASE_ALL); - events.ScheduleEvent(EVENT_TRANSFORM, urand(15000, 20000), 0, PHASE_ONE); - Talk(SAY_AGGRO); - - // Sets up list of Panther spawners to cast on - std::list triggerList; - GetCreatureListWithEntryInGrid(triggerList, me, NPC_PANTHER_TRIGGER, 100.0f); - if (!triggerList.empty()) + uint8 sideA = 0; + uint8 sideB = 0; + for (std::list::const_iterator itr = triggerList.begin(); itr != triggerList.end(); ++itr) { - uint8 sideA = 0; - uint8 sideB = 0; - for (std::list::const_iterator itr = triggerList.begin(); itr != triggerList.end(); ++itr) + if (Creature* trigger = *itr) { - if (Creature* trigger = *itr) + if (trigger->GetPositionY() < -1625.0f) { - if (trigger->GetPositionY() < -1625.0f) - { - _triggersSideAGUID[sideA] = trigger->GetGUID(); - ++sideA; - } - else - { - _triggersSideBGUID[sideB] = trigger->GetGUID(); - ++sideB; - } + _triggersSideAGUID[sideA] = trigger->GetGUID(); + ++sideA; + } + else + { + _triggersSideBGUID[sideB] = trigger->GetGUID(); + ++sideB; } } } } + } - void EnterEvadeMode() + void EnterEvadeMode() + { + BossAI::EnterEvadeMode(); + if (GameObject* object = ObjectAccessor::GetGameObject(*me, instance->GetData64(GO_GONG_OF_BETHEKK))) + object->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + me->DespawnOrUnsummon(4000); + } + + void SetData(uint32 id, uint32 /*value*/) + { + if (id == 1) + --_summonCountA; + else if (id == 2) + --_summonCountB; + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) { - BossAI::EnterEvadeMode(); - if (GameObject* object = ObjectAccessor::GetGameObject(*me, instance->GetData64(GO_GONG_OF_BETHEKK))) - object->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - me->DespawnOrUnsummon(4000); - } - - void SetData(uint32 id, uint32 /*value*/) - { - if (id == 1) - --_summonCountA; - else if (id == 2) - --_summonCountB; - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) + switch (eventId) { - switch (eventId) - { - case EVENT_SHADOW_WORD_PAIN: - DoCastVictim(SPELL_SHADOW_WORD_PAIN, true); - events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, urand(5000, 7000), 0, PHASE_ONE); - break; - case EVENT_GOUGE: - DoCastVictim(SPELL_GOUGE, true); - break; - case EVENT_SUMMON_PROWLERS: - if (_summonCountA < MAX_PROWLERS_PER_SIDE) + case EVENT_SHADOW_WORD_PAIN: + DoCastVictim(SPELL_SHADOW_WORD_PAIN, true); + events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, urand(5000, 7000), 0, PHASE_ONE); + break; + case EVENT_GOUGE: + DoCastVictim(SPELL_GOUGE, true); + break; + case EVENT_SUMMON_PROWLERS: + if (_summonCountA < MAX_PROWLERS_PER_SIDE) + { + if (Unit* trigger = ObjectAccessor::GetUnit(*me, _triggersSideAGUID[urand(0, 4)])) { - if (Unit* trigger = ObjectAccessor::GetUnit(*me, _triggersSideAGUID[urand(0, 4)])) - { - trigger->CastSpell(trigger, SPELL_SUMMON_PROWLER); - ++_summonCountA; - } + trigger->CastSpell(trigger, SPELL_SUMMON_PROWLER); + ++_summonCountA; } - if (_summonCountB < MAX_PROWLERS_PER_SIDE) + } + if (_summonCountB < MAX_PROWLERS_PER_SIDE) + { + if (Unit* trigger = ObjectAccessor::GetUnit(*me, _triggersSideBGUID[urand(0, 4)])) { - if (Unit* trigger = ObjectAccessor::GetUnit(*me, _triggersSideBGUID[urand(0, 4)])) - { - trigger->CastSpell(trigger, SPELL_SUMMON_PROWLER); - ++_summonCountB; - } + trigger->CastSpell(trigger, SPELL_SUMMON_PROWLER); + ++_summonCountB; } - events.ScheduleEvent(EVENT_SUMMON_PROWLERS, 6000, 0, PHASE_ALL); - break; - case EVENT_MARK_OF_ARLOKK: + } + events.ScheduleEvent(EVENT_SUMMON_PROWLERS, 6000, 0, PHASE_ALL); + break; + case EVENT_MARK_OF_ARLOKK: { Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, urand(1, 3), 0.0f, false, -SPELL_MARK_OF_ARLOKK); if (!target) @@ -207,7 +208,7 @@ class boss_arlokk : public CreatureScript events.ScheduleEvent(EVENT_MARK_OF_ARLOKK, urand(120000, 130000)); break; } - case EVENT_TRANSFORM: + case EVENT_TRANSFORM: { DoCast(me, SPELL_PANTHER_TRANSFORM); // SPELL_AURA_TRANSFORM me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(EQUIP_UNEQUIP)); @@ -221,40 +222,40 @@ class boss_arlokk : public CreatureScript me->AttackStop(); DoResetThreat(); me->SetReactState(REACT_PASSIVE); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); DoCast(me, SPELL_VANISH_VISUAL); DoCast(me, SPELL_VANISH); events.ScheduleEvent(EVENT_VANISH, 1000, 0, PHASE_ONE); break; } - case EVENT_VANISH: - DoCast(me, SPELL_SUPER_INVIS); - me->SetWalk(false); - me->GetMotionMaster()->MovePoint(0, frand(-11551.0f, -11508.0f), frand(-1638.0f, -1617.0f), me->GetPositionZ()); - events.ScheduleEvent(EVENT_VANISH_2, 9000, 0, PHASE_ONE); - break; - case EVENT_VANISH_2: - DoCast(me, SPELL_VANISH); - DoCast(me, SPELL_SUPER_INVIS); - events.ScheduleEvent(EVENT_VISIBLE, urand(7000, 10000), 0, PHASE_ONE); - break; - case EVENT_VISIBLE: - me->SetReactState(REACT_AGGRESSIVE); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - AttackStart(target); - me->RemoveAura(SPELL_SUPER_INVIS); - me->RemoveAura(SPELL_VANISH); - 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); - events.ScheduleEvent(EVENT_RAVAGE, urand(10000, 14000), 0, PHASE_TWO); - break; - case EVENT_TRANSFORM_BACK: + case EVENT_VANISH: + DoCast(me, SPELL_SUPER_INVIS); + me->SetWalk(false); + me->GetMotionMaster()->MovePoint(0, frand(-11551.0f, -11508.0f), frand(-1638.0f, -1617.0f), me->GetPositionZ()); + events.ScheduleEvent(EVENT_VANISH_2, 9000, 0, PHASE_ONE); + break; + case EVENT_VANISH_2: + DoCast(me, SPELL_VANISH); + DoCast(me, SPELL_SUPER_INVIS); + events.ScheduleEvent(EVENT_VISIBLE, urand(7000, 10000), 0, PHASE_ONE); + break; + case EVENT_VISIBLE: + me->SetReactState(REACT_AGGRESSIVE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + AttackStart(target); + me->RemoveAura(SPELL_SUPER_INVIS); + me->RemoveAura(SPELL_VANISH); + 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); + events.ScheduleEvent(EVENT_RAVAGE, urand(10000, 14000), 0, PHASE_TWO); + break; + case EVENT_TRANSFORM_BACK: { me->RemoveAura(SPELL_PANTHER_TRANSFORM); // SPELL_AURA_TRANSFORM DoCast(me, SPELL_VANISH_VISUAL); @@ -273,25 +274,25 @@ class boss_arlokk : public CreatureScript events.SetPhase(PHASE_ONE); break; } - default: - break; - } + default: + break; } - - DoMeleeAttackIfReady(); } - private: - uint8 _summonCountA; - uint8 _summonCountB; - uint64 _triggersSideAGUID[5]; - uint64 _triggersSideBGUID[5]; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetZulGurubAI(creature); + DoMeleeAttackIfReady(); } + + private: + uint8 _summonCountA; + uint8 _summonCountB; + uint64 _triggersSideAGUID[5]; + uint64 _triggersSideBGUID[5]; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetZulGurubAI(creature); + } }; /*###### @@ -317,84 +318,85 @@ enum ZulianProwlerEvents class npc_zulian_prowler : public CreatureScript { - public: npc_zulian_prowler() : CreatureScript("npc_zulian_prowler") { } +public: + npc_zulian_prowler() : CreatureScript("npc_zulian_prowler") { } - struct npc_zulian_prowlerAI : public ScriptedAI + struct npc_zulian_prowlerAI : public ScriptedAI + { + npc_zulian_prowlerAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { } + + void Reset() { - npc_zulian_prowlerAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { } + if (me->GetPositionY() < -1625.0f) + _sideData = 1; + else + _sideData = 2; - void Reset() - { - if (me->GetPositionY() < -1625.0f) - _sideData = 1; - else - _sideData = 2; + DoCast(me, SPELL_SNEAK_RANK_1_1); + DoCast(me, SPELL_SNEAK_RANK_1_2); - DoCast(me, SPELL_SNEAK_RANK_1_1); - DoCast(me, SPELL_SNEAK_RANK_1_2); - - if (Unit* arlokk = ObjectAccessor::GetUnit(*me, _instance->GetData64(NPC_ARLOKK))) - me->GetMotionMaster()->MovePoint(0, arlokk->GetPositionX(), arlokk->GetPositionY(), arlokk->GetPositionZ()); - _events.ScheduleEvent(EVENT_ATTACK, 6000); - } - - void EnterCombat(Unit* /*who*/) - { - me->GetMotionMaster()->Clear(false); - me->RemoveAura(SPELL_SNEAK_RANK_1_1); - me->RemoveAura(SPELL_SNEAK_RANK_1_2); - } - - void SpellHit(Unit* caster, SpellInfo const* spell) - { - if (spell->Id == SPELL_MARK_OF_ARLOKK_TRIGGER) // Should only hit if line of sight - me->Attack(caster, true); - } - - void JustDied(Unit* /*killer*/) - { - if (Unit* arlokk = ObjectAccessor::GetUnit(*me, _instance->GetData64(NPC_ARLOKK))) - { - if (arlokk->IsAlive()) - arlokk->GetAI()->SetData(_sideData, 0); - } - me->DespawnOrUnsummon(4000); - } - - void UpdateAI(uint32 diff) - { - if (UpdateVictim()) - { - DoMeleeAttackIfReady(); - return; - } - - _events.Update(diff); - - while (uint32 eventId = _events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_ATTACK: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0.0f, 100, false)) - me->Attack(target, true); - break; - default: - break; - } - } - } - - private: - int32 _sideData; - EventMap _events; - InstanceScript* _instance; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetZulGurubAI(creature); + if (Unit* arlokk = ObjectAccessor::GetUnit(*me, _instance->GetData64(NPC_ARLOKK))) + me->GetMotionMaster()->MovePoint(0, arlokk->GetPositionX(), arlokk->GetPositionY(), arlokk->GetPositionZ()); + _events.ScheduleEvent(EVENT_ATTACK, 6000); } + + void EnterCombat(Unit* /*who*/) + { + me->GetMotionMaster()->Clear(false); + me->RemoveAura(SPELL_SNEAK_RANK_1_1); + me->RemoveAura(SPELL_SNEAK_RANK_1_2); + } + + void SpellHit(Unit* caster, SpellInfo const* spell) + { + if (spell->Id == SPELL_MARK_OF_ARLOKK_TRIGGER) // Should only hit if line of sight + me->Attack(caster, true); + } + + void JustDied(Unit* /*killer*/) + { + if (Unit* arlokk = ObjectAccessor::GetUnit(*me, _instance->GetData64(NPC_ARLOKK))) + { + if (arlokk->IsAlive()) + arlokk->GetAI()->SetData(_sideData, 0); + } + me->DespawnOrUnsummon(4000); + } + + void UpdateAI(uint32 diff) + { + if (UpdateVictim()) + { + DoMeleeAttackIfReady(); + return; + } + + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_ATTACK: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0.0f, 100, false)) + me->Attack(target, true); + break; + default: + break; + } + } + } + + private: + int32 _sideData; + EventMap _events; + InstanceScript* _instance; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetZulGurubAI(creature); + } }; /*###### @@ -408,19 +410,20 @@ Position const PosSummonArlokk[1] = class go_gong_of_bethekk : public GameObjectScript { - public: go_gong_of_bethekk() : GameObjectScript("go_gong_of_bethekk") { } +public: + go_gong_of_bethekk() : GameObjectScript("go_gong_of_bethekk") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + bool OnGossipHello(Player* /*player*/, GameObject* go) override + { + if (go->GetInstanceScript()) { - if (go->GetInstanceScript()) - { - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - go->SendCustomAnim(0); - go->SummonCreature(NPC_ARLOKK, PosSummonArlokk[0], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 600000); - } - - return true; + go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + go->SendCustomAnim(0); + go->SummonCreature(NPC_ARLOKK, PosSummonArlokk[0], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 600000); } + + return true; + } }; void AddSC_boss_arlokk() diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp index 6da506efb..166967cdc 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp @@ -31,69 +31,70 @@ enum Events class boss_gahzranka : public CreatureScript // gahzranka { - public: boss_gahzranka() : CreatureScript("boss_gahzranka") { } +public: + boss_gahzranka() : CreatureScript("boss_gahzranka") { } - struct boss_gahzrankaAI : public BossAI + struct boss_gahzrankaAI : public BossAI + { + boss_gahzrankaAI(Creature* creature) : BossAI(creature, DATA_GAHZRANKA) { } + + void Reset() { - boss_gahzrankaAI(Creature* creature) : BossAI(creature, DATA_GAHZRANKA) { } - - void Reset() - { - _Reset(); - } - - void JustDied(Unit* /*killer*/) - { - _JustDied(); - } - - void EnterCombat(Unit* /*who*/) - { - _EnterCombat(); - events.ScheduleEvent(EVENT_FROSTBREATH, 8000); - events.ScheduleEvent(EVENT_MASSIVEGEYSER, 25000); - events.ScheduleEvent(EVENT_SLAM, 17000); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_FROSTBREATH: - DoCastVictim(SPELL_FROSTBREATH, true); - events.ScheduleEvent(EVENT_FROSTBREATH, urand(7000, 11000)); - break; - case EVENT_MASSIVEGEYSER: - DoCastVictim(SPELL_MASSIVEGEYSER, true); - events.ScheduleEvent(EVENT_MASSIVEGEYSER, urand(22000, 32000)); - break; - case EVENT_SLAM: - DoCastVictim(SPELL_SLAM, true); - events.ScheduleEvent(EVENT_SLAM, urand(12000, 20000)); - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_gahzrankaAI(creature); + _Reset(); } + + void JustDied(Unit* /*killer*/) + { + _JustDied(); + } + + void EnterCombat(Unit* /*who*/) + { + _EnterCombat(); + events.ScheduleEvent(EVENT_FROSTBREATH, 8000); + events.ScheduleEvent(EVENT_MASSIVEGEYSER, 25000); + events.ScheduleEvent(EVENT_SLAM, 17000); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_FROSTBREATH: + DoCastVictim(SPELL_FROSTBREATH, true); + events.ScheduleEvent(EVENT_FROSTBREATH, urand(7000, 11000)); + break; + case EVENT_MASSIVEGEYSER: + DoCastVictim(SPELL_MASSIVEGEYSER, true); + events.ScheduleEvent(EVENT_MASSIVEGEYSER, urand(22000, 32000)); + break; + case EVENT_SLAM: + DoCastVictim(SPELL_SLAM, true); + events.ScheduleEvent(EVENT_SLAM, urand(12000, 20000)); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_gahzrankaAI(creature); + } }; void AddSC_boss_gahzranka() diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp index a16310c31..5c6b4fde1 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp @@ -29,72 +29,73 @@ enum Events class boss_grilek : public CreatureScript // grilek { - public: boss_grilek() : CreatureScript("boss_grilek") { } +public: + boss_grilek() : CreatureScript("boss_grilek") { } - struct boss_grilekAI : public BossAI + struct boss_grilekAI : public BossAI + { + boss_grilekAI(Creature* creature) : BossAI(creature, DATA_EDGE_OF_MADNESS) { } + + void Reset() { - boss_grilekAI(Creature* creature) : BossAI(creature, DATA_EDGE_OF_MADNESS) { } - - void Reset() - { - _Reset(); - } - - void JustDied(Unit* /*killer*/) - { - _JustDied(); - } - - void EnterCombat(Unit* /*who*/) - { - _EnterCombat(); - events.ScheduleEvent(EVENT_AVATAR, urand(15000, 25000)); - events.ScheduleEvent(EVENT_GROUND_TREMOR, urand(15000, 25000)); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_AVATAR: - DoCast(me, SPELL_AVATAR); - if (Unit* victim = me->GetVictim()) - { - if (DoGetThreat(victim)) - DoModifyThreatPercent(victim, -50); - } - - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1)) - AttackStart(target); - events.ScheduleEvent(EVENT_AVATAR, urand(25000, 35000)); - break; - case EVENT_GROUND_TREMOR: - DoCastVictim(SPELL_GROUND_TREMOR, true); - events.ScheduleEvent(EVENT_GROUND_TREMOR, urand(12000, 16000)); - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_grilekAI(creature); + _Reset(); } + + void JustDied(Unit* /*killer*/) + { + _JustDied(); + } + + void EnterCombat(Unit* /*who*/) + { + _EnterCombat(); + events.ScheduleEvent(EVENT_AVATAR, urand(15000, 25000)); + events.ScheduleEvent(EVENT_GROUND_TREMOR, urand(15000, 25000)); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_AVATAR: + DoCast(me, SPELL_AVATAR); + if (Unit* victim = me->GetVictim()) + { + if (DoGetThreat(victim)) + DoModifyThreatPercent(victim, -50); + } + + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1)) + AttackStart(target); + events.ScheduleEvent(EVENT_AVATAR, urand(25000, 35000)); + break; + case EVENT_GROUND_TREMOR: + DoCastVictim(SPELL_GROUND_TREMOR, true); + events.ScheduleEvent(EVENT_GROUND_TREMOR, urand(12000, 16000)); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_grilekAI(creature); + } }; void AddSC_boss_grilek() diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp index 18756878f..8f4a204b9 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp @@ -55,112 +55,113 @@ enum Events class boss_hakkar : public CreatureScript { - public: boss_hakkar() : CreatureScript("boss_hakkar") { } +public: + boss_hakkar() : CreatureScript("boss_hakkar") { } - struct boss_hakkarAI : public BossAI + struct boss_hakkarAI : public BossAI + { + boss_hakkarAI(Creature* creature) : BossAI(creature, DATA_HAKKAR) { } + + void Reset() { - boss_hakkarAI(Creature* creature) : BossAI(creature, DATA_HAKKAR) { } - - void Reset() - { - _Reset(); - } - - void JustDied(Unit* /*killer*/) - { - _JustDied(); - } - - void EnterCombat(Unit* /*who*/) - { - _EnterCombat(); - events.ScheduleEvent(EVENT_BLOOD_SIPHON, 90000); - events.ScheduleEvent(EVENT_CORRUPTED_BLOOD, 25000); - events.ScheduleEvent(EVENT_CAUSE_INSANITY, 17000); - events.ScheduleEvent(EVENT_WILL_OF_HAKKAR, 17000); - events.ScheduleEvent(EVENT_ENRAGE, 600000); - if (instance->GetBossState(DATA_JEKLIK) != DONE) - events.ScheduleEvent(EVENT_ASPECT_OF_JEKLIK, 4000); - if (instance->GetBossState(DATA_VENOXIS) != DONE) - events.ScheduleEvent(EVENT_ASPECT_OF_VENOXIS, 7000); - if (instance->GetBossState(DATA_MARLI) != DONE) - events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 12000); - if (instance->GetBossState(DATA_THEKAL) != DONE) - events.ScheduleEvent(EVENT_ASPECT_OF_THEKAL, 8000); - if (instance->GetBossState(DATA_ARLOKK) != DONE) - events.ScheduleEvent(EVENT_ASPECT_OF_ARLOKK, 18000); - Talk(SAY_AGGRO); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_BLOOD_SIPHON: - DoCastVictim(SPELL_BLOOD_SIPHON, true); - events.ScheduleEvent(EVENT_BLOOD_SIPHON, 90000); - break; - case EVENT_CORRUPTED_BLOOD: - DoCastVictim(SPELL_CORRUPTED_BLOOD, true); - events.ScheduleEvent(EVENT_CORRUPTED_BLOOD, urand(30000, 45000)); - break; - case EVENT_CAUSE_INSANITY: - // DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_CAUSE_INSANITY); - // events.ScheduleEvent(EVENT_CAUSE_INSANITY, urand(35000, 45000)); - break; - case EVENT_WILL_OF_HAKKAR: - // Xinef: Skip Tank - DoCast(SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true), SPELL_WILL_OF_HAKKAR); - events.ScheduleEvent(EVENT_WILL_OF_HAKKAR, urand(25000, 35000)); - break; - case EVENT_ENRAGE: - if (!me->HasAura(SPELL_ENRAGE)) - DoCast(me, SPELL_ENRAGE); - events.ScheduleEvent(EVENT_ENRAGE, 90000); - break; - case EVENT_ASPECT_OF_JEKLIK: - DoCastVictim(SPELL_ASPECT_OF_JEKLIK, true); - events.ScheduleEvent(EVENT_ASPECT_OF_JEKLIK, urand(10000, 14000)); - break; - case EVENT_ASPECT_OF_VENOXIS: - DoCastVictim(SPELL_ASPECT_OF_VENOXIS, true); - events.ScheduleEvent(EVENT_ASPECT_OF_VENOXIS, 8000); - break; - case EVENT_ASPECT_OF_MARLI: - DoCastVictim(SPELL_ASPECT_OF_MARLI, true); - events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 10000); - break; - case EVENT_ASPECT_OF_THEKAL: - DoCastVictim(SPELL_ASPECT_OF_THEKAL, true); - events.ScheduleEvent(EVENT_ASPECT_OF_THEKAL, 15000); - break; - case EVENT_ASPECT_OF_ARLOKK: - DoCastVictim(SPELL_ASPECT_OF_ARLOKK, true); - events.ScheduleEvent(EVENT_ASPECT_OF_ARLOKK, urand(10000, 15000)); - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + _Reset(); } + + void JustDied(Unit* /*killer*/) + { + _JustDied(); + } + + void EnterCombat(Unit* /*who*/) + { + _EnterCombat(); + events.ScheduleEvent(EVENT_BLOOD_SIPHON, 90000); + events.ScheduleEvent(EVENT_CORRUPTED_BLOOD, 25000); + events.ScheduleEvent(EVENT_CAUSE_INSANITY, 17000); + events.ScheduleEvent(EVENT_WILL_OF_HAKKAR, 17000); + events.ScheduleEvent(EVENT_ENRAGE, 600000); + if (instance->GetBossState(DATA_JEKLIK) != DONE) + events.ScheduleEvent(EVENT_ASPECT_OF_JEKLIK, 4000); + if (instance->GetBossState(DATA_VENOXIS) != DONE) + events.ScheduleEvent(EVENT_ASPECT_OF_VENOXIS, 7000); + if (instance->GetBossState(DATA_MARLI) != DONE) + events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 12000); + if (instance->GetBossState(DATA_THEKAL) != DONE) + events.ScheduleEvent(EVENT_ASPECT_OF_THEKAL, 8000); + if (instance->GetBossState(DATA_ARLOKK) != DONE) + events.ScheduleEvent(EVENT_ASPECT_OF_ARLOKK, 18000); + Talk(SAY_AGGRO); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_BLOOD_SIPHON: + DoCastVictim(SPELL_BLOOD_SIPHON, true); + events.ScheduleEvent(EVENT_BLOOD_SIPHON, 90000); + break; + case EVENT_CORRUPTED_BLOOD: + DoCastVictim(SPELL_CORRUPTED_BLOOD, true); + events.ScheduleEvent(EVENT_CORRUPTED_BLOOD, urand(30000, 45000)); + break; + case EVENT_CAUSE_INSANITY: + // DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_CAUSE_INSANITY); + // events.ScheduleEvent(EVENT_CAUSE_INSANITY, urand(35000, 45000)); + break; + case EVENT_WILL_OF_HAKKAR: + // Xinef: Skip Tank + DoCast(SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true), SPELL_WILL_OF_HAKKAR); + events.ScheduleEvent(EVENT_WILL_OF_HAKKAR, urand(25000, 35000)); + break; + case EVENT_ENRAGE: + if (!me->HasAura(SPELL_ENRAGE)) + DoCast(me, SPELL_ENRAGE); + events.ScheduleEvent(EVENT_ENRAGE, 90000); + break; + case EVENT_ASPECT_OF_JEKLIK: + DoCastVictim(SPELL_ASPECT_OF_JEKLIK, true); + events.ScheduleEvent(EVENT_ASPECT_OF_JEKLIK, urand(10000, 14000)); + break; + case EVENT_ASPECT_OF_VENOXIS: + DoCastVictim(SPELL_ASPECT_OF_VENOXIS, true); + events.ScheduleEvent(EVENT_ASPECT_OF_VENOXIS, 8000); + break; + case EVENT_ASPECT_OF_MARLI: + DoCastVictim(SPELL_ASPECT_OF_MARLI, true); + events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 10000); + break; + case EVENT_ASPECT_OF_THEKAL: + DoCastVictim(SPELL_ASPECT_OF_THEKAL, true); + events.ScheduleEvent(EVENT_ASPECT_OF_THEKAL, 15000); + break; + case EVENT_ASPECT_OF_ARLOKK: + DoCastVictim(SPELL_ASPECT_OF_ARLOKK, true); + events.ScheduleEvent(EVENT_ASPECT_OF_ARLOKK, urand(10000, 15000)); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; void AddSC_boss_hakkar() diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp index 4bf1b8645..d3651bdf8 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp @@ -30,79 +30,80 @@ enum Events class boss_hazzarah : public CreatureScript { - public: boss_hazzarah() : CreatureScript("boss_hazzarah") { } +public: + boss_hazzarah() : CreatureScript("boss_hazzarah") { } - struct boss_hazzarahAI : public BossAI + struct boss_hazzarahAI : public BossAI + { + boss_hazzarahAI(Creature* creature) : BossAI(creature, DATA_EDGE_OF_MADNESS) { } + + void Reset() { - boss_hazzarahAI(Creature* creature) : BossAI(creature, DATA_EDGE_OF_MADNESS) { } - - void Reset() - { - _Reset(); - } - - void JustDied(Unit* /*killer*/) - { - _JustDied(); - } - - void EnterCombat(Unit* /*who*/) - { - _EnterCombat(); - events.ScheduleEvent(EVENT_MANABURN, urand(4000, 10000)); - events.ScheduleEvent(EVENT_SLEEP, urand(10000, 18000)); - events.ScheduleEvent(EVENT_ILLUSIONS, urand(10000, 18000)); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_MANABURN: - DoCastVictim(SPELL_MANABURN, true); - events.ScheduleEvent(EVENT_MANABURN, urand(8000, 16000)); - break; - case EVENT_SLEEP: - DoCastVictim(SPELL_SLEEP, true); - events.ScheduleEvent(EVENT_SLEEP, urand(12000, 20000)); - break; - case EVENT_ILLUSIONS: - // We will summon 3 illusions that will spawn on a random gamer and attack this gamer - // We will just use one model for the beginning - for (uint8 i = 0; i < 3; ++i) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - { - Creature* Illusion = me->SummonCreature(NPC_NIGHTMARE_ILLUSION, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000); - if (Illusion) - Illusion->AI()->AttackStart(target); - } - } - events.ScheduleEvent(EVENT_ILLUSIONS, urand(15000, 25000)); - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_hazzarahAI(creature); + _Reset(); } + + void JustDied(Unit* /*killer*/) + { + _JustDied(); + } + + void EnterCombat(Unit* /*who*/) + { + _EnterCombat(); + events.ScheduleEvent(EVENT_MANABURN, urand(4000, 10000)); + events.ScheduleEvent(EVENT_SLEEP, urand(10000, 18000)); + events.ScheduleEvent(EVENT_ILLUSIONS, urand(10000, 18000)); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_MANABURN: + DoCastVictim(SPELL_MANABURN, true); + events.ScheduleEvent(EVENT_MANABURN, urand(8000, 16000)); + break; + case EVENT_SLEEP: + DoCastVictim(SPELL_SLEEP, true); + events.ScheduleEvent(EVENT_SLEEP, urand(12000, 20000)); + break; + case EVENT_ILLUSIONS: + // We will summon 3 illusions that will spawn on a random gamer and attack this gamer + // We will just use one model for the beginning + for (uint8 i = 0; i < 3; ++i) + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + { + Creature* Illusion = me->SummonCreature(NPC_NIGHTMARE_ILLUSION, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000); + if (Illusion) + Illusion->AI()->AttackStart(target); + } + } + events.ScheduleEvent(EVENT_ILLUSIONS, urand(15000, 25000)); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_hazzarahAI(creature); + } }; void AddSC_boss_hazzarah() diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp index 2bec20db1..f33250004 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp @@ -67,176 +67,177 @@ Position const SpawnBat[6] = class boss_jeklik : public CreatureScript { - public: boss_jeklik() : CreatureScript("boss_jeklik") { } +public: + boss_jeklik() : CreatureScript("boss_jeklik") { } - struct boss_jeklikAI : public BossAI + struct boss_jeklikAI : public BossAI + { + boss_jeklikAI(Creature* creature) : BossAI(creature, DATA_JEKLIK) { } + + void Reset() { - boss_jeklikAI(Creature* creature) : BossAI(creature, DATA_JEKLIK) { } - - void Reset() - { - _Reset(); - } - - void JustDied(Unit* /*killer*/) - { - _JustDied(); - Talk(SAY_DEATH); - } - - void EnterCombat(Unit* /*who*/) - { - _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*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask) - { - 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) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_CHARGE_JEKLIK: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - { - DoCast(target, SPELL_CHARGE); - AttackStart(target); - } - events.ScheduleEvent(EVENT_CHARGE_JEKLIK, urand(15000, 30000), 0, PHASE_ONE); - break; - case EVENT_SONIC_BURST: - DoCastVictim(SPELL_SONICBURST); - events.ScheduleEvent(EVENT_SONIC_BURST, urand(8000, 13000), 0, PHASE_ONE); - break; - case EVENT_SCREECH: - DoCastVictim(SPELL_SCREECH); - events.ScheduleEvent(EVENT_SCREECH, urand(18000, 26000), 0, PHASE_ONE); - break; - 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(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetZulGurubAI(creature); + _Reset(); } + + void JustDied(Unit* /*killer*/) + { + _JustDied(); + Talk(SAY_DEATH); + } + + void EnterCombat(Unit* /*who*/) + { + _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*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask) + { + 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) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_CHARGE_JEKLIK: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + { + DoCast(target, SPELL_CHARGE); + AttackStart(target); + } + events.ScheduleEvent(EVENT_CHARGE_JEKLIK, urand(15000, 30000), 0, PHASE_ONE); + break; + case EVENT_SONIC_BURST: + DoCastVictim(SPELL_SONICBURST); + events.ScheduleEvent(EVENT_SONIC_BURST, urand(8000, 13000), 0, PHASE_ONE); + break; + case EVENT_SCREECH: + DoCastVictim(SPELL_SCREECH); + events.ScheduleEvent(EVENT_SCREECH, urand(18000, 26000), 0, PHASE_ONE); + break; + 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(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetZulGurubAI(creature); + } }; // Flying Bat class npc_batrider : public CreatureScript { - public: - npc_batrider() : CreatureScript("npc_batrider") { } +public: + npc_batrider() : CreatureScript("npc_batrider") { } - struct npc_batriderAI : public ScriptedAI + struct npc_batriderAI : public ScriptedAI + { + npc_batriderAI(Creature* creature) : ScriptedAI(creature) { } + + uint32 Bomb_Timer; + + void Reset() { - npc_batriderAI(Creature* creature) : ScriptedAI(creature) { } - - uint32 Bomb_Timer; - - void Reset() - { - Bomb_Timer = 2000; - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - } - - void EnterCombat(Unit* /*who*/) { } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - if (Bomb_Timer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - { - DoCast(target, SPELL_BOMB); - Bomb_Timer = 5000; - } - } - else - Bomb_Timer -= diff; - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_batriderAI(creature); + Bomb_Timer = 2000; + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } + + void EnterCombat(Unit* /*who*/) { } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + if (Bomb_Timer <= diff) + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + { + DoCast(target, SPELL_BOMB); + Bomb_Timer = 5000; + } + } + else + Bomb_Timer -= diff; + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_batriderAI(creature); + } }; void AddSC_boss_jeklik() diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp index c04655d23..238714542 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp @@ -47,222 +47,225 @@ Position const TeleportLoc = {-11583.7783f, -1249.4278f, 77.5471f, 4.745f}; class boss_jindo : public CreatureScript { - public: boss_jindo() : CreatureScript("boss_jindo") { } +public: + boss_jindo() : CreatureScript("boss_jindo") { } - struct boss_jindoAI : public BossAI + struct boss_jindoAI : public BossAI + { + boss_jindoAI(Creature* creature) : BossAI(creature, DATA_JINDO) { } + + void Reset() { - boss_jindoAI(Creature* creature) : BossAI(creature, DATA_JINDO) { } - - void Reset() - { - _Reset(); - } - - void JustDied(Unit* /*killer*/) - { - _JustDied(); - } - - void EnterCombat(Unit* /*who*/) - { - _EnterCombat(); - events.ScheduleEvent(EVENT_BRAINWASHTOTEM, 20000); - events.ScheduleEvent(EVENT_POWERFULLHEALINGWARD, 16000); - events.ScheduleEvent(EVENT_HEX, 8000); - events.ScheduleEvent(EVENT_DELUSIONSOFJINDO, 10000); - events.ScheduleEvent(EVENT_TELEPORT, 5000); - Talk(SAY_AGGRO); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_BRAINWASHTOTEM: - DoCast(me, SPELL_BRAINWASHTOTEM); - events.ScheduleEvent(EVENT_BRAINWASHTOTEM, urand(18000, 26000)); - break; - case EVENT_POWERFULLHEALINGWARD: // HACK - //DoCast(me, SPELL_POWERFULLHEALINGWARD); - me->SummonCreature(14987, me->GetPositionX()+3, me->GetPositionY()-2, me->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 30000); - events.ScheduleEvent(EVENT_POWERFULLHEALINGWARD, urand(14000, 20000)); - break; - case EVENT_HEX: - if (Unit* target = me->GetVictim()) - { - DoCast(target, SPELL_HEX, true); - if (DoGetThreat(target)) - DoModifyThreatPercent(target, -80); - } - events.ScheduleEvent(EVENT_HEX, urand(12000, 20000)); - break; - case EVENT_DELUSIONSOFJINDO: // HACK - // Casting the delusion curse with a shade so shade will attack the same target with the curse. - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - { - DoCast(target, SPELL_DELUSIONSOFJINDO); - Creature* Shade = me->SummonCreature(NPC_SHADE_OF_JINDO, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (Shade) - Shade->AI()->AttackStart(target); - } - events.ScheduleEvent(EVENT_DELUSIONSOFJINDO, urand(4000, 12000)); - break; - case EVENT_TELEPORT: // Possible HACK - // Teleports a random player and spawns 9 Sacrificed Trolls to attack player - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - { - DoTeleportPlayer(target, TeleportLoc.m_positionX, TeleportLoc.m_positionY, TeleportLoc.m_positionZ, TeleportLoc.m_orientation); - if (DoGetThreat(me->GetVictim())) - DoModifyThreatPercent(target, -100); - Creature* SacrificedTroll; - SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, target->GetPositionX()+2, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (SacrificedTroll) - SacrificedTroll->AI()->AttackStart(target); - SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, target->GetPositionX()-2, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (SacrificedTroll) - SacrificedTroll->AI()->AttackStart(target); - SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, target->GetPositionX()+4, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (SacrificedTroll) - SacrificedTroll->AI()->AttackStart(target); - SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, target->GetPositionX()-4, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (SacrificedTroll) - SacrificedTroll->AI()->AttackStart(target); - SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, target->GetPositionX(), target->GetPositionY()+2, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (SacrificedTroll) - SacrificedTroll->AI()->AttackStart(target); - SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, target->GetPositionX(), target->GetPositionY()-2, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (SacrificedTroll) - SacrificedTroll->AI()->AttackStart(target); - SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, target->GetPositionX(), target->GetPositionY()+4, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (SacrificedTroll) - SacrificedTroll->AI()->AttackStart(target); - SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, target->GetPositionX(), target->GetPositionY()-4, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (SacrificedTroll) - SacrificedTroll->AI()->AttackStart(target); - SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, target->GetPositionX()+3, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (SacrificedTroll) - SacrificedTroll->AI()->AttackStart(target); - } - events.ScheduleEvent(EVENT_TELEPORT, urand(15000, 23000)); - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_jindoAI(creature); + _Reset(); } + + void JustDied(Unit* /*killer*/) + { + _JustDied(); + } + + void EnterCombat(Unit* /*who*/) + { + _EnterCombat(); + events.ScheduleEvent(EVENT_BRAINWASHTOTEM, 20000); + events.ScheduleEvent(EVENT_POWERFULLHEALINGWARD, 16000); + events.ScheduleEvent(EVENT_HEX, 8000); + events.ScheduleEvent(EVENT_DELUSIONSOFJINDO, 10000); + events.ScheduleEvent(EVENT_TELEPORT, 5000); + Talk(SAY_AGGRO); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_BRAINWASHTOTEM: + DoCast(me, SPELL_BRAINWASHTOTEM); + events.ScheduleEvent(EVENT_BRAINWASHTOTEM, urand(18000, 26000)); + break; + case EVENT_POWERFULLHEALINGWARD: // HACK + //DoCast(me, SPELL_POWERFULLHEALINGWARD); + me->SummonCreature(14987, me->GetPositionX() + 3, me->GetPositionY() - 2, me->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 30000); + events.ScheduleEvent(EVENT_POWERFULLHEALINGWARD, urand(14000, 20000)); + break; + case EVENT_HEX: + if (Unit* target = me->GetVictim()) + { + DoCast(target, SPELL_HEX, true); + if (DoGetThreat(target)) + DoModifyThreatPercent(target, -80); + } + events.ScheduleEvent(EVENT_HEX, urand(12000, 20000)); + break; + case EVENT_DELUSIONSOFJINDO: // HACK + // Casting the delusion curse with a shade so shade will attack the same target with the curse. + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + { + DoCast(target, SPELL_DELUSIONSOFJINDO); + Creature* Shade = me->SummonCreature(NPC_SHADE_OF_JINDO, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); + if (Shade) + Shade->AI()->AttackStart(target); + } + events.ScheduleEvent(EVENT_DELUSIONSOFJINDO, urand(4000, 12000)); + break; + case EVENT_TELEPORT: // Possible HACK + // Teleports a random player and spawns 9 Sacrificed Trolls to attack player + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + { + DoTeleportPlayer(target, TeleportLoc.m_positionX, TeleportLoc.m_positionY, TeleportLoc.m_positionZ, TeleportLoc.m_orientation); + if (DoGetThreat(me->GetVictim())) + DoModifyThreatPercent(target, -100); + Creature* SacrificedTroll; + SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, target->GetPositionX() + 2, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); + if (SacrificedTroll) + SacrificedTroll->AI()->AttackStart(target); + SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, target->GetPositionX() - 2, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); + if (SacrificedTroll) + SacrificedTroll->AI()->AttackStart(target); + SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, target->GetPositionX() + 4, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); + if (SacrificedTroll) + SacrificedTroll->AI()->AttackStart(target); + SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, target->GetPositionX() - 4, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); + if (SacrificedTroll) + SacrificedTroll->AI()->AttackStart(target); + SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, target->GetPositionX(), target->GetPositionY() + 2, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); + if (SacrificedTroll) + SacrificedTroll->AI()->AttackStart(target); + SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, target->GetPositionX(), target->GetPositionY() - 2, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); + if (SacrificedTroll) + SacrificedTroll->AI()->AttackStart(target); + SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, target->GetPositionX(), target->GetPositionY() + 4, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); + if (SacrificedTroll) + SacrificedTroll->AI()->AttackStart(target); + SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, target->GetPositionX(), target->GetPositionY() - 4, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); + if (SacrificedTroll) + SacrificedTroll->AI()->AttackStart(target); + SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, target->GetPositionX() + 3, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); + if (SacrificedTroll) + SacrificedTroll->AI()->AttackStart(target); + } + events.ScheduleEvent(EVENT_TELEPORT, urand(15000, 23000)); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_jindoAI(creature); + } }; //Healing Ward class npc_healing_ward : public CreatureScript { - public: +public: - npc_healing_ward() - : CreatureScript("npc_healing_ward") + npc_healing_ward() + : CreatureScript("npc_healing_ward") + { + } + + struct npc_healing_wardAI : public ScriptedAI + { + npc_healing_wardAI(Creature* creature) : ScriptedAI(creature) + { + instance = creature->GetInstanceScript(); + } + + uint32 Heal_Timer; + + InstanceScript* instance; + + void Reset() + { + Heal_Timer = 2000; + } + + void EnterCombat(Unit* /*who*/) { } - struct npc_healing_wardAI : public ScriptedAI + void UpdateAI(uint32 diff) { - npc_healing_wardAI(Creature* creature) : ScriptedAI(creature) + //Heal_Timer + if (Heal_Timer <= diff) { - instance = creature->GetInstanceScript(); + Unit* pJindo = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_JINDO)); + if (pJindo) + DoCast(pJindo, SPELL_HEAL); + Heal_Timer = 3000; } + else Heal_Timer -= diff; - uint32 Heal_Timer; - - InstanceScript* instance; - - void Reset() - { - Heal_Timer = 2000; - } - - void EnterCombat(Unit* /*who*/) - { - } - - void UpdateAI(uint32 diff) - { - //Heal_Timer - if (Heal_Timer <= diff) - { - Unit* pJindo = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_JINDO)); - if (pJindo) - DoCast(pJindo, SPELL_HEAL); - Heal_Timer = 3000; - } else Heal_Timer -= diff; - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + DoMeleeAttackIfReady(); } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; //Shade of Jindo class npc_shade_of_jindo : public CreatureScript { - public: +public: - npc_shade_of_jindo() - : CreatureScript("npc_shade_of_jindo") + npc_shade_of_jindo() + : CreatureScript("npc_shade_of_jindo") + { + } + + struct npc_shade_of_jindoAI : public ScriptedAI + { + npc_shade_of_jindoAI(Creature* creature) : ScriptedAI(creature) { } + + uint32 ShadowShock_Timer; + + void Reset() { + ShadowShock_Timer = 1000; + DoCast(me, SPELL_INVISIBLE, true); } - struct npc_shade_of_jindoAI : public ScriptedAI + void EnterCombat(Unit* /*who*/) { } + + void UpdateAI(uint32 diff) { - npc_shade_of_jindoAI(Creature* creature) : ScriptedAI(creature) { } - uint32 ShadowShock_Timer; - - void Reset() + //ShadowShock_Timer + if (ShadowShock_Timer <= diff) { - ShadowShock_Timer = 1000; - DoCast(me, SPELL_INVISIBLE, true); + DoCastVictim(SPELL_SHADOWSHOCK); + ShadowShock_Timer = 2000; } + else ShadowShock_Timer -= diff; - void EnterCombat(Unit* /*who*/) { } - - void UpdateAI(uint32 diff) - { - - //ShadowShock_Timer - if (ShadowShock_Timer <= diff) - { - DoCastVictim(SPELL_SHADOWSHOCK); - ShadowShock_Timer = 2000; - } else ShadowShock_Timer -= diff; - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_shade_of_jindoAI(creature); + DoMeleeAttackIfReady(); } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_shade_of_jindoAI(creature); + } }; void AddSC_boss_jindo() diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp index 822dcd8d0..be41b2f02 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp @@ -94,181 +94,182 @@ Position const PosMandokir[2] = class boss_mandokir : public CreatureScript { - public: boss_mandokir() : CreatureScript("boss_mandokir") { } +public: + boss_mandokir() : CreatureScript("boss_mandokir") { } - struct boss_mandokirAI : public BossAI + struct boss_mandokirAI : public BossAI + { + boss_mandokirAI(Creature* creature) : BossAI(creature, DATA_MANDOKIR) { } + + void Reset() { - boss_mandokirAI(Creature* creature) : BossAI(creature, DATA_MANDOKIR) { } - - void Reset() + if (me->GetPositionZ() > 140.0f) { - if (me->GetPositionZ() > 140.0f) - { - - killCount = 0; - events.ScheduleEvent(EVENT_CHECK_START, 1000); - if (Creature* speaker = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_VILEBRANCH_SPEAKER))) - if (!speaker->IsAlive()) - speaker->Respawn(true); - } - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); - summons.DespawnAll(); - me->Mount(MODEL_OHGAN_MOUNT); + + killCount = 0; + events.ScheduleEvent(EVENT_CHECK_START, 1000); + if (Creature* speaker = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_VILEBRANCH_SPEAKER))) + if (!speaker->IsAlive()) + speaker->Respawn(true); } + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + summons.DespawnAll(); + me->Mount(MODEL_OHGAN_MOUNT); + } - void JustDied(Unit* /*killer*/) + void JustDied(Unit* /*killer*/) + { + // Do not want to unsummon Ohgan + for (int i = 0; i < CHAINED_SPIRT_COUNT; ++i) + if (Creature* unsummon = ObjectAccessor::GetCreature(*me, chainedSpirtGUIDs[i])) + unsummon->DespawnOrUnsummon(); + instance->SetBossState(DATA_MANDOKIR, DONE); + instance->SaveToDB(); + } + + void EnterCombat(Unit* /*who*/) + { + _EnterCombat(); + events.ScheduleEvent(EVENT_OVERPOWER, urand(7000, 9000)); + events.ScheduleEvent(EVENT_MORTAL_STRIKE, urand(12000, 18000)); + events.ScheduleEvent(EVENT_WHIRLWIND, urand(24000, 30000)); + events.ScheduleEvent(EVENT_CHECK_OHGAN, 1000); + events.ScheduleEvent(EVENT_WATCH_PLAYER, urand(13000, 15000)); + events.ScheduleEvent(EVENT_CHARGE_PLAYER, urand(33000, 38000)); + me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); + Talk(SAY_AGGRO); + me->Dismount(); + // Summon Ohgan (Spell missing) TEMP HACK + me->SummonCreature(NPC_OHGAN, me->GetPositionX() - 3, me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 35000); + // Summon Chained Spirits + for (int i = 0; i < CHAINED_SPIRT_COUNT; ++i) { - // Do not want to unsummon Ohgan - for (int i = 0; i < CHAINED_SPIRT_COUNT; ++i) - if (Creature* unsummon = ObjectAccessor::GetCreature(*me, chainedSpirtGUIDs[i])) - unsummon->DespawnOrUnsummon(); - instance->SetBossState(DATA_MANDOKIR, DONE); - instance->SaveToDB(); + Creature* chainedSpirt = me->SummonCreature(NPC_CHAINED_SPIRT, PosSummonChainedSpirits[i], TEMPSUMMON_CORPSE_DESPAWN); + chainedSpirtGUIDs[i] = chainedSpirt->GetGUID(); } + DoZoneInCombat(); + } - void EnterCombat(Unit* /*who*/) + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() != TYPEID_PLAYER) + return; + + if (++killCount == 3) { - _EnterCombat(); - events.ScheduleEvent(EVENT_OVERPOWER, urand(7000, 9000)); - events.ScheduleEvent(EVENT_MORTAL_STRIKE, urand(12000, 18000)); - events.ScheduleEvent(EVENT_WHIRLWIND, urand(24000, 30000)); - events.ScheduleEvent(EVENT_CHECK_OHGAN, 1000); - events.ScheduleEvent(EVENT_WATCH_PLAYER, urand(13000, 15000)); - events.ScheduleEvent(EVENT_CHARGE_PLAYER, urand(33000, 38000)); - me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); - Talk(SAY_AGGRO); - me->Dismount(); - // Summon Ohgan (Spell missing) TEMP HACK - me->SummonCreature(NPC_OHGAN, me->GetPositionX()-3, me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 35000); - // Summon Chained Spirits - for (int i = 0; i < CHAINED_SPIRT_COUNT; ++i) - { - Creature* chainedSpirt = me->SummonCreature(NPC_CHAINED_SPIRT, PosSummonChainedSpirits[i], TEMPSUMMON_CORPSE_DESPAWN); - chainedSpirtGUIDs[i] = chainedSpirt->GetGUID(); - } - DoZoneInCombat(); + Talk(SAY_DING_KILL); + if (Creature* jindo = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_JINDO))) + if (jindo->IsAlive()) + jindo->AI()->Talk(SAY_GRATS_JINDO); + DoCast(me, SPELL_LEVEL_UP, true); + killCount = 0; } + } - void KilledUnit(Unit* victim) + void MovementInform(uint32 type, uint32 id) + { + if (type == WAYPOINT_MOTION_TYPE) { - if (victim->GetTypeId() != TYPEID_PLAYER) - return; - - if (++killCount == 3) + me->SetWalk(false); + if (id == POINT_MANDOKIR_END) { - Talk(SAY_DING_KILL); - if (Creature* jindo = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_JINDO))) - if (jindo->IsAlive()) - jindo->AI()->Talk(SAY_GRATS_JINDO); - DoCast(me, SPELL_LEVEL_UP, true); - killCount = 0; + me->SetHomePosition(PosMandokir[0]); + instance->SetBossState(DATA_MANDOKIR, NOT_STARTED); + } } + } - void MovementInform(uint32 type, uint32 id) + void UpdateAI(uint32 diff) + { + events.Update(diff); + + if (!UpdateVictim()) { - if (type == WAYPOINT_MOTION_TYPE) + if (instance->GetBossState(DATA_MANDOKIR) == NOT_STARTED || instance->GetBossState(DATA_MANDOKIR) == SPECIAL) { - me->SetWalk(false); - if (id == POINT_MANDOKIR_END) + while (uint32 eventId = events.ExecuteEvent()) { - me->SetHomePosition(PosMandokir[0]); - instance->SetBossState(DATA_MANDOKIR, NOT_STARTED); - - } - } - } - - void UpdateAI(uint32 diff) - { - events.Update(diff); - - if (!UpdateVictim()) - { - if (instance->GetBossState(DATA_MANDOKIR) == NOT_STARTED || instance->GetBossState(DATA_MANDOKIR) == SPECIAL) - { - while (uint32 eventId = events.ExecuteEvent()) + switch (eventId) { - switch (eventId) - { - case EVENT_CHECK_START: - if (instance->GetBossState(DATA_MANDOKIR) == SPECIAL) - { - me->GetMotionMaster()->MovePoint(0, PosMandokir[1].m_positionX, PosMandokir[1].m_positionY, PosMandokir[1].m_positionZ); - events.ScheduleEvent(EVENT_STARTED, 6000); - } - else - events.ScheduleEvent(EVENT_CHECK_START, 1000); - break; - case EVENT_STARTED: - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); - break; - default: - break; - } + case EVENT_CHECK_START: + if (instance->GetBossState(DATA_MANDOKIR) == SPECIAL) + { + me->GetMotionMaster()->MovePoint(0, PosMandokir[1].m_positionX, PosMandokir[1].m_positionY, PosMandokir[1].m_positionZ); + events.ScheduleEvent(EVENT_STARTED, 6000); + } + else + events.ScheduleEvent(EVENT_CHECK_START, 1000); + break; + case EVENT_STARTED: + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + break; + default: + break; } } - return; } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_OVERPOWER: - DoCastVictim(SPELL_OVERPOWER, true); - events.ScheduleEvent(EVENT_OVERPOWER, urand(6000, 12000)); - break; - case EVENT_MORTAL_STRIKE: - if (me->GetVictim() && me->GetVictim()->HealthBelowPct(50)) - DoCastVictim(SPELL_MORTAL_STRIKE, true); - events.ScheduleEvent(EVENT_MORTAL_STRIKE, urand(12000, 18000)); - break; - case EVENT_WHIRLWIND: - DoCast(me, SPELL_WHIRLWIND); - events.ScheduleEvent(EVENT_WHIRLWIND, urand(22000, 26000)); - break; - case EVENT_CHECK_OHGAN: - if (instance->GetBossState(DATA_OHGAN) == DONE) - { - DoCast(me, SPELL_FRENZY); - Talk(SAY_OHGAN_DEAD); - } - else - events.ScheduleEvent(EVENT_CHECK_OHGAN, 1000); - break; - case EVENT_WATCH_PLAYER: - if (Unit* player = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - { - DoCast(player, SPELL_WATCH); - Talk(SAY_WATCH, player); - } - events.ScheduleEvent(EVENT_WATCH_PLAYER, urand(12000, 15000)); - break; - case EVENT_CHARGE_PLAYER: - DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 40, true), SPELL_CHARGE); - events.ScheduleEvent(EVENT_CHARGE_PLAYER, urand(22000, 30000)); - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); + return; } - private: - uint8 killCount; - uint64 chainedSpirtGUIDs[CHAINED_SPIRT_COUNT]; - }; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - CreatureAI* GetAI(Creature* creature) const - { - return GetZulGurubAI(creature); + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_OVERPOWER: + DoCastVictim(SPELL_OVERPOWER, true); + events.ScheduleEvent(EVENT_OVERPOWER, urand(6000, 12000)); + break; + case EVENT_MORTAL_STRIKE: + if (me->GetVictim() && me->GetVictim()->HealthBelowPct(50)) + DoCastVictim(SPELL_MORTAL_STRIKE, true); + events.ScheduleEvent(EVENT_MORTAL_STRIKE, urand(12000, 18000)); + break; + case EVENT_WHIRLWIND: + DoCast(me, SPELL_WHIRLWIND); + events.ScheduleEvent(EVENT_WHIRLWIND, urand(22000, 26000)); + break; + case EVENT_CHECK_OHGAN: + if (instance->GetBossState(DATA_OHGAN) == DONE) + { + DoCast(me, SPELL_FRENZY); + Talk(SAY_OHGAN_DEAD); + } + else + events.ScheduleEvent(EVENT_CHECK_OHGAN, 1000); + break; + case EVENT_WATCH_PLAYER: + if (Unit* player = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) + { + DoCast(player, SPELL_WATCH); + Talk(SAY_WATCH, player); + } + events.ScheduleEvent(EVENT_WATCH_PLAYER, urand(12000, 15000)); + break; + case EVENT_CHARGE_PLAYER: + DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 40, true), SPELL_CHARGE); + events.ScheduleEvent(EVENT_CHARGE_PLAYER, urand(22000, 30000)); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); } + + private: + uint8 killCount; + uint64 chainedSpirtGUIDs[CHAINED_SPIRT_COUNT]; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetZulGurubAI(creature); + } }; // Ohgan @@ -280,48 +281,50 @@ enum OhganSpells class npc_ohgan : public CreatureScript { - public: npc_ohgan() : CreatureScript("npc_ohgan") { } +public: + npc_ohgan() : CreatureScript("npc_ohgan") { } - struct npc_ohganAI : public ScriptedAI + struct npc_ohganAI : public ScriptedAI + { + npc_ohganAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) { } + + void Reset() { - npc_ohganAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) { } - - void Reset() - { - SunderArmor_Timer = 5000; - } - - void EnterCombat(Unit* /*who*/) { } - - void JustDied(Unit* /*killer*/) - { - instance->SetBossState(DATA_OHGAN, DONE); - } - - void UpdateAI(uint32 diff) - { - // Return since we have no target - if (!UpdateVictim()) - return; - - if (SunderArmor_Timer <= diff) - { - DoCastVictim(SPELL_SUNDERARMOR, true); - SunderArmor_Timer = urand(10000, 15000); - } else SunderArmor_Timer -= diff; - - DoMeleeAttackIfReady(); - } - - private: - uint32 SunderArmor_Timer; - InstanceScript* instance; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetZulGurubAI(creature); + SunderArmor_Timer = 5000; } + + void EnterCombat(Unit* /*who*/) { } + + void JustDied(Unit* /*killer*/) + { + instance->SetBossState(DATA_OHGAN, DONE); + } + + void UpdateAI(uint32 diff) + { + // Return since we have no target + if (!UpdateVictim()) + return; + + if (SunderArmor_Timer <= diff) + { + DoCastVictim(SPELL_SUNDERARMOR, true); + SunderArmor_Timer = urand(10000, 15000); + } + else SunderArmor_Timer -= diff; + + DoMeleeAttackIfReady(); + } + + private: + uint32 SunderArmor_Timer; + InstanceScript* instance; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetZulGurubAI(creature); + } }; enum VilebranchSpells @@ -332,85 +335,88 @@ enum VilebranchSpells class npc_vilebranch_speaker : public CreatureScript { - public: npc_vilebranch_speaker() : CreatureScript("npc_vilebranch_speaker") { } +public: + npc_vilebranch_speaker() : CreatureScript("npc_vilebranch_speaker") { } - struct npc_vilebranch_speakerAI : public ScriptedAI + struct npc_vilebranch_speakerAI : public ScriptedAI + { + npc_vilebranch_speakerAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) { } + + void Reset() { - npc_vilebranch_speakerAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) { } - - void Reset() - { - demoralizing_Shout_Timer = urand(2000, 4000); - cleave_Timer = urand(5000, 8000); - } - - void EnterCombat(Unit* /*who*/) { } - - void JustDied(Unit* /*killer*/) - { - instance->SetBossState(DATA_MANDOKIR, SPECIAL); - } - - void UpdateAI(uint32 diff) - { - // Return since we have no target - if (!UpdateVictim()) - return; - - if (demoralizing_Shout_Timer <= diff) - { - DoCast(me, SPELL_DEMORALIZING_SHOUT); - demoralizing_Shout_Timer = urand(22000, 30000); - } else demoralizing_Shout_Timer -= diff; - - if (cleave_Timer <= diff) - { - DoCastVictim(SPELL_CLEAVE, true); - cleave_Timer = urand(6000, 9000); - } else cleave_Timer -= diff; - - DoMeleeAttackIfReady(); - } - - private: - uint32 demoralizing_Shout_Timer; - uint32 cleave_Timer; - InstanceScript* instance; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + demoralizing_Shout_Timer = urand(2000, 4000); + cleave_Timer = urand(5000, 8000); } + + void EnterCombat(Unit* /*who*/) { } + + void JustDied(Unit* /*killer*/) + { + instance->SetBossState(DATA_MANDOKIR, SPECIAL); + } + + void UpdateAI(uint32 diff) + { + // Return since we have no target + if (!UpdateVictim()) + return; + + if (demoralizing_Shout_Timer <= diff) + { + DoCast(me, SPELL_DEMORALIZING_SHOUT); + demoralizing_Shout_Timer = urand(22000, 30000); + } + else demoralizing_Shout_Timer -= diff; + + if (cleave_Timer <= diff) + { + DoCastVictim(SPELL_CLEAVE, true); + cleave_Timer = urand(6000, 9000); + } + else cleave_Timer -= diff; + + DoMeleeAttackIfReady(); + } + + private: + uint32 demoralizing_Shout_Timer; + uint32 cleave_Timer; + InstanceScript* instance; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class spell_threatening_gaze : public SpellScriptLoader { - public: - spell_threatening_gaze() : SpellScriptLoader("spell_threatening_gaze") { } +public: + spell_threatening_gaze() : SpellScriptLoader("spell_threatening_gaze") { } - class spell_threatening_gaze_AuraScript : public AuraScript + class spell_threatening_gaze_AuraScript : public AuraScript + { + PrepareAuraScript(spell_threatening_gaze_AuraScript); + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_threatening_gaze_AuraScript); - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) - if (Unit* target = GetTarget()) - if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE && GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEATH) - caster->CastSpell(target, SPELL_WATCH_CHARGE); - } - - void Register() - { - OnEffectRemove += AuraEffectRemoveFn(spell_threatening_gaze_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_threatening_gaze_AuraScript(); + if (Unit* caster = GetCaster()) + if (Unit* target = GetTarget()) + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE && GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEATH) + caster->CastSpell(target, SPELL_WATCH_CHARGE); } + + void Register() + { + OnEffectRemove += AuraEffectRemoveFn(spell_threatening_gaze_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_threatening_gaze_AuraScript(); + } }; void AddSC_boss_mandokir() diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp index 1d6786bd5..01b3928bd 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp @@ -54,90 +54,91 @@ enum Phases class boss_marli : public CreatureScript { - public: boss_marli() : CreatureScript("boss_marli") { } +public: + boss_marli() : CreatureScript("boss_marli") { } - struct boss_marliAI : public BossAI + struct boss_marliAI : public BossAI + { + boss_marliAI(Creature* creature) : BossAI(creature, DATA_MARLI) { } + + void Reset() { - boss_marliAI(Creature* creature) : BossAI(creature, DATA_MARLI) { } + if (events.IsInPhase(PHASE_THREE)) + me->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, 35.0f, false); // hack + _Reset(); + } - void Reset() + void JustDied(Unit* /*killer*/) + { + _JustDied(); + Talk(SAY_DEATH); + } + + void EnterCombat(Unit* /*who*/) + { + _EnterCombat(); + events.ScheduleEvent(EVENT_SPAWN_START_SPIDERS, 1000, 0, PHASE_ONE); + Talk(SAY_AGGRO); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) { - if (events.IsInPhase(PHASE_THREE)) - me->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, 35.0f, false); // hack - _Reset(); - } - - void JustDied(Unit* /*killer*/) - { - _JustDied(); - Talk(SAY_DEATH); - } - - void EnterCombat(Unit* /*who*/) - { - _EnterCombat(); - events.ScheduleEvent(EVENT_SPAWN_START_SPIDERS, 1000, 0, PHASE_ONE); - Talk(SAY_AGGRO); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) + switch (eventId) { - switch (eventId) - { - case EVENT_SPAWN_START_SPIDERS: + case EVENT_SPAWN_START_SPIDERS: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - { - Talk(SAY_SPIDER_SPAWN); - Creature* Spider = nullptr; - Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (Spider) - Spider->AI()->AttackStart(target); - Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (Spider) - Spider->AI()->AttackStart(target); - Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (Spider) - Spider->AI()->AttackStart(target); - Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (Spider) - Spider->AI()->AttackStart(target); - } - events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 12000, 0, PHASE_TWO); - events.ScheduleEvent(EVENT_TRANSFORM, 45000, 0, PHASE_TWO); - events.ScheduleEvent(EVENT_POISON_VOLLEY, 15000); - events.ScheduleEvent(EVENT_SPAWN_SPIDER, 30000); - events.ScheduleEvent(EVENT_TRANSFORM, 45000, 0, PHASE_TWO); - events.SetPhase(PHASE_TWO); - break; - case EVENT_POISON_VOLLEY: - DoCastVictim(SPELL_POISON_VOLLEY, true); - events.ScheduleEvent(EVENT_POISON_VOLLEY, urand(10000, 20000)); - break; - case EVENT_ASPECT_OF_MARLI: - DoCastVictim(SPELL_ASPECT_OF_MARLI, true); - events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, urand(13000, 18000), 0, PHASE_TWO); - break; - case EVENT_SPAWN_SPIDER: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - { - Creature* Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (Spider) - Spider->AI()->AttackStart(target); - } - events.ScheduleEvent(EVENT_SPAWN_SPIDER, urand(12000, 17000)); - break; - case EVENT_TRANSFORM: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + { + Talk(SAY_SPIDER_SPAWN); + Creature* Spider = nullptr; + Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); + if (Spider) + Spider->AI()->AttackStart(target); + Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); + if (Spider) + Spider->AI()->AttackStart(target); + Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); + if (Spider) + Spider->AI()->AttackStart(target); + Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); + if (Spider) + Spider->AI()->AttackStart(target); + } + events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 12000, 0, PHASE_TWO); + events.ScheduleEvent(EVENT_TRANSFORM, 45000, 0, PHASE_TWO); + events.ScheduleEvent(EVENT_POISON_VOLLEY, 15000); + events.ScheduleEvent(EVENT_SPAWN_SPIDER, 30000); + events.ScheduleEvent(EVENT_TRANSFORM, 45000, 0, PHASE_TWO); + events.SetPhase(PHASE_TWO); + break; + case EVENT_POISON_VOLLEY: + DoCastVictim(SPELL_POISON_VOLLEY, true); + events.ScheduleEvent(EVENT_POISON_VOLLEY, urand(10000, 20000)); + break; + case EVENT_ASPECT_OF_MARLI: + DoCastVictim(SPELL_ASPECT_OF_MARLI, true); + events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, urand(13000, 18000), 0, PHASE_TWO); + break; + case EVENT_SPAWN_SPIDER: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + { + Creature* Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); + if (Spider) + Spider->AI()->AttackStart(target); + } + events.ScheduleEvent(EVENT_SPAWN_SPIDER, urand(12000, 17000)); + break; + case EVENT_TRANSFORM: { Talk(SAY_TRANSFORM); DoCast(me, SPELL_SPIDER_FORM); // SPELL_AURA_TRANSFORM @@ -156,7 +157,7 @@ class boss_marli : public CreatureScript events.SetPhase(PHASE_THREE); break; } - case EVENT_CHARGE_PLAYER: + case EVENT_CHARGE_PLAYER: { Unit* target = nullptr; int i = 0; @@ -174,7 +175,7 @@ class boss_marli : public CreatureScript events.ScheduleEvent(EVENT_CHARGE_PLAYER, 8000, 0, PHASE_THREE); break; } - case EVENT_TRANSFORM_BACK: + case EVENT_TRANSFORM_BACK: { me->RemoveAura(SPELL_SPIDER_FORM); /* @@ -192,62 +193,64 @@ class boss_marli : public CreatureScript events.SetPhase(PHASE_TWO); break; } - default: - break; - } + default: + break; } - - DoMeleeAttackIfReady(); } - }; - CreatureAI* GetAI(Creature* creature) const - { - return new boss_marliAI(creature); + DoMeleeAttackIfReady(); } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_marliAI(creature); + } }; // Spawn of Marli class npc_spawn_of_marli : public CreatureScript { - public: npc_spawn_of_marli() : CreatureScript("npc_spawn_of_marli") { } +public: + npc_spawn_of_marli() : CreatureScript("npc_spawn_of_marli") { } - struct npc_spawn_of_marliAI : public ScriptedAI + struct npc_spawn_of_marliAI : public ScriptedAI + { + npc_spawn_of_marliAI(Creature* creature) : ScriptedAI(creature) { } + + uint32 LevelUp_Timer; + + void Reset() { - npc_spawn_of_marliAI(Creature* creature) : ScriptedAI(creature) { } + LevelUp_Timer = 3000; + } - uint32 LevelUp_Timer; + void EnterCombat(Unit* /*who*/) + { + } - void Reset() + void UpdateAI(uint32 diff) + { + //Return since we have no target + if (!UpdateVictim()) + return; + + //LevelUp_Timer + if (LevelUp_Timer <= diff) { + DoCast(me, SPELL_LEVELUP); LevelUp_Timer = 3000; } + else LevelUp_Timer -= diff; - void EnterCombat(Unit* /*who*/) - { - } - - void UpdateAI(uint32 diff) - { - //Return since we have no target - if (!UpdateVictim()) - return; - - //LevelUp_Timer - if (LevelUp_Timer <= diff) - { - DoCast(me, SPELL_LEVELUP); - LevelUp_Timer = 3000; - } else LevelUp_Timer -= diff; - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_spawn_of_marliAI(creature); + DoMeleeAttackIfReady(); } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_spawn_of_marliAI(creature); + } }; void AddSC_boss_marli() diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp index 4ab500700..7042de35d 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp @@ -28,128 +28,134 @@ enum Misc class boss_renataki : public CreatureScript { - public: boss_renataki() : CreatureScript("boss_renataki") { } +public: + boss_renataki() : CreatureScript("boss_renataki") { } - struct boss_renatakiAI : public BossAI + struct boss_renatakiAI : public BossAI + { + boss_renatakiAI(Creature* creature) : BossAI(creature, DATA_EDGE_OF_MADNESS) { } + + uint32 Invisible_Timer; + uint32 Ambush_Timer; + uint32 Visible_Timer; + uint32 Aggro_Timer; + uint32 ThousandBlades_Timer; + + bool Invisible; + bool Ambushed; + + void Reset() { - boss_renatakiAI(Creature* creature) : BossAI(creature, DATA_EDGE_OF_MADNESS) { } + _Reset(); + Invisible_Timer = urand(8000, 18000); + Ambush_Timer = 3000; + Visible_Timer = 4000; + Aggro_Timer = urand(15000, 25000); + ThousandBlades_Timer = urand(4000, 8000); - uint32 Invisible_Timer; - uint32 Ambush_Timer; - uint32 Visible_Timer; - uint32 Aggro_Timer; - uint32 ThousandBlades_Timer; + Invisible = false; + Ambushed = false; + } - bool Invisible; - bool Ambushed; + void JustDied(Unit* /*killer*/) + { + _JustDied(); + } - void Reset() + void EnterCombat(Unit* /*who*/) + { + _EnterCombat(); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + //Invisible_Timer + if (Invisible_Timer <= diff) { - _Reset(); - Invisible_Timer = urand(8000, 18000); - Ambush_Timer = 3000; - Visible_Timer = 4000; - Aggro_Timer = urand(15000, 25000); - ThousandBlades_Timer = urand(4000, 8000); + me->InterruptSpell(CURRENT_GENERIC_SPELL); - Invisible = false; - Ambushed = false; + SetEquipmentSlots(false, EQUIP_UNEQUIP, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); + me->SetDisplayId(11686); + + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + Invisible = true; + + Invisible_Timer = urand(15000, 30000); + } + else Invisible_Timer -= diff; + + if (Invisible) + { + if (Ambush_Timer <= diff) + { + Unit* target = nullptr; + target = SelectTarget(SELECT_TARGET_RANDOM, 0); + if (target) + { + me->NearTeleportTo(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), me->GetOrientation()); + DoCast(target, SPELL_AMBUSH); + } + + Ambushed = true; + Ambush_Timer = 3000; + } + else Ambush_Timer -= diff; } - void JustDied(Unit* /*killer*/) + if (Ambushed) { - _JustDied(); - } - - void EnterCombat(Unit* /*who*/) - { - _EnterCombat(); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - //Invisible_Timer - if (Invisible_Timer <= diff) + if (Visible_Timer <= diff) { me->InterruptSpell(CURRENT_GENERIC_SPELL); - SetEquipmentSlots(false, EQUIP_UNEQUIP, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); - me->SetDisplayId(11686); + me->SetDisplayId(15268); + SetEquipmentSlots(false, EQUIP_ID_MAIN_HAND, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - Invisible = true; + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + Invisible = false; - Invisible_Timer = urand(15000, 30000); - } else Invisible_Timer -= diff; - - if (Invisible) - { - if (Ambush_Timer <= diff) - { - Unit* target = nullptr; - target = SelectTarget(SELECT_TARGET_RANDOM, 0); - if (target) - { - me->NearTeleportTo(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), me->GetOrientation()); - DoCast(target, SPELL_AMBUSH); - } - - Ambushed = true; - Ambush_Timer = 3000; - } else Ambush_Timer -= diff; + Visible_Timer = 4000; } - - if (Ambushed) - { - if (Visible_Timer <= diff) - { - me->InterruptSpell(CURRENT_GENERIC_SPELL); - - me->SetDisplayId(15268); - SetEquipmentSlots(false, EQUIP_ID_MAIN_HAND, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); - - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - Invisible = false; - - Visible_Timer = 4000; - } else Visible_Timer -= diff; - } - - //Resetting some aggro so he attacks other gamers - if (!Invisible) - { - if (Aggro_Timer <= diff) - { - Unit* target = nullptr; - target = SelectTarget(SELECT_TARGET_RANDOM, 1); - - if (DoGetThreat(me->GetVictim())) - DoModifyThreatPercent(me->GetVictim(), -50); - - if (target) - AttackStart(target); - - Aggro_Timer = urand(7000, 20000); - } else Aggro_Timer -= diff; - - if (ThousandBlades_Timer <= diff) - { - DoCastVictim(SPELL_THOUSANDBLADES); - ThousandBlades_Timer = urand(7000, 12000); - } else ThousandBlades_Timer -= diff; - } - - DoMeleeAttackIfReady(); + else Visible_Timer -= diff; } - }; - CreatureAI* GetAI(Creature* creature) const - { - return new boss_renatakiAI(creature); + //Resetting some aggro so he attacks other gamers + if (!Invisible) + { + if (Aggro_Timer <= diff) + { + Unit* target = nullptr; + target = SelectTarget(SELECT_TARGET_RANDOM, 1); + + if (DoGetThreat(me->GetVictim())) + DoModifyThreatPercent(me->GetVictim(), -50); + + if (target) + AttackStart(target); + + Aggro_Timer = urand(7000, 20000); + } + else Aggro_Timer -= diff; + + if (ThousandBlades_Timer <= diff) + { + DoCastVictim(SPELL_THOUSANDBLADES); + ThousandBlades_Timer = urand(7000, 12000); + } + else ThousandBlades_Timer -= diff; + } + + DoMeleeAttackIfReady(); } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_renatakiAI(creature); + } }; void AddSC_boss_renataki() diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp index 8fbdac29b..621db503f 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp @@ -66,475 +66,488 @@ enum Phases class boss_thekal : public CreatureScript { - public: boss_thekal() : CreatureScript("boss_thekal") { } +public: + boss_thekal() : CreatureScript("boss_thekal") { } - struct boss_thekalAI : public BossAI + struct boss_thekalAI : public BossAI + { + boss_thekalAI(Creature* creature) : BossAI(creature, DATA_THEKAL) { } + + bool Enraged; + bool WasDead; + + void Reset() { - boss_thekalAI(Creature* creature) : BossAI(creature, DATA_THEKAL) { } - - bool Enraged; - bool WasDead; - - void Reset() - { - if (events.IsInPhase(PHASE_TWO)) - me->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, 35.0f, false); // hack - _Reset(); - Enraged = false; - WasDead = false; - } - - void JustDied(Unit* /*killer*/) - { - _JustDied(); - Talk(SAY_DEATH); - } - - void EnterCombat(Unit* /*who*/) - { - _EnterCombat(); - events.ScheduleEvent(EVENT_MORTALCLEAVE, 4000, 0, PHASE_ONE); // Phase 1 - events.ScheduleEvent(EVENT_SILENCE, 9000, 0, PHASE_ONE); // Phase 1 - events.ScheduleEvent(EVENT_CHECK_TIMER, 10000, 0, PHASE_ONE); // Phase 1 - events.ScheduleEvent(EVENT_RESURRECT_TIMER, 10000, 0, PHASE_ONE); // Phase 1 - Talk(SAY_AGGRO); - } - - void JustReachedHome() - { - instance->SetBossState(DATA_THEKAL, NOT_STARTED); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_MORTALCLEAVE: - DoCastVictim(SPELL_MORTALCLEAVE, true); - events.ScheduleEvent(EVENT_MORTALCLEAVE, urand(15000, 20000), 0, PHASE_ONE); - break; - case EVENT_SILENCE: - DoCastVictim(SPELL_SILENCE, true); - events.ScheduleEvent(EVENT_SILENCE, urand(20000, 25000), 0, PHASE_ONE); - break; - case EVENT_RESURRECT_TIMER: - //Thekal will transform to Tiger if he died and was not resurrected after 10 seconds. - if (WasDead) - { - 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); - /* - 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 - events.ScheduleEvent(EVENT_SPELL_CHARGE, 12000, 0, PHASE_TWO); // Phase 2 - events.ScheduleEvent(EVENT_ENRAGE, 32000, 0, PHASE_TWO); // Phase 2 - events.ScheduleEvent(EVENT_SUMMONTIGERS, 25000, 0, PHASE_TWO); // Phase 2 - events.SetPhase(PHASE_TWO); - } - events.ScheduleEvent(EVENT_RESURRECT_TIMER, 10000, 0, PHASE_ONE); - break; - case EVENT_CHECK_TIMER: - //Check_Timer for the death of LorKhan and Zath. - if (!WasDead) - { - if (instance->GetBossState(DATA_LORKHAN) == SPECIAL) - { - //Resurrect LorKhan - if (Unit* pLorKhan = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_LORKHAN))) - { - pLorKhan->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - pLorKhan->setFaction(14); - pLorKhan->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - pLorKhan->SetFullHealth(); - instance->SetData(DATA_LORKHAN, DONE); - } - } - - if (instance->GetBossState(DATA_ZATH) == SPECIAL) - { - //Resurrect Zath - if (Unit* pZath = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_ZATH))) - { - pZath->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - pZath->setFaction(14); - pZath->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - pZath->SetFullHealth(); - instance->SetBossState(DATA_ZATH, DONE); - } - } - } - events.ScheduleEvent(EVENT_CHECK_TIMER, 5000, 0, PHASE_ONE); - break; - case EVENT_FRENZY: - DoCast(me, SPELL_FRENZY); - events.ScheduleEvent(EVENT_FRENZY, 30000, 0, PHASE_TWO); - break; - case EVENT_FORCEPUNCH: - DoCastVictim(SPELL_FORCEPUNCH, true); - events.ScheduleEvent(EVENT_FORCEPUNCH, urand(16000, 21000), 0, PHASE_TWO); - break; - case EVENT_CHARGE: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - { - DoCast(target, SPELL_CHARGE); - DoResetThreat(); - AttackStart(target); - } - events.ScheduleEvent(EVENT_CHARGE, urand(15000, 22000), 0, PHASE_TWO); - break; - case EVENT_ENRAGE: - if (HealthBelowPct(11) && !Enraged) - { - DoCast(me, SPELL_ENRAGE); - Enraged = true; - } - events.ScheduleEvent(EVENT_ENRAGE, 30000); - break; - case EVENT_SUMMONTIGERS: - DoCastVictim(SPELL_SUMMONTIGERS, true); - events.ScheduleEvent(EVENT_SUMMONTIGERS, urand(10000, 14000), 0, PHASE_TWO); - break; - default: - break; - } - - if (me->IsFullHealth() && WasDead) - WasDead = false; - - if ((events.IsInPhase(PHASE_ONE)) && !WasDead && !HealthAbovePct(5)) - { - me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT); - me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE); - me->RemoveAurasByType(SPELL_AURA_PERIODIC_LEECH); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->SetStandState(UNIT_STAND_STATE_SLEEP); - me->AttackStop(); - instance->SetBossState(DATA_THEKAL, SPECIAL); - WasDead=true; - } - } - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + if (events.IsInPhase(PHASE_TWO)) + me->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, 35.0f, false); // hack + _Reset(); + Enraged = false; + WasDead = false; } + + void JustDied(Unit* /*killer*/) + { + _JustDied(); + Talk(SAY_DEATH); + } + + void EnterCombat(Unit* /*who*/) + { + _EnterCombat(); + events.ScheduleEvent(EVENT_MORTALCLEAVE, 4000, 0, PHASE_ONE); // Phase 1 + events.ScheduleEvent(EVENT_SILENCE, 9000, 0, PHASE_ONE); // Phase 1 + events.ScheduleEvent(EVENT_CHECK_TIMER, 10000, 0, PHASE_ONE); // Phase 1 + events.ScheduleEvent(EVENT_RESURRECT_TIMER, 10000, 0, PHASE_ONE); // Phase 1 + Talk(SAY_AGGRO); + } + + void JustReachedHome() + { + instance->SetBossState(DATA_THEKAL, NOT_STARTED); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_MORTALCLEAVE: + DoCastVictim(SPELL_MORTALCLEAVE, true); + events.ScheduleEvent(EVENT_MORTALCLEAVE, urand(15000, 20000), 0, PHASE_ONE); + break; + case EVENT_SILENCE: + DoCastVictim(SPELL_SILENCE, true); + events.ScheduleEvent(EVENT_SILENCE, urand(20000, 25000), 0, PHASE_ONE); + break; + case EVENT_RESURRECT_TIMER: + //Thekal will transform to Tiger if he died and was not resurrected after 10 seconds. + if (WasDead) + { + 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); + /* + 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 + events.ScheduleEvent(EVENT_SPELL_CHARGE, 12000, 0, PHASE_TWO); // Phase 2 + events.ScheduleEvent(EVENT_ENRAGE, 32000, 0, PHASE_TWO); // Phase 2 + events.ScheduleEvent(EVENT_SUMMONTIGERS, 25000, 0, PHASE_TWO); // Phase 2 + events.SetPhase(PHASE_TWO); + } + events.ScheduleEvent(EVENT_RESURRECT_TIMER, 10000, 0, PHASE_ONE); + break; + case EVENT_CHECK_TIMER: + //Check_Timer for the death of LorKhan and Zath. + if (!WasDead) + { + if (instance->GetBossState(DATA_LORKHAN) == SPECIAL) + { + //Resurrect LorKhan + if (Unit* pLorKhan = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_LORKHAN))) + { + pLorKhan->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); + pLorKhan->setFaction(14); + pLorKhan->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + pLorKhan->SetFullHealth(); + instance->SetData(DATA_LORKHAN, DONE); + } + } + + if (instance->GetBossState(DATA_ZATH) == SPECIAL) + { + //Resurrect Zath + if (Unit* pZath = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_ZATH))) + { + pZath->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); + pZath->setFaction(14); + pZath->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + pZath->SetFullHealth(); + instance->SetBossState(DATA_ZATH, DONE); + } + } + } + events.ScheduleEvent(EVENT_CHECK_TIMER, 5000, 0, PHASE_ONE); + break; + case EVENT_FRENZY: + DoCast(me, SPELL_FRENZY); + events.ScheduleEvent(EVENT_FRENZY, 30000, 0, PHASE_TWO); + break; + case EVENT_FORCEPUNCH: + DoCastVictim(SPELL_FORCEPUNCH, true); + events.ScheduleEvent(EVENT_FORCEPUNCH, urand(16000, 21000), 0, PHASE_TWO); + break; + case EVENT_CHARGE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + { + DoCast(target, SPELL_CHARGE); + DoResetThreat(); + AttackStart(target); + } + events.ScheduleEvent(EVENT_CHARGE, urand(15000, 22000), 0, PHASE_TWO); + break; + case EVENT_ENRAGE: + if (HealthBelowPct(11) && !Enraged) + { + DoCast(me, SPELL_ENRAGE); + Enraged = true; + } + events.ScheduleEvent(EVENT_ENRAGE, 30000); + break; + case EVENT_SUMMONTIGERS: + DoCastVictim(SPELL_SUMMONTIGERS, true); + events.ScheduleEvent(EVENT_SUMMONTIGERS, urand(10000, 14000), 0, PHASE_TWO); + break; + default: + break; + } + + if (me->IsFullHealth() && WasDead) + WasDead = false; + + if ((events.IsInPhase(PHASE_ONE)) && !WasDead && !HealthAbovePct(5)) + { + me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT); + me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE); + me->RemoveAurasByType(SPELL_AURA_PERIODIC_LEECH); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->SetStandState(UNIT_STAND_STATE_SLEEP); + me->AttackStop(); + instance->SetBossState(DATA_THEKAL, SPECIAL); + WasDead = true; + } + } + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; //Zealot Lor'Khan class npc_zealot_lorkhan : public CreatureScript { - public: npc_zealot_lorkhan() : CreatureScript("npc_zealot_lorkhan") { } +public: + npc_zealot_lorkhan() : CreatureScript("npc_zealot_lorkhan") { } - struct npc_zealot_lorkhanAI : public ScriptedAI + struct npc_zealot_lorkhanAI : public ScriptedAI + { + npc_zealot_lorkhanAI(Creature* creature) : ScriptedAI(creature) { - npc_zealot_lorkhanAI(Creature* creature) : ScriptedAI(creature) + instance = creature->GetInstanceScript(); + } + + uint32 Shield_Timer; + uint32 BloodLust_Timer; + uint32 GreaterHeal_Timer; + uint32 Disarm_Timer; + uint32 Check_Timer; + + bool FakeDeath; + + InstanceScript* instance; + + void Reset() + { + Shield_Timer = 1000; + BloodLust_Timer = 16000; + GreaterHeal_Timer = 32000; + Disarm_Timer = 6000; + Check_Timer = 10000; + + FakeDeath = false; + + instance->SetBossState(DATA_LORKHAN, NOT_STARTED); + + me->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + } + + void EnterCombat(Unit* /*who*/) + { + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + //Shield_Timer + if (Shield_Timer <= diff) { - instance = creature->GetInstanceScript(); + DoCast(me, SPELL_SHIELD); + Shield_Timer = 61000; } + else Shield_Timer -= diff; - uint32 Shield_Timer; - uint32 BloodLust_Timer; - uint32 GreaterHeal_Timer; - uint32 Disarm_Timer; - uint32 Check_Timer; - - bool FakeDeath; - - InstanceScript* instance; - - void Reset() + //BloodLust_Timer + if (BloodLust_Timer <= diff) { - Shield_Timer = 1000; - BloodLust_Timer = 16000; - GreaterHeal_Timer = 32000; - Disarm_Timer = 6000; - Check_Timer = 10000; - - FakeDeath = false; - - instance->SetBossState(DATA_LORKHAN, NOT_STARTED); - - me->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + DoCast(me, SPELL_BLOODLUST); + BloodLust_Timer = 20000 + rand() % 8000; } + else BloodLust_Timer -= diff; - void EnterCombat(Unit* /*who*/) + //Casting Greaterheal to Thekal or Zath if they are in meele range. + if (GreaterHeal_Timer <= diff) { - } + Unit* pThekal = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_THEKAL)); + Unit* pZath = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_ZATH)); - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) + if (!pThekal || !pZath) return; - //Shield_Timer - if (Shield_Timer <= diff) + switch (urand(0, 1)) { - DoCast(me, SPELL_SHIELD); - Shield_Timer = 61000; - } else Shield_Timer -= diff; - - //BloodLust_Timer - if (BloodLust_Timer <= diff) - { - DoCast(me, SPELL_BLOODLUST); - BloodLust_Timer = 20000+rand()%8000; - } else BloodLust_Timer -= diff; - - //Casting Greaterheal to Thekal or Zath if they are in meele range. - if (GreaterHeal_Timer <= diff) - { - Unit* pThekal = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_THEKAL)); - Unit* pZath = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_ZATH)); - - if (!pThekal || !pZath) - return; - - switch (urand(0, 1)) - { - case 0: - if (me->IsWithinMeleeRange(pThekal)) - DoCast(pThekal, SPELL_GREATERHEAL); - break; - case 1: - if (me->IsWithinMeleeRange(pZath)) - DoCast(pZath, SPELL_GREATERHEAL); - break; - } - - GreaterHeal_Timer = 15000+rand()%5000; - } else GreaterHeal_Timer -= diff; - - //Disarm_Timer - if (Disarm_Timer <= diff) - { - DoCastVictim(SPELL_DISARM); - Disarm_Timer = 15000+rand()%10000; - } else Disarm_Timer -= diff; - - //Check_Timer for the death of LorKhan and Zath. - if (!FakeDeath && Check_Timer <= diff) - { - if (instance->GetBossState(DATA_THEKAL) == SPECIAL) - { - //Resurrect Thekal - if (Unit* pThekal = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_THEKAL))) - { - pThekal->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - pThekal->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - pThekal->setFaction(14); - pThekal->SetFullHealth(); - } - } - - if (instance->GetBossState(DATA_ZATH) == SPECIAL) - { - //Resurrect Zath - if (Unit* pZath = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_ZATH))) - { - pZath->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - pZath->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - pZath->setFaction(14); - pZath->SetFullHealth(); - } - } - - Check_Timer = 5000; - } else Check_Timer -= diff; - - if (!HealthAbovePct(5)) - { - me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT); - me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE); - me->RemoveAurasByType(SPELL_AURA_PERIODIC_LEECH); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->SetStandState(UNIT_STAND_STATE_SLEEP); - me->setFaction(35); - me->AttackStop(); - - instance->SetBossState(DATA_LORKHAN, SPECIAL); - - FakeDeath = true; + case 0: + if (me->IsWithinMeleeRange(pThekal)) + DoCast(pThekal, SPELL_GREATERHEAL); + break; + case 1: + if (me->IsWithinMeleeRange(pZath)) + DoCast(pZath, SPELL_GREATERHEAL); + break; } - DoMeleeAttackIfReady(); + GreaterHeal_Timer = 15000 + rand() % 5000; } - }; + else GreaterHeal_Timer -= diff; - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + //Disarm_Timer + if (Disarm_Timer <= diff) + { + DoCastVictim(SPELL_DISARM); + Disarm_Timer = 15000 + rand() % 10000; + } + else Disarm_Timer -= diff; + + //Check_Timer for the death of LorKhan and Zath. + if (!FakeDeath && Check_Timer <= diff) + { + if (instance->GetBossState(DATA_THEKAL) == SPECIAL) + { + //Resurrect Thekal + if (Unit* pThekal = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_THEKAL))) + { + pThekal->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); + pThekal->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + pThekal->setFaction(14); + pThekal->SetFullHealth(); + } + } + + if (instance->GetBossState(DATA_ZATH) == SPECIAL) + { + //Resurrect Zath + if (Unit* pZath = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_ZATH))) + { + pZath->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); + pZath->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + pZath->setFaction(14); + pZath->SetFullHealth(); + } + } + + Check_Timer = 5000; + } + else Check_Timer -= diff; + + if (!HealthAbovePct(5)) + { + me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT); + me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE); + me->RemoveAurasByType(SPELL_AURA_PERIODIC_LEECH); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->SetStandState(UNIT_STAND_STATE_SLEEP); + me->setFaction(35); + me->AttackStop(); + + instance->SetBossState(DATA_LORKHAN, SPECIAL); + + FakeDeath = true; + } + + DoMeleeAttackIfReady(); } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; //Zealot Zath class npc_zealot_zath : public CreatureScript { - public: +public: - npc_zealot_zath() - : CreatureScript("npc_zealot_zath") + npc_zealot_zath() + : CreatureScript("npc_zealot_zath") + { + } + + struct npc_zealot_zathAI : public ScriptedAI + { + npc_zealot_zathAI(Creature* creature) : ScriptedAI(creature) + { + instance = creature->GetInstanceScript(); + } + + uint32 SweepingStrikes_Timer; + uint32 SinisterStrike_Timer; + uint32 Gouge_Timer; + uint32 Kick_Timer; + uint32 Blind_Timer; + uint32 Check_Timer; + + bool FakeDeath; + + InstanceScript* instance; + + void Reset() + { + SweepingStrikes_Timer = 13000; + SinisterStrike_Timer = 8000; + Gouge_Timer = 25000; + Kick_Timer = 18000; + Blind_Timer = 5000; + Check_Timer = 10000; + + FakeDeath = false; + + instance->SetBossState(DATA_ZATH, NOT_STARTED); + + me->SetStandState(UNIT_STAND_STATE_STAND); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + } + + void EnterCombat(Unit* /*who*/) { } - struct npc_zealot_zathAI : public ScriptedAI + void UpdateAI(uint32 diff) { - npc_zealot_zathAI(Creature* creature) : ScriptedAI(creature) + if (!UpdateVictim()) + return; + + //SweepingStrikes_Timer + if (SweepingStrikes_Timer <= diff) { - instance = creature->GetInstanceScript(); + DoCastVictim(SPELL_SWEEPINGSTRIKES); + SweepingStrikes_Timer = 22000 + rand() % 4000; } + else SweepingStrikes_Timer -= diff; - uint32 SweepingStrikes_Timer; - uint32 SinisterStrike_Timer; - uint32 Gouge_Timer; - uint32 Kick_Timer; - uint32 Blind_Timer; - uint32 Check_Timer; - - bool FakeDeath; - - InstanceScript* instance; - - void Reset() + //SinisterStrike_Timer + if (SinisterStrike_Timer <= diff) { - SweepingStrikes_Timer = 13000; - SinisterStrike_Timer = 8000; - Gouge_Timer = 25000; - Kick_Timer = 18000; - Blind_Timer = 5000; - Check_Timer = 10000; - - FakeDeath = false; - - instance->SetBossState(DATA_ZATH, NOT_STARTED); - - me->SetStandState(UNIT_STAND_STATE_STAND); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + DoCastVictim(SPELL_SINISTERSTRIKE); + SinisterStrike_Timer = 8000 + rand() % 8000; } + else SinisterStrike_Timer -= diff; - void EnterCombat(Unit* /*who*/) + //Gouge_Timer + if (Gouge_Timer <= diff) { + DoCastVictim(SPELL_GOUGE); + + if (DoGetThreat(me->GetVictim())) + DoModifyThreatPercent(me->GetVictim(), -100); + + Gouge_Timer = 17000 + rand() % 10000; } + else Gouge_Timer -= diff; - void UpdateAI(uint32 diff) + //Kick_Timer + if (Kick_Timer <= diff) { - if (!UpdateVictim()) - return; + DoCastVictim(SPELL_KICK); + Kick_Timer = 15000 + rand() % 10000; + } + else Kick_Timer -= diff; - //SweepingStrikes_Timer - if (SweepingStrikes_Timer <= diff) + //Blind_Timer + if (Blind_Timer <= diff) + { + DoCastVictim(SPELL_BLIND); + Blind_Timer = 10000 + rand() % 10000; + } + else Blind_Timer -= diff; + + //Check_Timer for the death of LorKhan and Zath. + if (!FakeDeath && Check_Timer <= diff) + { + if (instance->GetBossState(DATA_LORKHAN) == SPECIAL) { - DoCastVictim(SPELL_SWEEPINGSTRIKES); - SweepingStrikes_Timer = 22000+rand()%4000; - } else SweepingStrikes_Timer -= diff; - - //SinisterStrike_Timer - if (SinisterStrike_Timer <= diff) - { - DoCastVictim(SPELL_SINISTERSTRIKE); - SinisterStrike_Timer = 8000+rand()%8000; - } else SinisterStrike_Timer -= diff; - - //Gouge_Timer - if (Gouge_Timer <= diff) - { - DoCastVictim(SPELL_GOUGE); - - if (DoGetThreat(me->GetVictim())) - DoModifyThreatPercent(me->GetVictim(), -100); - - Gouge_Timer = 17000+rand()%10000; - } else Gouge_Timer -= diff; - - //Kick_Timer - if (Kick_Timer <= diff) - { - DoCastVictim(SPELL_KICK); - Kick_Timer = 15000+rand()%10000; - } else Kick_Timer -= diff; - - //Blind_Timer - if (Blind_Timer <= diff) - { - DoCastVictim(SPELL_BLIND); - Blind_Timer = 10000+rand()%10000; - } else Blind_Timer -= diff; - - //Check_Timer for the death of LorKhan and Zath. - if (!FakeDeath && Check_Timer <= diff) - { - if (instance->GetBossState(DATA_LORKHAN) == SPECIAL) + //Resurrect LorKhan + if (Unit* pLorKhan = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_LORKHAN))) { - //Resurrect LorKhan - if (Unit* pLorKhan = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_LORKHAN))) - { - pLorKhan->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - pLorKhan->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - pLorKhan->setFaction(14); - pLorKhan->SetFullHealth(); - } + pLorKhan->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); + pLorKhan->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + pLorKhan->setFaction(14); + pLorKhan->SetFullHealth(); } - - if (instance->GetBossState(DATA_THEKAL) == SPECIAL) - { - //Resurrect Thekal - if (Unit* pThekal = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_THEKAL))) - { - pThekal->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - pThekal->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - pThekal->setFaction(14); - pThekal->SetFullHealth(); - } - } - - Check_Timer = 5000; - } else Check_Timer -= diff; - - if (!HealthAbovePct(5)) - { - me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT); - me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE); - me->RemoveAurasByType(SPELL_AURA_PERIODIC_LEECH); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->SetStandState(UNIT_STAND_STATE_SLEEP); - me->setFaction(35); - me->AttackStop(); - - instance->SetBossState(DATA_ZATH, SPECIAL); - - FakeDeath = true; } - DoMeleeAttackIfReady(); - } - }; + if (instance->GetBossState(DATA_THEKAL) == SPECIAL) + { + //Resurrect Thekal + if (Unit* pThekal = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_THEKAL))) + { + pThekal->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); + pThekal->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + pThekal->setFaction(14); + pThekal->SetFullHealth(); + } + } - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + Check_Timer = 5000; + } + else Check_Timer -= diff; + + if (!HealthAbovePct(5)) + { + me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT); + me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE); + me->RemoveAurasByType(SPELL_AURA_PERIODIC_LEECH); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->SetStandState(UNIT_STAND_STATE_SLEEP); + me->setFaction(35); + me->AttackStop(); + + instance->SetBossState(DATA_ZATH, SPECIAL); + + FakeDeath = true; + } + + DoMeleeAttackIfReady(); } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; void AddSC_boss_thekal() diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp index 2d2a89590..0a0a3dadf 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp @@ -73,187 +73,188 @@ enum NPCs class boss_venoxis : public CreatureScript { - public: boss_venoxis() : CreatureScript("boss_venoxis") { } +public: + boss_venoxis() : CreatureScript("boss_venoxis") { } - struct boss_venoxisAI : public BossAI + struct boss_venoxisAI : public BossAI + { + boss_venoxisAI(Creature* creature) : BossAI(creature, DATA_VENOXIS) { } + + void Reset() { - boss_venoxisAI(Creature* creature) : BossAI(creature, DATA_VENOXIS) { } - - void Reset() - { - _Reset(); - // remove all spells and auras from previous attempts - me->RemoveAllAuras(); - me->SetReactState(REACT_PASSIVE); - // set some internally used variables to their defaults - _inMeleeRange = 0; - _transformed = false; - _frenzied = false; - events.SetPhase(PHASE_ONE); - } - - void JustDied(Unit* /*killer*/) - { - _JustDied(); - Talk(SAY_VENOXIS_DEATH); - me->RemoveAllAuras(); - } - - void EnterCombat(Unit* /*who*/) - { - _EnterCombat(); - me->SetReactState(REACT_AGGRESSIVE); - // Always running events - events.ScheduleEvent(EVENT_THRASH, 5000); - // Phase one events (regular form) - events.ScheduleEvent(EVENT_HOLY_NOVA, 5000, 0, PHASE_ONE); - events.ScheduleEvent(EVENT_DISPEL_MAGIC, 35000, 0, PHASE_ONE); - events.ScheduleEvent(EVENT_HOLY_FIRE, 10000, 0, PHASE_ONE); - events.ScheduleEvent(EVENT_RENEW, 30000, 0, PHASE_ONE); - events.ScheduleEvent(EVENT_HOLY_WRATH, 60000, 0, PHASE_ONE); - - events.SetPhase(PHASE_ONE); - - // Set zone in combat - DoZoneInCombat(); - } - - void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask) - { - // check if venoxis is ready to transform - if (!_transformed && !HealthAbovePct(50)) - { - _transformed = true; - // schedule the event that changes our phase - events.ScheduleEvent(EVENT_TRANSFORM, 100); - } - // we're losing health, bad, go frenzy - else if (!_frenzied && !HealthAbovePct(20)) - { - _frenzied = true; - events.ScheduleEvent(EVENT_FRENZY, 100); - } - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - // return back to main code if we're still casting - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - // thrash is available in all phases - case EVENT_THRASH: - DoCast(me, SPELL_THRASH, true); - events.ScheduleEvent(EVENT_THRASH, urand(10000, 20000)); - break; - - // troll form spells and Actions (first part) - case EVENT_DISPEL_MAGIC: - DoCast(me, SPELL_DISPEL_MAGIC); - events.ScheduleEvent(EVENT_DISPEL_MAGIC, urand(15000, 20000), 0, PHASE_ONE); - break; - case EVENT_RENEW: - DoCast(me, SPELL_RENEW); - events.ScheduleEvent(EVENT_RENEW, urand(25000, 30000), 0, PHASE_ONE); - break; - case EVENT_HOLY_NOVA: - _inMeleeRange = 0; - - for (uint8 i = 0; i < 10; ++i) - { - if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, i)) - // check if target is within melee-distance - if (me->IsWithinMeleeRange(target)) - ++_inMeleeRange; - } - - // trigger spellcast only if we have 3 or more targets to affect - if (_inMeleeRange >= 3) - DoCastVictim(SPELL_HOLY_NOVA); - - events.ScheduleEvent(EVENT_HOLY_NOVA, urand(45000, 75000), 0, PHASE_ONE); - break; - case EVENT_HOLY_FIRE: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) - DoCast(target, SPELL_HOLY_FIRE); - events.ScheduleEvent(EVENT_HOLY_FIRE, urand(45000, 60000), 0, PHASE_ONE); - break; - case EVENT_HOLY_WRATH: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) - DoCast(target, SPELL_HOLY_WRATH); - events.ScheduleEvent(EVENT_HOLY_WRATH, urand(45000, 60000), 0, PHASE_ONE); - break; - - // - // snake form spells and Actions - // - - case EVENT_VENOM_SPIT: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) - DoCast(target, SPELL_VENOM_SPIT); - events.ScheduleEvent(EVENT_VENOM_SPIT, urand(5000, 15000), 0, PHASE_TWO); - break; - case EVENT_POISON_CLOUD: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) - DoCast(target, SPELL_POISON_CLOUD); - events.ScheduleEvent(EVENT_POISON_CLOUD, urand(15000, 20000), 0, PHASE_TWO); - break; - case EVENT_PARASITIC_SERPENT: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) - DoCast(target, SPELL_SUMMON_PARASITIC_SERPENT); - events.ScheduleEvent(EVENT_PARASITIC_SERPENT, 15000, 0, PHASE_TWO); - break; - case EVENT_FRENZY: - // frenzy at 20% health - DoCast(me, SPELL_FRENZY, true); - break; - - // - // shape and phase-changing - // - - case EVENT_TRANSFORM: - // shapeshift at 50% health - DoCast(me, SPELL_VENOXIS_TRANSFORM); - Talk(SAY_VENOXIS_TRANSFORM); - DoResetThreat(); - - // phase two events (snakeform) - events.ScheduleEvent(EVENT_VENOM_SPIT, 5000, 0, PHASE_TWO); - events.ScheduleEvent(EVENT_POISON_CLOUD, 10000, 0, PHASE_TWO); - events.ScheduleEvent(EVENT_PARASITIC_SERPENT, 30000, 0, PHASE_TWO); - - // transformed, start phase two - events.SetPhase(PHASE_TWO); - - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); - } - - private: - uint8 _inMeleeRange; - bool _transformed; - bool _frenzied; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_venoxisAI(creature); + _Reset(); + // remove all spells and auras from previous attempts + me->RemoveAllAuras(); + me->SetReactState(REACT_PASSIVE); + // set some internally used variables to their defaults + _inMeleeRange = 0; + _transformed = false; + _frenzied = false; + events.SetPhase(PHASE_ONE); } + + void JustDied(Unit* /*killer*/) + { + _JustDied(); + Talk(SAY_VENOXIS_DEATH); + me->RemoveAllAuras(); + } + + void EnterCombat(Unit* /*who*/) + { + _EnterCombat(); + me->SetReactState(REACT_AGGRESSIVE); + // Always running events + events.ScheduleEvent(EVENT_THRASH, 5000); + // Phase one events (regular form) + events.ScheduleEvent(EVENT_HOLY_NOVA, 5000, 0, PHASE_ONE); + events.ScheduleEvent(EVENT_DISPEL_MAGIC, 35000, 0, PHASE_ONE); + events.ScheduleEvent(EVENT_HOLY_FIRE, 10000, 0, PHASE_ONE); + events.ScheduleEvent(EVENT_RENEW, 30000, 0, PHASE_ONE); + events.ScheduleEvent(EVENT_HOLY_WRATH, 60000, 0, PHASE_ONE); + + events.SetPhase(PHASE_ONE); + + // Set zone in combat + DoZoneInCombat(); + } + + void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask) + { + // check if venoxis is ready to transform + if (!_transformed && !HealthAbovePct(50)) + { + _transformed = true; + // schedule the event that changes our phase + events.ScheduleEvent(EVENT_TRANSFORM, 100); + } + // we're losing health, bad, go frenzy + else if (!_frenzied && !HealthAbovePct(20)) + { + _frenzied = true; + events.ScheduleEvent(EVENT_FRENZY, 100); + } + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + // return back to main code if we're still casting + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + // thrash is available in all phases + case EVENT_THRASH: + DoCast(me, SPELL_THRASH, true); + events.ScheduleEvent(EVENT_THRASH, urand(10000, 20000)); + break; + + // troll form spells and Actions (first part) + case EVENT_DISPEL_MAGIC: + DoCast(me, SPELL_DISPEL_MAGIC); + events.ScheduleEvent(EVENT_DISPEL_MAGIC, urand(15000, 20000), 0, PHASE_ONE); + break; + case EVENT_RENEW: + DoCast(me, SPELL_RENEW); + events.ScheduleEvent(EVENT_RENEW, urand(25000, 30000), 0, PHASE_ONE); + break; + case EVENT_HOLY_NOVA: + _inMeleeRange = 0; + + for (uint8 i = 0; i < 10; ++i) + { + if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, i)) + // check if target is within melee-distance + if (me->IsWithinMeleeRange(target)) + ++_inMeleeRange; + } + + // trigger spellcast only if we have 3 or more targets to affect + if (_inMeleeRange >= 3) + DoCastVictim(SPELL_HOLY_NOVA); + + events.ScheduleEvent(EVENT_HOLY_NOVA, urand(45000, 75000), 0, PHASE_ONE); + break; + case EVENT_HOLY_FIRE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) + DoCast(target, SPELL_HOLY_FIRE); + events.ScheduleEvent(EVENT_HOLY_FIRE, urand(45000, 60000), 0, PHASE_ONE); + break; + case EVENT_HOLY_WRATH: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) + DoCast(target, SPELL_HOLY_WRATH); + events.ScheduleEvent(EVENT_HOLY_WRATH, urand(45000, 60000), 0, PHASE_ONE); + break; + + // + // snake form spells and Actions + // + + case EVENT_VENOM_SPIT: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) + DoCast(target, SPELL_VENOM_SPIT); + events.ScheduleEvent(EVENT_VENOM_SPIT, urand(5000, 15000), 0, PHASE_TWO); + break; + case EVENT_POISON_CLOUD: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) + DoCast(target, SPELL_POISON_CLOUD); + events.ScheduleEvent(EVENT_POISON_CLOUD, urand(15000, 20000), 0, PHASE_TWO); + break; + case EVENT_PARASITIC_SERPENT: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) + DoCast(target, SPELL_SUMMON_PARASITIC_SERPENT); + events.ScheduleEvent(EVENT_PARASITIC_SERPENT, 15000, 0, PHASE_TWO); + break; + case EVENT_FRENZY: + // frenzy at 20% health + DoCast(me, SPELL_FRENZY, true); + break; + + // + // shape and phase-changing + // + + case EVENT_TRANSFORM: + // shapeshift at 50% health + DoCast(me, SPELL_VENOXIS_TRANSFORM); + Talk(SAY_VENOXIS_TRANSFORM); + DoResetThreat(); + + // phase two events (snakeform) + events.ScheduleEvent(EVENT_VENOM_SPIT, 5000, 0, PHASE_TWO); + events.ScheduleEvent(EVENT_POISON_CLOUD, 10000, 0, PHASE_TWO); + events.ScheduleEvent(EVENT_PARASITIC_SERPENT, 30000, 0, PHASE_TWO); + + // transformed, start phase two + events.SetPhase(PHASE_TWO); + + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + + private: + uint8 _inMeleeRange; + bool _transformed; + bool _frenzied; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_venoxisAI(creature); + } }; void AddSC_boss_venoxis() diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp index 0b253a69e..5a07d0b45 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp @@ -29,64 +29,65 @@ enum Events class boss_wushoolay : public CreatureScript { - public: boss_wushoolay() : CreatureScript("boss_wushoolay") { } +public: + boss_wushoolay() : CreatureScript("boss_wushoolay") { } - struct boss_wushoolayAI : public BossAI + struct boss_wushoolayAI : public BossAI + { + boss_wushoolayAI(Creature* creature) : BossAI(creature, DATA_EDGE_OF_MADNESS) { } + + void Reset() { - boss_wushoolayAI(Creature* creature) : BossAI(creature, DATA_EDGE_OF_MADNESS) { } - - void Reset() - { - _Reset(); - } - - void JustDied(Unit* /*killer*/) - { - _JustDied(); - } - - void EnterCombat(Unit* /*who*/) - { - _EnterCombat(); - events.ScheduleEvent(EVENT_LIGHTNINGCLOUD, urand(5000, 10000)); - events.ScheduleEvent(EVENT_LIGHTNINGWAVE, urand(8000, 16000)); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_LIGHTNINGCLOUD: - DoCastVictim(SPELL_LIGHTNINGCLOUD, true); - events.ScheduleEvent(EVENT_LIGHTNINGCLOUD, urand(15000, 20000)); - break; - case EVENT_LIGHTNINGWAVE: - DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_LIGHTNINGWAVE); - events.ScheduleEvent(EVENT_LIGHTNINGWAVE, urand(12000, 16000)); - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_wushoolayAI(creature); + _Reset(); } + + void JustDied(Unit* /*killer*/) + { + _JustDied(); + } + + void EnterCombat(Unit* /*who*/) + { + _EnterCombat(); + events.ScheduleEvent(EVENT_LIGHTNINGCLOUD, urand(5000, 10000)); + events.ScheduleEvent(EVENT_LIGHTNINGWAVE, urand(8000, 16000)); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_LIGHTNINGCLOUD: + DoCastVictim(SPELL_LIGHTNINGCLOUD, true); + events.ScheduleEvent(EVENT_LIGHTNINGCLOUD, urand(15000, 20000)); + break; + case EVENT_LIGHTNINGWAVE: + DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_LIGHTNINGWAVE); + events.ScheduleEvent(EVENT_LIGHTNINGWAVE, urand(12000, 16000)); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_wushoolayAI(creature); + } }; void AddSC_boss_wushoolay() diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp index 777075bb2..7dab95749 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp @@ -23,174 +23,175 @@ DoorData const doorData[] = class instance_zulgurub : public InstanceMapScript { - public: instance_zulgurub(): InstanceMapScript(ZGScriptName, 309) { } +public: + instance_zulgurub(): InstanceMapScript(ZGScriptName, 309) { } - struct instance_zulgurub_InstanceMapScript : public InstanceScript + struct instance_zulgurub_InstanceMapScript : public InstanceScript + { + instance_zulgurub_InstanceMapScript(Map* map) : InstanceScript(map) { - instance_zulgurub_InstanceMapScript(Map* map) : InstanceScript(map) - { - SetBossNumber(EncounterCount); - LoadDoorData(doorData); - } - - void Initialize() - { - _zealotLorkhanGUID = 0; - _zealotZathGUID = 0; - _highPriestTekalGUID = 0; - _jindoTheHexxerGUID = 0; - _vilebranchSpeakerGUID = 0; - _arlokkGUID = 0; - _goGongOfBethekkGUID = 0; - } - - bool IsEncounterInProgress() const - { - // not active in Zul'Gurub - return false; - } - - void OnCreatureCreate(Creature* creature) - { - switch (creature->GetEntry()) - { - case NPC_ZEALOT_LORKHAN: - _zealotLorkhanGUID = creature->GetGUID(); - break; - case NPC_ZEALOT_ZATH: - _zealotZathGUID = creature->GetGUID(); - break; - case NPC_HIGH_PRIEST_THEKAL: - _highPriestTekalGUID = creature->GetGUID(); - break; - case NPC_JINDO_THE_HEXXER: - _jindoTheHexxerGUID = creature->GetGUID(); - break; - case NPC_VILEBRANCH_SPEAKER: - _vilebranchSpeakerGUID = creature->GetGUID(); - break; - case NPC_ARLOKK: - _arlokkGUID = creature->GetGUID(); - break; - } - } - - void OnGameObjectCreate(GameObject* go) - { - switch (go->GetEntry()) - { - case GO_FORCEFIELD: - AddDoor(go, true); - break; - case GO_GONG_OF_BETHEKK: - _goGongOfBethekkGUID = go->GetGUID(); - if (GetBossState(DATA_ARLOKK) == DONE) - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - else - go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - break; - default: - break; - } - } - - void OnGameObjectRemove(GameObject* go) - { - switch (go->GetEntry()) - { - case GO_FORCEFIELD: - AddDoor(go, false); - break; - default: - break; - } - } - - uint64 GetData64(uint32 uiData) const - { - switch (uiData) - { - case DATA_LORKHAN: - return _zealotLorkhanGUID; - break; - case DATA_ZATH: - return _zealotZathGUID; - break; - case DATA_THEKAL: - return _highPriestTekalGUID; - break; - case DATA_JINDO: - return _jindoTheHexxerGUID; - break; - case NPC_ARLOKK: - return _arlokkGUID; - break; - case GO_GONG_OF_BETHEKK: - return _goGongOfBethekkGUID; - break; - } - return 0; - } - - std::string GetSaveData() - { - OUT_SAVE_INST_DATA; - - std::ostringstream saveStream; - saveStream << "Z G " << GetBossSaveData(); - - OUT_SAVE_INST_DATA_COMPLETE; - return saveStream.str(); - } - - void Load(const char* str) - { - 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 == 'Z' && dataHead2 == 'G') - { - 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; - } - private: - //If all High Priest bosses were killed. Lorkhan, Zath and Ohgan are added too. - //Storing Lorkhan, Zath and Thekal because we need to cast on them later. Jindo is needed for healfunction too. - - uint64 _zealotLorkhanGUID; - uint64 _zealotZathGUID; - uint64 _highPriestTekalGUID; - uint64 _jindoTheHexxerGUID; - uint64 _vilebranchSpeakerGUID; - uint64 _arlokkGUID; - uint64 _goGongOfBethekkGUID; - }; - - InstanceScript* GetInstanceScript(InstanceMap* map) const - { - return new instance_zulgurub_InstanceMapScript(map); + SetBossNumber(EncounterCount); + LoadDoorData(doorData); } + + void Initialize() + { + _zealotLorkhanGUID = 0; + _zealotZathGUID = 0; + _highPriestTekalGUID = 0; + _jindoTheHexxerGUID = 0; + _vilebranchSpeakerGUID = 0; + _arlokkGUID = 0; + _goGongOfBethekkGUID = 0; + } + + bool IsEncounterInProgress() const + { + // not active in Zul'Gurub + return false; + } + + void OnCreatureCreate(Creature* creature) + { + switch (creature->GetEntry()) + { + case NPC_ZEALOT_LORKHAN: + _zealotLorkhanGUID = creature->GetGUID(); + break; + case NPC_ZEALOT_ZATH: + _zealotZathGUID = creature->GetGUID(); + break; + case NPC_HIGH_PRIEST_THEKAL: + _highPriestTekalGUID = creature->GetGUID(); + break; + case NPC_JINDO_THE_HEXXER: + _jindoTheHexxerGUID = creature->GetGUID(); + break; + case NPC_VILEBRANCH_SPEAKER: + _vilebranchSpeakerGUID = creature->GetGUID(); + break; + case NPC_ARLOKK: + _arlokkGUID = creature->GetGUID(); + break; + } + } + + void OnGameObjectCreate(GameObject* go) + { + switch (go->GetEntry()) + { + case GO_FORCEFIELD: + AddDoor(go, true); + break; + case GO_GONG_OF_BETHEKK: + _goGongOfBethekkGUID = go->GetGUID(); + if (GetBossState(DATA_ARLOKK) == DONE) + go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + else + go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + break; + default: + break; + } + } + + void OnGameObjectRemove(GameObject* go) + { + switch (go->GetEntry()) + { + case GO_FORCEFIELD: + AddDoor(go, false); + break; + default: + break; + } + } + + uint64 GetData64(uint32 uiData) const + { + switch (uiData) + { + case DATA_LORKHAN: + return _zealotLorkhanGUID; + break; + case DATA_ZATH: + return _zealotZathGUID; + break; + case DATA_THEKAL: + return _highPriestTekalGUID; + break; + case DATA_JINDO: + return _jindoTheHexxerGUID; + break; + case NPC_ARLOKK: + return _arlokkGUID; + break; + case GO_GONG_OF_BETHEKK: + return _goGongOfBethekkGUID; + break; + } + return 0; + } + + std::string GetSaveData() + { + OUT_SAVE_INST_DATA; + + std::ostringstream saveStream; + saveStream << "Z G " << GetBossSaveData(); + + OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); + } + + void Load(const char* str) + { + 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 == 'Z' && dataHead2 == 'G') + { + 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; + } + private: + //If all High Priest bosses were killed. Lorkhan, Zath and Ohgan are added too. + //Storing Lorkhan, Zath and Thekal because we need to cast on them later. Jindo is needed for healfunction too. + + uint64 _zealotLorkhanGUID; + uint64 _zealotZathGUID; + uint64 _highPriestTekalGUID; + uint64 _jindoTheHexxerGUID; + uint64 _vilebranchSpeakerGUID; + uint64 _arlokkGUID; + uint64 _goGongOfBethekkGUID; + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_zulgurub_InstanceMapScript(map); + } }; void AddSC_instance_zulgurub() diff --git a/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp b/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp index 6cccb6b57..9f4157b42 100644 --- a/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp @@ -46,77 +46,77 @@ enum ProfessorPhizzlethorpe class npc_professor_phizzlethorpe : public CreatureScript { - public: - npc_professor_phizzlethorpe() : CreatureScript("npc_professor_phizzlethorpe") { } +public: + npc_professor_phizzlethorpe() : CreatureScript("npc_professor_phizzlethorpe") { } - struct npc_professor_phizzlethorpeAI : public npc_escortAI + struct npc_professor_phizzlethorpeAI : public npc_escortAI + { + npc_professor_phizzlethorpeAI(Creature* creature) : npc_escortAI(creature) { } + + void WaypointReached(uint32 waypointId) { - npc_professor_phizzlethorpeAI(Creature* creature) : npc_escortAI(creature) { } + Player* player = GetPlayerForEscort(); + if (!player) + return; - void WaypointReached(uint32 waypointId) + switch (waypointId) { - Player* player = GetPlayerForEscort(); - if (!player) - return; - - switch (waypointId) - { - case 4: - Talk(SAY_PROGRESS_2, player); - break; - case 5: - Talk(SAY_PROGRESS_3, player); - break; - case 8: - Talk(EMOTE_PROGRESS_4); - break; - case 9: - me->SummonCreature(NPC_VENGEFUL_SURGE, -2052.96f, -2142.49f, 20.15f, 1.0f, TEMPSUMMON_CORPSE_DESPAWN, 0); - me->SummonCreature(NPC_VENGEFUL_SURGE, -2052.96f, -2142.49f, 20.15f, 1.0f, TEMPSUMMON_CORPSE_DESPAWN, 0); - break; - case 10: - Talk(SAY_PROGRESS_5, player); - break; - case 11: - Talk(SAY_PROGRESS_6, player); - SetRun(); - break; - case 19: - Talk(SAY_PROGRESS_7, player); - break; - case 20: - Talk(EMOTE_PROGRESS_8); - Talk(SAY_PROGRESS_9, player); - player->GroupEventHappens(QUEST_SUNKEN_TREASURE, me); - break; - } + case 4: + Talk(SAY_PROGRESS_2, player); + break; + case 5: + Talk(SAY_PROGRESS_3, player); + break; + case 8: + Talk(EMOTE_PROGRESS_4); + break; + case 9: + me->SummonCreature(NPC_VENGEFUL_SURGE, -2052.96f, -2142.49f, 20.15f, 1.0f, TEMPSUMMON_CORPSE_DESPAWN, 0); + me->SummonCreature(NPC_VENGEFUL_SURGE, -2052.96f, -2142.49f, 20.15f, 1.0f, TEMPSUMMON_CORPSE_DESPAWN, 0); + break; + case 10: + Talk(SAY_PROGRESS_5, player); + break; + case 11: + Talk(SAY_PROGRESS_6, player); + SetRun(); + break; + case 19: + Talk(SAY_PROGRESS_7, player); + break; + case 20: + Talk(EMOTE_PROGRESS_8); + Talk(SAY_PROGRESS_9, player); + player->GroupEventHappens(QUEST_SUNKEN_TREASURE, me); + break; } + } - void JustSummoned(Creature* summoned) + void JustSummoned(Creature* summoned) + { + summoned->AI()->AttackStart(me); + } + + void EnterCombat(Unit* /*who*/) + { + Talk(SAY_AGGRO); + } + + void sQuestAccept(Player* player, Quest const* quest) + { + if (quest->GetQuestId() == QUEST_SUNKEN_TREASURE) { - summoned->AI()->AttackStart(me); + Talk(SAY_PROGRESS_1, player); + npc_escortAI::Start(false, false, player->GetGUID(), quest); + me->setFaction(FACTION_SUNKEN_TREASURE); } + } - void EnterCombat(Unit* /*who*/) - { - Talk(SAY_AGGRO); - } - - void sQuestAccept(Player* player, Quest const* quest) - { - if (quest->GetQuestId() == QUEST_SUNKEN_TREASURE) - { - Talk(SAY_PROGRESS_1, player); - npc_escortAI::Start(false, false, player->GetGUID(), quest); - me->setFaction(FACTION_SUNKEN_TREASURE); - } - } - - void UpdateAI(uint32 diff) - { - npc_escortAI::UpdateAI(diff); - } - }; + void UpdateAI(uint32 diff) + { + npc_escortAI::UpdateAI(diff); + } + }; CreatureAI* GetAI(Creature* creature) const { diff --git a/src/server/scripts/EasternKingdoms/zone_blasted_lands.cpp b/src/server/scripts/EasternKingdoms/zone_blasted_lands.cpp index 4ac5ae510..78d7ac382 100644 --- a/src/server/scripts/EasternKingdoms/zone_blasted_lands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_blasted_lands.cpp @@ -29,45 +29,46 @@ enum DeathlyUsher class spell_razelikh_teleport_group : public SpellScriptLoader { - public: spell_razelikh_teleport_group() : SpellScriptLoader("spell_razelikh_teleport_group") { } +public: + spell_razelikh_teleport_group() : SpellScriptLoader("spell_razelikh_teleport_group") { } - class spell_razelikh_teleport_group_SpellScript : public SpellScript + class spell_razelikh_teleport_group_SpellScript : public SpellScript + { + PrepareSpellScript(spell_razelikh_teleport_group_SpellScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareSpellScript(spell_razelikh_teleport_group_SpellScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_TELEPORT_SINGLE) && !sSpellMgr->GetSpellInfo(SPELL_TELEPORT_SINGLE_IN_GROUP)) - return false; - return true; - } - - void HandleScriptEffect(SpellEffIndex /* effIndex */) - { - if (Player* player = GetHitPlayer()) - { - if (Group* group = player->GetGroup()) - { - for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) - if (Player* member = itr->GetSource()) - if (member->IsWithinDistInMap(player, 20.0f) && !member->isDead()) - member->CastSpell(member, SPELL_TELEPORT_SINGLE_IN_GROUP, true); - } - else - player->CastSpell(player, SPELL_TELEPORT_SINGLE, true); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_razelikh_teleport_group_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_razelikh_teleport_group_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_TELEPORT_SINGLE) && !sSpellMgr->GetSpellInfo(SPELL_TELEPORT_SINGLE_IN_GROUP)) + return false; + return true; } + + void HandleScriptEffect(SpellEffIndex /* effIndex */) + { + if (Player* player = GetHitPlayer()) + { + if (Group* group = player->GetGroup()) + { + for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) + if (Player* member = itr->GetSource()) + if (member->IsWithinDistInMap(player, 20.0f) && !member->isDead()) + member->CastSpell(member, SPELL_TELEPORT_SINGLE_IN_GROUP, true); + } + else + player->CastSpell(player, SPELL_TELEPORT_SINGLE, true); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_razelikh_teleport_group_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_razelikh_teleport_group_SpellScript(); + } }; void AddSC_blasted_lands() diff --git a/src/server/scripts/EasternKingdoms/zone_duskwood.cpp b/src/server/scripts/EasternKingdoms/zone_duskwood.cpp index 29bfa5c63..c6486c014 100644 --- a/src/server/scripts/EasternKingdoms/zone_duskwood.cpp +++ b/src/server/scripts/EasternKingdoms/zone_duskwood.cpp @@ -113,7 +113,7 @@ public: { case EVENT_SOUL_CORRUPTION: DoCastVictim(SPELL_SOUL_CORRUPTION); - _events.ScheduleEvent(EVENT_SOUL_CORRUPTION, rand()%4000+15000); + _events.ScheduleEvent(EVENT_SOUL_CORRUPTION, rand() % 4000 + 15000); break; case EVENT_CREATURE_OF_NIGHTMARE: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true)) @@ -127,10 +127,10 @@ public: DoMeleeAttackIfReady(); } - private: - EventMap _events; - uint8 KillCount; - bool _introSpoken; + private: + EventMap _events; + uint8 KillCount; + bool _introSpoken; }; CreatureAI* GetAI(Creature* creature) const diff --git a/src/server/scripts/EasternKingdoms/zone_eastern_plaguelands.cpp b/src/server/scripts/EasternKingdoms/zone_eastern_plaguelands.cpp index 71eea9a85..3b1e99408 100644 --- a/src/server/scripts/EasternKingdoms/zone_eastern_plaguelands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_eastern_plaguelands.cpp @@ -91,7 +91,7 @@ public: _playerGUID = 0; events.Reset(); summons.DespawnAll(); - me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP|UNIT_NPC_FLAG_QUESTGIVER); + me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); } void SetData(uint32 faction, uint32) @@ -140,7 +140,7 @@ public: float y = -3049 + frand(-6.0f, 6.0f); float z = 165.25; float o = 2.0; - me->SummonCreature(roll_chance_i(5) ? NPC_PLAGUED_PEASANT : NPC_INJURED_PEASANT, x, y, z, o, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 2*MINUTE*IN_MILLISECONDS); + me->SummonCreature(roll_chance_i(5) ? NPC_PLAGUED_PEASANT : NPC_INJURED_PEASANT, x, y, z, o, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 2 * MINUTE * IN_MILLISECONDS); } } @@ -159,8 +159,8 @@ public: if (creature->GetEntry() == NPC_PLAGUED_PEASANT) creature->CastSpell(creature, SPELL_SEETHING_PLAGUE, true); - float x = 3324+frand(-3.0f, 3.0f); - float y = -2966+frand(-3.0f, 3.0f); + float x = 3324 + frand(-3.0f, 3.0f); + float y = -2966 + frand(-3.0f, 3.0f); float z = 159.65f; creature->SetWalk(true); creature->GetMotionMaster()->MovePoint(0, x, y, z); @@ -206,16 +206,16 @@ public: switch (events.GetEvent()) { case EVENT_CHECK_PLAYER: - { - Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID); - if (!player || me->GetDistance2d(player) > 100.0f) { - EnterEvadeMode(); - return; + Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID); + if (!player || me->GetDistance2d(player) > 100.0f) + { + EnterEvadeMode(); + return; + } + events.RepeatEvent(2000); + break; } - events.RepeatEvent(2000); - break; - } case EVENT_SUMMON_ARCHERS: SummonArchers(); events.PopEvent(); @@ -224,7 +224,7 @@ public: _spoken = false; SummonPeasants(); _spoken = false; - events.RepeatEvent(60*IN_MILLISECONDS); + events.RepeatEvent(60 * IN_MILLISECONDS); break; } } @@ -297,7 +297,7 @@ public: me->CastSpell(target, SPELL_SHOOT, true); } - timer = urand(0,3000); + timer = urand(0, 3000); } } }; diff --git a/src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp b/src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp index ccdc4dec9..e421cabd6 100644 --- a/src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp +++ b/src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp @@ -7,7 +7,7 @@ /* ScriptData SDName: Eversong_Woods SD%Complete: 95 -SDComment: Quest support: +SDComment: Quest support: SDCategory: Eversong Woods EndScriptData */ diff --git a/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp b/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp index cee04066e..34c836831 100644 --- a/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp @@ -198,7 +198,7 @@ public: _IsByOutrunner = true; } - if (rand()%4) + if (rand() % 4) return; //only if attacked and escorter is not in combat? @@ -212,12 +212,12 @@ public: spawnId = 1; me->SummonCreature(NPC_RANGER, AmbushSpawn[spawnId].posX, AmbushSpawn[spawnId].posY, AmbushSpawn[spawnId].posZ, 0.0f, - TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 60000); + TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 60000); for (int i = 0; i < 2; ++i) { me->SummonCreature(NPC_OUTRUNNER, AmbushSpawn[spawnId].posX, AmbushSpawn[spawnId].posY, AmbushSpawn[spawnId].posZ, 0.0f, - TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 60000); + TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 60000); } } diff --git a/src/server/scripts/EasternKingdoms/zone_isle_of_queldanas.cpp b/src/server/scripts/EasternKingdoms/zone_isle_of_queldanas.cpp index 37102d450..5b13334be 100644 --- a/src/server/scripts/EasternKingdoms/zone_isle_of_queldanas.cpp +++ b/src/server/scripts/EasternKingdoms/zone_isle_of_queldanas.cpp @@ -109,14 +109,14 @@ class npc_bh_thalorien_dawnseeker : public CreatureScript public: npc_bh_thalorien_dawnseeker() : CreatureScript("npc_bh_thalorien_dawnseeker") { } - CreatureAI *GetAI(Creature *creature) const + CreatureAI* GetAI(Creature* creature) const { return new npc_bh_thalorien_dawnseekerAI(creature); } struct npc_bh_thalorien_dawnseekerAI : public ScriptedAI { - npc_bh_thalorien_dawnseekerAI(Creature *c) : ScriptedAI(c), summons(me) + npc_bh_thalorien_dawnseekerAI(Creature* c) : ScriptedAI(c), summons(me) { } @@ -198,7 +198,7 @@ public: } } - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) { if (damage >= me->GetHealth()) { @@ -236,15 +236,15 @@ public: EnterEvadeMode(); return; case EVENT_SUMMON_SOLDIERS: - for (uint8 i=0; iSummonCreature(NPC_SUNWELL_DEFENDER, SunwellDefenderPos[i], TEMPSUMMON_TIMED_DESPAWN, 33000+(i/5)*5000); + for (uint8 i = 0; i < SUNWELL_DEFENDER_NUM; ++i) + me->SummonCreature(NPC_SUNWELL_DEFENDER, SunwellDefenderPos[i], TEMPSUMMON_TIMED_DESPAWN, 33000 + (i / 5) * 5000); events.PopEvent(); break; case EVENT_TALK_INTRO_0: case EVENT_TALK_INTRO_1: case EVENT_TALK_INTRO_2: case EVENT_TALK_INTRO_3: - Talk(SAY_INTRO_0 + (evId-EVENT_TALK_INTRO_0)); + Talk(SAY_INTRO_0 + (evId - EVENT_TALK_INTRO_0)); events.PopEvent(); break; case EVENT_SALUTE: @@ -292,7 +292,7 @@ public: break; case EVENT_TALK_SPAWN_0: case EVENT_TALK_SPAWN_1: - Talk(SAY_SPAWN_0 + (evId-EVENT_TALK_SPAWN_0)); + Talk(SAY_SPAWN_0 + (evId - EVENT_TALK_SPAWN_0)); events.PopEvent(); break; case EVENT_SUMMON_MORLEN: @@ -303,7 +303,7 @@ public: case EVENT_TALK_MORLEN_0: case EVENT_TALK_MORLEN_1: if (Creature* c = ObjectAccessor::GetCreature(*me, morlenGUID)) - c->AI()->Talk(SAY_MORLEN_0 + (evId-EVENT_TALK_MORLEN_0)); + c->AI()->Talk(SAY_MORLEN_0 + (evId - EVENT_TALK_MORLEN_0)); events.PopEvent(); break; case EVENT_SPAWN_WAVE_1: @@ -311,7 +311,7 @@ public: case EVENT_SPAWN_WAVE_3: if (Creature* c = ObjectAccessor::GetCreature(*me, morlenGUID)) { - c->AI()->Talk(SAY_MORLEN_1 + (evId-EVENT_SPAWN_WAVE_1)); + c->AI()->Talk(SAY_MORLEN_1 + (evId - EVENT_SPAWN_WAVE_1)); switch (evId) { // emerge cast tr false 66947 @@ -320,13 +320,13 @@ public: Position spawnPos; c->GetPosition(&spawnPos); spawnPos.m_orientation = 5.80f; - spawnPos.m_positionX += 5.0f*cos(4.5f); - spawnPos.m_positionY += 5.0f*sin(4.5f); - for (uint8 i=0; i<5; ++i) + spawnPos.m_positionX += 5.0f * cos(4.5f); + spawnPos.m_positionY += 5.0f * sin(4.5f); + for (uint8 i = 0; i < 5; ++i) if (me->SummonCreature(NPC_SCOURGE_ZOMBIE, spawnPos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2000)) { - spawnPos.m_positionX += 2.5f*cos(4.5f); - spawnPos.m_positionY += 2.5f*sin(4.5f); + spawnPos.m_positionX += 2.5f * cos(4.5f); + spawnPos.m_positionY += 2.5f * sin(4.5f); } } break; @@ -335,14 +335,14 @@ public: Position spawnPos; c->GetPosition(&spawnPos); spawnPos.m_orientation = 5.80f; - spawnPos.m_positionX += 7.0f*cos(4.0f); - spawnPos.m_positionY += 7.0f*sin(4.0f); - for (uint8 i=0; i<3; ++i) + spawnPos.m_positionX += 7.0f * cos(4.0f); + spawnPos.m_positionY += 7.0f * sin(4.0f); + for (uint8 i = 0; i < 3; ++i) if (Creature* s = me->SummonCreature(NPC_GHOUL_INVADER, spawnPos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2000)) { s->CastSpell(s, 66947, false); // emerge effect - spawnPos.m_positionX += 4.0f*cos(4.5f); - spawnPos.m_positionY += 4.0f*sin(4.5f); + spawnPos.m_positionX += 4.0f * cos(4.5f); + spawnPos.m_positionY += 4.0f * sin(4.5f); } } break; @@ -351,14 +351,14 @@ public: Position spawnPos; c->GetPosition(&spawnPos); spawnPos.m_orientation = 5.80f; - spawnPos.m_positionX += 8.0f*cos(4.0f); - spawnPos.m_positionY += 8.0f*sin(4.0f); - for (uint8 i=0; i<3; ++i) + spawnPos.m_positionX += 8.0f * cos(4.0f); + spawnPos.m_positionY += 8.0f * sin(4.0f); + for (uint8 i = 0; i < 3; ++i) if (Creature* s = me->SummonCreature(NPC_CRYPT_RAIDER, spawnPos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2000)) { s->CastSpell(s, 66947, false); // emerge effect - spawnPos.m_positionX += 4.0f*cos(4.5f); - spawnPos.m_positionY += 4.0f*sin(4.5f); + spawnPos.m_positionX += 4.0f * cos(4.5f); + spawnPos.m_positionY += 4.0f * sin(4.5f); } } break; @@ -384,7 +384,7 @@ public: case EVENT_OUTRO_1: case EVENT_OUTRO_2: case EVENT_OUTRO_3: - Talk(SAY_OUTRO_0 + (evId-EVENT_OUTRO_0)); + Talk(SAY_OUTRO_0 + (evId - EVENT_OUTRO_0)); events.PopEvent(); if (evId == EVENT_OUTRO_3) events.ScheduleEvent(EVENT_OUTRO_KNEEL, 6000); @@ -498,14 +498,14 @@ class npc_grand_magister_rommath : public CreatureScript public: npc_grand_magister_rommath() : CreatureScript("npc_grand_magister_rommath") { } - CreatureAI *GetAI(Creature *creature) const + CreatureAI* GetAI(Creature* creature) const { return new npc_grand_magister_rommathAI(creature); } struct npc_grand_magister_rommathAI : public NullCreatureAI { - npc_grand_magister_rommathAI(Creature *c) : NullCreatureAI(c) + npc_grand_magister_rommathAI(Creature* c) : NullCreatureAI(c) { announced = false; playerGUID = 0; @@ -570,16 +570,16 @@ public: break; case 3: me->SetWalk(true); - me->GetMotionMaster()->MovePath(me->GetEntry()*100, false); + me->GetMotionMaster()->MovePath(me->GetEntry() * 100, false); if (Creature* c = me->FindNearestCreature(NPC_THERON, 60.0f, true)) { c->SetWalk(true); - c->GetMotionMaster()->MovePath(c->GetEntry()*100, false); + c->GetMotionMaster()->MovePath(c->GetEntry() * 100, false); } if (Creature* c = me->FindNearestCreature(NPC_AURIC, 60.0f, true)) { c->SetWalk(true); - c->GetMotionMaster()->MovePath(c->GetEntry()*100, false); + c->GetMotionMaster()->MovePath(c->GetEntry() * 100, false); } break; case 4: diff --git a/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp b/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp index c04daa518..942e0ce60 100644 --- a/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp +++ b/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp @@ -124,7 +124,8 @@ public: phase = 0; break; } - } else timer -= diff; + } + else timer -= diff; } if (!UpdateVictim()) @@ -134,13 +135,15 @@ public: { DoCastVictim(SPELL_MOCKING_BLOW); mockingBlowTimer = 5000; - } else mockingBlowTimer -= diff; + } + else mockingBlowTimer -= diff; if (shieldBashTimer <= diff) { DoCastVictim(SPELL_MOCKING_BLOW); shieldBashTimer = 8000; - } else shieldBashTimer -= diff; + } + else shieldBashTimer -= diff; DoMeleeAttackIfReady(); } diff --git a/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp index fcec72d69..724d28a50 100644 --- a/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp +++ b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp @@ -156,7 +156,7 @@ class pyrewood_ambush : public CreatureScript public: pyrewood_ambush() : CreatureScript("pyrewood_ambush") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest *quest) + bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) { if (quest->GetQuestId() == QUEST_PYREWOOD_AMBUSH && !CAST_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->QuestInProgress) { @@ -178,7 +178,7 @@ public: { pyrewood_ambushAI(Creature* creature) : ScriptedAI(creature), Summons(me) { - QuestInProgress = false; + QuestInProgress = false; } uint32 Phase; @@ -262,7 +262,8 @@ public: switch (Phase) { case 0: - if (WaitTimer == WAIT_SECS) { + if (WaitTimer == WAIT_SECS) + { if (PlayerGUID) { if (Player* player = ObjectAccessor::GetPlayer(*me, PlayerGUID)) diff --git a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp index 684b78a8f..e4c557420 100644 --- a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp +++ b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp @@ -82,7 +82,7 @@ public: AttackStart(pAttacker); } - void DamageTaken(Unit* pDoneBy, uint32 &uiDamage, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit* pDoneBy, uint32& uiDamage, DamageEffectType, SpellSchoolMask) { if (pDoneBy && (uiDamage >= me->GetHealth() || me->HealthBelowPctDamaged(15, uiDamage))) { @@ -254,7 +254,8 @@ public: uiPhase = 0; break; } - } else uiTimer -= uiDiff; + } + else uiTimer -= uiDiff; } npc_escortAI::UpdateAI(uiDiff); @@ -443,10 +444,10 @@ public: uiPhase = 4; break; case 4: - SetEscortPaused(false); - uiPhase = 0; - uiTimer = 0; - break; + SetEscortPaused(false); + uiPhase = 0; + uiTimer = 0; + break; case 5: if (Creature* pGuard = me->FindNearestCreature(NPC_STORMWIND_ROYAL, 10.0f, true)) pGuard->AI()->Talk(SAY_GUARD_1); @@ -488,7 +489,8 @@ public: uiPhase = 0; break; } - } else uiTimer -= uiDiff; + } + else uiTimer -= uiDiff; } npc_escortAI::UpdateAI(uiDiff); diff --git a/src/server/scripts/EasternKingdoms/zone_stranglethorn_vale.cpp b/src/server/scripts/EasternKingdoms/zone_stranglethorn_vale.cpp index df3afb361..df09bf355 100644 --- a/src/server/scripts/EasternKingdoms/zone_stranglethorn_vale.cpp +++ b/src/server/scripts/EasternKingdoms/zone_stranglethorn_vale.cpp @@ -97,7 +97,7 @@ public: } } } - } + } //Return since we have no target if (!UpdateVictim()) diff --git a/src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp b/src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp index e4f26d9ea..631458ed1 100644 --- a/src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp +++ b/src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp @@ -62,23 +62,23 @@ public: { switch (uiPointId) { - case 0: - { - GameObject* cage = nullptr; - if (galensCageGUID) - cage = me->GetMap()->GetGameObject(galensCageGUID); - else - cage = GetClosestGameObjectWithEntry(me, GO_GALENS_CAGE, INTERACTION_DISTANCE); - if (cage) + case 0: { - cage->UseDoorOrButton(); - galensCageGUID = cage->GetGUID(); + GameObject* cage = nullptr; + if (galensCageGUID) + cage = me->GetMap()->GetGameObject(galensCageGUID); + else + cage = GetClosestGameObjectWithEntry(me, GO_GALENS_CAGE, INTERACTION_DISTANCE); + if (cage) + { + cage->UseDoorOrButton(); + galensCageGUID = cage->GetGUID(); + } + break; } + case 21: + Talk(EMOTE_DISAPPEAR); break; - } - case 21: - Talk(EMOTE_DISAPPEAR); - break; } } diff --git a/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp b/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp index 09f12e112..2f2bba793 100644 --- a/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp +++ b/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp @@ -84,7 +84,7 @@ public: AttackStart(pAttacker); } - void DamageTaken(Unit* pDoneBy, uint32 &uiDamage, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit* pDoneBy, uint32& uiDamage, DamageEffectType, SpellSchoolMask) { if (!pDoneBy) return; diff --git a/src/server/scripts/EasternKingdoms/zone_undercity.cpp b/src/server/scripts/EasternKingdoms/zone_undercity.cpp index 64506defe..d8d3ba8ce 100644 --- a/src/server/scripts/EasternKingdoms/zone_undercity.cpp +++ b/src/server/scripts/EasternKingdoms/zone_undercity.cpp @@ -73,7 +73,7 @@ enum Sylvanas GUID_EVENT_INVOKER = 1, }; -float HighborneLoc[4][3]= +float HighborneLoc[4][3] = { {1285.41f, 312.47f, 0.51f}, {1286.96f, 310.40f, 1.00f}, @@ -89,7 +89,7 @@ class npc_lady_sylvanas_windrunner : public CreatureScript public: npc_lady_sylvanas_windrunner() : CreatureScript("npc_lady_sylvanas_windrunner") { } - bool OnQuestReward(Player* player, Creature* creature, const Quest *_Quest, uint32 /*slot*/) override + bool OnQuestReward(Player* player, Creature* creature, const Quest* _Quest, uint32 /*slot*/) override { if (_Quest->GetQuestId() == QUEST_JOURNEY_TO_UNDERCITY) creature->AI()->SetGUID(player->GetGUID(), GUID_EVENT_INVOKER); @@ -143,8 +143,8 @@ public: if (summoned->GetEntry() == NPC_HIGHBORNE_BUNNY) { summoned->SetDisableGravity(true); - float speed = summoned->GetDistance(summoned->GetPositionX(), summoned->GetPositionY(), me->GetPositionZ()+15.0f) / (1000.0f * 0.001f); - summoned->MonsterMoveWithSpeed(summoned->GetPositionX(), summoned->GetPositionY(), me->GetPositionZ()+15.0f, speed); + float speed = summoned->GetDistance(summoned->GetPositionX(), summoned->GetPositionY(), me->GetPositionZ() + 15.0f) / (1000.0f * 0.001f); + summoned->MonsterMoveWithSpeed(summoned->GetPositionX(), summoned->GetPositionY(), me->GetPositionZ() + 15.0f, speed); summoned->CastSpell(summoned, SPELL_RIBBON_OF_SOULS, false); } } @@ -276,7 +276,8 @@ public: me->MonsterMoveWithSpeed(me->GetPositionX(), me->GetPositionY(), HIGHBORNE_LOC_Y_NEW, me->GetDistance(me->GetPositionX(), me->GetPositionY(), HIGHBORNE_LOC_Y_NEW) / (5000 * 0.001f)); me->SetPosition(me->GetPositionX(), me->GetPositionY(), HIGHBORNE_LOC_Y_NEW, me->GetOrientation()); EventMove = false; - } else EventMoveTimer -= diff; + } + else EventMoveTimer -= diff; } if (EventCast) { @@ -284,7 +285,8 @@ public: { DoCast(me, SPELL_HIGHBORNE_AURA); EventCast = false; - } else EventCastTimer -= diff; + } + else EventCastTimer -= diff; } } }; @@ -311,12 +313,12 @@ public: bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override { ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF + 1) { CloseGossipMenuFor(player); creature->CastSpell(player, SPELL_MARK_OF_SHAME, false); } - if (action == GOSSIP_ACTION_INFO_DEF+2) + if (action == GOSSIP_ACTION_INFO_DEF + 2) { CloseGossipMenuFor(player); player->AreaExploredOrEventHappens(6628); @@ -331,9 +333,9 @@ public: if (player->GetQuestStatus(6628) == QUEST_STATUS_INCOMPLETE && !player->HasAura(SPELL_MARK_OF_SHAME)) { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HPF1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HPF2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HPF3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HPF1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HPF2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HPF3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); SendGossipMenuFor(player, 5822, creature->GetGUID()); } else @@ -756,7 +758,7 @@ static Location AllianceSpawn[] = { 1680.86f, 596.73f, -6.37f, 0 }, { 1676.41f, 558.28f, -18.46f, 0 }, // Blightworm { 1685.16f, 620.41f, 5.74f, 0 }, // soldiers - { 0.0f, 0.0f, 0.0f, 0 }, // trash wave + { 0.0f, 0.0f, 0.0f, 0 }, // trash wave { 1500.03f, 409.59f, -62.18f, 0 }, // guardians { 1444.25f, 453.86f, -70.48f, 0 }, // dreadlords { 1432.43f, 403.20f, -85.26f, 0 }, // putress @@ -898,7 +900,7 @@ static Location ThrallSpawn[] = { 1591.325f, 397.874f, -4.130f, 6.191f }, // NPC_KHANOK - Inner Sunktum Middle { 1573.400f, 398.450f, -65.862f, 5.618f }, - // NPC_WARSONG_BATTLEGUARD - NPC_KHANOK WinSpawn + // NPC_WARSONG_BATTLEGUARD - NPC_KHANOK WinSpawn { 1590.502f, 375.876f, -62.177f, 3.237f }, // Valimathras Room Preparation // Stones @@ -938,12 +940,12 @@ public: bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override { ClearGossipMenuFor(player); - + switch (action) { case GOSSIP_ACTION_INFO_DEF + 1: CloseGossipMenuFor(player); - + if (auto ai = CAST_AI(npc_varian_wrynn::npc_varian_wrynnAI, creature->AI())) { ai->Start(true, true, player->GetGUID()); @@ -954,7 +956,7 @@ public: ai->SetDespawnAtEnd(false); ai->SetDespawnAtFar(false); } - + break; } @@ -1579,7 +1581,7 @@ public: bStepping = false; JumpToNextStep(0); break; - //Sewers + //Sewers case 9: Talk(WRYNN_SAY_SEWERS_1); SpawnWave(0); @@ -1663,7 +1665,7 @@ public: SetEscortPaused(false); JumpToNextStep(0); break; - //Apothecarium + //Apothecarium case 24: if (Creature* jaina = ObjectAccessor::GetCreature(*me, jainaGUID)) jaina->AI()->Talk(JAINA_SAY_APO_1); @@ -2000,12 +2002,12 @@ public: if (!HelperList.empty()) for (std::list::iterator itr = HelperList.begin(); itr != HelperList.end(); itr++) (*itr)->DespawnOrUnsummon(); - if (Map *map = me->GetMap()) + if (Map* map = me->GetMap()) { - Map::PlayerList const &PlayerList = map->GetPlayers(); + Map::PlayerList const& PlayerList = map->GetPlayers(); for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) { - if (Player *player = i->GetSource()) + if (Player* player = i->GetSource()) { if (me->IsInRange(player, 0.0f, 50.0f)) { @@ -2053,7 +2055,7 @@ public: case EVENT_AGGRO_JAINA: if (me->GetVictim()) { - if (Creature *jaina = ObjectAccessor::GetCreature(*me, jainaGUID)) + if (Creature* jaina = ObjectAccessor::GetCreature(*me, jainaGUID)) { jaina->AI()->AttackStart(me->GetVictim()); } @@ -2275,27 +2277,27 @@ public: bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override { ClearGossipMenuFor(player); - + switch (action) { case GOSSIP_ACTION_INFO_DEF + 1: - { - CloseGossipMenuFor(player); - - if (auto thrall_ai = CAST_AI(npc_thrall_bfu::npc_thrall_bfuAI, creature->AI())) { - if (Creature* sylvannas = GetClosestCreatureWithEntry(creature, NPC_SYLVANAS, 50.0f)) + CloseGossipMenuFor(player); + + if (auto thrall_ai = CAST_AI(npc_thrall_bfu::npc_thrall_bfuAI, creature->AI())) { - thrall_ai->sylvanasfollowGUID = sylvannas->GetGUID(); - thrall_ai->Start(true, true, player->GetGUID()); - thrall_ai->SetDespawnAtEnd(false); - thrall_ai->SetDespawnAtFar(false); + if (Creature* sylvannas = GetClosestCreatureWithEntry(creature, NPC_SYLVANAS, 50.0f)) + { + thrall_ai->sylvanasfollowGUID = sylvannas->GetGUID(); + thrall_ai->Start(true, true, player->GetGUID()); + thrall_ai->SetDespawnAtEnd(false); + thrall_ai->SetDespawnAtFar(false); + } + else + thrall_ai->sylvanasfollowGUID = 0; } - else - thrall_ai->sylvanasfollowGUID = 0; + break; } - break; - } } return true; @@ -2492,41 +2494,41 @@ public: bStepping = true; break; case NPC_KHANOK: - { - UpdateWorldState(me->GetMap(), WORLD_STATE_INNER_SANKTUM_FIGHT_H, 0); - UpdateWorldState(me->GetMap(), WORLD_STATE_INNER_SANKTUM_DONE_H, 1); - FollowThrall(); - SetEscortPaused(false); - std::list SanktumList; - me->GetCreatureListWithEntryInGrid(SanktumList, NPC_FELGUARD_MORADEUR, 1000.0f); - me->GetCreatureListWithEntryInGrid(SanktumList, NPC_DREADLORD, 1000.0f); - me->GetCreatureListWithEntryInGrid(SanktumList, NPC_TREACHEROUS_GUARDIAN_H, 1000.0f); - me->GetCreatureListWithEntryInGrid(SanktumList, NPC_DOCTOR_H, 1000.0f); - me->GetCreatureListWithEntryInGrid(SanktumList, NPC_CHEMIST_H, 1000.0f); - me->GetCreatureListWithEntryInGrid(SanktumList, NPC_BETRAYER_H, 1000.0f); - me->GetCreatureListWithEntryInGrid(SanktumList, NPC_FELBEAST_H, 1000.0f); - me->GetCreatureListWithEntryInGrid(SanktumList, NPC_DOOMGUARD_PILLARGER, 1000.0f); - if (!SanktumList.empty()) - for (std::list::iterator itr = SanktumList.begin(); itr != SanktumList.end(); itr++) - (*itr)->DespawnOrUnsummon(); - break; - } + { + UpdateWorldState(me->GetMap(), WORLD_STATE_INNER_SANKTUM_FIGHT_H, 0); + UpdateWorldState(me->GetMap(), WORLD_STATE_INNER_SANKTUM_DONE_H, 1); + FollowThrall(); + SetEscortPaused(false); + std::list SanktumList; + me->GetCreatureListWithEntryInGrid(SanktumList, NPC_FELGUARD_MORADEUR, 1000.0f); + me->GetCreatureListWithEntryInGrid(SanktumList, NPC_DREADLORD, 1000.0f); + me->GetCreatureListWithEntryInGrid(SanktumList, NPC_TREACHEROUS_GUARDIAN_H, 1000.0f); + me->GetCreatureListWithEntryInGrid(SanktumList, NPC_DOCTOR_H, 1000.0f); + me->GetCreatureListWithEntryInGrid(SanktumList, NPC_CHEMIST_H, 1000.0f); + me->GetCreatureListWithEntryInGrid(SanktumList, NPC_BETRAYER_H, 1000.0f); + me->GetCreatureListWithEntryInGrid(SanktumList, NPC_FELBEAST_H, 1000.0f); + me->GetCreatureListWithEntryInGrid(SanktumList, NPC_DOOMGUARD_PILLARGER, 1000.0f); + if (!SanktumList.empty()) + for (std::list::iterator itr = SanktumList.begin(); itr != SanktumList.end(); itr++) + (*itr)->DespawnOrUnsummon(); + break; + } case NPC_VARIMATHRAS: - { - UpdateWorldState(me->GetMap(), WORLD_STATE_ROYAL_QUARTER_FIGHT_H, 0); - UpdateWorldState(me->GetMap(), WORLD_STATE_ROYAL_QUARTER_DONE_H, 1); - std::list ThroneList; - me->GetCreatureListWithEntryInGrid(ThroneList, NPC_LEGION_OVERLORD, 1000.0f); - me->GetCreatureListWithEntryInGrid(ThroneList, NPC_LEGION_INVADER, 1000.0f); - me->GetCreatureListWithEntryInGrid(ThroneList, NPC_LEGION_DREADWHISPER, 1000.0f); - me->GetCreatureListWithEntryInGrid(ThroneList, NPC_VARIMATHRAS_PORTAL, 1000.0f); - if (!ThroneList.empty()) - for (std::list::iterator itr = ThroneList.begin(); itr != ThroneList.end(); itr++) - (*itr)->DespawnOrUnsummon(); - SetEscortPaused(false); - SetRun(false); - break; - } + { + UpdateWorldState(me->GetMap(), WORLD_STATE_ROYAL_QUARTER_FIGHT_H, 0); + UpdateWorldState(me->GetMap(), WORLD_STATE_ROYAL_QUARTER_DONE_H, 1); + std::list ThroneList; + me->GetCreatureListWithEntryInGrid(ThroneList, NPC_LEGION_OVERLORD, 1000.0f); + me->GetCreatureListWithEntryInGrid(ThroneList, NPC_LEGION_INVADER, 1000.0f); + me->GetCreatureListWithEntryInGrid(ThroneList, NPC_LEGION_DREADWHISPER, 1000.0f); + me->GetCreatureListWithEntryInGrid(ThroneList, NPC_VARIMATHRAS_PORTAL, 1000.0f); + if (!ThroneList.empty()) + for (std::list::iterator itr = ThroneList.begin(); itr != ThroneList.end(); itr++) + (*itr)->DespawnOrUnsummon(); + SetEscortPaused(false); + SetRun(false); + break; + } default: break; } @@ -2617,15 +2619,15 @@ public: { switch (urand(0, 2)) { - case 0: - me->SummonCreature(NPC_TREACHEROUS_GUARDIAN_H, ThrallSpawn[25].x + rand32() % 5, ThrallSpawn[25].y + rand32() % 5, ThrallSpawn[25].z, TEMPSUMMON_DEAD_DESPAWN); - break; - case 1: - me->SummonCreature(NPC_DOCTOR_H, ThrallSpawn[26].x + rand32() % 5, ThrallSpawn[26].y + rand32() % 5, ThrallSpawn[26].z, TEMPSUMMON_DEAD_DESPAWN); - break; - case 2: - me->SummonCreature(NPC_CHEMIST_H, ThrallSpawn[27].x + rand32() % 5, ThrallSpawn[27].y + rand32() % 5, ThrallSpawn[27].z, TEMPSUMMON_DEAD_DESPAWN); - break; + case 0: + me->SummonCreature(NPC_TREACHEROUS_GUARDIAN_H, ThrallSpawn[25].x + rand32() % 5, ThrallSpawn[25].y + rand32() % 5, ThrallSpawn[25].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 1: + me->SummonCreature(NPC_DOCTOR_H, ThrallSpawn[26].x + rand32() % 5, ThrallSpawn[26].y + rand32() % 5, ThrallSpawn[26].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 2: + me->SummonCreature(NPC_CHEMIST_H, ThrallSpawn[27].x + rand32() % 5, ThrallSpawn[27].y + rand32() % 5, ThrallSpawn[27].z, TEMPSUMMON_DEAD_DESPAWN); + break; } } break; @@ -2680,15 +2682,15 @@ public: { switch (urand(0, 2)) { - case 0: - me->SummonCreature(NPC_TREACHEROUS_GUARDIAN_H, ThrallSpawn[59].x + rand32() % 2, ThrallSpawn[59].y + rand32() % 2, ThrallSpawn[59].z, TEMPSUMMON_DEAD_DESPAWN); - break; - case 1: - me->SummonCreature(NPC_DOCTOR_H, ThrallSpawn[59].x + rand32() % 2, ThrallSpawn[59].y + rand32() % 2, ThrallSpawn[59].z, TEMPSUMMON_DEAD_DESPAWN); - break; - case 2: - me->SummonCreature(NPC_CHEMIST_H, ThrallSpawn[59].x + rand32() % 2, ThrallSpawn[59].y + rand32() % 2, ThrallSpawn[59].z, TEMPSUMMON_DEAD_DESPAWN); - break; + case 0: + me->SummonCreature(NPC_TREACHEROUS_GUARDIAN_H, ThrallSpawn[59].x + rand32() % 2, ThrallSpawn[59].y + rand32() % 2, ThrallSpawn[59].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 1: + me->SummonCreature(NPC_DOCTOR_H, ThrallSpawn[59].x + rand32() % 2, ThrallSpawn[59].y + rand32() % 2, ThrallSpawn[59].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 2: + me->SummonCreature(NPC_CHEMIST_H, ThrallSpawn[59].x + rand32() % 2, ThrallSpawn[59].y + rand32() % 2, ThrallSpawn[59].z, TEMPSUMMON_DEAD_DESPAWN); + break; } } break; @@ -2698,12 +2700,12 @@ public: { switch (urand(0, 1)) { - case 0: - me->SummonCreature(NPC_TREACHEROUS_GUARDIAN_H, ThrallSpawn[60].x + rand32() % 5, ThrallSpawn[60].y + rand32() % 5, ThrallSpawn[60].z, TEMPSUMMON_DEAD_DESPAWN); - break; - case 1: - me->SummonCreature(NPC_FELGUARD_MORADEUR, ThrallSpawn[60].x + rand32() % 5, ThrallSpawn[60].y + rand32() % 5, ThrallSpawn[60].z, TEMPSUMMON_DEAD_DESPAWN); - break; + case 0: + me->SummonCreature(NPC_TREACHEROUS_GUARDIAN_H, ThrallSpawn[60].x + rand32() % 5, ThrallSpawn[60].y + rand32() % 5, ThrallSpawn[60].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 1: + me->SummonCreature(NPC_FELGUARD_MORADEUR, ThrallSpawn[60].x + rand32() % 5, ThrallSpawn[60].y + rand32() % 5, ThrallSpawn[60].z, TEMPSUMMON_DEAD_DESPAWN); + break; } } break; @@ -2713,12 +2715,12 @@ public: { switch (urand(0, 1)) { - case 0: - me->SummonCreature(NPC_FELGUARD_MORADEUR, ThrallSpawn[61].x + rand32() % 5, ThrallSpawn[61].y + rand32() % 5, ThrallSpawn[61].z, TEMPSUMMON_DEAD_DESPAWN); - break; - case 1: - me->SummonCreature(NPC_DREADLORD, ThrallSpawn[61].x + rand32() % 5, ThrallSpawn[61].y + rand32() % 5, ThrallSpawn[61].z, TEMPSUMMON_DEAD_DESPAWN); - break; + case 0: + me->SummonCreature(NPC_FELGUARD_MORADEUR, ThrallSpawn[61].x + rand32() % 5, ThrallSpawn[61].y + rand32() % 5, ThrallSpawn[61].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 1: + me->SummonCreature(NPC_DREADLORD, ThrallSpawn[61].x + rand32() % 5, ThrallSpawn[61].y + rand32() % 5, ThrallSpawn[61].z, TEMPSUMMON_DEAD_DESPAWN); + break; } } break; @@ -2734,71 +2736,71 @@ public: if (Unit* temp = me->SummonCreature(NPC_VARIMATHRAS_PORTAL, ThrallSpawn[64].x, ThrallSpawn[64].y, ThrallSpawn[64].z, ThrallSpawn[64].o, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 900 * IN_MILLISECONDS)) ValimathrasPortalGUID = temp->GetGUID(); break; - // NPC_KHANOK - Inner Sunktum Spawn Left + // NPC_KHANOK - Inner Sunktum Spawn Left case 14: for (uint8 i = 0; i < 4; ++i) { switch (urand(0, 6)) { - case 0: - me->SummonCreature(NPC_FELGUARD_MORADEUR, ThrallSpawn[65].x + rand32() % 5, ThrallSpawn[65].y + rand32() % 5, ThrallSpawn[65].z, TEMPSUMMON_DEAD_DESPAWN); - break; - case 1: - me->SummonCreature(NPC_DREADLORD, ThrallSpawn[65].x + rand32() % 5, ThrallSpawn[65].y + rand32() % 5, ThrallSpawn[65].z, TEMPSUMMON_DEAD_DESPAWN); - break; - case 2: - me->SummonCreature(NPC_TREACHEROUS_GUARDIAN_H, ThrallSpawn[65].x + rand32() % 5, ThrallSpawn[65].y + rand32() % 5, ThrallSpawn[65].z, TEMPSUMMON_DEAD_DESPAWN); - break; - case 3: - me->SummonCreature(NPC_DOCTOR_H, ThrallSpawn[65].x + rand32() % 5, ThrallSpawn[65].y + rand32() % 5, ThrallSpawn[65].z, TEMPSUMMON_DEAD_DESPAWN); - break; - case 4: - me->SummonCreature(NPC_CHEMIST_H, ThrallSpawn[65].x + rand32() % 5, ThrallSpawn[65].y + rand32() % 5, ThrallSpawn[65].z, TEMPSUMMON_DEAD_DESPAWN); - break; - case 5: - me->SummonCreature(NPC_BETRAYER_H, ThrallSpawn[65].x + rand32() % 5, ThrallSpawn[65].y + rand32() % 5, ThrallSpawn[65].z, TEMPSUMMON_DEAD_DESPAWN); - break; - case 6: - me->SummonCreature(NPC_FELBEAST_H, ThrallSpawn[65].x + rand32() % 5, ThrallSpawn[65].y + rand32() % 5, ThrallSpawn[65].z, TEMPSUMMON_DEAD_DESPAWN); - break; + case 0: + me->SummonCreature(NPC_FELGUARD_MORADEUR, ThrallSpawn[65].x + rand32() % 5, ThrallSpawn[65].y + rand32() % 5, ThrallSpawn[65].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 1: + me->SummonCreature(NPC_DREADLORD, ThrallSpawn[65].x + rand32() % 5, ThrallSpawn[65].y + rand32() % 5, ThrallSpawn[65].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 2: + me->SummonCreature(NPC_TREACHEROUS_GUARDIAN_H, ThrallSpawn[65].x + rand32() % 5, ThrallSpawn[65].y + rand32() % 5, ThrallSpawn[65].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 3: + me->SummonCreature(NPC_DOCTOR_H, ThrallSpawn[65].x + rand32() % 5, ThrallSpawn[65].y + rand32() % 5, ThrallSpawn[65].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 4: + me->SummonCreature(NPC_CHEMIST_H, ThrallSpawn[65].x + rand32() % 5, ThrallSpawn[65].y + rand32() % 5, ThrallSpawn[65].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 5: + me->SummonCreature(NPC_BETRAYER_H, ThrallSpawn[65].x + rand32() % 5, ThrallSpawn[65].y + rand32() % 5, ThrallSpawn[65].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 6: + me->SummonCreature(NPC_FELBEAST_H, ThrallSpawn[65].x + rand32() % 5, ThrallSpawn[65].y + rand32() % 5, ThrallSpawn[65].z, TEMPSUMMON_DEAD_DESPAWN); + break; } } break; - // NPC_KHANOK - Inner Sunktum Spawn Right + // NPC_KHANOK - Inner Sunktum Spawn Right case 15: for (uint8 i = 0; i < 4; ++i) { switch (urand(0, 6)) { - case 0: - me->SummonCreature(NPC_FELGUARD_MORADEUR, ThrallSpawn[66].x + rand32() % 5, ThrallSpawn[66].y + rand32() % 5, ThrallSpawn[66].z, TEMPSUMMON_DEAD_DESPAWN); - break; - case 1: - me->SummonCreature(NPC_DREADLORD, ThrallSpawn[66].x + rand32() % 5, ThrallSpawn[66].y + rand32() % 5, ThrallSpawn[66].z, TEMPSUMMON_DEAD_DESPAWN); - break; - case 2: - me->SummonCreature(NPC_TREACHEROUS_GUARDIAN_H, ThrallSpawn[66].x + rand32() % 5, ThrallSpawn[66].y + rand32() % 5, ThrallSpawn[66].z, TEMPSUMMON_DEAD_DESPAWN); - break; - case 3: - me->SummonCreature(NPC_DOCTOR_H, ThrallSpawn[66].x + rand32() % 5, ThrallSpawn[66].y + rand32() % 5, ThrallSpawn[66].z, TEMPSUMMON_DEAD_DESPAWN); - break; - case 4: - me->SummonCreature(NPC_CHEMIST_H, ThrallSpawn[66].x + rand32() % 5, ThrallSpawn[66].y + rand32() % 5, ThrallSpawn[66].z, TEMPSUMMON_DEAD_DESPAWN); - break; - case 5: - me->SummonCreature(NPC_BETRAYER_H, ThrallSpawn[66].x + rand32() % 5, ThrallSpawn[66].y + rand32() % 5, ThrallSpawn[66].z, TEMPSUMMON_DEAD_DESPAWN); - break; - case 6: - me->SummonCreature(NPC_FELBEAST_H, ThrallSpawn[66].x + rand32() % 5, ThrallSpawn[66].y + rand32() % 5, ThrallSpawn[66].z, TEMPSUMMON_DEAD_DESPAWN); - break; + case 0: + me->SummonCreature(NPC_FELGUARD_MORADEUR, ThrallSpawn[66].x + rand32() % 5, ThrallSpawn[66].y + rand32() % 5, ThrallSpawn[66].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 1: + me->SummonCreature(NPC_DREADLORD, ThrallSpawn[66].x + rand32() % 5, ThrallSpawn[66].y + rand32() % 5, ThrallSpawn[66].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 2: + me->SummonCreature(NPC_TREACHEROUS_GUARDIAN_H, ThrallSpawn[66].x + rand32() % 5, ThrallSpawn[66].y + rand32() % 5, ThrallSpawn[66].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 3: + me->SummonCreature(NPC_DOCTOR_H, ThrallSpawn[66].x + rand32() % 5, ThrallSpawn[66].y + rand32() % 5, ThrallSpawn[66].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 4: + me->SummonCreature(NPC_CHEMIST_H, ThrallSpawn[66].x + rand32() % 5, ThrallSpawn[66].y + rand32() % 5, ThrallSpawn[66].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 5: + me->SummonCreature(NPC_BETRAYER_H, ThrallSpawn[66].x + rand32() % 5, ThrallSpawn[66].y + rand32() % 5, ThrallSpawn[66].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 6: + me->SummonCreature(NPC_FELBEAST_H, ThrallSpawn[66].x + rand32() % 5, ThrallSpawn[66].y + rand32() % 5, ThrallSpawn[66].z, TEMPSUMMON_DEAD_DESPAWN); + break; } } break; - // NPC_KHANOK - Inner Sunktum Spawn Top + // NPC_KHANOK - Inner Sunktum Spawn Top case 16: me->SummonCreature(NPC_DOOMGUARD_PILLARGER, ThrallSpawn[67].x + rand32() % 15, ThrallSpawn[67].y + rand32() % 15, ThrallSpawn[67].z + rand32() % 5, TEMPSUMMON_DEAD_DESPAWN); break; - // NPC_KHANOK - Inner Sunktum Spawn Middle + // NPC_KHANOK - Inner Sunktum Spawn Middle case 17: me->SummonCreature(NPC_KHANOK, ThrallSpawn[68].x, ThrallSpawn[68].y, ThrallSpawn[68].z, TEMPSUMMON_DEAD_DESPAWN); break; @@ -2810,7 +2812,7 @@ public: temp->GetMotionMaster()->MovePath(NPC_WARSONG_BATTLEGUARD * 100, false); } break; - // Valimathras Room Preparation + // Valimathras Room Preparation case 19: for (uint8 i = 0; i < 3; ++i) me->SummonGameObject(GO_BLOCKED_PASSAGE, ThrallSpawn[i + 70].x, ThrallSpawn[i + 70].y, ThrallSpawn[70].z, ThrallSpawn[i + 70].o, 0.0f, 0.0f, 0.0f, 0.0f, 120 * IN_MILLISECONDS); @@ -2834,12 +2836,12 @@ public: { switch (urand(0, 1)) { - case 0: - me->SummonCreature(NPC_LEGION_INVADER, ThrallSpawn[80].x + rand32() % 5, ThrallSpawn[80].y + rand32() % 5, ThrallSpawn[80].z, TEMPSUMMON_DEAD_DESPAWN); - break; - case 1: - me->SummonCreature(NPC_LEGION_DREADWHISPER, ThrallSpawn[81].x + rand32() % 5, ThrallSpawn[81].y + rand32() % 5, ThrallSpawn[81].z, TEMPSUMMON_DEAD_DESPAWN); - break; + case 0: + me->SummonCreature(NPC_LEGION_INVADER, ThrallSpawn[80].x + rand32() % 5, ThrallSpawn[80].y + rand32() % 5, ThrallSpawn[80].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 1: + me->SummonCreature(NPC_LEGION_DREADWHISPER, ThrallSpawn[81].x + rand32() % 5, ThrallSpawn[81].y + rand32() % 5, ThrallSpawn[81].z, TEMPSUMMON_DEAD_DESPAWN); + break; } } break; @@ -2848,12 +2850,12 @@ public: { switch (urand(0, 1)) { - case 0: - me->SummonCreature(NPC_LEGION_INVADER, ThrallSpawn[81].x + rand32() % 5, ThrallSpawn[81].y + rand32() % 5, ThrallSpawn[81].z, TEMPSUMMON_DEAD_DESPAWN); - break; - case 1: - me->SummonCreature(NPC_LEGION_DREADWHISPER, ThrallSpawn[80].x + rand32() % 5, ThrallSpawn[80].y + rand32() % 5, ThrallSpawn[80].z, TEMPSUMMON_DEAD_DESPAWN); - break; + case 0: + me->SummonCreature(NPC_LEGION_INVADER, ThrallSpawn[81].x + rand32() % 5, ThrallSpawn[81].y + rand32() % 5, ThrallSpawn[81].z, TEMPSUMMON_DEAD_DESPAWN); + break; + case 1: + me->SummonCreature(NPC_LEGION_DREADWHISPER, ThrallSpawn[80].x + rand32() % 5, ThrallSpawn[80].y + rand32() % 5, ThrallSpawn[80].z, TEMPSUMMON_DEAD_DESPAWN); + break; } } break; @@ -3009,7 +3011,7 @@ public: DoCast(me, SPELL_THRALL_BUFF); JumpToNextStep(10 * IN_MILLISECONDS); break; - // Start Event + // Start Event case 11: UpdateWorldState(me->GetMap(), WORLD_STATE_BATTLE_COUNTDOWN_H, 0); UpdateWorldState(me->GetMap(), WORLD_STATE_BATTLE_START_H, 1); @@ -3043,19 +3045,19 @@ public: JumpToNextStep(5 * IN_MILLISECONDS); break; case 16: - { - std::list PlagueList; - me->GetCreatureListWithEntryInGrid(PlagueList, NPC_PLAGUE_TRIGGER, 50.0f); - if (!PlagueList.empty()) - for (std::list::iterator itr = PlagueList.begin(); itr != PlagueList.end(); itr++) - (*itr)->DespawnOrUnsummon(); - SetEscortPaused(false); - SetRun(false); - if (Creature* sylvanas = ObjectAccessor::GetCreature(*me, sylvanasfollowGUID)) - sylvanas->GetMotionMaster()->MovePath(NPC_SYLVANAS * 1000, false); - JumpToNextStep(3 * IN_MILLISECONDS); - break; - } + { + std::list PlagueList; + me->GetCreatureListWithEntryInGrid(PlagueList, NPC_PLAGUE_TRIGGER, 50.0f); + if (!PlagueList.empty()) + for (std::list::iterator itr = PlagueList.begin(); itr != PlagueList.end(); itr++) + (*itr)->DespawnOrUnsummon(); + SetEscortPaused(false); + SetRun(false); + if (Creature* sylvanas = ObjectAccessor::GetCreature(*me, sylvanasfollowGUID)) + sylvanas->GetMotionMaster()->MovePath(NPC_SYLVANAS * 1000, false); + JumpToNextStep(3 * IN_MILLISECONDS); + break; + } case 17: bStepping = false; JumpToNextStep(0); @@ -3066,11 +3068,11 @@ public: JumpToNextStep(6 * IN_MILLISECONDS); break; case 19: - { - SpawnWave(2); - JumpToNextStep(3 * IN_MILLISECONDS); - break; - } + { + SpawnWave(2); + JumpToNextStep(3 * IN_MILLISECONDS); + break; + } case 20: if (Creature* valimathras = ObjectAccessor::GetCreature(*me, ValimathrasGUID)) valimathras->AI()->Talk(SAY_VALIMATHRAS_INTRO_0); @@ -3106,17 +3108,17 @@ public: JumpToNextStep(1 * IN_MILLISECONDS); break; case 26: - { - Talk(THRALL_SAY_COURTYARD_3); - me->CastSpell(me, SPELL_TIDAL_WAVE_SUMMON); - std::list HelperList; - me->GetCreatureListWithEntryInGrid(HelperList, NPC_SLINGER_TRIGGER, 1000.0f); - if (!HelperList.empty()) - for (std::list::iterator itr = HelperList.begin(); itr != HelperList.end(); itr++) - (*itr)->DespawnOrUnsummon(); - JumpToNextStep(5 * IN_MILLISECONDS); - break; - } + { + Talk(THRALL_SAY_COURTYARD_3); + me->CastSpell(me, SPELL_TIDAL_WAVE_SUMMON); + std::list HelperList; + me->GetCreatureListWithEntryInGrid(HelperList, NPC_SLINGER_TRIGGER, 1000.0f); + if (!HelperList.empty()) + for (std::list::iterator itr = HelperList.begin(); itr != HelperList.end(); itr++) + (*itr)->DespawnOrUnsummon(); + JumpToNextStep(5 * IN_MILLISECONDS); + break; + } // Start COURTYARD_FIGHT case 27: FollowThrall(); @@ -3129,20 +3131,20 @@ public: JumpToNextStep(0); break; case 28: - { - EnableAttack = true; - DoCast(me, SPELL_HEROIC_VANGUARD, true); - std::list HostileEndList; - me->GetCreatureListWithEntryInGrid(HostileEndList, NPC_TREACHEROUS_GUARDIAN_H, 1000.0f); - me->GetCreatureListWithEntryInGrid(HostileEndList, NPC_DOCTOR_H, 1000.0f); - me->GetCreatureListWithEntryInGrid(HostileEndList, NPC_CHEMIST_H, 1000.0f); - if (!HostileEndList.empty()) - for (std::list::iterator itr = HostileEndList.begin(); itr != HostileEndList.end(); itr++) - (*itr)->setFaction(FACTION_HOSTILE); - SpawnWave(4); - JumpToNextStep(10 * IN_MILLISECONDS); - break; - } + { + EnableAttack = true; + DoCast(me, SPELL_HEROIC_VANGUARD, true); + std::list HostileEndList; + me->GetCreatureListWithEntryInGrid(HostileEndList, NPC_TREACHEROUS_GUARDIAN_H, 1000.0f); + me->GetCreatureListWithEntryInGrid(HostileEndList, NPC_DOCTOR_H, 1000.0f); + me->GetCreatureListWithEntryInGrid(HostileEndList, NPC_CHEMIST_H, 1000.0f); + if (!HostileEndList.empty()) + for (std::list::iterator itr = HostileEndList.begin(); itr != HostileEndList.end(); itr++) + (*itr)->setFaction(FACTION_HOSTILE); + SpawnWave(4); + JumpToNextStep(10 * IN_MILLISECONDS); + break; + } case 29: SpawnWave(4); JumpToNextStep(10 * IN_MILLISECONDS); @@ -3212,27 +3214,27 @@ public: bStepping = false; JumpToNextStep(0 * IN_MILLISECONDS); break; - // End COURTYARD_FIGHT + // End COURTYARD_FIGHT case 46: - { - FollowThrall(); - std::list HostileList; - me->GetCreatureListWithEntryInGrid(HostileList, NPC_TREACHEROUS_GUARDIAN_H, 1000.0f); - me->GetCreatureListWithEntryInGrid(HostileList, NPC_DOCTOR_H, 1000.0f); - me->GetCreatureListWithEntryInGrid(HostileList, NPC_CHEMIST_H, 1000.0f); - me->GetCreatureListWithEntryInGrid(HostileList, NPC_BLIGHT_SLINGER, 1000.0f); - if (!HostileList.empty()) - for (std::list::iterator itr = HostileList.begin(); itr != HostileList.end(); itr++) - (*itr)->DespawnOrUnsummon(); - for (uint8 i = 0; i < 7; ++i) - me->SummonGameObject(GO_HORDE_BANNER, ThrallSpawn[i + 37].x, ThrallSpawn[i + 37].y, ThrallSpawn[i + 37].z, ThrallSpawn[i + 37].o, 0.0f, 0.0f, 0.0f, 0.0f, 120 * IN_MILLISECONDS); - SpawnWave(6); - SetEscortPaused(false); - bStepping = false; - SetRun(false); - JumpToNextStep(0 * IN_MILLISECONDS); - break; - } + { + FollowThrall(); + std::list HostileList; + me->GetCreatureListWithEntryInGrid(HostileList, NPC_TREACHEROUS_GUARDIAN_H, 1000.0f); + me->GetCreatureListWithEntryInGrid(HostileList, NPC_DOCTOR_H, 1000.0f); + me->GetCreatureListWithEntryInGrid(HostileList, NPC_CHEMIST_H, 1000.0f); + me->GetCreatureListWithEntryInGrid(HostileList, NPC_BLIGHT_SLINGER, 1000.0f); + if (!HostileList.empty()) + for (std::list::iterator itr = HostileList.begin(); itr != HostileList.end(); itr++) + (*itr)->DespawnOrUnsummon(); + for (uint8 i = 0; i < 7; ++i) + me->SummonGameObject(GO_HORDE_BANNER, ThrallSpawn[i + 37].x, ThrallSpawn[i + 37].y, ThrallSpawn[i + 37].z, ThrallSpawn[i + 37].o, 0.0f, 0.0f, 0.0f, 0.0f, 120 * IN_MILLISECONDS); + SpawnWave(6); + SetEscortPaused(false); + bStepping = false; + SetRun(false); + JumpToNextStep(0 * IN_MILLISECONDS); + break; + } case 47: Talk(THRALL_SAY_COURTYARD_5); JumpToNextStep(5 * IN_MILLISECONDS); @@ -3242,7 +3244,7 @@ public: bStepping = false; JumpToNextStep(0 * IN_MILLISECONDS); break; - // Elevator Event + // Elevator Event case 49: Talk(THRALL_SAY_ELEVATOR_1); JumpToNextStep(10 * IN_MILLISECONDS); @@ -3276,7 +3278,7 @@ public: SetRun(false); JumpToNextStep(0 * IN_MILLISECONDS); break; - // Top of Undercity Discussion + // Top of Undercity Discussion case 55: if (Creature* sylvanas = ObjectAccessor::GetCreature(*me, sylvanasfollowGUID)) sylvanas->AI()->Talk(SYLVANAS_SAY_SANCTUM_1); @@ -3296,7 +3298,7 @@ public: sylvanas->AI()->Talk(SYLVANAS_SAY_SANCTUM_3); JumpToNextStep(5 * IN_MILLISECONDS); break; - // Top of Undercity - Fight + // Top of Undercity - Fight case 59: SpawnWave(9); JumpToNextStep(5 * IN_MILLISECONDS); @@ -3349,7 +3351,7 @@ public: SetRun(false); JumpToNextStep(0 * IN_MILLISECONDS); break; - // KHANOK - Valimathtas Intro + // KHANOK - Valimathtas Intro case 70: JumpToNextStep(10 * IN_MILLISECONDS); break; @@ -3385,7 +3387,7 @@ public: valimathrasportal->DespawnOrUnsummon(3 * IN_MILLISECONDS); JumpToNextStep(2 * IN_MILLISECONDS); break; - // KHANOK - Trashspawn + // KHANOK - Trashspawn case 76: SpawnWave(14); JumpToNextStep(8 * IN_MILLISECONDS); @@ -3459,7 +3461,7 @@ public: JumpToNextStep(8 * IN_MILLISECONDS); break; case 94: - // Spawn Boss 2 KHANOK + // Spawn Boss 2 KHANOK SpawnWave(17); JumpToNextStep(10 * IN_MILLISECONDS); break; @@ -3554,15 +3556,15 @@ public: JumpToNextStep(6 * IN_MILLISECONDS); break; case 115: - { - std::list SaronitList; - GetGameObjectListWithEntryInGrid(SaronitList, me, GO_BLOCKED_PASSAGE, 80.0f); - for (std::list::const_iterator itr = SaronitList.begin(); itr != SaronitList.end(); ++itr) - if (GameObject* saronit = (*itr)) - saronit->UseDoorOrButton(); - JumpToNextStep(5 * IN_MILLISECONDS); - break; - } + { + std::list SaronitList; + GetGameObjectListWithEntryInGrid(SaronitList, me, GO_BLOCKED_PASSAGE, 80.0f); + for (std::list::const_iterator itr = SaronitList.begin(); itr != SaronitList.end(); ++itr) + if (GameObject* saronit = (*itr)) + saronit->UseDoorOrButton(); + JumpToNextStep(5 * IN_MILLISECONDS); + break; + } case 116: Talk(THRALL_SAY_SANCTUM_7); UpdateWorldState(me->GetMap(), WORLD_STATE_ROYAL_QUARTER_FIGHT_H, 1); @@ -3571,7 +3573,7 @@ public: bStepping = false; JumpToNextStep(0 * IN_MILLISECONDS); break; - // Valimathras Intro + // Valimathras Intro case 117: Talk(THRALL_SAY_THRONE_1); JumpToNextStep(5 * IN_MILLISECONDS); @@ -3666,7 +3668,7 @@ public: ActivateValimathrasPortal(); JumpToNextStep(5 * IN_MILLISECONDS); break; - // Valimathras Fight + // Valimathras Fight case 137: if (Creature* valimathras = ObjectAccessor::GetCreature(*me, ValimathrasGUID)) { @@ -3681,7 +3683,7 @@ public: bStepping = false; JumpToNextStep(0 * IN_MILLISECONDS); break; - // Valimathras Won + // Valimathras Won case 138: Talk(THRALL_SAY_THRONE_2); JumpToNextStep(5 * IN_MILLISECONDS); @@ -3764,7 +3766,7 @@ public: } JumpToNextStep(6 * IN_MILLISECONDS); break; - // Wrynn Intro + // Wrynn Intro case 148: if (Creature* wrynn = ObjectAccessor::GetCreature(*me, WrynnGUID)) wrynn->AI()->Talk(WRYNN_SAY_THRONE_5); @@ -3785,7 +3787,7 @@ public: wrynn->AI()->Talk(WRYNN_SAY_THRONE_8); JumpToNextStep(6 * IN_MILLISECONDS); break; - // Wrynn Fight + // Wrynn Fight case 152: me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_IMMUNE_TO_PC); if (Creature* wrynn = ObjectAccessor::GetCreature(*me, WrynnGUID)) @@ -3827,17 +3829,17 @@ public: JumpToNextStep(5 * IN_MILLISECONDS); break; case 155: - { - std::list HelperList; - me->GetCreatureListWithEntryInGrid(HelperList, NPC_SW_SOLDIER, 100.0f); - me->GetCreatureListWithEntryInGrid(HelperList, NPC_JAINA, 100.0f); - me->GetCreatureListWithEntryInGrid(HelperList, NPC_WRYNN, 100.0f); - if (!HelperList.empty()) - for (std::list::iterator itr = HelperList.begin(); itr != HelperList.end(); itr++) - (*itr)->DespawnOrUnsummon(); - JumpToNextStep(8 * IN_MILLISECONDS); - break; - } + { + std::list HelperList; + me->GetCreatureListWithEntryInGrid(HelperList, NPC_SW_SOLDIER, 100.0f); + me->GetCreatureListWithEntryInGrid(HelperList, NPC_JAINA, 100.0f); + me->GetCreatureListWithEntryInGrid(HelperList, NPC_WRYNN, 100.0f); + if (!HelperList.empty()) + for (std::list::iterator itr = HelperList.begin(); itr != HelperList.end(); itr++) + (*itr)->DespawnOrUnsummon(); + JumpToNextStep(8 * IN_MILLISECONDS); + break; + } case 156: Talk(THRALL_SAY_THRONE_7); SetEscortPaused(false); @@ -3849,7 +3851,7 @@ public: me->SetStandState(UNIT_STAND_STATE_SIT); JumpToNextStep(3 * IN_MILLISECONDS); break; - // Ending + // Ending case 158: if (Creature* saurfang = me->SummonCreature(NPC_OVERLORD_SAURFANG, 1297.574f, 347.154f, -65.027f, TEMPSUMMON_MANUAL_DESPAWN)) { @@ -3875,12 +3877,12 @@ public: case 161: if (Creature* saurfang = ObjectAccessor::GetCreature(*me, SaurfangGUID)) saurfang->AI()->Talk(SAY_SAURFANG_ARRIVAL_3); - if (Map *map = me->GetMap()) + if (Map* map = me->GetMap()) { - Map::PlayerList const &PlayerList = map->GetPlayers(); + Map::PlayerList const& PlayerList = map->GetPlayers(); for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) { - if (Player *player = i->GetSource()) + if (Player* player = i->GetSource()) { if (me->IsInRange(player, 0.0f, 50.0f)) { diff --git a/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp index 63e692587..6d10758cb 100644 --- a/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp @@ -50,19 +50,19 @@ public: player->GetSession()->SendListInventory(creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+1: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_SDA1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_SDA1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); SendGossipMenuFor(player, 3980, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+2: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_SDA1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_SDA1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); SendGossipMenuFor(player, 3981, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+3: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_SDA1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_SDA1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); SendGossipMenuFor(player, 3982, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+4: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_SDA1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_SDA1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); SendGossipMenuFor(player, 3983, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+5: @@ -83,10 +83,10 @@ public: if (player->GetQuestRewardStatus(5237) || player->GetQuestRewardStatus(5238)) { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HDA1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HDA2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HDA3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HDA4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HDA1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HDA2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HDA3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HDA4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); SendGossipMenuFor(player, 3985, creature->GetGUID()); } else @@ -132,7 +132,7 @@ public: player->PrepareQuestMenu(creature->GetGUID()); if (player->GetQuestRewardStatus(QUEST_FIND_MYRANDA) && - !player->GetQuestRewardStatus(QUEST_IN_DREAMS) && !player->HasAura(SPELL_SCARLET_ILLUSION)) + !player->GetQuestRewardStatus(QUEST_IN_DREAMS) && !player->HasAura(SPELL_SCARLET_ILLUSION)) { AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ILLUSION, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); SendGossipMenuFor(player, 4773, creature->GetGUID()); @@ -173,7 +173,7 @@ public: Unit::DealDamage(me, me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); //override any database `spawntimesecs` to prevent duplicated summons uint32 rTime = me->GetRespawnDelay(); - if (rTime<600) + if (rTime < 600) me->SetRespawnDelay(600); } @@ -190,7 +190,7 @@ public: { case 199: //felstone if (player->GetQuestStatus(5216) == QUEST_STATUS_INCOMPLETE || - player->GetQuestStatus(5229) == QUEST_STATUS_INCOMPLETE) + player->GetQuestStatus(5229) == QUEST_STATUS_INCOMPLETE) { me->SummonCreature(11075, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 600000); DoDie(); @@ -198,7 +198,7 @@ public: break; case 200: //dalson if (player->GetQuestStatus(5219) == QUEST_STATUS_INCOMPLETE || - player->GetQuestStatus(5231) == QUEST_STATUS_INCOMPLETE) + player->GetQuestStatus(5231) == QUEST_STATUS_INCOMPLETE) { me->SummonCreature(11077, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 600000); DoDie(); @@ -206,7 +206,7 @@ public: break; case 201: //gahrron if (player->GetQuestStatus(5225) == QUEST_STATUS_INCOMPLETE || - player->GetQuestStatus(5235) == QUEST_STATUS_INCOMPLETE) + player->GetQuestStatus(5235) == QUEST_STATUS_INCOMPLETE) { me->SummonCreature(11078, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 600000); DoDie(); @@ -214,7 +214,7 @@ public: break; case 202: //writhing if (player->GetQuestStatus(5222) == QUEST_STATUS_INCOMPLETE || - player->GetQuestStatus(5233) == QUEST_STATUS_INCOMPLETE) + player->GetQuestStatus(5233) == QUEST_STATUS_INCOMPLETE) { me->SummonCreature(11076, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 600000); DoDie(); @@ -335,17 +335,17 @@ public: { case 8: Talk(SAY_WP_0); - me->SummonCreature(NPC_GHOUL, me->GetPositionX()+7.0f, me->GetPositionY()+7.0f, me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 90000); - me->SummonCreature(NPC_GHOUL, me->GetPositionX()+5.0f, me->GetPositionY()+5.0f, me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 90000); + me->SummonCreature(NPC_GHOUL, me->GetPositionX() + 7.0f, me->GetPositionY() + 7.0f, me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 90000); + me->SummonCreature(NPC_GHOUL, me->GetPositionX() + 5.0f, me->GetPositionY() + 5.0f, me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 90000); break; case 9: Talk(SAY_WP_1); break; case 14: - me->SummonCreature(NPC_GHOUL, me->GetPositionX()+7.0f, me->GetPositionY()+7.0f, me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 90000); - me->SummonCreature(NPC_GHOUL, me->GetPositionX()+5.0f, me->GetPositionY()+5.0f, me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 90000); - me->SummonCreature(NPC_GHOUL, me->GetPositionX()+10.0f, me->GetPositionY()+10.0f, me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 90000); - me->SummonCreature(NPC_GHOUL, me->GetPositionX()+8.0f, me->GetPositionY()+8.0f, me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 90000); + me->SummonCreature(NPC_GHOUL, me->GetPositionX() + 7.0f, me->GetPositionY() + 7.0f, me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 90000); + me->SummonCreature(NPC_GHOUL, me->GetPositionX() + 5.0f, me->GetPositionY() + 5.0f, me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 90000); + me->SummonCreature(NPC_GHOUL, me->GetPositionX() + 10.0f, me->GetPositionY() + 10.0f, me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 90000); + me->SummonCreature(NPC_GHOUL, me->GetPositionX() + 8.0f, me->GetPositionY() + 8.0f, me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 90000); break; case 15: Talk(SAY_WP_2); @@ -383,7 +383,7 @@ public: void EnterCombat(Unit* /*who*/) { } - void JustDied(Unit* /*killer*/) + void JustDied(Unit* /*killer*/) { if (Player* player = GetPlayerForEscort()) player->FailQuest(QUEST_TOMB_LIGHTBRINGER); diff --git a/src/server/scripts/Events/brewfest.cpp b/src/server/scripts/Events/brewfest.cpp index 77f2298e5..cd5323c52 100644 --- a/src/server/scripts/Events/brewfest.cpp +++ b/src/server/scripts/Events/brewfest.cpp @@ -39,7 +39,7 @@ public: } }; - CreatureAI *GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const { return new npc_brewfest_revelerAI(creature); } @@ -96,7 +96,7 @@ public: switch (uiAction) { case GOSSIP_ACTION_INFO_DEF+1: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_COREN2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_COREN2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); SendGossipMenuFor(player, 15859, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+2: @@ -113,7 +113,7 @@ public: if (creature->IsQuestGiver()) player->PrepareQuestMenu(creature->GetGUID()); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_COREN1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_COREN1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); SendGossipMenuFor(player, 15858, creature->GetGUID()); return true; @@ -145,8 +145,8 @@ public: for (int i = 0; i < 3; ++i) { - float o = rand_norm()*2*M_PI; - if ((cr = me->SummonCreature(NPC_ANTAGONIST, me->GetPositionX()+3*cos(o), me->GetPositionY()+3*sin(o), me->GetPositionZ(), me->GetOrientation()))) + float o = rand_norm() * 2 * M_PI; + if ((cr = me->SummonCreature(NPC_ANTAGONIST, me->GetPositionX() + 3 * cos(o), me->GetPositionY() + 3 * sin(o), me->GetPositionZ(), me->GetOrientation()))) { if (i == 0) cr->MonsterSay("Time to die.", LANG_UNIVERSAL, 0); @@ -156,7 +156,7 @@ public: } } - me->CastSpell(me, SPELL_PURPLE_VISUAL , true); + me->CastSpell(me, SPELL_PURPLE_VISUAL, true); me->setFaction(FACTION_HOSTILE); me->SetInCombatWithZone(); events.ScheduleEvent(EVENT_DIREBREW_DISARM, 10000); @@ -194,10 +194,10 @@ public: void SummonSister(uint32 entry) { summons.DespawnEntry(entry); - float o = rand_norm()*2*M_PI; - if (Creature* cr = me->SummonCreature(entry, me->GetPositionX()+3*cos(o), me->GetPositionY()+3*sin(o), me->GetPositionZ(), me->GetOrientation())) + float o = rand_norm() * 2 * M_PI; + if (Creature* cr = me->SummonCreature(entry, me->GetPositionX() + 3 * cos(o), me->GetPositionY() + 3 * sin(o), me->GetPositionZ(), me->GetOrientation())) { - cr->CastSpell(cr, SPELL_PURPLE_VISUAL , true); + cr->CastSpell(cr, SPELL_PURPLE_VISUAL, true); cr->SetInCombatWithZone(); summons.Summon(cr); } @@ -431,16 +431,16 @@ public: player->DestroyItemCount(ITEM_PORTABLE_BREWFEST_KEG, 1, true); // Additional Work - uint32 spellCooldown = player->GetSpellCooldownDelay(SPELL_COOLDOWN_CHECKER)/IN_MILLISECONDS; - if (spellCooldown > (HOUR*18 - 900)) // max aproximated time - 12 minutes + uint32 spellCooldown = player->GetSpellCooldownDelay(SPELL_COOLDOWN_CHECKER) / IN_MILLISECONDS; + if (spellCooldown > (HOUR * 18 - 900)) // max aproximated time - 12 minutes { if (Aura* aur = player->GetAura(SPELL_RAM_AURA)) { - int32 diff = aur->GetApplyTime() - (time(nullptr)-(HOUR*18)+spellCooldown); + int32 diff = aur->GetApplyTime() - (time(nullptr) - (HOUR * 18) + spellCooldown); if (diff > 10) // aura applied later return; - aur->SetDuration(aur->GetDuration()+30000); + aur->SetDuration(aur->GetDuration() + 30000); player->CastSpell(player, SPELL_ADD_TOKENS, true); } } @@ -460,7 +460,7 @@ public: { case GOSSIP_ACTION_INFO_DEF+1: CloseGossipMenuFor(player); - player->AddSpellCooldown(SPELL_COOLDOWN_CHECKER, 0, 18*HOUR*IN_MILLISECONDS); + player->AddSpellCooldown(SPELL_COOLDOWN_CHECKER, 0, 18 * HOUR * IN_MILLISECONDS); player->CastSpell(player, 43883, true); player->CastSpell(player, 44262, true); break; @@ -474,7 +474,7 @@ public: player->PrepareQuestMenu(creature->GetGUID()); if (!player->HasSpellCooldown(SPELL_COOLDOWN_CHECKER) && player->GetQuestRewardStatus(player->GetTeamId() == TEAM_ALLIANCE ? QUEST_THERE_AND_BACK_AGAIN_A : QUEST_THERE_AND_BACK_AGAIN_H)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Do you have additional work?", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Do you have additional work?", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); SendGossipMenuFor(player, (creature->GetEntry() == NPC_NEILL_RAMSTEIN ? 8934 : 8976), creature->GetGUID()); return true; @@ -491,121 +491,121 @@ enum barkTrigger class npc_brewfest_bark_trigger : public CreatureScript { - public: - npc_brewfest_bark_trigger() : CreatureScript("npc_brewfest_bark_trigger") { } +public: + npc_brewfest_bark_trigger() : CreatureScript("npc_brewfest_bark_trigger") { } - struct npc_brewfest_bark_triggerAI : public ScriptedAI + struct npc_brewfest_bark_triggerAI : public ScriptedAI + { + npc_brewfest_bark_triggerAI(Creature* creature) : ScriptedAI(creature) { - npc_brewfest_bark_triggerAI(Creature* creature) : ScriptedAI(creature) - { - } - - void MoveInLineOfSight(Unit* who) - { - if (me->GetDistance(who) < 10.0f && who->GetTypeId() == TYPEID_PLAYER && who->GetMountID() == RAM_DISPLAY_ID) - { - bool allow = false; - uint32 quest = 0; - Player* player = who->ToPlayer(); - // Kalimdor - if (me->GetMapId() == 1) - { - if (player->GetQuestStatus(QUEST_BARK_FOR_DROHN) == QUEST_STATUS_INCOMPLETE) - { - allow = true; - quest = QUEST_BARK_FOR_DROHN; - } - else if (player->GetQuestStatus(QUEST_BARK_FOR_VOODOO) == QUEST_STATUS_INCOMPLETE) - { - allow = true; - quest = QUEST_BARK_FOR_VOODOO; - } - } - else if (me->GetMapId() == 0) - { - if (player->GetQuestStatus(QUEST_BARK_FOR_BARLEY) == QUEST_STATUS_INCOMPLETE) - { - allow = true; - quest = QUEST_BARK_FOR_BARLEY; - } - else if (player->GetQuestStatus(QUEST_BARK_FOR_THUNDERBREW) == QUEST_STATUS_INCOMPLETE) - { - allow = true; - quest = QUEST_BARK_FOR_THUNDERBREW; - } - } - - if (allow) - { - QuestStatusMap::iterator itr = player->getQuestStatusMap().find(quest); - if (itr == player->getQuestStatusMap().end()) - return; - - QuestStatusData &q_status = itr->second; - if (q_status.CreatureOrGOCount[me->GetEntry()-24202] == 0) - { - player->KilledMonsterCredit(me->GetEntry(), 0); - player->MonsterSay(GetTextFor(me->GetEntry(), quest).c_str(), LANG_UNIVERSAL, player); - } - } - } - } - - std::string GetTextFor(uint32 /*entry*/, uint32 questId) - { - std::string str = ""; - switch (questId) - { - case QUEST_BARK_FOR_DROHN: - case QUEST_BARK_FOR_VOODOO: - { - switch (urand(0,3)) - { - case 0: - str = "Join with your brothers and sisters at "+ std::string(questId == QUEST_BARK_FOR_DROHN ? "Drohn's Distillery" : "T'chali's Voodoo Brewery") +" and drink for the horde!"; - break; - case 1: - str = "If you think an orc can hit hard, check out their brew, it hits even harder! See for yourself at "+ std::string(questId == QUEST_BARK_FOR_DROHN ? "Drohn's Distillery" : "T'chali's Voodoo Brewery") +", only at Brewfest!"; - break; - case 2: - str = "Celebrate Brewfest with orcs that know what a good drink really is! Check out "+ std::string(questId == QUEST_BARK_FOR_DROHN ? "Drohn's Distillery" : "T'chali's Voodoo Brewery") +" at Brewfest!"; - break; - case 3: - str = std::string(questId == QUEST_BARK_FOR_DROHN ? "Drohn's Distillery" : "T'chali's Voodoo Brewery") +" knows how to party hard! Check them out at Brewfest!"; - break; - } - break; - } - case QUEST_BARK_FOR_BARLEY: - case QUEST_BARK_FOR_THUNDERBREW: - { - switch (urand(0,3)) - { - case 0: - str = "Join with your brothers and sisters at "+ std::string(questId == QUEST_BARK_FOR_BARLEY ? "Barleybrews" : "Thunderbrews") +" and drink for the alliance!"; - break; - case 1: - str = "If you think an dwarf can hit hard, check out their brew, it hits even harder! See for yourself at "+ std::string(questId == QUEST_BARK_FOR_BARLEY ? "Barleybrews" : "Thunderbrews") +", only at Brewfest!"; - break; - case 2: - str = "Celebrate Brewfest with dwarves that know what a good drink really is! Check out "+ std::string(questId == QUEST_BARK_FOR_BARLEY ? "Barleybrews" : "Thunderbrews") +" at Brewfest!"; - break; - case 3: - str = std::string(questId == QUEST_BARK_FOR_BARLEY ? "Barleybrews" : "Thunderbrews") +" knows how to party hard! Check them out at Brewfest!"; - break; - } - break; - } - } - - return str; - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_brewfest_bark_triggerAI(creature); } + + void MoveInLineOfSight(Unit* who) + { + if (me->GetDistance(who) < 10.0f && who->GetTypeId() == TYPEID_PLAYER && who->GetMountID() == RAM_DISPLAY_ID) + { + bool allow = false; + uint32 quest = 0; + Player* player = who->ToPlayer(); + // Kalimdor + if (me->GetMapId() == 1) + { + if (player->GetQuestStatus(QUEST_BARK_FOR_DROHN) == QUEST_STATUS_INCOMPLETE) + { + allow = true; + quest = QUEST_BARK_FOR_DROHN; + } + else if (player->GetQuestStatus(QUEST_BARK_FOR_VOODOO) == QUEST_STATUS_INCOMPLETE) + { + allow = true; + quest = QUEST_BARK_FOR_VOODOO; + } + } + else if (me->GetMapId() == 0) + { + if (player->GetQuestStatus(QUEST_BARK_FOR_BARLEY) == QUEST_STATUS_INCOMPLETE) + { + allow = true; + quest = QUEST_BARK_FOR_BARLEY; + } + else if (player->GetQuestStatus(QUEST_BARK_FOR_THUNDERBREW) == QUEST_STATUS_INCOMPLETE) + { + allow = true; + quest = QUEST_BARK_FOR_THUNDERBREW; + } + } + + if (allow) + { + QuestStatusMap::iterator itr = player->getQuestStatusMap().find(quest); + if (itr == player->getQuestStatusMap().end()) + return; + + QuestStatusData& q_status = itr->second; + if (q_status.CreatureOrGOCount[me->GetEntry() - 24202] == 0) + { + player->KilledMonsterCredit(me->GetEntry(), 0); + player->MonsterSay(GetTextFor(me->GetEntry(), quest).c_str(), LANG_UNIVERSAL, player); + } + } + } + } + + std::string GetTextFor(uint32 /*entry*/, uint32 questId) + { + std::string str = ""; + switch (questId) + { + case QUEST_BARK_FOR_DROHN: + case QUEST_BARK_FOR_VOODOO: + { + switch (urand(0, 3)) + { + case 0: + str = "Join with your brothers and sisters at " + std::string(questId == QUEST_BARK_FOR_DROHN ? "Drohn's Distillery" : "T'chali's Voodoo Brewery") + " and drink for the horde!"; + break; + case 1: + str = "If you think an orc can hit hard, check out their brew, it hits even harder! See for yourself at " + std::string(questId == QUEST_BARK_FOR_DROHN ? "Drohn's Distillery" : "T'chali's Voodoo Brewery") + ", only at Brewfest!"; + break; + case 2: + str = "Celebrate Brewfest with orcs that know what a good drink really is! Check out " + std::string(questId == QUEST_BARK_FOR_DROHN ? "Drohn's Distillery" : "T'chali's Voodoo Brewery") + " at Brewfest!"; + break; + case 3: + str = std::string(questId == QUEST_BARK_FOR_DROHN ? "Drohn's Distillery" : "T'chali's Voodoo Brewery") + " knows how to party hard! Check them out at Brewfest!"; + break; + } + break; + } + case QUEST_BARK_FOR_BARLEY: + case QUEST_BARK_FOR_THUNDERBREW: + { + switch (urand(0, 3)) + { + case 0: + str = "Join with your brothers and sisters at " + std::string(questId == QUEST_BARK_FOR_BARLEY ? "Barleybrews" : "Thunderbrews") + " and drink for the alliance!"; + break; + case 1: + str = "If you think an dwarf can hit hard, check out their brew, it hits even harder! See for yourself at " + std::string(questId == QUEST_BARK_FOR_BARLEY ? "Barleybrews" : "Thunderbrews") + ", only at Brewfest!"; + break; + case 2: + str = "Celebrate Brewfest with dwarves that know what a good drink really is! Check out " + std::string(questId == QUEST_BARK_FOR_BARLEY ? "Barleybrews" : "Thunderbrews") + " at Brewfest!"; + break; + case 3: + str = std::string(questId == QUEST_BARK_FOR_BARLEY ? "Barleybrews" : "Thunderbrews") + " knows how to party hard! Check them out at Brewfest!"; + break; + } + break; + } + } + + return str; + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_brewfest_bark_triggerAI(creature); + } }; enum darkIronAttack @@ -706,79 +706,79 @@ public: switch (events.GetEvent()) { case EVENT_CHECK_HOUR: - { - // determine hour - if (AllowStart()) { - PrepareEvent(); - events.RepeatEvent(300000); - return; + // determine hour + if (AllowStart()) + { + PrepareEvent(); + events.RepeatEvent(300000); + return; + } + events.RepeatEvent(2000); + break; } - events.RepeatEvent(2000); - break; - } case EVENT_SPAWN_MOLE_MACHINE: - { - if (me->GetMapId() == 1) // Kalimdor { - float rand = 8+rand_norm()*12; - float angle = rand_norm()*2*M_PI; - float x = 1201.8f+rand*cos(angle); - float y = -4299.6f+rand*sin(angle); - if (Creature* cr = me->SummonCreature(NPC_MOLE_MACHINE_TRIGGER, x, y, 21.3f, 0.0f)) - cr->CastSpell(cr, SPELL_SPAWN_MOLE_MACHINE, true); + if (me->GetMapId() == 1) // Kalimdor + { + float rand = 8 + rand_norm() * 12; + float angle = rand_norm() * 2 * M_PI; + float x = 1201.8f + rand * cos(angle); + float y = -4299.6f + rand * sin(angle); + if (Creature* cr = me->SummonCreature(NPC_MOLE_MACHINE_TRIGGER, x, y, 21.3f, 0.0f)) + cr->CastSpell(cr, SPELL_SPAWN_MOLE_MACHINE, true); + } + else if (me->GetMapId() == 0) // EK + { + float rand = rand_norm() * 20; + float angle = rand_norm() * 2 * M_PI; + float x = -5157.1f + rand * cos(angle); + float y = -598.98f + rand * sin(angle); + if (Creature* cr = me->SummonCreature(NPC_MOLE_MACHINE_TRIGGER, x, y, 398.11f, 0.0f)) + cr->CastSpell(cr, SPELL_SPAWN_MOLE_MACHINE, true); + } + events.RepeatEvent(3000); + break; } - else if (me->GetMapId() == 0) // EK - { - float rand = rand_norm()*20; - float angle = rand_norm()*2*M_PI; - float x = -5157.1f+rand*cos(angle); - float y = -598.98f+rand*sin(angle); - if (Creature* cr = me->SummonCreature(NPC_MOLE_MACHINE_TRIGGER, x, y, 398.11f, 0.0f)) - cr->CastSpell(cr, SPELL_SPAWN_MOLE_MACHINE, true); - } - events.RepeatEvent(3000); - break; - } case EVENT_PRE_FINISH_ATTACK: - { - events.CancelEvent(EVENT_SPAWN_MOLE_MACHINE); - events.ScheduleEvent(EVENT_FINISH_ATTACK, 20000); - events.PopEvent(); - break; - } + { + events.CancelEvent(EVENT_SPAWN_MOLE_MACHINE); + events.ScheduleEvent(EVENT_FINISH_ATTACK, 20000); + events.PopEvent(); + break; + } case EVENT_FINISH_ATTACK: - { - FinishAttackDueToWin(); - events.RescheduleEvent(EVENT_CHECK_HOUR, 60000); - break; - } + { + FinishAttackDueToWin(); + events.RescheduleEvent(EVENT_CHECK_HOUR, 60000); + break; + } case EVENT_BARTENDER_SAY: - { - events.RepeatEvent(12000); - Creature* sayer = GetRandomBartender(); - if (!sayer) - return; - - thrown++; - if (thrown == 3) { - thrown = 0; - sayer->MonsterSay("SOMEONE TRY THIS SUPER BREW!", LANG_UNIVERSAL, 0); - //sayer->CastSpell(sayer, SPELL_CREATE_SUPER_BREW, true); - sayer->SummonCreature(NPC_SUPER_BREW_TRIGGER, sayer->GetPositionX()+15*cos(sayer->GetOrientation()), sayer->GetPositionY()+15*sin(sayer->GetOrientation()), sayer->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000); + events.RepeatEvent(12000); + Creature* sayer = GetRandomBartender(); + if (!sayer) + return; - } - else - { - if (urand(0,1)) - sayer->MonsterSay("Chug and chuck! Chug and chuck!", LANG_UNIVERSAL, 0); + thrown++; + if (thrown == 3) + { + thrown = 0; + sayer->MonsterSay("SOMEONE TRY THIS SUPER BREW!", LANG_UNIVERSAL, 0); + //sayer->CastSpell(sayer, SPELL_CREATE_SUPER_BREW, true); + sayer->SummonCreature(NPC_SUPER_BREW_TRIGGER, sayer->GetPositionX() + 15 * cos(sayer->GetOrientation()), sayer->GetPositionY() + 15 * sin(sayer->GetOrientation()), sayer->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000); + + } else - sayer->MonsterSay("Down the free brew and pelt the Guzzlers with your mug!", LANG_UNIVERSAL, 0); - } + { + if (urand(0, 1)) + sayer->MonsterSay("Chug and chuck! Chug and chuck!", LANG_UNIVERSAL, 0); + else + sayer->MonsterSay("Down the free brew and pelt the Guzzlers with your mug!", LANG_UNIVERSAL, 0); + } - break; - } + break; + } } } @@ -857,7 +857,7 @@ public: Creature* GetRandomBartender() { uint32 entry = 0; - switch (urand(0,2)) + switch (urand(0, 2)) { case 0: entry = (me->GetMapId() == 1 ? NPC_NORMAL_DROHN : NPC_NORMAL_THUNDERBREW); @@ -911,7 +911,7 @@ public: { goTimer = 0; summonTimer++; - if (GameObject* drill = me->SummonGameObject(GO_MOLE_MACHINE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), M_PI/4, 0.0f, 0.0f, 0.0f, 0.0f, 8)) + if (GameObject* drill = me->SummonGameObject(GO_MOLE_MACHINE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), M_PI / 4, 0.0f, 0.0f, 0.0f, 0.0f, 8)) { //drill->SetGoAnimProgress(0); drill->SetLootState(GO_READY); @@ -961,7 +961,7 @@ public: void MoveInLineOfSight(Unit*) {} void AttackStart(Unit*) {} - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) { damage = 0; } @@ -986,9 +986,9 @@ public: for (uint8 i = 0; i < 3; ++i) { - uint8 index=0; + uint8 index = 0; do - index = urand(0,2); + index = urand(0, 2); while (shuffled[index]); shuffled[index] = entry[i]; @@ -1021,9 +1021,9 @@ public: void SayText() { - if (!urand(0,20)) + if (!urand(0, 20)) { - switch (urand(0,4)) + switch (urand(0, 4)) { case 0: me->MonsterSay("Drink it all boys!", LANG_UNIVERSAL, 0); @@ -1204,65 +1204,65 @@ public: uint8 mode = 0; switch (privateLevel) { - case 0: - if (stack > 1) - { - questTick = 0; - caster->CastSpell(caster, SPELL_TROT, true); - privateLevel++; - mode = 1; // unapply + case 0: + if (stack > 1) + { + questTick = 0; + caster->CastSpell(caster, SPELL_TROT, true); + privateLevel++; + mode = 1; // unapply + break; + } + // just walking, fatiuge handling + if (Aura* aur = caster->GetAura(SPELL_RAM_FATIGUE)) + aur->ModStackAmount(-4); + break; + case 1: + // One click to maintain speed, more to increase + if (stack < 2) + { + caster->RemoveAurasDueToSpell(SPELL_TROT); + questTick = 0; + privateLevel--; + mode = 2; // apply + } + else if (stack > 2) + { + questTick = 0; + caster->CastSpell(caster, SPELL_CANTER, true); + privateLevel++; + } + else if (questTick++ > 3) + caster->ToPlayer()->KilledMonsterCredit(CREDIT_TROT, 0); + break; + case 2: + // Two - three clicks to maintains speed, less to decrease, more to increase + if (stack < 3) + { + caster->CastSpell(caster, SPELL_TROT, true); + privateLevel--; + questTick = 0; + } + else if (stack > 4) + { + caster->CastSpell(caster, SPELL_GALLOP, true); + privateLevel++; + questTick = 0; + } + else if (questTick++ > 3) + caster->ToPlayer()->KilledMonsterCredit(CREDIT_CANTER, 0); + break; + case 3: + // Four or more clicks to maintains speed, less to decrease + if (stack < 5) + { + caster->CastSpell(caster, SPELL_CANTER, true); + privateLevel--; + questTick = 0; + } + else if (questTick++ > 3) + caster->ToPlayer()->KilledMonsterCredit(CREDIT_GALLOP, 0); break; - } - // just walking, fatiuge handling - if (Aura* aur = caster->GetAura(SPELL_RAM_FATIGUE)) - aur->ModStackAmount(-4); - break; - case 1: - // One click to maintain speed, more to increase - if (stack < 2) - { - caster->RemoveAurasDueToSpell(SPELL_TROT); - questTick = 0; - privateLevel--; - mode = 2; // apply - } - else if (stack > 2) - { - questTick = 0; - caster->CastSpell(caster, SPELL_CANTER, true); - privateLevel++; - } - else if (questTick++ > 3) - caster->ToPlayer()->KilledMonsterCredit(CREDIT_TROT, 0); - break; - case 2: - // Two - three clicks to maintains speed, less to decrease, more to increase - if (stack < 3) - { - caster->CastSpell(caster, SPELL_TROT, true); - privateLevel--; - questTick = 0; - } - else if (stack > 4) - { - caster->CastSpell(caster, SPELL_GALLOP, true); - privateLevel++; - questTick = 0; - } - else if (questTick++ > 3) - caster->ToPlayer()->KilledMonsterCredit(CREDIT_CANTER, 0); - break; - case 3: - // Four or more clicks to maintains speed, less to decrease - if (stack < 5) - { - caster->CastSpell(caster, SPELL_CANTER, true); - privateLevel--; - questTick = 0; - } - else if (questTick++ > 3) - caster->ToPlayer()->KilledMonsterCredit(CREDIT_GALLOP, 0); - break; } // Set to base amount @@ -1311,15 +1311,15 @@ public: int8 fatigue = 0; switch (aurEff->GetId()) { - case SPELL_TROT: - fatigue = -2; - break; - case SPELL_CANTER: - fatigue = 1; - break; - case SPELL_GALLOP: - fatigue = 5; - break; + case SPELL_TROT: + fatigue = -2; + break; + case SPELL_CANTER: + fatigue = 1; + break; + case SPELL_GALLOP: + fatigue = 5; + break; } if (Unit* target = GetTarget()) { @@ -1458,11 +1458,11 @@ public: { case GREEN_EMPTY_KEG: case BLUE_EMPTY_KEG: - item = itemCaster->GetEntry()+urand(1,5); // 5 items, id in range empty+1-5 + item = itemCaster->GetEntry() + urand(1, 5); // 5 items, id in range empty+1-5 break; case YELLOW_EMPTY_KEG: - if (uint8 num = urand(0,4)) - item = 32916+num; + if (uint8 num = urand(0, 4)) + item = 32916 + num; else item = 32915; break; @@ -1570,8 +1570,8 @@ public: { if (Unit* caster = GetCaster()) { - float z = caster->GetMap()->GetHeight(caster->GetPositionX()+14*cos(caster->GetOrientation()), caster->GetPositionY()+14*sin(caster->GetOrientation()), MAX_HEIGHT); - WorldLocation pPosition = WorldLocation(caster->GetMapId(), caster->GetPositionX()+14*cos(caster->GetOrientation()), caster->GetPositionY()+14*sin(caster->GetOrientation()), z, caster->GetOrientation()); + float z = caster->GetMap()->GetHeight(caster->GetPositionX() + 14 * cos(caster->GetOrientation()), caster->GetPositionY() + 14 * sin(caster->GetOrientation()), MAX_HEIGHT); + WorldLocation pPosition = WorldLocation(caster->GetMapId(), caster->GetPositionX() + 14 * cos(caster->GetOrientation()), caster->GetPositionY() + 14 * sin(caster->GetOrientation()), z, caster->GetOrientation()); SetExplTargetDest(pPosition); } @@ -1606,7 +1606,7 @@ public: if (!GetCaster() || target->GetGUID() == GetCaster()->GetGUID()) return; - WorldLocation pPosition = WorldLocation(target->GetMapId(), target->GetPositionX(), target->GetPositionY(), target->GetPositionZ()+4.0f, target->GetOrientation()); + WorldLocation pPosition = WorldLocation(target->GetMapId(), target->GetPositionX(), target->GetPositionY(), target->GetPositionZ() + 4.0f, target->GetOrientation()); SetExplTargetDest(pPosition); } } @@ -1725,7 +1725,7 @@ public: if (stacksMe >= stacksTarget) { if (Aura* aura = me->GetAura(SPELL_BUBBLE_BUILD_UP)) - aura->ModStackAmount(stacksTarget+1); + aura->ModStackAmount(stacksTarget + 1); else me->AddAura(SPELL_BUBBLE_BUILD_UP, me); diff --git a/src/server/scripts/Events/childrens_week.cpp b/src/server/scripts/Events/childrens_week.cpp index c8a7709d0..37a8e57d0 100644 --- a/src/server/scripts/Events/childrens_week.cpp +++ b/src/server/scripts/Events/childrens_week.cpp @@ -134,97 +134,97 @@ uint64 getOrphanGUID(Player* player, uint32 orphan) ######*/ class npc_winterfin_playmate : public CreatureScript { - public: - npc_winterfin_playmate() : CreatureScript("npc_winterfin_playmate") {} +public: + npc_winterfin_playmate() : CreatureScript("npc_winterfin_playmate") {} - struct npc_winterfin_playmateAI : public ScriptedAI + struct npc_winterfin_playmateAI : public ScriptedAI + { + npc_winterfin_playmateAI(Creature* creature) : ScriptedAI(creature) {} + + void Reset() { - npc_winterfin_playmateAI(Creature* creature) : ScriptedAI(creature) {} + timer = 0; + phase = 0; + playerGUID = 0; + orphanGUID = 0; + } - void Reset() - { - timer = 0; - phase = 0; - playerGUID = 0; - orphanGUID = 0; - } - - void MoveInLineOfSight(Unit* who) - { - if (!phase && who && who->GetDistance2d(me) < 10.0f) - if (Player* player = who->ToPlayer()) - if (player->GetQuestStatus(QUEST_PLAYMATE_ORACLE) == QUEST_STATUS_INCOMPLETE) - { - playerGUID = player->GetGUID(); - orphanGUID = getOrphanGUID(player, ORPHAN_ORACLE); - if (orphanGUID) - phase = 1; - } - } - - void UpdateAI(uint32 diff) - { - if (!phase) - return; - - if (timer <= diff) - { - Player* player = ObjectAccessor::GetPlayer(*me, playerGUID); - Creature* orphan = ObjectAccessor::GetCreature(*me, orphanGUID); - - if (!orphan || !player) + void MoveInLineOfSight(Unit* who) + { + if (!phase && who && who->GetDistance2d(me) < 10.0f) + if (Player* player = who->ToPlayer()) + if (player->GetQuestStatus(QUEST_PLAYMATE_ORACLE) == QUEST_STATUS_INCOMPLETE) { + playerGUID = player->GetGUID(); + orphanGUID = getOrphanGUID(player, ORPHAN_ORACLE); + if (orphanGUID) + phase = 1; + } + } + + void UpdateAI(uint32 diff) + { + if (!phase) + return; + + if (timer <= diff) + { + Player* player = ObjectAccessor::GetPlayer(*me, playerGUID); + Creature* orphan = ObjectAccessor::GetCreature(*me, orphanGUID); + + if (!orphan || !player) + { + Reset(); + return; + } + + switch (phase) + { + case 1: + orphan->GetMotionMaster()->MovePoint(0, me->GetPositionX() + cos(me->GetOrientation()) * 5, me->GetPositionY() + sin(me->GetOrientation()) * 5, me->GetPositionZ()); + orphan->AI()->Talk(TEXT_ORACLE_ORPHAN_1); + timer = 3000; + break; + case 2: + orphan->SetFacingToObject(me); + Talk(TEXT_WINTERFIN_PLAYMATE_1); + me->HandleEmoteCommand(EMOTE_STATE_DANCE); + timer = 3000; + break; + case 3: + orphan->AI()->Talk(TEXT_ORACLE_ORPHAN_2); + timer = 3000; + break; + case 4: + Talk(TEXT_WINTERFIN_PLAYMATE_2); + timer = 5000; + break; + case 5: + orphan->AI()->Talk(TEXT_ORACLE_ORPHAN_3); + me->HandleEmoteCommand(EMOTE_STATE_NONE); + player->GroupEventHappens(QUEST_PLAYMATE_ORACLE, me); + orphan->GetMotionMaster()->MoveFollow(player, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); Reset(); return; - } - - switch (phase) - { - case 1: - orphan->GetMotionMaster()->MovePoint(0, me->GetPositionX() + cos(me->GetOrientation()) * 5, me->GetPositionY() + sin(me->GetOrientation()) * 5, me->GetPositionZ()); - orphan->AI()->Talk(TEXT_ORACLE_ORPHAN_1); - timer = 3000; - break; - case 2: - orphan->SetFacingToObject(me); - Talk(TEXT_WINTERFIN_PLAYMATE_1); - me->HandleEmoteCommand(EMOTE_STATE_DANCE); - timer = 3000; - break; - case 3: - orphan->AI()->Talk(TEXT_ORACLE_ORPHAN_2); - timer = 3000; - break; - case 4: - Talk(TEXT_WINTERFIN_PLAYMATE_2); - timer = 5000; - break; - case 5: - orphan->AI()->Talk(TEXT_ORACLE_ORPHAN_3); - me->HandleEmoteCommand(EMOTE_STATE_NONE); - player->GroupEventHappens(QUEST_PLAYMATE_ORACLE, me); - orphan->GetMotionMaster()->MoveFollow(player, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); - Reset(); - return; - } - ++phase; } - else - timer -= diff; + ++phase; } - - private: - uint32 timer; - int8 phase; - uint64 playerGUID; - uint64 orphanGUID; - - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_winterfin_playmateAI(creature); + else + timer -= diff; } + + private: + uint32 timer; + int8 phase; + uint64 playerGUID; + uint64 orphanGUID; + + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_winterfin_playmateAI(creature); + } }; /*###### @@ -232,96 +232,96 @@ class npc_winterfin_playmate : public CreatureScript ######*/ class npc_snowfall_glade_playmate : public CreatureScript { - public: - npc_snowfall_glade_playmate() : CreatureScript("npc_snowfall_glade_playmate") {} +public: + npc_snowfall_glade_playmate() : CreatureScript("npc_snowfall_glade_playmate") {} - struct npc_snowfall_glade_playmateAI : public ScriptedAI + struct npc_snowfall_glade_playmateAI : public ScriptedAI + { + npc_snowfall_glade_playmateAI(Creature* creature) : ScriptedAI(creature) {} + + void Reset() { - npc_snowfall_glade_playmateAI(Creature* creature) : ScriptedAI(creature) {} + timer = 0; + phase = 0; + playerGUID = 0; + orphanGUID = 0; + } - void Reset() - { - timer = 0; - phase = 0; - playerGUID = 0; - orphanGUID = 0; - } - - void MoveInLineOfSight(Unit* who) - { - if (!phase && who && who->GetDistance2d(me) < 10.0f) - if (Player* player = who->ToPlayer()) - if (player->GetQuestStatus(QUEST_PLAYMATE_WOLVAR) == QUEST_STATUS_INCOMPLETE) - { - playerGUID = player->GetGUID(); - orphanGUID = getOrphanGUID(player, ORPHAN_WOLVAR); - if (orphanGUID) - phase = 1; - } - } - - void UpdateAI(uint32 diff) - { - if (!phase) - return; - - if (timer <= diff) - { - Player* player = ObjectAccessor::GetPlayer(*me, playerGUID); - Creature* orphan = ObjectAccessor::GetCreature(*me, orphanGUID); - - if (!orphan || !player) + void MoveInLineOfSight(Unit* who) + { + if (!phase && who && who->GetDistance2d(me) < 10.0f) + if (Player* player = who->ToPlayer()) + if (player->GetQuestStatus(QUEST_PLAYMATE_WOLVAR) == QUEST_STATUS_INCOMPLETE) { + playerGUID = player->GetGUID(); + orphanGUID = getOrphanGUID(player, ORPHAN_WOLVAR); + if (orphanGUID) + phase = 1; + } + } + + void UpdateAI(uint32 diff) + { + if (!phase) + return; + + if (timer <= diff) + { + Player* player = ObjectAccessor::GetPlayer(*me, playerGUID); + Creature* orphan = ObjectAccessor::GetCreature(*me, orphanGUID); + + if (!orphan || !player) + { + Reset(); + return; + } + + switch (phase) + { + case 1: + orphan->GetMotionMaster()->MovePoint(0, me->GetPositionX() + cos(me->GetOrientation()) * 5, me->GetPositionY() + sin(me->GetOrientation()) * 5, me->GetPositionZ()); + orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_1); + timer = 5000; + break; + case 2: + orphan->SetFacingToObject(me); + Talk(TEXT_SNOWFALL_GLADE_PLAYMATE_1); + DoCast(orphan, SPELL_SNOWBALL); + timer = 5000; + break; + case 3: + Talk(TEXT_SNOWFALL_GLADE_PLAYMATE_2); + timer = 5000; + break; + case 4: + orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_2); + orphan->AI()->DoCast(me, SPELL_SNOWBALL); + timer = 5000; + break; + case 5: + orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_3); + player->GroupEventHappens(QUEST_PLAYMATE_WOLVAR, me); + orphan->GetMotionMaster()->MoveFollow(player, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); Reset(); return; - } - - switch (phase) - { - case 1: - orphan->GetMotionMaster()->MovePoint(0, me->GetPositionX() + cos(me->GetOrientation()) * 5, me->GetPositionY() + sin(me->GetOrientation()) * 5, me->GetPositionZ()); - orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_1); - timer = 5000; - break; - case 2: - orphan->SetFacingToObject(me); - Talk(TEXT_SNOWFALL_GLADE_PLAYMATE_1); - DoCast(orphan, SPELL_SNOWBALL); - timer = 5000; - break; - case 3: - Talk(TEXT_SNOWFALL_GLADE_PLAYMATE_2); - timer = 5000; - break; - case 4: - orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_2); - orphan->AI()->DoCast(me, SPELL_SNOWBALL); - timer = 5000; - break; - case 5: - orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_3); - player->GroupEventHappens(QUEST_PLAYMATE_WOLVAR, me); - orphan->GetMotionMaster()->MoveFollow(player, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); - Reset(); - return; - } - ++phase; } - else - timer -= diff; + ++phase; } - - private: - uint32 timer; - int8 phase; - uint64 playerGUID; - uint64 orphanGUID; - }; - - CreatureAI* GetAI(Creature* pCreature) const - { - return new npc_snowfall_glade_playmateAI(pCreature); + else + timer -= diff; } + + private: + uint32 timer; + int8 phase; + uint64 playerGUID; + uint64 orphanGUID; + }; + + CreatureAI* GetAI(Creature* pCreature) const + { + return new npc_snowfall_glade_playmateAI(pCreature); + } }; /*###### @@ -329,88 +329,88 @@ class npc_snowfall_glade_playmate : public CreatureScript ######*/ class npc_the_biggest_tree : public CreatureScript { - public: - npc_the_biggest_tree() : CreatureScript("npc_the_biggest_tree") {} +public: + npc_the_biggest_tree() : CreatureScript("npc_the_biggest_tree") {} - struct npc_the_biggest_treeAI : public ScriptedAI + struct npc_the_biggest_treeAI : public ScriptedAI + { + npc_the_biggest_treeAI(Creature* creature) : ScriptedAI(creature) { - npc_the_biggest_treeAI(Creature* creature) : ScriptedAI(creature) - { - me->SetDisplayId(DISPLAY_INVISIBLE); - } + me->SetDisplayId(DISPLAY_INVISIBLE); + } - void Reset() - { - timer = 1000; - phase = 0; - playerGUID = 0; - orphanGUID = 0; - } + void Reset() + { + timer = 1000; + phase = 0; + playerGUID = 0; + orphanGUID = 0; + } - void MoveInLineOfSight(Unit* who) - { - if (!phase && who && who->GetDistance2d(me) < 10.0f) - if (Player* player = who->ToPlayer()) - if (player->GetQuestStatus(QUEST_THE_BIGGEST_TREE_EVER) == QUEST_STATUS_INCOMPLETE) - { - playerGUID = player->GetGUID(); - orphanGUID = getOrphanGUID(player, ORPHAN_ORACLE); - if (orphanGUID) - phase = 1; - } - } - - void UpdateAI(uint32 diff) - { - if (!phase) - return; - - if (timer <= diff) - { - Player* player = ObjectAccessor::GetPlayer(*me, playerGUID); - Creature* orphan = ObjectAccessor::GetCreature(*me, orphanGUID); - - if (!orphan || !player) + void MoveInLineOfSight(Unit* who) + { + if (!phase && who && who->GetDistance2d(me) < 10.0f) + if (Player* player = who->ToPlayer()) + if (player->GetQuestStatus(QUEST_THE_BIGGEST_TREE_EVER) == QUEST_STATUS_INCOMPLETE) { + playerGUID = player->GetGUID(); + orphanGUID = getOrphanGUID(player, ORPHAN_ORACLE); + if (orphanGUID) + phase = 1; + } + } + + void UpdateAI(uint32 diff) + { + if (!phase) + return; + + if (timer <= diff) + { + Player* player = ObjectAccessor::GetPlayer(*me, playerGUID); + Creature* orphan = ObjectAccessor::GetCreature(*me, orphanGUID); + + if (!orphan || !player) + { + Reset(); + return; + } + + switch (phase) + { + case 1: + orphan->GetMotionMaster()->MovePoint(0, me->GetPositionX() + cos(me->GetOrientation()) * 5, me->GetPositionY() + sin(me->GetOrientation()) * 5, me->GetPositionZ()); + timer = 2000; + break; + case 2: + orphan->SetFacingToObject(me); + orphan->AI()->Talk(TEXT_ORACLE_ORPHAN_4); + timer = 5000; + break; + case 3: + player->GroupEventHappens(QUEST_THE_BIGGEST_TREE_EVER, me); + orphan->GetMotionMaster()->MoveFollow(player, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); Reset(); return; - } - - switch (phase) - { - case 1: - orphan->GetMotionMaster()->MovePoint(0, me->GetPositionX() + cos(me->GetOrientation()) * 5, me->GetPositionY() + sin(me->GetOrientation()) * 5, me->GetPositionZ()); - timer = 2000; - break; - case 2: - orphan->SetFacingToObject(me); - orphan->AI()->Talk(TEXT_ORACLE_ORPHAN_4); - timer = 5000; - break; - case 3: - player->GroupEventHappens(QUEST_THE_BIGGEST_TREE_EVER, me); - orphan->GetMotionMaster()->MoveFollow(player, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); - Reset(); - return; - } - ++phase; } - else - timer -= diff; + ++phase; } - - private: - uint32 timer; - uint8 phase; - uint64 playerGUID; - uint64 orphanGUID; - - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_the_biggest_treeAI(creature); + else + timer -= diff; } + + private: + uint32 timer; + uint8 phase; + uint64 playerGUID; + uint64 orphanGUID; + + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_the_biggest_treeAI(creature); + } }; /*###### @@ -418,87 +418,87 @@ class npc_the_biggest_tree : public CreatureScript ######*/ class npc_high_oracle_soo_roo : public CreatureScript { - public: - npc_high_oracle_soo_roo() : CreatureScript("npc_high_oracle_soo_roo") {} +public: + npc_high_oracle_soo_roo() : CreatureScript("npc_high_oracle_soo_roo") {} - struct npc_high_oracle_soo_rooAI : public ScriptedAI + struct npc_high_oracle_soo_rooAI : public ScriptedAI + { + npc_high_oracle_soo_rooAI(Creature* creature) : ScriptedAI(creature) {} + + void Reset() { - npc_high_oracle_soo_rooAI(Creature* creature) : ScriptedAI(creature) {} + timer = 0; + phase = 0; + playerGUID = 0; + orphanGUID = 0; + } - void Reset() - { - timer = 0; - phase = 0; - playerGUID = 0; - orphanGUID = 0; - } - - void MoveInLineOfSight(Unit* who) - { - if (!phase && who && who->GetDistance2d(me) < 10.0f) - if (Player* player = who->ToPlayer()) - if (player->GetQuestStatus(QUEST_THE_BRONZE_DRAGONSHRINE_ORACLE) == QUEST_STATUS_INCOMPLETE) - { - playerGUID = player->GetGUID(); - orphanGUID = getOrphanGUID(player, ORPHAN_ORACLE); - if (orphanGUID) - phase = 1; - } - } - - void UpdateAI(uint32 diff) - { - if (!phase) - return; - - if (timer <= diff) - { - Player* player = ObjectAccessor::GetPlayer(*me, playerGUID); - Creature* orphan = ObjectAccessor::GetCreature(*me, orphanGUID); - - if (!orphan || !player) + void MoveInLineOfSight(Unit* who) + { + if (!phase && who && who->GetDistance2d(me) < 10.0f) + if (Player* player = who->ToPlayer()) + if (player->GetQuestStatus(QUEST_THE_BRONZE_DRAGONSHRINE_ORACLE) == QUEST_STATUS_INCOMPLETE) { + playerGUID = player->GetGUID(); + orphanGUID = getOrphanGUID(player, ORPHAN_ORACLE); + if (orphanGUID) + phase = 1; + } + } + + void UpdateAI(uint32 diff) + { + if (!phase) + return; + + if (timer <= diff) + { + Player* player = ObjectAccessor::GetPlayer(*me, playerGUID); + Creature* orphan = ObjectAccessor::GetCreature(*me, orphanGUID); + + if (!orphan || !player) + { + Reset(); + return; + } + + switch (phase) + { + case 1: + orphan->GetMotionMaster()->MovePoint(0, me->GetPositionX() + cos(me->GetOrientation()) * 5, me->GetPositionY() + sin(me->GetOrientation()) * 5, me->GetPositionZ()); + orphan->AI()->Talk(TEXT_ORACLE_ORPHAN_5); + timer = 3000; + break; + case 2: + orphan->SetFacingToObject(me); + Talk(TEXT_SOO_ROO_1); + timer = 6000; + break; + case 3: + orphan->AI()->Talk(TEXT_ORACLE_ORPHAN_6); + player->GroupEventHappens(QUEST_THE_BRONZE_DRAGONSHRINE_ORACLE, me); + orphan->GetMotionMaster()->MoveFollow(player, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); Reset(); return; - } - - switch (phase) - { - case 1: - orphan->GetMotionMaster()->MovePoint(0, me->GetPositionX() + cos(me->GetOrientation()) * 5, me->GetPositionY() + sin(me->GetOrientation()) * 5, me->GetPositionZ()); - orphan->AI()->Talk(TEXT_ORACLE_ORPHAN_5); - timer = 3000; - break; - case 2: - orphan->SetFacingToObject(me); - Talk(TEXT_SOO_ROO_1); - timer = 6000; - break; - case 3: - orphan->AI()->Talk(TEXT_ORACLE_ORPHAN_6); - player->GroupEventHappens(QUEST_THE_BRONZE_DRAGONSHRINE_ORACLE, me); - orphan->GetMotionMaster()->MoveFollow(player, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); - Reset(); - return; - } - ++phase; } - else - timer -= diff; + ++phase; } - - private: - uint32 timer; - int8 phase; - uint64 playerGUID; - uint64 orphanGUID; - - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_high_oracle_soo_rooAI(creature); + else + timer -= diff; } + + private: + uint32 timer; + int8 phase; + uint64 playerGUID; + uint64 orphanGUID; + + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_high_oracle_soo_rooAI(creature); + } }; /*###### @@ -506,86 +506,86 @@ class npc_high_oracle_soo_roo : public CreatureScript ######*/ class npc_elder_kekek : public CreatureScript { - public: - npc_elder_kekek() : CreatureScript("npc_elder_kekek") {} +public: + npc_elder_kekek() : CreatureScript("npc_elder_kekek") {} - struct npc_elder_kekekAI : public ScriptedAI + struct npc_elder_kekekAI : public ScriptedAI + { + npc_elder_kekekAI(Creature* creature) : ScriptedAI(creature) {} + + void Reset() { - npc_elder_kekekAI(Creature* creature) : ScriptedAI(creature) {} + timer = 0; + phase = 0; + playerGUID = 0; + orphanGUID = 0; + } - void Reset() - { - timer = 0; - phase = 0; - playerGUID = 0; - orphanGUID = 0; - } - - void MoveInLineOfSight(Unit* who) - { - if (!phase && who && who->GetDistance2d(me) < 10.0f) - if (Player* player = who->ToPlayer()) - if (player->GetQuestStatus(QUEST_THE_BRONZE_DRAGONSHRINE_WOLVAR) == QUEST_STATUS_INCOMPLETE) - { - playerGUID = player->GetGUID(); - orphanGUID = getOrphanGUID(player, ORPHAN_WOLVAR); - if (orphanGUID) - phase = 1; - } - } - - void UpdateAI(uint32 diff) - { - if (!phase) - return; - - if (timer <= diff) - { - Player* player = ObjectAccessor::GetPlayer(*me, playerGUID); - Creature* orphan = ObjectAccessor::GetCreature(*me, orphanGUID); - - if (!player || !orphan) + void MoveInLineOfSight(Unit* who) + { + if (!phase && who && who->GetDistance2d(me) < 10.0f) + if (Player* player = who->ToPlayer()) + if (player->GetQuestStatus(QUEST_THE_BRONZE_DRAGONSHRINE_WOLVAR) == QUEST_STATUS_INCOMPLETE) { + playerGUID = player->GetGUID(); + orphanGUID = getOrphanGUID(player, ORPHAN_WOLVAR); + if (orphanGUID) + phase = 1; + } + } + + void UpdateAI(uint32 diff) + { + if (!phase) + return; + + if (timer <= diff) + { + Player* player = ObjectAccessor::GetPlayer(*me, playerGUID); + Creature* orphan = ObjectAccessor::GetCreature(*me, orphanGUID); + + if (!player || !orphan) + { + Reset(); + return; + } + + switch (phase) + { + case 1: + orphan->GetMotionMaster()->MovePoint(0, me->GetPositionX() + cos(me->GetOrientation()) * 5, me->GetPositionY() + sin(me->GetOrientation()) * 5, me->GetPositionZ()); + orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_4); + timer = 3000; + break; + case 2: + Talk(TEXT_ELDER_KEKEK_1); + timer = 6000; + break; + case 3: + orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_5); + player->GroupEventHappens(QUEST_THE_BRONZE_DRAGONSHRINE_WOLVAR, me); + orphan->GetMotionMaster()->MoveFollow(player, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); Reset(); return; - } - - switch (phase) - { - case 1: - orphan->GetMotionMaster()->MovePoint(0, me->GetPositionX() + cos(me->GetOrientation()) * 5, me->GetPositionY() + sin(me->GetOrientation()) * 5, me->GetPositionZ()); - orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_4); - timer = 3000; - break; - case 2: - Talk(TEXT_ELDER_KEKEK_1); - timer = 6000; - break; - case 3: - orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_5); - player->GroupEventHappens(QUEST_THE_BRONZE_DRAGONSHRINE_WOLVAR, me); - orphan->GetMotionMaster()->MoveFollow(player, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); - Reset(); - return; - } - ++phase; } - else - timer -= diff; + ++phase; } - - private: - uint32 timer; - int8 phase; - uint64 playerGUID; - uint64 orphanGUID; - - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_elder_kekekAI(creature); + else + timer -= diff; } + + private: + uint32 timer; + int8 phase; + uint64 playerGUID; + uint64 orphanGUID; + + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_elder_kekekAI(creature); + } }; /*###### @@ -594,94 +594,94 @@ class npc_elder_kekek : public CreatureScript ######*/ class npc_the_etymidian : public CreatureScript { - public: - npc_the_etymidian() : CreatureScript("npc_the_etymidian") {} +public: + npc_the_etymidian() : CreatureScript("npc_the_etymidian") {} - struct npc_the_etymidianAI : public ScriptedAI + struct npc_the_etymidianAI : public ScriptedAI + { + npc_the_etymidianAI(Creature* creature) : ScriptedAI(creature) {} + + void Reset() { - npc_the_etymidianAI(Creature* creature) : ScriptedAI(creature) {} + timer = 0; + phase = 0; + playerGUID = 0; + orphanGUID = 0; + } - void Reset() - { - timer = 0; - phase = 0; - playerGUID = 0; - orphanGUID = 0; - } - - void MoveInLineOfSight(Unit* who) - { - if (!phase && who && who->GetDistance2d(me) < 10.0f) - if (Player* player = who->ToPlayer()) - if (player->GetQuestStatus(QUEST_MEETING_A_GREAT_ONE) == QUEST_STATUS_INCOMPLETE) - { - playerGUID = player->GetGUID(); - orphanGUID = getOrphanGUID(player, ORPHAN_ORACLE); - if (orphanGUID) - phase = 1; - } - } - - void UpdateAI(uint32 diff) - { - if (!phase) - return; - - if (timer <= diff) - { - Player* player = ObjectAccessor::GetPlayer(*me, playerGUID); - Creature* orphan = ObjectAccessor::GetCreature(*me, orphanGUID); - - if (!orphan || !player) + void MoveInLineOfSight(Unit* who) + { + if (!phase && who && who->GetDistance2d(me) < 10.0f) + if (Player* player = who->ToPlayer()) + if (player->GetQuestStatus(QUEST_MEETING_A_GREAT_ONE) == QUEST_STATUS_INCOMPLETE) { + playerGUID = player->GetGUID(); + orphanGUID = getOrphanGUID(player, ORPHAN_ORACLE); + if (orphanGUID) + phase = 1; + } + } + + void UpdateAI(uint32 diff) + { + if (!phase) + return; + + if (timer <= diff) + { + Player* player = ObjectAccessor::GetPlayer(*me, playerGUID); + Creature* orphan = ObjectAccessor::GetCreature(*me, orphanGUID); + + if (!orphan || !player) + { + Reset(); + return; + } + + switch (phase) + { + case 1: + orphan->GetMotionMaster()->MovePoint(0, me->GetPositionX() + cos(me->GetOrientation()) * 5, me->GetPositionY() + sin(me->GetOrientation()) * 5, me->GetPositionZ()); + orphan->AI()->Talk(TEXT_ORACLE_ORPHAN_7); + timer = 5000; + break; + case 2: + orphan->SetFacingToObject(me); + orphan->AI()->Talk(TEXT_ORACLE_ORPHAN_8); + timer = 5000; + break; + case 3: + orphan->AI()->Talk(TEXT_ORACLE_ORPHAN_9); + timer = 5000; + break; + case 4: + orphan->AI()->Talk(TEXT_ORACLE_ORPHAN_10); + timer = 5000; + break; + case 5: + orphan->GetMotionMaster()->MoveFollow(player, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); + player->GroupEventHappens(QUEST_MEETING_A_GREAT_ONE, me); Reset(); return; - } - - switch (phase) - { - case 1: - orphan->GetMotionMaster()->MovePoint(0, me->GetPositionX() + cos(me->GetOrientation()) * 5, me->GetPositionY() + sin(me->GetOrientation()) * 5, me->GetPositionZ()); - orphan->AI()->Talk(TEXT_ORACLE_ORPHAN_7); - timer = 5000; - break; - case 2: - orphan->SetFacingToObject(me); - orphan->AI()->Talk(TEXT_ORACLE_ORPHAN_8); - timer = 5000; - break; - case 3: - orphan->AI()->Talk(TEXT_ORACLE_ORPHAN_9); - timer = 5000; - break; - case 4: - orphan->AI()->Talk(TEXT_ORACLE_ORPHAN_10); - timer = 5000; - break; - case 5: - orphan->GetMotionMaster()->MoveFollow(player, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); - player->GroupEventHappens(QUEST_MEETING_A_GREAT_ONE, me); - Reset(); - return; - } - ++phase; } - else - timer -= diff; + ++phase; } - - private: - uint32 timer; - int8 phase; - uint64 playerGUID; - uint64 orphanGUID; - - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_the_etymidianAI(creature); + else + timer -= diff; } + + private: + uint32 timer; + int8 phase; + uint64 playerGUID; + uint64 orphanGUID; + + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_the_etymidianAI(creature); + } }; /*###### @@ -689,159 +689,159 @@ class npc_the_etymidian : public CreatureScript ######*/ class npc_alexstraza_the_lifebinder : public CreatureScript { - public: - npc_alexstraza_the_lifebinder() : CreatureScript("npc_alexstraza_the_lifebinder") {} +public: + npc_alexstraza_the_lifebinder() : CreatureScript("npc_alexstraza_the_lifebinder") {} - struct npc_alexstraza_the_lifebinderAI : public ScriptedAI + struct npc_alexstraza_the_lifebinderAI : public ScriptedAI + { + npc_alexstraza_the_lifebinderAI(Creature* creature) : ScriptedAI(creature) {} + + void Reset() { - npc_alexstraza_the_lifebinderAI(Creature* creature) : ScriptedAI(creature) {} + timer = 0; + phase = 0; + playerGUID = 0; + orphanGUID = 0; + } - void Reset() + void SetData(uint32 type, uint32 data) + { + // Existing SmartAI + if (type == 0) { - timer = 0; - phase = 0; - playerGUID = 0; - orphanGUID = 0; - } - - void SetData(uint32 type, uint32 data) - { - // Existing SmartAI - if (type == 0) + switch (data) { - switch (data) - { - case 1: - me->SetOrientation(1.6049f); - break; - case 2: - me->SetOrientation(me->GetHomePosition().GetOrientation()); - break; - } + case 1: + me->SetOrientation(1.6049f); + break; + case 2: + me->SetOrientation(me->GetHomePosition().GetOrientation()); + break; } } + } - void MoveInLineOfSight(Unit* who) - { - if (!phase && who && who->GetDistance2d(me) < 10.0f) - if (Player* player = who->ToPlayer()) - { - if (player->GetQuestStatus(QUEST_THE_DRAGON_QUEEN_ORACLE) == QUEST_STATUS_INCOMPLETE) - { - playerGUID = player->GetGUID(); - orphanGUID = getOrphanGUID(player, ORPHAN_ORACLE); - if (orphanGUID) - phase = 1; - } - else if (player->GetQuestStatus(QUEST_THE_DRAGON_QUEEN_WOLVAR) == QUEST_STATUS_INCOMPLETE) - { - playerGUID = player->GetGUID(); - orphanGUID = getOrphanGUID(player, ORPHAN_WOLVAR); - if (orphanGUID) - phase = 7; - } - } - } - - void UpdateAI(uint32 diff) - { - if (!phase) - return; - - if (timer <= diff) + void MoveInLineOfSight(Unit* who) + { + if (!phase && who && who->GetDistance2d(me) < 10.0f) + if (Player* player = who->ToPlayer()) { - Player* player = ObjectAccessor::GetPlayer(*me, playerGUID); - Creature* orphan = ObjectAccessor::GetCreature(*me, orphanGUID); - - if (!orphan || !player) + if (player->GetQuestStatus(QUEST_THE_DRAGON_QUEEN_ORACLE) == QUEST_STATUS_INCOMPLETE) { + playerGUID = player->GetGUID(); + orphanGUID = getOrphanGUID(player, ORPHAN_ORACLE); + if (orphanGUID) + phase = 1; + } + else if (player->GetQuestStatus(QUEST_THE_DRAGON_QUEEN_WOLVAR) == QUEST_STATUS_INCOMPLETE) + { + playerGUID = player->GetGUID(); + orphanGUID = getOrphanGUID(player, ORPHAN_WOLVAR); + if (orphanGUID) + phase = 7; + } + } + } + + void UpdateAI(uint32 diff) + { + if (!phase) + return; + + if (timer <= diff) + { + Player* player = ObjectAccessor::GetPlayer(*me, playerGUID); + Creature* orphan = ObjectAccessor::GetCreature(*me, orphanGUID); + + if (!orphan || !player) + { + Reset(); + return; + } + + switch (phase) + { + case 1: + orphan->GetMotionMaster()->MovePoint(0, me->GetPositionX() + cos(me->GetOrientation()) * 5, me->GetPositionY() + sin(me->GetOrientation()) * 5, me->GetPositionZ()); + orphan->AI()->Talk(TEXT_ORACLE_ORPHAN_11); + timer = 5000; + break; + case 2: + orphan->SetFacingToObject(me); + orphan->AI()->Talk(TEXT_ORACLE_ORPHAN_12); + timer = 5000; + break; + case 3: + orphan->AI()->Talk(TEXT_ORACLE_ORPHAN_13); + timer = 5000; + break; + case 4: + Talk(TEXT_ALEXSTRASZA_2); + me->SetStandState(UNIT_STAND_STATE_KNEEL); + me->SetFacingToObject(orphan); + timer = 5000; + break; + case 5: + orphan->AI()->Talk(TEXT_ORACLE_ORPHAN_14); + timer = 5000; + break; + case 6: + me->SetStandState(UNIT_STAND_STATE_STAND); + me->SetOrientation(me->GetHomePosition().GetOrientation()); + player->GroupEventHappens(QUEST_THE_DRAGON_QUEEN_ORACLE, me); + orphan->GetMotionMaster()->MoveFollow(player, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); + Reset(); + return; + case 7: + orphan->GetMotionMaster()->MovePoint(0, me->GetPositionX() + cos(me->GetOrientation()) * 5, me->GetPositionY() + sin(me->GetOrientation()) * 5, me->GetPositionZ()); + orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_11); + timer = 5000; + break; + case 8: + if (Creature* krasus = me->FindNearestCreature(NPC_KRASUS, 10.0f)) + { + orphan->SetFacingToObject(krasus); + krasus->AI()->Talk(TEXT_KRASUS_8); + } + timer = 5000; + break; + case 9: + orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_12); + timer = 5000; + break; + case 10: + orphan->SetFacingToObject(me); + Talk(TEXT_ALEXSTRASZA_2); + timer = 5000; + break; + case 11: + orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_13); + timer = 5000; + break; + case 12: + player->GroupEventHappens(QUEST_THE_DRAGON_QUEEN_WOLVAR, me); + orphan->GetMotionMaster()->MoveFollow(player, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); Reset(); return; - } - - switch (phase) - { - case 1: - orphan->GetMotionMaster()->MovePoint(0, me->GetPositionX() + cos(me->GetOrientation()) * 5, me->GetPositionY() + sin(me->GetOrientation()) * 5, me->GetPositionZ()); - orphan->AI()->Talk(TEXT_ORACLE_ORPHAN_11); - timer = 5000; - break; - case 2: - orphan->SetFacingToObject(me); - orphan->AI()->Talk(TEXT_ORACLE_ORPHAN_12); - timer = 5000; - break; - case 3: - orphan->AI()->Talk(TEXT_ORACLE_ORPHAN_13); - timer = 5000; - break; - case 4: - Talk(TEXT_ALEXSTRASZA_2); - me->SetStandState(UNIT_STAND_STATE_KNEEL); - me->SetFacingToObject(orphan); - timer = 5000; - break; - case 5: - orphan->AI()->Talk(TEXT_ORACLE_ORPHAN_14); - timer = 5000; - break; - case 6: - me->SetStandState(UNIT_STAND_STATE_STAND); - me->SetOrientation(me->GetHomePosition().GetOrientation()); - player->GroupEventHappens(QUEST_THE_DRAGON_QUEEN_ORACLE, me); - orphan->GetMotionMaster()->MoveFollow(player, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); - Reset(); - return; - case 7: - orphan->GetMotionMaster()->MovePoint(0, me->GetPositionX() + cos(me->GetOrientation()) * 5, me->GetPositionY() + sin(me->GetOrientation()) * 5, me->GetPositionZ()); - orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_11); - timer = 5000; - break; - case 8: - if (Creature* krasus = me->FindNearestCreature(NPC_KRASUS, 10.0f)) - { - orphan->SetFacingToObject(krasus); - krasus->AI()->Talk(TEXT_KRASUS_8); - } - timer = 5000; - break; - case 9: - orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_12); - timer = 5000; - break; - case 10: - orphan->SetFacingToObject(me); - Talk(TEXT_ALEXSTRASZA_2); - timer = 5000; - break; - case 11: - orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_13); - timer = 5000; - break; - case 12: - player->GroupEventHappens(QUEST_THE_DRAGON_QUEEN_WOLVAR, me); - orphan->GetMotionMaster()->MoveFollow(player, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); - Reset(); - return; - } - ++phase; } - else - timer -= diff; + ++phase; } - - private: - int8 phase; - uint32 timer; - uint64 playerGUID; - uint64 orphanGUID; - - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_alexstraza_the_lifebinderAI(creature); + else + timer -= diff; } + + private: + int8 phase; + uint32 timer; + uint64 playerGUID; + uint64 orphanGUID; + + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_alexstraza_the_lifebinderAI(creature); + } }; /*###### @@ -850,54 +850,54 @@ class npc_alexstraza_the_lifebinder : public CreatureScript class at_bring_your_orphan_to : public AreaTriggerScript { - public: - at_bring_your_orphan_to() : AreaTriggerScript("at_bring_your_orphan_to") { } +public: + at_bring_your_orphan_to() : AreaTriggerScript("at_bring_your_orphan_to") { } - bool OnTrigger(Player* player, AreaTrigger const* trigger) + bool OnTrigger(Player* player, AreaTrigger const* trigger) + { + if (player->isDead() || !player->HasAura(SPELL_ORPHAN_OUT)) + return false; + + uint32 questId = 0; + uint32 orphanId = 0; + + switch (trigger->entry) { - if (player->isDead() || !player->HasAura(SPELL_ORPHAN_OUT)) - return false; - - uint32 questId = 0; - uint32 orphanId = 0; - - switch (trigger->entry) - { - case AT_DOWN_AT_THE_DOCKS: - questId = QUEST_DOWN_AT_THE_DOCKS; - orphanId = ORPHAN_ORCISH; - break; - case AT_GATEWAY_TO_THE_FRONTIER: - questId = QUEST_GATEWAY_TO_THE_FRONTIER; - orphanId = ORPHAN_ORCISH; - break; - case AT_LORDAERON_THRONE_ROOM: - questId = QUEST_LORDAERON_THRONE_ROOM; - orphanId = ORPHAN_ORCISH; - break; - case AT_BOUGHT_OF_ETERNALS: - questId = QUEST_BOUGHT_OF_ETERNALS; - orphanId = ORPHAN_HUMAN; - break; - case AT_SPOOKY_LIGHTHOUSE: - questId = QUEST_SPOOKY_LIGHTHOUSE; - orphanId = ORPHAN_HUMAN; - break; - case AT_STONEWROUGHT_DAM: - questId = QUEST_STONEWROUGHT_DAM; - orphanId = ORPHAN_HUMAN; - break; - case AT_DARK_PORTAL: - questId = player->GetTeamId() == TEAM_ALLIANCE ? QUEST_DARK_PORTAL_A : QUEST_DARK_PORTAL_H; - orphanId = player->GetTeamId() == TEAM_ALLIANCE ? ORPHAN_DRAENEI : ORPHAN_BLOOD_ELF; - break; - } - - if (questId && orphanId && getOrphanGUID(player, orphanId) && player->GetQuestStatus(questId) == QUEST_STATUS_INCOMPLETE) - player->AreaExploredOrEventHappens(questId); - - return true; + case AT_DOWN_AT_THE_DOCKS: + questId = QUEST_DOWN_AT_THE_DOCKS; + orphanId = ORPHAN_ORCISH; + break; + case AT_GATEWAY_TO_THE_FRONTIER: + questId = QUEST_GATEWAY_TO_THE_FRONTIER; + orphanId = ORPHAN_ORCISH; + break; + case AT_LORDAERON_THRONE_ROOM: + questId = QUEST_LORDAERON_THRONE_ROOM; + orphanId = ORPHAN_ORCISH; + break; + case AT_BOUGHT_OF_ETERNALS: + questId = QUEST_BOUGHT_OF_ETERNALS; + orphanId = ORPHAN_HUMAN; + break; + case AT_SPOOKY_LIGHTHOUSE: + questId = QUEST_SPOOKY_LIGHTHOUSE; + orphanId = ORPHAN_HUMAN; + break; + case AT_STONEWROUGHT_DAM: + questId = QUEST_STONEWROUGHT_DAM; + orphanId = ORPHAN_HUMAN; + break; + case AT_DARK_PORTAL: + questId = player->GetTeamId() == TEAM_ALLIANCE ? QUEST_DARK_PORTAL_A : QUEST_DARK_PORTAL_H; + orphanId = player->GetTeamId() == TEAM_ALLIANCE ? ORPHAN_DRAENEI : ORPHAN_BLOOD_ELF; + break; } + + if (questId && orphanId && getOrphanGUID(player, orphanId) && player->GetQuestStatus(questId) == QUEST_STATUS_INCOMPLETE) + player->AreaExploredOrEventHappens(questId); + + return true; + } }; /*###### @@ -905,95 +905,95 @@ class at_bring_your_orphan_to : public AreaTriggerScript ######*/ class npc_cw_area_trigger : public CreatureScript { - public: - npc_cw_area_trigger() : CreatureScript("npc_cw_area_trigger") {} +public: + npc_cw_area_trigger() : CreatureScript("npc_cw_area_trigger") {} - struct npc_cw_area_triggerAI : public ScriptedAI + struct npc_cw_area_triggerAI : public ScriptedAI + { + npc_cw_area_triggerAI(Creature* creature) : ScriptedAI(creature) { - npc_cw_area_triggerAI(Creature* creature) : ScriptedAI(creature) - { - me->SetDisplayId(DISPLAY_INVISIBLE); - } - - void MoveInLineOfSight(Unit* who) - { - if (who && me->GetDistance2d(who) < 20.0f) - if (Player* player = who->ToPlayer()) - if (player->HasAura(SPELL_ORPHAN_OUT)) - { - uint32 questId = 0; - uint32 orphanId = 0; - switch (me->GetEntry()) - { - case NPC_CAVERNS_OF_TIME_CW_TRIGGER: - questId = player->GetTeamId() == TEAM_ALLIANCE ? QUEST_TIME_TO_VISIT_THE_CAVERNS_A : QUEST_TIME_TO_VISIT_THE_CAVERNS_H; - orphanId = player->GetTeamId() == TEAM_ALLIANCE ? ORPHAN_DRAENEI : ORPHAN_BLOOD_ELF; - break; - case NPC_EXODAR_01_CW_TRIGGER: - questId = QUEST_THE_SEAT_OF_THE_NARUU; - orphanId = ORPHAN_DRAENEI; - break; - case NPC_EXODAR_02_CW_TRIGGER: - questId = QUEST_CALL_ON_THE_FARSEER; - orphanId = ORPHAN_DRAENEI; - break; - case NPC_AERIS_LANDING_CW_TRIGGER: - questId = QUEST_JHEEL_IS_AT_AERIS_LANDING; - orphanId = ORPHAN_DRAENEI; - break; - case NPC_AUCHINDOUN_CW_TRIGGER: - questId = QUEST_AUCHINDOUN_AND_THE_RING; - orphanId = ORPHAN_DRAENEI; - break; - case NPC_SPOREGGAR_CW_TRIGGER: - questId = QUEST_HCHUU_AND_THE_MUSHROOM_PEOPLE; - orphanId = ORPHAN_BLOOD_ELF; - break; - case NPC_THRONE_OF_ELEMENTS_CW_TRIGGER: - questId = QUEST_VISIT_THE_THRONE_OF_ELEMENTS; - orphanId = ORPHAN_BLOOD_ELF; - break; - case NPC_SILVERMOON_01_CW_TRIGGER: - if (player->GetQuestStatus(QUEST_NOW_WHEN_I_GROW_UP) == QUEST_STATUS_INCOMPLETE && getOrphanGUID(player, ORPHAN_BLOOD_ELF)) - { - player->AreaExploredOrEventHappens(QUEST_NOW_WHEN_I_GROW_UP); - if (player->GetQuestStatus(QUEST_NOW_WHEN_I_GROW_UP) == QUEST_STATUS_COMPLETE) - if (Creature* samuro = me->FindNearestCreature(25151, 20.0f)) - { - uint32 emote = 0; - switch (urand(1, 5)) - { - case 1: - emote = EMOTE_ONESHOT_WAVE; - break; - case 2: - emote = EMOTE_ONESHOT_ROAR; - break; - case 3: - emote = EMOTE_ONESHOT_FLEX; - break; - case 4: - emote = EMOTE_ONESHOT_SALUTE; - break; - case 5: - emote = EMOTE_ONESHOT_DANCE; - break; - } - samuro->HandleEmoteCommand(emote); - } - } - break; - } - if (questId && orphanId && getOrphanGUID(player, orphanId) && player->GetQuestStatus(questId) == QUEST_STATUS_INCOMPLETE) - player->AreaExploredOrEventHappens(questId); - } - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_cw_area_triggerAI(creature); + me->SetDisplayId(DISPLAY_INVISIBLE); } + + void MoveInLineOfSight(Unit* who) + { + if (who && me->GetDistance2d(who) < 20.0f) + if (Player* player = who->ToPlayer()) + if (player->HasAura(SPELL_ORPHAN_OUT)) + { + uint32 questId = 0; + uint32 orphanId = 0; + switch (me->GetEntry()) + { + case NPC_CAVERNS_OF_TIME_CW_TRIGGER: + questId = player->GetTeamId() == TEAM_ALLIANCE ? QUEST_TIME_TO_VISIT_THE_CAVERNS_A : QUEST_TIME_TO_VISIT_THE_CAVERNS_H; + orphanId = player->GetTeamId() == TEAM_ALLIANCE ? ORPHAN_DRAENEI : ORPHAN_BLOOD_ELF; + break; + case NPC_EXODAR_01_CW_TRIGGER: + questId = QUEST_THE_SEAT_OF_THE_NARUU; + orphanId = ORPHAN_DRAENEI; + break; + case NPC_EXODAR_02_CW_TRIGGER: + questId = QUEST_CALL_ON_THE_FARSEER; + orphanId = ORPHAN_DRAENEI; + break; + case NPC_AERIS_LANDING_CW_TRIGGER: + questId = QUEST_JHEEL_IS_AT_AERIS_LANDING; + orphanId = ORPHAN_DRAENEI; + break; + case NPC_AUCHINDOUN_CW_TRIGGER: + questId = QUEST_AUCHINDOUN_AND_THE_RING; + orphanId = ORPHAN_DRAENEI; + break; + case NPC_SPOREGGAR_CW_TRIGGER: + questId = QUEST_HCHUU_AND_THE_MUSHROOM_PEOPLE; + orphanId = ORPHAN_BLOOD_ELF; + break; + case NPC_THRONE_OF_ELEMENTS_CW_TRIGGER: + questId = QUEST_VISIT_THE_THRONE_OF_ELEMENTS; + orphanId = ORPHAN_BLOOD_ELF; + break; + case NPC_SILVERMOON_01_CW_TRIGGER: + if (player->GetQuestStatus(QUEST_NOW_WHEN_I_GROW_UP) == QUEST_STATUS_INCOMPLETE && getOrphanGUID(player, ORPHAN_BLOOD_ELF)) + { + player->AreaExploredOrEventHappens(QUEST_NOW_WHEN_I_GROW_UP); + if (player->GetQuestStatus(QUEST_NOW_WHEN_I_GROW_UP) == QUEST_STATUS_COMPLETE) + if (Creature* samuro = me->FindNearestCreature(25151, 20.0f)) + { + uint32 emote = 0; + switch (urand(1, 5)) + { + case 1: + emote = EMOTE_ONESHOT_WAVE; + break; + case 2: + emote = EMOTE_ONESHOT_ROAR; + break; + case 3: + emote = EMOTE_ONESHOT_FLEX; + break; + case 4: + emote = EMOTE_ONESHOT_SALUTE; + break; + case 5: + emote = EMOTE_ONESHOT_DANCE; + break; + } + samuro->HandleEmoteCommand(emote); + } + } + break; + } + if (questId && orphanId && getOrphanGUID(player, orphanId) && player->GetQuestStatus(questId) == QUEST_STATUS_INCOMPLETE) + player->AreaExploredOrEventHappens(questId); + } + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_cw_area_triggerAI(creature); + } }; /*###### @@ -1001,33 +1001,33 @@ class npc_cw_area_trigger : public CreatureScript ######*/ class npc_grizzlemaw_cw_trigger : public CreatureScript { - public: - npc_grizzlemaw_cw_trigger() : CreatureScript("npc_grizzlemaw_cw_trigger") {} +public: + npc_grizzlemaw_cw_trigger() : CreatureScript("npc_grizzlemaw_cw_trigger") {} - struct npc_grizzlemaw_cw_triggerAI : public ScriptedAI + struct npc_grizzlemaw_cw_triggerAI : public ScriptedAI + { + npc_grizzlemaw_cw_triggerAI(Creature* creature) : ScriptedAI(creature) { - npc_grizzlemaw_cw_triggerAI(Creature* creature) : ScriptedAI(creature) - { - me->SetDisplayId(DISPLAY_INVISIBLE); - } - - void MoveInLineOfSight(Unit* who) - { - if (who && who->GetDistance2d(me) < 10.0f) - if (Player* player = who->ToPlayer()) - if (player->GetQuestStatus(QUEST_HOME_OF_THE_BEAR_MEN) == QUEST_STATUS_INCOMPLETE) - if (Creature* orphan = ObjectAccessor::GetCreature(*me, getOrphanGUID(player, ORPHAN_WOLVAR))) - { - player->AreaExploredOrEventHappens(QUEST_HOME_OF_THE_BEAR_MEN); - orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_10); - } - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_grizzlemaw_cw_triggerAI(creature); + me->SetDisplayId(DISPLAY_INVISIBLE); } + + void MoveInLineOfSight(Unit* who) + { + if (who && who->GetDistance2d(me) < 10.0f) + if (Player* player = who->ToPlayer()) + if (player->GetQuestStatus(QUEST_HOME_OF_THE_BEAR_MEN) == QUEST_STATUS_INCOMPLETE) + if (Creature* orphan = ObjectAccessor::GetCreature(*me, getOrphanGUID(player, ORPHAN_WOLVAR))) + { + player->AreaExploredOrEventHappens(QUEST_HOME_OF_THE_BEAR_MEN); + orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_10); + } + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_grizzlemaw_cw_triggerAI(creature); + } }; void AddSC_event_childrens_week() diff --git a/src/server/scripts/Events/hallows_end.cpp b/src/server/scripts/Events/hallows_end.cpp index eb7a09c55..2e5b19a72 100644 --- a/src/server/scripts/Events/hallows_end.cpp +++ b/src/server/scripts/Events/hallows_end.cpp @@ -33,7 +33,7 @@ enum eTrickSpells class spell_hallows_end_trick : public SpellScriptLoader { - public: +public: spell_hallows_end_trick() : SpellScriptLoader("spell_hallows_end_trick") {} class spell_hallows_end_trick_SpellScript : public SpellScript @@ -91,12 +91,12 @@ class spell_hallows_end_trick : public SpellScriptLoader class spell_hallows_end_put_costume : public SpellScriptLoader { - public: +public: spell_hallows_end_put_costume(const char* name, uint32 maleSpell, uint32 femaleSpell) : SpellScriptLoader(name), _maleSpell(maleSpell), _femaleSpell(femaleSpell) {} class spell_hallows_end_put_costume_SpellScript : public SpellScript { - public: + public: spell_hallows_end_put_costume_SpellScript(uint32 maleSpell, uint32 femaleSpell) : _maleSpell(maleSpell), _femaleSpell(femaleSpell) { } PrepareSpellScript(spell_hallows_end_put_costume_SpellScript); @@ -112,9 +112,9 @@ class spell_hallows_end_put_costume : public SpellScriptLoader OnEffectHitTarget += SpellEffectFn(spell_hallows_end_put_costume_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } - private: - uint32 _maleSpell; - uint32 _femaleSpell; + private: + uint32 _maleSpell; + uint32 _femaleSpell; }; SpellScript* GetSpellScript() const @@ -122,9 +122,9 @@ class spell_hallows_end_put_costume : public SpellScriptLoader return new spell_hallows_end_put_costume_SpellScript(_maleSpell, _femaleSpell); } - private: - uint32 _maleSpell; - uint32 _femaleSpell; +private: + uint32 _maleSpell; + uint32 _femaleSpell; }; // 24751 Trick or Treat @@ -137,7 +137,7 @@ enum eTrickOrTreatSpells class spell_hallows_end_trick_or_treat : public SpellScriptLoader { - public: +public: spell_hallows_end_trick_or_treat() : SpellScriptLoader("spell_hallows_end_trick_or_treat") {} class spell_hallows_end_trick_or_treat_SpellScript : public SpellScript @@ -175,7 +175,7 @@ enum eHallowsEndCandy class spell_hallows_end_candy : public SpellScriptLoader { - public: +public: spell_hallows_end_candy() : SpellScriptLoader("spell_hallows_end_candy") {} class spell_hallows_end_candy_SpellScript : public SpellScript @@ -186,7 +186,7 @@ class spell_hallows_end_candy : public SpellScriptLoader { if (Player* target = GetHitPlayer()) { - uint32 spellId = SPELL_HALLOWS_END_CANDY_1+urand(0,3); + uint32 spellId = SPELL_HALLOWS_END_CANDY_1 + urand(0, 3); GetCaster()->CastSpell(target, spellId, true, nullptr); } } @@ -210,7 +210,7 @@ enum trickyTreat class spell_hallows_end_tricky_treat : public SpellScriptLoader { - public: +public: spell_hallows_end_tricky_treat() : SpellScriptLoader("spell_hallows_end_tricky_treat") {} class spell_hallows_end_tricky_treat_SpellScript : public SpellScript @@ -272,7 +272,7 @@ enum costumedOrphan class spell_hallows_end_bucket_lands : public SpellScriptLoader { - public: +public: spell_hallows_end_bucket_lands() : SpellScriptLoader("spell_hallows_end_bucket_lands") {} class spell_hallows_end_bucket_lands_SpellScript : public SpellScript @@ -307,7 +307,7 @@ class spell_hallows_end_bucket_lands : public SpellScriptLoader class spell_hallows_end_base_fire : public SpellScriptLoader { - public: +public: spell_hallows_end_base_fire() : SpellScriptLoader("spell_hallows_end_base_fire") { } class spell_hallows_end_base_fire_AuraScript : public AuraScript @@ -321,15 +321,15 @@ class spell_hallows_end_base_fire : public SpellScriptLoader if (amount < 3) amount++; - else if (aurEff->GetTickNumber()%3 != 2) + else if (aurEff->GetTickNumber() % 3 != 2) return; aurEff->SetAmount(amount); if (Unit* owner = GetUnitOwner()) { if (amount <= 3) - owner->SetObjectScale(amount/2.0f); - if (amount >=3) + owner->SetObjectScale(amount / 2.0f); + if (amount >= 3) owner->CastSpell(owner, SPELL_SPREAD_FIRE, true); } } @@ -362,7 +362,7 @@ public: struct npc_costumed_orphan_matronAI : public ScriptedAI { - npc_costumed_orphan_matronAI(Creature *c) : ScriptedAI(c) + npc_costumed_orphan_matronAI(Creature* c) : ScriptedAI(c) { } @@ -377,27 +377,51 @@ public: horseGUID = 0; } - void GetInitXYZ(float &x, float &y, float &z, float &o, uint32 &path) + void GetInitXYZ(float& x, float& y, float& z, float& o, uint32& path) { switch (me->GetAreaId()) { case 87: // Goldshire - x = -9494.4f; y = 48.53f; z = 70.5f; o = 0.5f; path = 235431; + x = -9494.4f; + y = 48.53f; + z = 70.5f; + o = 0.5f; + path = 235431; break; case 131: // Kharanos - x = -5558.34f; y = -499.46f; z = 414.12f; o = 2.08f; path = 235432; + x = -5558.34f; + y = -499.46f; + z = 414.12f; + o = 2.08f; + path = 235432; break; case 3576: // Azure Watch - x = -4163.58f; y = -12460.30f; z = 63.02f; o = 4.31f; path = 235433; + x = -4163.58f; + y = -12460.30f; + z = 63.02f; + o = 4.31f; + path = 235433; break; case 362: // Razor Hill - x = 373.2f; y = -4723.4f; z = 31.2f; o = 3.2f; path = 235434; + x = 373.2f; + y = -4723.4f; + z = 31.2f; + o = 3.2f; + path = 235434; break; case 159: // Brill - x = 2195.2f; y = 264.0f; z = 55.62f; o = 0.15f; path = 235435; + x = 2195.2f; + y = 264.0f; + z = 55.62f; + o = 0.15f; + path = 235435; break; case 3665: // Falcon Wing Square - x = 9547.91f; y = -6809.9f; z = 27.96f; o = 3.4f; path = 235436; + x = 9547.91f; + y = -6809.9f; + z = 27.96f; + o = 3.4f; + path = 235436; break; } } @@ -433,7 +457,7 @@ public: if (eventStarted) { eventStarted += diff; - if (eventStarted >= 5*MINUTE*IN_MILLISECONDS) + if (eventStarted >= 5 * MINUTE * IN_MILLISECONDS) { allowQuest = false; eventStarted = 0; @@ -447,7 +471,7 @@ public: QuestRelationBounds pObjectQR = sObjectMgr->GetCreatureQuestRelationBounds(creature->GetEntry()); QuestRelationBounds pObjectQIR = sObjectMgr->GetCreatureQuestInvolvedRelationBounds(creature->GetEntry()); - QuestMenu &qm = player->PlayerTalkClass->GetQuestMenu(); + QuestMenu& qm = player->PlayerTalkClass->GetQuestMenu(); qm.ClearMenu(); for (QuestRelations::const_iterator i = pObjectQIR.first; i != pObjectQIR.second; ++i) @@ -510,138 +534,166 @@ public: class npc_soh_fire_trigger : public CreatureScript { - public: - npc_soh_fire_trigger() : CreatureScript("npc_soh_fire_trigger") { } +public: + npc_soh_fire_trigger() : CreatureScript("npc_soh_fire_trigger") { } - struct npc_soh_fire_triggerAI : public NullCreatureAI + struct npc_soh_fire_triggerAI : public NullCreatureAI + { + npc_soh_fire_triggerAI(Creature* creature) : NullCreatureAI(creature) { - npc_soh_fire_triggerAI(Creature* creature) : NullCreatureAI(creature) - { - } - - void Reset() - { - me->SetDisableGravity(true); - } - - void SpellHit(Unit* /*caster*/, const SpellInfo* spellInfo) - { - if (spellInfo->Id == SPELL_START_FIRE) - { - me->CastSpell(me, SPELL_FIRE_AURA_BASE, true); - if (AuraEffect* aurEff = me->GetAuraEffect(SPELL_FIRE_AURA_BASE, EFFECT_0)) - { - me->SetObjectScale(1.5f); - aurEff->SetAmount(2); - } - } - else if (spellInfo->Id == SPELL_SPREAD_FIRE) - { - me->CastSpell(me, SPELL_FIRE_AURA_BASE, true); - } - else if (spellInfo->Id == SPELL_WATER_SPLASH) - { - if (AuraEffect* aurEff = me->GetAuraEffect(SPELL_FIRE_AURA_BASE, EFFECT_0)) - { - int32 amt = aurEff->GetAmount(); - if (amt > 2) - { - aurEff->ResetPeriodic(true); - aurEff->SetAmount(amt-2); - } - else - me->RemoveAllAuras(); - } - } - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_soh_fire_triggerAI(creature); } + + void Reset() + { + me->SetDisableGravity(true); + } + + void SpellHit(Unit* /*caster*/, const SpellInfo* spellInfo) + { + if (spellInfo->Id == SPELL_START_FIRE) + { + me->CastSpell(me, SPELL_FIRE_AURA_BASE, true); + if (AuraEffect* aurEff = me->GetAuraEffect(SPELL_FIRE_AURA_BASE, EFFECT_0)) + { + me->SetObjectScale(1.5f); + aurEff->SetAmount(2); + } + } + else if (spellInfo->Id == SPELL_SPREAD_FIRE) + { + me->CastSpell(me, SPELL_FIRE_AURA_BASE, true); + } + else if (spellInfo->Id == SPELL_WATER_SPLASH) + { + if (AuraEffect* aurEff = me->GetAuraEffect(SPELL_FIRE_AURA_BASE, EFFECT_0)) + { + int32 amt = aurEff->GetAmount(); + if (amt > 2) + { + aurEff->ResetPeriodic(true); + aurEff->SetAmount(amt - 2); + } + else + me->RemoveAllAuras(); + } + } + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_soh_fire_triggerAI(creature); + } }; class npc_hallows_end_soh : public CreatureScript { - public: - npc_hallows_end_soh() : CreatureScript("npc_hallows_end_soh") { } +public: + npc_hallows_end_soh() : CreatureScript("npc_hallows_end_soh") { } - struct npc_hallows_end_sohAI : public ScriptedAI + struct npc_hallows_end_sohAI : public ScriptedAI + { + npc_hallows_end_sohAI(Creature* creature) : ScriptedAI(creature) { - npc_hallows_end_sohAI(Creature* creature) : ScriptedAI(creature) + pos = 0; + counter = 0; + unitList.clear(); + me->CastSpell(me, SPELL_HORSEMAN_MOUNT, true); + me->SetSpeed(MOVE_WALK, 3.0f, true); + Unmount = false; + } + + bool Unmount; + EventMap events; + uint32 counter; + std::list unitList; + int32 pos; + void EnterCombat(Unit*) {} + void MoveInLineOfSight(Unit* /*who*/) {} + + void DoAction(int32 param) + { + pos = param; + } + + void GetPosToLand(float& x, float& y, float& z) + { + switch (pos) { - pos = 0; - counter = 0; - unitList.clear(); - me->CastSpell(me, SPELL_HORSEMAN_MOUNT, true); - me->SetSpeed(MOVE_WALK, 3.0f, true); - Unmount = false; + case 235431: + x = -9445.1f; + y = 63.27f; + z = 58.16f; + break; + case 235432: + x = -5616.30f; + y = -481.89f; + z = 398.99f; + break; + case 235433: + x = -4198.1f; + y = -12509.13f; + z = 46.6f; + break; + case 235434: + x = 360.9f; + y = -4735.5f; + z = 11.773f; + break; + case 235435: + x = 2229.4f; + y = 263.1f; + z = 36.13f; + break; + case 235436: + x = 9532.9f; + y = -6833.8f; + z = 18.5f; + break; + default: + x = 0; + y = 0; + z = 0; + break; } + } - bool Unmount; - EventMap events; - uint32 counter; - std::list unitList; - int32 pos; - void EnterCombat(Unit*) {} - void MoveInLineOfSight(Unit* /*who*/){} + void Reset() + { + unitList.clear(); + std::list temp; + me->GetCreaturesWithEntryInRange(temp, 100.0f, NPC_FIRE_TRIGGER); + for (std::list::const_iterator itr = temp.begin(); itr != temp.end(); ++itr) + unitList.push_back((*itr)->GetGUID()); - void DoAction(int32 param) + events.ScheduleEvent(1, 3000); + events.ScheduleEvent(2, 5000); + events.ScheduleEvent(2, 7000); + events.ScheduleEvent(2, 10000); + events.ScheduleEvent(3, 15000); + } + + void UpdateAI(uint32 diff) + { + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.GetEvent()) { - pos = param; - } - - void GetPosToLand(float &x, float &y, float &z) - { - switch (pos) - { - case 235431: x = -9445.1f; y = 63.27f; z = 58.16f; break; - case 235432: x = -5616.30f; y = -481.89f; z = 398.99f; break; - case 235433: x = -4198.1f; y = -12509.13f; z = 46.6f; break; - case 235434: x = 360.9f; y = -4735.5f; z = 11.773f; break; - case 235435: x = 2229.4f; y = 263.1f; z = 36.13f; break; - case 235436: x = 9532.9f; y = -6833.8f; z = 18.5f; break; - default: x = 0; y = 0; z = 0; break; - } - } - - void Reset() - { - unitList.clear(); - std::list temp; - me->GetCreaturesWithEntryInRange(temp, 100.0f, NPC_FIRE_TRIGGER); - for (std::list::const_iterator itr = temp.begin(); itr != temp.end(); ++itr) - unitList.push_back((*itr)->GetGUID()); - - events.ScheduleEvent(1, 3000); - events.ScheduleEvent(2, 5000); - events.ScheduleEvent(2, 7000); - events.ScheduleEvent(2, 10000); - events.ScheduleEvent(3, 15000); - } - - void UpdateAI(uint32 diff) - { - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.GetEvent()) - { - case 1: - me->MonsterYell("Prepare yourselves, the bells have tolled! Shelter your weak, your young and your old! Each of you shall pay the final sum! Cry for mercy; the reckoning has come!", LANG_UNIVERSAL, 0); - me->PlayDirectSound(11966); - events.PopEvent(); - break; - case 2: + case 1: + me->MonsterYell("Prepare yourselves, the bells have tolled! Shelter your weak, your young and your old! Each of you shall pay the final sum! Cry for mercy; the reckoning has come!", LANG_UNIVERSAL, 0); + me->PlayDirectSound(11966); + events.PopEvent(); + break; + case 2: { if (Unit* trigger = getTrigger()) me->CastSpell(trigger, SPELL_START_FIRE, true); events.PopEvent(); break; } - case 3: + case 3: { counter++; if (counter > 10) @@ -678,156 +730,156 @@ class npc_hallows_end_soh : public CreatureScript events.RepeatEvent(12000); break; } - } - - if (Unmount) - { - me->SetUInt32Value(UNIT_FIELD_FLAGS, 0); - me->RemoveAllAuras(); - me->Dismount(); - if (Unit* target = me->SelectNearestPlayer(30.0f)) - AttackStart(target); - } - if (me->IsMounted()) - return; - - if (!UpdateVictim()) - return; - - // cleave - if (!urand(0,29)) - me->CastSpell(me->GetVictim(), 15496, false); - - DoMeleeAttackIfReady(); } - Unit* getTrigger() + if (Unmount) { - std::list tmpList; + me->SetUInt32Value(UNIT_FIELD_FLAGS, 0); + me->RemoveAllAuras(); + me->Dismount(); + if (Unit* target = me->SelectNearestPlayer(30.0f)) + AttackStart(target); + } + if (me->IsMounted()) + return; + + if (!UpdateVictim()) + return; + + // cleave + if (!urand(0, 29)) + me->CastSpell(me->GetVictim(), 15496, false); + + DoMeleeAttackIfReady(); + } + + Unit* getTrigger() + { + std::list tmpList; + for (std::list::const_iterator itr = unitList.begin(); itr != unitList.end(); ++itr) + if (Unit* c = ObjectAccessor::GetUnit(*me, *itr)) + if (!c->HasAuraType(SPELL_AURA_PERIODIC_DUMMY)) + tmpList.push_back(c); + + if (tmpList.empty()) + return nullptr; + + std::list::const_iterator it2 = tmpList.begin(); + std::advance(it2, urand(0, tmpList.size() - 1)); + return (*it2); + } + + void FinishEvent(bool failed) + { + if (failed) + { + me->MonsterYell("Fire consumes! You've tried and failed. Let there be no doubt, justice prevailed!", LANG_UNIVERSAL, 0); + me->PlayDirectSound(11967); for (std::list::const_iterator itr = unitList.begin(); itr != unitList.end(); ++itr) if (Unit* c = ObjectAccessor::GetUnit(*me, *itr)) - if (!c->HasAuraType(SPELL_AURA_PERIODIC_DUMMY)) - tmpList.push_back(c); + c->RemoveAllAuras(); - if (tmpList.empty()) - return nullptr; - - std::list::const_iterator it2 = tmpList.begin(); - std::advance(it2, urand(0, tmpList.size() - 1)); - return (*it2); + me->DespawnOrUnsummon(1); } - - void FinishEvent(bool failed) + else { - if (failed) - { - me->MonsterYell("Fire consumes! You've tried and failed. Let there be no doubt, justice prevailed!", LANG_UNIVERSAL, 0); - me->PlayDirectSound(11967); - for (std::list::const_iterator itr = unitList.begin(); itr != unitList.end(); ++itr) - if (Unit* c = ObjectAccessor::GetUnit(*me, *itr)) - c->RemoveAllAuras(); - - me->DespawnOrUnsummon(1); - } - else - { - me->MonsterYell("My flames have died, left not a spark! I shall send you now to the lifeless dark!", LANG_UNIVERSAL, 0); - me->PlayDirectSound(11968); - float x, y, z; - GetPosToLand(x, y, z); - me->GetMotionMaster()->MovePoint(8, x, y, z); - } - } - - void MovementInform(uint32 type, uint32 point) - { - if (type == POINT_MOTION_TYPE && point == 8) - { - Unmount = true; - } - } - - void JustDied(Unit* /*killer*/) - { - me->MonsterYell("So eager you are, for my blood to spill. Yet to vanquish me, 'tis my head you must kill!", LANG_UNIVERSAL, 0); - me->PlayDirectSound(11969); + me->MonsterYell("My flames have died, left not a spark! I shall send you now to the lifeless dark!", LANG_UNIVERSAL, 0); + me->PlayDirectSound(11968); float x, y, z; GetPosToLand(x, y, z); - me->CastSpell(x, y, z, SPELL_SUMMON_LANTERN, true); - CompleteQuest(); + me->GetMotionMaster()->MovePoint(8, x, y, z); } - - void CompleteQuest() - { - float radius = 100.0f; - std::list players; - acore::AnyPlayerInObjectRangeCheck checker(me, radius); - acore::PlayerListSearcher searcher(me, players, checker); - me->VisitNearbyWorldObject(radius, searcher); - - for (std::list::const_iterator itr = players.begin(); itr != players.end(); ++itr) - { - (*itr)->AreaExploredOrEventHappens(QUEST_STOP_THE_FIRES_H); - (*itr)->AreaExploredOrEventHappens(QUEST_STOP_THE_FIRES_A); - (*itr)->AreaExploredOrEventHappens(QUEST_LET_THE_FIRES_COME_H); - (*itr)->AreaExploredOrEventHappens(QUEST_LET_THE_FIRES_COME_A); - } - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_hallows_end_sohAI(creature); } + + void MovementInform(uint32 type, uint32 point) + { + if (type == POINT_MOTION_TYPE && point == 8) + { + Unmount = true; + } + } + + void JustDied(Unit* /*killer*/) + { + me->MonsterYell("So eager you are, for my blood to spill. Yet to vanquish me, 'tis my head you must kill!", LANG_UNIVERSAL, 0); + me->PlayDirectSound(11969); + float x, y, z; + GetPosToLand(x, y, z); + me->CastSpell(x, y, z, SPELL_SUMMON_LANTERN, true); + CompleteQuest(); + } + + void CompleteQuest() + { + float radius = 100.0f; + std::list players; + acore::AnyPlayerInObjectRangeCheck checker(me, radius); + acore::PlayerListSearcher searcher(me, players, checker); + me->VisitNearbyWorldObject(radius, searcher); + + for (std::list::const_iterator itr = players.begin(); itr != players.end(); ++itr) + { + (*itr)->AreaExploredOrEventHappens(QUEST_STOP_THE_FIRES_H); + (*itr)->AreaExploredOrEventHappens(QUEST_STOP_THE_FIRES_A); + (*itr)->AreaExploredOrEventHappens(QUEST_LET_THE_FIRES_COME_H); + (*itr)->AreaExploredOrEventHappens(QUEST_LET_THE_FIRES_COME_A); + } + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_hallows_end_sohAI(creature); + } }; class npc_hallows_end_train_fire : public CreatureScript { - public: - npc_hallows_end_train_fire() : CreatureScript("npc_hallows_end_train_fire") { } +public: + npc_hallows_end_train_fire() : CreatureScript("npc_hallows_end_train_fire") { } - struct npc_hallows_end_train_fireAI : public NullCreatureAI + struct npc_hallows_end_train_fireAI : public NullCreatureAI + { + npc_hallows_end_train_fireAI(Creature* creature) : NullCreatureAI(creature) { - npc_hallows_end_train_fireAI(Creature* creature) : NullCreatureAI(creature) - { - } + } - uint32 timer; - void Reset() - { - timer = 0; - } + uint32 timer; + void Reset() + { + timer = 0; + } - void UpdateAI(uint32 diff) - { - timer += diff; - if (timer >= 5000) - if (!me->GetAuraEffect(SPELL_FIRE_AURA_BASE, EFFECT_0)) - me->CastSpell(me, SPELL_FIRE_AURA_BASE, true); - } + void UpdateAI(uint32 diff) + { + timer += diff; + if (timer >= 5000) + if (!me->GetAuraEffect(SPELL_FIRE_AURA_BASE, EFFECT_0)) + me->CastSpell(me, SPELL_FIRE_AURA_BASE, true); + } - void SpellHit(Unit* caster, const SpellInfo* spellInfo) + void SpellHit(Unit* caster, const SpellInfo* spellInfo) + { + if (spellInfo->Id == SPELL_WATER_SPLASH && caster->ToPlayer()) { - if (spellInfo->Id == SPELL_WATER_SPLASH && caster->ToPlayer()) + if (AuraEffect* aurEff = me->GetAuraEffect(SPELL_FIRE_AURA_BASE, EFFECT_0)) { - if (AuraEffect* aurEff = me->GetAuraEffect(SPELL_FIRE_AURA_BASE, EFFECT_0)) - { - int32 amt = aurEff->GetAmount(); - if (amt > 1) - aurEff->SetAmount(amt-1); - else - me->RemoveAllAuras(); + int32 amt = aurEff->GetAmount(); + if (amt > 1) + aurEff->SetAmount(amt - 1); + else + me->RemoveAllAuras(); - caster->ToPlayer()->KilledMonsterCredit(me->GetEntry(), 0); - } + caster->ToPlayer()->KilledMonsterCredit(me->GetEntry(), 0); } } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_hallows_end_train_fireAI(creature); } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_hallows_end_train_fireAI(creature); + } }; /////////////////////////////////////// @@ -895,165 +947,165 @@ enum hhSounds class boss_headless_horseman : public CreatureScript { - public: - boss_headless_horseman() : CreatureScript("boss_headless_horseman") { } +public: + boss_headless_horseman() : CreatureScript("boss_headless_horseman") { } - struct boss_headless_horsemanAI : public ScriptedAI + struct boss_headless_horsemanAI : public ScriptedAI + { + boss_headless_horsemanAI(Creature* creature) : ScriptedAI(creature), summons(me) { - boss_headless_horsemanAI(Creature* creature) : ScriptedAI(creature), summons(me) + } + + EventMap events; + SummonList summons; + uint64 playerGUID; + uint8 talkCount; + bool inFight; + uint8 phase; + uint32 health; + + void JustDied(Unit* /*killer*/) + { + summons.DespawnAll(); + me->MonsterSay("This end have I reached before. What new adventure lies in store?", LANG_UNIVERSAL, 0); + me->PlayDirectSound(SOUND_DEATH); + std::list unitList; + me->GetCreaturesWithEntryInRange(unitList, 100.0f, NPC_PUMPKIN_FIEND); + for (std::list::iterator itr = unitList.begin(); itr != unitList.end(); ++itr) + (*itr)->ToCreature()->DespawnOrUnsummon(500); + + + Map::PlayerList const& players = me->GetMap()->GetPlayers(); + if (!players.isEmpty() && players.begin()->GetSource() && players.begin()->GetSource()->GetGroup()) + sLFGMgr->FinishDungeon(players.begin()->GetSource()->GetGroup()->GetGUID(), 285, me->FindMap()); + } + + void KilledUnit(Unit* /*who*/) + { + me->MonsterYell("Your body lies beaten, battered and broken. Let my curse be your own, fate has spoken.", LANG_UNIVERSAL, 0); + me->PlayDirectSound(SOUND_SLAY); + } + + void DoAction(int32 param) + { + health = param; + } + + void SpellHitTarget(Unit* target, const SpellInfo* spellInfo) + { + if (spellInfo->Id == SPELL_SUMMONING_RHYME_TARGET) { + playerGUID = target->GetGUID(); + events.ScheduleEvent(EVENT_HH_PLAYER_TALK, 2000); } + } - EventMap events; - SummonList summons; - uint64 playerGUID; - uint8 talkCount; - bool inFight; - uint8 phase; - uint32 health; - - void JustDied(Unit* /*killer*/) + void SpellHit(Unit* /*caster*/, const SpellInfo* spellInfo) + { + if (spellInfo->Id == SPELL_THROW_HEAD_BACK) { - summons.DespawnAll(); - me->MonsterSay("This end have I reached before. What new adventure lies in store?", LANG_UNIVERSAL, 0); - me->PlayDirectSound(SOUND_DEATH); - std::list unitList; - me->GetCreaturesWithEntryInRange(unitList, 100.0f, NPC_PUMPKIN_FIEND); - for (std::list::iterator itr = unitList.begin(); itr != unitList.end(); ++itr) - (*itr)->ToCreature()->DespawnOrUnsummon(500); + me->SetHealth(me->GetMaxHealth()); + me->CastSpell(me, SPELL_HEAD_VISUAL, true); + me->RemoveAura(SPELL_HORSEMAN_IMMUNITY); + me->RemoveAura(SPELL_HORSEMAN_BODY_REGEN); + me->RemoveAura(SPELL_HORSEMAN_BODY_REGEN_CONFUSE); + me->RemoveAura(SPELL_HORSEMAN_WHIRLWIND); + events.CancelEvent(EVENT_HORSEMAN_CHECK_HEALTH); + events.CancelEvent(EVENT_HORSEMAN_WHIRLWIND); + events.CancelEvent(EVENT_HORSEMAN_CONFLAGRATION); + events.CancelEvent(EVENT_SUMMON_PUMPKIN); + me->MonsterYell("Here's my body, fit and pure! Now, your blackened souls I'll cure!", LANG_UNIVERSAL, 0); - - Map::PlayerList const& players = me->GetMap()->GetPlayers(); - if (!players.isEmpty() && players.begin()->GetSource() && players.begin()->GetSource()->GetGroup()) - sLFGMgr->FinishDungeon(players.begin()->GetSource()->GetGroup()->GetGUID(), 285, me->FindMap()); + if (phase == 1) + events.ScheduleEvent(EVENT_HORSEMAN_CONFLAGRATION, 6000); + else if (phase == 2) + events.ScheduleEvent(EVENT_SUMMON_PUMPKIN, 6000); } + } - void KilledUnit(Unit* /*who*/) + void MovementInform(uint32 type, uint32 point) + { + if (type == WAYPOINT_MOTION_TYPE) { - me->MonsterYell("Your body lies beaten, battered and broken. Let my curse be your own, fate has spoken.", LANG_UNIVERSAL, 0); - me->PlayDirectSound(SOUND_SLAY); - } - - void DoAction(int32 param) - { - health = param; - } - - void SpellHitTarget(Unit* target, const SpellInfo* spellInfo) - { - if (spellInfo->Id == SPELL_SUMMONING_RHYME_TARGET) - { - playerGUID = target->GetGUID(); - events.ScheduleEvent(EVENT_HH_PLAYER_TALK, 2000); - } - } - - void SpellHit(Unit* /*caster*/, const SpellInfo* spellInfo) - { - if (spellInfo->Id == SPELL_THROW_HEAD_BACK) - { - me->SetHealth(me->GetMaxHealth()); + if (point == 0) me->CastSpell(me, SPELL_HEAD_VISUAL, true); - me->RemoveAura(SPELL_HORSEMAN_IMMUNITY); - me->RemoveAura(SPELL_HORSEMAN_BODY_REGEN); - me->RemoveAura(SPELL_HORSEMAN_BODY_REGEN_CONFUSE); - me->RemoveAura(SPELL_HORSEMAN_WHIRLWIND); - events.CancelEvent(EVENT_HORSEMAN_CHECK_HEALTH); - events.CancelEvent(EVENT_HORSEMAN_WHIRLWIND); - events.CancelEvent(EVENT_HORSEMAN_CONFLAGRATION); - events.CancelEvent(EVENT_SUMMON_PUMPKIN); - me->MonsterYell("Here's my body, fit and pure! Now, your blackened souls I'll cure!", LANG_UNIVERSAL, 0); + else if (point == 11) + { + me->SetUInt32Value(UNIT_FIELD_FLAGS, 0); + me->StopMoving(); - if (phase == 1) - events.ScheduleEvent(EVENT_HORSEMAN_CONFLAGRATION, 6000); - else if (phase == 2) - events.ScheduleEvent(EVENT_SUMMON_PUMPKIN, 6000); + me->SetInCombatWithZone(); + inFight = true; + events.ScheduleEvent(EVENT_HORSEMAN_FOLLOW, 500); + events.ScheduleEvent(EVENT_HORSEMAN_CLEAVE, 7000); } } + } - void MovementInform(uint32 type, uint32 point) + Player* GetRhymePlayer() { return playerGUID ? ObjectAccessor::GetPlayer(*me, playerGUID) : nullptr; } + + void EnterCombat(Unit*) { me->SetInCombatWithZone(); } + void MoveInLineOfSight(Unit* /*who*/) {} + + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) + { + // We die... :( + if (damage >= me->GetHealth()) { - if (type == WAYPOINT_MOTION_TYPE) - { - if (point == 0) - me->CastSpell(me, SPELL_HEAD_VISUAL, true); - else if (point == 11) - { - me->SetUInt32Value(UNIT_FIELD_FLAGS, 0); - me->StopMoving(); + damage = 0; + me->RemoveAura(SPELL_HEAD_VISUAL); + me->CastSpell(me, SPELL_HORSEMAN_IMMUNITY, true); + me->CastSpell(me, SPELL_HORSEMAN_BODY_REGEN, true); + me->CastSpell(me, SPELL_HORSEMAN_BODY_REGEN_CONFUSE, true); + events.CancelEvent(EVENT_HORSEMAN_CLEAVE); - me->SetInCombatWithZone(); - inFight = true; - events.ScheduleEvent(EVENT_HORSEMAN_FOLLOW, 500); - events.ScheduleEvent(EVENT_HORSEMAN_CLEAVE, 7000); - } + // Summon Head + Position pos; + me->GetNearPosition(pos, 15.0f, rand_norm() * 2 * M_PI); + if (Creature* cr = me->SummonCreature(NPC_HORSEMAN_HEAD, pos)) + { + if (health) + cr->SetHealth(health); + + me->CastSpell(cr, SPELL_THROW_HEAD, true); + cr->CastSpell(cr, SPELL_HORSEMAN_BODY_PHASE + phase, true); + if (phase < 2) + phase++; + + events.ScheduleEvent(EVENT_HORSEMAN_WHIRLWIND, 6000); + events.ScheduleEvent(EVENT_HORSEMAN_CHECK_HEALTH, 1000); } } + } - Player* GetRhymePlayer() { return playerGUID ? ObjectAccessor::GetPlayer(*me, playerGUID) : nullptr; } + void JustSummoned(Creature* cr) { summons.Summon(cr); } - void EnterCombat(Unit*) { me->SetInCombatWithZone(); } - void MoveInLineOfSight(Unit* /*who*/) {} + void Reset() + { + events.Reset(); + summons.DespawnAll(); + playerGUID = 0; + talkCount = 0; + phase = 0; + inFight = false; + health = 0; - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask) + me->SetDisableGravity(true); + me->SetSpeed(MOVE_WALK, 5.0f, true); + } + + void UpdateAI(uint32 diff) + { + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + if (inFight && !UpdateVictim()) + return; + + switch (events.GetEvent()) { - // We die... :( - if (damage >= me->GetHealth()) - { - damage = 0; - me->RemoveAura(SPELL_HEAD_VISUAL); - me->CastSpell(me, SPELL_HORSEMAN_IMMUNITY, true); - me->CastSpell(me, SPELL_HORSEMAN_BODY_REGEN, true); - me->CastSpell(me, SPELL_HORSEMAN_BODY_REGEN_CONFUSE, true); - events.CancelEvent(EVENT_HORSEMAN_CLEAVE); - - // Summon Head - Position pos; - me->GetNearPosition(pos, 15.0f, rand_norm()*2*M_PI); - if (Creature* cr = me->SummonCreature(NPC_HORSEMAN_HEAD, pos)) - { - if (health) - cr->SetHealth(health); - - me->CastSpell(cr, SPELL_THROW_HEAD, true); - cr->CastSpell(cr, SPELL_HORSEMAN_BODY_PHASE+phase, true); - if (phase < 2) - phase++; - - events.ScheduleEvent(EVENT_HORSEMAN_WHIRLWIND, 6000); - events.ScheduleEvent(EVENT_HORSEMAN_CHECK_HEALTH, 1000); - } - } - } - - void JustSummoned(Creature* cr) { summons.Summon(cr); } - - void Reset() - { - events.Reset(); - summons.DespawnAll(); - playerGUID = 0; - talkCount = 0; - phase = 0; - inFight = false; - health = 0; - - me->SetDisableGravity(true); - me->SetSpeed(MOVE_WALK, 5.0f, true); - } - - void UpdateAI(uint32 diff) - { - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - if (inFight && !UpdateVictim()) - return; - - switch (events.GetEvent()) - { - case EVENT_HH_PLAYER_TALK: + case EVENT_HH_PLAYER_TALK: { talkCount++; Player* player = GetRhymePlayer(); @@ -1062,32 +1114,32 @@ class boss_headless_horseman : public CreatureScript switch (talkCount) { - case 1: - player->MonsterSay("Horseman rise...", LANG_UNIVERSAL, 0); - break; - case 2: - player->MonsterSay("Your time is nigh...", LANG_UNIVERSAL, 0); - if (Creature* trigger = me->SummonTrigger(1765.28f, 1347.46f, 17.5514f, 0.0f, 15*IN_MILLISECONDS)) - trigger->CastSpell(trigger, SPELL_EARTH_EXPLOSION, true); - break; - case 3: - me->GetMotionMaster()->MovePath(236820, false); - me->CastSpell(me, SPELL_SHAKE_CAMERA_SMALL, true); - player->MonsterSay("You felt death once...", LANG_UNIVERSAL, 0); - me->MonsterSay("It is over, your search is done. Let fate choose now, the righteous one.", LANG_UNIVERSAL, 0); - me->PlayDirectSound(SOUND_AGGRO); - break; - case 4: - me->CastSpell(me, SPELL_SHAKE_CAMERA_MEDIUM, true); - player->MonsterSay("Now, know demise!", LANG_UNIVERSAL, 0); - events.PopEvent(); - talkCount = 0; - return; // pop and return, skip repeat + case 1: + player->MonsterSay("Horseman rise...", LANG_UNIVERSAL, 0); + break; + case 2: + player->MonsterSay("Your time is nigh...", LANG_UNIVERSAL, 0); + if (Creature* trigger = me->SummonTrigger(1765.28f, 1347.46f, 17.5514f, 0.0f, 15 * IN_MILLISECONDS)) + trigger->CastSpell(trigger, SPELL_EARTH_EXPLOSION, true); + break; + case 3: + me->GetMotionMaster()->MovePath(236820, false); + me->CastSpell(me, SPELL_SHAKE_CAMERA_SMALL, true); + player->MonsterSay("You felt death once...", LANG_UNIVERSAL, 0); + me->MonsterSay("It is over, your search is done. Let fate choose now, the righteous one.", LANG_UNIVERSAL, 0); + me->PlayDirectSound(SOUND_AGGRO); + break; + case 4: + me->CastSpell(me, SPELL_SHAKE_CAMERA_MEDIUM, true); + player->MonsterSay("Now, know demise!", LANG_UNIVERSAL, 0); + events.PopEvent(); + talkCount = 0; + return; // pop and return, skip repeat } events.RepeatEvent(2000); break; } - case EVENT_HORSEMAN_FOLLOW: + case EVENT_HORSEMAN_FOLLOW: { if (Player* player = GetRhymePlayer()) { @@ -1098,13 +1150,13 @@ class boss_headless_horseman : public CreatureScript events.PopEvent(); break; } - case EVENT_HORSEMAN_CLEAVE: + case EVENT_HORSEMAN_CLEAVE: { me->CastSpell(me->GetVictim(), SPELL_HORSEMAN_CLEAVE, false); events.RepeatEvent(8000); break; } - case EVENT_HORSEMAN_WHIRLWIND: + case EVENT_HORSEMAN_WHIRLWIND: { if (me->HasAuraEffect(SPELL_HORSEMAN_WHIRLWIND, EFFECT_0)) { @@ -1116,7 +1168,7 @@ class boss_headless_horseman : public CreatureScript events.RepeatEvent(6000); break; } - case EVENT_HORSEMAN_CHECK_HEALTH: + case EVENT_HORSEMAN_CHECK_HEALTH: { if (me->GetHealth() == me->GetMaxHealth()) { @@ -1128,7 +1180,7 @@ class boss_headless_horseman : public CreatureScript events.RepeatEvent(1000); break; } - case EVENT_HORSEMAN_CONFLAGRATION: + case EVENT_HORSEMAN_CONFLAGRATION: { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) me->CastSpell(target, SPELL_HORSEMAN_CONFLAGRATION, false); @@ -1136,7 +1188,7 @@ class boss_headless_horseman : public CreatureScript events.RepeatEvent(12500); break; } - case EVENT_SUMMON_PUMPKIN: + case EVENT_SUMMON_PUMPKIN: { if (talkCount < 4) { @@ -1154,56 +1206,56 @@ class boss_headless_horseman : public CreatureScript break; } - } - - if (inFight) - DoMeleeAttackIfReady(); } - }; - CreatureAI* GetAI(Creature* creature) const - { - return new boss_headless_horsemanAI(creature); + if (inFight) + DoMeleeAttackIfReady(); } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_headless_horsemanAI(creature); + } }; class boss_headless_horseman_head : public CreatureScript { - public: - boss_headless_horseman_head() : CreatureScript("boss_headless_horseman_head") { } +public: + boss_headless_horseman_head() : CreatureScript("boss_headless_horseman_head") { } - struct boss_headless_horseman_headAI : public ScriptedAI + struct boss_headless_horseman_headAI : public ScriptedAI + { + boss_headless_horseman_headAI(Creature* creature) : ScriptedAI(creature) { - boss_headless_horseman_headAI(Creature* creature) : ScriptedAI(creature) + } + + uint8 pct; + uint32 timer; + bool handled; + + void SpellHitTarget(Unit* /*target*/, const SpellInfo* spellInfo) + { + if (spellInfo->Id == SPELL_THROW_HEAD_BACK) { + if (Unit* owner = GetOwner()) + owner->ToCreature()->AI()->DoAction(me->GetHealth()); + + me->DespawnOrUnsummon(); } + } - uint8 pct; - uint32 timer; - bool handled; - - void SpellHitTarget(Unit* /*target*/, const SpellInfo* spellInfo) + void SpellHit(Unit* caster, const SpellInfo* spellInfo) + { + switch (spellInfo->Id) { - if (spellInfo->Id == SPELL_THROW_HEAD_BACK) - { + case SPELL_BODY_RESTORED_INFO: + me->RemoveAllAuras(); if (Unit* owner = GetOwner()) - owner->ToCreature()->AI()->DoAction(me->GetHealth()); - - me->DespawnOrUnsummon(); - } - } - - void SpellHit(Unit* caster, const SpellInfo* spellInfo) - { - switch (spellInfo->Id) - { - case SPELL_BODY_RESTORED_INFO: - me->RemoveAllAuras(); - if (Unit* owner = GetOwner()) - owner->RemoveAura(SPELL_HORSEMAN_IMMUNITY); - me->CastSpell(caster, SPELL_THROW_HEAD_BACK, true); - break; - case SPELL_THROW_HEAD: + owner->RemoveAura(SPELL_HORSEMAN_IMMUNITY); + me->CastSpell(caster, SPELL_THROW_HEAD_BACK, true); + break; + case SPELL_THROW_HEAD: { me->CastSpell(me, SPELL_HEAD_VISUAL_LAND, true); if (Player* player = me->SelectNearestPlayer(50.0f)) @@ -1213,141 +1265,145 @@ class boss_headless_horseman_head : public CreatureScript timer = 26000; break; } - case SPELL_HORSEMAN_BODY_PHASE: - pct = 67; - break; - case SPELL_HORSEMAN_BODY_PHASE+1: - pct = 34; - break; - case SPELL_HORSEMAN_BODY_PHASE+2: - pct = 0; - break; - } + case SPELL_HORSEMAN_BODY_PHASE: + pct = 67; + break; + case SPELL_HORSEMAN_BODY_PHASE+1: + pct = 34; + break; + case SPELL_HORSEMAN_BODY_PHASE+2: + pct = 0; + break; } - - Unit* GetOwner() - { - if (me->ToTempSummon()) - return me->ToTempSummon()->GetSummoner(); - - return nullptr; - } - - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask) - { - // We die... :( - if (damage >= me->GetHealth()) - { - if (Unit* owner = GetOwner()) - { - owner->CastSpell(owner, SPELL_BURNING_BODY, true); - Unit::Kill(me, owner); - } - damage = 0; - me->DespawnOrUnsummon(); - return; - } - - if (me->HealthBelowPctDamaged(pct, damage) && !handled) - { - handled = true; - damage = 0; - me->RemoveAllAuras(); - me->CastSpell(me, SPELL_HEAD_DAMAGED_INFO, true); - me->CastSpell(me, SPELL_THROW_HEAD_BACK, true); - if (Unit* owner = GetOwner()) - owner->RemoveAura(SPELL_HORSEMAN_IMMUNITY); - } - } - - void Reset() - { - pct = 0; - timer = 0; - handled = false; - me->SetInCombatWithZone(); - } - - void UpdateAI(uint32 diff) - { - timer += diff; - if (timer >= 30000) - { - timer = urand(0, 15000); - uint32 sound = 11965; - switch (urand(0,2)) - { - case 1: sound = 11975; break; - case 2: sound = 11976; break; - } - - me->CastSpell(me, SPELL_HORSEMAN_SPEAKS, true); - me->MonsterTextEmote("Headless Horseman laughs", 0); - me->PlayDirectSound(sound); - } - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_headless_horseman_headAI(creature); } + + Unit* GetOwner() + { + if (me->ToTempSummon()) + return me->ToTempSummon()->GetSummoner(); + + return nullptr; + } + + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) + { + // We die... :( + if (damage >= me->GetHealth()) + { + if (Unit* owner = GetOwner()) + { + owner->CastSpell(owner, SPELL_BURNING_BODY, true); + Unit::Kill(me, owner); + } + damage = 0; + me->DespawnOrUnsummon(); + return; + } + + if (me->HealthBelowPctDamaged(pct, damage) && !handled) + { + handled = true; + damage = 0; + me->RemoveAllAuras(); + me->CastSpell(me, SPELL_HEAD_DAMAGED_INFO, true); + me->CastSpell(me, SPELL_THROW_HEAD_BACK, true); + if (Unit* owner = GetOwner()) + owner->RemoveAura(SPELL_HORSEMAN_IMMUNITY); + } + } + + void Reset() + { + pct = 0; + timer = 0; + handled = false; + me->SetInCombatWithZone(); + } + + void UpdateAI(uint32 diff) + { + timer += diff; + if (timer >= 30000) + { + timer = urand(0, 15000); + uint32 sound = 11965; + switch (urand(0, 2)) + { + case 1: + sound = 11975; + break; + case 2: + sound = 11976; + break; + } + + me->CastSpell(me, SPELL_HORSEMAN_SPEAKS, true); + me->MonsterTextEmote("Headless Horseman laughs", 0); + me->PlayDirectSound(sound); + } + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_headless_horseman_headAI(creature); + } }; class boss_headless_horseman_pumpkin : public CreatureScript { - public: - boss_headless_horseman_pumpkin() : CreatureScript("boss_headless_horseman_pumpkin") { } +public: + boss_headless_horseman_pumpkin() : CreatureScript("boss_headless_horseman_pumpkin") { } - struct boss_headless_horseman_pumpkinAI : public ScriptedAI + struct boss_headless_horseman_pumpkinAI : public ScriptedAI + { + boss_headless_horseman_pumpkinAI(Creature* creature) : ScriptedAI(creature) { - boss_headless_horseman_pumpkinAI(Creature* creature) : ScriptedAI(creature) - { - } - - uint32 timer; - - void AttackStart(Unit* ) { } - void MoveInLineOfSight(Unit* ) { } - - void Reset() - { - if (Player* player = me->SelectNearestPlayer(3.0f)) - me->CastSpell(player, SPELL_SQUASH_SOUL, true); - timer = 1; - me->CastSpell(me, SPELL_PUMPKIN_AURA, true); - me->CastSpell(me, SPELL_PUMPKIN_VISUAL, true); - } - - void SpellHit(Unit* /*caster*/, const SpellInfo* spellInfo) - { - if (spellInfo->Id == SPELL_SPROUTING) - { - if (Creature* cr = me->SummonCreature(NPC_PUMPKIN_FIEND, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000)) - cr->SetInCombatWithZone(); - - me->DespawnOrUnsummon(); - } - } - - void UpdateAI(uint32 diff) - { - if (timer) - { - timer += diff; - if (timer >= 3000) - { - me->CastSpell(me, SPELL_SPROUTING, false); - timer = 0; - } - } - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_headless_horseman_pumpkinAI(creature); } + + uint32 timer; + + void AttackStart(Unit* ) { } + void MoveInLineOfSight(Unit* ) { } + + void Reset() + { + if (Player* player = me->SelectNearestPlayer(3.0f)) + me->CastSpell(player, SPELL_SQUASH_SOUL, true); + timer = 1; + me->CastSpell(me, SPELL_PUMPKIN_AURA, true); + me->CastSpell(me, SPELL_PUMPKIN_VISUAL, true); + } + + void SpellHit(Unit* /*caster*/, const SpellInfo* spellInfo) + { + if (spellInfo->Id == SPELL_SPROUTING) + { + if (Creature* cr = me->SummonCreature(NPC_PUMPKIN_FIEND, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000)) + cr->SetInCombatWithZone(); + + me->DespawnOrUnsummon(); + } + } + + void UpdateAI(uint32 diff) + { + if (timer) + { + timer += diff; + if (timer >= 3000) + { + me->CastSpell(me, SPELL_SPROUTING, false); + timer = 0; + } + } + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_headless_horseman_pumpkinAI(creature); + } }; class go_loosely_turned_soil : public GameObjectScript diff --git a/src/server/scripts/Events/love_in_air.cpp b/src/server/scripts/Events/love_in_air.cpp index 191ff390c..2d2656897 100644 --- a/src/server/scripts/Events/love_in_air.cpp +++ b/src/server/scripts/Events/love_in_air.cpp @@ -31,46 +31,46 @@ enum Spells class npc_love_in_air_supply_sentry : public CreatureScript { - public: - npc_love_in_air_supply_sentry() : CreatureScript("npc_love_in_air_supply_sentry") { } +public: + npc_love_in_air_supply_sentry() : CreatureScript("npc_love_in_air_supply_sentry") { } - struct npc_love_in_air_supply_sentryAI : public ScriptedAI + struct npc_love_in_air_supply_sentryAI : public ScriptedAI + { + npc_love_in_air_supply_sentryAI(Creature* creature) : ScriptedAI(creature), lock(0) { - npc_love_in_air_supply_sentryAI(Creature* creature) : ScriptedAI(creature), lock(0) - { - } - - uint32 lock; - - void MoveInLineOfSight(Unit* who) - { - if (lock > 1000 && me->GetDistance(who) < 10.0f && who->GetTypeId() == TYPEID_PLAYER && who->HasAura(SPELL_GOBLIN_DISGUISE) && !who->HasAura(SPELL_GOBLIN_CARRY_CRATE)) - { - lock = 0; - if (urand(0,1)) - me->MonsterSay("Time is money, friend. Go go go!", LANG_UNIVERSAL, who->ToPlayer()); - else - me->MonsterSay("That crate won't deliver itself, friend. Get a move on!", LANG_UNIVERSAL, who->ToPlayer()); - - if (who->ToPlayer()->GetTeamId() == TEAM_ALLIANCE) - who->CastSpell(who, SPELL_GOBLIN_ALLY_COMPLETE, true); - else - who->CastSpell(who, SPELL_GOBLIN_HORDE_COMPLETE, true); - - me->CastSpell(who, SPELL_GOBLIN_CARRY_CRATE, true); - } - } - - void UpdateAI(uint32 diff) - { - lock += diff; - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_love_in_air_supply_sentryAI(creature); } + + uint32 lock; + + void MoveInLineOfSight(Unit* who) + { + if (lock > 1000 && me->GetDistance(who) < 10.0f && who->GetTypeId() == TYPEID_PLAYER && who->HasAura(SPELL_GOBLIN_DISGUISE) && !who->HasAura(SPELL_GOBLIN_CARRY_CRATE)) + { + lock = 0; + if (urand(0, 1)) + me->MonsterSay("Time is money, friend. Go go go!", LANG_UNIVERSAL, who->ToPlayer()); + else + me->MonsterSay("That crate won't deliver itself, friend. Get a move on!", LANG_UNIVERSAL, who->ToPlayer()); + + if (who->ToPlayer()->GetTeamId() == TEAM_ALLIANCE) + who->CastSpell(who, SPELL_GOBLIN_ALLY_COMPLETE, true); + else + who->CastSpell(who, SPELL_GOBLIN_HORDE_COMPLETE, true); + + me->CastSpell(who, SPELL_GOBLIN_CARRY_CRATE, true); + } + } + + void UpdateAI(uint32 diff) + { + lock += diff; + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_love_in_air_supply_sentryAI(creature); + } }; enum hotOnTrail @@ -90,145 +90,163 @@ const uint32 spellTable[6] = {71713, 71745, 71752, 71759, 71760, 71758}; class npc_love_in_air_snivel : public CreatureScript { - public: - npc_love_in_air_snivel() : CreatureScript("npc_love_in_air_snivel") { } +public: + npc_love_in_air_snivel() : CreatureScript("npc_love_in_air_snivel") { } - struct npc_love_in_air_snivelAI : public NullCreatureAI + struct npc_love_in_air_snivelAI : public NullCreatureAI + { + npc_love_in_air_snivelAI(Creature* creature) : NullCreatureAI(creature) { - npc_love_in_air_snivelAI(Creature* creature) : NullCreatureAI(creature) - { - } + } - int32 delay; + int32 delay; - void Reset() - { - delay = 0; - me->SetReactState(REACT_AGGRESSIVE); - } - - bool AllowAction(Player* player) - { - uint16 slot = player->FindQuestSlot(player->GetTeamId() == TEAM_ALLIANCE ? QUEST_HOT_ON_TRAIL_ALLY : QUEST_HOT_ON_TRAIL_HORDE); - if (slot >= MAX_QUEST_LOG_SIZE) - return false; - - QuestStatusData& qData = player->getQuestStatusMap()[(player->GetTeamId() == TEAM_ALLIANCE ? QUEST_HOT_ON_TRAIL_ALLY : QUEST_HOT_ON_TRAIL_HORDE)]; - if (qData.CreatureOrGOCount[me->GetEntry() - NPC_SNIVEL_COUNTER] == 0) - return true; + void Reset() + { + delay = 0; + me->SetReactState(REACT_AGGRESSIVE); + } + bool AllowAction(Player* player) + { + uint16 slot = player->FindQuestSlot(player->GetTeamId() == TEAM_ALLIANCE ? QUEST_HOT_ON_TRAIL_ALLY : QUEST_HOT_ON_TRAIL_HORDE); + if (slot >= MAX_QUEST_LOG_SIZE) return false; - } - void MoveInLineOfSight(Unit* who) + QuestStatusData& qData = player->getQuestStatusMap()[(player->GetTeamId() == TEAM_ALLIANCE ? QUEST_HOT_ON_TRAIL_ALLY : QUEST_HOT_ON_TRAIL_HORDE)]; + if (qData.CreatureOrGOCount[me->GetEntry() - NPC_SNIVEL_COUNTER] == 0) + return true; + + return false; + } + + void MoveInLineOfSight(Unit* who) + { + if (delay == 0 && me->GetDistance(who) < 7.0f && who->GetTypeId() == TYPEID_PLAYER) { - if (delay == 0 && me->GetDistance(who) < 7.0f && who->GetTypeId() == TYPEID_PLAYER) + Player* plr = who->ToPlayer(); + if (AllowAction(plr)) { - Player* plr = who->ToPlayer(); - if (AllowAction(plr)) - { - delay = 25000; - uint8 index = plr->GetTeamId()*3 + (me->GetEntry() - NPC_SNIVEL_COUNTER); - plr->CastSpell(plr, spellTable[index], true); - } + delay = 25000; + uint8 index = plr->GetTeamId() * 3 + (me->GetEntry() - NPC_SNIVEL_COUNTER); + plr->CastSpell(plr, spellTable[index], true); } } - - void UpdateAI(uint32 diff) - { - if (delay > 0) - delay -= std::min(delay, diff); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_love_in_air_snivelAI(creature); } + + void UpdateAI(uint32 diff) + { + if (delay > 0) + delay -= std::min(delay, diff); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_love_in_air_snivelAI(creature); + } }; class npc_love_in_air_snivel_real : public CreatureScript { - public: - npc_love_in_air_snivel_real() : CreatureScript("npc_love_in_air_snivel_real") { } +public: + npc_love_in_air_snivel_real() : CreatureScript("npc_love_in_air_snivel_real") { } - struct npc_love_in_air_snivel_realAI : public ScriptedAI + struct npc_love_in_air_snivel_realAI : public ScriptedAI + { + npc_love_in_air_snivel_realAI(Creature* creature) : ScriptedAI(creature) { - npc_love_in_air_snivel_realAI(Creature* creature) : ScriptedAI(creature) - { - actionTimer = 7000; - actionCounter = 0; - } - - uint32 actionTimer; - uint32 actionCounter; - - bool Talk(uint32 time) - { - switch (me->GetEntry()) - { - case NPC_SNIVEL_ALLY: - case NPC_SNIVEL_HORDE: - { - switch (time) - { - case 1: me->MonsterSay("What are you staring at? Haven't you ever seen a genius before?", LANG_UNIVERSAL, 0); return false; - case 2: me->MonsterSay("This'll teach you to mind your own business!", LANG_UNIVERSAL, 0); return true; - } - break; - } - case NPC_SNIVEL_ALLY+1: - case NPC_SNIVEL_HORDE+1: - { - switch (time) - { - case 1: me->MonsterSay("That's right. I'd like to list some of these 'fireworks'.", LANG_UNIVERSAL, 0); return false; - case 2: me->MonsterSay("Those'll net me a nice profit when I return from the South Seas.", LANG_UNIVERSAL, 0); return false; - case 3: me->MonsterSay("You... Don't think I don't see you. Leave me alone!", LANG_UNIVERSAL, 0); return true; - } - break; - } - - case NPC_SNIVEL_ALLY+2: - case NPC_SNIVEL_HORDE+2: - { - switch (time) - { - case 1: me->MonsterSay("Thanks for the great cut and shave, buddy.", LANG_UNIVERSAL, 0); return false; - case 2: me->MonsterSay("Here's a little something extra since I'll be away.", LANG_UNIVERSAL, 0); return false; - case 3: me->MonsterSay("On second thought, keep the whole bag. I have to, uh, get going.", LANG_UNIVERSAL, 0); return false; - case 4: me->MonsterSay("Did you really think you could corner me this easily?", LANG_UNIVERSAL, 0); return true; - } - break; - } - } - - return true; - } - - void UpdateAI(uint32 diff) - { - actionTimer += diff; - if (actionTimer >= 7000) - { - actionTimer = 0; - actionCounter++; - if (Talk(actionCounter)) - { - if (me->ToTempSummon()) - if (Unit* owner = me->ToTempSummon()->GetSummoner()) - me->CastSpell(owner, SPELL_SNIVEL_GUN, true); - - me->DespawnOrUnsummon(1000); - } - } - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_love_in_air_snivel_realAI(creature); + actionTimer = 7000; + actionCounter = 0; } + + uint32 actionTimer; + uint32 actionCounter; + + bool Talk(uint32 time) + { + switch (me->GetEntry()) + { + case NPC_SNIVEL_ALLY: + case NPC_SNIVEL_HORDE: + { + switch (time) + { + case 1: + me->MonsterSay("What are you staring at? Haven't you ever seen a genius before?", LANG_UNIVERSAL, 0); + return false; + case 2: + me->MonsterSay("This'll teach you to mind your own business!", LANG_UNIVERSAL, 0); + return true; + } + break; + } + case NPC_SNIVEL_ALLY+1: + case NPC_SNIVEL_HORDE+1: + { + switch (time) + { + case 1: + me->MonsterSay("That's right. I'd like to list some of these 'fireworks'.", LANG_UNIVERSAL, 0); + return false; + case 2: + me->MonsterSay("Those'll net me a nice profit when I return from the South Seas.", LANG_UNIVERSAL, 0); + return false; + case 3: + me->MonsterSay("You... Don't think I don't see you. Leave me alone!", LANG_UNIVERSAL, 0); + return true; + } + break; + } + + case NPC_SNIVEL_ALLY+2: + case NPC_SNIVEL_HORDE+2: + { + switch (time) + { + case 1: + me->MonsterSay("Thanks for the great cut and shave, buddy.", LANG_UNIVERSAL, 0); + return false; + case 2: + me->MonsterSay("Here's a little something extra since I'll be away.", LANG_UNIVERSAL, 0); + return false; + case 3: + me->MonsterSay("On second thought, keep the whole bag. I have to, uh, get going.", LANG_UNIVERSAL, 0); + return false; + case 4: + me->MonsterSay("Did you really think you could corner me this easily?", LANG_UNIVERSAL, 0); + return true; + } + break; + } + } + + return true; + } + + void UpdateAI(uint32 diff) + { + actionTimer += diff; + if (actionTimer >= 7000) + { + actionTimer = 0; + actionCounter++; + if (Talk(actionCounter)) + { + if (me->ToTempSummon()) + if (Unit* owner = me->ToTempSummon()->GetSummoner()) + me->CastSpell(owner, SPELL_SNIVEL_GUN, true); + + me->DespawnOrUnsummon(1000); + } + } + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_love_in_air_snivel_realAI(creature); + } }; /////////////////////////////////////// @@ -266,307 +284,307 @@ enum hummel class npc_love_in_air_hummel : public CreatureScript { - public: - npc_love_in_air_hummel() : CreatureScript("npc_love_in_air_hummel") { } +public: + npc_love_in_air_hummel() : CreatureScript("npc_love_in_air_hummel") { } - struct npc_love_in_air_hummelAI : public ScriptedAI + struct npc_love_in_air_hummelAI : public ScriptedAI + { + npc_love_in_air_hummelAI(Creature* creature) : ScriptedAI(creature), summons(me) { - npc_love_in_air_hummelAI(Creature* creature) : ScriptedAI(creature), summons(me) - { - } + } - SummonList summons; - EventMap events; - uint32 speachTimer; + SummonList summons; + EventMap events; + uint32 speachTimer; - void Reset() - { - speachTimer = 0; - me->setFaction(35); - summons.DespawnAll(); - events.Reset(); - me->SummonCreature(NPC_APOTHECARY_FRYE, -205.449f, 2219.56f, 79.7633f, 0.7f); - me->SummonCreature(NPC_APOTHECARY_BAXTER, -209.602f, 2215.42f, 79.7633f, 0.723503f); - } + void Reset() + { + speachTimer = 0; + me->setFaction(35); + summons.DespawnAll(); + events.Reset(); + me->SummonCreature(NPC_APOTHECARY_FRYE, -205.449f, 2219.56f, 79.7633f, 0.7f); + me->SummonCreature(NPC_APOTHECARY_BAXTER, -209.602f, 2215.42f, 79.7633f, 0.723503f); + } - void DoAction(int32 param) - { - if (param == ACTION_START_EVENT) - speachTimer = 1; - } + void DoAction(int32 param) + { + if (param == ACTION_START_EVENT) + speachTimer = 1; + } - void JustDied(Unit* ) - { - me->MonsterSay("...please don't think less of me.", LANG_UNIVERSAL, 0); - Map::PlayerList const& players = me->GetMap()->GetPlayers(); - if (!players.isEmpty() && players.begin()->GetSource() && players.begin()->GetSource()->GetGroup()) - sLFGMgr->FinishDungeon(players.begin()->GetSource()->GetGroup()->GetGUID(), 288, me->FindMap()); - } + void JustDied(Unit* ) + { + me->MonsterSay("...please don't think less of me.", LANG_UNIVERSAL, 0); + Map::PlayerList const& players = me->GetMap()->GetPlayers(); + if (!players.isEmpty() && players.begin()->GetSource() && players.begin()->GetSource()->GetGroup()) + sLFGMgr->FinishDungeon(players.begin()->GetSource()->GetGroup()->GetGUID(), 288, me->FindMap()); + } - void JustSummoned(Creature* cr) - { - summons.Summon(cr); - cr->setFaction(35); - cr->SetControlled(true, UNIT_STATE_STUNNED); - cr->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - } + void JustSummoned(Creature* cr) + { + summons.Summon(cr); + cr->setFaction(35); + cr->SetControlled(true, UNIT_STATE_STUNNED); + cr->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + } - void UpdateAI(uint32 diff) + void UpdateAI(uint32 diff) + { + if (speachTimer) { - if (speachTimer) + speachTimer += diff; + if (speachTimer < 10000) { - speachTimer += diff; - if (speachTimer < 10000) - { - me->MonsterSay("Did they bother to tell you who I am and why I am doing this?", LANG_UNIVERSAL, 0); - speachTimer = 10000; - } - else if (speachTimer >= 16000 && speachTimer < 20000) - { - me->MonsterSay("...or are they just using you like they do everybody else?", LANG_UNIVERSAL, 0); - speachTimer = 20000; - } - else if (speachTimer >= 26000 && speachTimer < 30000) - { - me->MonsterSay("But what does it matter. It is time for this to end.", LANG_UNIVERSAL, 0); - speachTimer = 0; - me->setFaction(16); - me->SetInCombatWithZone(); - if (Unit* target = SelectTargetFromPlayerList(40.0f)) - { - AttackStart(target); - events.ScheduleEvent(EVENT_CALL_BAXTER, 10000); - events.ScheduleEvent(EVENT_CALL_FRYE, 20000); - events.ScheduleEvent(EVENT_SPELL_PERFUME_SPRAY, 7000); - events.ScheduleEvent(EVENT_SPELL_CHAIN_REACTION, 12000); - } - else - EnterEvadeMode(); - } - return; + me->MonsterSay("Did they bother to tell you who I am and why I am doing this?", LANG_UNIVERSAL, 0); + speachTimer = 10000; } - - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.GetEvent()) + else if (speachTimer >= 16000 && speachTimer < 20000) { - case EVENT_CALL_BAXTER: + me->MonsterSay("...or are they just using you like they do everybody else?", LANG_UNIVERSAL, 0); + speachTimer = 20000; + } + else if (speachTimer >= 26000 && speachTimer < 30000) + { + me->MonsterSay("But what does it matter. It is time for this to end.", LANG_UNIVERSAL, 0); + speachTimer = 0; + me->setFaction(16); + me->SetInCombatWithZone(); + if (Unit* target = SelectTargetFromPlayerList(40.0f)) + { + AttackStart(target); + events.ScheduleEvent(EVENT_CALL_BAXTER, 10000); + events.ScheduleEvent(EVENT_CALL_FRYE, 20000); + events.ScheduleEvent(EVENT_SPELL_PERFUME_SPRAY, 7000); + events.ScheduleEvent(EVENT_SPELL_CHAIN_REACTION, 12000); + } + else + EnterEvadeMode(); + } + return; + } + + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.GetEvent()) + { + case EVENT_CALL_BAXTER: { EntryCheckPredicate pred(NPC_APOTHECARY_BAXTER); summons.DoAction(ACTION_RELEASE_HELPER, pred); events.PopEvent(); break; } - case EVENT_CALL_FRYE: + case EVENT_CALL_FRYE: { EntryCheckPredicate pred(NPC_APOTHECARY_FRYE); summons.DoAction(ACTION_RELEASE_HELPER, pred); events.PopEvent(); break; } - case EVENT_SPELL_PERFUME_SPRAY: - me->CastSpell(me->GetVictim(), SPELL_ALLURING_PERFUME_SPRAY, false); - events.RepeatEvent(6000); - break; - case EVENT_SPELL_CHAIN_REACTION: - me->CastSpell(me->GetVictim(), SPELL_CHAIN_REACTION, false); - events.RepeatEvent(12000); - break; - } - - DoMeleeAttackIfReady(); + case EVENT_SPELL_PERFUME_SPRAY: + me->CastSpell(me->GetVictim(), SPELL_ALLURING_PERFUME_SPRAY, false); + events.RepeatEvent(6000); + break; + case EVENT_SPELL_CHAIN_REACTION: + me->CastSpell(me->GetVictim(), SPELL_CHAIN_REACTION, false); + events.RepeatEvent(12000); + break; } - }; - CreatureAI* GetAI(Creature* creature) const - { - return new npc_love_in_air_hummelAI(creature); + DoMeleeAttackIfReady(); } + }; - bool OnQuestReward(Player* /*player*/, Creature* creature, const Quest *_Quest, uint32 /*slot*/) - { - if (_Quest->GetQuestId() == QUEST_YOUVE_BEEN_SERVED) - creature->AI()->DoAction(ACTION_START_EVENT); + CreatureAI* GetAI(Creature* creature) const + { + return new npc_love_in_air_hummelAI(creature); + } - return true; - } + bool OnQuestReward(Player* /*player*/, Creature* creature, const Quest* _Quest, uint32 /*slot*/) + { + if (_Quest->GetQuestId() == QUEST_YOUVE_BEEN_SERVED) + creature->AI()->DoAction(ACTION_START_EVENT); + + return true; + } }; class npc_love_in_air_hummel_helper : public CreatureScript { - public: - npc_love_in_air_hummel_helper() : CreatureScript("npc_love_in_air_hummel_helper") { } +public: + npc_love_in_air_hummel_helper() : CreatureScript("npc_love_in_air_hummel_helper") { } - struct npc_love_in_air_hummel_helperAI : public ScriptedAI + struct npc_love_in_air_hummel_helperAI : public ScriptedAI + { + npc_love_in_air_hummel_helperAI(Creature* creature) : ScriptedAI(creature) { - npc_love_in_air_hummel_helperAI(Creature* creature) : ScriptedAI(creature) - { - } - - EventMap events; - - void Reset() - { - } - - void DoAction(int32 param) - { - if (param == ACTION_RELEASE_HELPER) - { - me->SetControlled(false, UNIT_STATE_STUNNED); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - me->setFaction(16); - me->SetInCombatWithZone(); - if (Unit* target = SelectTargetFromPlayerList(40.0f)) - AttackStart(target); - - if (me->GetEntry() == NPC_APOTHECARY_BAXTER) - { - events.ScheduleEvent(EVENT_SPELL_PERFUME_SPRAY, 7000); - events.ScheduleEvent(EVENT_SPELL_CHAIN_REACTION, 12000); - } - else - events.ScheduleEvent(EVENT_SPELL_THROW, 5000); - } - } - - void JustDied(Unit* ) { me->MonsterSay("...please don't think less of me.", LANG_UNIVERSAL, 0); } - - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.GetEvent()) - { - case EVENT_SPELL_PERFUME_SPRAY: - me->CastSpell(me->GetVictim(), SPELL_COLOGNE_SPRAY, false); - events.RepeatEvent(6000); - break; - case EVENT_SPELL_CHAIN_REACTION: - me->CastSpell(me->GetVictim(), SPELL_CHAIN_REACTION, false); - events.RepeatEvent(12000); - break; - case EVENT_SPELL_THROW: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) - { - Position pos(*me); - me->Relocate(target); - me->CastSpell(me, RAND(SPELL_THROW_COLOGNE, SPELL_THROW_PERFUME), true, nullptr, nullptr, me->GetGUID()); - me->Relocate(pos); - } - events.RepeatEvent(10000); - break; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_love_in_air_hummel_helperAI(creature); } + + EventMap events; + + void Reset() + { + } + + void DoAction(int32 param) + { + if (param == ACTION_RELEASE_HELPER) + { + me->SetControlled(false, UNIT_STATE_STUNNED); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + me->setFaction(16); + me->SetInCombatWithZone(); + if (Unit* target = SelectTargetFromPlayerList(40.0f)) + AttackStart(target); + + if (me->GetEntry() == NPC_APOTHECARY_BAXTER) + { + events.ScheduleEvent(EVENT_SPELL_PERFUME_SPRAY, 7000); + events.ScheduleEvent(EVENT_SPELL_CHAIN_REACTION, 12000); + } + else + events.ScheduleEvent(EVENT_SPELL_THROW, 5000); + } + } + + void JustDied(Unit* ) { me->MonsterSay("...please don't think less of me.", LANG_UNIVERSAL, 0); } + + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.GetEvent()) + { + case EVENT_SPELL_PERFUME_SPRAY: + me->CastSpell(me->GetVictim(), SPELL_COLOGNE_SPRAY, false); + events.RepeatEvent(6000); + break; + case EVENT_SPELL_CHAIN_REACTION: + me->CastSpell(me->GetVictim(), SPELL_CHAIN_REACTION, false); + events.RepeatEvent(12000); + break; + case EVENT_SPELL_THROW: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) + { + Position pos(*me); + me->Relocate(target); + me->CastSpell(me, RAND(SPELL_THROW_COLOGNE, SPELL_THROW_PERFUME), true, nullptr, nullptr, me->GetGUID()); + me->Relocate(pos); + } + events.RepeatEvent(10000); + break; + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_love_in_air_hummel_helperAI(creature); + } }; class spell_love_in_air_perfume_immune : public SpellScriptLoader { - public: - spell_love_in_air_perfume_immune() : SpellScriptLoader("spell_love_in_air_perfume_immune") { } +public: + spell_love_in_air_perfume_immune() : SpellScriptLoader("spell_love_in_air_perfume_immune") { } - class spell_love_in_air_perfume_immune_AuraScript : public AuraScript + class spell_love_in_air_perfume_immune_AuraScript : public AuraScript + { + PrepareAuraScript(spell_love_in_air_perfume_immune_AuraScript); + + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_love_in_air_perfume_immune_AuraScript); - - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + Unit* target = GetTarget(); + if (GetId() == SPELL_COLOGNE_IMMUNE) { - Unit* target = GetTarget(); - if (GetId() == SPELL_COLOGNE_IMMUNE) - { - target->ApplySpellImmune(SPELL_COLOGNE_PASSIVE_DAMAGE, IMMUNITY_ID, SPELL_COLOGNE_PASSIVE_DAMAGE, true); - target->ApplySpellImmune(SPELL_COLOGNE_PASSIVE_DAMAGE, IMMUNITY_ID, SPELL_COLOGNE_SPRAY, true); - target->ApplySpellImmune(68934, IMMUNITY_ID, 68934, true); - } - else - { - target->ApplySpellImmune(SPELL_PERFUME_PASSIVE_DAMAGE, IMMUNITY_ID, SPELL_PERFUME_PASSIVE_DAMAGE, true); - target->ApplySpellImmune(SPELL_ALLURING_PERFUME_SPRAY, IMMUNITY_ID, SPELL_ALLURING_PERFUME_SPRAY, true); - target->ApplySpellImmune(68927, IMMUNITY_ID, 68927, true); - } + target->ApplySpellImmune(SPELL_COLOGNE_PASSIVE_DAMAGE, IMMUNITY_ID, SPELL_COLOGNE_PASSIVE_DAMAGE, true); + target->ApplySpellImmune(SPELL_COLOGNE_PASSIVE_DAMAGE, IMMUNITY_ID, SPELL_COLOGNE_SPRAY, true); + target->ApplySpellImmune(68934, IMMUNITY_ID, 68934, true); } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + else { - Unit* target = GetTarget(); - if (GetId() == SPELL_COLOGNE_IMMUNE) - { - target->ApplySpellImmune(SPELL_COLOGNE_PASSIVE_DAMAGE, IMMUNITY_ID, SPELL_COLOGNE_PASSIVE_DAMAGE, false); - target->ApplySpellImmune(SPELL_COLOGNE_PASSIVE_DAMAGE, IMMUNITY_ID, SPELL_COLOGNE_SPRAY, false); - target->ApplySpellImmune(68934, IMMUNITY_ID, 68934, false); - } - else - { - target->ApplySpellImmune(SPELL_PERFUME_PASSIVE_DAMAGE, IMMUNITY_ID, SPELL_PERFUME_PASSIVE_DAMAGE, false); - target->ApplySpellImmune(SPELL_PERFUME_PASSIVE_DAMAGE, IMMUNITY_ID, SPELL_ALLURING_PERFUME_SPRAY, false); - target->ApplySpellImmune(68927, IMMUNITY_ID, 68927, false); - } + target->ApplySpellImmune(SPELL_PERFUME_PASSIVE_DAMAGE, IMMUNITY_ID, SPELL_PERFUME_PASSIVE_DAMAGE, true); + target->ApplySpellImmune(SPELL_ALLURING_PERFUME_SPRAY, IMMUNITY_ID, SPELL_ALLURING_PERFUME_SPRAY, true); + target->ApplySpellImmune(68927, IMMUNITY_ID, 68927, true); } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_love_in_air_perfume_immune_AuraScript::HandleEffectApply, EFFECT_2, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_love_in_air_perfume_immune_AuraScript::HandleEffectRemove, EFFECT_2, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_love_in_air_perfume_immune_AuraScript(); } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + if (GetId() == SPELL_COLOGNE_IMMUNE) + { + target->ApplySpellImmune(SPELL_COLOGNE_PASSIVE_DAMAGE, IMMUNITY_ID, SPELL_COLOGNE_PASSIVE_DAMAGE, false); + target->ApplySpellImmune(SPELL_COLOGNE_PASSIVE_DAMAGE, IMMUNITY_ID, SPELL_COLOGNE_SPRAY, false); + target->ApplySpellImmune(68934, IMMUNITY_ID, 68934, false); + } + else + { + target->ApplySpellImmune(SPELL_PERFUME_PASSIVE_DAMAGE, IMMUNITY_ID, SPELL_PERFUME_PASSIVE_DAMAGE, false); + target->ApplySpellImmune(SPELL_PERFUME_PASSIVE_DAMAGE, IMMUNITY_ID, SPELL_ALLURING_PERFUME_SPRAY, false); + target->ApplySpellImmune(68927, IMMUNITY_ID, 68927, false); + } + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_love_in_air_perfume_immune_AuraScript::HandleEffectApply, EFFECT_2, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_love_in_air_perfume_immune_AuraScript::HandleEffectRemove, EFFECT_2, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_love_in_air_perfume_immune_AuraScript(); + } }; class spell_love_in_air_periodic_perfumes : public SpellScriptLoader { - public: - spell_love_in_air_periodic_perfumes() : SpellScriptLoader("spell_love_in_air_periodic_perfumes") { } +public: + spell_love_in_air_periodic_perfumes() : SpellScriptLoader("spell_love_in_air_periodic_perfumes") { } - class spell_love_in_air_periodic_perfumes_AuraScript : public AuraScript + class spell_love_in_air_periodic_perfumes_AuraScript : public AuraScript + { + PrepareAuraScript(spell_love_in_air_periodic_perfumes_AuraScript); + + void PeriodicTick(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_love_in_air_periodic_perfumes_AuraScript); - - void PeriodicTick(AuraEffect const* /*aurEff*/) + uint64 guid = (GetCaster() ? GetCaster()->GetGUID() : 0); + if (Unit* target = GetTarget()) { - uint64 guid = (GetCaster() ? GetCaster()->GetGUID() : 0); - if (Unit* target = GetTarget()) - { - uint32 spellId = (GetId() == SPELL_THROW_COLOGNE ? 68934 : 68927); - if (target->IsImmunedToSpell(sSpellMgr->GetSpellInfo(spellId))) - return; + uint32 spellId = (GetId() == SPELL_THROW_COLOGNE ? 68934 : 68927); + if (target->IsImmunedToSpell(sSpellMgr->GetSpellInfo(spellId))) + return; - target->CastSpell(target, spellId, true, nullptr, nullptr, guid); - } + target->CastSpell(target, spellId, true, nullptr, nullptr, guid); } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_love_in_air_periodic_perfumes_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_love_in_air_periodic_perfumes_AuraScript(); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_love_in_air_periodic_perfumes_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_love_in_air_periodic_perfumes_AuraScript(); + } }; /////////////////////////////////////// @@ -587,36 +605,36 @@ enum CreateHeartCandy class spell_item_create_heart_candy : public SpellScriptLoader { - public: - spell_item_create_heart_candy() : SpellScriptLoader("spell_item_create_heart_candy") { } +public: + spell_item_create_heart_candy() : SpellScriptLoader("spell_item_create_heart_candy") { } - class spell_item_create_heart_candy_SpellScript : public SpellScript + class spell_item_create_heart_candy_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_create_heart_candy_SpellScript); + + void HandleScript(SpellEffIndex effIndex) { - PrepareSpellScript(spell_item_create_heart_candy_SpellScript); + PreventHitDefaultEffect(effIndex); + if (!GetHitUnit() || !GetHitUnit()->ToPlayer()) + return; - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (!GetHitUnit() || !GetHitUnit()->ToPlayer()) - return; + Player* target = GetHitUnit()->ToPlayer(); - Player* target = GetHitUnit()->ToPlayer(); + static const uint32 items[] = {ITEM_HEART_CANDY_1, ITEM_HEART_CANDY_2, ITEM_HEART_CANDY_3, ITEM_HEART_CANDY_4, ITEM_HEART_CANDY_5, ITEM_HEART_CANDY_6, ITEM_HEART_CANDY_7, ITEM_HEART_CANDY_8}; - static const uint32 items[] = {ITEM_HEART_CANDY_1, ITEM_HEART_CANDY_2, ITEM_HEART_CANDY_3, ITEM_HEART_CANDY_4, ITEM_HEART_CANDY_5, ITEM_HEART_CANDY_6, ITEM_HEART_CANDY_7, ITEM_HEART_CANDY_8}; - - target->AddItem(items[urand(0, 7)], 1); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_create_heart_candy_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_create_heart_candy_SpellScript(); + target->AddItem(items[urand(0, 7)], 1); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_create_heart_candy_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_create_heart_candy_SpellScript(); + } }; // 45102 Romantic Picnic @@ -632,73 +650,73 @@ enum SpellsPicnic class spell_love_is_in_the_air_romantic_picnic : public SpellScriptLoader { - public: - spell_love_is_in_the_air_romantic_picnic() : SpellScriptLoader("spell_love_is_in_the_air_romantic_picnic") { } +public: + spell_love_is_in_the_air_romantic_picnic() : SpellScriptLoader("spell_love_is_in_the_air_romantic_picnic") { } - class spell_love_is_in_the_air_romantic_picnic_AuraScript : public AuraScript + class spell_love_is_in_the_air_romantic_picnic_AuraScript : public AuraScript + { + PrepareAuraScript(spell_love_is_in_the_air_romantic_picnic_AuraScript); + + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_love_is_in_the_air_romantic_picnic_AuraScript); - - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - target->SetStandState(UNIT_STAND_STATE_SIT); - target->CastSpell(target, SPELL_MEAL_PERIODIC, false); - } - - void OnPeriodic(AuraEffect const* /*aurEff*/) - { - // Every 5 seconds - Unit* target = GetTarget(); - Unit* caster = GetCaster(); - - // If our player is no longer sit, remove all auras - if (target->getStandState() != UNIT_STAND_STATE_SIT) - { - target->RemoveAura(SPELL_ROMANTIC_PICNIC_ACHIEV); - target->RemoveAura(GetAura()); - return; - } - - target->CastSpell(target, SPELL_BASKET_CHECK, false); // unknown use, it targets Romantic Basket - target->CastSpell(target, RAND(SPELL_MEAL_EAT_VISUAL, SPELL_DRINK_VISUAL), false); - - bool foundSomeone = false; - // For nearby players, check if they have the same aura. If so, cast Romantic Picnic (45123) - // required by achievement and "hearts" visual - std::list playerList; - acore::AnyPlayerInObjectRangeCheck checker(target, INTERACTION_DISTANCE*2); - acore::PlayerListSearcher searcher(target, playerList, checker); - target->VisitNearbyWorldObject(INTERACTION_DISTANCE*2, searcher); - for (std::list::const_iterator itr = playerList.begin(); itr != playerList.end(); ++itr) - { - if ((*itr) != target && (*itr)->HasAura(GetId())) // && (*itr)->getStandState() == UNIT_STAND_STATE_SIT) - { - if (caster) - { - caster->CastSpell(*itr, SPELL_ROMANTIC_PICNIC_ACHIEV, true); - caster->CastSpell(target, SPELL_ROMANTIC_PICNIC_ACHIEV, true); - } - foundSomeone = true; - // break; - } - } - - if (!foundSomeone && target->HasAura(SPELL_ROMANTIC_PICNIC_ACHIEV)) - target->RemoveAura(SPELL_ROMANTIC_PICNIC_ACHIEV); - } - - void Register() - { - AfterEffectApply += AuraEffectApplyFn(spell_love_is_in_the_air_romantic_picnic_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_love_is_in_the_air_romantic_picnic_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_love_is_in_the_air_romantic_picnic_AuraScript(); + Unit* target = GetTarget(); + target->SetStandState(UNIT_STAND_STATE_SIT); + target->CastSpell(target, SPELL_MEAL_PERIODIC, false); } + + void OnPeriodic(AuraEffect const* /*aurEff*/) + { + // Every 5 seconds + Unit* target = GetTarget(); + Unit* caster = GetCaster(); + + // If our player is no longer sit, remove all auras + if (target->getStandState() != UNIT_STAND_STATE_SIT) + { + target->RemoveAura(SPELL_ROMANTIC_PICNIC_ACHIEV); + target->RemoveAura(GetAura()); + return; + } + + target->CastSpell(target, SPELL_BASKET_CHECK, false); // unknown use, it targets Romantic Basket + target->CastSpell(target, RAND(SPELL_MEAL_EAT_VISUAL, SPELL_DRINK_VISUAL), false); + + bool foundSomeone = false; + // For nearby players, check if they have the same aura. If so, cast Romantic Picnic (45123) + // required by achievement and "hearts" visual + std::list playerList; + acore::AnyPlayerInObjectRangeCheck checker(target, INTERACTION_DISTANCE * 2); + acore::PlayerListSearcher searcher(target, playerList, checker); + target->VisitNearbyWorldObject(INTERACTION_DISTANCE * 2, searcher); + for (std::list::const_iterator itr = playerList.begin(); itr != playerList.end(); ++itr) + { + if ((*itr) != target && (*itr)->HasAura(GetId())) // && (*itr)->getStandState() == UNIT_STAND_STATE_SIT) + { + if (caster) + { + caster->CastSpell(*itr, SPELL_ROMANTIC_PICNIC_ACHIEV, true); + caster->CastSpell(target, SPELL_ROMANTIC_PICNIC_ACHIEV, true); + } + foundSomeone = true; + // break; + } + } + + if (!foundSomeone && target->HasAura(SPELL_ROMANTIC_PICNIC_ACHIEV)) + target->RemoveAura(SPELL_ROMANTIC_PICNIC_ACHIEV); + } + + void Register() + { + AfterEffectApply += AuraEffectApplyFn(spell_love_is_in_the_air_romantic_picnic_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_love_is_in_the_air_romantic_picnic_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_love_is_in_the_air_romantic_picnic_AuraScript(); + } }; enum ServiceUniform @@ -711,51 +729,51 @@ enum ServiceUniform class spell_gen_aura_service_uniform : public SpellScriptLoader { - public: - spell_gen_aura_service_uniform() : SpellScriptLoader("spell_gen_aura_service_uniform") { } +public: + spell_gen_aura_service_uniform() : SpellScriptLoader("spell_gen_aura_service_uniform") { } - class spell_gen_aura_service_uniform_AuraScript : public AuraScript + class spell_gen_aura_service_uniform_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_aura_service_uniform_AuraScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareAuraScript(spell_gen_aura_service_uniform_AuraScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_SERVICE_UNIFORM)) - return false; - return true; - } - - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - // Apply model goblin - Unit* target = GetTarget(); - if (target->GetTypeId() == TYPEID_PLAYER) - { - if (target->getGender() == GENDER_MALE) - target->SetDisplayId(MODEL_GOBLIN_MALE); - else - target->SetDisplayId(MODEL_GOBLIN_FEMALE); - } - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - if (target->GetTypeId() == TYPEID_PLAYER) - target->RestoreDisplayId(); - } - - void Register() - { - AfterEffectApply += AuraEffectApplyFn(spell_gen_aura_service_uniform_AuraScript::OnApply, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_gen_aura_service_uniform_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_aura_service_uniform_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_SERVICE_UNIFORM)) + return false; + return true; } + + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + // Apply model goblin + Unit* target = GetTarget(); + if (target->GetTypeId() == TYPEID_PLAYER) + { + if (target->getGender() == GENDER_MALE) + target->SetDisplayId(MODEL_GOBLIN_MALE); + else + target->SetDisplayId(MODEL_GOBLIN_FEMALE); + } + } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + if (target->GetTypeId() == TYPEID_PLAYER) + target->RestoreDisplayId(); + } + + void Register() + { + AfterEffectApply += AuraEffectApplyFn(spell_gen_aura_service_uniform_AuraScript::OnApply, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_gen_aura_service_uniform_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_aura_service_uniform_AuraScript(); + } }; void AddSC_event_love_in_the_air() diff --git a/src/server/scripts/Events/midsummer.cpp b/src/server/scripts/Events/midsummer.cpp index a8b7151da..4a07492cd 100644 --- a/src/server/scripts/Events/midsummer.cpp +++ b/src/server/scripts/Events/midsummer.cpp @@ -32,168 +32,168 @@ public: class npc_midsummer_bonfire : public CreatureScript { - public: - npc_midsummer_bonfire() : CreatureScript("npc_midsummer_bonfire") { } +public: + npc_midsummer_bonfire() : CreatureScript("npc_midsummer_bonfire") { } - struct npc_midsummer_bonfireAI : public ScriptedAI + struct npc_midsummer_bonfireAI : public ScriptedAI + { + npc_midsummer_bonfireAI(Creature* c) : ScriptedAI(c) { - npc_midsummer_bonfireAI(Creature* c) : ScriptedAI(c) + me->IsAIEnabled = true; + goGUID = 0; + if (GameObject* go = me->SummonGameObject(GO_MIDSUMMER_BONFIRE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 0)) { - me->IsAIEnabled = true; - goGUID = 0; - if (GameObject* go = me->SummonGameObject(GO_MIDSUMMER_BONFIRE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 0)) - { - goGUID = go->GetGUID(); - me->RemoveGameObject(go, false); - } + goGUID = go->GetGUID(); + me->RemoveGameObject(go, false); } - - uint64 goGUID; - - void SpellHit(Unit*, SpellInfo const* spellInfo) - { - if (!goGUID) - return; - - // Extinguish fire - if (spellInfo->Id == SPELL_STAMP_OUT_BONFIRE) - { - if (GameObject* go = ObjectAccessor::GetGameObject(*me, goGUID)) - go->SetPhaseMask(2, true); - } - else if (spellInfo->Id == SPELL_LIGHT_BONFIRE) - { - if (GameObject* go = ObjectAccessor::GetGameObject(*me, goGUID)) - { - go->SetPhaseMask(1, true); - go->SendCustomAnim(1); - } - } - - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_midsummer_bonfireAI(creature); } + + uint64 goGUID; + + void SpellHit(Unit*, SpellInfo const* spellInfo) + { + if (!goGUID) + return; + + // Extinguish fire + if (spellInfo->Id == SPELL_STAMP_OUT_BONFIRE) + { + if (GameObject* go = ObjectAccessor::GetGameObject(*me, goGUID)) + go->SetPhaseMask(2, true); + } + else if (spellInfo->Id == SPELL_LIGHT_BONFIRE) + { + if (GameObject* go = ObjectAccessor::GetGameObject(*me, goGUID)) + { + go->SetPhaseMask(1, true); + go->SendCustomAnim(1); + } + } + + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_midsummer_bonfireAI(creature); + } }; class npc_midsummer_torch_target : public CreatureScript { - public: - npc_midsummer_torch_target() : CreatureScript("npc_midsummer_torch_target") { } +public: + npc_midsummer_torch_target() : CreatureScript("npc_midsummer_torch_target") { } - struct npc_midsummer_torch_targetAI : public ScriptedAI + struct npc_midsummer_torch_targetAI : public ScriptedAI + { + npc_midsummer_torch_targetAI(Creature* c) : ScriptedAI(c) { - npc_midsummer_torch_targetAI(Creature* c) : ScriptedAI(c) - { - teleTimer = 0; - startTimer = 1; - posVec.clear(); - playerGUID = 0; - me->CastSpell(me, 43313, true); - counter = 0; - maxCount = 0; - } - - uint64 playerGUID; - uint32 startTimer; - uint32 teleTimer; - std::vector posVec; - uint8 counter; - uint8 maxCount; - - void SetPlayerGUID(uint64 guid, uint8 cnt) - { - playerGUID = guid; - maxCount = cnt; - } - - bool CanBeSeen(Player const* seer) - { - return seer->GetGUID() == playerGUID; - } - - void SpellHit(Unit* caster, SpellInfo const* spellInfo) - { - if (posVec.empty()) - return; - // Triggered spell from torch - if (spellInfo->Id == 46054 && caster->GetTypeId() == TYPEID_PLAYER) - { - me->CastSpell(me, 45724, true); // hit visual anim - if (++counter >= maxCount) - { - caster->CastSpell(caster, (caster->ToPlayer()->GetTeamId() ? 46651 : 45719), true); // quest complete spell - me->DespawnOrUnsummon(1); - return; - } - - teleTimer = 1; - } - } - - void UpdateAI(uint32 diff) - { - if (startTimer) - { - startTimer += diff; - if (startTimer >= 200) - { - startTimer = 0; - FillPositions(); - SelectPosition(); - } - } - if (teleTimer) - { - teleTimer += diff; - if (teleTimer >= 750 && teleTimer < 10000) - { - teleTimer = 10000; - SelectPosition(); - } - else if (teleTimer >= 10500) - { - if (Player* plr = ObjectAccessor::GetPlayer(*me, playerGUID)) - plr->UpdateTriggerVisibility(); - - teleTimer = 0; - } - } - } - - void FillPositions() - { - std::list gobjList; - me->GetGameObjectListWithEntryInGrid(gobjList, 187708 /*TORCH_GO*/, 30.0f); - for (std::list::const_iterator itr = gobjList.begin(); itr != gobjList.end(); ++itr) - { - Position pos; - pos.Relocate(*itr); - posVec.push_back(pos); - } - } - - void SelectPosition() - { - if (posVec.empty()) - return; - int8 num = urand(0, posVec.size()-1); - Position pos; - pos.Relocate(posVec.at(num)); - me->m_last_notify_position.Relocate(0.0f, 0.0f, 0.0f); - me->m_last_notify_mstime = World::GetGameTimeMS() + 10000; - - me->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation()); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_midsummer_torch_targetAI(creature); + teleTimer = 0; + startTimer = 1; + posVec.clear(); + playerGUID = 0; + me->CastSpell(me, 43313, true); + counter = 0; + maxCount = 0; } + + uint64 playerGUID; + uint32 startTimer; + uint32 teleTimer; + std::vector posVec; + uint8 counter; + uint8 maxCount; + + void SetPlayerGUID(uint64 guid, uint8 cnt) + { + playerGUID = guid; + maxCount = cnt; + } + + bool CanBeSeen(Player const* seer) + { + return seer->GetGUID() == playerGUID; + } + + void SpellHit(Unit* caster, SpellInfo const* spellInfo) + { + if (posVec.empty()) + return; + // Triggered spell from torch + if (spellInfo->Id == 46054 && caster->GetTypeId() == TYPEID_PLAYER) + { + me->CastSpell(me, 45724, true); // hit visual anim + if (++counter >= maxCount) + { + caster->CastSpell(caster, (caster->ToPlayer()->GetTeamId() ? 46651 : 45719), true); // quest complete spell + me->DespawnOrUnsummon(1); + return; + } + + teleTimer = 1; + } + } + + void UpdateAI(uint32 diff) + { + if (startTimer) + { + startTimer += diff; + if (startTimer >= 200) + { + startTimer = 0; + FillPositions(); + SelectPosition(); + } + } + if (teleTimer) + { + teleTimer += diff; + if (teleTimer >= 750 && teleTimer < 10000) + { + teleTimer = 10000; + SelectPosition(); + } + else if (teleTimer >= 10500) + { + if (Player* plr = ObjectAccessor::GetPlayer(*me, playerGUID)) + plr->UpdateTriggerVisibility(); + + teleTimer = 0; + } + } + } + + void FillPositions() + { + std::list gobjList; + me->GetGameObjectListWithEntryInGrid(gobjList, 187708 /*TORCH_GO*/, 30.0f); + for (std::list::const_iterator itr = gobjList.begin(); itr != gobjList.end(); ++itr) + { + Position pos; + pos.Relocate(*itr); + posVec.push_back(pos); + } + } + + void SelectPosition() + { + if (posVec.empty()) + return; + int8 num = urand(0, posVec.size() - 1); + Position pos; + pos.Relocate(posVec.at(num)); + me->m_last_notify_position.Relocate(0.0f, 0.0f, 0.0f); + me->m_last_notify_mstime = World::GetGameTimeMS() + 10000; + + me->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation()); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_midsummer_torch_targetAI(creature); + } }; @@ -274,10 +274,10 @@ public: { PrepareAuraScript(spell_midsummer_ribbon_pole_AuraScript) - void HandleEffectPeriodic(AuraEffect const * /*aurEff*/) + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) { PreventDefaultAction(); - if (Unit *target = GetTarget()) + if (Unit* target = GetTarget()) { Creature* cr = target->FindNearestCreature(NPC_RIBBON_POLE_DEBUG_TARGET, 10.0f); if (!cr) @@ -288,15 +288,15 @@ public: } if (Aura* aur = target->GetAura(SPELL_RIBBON_POLE_XP)) - aur->SetDuration(std::min(aur->GetDuration()+3*MINUTE*IN_MILLISECONDS, 60*MINUTE*IN_MILLISECONDS)); + aur->SetDuration(std::min(aur->GetDuration() + 3 * MINUTE * IN_MILLISECONDS, 60 * MINUTE * IN_MILLISECONDS)); else target->CastSpell(target, SPELL_RIBBON_POLE_XP, true); if (roll_chance_i(5)) { - cr->Relocate(cr->GetPositionX(), cr->GetPositionY(), cr->GetPositionZ()-6.5f); + cr->Relocate(cr->GetPositionX(), cr->GetPositionY(), cr->GetPositionZ() - 6.5f); cr->CastSpell(cr, SPELL_RIBBON_POLE_FIREWORKS, true); - cr->Relocate(cr->GetPositionX(), cr->GetPositionY(), cr->GetPositionZ()+6.5f); + cr->Relocate(cr->GetPositionX(), cr->GetPositionY(), cr->GetPositionZ() + 6.5f); } // Achievement @@ -382,7 +382,7 @@ enum flingTorch class spell_midsummer_fling_torch : public SpellScriptLoader { - public: +public: spell_midsummer_fling_torch() : SpellScriptLoader("spell_midsummer_fling_torch") {} class spell_midsummer_fling_torch_SpellScript : public SpellScript @@ -397,7 +397,7 @@ class spell_midsummer_fling_torch : public SpellScriptLoader std::list crList; caster->GetCreaturesWithEntryInRange(crList, 100.0f, NPC_TORCH_TARGET); - uint8 rand = urand(0, crList.size()-1); + uint8 rand = urand(0, crList.size() - 1); Position pos; pos.Relocate(0.0f, 0.0f, 0.0f); for (std::list::const_iterator itr = crList.begin(); itr != crList.end(); ++itr, --rand) @@ -500,7 +500,7 @@ enum eJuggle class spell_midsummer_juggling_torch : public SpellScriptLoader { - public: +public: spell_midsummer_juggling_torch() : SpellScriptLoader("spell_midsummer_juggling_torch") {} class spell_midsummer_juggling_torch_SpellScript : public SpellScript diff --git a/src/server/scripts/Events/pilgrims_bounty.cpp b/src/server/scripts/Events/pilgrims_bounty.cpp index a36981094..666315b84 100644 --- a/src/server/scripts/Events/pilgrims_bounty.cpp +++ b/src/server/scripts/Events/pilgrims_bounty.cpp @@ -32,7 +32,7 @@ enum tableEvent SPELL_VISUAL_BOUNCE_STUFFING = 61927, SPELL_VISUAL_BOUNCE_PIE = 61926, SPELL_VISUAL_BOUNCE_CRANBERRY = 61925, - SPELL_VISUAL_BOUNCE_SWEET_POTATO= 61929, + SPELL_VISUAL_BOUNCE_SWEET_POTATO = 61929, SPELL_PLATE_TURKEY = 61835, SPELL_PLATE_STUFFING = 61836, @@ -89,222 +89,222 @@ enum tableEvent class npc_pilgrims_bounty_chair : public CreatureScript { - public: - npc_pilgrims_bounty_chair() : CreatureScript("npc_pilgrims_bounty_chair") { } +public: + npc_pilgrims_bounty_chair() : CreatureScript("npc_pilgrims_bounty_chair") { } - struct npc_pilgrims_bounty_chairAI : public VehicleAI + struct npc_pilgrims_bounty_chairAI : public VehicleAI + { + npc_pilgrims_bounty_chairAI(Creature* creature) : VehicleAI(creature) { - npc_pilgrims_bounty_chairAI(Creature* creature) : VehicleAI(creature) - { - plateGUID = 0; - timerSpawnPlate = 1; - timerRotateChair = 0; - me->SetReactState(REACT_PASSIVE); - } - - void MoveInLineOfSight(Unit* /*who*/) {} - void AttackStart(Unit*) {} - - void PassengerBoarded(Unit* who, int8 /*seatId*/, bool apply) - { - if (apply && who->GetTypeId() == TYPEID_PLAYER) - who->ToPlayer()->SetClientControl(me, 0, true); - } - - uint64 plateGUID; - uint32 timerSpawnPlate; - uint32 timerRotateChair; - - Creature* GetPlate() { return plateGUID ? ObjectAccessor::GetCreature(*me, plateGUID) : nullptr; } - - void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) - { - damage = 0; - } - - void DoAction(int32 param) - { - switch (param) - { - case SPELL_VISUAL_THROW_TURKEY: - case SPELL_VISUAL_BOUNCE_TURKEY: - me->CastSpell(me, SPELL_STORE_TURKEY, true); - me->CastSpell(me, SPELL_CAN_EAT_TURKEY, true); - if (Unit* plate = GetPlate()) - plate->CastSpell(plate, SPELL_PLATE_TURKEY, true); - break; - case SPELL_VISUAL_THROW_STUFFING: - case SPELL_VISUAL_BOUNCE_STUFFING: - me->CastSpell(me, SPELL_STORE_STUFFING, true); - me->CastSpell(me, SPELL_CAN_EAT_STUFFING, true); - if (Unit* plate = GetPlate()) - plate->CastSpell(plate, SPELL_PLATE_STUFFING, true); - break; - case SPELL_VISUAL_THROW_PIE: - case SPELL_VISUAL_BOUNCE_PIE: - me->CastSpell(me, SPELL_STORE_PIE, true); - me->CastSpell(me, SPELL_CAN_EAT_PIE, true); - if (Unit* plate = GetPlate()) - plate->CastSpell(plate, SPELL_PLATE_PIE, true); - break; - case SPELL_VISUAL_THROW_CRANBERRY: - case SPELL_VISUAL_BOUNCE_CRANBERRY: - me->CastSpell(me, SPELL_STORE_CRANBERRY, true); - me->CastSpell(me, SPELL_CAN_EAT_CRANBERRY, true); - if (Unit* plate = GetPlate()) - plate->CastSpell(plate, SPELL_PLATE_CRANBERRY, true); - break; - case SPELL_VISUAL_THROW_SWEET_POTATO: - case SPELL_VISUAL_BOUNCE_SWEET_POTATO: - me->CastSpell(me, SPELL_STORE_SWEET_POTATO, true); - me->CastSpell(me, SPELL_CAN_EAT_SWEET_POTATO, true); - if (Unit* plate = GetPlate()) - plate->CastSpell(plate, SPELL_PLATE_SWEET_POTATO, true); - break; - - // AURA REMOVAL - case SPELL_STORE_SWEET_POTATO: - me->RemoveAura(SPELL_CAN_EAT_SWEET_POTATO); - if (Unit* plate = GetPlate()) - plate->RemoveAura(SPELL_PLATE_SWEET_POTATO); - break; - case SPELL_STORE_TURKEY: - me->RemoveAura(SPELL_CAN_EAT_TURKEY); - if (Unit* plate = GetPlate()) - plate->RemoveAura(SPELL_PLATE_TURKEY); - break; - case SPELL_STORE_PIE: - me->RemoveAura(SPELL_CAN_EAT_PIE); - if (Unit* plate = GetPlate()) - plate->RemoveAura(SPELL_PLATE_PIE); - break; - case SPELL_STORE_STUFFING: - me->RemoveAura(SPELL_CAN_EAT_STUFFING); - if (Unit* plate = GetPlate()) - plate->RemoveAura(SPELL_PLATE_STUFFING); - break; - case SPELL_STORE_CRANBERRY: - me->RemoveAura(SPELL_CAN_EAT_CRANBERRY); - if (Unit* plate = GetPlate()) - plate->RemoveAura(SPELL_PLATE_CRANBERRY); - break; - } - } - - void SpellHitTarget(Unit* target, const SpellInfo* spellInfo) - { - Unit* charm = target->GetCharm(); - if (!charm || !charm->ToCreature()) - return; - - charm->ToCreature()->AI()->DoAction(spellInfo->Id); - } - - void SpellHit(Unit* /*target*/, const SpellInfo* spellInfo) - { - switch (spellInfo->Id) - { - case SPELL_FEAST_ON_SWEET_POTATOES: - if (Aura* aur = me->GetAura(SPELL_STORE_SWEET_POTATO)) - aur->ModStackAmount(-1); - break; - case SPELL_FEAST_ON_TURKEY: - if (Aura* aur = me->GetAura(SPELL_STORE_TURKEY)) - aur->ModStackAmount(-1); - break; - case SPELL_FEAST_ON_PIE: - if (Aura* aur = me->GetAura(SPELL_STORE_PIE)) - aur->ModStackAmount(-1); - break; - case SPELL_FEAST_ON_STUFFING: - if (Aura* aur = me->GetAura(SPELL_STORE_STUFFING)) - aur->ModStackAmount(-1); - break; - case SPELL_FEAST_ON_CRANBERRY: - if (Aura* aur = me->GetAura(SPELL_STORE_CRANBERRY)) - aur->ModStackAmount(-1); - break; - } - } - - void UpdateAI(uint32 diff) - { - if (timerSpawnPlate) - { - timerSpawnPlate += diff; - if (timerSpawnPlate >= 1000) - { - if (Vehicle* table = me->GetVehicle()) - if (Unit* plateHolder = table->GetPassenger(6)) - { - SeatMap::const_iterator itr = table->GetSeatIteratorForPassenger(me); - if (itr == table->Seats.end()) - return; - - uint8 vehicleSeatId = itr->first; - Creature* plate = me->SummonCreature(NPC_STRUDY_PLATE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0.0f); - if (!plate) - return; - - plateGUID = plate->GetGUID(); - plate->EnterVehicle(plateHolder, vehicleSeatId); - timerSpawnPlate = 0; - timerRotateChair = 1; - } - } - } - if (timerRotateChair) - { - timerRotateChair += diff; - if (timerRotateChair >= 1000) - { - if (Creature* plate = GetPlate()) - me->SetFacingToObject(plate); - - timerRotateChair = 0; - } - } - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_pilgrims_bounty_chairAI(creature); + plateGUID = 0; + timerSpawnPlate = 1; + timerRotateChair = 0; + me->SetReactState(REACT_PASSIVE); } + + void MoveInLineOfSight(Unit* /*who*/) {} + void AttackStart(Unit*) {} + + void PassengerBoarded(Unit* who, int8 /*seatId*/, bool apply) + { + if (apply && who->GetTypeId() == TYPEID_PLAYER) + who->ToPlayer()->SetClientControl(me, 0, true); + } + + uint64 plateGUID; + uint32 timerSpawnPlate; + uint32 timerRotateChair; + + Creature* GetPlate() { return plateGUID ? ObjectAccessor::GetCreature(*me, plateGUID) : nullptr; } + + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) + { + damage = 0; + } + + void DoAction(int32 param) + { + switch (param) + { + case SPELL_VISUAL_THROW_TURKEY: + case SPELL_VISUAL_BOUNCE_TURKEY: + me->CastSpell(me, SPELL_STORE_TURKEY, true); + me->CastSpell(me, SPELL_CAN_EAT_TURKEY, true); + if (Unit* plate = GetPlate()) + plate->CastSpell(plate, SPELL_PLATE_TURKEY, true); + break; + case SPELL_VISUAL_THROW_STUFFING: + case SPELL_VISUAL_BOUNCE_STUFFING: + me->CastSpell(me, SPELL_STORE_STUFFING, true); + me->CastSpell(me, SPELL_CAN_EAT_STUFFING, true); + if (Unit* plate = GetPlate()) + plate->CastSpell(plate, SPELL_PLATE_STUFFING, true); + break; + case SPELL_VISUAL_THROW_PIE: + case SPELL_VISUAL_BOUNCE_PIE: + me->CastSpell(me, SPELL_STORE_PIE, true); + me->CastSpell(me, SPELL_CAN_EAT_PIE, true); + if (Unit* plate = GetPlate()) + plate->CastSpell(plate, SPELL_PLATE_PIE, true); + break; + case SPELL_VISUAL_THROW_CRANBERRY: + case SPELL_VISUAL_BOUNCE_CRANBERRY: + me->CastSpell(me, SPELL_STORE_CRANBERRY, true); + me->CastSpell(me, SPELL_CAN_EAT_CRANBERRY, true); + if (Unit* plate = GetPlate()) + plate->CastSpell(plate, SPELL_PLATE_CRANBERRY, true); + break; + case SPELL_VISUAL_THROW_SWEET_POTATO: + case SPELL_VISUAL_BOUNCE_SWEET_POTATO: + me->CastSpell(me, SPELL_STORE_SWEET_POTATO, true); + me->CastSpell(me, SPELL_CAN_EAT_SWEET_POTATO, true); + if (Unit* plate = GetPlate()) + plate->CastSpell(plate, SPELL_PLATE_SWEET_POTATO, true); + break; + + // AURA REMOVAL + case SPELL_STORE_SWEET_POTATO: + me->RemoveAura(SPELL_CAN_EAT_SWEET_POTATO); + if (Unit* plate = GetPlate()) + plate->RemoveAura(SPELL_PLATE_SWEET_POTATO); + break; + case SPELL_STORE_TURKEY: + me->RemoveAura(SPELL_CAN_EAT_TURKEY); + if (Unit* plate = GetPlate()) + plate->RemoveAura(SPELL_PLATE_TURKEY); + break; + case SPELL_STORE_PIE: + me->RemoveAura(SPELL_CAN_EAT_PIE); + if (Unit* plate = GetPlate()) + plate->RemoveAura(SPELL_PLATE_PIE); + break; + case SPELL_STORE_STUFFING: + me->RemoveAura(SPELL_CAN_EAT_STUFFING); + if (Unit* plate = GetPlate()) + plate->RemoveAura(SPELL_PLATE_STUFFING); + break; + case SPELL_STORE_CRANBERRY: + me->RemoveAura(SPELL_CAN_EAT_CRANBERRY); + if (Unit* plate = GetPlate()) + plate->RemoveAura(SPELL_PLATE_CRANBERRY); + break; + } + } + + void SpellHitTarget(Unit* target, const SpellInfo* spellInfo) + { + Unit* charm = target->GetCharm(); + if (!charm || !charm->ToCreature()) + return; + + charm->ToCreature()->AI()->DoAction(spellInfo->Id); + } + + void SpellHit(Unit* /*target*/, const SpellInfo* spellInfo) + { + switch (spellInfo->Id) + { + case SPELL_FEAST_ON_SWEET_POTATOES: + if (Aura* aur = me->GetAura(SPELL_STORE_SWEET_POTATO)) + aur->ModStackAmount(-1); + break; + case SPELL_FEAST_ON_TURKEY: + if (Aura* aur = me->GetAura(SPELL_STORE_TURKEY)) + aur->ModStackAmount(-1); + break; + case SPELL_FEAST_ON_PIE: + if (Aura* aur = me->GetAura(SPELL_STORE_PIE)) + aur->ModStackAmount(-1); + break; + case SPELL_FEAST_ON_STUFFING: + if (Aura* aur = me->GetAura(SPELL_STORE_STUFFING)) + aur->ModStackAmount(-1); + break; + case SPELL_FEAST_ON_CRANBERRY: + if (Aura* aur = me->GetAura(SPELL_STORE_CRANBERRY)) + aur->ModStackAmount(-1); + break; + } + } + + void UpdateAI(uint32 diff) + { + if (timerSpawnPlate) + { + timerSpawnPlate += diff; + if (timerSpawnPlate >= 1000) + { + if (Vehicle* table = me->GetVehicle()) + if (Unit* plateHolder = table->GetPassenger(6)) + { + SeatMap::const_iterator itr = table->GetSeatIteratorForPassenger(me); + if (itr == table->Seats.end()) + return; + + uint8 vehicleSeatId = itr->first; + Creature* plate = me->SummonCreature(NPC_STRUDY_PLATE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0.0f); + if (!plate) + return; + + plateGUID = plate->GetGUID(); + plate->EnterVehicle(plateHolder, vehicleSeatId); + timerSpawnPlate = 0; + timerRotateChair = 1; + } + } + } + if (timerRotateChair) + { + timerRotateChair += diff; + if (timerRotateChair >= 1000) + { + if (Creature* plate = GetPlate()) + me->SetFacingToObject(plate); + + timerRotateChair = 0; + } + } + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_pilgrims_bounty_chairAI(creature); + } }; class npc_pilgrims_bounty_plate : public CreatureScript { - public: - npc_pilgrims_bounty_plate() : CreatureScript("npc_pilgrims_bounty_plate") { } +public: + npc_pilgrims_bounty_plate() : CreatureScript("npc_pilgrims_bounty_plate") { } - struct npc_pilgrims_bounty_plateAI : public NullCreatureAI + struct npc_pilgrims_bounty_plateAI : public NullCreatureAI + { + npc_pilgrims_bounty_plateAI(Creature* creature) : NullCreatureAI(creature) { - npc_pilgrims_bounty_plateAI(Creature* creature) : NullCreatureAI(creature) - { - } - - void SpellHit(Unit* /*caster*/, const SpellInfo* spellInfo) - { - switch (spellInfo->Id) - { - case SPELL_VISUAL_THROW_TURKEY: - case SPELL_VISUAL_THROW_STUFFING: - case SPELL_VISUAL_THROW_PIE: - case SPELL_VISUAL_THROW_CRANBERRY: - case SPELL_VISUAL_THROW_SWEET_POTATO: - if (TempSummon* ts = me->ToTempSummon()) - if (Unit* owner = ts->GetSummoner()) - owner->ToCreature()->AI()->DoAction(spellInfo->Id); - break; - } - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_pilgrims_bounty_plateAI(creature); } + + void SpellHit(Unit* /*caster*/, const SpellInfo* spellInfo) + { + switch (spellInfo->Id) + { + case SPELL_VISUAL_THROW_TURKEY: + case SPELL_VISUAL_THROW_STUFFING: + case SPELL_VISUAL_THROW_PIE: + case SPELL_VISUAL_THROW_CRANBERRY: + case SPELL_VISUAL_THROW_SWEET_POTATO: + if (TempSummon* ts = me->ToTempSummon()) + if (Unit* owner = ts->GetSummoner()) + owner->ToCreature()->AI()->DoAction(spellInfo->Id); + break; + } + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_pilgrims_bounty_plateAI(creature); + } }; ///////////////////////////// @@ -312,111 +312,121 @@ class npc_pilgrims_bounty_plate : public CreatureScript ///////////////////////////// class spell_pilgrims_bounty_pass_generic : public SpellScriptLoader { - public: - spell_pilgrims_bounty_pass_generic() : SpellScriptLoader("spell_pilgrims_bounty_pass_generic") {} +public: + spell_pilgrims_bounty_pass_generic() : SpellScriptLoader("spell_pilgrims_bounty_pass_generic") {} - class spell_pilgrims_bounty_pass_generic_SpellScript : public SpellScript + class spell_pilgrims_bounty_pass_generic_SpellScript : public SpellScript + { + PrepareSpellScript(spell_pilgrims_bounty_pass_generic_SpellScript); + + uint32 GetVisualThrow(uint32 passSpell, bool isPlayer) { - PrepareSpellScript(spell_pilgrims_bounty_pass_generic_SpellScript); - - uint32 GetVisualThrow(uint32 passSpell, bool isPlayer) + if (isPlayer) { - if (isPlayer) + switch (passSpell) { - switch (passSpell) + + case SPELL_PASS_TURKEY: + return SPELL_VISUAL_BOUNCE_TURKEY; + case SPELL_PASS_STUFFING: + return SPELL_VISUAL_BOUNCE_STUFFING; + case SPELL_PASS_PIE: + return SPELL_VISUAL_BOUNCE_PIE; + case SPELL_PASS_CRANBERRY: + return SPELL_VISUAL_BOUNCE_CRANBERRY; + case SPELL_PASS_SWEET_POTATO: + return SPELL_VISUAL_BOUNCE_SWEET_POTATO; + } + } + else + { + switch (passSpell) + { + + case SPELL_PASS_TURKEY: + return SPELL_VISUAL_THROW_TURKEY; + case SPELL_PASS_STUFFING: + return SPELL_VISUAL_THROW_STUFFING; + case SPELL_PASS_PIE: + return SPELL_VISUAL_THROW_PIE; + case SPELL_PASS_CRANBERRY: + return SPELL_VISUAL_THROW_CRANBERRY; + case SPELL_PASS_SWEET_POTATO: + return SPELL_VISUAL_THROW_SWEET_POTATO; + } + } + + return 0; + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + if (Unit* target = GetHitUnit()) + { + // player case + if (target->IsVehicle() && target->ToCreature()) + { + if (Player* player = target->GetCharmerOrOwnerPlayerOrPlayerItself()) { - - case SPELL_PASS_TURKEY: return SPELL_VISUAL_BOUNCE_TURKEY; - case SPELL_PASS_STUFFING: return SPELL_VISUAL_BOUNCE_STUFFING; - case SPELL_PASS_PIE: return SPELL_VISUAL_BOUNCE_PIE; - case SPELL_PASS_CRANBERRY: return SPELL_VISUAL_BOUNCE_CRANBERRY; - case SPELL_PASS_SWEET_POTATO: return SPELL_VISUAL_BOUNCE_SWEET_POTATO; + GetCaster()->CastSpell(player, GetVisualThrow(GetSpellInfo()->Id, true), true); + player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2, GetVisualThrow(GetSpellInfo()->Id, true)); } } + // normal case else { - switch (passSpell) - { - - case SPELL_PASS_TURKEY: return SPELL_VISUAL_THROW_TURKEY; - case SPELL_PASS_STUFFING: return SPELL_VISUAL_THROW_STUFFING; - case SPELL_PASS_PIE: return SPELL_VISUAL_THROW_PIE; - case SPELL_PASS_CRANBERRY: return SPELL_VISUAL_THROW_CRANBERRY; - case SPELL_PASS_SWEET_POTATO: return SPELL_VISUAL_THROW_SWEET_POTATO; - } - } + if (TempSummon* ts = target->ToTempSummon()) + if (Unit* owner = ts->GetSummoner()) + if (owner->GetEntry() == GetCaster()->GetEntry()) + return; - return 0; + GetCaster()->CastSpell(target, GetVisualThrow(GetSpellInfo()->Id, false), true); + } } - void HandleDummy(SpellEffIndex /*effIndex*/) + // Get chair charmer, passing achievement + if (Player* player = GetCaster()->GetCharmerOrOwnerPlayerOrPlayerItself()) { - if (Unit* target = GetHitUnit()) + uint32 spellId = 0; + switch (GetSpellInfo()->Id) { - // player case - if (target->IsVehicle() && target->ToCreature()) - { - if (Player* player = target->GetCharmerOrOwnerPlayerOrPlayerItself()) - { - GetCaster()->CastSpell(player, GetVisualThrow(GetSpellInfo()->Id, true), true); - player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2, GetVisualThrow(GetSpellInfo()->Id, true)); - } - } - // normal case - else - { - if (TempSummon* ts = target->ToTempSummon()) - if (Unit* owner = ts->GetSummoner()) - if (owner->GetEntry() == GetCaster()->GetEntry()) - return; - - GetCaster()->CastSpell(target, GetVisualThrow(GetSpellInfo()->Id, false), true); - } + case SPELL_PASS_TURKEY: + spellId = SPELL_ACHI_PASS_TURKEY; + break; + case SPELL_PASS_STUFFING: + spellId = SPELL_ACHI_PASS_STUFFING; + break; + case SPELL_PASS_PIE: + spellId = SPELL_ACHI_PASS_PIE; + break; + case SPELL_PASS_CRANBERRY: + spellId = SPELL_ACHI_PASS_CRANBERRY; + break; + case SPELL_PASS_SWEET_POTATO: + spellId = SPELL_ACHI_PASS_SWEET_POTATOES; + break; } - // Get chair charmer, passing achievement - if (Player* player = GetCaster()->GetCharmerOrOwnerPlayerOrPlayerItself()) - { - uint32 spellId = 0; - switch (GetSpellInfo()->Id) - { - case SPELL_PASS_TURKEY: - spellId = SPELL_ACHI_PASS_TURKEY; - break; - case SPELL_PASS_STUFFING: - spellId = SPELL_ACHI_PASS_STUFFING; - break; - case SPELL_PASS_PIE: - spellId = SPELL_ACHI_PASS_PIE; - break; - case SPELL_PASS_CRANBERRY: - spellId = SPELL_ACHI_PASS_CRANBERRY; - break; - case SPELL_PASS_SWEET_POTATO: - spellId = SPELL_ACHI_PASS_SWEET_POTATOES; - break; - } - - if (spellId) - player->CastSpell(player, spellId, true); - } + if (spellId) + player->CastSpell(player, spellId, true); } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_pilgrims_bounty_pass_generic_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_pilgrims_bounty_pass_generic_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_pilgrims_bounty_pass_generic_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_pilgrims_bounty_pass_generic_SpellScript(); + } }; class spell_pilgrims_bounty_feast_on_generic : public SpellScriptLoader { - public: +public: spell_pilgrims_bounty_feast_on_generic() : SpellScriptLoader("spell_pilgrims_bounty_feast_on_generic") {} class spell_pilgrims_bounty_feast_on_generic_SpellScript : public SpellScript @@ -512,7 +522,7 @@ enum tTracker class spell_pilgrims_bounty_turkey_tracker : public SpellScriptLoader { - public: +public: spell_pilgrims_bounty_turkey_tracker() : SpellScriptLoader("spell_pilgrims_bounty_turkey_tracker") {} class spell_pilgrims_bounty_turkey_tracker_SpellScript : public SpellScript @@ -559,92 +569,92 @@ class spell_pilgrims_bounty_turkey_tracker : public SpellScriptLoader class spell_pilgrims_bounty_serve_generic : public SpellScriptLoader { - public: - spell_pilgrims_bounty_serve_generic() : SpellScriptLoader("spell_pilgrims_bounty_serve_generic") { } +public: + spell_pilgrims_bounty_serve_generic() : SpellScriptLoader("spell_pilgrims_bounty_serve_generic") { } - class spell_pilgrims_bounty_serve_generic_AuraScript : public AuraScript + class spell_pilgrims_bounty_serve_generic_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pilgrims_bounty_serve_generic_AuraScript); + + void OnAuraRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_pilgrims_bounty_serve_generic_AuraScript); - - void OnAuraRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - if (target->GetTypeId() == TYPEID_UNIT) - target->ToCreature()->AI()->DoAction(GetSpellInfo()->Id); - } - - void Register() - { - OnEffectRemove += AuraEffectRemoveFn(spell_pilgrims_bounty_serve_generic_AuraScript::OnAuraRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_pilgrims_bounty_serve_generic_AuraScript(); + Unit* target = GetTarget(); + if (target->GetTypeId() == TYPEID_UNIT) + target->ToCreature()->AI()->DoAction(GetSpellInfo()->Id); } + + void Register() + { + OnEffectRemove += AuraEffectRemoveFn(spell_pilgrims_bounty_serve_generic_AuraScript::OnAuraRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_pilgrims_bounty_serve_generic_AuraScript(); + } }; class spell_pilgrims_bounty_food : public SpellScriptLoader { - public: - spell_pilgrims_bounty_food() : SpellScriptLoader("spell_pilgrims_bounty_food") { } +public: + spell_pilgrims_bounty_food() : SpellScriptLoader("spell_pilgrims_bounty_food") { } - class spell_pilgrims_bounty_food_AuraScript : public AuraScript + class spell_pilgrims_bounty_food_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pilgrims_bounty_food_AuraScript); + + void RecalculateHook(AuraEffect const* /*aurEffect*/, int32& amount, bool& canBeRecalculated) { - PrepareAuraScript(spell_pilgrims_bounty_food_AuraScript); - - void RecalculateHook(AuraEffect const* /*aurEffect*/, int32& amount, bool& canBeRecalculated) + if (GetCaster()) { - if (GetCaster()) - { - if (GetId() == 66041) - amount = CalculatePct(GetCaster()->GetMaxPower(POWER_MANA), 20); - else - amount = CalculatePct(GetCaster()->GetMaxHealth(), 15); - } - canBeRecalculated = true; + if (GetId() == 66041) + amount = CalculatePct(GetCaster()->GetMaxPower(POWER_MANA), 20); + else + amount = CalculatePct(GetCaster()->GetMaxHealth(), 15); } - - void Register() - { - if (m_scriptSpellId == 66041) - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pilgrims_bounty_food_AuraScript::RecalculateHook, EFFECT_0, SPELL_AURA_MOD_POWER_REGEN); - else if (m_scriptSpellId != 66477) - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pilgrims_bounty_food_AuraScript::RecalculateHook, EFFECT_0, SPELL_AURA_MOD_REGEN); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_pilgrims_bounty_food_AuraScript(); + canBeRecalculated = true; } - class spell_pilgrims_bounty_food_SpellScript : public SpellScript + void Register() { - PrepareSpellScript(spell_pilgrims_bounty_food_SpellScript); - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - { - target->AddAura(sSpellMgr->GetSpellInfo(65422), 1, target); - target->CastSpell(target, 66041, true); - target->CastSpell(target, 66622, true); - } - } - - void Register() - { - if (m_scriptSpellId == 66477) - OnEffectHitTarget += SpellEffectFn(spell_pilgrims_bounty_food_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_pilgrims_bounty_food_SpellScript(); + if (m_scriptSpellId == 66041) + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pilgrims_bounty_food_AuraScript::RecalculateHook, EFFECT_0, SPELL_AURA_MOD_POWER_REGEN); + else if (m_scriptSpellId != 66477) + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pilgrims_bounty_food_AuraScript::RecalculateHook, EFFECT_0, SPELL_AURA_MOD_REGEN); } + }; + + AuraScript* GetAuraScript() const + { + return new spell_pilgrims_bounty_food_AuraScript(); + } + + class spell_pilgrims_bounty_food_SpellScript : public SpellScript + { + PrepareSpellScript(spell_pilgrims_bounty_food_SpellScript); + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + if (Unit* target = GetHitUnit()) + { + target->AddAura(sSpellMgr->GetSpellInfo(65422), 1, target); + target->CastSpell(target, 66041, true); + target->CastSpell(target, 66622, true); + } + } + + void Register() + { + if (m_scriptSpellId == 66477) + OnEffectHitTarget += SpellEffectFn(spell_pilgrims_bounty_food_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_pilgrims_bounty_food_SpellScript(); + } }; ///////////////////////////// @@ -660,30 +670,30 @@ enum pilgrimsPeril class achievement_pb_pilgrims_peril : public AchievementCriteriaScript { - public: - achievement_pb_pilgrims_peril() : AchievementCriteriaScript("achievement_pb_pilgrims_peril") { } +public: + achievement_pb_pilgrims_peril() : AchievementCriteriaScript("achievement_pb_pilgrims_peril") { } - bool OnCheck(Player* source, Unit* /*target*/) - { - if (source->HasItemOrGemWithIdEquipped(ITEM_PILGRIMS_DRESS, 1) || source->HasItemOrGemWithIdEquipped(ITEM_PILGRIMS_ROBE, 1) || source->HasItemOrGemWithIdEquipped(ITEM_PILGRIMS_ATTIRE, 1)) - return true; + bool OnCheck(Player* source, Unit* /*target*/) + { + if (source->HasItemOrGemWithIdEquipped(ITEM_PILGRIMS_DRESS, 1) || source->HasItemOrGemWithIdEquipped(ITEM_PILGRIMS_ROBE, 1) || source->HasItemOrGemWithIdEquipped(ITEM_PILGRIMS_ATTIRE, 1)) + return true; - return false; - } + return false; + } }; class achievement_pb_terokkar_turkey_time : public AchievementCriteriaScript { - public: - achievement_pb_terokkar_turkey_time() : AchievementCriteriaScript("achievement_pb_terokkar_turkey_time") { } +public: + achievement_pb_terokkar_turkey_time() : AchievementCriteriaScript("achievement_pb_terokkar_turkey_time") { } - bool OnCheck(Player* source, Unit* /*target*/) - { - if (source->HasItemOrGemWithIdEquipped(ITEM_PILGRIMS_HAT, 1) && (source->HasItemOrGemWithIdEquipped(ITEM_PILGRIMS_DRESS, 1) || source->HasItemOrGemWithIdEquipped(ITEM_PILGRIMS_ROBE, 1) || source->HasItemOrGemWithIdEquipped(ITEM_PILGRIMS_ATTIRE, 1))) - return true; + bool OnCheck(Player* source, Unit* /*target*/) + { + if (source->HasItemOrGemWithIdEquipped(ITEM_PILGRIMS_HAT, 1) && (source->HasItemOrGemWithIdEquipped(ITEM_PILGRIMS_DRESS, 1) || source->HasItemOrGemWithIdEquipped(ITEM_PILGRIMS_ROBE, 1) || source->HasItemOrGemWithIdEquipped(ITEM_PILGRIMS_ATTIRE, 1))) + return true; - return false; - } + return false; + } }; void AddSC_event_pilgrims_end_scripts() @@ -694,7 +704,7 @@ void AddSC_event_pilgrims_end_scripts() new spell_pilgrims_bounty_turkey_tracker(); new spell_pilgrims_bounty_serve_generic(); new spell_pilgrims_bounty_food(); - + // Npcs new npc_pilgrims_bounty_chair(); new npc_pilgrims_bounty_plate(); diff --git a/src/server/scripts/Events/winter_veil.cpp b/src/server/scripts/Events/winter_veil.cpp index 931bc2858..7322d326b 100644 --- a/src/server/scripts/Events/winter_veil.cpp +++ b/src/server/scripts/Events/winter_veil.cpp @@ -21,41 +21,41 @@ enum Mistletoe class spell_winter_veil_mistletoe : public SpellScriptLoader { - public: - spell_winter_veil_mistletoe() : SpellScriptLoader("spell_winter_veil_mistletoe") { } +public: + spell_winter_veil_mistletoe() : SpellScriptLoader("spell_winter_veil_mistletoe") { } - class spell_winter_veil_mistletoe_SpellScript : public SpellScript + class spell_winter_veil_mistletoe_SpellScript : public SpellScript + { + PrepareSpellScript(spell_winter_veil_mistletoe_SpellScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareSpellScript(spell_winter_veil_mistletoe_SpellScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_CREATE_MISTLETOE) || + if (!sSpellMgr->GetSpellInfo(SPELL_CREATE_MISTLETOE) || !sSpellMgr->GetSpellInfo(SPELL_CREATE_HOLLY) || !sSpellMgr->GetSpellInfo(SPELL_CREATE_SNOWFLAKES)) - return false; - return true; - } - - void HandleScript(SpellEffIndex /*effIndex*/) - { - if (Player* target = GetHitPlayer()) - { - uint32 spellId = RAND(SPELL_CREATE_HOLLY, SPELL_CREATE_MISTLETOE, SPELL_CREATE_SNOWFLAKES); - GetCaster()->CastSpell(target, spellId, true); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_winter_veil_mistletoe_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_winter_veil_mistletoe_SpellScript(); + return false; + return true; } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + if (Player* target = GetHitPlayer()) + { + uint32 spellId = RAND(SPELL_CREATE_HOLLY, SPELL_CREATE_MISTLETOE, SPELL_CREATE_SNOWFLAKES); + GetCaster()->CastSpell(target, spellId, true); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_winter_veil_mistletoe_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_winter_veil_mistletoe_SpellScript(); + } }; enum winterWondervoltTrap @@ -68,7 +68,7 @@ enum winterWondervoltTrap class spell_winter_wondervolt_trap : public SpellScriptLoader { - public: +public: spell_winter_wondervolt_trap() : SpellScriptLoader("spell_winter_wondervolt_trap") {} class spell_winter_wondervolt_trap_SpellScript : public SpellScript @@ -125,7 +125,7 @@ enum crashinTrashin class spell_winter_veil_racer_rocket_slam : public SpellScriptLoader { - public: +public: spell_winter_veil_racer_rocket_slam() : SpellScriptLoader("spell_winter_veil_racer_rocket_slam") {} class spell_winter_veil_racer_rocket_slam_SpellScript : public SpellScript @@ -169,9 +169,9 @@ class spell_winter_veil_racer_rocket_slam : public SpellScriptLoader else { Position pos; - float x = caster->GetPositionX()+30*cos(caster->GetOrientation()); - float y = caster->GetPositionY()+30*sin(caster->GetOrientation()); - pos.Relocate(x, y, caster->GetMap()->GetHeight(x, y, MAX_HEIGHT)+0.5f); + float x = caster->GetPositionX() + 30 * cos(caster->GetOrientation()); + float y = caster->GetPositionY() + 30 * sin(caster->GetOrientation()); + pos.Relocate(x, y, caster->GetMap()->GetHeight(x, y, MAX_HEIGHT) + 0.5f); //caster->GetFirstCollisionPosition(pos, 30.0f, caster->GetOrientation()); caster->CastSpell(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), SPELL_RACER_CHARGE_TO_OBJECT, true); } @@ -191,7 +191,7 @@ class spell_winter_veil_racer_rocket_slam : public SpellScriptLoader class spell_winter_veil_racer_slam_hit : public SpellScriptLoader { - public: +public: spell_winter_veil_racer_slam_hit() : SpellScriptLoader("spell_winter_veil_racer_slam_hit") {} class spell_winter_veil_racer_slam_hit_SpellScript : public SpellScript @@ -205,7 +205,7 @@ class spell_winter_veil_racer_slam_hit : public SpellScriptLoader if (!target || caster == target) return; - target->CastSpell(target->GetPositionX()+irand(-10, 10), target->GetPositionY()+irand(-10, 10), target->GetPositionZ() , SPELL_RACER_DEATH_VISUAL, true); + target->CastSpell(target->GetPositionX() + irand(-10, 10), target->GetPositionY() + irand(-10, 10), target->GetPositionZ(), SPELL_RACER_DEATH_VISUAL, true); target->DespawnOrUnsummon(3000); target->CastSpell(target, SPELL_RACER_FLAMES, true); caster->CastSpell(caster, SPELL_RACER_KILL_COUNTER, true); @@ -240,7 +240,7 @@ enum airRifle class spell_winter_veil_shoot_air_rifle : public SpellScriptLoader { - public: +public: spell_winter_veil_shoot_air_rifle() : SpellScriptLoader("spell_winter_veil_shoot_air_rifle") {} class spell_winter_veil_shoot_air_rifle_SpellScript : public SpellScript diff --git a/src/server/scripts/Kalimdor/BlackfathomDeeps/instance_blackfathom_deeps.cpp b/src/server/scripts/Kalimdor/BlackfathomDeeps/instance_blackfathom_deeps.cpp index 42341c7e2..482785843 100644 --- a/src/server/scripts/Kalimdor/BlackfathomDeeps/instance_blackfathom_deeps.cpp +++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/instance_blackfathom_deeps.cpp @@ -8,122 +8,122 @@ class instance_blackfathom_deeps : public InstanceMapScript { - public: - instance_blackfathom_deeps() : InstanceMapScript("instance_blackfathom_deeps", 48) { } +public: + instance_blackfathom_deeps() : InstanceMapScript("instance_blackfathom_deeps", 48) { } - InstanceScript* GetInstanceScript(InstanceMap* map) const + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_blackfathom_deeps_InstanceMapScript(map); + } + + struct instance_blackfathom_deeps_InstanceMapScript : public InstanceScript + { + instance_blackfathom_deeps_InstanceMapScript(Map* map) : InstanceScript(map) { } + + void Initialize() { - return new instance_blackfathom_deeps_InstanceMapScript(map); + memset(&_encounters, 0, sizeof(_encounters)); + _akumaiPortalGUID = 0; + _requiredDeaths = 0; } - struct instance_blackfathom_deeps_InstanceMapScript : public InstanceScript + void OnCreatureCreate(Creature* creature) { - instance_blackfathom_deeps_InstanceMapScript(Map* map) : InstanceScript(map) { } + if (creature->IsSummon() && (creature->GetEntry() == NPC_BARBED_CRUSTACEAN || creature->GetEntry() == NPC_AKU_MAI_SERVANT || + creature->GetEntry() == NPC_MURKSHALLOW_SOFTSHELL || creature->GetEntry() == NPC_AKU_MAI_SNAPJAW)) + ++_requiredDeaths; + } - void Initialize() + void OnUnitDeath(Unit* unit) + { + if (unit->IsSummon() && (unit->GetEntry() == NPC_BARBED_CRUSTACEAN || unit->GetEntry() == NPC_AKU_MAI_SERVANT || + unit->GetEntry() == NPC_MURKSHALLOW_SOFTSHELL || unit->GetEntry() == NPC_AKU_MAI_SNAPJAW)) { - memset(&_encounters, 0, sizeof(_encounters)); - _akumaiPortalGUID = 0; - _requiredDeaths = 0; + if (--_requiredDeaths == 0) + if (_encounters[TYPE_FIRE1] == DONE && _encounters[TYPE_FIRE2] == DONE && _encounters[TYPE_FIRE3] == DONE && _encounters[TYPE_FIRE4] == DONE) + HandleGameObject(_akumaiPortalGUID, true); } + } - void OnCreatureCreate(Creature* creature) + void OnGameObjectCreate(GameObject* gameobject) + { + switch (gameobject->GetEntry()) { - if (creature->IsSummon() && (creature->GetEntry() == NPC_BARBED_CRUSTACEAN || creature->GetEntry() == NPC_AKU_MAI_SERVANT || - creature->GetEntry() == NPC_MURKSHALLOW_SOFTSHELL || creature->GetEntry() == NPC_AKU_MAI_SNAPJAW)) - ++_requiredDeaths; - } - - void OnUnitDeath(Unit* unit) - { - if (unit->IsSummon() && (unit->GetEntry() == NPC_BARBED_CRUSTACEAN || unit->GetEntry() == NPC_AKU_MAI_SERVANT || - unit->GetEntry() == NPC_MURKSHALLOW_SOFTSHELL || unit->GetEntry() == NPC_AKU_MAI_SNAPJAW)) - { - if (--_requiredDeaths == 0) - if (_encounters[TYPE_FIRE1] == DONE && _encounters[TYPE_FIRE2] == DONE && _encounters[TYPE_FIRE3] == DONE && _encounters[TYPE_FIRE4] == DONE) - HandleGameObject(_akumaiPortalGUID, true); - } - } - - void OnGameObjectCreate(GameObject* gameobject) - { - switch (gameobject->GetEntry()) - { - case GO_FIRE_OF_AKU_MAI_1: - case GO_FIRE_OF_AKU_MAI_2: - case GO_FIRE_OF_AKU_MAI_3: - case GO_FIRE_OF_AKU_MAI_4: - if (_encounters[gameobject->GetEntry() - GO_FIRE_OF_AKU_MAI_1 + 1] == DONE) - { - gameobject->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); - gameobject->SetGoState(GO_STATE_ACTIVE); - } - break; - case GO_SHRINE_OF_GELIHAST: - if (_encounters[TYPE_GELIHAST] == DONE) - gameobject->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - break; - case GO_ALTAR_OF_THE_DEEPS: - if (_encounters[TYPE_AKU_MAI] == DONE) - gameobject->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - break; - case GO_AKU_MAI_DOOR: - if (_encounters[TYPE_FIRE1] == DONE && _encounters[TYPE_FIRE2] == DONE && _encounters[TYPE_FIRE3] == DONE && _encounters[TYPE_FIRE4] == DONE) - HandleGameObject(0, true, gameobject); - _akumaiPortalGUID = gameobject->GetGUID(); - break; - } - } - - void SetData(uint32 type, uint32 data) - { - switch (type) - { - case TYPE_GELIHAST: - case TYPE_FIRE1: - case TYPE_FIRE2: - case TYPE_FIRE3: - case TYPE_FIRE4: - case TYPE_AKU_MAI: - _encounters[type] = data; - break; - } - - if (data == DONE) - SaveToDB(); - } - - std::string GetSaveData() - { - std::ostringstream saveStream; - saveStream << "B L " << _encounters[0] << ' ' << _encounters[1] << ' ' << _encounters[2] << ' ' << _encounters[3] << ' ' << _encounters[4] << ' ' << _encounters[5]; - return saveStream.str(); - } - - void Load(const char* in) - { - if (!in) - return; - - char dataHead1, dataHead2; - std::istringstream loadStream(in); - loadStream >> dataHead1 >> dataHead2; - if (dataHead1 == 'B' && dataHead2 == 'L') - { - for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) + case GO_FIRE_OF_AKU_MAI_1: + case GO_FIRE_OF_AKU_MAI_2: + case GO_FIRE_OF_AKU_MAI_3: + case GO_FIRE_OF_AKU_MAI_4: + if (_encounters[gameobject->GetEntry() - GO_FIRE_OF_AKU_MAI_1 + 1] == DONE) { - loadStream >> _encounters[i]; - if (_encounters[i] == IN_PROGRESS) - _encounters[i] = NOT_STARTED; + gameobject->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); + gameobject->SetGoState(GO_STATE_ACTIVE); } - } + break; + case GO_SHRINE_OF_GELIHAST: + if (_encounters[TYPE_GELIHAST] == DONE) + gameobject->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + break; + case GO_ALTAR_OF_THE_DEEPS: + if (_encounters[TYPE_AKU_MAI] == DONE) + gameobject->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + break; + case GO_AKU_MAI_DOOR: + if (_encounters[TYPE_FIRE1] == DONE && _encounters[TYPE_FIRE2] == DONE && _encounters[TYPE_FIRE3] == DONE && _encounters[TYPE_FIRE4] == DONE) + HandleGameObject(0, true, gameobject); + _akumaiPortalGUID = gameobject->GetGUID(); + break; + } + } + + void SetData(uint32 type, uint32 data) + { + switch (type) + { + case TYPE_GELIHAST: + case TYPE_FIRE1: + case TYPE_FIRE2: + case TYPE_FIRE3: + case TYPE_FIRE4: + case TYPE_AKU_MAI: + _encounters[type] = data; + break; } - private: - uint32 _encounters[MAX_ENCOUNTERS]; - uint64 _akumaiPortalGUID; - uint8 _requiredDeaths; - }; + if (data == DONE) + SaveToDB(); + } + + std::string GetSaveData() + { + std::ostringstream saveStream; + saveStream << "B L " << _encounters[0] << ' ' << _encounters[1] << ' ' << _encounters[2] << ' ' << _encounters[3] << ' ' << _encounters[4] << ' ' << _encounters[5]; + return saveStream.str(); + } + + void Load(const char* in) + { + if (!in) + return; + + char dataHead1, dataHead2; + std::istringstream loadStream(in); + loadStream >> dataHead1 >> dataHead2; + if (dataHead1 == 'B' && dataHead2 == 'L') + { + for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) + { + loadStream >> _encounters[i]; + if (_encounters[i] == IN_PROGRESS) + _encounters[i] = NOT_STARTED; + } + } + } + + private: + uint32 _encounters[MAX_ENCOUNTERS]; + uint64 _akumaiPortalGUID; + uint8 _requiredDeaths; + }; }; void AddSC_instance_blackfathom_deeps() diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp index 361952a6c..f648f7358 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp @@ -130,7 +130,8 @@ public: SwarmTimer = urand(45000, 60000); Talk(SAY_SWARM); - } else SwarmTimer -= diff; + } + else SwarmTimer -= diff; if (SleepTimer <= diff) { @@ -141,18 +142,21 @@ public: } SleepTimer = 60000; Talk(SAY_SLEEP); - } else SleepTimer -= diff; + } + else SleepTimer -= diff; if (AuraTimer <= diff) { DoCast(me, SPELL_VAMPIRIC_AURA, true); AuraTimer = urand(10000, 20000); - } else AuraTimer -= diff; + } + else AuraTimer -= diff; if (InfernoTimer <= diff) { DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_INFERNO); InfernoTimer = 45000; Talk(SAY_INFERNO); - } else InfernoTimer -= diff; + } + else InfernoTimer -= diff; DoMeleeAttackIfReady(); } @@ -224,7 +228,8 @@ public: } } CheckTimer = 5000; - } else CheckTimer -= diff; + } + else CheckTimer -= diff; //Return since we have no target if (!UpdateVictim()) @@ -234,7 +239,8 @@ public: { DoCast(me, SPELL_IMMOLATION); ImmolationTimer = 5000; - } else ImmolationTimer -= diff; + } + else ImmolationTimer -= diff; DoMeleeAttackIfReady(); } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp index 434937416..607386118 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp @@ -4,12 +4,12 @@ * Copyright (C) 2005-2009 MaNGOS */ - /* ScriptData - SDName: Boss_Archimonde - SD%Complete: 85 - SDComment: Doomfires not completely offlike due to core limitations for random moving. Tyrande and second phase not fully implemented. - SDCategory: Caverns of Time, Mount Hyjal - EndScriptData */ +/* ScriptData +SDName: Boss_Archimonde +SD%Complete: 85 +SDComment: Doomfires not completely offlike due to core limitations for random moving. Tyrande and second phase not fully implemented. +SDCategory: Caverns of Time, Mount Hyjal +EndScriptData */ #include "ScriptMgr.h" #include "ScriptedCreature.h" @@ -119,7 +119,7 @@ public: void EnterCombat(Unit* /*who*/) { } - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) { damage = 0; } @@ -164,7 +164,7 @@ public: void EnterCombat(Unit* /*who*/) { } - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) { damage = 0; } @@ -207,7 +207,7 @@ public: void EnterCombat(Unit* /*who*/) { } - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) { damage = 0; } @@ -256,7 +256,7 @@ public: struct boss_archimondeAI : public BossAI { boss_archimondeAI(Creature* creature) : BossAI(creature, BOSS_ARCHIMONDE), summons(me), - Enraged(false), BelowTenPercent(false), HasProtected(false), IsChanneling(false) + Enraged(false), BelowTenPercent(false), HasProtected(false), IsChanneling(false) { instance = creature->GetInstanceScript(); } @@ -316,7 +316,7 @@ public: return; // Now lets get archimode threat list - ThreatContainer::StorageType const &t_list = me->getThreatManager().getThreatList(); + ThreatContainer::StorageType const& t_list = me->getThreatManager().getThreatList(); if (t_list.empty()) return; @@ -426,7 +426,7 @@ public: if (victim && me->IsWithinMeleeRange(victim)) return false; - ThreatContainer::StorageType const &threatlist = me->getThreatManager().getThreatList(); + ThreatContainer::StorageType const& threatlist = me->getThreatManager().getThreatList(); if (threatlist.empty()) return false; @@ -493,12 +493,12 @@ public: void SummonDoomfire(Unit* target) { Unit* doomfire1 = me->SummonCreature(CREATURE_DOOMFIRE_SPIRIT, - target->GetPositionX() + 15.0f, target->GetPositionY() + 15.0f, target->GetPositionZ(), 0, - TEMPSUMMON_TIMED_DESPAWN, 27000); + target->GetPositionX() + 15.0f, target->GetPositionY() + 15.0f, target->GetPositionZ(), 0, + TEMPSUMMON_TIMED_DESPAWN, 27000); Unit* doomfire2 = me->SummonCreature(CREATURE_DOOMFIRE, - target->GetPositionX() - 15.0f, target->GetPositionY() - 15.0f, target->GetPositionZ(), 0, - TEMPSUMMON_TIMED_DESPAWN, 27000); + target->GetPositionX() - 15.0f, target->GetPositionY() - 15.0f, target->GetPositionZ(), 0, + TEMPSUMMON_TIMED_DESPAWN, 27000); doomfire1->SetVisible(false); doomfire2->SetVisible(false); @@ -548,7 +548,7 @@ public: me->SetVisible(false); me->setFaction(35); } - + if ((instance->GetData(DATA_AZGALOREVENT) >= DONE) && (!me->IsVisible() || (me->getFaction() == 35))) { me->setFaction(1720); @@ -592,22 +592,22 @@ public: switch (events.ExecuteEvent()) { case EVENT_CHECK_WORLD_TREE_DISTANCE: - { - // If Archimonde is too close to the world tree this will ENRAGE him - Creature* Check = me->SummonCreature(CREATURE_CHANNEL_TARGET, NordrassilLoc, TEMPSUMMON_TIMED_DESPAWN, 2000); - if (Check) { - Check->SetVisible(false); - - if (me->IsWithinDistInMap(Check, 75)) + // If Archimonde is too close to the world tree this will ENRAGE him + Creature* Check = me->SummonCreature(CREATURE_CHANNEL_TARGET, NordrassilLoc, TEMPSUMMON_TIMED_DESPAWN, 2000); + if (Check) { - events.ScheduleEvent(EVENT_TOO_CLOSE_TO_WORLD_TREE, 0); - break; + Check->SetVisible(false); + + if (me->IsWithinDistInMap(Check, 75)) + { + events.ScheduleEvent(EVENT_TOO_CLOSE_TO_WORLD_TREE, 0); + break; + } } + events.RepeatEvent(5000); + break; } - events.RepeatEvent(5000); - break; - } case EVENT_BELOW_10_PERCENT_HP: DoCastProtection(); // Protection of Elune against Finger and Hand of Death BelowTenPercent = true; @@ -685,29 +685,29 @@ public: class spell_red_sky_effect : public SpellScriptLoader { - public: - spell_red_sky_effect() : SpellScriptLoader("spell_red_sky_effect") { } +public: + spell_red_sky_effect() : SpellScriptLoader("spell_red_sky_effect") { } - class spell_red_sky_effect_SpellScript : public SpellScript + class spell_red_sky_effect_SpellScript : public SpellScript + { + PrepareSpellScript(spell_red_sky_effect_SpellScript); + + void HandleHit(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_red_sky_effect_SpellScript); - - void HandleHit(SpellEffIndex /*effIndex*/) - { - if (GetHitUnit()) - PreventHitDamage(); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_red_sky_effect_SpellScript::HandleHit, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_red_sky_effect_SpellScript(); + if (GetHitUnit()) + PreventHitDamage(); } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_red_sky_effect_SpellScript::HandleHit, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_red_sky_effect_SpellScript(); + } }; class spell_finger_of_death : public SpellScriptLoader diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp index 8551a4c15..8a9bc1df5 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp @@ -131,26 +131,30 @@ public: if (RainTimer <= diff) { DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 30, true), SPELL_RAIN_OF_FIRE); - RainTimer = 20000+rand()%15000; - } else RainTimer -= diff; + RainTimer = 20000 + rand() % 15000; + } + else RainTimer -= diff; if (DoomTimer <= diff) { DoCast(SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true), SPELL_DOOM);//never on tank - DoomTimer = 45000+rand()%5000; - } else DoomTimer -= diff; + DoomTimer = 45000 + rand() % 5000; + } + else DoomTimer -= diff; if (HowlTimer <= diff) { DoCast(me, SPELL_HOWL_OF_AZGALOR); HowlTimer = 30000; - } else HowlTimer -= diff; + } + else HowlTimer -= diff; if (CleaveTimer <= diff) { DoCastVictim(SPELL_CLEAVE); - CleaveTimer = 10000+rand()%5000; - } else CleaveTimer -= diff; + CleaveTimer = 10000 + rand() % 5000; + } + else CleaveTimer -= diff; if (EnrageTimer < diff && !enraged) { @@ -158,7 +162,8 @@ public: DoCast(me, SPELL_BERSERK, true); enraged = true; EnrageTimer = 600000; - } else EnrageTimer -= diff; + } + else EnrageTimer -= diff; DoMeleeAttackIfReady(); } @@ -236,7 +241,8 @@ public: } } CheckTimer = 5000; - } else CheckTimer -= diff; + } + else CheckTimer -= diff; //Return since we have no target if (!UpdateVictim()) @@ -245,14 +251,16 @@ public: if (WarstompTimer <= diff) { DoCast(me, SPELL_WARSTOMP); - WarstompTimer = 10000+rand()%5000; - } else WarstompTimer -= diff; + WarstompTimer = 10000 + rand() % 5000; + } + else WarstompTimer -= diff; if (CrippleTimer <= diff) { DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_CRIPPLE); - CrippleTimer = 25000+rand()%5000; - } else CrippleTimer -= diff; + CrippleTimer = 25000 + rand() % 5000; + } + else CrippleTimer -= diff; DoMeleeAttackIfReady(); } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp index 1b6882ad2..ad13fa21a 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp @@ -126,14 +126,16 @@ public: if (CleaveTimer <= diff) { DoCast(me, SPELL_CLEAVE); - CleaveTimer = 6000+rand()%15000; - } else CleaveTimer -= diff; + CleaveTimer = 6000 + rand() % 15000; + } + else CleaveTimer -= diff; if (WarStompTimer <= diff) { DoCast(me, SPELL_WARSTOMP); WarStompTimer = 60000; - } else WarStompTimer -= diff; + } + else WarStompTimer -= diff; if (MarkTimer <= diff) { @@ -144,7 +146,8 @@ public: MarkTimerBase = 5500; MarkTimer = MarkTimerBase; Talk(SAY_MARK); - } else MarkTimer -= diff; + } + else MarkTimer -= diff; DoMeleeAttackIfReady(); } @@ -154,62 +157,62 @@ public: class spell_mark_of_kazrogal : public SpellScriptLoader { - public: - spell_mark_of_kazrogal() : SpellScriptLoader("spell_mark_of_kazrogal") { } +public: + spell_mark_of_kazrogal() : SpellScriptLoader("spell_mark_of_kazrogal") { } - class spell_mark_of_kazrogal_SpellScript : public SpellScript + class spell_mark_of_kazrogal_SpellScript : public SpellScript + { + PrepareSpellScript(spell_mark_of_kazrogal_SpellScript); + + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_mark_of_kazrogal_SpellScript); - - void FilterTargets(std::list& targets) - { - targets.remove_if(acore::PowerCheck(POWER_MANA, false)); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mark_of_kazrogal_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - class spell_mark_of_kazrogal_AuraScript : public AuraScript - { - PrepareAuraScript(spell_mark_of_kazrogal_AuraScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_MARK_DAMAGE)) - return false; - return true; - } - - void OnPeriodic(AuraEffect const* aurEff) - { - Unit* target = GetTarget(); - - if (target->GetPower(POWER_MANA) == 0) - { - target->CastSpell(target, SPELL_MARK_DAMAGE, true, NULL, aurEff); - // Remove aura - SetDuration(0); - } - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_mark_of_kazrogal_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_MANA_LEECH); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_mark_of_kazrogal_SpellScript(); + targets.remove_if(acore::PowerCheck(POWER_MANA, false)); } - AuraScript* GetAuraScript() const + void Register() { - return new spell_mark_of_kazrogal_AuraScript(); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mark_of_kazrogal_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); } + }; + + class spell_mark_of_kazrogal_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mark_of_kazrogal_AuraScript); + + bool Validate(SpellInfo const* /*spell*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_MARK_DAMAGE)) + return false; + return true; + } + + void OnPeriodic(AuraEffect const* aurEff) + { + Unit* target = GetTarget(); + + if (target->GetPower(POWER_MANA) == 0) + { + target->CastSpell(target, SPELL_MARK_DAMAGE, true, NULL, aurEff); + // Remove aura + SetDuration(0); + } + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_mark_of_kazrogal_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_MANA_LEECH); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_mark_of_kazrogal_SpellScript(); + } + + AuraScript* GetAuraScript() const + { + return new spell_mark_of_kazrogal_AuraScript(); + } }; void AddSC_boss_kazrogal() 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 c40174392..272fd5f7c 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp @@ -121,25 +121,29 @@ public: if (FrostArmorTimer <= diff) { DoCast(me, SPELL_FROST_ARMOR); - FrostArmorTimer = 40000+rand()%20000; - } else FrostArmorTimer -= diff; + FrostArmorTimer = 40000 + rand() % 20000; + } + else FrostArmorTimer -= diff; if (DecayTimer <= diff) { DoCastVictim(SPELL_DEATH_AND_DECAY); - DecayTimer = 60000+rand()%20000; + DecayTimer = 60000 + rand() % 20000; Talk(SAY_DECAY); - } else DecayTimer -= diff; + } + else DecayTimer -= diff; if (NovaTimer <= diff) { DoCastVictim(SPELL_FROST_NOVA); - NovaTimer = 30000+rand()%15000; + NovaTimer = 30000 + rand() % 15000; Talk(SAY_NOVA); - } else NovaTimer -= diff; + } + else NovaTimer -= diff; if (IceboltTimer <= diff) { DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 40, true), SPELL_ICEBOLT); - IceboltTimer = 11000+rand()%20000; - } else IceboltTimer -= diff; + IceboltTimer = 11000 + rand() % 20000; + } + else IceboltTimer -= diff; DoMeleeAttackIfReady(); } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp index 18e64e270..f61f08621 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp @@ -1,8 +1,8 @@ - /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license: https://github.com/azerothcore/azerothcore-wotlk/blob/master/LICENSE-GPL2 - * Copyright (C) 2008-2016 TrinityCore - * Copyright (C) 2005-2009 MaNGOS - */ +/* +* Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license: https://github.com/azerothcore/azerothcore-wotlk/blob/master/LICENSE-GPL2 +* Copyright (C) 2008-2016 TrinityCore +* Copyright (C) 2005-2009 MaNGOS +*/ /* ScriptData SDName: Hyjal @@ -58,7 +58,7 @@ public: case GOSSIP_ACTION_INFO_DEF + 3: ai->Retreat(); break; - case GOSSIP_ACTION_INFO_DEF: + case GOSSIP_ACTION_INFO_DEF: ai->Debug = !ai->Debug; //TC_LOG_DEBUG("scripts", "HyjalAI - Debug mode has been toggled"); break; @@ -217,13 +217,13 @@ public: ClearGossipMenuFor(player); if (action == GOSSIP_ACTION_INFO_DEF) { - ItemPosCountVec dest; - uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, ITEM_TEAR_OF_GODDESS, 1); - if (msg == EQUIP_ERR_OK) - if (Item* item = player->StoreNewItem(dest, ITEM_TEAR_OF_GODDESS, true)) - player->SendNewItem(item, 1, true, false, true); + ItemPosCountVec dest; + uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, ITEM_TEAR_OF_GODDESS, 1); + if (msg == EQUIP_ERR_OK) + if (Item* item = player->StoreNewItem(dest, ITEM_TEAR_OF_GODDESS, true)) + player->SendNewItem(item, 1, true, false, true); - SendGossipMenuFor(player, 907, creature->GetGUID()); + SendGossipMenuFor(player, 907, creature->GetGUID()); } return true; } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp index 5ca2de6ee..99fa082e5 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp @@ -31,7 +31,7 @@ enum Spawns #define YELL_HURRY "Hurry, we don't have much time" // Locations for summoning gargoyls and frost wyrms in special cases -float SpawnPointSpecial[3][3]= +float SpawnPointSpecial[3][3] = { {5497.08f, -2493.23f, 1535.72f}, //spawn point for the gargoyles near the horde gate {5624.53f, -2548.12f, 1551.54f}, //spawn point for the frost wyrm near the horde gate @@ -39,7 +39,7 @@ float SpawnPointSpecial[3][3]= }; // Locations for summoning waves in Alliance base -float AllianceBase[4][3]= +float AllianceBase[4][3] = { {4928.48f, -1526.38f, 1326.83f}, {4923.54f, -1514.29f, 1327.98f}, @@ -47,14 +47,14 @@ float AllianceBase[4][3]= {4938.35f, -1521.00f, 1326.69f} }; -float JainaDummySpawn[2][4]= +float JainaDummySpawn[2][4] = { {5497.01f, -2719.03f, 1483.08f, 2.90426f}, {5484.98f, -2721.69f, 1483.39f, 6.00656f} }; // Locations for summoning waves in Horde base -float HordeBase[4][3]= +float HordeBase[4][3] = { {5458.01f, -2340.27f, 1459.60f}, {5466.01f, -2334.69f, 1460.06f}, @@ -63,13 +63,13 @@ float HordeBase[4][3]= }; // Lady Jaina's waypoints when retreathing -float JainaWPs[2][3]= +float JainaWPs[2][3] = { {5078.56f, -1789.79f, 1320.73f}, //next to the small stairs {5037.38f, -1778.39f, 1322.61f}, //center of alliance base }; -float InfernalPos[8][3]=//spawn points for the infernals in the horde base +float InfernalPos[8][3] = //spawn points for the infernals in the horde base { {5453.59f, -2764.52f, 1493.50f}, {5478.4f, -2781.77f, 1497.52f}, @@ -81,7 +81,7 @@ float InfernalPos[8][3]=//spawn points for the infernals in the horde base {5482.39f, -2689.19f, 1481.09f} }; -float InfernalSPWP[26][4]=//spawn points for the infernals in the horde base used in the cleaning wave +float InfernalSPWP[26][4] = //spawn points for the infernals in the horde base used in the cleaning wave { {5490.96f, -2718.72f, 1482.96f, 0.49773f}, {5449.51f, -2723.32f, 1485.69f, 2.69685f}, @@ -111,7 +111,7 @@ float InfernalSPWP[26][4]=//spawn points for the infernals in the horde base use {5459.78f, -2755.71f, 1490.68f, 1.05139f} }; -float VeinPos[14][8]=//spawn points of the ancient gem veins +float VeinPos[14][8] = //spawn points of the ancient gem veins { {5184.84f, -1982.59f, 1382.66f, 2.58079f, 0, 0, 0.960944f, 0.276742f}, //alliance {5107.66f, -2071.16f, 1368.37f, 2.65148f, 0, 0, 0.970124f, 0.242611f}, //alliance @@ -129,7 +129,7 @@ float VeinPos[14][8]=//spawn points of the ancient gem veins {5441.54f, -3321.59f, 1651.55f, 0.258306f, 0, 0, 0.128794f, 0.991671f} //horde }; -float AllianceOverrunGargPos[5][4]=//gargoyle spawn points in the alliance overrun +float AllianceOverrunGargPos[5][4] = //gargoyle spawn points in the alliance overrun { {5279.94f, -2049.68f, 1311.38f, 0}, //garg1 {5289.15f, -2219.06f, 1291.12f, 0}, //garg2 @@ -138,7 +138,7 @@ float AllianceOverrunGargPos[5][4]=//gargoyle spawn points in the alliance overr {5120.65f, -2467.92f, 1463.93f, 2.54f}//garg5 }; -float AllianceFirePos[92][8]=//spawn points for the fire visuals (GO) in the alliance base +float AllianceFirePos[92][8] = //spawn points for the fire visuals (GO) in the alliance base { {5039.9f, -1796.84f, 1323.88f, 2.59222f, 0, 0, 0.962511f, 0.271243f}, {5087.2f, -1795.2f, 1320.68f, 1.03946f, 0, 0, 0.496644f, 0.867954f}, @@ -230,11 +230,11 @@ float AllianceFirePos[92][8]=//spawn points for the fire visuals (GO) in the all {5195.08f, -2129.01f, 1285.36f, 3.55727f, 0, 0, 0.978480f, -0.206344f}, {5353.76f, -2116.28f, 1299.27f, 6.17894f, 0, 0, 0.0521006f, -0.998642f}, {5271.14f, -2037.38f, 1299.24f, 4.07879f, 0, 0, 0.892201f, -0.451638f}, - {5332.5f , -2181.28f, 1279.95f, 4.6906f, 0, 0, 0.714768f, -0.699362f}, - {5108.2f , -2429.84f, 1427.73f, 4.5194f, 0, 0, 0.771943f, -0.635691f} + {5332.5f, -2181.28f, 1279.95f, 4.6906f, 0, 0, 0.714768f, -0.699362f}, + {5108.2f, -2429.84f, 1427.73f, 4.5194f, 0, 0, 0.771943f, -0.635691f} }; -float HordeFirePos[65][8]=//spawn points for the fire visuals (GO) in the horde base +float HordeFirePos[65][8] = //spawn points for the fire visuals (GO) in the horde base { {5524.11f, -2612.73f, 1483.38f, 1.96198f, 0, 0, 0.831047f, 0.556202f}, {5514.42f, -2617.19f, 1505.77f, 1.82453f, 0, 0, 0.790892f, 0.611956f}, @@ -308,7 +308,7 @@ hyjalAI::hyjalAI(Creature* creature) : npc_escortAI(creature), Summons(me) instance = creature->GetInstanceScript(); VeinsSpawned[0] = false; VeinsSpawned[1] = false; - for (uint8 i=0; i<14; ++i) + for (uint8 i = 0; i < 14; ++i) VeinGUID[i] = 0; InfernalCount = 0; TeleportTimer = 1000; @@ -432,7 +432,7 @@ void hyjalAI::MoveInLineOfSight(Unit* who) void hyjalAI::SummonCreature(uint32 entry, float Base[4][3]) { - uint32 random = rand()%4; + uint32 random = rand() % 4; float SpawnLoc[3]; for (uint8 i = 0; i < 3; ++i) @@ -442,38 +442,40 @@ void hyjalAI::SummonCreature(uint32 entry, float Base[4][3]) Creature* creature = nullptr; switch (entry) { - case 17906: //GARGOYLE + case 17906: //GARGOYLE - if (!FirstBossDead && (WaveCount == 1 || WaveCount == 3)) - {//summon at tower - creature = me->SummonCreature(entry, SpawnPointSpecial[SPAWN_NEAR_TOWER][0]+irand(-20, 20), SpawnPointSpecial[SPAWN_NEAR_TOWER][1]+irand(-20, 20), SpawnPointSpecial[SPAWN_NEAR_TOWER][2]+irand(-10, 10), 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000); - if (creature) - CAST_AI(hyjal_trashAI, creature->AI())->useFlyPath = true; - } - else - {//summon at gate - creature = me->SummonCreature(entry, SpawnPointSpecial[SPAWN_GARG_GATE][0]+irand(-10, 10), SpawnPointSpecial[SPAWN_GARG_GATE][1]+irand(-10, 10), SpawnPointSpecial[SPAWN_GARG_GATE][2]+irand(-10, 10), 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000); - } - break; - case 17907: //FROST_WYRM, - if (FirstBossDead && WaveCount == 1) //summon at gate - creature = me->SummonCreature(entry, SpawnPointSpecial[SPAWN_WYRM_GATE][0], SpawnPointSpecial[SPAWN_WYRM_GATE][1], SpawnPointSpecial[SPAWN_WYRM_GATE][2], 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000); - else - { - creature = me->SummonCreature(entry, SpawnPointSpecial[SPAWN_NEAR_TOWER][0], SpawnPointSpecial[SPAWN_NEAR_TOWER][1], SpawnPointSpecial[SPAWN_NEAR_TOWER][2], 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000); - if (creature) - CAST_AI(hyjal_trashAI, creature->AI())->useFlyPath = true; - } - break; - case 17908: //GIANT_INFERNAL - ++InfernalCount; - if (InfernalCount > 7) - InfernalCount = 0; - creature = me->SummonCreature(entry, InfernalPos[InfernalCount][0], InfernalPos[InfernalCount][1], InfernalPos[InfernalCount][2], 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000); - break; - default: - creature = me->SummonCreature(entry, SpawnLoc[0], SpawnLoc[1], SpawnLoc[2], 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000); - break; + if (!FirstBossDead && (WaveCount == 1 || WaveCount == 3)) + { + //summon at tower + creature = me->SummonCreature(entry, SpawnPointSpecial[SPAWN_NEAR_TOWER][0] + irand(-20, 20), SpawnPointSpecial[SPAWN_NEAR_TOWER][1] + irand(-20, 20), SpawnPointSpecial[SPAWN_NEAR_TOWER][2] + irand(-10, 10), 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000); + if (creature) + CAST_AI(hyjal_trashAI, creature->AI())->useFlyPath = true; + } + else + { + //summon at gate + creature = me->SummonCreature(entry, SpawnPointSpecial[SPAWN_GARG_GATE][0] + irand(-10, 10), SpawnPointSpecial[SPAWN_GARG_GATE][1] + irand(-10, 10), SpawnPointSpecial[SPAWN_GARG_GATE][2] + irand(-10, 10), 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000); + } + break; + case 17907: //FROST_WYRM, + if (FirstBossDead && WaveCount == 1) //summon at gate + creature = me->SummonCreature(entry, SpawnPointSpecial[SPAWN_WYRM_GATE][0], SpawnPointSpecial[SPAWN_WYRM_GATE][1], SpawnPointSpecial[SPAWN_WYRM_GATE][2], 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000); + else + { + creature = me->SummonCreature(entry, SpawnPointSpecial[SPAWN_NEAR_TOWER][0], SpawnPointSpecial[SPAWN_NEAR_TOWER][1], SpawnPointSpecial[SPAWN_NEAR_TOWER][2], 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000); + if (creature) + CAST_AI(hyjal_trashAI, creature->AI())->useFlyPath = true; + } + break; + case 17908: //GIANT_INFERNAL + ++InfernalCount; + if (InfernalCount > 7) + InfernalCount = 0; + creature = me->SummonCreature(entry, InfernalPos[InfernalCount][0], InfernalPos[InfernalCount][1], InfernalPos[InfernalCount][2], 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000); + break; + default: + creature = me->SummonCreature(entry, SpawnLoc[0], SpawnLoc[1], SpawnLoc[2], 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000); + break; } @@ -517,7 +519,7 @@ void hyjalAI::SummonCreature(uint32 entry, float Base[4][3]) void hyjalAI::SummonNextWave(const Wave wave[18], uint32 Count, float Base[4][3]) { // 1 in 4 chance we give a rally yell. Not sure if the chance is offilike. - if (rand()%4 == 0) + if (rand() % 4 == 0) Talk(RALLY); InfernalCount = 0;//reset infernal count every new wave @@ -531,7 +533,7 @@ void hyjalAI::SummonNextWave(const Wave wave[18], uint32 Count, float Base[4][3] if (!wave[Count].IsBoss) { - uint32 stateValue = Count+1; + uint32 stateValue = Count + 1; if (FirstBossDead) stateValue -= 9; // Subtract 9 from it to give the proper wave number if we are greater than 8 @@ -629,21 +631,23 @@ void hyjalAI::SpawnVeins() { if (VeinsSpawned[0])//prevent any buggers return; - for (uint8 i = 0; i<7; ++i) + for (uint8 i = 0; i < 7; ++i) { GameObject* gem = me->SummonGameObject(GO_ANCIENT_VEIN, VeinPos[i][0], VeinPos[i][1], VeinPos[i][2], VeinPos[i][3], VeinPos[i][4], VeinPos[i][5], VeinPos[i][6], VeinPos[i][7], 0); if (gem) - VeinGUID[i]=gem->GetGUID(); + VeinGUID[i] = gem->GetGUID(); } VeinsSpawned[0] = true; - }else{ + } + else + { if (VeinsSpawned[1]) return; - for (uint8 i = 7; i<14; ++i) + for (uint8 i = 7; i < 14; ++i) { GameObject* gem = me->SummonGameObject(GO_ANCIENT_VEIN, VeinPos[i][0], VeinPos[i][1], VeinPos[i][2], VeinPos[i][3], VeinPos[i][4], VeinPos[i][5], VeinPos[i][6], VeinPos[i][7], 0); if (gem) - VeinGUID[i]=gem->GetGUID(); + VeinGUID[i] = gem->GetGUID(); } VeinsSpawned[1] = true; } @@ -653,22 +657,23 @@ void hyjalAI::DeSpawnVeins() { if (Faction == 1) { - Creature* unit=ObjectAccessor::GetCreature((*me), instance->GetData64(DATA_JAINAPROUDMOORE)); + Creature* unit = ObjectAccessor::GetCreature((*me), instance->GetData64(DATA_JAINAPROUDMOORE)); if (!unit)return; hyjalAI* ai = CAST_AI(hyjalAI, unit->AI()); if (!ai)return; - for (uint8 i = 0; i<7; ++i) + for (uint8 i = 0; i < 7; ++i) { if (GameObject* gem = instance->instance->GetGameObject(ai->VeinGUID[i])) gem->Delete(); } - } else if (Faction) + } + else if (Faction) { - Creature* unit=ObjectAccessor::GetCreature((*me), instance->GetData64(DATA_THRALL)); + Creature* unit = ObjectAccessor::GetCreature((*me), instance->GetData64(DATA_THRALL)); if (!unit)return; hyjalAI* ai = CAST_AI(hyjalAI, unit->AI()); if (!ai)return; - for (uint8 i = 7; i<14; ++i) + for (uint8 i = 7; i < 14; ++i) { if (GameObject* gem = instance->instance->GetGameObject(ai->VeinGUID[i])) gem->Delete(); @@ -684,7 +689,8 @@ void hyjalAI::UpdateAI(uint32 diff) { DoCast(me, SPELL_MASS_TELEPORT, false); DoMassTeleport = false; - } else MassTeleportTimer -= diff; + } + else MassTeleportTimer -= diff; return; } if (DoHide) @@ -728,13 +734,16 @@ void hyjalAI::UpdateAI(uint32 diff) if (Faction == 0) { RespawnNearPos(5037.76f, -1889.71f); - } else if (Faction == 1) + } + else if (Faction == 1) { RespawnNearPos(5563, -2763.19f); RespawnNearPos(5542.2f, -2629.36f); } me->SetVisible(true); - }else{ + } + else + { RespawnTimer -= diff; me->SetVisible(false); } @@ -761,7 +770,8 @@ void hyjalAI::UpdateAI(uint32 diff) break; } me->SetVisible(false); - } else RetreatTimer -= diff; + } + else RetreatTimer -= diff; } if (!EventBegun) @@ -783,7 +793,8 @@ void hyjalAI::UpdateAI(uint32 diff) else if (Faction == 1) SummonNextWave(HordeWaves, WaveCount, HordeBase); ++WaveCount; - } else NextWaveTimer -= diff; + } + else NextWaveTimer -= diff; } if (CheckTimer <= diff) @@ -814,7 +825,8 @@ void hyjalAI::UpdateAI(uint32 diff) } } CheckTimer = 5000; - } else CheckTimer -= diff; + } + else CheckTimer -= diff; if (!UpdateVictim()) return; @@ -850,7 +862,8 @@ void hyjalAI::UpdateAI(uint32 diff) DoCast(target, Spells[i].SpellId); SpellTimer[i] = Spells[i].Cooldown; } - } else SpellTimer[i] -= diff; + } + else SpellTimer[i] -= diff; } } @@ -944,8 +957,8 @@ void hyjalAI::WaypointReached(uint32 waypointId) acore::AllFriendlyCreaturesInGrid creature_check(me); acore::CreatureListSearcher creature_searcher(me, creatures, creature_check); TypeContainerVisitor - , - GridTypeMapContainer> creature_visitor(creature_searcher); + , + GridTypeMapContainer> creature_visitor(creature_searcher); cell.Visit(pair, creature_visitor, *(me->GetMap()), *me, me->GetGridActivationRange()); @@ -963,7 +976,7 @@ void hyjalAI::WaypointReached(uint32 waypointId) float range = 10; if (me->GetEntry() == THRALL)range = 20; me->GetNearPoint(me, x, y, z, range, 0, me->GetAngle((*itr))); - (*itr)->GetMotionMaster()->MovePoint(0, x+irand(-5, 5), y+irand(-5, 5), me->GetPositionZ()); + (*itr)->GetMotionMaster()->MovePoint(0, x + irand(-5, 5), y + irand(-5, 5), me->GetPositionZ()); } } } @@ -984,8 +997,8 @@ void hyjalAI::DoOverrun(uint32 faction, const uint32 diff) acore::AllFriendlyCreaturesInGrid creature_check(me); acore::CreatureListSearcher creature_searcher(me, creatures, creature_check); TypeContainerVisitor - , - GridTypeMapContainer> creature_visitor(creature_searcher); + , + GridTypeMapContainer> creature_visitor(creature_searcher); cell.Visit(pair, creature_visitor, *(me->GetMap()), *me, me->GetGridActivationRange()); @@ -1007,7 +1020,8 @@ void hyjalAI::DoOverrun(uint32 faction, const uint32 diff) WaitForTeleport = false; Teleported = true; - }TeleportTimer -= diff; + } + TeleportTimer -= diff; } if (!Teleported) return; @@ -1020,8 +1034,8 @@ void hyjalAI::DoOverrun(uint32 faction, const uint32 diff) for (uint8 i = 0; i < 25; ++i)//summon 25 ghouls { - uint8 r = rand()%4; - Creature* unit = me->SummonCreature(GHOUL, AllianceBase[r][0]+irand(-15, 15), AllianceBase[r][1]+irand(-15, 15), AllianceBase[r][2], 0, TEMPSUMMON_MANUAL_DESPAWN, 2*60*1000); + uint8 r = rand() % 4; + Creature* unit = me->SummonCreature(GHOUL, AllianceBase[r][0] + irand(-15, 15), AllianceBase[r][1] + irand(-15, 15), AllianceBase[r][2], 0, TEMPSUMMON_MANUAL_DESPAWN, 2 * 60 * 1000); if (unit) { CAST_AI(hyjal_trashAI, unit->AI())->faction = Faction; @@ -1032,8 +1046,8 @@ void hyjalAI::DoOverrun(uint32 faction, const uint32 diff) } for (uint8 i = 0; i < 3; ++i)//summon 3 abominations { - uint8 r = rand()%4; - Creature* unit = me->SummonCreature(ABOMINATION, AllianceBase[r][0]+irand(-15, 15), AllianceBase[r][1]+irand(-15, 15), AllianceBase[r][2], 0, TEMPSUMMON_MANUAL_DESPAWN, 2*60*1000); + uint8 r = rand() % 4; + Creature* unit = me->SummonCreature(ABOMINATION, AllianceBase[r][0] + irand(-15, 15), AllianceBase[r][1] + irand(-15, 15), AllianceBase[r][2], 0, TEMPSUMMON_MANUAL_DESPAWN, 2 * 60 * 1000); if (unit) { CAST_AI(hyjal_trashAI, unit->AI())->faction = Faction; @@ -1044,7 +1058,7 @@ void hyjalAI::DoOverrun(uint32 faction, const uint32 diff) } for (uint8 i = 0; i < 5; ++i)//summon 5 gargoyles { - Creature* unit = me->SummonCreature(GARGOYLE, AllianceOverrunGargPos[i][0], AllianceOverrunGargPos[i][1], AllianceOverrunGargPos[i][2], AllianceOverrunGargPos[i][3], TEMPSUMMON_MANUAL_DESPAWN, 2*60*1000); + Creature* unit = me->SummonCreature(GARGOYLE, AllianceOverrunGargPos[i][0], AllianceOverrunGargPos[i][1], AllianceOverrunGargPos[i][2], AllianceOverrunGargPos[i][3], TEMPSUMMON_MANUAL_DESPAWN, 2 * 60 * 1000); if (unit) { unit->SetHomePosition(AllianceOverrunGargPos[i][0], AllianceOverrunGargPos[i][1], AllianceOverrunGargPos[i][2], AllianceOverrunGargPos[i][3]); @@ -1061,7 +1075,7 @@ void hyjalAI::DoOverrun(uint32 faction, const uint32 diff) for (uint8 i = 0; i < 26; ++i)//summon infernals { - Creature* unit = me->SummonCreature(GIANT_INFERNAL, InfernalSPWP[i][0], InfernalSPWP[i][1], InfernalSPWP[i][2], InfernalSPWP[i][3], TEMPSUMMON_MANUAL_DESPAWN, 2*60*1000); + Creature* unit = me->SummonCreature(GIANT_INFERNAL, InfernalSPWP[i][0], InfernalSPWP[i][1], InfernalSPWP[i][2], InfernalSPWP[i][3], TEMPSUMMON_MANUAL_DESPAWN, 2 * 60 * 1000); if (unit) { unit->SetHomePosition(InfernalSPWP[i][0], InfernalSPWP[i][1], InfernalSPWP[i][2], InfernalSPWP[i][3]); @@ -1073,8 +1087,8 @@ void hyjalAI::DoOverrun(uint32 faction, const uint32 diff) } for (uint8 i = 0; i < 25; ++i)//summon 25 ghouls { - uint8 r = rand()%4; - Creature* unit = me->SummonCreature(GHOUL, HordeBase[r][0]+irand(-15, 15), HordeBase[r][1]+irand(-15, 15), HordeBase[r][2], 0, TEMPSUMMON_MANUAL_DESPAWN, 2*60*1000); + uint8 r = rand() % 4; + Creature* unit = me->SummonCreature(GHOUL, HordeBase[r][0] + irand(-15, 15), HordeBase[r][1] + irand(-15, 15), HordeBase[r][2], 0, TEMPSUMMON_MANUAL_DESPAWN, 2 * 60 * 1000); if (unit) { CAST_AI(hyjal_trashAI, unit->AI())->faction = Faction; @@ -1085,8 +1099,8 @@ void hyjalAI::DoOverrun(uint32 faction, const uint32 diff) } for (uint8 i = 0; i < 5; ++i)//summon 5 abominations { - uint8 r = rand()%4; - Creature* unit = me->SummonCreature(ABOMINATION, HordeBase[r][0]+irand(-15, 15), HordeBase[r][1]+irand(-15, 15), HordeBase[r][2], 0, TEMPSUMMON_MANUAL_DESPAWN, 2*60*1000); + uint8 r = rand() % 4; + Creature* unit = me->SummonCreature(ABOMINATION, HordeBase[r][0] + irand(-15, 15), HordeBase[r][1] + irand(-15, 15), HordeBase[r][2], 0, TEMPSUMMON_MANUAL_DESPAWN, 2 * 60 * 1000); if (unit) { CAST_AI(hyjal_trashAI, unit->AI())->faction = Faction; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h index 962e329f0..c3f24902b 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h @@ -35,8 +35,9 @@ struct Wave bool IsBoss; // Simply used to inform the wave summoner that the next wave contains a boss to halt all waves after that }; -const Wave AllianceWaves[]= // Waves that will be summoned in the Alliance Base -{ // Rage Winterchill Wave 1-8 +const Wave AllianceWaves[] = // Waves that will be summoned in the Alliance Base +{ + // Rage Winterchill Wave 1-8 {{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, 0, 0, 0, 0, 0, 0, 0, 0}, 120000, false}, {{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, 0, 0, 0, 0, 0, 0}, 120000, false}, {{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, 0, 0, 0, 0, 0, 0}, 120000, false}, @@ -60,8 +61,9 @@ const Wave AllianceWaves[]= // Waves that will be {{ANETHERON, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 0, true} }; -const Wave HordeWaves[]= // Waves that are summoned in the Horde base -{ // Kaz'Rogal Wave 1-8 +const Wave HordeWaves[] = // Waves that are summoned in the Horde base +{ + // Kaz'Rogal Wave 1-8 {{GHOUL, GHOUL, GHOUL, GHOUL, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, BANSHEE, BANSHEE, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 0, 0}, 180000, false}, {{GHOUL, GHOUL, GHOUL, GHOUL, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, 0, 0, 0, 0}, 180000, false}, {{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, NECROMANCER, NECROMANCER, 0, 0, 0, 0}, 180000, false}, @@ -136,61 +138,61 @@ struct hyjalAI : public npc_escortAI void SummonCreature(uint32 entry, float Base[4][3]); // Summons a creature for that wave in that base - // Summons the next wave, calls SummonCreature + // Summons the next wave, calls SummonCreature void SummonNextWave(const Wave wave[18], uint32 Count, float Base[4][3]); void StartEvent(Player* player); // Begins the event by gossip click uint32 GetInstanceData(uint32 Event); // Gets instance data for this instance, used to check if raid has gotten past a certain point and can access the next phase - public: - InstanceScript* instance; +public: + InstanceScript* instance; - uint64 PlayerGUID; - uint64 BossGUID[2]; - uint64 VeinGUID[14]; + uint64 PlayerGUID; + uint64 BossGUID[2]; + uint64 VeinGUID[14]; - uint32 NextWaveTimer; - uint32 WaveCount; - uint32 CheckTimer; - uint32 Faction; - uint32 EnemyCount; - uint32 RetreatTimer; + uint32 NextWaveTimer; + uint32 WaveCount; + uint32 CheckTimer; + uint32 Faction; + uint32 EnemyCount; + uint32 RetreatTimer; - bool EventBegun; - bool FirstBossDead; - bool SecondBossDead; - bool Summon; - bool bRetreat; - bool Debug; - bool VeinsSpawned[2]; - uint8 InfernalCount; - SummonList Summons; - bool Overrun; - bool Teleported; - bool WaitForTeleport; - uint32 TeleportTimer; - uint32 OverrunCounter; - uint32 OverrunCounter2; - uint32 InfernalPoint; - uint32 RespawnTimer; - bool DoRespawn; - bool DoHide; - bool IsDummy; - uint32 MassTeleportTimer; - bool DoMassTeleport; - uint64 DummyGuid; + bool EventBegun; + bool FirstBossDead; + bool SecondBossDead; + bool Summon; + bool bRetreat; + bool Debug; + bool VeinsSpawned[2]; + uint8 InfernalCount; + SummonList Summons; + bool Overrun; + bool Teleported; + bool WaitForTeleport; + uint32 TeleportTimer; + uint32 OverrunCounter; + uint32 OverrunCounter2; + uint32 InfernalPoint; + uint32 RespawnTimer; + bool DoRespawn; + bool DoHide; + bool IsDummy; + uint32 MassTeleportTimer; + bool DoMassTeleport; + uint64 DummyGuid; - struct Spell - { - uint32 SpellId; - uint32 Cooldown; - uint32 TargetType; - } Spells[HYJAL_AI_MAX_SPELLS]; + struct Spell + { + uint32 SpellId; + uint32 Cooldown; + uint32 TargetType; + } Spells[HYJAL_AI_MAX_SPELLS]; - private: - uint32 SpellTimer[3]; - //std::list CreatureList; +private: + uint32 SpellTimer[3]; + //std::list CreatureList; }; #endif diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp index 780e5542e..b95116260 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp @@ -34,7 +34,7 @@ enum Spells SPELL_EXPLODING_SHOT = 7896, }; -float HordeWPs[8][3]=//basic waypoints from spawn to leader +float HordeWPs[8][3] = //basic waypoints from spawn to leader { {5492.91f, -2404.61f, 1462.63f}, {5531.76f, -2460.87f, 1469.55f}, @@ -45,7 +45,7 @@ float HordeWPs[8][3]=//basic waypoints from spawn to leader {5489.62f, -2704.05f, 1482.18f}, {5457.04f, -2726.26f, 1485.10f} }; -float AllianceWPs[8][3]=//basic waypoints from spawn to leader +float AllianceWPs[8][3] = //basic waypoints from spawn to leader { {4896.08f, -1576.35f, 1333.65f}, {4898.68f, -1615.02f, 1329.48f}, @@ -57,28 +57,28 @@ float AllianceWPs[8][3]=//basic waypoints from spawn to leader {5067.23f, -1789.95f, 1321.17f} }; -float FrostWyrmWPs[3][3]=//waypoints for the frost wyrms in horde base +float FrostWyrmWPs[3][3] = //waypoints for the frost wyrms in horde base { {5580.82f, -2628.83f, 1528.28f}, {5550.90f, -2667.16f, 1505.45f}, {5459.64f, -2725.91f, 1484.83f} }; -float GargoyleWPs[3][3]=//waypoints for the gargoyles in horde base +float GargoyleWPs[3][3] = //waypoints for the gargoyles in horde base { {5533.66f, -2634.32f, 1495.33f}, {5517.88f, -2712.05f, 1490.54f}, {5459.64f, -2725.91f, 1484.83f} }; -float FlyPathWPs[3][3]=//waypoints for the gargoyls and frost wyrms in horde base in wave 1/3 +float FlyPathWPs[3][3] = //waypoints for the gargoyls and frost wyrms in horde base in wave 1/3 { {5531.96f, -2772.83f, 1516.68f}, {5498.32f, -2734.84f, 1497.01f}, {5456.67f, -2725.48f, 1493.08f} }; -float AllianceOverrunWP[55][3]=//waypoints in the alliance base used in the end in the cleaning wave +float AllianceOverrunWP[55][3] = //waypoints in the alliance base used in the end in the cleaning wave { {4976.37f, -1708.02f, 1339.43f}, //0spawn {4994.83f, -1725.52f, 1333.25f}, //1 start @@ -138,7 +138,7 @@ float AllianceOverrunWP[55][3]=//waypoints in the alliance base used in the end }; -float HordeOverrunWP[21][3]=//waypoints in the horde base used in the end in the cleaning wave +float HordeOverrunWP[21][3] = //waypoints in the horde base used in the end in the cleaning wave { {5490.72f, -2702.94f, 1482.14f}, //0 start {5469.77f, -2741.34f, 1486.95f}, @@ -179,7 +179,7 @@ hyjal_trashAI::hyjal_trashAI(Creature* creature) : npc_escortAI(creature) Reset(); } -void hyjal_trashAI::DamageTaken(Unit* done_by, uint32 &damage, DamageEffectType, SpellSchoolMask) +void hyjal_trashAI::DamageTaken(Unit* done_by, uint32& damage, DamageEffectType, SpellSchoolMask) { if (done_by && (done_by->GetTypeId() == TYPEID_PLAYER || done_by->IsPet())) { @@ -197,63 +197,63 @@ void hyjal_trashAI::UpdateAI(uint32 /*diff*/) { if (me->GetEntry() == GARGOYLE) { - DummyTarget[0] = AllianceOverrunWP[50+OverrunType][0]; //+OverrunType 0 - 4 - DummyTarget[1] = AllianceOverrunWP[50+OverrunType][1]; - DummyTarget[2] = AllianceOverrunWP[50+OverrunType][2]; + DummyTarget[0] = AllianceOverrunWP[50 + OverrunType][0]; //+OverrunType 0 - 4 + DummyTarget[1] = AllianceOverrunWP[50 + OverrunType][1]; + DummyTarget[2] = AllianceOverrunWP[50 + OverrunType][2]; } if (me->GetEntry() == ABOMINATION) { for (uint8 i = 0; i < 4; ++i) - AddWaypoint(i, AllianceWPs[i][0]+irand(-3, 3), AllianceWPs[i][1]+irand(-3, 3), AllianceWPs[i][2]); + AddWaypoint(i, AllianceWPs[i][0] + irand(-3, 3), AllianceWPs[i][1] + irand(-3, 3), AllianceWPs[i][2]); switch (OverrunType) { case 0: - AddWaypoint(4, AllianceOverrunWP[22][0]+irand(-3, 3), AllianceOverrunWP[22][1]+irand(-3, 3), AllianceOverrunWP[22][2]); - AddWaypoint(5, AllianceOverrunWP[23][0]+irand(-3, 3), AllianceOverrunWP[23][1]+irand(-3, 3), AllianceOverrunWP[23][2]); - AddWaypoint(6, AllianceOverrunWP[24][0]+irand(-3, 3), AllianceOverrunWP[24][1]+irand(-3, 3), AllianceOverrunWP[24][2]); - AddWaypoint(7, AllianceOverrunWP[25][0]+irand(-3, 3), AllianceOverrunWP[25][1]+irand(-3, 3), AllianceOverrunWP[25][2]); - AddWaypoint(8, AllianceOverrunWP[26][0]+irand(-3, 3), AllianceOverrunWP[26][1]+irand(-3, 3), AllianceOverrunWP[26][2]); - AddWaypoint(9, AllianceOverrunWP[27][0]+irand(-3, 3), AllianceOverrunWP[27][1]+irand(-3, 3), AllianceOverrunWP[27][2]); - AddWaypoint(10, AllianceOverrunWP[28][0]+irand(-3, 3), AllianceOverrunWP[28][1]+irand(-3, 3), AllianceOverrunWP[28][2]); + AddWaypoint(4, AllianceOverrunWP[22][0] + irand(-3, 3), AllianceOverrunWP[22][1] + irand(-3, 3), AllianceOverrunWP[22][2]); + AddWaypoint(5, AllianceOverrunWP[23][0] + irand(-3, 3), AllianceOverrunWP[23][1] + irand(-3, 3), AllianceOverrunWP[23][2]); + AddWaypoint(6, AllianceOverrunWP[24][0] + irand(-3, 3), AllianceOverrunWP[24][1] + irand(-3, 3), AllianceOverrunWP[24][2]); + AddWaypoint(7, AllianceOverrunWP[25][0] + irand(-3, 3), AllianceOverrunWP[25][1] + irand(-3, 3), AllianceOverrunWP[25][2]); + AddWaypoint(8, AllianceOverrunWP[26][0] + irand(-3, 3), AllianceOverrunWP[26][1] + irand(-3, 3), AllianceOverrunWP[26][2]); + AddWaypoint(9, AllianceOverrunWP[27][0] + irand(-3, 3), AllianceOverrunWP[27][1] + irand(-3, 3), AllianceOverrunWP[27][2]); + AddWaypoint(10, AllianceOverrunWP[28][0] + irand(-3, 3), AllianceOverrunWP[28][1] + irand(-3, 3), AllianceOverrunWP[28][2]); - AddWaypoint(11, AllianceOverrunWP[36][0]+irand(-3, 3), AllianceOverrunWP[36][1]+irand(-3, 3), AllianceOverrunWP[36][2]); - AddWaypoint(12, AllianceOverrunWP[37][0]+irand(-3, 3), AllianceOverrunWP[37][1]+irand(-3, 3), AllianceOverrunWP[37][2]); - AddWaypoint(13, AllianceOverrunWP[38][0]+irand(-3, 3), AllianceOverrunWP[38][1]+irand(-3, 3), AllianceOverrunWP[38][2]); - AddWaypoint(14, AllianceOverrunWP[39][0]+irand(-3, 3), AllianceOverrunWP[39][1]+irand(-3, 3), AllianceOverrunWP[39][2]); - AddWaypoint(15, AllianceOverrunWP[40][0]+irand(-3, 3), AllianceOverrunWP[40][1]+irand(-3, 3), AllianceOverrunWP[40][2]); - AddWaypoint(16, AllianceOverrunWP[41][0]+irand(-3, 3), AllianceOverrunWP[41][1]+irand(-3, 3), AllianceOverrunWP[41][2]); - AddWaypoint(17, AllianceOverrunWP[42][0]+irand(-3, 3), AllianceOverrunWP[42][1]+irand(-3, 3), AllianceOverrunWP[42][2]); - AddWaypoint(18, AllianceOverrunWP[43][0]+irand(-3, 3), AllianceOverrunWP[43][1]+irand(-3, 3), AllianceOverrunWP[43][2]); - me->SetHomePosition(AllianceOverrunWP[43][0]+irand(-3, 3), AllianceOverrunWP[43][1]+irand(-3, 3), AllianceOverrunWP[43][2], 0); + AddWaypoint(11, AllianceOverrunWP[36][0] + irand(-3, 3), AllianceOverrunWP[36][1] + irand(-3, 3), AllianceOverrunWP[36][2]); + AddWaypoint(12, AllianceOverrunWP[37][0] + irand(-3, 3), AllianceOverrunWP[37][1] + irand(-3, 3), AllianceOverrunWP[37][2]); + AddWaypoint(13, AllianceOverrunWP[38][0] + irand(-3, 3), AllianceOverrunWP[38][1] + irand(-3, 3), AllianceOverrunWP[38][2]); + AddWaypoint(14, AllianceOverrunWP[39][0] + irand(-3, 3), AllianceOverrunWP[39][1] + irand(-3, 3), AllianceOverrunWP[39][2]); + AddWaypoint(15, AllianceOverrunWP[40][0] + irand(-3, 3), AllianceOverrunWP[40][1] + irand(-3, 3), AllianceOverrunWP[40][2]); + AddWaypoint(16, AllianceOverrunWP[41][0] + irand(-3, 3), AllianceOverrunWP[41][1] + irand(-3, 3), AllianceOverrunWP[41][2]); + AddWaypoint(17, AllianceOverrunWP[42][0] + irand(-3, 3), AllianceOverrunWP[42][1] + irand(-3, 3), AllianceOverrunWP[42][2]); + AddWaypoint(18, AllianceOverrunWP[43][0] + irand(-3, 3), AllianceOverrunWP[43][1] + irand(-3, 3), AllianceOverrunWP[43][2]); + me->SetHomePosition(AllianceOverrunWP[43][0] + irand(-3, 3), AllianceOverrunWP[43][1] + irand(-3, 3), AllianceOverrunWP[43][2], 0); SetDespawnAtEnd(false); LastOverronPos = 18; Start(true, true); break; - case 1: - AddWaypoint(4, AllianceOverrunWP[22][0]+irand(-3, 3), AllianceOverrunWP[22][1]+irand(-3, 3), AllianceOverrunWP[22][2]); - AddWaypoint(5, AllianceOverrunWP[23][0]+irand(-3, 3), AllianceOverrunWP[23][1]+irand(-3, 3), AllianceOverrunWP[23][2]); - AddWaypoint(6, AllianceOverrunWP[24][0]+irand(-3, 3), AllianceOverrunWP[24][1]+irand(-3, 3), AllianceOverrunWP[24][2]); - AddWaypoint(7, AllianceOverrunWP[25][0]+irand(-3, 3), AllianceOverrunWP[25][1]+irand(-3, 3), AllianceOverrunWP[25][2]); - AddWaypoint(8, AllianceOverrunWP[26][0]+irand(-3, 3), AllianceOverrunWP[26][1]+irand(-3, 3), AllianceOverrunWP[26][2]); - AddWaypoint(9, AllianceOverrunWP[27][0]+irand(-3, 3), AllianceOverrunWP[27][1]+irand(-3, 3), AllianceOverrunWP[27][2]); - AddWaypoint(10, AllianceOverrunWP[28][0]+irand(-3, 3), AllianceOverrunWP[28][1]+irand(-3, 3), AllianceOverrunWP[28][2]); + case 1: + AddWaypoint(4, AllianceOverrunWP[22][0] + irand(-3, 3), AllianceOverrunWP[22][1] + irand(-3, 3), AllianceOverrunWP[22][2]); + AddWaypoint(5, AllianceOverrunWP[23][0] + irand(-3, 3), AllianceOverrunWP[23][1] + irand(-3, 3), AllianceOverrunWP[23][2]); + AddWaypoint(6, AllianceOverrunWP[24][0] + irand(-3, 3), AllianceOverrunWP[24][1] + irand(-3, 3), AllianceOverrunWP[24][2]); + AddWaypoint(7, AllianceOverrunWP[25][0] + irand(-3, 3), AllianceOverrunWP[25][1] + irand(-3, 3), AllianceOverrunWP[25][2]); + AddWaypoint(8, AllianceOverrunWP[26][0] + irand(-3, 3), AllianceOverrunWP[26][1] + irand(-3, 3), AllianceOverrunWP[26][2]); + AddWaypoint(9, AllianceOverrunWP[27][0] + irand(-3, 3), AllianceOverrunWP[27][1] + irand(-3, 3), AllianceOverrunWP[27][2]); + AddWaypoint(10, AllianceOverrunWP[28][0] + irand(-3, 3), AllianceOverrunWP[28][1] + irand(-3, 3), AllianceOverrunWP[28][2]); - AddWaypoint(11, AllianceOverrunWP[36][0]+irand(-3, 3), AllianceOverrunWP[36][1]+irand(-3, 3), AllianceOverrunWP[36][2]); - AddWaypoint(12, AllianceOverrunWP[37][0]+irand(-3, 3), AllianceOverrunWP[37][1]+irand(-3, 3), AllianceOverrunWP[37][2]); - AddWaypoint(13, AllianceOverrunWP[38][0]+irand(-3, 3), AllianceOverrunWP[38][1]+irand(-3, 3), AllianceOverrunWP[38][2]); - AddWaypoint(14, AllianceOverrunWP[39][0]+irand(-3, 3), AllianceOverrunWP[39][1]+irand(-3, 3), AllianceOverrunWP[39][2]); - AddWaypoint(15, AllianceOverrunWP[40][0]+irand(-3, 3), AllianceOverrunWP[40][1]+irand(-3, 3), AllianceOverrunWP[40][2]); - AddWaypoint(16, AllianceOverrunWP[41][0]+irand(-3, 3), AllianceOverrunWP[41][1]+irand(-3, 3), AllianceOverrunWP[41][2]); - AddWaypoint(17, AllianceOverrunWP[42][0]+irand(-3, 3), AllianceOverrunWP[42][1]+irand(-3, 3), AllianceOverrunWP[42][2]); - AddWaypoint(18, AllianceOverrunWP[44][0]+irand(-3, 3), AllianceOverrunWP[44][1]+irand(-3, 3), AllianceOverrunWP[44][2]); - me->SetHomePosition(AllianceOverrunWP[44][0]+irand(-3, 3), AllianceOverrunWP[44][1]+irand(-3, 3), AllianceOverrunWP[44][2], 0); + AddWaypoint(11, AllianceOverrunWP[36][0] + irand(-3, 3), AllianceOverrunWP[36][1] + irand(-3, 3), AllianceOverrunWP[36][2]); + AddWaypoint(12, AllianceOverrunWP[37][0] + irand(-3, 3), AllianceOverrunWP[37][1] + irand(-3, 3), AllianceOverrunWP[37][2]); + AddWaypoint(13, AllianceOverrunWP[38][0] + irand(-3, 3), AllianceOverrunWP[38][1] + irand(-3, 3), AllianceOverrunWP[38][2]); + AddWaypoint(14, AllianceOverrunWP[39][0] + irand(-3, 3), AllianceOverrunWP[39][1] + irand(-3, 3), AllianceOverrunWP[39][2]); + AddWaypoint(15, AllianceOverrunWP[40][0] + irand(-3, 3), AllianceOverrunWP[40][1] + irand(-3, 3), AllianceOverrunWP[40][2]); + AddWaypoint(16, AllianceOverrunWP[41][0] + irand(-3, 3), AllianceOverrunWP[41][1] + irand(-3, 3), AllianceOverrunWP[41][2]); + AddWaypoint(17, AllianceOverrunWP[42][0] + irand(-3, 3), AllianceOverrunWP[42][1] + irand(-3, 3), AllianceOverrunWP[42][2]); + AddWaypoint(18, AllianceOverrunWP[44][0] + irand(-3, 3), AllianceOverrunWP[44][1] + irand(-3, 3), AllianceOverrunWP[44][2]); + me->SetHomePosition(AllianceOverrunWP[44][0] + irand(-3, 3), AllianceOverrunWP[44][1] + irand(-3, 3), AllianceOverrunWP[44][2], 0); SetDespawnAtEnd(false); LastOverronPos = 18; Start(true, true); break; default: for (uint8 i = 22; i < 36; ++i) - AddWaypoint(i-18, AllianceOverrunWP[i][0]+irand(-3, 3), AllianceOverrunWP[i][1]+irand(-3, 3), AllianceOverrunWP[i][2]); + AddWaypoint(i - 18, AllianceOverrunWP[i][0] + irand(-3, 3), AllianceOverrunWP[i][1] + irand(-3, 3), AllianceOverrunWP[i][2]); SetDespawnAtEnd(true); LastOverronPos = 17; @@ -264,69 +264,69 @@ void hyjal_trashAI::UpdateAI(uint32 /*diff*/) if (me->GetEntry() == GHOUL) { for (uint8 i = 0; i < 4; ++i) - AddWaypoint(i, AllianceWPs[i][0]+irand(-3, 3), AllianceWPs[i][1]+irand(-3, 3), AllianceWPs[i][2]); + AddWaypoint(i, AllianceWPs[i][0] + irand(-3, 3), AllianceWPs[i][1] + irand(-3, 3), AllianceWPs[i][2]); switch (OverrunType) { case 0: - AddWaypoint(4, AllianceOverrunWP[1][0]+irand(-3, 3), AllianceOverrunWP[1][1]+irand(-3, 3), AllianceOverrunWP[1][2]); - AddWaypoint(5, AllianceOverrunWP[2][0]+irand(-3, 3), AllianceOverrunWP[2][1]+irand(-3, 3), AllianceOverrunWP[2][2]); - me->SetHomePosition(AllianceOverrunWP[2][0]+irand(-3, 3), AllianceOverrunWP[2][1]+irand(-3, 3), AllianceOverrunWP[2][2], 0); + AddWaypoint(4, AllianceOverrunWP[1][0] + irand(-3, 3), AllianceOverrunWP[1][1] + irand(-3, 3), AllianceOverrunWP[1][2]); + AddWaypoint(5, AllianceOverrunWP[2][0] + irand(-3, 3), AllianceOverrunWP[2][1] + irand(-3, 3), AllianceOverrunWP[2][2]); + me->SetHomePosition(AllianceOverrunWP[2][0] + irand(-3, 3), AllianceOverrunWP[2][1] + irand(-3, 3), AllianceOverrunWP[2][2], 0); SetDespawnAtEnd(false); LastOverronPos = 5; Start(true, true); break; case 1: - AddWaypoint(4, AllianceOverrunWP[3][0]+irand(-3, 3), AllianceOverrunWP[3][1]+irand(-3, 3), AllianceOverrunWP[3][2]); - AddWaypoint(5, AllianceOverrunWP[4][0]+irand(-3, 3), AllianceOverrunWP[4][1]+irand(-3, 3), AllianceOverrunWP[4][2]); - AddWaypoint(6, AllianceOverrunWP[5][0]+irand(-3, 3), AllianceOverrunWP[5][1]+irand(-3, 3), AllianceOverrunWP[5][2]); - me->SetHomePosition(AllianceOverrunWP[5][0]+irand(-3, 3), AllianceOverrunWP[5][1]+irand(-3, 3), AllianceOverrunWP[5][2], 0); + AddWaypoint(4, AllianceOverrunWP[3][0] + irand(-3, 3), AllianceOverrunWP[3][1] + irand(-3, 3), AllianceOverrunWP[3][2]); + AddWaypoint(5, AllianceOverrunWP[4][0] + irand(-3, 3), AllianceOverrunWP[4][1] + irand(-3, 3), AllianceOverrunWP[4][2]); + AddWaypoint(6, AllianceOverrunWP[5][0] + irand(-3, 3), AllianceOverrunWP[5][1] + irand(-3, 3), AllianceOverrunWP[5][2]); + me->SetHomePosition(AllianceOverrunWP[5][0] + irand(-3, 3), AllianceOverrunWP[5][1] + irand(-3, 3), AllianceOverrunWP[5][2], 0); SetDespawnAtEnd(false); LastOverronPos = 6; Start(true, true); break; case 2: - AddWaypoint(4, AllianceOverrunWP[6][0]+irand(-3, 3), AllianceOverrunWP[6][1]+irand(-3, 3), AllianceOverrunWP[6][2]); - AddWaypoint(5, AllianceOverrunWP[7][0]+irand(-3, 3), AllianceOverrunWP[7][1]+irand(-3, 3), AllianceOverrunWP[7][2]); - AddWaypoint(6, AllianceOverrunWP[8][0]+irand(-3, 3), AllianceOverrunWP[8][1]+irand(-3, 3), AllianceOverrunWP[8][2]); - AddWaypoint(7, AllianceOverrunWP[9][0]+irand(-3, 3), AllianceOverrunWP[9][1]+irand(-3, 3), AllianceOverrunWP[9][2]); - me->SetHomePosition(AllianceOverrunWP[9][0]+irand(-3, 3), AllianceOverrunWP[9][1]+irand(-3, 3), AllianceOverrunWP[9][2], 0); + AddWaypoint(4, AllianceOverrunWP[6][0] + irand(-3, 3), AllianceOverrunWP[6][1] + irand(-3, 3), AllianceOverrunWP[6][2]); + AddWaypoint(5, AllianceOverrunWP[7][0] + irand(-3, 3), AllianceOverrunWP[7][1] + irand(-3, 3), AllianceOverrunWP[7][2]); + AddWaypoint(6, AllianceOverrunWP[8][0] + irand(-3, 3), AllianceOverrunWP[8][1] + irand(-3, 3), AllianceOverrunWP[8][2]); + AddWaypoint(7, AllianceOverrunWP[9][0] + irand(-3, 3), AllianceOverrunWP[9][1] + irand(-3, 3), AllianceOverrunWP[9][2]); + me->SetHomePosition(AllianceOverrunWP[9][0] + irand(-3, 3), AllianceOverrunWP[9][1] + irand(-3, 3), AllianceOverrunWP[9][2], 0); SetDespawnAtEnd(false); LastOverronPos = 7; Start(true, true); break; case 3: - AddWaypoint(4, AllianceOverrunWP[10][0]+irand(-3, 3), AllianceOverrunWP[10][1]+irand(-3, 3), AllianceOverrunWP[10][2]); - AddWaypoint(5, AllianceOverrunWP[11][0]+irand(-3, 3), AllianceOverrunWP[11][1]+irand(-3, 3), AllianceOverrunWP[11][2]); - AddWaypoint(6, AllianceOverrunWP[12][0]+irand(-3, 3), AllianceOverrunWP[12][1]+irand(-3, 3), AllianceOverrunWP[12][2]); - me->SetHomePosition(AllianceOverrunWP[12][0]+irand(-3, 3), AllianceOverrunWP[12][1]+irand(-3, 3), AllianceOverrunWP[12][2], 0); + AddWaypoint(4, AllianceOverrunWP[10][0] + irand(-3, 3), AllianceOverrunWP[10][1] + irand(-3, 3), AllianceOverrunWP[10][2]); + AddWaypoint(5, AllianceOverrunWP[11][0] + irand(-3, 3), AllianceOverrunWP[11][1] + irand(-3, 3), AllianceOverrunWP[11][2]); + AddWaypoint(6, AllianceOverrunWP[12][0] + irand(-3, 3), AllianceOverrunWP[12][1] + irand(-3, 3), AllianceOverrunWP[12][2]); + me->SetHomePosition(AllianceOverrunWP[12][0] + irand(-3, 3), AllianceOverrunWP[12][1] + irand(-3, 3), AllianceOverrunWP[12][2], 0); SetDespawnAtEnd(false); LastOverronPos = 6; Start(true, true); break; case 4: - AddWaypoint(4, AllianceOverrunWP[13][0]+irand(-3, 3), AllianceOverrunWP[13][1]+irand(-3, 3), AllianceOverrunWP[13][2]); - AddWaypoint(5, AllianceOverrunWP[14][0]+irand(-3, 3), AllianceOverrunWP[14][1]+irand(-3, 3), AllianceOverrunWP[14][2]); - AddWaypoint(6, AllianceOverrunWP[15][0]+irand(-3, 3), AllianceOverrunWP[15][1]+irand(-3, 3), AllianceOverrunWP[15][2]); - me->SetHomePosition(AllianceOverrunWP[15][0]+irand(-3, 3), AllianceOverrunWP[15][1]+irand(-3, 3), AllianceOverrunWP[15][2], 0); + AddWaypoint(4, AllianceOverrunWP[13][0] + irand(-3, 3), AllianceOverrunWP[13][1] + irand(-3, 3), AllianceOverrunWP[13][2]); + AddWaypoint(5, AllianceOverrunWP[14][0] + irand(-3, 3), AllianceOverrunWP[14][1] + irand(-3, 3), AllianceOverrunWP[14][2]); + AddWaypoint(6, AllianceOverrunWP[15][0] + irand(-3, 3), AllianceOverrunWP[15][1] + irand(-3, 3), AllianceOverrunWP[15][2]); + me->SetHomePosition(AllianceOverrunWP[15][0] + irand(-3, 3), AllianceOverrunWP[15][1] + irand(-3, 3), AllianceOverrunWP[15][2], 0); SetDespawnAtEnd(false); LastOverronPos = 6; Start(true, true); break; case 5: - AddWaypoint(4, AllianceOverrunWP[16][0]+irand(-3, 3), AllianceOverrunWP[16][1]+irand(-3, 3), AllianceOverrunWP[16][2]); - AddWaypoint(5, AllianceOverrunWP[17][0]+irand(-3, 3), AllianceOverrunWP[17][1]+irand(-3, 3), AllianceOverrunWP[17][2]); - AddWaypoint(6, AllianceOverrunWP[18][0]+irand(-3, 3), AllianceOverrunWP[18][1]+irand(-3, 3), AllianceOverrunWP[18][2]); - AddWaypoint(7, AllianceOverrunWP[19][0]+irand(-3, 3), AllianceOverrunWP[19][1]+irand(-3, 3), AllianceOverrunWP[19][2]); - AddWaypoint(8, AllianceOverrunWP[20][0]+irand(-3, 3), AllianceOverrunWP[20][1]+irand(-3, 3), AllianceOverrunWP[20][2]); - AddWaypoint(9, AllianceOverrunWP[21][0]+irand(-3, 3), AllianceOverrunWP[21][1]+irand(-3, 3), AllianceOverrunWP[21][2]); - me->SetHomePosition(AllianceOverrunWP[21][0]+irand(-3, 3), AllianceOverrunWP[21][1]+irand(-3, 3), AllianceOverrunWP[21][2], 0); + AddWaypoint(4, AllianceOverrunWP[16][0] + irand(-3, 3), AllianceOverrunWP[16][1] + irand(-3, 3), AllianceOverrunWP[16][2]); + AddWaypoint(5, AllianceOverrunWP[17][0] + irand(-3, 3), AllianceOverrunWP[17][1] + irand(-3, 3), AllianceOverrunWP[17][2]); + AddWaypoint(6, AllianceOverrunWP[18][0] + irand(-3, 3), AllianceOverrunWP[18][1] + irand(-3, 3), AllianceOverrunWP[18][2]); + AddWaypoint(7, AllianceOverrunWP[19][0] + irand(-3, 3), AllianceOverrunWP[19][1] + irand(-3, 3), AllianceOverrunWP[19][2]); + AddWaypoint(8, AllianceOverrunWP[20][0] + irand(-3, 3), AllianceOverrunWP[20][1] + irand(-3, 3), AllianceOverrunWP[20][2]); + AddWaypoint(9, AllianceOverrunWP[21][0] + irand(-3, 3), AllianceOverrunWP[21][1] + irand(-3, 3), AllianceOverrunWP[21][2]); + me->SetHomePosition(AllianceOverrunWP[21][0] + irand(-3, 3), AllianceOverrunWP[21][1] + irand(-3, 3), AllianceOverrunWP[21][2], 0); SetDespawnAtEnd(false); LastOverronPos = 9; Start(true, true); break; default: for (uint8 i = 22; i < 36; ++i) - AddWaypoint(i-18, AllianceOverrunWP[i][0]+irand(-3, 3), AllianceOverrunWP[i][1]+irand(-3, 3), AllianceOverrunWP[i][2]); + AddWaypoint(i - 18, AllianceOverrunWP[i][0] + irand(-3, 3), AllianceOverrunWP[i][1] + irand(-3, 3), AllianceOverrunWP[i][2]); SetDespawnAtEnd(true); LastOverronPos = 17; Start(true, true); @@ -339,12 +339,12 @@ void hyjal_trashAI::UpdateAI(uint32 /*diff*/) if (me->GetEntry() == GHOUL) { for (uint8 i = 0; i < 6; ++i) - AddWaypoint(i, HordeWPs[i][0]+irand(-3, 3), HordeWPs[i][1]+irand(-3, 3), HordeWPs[i][2]); + AddWaypoint(i, HordeWPs[i][0] + irand(-3, 3), HordeWPs[i][1] + irand(-3, 3), HordeWPs[i][2]); switch (OverrunType) { case 0: - AddWaypoint(5, HordeOverrunWP[16][0]+irand(-10, 10), HordeOverrunWP[16][1]+irand(-10, 10), HordeOverrunWP[16][2]); - AddWaypoint(6, HordeOverrunWP[17][0]+irand(-10, 10), HordeOverrunWP[17][1]+irand(-10, 10), HordeOverrunWP[17][2]); + AddWaypoint(5, HordeOverrunWP[16][0] + irand(-10, 10), HordeOverrunWP[16][1] + irand(-10, 10), HordeOverrunWP[16][2]); + AddWaypoint(6, HordeOverrunWP[17][0] + irand(-10, 10), HordeOverrunWP[17][1] + irand(-10, 10), HordeOverrunWP[17][2]); AddWaypoint(7, HordeOverrunWP[18][0], HordeOverrunWP[18][1], HordeOverrunWP[18][2]); AddWaypoint(8, HordeOverrunWP[19][0], HordeOverrunWP[19][1], HordeOverrunWP[19][2]); me->SetHomePosition(HordeOverrunWP[19][0], HordeOverrunWP[19][1], HordeOverrunWP[19][2], 0); @@ -353,8 +353,8 @@ void hyjal_trashAI::UpdateAI(uint32 /*diff*/) Start(true, true); break; case 1: - AddWaypoint(5, HordeOverrunWP[16][0]+irand(-10, 10), HordeOverrunWP[16][1]+irand(-10, 10), HordeOverrunWP[16][2]); - AddWaypoint(6, HordeOverrunWP[17][0]+irand(-10, 10), HordeOverrunWP[17][1]+irand(-10, 10), HordeOverrunWP[17][2]); + AddWaypoint(5, HordeOverrunWP[16][0] + irand(-10, 10), HordeOverrunWP[16][1] + irand(-10, 10), HordeOverrunWP[16][2]); + AddWaypoint(6, HordeOverrunWP[17][0] + irand(-10, 10), HordeOverrunWP[17][1] + irand(-10, 10), HordeOverrunWP[17][2]); AddWaypoint(7, HordeOverrunWP[18][0], HordeOverrunWP[18][1], HordeOverrunWP[18][2]); AddWaypoint(8, HordeOverrunWP[20][0], HordeOverrunWP[20][1], HordeOverrunWP[20][2]); me->SetHomePosition(HordeOverrunWP[20][0], HordeOverrunWP[20][1], HordeOverrunWP[20][2], 0); @@ -364,7 +364,7 @@ void hyjal_trashAI::UpdateAI(uint32 /*diff*/) break; default: for (uint8 i = 0; i < 16; ++i) - AddWaypoint(i+6, HordeOverrunWP[i][0]+irand(-10, 10), HordeOverrunWP[i][1]+irand(-10, 10), HordeOverrunWP[i][2]); + AddWaypoint(i + 6, HordeOverrunWP[i][0] + irand(-10, 10), HordeOverrunWP[i][1] + irand(-10, 10), HordeOverrunWP[i][2]); SetDespawnAtEnd(true); LastOverronPos = 21; Start(true, true); @@ -374,9 +374,9 @@ void hyjal_trashAI::UpdateAI(uint32 /*diff*/) if (me->GetEntry() == ABOMINATION) { for (uint8 i = 0; i < 6; ++i) - AddWaypoint(i, HordeWPs[i][0]+irand(-10, 10), HordeWPs[i][1]+irand(-10, 10), HordeWPs[i][2]); + AddWaypoint(i, HordeWPs[i][0] + irand(-10, 10), HordeWPs[i][1] + irand(-10, 10), HordeWPs[i][2]); for (uint8 i = 0; i < 16; ++i) - AddWaypoint(i+6, HordeOverrunWP[i][0]+irand(-10, 10), HordeOverrunWP[i][1]+irand(-10, 10), HordeOverrunWP[i][2]); + AddWaypoint(i + 6, HordeOverrunWP[i][0] + irand(-10, 10), HordeOverrunWP[i][1] + irand(-10, 10), HordeOverrunWP[i][2]); SetDespawnAtEnd(true); LastOverronPos = 21; Start(true, true); @@ -390,7 +390,7 @@ void hyjal_trashAI::JustDied(Unit* /*killer*/) if (IsEvent && !me->isWorldBoss()) instance->SetData(DATA_TRASH, 0);//signal trash is dead - if ((instance->GetData(DATA_RAIDDAMAGE) < MINRAIDDAMAGE && !me->isWorldBoss()) || (damageTaken < me->GetMaxHealth()/4 && me->isWorldBoss())) + if ((instance->GetData(DATA_RAIDDAMAGE) < MINRAIDDAMAGE && !me->isWorldBoss()) || (damageTaken < me->GetMaxHealth() / 4 && me->isWorldBoss())) me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);//no loot } @@ -406,7 +406,7 @@ public: instance = creature->GetInstanceScript(); meteor = false;//call once! CanMove = false; - Delay = rand()%30000; + Delay = rand() % 30000; me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetDisplayId(MODEL_INVIS); @@ -424,7 +424,7 @@ public: void Reset() { spawnTimer = 2000; - FlameBuffetTimer= 2000; + FlameBuffetTimer = 2000; imol = false; } @@ -447,16 +447,18 @@ public: { if (Delay <= diff) { - Delay=0; - }else{ - Delay-=diff; + Delay = 0; + } + else + { + Delay -= diff; return; } if (!meteor) { float x, y, z; me->GetPosition(x, y, z); - Creature* trigger = me->SummonCreature(NPC_TRIGGER, x+8, y+8, z+25+rand()%10, me->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN, 1000); + Creature* trigger = me->SummonCreature(NPC_TRIGGER, x + 8, y + 8, z + 25 + rand() % 10, me->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN, 1000); if (trigger) { trigger->SetVisible(false); @@ -466,7 +468,9 @@ public: } me->GetMotionMaster()->Clear(); meteor = true; - } else if (!CanMove){ + } + else if (!CanMove) + { if (spawnTimer <= diff) { me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); @@ -478,10 +482,13 @@ public: Unit* target = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_THRALL)); if (target && target->IsAlive()) me->AddThreat(target, 0.0f); - } else if (instance->GetData(DATA_ALLIANCE_RETREAT) && instance->GetData(DATA_HORDE_RETREAT)){ + } + else if (instance->GetData(DATA_ALLIANCE_RETREAT) && instance->GetData(DATA_HORDE_RETREAT)) + { //do overrun } - } else spawnTimer -= diff; + } + else spawnTimer -= diff; } if (!CanMove)return; hyjal_trashAI::UpdateAI(diff); @@ -492,7 +499,7 @@ public: if (!go) { go = true; - AddWaypoint(0, HordeWPs[7][0]+irand(-3, 3), HordeWPs[7][1]+irand(-3, 3), HordeWPs[7][2]);//HordeWPs[7] infront of thrall + AddWaypoint(0, HordeWPs[7][0] + irand(-3, 3), HordeWPs[7][1] + irand(-3, 3), HordeWPs[7][2]); //HordeWPs[7] infront of thrall Start(true, true); SetDespawnAtEnd(false); } @@ -503,13 +510,14 @@ public: if (!imol) { DoCast(me, SPELL_IMMOLATION); - imol=true; + imol = true; } if (FlameBuffetTimer <= diff) { DoCastVictim(SPELL_FLAME_BUFFET, true); FlameBuffetTimer = 7000; - } else FlameBuffetTimer -= diff; + } + else FlameBuffetTimer -= diff; DoMeleeAttackIfReady(); } }; @@ -588,13 +596,14 @@ public: if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, use horde WPs { for (uint8 i = 0; i < 8; ++i) - AddWaypoint(i, HordeWPs[i][0]+irand(-3, 3), HordeWPs[i][1]+irand(-3, 3), HordeWPs[i][2]); + AddWaypoint(i, HordeWPs[i][0] + irand(-3, 3), HordeWPs[i][1] + irand(-3, 3), HordeWPs[i][2]); Start(false, true); SetDespawnAtEnd(false); - }else//use alliance WPs + } + else //use alliance WPs { for (uint8 i = 0; i < 8; ++i) - AddWaypoint(i, AllianceWPs[i][0]+irand(-3, 3), AllianceWPs[i][1]+irand(-3, 3), AllianceWPs[i][2]); + AddWaypoint(i, AllianceWPs[i][0] + irand(-3, 3), AllianceWPs[i][1] + irand(-3, 3), AllianceWPs[i][2]); Start(false, true); SetDespawnAtEnd(false); } @@ -607,8 +616,9 @@ public: if (KnockDownTimer <= diff) { DoCastVictim(SPELL_KNOCKDOWN); - KnockDownTimer = 15000+rand()%10000; - } else KnockDownTimer -= diff; + KnockDownTimer = 15000 + rand() % 10000; + } + else KnockDownTimer -= diff; DoMeleeAttackIfReady(); } }; @@ -640,7 +650,7 @@ public: bool RandomMove; void Reset() { - FrenzyTimer = 5000+rand()%5000; + FrenzyTimer = 5000 + rand() % 5000; MoveTimer = 2000; RandomMove = false; } @@ -688,13 +698,14 @@ public: if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, use horde WPs { for (uint8 i = 0; i < 8; ++i) - AddWaypoint(i, HordeWPs[i][0]+irand(-3, 3), HordeWPs[i][1]+irand(-3, 3), HordeWPs[i][2]); + AddWaypoint(i, HordeWPs[i][0] + irand(-3, 3), HordeWPs[i][1] + irand(-3, 3), HordeWPs[i][2]); Start(false, true); SetDespawnAtEnd(false); - }else//use alliance WPs + } + else //use alliance WPs { for (uint8 i = 0; i < 8; ++i) - AddWaypoint(i, AllianceWPs[i][0]+irand(-3, 3), AllianceWPs[i][1]+irand(-3, 3), AllianceWPs[i][2]); + AddWaypoint(i, AllianceWPs[i][0] + irand(-3, 3), AllianceWPs[i][1] + irand(-3, 3), AllianceWPs[i][2]); Start(false, true); SetDespawnAtEnd(false); } @@ -703,8 +714,9 @@ public: if (FrenzyTimer <= diff) { DoCast(me, SPELL_FRENZY); - FrenzyTimer = 15000+rand()%15000; - } else FrenzyTimer -= diff; + FrenzyTimer = 15000 + rand() % 15000; + } + else FrenzyTimer -= diff; if (!UpdateVictim()) return; @@ -739,7 +751,7 @@ public: void Reset() { - ShadowBoltTimer = 1000+rand()%5000; + ShadowBoltTimer = 1000 + rand() % 5000; summons.DespawnAll(); } @@ -810,13 +822,14 @@ public: if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, use horde WPs { for (uint8 i = 0; i < 8; ++i) - AddWaypoint(i, HordeWPs[i][0]+irand(-3, 3), HordeWPs[i][1]+irand(-3, 3), HordeWPs[i][2]); + AddWaypoint(i, HordeWPs[i][0] + irand(-3, 3), HordeWPs[i][1] + irand(-3, 3), HordeWPs[i][2]); Start(true, true); SetDespawnAtEnd(false); - }else//use alliance WPs + } + else //use alliance WPs { for (uint8 i = 0; i < 8; ++i) - AddWaypoint(i, AllianceWPs[i][0]+irand(-3, 3), AllianceWPs[i][1]+irand(-3, 3), AllianceWPs[i][2]); + AddWaypoint(i, AllianceWPs[i][0] + irand(-3, 3), AllianceWPs[i][1] + irand(-3, 3), AllianceWPs[i][2]); Start(true, true); SetDespawnAtEnd(false); } @@ -829,8 +842,9 @@ public: if (ShadowBoltTimer <= diff) { DoCastVictim(SPELL_SHADOW_BOLT); - ShadowBoltTimer = 20000+rand()%10000; - } else ShadowBoltTimer -= diff; + ShadowBoltTimer = 20000 + rand() % 10000; + } + else ShadowBoltTimer -= diff; DoMeleeAttackIfReady(); } @@ -864,9 +878,9 @@ public: void Reset() { - CourseTimer = 20000+rand()%5000; - WailTimer = 15000+rand()%5000; - ShellTimer = 50000+rand()%10000; + CourseTimer = 20000 + rand() % 5000; + WailTimer = 15000 + rand() % 5000; + ShellTimer = 50000 + rand() % 10000; } void WaypointReached(uint32 waypointId) @@ -903,13 +917,14 @@ public: if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, use horde WPs { for (uint8 i = 0; i < 8; ++i) - AddWaypoint(i, HordeWPs[i][0]+irand(-3, 3), HordeWPs[i][1]+irand(-3, 3), HordeWPs[i][2]); + AddWaypoint(i, HordeWPs[i][0] + irand(-3, 3), HordeWPs[i][1] + irand(-3, 3), HordeWPs[i][2]); Start(false, true); SetDespawnAtEnd(false); - }else//use alliance WPs + } + else //use alliance WPs { for (uint8 i = 0; i < 8; ++i) - AddWaypoint(i, AllianceWPs[i][0]+irand(-3, 3), AllianceWPs[i][1]+irand(-3, 3), AllianceWPs[i][2]); + AddWaypoint(i, AllianceWPs[i][0] + irand(-3, 3), AllianceWPs[i][1] + irand(-3, 3), AllianceWPs[i][2]); Start(false, true); SetDespawnAtEnd(false); } @@ -920,18 +935,21 @@ public: if (CourseTimer <= diff) { DoCastVictim(SPELL_BANSHEE_CURSE); - CourseTimer = 20000+rand()%5000; - } else CourseTimer -= diff; + CourseTimer = 20000 + rand() % 5000; + } + else CourseTimer -= diff; if (WailTimer <= diff) { DoCastVictim(SPELL_BANSHEE_WAIL); - WailTimer = 15000+rand()%5000; - } else WailTimer -= diff; + WailTimer = 15000 + rand() % 5000; + } + else WailTimer -= diff; if (ShellTimer <= diff) { DoCast(me, SPELL_ANTI_MAGIC_SHELL); - ShellTimer = 50000+rand()%10000; - } else ShellTimer -= diff; + ShellTimer = 50000 + rand() % 10000; + } + else ShellTimer -= diff; DoMeleeAttackIfReady(); } }; @@ -962,7 +980,7 @@ public: void Reset() { - WebTimer = 20000+rand()%5000; + WebTimer = 20000 + rand() % 5000; } void WaypointReached(uint32 waypointId) @@ -999,13 +1017,14 @@ public: if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, use horde WPs { for (uint8 i = 0; i < 8; ++i) - AddWaypoint(i, HordeWPs[i][0]+irand(-3, 3), HordeWPs[i][1]+irand(-3, 3), HordeWPs[i][2]); + AddWaypoint(i, HordeWPs[i][0] + irand(-3, 3), HordeWPs[i][1] + irand(-3, 3), HordeWPs[i][2]); Start(false, true); SetDespawnAtEnd(false); - }else//use alliance WPs + } + else //use alliance WPs { for (uint8 i = 0; i < 8; ++i) - AddWaypoint(i, AllianceWPs[i][0]+irand(-3, 3), AllianceWPs[i][1]+irand(-3, 3), AllianceWPs[i][2]); + AddWaypoint(i, AllianceWPs[i][0] + irand(-3, 3), AllianceWPs[i][1] + irand(-3, 3), AllianceWPs[i][2]); Start(false, true); SetDespawnAtEnd(false); } @@ -1016,8 +1035,9 @@ public: if (WebTimer <= diff) { DoCastVictim(SPELL_WEB); - WebTimer = 20000+rand()%5000; - } else WebTimer -= diff; + WebTimer = 20000 + rand() % 5000; + } + else WebTimer -= diff; DoMeleeAttackIfReady(); } }; @@ -1048,7 +1068,7 @@ public: void Reset() { - ManaBurnTimer = 9000+rand()%5000; + ManaBurnTimer = 9000 + rand() % 5000; } void WaypointReached(uint32 waypointId) @@ -1085,13 +1105,14 @@ public: if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, use horde WPs { for (uint8 i = 0; i < 8; ++i) - AddWaypoint(i, HordeWPs[i][0]+irand(-3, 3), HordeWPs[i][1]+irand(-3, 3), HordeWPs[i][2]); + AddWaypoint(i, HordeWPs[i][0] + irand(-3, 3), HordeWPs[i][1] + irand(-3, 3), HordeWPs[i][2]); Start(false, true); SetDespawnAtEnd(false); - }else//use alliance WPs + } + else //use alliance WPs { for (uint8 i = 0; i < 8; ++i) - AddWaypoint(i, AllianceWPs[i][0]+irand(-3, 3), AllianceWPs[i][1]+irand(-3, 3), AllianceWPs[i][2]); + AddWaypoint(i, AllianceWPs[i][0] + irand(-3, 3), AllianceWPs[i][1] + irand(-3, 3), AllianceWPs[i][2]); Start(false, true); SetDespawnAtEnd(false); } @@ -1102,8 +1123,9 @@ public: if (ManaBurnTimer <= diff) { DoCastVictim(SPELL_MANA_BURN); - ManaBurnTimer = 9000+rand()%5000; - } else ManaBurnTimer -= diff; + ManaBurnTimer = 9000 + rand() % 5000; + } + else ManaBurnTimer -= diff; DoMeleeAttackIfReady(); } }; @@ -1190,9 +1212,10 @@ public: SetDespawnAtEnd(false); } else - {//fly path FlyPathWPs + { + //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]); + AddWaypoint(i, FlyPathWPs[i][0] + irand(-10, 10), FlyPathWPs[i][1] + irand(-10, 10), FlyPathWPs[i][2]); Start(false, true); SetDespawnAtEnd(false); } @@ -1208,7 +1231,8 @@ public: { me->GetMotionMaster()->MoveChase(me->GetVictim()); MoveTimer = 2000; - } else MoveTimer-=diff; + } + else MoveTimer -= diff; } if (FrostBreathTimer <= diff) @@ -1220,7 +1244,8 @@ public: me->GetMotionMaster()->Clear(); FrostBreathTimer = 4000; } - } else FrostBreathTimer -= diff; + } + else FrostBreathTimer -= diff; } }; }; @@ -1256,7 +1281,7 @@ public: { forcemove = true; Zpos = 10.0f; - StrikeTimer = 2000+rand()%5000; + StrikeTimer = 2000 + rand() % 5000; MoveTimer = 0; me->SetDisableGravity(true); } @@ -1302,12 +1327,14 @@ public: if (!useFlyPath) { for (uint8 i = 0; i < 3; ++i) - AddWaypoint(i, GargoyleWPs[i][0]+irand(-10, 10), GargoyleWPs[i][1]+irand(-10, 10), GargoyleWPs[i][2]); + AddWaypoint(i, GargoyleWPs[i][0] + irand(-10, 10), GargoyleWPs[i][1] + irand(-10, 10), GargoyleWPs[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]); + AddWaypoint(i, FlyPathWPs[i][0] + irand(-10, 10), FlyPathWPs[i][1] + irand(-10, 10), FlyPathWPs[i][2]); Start(false, true); SetDespawnAtEnd(false); } @@ -1321,9 +1348,10 @@ public: if (StrikeTimer <= diff) { me->CastSpell(DummyTarget[0], DummyTarget[1], DummyTarget[2], SPELL_GARGOYLE_STRIKE, false); - StrikeTimer = 2000+rand()%1000; - } else StrikeTimer -= diff; + StrikeTimer = 2000 + rand() % 1000; } + else StrikeTimer -= diff; + } } if (!UpdateVictim()) @@ -1341,12 +1369,13 @@ public: { float x, y, z; me->GetVictim()->GetPosition(x, y, z); - me->GetMotionMaster()->MovePoint(0, x, y, z+Zpos); + me->GetMotionMaster()->MovePoint(0, x, y, z + Zpos); Zpos -= 1.0f; if (Zpos <= 0) Zpos = 0; MoveTimer = 2000; - } else MoveTimer-=diff; + } + else MoveTimer -= diff; } if (StrikeTimer <= diff) @@ -1356,9 +1385,11 @@ public: DoCastVictim(SPELL_GARGOYLE_STRIKE); me->StopMoving(); me->GetMotionMaster()->Clear(); - StrikeTimer = 2000+rand()%1000; - } else StrikeTimer=0; - } else StrikeTimer -= diff; + StrikeTimer = 2000 + rand() % 1000; + } + else StrikeTimer = 0; + } + else StrikeTimer -= diff; } }; }; @@ -1388,7 +1419,7 @@ public: void Reset() { - ExplodeTimer = 5000+rand()%5000; + ExplodeTimer = 5000 + rand() % 5000; } void MoveInLineOfSight(Unit* who) @@ -1420,10 +1451,11 @@ public: EnterEvadeMode(); return; } - int dmg = 500+rand()%700; + int dmg = 500 + rand() % 700; me->CastCustomSpell(me->GetVictim(), SPELL_EXPLODING_SHOT, &dmg, 0, 0, false); - ExplodeTimer = 5000+rand()%5000; - } else ExplodeTimer -= diff; + ExplodeTimer = 5000 + rand() % 5000; + } + else ExplodeTimer -= diff; DoMeleeAttackIfReady(); } }; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.h b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.h index 8b0f9dc98..e97012fd4 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.h +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.h @@ -20,20 +20,20 @@ struct hyjal_trashAI : public npc_escortAI void JustDied(Unit* /*killer*/); - void DamageTaken(Unit* done_by, uint32 &damage, DamageEffectType, SpellSchoolMask); + void DamageTaken(Unit* done_by, uint32& damage, DamageEffectType, SpellSchoolMask); - public: - InstanceScript* instance; - bool IsEvent; - uint32 Delay; - uint32 LastOverronPos; - bool IsOverrun; - bool SetupOverrun; - uint32 OverrunType; - uint8 faction; - bool useFlyPath; - uint32 damageTaken; - float DummyTarget[3]; +public: + InstanceScript* instance; + bool IsEvent; + uint32 Delay; + uint32 LastOverronPos; + bool IsOverrun; + bool SetupOverrun; + uint32 OverrunType; + uint8 faction; + bool useFlyPath; + uint32 damageTaken; + float DummyTarget[3]; //private: }; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp index 21e480dd2..e210e54c8 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp @@ -1,8 +1,8 @@ - /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license: https://github.com/azerothcore/azerothcore-wotlk/blob/master/LICENSE-GPL2 - * Copyright (C) 2008-2016 TrinityCore - * Copyright (C) 2005-2009 MaNGOS - */ +/* +* Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license: https://github.com/azerothcore/azerothcore-wotlk/blob/master/LICENSE-GPL2 +* Copyright (C) 2008-2016 TrinityCore +* Copyright (C) 2005-2009 MaNGOS +*/ /* ScriptData SDName: Instance_Mount_Hyjal @@ -106,14 +106,30 @@ public: { switch (creature->GetEntry()) { - case RAGE_WINTERCHILL: RageWinterchill = creature->GetGUID(); break; - case ANETHERON: Anetheron = creature->GetGUID(); break; - case KAZROGAL: Kazrogal = creature->GetGUID(); break; - case AZGALOR: Azgalor = creature->GetGUID(); break; - case ARCHIMONDE: Archimonde = creature->GetGUID(); break; - case JAINA: JainaProudmoore = creature->GetGUID(); break; - case THRALL: Thrall = creature->GetGUID(); break; - case TYRANDE: TyrandeWhisperwind = creature->GetGUID(); break; + case RAGE_WINTERCHILL: + RageWinterchill = creature->GetGUID(); + break; + case ANETHERON: + Anetheron = creature->GetGUID(); + break; + case KAZROGAL: + Kazrogal = creature->GetGUID(); + break; + case AZGALOR: + Azgalor = creature->GetGUID(); + break; + case ARCHIMONDE: + Archimonde = creature->GetGUID(); + break; + case JAINA: + JainaProudmoore = creature->GetGUID(); + break; + case THRALL: + Thrall = creature->GetGUID(); + break; + case TYRANDE: + TyrandeWhisperwind = creature->GetGUID(); + break; } } @@ -121,14 +137,22 @@ public: { switch (identifier) { - case DATA_RAGEWINTERCHILL: return RageWinterchill; - case DATA_ANETHERON: return Anetheron; - case DATA_KAZROGAL: return Kazrogal; - case DATA_AZGALOR: return Azgalor; - case DATA_ARCHIMONDE: return Archimonde; - case DATA_JAINAPROUDMOORE: return JainaProudmoore; - case DATA_THRALL: return Thrall; - case DATA_TYRANDEWHISPERWIND: return TyrandeWhisperwind; + case DATA_RAGEWINTERCHILL: + return RageWinterchill; + case DATA_ANETHERON: + return Anetheron; + case DATA_KAZROGAL: + return Kazrogal; + case DATA_AZGALOR: + return Azgalor; + case DATA_ARCHIMONDE: + return Archimonde; + case DATA_JAINAPROUDMOORE: + return JainaProudmoore; + case DATA_THRALL: + return Thrall; + case DATA_TYRANDEWHISPERWIND: + return TyrandeWhisperwind; } return 0; @@ -166,14 +190,14 @@ public: if (map->IsDungeon() && unit) { unit->SetVisible(false); - Map::PlayerList const &PlayerList = map->GetPlayers(); + Map::PlayerList const& PlayerList = map->GetPlayers(); if (PlayerList.isEmpty()) - return; + return; for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) { - if (i->GetSource()) - { + if (i->GetSource()) + { WorldPacket packet; ChatHandler::BuildChatPacket(packet, CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, unit, i->GetSource(), YELL_EFFORTS); i->GetSource()->GetSession()->SendPacket(&packet); @@ -181,7 +205,7 @@ public: WorldPacket data2(SMSG_PLAY_SOUND, 4); data2 << 10986; i->GetSource()->GetSession()->SendPacket(&data2); - } + } } } } @@ -242,9 +266,9 @@ public: std::ostringstream saveStream; saveStream << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' ' << m_auiEncounter[2] << ' ' - << m_auiEncounter[3] << ' ' << m_auiEncounter[4] - << ' ' << allianceRetreat << ' ' << hordeRetreat - << ' ' << RaidDamage; + << m_auiEncounter[3] << ' ' << m_auiEncounter[4] + << ' ' << allianceRetreat << ' ' << hordeRetreat + << ' ' << RaidDamage; str_data = saveStream.str(); @@ -258,15 +282,24 @@ public: { switch (type) { - case DATA_RAGEWINTERCHILLEVENT: return m_auiEncounter[0]; - case DATA_ANETHERONEVENT: return m_auiEncounter[1]; - case DATA_KAZROGALEVENT: return m_auiEncounter[2]; - case DATA_AZGALOREVENT: return m_auiEncounter[3]; - case DATA_ARCHIMONDEEVENT: return m_auiEncounter[4]; - case DATA_TRASH: return Trash; - case DATA_ALLIANCE_RETREAT: return allianceRetreat; - case DATA_HORDE_RETREAT: return hordeRetreat; - case DATA_RAIDDAMAGE: return RaidDamage; + case DATA_RAGEWINTERCHILLEVENT: + return m_auiEncounter[0]; + case DATA_ANETHERONEVENT: + return m_auiEncounter[1]; + case DATA_KAZROGALEVENT: + return m_auiEncounter[2]; + case DATA_AZGALOREVENT: + return m_auiEncounter[3]; + case DATA_ARCHIMONDEEVENT: + return m_auiEncounter[4]; + case DATA_TRASH: + return Trash; + case DATA_ALLIANCE_RETREAT: + return allianceRetreat; + case DATA_HORDE_RETREAT: + return hordeRetreat; + case DATA_RAIDDAMAGE: + return RaidDamage; } return 0; } @@ -293,25 +326,25 @@ public: OUT_LOAD_INST_DATA_COMPLETE; } - protected: - uint32 m_auiEncounter[EncounterCount]; - std::string str_data; - std::list m_uiAncientGemGUID; - uint64 RageWinterchill; - uint64 Anetheron; - uint64 Kazrogal; - uint64 Azgalor; - uint64 Archimonde; - uint64 JainaProudmoore; - uint64 Thrall; - uint64 TyrandeWhisperwind; - uint64 HordeGate; - uint64 ElfGate; - uint32 Trash; - uint32 hordeRetreat; - uint32 allianceRetreat; - uint32 RaidDamage; - bool ArchiYell; + protected: + uint32 m_auiEncounter[EncounterCount]; + std::string str_data; + std::list m_uiAncientGemGUID; + uint64 RageWinterchill; + uint64 Anetheron; + uint64 Kazrogal; + uint64 Azgalor; + uint64 Archimonde; + uint64 JainaProudmoore; + uint64 Thrall; + uint64 TyrandeWhisperwind; + uint64 HordeGate; + uint64 ElfGate; + uint32 Trash; + uint32 hordeRetreat; + uint32 allianceRetreat; + uint32 RaidDamage; + bool ArchiYell; }; }; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_epoch.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_epoch.cpp index 48fc13d47..8913fc5eb 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_epoch.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_epoch.cpp @@ -133,7 +133,7 @@ public: void KilledUnit(Unit* /*victim*/) { - if (!urand(0,1)) + if (!urand(0, 1)) return; Talk(SAY_SLAY); diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite.cpp index 5e62e6126..561e75962 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite.cpp @@ -47,8 +47,8 @@ public: SummonList summons; uint32 beamTimer; - void Reset() - { + void Reset() + { events.Reset(); summons.DespawnAll(); if (InstanceScript* pInstance = me->GetInstanceScript()) 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 fba4bc1de..36533e613 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp @@ -59,7 +59,7 @@ public: EventMap events; bool finished; - void Reset() + void Reset() { me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true); me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK_DEST, true); @@ -86,13 +86,13 @@ public: void KilledUnit(Unit* /*victim*/) { - if (!urand(0,1)) + if (!urand(0, 1)) return; Talk(SAY_SLAY); } - void DamageTaken(Unit* who, uint32 &damage, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit* who, uint32& damage, DamageEffectType, SpellSchoolMask) { if (!finished && damage >= me->GetHealth()) { diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp index 2d1a4a7d7..1c71bfbfd 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp @@ -65,7 +65,7 @@ public: void KilledUnit(Unit* /*victim*/) { - if (!urand(0,1)) + if (!urand(0, 1)) return; Talk(SAY_SLAY); @@ -92,7 +92,7 @@ public: events.RepeatEvent(20000); break; case EVENT_SPELL_CONSTRICTING_CHAINS: - if (Unit *pTarget = SelectTarget(SELECT_TARGET_BOTTOMAGGRO, 0, 50.0f, true)) + if (Unit* pTarget = SelectTarget(SELECT_TARGET_BOTTOMAGGRO, 0, 50.0f, true)) me->CastSpell(pTarget, DUNGEON_MODE(SPELL_CONSTRICTING_CHAINS_N, SPELL_CONSTRICTING_CHAINS_H), false); events.RepeatEvent(14000); break; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm.cpp index 69db15c16..bcaf86831 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm.cpp @@ -59,8 +59,8 @@ public: EventMap events; SummonList summons; - void Reset() - { + void Reset() + { events.Reset(); summons.DespawnAll(); } @@ -86,7 +86,7 @@ public: void KilledUnit(Unit* /*victim*/) { - if (!urand(0,1)) + if (!urand(0, 1)) return; Talk(SAY_SLAY); @@ -119,19 +119,19 @@ public: events.RepeatEvent(10000); break; case EVENT_SPELL_STEAL_FLESH: - if (!urand(0,2)) + if (!urand(0, 2)) Talk(SAY_STEAL_FLESH); me->CastSpell(me->GetVictim(), SPELL_STEAL_FLESH_CHANNEL, false); events.RepeatEvent(12000); break; case EVENT_SPELL_SUMMON_GHOULS: - if (!urand(0,2)) + if (!urand(0, 2)) Talk(SAY_SUMMON_GHOULS); me->CastSpell(me, SPELL_SUMMON_GHOULS, false); events.RepeatEvent(10000); break; case EVENT_EXPLODE_GHOUL: - if (!urand(0,2)) + if (!urand(0, 2)) Talk(SAY_EXPLODE_GHOUL); ExplodeGhoul(); events.RepeatEvent(15000); @@ -150,34 +150,34 @@ public: class spell_boss_salramm_steal_flesh : public SpellScriptLoader { - public: - spell_boss_salramm_steal_flesh() : SpellScriptLoader("spell_boss_salramm_steal_flesh") { } +public: + spell_boss_salramm_steal_flesh() : SpellScriptLoader("spell_boss_salramm_steal_flesh") { } - class spell_boss_salramm_steal_flesh_AuraScript : public AuraScript + class spell_boss_salramm_steal_flesh_AuraScript : public AuraScript + { + PrepareAuraScript(spell_boss_salramm_steal_flesh_AuraScript); + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_boss_salramm_steal_flesh_AuraScript); - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + Unit* caster = GetCaster(); + Unit* target = GetUnitOwner(); + if (caster) { - Unit* caster = GetCaster(); - Unit* target = GetUnitOwner(); - if (caster) - { - caster->CastSpell(caster, SPELL_STEAL_FLESH_CASTER, true); - caster->CastSpell(target, SPELL_STEAL_FLESH_TARGET, true); - } + caster->CastSpell(caster, SPELL_STEAL_FLESH_CASTER, true); + caster->CastSpell(target, SPELL_STEAL_FLESH_TARGET, true); } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_boss_salramm_steal_flesh_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_boss_salramm_steal_flesh_AuraScript(); } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_boss_salramm_steal_flesh_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_boss_salramm_steal_flesh_AuraScript(); + } }; void AddSC_boss_salramm() diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp index 008c8e8f8..8a70e130a 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp @@ -145,12 +145,12 @@ enum Spells enum GossipMenuArthas { - GOSSIP_MENU_ARTHAS_1 = 13076, - GOSSIP_MENU_ARTHAS_2 = 13125, - GOSSIP_MENU_ARTHAS_3 = 13126, - GOSSIP_MENU_ARTHAS_4 = 13177, - GOSSIP_MENU_ARTHAS_5 = 13179, - GOSSIP_MENU_ARTHAS_6 = 13287, + GOSSIP_MENU_ARTHAS_1 = 13076, + GOSSIP_MENU_ARTHAS_2 = 13125, + GOSSIP_MENU_ARTHAS_3 = 13126, + GOSSIP_MENU_ARTHAS_4 = 13177, + GOSSIP_MENU_ARTHAS_5 = 13179, + GOSSIP_MENU_ARTHAS_6 = 13287, }; enum Misc @@ -181,7 +181,7 @@ enum Events }; // Locations for necromancers and add to spawn -float WavesLocations[ENCOUNTER_WAVES_NUMBER][ENCOUNTER_WAVES_MAX_SPAWNS][5]= +float WavesLocations[ENCOUNTER_WAVES_NUMBER][ENCOUNTER_WAVES_MAX_SPAWNS][5] = { { {NPC_RISEN_ZOMBIE, 2164.698975f, 1255.392944f, 135.040878f, 0.490202f}, @@ -234,7 +234,7 @@ float WavesLocations[ENCOUNTER_WAVES_NUMBER][ENCOUNTER_WAVES_MAX_SPAWNS][5]= }; // Locations for rifts to spawn and draconians to go -float RiftAndSpawnsLocations[ENCOUNTER_CHRONO_NUMBER][ENCOUNTER_CHRONO_MAX_SPAWNS_FIRST][5]= +float RiftAndSpawnsLocations[ENCOUNTER_CHRONO_NUMBER][ENCOUNTER_CHRONO_MAX_SPAWNS_FIRST][5] = { { {NPC_TIME_RIFT, 2431.790039f, 1190.670044f, 148.076004f, 0.187923f}, @@ -291,7 +291,7 @@ public: break; case GOSSIP_ACTION_INFO_DEF+2: ClearGossipMenuFor(player); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_3, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+3: @@ -332,23 +332,23 @@ public: switch (pInstance->GetData(DATA_ARTHAS_EVENT)) { case COS_PROGRESS_FINISHED_INTRO: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_1, creature->GetGUID()); break; case COS_PROGRESS_REACHED_TOWN_HALL: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_2, creature->GetGUID()); break; case COS_PROGRESS_KILLED_EPOCH: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_4, creature->GetGUID()); break; case COS_PROGRESS_LAST_CITY: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_5, creature->GetGUID()); break; case COS_PROGRESS_BEFORE_MALGANIS: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+6); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_6, creature->GetGUID()); break; } @@ -427,7 +427,7 @@ public: waveGroupId = 10; eventInRun = true; SetRun(true); - actionEvents.ScheduleEvent(EVENT_ACTION_PHASE2+9, 10000); + actionEvents.ScheduleEvent(EVENT_ACTION_PHASE2 + 9, 10000); } else if (param == ACTION_START_TOWN_HALL) { @@ -473,7 +473,7 @@ public: { EnterEvadeMode(); eventInRun = true; - actionEvents.ScheduleEvent(EVENT_ACTION_PHASE5+1, 22000); + actionEvents.ScheduleEvent(EVENT_ACTION_PHASE5 + 1, 22000); me->SetFacingTo(1.84f); if (!me->GetMap()->GetPlayers().isEmpty()) @@ -649,7 +649,7 @@ public: eventInRun = true; break; - } + } } void UpdateAI(uint32 diff) override @@ -671,8 +671,8 @@ public: me->SetTarget(uther->GetGUID()); } for (int i = 0; i < 3; ++i) - if (Creature *horse = me->SummonCreature(NPC_HORSE_ESCORT, EventPos[EVENT_SRC_HORSE1+i], TEMPSUMMON_DEAD_DESPAWN, 180000)) - horse->GetMotionMaster()->MovePoint(0, EventPos[EVENT_DST_HORSE1+i], false); + if (Creature* horse = me->SummonCreature(NPC_HORSE_ESCORT, EventPos[EVENT_SRC_HORSE1 + i], TEMPSUMMON_DEAD_DESPAWN, 180000)) + horse->GetMotionMaster()->MovePoint(0, EventPos[EVENT_DST_HORSE1 + i], false); ScheduleNextEvent(currentEvent, 4000); break; @@ -1050,7 +1050,7 @@ public: eventInRun = false; SetEscortPaused(false); Talk(SAY_PHASE311); - me->SetFacingTo(M_PI*3/2); + me->SetFacingTo(M_PI * 3 / 2); ScheduleNextEvent(currentEvent, 0); break; case EVENT_ACTION_PHASE3+14: @@ -1061,7 +1061,7 @@ public: return; } - me->SetFacingTo(M_PI/2); + me->SetFacingTo(M_PI / 2); ScheduleNextEvent(currentEvent, 8000); break; case EVENT_ACTION_PHASE3+15: @@ -1152,7 +1152,7 @@ public: me->SetVisible(false); actionEvents.PopEvent(); break; - } + } } //Battling skills @@ -1203,15 +1203,15 @@ Creature* npc_arthas::npc_arthasAI::GetEventNpc(uint32 entry) void npc_arthas::npc_arthasAI::ScheduleNextEvent(uint32 currentEvent, uint32 time) { actionEvents.PopEvent(); - actionEvents.ScheduleEvent(currentEvent+1, time); + actionEvents.ScheduleEvent(currentEvent + 1, time); } void npc_arthas::npc_arthasAI::SummonNextWave() { - Map::PlayerList const &PlayerList = me->GetMap()->GetPlayers(); - if (!PlayerList.isEmpty()) - for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) - i->GetSource()->PlayerTalkClass->SendPointOfInterest(1000+waveGroupId); + Map::PlayerList const& PlayerList = me->GetMap()->GetPlayers(); + if (!PlayerList.isEmpty()) + for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) + i->GetSource()->PlayerTalkClass->SendPointOfInterest(1000 + waveGroupId); waveKillCount = 0; // this is forced condition! uint32 tableId = waveGroupId; @@ -1252,7 +1252,7 @@ void npc_arthas::npc_arthasAI::ReorderInstance(uint32 data) if (data == COS_PROGRESS_FINISHED_CITY_INTRO) { eventInRun = true; - actionEvents.RescheduleEvent(EVENT_ACTION_PHASE2+8, 10000); + actionEvents.RescheduleEvent(EVENT_ACTION_PHASE2 + 8, 10000); } else if (data == COS_PROGRESS_KILLED_MEATHOOK) { @@ -1319,7 +1319,7 @@ void npc_arthas::npc_arthasAI::SendNextWave(uint32 entry) else SummonNextWave(); - pInstance->DoUpdateWorldState(WORLDSTATE_WAVE_COUNT, waveGroupId+1); + pInstance->DoUpdateWorldState(WORLDSTATE_WAVE_COUNT, waveGroupId + 1); } } @@ -1354,39 +1354,39 @@ void npc_arthas::npc_arthasAI::SpawnTimeRift() class npc_crate_helper : public CreatureScript { - public: - npc_crate_helper() : CreatureScript("npc_create_helper_cot") { } +public: + npc_crate_helper() : CreatureScript("npc_create_helper_cot") { } - struct npc_crate_helperAI : public NullCreatureAI + struct npc_crate_helperAI : public NullCreatureAI + { + npc_crate_helperAI(Creature* creature) : NullCreatureAI(creature) { - npc_crate_helperAI(Creature* creature) : NullCreatureAI(creature) - { - _marked = false; - } + _marked = false; + } - void SpellHit(Unit* /*caster*/, SpellInfo const* spell) + void SpellHit(Unit* /*caster*/, SpellInfo const* spell) + { + if (spell->Id == SPELL_ARCANE_DISRUPTION && !_marked) { - if (spell->Id == SPELL_ARCANE_DISRUPTION && !_marked) + _marked = true; + if (InstanceScript* instance = me->GetInstanceScript()) + instance->SetData(DATA_CRATE_COUNT, 0); + if (GameObject* crate = me->FindNearestGameObject(GO_SUSPICIOUS_CRATE, 5.0f)) { - _marked = true; - if (InstanceScript* instance = me->GetInstanceScript()) - instance->SetData(DATA_CRATE_COUNT, 0); - if (GameObject* crate = me->FindNearestGameObject(GO_SUSPICIOUS_CRATE, 5.0f)) - { - crate->SummonGameObject(GO_PLAGUED_CRATE, crate->GetPositionX(), crate->GetPositionY(), crate->GetPositionZ(), crate->GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, DAY); - crate->Delete(); - } + crate->SummonGameObject(GO_PLAGUED_CRATE, crate->GetPositionX(), crate->GetPositionY(), crate->GetPositionZ(), crate->GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, DAY); + crate->Delete(); } } - - private: - bool _marked; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_crate_helperAI(creature); } + + private: + bool _marked; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_crate_helperAI(creature); + } }; enum chromie @@ -1398,207 +1398,207 @@ enum chromie class npc_cos_chromie_start : public CreatureScript { - public: - npc_cos_chromie_start() : CreatureScript("npc_cos_chromie_start") { } +public: + npc_cos_chromie_start() : CreatureScript("npc_cos_chromie_start") { } - bool OnQuestAccept(Player* , Creature* creature, const Quest* pQuest) override + bool OnQuestAccept(Player*, Creature* creature, const Quest* pQuest) override + { + if (pQuest->GetQuestId() == QUEST_DISPELLING_ILLUSIONS) + if (InstanceScript* pInstance = creature->GetInstanceScript()) + pInstance->SetData(DATA_SHOW_CRATES, 1); + + return true; + } + + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 /*action*/) override + { + // final menu id, show crates if hidden and add item if missing + if (player->PlayerTalkClass->GetGossipMenu().GetMenuId() == 9595) { - if (pQuest->GetQuestId() == QUEST_DISPELLING_ILLUSIONS) - if (InstanceScript* pInstance = creature->GetInstanceScript()) + if (InstanceScript* pInstance = creature->GetInstanceScript()) + if (pInstance->GetData(DATA_ARTHAS_EVENT) == COS_PROGRESS_NOT_STARTED) pInstance->SetData(DATA_SHOW_CRATES, 1); - return true; + if (!player->HasItemCount(ITEM_ARCANE_DISRUPTOR)) + player->AddItem(ITEM_ARCANE_DISRUPTOR, 1); } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 /*action*/) override + // Skip Event + else if (player->PlayerTalkClass->GetGossipMenu().GetMenuId() == 11277) { - // final menu id, show crates if hidden and add item if missing - if (player->PlayerTalkClass->GetGossipMenu().GetMenuId() == 9595) + if (InstanceScript* pInstance = creature->GetInstanceScript()) { - if (InstanceScript* pInstance = creature->GetInstanceScript()) - if (pInstance->GetData(DATA_ARTHAS_EVENT) == COS_PROGRESS_NOT_STARTED) - pInstance->SetData(DATA_SHOW_CRATES, 1); - - if (!player->HasItemCount(ITEM_ARCANE_DISRUPTOR)) - player->AddItem(ITEM_ARCANE_DISRUPTOR, 1); - } - // Skip Event - else if (player->PlayerTalkClass->GetGossipMenu().GetMenuId() == 11277) - { - if (InstanceScript* pInstance = creature->GetInstanceScript()) + if (pInstance->GetData(DATA_ARTHAS_EVENT) == COS_PROGRESS_NOT_STARTED) { - if (pInstance->GetData(DATA_ARTHAS_EVENT) == COS_PROGRESS_NOT_STARTED) - { - pInstance->SetData(DATA_ARTHAS_EVENT, COS_PROGRESS_FINISHED_INTRO); - if (Creature* arthas = ObjectAccessor::GetCreature(*creature, pInstance->GetData64(DATA_ARTHAS))) - arthas->AI()->Reset(); - } - player->NearTeleportTo(LeaderIntroPos2.GetPositionX(), LeaderIntroPos2.GetPositionY(), LeaderIntroPos2.GetPositionZ(), LeaderIntroPos2.GetOrientation()); - + pInstance->SetData(DATA_ARTHAS_EVENT, COS_PROGRESS_FINISHED_INTRO); + if (Creature* arthas = ObjectAccessor::GetCreature(*creature, pInstance->GetData64(DATA_ARTHAS))) + arthas->AI()->Reset(); } - } + player->NearTeleportTo(LeaderIntroPos2.GetPositionX(), LeaderIntroPos2.GetPositionY(), LeaderIntroPos2.GetPositionZ(), LeaderIntroPos2.GetOrientation()); - // return false to display last windows - return false; + } } + + // return false to display last windows + return false; + } }; class npc_cos_chromie_middle : public CreatureScript { - public: - npc_cos_chromie_middle() : CreatureScript("npc_cos_chromie_middle") { } +public: + npc_cos_chromie_middle() : CreatureScript("npc_cos_chromie_middle") { } - bool OnQuestAccept(Player* , Creature* creature, const Quest* pQuest) override - { - if (pQuest->GetQuestId() == QUEST_A_ROYAL_ESCORT) - if (InstanceScript* pInstance = creature->GetInstanceScript()) - if (pInstance->GetData(DATA_ARTHAS_EVENT) == COS_PROGRESS_CRATES_FOUND) - pInstance->SetData(DATA_ARTHAS_EVENT, COS_PROGRESS_START_INTRO); + bool OnQuestAccept(Player*, Creature* creature, const Quest* pQuest) override + { + if (pQuest->GetQuestId() == QUEST_A_ROYAL_ESCORT) + if (InstanceScript* pInstance = creature->GetInstanceScript()) + if (pInstance->GetData(DATA_ARTHAS_EVENT) == COS_PROGRESS_CRATES_FOUND) + pInstance->SetData(DATA_ARTHAS_EVENT, COS_PROGRESS_START_INTRO); + return true; + } + + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 /*action*/) override + { + if (!creature->GetInstanceScript() || creature->GetInstanceScript()->GetData(DATA_ARTHAS_EVENT) != COS_PROGRESS_CRATES_FOUND) return true; - } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 /*action*/) override + // We can start event:) + if (player->PlayerTalkClass->GetGossipMenu().GetMenuId() == 9612) + creature->GetInstanceScript()->SetData(DATA_ARTHAS_EVENT, COS_PROGRESS_START_INTRO); + + return false; + } + + bool OnGossipHello(Player* player, Creature* creature) override + { + if (creature->IsQuestGiver()) { - if (!creature->GetInstanceScript() || creature->GetInstanceScript()->GetData(DATA_ARTHAS_EVENT) != COS_PROGRESS_CRATES_FOUND) - return true; - - // We can start event:) - if (player->PlayerTalkClass->GetGossipMenu().GetMenuId() == 9612) - creature->GetInstanceScript()->SetData(DATA_ARTHAS_EVENT, COS_PROGRESS_START_INTRO); - - return false; + player->PrepareQuestMenu(creature->GetGUID()); + player->SendPreparedQuest(creature->GetGUID()); } - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - { - player->PrepareQuestMenu(creature->GetGUID()); - player->SendPreparedQuest(creature->GetGUID()); - } + if (!creature->GetInstanceScript() || creature->GetInstanceScript()->GetData(DATA_ARTHAS_EVENT) != COS_PROGRESS_CRATES_FOUND) + return true; - if (!creature->GetInstanceScript() || creature->GetInstanceScript()->GetData(DATA_ARTHAS_EVENT) != COS_PROGRESS_CRATES_FOUND) - return true; - - return false; - } + return false; + } }; class npc_cos_stratholme_citizien : public CreatureScript { - public: - npc_cos_stratholme_citizien() : CreatureScript("npc_cos_stratholme_citizien") { } +public: + npc_cos_stratholme_citizien() : CreatureScript("npc_cos_stratholme_citizien") { } - struct npc_cos_stratholme_citizienAI : public ScriptedAI + struct npc_cos_stratholme_citizienAI : public ScriptedAI + { + npc_cos_stratholme_citizienAI(Creature* creature) : ScriptedAI(creature) { - npc_cos_stratholme_citizienAI(Creature* creature) : ScriptedAI(creature) - { - allowTimer = 0; - pInstance = me->GetInstanceScript(); - if (!pInstance || pInstance->GetData(DATA_ARTHAS_EVENT) < COS_PROGRESS_FINISHED_CITY_INTRO) - allowTimer++; - } - - bool locked; - uint32 changeTimer; - InstanceScript* pInstance; - uint32 allowTimer; - - void Reset() - { - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); - locked = false; - changeTimer = 0; - - if (pInstance) - { - uint32 data = pInstance->GetData(DATA_ARTHAS_EVENT); - if (me->GetDistance(2400, 1200, 135) > 20.0f && data >= COS_PROGRESS_FINISHED_CITY_INTRO) - { - if (data >= COS_PROGRESS_KILLED_SALRAMM) - me->DespawnOrUnsummon(500); - else - InfectMe(3000); - } - } - } - - void MoveInLineOfSight(Unit* who) - { - if (!allowTimer && !locked && (who->GetTypeId() == TYPEID_PLAYER || who->IsPet()) && me->GetDistance(who) < 15.0f) - InfectMe(2000); - - ScriptedAI::MoveInLineOfSight(who); - } - - void DoAction(int32 param) - { - if (param == ACTION_INFECT_CITIZIEN) - InfectMe(1); - else if (param == ACTION_FORCE_CHANGE_LOCK) - locked = true; - } - - void InfectMe(uint32 time) - { - locked = true; - changeTimer = time; - } - - void SpellHit(Unit* caster, const SpellInfo* spellInfo) - { - if (spellInfo->Id == SPELL_ARTHAS_CRUSADER_STRIKE) - { - if (me->GetEntry() == NPC_CITY_MAN3) - { - me->StopMoving(); - me->HandleEmoteCommand(54); // laugh - } - else - Unit::Kill(caster, me); - } - } - - void UpdateAI(uint32 diff) - { - ScriptedAI::UpdateAI(diff); - - if (allowTimer) - { - allowTimer += diff; - if (allowTimer >= 8000 && pInstance && pInstance->GetData(DATA_ARTHAS_EVENT) >= COS_PROGRESS_FINISHED_CITY_INTRO) - allowTimer = 0; - } - - if (changeTimer) - { - changeTimer += diff; - if (changeTimer >= 2500 && changeTimer < 10000) - { - me->CastSpell(me, SPELL_GREEN_VISUAL_AURA, true); - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_COWER); - changeTimer = 10000; - } - else if (changeTimer >= 14500 && changeTimer < 20000) - { - me->UpdateEntry(NPC_RISEN_ZOMBIE, NULL, false); - me->SetReactState(REACT_AGGRESSIVE); - changeTimer = 20000; - } - else if (changeTimer >= 23000) - { - me->RemoveAura(SPELL_GREEN_VISUAL_AURA); - changeTimer = 0; - } - } - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_cos_stratholme_citizienAI(creature); + allowTimer = 0; + pInstance = me->GetInstanceScript(); + if (!pInstance || pInstance->GetData(DATA_ARTHAS_EVENT) < COS_PROGRESS_FINISHED_CITY_INTRO) + allowTimer++; } + + bool locked; + uint32 changeTimer; + InstanceScript* pInstance; + uint32 allowTimer; + + void Reset() + { + me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); + locked = false; + changeTimer = 0; + + if (pInstance) + { + uint32 data = pInstance->GetData(DATA_ARTHAS_EVENT); + if (me->GetDistance(2400, 1200, 135) > 20.0f && data >= COS_PROGRESS_FINISHED_CITY_INTRO) + { + if (data >= COS_PROGRESS_KILLED_SALRAMM) + me->DespawnOrUnsummon(500); + else + InfectMe(3000); + } + } + } + + void MoveInLineOfSight(Unit* who) + { + if (!allowTimer && !locked && (who->GetTypeId() == TYPEID_PLAYER || who->IsPet()) && me->GetDistance(who) < 15.0f) + InfectMe(2000); + + ScriptedAI::MoveInLineOfSight(who); + } + + void DoAction(int32 param) + { + if (param == ACTION_INFECT_CITIZIEN) + InfectMe(1); + else if (param == ACTION_FORCE_CHANGE_LOCK) + locked = true; + } + + void InfectMe(uint32 time) + { + locked = true; + changeTimer = time; + } + + void SpellHit(Unit* caster, const SpellInfo* spellInfo) + { + if (spellInfo->Id == SPELL_ARTHAS_CRUSADER_STRIKE) + { + if (me->GetEntry() == NPC_CITY_MAN3) + { + me->StopMoving(); + me->HandleEmoteCommand(54); // laugh + } + else + Unit::Kill(caster, me); + } + } + + void UpdateAI(uint32 diff) + { + ScriptedAI::UpdateAI(diff); + + if (allowTimer) + { + allowTimer += diff; + if (allowTimer >= 8000 && pInstance && pInstance->GetData(DATA_ARTHAS_EVENT) >= COS_PROGRESS_FINISHED_CITY_INTRO) + allowTimer = 0; + } + + if (changeTimer) + { + changeTimer += diff; + if (changeTimer >= 2500 && changeTimer < 10000) + { + me->CastSpell(me, SPELL_GREEN_VISUAL_AURA, true); + me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_COWER); + changeTimer = 10000; + } + else if (changeTimer >= 14500 && changeTimer < 20000) + { + me->UpdateEntry(NPC_RISEN_ZOMBIE, NULL, false); + me->SetReactState(REACT_AGGRESSIVE); + changeTimer = 20000; + } + else if (changeTimer >= 23000) + { + me->RemoveAura(SPELL_GREEN_VISUAL_AURA); + changeTimer = 0; + } + } + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_cos_stratholme_citizienAI(creature); + } }; void AddSC_culling_of_stratholme() diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h index b557ef8b3..2b9be7906 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h @@ -139,7 +139,7 @@ const Position LeaderIntroPos4 = {2423.12f, 1119.43f, 148.07f, 0.0f}; const Position LeaderIntroPos5 = {2540.48f, 1129.06f, 130.86f, 0.0f}; const Position LeaderIntroPos6 = {2327.39f, 1412.47f, 127.69f, 0.0f}; -const Position EventPos[] = +const Position EventPos[] = { {1813.298f, 1283.578f, 142.326f, 3.878161f}, // chromie {1809.46f, 1286.05f, 142.62f, 4.8f}, // hourglass diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp index f6c72a335..5b14a2cb7 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp @@ -12,7 +12,7 @@ class instance_culling_of_stratholme : public InstanceMapScript { - public: +public: instance_culling_of_stratholme() : InstanceMapScript("instance_culling_of_stratholme", 595) { } InstanceScript* GetInstanceScript(InstanceMap* pMap) const @@ -31,7 +31,7 @@ class instance_culling_of_stratholme : public InstanceMapScript // GOs _shkafGateGUID = 0; _exitGateGUID = 0; - + // Instance _crateCount = 0; _showCrateTimer = 0; @@ -111,7 +111,7 @@ class instance_culling_of_stratholme : public InstanceMapScript if (!instance->IsHeroic() || !_guardianTimer) return; DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN_SHOW, data); - DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN, uint32(_guardianTimer / (MINUTE*IN_MILLISECONDS))); + DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN, uint32(_guardianTimer / (MINUTE * IN_MILLISECONDS))); if (data == 0) { _guardianTimer = 0; @@ -125,7 +125,7 @@ class instance_culling_of_stratholme : public InstanceMapScript if (instance->IsHeroic()) { DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN_SHOW, true); - _guardianTimer = 26*MINUTE*IN_MILLISECONDS; + _guardianTimer = 26 * MINUTE * IN_MILLISECONDS; if (!_infiniteGUID) instance->SummonCreature(NPC_INFINITE, EventPos[EVENT_SRC_CORRUPTOR]); } @@ -134,7 +134,7 @@ class instance_culling_of_stratholme : public InstanceMapScript _crateCount++; if (_crateCount == 5) { - Map::PlayerList const &PlayerList = instance->GetPlayers(); + Map::PlayerList const& PlayerList = instance->GetPlayers(); if (!PlayerList.isEmpty()) for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) i->GetSource()->KilledMonsterCredit(NPC_GRAIN_CREATE_TRIGGER, 0); @@ -151,19 +151,19 @@ class instance_culling_of_stratholme : public InstanceMapScript _encounterState = data; if (data == COS_PROGRESS_START_INTRO) { - if (Creature *arthas = instance->GetCreature(_arthasGUID)) + if (Creature* arthas = instance->GetCreature(_arthasGUID)) arthas->AI()->DoAction(ACTION_START_EVENT); } else if (data == COS_PROGRESS_KILLED_SALRAMM) { - if (Creature *arthas = instance->GetCreature(_arthasGUID)) + if (Creature* arthas = instance->GetCreature(_arthasGUID)) arthas->AI()->DoAction(ACTION_KILLED_SALRAMM); } break; case DATA_ARTHAS_REPOSITION: if (data == 2) _respawnAndReposition = true; - else if (Creature *arthas = instance->GetCreature(_arthasGUID)) + else if (Creature* arthas = instance->GetCreature(_arthasGUID)) Reposition(arthas); return; @@ -213,7 +213,7 @@ class instance_culling_of_stratholme : public InstanceMapScript // Used when arthas dies if (_respawnAndReposition) { - if (Creature *arthas = instance->GetCreature(_arthasGUID)) + if (Creature* arthas = instance->GetCreature(_arthasGUID)) { if (!arthas->IsAlive()) { @@ -243,10 +243,10 @@ class instance_culling_of_stratholme : public InstanceMapScript // Used to display how much time players have if (_guardianTimer) { - uint32 div = uint32(_guardianTimer / (MINUTE*IN_MILLISECONDS)); + uint32 div = uint32(_guardianTimer / (MINUTE * IN_MILLISECONDS)); _guardianTimer -= diff; - uint32 divAfter = uint32(_guardianTimer / (MINUTE*IN_MILLISECONDS)); - + uint32 divAfter = uint32(_guardianTimer / (MINUTE * IN_MILLISECONDS)); + if (divAfter == 0) { _guardianTimer = 0; @@ -280,7 +280,7 @@ class instance_culling_of_stratholme : public InstanceMapScript instance->SummonCreature(NPC_HOURGLASS, EventPos[EVENT_POS_HOURGLASS]); if (_encounterState == COS_PROGRESS_CRATES_FOUND || - _encounterState == COS_PROGRESS_START_INTRO) + _encounterState == COS_PROGRESS_START_INTRO) { ChromieWhisper(0); @@ -362,7 +362,7 @@ class instance_culling_of_stratholme : public InstanceMapScript OUT_SAVE_INST_DATA; std::ostringstream saveStream; - saveStream << "C S " << _encounterState << ' ' << _guardianTimer; + saveStream << "C S " << _encounterState << ' ' << _guardianTimer; OUT_SAVE_INST_DATA_COMPLETE; return saveStream.str(); @@ -398,21 +398,21 @@ class instance_culling_of_stratholme : public InstanceMapScript OUT_LOAD_INST_DATA_COMPLETE; } - private: - // NPCs - uint64 _arthasGUID; - uint64 _infiniteGUID; + private: + // NPCs + uint64 _arthasGUID; + uint64 _infiniteGUID; - // GOs - uint64 _shkafGateGUID; - uint64 _exitGateGUID; - uint32 _encounterState; - uint32 _crateCount; - uint32 _showCrateTimer; - uint32 _guardianTimer; + // GOs + uint64 _shkafGateGUID; + uint64 _exitGateGUID; + uint32 _encounterState; + uint32 _crateCount; + uint32 _showCrateTimer; + uint32 _guardianTimer; - bool _respawnAndReposition; - uint32 _loadTimer; + bool _respawnAndReposition; + uint32 _loadTimer; }; }; 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 227291ed3..50d3e71f4 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp @@ -69,7 +69,7 @@ public: summons.Summon(summon); if (Creature* thrall = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetData64(DATA_THRALL_GUID))) thrall->AI()->JustSummoned(summon); - summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); + summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); if (summon->GetEntry() == NPC_SKARLOC_MOUNT) return; @@ -82,15 +82,15 @@ public: void InitializeAI() { - ScriptedAI::InitializeAI(); + ScriptedAI::InitializeAI(); Movement::PointsArray path; path.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ())); - for (uint8 i = 0; i < WAYPOINTS_COUNT; ++i) + for (uint8 i = 0; i < WAYPOINTS_COUNT; ++i) path.push_back(G3D::Vector3(startPath[i].GetPositionX(), startPath[i].GetPositionY(), startPath[i].GetPositionZ())); me->GetMotionMaster()->MoveSplinePath(&path); - 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->Mount(SKARLOC_MOUNT_MODEL); } @@ -155,13 +155,13 @@ public: Talk(SAY_ENTER); break; case EVENT_START_FIGHT: - 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->SetInCombatWithZone(); for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr)) if (summon->GetEntry() != NPC_SKARLOC_MOUNT) { - summon->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); + summon->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); summon->SetInCombatWithZone(); } break; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_lieutenant_drake.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_lieutenant_drake.cpp index 509249bc7..d5bde3a9a 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_lieutenant_drake.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_lieutenant_drake.cpp @@ -146,9 +146,9 @@ public: DoMeleeAttackIfReady(); } - private: - EventMap events; - Movement::PointsArray pathPoints; + private: + EventMap events; + Movement::PointsArray pathPoints; }; }; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/instance_old_hillsbrad.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/instance_old_hillsbrad.cpp index b3c93efdb..4cb91c7cf 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/instance_old_hillsbrad.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/instance_old_hillsbrad.cpp @@ -8,7 +8,7 @@ #include "old_hillsbrad.h" #include "Player.h" -const Position instancePositions[INSTANCE_POSITIONS_COUNT] = +const Position instancePositions[INSTANCE_POSITIONS_COUNT] = { {2188.18f, 228.90f, 53.025f, 1.77f}, // Orcs Gather Point 1 {2103.23f, 93.55f, 53.096f, 3.78f}, // Orcs Gather Point 2 @@ -138,19 +138,19 @@ public: SaveToDB(); break; case DATA_BOMBS_PLACED: - { - if (_barrelCount >= 5 || _encounterProgress > ENCOUNTER_PROGRESS_NONE) - return; - - DoUpdateWorldState(WORLD_STATE_BARRELS_PLANTED, ++_barrelCount); - if (_barrelCount == 5) { - _events.ScheduleEvent(EVENT_INITIAL_BARRELS_FLAME, 4000); - _events.ScheduleEvent(EVENT_FINAL_BARRELS_FLAME, 12000); - _events.ScheduleEvent(EVENT_SUMMON_LIEUTENANT, 18000); + if (_barrelCount >= 5 || _encounterProgress > ENCOUNTER_PROGRESS_NONE) + return; + + DoUpdateWorldState(WORLD_STATE_BARRELS_PLANTED, ++_barrelCount); + if (_barrelCount == 5) + { + _events.ScheduleEvent(EVENT_INITIAL_BARRELS_FLAME, 4000); + _events.ScheduleEvent(EVENT_FINAL_BARRELS_FLAME, 12000); + _events.ScheduleEvent(EVENT_SUMMON_LIEUTENANT, 18000); + } + break; } - break; - } case DATA_THRALL_ADD_FLAG: if (Creature* thrall = instance->GetCreature(_thrallGUID)) thrall->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); @@ -182,87 +182,87 @@ public: switch (_events.ExecuteEvent()) { case EVENT_INITIAL_BARRELS_FLAME: - { - instance->LoadGrid(instancePositions[0].GetPositionX(), instancePositions[0].GetPositionY()); - instance->LoadGrid(instancePositions[1].GetPositionX(), instancePositions[1].GetPositionY()); + { + instance->LoadGrid(instancePositions[0].GetPositionX(), instancePositions[0].GetPositionY()); + instance->LoadGrid(instancePositions[1].GetPositionX(), instancePositions[1].GetPositionY()); - for (std::set::const_iterator itr = _prisonersSet.begin(); itr != _prisonersSet.end(); ++itr) - if (Creature* orc = instance->GetCreature(*itr)) - { - uint8 index = orc->GetDistance(instancePositions[0]) < 80.0f ? 0 : 1; - Position pos(instancePositions[index]); - orc->MovePosition(pos, frand(1.0f, 3.0f) + 15.0f * (float)rand_norm(), (float)rand_norm() * static_cast(2 * M_PI)); - orc->GetMotionMaster()->MovePoint(1, pos); - orc->SetStandState(UNIT_STAND_STATE_STAND); - } + for (std::set::const_iterator itr = _prisonersSet.begin(); itr != _prisonersSet.end(); ++itr) + if (Creature* orc = instance->GetCreature(*itr)) + { + uint8 index = orc->GetDistance(instancePositions[0]) < 80.0f ? 0 : 1; + Position pos(instancePositions[index]); + orc->MovePosition(pos, frand(1.0f, 3.0f) + 15.0f * (float)rand_norm(), (float)rand_norm() * static_cast(2 * M_PI)); + orc->GetMotionMaster()->MovePoint(1, pos); + orc->SetStandState(UNIT_STAND_STATE_STAND); + } - for (std::set::const_iterator itr = _initalFlamesSet.begin(); itr != _initalFlamesSet.end(); ++itr) - if (GameObject* gobject = instance->GetGameObject(*itr)) - { - gobject->SetRespawnTime(0); - gobject->UpdateObjectVisibility(true); - } - break; - } + for (std::set::const_iterator itr = _initalFlamesSet.begin(); itr != _initalFlamesSet.end(); ++itr) + if (GameObject* gobject = instance->GetGameObject(*itr)) + { + gobject->SetRespawnTime(0); + gobject->UpdateObjectVisibility(true); + } + break; + } case EVENT_FINAL_BARRELS_FLAME: - { - instance->LoadGrid(instancePositions[0].GetPositionX(), instancePositions[0].GetPositionY()); - instance->LoadGrid(instancePositions[1].GetPositionX(), instancePositions[1].GetPositionY()); - - if (_encounterProgress == ENCOUNTER_PROGRESS_NONE) { - Map::PlayerList const& players = instance->GetPlayers(); - if (!players.isEmpty()) - for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) - if (Player* player = itr->GetSource()) - player->KilledMonsterCredit(NPC_LODGE_QUEST_TRIGGER, 0); - } + instance->LoadGrid(instancePositions[0].GetPositionX(), instancePositions[0].GetPositionY()); + instance->LoadGrid(instancePositions[1].GetPositionX(), instancePositions[1].GetPositionY()); - for (std::set::const_iterator itr = _finalFlamesSet.begin(); itr != _finalFlamesSet.end(); ++itr) - if (GameObject* gobject = instance->GetGameObject(*itr)) + if (_encounterProgress == ENCOUNTER_PROGRESS_NONE) { - gobject->SetRespawnTime(0); - gobject->UpdateObjectVisibility(true); + Map::PlayerList const& players = instance->GetPlayers(); + if (!players.isEmpty()) + for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + if (Player* player = itr->GetSource()) + player->KilledMonsterCredit(NPC_LODGE_QUEST_TRIGGER, 0); } - for (std::set::const_iterator itr = _prisonersSet.begin(); itr != _prisonersSet.end(); ++itr) - if (Creature* orc = instance->GetCreature(*itr)) - if (roll_chance_i(25)) - orc->HandleEmoteCommand(EMOTE_ONESHOT_CHEER); - - SetData(DATA_ESCORT_PROGRESS, ENCOUNTER_PROGRESS_BARRELS); - DoUpdateWorldState(WORLD_STATE_BARRELS_PLANTED, 0); - break; - } + for (std::set::const_iterator itr = _finalFlamesSet.begin(); itr != _finalFlamesSet.end(); ++itr) + if (GameObject* gobject = instance->GetGameObject(*itr)) + { + gobject->SetRespawnTime(0); + gobject->UpdateObjectVisibility(true); + } + + for (std::set::const_iterator itr = _prisonersSet.begin(); itr != _prisonersSet.end(); ++itr) + if (Creature* orc = instance->GetCreature(*itr)) + if (roll_chance_i(25)) + orc->HandleEmoteCommand(EMOTE_ONESHOT_CHEER); + + SetData(DATA_ESCORT_PROGRESS, ENCOUNTER_PROGRESS_BARRELS); + DoUpdateWorldState(WORLD_STATE_BARRELS_PLANTED, 0); + break; + } case EVENT_SUMMON_LIEUTENANT: - { - instance->LoadGrid(instancePositions[2].GetPositionX(), instancePositions[2].GetPositionY()); - if (Creature* drake = instance->SummonCreature(NPC_LIEUTENANT_DRAKE, instancePositions[2])) { - drake->AI()->Talk(0); - } - [[fallthrough]]; // TODO: Not sure whether the fallthrough was a mistake (forgetting a break) or intended. This should be double-checked. - } - case EVENT_THRALL_REPOSITION: - { - if (Creature* thrall = instance->GetCreature(_thrallGUID)) - { - if (!thrall->IsAlive()) + instance->LoadGrid(instancePositions[2].GetPositionX(), instancePositions[2].GetPositionY()); + if (Creature* drake = instance->SummonCreature(NPC_LIEUTENANT_DRAKE, instancePositions[2])) { - ++_attemptsCount; - EnsureGridLoaded(); - thrall->SetVisible(false); - Reposition(thrall); - thrall->setDeathState(DEAD); - thrall->Respawn(); - thrall->SetVisible(true); - SaveToDB(); + drake->AI()->Talk(0); } - else - thrall->AI()->Reset(); + [[fallthrough]]; // TODO: Not sure whether the fallthrough was a mistake (forgetting a break) or intended. This should be double-checked. + } + case EVENT_THRALL_REPOSITION: + { + if (Creature* thrall = instance->GetCreature(_thrallGUID)) + { + if (!thrall->IsAlive()) + { + ++_attemptsCount; + EnsureGridLoaded(); + thrall->SetVisible(false); + Reposition(thrall); + thrall->setDeathState(DEAD); + thrall->Respawn(); + thrall->SetVisible(true); + SaveToDB(); + } + else + thrall->AI()->Reset(); + } + break; } - break; - } } } @@ -293,7 +293,7 @@ public: OUT_SAVE_INST_DATA; std::ostringstream saveStream; - saveStream << "O H " << _encounterProgress << ' ' << _attemptsCount; + saveStream << "O H " << _encounterProgress << ' ' << _attemptsCount; OUT_SAVE_INST_DATA_COMPLETE; return saveStream.str(); @@ -326,18 +326,18 @@ public: OUT_LOAD_INST_DATA_COMPLETE; } - private: - uint32 _encounterProgress; - uint32 _barrelCount; - uint32 _attemptsCount; + private: + uint32 _encounterProgress; + uint32 _barrelCount; + uint32 _attemptsCount; - uint64 _thrallGUID; - uint64 _tarethaGUID; - std::set _initalFlamesSet; - std::set _finalFlamesSet; - std::set _prisonersSet; + uint64 _thrallGUID; + uint64 _tarethaGUID; + std::set _initalFlamesSet; + std::set _finalFlamesSet; + std::set _prisonersSet; - EventMap _events; + EventMap _events; }; }; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp index 3c55cb238..8472d1131 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp @@ -1,5 +1,5 @@ - /* - * Originally written by Xinef - Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license: https://github.com/azerothcore/azerothcore-wotlk/blob/master/LICENSE-AGPL3 +/* +* Originally written by Xinef - Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license: https://github.com/azerothcore/azerothcore-wotlk/blob/master/LICENSE-AGPL3 */ #include "ScriptMgr.h" @@ -217,7 +217,7 @@ public: CloseGossipMenuFor(player); creature->AI()->DoAction(instance->GetData(DATA_ESCORT_PROGRESS)); - creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP|UNIT_NPC_FLAG_QUESTGIVER); + creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); return true; } @@ -456,7 +456,7 @@ public: combatEvents.Reset(); summons.DespawnAll(); - me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP|UNIT_NPC_FLAG_QUESTGIVER); + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); instance->SetData(DATA_THRALL_REPOSITION, 1); uint32 data = instance->GetData(DATA_ESCORT_PROGRESS); @@ -541,7 +541,7 @@ public: me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, THRALL_WEAPON_ITEM); break; case EVENT_DRESSING_SHIELD: - me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, THRALL_SHIELD_ITEM); + me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, THRALL_SHIELD_ITEM); break; case EVENT_DRESSING_TALK: instance->SetData(DATA_ESCORT_PROGRESS, ENCOUNTER_PROGRESS_THRALL_ARMORED); @@ -608,7 +608,7 @@ public: case EVENT_SUMMON_CHRONO: if (Creature* epoch = me->SummonCreature(NPC_EPOCH_HUNTER, 2640.49f, 696.15f, 64.31f, 4.51f, TEMPSUMMON_MANUAL_DESPAWN)) { - epoch->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); + epoch->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); epoch->AI()->Talk(SAY_EPOCH_ENTER1); } break; @@ -691,21 +691,21 @@ public: case EVENT_CALL_EPOCH: if (Creature* epoch = summons.GetCreatureWithEntry(NPC_EPOCH_HUNTER)) { - epoch->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); + epoch->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); epoch->GetMotionMaster()->MovePoint(0, *me, false, true); } break; case EVENT_THRALL_FACE_TARETHA: - { - Map::PlayerList const& players = me->GetMap()->GetPlayers(); - if (!players.isEmpty()) - for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) - if (Player* player = itr->GetSource()) - player->KilledMonsterCredit(20156, 0); + { + Map::PlayerList const& players = me->GetMap()->GetPlayers(); + if (!players.isEmpty()) + for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + if (Player* player = itr->GetSource()) + player->KilledMonsterCredit(20156, 0); - me->SetFacingTo(5.76f); - break; - } + me->SetFacingTo(5.76f); + break; + } case EVENT_THRALL_TALK_4: Talk(SAY_GREET_TARETHA); break; @@ -747,7 +747,7 @@ public: Talk(SAY_EVENT_COMPLETE); break; case EVENT_THRALL_RUN_AWAY: - 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); SetEscortPaused(false); break; @@ -796,19 +796,19 @@ public: SetEscortPaused(true); SetDespawnAtEnd(false); - me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP|UNIT_NPC_FLAG_QUESTGIVER); + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); if (data < ENCOUNTER_PROGRESS_THRALL_ARMORED) { me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 0); - me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 0); + me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, 0); me->SetDisplayId(THRALL_MODEL_UNEQUIPPED); } else { me->SetDisplayId(THRALL_MODEL_EQUIPPED); me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, THRALL_WEAPON_ITEM); - me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, THRALL_SHIELD_ITEM); + me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, THRALL_SHIELD_ITEM); } switch (data) @@ -834,13 +834,13 @@ public: } } - private: - InstanceScript* instance; - EventMap events; - EventMap combatEvents; - SummonList summons; + private: + InstanceScript* instance; + EventMap events; + EventMap combatEvents; + SummonList summons; - bool _mounted; + bool _mounted; }; }; @@ -895,7 +895,7 @@ public: me->CastSpell(me, SPELL_SHADOW_PRISON, true); } - void AttackStart(Unit*) override { } + void AttackStart(Unit*) override { } void MoveInLineOfSight(Unit*) override { } }; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp index 091d6656d..09daf65a1 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp @@ -65,7 +65,7 @@ public: if (Unit* medivh = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_MEDIVH))) { - me->SetHomePosition(medivh->GetPositionX() + 14.0f*cos(medivh->GetAngle(me)), medivh->GetPositionY() + 14.0f*sin(medivh->GetAngle(me)), medivh->GetPositionZ(), me->GetAngle(medivh)); + me->SetHomePosition(medivh->GetPositionX() + 14.0f * cos(medivh->GetAngle(me)), medivh->GetPositionY() + 14.0f * sin(medivh->GetAngle(me)), medivh->GetPositionZ(), me->GetAngle(medivh)); me->GetMotionMaster()->MoveTargetedHome(); } } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp index 4614f6797..9131c737f 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp @@ -11,7 +11,7 @@ #include "ScriptedCreature.h" -const Position PortalLocation[4]= +const Position PortalLocation[4] = { {-2041.06f, 7042.08f, 29.99f, 1.30f}, {-1968.18f, 7042.11f, 21.93f, 2.12f}, @@ -138,26 +138,26 @@ public: switch (type) { case TYPE_AEONUS: - { - encounters[type] = DONE; - SaveToDB(); + { + encounters[type] = DONE; + SaveToDB(); - if (Creature* medivh = instance->GetCreature(_medivhGUID)) - medivh->AI()->DoAction(ACTION_OUTRO); + if (Creature* medivh = instance->GetCreature(_medivhGUID)) + medivh->AI()->DoAction(ACTION_OUTRO); - Map::PlayerList const& players = instance->GetPlayers(); - if (!players.isEmpty()) - for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) - if (Player* player = itr->GetSource()) - { - if (player->GetQuestStatus(QUEST_OPENING_PORTAL) == QUEST_STATUS_INCOMPLETE) - player->AreaExploredOrEventHappens(QUEST_OPENING_PORTAL); + Map::PlayerList const& players = instance->GetPlayers(); + if (!players.isEmpty()) + for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + if (Player* player = itr->GetSource()) + { + if (player->GetQuestStatus(QUEST_OPENING_PORTAL) == QUEST_STATUS_INCOMPLETE) + player->AreaExploredOrEventHappens(QUEST_OPENING_PORTAL); - if (player->GetQuestStatus(QUEST_MASTER_TOUCH) == QUEST_STATUS_INCOMPLETE) - player->AreaExploredOrEventHappens(QUEST_MASTER_TOUCH); - } - break; - } + if (player->GetQuestStatus(QUEST_MASTER_TOUCH) == QUEST_STATUS_INCOMPLETE) + player->AreaExploredOrEventHappens(QUEST_MASTER_TOUCH); + } + break; + } case TYPE_CHRONO_LORD_DEJA: case TYPE_TEMPORUS: encounters[type] = DONE; @@ -243,19 +243,27 @@ public: int32 entry = 0; switch (_currentRift) { - case 6: entry = GetData(TYPE_CHRONO_LORD_DEJA) == DONE ? (instance->IsHeroic() ? NPC_INFINITE_CHRONO_LORD : -NPC_CHRONO_LORD_DEJA) : NPC_CHRONO_LORD_DEJA; break; - case 12: entry = GetData(TYPE_TEMPORUS) == DONE ? (instance->IsHeroic() ? NPC_INFINITE_TIMEREAVER : -NPC_TEMPORUS) : NPC_TEMPORUS; break; - case 18: entry = NPC_AEONUS; break; - default: entry = RAND(NPC_RIFT_KEEPER_WARLOCK, NPC_RIFT_KEEPER_MAGE, NPC_RIFT_LORD, NPC_RIFT_LORD_2); break; + case 6: + entry = GetData(TYPE_CHRONO_LORD_DEJA) == DONE ? (instance->IsHeroic() ? NPC_INFINITE_CHRONO_LORD : -NPC_CHRONO_LORD_DEJA) : NPC_CHRONO_LORD_DEJA; + break; + case 12: + entry = GetData(TYPE_TEMPORUS) == DONE ? (instance->IsHeroic() ? NPC_INFINITE_TIMEREAVER : -NPC_TEMPORUS) : NPC_TEMPORUS; + break; + case 18: + entry = NPC_AEONUS; + break; + default: + entry = RAND(NPC_RIFT_KEEPER_WARLOCK, NPC_RIFT_KEEPER_MAGE, NPC_RIFT_LORD, NPC_RIFT_LORD_2); + break; } Position pos; - rift->GetNearPosition(pos, 10.0f, 2*M_PI*rand_norm()); + rift->GetNearPosition(pos, 10.0f, 2 * M_PI * rand_norm()); if (TempSummon* summon = instance->SummonCreature(abs(entry), pos)) { summon->SetTempSummonType(TEMPSUMMON_CORPSE_TIMED_DESPAWN); - summon->SetTimer(3*MINUTE*IN_MILLISECONDS); + summon->SetTimer(3 * MINUTE * IN_MILLISECONDS); if (entry < 0) summon->SetLootMode(0); @@ -283,7 +291,7 @@ public: if (instance->GetCreature(_medivhGUID)) { - uint8 position = (_currentRift-1)%4; + uint8 position = (_currentRift - 1) % 4; instance->SummonCreature(NPC_TIME_RIFT, PortalLocation[position]); } break; @@ -329,8 +337,8 @@ public: OUT_LOAD_INST_DATA_COMPLETE; } - protected: - EventMap Events; + protected: + EventMap Events; }; }; 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 5fb2999bb..200db93f5 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp @@ -95,12 +95,12 @@ public: groundArray.push_back(G3D::Vector3(creature->GetPositionX() + 8.0f, creature->GetPositionY(), creature->GetPositionZ())); airArray.push_back(G3D::Vector3(creature->GetPositionX(), creature->GetPositionY(), creature->GetPositionZ())); for (uint8 i = 0; i < 10; ++i) - groundArray.push_back(G3D::Vector3(creature->GetPositionX() + 8.0f*cos(2.0f*M_PI*i/10.0f), creature->GetPositionY() + 8.0f*sin(2.0f*M_PI*i/10.0f), creature->GetPositionZ())); + groundArray.push_back(G3D::Vector3(creature->GetPositionX() + 8.0f * cos(2.0f * M_PI * i / 10.0f), creature->GetPositionY() + 8.0f * sin(2.0f * M_PI * i / 10.0f), creature->GetPositionZ())); for (uint8 i = 0; i < 40; ++i) - airArray.push_back(G3D::Vector3(creature->GetPositionX() + i*0.25f*cos(2.0f*M_PI*i/10.0f), creature->GetPositionY() + i*0.25f*sin(2.0f*M_PI*i/10.0f), creature->GetPositionZ() + i/4.0f)); + airArray.push_back(G3D::Vector3(creature->GetPositionX() + i * 0.25f * cos(2.0f * M_PI * i / 10.0f), creature->GetPositionY() + i * 0.25f * sin(2.0f * M_PI * i / 10.0f), creature->GetPositionZ() + i / 4.0f)); for (uint8 i = 40; i < 80; ++i) - airArray.push_back(G3D::Vector3(creature->GetPositionX() + 10.0f*cos(2.0f*M_PI*i/10.0f), creature->GetPositionY() + 10.0f*sin(2.0f*M_PI*i/10.0f), creature->GetPositionZ() + i/4.0f)); + airArray.push_back(G3D::Vector3(creature->GetPositionX() + 10.0f * cos(2.0f * M_PI * i / 10.0f), creature->GetPositionY() + 10.0f * sin(2.0f * M_PI * i / 10.0f), creature->GetPositionZ() + i / 4.0f)); } InstanceScript* instance; @@ -196,9 +196,9 @@ public: case EVENT_CHECK_HEALTH_25: case EVENT_CHECK_HEALTH_50: case EVENT_CHECK_HEALTH_75: - if (instance && instance->GetData(DATA_SHIELD_PERCENT) <= eventId*25) + if (instance && instance->GetData(DATA_SHIELD_PERCENT) <= eventId * 25) { - Talk(eventId-1); + Talk(eventId - 1); break; } events.ScheduleEvent(eventId, 500); @@ -247,7 +247,7 @@ public: } break; - + } } @@ -256,11 +256,11 @@ public: { for (uint8 i = 0; i < 6; ++i) { - if (Creature* cr = me->SummonCreature(NPC_SHADOW_COUNCIL_ENFORCER, -2091.731f, 7133.083f - 3.0f*i, 34.589f, 0.0f)) + if (Creature* cr = me->SummonCreature(NPC_SHADOW_COUNCIL_ENFORCER, -2091.731f, 7133.083f - 3.0f * i, 34.589f, 0.0f)) { - cr->GetMotionMaster()->MovePoint(0, (first && i == 3) ? x+2.0f : x, cr->GetPositionY()+y, cr->GetMap()->GetHeight(x, cr->GetPositionY()+y, MAX_HEIGHT, true)); - cr->m_Events.AddEvent(new NpcRunToHome(*cr), cr->m_Events.CalculateTime(homeTime+urand(0, 2000))); - cr->DespawnOrUnsummon(duration+urand(0, 2000)); + cr->GetMotionMaster()->MovePoint(0, (first && i == 3) ? x + 2.0f : x, cr->GetPositionY() + y, cr->GetMap()->GetHeight(x, cr->GetPositionY() + y, MAX_HEIGHT, true)); + cr->m_Events.AddEvent(new NpcRunToHome(*cr), cr->m_Events.CalculateTime(homeTime + urand(0, 2000))); + cr->DespawnOrUnsummon(duration + urand(0, 2000)); } } } @@ -316,14 +316,15 @@ public: void DoSummonAtRift(uint32 entry) { Position pos; - me->GetNearPosition(pos, 10.0f, 2*M_PI*rand_norm()); + me->GetNearPosition(pos, 10.0f, 2 * M_PI * rand_norm()); if (Creature* summon = me->SummonCreature(entry, pos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 150000)) - if (instance) { + if (instance) + { if (Unit* medivh = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_MEDIVH))) { float o = medivh->GetAngle(summon) + frand(-1.0f, 1.0f); - summon->SetHomePosition(medivh->GetPositionX() + 14.0f*cos(o), medivh->GetPositionY() + 14.0f*sin(o), medivh->GetPositionZ(), summon->GetAngle(medivh)); + summon->SetHomePosition(medivh->GetPositionX() + 14.0f * cos(o), medivh->GetPositionY() + 14.0f * sin(o), medivh->GetPositionZ(), summon->GetAngle(medivh)); summon->GetMotionMaster()->MoveTargetedHome(); summon->SetReactState(REACT_DEFENSIVE); } @@ -376,29 +377,29 @@ public: class spell_black_morass_corrupt_medivh : public SpellScriptLoader { - public: - spell_black_morass_corrupt_medivh() : SpellScriptLoader("spell_black_morass_corrupt_medivh") { } +public: + spell_black_morass_corrupt_medivh() : SpellScriptLoader("spell_black_morass_corrupt_medivh") { } - class spell_black_morass_corrupt_medivh_AuraScript : public AuraScript + class spell_black_morass_corrupt_medivh_AuraScript : public AuraScript + { + PrepareAuraScript(spell_black_morass_corrupt_medivh_AuraScript); + + void PeriodicTick(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_black_morass_corrupt_medivh_AuraScript); - - void PeriodicTick(AuraEffect const* /*aurEff*/) - { - if (InstanceScript* instance = GetUnitOwner()->GetInstanceScript()) - instance->SetData(DATA_DAMAGE_SHIELD, 1); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_black_morass_corrupt_medivh_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_black_morass_corrupt_medivh_AuraScript(); + if (InstanceScript* instance = GetUnitOwner()->GetInstanceScript()) + instance->SetData(DATA_DAMAGE_SHIELD, 1); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_black_morass_corrupt_medivh_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_black_morass_corrupt_medivh_AuraScript(); + } }; void AddSC_the_black_morass() diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.h b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.h index 183b8dcfc..221d79d1a 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.h +++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.h @@ -63,7 +63,7 @@ enum CreatureIds }; enum Misc -{ +{ SPELL_RIFT_CHANNEL = 31387, EVENT_NEXT_PORTAL = 1, diff --git a/src/server/scripts/Kalimdor/DireMaul/instance_dire_maul.cpp b/src/server/scripts/Kalimdor/DireMaul/instance_dire_maul.cpp index 484a3b528..677303213 100644 --- a/src/server/scripts/Kalimdor/DireMaul/instance_dire_maul.cpp +++ b/src/server/scripts/Kalimdor/DireMaul/instance_dire_maul.cpp @@ -8,46 +8,46 @@ class instance_dire_maul : public InstanceMapScript { - public: - instance_dire_maul() : InstanceMapScript("instance_dire_maul", 429) { } +public: + instance_dire_maul() : InstanceMapScript("instance_dire_maul", 429) { } - struct instance_dire_maul_InstanceMapScript : public InstanceScript + struct instance_dire_maul_InstanceMapScript : public InstanceScript + { + instance_dire_maul_InstanceMapScript(Map* map) : InstanceScript(map) { } + + void Initialize() { - instance_dire_maul_InstanceMapScript(Map* map) : InstanceScript(map) { } + _eastWingProgress = 0; + _westWingProgress = 0; + _pylonsState = 0; + _northWingProgress = 0; + _northWingBosses = 0; + _immoltharGUID = 0; + } - void Initialize() + void OnCreatureCreate(Creature* creature) + { + switch (creature->GetEntry()) { - _eastWingProgress = 0; - _westWingProgress = 0; - _pylonsState = 0; - _northWingProgress = 0; - _northWingBosses = 0; - _immoltharGUID = 0; + case NPC_IMMOL_THAR: + _immoltharGUID = creature->GetGUID(); + break; + case NPC_HIGHBORNE_SUMMONER: + if (_pylonsState == ALL_PYLONS_OFF) + creature->DespawnOrUnsummon(5000); + break; } + } - void OnCreatureCreate(Creature* creature) + void OnGameObjectCreate(GameObject* gameobject) + { + switch (gameobject->GetEntry()) { - switch (creature->GetEntry()) - { - case NPC_IMMOL_THAR: - _immoltharGUID = creature->GetGUID(); - break; - case NPC_HIGHBORNE_SUMMONER: - if (_pylonsState == ALL_PYLONS_OFF) - creature->DespawnOrUnsummon(5000); - break; - } - } - - void OnGameObjectCreate(GameObject* gameobject) - { - switch (gameobject->GetEntry()) - { - case GO_DIRE_MAUL_FORCE_FIELD: - if (_pylonsState == ALL_PYLONS_OFF) - gameobject->SetGoState(GO_STATE_ACTIVE); - break; - case GO_GORDOK_TRIBUTE: + case GO_DIRE_MAUL_FORCE_FIELD: + if (_pylonsState == ALL_PYLONS_OFF) + gameobject->SetGoState(GO_STATE_ACTIVE); + break; + case GO_GORDOK_TRIBUTE: { uint32 fullLootMode = 0x3F; for (uint32 i = 0; i < _northWingBosses; ++i) @@ -56,98 +56,98 @@ class instance_dire_maul : public InstanceMapScript gameobject->SetLootMode(fullLootMode); break; } - } } - - void SetData(uint32 type, uint32 data) - { - switch (type) - { - case TYPE_EAST_WING_PROGRESS: - _eastWingProgress = data; - instance->LoadGrid(-56.59f, -269.12f); - break; - case TYPE_WEST_WING_PROGRESS: - _westWingProgress = data; - instance->LoadGrid(132.626f, 625.913f); - break; - case TYPE_NORTH_WING_PROGRESS: - _northWingProgress = data; - break; - case TYPE_NORTH_WING_BOSSES: - _northWingBosses |= (1 << _northWingBosses); - break; - case TYPE_PYLONS_STATE: - if (_pylonsState & data) - return; - _pylonsState |= data; - if (_pylonsState == ALL_PYLONS_OFF) // all five active, 31 - { - instance->LoadGrid(-38.08f, 812.44f); - if (Creature* immol = instance->GetCreature(_immoltharGUID)) - { - immol->setActive(true); - immol->GetAI()->SetData(1, 1); - } - } - break; - - } - - SaveToDB(); - } - - uint32 GetData(uint32 type) const - { - if (type == TYPE_EAST_WING_PROGRESS) - return _eastWingProgress; - else if (type == TYPE_WEST_WING_PROGRESS) - return _westWingProgress; - else if (type == TYPE_NORTH_WING_PROGRESS) - return _northWingProgress; - - return 0; - } - - std::string GetSaveData() - { - std::ostringstream saveStream; - saveStream << "D M " << _eastWingProgress << ' ' << _westWingProgress << ' ' << _pylonsState << ' ' << _northWingProgress << ' ' << _northWingBosses; - return saveStream.str(); - } - - void Load(const char* in) - { - if (!in) - return; - - char dataHead1, dataHead2; - std::istringstream loadStream(in); - loadStream >> dataHead1 >> dataHead2; - if (dataHead1 == 'D' && dataHead2 == 'M') - { - loadStream >> _eastWingProgress; - loadStream >> _westWingProgress; - loadStream >> _pylonsState; - loadStream >> _northWingProgress; - loadStream >> _northWingBosses; - } - } - - private: - uint32 _eastWingProgress; - uint32 _westWingProgress; - uint32 _pylonsState; - uint32 _northWingProgress; - uint32 _northWingBosses; - - uint64 _immoltharGUID; - }; - - InstanceScript* GetInstanceScript(InstanceMap* map) const - { - return new instance_dire_maul_InstanceMapScript(map); } + + void SetData(uint32 type, uint32 data) + { + switch (type) + { + case TYPE_EAST_WING_PROGRESS: + _eastWingProgress = data; + instance->LoadGrid(-56.59f, -269.12f); + break; + case TYPE_WEST_WING_PROGRESS: + _westWingProgress = data; + instance->LoadGrid(132.626f, 625.913f); + break; + case TYPE_NORTH_WING_PROGRESS: + _northWingProgress = data; + break; + case TYPE_NORTH_WING_BOSSES: + _northWingBosses |= (1 << _northWingBosses); + break; + case TYPE_PYLONS_STATE: + if (_pylonsState & data) + return; + _pylonsState |= data; + if (_pylonsState == ALL_PYLONS_OFF) // all five active, 31 + { + instance->LoadGrid(-38.08f, 812.44f); + if (Creature* immol = instance->GetCreature(_immoltharGUID)) + { + immol->setActive(true); + immol->GetAI()->SetData(1, 1); + } + } + break; + + } + + SaveToDB(); + } + + uint32 GetData(uint32 type) const + { + if (type == TYPE_EAST_WING_PROGRESS) + return _eastWingProgress; + else if (type == TYPE_WEST_WING_PROGRESS) + return _westWingProgress; + else if (type == TYPE_NORTH_WING_PROGRESS) + return _northWingProgress; + + return 0; + } + + std::string GetSaveData() + { + std::ostringstream saveStream; + saveStream << "D M " << _eastWingProgress << ' ' << _westWingProgress << ' ' << _pylonsState << ' ' << _northWingProgress << ' ' << _northWingBosses; + return saveStream.str(); + } + + void Load(const char* in) + { + if (!in) + return; + + char dataHead1, dataHead2; + std::istringstream loadStream(in); + loadStream >> dataHead1 >> dataHead2; + if (dataHead1 == 'D' && dataHead2 == 'M') + { + loadStream >> _eastWingProgress; + loadStream >> _westWingProgress; + loadStream >> _pylonsState; + loadStream >> _northWingProgress; + loadStream >> _northWingBosses; + } + } + + private: + uint32 _eastWingProgress; + uint32 _westWingProgress; + uint32 _pylonsState; + uint32 _northWingProgress; + uint32 _northWingBosses; + + uint64 _immoltharGUID; + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_dire_maul_InstanceMapScript(map); + } }; void AddSC_instance_dire_maul() diff --git a/src/server/scripts/Kalimdor/Maraudon/instance_maraudon.cpp b/src/server/scripts/Kalimdor/Maraudon/instance_maraudon.cpp index 0b97a1f34..ce618a768 100644 --- a/src/server/scripts/Kalimdor/Maraudon/instance_maraudon.cpp +++ b/src/server/scripts/Kalimdor/Maraudon/instance_maraudon.cpp @@ -8,78 +8,78 @@ class instance_maraudon : public InstanceMapScript { - public: - instance_maraudon() : InstanceMapScript("instance_maraudon", 349) { } +public: + instance_maraudon() : InstanceMapScript("instance_maraudon", 349) { } - struct instance_maraudon_InstanceMapScript : public InstanceScript + struct instance_maraudon_InstanceMapScript : public InstanceScript + { + instance_maraudon_InstanceMapScript(Map* map) : InstanceScript(map) { - instance_maraudon_InstanceMapScript(Map* map) : InstanceScript(map) - { - } - - void Initialize() - { - memset(&_encounters, 0, sizeof(_encounters)); - } - - void OnGameObjectCreate(GameObject* gameobject) - { - switch (gameobject->GetEntry()) - { - case GO_CORRUPTION_SPEWER: - if (_encounters[TYPE_NOXXION] == DONE) - HandleGameObject(0, true, gameobject); - break; - } - } - - void SetData(uint32 type, uint32 data) - { - switch (type) - { - case TYPE_NOXXION: - _encounters[type] = data; - break; - } - - if (data == DONE) - SaveToDB(); - } - - std::string GetSaveData() - { - std::ostringstream saveStream; - saveStream << "M A " << _encounters[0]; - return saveStream.str(); - } - - void Load(const char* in) - { - if (!in) - return; - - char dataHead1, dataHead2; - std::istringstream loadStream(in); - loadStream >> dataHead1 >> dataHead2; - if (dataHead1 == 'M' && dataHead2 == 'A') - { - for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) - { - loadStream >> _encounters[i]; - if (_encounters[i] == IN_PROGRESS) - _encounters[i] = NOT_STARTED; - } - } - } - - private: - uint32 _encounters[MAX_ENCOUNTERS]; - }; - - InstanceScript* GetInstanceScript(InstanceMap* map) const - { - return new instance_maraudon_InstanceMapScript(map); } + + void Initialize() + { + memset(&_encounters, 0, sizeof(_encounters)); + } + + void OnGameObjectCreate(GameObject* gameobject) + { + switch (gameobject->GetEntry()) + { + case GO_CORRUPTION_SPEWER: + if (_encounters[TYPE_NOXXION] == DONE) + HandleGameObject(0, true, gameobject); + break; + } + } + + void SetData(uint32 type, uint32 data) + { + switch (type) + { + case TYPE_NOXXION: + _encounters[type] = data; + break; + } + + if (data == DONE) + SaveToDB(); + } + + std::string GetSaveData() + { + std::ostringstream saveStream; + saveStream << "M A " << _encounters[0]; + return saveStream.str(); + } + + void Load(const char* in) + { + if (!in) + return; + + char dataHead1, dataHead2; + std::istringstream loadStream(in); + loadStream >> dataHead1 >> dataHead2; + if (dataHead1 == 'M' && dataHead2 == 'A') + { + for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) + { + loadStream >> _encounters[i]; + if (_encounters[i] == IN_PROGRESS) + _encounters[i] = NOT_STARTED; + } + } + } + + private: + uint32 _encounters[MAX_ENCOUNTERS]; + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_maraudon_InstanceMapScript(map); + } }; void AddSC_instance_maraudon() diff --git a/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp b/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp index 279d0cc8e..414e7d9fd 100644 --- a/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp +++ b/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp @@ -74,13 +74,13 @@ static sOnyxMove OnyxiaMoveData[] = { {0, 0, 0, -64.496f, -214.906f, -84.4f, 0.0f}, // south ground {1, 5, SPELL_BREATH_S_TO_N, -64.496f, -214.906f, -60.0f, 0.0f}, // south - {2, 6, SPELL_BREATH_SW_TO_NE, -59.809f, -190.758f, -60.0f, 7*M_PI/4}, // south-west - {3, 7, SPELL_BREATH_W_TO_E, -29.450f, -180.600f, -60.0f, M_PI+M_PI/2}, // west - {4, 8, SPELL_BREATH_NW_TO_SE, 6.895f, -180.246f, -60.0f, M_PI+M_PI/4}, // north-west + {2, 6, SPELL_BREATH_SW_TO_NE, -59.809f, -190.758f, -60.0f, 7 * M_PI / 4}, // south-west + {3, 7, SPELL_BREATH_W_TO_E, -29.450f, -180.600f, -60.0f, M_PI + M_PI / 2}, // west + {4, 8, SPELL_BREATH_NW_TO_SE, 6.895f, -180.246f, -60.0f, M_PI + M_PI / 4}, // north-west {5, 1, SPELL_BREATH_N_TO_S, 22.876f, -217.152f, -60.0f, M_PI}, // north - {6, 2, SPELL_BREATH_NE_TO_SW, 10.2191f, -247.912f, -60.0f, 3*M_PI/4}, // north-east - {7, 3, SPELL_BREATH_E_TO_W, -31.496f, -250.123f, -60.0f, M_PI/2}, // east - {8, 4, SPELL_BREATH_SE_TO_NW, -63.5156f, -240.096f, -60.0f, M_PI/4}, // south-east + {6, 2, SPELL_BREATH_NE_TO_SW, 10.2191f, -247.912f, -60.0f, 3 * M_PI / 4}, // north-east + {7, 3, SPELL_BREATH_E_TO_W, -31.496f, -250.123f, -60.0f, M_PI / 2}, // east + {8, 4, SPELL_BREATH_SE_TO_NW, -63.5156f, -240.096f, -60.0f, M_PI / 4}, // south-east }; enum Yells @@ -168,7 +168,7 @@ public: } } - void MoveInLineOfSight(Unit *who) + void MoveInLineOfSight(Unit* who) { if( me->GetVictim() || me->GetDistance(who) > 30.0f ) return; @@ -214,16 +214,16 @@ public: m_pInstance->SetData(DATA_ONYXIA, DONE); } - void DamageTaken(Unit*, uint32 & /*damage*/, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask) { switch( Phase ) { case 1: - if( me->GetHealth()*100 / me->GetMaxHealth() <= 65 ) + if( me->GetHealth() * 100 / me->GetMaxHealth() <= 65 ) SetPhase(2); break; case 2: - if( me->GetHealth()*100 / me->GetMaxHealth() <= 40 ) + if( me->GetHealth() * 100 / me->GetMaxHealth() <= 40 ) { me->InterruptNonMeleeSpells(false); SetPhase(3); @@ -232,7 +232,7 @@ public: } } - void JustSummoned(Creature *pSummoned) + void JustSummoned(Creature* pSummoned) { if( !pSummoned ) return; @@ -261,27 +261,27 @@ public: } } else switch( id ) - { - case 10: - me->SetFacingTo(OnyxiaMoveData[0].o); - events.ScheduleEvent(EVENT_LIFTOFF, 0); - break; - case 11: - me->SetFacingTo(OnyxiaMoveData[1].o); - events.ScheduleEvent(EVENT_FLY_S_TO_N, 0); - break; - case 12: - me->SetFacingTo(OnyxiaMoveData[1].o); - events.ScheduleEvent(EVENT_LAND, 0); - break; - case 13: - me->SetCanFly(false); - me->SetDisableGravity(false); - me->SetHover(false); - me->SetSpeed(MOVE_RUN, me->GetCreatureTemplate()->speed_run, false); - events.ScheduleEvent(EVENT_PHASE_3_ATTACK, 0); - break; - } + { + case 10: + me->SetFacingTo(OnyxiaMoveData[0].o); + events.ScheduleEvent(EVENT_LIFTOFF, 0); + break; + case 11: + me->SetFacingTo(OnyxiaMoveData[1].o); + events.ScheduleEvent(EVENT_FLY_S_TO_N, 0); + break; + case 12: + me->SetFacingTo(OnyxiaMoveData[1].o); + events.ScheduleEvent(EVENT_LAND, 0); + break; + case 13: + me->SetCanFly(false); + me->SetDisableGravity(false); + me->SetHover(false); + me->SetSpeed(MOVE_RUN, me->GetCreatureTemplate()->speed_run, false); + events.ScheduleEvent(EVENT_PHASE_3_ATTACK, 0); + break; + } } void HandleWhelpSpam(const uint32 diff) @@ -293,8 +293,8 @@ public: whelpSpamTimer -= diff; if( whelpSpamTimer <= 0 ) { - float angle = rand_norm()*2*M_PI; - float dist = rand_norm()*4.0f; + float angle = rand_norm() * 2 * M_PI; + float dist = rand_norm() * 4.0f; me->CastSpell(-33.18f + cos(angle)*dist, -258.80f + sin(angle)*dist, -89.0f, 17646, true); me->CastSpell(-32.535f + cos(angle)*dist, -170.190f + sin(angle)*dist, -89.0f, 17646, true); whelpCount += 2; @@ -372,7 +372,7 @@ public: me->SetHover(true); me->SetOrientation(OnyxiaMoveData[0].o); me->SendMovementFlagUpdate(); - me->GetMotionMaster()->MoveTakeoff(11, OnyxiaMoveData[1].x+1.0f, OnyxiaMoveData[1].y, OnyxiaMoveData[1].z, 12.0f); + me->GetMotionMaster()->MoveTakeoff(11, OnyxiaMoveData[1].x + 1.0f, OnyxiaMoveData[1].y, OnyxiaMoveData[1].z, 12.0f); bManyWhelpsAvailable = true; events.PopEvent(); events.RescheduleEvent(EVENT_END_MANY_WHELPS_TIME, 10000); @@ -408,7 +408,7 @@ public: { Talk(SAY_PHASE_3_TRANS); me->SendMeleeAttackStop(me->GetVictim()); - me->GetMotionMaster()->MoveLand(13, OnyxiaMoveData[0].x+1.0f, OnyxiaMoveData[0].y, OnyxiaMoveData[0].z, 12.0f); + me->GetMotionMaster()->MoveLand(13, OnyxiaMoveData[0].x + 1.0f, OnyxiaMoveData[0].y, OnyxiaMoveData[0].z, 12.0f); events.PopEvent(); DoResetThreat(); } @@ -518,8 +518,8 @@ public: break; case EVENT_SUMMON_WHELP: { - float angle = rand_norm()*2*M_PI; - float dist = rand_norm()*4.0f; + float angle = rand_norm() * 2 * M_PI; + float dist = rand_norm() * 4.0f; me->CastSpell(-33.18f + cos(angle)*dist, -258.80f + sin(angle)*dist, -89.0f, 17646, true); me->CastSpell(-32.535f + cos(angle)*dist, -170.190f + sin(angle)*dist, -89.0f, 17646, true); events.RepeatEvent(30000); @@ -558,7 +558,7 @@ public: EventMap events; - void MoveInLineOfSight(Unit *who) + void MoveInLineOfSight(Unit* who) { if( me->GetVictim() || me->GetDistance(who) > 20.0f ) return; @@ -620,7 +620,7 @@ public: { npc_onyxia_whelpAI(Creature* pCreature) : ScriptedAI(pCreature) {} - void MoveInLineOfSight(Unit *who) + void MoveInLineOfSight(Unit* who) { if( me->GetVictim() || me->GetDistance(who) > 20.0f ) return; diff --git a/src/server/scripts/Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp b/src/server/scripts/Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp index 88c97712e..d8255981e 100644 --- a/src/server/scripts/Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp +++ b/src/server/scripts/Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp @@ -37,7 +37,7 @@ public: bool IsEncounterInProgress() const { - for( uint8 i=0; i=50; + return ManyWhelpsCounter >= 50; case ACHIEV_CRITERIA_DEEP_BREATH_10_PLAYER: case ACHIEV_CRITERIA_DEEP_BREATH_25_PLAYER: return bDeepBreath; diff --git a/src/server/scripts/Kalimdor/RagefireChasm/instance_ragefire_chasm.cpp b/src/server/scripts/Kalimdor/RagefireChasm/instance_ragefire_chasm.cpp index 4721cd992..bc28062ff 100644 --- a/src/server/scripts/Kalimdor/RagefireChasm/instance_ragefire_chasm.cpp +++ b/src/server/scripts/Kalimdor/RagefireChasm/instance_ragefire_chasm.cpp @@ -7,18 +7,18 @@ class instance_ragefire_chasm : public InstanceMapScript { - public: - instance_ragefire_chasm() : InstanceMapScript("instance_ragefire_chasm", 389) { } +public: + instance_ragefire_chasm() : InstanceMapScript("instance_ragefire_chasm", 389) { } - InstanceScript* GetInstanceScript(InstanceMap* map) const - { - return new instance_ragefire_chasm_InstanceMapScript(map); - } + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_ragefire_chasm_InstanceMapScript(map); + } - struct instance_ragefire_chasm_InstanceMapScript : public InstanceScript - { - instance_ragefire_chasm_InstanceMapScript(Map* map) : InstanceScript(map) { } - }; + struct instance_ragefire_chasm_InstanceMapScript : public InstanceScript + { + instance_ragefire_chasm_InstanceMapScript(Map* map) : InstanceScript(map) { } + }; }; void AddSC_instance_ragefire_chasm() diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp index f7e4d0b16..5c34e5712 100644 --- a/src/server/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp +++ b/src/server/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp @@ -9,86 +9,86 @@ class instance_razorfen_downs : public InstanceMapScript { - public: - instance_razorfen_downs() : InstanceMapScript("instance_razorfen_downs", 129) { } +public: + instance_razorfen_downs() : InstanceMapScript("instance_razorfen_downs", 129) { } - struct instance_razorfen_downs_InstanceMapScript : public InstanceScript + struct instance_razorfen_downs_InstanceMapScript : public InstanceScript + { + instance_razorfen_downs_InstanceMapScript(Map* map) : InstanceScript(map) { - instance_razorfen_downs_InstanceMapScript(Map* map) : InstanceScript(map) - { - } - - void Initialize() - { - _gongPhase = 0; - _firesState = 0; - } - - void OnGameObjectCreate(GameObject* gameobject) - { - switch (gameobject->GetEntry()) - { - case GO_IDOL_OVEN_FIRE: - case GO_IDOL_CUP_FIRE: - case GO_IDOL_MOUTH_FIRE: - if (_firesState == DONE) - gameobject->Delete(); - break; - case GO_GONG: - if (_gongPhase == DONE) - gameobject->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - break; - } - } - - uint32 GetData(uint32 type) const - { - if (type == GO_GONG) - return _gongPhase; - return 0; - } - - void SetData(uint32 type, uint32 data) - { - if (type == GO_GONG) - _gongPhase = data; - else if (type == GO_BELNISTRASZS_BRAZIER) - _firesState = DONE; - SaveToDB(); - } - - std::string GetSaveData() - { - std::ostringstream saveStream; - saveStream << "R D " << _gongPhase << ' ' << _firesState; - return saveStream.str(); - } - - void Load(const char* str) - { - if (!str) - return; - - char dataHead1, dataHead2; - std::istringstream loadStream(str); - loadStream >> dataHead1 >> dataHead2; - - if (dataHead1 == 'R' && dataHead2 == 'D') - { - loadStream >> _gongPhase; - loadStream >> _firesState; - } - } - - private: - uint32 _gongPhase; - uint32 _firesState; - }; - - InstanceScript* GetInstanceScript(InstanceMap* map) const - { - return new instance_razorfen_downs_InstanceMapScript(map); } + + void Initialize() + { + _gongPhase = 0; + _firesState = 0; + } + + void OnGameObjectCreate(GameObject* gameobject) + { + switch (gameobject->GetEntry()) + { + case GO_IDOL_OVEN_FIRE: + case GO_IDOL_CUP_FIRE: + case GO_IDOL_MOUTH_FIRE: + if (_firesState == DONE) + gameobject->Delete(); + break; + case GO_GONG: + if (_gongPhase == DONE) + gameobject->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + break; + } + } + + uint32 GetData(uint32 type) const + { + if (type == GO_GONG) + return _gongPhase; + return 0; + } + + void SetData(uint32 type, uint32 data) + { + if (type == GO_GONG) + _gongPhase = data; + else if (type == GO_BELNISTRASZS_BRAZIER) + _firesState = DONE; + SaveToDB(); + } + + std::string GetSaveData() + { + std::ostringstream saveStream; + saveStream << "R D " << _gongPhase << ' ' << _firesState; + return saveStream.str(); + } + + void Load(const char* str) + { + if (!str) + return; + + char dataHead1, dataHead2; + std::istringstream loadStream(str); + loadStream >> dataHead1 >> dataHead2; + + if (dataHead1 == 'R' && dataHead2 == 'D') + { + loadStream >> _gongPhase; + loadStream >> _firesState; + } + } + + private: + uint32 _gongPhase; + uint32 _firesState; + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_razorfen_downs_InstanceMapScript(map); + } }; void AddSC_instance_razorfen_downs() diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp index 28b0797ab..bfc7b0fe4 100644 --- a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp +++ b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp @@ -57,105 +57,105 @@ enum Belnistrasz class npc_belnistrasz : public CreatureScript { - public: - npc_belnistrasz() : CreatureScript("npc_belnistrasz") { } +public: + npc_belnistrasz() : CreatureScript("npc_belnistrasz") { } - struct npc_belnistraszAI : public ScriptedAI + struct npc_belnistraszAI : public ScriptedAI + { + npc_belnistraszAI(Creature* creature) : ScriptedAI(creature) { - npc_belnistraszAI(Creature* creature) : ScriptedAI(creature) - { - instance = creature->GetInstanceScript(); - eventInProgress = false; - spawnerCount = 0; - } + instance = creature->GetInstanceScript(); + eventInProgress = false; + spawnerCount = 0; + } - void Reset() + void Reset() + { + if (!eventInProgress) { - if (!eventInProgress) + if (!me->HasAura(SPELL_ARCANE_INTELLECT)) + DoCast(me, SPELL_ARCANE_INTELLECT); + + channeling = false; + eventProgress = 0; + spawnerCount = 0; + me->SetFlag(UNIT_NPC_FLAGS, GOSSIP_OPTION_QUESTGIVER); + me->SetReactState(REACT_AGGRESSIVE); + } + } + + void EnterCombat(Unit* who) + { + if (channeling) + Talk(SAY_WATCH_OUT, who); + else + { + events.ScheduleEvent(EVENT_FIREBALL, 1000); + events.ScheduleEvent(EVENT_FROST_NOVA, urand(8000, 12000)); + if (urand(0, 100) > 40) + Talk(SAY_AGGRO, who); + } + } + + void JustDied(Unit* /*killer*/) + { + me->DespawnOrUnsummon(5000); + } + + void sQuestAccept(Player* /*player*/, Quest const* quest) + { + if (quest->GetQuestId() == QUEST_EXTINGUISHING_THE_IDOL) + { + eventInProgress = true; + Talk(SAY_QUEST_ACCEPTED); + me->RemoveFlag(UNIT_NPC_FLAGS, GOSSIP_OPTION_QUESTGIVER); + me->setFaction(FACTION_ESCORT); + me->GetMotionMaster()->MovePath(PATH_ESCORT, false); + } + } + + void MovementInform(uint32 type, uint32 id) + { + if (type == WAYPOINT_MOTION_TYPE && id == POINT_REACH_IDOL) + { + channeling = true; + events.ScheduleEvent(EVENT_CHANNEL, 2000); + } + } + + void UpdateAI(uint32 diff) + { + if (!eventInProgress) + return; + + events.Update(diff); + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) { - if (!me->HasAura(SPELL_ARCANE_INTELLECT)) - DoCast(me, SPELL_ARCANE_INTELLECT); - - channeling = false; - eventProgress = 0; - spawnerCount = 0; - me->SetFlag(UNIT_NPC_FLAGS, GOSSIP_OPTION_QUESTGIVER); - me->SetReactState(REACT_AGGRESSIVE); - } - } - - void EnterCombat(Unit* who) - { - if (channeling) - Talk(SAY_WATCH_OUT, who); - else - { - events.ScheduleEvent(EVENT_FIREBALL, 1000); - events.ScheduleEvent(EVENT_FROST_NOVA, urand(8000, 12000)); - if (urand(0, 100) > 40) - Talk(SAY_AGGRO, who); - } - } - - void JustDied(Unit* /*killer*/) - { - me->DespawnOrUnsummon(5000); - } - - void sQuestAccept(Player* /*player*/, Quest const* quest) - { - if (quest->GetQuestId() == QUEST_EXTINGUISHING_THE_IDOL) - { - eventInProgress = true; - Talk(SAY_QUEST_ACCEPTED); - me->RemoveFlag(UNIT_NPC_FLAGS, GOSSIP_OPTION_QUESTGIVER); - me->setFaction(FACTION_ESCORT); - me->GetMotionMaster()->MovePath(PATH_ESCORT, false); - } - } - - void MovementInform(uint32 type, uint32 id) - { - if (type == WAYPOINT_MOTION_TYPE && id == POINT_REACH_IDOL) - { - channeling = true; - events.ScheduleEvent(EVENT_CHANNEL, 2000); - } - } - - void UpdateAI(uint32 diff) - { - if (!eventInProgress) - return; - - events.Update(diff); - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_CHANNEL: - Talk(SAY_EVENT_START); - DoCast(me, SPELL_IDOL_SHUTDOWN_VISUAL); - events.ScheduleEvent(EVENT_IDOL_ROOM_SPAWNER, 100); - events.ScheduleEvent(EVENT_PROGRESS, 120000); - me->SetReactState(REACT_PASSIVE); - break; - case EVENT_IDOL_ROOM_SPAWNER: - if (Creature* creature = me->SummonCreature(NPC_IDOL_ROOM_SPAWNER, PosSummonSpawner[urand(0,2)], TEMPSUMMON_TIMED_DESPAWN, 4000)) - creature->AI()->SetData(0,spawnerCount); - if (++spawnerCount < 8) - events.ScheduleEvent(EVENT_IDOL_ROOM_SPAWNER, 35000); - break; - case EVENT_PROGRESS: + case EVENT_CHANNEL: + Talk(SAY_EVENT_START); + DoCast(me, SPELL_IDOL_SHUTDOWN_VISUAL); + events.ScheduleEvent(EVENT_IDOL_ROOM_SPAWNER, 100); + events.ScheduleEvent(EVENT_PROGRESS, 120000); + me->SetReactState(REACT_PASSIVE); + break; + case EVENT_IDOL_ROOM_SPAWNER: + if (Creature* creature = me->SummonCreature(NPC_IDOL_ROOM_SPAWNER, PosSummonSpawner[urand(0, 2)], TEMPSUMMON_TIMED_DESPAWN, 4000)) + creature->AI()->SetData(0, spawnerCount); + if (++spawnerCount < 8) + events.ScheduleEvent(EVENT_IDOL_ROOM_SPAWNER, 35000); + break; + case EVENT_PROGRESS: { switch (eventProgress) { case 0: Talk(SAY_EVENT_THREE_MIN_LEFT); ++eventProgress; - events.ScheduleEvent(EVENT_PROGRESS, 60000); - break; + events.ScheduleEvent(EVENT_PROGRESS, 60000); + break; case 1: Talk(SAY_EVENT_TWO_MIN_LEFT); ++eventProgress; @@ -173,9 +173,9 @@ class npc_belnistrasz : public CreatureScript events.ScheduleEvent(EVENT_COMPLETE, 3000); break; } - break; + break; } - case EVENT_COMPLETE: + case EVENT_COMPLETE: { DoCast(me, SPELL_IDOM_ROOM_CAMERA_SHAKE); me->SummonGameObject(GO_BELNISTRASZS_BRAZIER, 2577.196f, 947.0781f, 53.16757f, 2.356195f, 0, 0, 0.9238796f, 0.3826832f, 3600); @@ -200,69 +200,69 @@ class npc_belnistrasz : public CreatureScript me->DespawnOrUnsummon(); break; } - case EVENT_FIREBALL: - if (me->HasUnitState(UNIT_STATE_CASTING) || !UpdateVictim()) - return; - DoCastVictim(SPELL_FIREBALL); - events.ScheduleEvent(EVENT_FIREBALL, 8000); - break; - case EVENT_FROST_NOVA: - if (me->HasUnitState(UNIT_STATE_CASTING) || !UpdateVictim()) - return; - DoCast(me, SPELL_FROST_NOVA); - events.ScheduleEvent(EVENT_FROST_NOVA, 15000); - break; - } + case EVENT_FIREBALL: + if (me->HasUnitState(UNIT_STATE_CASTING) || !UpdateVictim()) + return; + DoCastVictim(SPELL_FIREBALL); + events.ScheduleEvent(EVENT_FIREBALL, 8000); + break; + case EVENT_FROST_NOVA: + if (me->HasUnitState(UNIT_STATE_CASTING) || !UpdateVictim()) + return; + DoCast(me, SPELL_FROST_NOVA); + events.ScheduleEvent(EVENT_FROST_NOVA, 15000); + break; } - if (!channeling) - DoMeleeAttackIfReady(); } - - private: - InstanceScript* instance; - EventMap events; - bool eventInProgress; - bool channeling; - uint8 eventProgress; - uint8 spawnerCount; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + if (!channeling) + DoMeleeAttackIfReady(); } + + private: + InstanceScript* instance; + EventMap events; + bool eventInProgress; + bool channeling; + uint8 eventProgress; + uint8 spawnerCount; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class npc_idol_room_spawner : public CreatureScript { - public: - npc_idol_room_spawner() : CreatureScript("npc_idol_room_spawner") { } +public: + npc_idol_room_spawner() : CreatureScript("npc_idol_room_spawner") { } - struct npc_idol_room_spawnerAI : public NullCreatureAI + struct npc_idol_room_spawnerAI : public NullCreatureAI + { + npc_idol_room_spawnerAI(Creature* creature) : NullCreatureAI(creature) { - npc_idol_room_spawnerAI(Creature* creature) : NullCreatureAI(creature) - { - } - - void SetData(uint32 /*type*/, uint32 data) - { - if (data < 7) - { - me->SummonCreature(NPC_WITHERED_BATTLE_BOAR, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); - if (data > 0 && me->GetOrientation() < 4.0f) - me->SummonCreature(NPC_WITHERED_BATTLE_BOAR, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); - me->SummonCreature(NPC_DEATHS_HEAD_GEOMANCER, me->GetPositionX() + (cos(me->GetOrientation() - (M_PI/2)) * 2), me->GetPositionY() + (sin(me->GetOrientation() - (M_PI/2)) * 2), me->GetPositionZ(), me->GetOrientation()); - me->SummonCreature(NPC_WITHERED_QUILGUARD, me->GetPositionX() + (cos(me->GetOrientation() + (M_PI/2)) * 2), me->GetPositionY() + (sin(me->GetOrientation() + (M_PI/2)) * 2), me->GetPositionZ(), me->GetOrientation()); - } - else if (data == 7) - me->SummonCreature(NPC_PLAGUEMAW_THE_ROTTING, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); } + + void SetData(uint32 /*type*/, uint32 data) + { + if (data < 7) + { + me->SummonCreature(NPC_WITHERED_BATTLE_BOAR, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); + if (data > 0 && me->GetOrientation() < 4.0f) + me->SummonCreature(NPC_WITHERED_BATTLE_BOAR, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); + me->SummonCreature(NPC_DEATHS_HEAD_GEOMANCER, me->GetPositionX() + (cos(me->GetOrientation() - (M_PI / 2)) * 2), me->GetPositionY() + (sin(me->GetOrientation() - (M_PI / 2)) * 2), me->GetPositionZ(), me->GetOrientation()); + me->SummonCreature(NPC_WITHERED_QUILGUARD, me->GetPositionX() + (cos(me->GetOrientation() + (M_PI / 2)) * 2), me->GetPositionY() + (sin(me->GetOrientation() + (M_PI / 2)) * 2), me->GetPositionZ(), me->GetOrientation()); + } + else if (data == 7) + me->SummonCreature(NPC_PLAGUEMAW_THE_ROTTING, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; void AddSC_razorfen_downs() diff --git a/src/server/scripts/Kalimdor/RazorfenKraul/instance_razorfen_kraul.cpp b/src/server/scripts/Kalimdor/RazorfenKraul/instance_razorfen_kraul.cpp index 055ca9ad7..0df8c021f 100644 --- a/src/server/scripts/Kalimdor/RazorfenKraul/instance_razorfen_kraul.cpp +++ b/src/server/scripts/Kalimdor/RazorfenKraul/instance_razorfen_kraul.cpp @@ -7,18 +7,18 @@ class instance_razorfen_kraul : public InstanceMapScript { - public: - instance_razorfen_kraul() : InstanceMapScript("instance_razorfen_kraul", 47) { } +public: + instance_razorfen_kraul() : InstanceMapScript("instance_razorfen_kraul", 47) { } - InstanceScript* GetInstanceScript(InstanceMap* map) const - { - return new instance_razorfen_kraul_InstanceMapScript(map); - } + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_razorfen_kraul_InstanceMapScript(map); + } - struct instance_razorfen_kraul_InstanceMapScript : public InstanceScript - { - instance_razorfen_kraul_InstanceMapScript(Map* map) : InstanceScript(map) { } - }; + struct instance_razorfen_kraul_InstanceMapScript : public InstanceScript + { + instance_razorfen_kraul_InstanceMapScript(Map* map) : InstanceScript(map) { } + }; }; void AddSC_instance_razorfen_kraul() diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp index 12e11dddf..f0b42b399 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp @@ -61,141 +61,141 @@ const Position LarvaPos[2] = class boss_ayamiss : public CreatureScript { - public: - boss_ayamiss() : CreatureScript("boss_ayamiss") { } +public: + boss_ayamiss() : CreatureScript("boss_ayamiss") { } - struct boss_ayamissAI : public BossAI + struct boss_ayamissAI : public BossAI + { + boss_ayamissAI(Creature* creature) : BossAI(creature, DATA_AYAMISS) { - boss_ayamissAI(Creature* creature) : BossAI(creature, DATA_AYAMISS) - { - } + } - void Reset() - { - _Reset(); - _phase = PHASE_AIR; - _enraged = false; - SetCombatMovement(false); - } + void Reset() + { + _Reset(); + _phase = PHASE_AIR; + _enraged = false; + SetCombatMovement(false); + } - void JustSummoned(Creature* who) + void JustSummoned(Creature* who) + { + switch (who->GetEntry()) { - switch (who->GetEntry()) + case NPC_SWARMER: + _swarmers.push_back(who->GetGUID()); + break; + case NPC_LARVA: + who->GetMotionMaster()->MovePoint(POINT_PARALYZE, AltarPos); + break; + case NPC_HORNET: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) + who->AI()->AttackStart(target); + break; + } + } + + void MovementInform(uint32 type, uint32 id) + { + if (type == POINT_MOTION_TYPE) + { + switch (id) { - case NPC_SWARMER: - _swarmers.push_back(who->GetGUID()); + case POINT_AIR: + me->AddUnitState(UNIT_STATE_ROOT); break; - case NPC_LARVA: - who->GetMotionMaster()->MovePoint(POINT_PARALYZE, AltarPos); - break; - case NPC_HORNET: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) - who->AI()->AttackStart(target); + case POINT_GROUND: + me->ClearUnitState(UNIT_STATE_ROOT); break; } } + } - void MovementInform(uint32 type, uint32 id) + void EnterEvadeMode() + { + me->ClearUnitState(UNIT_STATE_ROOT); + BossAI::EnterEvadeMode(); + } + + void EnterCombat(Unit* attacker) + { + BossAI::EnterCombat(attacker); + + events.ScheduleEvent(EVENT_STINGER_SPRAY, urand(20000, 30000)); + events.ScheduleEvent(EVENT_POISON_STINGER, 5000); + events.ScheduleEvent(EVENT_SUMMON_SWARMER, 5000); + events.ScheduleEvent(EVENT_SWARMER_ATTACK, 60000); + events.ScheduleEvent(EVENT_PARALYZE, 15000); + + me->SetCanFly(true); + me->SetDisableGravity(true); + me->GetMotionMaster()->MovePoint(POINT_AIR, AyamissAirPos); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (_phase == PHASE_AIR && me->GetHealthPct() < 70.0f) { - if (type == POINT_MOTION_TYPE) - { - switch (id) - { - case POINT_AIR: - me->AddUnitState(UNIT_STATE_ROOT); - break; - case POINT_GROUND: - me->ClearUnitState(UNIT_STATE_ROOT); - break; - } - } + _phase = PHASE_GROUND; + SetCombatMovement(true); + me->SetCanFly(false); + Position VictimPos; + me->GetVictim()->GetPosition(&VictimPos); + me->GetMotionMaster()->MovePoint(POINT_GROUND, VictimPos); + DoResetThreat(); + events.ScheduleEvent(EVENT_LASH, urand(5000, 8000)); + events.ScheduleEvent(EVENT_TRASH, urand(3000, 6000)); + events.CancelEvent(EVENT_POISON_STINGER); + } + else + { + DoMeleeAttackIfReady(); } - void EnterEvadeMode() + if (!_enraged && me->GetHealthPct() < 20.0f) { - me->ClearUnitState(UNIT_STATE_ROOT); - BossAI::EnterEvadeMode(); + DoCast(me, SPELL_FRENZY); + Talk(EMOTE_FRENZY); + _enraged = true; } - void EnterCombat(Unit* attacker) + while (uint32 eventId = events.ExecuteEvent()) { - BossAI::EnterCombat(attacker); - - events.ScheduleEvent(EVENT_STINGER_SPRAY, urand(20000, 30000)); - events.ScheduleEvent(EVENT_POISON_STINGER, 5000); - events.ScheduleEvent(EVENT_SUMMON_SWARMER, 5000); - events.ScheduleEvent(EVENT_SWARMER_ATTACK, 60000); - events.ScheduleEvent(EVENT_PARALYZE, 15000); - - me->SetCanFly(true); - me->SetDisableGravity(true); - me->GetMotionMaster()->MovePoint(POINT_AIR, AyamissAirPos); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (_phase == PHASE_AIR && me->GetHealthPct() < 70.0f) + switch (eventId) { - _phase = PHASE_GROUND; - SetCombatMovement(true); - me->SetCanFly(false); - Position VictimPos; - me->GetVictim()->GetPosition(&VictimPos); - me->GetMotionMaster()->MovePoint(POINT_GROUND, VictimPos); - DoResetThreat(); - events.ScheduleEvent(EVENT_LASH, urand(5000, 8000)); - events.ScheduleEvent(EVENT_TRASH, urand(3000, 6000)); - events.CancelEvent(EVENT_POISON_STINGER); - } - else - { - DoMeleeAttackIfReady(); - } + case EVENT_STINGER_SPRAY: + DoCast(me, SPELL_STINGER_SPRAY); + events.ScheduleEvent(EVENT_STINGER_SPRAY, urand(15000, 20000)); + break; + case EVENT_POISON_STINGER: + DoCastVictim(SPELL_POISON_STINGER); + events.ScheduleEvent(EVENT_POISON_STINGER, urand(2000, 3000)); + break; + case EVENT_PARALYZE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0, true)) + { + DoCast(target, SPELL_PARALYZE); + instance->SetData64(DATA_PARALYZED, target->GetGUID()); + uint8 Index = urand(0, 1); + me->SummonCreature(NPC_LARVA, LarvaPos[Index], TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000); + } + events.ScheduleEvent(EVENT_PARALYZE, 15000); + break; + case EVENT_SWARMER_ATTACK: + for (std::list::iterator i = _swarmers.begin(); i != _swarmers.end(); ++i) + if (Creature* swarmer = me->GetMap()->GetCreature(*i)) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) + swarmer->AI()->AttackStart(target); - if (!_enraged && me->GetHealthPct() < 20.0f) - { - DoCast(me, SPELL_FRENZY); - Talk(EMOTE_FRENZY); - _enraged = true; - } - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_STINGER_SPRAY: - DoCast(me, SPELL_STINGER_SPRAY); - events.ScheduleEvent(EVENT_STINGER_SPRAY, urand(15000, 20000)); - break; - case EVENT_POISON_STINGER: - DoCastVictim(SPELL_POISON_STINGER); - events.ScheduleEvent(EVENT_POISON_STINGER, urand(2000, 3000)); - break; - case EVENT_PARALYZE: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0, true)) - { - DoCast(target, SPELL_PARALYZE); - instance->SetData64(DATA_PARALYZED, target->GetGUID()); - uint8 Index = urand(0, 1); - me->SummonCreature(NPC_LARVA, LarvaPos[Index], TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000); - } - events.ScheduleEvent(EVENT_PARALYZE, 15000); - break; - case EVENT_SWARMER_ATTACK: - for (std::list::iterator i = _swarmers.begin(); i != _swarmers.end(); ++i) - if (Creature* swarmer = me->GetMap()->GetCreature(*i)) - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) - swarmer->AI()->AttackStart(target); - - _swarmers.clear(); - events.ScheduleEvent(EVENT_SWARMER_ATTACK, 60000); - break; - case EVENT_SUMMON_SWARMER: + _swarmers.clear(); + events.ScheduleEvent(EVENT_SWARMER_ATTACK, 60000); + break; + case EVENT_SUMMON_SWARMER: { Position Pos; me->GetRandomPoint(SwarmerPos, 80.0f, Pos); @@ -203,81 +203,81 @@ class boss_ayamiss : public CreatureScript events.ScheduleEvent(EVENT_SUMMON_SWARMER, 5000); break; } - case EVENT_TRASH: - DoCastVictim(SPELL_TRASH); - events.ScheduleEvent(EVENT_TRASH, urand(5000, 7000)); - break; - case EVENT_LASH: - DoCastVictim(SPELL_LASH); - events.ScheduleEvent(EVENT_LASH, urand(8000, 15000)); - break; - } + case EVENT_TRASH: + DoCastVictim(SPELL_TRASH); + events.ScheduleEvent(EVENT_TRASH, urand(5000, 7000)); + break; + case EVENT_LASH: + DoCastVictim(SPELL_LASH); + events.ScheduleEvent(EVENT_LASH, urand(8000, 15000)); + break; } } - private: - std::list _swarmers; - uint8 _phase; - bool _enraged; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); } + private: + std::list _swarmers; + uint8 _phase; + bool _enraged; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class npc_hive_zara_larva : public CreatureScript { - public: - npc_hive_zara_larva() : CreatureScript("npc_hive_zara_larva") { } +public: + npc_hive_zara_larva() : CreatureScript("npc_hive_zara_larva") { } - struct npc_hive_zara_larvaAI : public ScriptedAI + struct npc_hive_zara_larvaAI : public ScriptedAI + { + npc_hive_zara_larvaAI(Creature* creature) : ScriptedAI(creature) { - npc_hive_zara_larvaAI(Creature* creature) : ScriptedAI(creature) - { - _instance = me->GetInstanceScript(); - } - - void MovementInform(uint32 type, uint32 id) - { - if (type == POINT_MOTION_TYPE) - if (id == POINT_PARALYZE) - if (Player* target = ObjectAccessor::GetPlayer(*me, _instance->GetData64(DATA_PARALYZED))) - DoCast(target, SPELL_FEED); // Omnomnom - } - - void MoveInLineOfSight(Unit* who) - - { - if (_instance->GetBossState(DATA_AYAMISS) == IN_PROGRESS) - return; - - ScriptedAI::MoveInLineOfSight(who); - } - - void AttackStart(Unit* victim) - { - if (_instance->GetBossState(DATA_AYAMISS) == IN_PROGRESS) - return; - - ScriptedAI::AttackStart(victim); - } - - void UpdateAI(uint32 diff) - { - if (_instance->GetBossState(DATA_AYAMISS) == IN_PROGRESS) - return; - - ScriptedAI::UpdateAI(diff); - } - private: - InstanceScript* _instance; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + _instance = me->GetInstanceScript(); } + + void MovementInform(uint32 type, uint32 id) + { + if (type == POINT_MOTION_TYPE) + if (id == POINT_PARALYZE) + if (Player* target = ObjectAccessor::GetPlayer(*me, _instance->GetData64(DATA_PARALYZED))) + DoCast(target, SPELL_FEED); // Omnomnom + } + + void MoveInLineOfSight(Unit* who) + + { + if (_instance->GetBossState(DATA_AYAMISS) == IN_PROGRESS) + return; + + ScriptedAI::MoveInLineOfSight(who); + } + + void AttackStart(Unit* victim) + { + if (_instance->GetBossState(DATA_AYAMISS) == IN_PROGRESS) + return; + + ScriptedAI::AttackStart(victim); + } + + void UpdateAI(uint32 diff) + { + if (_instance->GetBossState(DATA_AYAMISS) == IN_PROGRESS) + return; + + ScriptedAI::UpdateAI(diff); + } + private: + InstanceScript* _instance; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; void AddSC_boss_ayamiss() diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp index be9bd628e..ff4042cce 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp @@ -50,216 +50,216 @@ enum Actions class boss_buru : public CreatureScript { - public: - boss_buru() : CreatureScript("boss_buru") { } +public: + boss_buru() : CreatureScript("boss_buru") { } - struct boss_buruAI : public BossAI + struct boss_buruAI : public BossAI + { + boss_buruAI(Creature* creature) : BossAI(creature, DATA_BURU) { - boss_buruAI(Creature* creature) : BossAI(creature, DATA_BURU) - { - } - - void EnterEvadeMode() - { - BossAI::EnterEvadeMode(); - - for (std::list::iterator i = Eggs.begin(); i != Eggs.end(); ++i) - if (Creature* egg = me->GetMap()->GetCreature(*Eggs.begin())) - egg->Respawn(); - - Eggs.clear(); - } - - void EnterCombat(Unit* who) - { - _EnterCombat(); - Talk(EMOTE_TARGET, who); - DoCast(me, SPELL_THORNS); - - events.ScheduleEvent(EVENT_DISMEMBER, 5000); - events.ScheduleEvent(EVENT_GATHERING_SPEED, 9000); - events.ScheduleEvent(EVENT_FULL_SPEED, 60000); - - _phase = PHASE_EGG; - } - - void DoAction(int32 action) - { - if (action == ACTION_EXPLODE) - if (_phase == PHASE_EGG) - Unit::DealDamage(me, me, 45000); - } - - void KilledUnit(Unit* victim) - { - if (victim->GetTypeId() == TYPEID_PLAYER) - ChaseNewVictim(); - } - - void ChaseNewVictim() - { - if (_phase != PHASE_EGG) - return; - - me->RemoveAurasDueToSpell(SPELL_FULL_SPEED); - me->RemoveAurasDueToSpell(SPELL_GATHERING_SPEED); - events.ScheduleEvent(EVENT_GATHERING_SPEED, 9000); - events.ScheduleEvent(EVENT_FULL_SPEED, 60000); - - if (Unit* victim = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) - { - DoResetThreat(); - AttackStart(victim); - Talk(EMOTE_TARGET, victim); - } - } - - void ManageRespawn(uint64 EggGUID) - { - ChaseNewVictim(); - Eggs.push_back(EggGUID); - events.ScheduleEvent(EVENT_RESPAWN_EGG, 100000); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_DISMEMBER: - DoCastVictim(SPELL_DISMEMBER); - events.ScheduleEvent(EVENT_DISMEMBER, 5000); - break; - case EVENT_GATHERING_SPEED: - DoCast(me, SPELL_GATHERING_SPEED); - events.ScheduleEvent(EVENT_GATHERING_SPEED, 9000); - break; - case EVENT_FULL_SPEED: - DoCast(me, SPELL_FULL_SPEED); - break; - case EVENT_CREEPING_PLAGUE: - DoCast(me, SPELL_CREEPING_PLAGUE); - events.ScheduleEvent(EVENT_CREEPING_PLAGUE, 6000); - break; - case EVENT_RESPAWN_EGG: - if (Creature* egg = me->GetMap()->GetCreature(*Eggs.begin())) - { - egg->Respawn(); - Eggs.pop_front(); - } - break; - default: - break; - } - } - - if (me->GetHealthPct() < 20.0f && _phase == PHASE_EGG) - { - DoCast(me, SPELL_BURU_TRANSFORM); // Enrage - DoCast(me, SPELL_FULL_SPEED, true); - me->RemoveAurasDueToSpell(SPELL_THORNS); - _phase = PHASE_TRANSFORM; - } - - DoMeleeAttackIfReady(); - } - private: - uint8 _phase; - std::list Eggs; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_buruAI(creature); } + + void EnterEvadeMode() + { + BossAI::EnterEvadeMode(); + + for (std::list::iterator i = Eggs.begin(); i != Eggs.end(); ++i) + if (Creature* egg = me->GetMap()->GetCreature(*Eggs.begin())) + egg->Respawn(); + + Eggs.clear(); + } + + void EnterCombat(Unit* who) + { + _EnterCombat(); + Talk(EMOTE_TARGET, who); + DoCast(me, SPELL_THORNS); + + events.ScheduleEvent(EVENT_DISMEMBER, 5000); + events.ScheduleEvent(EVENT_GATHERING_SPEED, 9000); + events.ScheduleEvent(EVENT_FULL_SPEED, 60000); + + _phase = PHASE_EGG; + } + + void DoAction(int32 action) + { + if (action == ACTION_EXPLODE) + if (_phase == PHASE_EGG) + Unit::DealDamage(me, me, 45000); + } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER) + ChaseNewVictim(); + } + + void ChaseNewVictim() + { + if (_phase != PHASE_EGG) + return; + + me->RemoveAurasDueToSpell(SPELL_FULL_SPEED); + me->RemoveAurasDueToSpell(SPELL_GATHERING_SPEED); + events.ScheduleEvent(EVENT_GATHERING_SPEED, 9000); + events.ScheduleEvent(EVENT_FULL_SPEED, 60000); + + if (Unit* victim = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) + { + DoResetThreat(); + AttackStart(victim); + Talk(EMOTE_TARGET, victim); + } + } + + void ManageRespawn(uint64 EggGUID) + { + ChaseNewVictim(); + Eggs.push_back(EggGUID); + events.ScheduleEvent(EVENT_RESPAWN_EGG, 100000); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_DISMEMBER: + DoCastVictim(SPELL_DISMEMBER); + events.ScheduleEvent(EVENT_DISMEMBER, 5000); + break; + case EVENT_GATHERING_SPEED: + DoCast(me, SPELL_GATHERING_SPEED); + events.ScheduleEvent(EVENT_GATHERING_SPEED, 9000); + break; + case EVENT_FULL_SPEED: + DoCast(me, SPELL_FULL_SPEED); + break; + case EVENT_CREEPING_PLAGUE: + DoCast(me, SPELL_CREEPING_PLAGUE); + events.ScheduleEvent(EVENT_CREEPING_PLAGUE, 6000); + break; + case EVENT_RESPAWN_EGG: + if (Creature* egg = me->GetMap()->GetCreature(*Eggs.begin())) + { + egg->Respawn(); + Eggs.pop_front(); + } + break; + default: + break; + } + } + + if (me->GetHealthPct() < 20.0f && _phase == PHASE_EGG) + { + DoCast(me, SPELL_BURU_TRANSFORM); // Enrage + DoCast(me, SPELL_FULL_SPEED, true); + me->RemoveAurasDueToSpell(SPELL_THORNS); + _phase = PHASE_TRANSFORM; + } + + DoMeleeAttackIfReady(); + } + private: + uint8 _phase; + std::list Eggs; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_buruAI(creature); + } }; class npc_buru_egg : public CreatureScript { - public: - npc_buru_egg() : CreatureScript("npc_buru_egg") { } +public: + npc_buru_egg() : CreatureScript("npc_buru_egg") { } - struct npc_buru_eggAI : public ScriptedAI + struct npc_buru_eggAI : public ScriptedAI + { + npc_buru_eggAI(Creature* creature) : ScriptedAI(creature) { - npc_buru_eggAI(Creature* creature) : ScriptedAI(creature) - { - _instance = me->GetInstanceScript(); - SetCombatMovement(false); - } - - void EnterCombat(Unit* attacker) - { - if (Creature* buru = me->GetMap()->GetCreature(_instance->GetData64(DATA_BURU))) - if (!buru->IsInCombat()) - buru->AI()->AttackStart(attacker); - } - - void JustSummoned(Creature* who) - { - if (who->GetEntry() == NPC_HATCHLING) - if (Creature* buru = me->GetMap()->GetCreature(_instance->GetData64(DATA_BURU))) - if (Unit* target = buru->AI()->SelectTarget(SELECT_TARGET_RANDOM)) - who->AI()->AttackStart(target); - } - - void JustDied(Unit* /*killer*/) - { - DoCastAOE(SPELL_EXPLODE, true); - DoCastAOE(SPELL_EXPLODE_2, true); // Unknown purpose - DoCast(me, SPELL_SUMMON_HATCHLING, true); - - if (Creature* buru = me->GetMap()->GetCreature(_instance->GetData64(DATA_BURU))) - if (boss_buru::boss_buruAI* buruAI = dynamic_cast(buru->AI())) - buruAI->ManageRespawn(me->GetGUID()); - } - private: - InstanceScript* _instance; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + _instance = me->GetInstanceScript(); + SetCombatMovement(false); } + + void EnterCombat(Unit* attacker) + { + if (Creature* buru = me->GetMap()->GetCreature(_instance->GetData64(DATA_BURU))) + if (!buru->IsInCombat()) + buru->AI()->AttackStart(attacker); + } + + void JustSummoned(Creature* who) + { + if (who->GetEntry() == NPC_HATCHLING) + if (Creature* buru = me->GetMap()->GetCreature(_instance->GetData64(DATA_BURU))) + if (Unit* target = buru->AI()->SelectTarget(SELECT_TARGET_RANDOM)) + who->AI()->AttackStart(target); + } + + void JustDied(Unit* /*killer*/) + { + DoCastAOE(SPELL_EXPLODE, true); + DoCastAOE(SPELL_EXPLODE_2, true); // Unknown purpose + DoCast(me, SPELL_SUMMON_HATCHLING, true); + + if (Creature* buru = me->GetMap()->GetCreature(_instance->GetData64(DATA_BURU))) + if (boss_buru::boss_buruAI* buruAI = dynamic_cast(buru->AI())) + buruAI->ManageRespawn(me->GetGUID()); + } + private: + InstanceScript* _instance; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class spell_egg_explosion : public SpellScriptLoader { - public: - spell_egg_explosion() : SpellScriptLoader("spell_egg_explosion") { } +public: + spell_egg_explosion() : SpellScriptLoader("spell_egg_explosion") { } - class spell_egg_explosion_SpellScript : public SpellScript + class spell_egg_explosion_SpellScript : public SpellScript + { + PrepareSpellScript(spell_egg_explosion_SpellScript); + + void HandleAfterCast() { - PrepareSpellScript(spell_egg_explosion_SpellScript); - - void HandleAfterCast() - { - if (Creature* buru = GetCaster()->FindNearestCreature(NPC_BURU, 5.f)) - buru->AI()->DoAction(ACTION_EXPLODE); - } - - void HandleDummyHitTarget(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - Unit::DealDamage(GetCaster(), target, -16 * GetCaster()->GetDistance(target) + 500); - } - - void Register() - { - AfterCast += SpellCastFn(spell_egg_explosion_SpellScript::HandleAfterCast); - OnEffectHitTarget += SpellEffectFn(spell_egg_explosion_SpellScript::HandleDummyHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_egg_explosion_SpellScript(); + if (Creature* buru = GetCaster()->FindNearestCreature(NPC_BURU, 5.f)) + buru->AI()->DoAction(ACTION_EXPLODE); } + + void HandleDummyHitTarget(SpellEffIndex /*effIndex*/) + { + if (Unit* target = GetHitUnit()) + Unit::DealDamage(GetCaster(), target, -16 * GetCaster()->GetDistance(target) + 500); + } + + void Register() + { + AfterCast += SpellCastFn(spell_egg_explosion_SpellScript::HandleAfterCast); + OnEffectHitTarget += SpellEffectFn(spell_egg_explosion_SpellScript::HandleDummyHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_egg_explosion_SpellScript(); + } }; void AddSC_boss_buru() diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp index aa402d9be..81a74baab 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp @@ -35,89 +35,89 @@ enum Texts class boss_kurinnaxx : public CreatureScript { - public: - boss_kurinnaxx() : CreatureScript("boss_kurinnaxx") { } +public: + boss_kurinnaxx() : CreatureScript("boss_kurinnaxx") { } - struct boss_kurinnaxxAI : public BossAI + struct boss_kurinnaxxAI : public BossAI + { + boss_kurinnaxxAI(Creature* creature) : BossAI(creature, DATA_KURINNAXX) { - boss_kurinnaxxAI(Creature* creature) : BossAI(creature, DATA_KURINNAXX) - { - } - - void Reset() - { - _Reset(); - _enraged = false; - events.ScheduleEvent(EVENT_MORTAL_WOUND, 8000); - events.ScheduleEvent(EVENT_SANDTRAP, urand(5000, 15000)); - events.ScheduleEvent(EVENT_TRASH, 1000); - events.ScheduleEvent(EVENT_WIDE_SLASH, 11000); - } - - void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask) - { - if (!_enraged && HealthBelowPct(30)) - { - DoCast(me, SPELL_ENRAGE); - _enraged = true; - } - } - - void JustDied(Unit* /*killer*/) - { - _JustDied(); - if (Creature* Ossirian = me->GetMap()->GetCreature(instance->GetData64(DATA_OSSIRIAN))) - sCreatureTextMgr->SendChat(Ossirian, SAY_KURINAXX_DEATH, NULL, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_ZONE); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_MORTAL_WOUND: - DoCastVictim(SPELL_MORTALWOUND); - events.ScheduleEvent(EVENT_MORTAL_WOUND, 8000); - break; - case EVENT_SANDTRAP: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - target->CastSpell(target, SPELL_SANDTRAP, true); - else if (Unit* victim = me->GetVictim()) - victim->CastSpell(victim, SPELL_SANDTRAP, true); - events.ScheduleEvent(EVENT_SANDTRAP, urand(5000, 15000)); - break; - case EVENT_WIDE_SLASH: - DoCast(me, SPELL_WIDE_SLASH); - events.ScheduleEvent(EVENT_WIDE_SLASH, 11000); - break; - case EVENT_TRASH: - DoCast(me, SPELL_TRASH); - events.ScheduleEvent(EVENT_WIDE_SLASH, 16000); - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); - } - private: - bool _enraged; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); } + + void Reset() + { + _Reset(); + _enraged = false; + events.ScheduleEvent(EVENT_MORTAL_WOUND, 8000); + events.ScheduleEvent(EVENT_SANDTRAP, urand(5000, 15000)); + events.ScheduleEvent(EVENT_TRASH, 1000); + events.ScheduleEvent(EVENT_WIDE_SLASH, 11000); + } + + void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask) + { + if (!_enraged && HealthBelowPct(30)) + { + DoCast(me, SPELL_ENRAGE); + _enraged = true; + } + } + + void JustDied(Unit* /*killer*/) + { + _JustDied(); + if (Creature* Ossirian = me->GetMap()->GetCreature(instance->GetData64(DATA_OSSIRIAN))) + sCreatureTextMgr->SendChat(Ossirian, SAY_KURINAXX_DEATH, NULL, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_ZONE); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_MORTAL_WOUND: + DoCastVictim(SPELL_MORTALWOUND); + events.ScheduleEvent(EVENT_MORTAL_WOUND, 8000); + break; + case EVENT_SANDTRAP: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) + target->CastSpell(target, SPELL_SANDTRAP, true); + else if (Unit* victim = me->GetVictim()) + victim->CastSpell(victim, SPELL_SANDTRAP, true); + events.ScheduleEvent(EVENT_SANDTRAP, urand(5000, 15000)); + break; + case EVENT_WIDE_SLASH: + DoCast(me, SPELL_WIDE_SLASH); + events.ScheduleEvent(EVENT_WIDE_SLASH, 11000); + break; + case EVENT_TRASH: + DoCast(me, SPELL_TRASH); + events.ScheduleEvent(EVENT_WIDE_SLASH, 16000); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + private: + bool _enraged; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; void AddSC_boss_kurinnaxx() diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp index 130305c2c..72bd5a2d9 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp @@ -42,45 +42,45 @@ enum Actions class boss_moam : public CreatureScript { - public: - boss_moam() : CreatureScript("boss_moam") { } +public: + boss_moam() : CreatureScript("boss_moam") { } - struct boss_moamAI : public BossAI + struct boss_moamAI : public BossAI + { + boss_moamAI(Creature* creature) : BossAI(creature, DATA_MOAM) { - boss_moamAI(Creature* creature) : BossAI(creature, DATA_MOAM) - { - } + } - void Reset() - { - _Reset(); - me->SetPower(POWER_MANA, 0); - _isStonePhase = false; - events.ScheduleEvent(EVENT_STONE_PHASE, 90000); - //events.ScheduleEvent(EVENT_WIDE_SLASH, 11000); - } + void Reset() + { + _Reset(); + me->SetPower(POWER_MANA, 0); + _isStonePhase = false; + events.ScheduleEvent(EVENT_STONE_PHASE, 90000); + //events.ScheduleEvent(EVENT_WIDE_SLASH, 11000); + } - void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask) + { + if (!_isStonePhase && HealthBelowPct(45)) { - if (!_isStonePhase && HealthBelowPct(45)) - { - _isStonePhase = true; - DoAction(ACTION_STONE_PHASE_START); - } + _isStonePhase = true; + DoAction(ACTION_STONE_PHASE_START); } + } - void DoAction(int32 action) + void DoAction(int32 action) + { + switch (action) { - switch (action) - { - case ACTION_STONE_PHASE_END: + case ACTION_STONE_PHASE_END: { me->RemoveAurasDueToSpell(SPELL_ENERGIZE); events.ScheduleEvent(EVENT_STONE_PHASE, 90000); _isStonePhase = false; break; } - case ACTION_STONE_PHASE_START: + case ACTION_STONE_PHASE_START: { DoCast(me, SPELL_SUMMON_MANA_FIEND_1); DoCast(me, SPELL_SUMMON_MANA_FIEND_2); @@ -89,45 +89,45 @@ class boss_moam : public CreatureScript events.ScheduleEvent(EVENT_STONE_PHASE_END, 90000); break; } - default: - break; - } + default: + break; + } + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->GetPower(POWER_MANA) == me->GetMaxPower(POWER_MANA)) + { + if (_isStonePhase) + DoAction(ACTION_STONE_PHASE_END); + DoCastAOE(SPELL_ARCANE_ERUPTION); + me->SetPower(POWER_MANA, 0); } - void UpdateAI(uint32 diff) + if (_isStonePhase) { - if (!UpdateVictim()) - return; + if (events.ExecuteEvent() == EVENT_STONE_PHASE_END) + DoAction(ACTION_STONE_PHASE_END); + return; + } - events.Update(diff); + // Messing up mana-drain channel + //if (me->HasUnitState(UNIT_STATE_CASTING)) + // return; - if (me->GetPower(POWER_MANA) == me->GetMaxPower(POWER_MANA)) + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) { - if (_isStonePhase) - DoAction(ACTION_STONE_PHASE_END); - DoCastAOE(SPELL_ARCANE_ERUPTION); - me->SetPower(POWER_MANA, 0); - } - - if (_isStonePhase) - { - if (events.ExecuteEvent() == EVENT_STONE_PHASE_END) - DoAction(ACTION_STONE_PHASE_END); - return; - } - - // Messing up mana-drain channel - //if (me->HasUnitState(UNIT_STATE_CASTING)) - // return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_STONE_PHASE: - DoAction(ACTION_STONE_PHASE_START); - break; - case EVENT_DRAIN_MANA: + case EVENT_STONE_PHASE: + DoAction(ACTION_STONE_PHASE_START); + break; + case EVENT_DRAIN_MANA: { std::list targetList; { @@ -153,21 +153,21 @@ class boss_moam : public CreatureScript DoCast(me, SPELL_TRASH); events.ScheduleEvent(EVENT_WIDE_SLASH, 16000); break;*/ - default: - break; - } + default: + break; } - - DoMeleeAttackIfReady(); } - private: - bool _isStonePhase; - }; - CreatureAI* GetAI(Creature* creature) const - { - return new boss_moamAI(creature); + DoMeleeAttackIfReady(); } + private: + bool _isStonePhase; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_moamAI(creature); + } }; void AddSC_boss_moam() diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp index 4a2259075..ae33df893 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp @@ -70,198 +70,198 @@ Position const RoomCenter = { -9343.041992f, 1923.278198f, 85.555984f, 0.0 }; class boss_ossirian : public CreatureScript { - public: - boss_ossirian() : CreatureScript("boss_ossirian") { } +public: + boss_ossirian() : CreatureScript("boss_ossirian") { } - struct boss_ossirianAI : public BossAI + struct boss_ossirianAI : public BossAI + { + boss_ossirianAI(Creature* creature) : BossAI(creature, DATA_OSSIRIAN) { - boss_ossirianAI(Creature* creature) : BossAI(creature, DATA_OSSIRIAN) + SaidIntro = false; + } + + uint64 TriggerGUID; + uint64 CrystalGUID; + uint8 CrystalIterator; + bool SaidIntro; + + void Reset() + { + _Reset(); + CrystalIterator = 0; + TriggerGUID = 0; + CrystalGUID = 0; + } + + void SpellHit(Unit* caster, SpellInfo const* spell) + { + for (uint8 i = 0; i < NUM_WEAKNESS; ++i) { - SaidIntro = false; + if (spell->Id == SpellWeakness[i]) + { + me->RemoveAurasDueToSpell(SPELL_SUPREME); + ((TempSummon*)caster)->UnSummon(); + SpawnNextCrystal(); + } + } + } + + void DoAction(int32 action) + { + if (action == ACTION_TRIGGER_WEAKNESS) + if (Creature* Trigger = me->GetMap()->GetCreature(TriggerGUID)) + if (!Trigger->HasUnitState(UNIT_STATE_CASTING)) + Trigger->CastSpell(Trigger, SpellWeakness[urand(0, 4)], false); + } + + void EnterCombat(Unit* /*who*/) + { + _EnterCombat(); + events.Reset(); + events.ScheduleEvent(EVENT_SILENCE, 30000); + events.ScheduleEvent(EVENT_CYCLONE, 20000); + events.ScheduleEvent(EVENT_STOMP, 30000); + + DoCast(me, SPELL_SUPREME); + Talk(SAY_AGGRO); + + Map* map = me->GetMap(); + if (!map->IsDungeon()) + return; + + WorldPacket data(SMSG_WEATHER, (4 + 4 + 4)); + data << uint32(WEATHER_STATE_HEAVY_SANDSTORM) << float(1) << uint8(0); + map->SendToPlayers(&data); + + for (uint8 i = 0; i < NUM_TORNADOS; ++i) + { + Position Point; + me->GetRandomPoint(RoomCenter, RoomRadius, Point); + if (Creature* Tornado = me->GetMap()->SummonCreature(NPC_SAND_VORTEX, Point)) + Tornado->CastSpell(Tornado, SPELL_SAND_STORM, true); } - uint64 TriggerGUID; - uint64 CrystalGUID; - uint8 CrystalIterator; - bool SaidIntro; + SpawnNextCrystal(); + } - void Reset() - { - _Reset(); + void KilledUnit(Unit* /*victim*/) + { + Talk(SAY_SLAY); + } + + void EnterEvadeMode() + { + Cleanup(); + summons.DespawnAll(); + BossAI::EnterEvadeMode(); + } + + void JustDied(Unit* /*killer*/) + { + Cleanup(); + _JustDied(); + } + + void Cleanup() + { + if (GameObject* Crystal = me->GetMap()->GetGameObject(CrystalGUID)) + Crystal->Use(me); + } + + void SpawnNextCrystal() + { + if (CrystalIterator == NUM_CRYSTALS) CrystalIterator = 0; - TriggerGUID = 0; - CrystalGUID = 0; - } - void SpellHit(Unit* caster, SpellInfo const* spell) + if (Creature* Trigger = me->GetMap()->SummonCreature(NPC_OSSIRIAN_TRIGGER, CrystalCoordinates[CrystalIterator])) + { + TriggerGUID = Trigger->GetGUID(); + if (GameObject* Crystal = Trigger->SummonGameObject(GO_OSSIRIAN_CRYSTAL, + CrystalCoordinates[CrystalIterator].GetPositionX(), + CrystalCoordinates[CrystalIterator].GetPositionY(), + CrystalCoordinates[CrystalIterator].GetPositionZ(), + 0, 0, 0, 0, 0, uint32(-1))) + { + CrystalGUID = Crystal->GetGUID(); + ++CrystalIterator; + Crystal->SetOwnerGUID(0); + } + } + } + + void MoveInLineOfSight(Unit* who) + + { + if (!SaidIntro) + { + Talk(SAY_INTRO); + SaidIntro = true; + } + BossAI::MoveInLineOfSight(who); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + // No kiting! + if (me->GetDistance(me->GetVictim()) > 60.00f && me->GetDistance(me->GetVictim()) < 120.00f) + DoCastVictim(SPELL_SUMMON); + + bool ApplySupreme = true; + + if (me->HasAura(SPELL_SUPREME)) + ApplySupreme = false; + else { for (uint8 i = 0; i < NUM_WEAKNESS; ++i) { - if (spell->Id == SpellWeakness[i]) + if (me->HasAura(SpellWeakness[i])) { - me->RemoveAurasDueToSpell(SPELL_SUPREME); - ((TempSummon*)caster)->UnSummon(); - SpawnNextCrystal(); + ApplySupreme = false; + break; } } } - void DoAction(int32 action) + if (ApplySupreme) { - if (action == ACTION_TRIGGER_WEAKNESS) - if (Creature* Trigger = me->GetMap()->GetCreature(TriggerGUID)) - if (!Trigger->HasUnitState(UNIT_STATE_CASTING)) - Trigger->CastSpell(Trigger, SpellWeakness[urand(0, 4)], false); - } - - void EnterCombat(Unit* /*who*/) - { - _EnterCombat(); - events.Reset(); - events.ScheduleEvent(EVENT_SILENCE, 30000); - events.ScheduleEvent(EVENT_CYCLONE, 20000); - events.ScheduleEvent(EVENT_STOMP, 30000); - DoCast(me, SPELL_SUPREME); - Talk(SAY_AGGRO); + Talk(SAY_SUPREME); + } - Map* map = me->GetMap(); - if (!map->IsDungeon()) - return; - - WorldPacket data(SMSG_WEATHER, (4+4+4)); - data << uint32(WEATHER_STATE_HEAVY_SANDSTORM) << float(1) << uint8(0); - map->SendToPlayers(&data); - - for (uint8 i = 0; i < NUM_TORNADOS; ++i) + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) { - Position Point; - me->GetRandomPoint(RoomCenter, RoomRadius, Point); - if (Creature* Tornado = me->GetMap()->SummonCreature(NPC_SAND_VORTEX, Point)) - Tornado->CastSpell(Tornado, SPELL_SAND_STORM, true); - } - - SpawnNextCrystal(); - } - - void KilledUnit(Unit* /*victim*/) - { - Talk(SAY_SLAY); - } - - void EnterEvadeMode() - { - Cleanup(); - summons.DespawnAll(); - BossAI::EnterEvadeMode(); - } - - void JustDied(Unit* /*killer*/) - { - Cleanup(); - _JustDied(); - } - - void Cleanup() - { - if (GameObject* Crystal = me->GetMap()->GetGameObject(CrystalGUID)) - Crystal->Use(me); - } - - void SpawnNextCrystal() - { - if (CrystalIterator == NUM_CRYSTALS) - CrystalIterator = 0; - - if (Creature* Trigger = me->GetMap()->SummonCreature(NPC_OSSIRIAN_TRIGGER, CrystalCoordinates[CrystalIterator])) - { - TriggerGUID = Trigger->GetGUID(); - if (GameObject* Crystal = Trigger->SummonGameObject(GO_OSSIRIAN_CRYSTAL, - CrystalCoordinates[CrystalIterator].GetPositionX(), - CrystalCoordinates[CrystalIterator].GetPositionY(), - CrystalCoordinates[CrystalIterator].GetPositionZ(), - 0, 0, 0, 0, 0, uint32(-1))) - { - CrystalGUID = Crystal->GetGUID(); - ++CrystalIterator; - Crystal->SetOwnerGUID(0); - } + case EVENT_SILENCE: + DoCast(me, SPELL_SILENCE); + events.ScheduleEvent(EVENT_SILENCE, urand(20000, 30000)); + break; + case EVENT_CYCLONE: + DoCastVictim(SPELL_CYCLONE); + events.ScheduleEvent(EVENT_CYCLONE, 20000); + break; + case EVENT_STOMP: + DoCast(me, SPELL_STOMP); + events.ScheduleEvent(EVENT_STOMP, 30000); + break; + default: + break; } } - void MoveInLineOfSight(Unit* who) - - { - if (!SaidIntro) - { - Talk(SAY_INTRO); - SaidIntro = true; - } - BossAI::MoveInLineOfSight(who); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - // No kiting! - if (me->GetDistance(me->GetVictim()) > 60.00f && me->GetDistance(me->GetVictim()) < 120.00f) - DoCastVictim(SPELL_SUMMON); - - bool ApplySupreme = true; - - if (me->HasAura(SPELL_SUPREME)) - ApplySupreme = false; - else - { - for (uint8 i = 0; i < NUM_WEAKNESS; ++i) - { - if (me->HasAura(SpellWeakness[i])) - { - ApplySupreme = false; - break; - } - } - } - - if (ApplySupreme) - { - DoCast(me, SPELL_SUPREME); - Talk(SAY_SUPREME); - } - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_SILENCE: - DoCast(me, SPELL_SILENCE); - events.ScheduleEvent(EVENT_SILENCE, urand(20000, 30000)); - break; - case EVENT_CYCLONE: - DoCastVictim(SPELL_CYCLONE); - events.ScheduleEvent(EVENT_CYCLONE, 20000); - break; - case EVENT_STOMP: - DoCast(me, SPELL_STOMP); - events.ScheduleEvent(EVENT_STOMP, 30000); - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + DoMeleeAttackIfReady(); } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class go_ossirian_crystal : public GameObjectScript diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp index 422d93491..c63ae2088 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp @@ -28,7 +28,7 @@ enum Yells SAY_CHANGEAGGRO = 10, SAY_KILLS_ANDOROV = 11, SAY_COMPLETE_QUEST = 12 // Yell when realm complete quest 8743 for world event - // Warriors, Captains, continue the fight! Sound: 8640 + // Warriors, Captains, continue the fight! Sound: 8640 }; enum Spells @@ -47,71 +47,71 @@ enum Events class boss_rajaxx : public CreatureScript { - public: - boss_rajaxx() : CreatureScript("boss_rajaxx") { } +public: + boss_rajaxx() : CreatureScript("boss_rajaxx") { } - struct boss_rajaxxAI : public BossAI + struct boss_rajaxxAI : public BossAI + { + boss_rajaxxAI(Creature* creature) : BossAI(creature, DATA_RAJAXX) { - boss_rajaxxAI(Creature* creature) : BossAI(creature, DATA_RAJAXX) - { - } - - void Reset() - { - _Reset(); - enraged = false; - events.ScheduleEvent(EVENT_DISARM, 10000); - events.ScheduleEvent(EVENT_THUNDERCRASH, 12000); - } - - void JustDied(Unit* /*killer*/) - { - //SAY_DEATH - _JustDied(); - } - - void EnterCombat(Unit* /*victim*/) - { - _EnterCombat(); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_DISARM: - DoCastVictim(SPELL_DISARM); - events.ScheduleEvent(EVENT_DISARM, 22000); - break; - case EVENT_THUNDERCRASH: - DoCast(me, SPELL_THUNDERCRASH); - events.ScheduleEvent(EVENT_THUNDERCRASH, 21000); - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); - } - private: - bool enraged; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_rajaxxAI(creature); } + + void Reset() + { + _Reset(); + enraged = false; + events.ScheduleEvent(EVENT_DISARM, 10000); + events.ScheduleEvent(EVENT_THUNDERCRASH, 12000); + } + + void JustDied(Unit* /*killer*/) + { + //SAY_DEATH + _JustDied(); + } + + void EnterCombat(Unit* /*victim*/) + { + _EnterCombat(); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_DISARM: + DoCastVictim(SPELL_DISARM); + events.ScheduleEvent(EVENT_DISARM, 22000); + break; + case EVENT_THUNDERCRASH: + DoCast(me, SPELL_THUNDERCRASH); + events.ScheduleEvent(EVENT_THUNDERCRASH, 21000); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + private: + bool enraged; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_rajaxxAI(creature); + } }; void AddSC_boss_rajaxx() diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/instance_ruins_of_ahnqiraj.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/instance_ruins_of_ahnqiraj.cpp index 2c42e013d..05a7efa90 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/instance_ruins_of_ahnqiraj.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/instance_ruins_of_ahnqiraj.cpp @@ -10,143 +10,143 @@ class instance_ruins_of_ahnqiraj : public InstanceMapScript { - public: - instance_ruins_of_ahnqiraj() : InstanceMapScript("instance_ruins_of_ahnqiraj", 509) { } +public: + instance_ruins_of_ahnqiraj() : InstanceMapScript("instance_ruins_of_ahnqiraj", 509) { } - struct instance_ruins_of_ahnqiraj_InstanceMapScript : public InstanceScript + struct instance_ruins_of_ahnqiraj_InstanceMapScript : public InstanceScript + { + instance_ruins_of_ahnqiraj_InstanceMapScript(Map* map) : InstanceScript(map) { - instance_ruins_of_ahnqiraj_InstanceMapScript(Map* map) : InstanceScript(map) - { - SetBossNumber(NUM_ENCOUNTER); + SetBossNumber(NUM_ENCOUNTER); - _kurinaxxGUID = 0; - _rajaxxGUID = 0; - _moamGUID = 0; - _buruGUID = 0; - _ayamissGUID = 0; - _ossirianGUID = 0; - _paralyzedGUID = 0; - } - - void OnCreatureCreate(Creature* creature) - { - switch (creature->GetEntry()) - { - case NPC_KURINAXX: - _kurinaxxGUID = creature->GetGUID(); - break; - case NPC_RAJAXX: - _rajaxxGUID = creature->GetGUID(); - break; - case NPC_MOAM: - _moamGUID = creature->GetGUID(); - break; - case NPC_BURU: - _buruGUID = creature->GetGUID(); - break; - case NPC_AYAMISS: - _ayamissGUID = creature->GetGUID(); - break; - case NPC_OSSIRIAN: - _ossirianGUID = creature->GetGUID(); - break; - } - } - - bool SetBossState(uint32 bossId, EncounterState state) - { - if (!InstanceScript::SetBossState(bossId, state)) - return false; - - return true; - } - - void SetData64(uint32 type, uint64 data) - { - if (type == DATA_PARALYZED) - _paralyzedGUID = data; - } - - uint64 GetData64(uint32 type) const - { - switch (type) - { - case DATA_KURINNAXX: - return _kurinaxxGUID; - case DATA_RAJAXX: - return _rajaxxGUID; - case DATA_MOAM: - return _moamGUID; - case DATA_BURU: - return _buruGUID; - case DATA_AYAMISS: - return _ayamissGUID; - case DATA_OSSIRIAN: - return _ossirianGUID; - case DATA_PARALYZED: - return _paralyzedGUID; - } - - return 0; - } - - std::string GetSaveData() - { - OUT_SAVE_INST_DATA; - - std::ostringstream saveStream; - saveStream << "R A" << GetBossSaveData(); - - OUT_SAVE_INST_DATA_COMPLETE; - return saveStream.str(); - } - - void Load(char const* data) - { - if (!data) - { - OUT_LOAD_INST_DATA_FAIL; - return; - } - - OUT_LOAD_INST_DATA(data); - - char dataHead1, dataHead2; - - std::istringstream loadStream(data); - loadStream >> dataHead1 >> dataHead2; - - if (dataHead1 == 'R' && dataHead2 == 'A') - { - for (uint8 i = 0; i < NUM_ENCOUNTER; ++i) - { - uint32 tmpState; - loadStream >> tmpState; - if (tmpState == IN_PROGRESS || tmpState > TO_BE_DECIDED) - tmpState = NOT_STARTED; - SetBossState(i, EncounterState(tmpState)); - } - } - else - OUT_LOAD_INST_DATA_FAIL; - - OUT_LOAD_INST_DATA_COMPLETE; - } - - private: - uint64 _kurinaxxGUID; - uint64 _rajaxxGUID; - uint64 _moamGUID; - uint64 _buruGUID; - uint64 _ayamissGUID; - uint64 _ossirianGUID; - uint64 _paralyzedGUID; - }; - - InstanceScript* GetInstanceScript(InstanceMap* map) const - { - return new instance_ruins_of_ahnqiraj_InstanceMapScript(map); + _kurinaxxGUID = 0; + _rajaxxGUID = 0; + _moamGUID = 0; + _buruGUID = 0; + _ayamissGUID = 0; + _ossirianGUID = 0; + _paralyzedGUID = 0; } + + void OnCreatureCreate(Creature* creature) + { + switch (creature->GetEntry()) + { + case NPC_KURINAXX: + _kurinaxxGUID = creature->GetGUID(); + break; + case NPC_RAJAXX: + _rajaxxGUID = creature->GetGUID(); + break; + case NPC_MOAM: + _moamGUID = creature->GetGUID(); + break; + case NPC_BURU: + _buruGUID = creature->GetGUID(); + break; + case NPC_AYAMISS: + _ayamissGUID = creature->GetGUID(); + break; + case NPC_OSSIRIAN: + _ossirianGUID = creature->GetGUID(); + break; + } + } + + bool SetBossState(uint32 bossId, EncounterState state) + { + if (!InstanceScript::SetBossState(bossId, state)) + return false; + + return true; + } + + void SetData64(uint32 type, uint64 data) + { + if (type == DATA_PARALYZED) + _paralyzedGUID = data; + } + + uint64 GetData64(uint32 type) const + { + switch (type) + { + case DATA_KURINNAXX: + return _kurinaxxGUID; + case DATA_RAJAXX: + return _rajaxxGUID; + case DATA_MOAM: + return _moamGUID; + case DATA_BURU: + return _buruGUID; + case DATA_AYAMISS: + return _ayamissGUID; + case DATA_OSSIRIAN: + return _ossirianGUID; + case DATA_PARALYZED: + return _paralyzedGUID; + } + + return 0; + } + + std::string GetSaveData() + { + OUT_SAVE_INST_DATA; + + std::ostringstream saveStream; + saveStream << "R A" << GetBossSaveData(); + + OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); + } + + void Load(char const* data) + { + if (!data) + { + OUT_LOAD_INST_DATA_FAIL; + return; + } + + OUT_LOAD_INST_DATA(data); + + char dataHead1, dataHead2; + + std::istringstream loadStream(data); + loadStream >> dataHead1 >> dataHead2; + + if (dataHead1 == 'R' && dataHead2 == 'A') + { + for (uint8 i = 0; i < NUM_ENCOUNTER; ++i) + { + uint32 tmpState; + loadStream >> tmpState; + if (tmpState == IN_PROGRESS || tmpState > TO_BE_DECIDED) + tmpState = NOT_STARTED; + SetBossState(i, EncounterState(tmpState)); + } + } + else + OUT_LOAD_INST_DATA_FAIL; + + OUT_LOAD_INST_DATA_COMPLETE; + } + + private: + uint64 _kurinaxxGUID; + uint64 _rajaxxGUID; + uint64 _moamGUID; + uint64 _buruGUID; + uint64 _ayamissGUID; + uint64 _ossirianGUID; + uint64 _paralyzedGUID; + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_ruins_of_ahnqiraj_InstanceMapScript(map); + } }; void AddSC_instance_ruins_of_ahnqiraj() diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp index 164bc6696..97fc27614 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp @@ -87,14 +87,16 @@ public: { DoCastVictim(SPELL_CLEAVE); Cleave_Timer = urand(5000, 12000); - } else Cleave_Timer -= diff; + } + else Cleave_Timer -= diff; //ToxicVolley_Timer if (ToxicVolley_Timer <= diff) { DoCastVictim(SPELL_TOXIC_VOLLEY); ToxicVolley_Timer = urand(10000, 15000); - } else ToxicVolley_Timer -= diff; + } + else ToxicVolley_Timer -= diff; if (!HealthAbovePct(5) && !Death) { @@ -113,7 +115,8 @@ public: VemDead = true; } Check_Timer = 2000; - } else Check_Timer -=diff; + } + else Check_Timer -= diff; } DoMeleeAttackIfReady(); @@ -187,7 +190,8 @@ public: } Charge_Timer = urand(8000, 16000); - } else Charge_Timer -= diff; + } + else Charge_Timer -= diff; //KnockBack_Timer if (KnockBack_Timer <= diff) @@ -196,14 +200,16 @@ public: if (DoGetThreat(me->GetVictim())) DoModifyThreatPercent(me->GetVictim(), -80); KnockBack_Timer = urand(15000, 25000); - } else KnockBack_Timer -= diff; + } + else KnockBack_Timer -= diff; //Enrage_Timer if (!Enraged && Enrage_Timer <= diff) { DoCast(me, SPELL_ENRAGE); Enraged = true; - } else Charge_Timer -= diff; + } + else Charge_Timer -= diff; DoMeleeAttackIfReady(); } @@ -277,7 +283,8 @@ public: DoCastVictim(SPELL_FEAR); DoResetThreat(); Fear_Timer = 20000; - } else Fear_Timer -= diff; + } + else Fear_Timer -= diff; //Casting Heal to other twins or herself. if (Heal_Timer <= diff) @@ -297,8 +304,9 @@ public: break; } - Heal_Timer = 15000+rand()%15000; - } else Heal_Timer -= diff; + Heal_Timer = 15000 + rand() % 15000; + } + else Heal_Timer -= diff; //Checking if Vem is dead. If yes we will enrage. if (Check_Timer <= diff) @@ -312,7 +320,8 @@ public: } } Check_Timer = 2000; - } else Check_Timer -= diff; + } + else Check_Timer -= diff; DoMeleeAttackIfReady(); } diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp index e8a6e771c..9e46a82ca 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp @@ -195,7 +195,7 @@ public: instance->SetData(DATA_CTHUN_PHASE, PHASE_NOT_STARTED); //to avoid having a following void zone - Creature* pPortal= me->FindNearestCreature(NPC_CTHUN_PORTAL, 10); + Creature* pPortal = me->FindNearestCreature(NPC_CTHUN_PORTAL, 10); if (pPortal) pPortal->SetReactState(REACT_PASSIVE); } @@ -238,7 +238,8 @@ public: SpawnEyeTentacle(-10, 10); // south east EyeTentacleTimer = 45000; - } else EyeTentacleTimer -= diff; + } + else EyeTentacleTimer -= diff; } switch (currentPhase) @@ -259,7 +260,8 @@ public: //Beam every 3 seconds BeamTimer = 3000; - } else BeamTimer -= diff; + } + else BeamTimer -= diff; //ClawTentacleTimer if (ClawTentacleTimer <= diff) @@ -277,7 +279,8 @@ public: //One claw tentacle every 12.5 seconds ClawTentacleTimer = 12500; - } else ClawTentacleTimer -= diff; + } + else ClawTentacleTimer -= diff; //PhaseTimer if (PhaseTimer <= diff) @@ -312,7 +315,8 @@ public: //Darkbeam for 35 seconds PhaseTimer = 35000; - } else PhaseTimer -= diff; + } + else PhaseTimer -= diff; break; @@ -343,7 +347,8 @@ public: //1 second per tick DarkGlareTickTimer = 1000; - } else DarkGlareTickTimer -= diff; + } + else DarkGlareTickTimer -= diff; } //PhaseTimer @@ -366,7 +371,8 @@ public: //Eye Beam for 50 seconds PhaseTimer = 50000; - } else PhaseTimer -= diff; + } + else PhaseTimer -= diff; break; @@ -380,7 +386,7 @@ public: //Dead phase case PHASE_CTHUN_DONE: - Creature* pPortal= me->FindNearestCreature(NPC_CTHUN_PORTAL, 10); + Creature* pPortal = me->FindNearestCreature(NPC_CTHUN_PORTAL, 10); if (pPortal) pPortal->DespawnOrUnsummon(); @@ -389,7 +395,7 @@ public: } } - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) { switch (instance->GetData(DATA_CTHUN_PHASE)) { @@ -575,7 +581,7 @@ public: return; //Play random sound to the zone - Map::PlayerList const &PlayerList = map->GetPlayers(); + Map::PlayerList const& PlayerList = map->GetPlayers(); if (!PlayerList.isEmpty()) { @@ -588,7 +594,8 @@ public: //One random wisper every 90 - 300 seconds WisperTimer = urand(90000, 300000); - } else WisperTimer -= diff; + } + else WisperTimer -= diff; return; } @@ -613,7 +620,8 @@ public: SpawnEyeTentacle(-10, 10); // south east EyeTentacleTimer = 30000; // every 30sec in phase 2 - } else EyeTentacleTimer -= diff; + } + else EyeTentacleTimer -= diff; } switch (currentPhase) @@ -656,7 +664,8 @@ public: } PhaseTimer = 0; - } else PhaseTimer -= diff; + } + else PhaseTimer -= diff; break; @@ -687,7 +696,7 @@ public: if (unit && i->second == true) { //Teleport each player out - DoTeleportPlayer(unit, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+10, float(rand()%6)); + DoTeleportPlayer(unit, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 10, float(rand() % 6)); //Cast knockback on them DoCast(unit, SPELL_EXIT_STOMACH_KNOCKBACK, true); @@ -724,7 +733,7 @@ public: if (unit->IsWithinDist3d(&KickPos, 15.0f)) { //Teleport each player out - DoTeleportPlayer(unit, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+10, float(rand()%6)); + DoTeleportPlayer(unit, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 10, float(rand() % 6)); //Cast knockback on them DoCast(unit, SPELL_EXIT_STOMACH_KNOCKBACK, true); @@ -739,7 +748,8 @@ public: } StomachAcidTimer = 4000; - } else StomachAcidTimer -= diff; + } + else StomachAcidTimer -= diff; //Stomach Enter Timer if (StomachEnterTimer <= diff) @@ -755,7 +765,8 @@ public: } StomachEnterTimer = 13800; - } else StomachEnterTimer -= diff; + } + else StomachEnterTimer -= diff; if (StomachEnterVisTimer && StomachEnterTarget) { @@ -771,7 +782,8 @@ public: StomachEnterTarget = 0; StomachEnterVisTimer = 0; - } else StomachEnterVisTimer -= diff; + } + else StomachEnterVisTimer -= diff; } //GientClawTentacleTimer @@ -787,7 +799,8 @@ public: //One giant claw tentacle every minute GiantClawTentacleTimer = 60000; - } else GiantClawTentacleTimer -= diff; + } + else GiantClawTentacleTimer -= diff; //GiantEyeTentacleTimer if (GiantEyeTentacleTimer <= diff) @@ -802,7 +815,8 @@ public: //One giant eye tentacle every minute GiantEyeTentacleTimer = 60000; - } else GiantEyeTentacleTimer -= diff; + } + else GiantEyeTentacleTimer -= diff; break; @@ -829,7 +843,8 @@ public: } PhaseTimer = 0; - } else PhaseTimer -= diff; + } + else PhaseTimer -= diff; break; } @@ -840,7 +855,7 @@ public: instance->SetData(DATA_CTHUN_PHASE, PHASE_CTHUN_DONE); } - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) { switch (instance->GetData(DATA_CTHUN_PHASE)) { @@ -938,7 +953,8 @@ public: { Unit::Kill(me, me); return; - } else KillSelfTimer -= diff; + } + else KillSelfTimer -= diff; //MindflayTimer if (MindflayTimer <= diff) @@ -949,7 +965,8 @@ public: //Mindflay every 10 seconds MindflayTimer = 10000; - } else MindflayTimer -= diff; + } + else MindflayTimer -= diff; } }; @@ -1043,7 +1060,8 @@ public: } me->SetVisible(true); - } else EvadeTimer -= diff; + } + else EvadeTimer -= diff; } //GroundRuptureTimer @@ -1051,14 +1069,16 @@ public: { DoCastVictim(SPELL_GROUND_RUPTURE); GroundRuptureTimer = 30000; - } else GroundRuptureTimer -= diff; + } + else GroundRuptureTimer -= diff; //HamstringTimer if (HamstringTimer <= diff) { DoCastVictim(SPELL_HAMSTRING); HamstringTimer = 5000; - } else HamstringTimer -= diff; + } + else HamstringTimer -= diff; DoMeleeAttackIfReady(); } @@ -1156,7 +1176,8 @@ public: AttackStart(target); } me->SetVisible(true); - } else EvadeTimer -= diff; + } + else EvadeTimer -= diff; } //GroundRuptureTimer @@ -1164,21 +1185,24 @@ public: { DoCastVictim(SPELL_GROUND_RUPTURE); GroundRuptureTimer = 30000; - } else GroundRuptureTimer -= diff; + } + else GroundRuptureTimer -= diff; //ThrashTimer if (ThrashTimer <= diff) { DoCastVictim(SPELL_THRASH); ThrashTimer = 10000; - } else ThrashTimer -= diff; + } + else ThrashTimer -= diff; //HamstringTimer if (HamstringTimer <= diff) { DoCastVictim(SPELL_HAMSTRING); HamstringTimer = 10000; - } else HamstringTimer -= diff; + } + else HamstringTimer -= diff; DoMeleeAttackIfReady(); } @@ -1245,7 +1269,8 @@ public: //Beam every 2 seconds BeamTimer = 2100; - } else BeamTimer -= diff; + } + else BeamTimer -= diff; } }; diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp index a923857f0..ade8a0b61 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp @@ -65,18 +65,26 @@ public: if (!victim) return; - Rand = 10 + (rand()%10); - switch (rand()%2) + Rand = 10 + (rand() % 10); + switch (rand() % 2) { - case 0: RandX = 0.0f - Rand; break; - case 1: RandX = 0.0f + Rand; break; + case 0: + RandX = 0.0f - Rand; + break; + case 1: + RandX = 0.0f + Rand; + break; } - Rand = 10 + (rand()%10); - switch (rand()%2) + Rand = 10 + (rand() % 10); + switch (rand() % 2) { - case 0: RandY = 0.0f - Rand; break; - case 1: RandY = 0.0f + Rand; break; + case 0: + RandY = 0.0f - Rand; + break; + case 1: + RandY = 0.0f + Rand; + break; } Rand = 0; Spawn = DoSpawnCreature(15630, RandX, RandY, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); @@ -99,7 +107,8 @@ public: { DoCastVictim(SPELL_MORTAL_WOUND); MortalWound_Timer = urand(10000, 20000); - } else MortalWound_Timer -= diff; + } + else MortalWound_Timer -= diff; //Summon 1-3 Spawns of Fankriss at random time. if (SpawnSpawns_Timer <= diff) @@ -120,7 +129,8 @@ public: break; } SpawnSpawns_Timer = urand(30000, 60000); - } else SpawnSpawns_Timer -= diff; + } + else SpawnSpawns_Timer -= diff; // Teleporting Random Target to one of the three tunnels and spawn 4 hatchlings near the gamer. //We will only telport if fankriss has more than 3% of hp so teleported gamers can always loot. @@ -139,53 +149,54 @@ public: { case 0: DoTeleportPlayer(target, -8106.0142f, 1289.2900f, -74.419533f, 5.112f); - Hatchling = me->SummonCreature(15962, target->GetPositionX()-3, target->GetPositionY()-3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); + Hatchling = me->SummonCreature(15962, target->GetPositionX() - 3, target->GetPositionY() - 3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) Hatchling->AI()->AttackStart(target); - Hatchling = me->SummonCreature(15962, target->GetPositionX()-3, target->GetPositionY()+3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); + Hatchling = me->SummonCreature(15962, target->GetPositionX() - 3, target->GetPositionY() + 3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) Hatchling->AI()->AttackStart(target); - Hatchling = me->SummonCreature(15962, target->GetPositionX()-5, target->GetPositionY()-5, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); + Hatchling = me->SummonCreature(15962, target->GetPositionX() - 5, target->GetPositionY() - 5, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) Hatchling->AI()->AttackStart(target); - Hatchling = me->SummonCreature(15962, target->GetPositionX()-5, target->GetPositionY()+5, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); + Hatchling = me->SummonCreature(15962, target->GetPositionX() - 5, target->GetPositionY() + 5, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) Hatchling->AI()->AttackStart(target); break; case 1: DoTeleportPlayer(target, -7990.135354f, 1155.1907f, -78.849319f, 2.608f); - Hatchling = me->SummonCreature(15962, target->GetPositionX()-3, target->GetPositionY()-3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); + Hatchling = me->SummonCreature(15962, target->GetPositionX() - 3, target->GetPositionY() - 3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) Hatchling->AI()->AttackStart(target); - Hatchling = me->SummonCreature(15962, target->GetPositionX()-3, target->GetPositionY()+3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); + Hatchling = me->SummonCreature(15962, target->GetPositionX() - 3, target->GetPositionY() + 3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) Hatchling->AI()->AttackStart(target); - Hatchling = me->SummonCreature(15962, target->GetPositionX()-5, target->GetPositionY()-5, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); + Hatchling = me->SummonCreature(15962, target->GetPositionX() - 5, target->GetPositionY() - 5, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) Hatchling->AI()->AttackStart(target); - Hatchling = me->SummonCreature(15962, target->GetPositionX()-5, target->GetPositionY()+5, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); + Hatchling = me->SummonCreature(15962, target->GetPositionX() - 5, target->GetPositionY() + 5, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) Hatchling->AI()->AttackStart(target); break; case 2: DoTeleportPlayer(target, -8159.7753f, 1127.9064f, -76.868660f, 0.675f); - Hatchling = me->SummonCreature(15962, target->GetPositionX()-3, target->GetPositionY()-3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); + Hatchling = me->SummonCreature(15962, target->GetPositionX() - 3, target->GetPositionY() - 3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) Hatchling->AI()->AttackStart(target); - Hatchling = me->SummonCreature(15962, target->GetPositionX()-3, target->GetPositionY()+3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); + Hatchling = me->SummonCreature(15962, target->GetPositionX() - 3, target->GetPositionY() + 3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) Hatchling->AI()->AttackStart(target); - Hatchling = me->SummonCreature(15962, target->GetPositionX()-5, target->GetPositionY()-5, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); + Hatchling = me->SummonCreature(15962, target->GetPositionX() - 5, target->GetPositionY() - 5, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) Hatchling->AI()->AttackStart(target); - Hatchling = me->SummonCreature(15962, target->GetPositionX()-5, target->GetPositionY()+5, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); + Hatchling = me->SummonCreature(15962, target->GetPositionX() - 5, target->GetPositionY() + 5, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) Hatchling->AI()->AttackStart(target); break; } } SpawnHatchlings_Timer = urand(45000, 60000); - } else SpawnHatchlings_Timer -= diff; + } + else SpawnHatchlings_Timer -= diff; } DoMeleeAttackIfReady(); diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp index 2c4da03ea..e060a8b32 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp @@ -82,7 +82,8 @@ public: Frenzy = true; PoisonBolt_Timer = 3000; Frenzy_Timer = urand(25000, 35000); - } else Frenzy_Timer -= diff; + } + else Frenzy_Timer -= diff; // Wyvern Timer if (Wyvern_Timer <= diff) @@ -90,21 +91,24 @@ public: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) DoCast(target, SPELL_WYVERNSTING); Wyvern_Timer = urand(15000, 32000); - } else Wyvern_Timer -= diff; + } + else Wyvern_Timer -= diff; //Spit Timer if (Spit_Timer <= diff) { DoCastVictim(SPELL_ACIDSPIT); Spit_Timer = urand(5000, 10000); - } else Spit_Timer -= diff; + } + else Spit_Timer -= diff; //NoxiousPoison_Timer if (NoxiousPoison_Timer <= diff) { DoCastVictim(SPELL_NOXIOUSPOISON); NoxiousPoison_Timer = urand(12000, 24000); - } else NoxiousPoison_Timer -= diff; + } + else NoxiousPoison_Timer -= diff; //PoisonBolt only if frenzy or berserk if (Frenzy || Berserk) @@ -113,7 +117,8 @@ public: { DoCastVictim(SPELL_POISONBOLT); PoisonBolt_Timer = 3000; - } else PoisonBolt_Timer -= diff; + } + else PoisonBolt_Timer -= diff; } //FrenzyBack_Timer @@ -122,7 +127,8 @@ public: me->InterruptNonMeleeSpells(false); Frenzy = false; FrenzyBack_Timer = 15000; - } else FrenzyBack_Timer -= diff; + } + else FrenzyBack_Timer -= diff; if (!Berserk && HealthBelowPct(31)) { diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp index ce4b0babd..ab470be0d 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp @@ -77,14 +77,16 @@ public: { DoCastVictim(SPELL_SWEEP); Sweep_Timer = urand(15000, 30000); - } else Sweep_Timer -= diff; + } + else Sweep_Timer -= diff; //SandBlast_Timer if (!Submerged && SandBlast_Timer <= diff) { DoCastVictim(SPELL_SANDBLAST); SandBlast_Timer = urand(20000, 35000); - } else SandBlast_Timer -= diff; + } + else SandBlast_Timer -= diff; //Submerge_Timer if (!Submerged && Submerge_Timer <= diff) @@ -97,7 +99,8 @@ public: Submerged = true; Back_Timer = urand(30000, 45000); - } else Submerge_Timer -= diff; + } + else Submerge_Timer -= diff; //ChangeTarget_Timer if (Submerged && ChangeTarget_Timer <= diff) @@ -109,7 +112,8 @@ public: me->NearTeleportTo(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), me->GetOrientation()); ChangeTarget_Timer = urand(10000, 20000); - } else ChangeTarget_Timer -= diff; + } + else ChangeTarget_Timer -= diff; //Back_Timer if (Submerged && Back_Timer <= diff) @@ -121,7 +125,8 @@ public: Submerged = false; Submerge_Timer = urand(60000, 120000); - } else Back_Timer -= diff; + } + else Back_Timer -= diff; DoMeleeAttackIfReady(); } diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp index 622fa5592..bc0364b67 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp @@ -24,7 +24,7 @@ enum Sartura SPELL_ENRAGE = 28747, //Not sure if right ID. SPELL_ENRAGEHARD = 28798, -//Guard Spell + //Guard Spell SPELL_WHIRLWINDADD = 26038, SPELL_KNOCKBACK = 26027 }; @@ -62,7 +62,7 @@ public: WhirlWindEnd_Timer = 15000; AggroReset_Timer = urand(45000, 55000); AggroResetEnd_Timer = 5000; - EnrageHard_Timer = 10*60000; + EnrageHard_Timer = 10 * 60000; WhirlWind = false; AggroReset = false; @@ -76,15 +76,15 @@ public: Talk(SAY_AGGRO); } - void JustDied(Unit* /*killer*/) - { - Talk(SAY_DEATH); - } + void JustDied(Unit* /*killer*/) + { + Talk(SAY_DEATH); + } - void KilledUnit(Unit* /*victim*/) - { - Talk(SAY_SLAY); - } + void KilledUnit(Unit* /*victim*/) + { + Talk(SAY_SLAY); + } void UpdateAI(uint32 diff) { @@ -104,13 +104,15 @@ public: AttackStart(target); } WhirlWindRandom_Timer = urand(3000, 7000); - } else WhirlWindRandom_Timer -= diff; + } + else WhirlWindRandom_Timer -= diff; if (WhirlWindEnd_Timer <= diff) { WhirlWind = false; WhirlWind_Timer = urand(25000, 40000); - } else WhirlWindEnd_Timer -= diff; + } + else WhirlWindEnd_Timer -= diff; } if (!WhirlWind) @@ -120,7 +122,8 @@ public: DoCast(me, SPELL_WHIRLWIND); WhirlWind = true; WhirlWindEnd_Timer = 15000; - } else WhirlWind_Timer -= diff; + } + else WhirlWind_Timer -= diff; if (AggroReset_Timer <= diff) { @@ -133,7 +136,8 @@ public: } AggroReset = true; AggroReset_Timer = urand(2000, 5000); - } else AggroReset_Timer -= diff; + } + else AggroReset_Timer -= diff; if (AggroReset) { @@ -142,7 +146,8 @@ public: AggroReset = false; AggroResetEnd_Timer = 5000; AggroReset_Timer = urand(35000, 45000); - } else AggroResetEnd_Timer -= diff; + } + else AggroResetEnd_Timer -= diff; } //If she is 20% enrage @@ -162,7 +167,8 @@ public: { DoCast(me, SPELL_ENRAGEHARD); EnragedHard = true; - } else EnrageHard_Timer -= diff; + } + else EnrageHard_Timer -= diff; } DoMeleeAttackIfReady(); @@ -225,7 +231,8 @@ public: WhirlWind = true; WhirlWind_Timer = urand(25000, 40000); WhirlWindEnd_Timer = 15000; - } else WhirlWind_Timer -= diff; + } + else WhirlWind_Timer -= diff; if (WhirlWind) { @@ -240,12 +247,14 @@ public: } WhirlWindRandom_Timer = urand(3000, 7000); - } else WhirlWindRandom_Timer -= diff; + } + else WhirlWindRandom_Timer -= diff; if (WhirlWindEnd_Timer <= diff) { WhirlWind = false; - } else WhirlWindEnd_Timer -= diff; + } + else WhirlWindEnd_Timer -= diff; } if (!WhirlWind) @@ -262,13 +271,15 @@ public: AggroReset = true; AggroReset_Timer = urand(2000, 5000); - } else AggroReset_Timer -= diff; + } + else AggroReset_Timer -= diff; if (KnockBack_Timer <= diff) { DoCast(me, SPELL_WHIRLWINDADD); KnockBack_Timer = urand(10000, 20000); - } else KnockBack_Timer -= diff; + } + else KnockBack_Timer -= diff; } if (AggroReset) @@ -278,7 +289,8 @@ public: AggroReset = false; AggroResetEnd_Timer = 5000; AggroReset_Timer = urand(30000, 40000); - } else AggroResetEnd_Timer -= diff; + } + else AggroResetEnd_Timer -= diff; } DoMeleeAttackIfReady(); diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp index e714a369e..ba8f164a8 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp @@ -38,144 +38,144 @@ uint32 const BlinkSpells[3] = { 4801, 8195, 20449 }; class boss_skeram : public CreatureScript { - public: - boss_skeram() : CreatureScript("boss_skeram") { } +public: + boss_skeram() : CreatureScript("boss_skeram") { } - struct boss_skeramAI : public BossAI + struct boss_skeramAI : public BossAI + { + boss_skeramAI(Creature* creature) : BossAI(creature, DATA_SKERAM) { } + + void Reset() { - boss_skeramAI(Creature* creature) : BossAI(creature, DATA_SKERAM) { } + _flag = 0; + _hpct = 75.0f; + me->SetVisible(true); + } - void Reset() + void KilledUnit(Unit* /*victim*/) + { + Talk(SAY_SLAY); + } + + void EnterEvadeMode() + { + ScriptedAI::EnterEvadeMode(); + if (me->IsSummon()) + ((TempSummon*)me)->UnSummon(); + } + + void JustSummoned(Creature* creature) + { + // Shift the boss and images (Get it? *Shift*?) + uint8 rand = 0; + if (_flag != 0) { - _flag = 0; - _hpct = 75.0f; - me->SetVisible(true); - } - - void KilledUnit(Unit* /*victim*/) - { - Talk(SAY_SLAY); - } - - void EnterEvadeMode() - { - ScriptedAI::EnterEvadeMode(); - if (me->IsSummon()) - ((TempSummon*)me)->UnSummon(); - } - - void JustSummoned(Creature* creature) - { - // Shift the boss and images (Get it? *Shift*?) - uint8 rand = 0; - if (_flag != 0) - { - while (_flag & (1 << rand)) - rand = urand(0, 2); - DoCast(me, BlinkSpells[rand]); - _flag |= (1 << rand); - _flag |= (1 << 7); - } - while (_flag & (1 << rand)) rand = urand(0, 2); - creature->CastSpell(creature, BlinkSpells[rand]); + DoCast(me, BlinkSpells[rand]); _flag |= (1 << rand); - - if (_flag & (1 << 7)) - _flag = 0; - - if (Unit* Target = SelectTarget(SELECT_TARGET_RANDOM)) - creature->AI()->AttackStart(Target); - - float ImageHealthPct; - - if (me->GetHealthPct() < 25.0f) - ImageHealthPct = 0.50f; - else if (me->GetHealthPct() < 50.0f) - ImageHealthPct = 0.20f; - else - ImageHealthPct = 0.10f; - - creature->SetMaxHealth(me->GetMaxHealth() * ImageHealthPct); - creature->SetHealth(creature->GetMaxHealth() * (me->GetHealthPct() / 100.0f)); + _flag |= (1 << 7); } - void JustDied(Unit* /*killer*/) + while (_flag & (1 << rand)) + rand = urand(0, 2); + creature->CastSpell(creature, BlinkSpells[rand]); + _flag |= (1 << rand); + + if (_flag & (1 << 7)) + _flag = 0; + + if (Unit* Target = SelectTarget(SELECT_TARGET_RANDOM)) + creature->AI()->AttackStart(Target); + + float ImageHealthPct; + + if (me->GetHealthPct() < 25.0f) + ImageHealthPct = 0.50f; + else if (me->GetHealthPct() < 50.0f) + ImageHealthPct = 0.20f; + else + ImageHealthPct = 0.10f; + + creature->SetMaxHealth(me->GetMaxHealth() * ImageHealthPct); + creature->SetHealth(creature->GetMaxHealth() * (me->GetHealthPct() / 100.0f)); + } + + void JustDied(Unit* /*killer*/) + { + if (!me->IsSummon()) + Talk(SAY_DEATH); + else + me->RemoveCorpse(); + } + + void EnterCombat(Unit* /*who*/) + { + _EnterCombat(); + events.Reset(); + + events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, urand(6000, 12000)); + events.ScheduleEvent(EVENT_FULLFILMENT, 15000); + events.ScheduleEvent(EVENT_BLINK, urand(30000, 45000)); + events.ScheduleEvent(EVENT_EARTH_SHOCK, 2000); + + Talk(SAY_AGGRO); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + while (uint32 eventId = events.ExecuteEvent()) { - if (!me->IsSummon()) - Talk(SAY_DEATH); - else - me->RemoveCorpse(); - } - - void EnterCombat(Unit* /*who*/) - { - _EnterCombat(); - events.Reset(); - - events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, urand(6000, 12000)); - events.ScheduleEvent(EVENT_FULLFILMENT, 15000); - events.ScheduleEvent(EVENT_BLINK, urand(30000, 45000)); - events.ScheduleEvent(EVENT_EARTH_SHOCK, 2000); - - Talk(SAY_AGGRO); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - while (uint32 eventId = events.ExecuteEvent()) + switch (eventId) { - switch (eventId) - { - case EVENT_ARCANE_EXPLOSION: - DoCastAOE(SPELL_ARCANE_EXPLOSION, true); - events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, urand(8000, 18000)); - break; - case EVENT_FULLFILMENT: - /// @todo For some weird reason boss does not cast this - // Spell actually works, tested in duel - DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true), SPELL_TRUE_FULFILLMENT, true); - events.ScheduleEvent(EVENT_FULLFILMENT, urand(20000, 30000)); - break; - case EVENT_BLINK: - DoCast(me, BlinkSpells[urand(0, 2)]); - DoResetThreat(); - me->SetVisible(true); - events.ScheduleEvent(EVENT_BLINK, urand(10000, 30000)); - break; - case EVENT_EARTH_SHOCK: - DoCastVictim(SPELL_EARTH_SHOCK); - events.ScheduleEvent(EVENT_EARTH_SHOCK, 2000); - break; - } - } - - if (!me->IsSummon() && me->GetHealthPct() < _hpct) - { - DoCast(me, SPELL_SUMMON_IMAGES); - Talk(SAY_SPLIT); - _hpct -= 25.0f; - me->SetVisible(false); - events.RescheduleEvent(EVENT_BLINK, 2000); - } - - if (me->IsWithinMeleeRange(me->GetVictim())) - { - events.RescheduleEvent(EVENT_EARTH_SHOCK, 2000); - DoMeleeAttackIfReady(); + case EVENT_ARCANE_EXPLOSION: + DoCastAOE(SPELL_ARCANE_EXPLOSION, true); + events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, urand(8000, 18000)); + break; + case EVENT_FULLFILMENT: + /// @todo For some weird reason boss does not cast this + // Spell actually works, tested in duel + DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true), SPELL_TRUE_FULFILLMENT, true); + events.ScheduleEvent(EVENT_FULLFILMENT, urand(20000, 30000)); + break; + case EVENT_BLINK: + DoCast(me, BlinkSpells[urand(0, 2)]); + DoResetThreat(); + me->SetVisible(true); + events.ScheduleEvent(EVENT_BLINK, urand(10000, 30000)); + break; + case EVENT_EARTH_SHOCK: + DoCastVictim(SPELL_EARTH_SHOCK); + events.ScheduleEvent(EVENT_EARTH_SHOCK, 2000); + break; } } - private: - float _hpct; - uint8 _flag; - }; + if (!me->IsSummon() && me->GetHealthPct() < _hpct) + { + DoCast(me, SPELL_SUMMON_IMAGES); + Talk(SAY_SPLIT); + _hpct -= 25.0f; + me->SetVisible(false); + events.RescheduleEvent(EVENT_BLINK, 2000); + } + + if (me->IsWithinMeleeRange(me->GetVictim())) + { + events.RescheduleEvent(EVENT_EARTH_SHOCK, 2000); + DoMeleeAttackIfReady(); + } + } + + private: + float _hpct; + uint8 _flag; + }; CreatureAI* GetAI(Creature* creature) const { @@ -185,28 +185,28 @@ class boss_skeram : public CreatureScript class spell_skeram_arcane_explosion : public SpellScriptLoader { - public: - spell_skeram_arcane_explosion() : SpellScriptLoader("spell_skeram_arcane_explosion") { } +public: + spell_skeram_arcane_explosion() : SpellScriptLoader("spell_skeram_arcane_explosion") { } - class spell_skeram_arcane_explosion_SpellScript : public SpellScript + class spell_skeram_arcane_explosion_SpellScript : public SpellScript + { + PrepareSpellScript(spell_skeram_arcane_explosion_SpellScript); + + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_skeram_arcane_explosion_SpellScript); - - void FilterTargets(std::list& targets) - { - targets.remove_if(PlayerOrPetCheck()); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_skeram_arcane_explosion_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_skeram_arcane_explosion_SpellScript(); + targets.remove_if(PlayerOrPetCheck()); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_skeram_arcane_explosion_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_skeram_arcane_explosion_SpellScript(); + } }; void AddSC_boss_skeram() diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp index d5bd660cc..d44866e72 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp @@ -86,7 +86,7 @@ struct boss_twinemperorsAI : public ScriptedAI BugsTimer = 2000; me->ClearUnitState(UNIT_STATE_STUNNED); DontYellWhenDead = false; - EnrageTimer = 15*60000; + EnrageTimer = 15 * 60000; } Creature* GetOtherBoss() @@ -94,14 +94,14 @@ struct boss_twinemperorsAI : public ScriptedAI return ObjectAccessor::GetCreature(*me, instance->GetData64(IAmVeklor() ? DATA_VEKNILASH : DATA_VEKLOR)); } - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) { Unit* pOtherBoss = GetOtherBoss(); if (pOtherBoss) { float dPercent = ((float)damage) / ((float)me->GetMaxHealth()); int odmg = (int)(dPercent * ((float)pOtherBoss->GetMaxHealth())); - int ohealth = pOtherBoss->GetHealth()-odmg; + int ohealth = pOtherBoss->GetHealth() - odmg; pOtherBoss->SetHealth(ohealth > 0 ? ohealth : 0); if (ohealth <= 0) { @@ -161,18 +161,18 @@ struct boss_twinemperorsAI : public ScriptedAI uint32 mytotal = me->GetMaxHealth(), histotal = pOtherBoss->GetMaxHealth(); float mult = ((float)mytotal) / ((float)histotal); if (mult < 1) - mult = 1.0f/mult; - #define HEAL_BROTHER_AMOUNT 30000.0f + mult = 1.0f / mult; +#define HEAL_BROTHER_AMOUNT 30000.0f uint32 largerAmount = (uint32)((HEAL_BROTHER_AMOUNT * mult) - HEAL_BROTHER_AMOUNT); if (mytotal > histotal) { - uint32 h = me->GetHealth()+largerAmount; + uint32 h = me->GetHealth() + largerAmount; me->SetHealth(std::min(mytotal, h)); } else { - uint32 h = pOtherBoss->GetHealth()+largerAmount; + uint32 h = pOtherBoss->GetHealth() + largerAmount; pOtherBoss->SetHealth(std::min(histotal, h)); } } @@ -190,7 +190,8 @@ struct boss_twinemperorsAI : public ScriptedAI DoCast(pOtherBoss, SPELL_HEAL_BROTHER); Heal_Timer = 1000; } - } else Heal_Timer -= diff; + } + else Heal_Timer -= diff; } void TeleportToMyBrother() @@ -314,7 +315,7 @@ struct boss_twinemperorsAI : public ScriptedAI } if (c->IsWithinDistInMap(me, ABUSE_BUG_RANGE)) { - if (!nearb || (rand()%4) == 0) + if (!nearb || (rand() % 4) == 0) nearb = c; } } @@ -359,9 +360,11 @@ struct boss_twinemperorsAI : public ScriptedAI if (!me->IsNonMeleeSpellCast(true)) { DoCast(me, SPELL_BERSERK); - EnrageTimer = 60*60000; - } else EnrageTimer = 0; - } else EnrageTimer-=diff; + EnrageTimer = 60 * 60000; + } + else EnrageTimer = 0; + } + else EnrageTimer -= diff; } }; @@ -396,7 +399,7 @@ public: UnbalancingStrike_Timer = urand(8000, 18000); Scarabs_Timer = urand(7000, 14000); - //Added. Can be removed if its included in DB. + //Added. Can be removed if its included in DB. me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, true); } @@ -421,16 +424,18 @@ public: if (UnbalancingStrike_Timer <= diff) { DoCastVictim(SPELL_UNBALANCING_STRIKE); - UnbalancingStrike_Timer = 8000+rand()%12000; - } else UnbalancingStrike_Timer -= diff; + UnbalancingStrike_Timer = 8000 + rand() % 12000; + } + else UnbalancingStrike_Timer -= diff; if (UpperCut_Timer <= diff) { Unit* randomMelee = SelectTarget(SELECT_TARGET_RANDOM, 0, NOMINAL_MELEE_RANGE, true); if (randomMelee) DoCast(randomMelee, SPELL_UPPERCUT); - UpperCut_Timer = 15000+rand()%15000; - } else UpperCut_Timer -= diff; + UpperCut_Timer = 15000 + rand() % 15000; + } + else UpperCut_Timer -= diff; HandleBugs(diff); @@ -441,7 +446,8 @@ public: if (Teleport_Timer <= diff) { TeleportToMyBrother(); - } else Teleport_Timer -= diff; + } + else Teleport_Timer -= diff; CheckEnrage(diff); @@ -517,7 +523,8 @@ public: else DoCastVictim(SPELL_SHADOWBOLT); ShadowBolt_Timer = 2000; - } else ShadowBolt_Timer -= diff; + } + else ShadowBolt_Timer -= diff; //Blizzard_Timer if (Blizzard_Timer <= diff) @@ -526,18 +533,20 @@ public: target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45, true); if (target) DoCast(target, SPELL_BLIZZARD); - Blizzard_Timer = 15000+rand()%15000; - } else Blizzard_Timer -= diff; + Blizzard_Timer = 15000 + rand() % 15000; + } + else Blizzard_Timer -= diff; if (ArcaneBurst_Timer <= diff) { Unit* mvic; - if ((mvic=SelectTarget(SELECT_TARGET_NEAREST, 0, NOMINAL_MELEE_RANGE, true)) != nullptr) + if ((mvic = SelectTarget(SELECT_TARGET_NEAREST, 0, NOMINAL_MELEE_RANGE, true)) != nullptr) { DoCast(mvic, SPELL_ARCANEBURST); ArcaneBurst_Timer = 5000; } - } else ArcaneBurst_Timer -= diff; + } + else ArcaneBurst_Timer -= diff; HandleBugs(diff); @@ -548,7 +557,8 @@ public: if (Teleport_Timer <= diff) { TeleportToMyBrother(); - } else Teleport_Timer -= diff; + } + else Teleport_Timer -= diff; CheckEnrage(diff); diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp index 8f16c7af0..837b6889b 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp @@ -75,217 +75,217 @@ float const RoomRadius = 40.0f; /// @todo Not sure if its correct class boss_viscidus : public CreatureScript { - public: - boss_viscidus() : CreatureScript("boss_viscidus") { } +public: + boss_viscidus() : CreatureScript("boss_viscidus") { } - struct boss_viscidusAI : public BossAI + struct boss_viscidusAI : public BossAI + { + boss_viscidusAI(Creature* creature) : BossAI(creature, DATA_VISCIDUS) { } + + void Reset() { - boss_viscidusAI(Creature* creature) : BossAI(creature, DATA_VISCIDUS) { } + _Reset(); + _hitcounter = 0; + _phase = PHASE_FROST; + } - void Reset() + void DamageTaken(Unit* attacker, uint32& /*damage*/, DamageEffectType, SpellSchoolMask) + { + if (!attacker || _phase != PHASE_MELEE) + return; + + ++_hitcounter; + + if (attacker->HasUnitState(UNIT_STATE_MELEE_ATTACKING) && _hitcounter >= HITCOUNTER_EXPLODE) { - _Reset(); - _hitcounter = 0; - _phase = PHASE_FROST; + Talk(EMOTE_EXPLODE); + events.Reset(); + _phase = PHASE_GLOB; + DoCast(me, SPELL_VISCIDUS_EXPLODE); + me->SetVisible(false); + me->RemoveAura(SPELL_TOXIN); + me->RemoveAura(SPELL_VISCIDUS_FREEZE); + + uint8 NumGlobes = me->GetHealthPct() / 5.0f; + for (uint8 i = 0; i < NumGlobes; ++i) + { + float Angle = i * 2 * M_PI / NumGlobes; + float X = ViscidusCoord.GetPositionX() + std::cos(Angle) * RoomRadius; + float Y = ViscidusCoord.GetPositionY() + std::sin(Angle) * RoomRadius; + float Z = -35.0f; + + if (TempSummon* Glob = me->SummonCreature(NPC_GLOB_OF_VISCIDUS, X, Y, Z)) + { + Glob->UpdateAllowedPositionZ(X, Y, Z); + Glob->NearTeleportTo(X, Y, Z, 0.0f); + Glob->GetMotionMaster()->MovePoint(ROOM_CENTER, ViscidusCoord); + } + } } + else if (_hitcounter == HITCOUNTER_SHATTER) + Talk(EMOTE_SHATTER); + else if (_hitcounter == HITCOUNTER_CRACK) + Talk(EMOTE_CRACK); + } - void DamageTaken(Unit* attacker, uint32& /*damage*/, DamageEffectType, SpellSchoolMask) + void SpellHit(Unit* /*caster*/, SpellInfo const* spell) + { + if ((spell->GetSchoolMask() & SPELL_SCHOOL_MASK_FROST) && _phase == PHASE_FROST && me->GetHealthPct() > 5.0f) { - if (!attacker || _phase != PHASE_MELEE) - return; - ++_hitcounter; - if (attacker->HasUnitState(UNIT_STATE_MELEE_ATTACKING) && _hitcounter >= HITCOUNTER_EXPLODE) + if (_hitcounter >= HITCOUNTER_FREEZE) { - Talk(EMOTE_EXPLODE); - events.Reset(); - _phase = PHASE_GLOB; - DoCast(me, SPELL_VISCIDUS_EXPLODE); - me->SetVisible(false); - me->RemoveAura(SPELL_TOXIN); - me->RemoveAura(SPELL_VISCIDUS_FREEZE); - - uint8 NumGlobes = me->GetHealthPct() / 5.0f; - for (uint8 i = 0; i < NumGlobes; ++i) - { - float Angle = i * 2 * M_PI / NumGlobes; - float X = ViscidusCoord.GetPositionX() + std::cos(Angle) * RoomRadius; - float Y = ViscidusCoord.GetPositionY() + std::sin(Angle) * RoomRadius; - float Z = -35.0f; - - if (TempSummon* Glob = me->SummonCreature(NPC_GLOB_OF_VISCIDUS, X, Y, Z)) - { - Glob->UpdateAllowedPositionZ(X, Y, Z); - Glob->NearTeleportTo(X, Y, Z, 0.0f); - Glob->GetMotionMaster()->MovePoint(ROOM_CENTER, ViscidusCoord); - } - } - } - else if (_hitcounter == HITCOUNTER_SHATTER) - Talk(EMOTE_SHATTER); - else if (_hitcounter == HITCOUNTER_CRACK) - Talk(EMOTE_CRACK); - } - - void SpellHit(Unit* /*caster*/, SpellInfo const* spell) - { - if ((spell->GetSchoolMask() & SPELL_SCHOOL_MASK_FROST) && _phase == PHASE_FROST && me->GetHealthPct() > 5.0f) - { - ++_hitcounter; - - if (_hitcounter >= HITCOUNTER_FREEZE) - { - _hitcounter = 0; - Talk(EMOTE_FROZEN); - _phase = PHASE_MELEE; - DoCast(me, SPELL_VISCIDUS_FREEZE); - me->RemoveAura(SPELL_VISCIDUS_SLOWED_MORE); - events.ScheduleEvent(EVENT_RESET_PHASE, 15000); - } - else if (_hitcounter >= HITCOUNTER_SLOW_MORE) - { - Talk(EMOTE_FREEZE); - me->RemoveAura(SPELL_VISCIDUS_SLOWED); - DoCast(me, SPELL_VISCIDUS_SLOWED_MORE); - } - else if (_hitcounter >= HITCOUNTER_SLOW) - { - Talk(EMOTE_SLOW); - DoCast(me, SPELL_VISCIDUS_SLOWED); - } - } - } - - void EnterCombat(Unit* /*who*/) - { - _EnterCombat(); - events.Reset(); - InitSpells(); - } - - void InitSpells() - { - DoCast(me, SPELL_TOXIN); - events.ScheduleEvent(EVENT_POISONBOLT_VOLLEY, urand(10000, 15000)); - events.ScheduleEvent(EVENT_POISON_SHOCK, urand(7000, 12000)); - } - - void EnterEvadeMode() - { - summons.DespawnAll(); - ScriptedAI::EnterEvadeMode(); - } - - void JustDied(Unit* /*killer*/) - { - DoCast(me, SPELL_VISCIDUS_SUICIDE); - summons.DespawnAll(); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - if (_phase == PHASE_GLOB && summons.empty()) - { - DoResetThreat(); - me->NearTeleportTo(ViscidusCoord.GetPositionX(), - ViscidusCoord.GetPositionY(), - ViscidusCoord.GetPositionZ(), - ViscidusCoord.GetOrientation()); - _hitcounter = 0; - _phase = PHASE_FROST; - InitSpells(); - me->SetVisible(true); + Talk(EMOTE_FROZEN); + _phase = PHASE_MELEE; + DoCast(me, SPELL_VISCIDUS_FREEZE); + me->RemoveAura(SPELL_VISCIDUS_SLOWED_MORE); + events.ScheduleEvent(EVENT_RESET_PHASE, 15000); } - - events.Update(diff); - - while (uint32 eventId = events.ExecuteEvent()) + else if (_hitcounter >= HITCOUNTER_SLOW_MORE) { - switch (eventId) - { - case EVENT_POISONBOLT_VOLLEY: - DoCast(me, SPELL_POISONBOLT_VOLLEY); - events.ScheduleEvent(EVENT_POISONBOLT_VOLLEY, urand(10000, 15000)); - break; - case EVENT_POISON_SHOCK: - DoCast(me, SPELL_POISON_SHOCK); - events.ScheduleEvent(EVENT_POISON_SHOCK, urand(7000, 12000)); - break; - case EVENT_RESET_PHASE: - _hitcounter = 0; - _phase = PHASE_FROST; - break; - default: - break; - } + Talk(EMOTE_FREEZE); + me->RemoveAura(SPELL_VISCIDUS_SLOWED); + DoCast(me, SPELL_VISCIDUS_SLOWED_MORE); } + else if (_hitcounter >= HITCOUNTER_SLOW) + { + Talk(EMOTE_SLOW); + DoCast(me, SPELL_VISCIDUS_SLOWED); + } + } + } - if (_phase != PHASE_GLOB) - DoMeleeAttackIfReady(); + void EnterCombat(Unit* /*who*/) + { + _EnterCombat(); + events.Reset(); + InitSpells(); + } + + void InitSpells() + { + DoCast(me, SPELL_TOXIN); + events.ScheduleEvent(EVENT_POISONBOLT_VOLLEY, urand(10000, 15000)); + events.ScheduleEvent(EVENT_POISON_SHOCK, urand(7000, 12000)); + } + + void EnterEvadeMode() + { + summons.DespawnAll(); + ScriptedAI::EnterEvadeMode(); + } + + void JustDied(Unit* /*killer*/) + { + DoCast(me, SPELL_VISCIDUS_SUICIDE); + summons.DespawnAll(); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + if (_phase == PHASE_GLOB && summons.empty()) + { + DoResetThreat(); + me->NearTeleportTo(ViscidusCoord.GetPositionX(), + ViscidusCoord.GetPositionY(), + ViscidusCoord.GetPositionZ(), + ViscidusCoord.GetOrientation()); + + _hitcounter = 0; + _phase = PHASE_FROST; + InitSpells(); + me->SetVisible(true); } - private: - uint8 _hitcounter; - Phases _phase; - }; + events.Update(diff); - CreatureAI* GetAI(Creature* creature) const - { - return new boss_viscidusAI(creature); + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_POISONBOLT_VOLLEY: + DoCast(me, SPELL_POISONBOLT_VOLLEY); + events.ScheduleEvent(EVENT_POISONBOLT_VOLLEY, urand(10000, 15000)); + break; + case EVENT_POISON_SHOCK: + DoCast(me, SPELL_POISON_SHOCK); + events.ScheduleEvent(EVENT_POISON_SHOCK, urand(7000, 12000)); + break; + case EVENT_RESET_PHASE: + _hitcounter = 0; + _phase = PHASE_FROST; + break; + default: + break; + } + } + + if (_phase != PHASE_GLOB) + DoMeleeAttackIfReady(); } + + private: + uint8 _hitcounter; + Phases _phase; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_viscidusAI(creature); + } }; class npc_glob_of_viscidus : public CreatureScript { - public: - npc_glob_of_viscidus() : CreatureScript("boss_glob_of_viscidus") { } +public: + npc_glob_of_viscidus() : CreatureScript("boss_glob_of_viscidus") { } - struct npc_glob_of_viscidusAI : public ScriptedAI + struct npc_glob_of_viscidusAI : public ScriptedAI + { + npc_glob_of_viscidusAI(Creature* creature) : ScriptedAI(creature) { } + + void JustDied(Unit* /*killer*/) { - npc_glob_of_viscidusAI(Creature* creature) : ScriptedAI(creature) { } + InstanceScript* Instance = me->GetInstanceScript(); - void JustDied(Unit* /*killer*/) + if (Creature* Viscidus = me->GetMap()->GetCreature(Instance->GetData64(DATA_VISCIDUS))) { - InstanceScript* Instance = me->GetInstanceScript(); + if (BossAI* ViscidusAI = dynamic_cast(Viscidus->GetAI())) + ViscidusAI->SummonedCreatureDespawn(me); - if (Creature* Viscidus = me->GetMap()->GetCreature(Instance->GetData64(DATA_VISCIDUS))) + if (Viscidus->IsAlive() && Viscidus->GetHealthPct() < 5.0f) { - if (BossAI* ViscidusAI = dynamic_cast(Viscidus->GetAI())) - ViscidusAI->SummonedCreatureDespawn(me); - - if (Viscidus->IsAlive() && Viscidus->GetHealthPct() < 5.0f) - { - Viscidus->SetVisible(true); - Unit::Kill(Viscidus->GetVictim(), Viscidus); - } - else - { - Viscidus->SetHealth(Viscidus->GetHealth() - Viscidus->GetMaxHealth() / 20); - Viscidus->CastSpell(Viscidus, SPELL_VISCIDUS_SHRINKS); - } + Viscidus->SetVisible(true); + Unit::Kill(Viscidus->GetVictim(), Viscidus); + } + else + { + Viscidus->SetHealth(Viscidus->GetHealth() - Viscidus->GetMaxHealth() / 20); + Viscidus->CastSpell(Viscidus, SPELL_VISCIDUS_SHRINKS); } } - - void MovementInform(uint32 /*type*/, uint32 id) - { - if (id == ROOM_CENTER) - { - DoCast(me, SPELL_REJOIN_VISCIDUS); - if (TempSummon* summon = me->ToTempSummon()) - summon->UnSummon(); - } - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); } + + void MovementInform(uint32 /*type*/, uint32 id) + { + if (id == ROOM_CENTER) + { + DoCast(me, SPELL_REJOIN_VISCIDUS); + if (TempSummon* summon = me->ToTempSummon()) + summon->UnSummon(); + } + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; void AddSC_boss_viscidus() diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp index 0df4277c9..7ae59f313 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp @@ -17,55 +17,55 @@ EndScriptData */ class instance_temple_of_ahnqiraj : public InstanceMapScript { - public: - instance_temple_of_ahnqiraj() : InstanceMapScript("instance_temple_of_ahnqiraj", 531) { } +public: + instance_temple_of_ahnqiraj() : InstanceMapScript("instance_temple_of_ahnqiraj", 531) { } - InstanceScript* GetInstanceScript(InstanceMap* map) const + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_temple_of_ahnqiraj_InstanceMapScript(map); + } + + struct instance_temple_of_ahnqiraj_InstanceMapScript : public InstanceScript + { + instance_temple_of_ahnqiraj_InstanceMapScript(Map* map) : InstanceScript(map) { } + + //If Vem is dead... + bool IsBossDied[3]; + + //Storing Skeram, Vem and Kri. + uint64 SkeramGUID; + uint64 VemGUID; + uint64 KriGUID; + uint64 VeklorGUID; + uint64 VeknilashGUID; + uint64 ViscidusGUID; + + uint32 BugTrioDeathCount; + + uint32 CthunPhase; + + void Initialize() { - return new instance_temple_of_ahnqiraj_InstanceMapScript(map); + IsBossDied[0] = false; + IsBossDied[1] = false; + IsBossDied[2] = false; + + SkeramGUID = 0; + VemGUID = 0; + KriGUID = 0; + VeklorGUID = 0; + VeknilashGUID = 0; + ViscidusGUID = 0; + + BugTrioDeathCount = 0; + + CthunPhase = 0; } - struct instance_temple_of_ahnqiraj_InstanceMapScript : public InstanceScript + void OnCreatureCreate(Creature* creature) { - instance_temple_of_ahnqiraj_InstanceMapScript(Map* map) : InstanceScript(map) { } - - //If Vem is dead... - bool IsBossDied[3]; - - //Storing Skeram, Vem and Kri. - uint64 SkeramGUID; - uint64 VemGUID; - uint64 KriGUID; - uint64 VeklorGUID; - uint64 VeknilashGUID; - uint64 ViscidusGUID; - - uint32 BugTrioDeathCount; - - uint32 CthunPhase; - - void Initialize() + switch (creature->GetEntry()) { - IsBossDied[0] = false; - IsBossDied[1] = false; - IsBossDied[2] = false; - - SkeramGUID = 0; - VemGUID = 0; - KriGUID = 0; - VeklorGUID = 0; - VeknilashGUID = 0; - ViscidusGUID = 0; - - BugTrioDeathCount = 0; - - CthunPhase = 0; - } - - void OnCreatureCreate(Creature* creature) - { - switch (creature->GetEntry()) - { case NPC_SKERAM: SkeramGUID = creature->GetGUID(); break; @@ -84,19 +84,19 @@ class instance_temple_of_ahnqiraj : public InstanceMapScript case NPC_VISCIDUS: ViscidusGUID = creature->GetGUID(); break; - } } + } - bool IsEncounterInProgress() const - { - //not active in AQ40 - return false; - } + bool IsEncounterInProgress() const + { + //not active in AQ40 + return false; + } - uint32 GetData(uint32 type) const + uint32 GetData(uint32 type) const + { + switch (type) { - switch (type) - { case DATA_VEMISDEAD: if (IsBossDied[0]) return 1; @@ -117,14 +117,14 @@ class instance_temple_of_ahnqiraj : public InstanceMapScript case DATA_CTHUN_PHASE: return CthunPhase; - } - return 0; } + return 0; + } - uint64 GetData64(uint32 identifier) const + uint64 GetData64(uint32 identifier) const + { + switch (identifier) { - switch (identifier) - { case DATA_SKERAM: return SkeramGUID; case DATA_VEM: @@ -137,14 +137,14 @@ class instance_temple_of_ahnqiraj : public InstanceMapScript return VeknilashGUID; case DATA_VISCIDUS: return ViscidusGUID; - } - return 0; - } // end GetData64 + } + return 0; + } // end GetData64 - void SetData(uint32 type, uint32 data) + void SetData(uint32 type, uint32 data) + { + switch (type) { - switch (type) - { case DATA_VEM_DEATH: IsBossDied[0] = true; break; @@ -164,9 +164,9 @@ class instance_temple_of_ahnqiraj : public InstanceMapScript case DATA_CTHUN_PHASE: CthunPhase = data; break; - } } - }; + } + }; }; diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp index 746f7155e..11546ab60 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp @@ -66,15 +66,33 @@ public: { switch (asel) { - case 0: ability = SPELL_MENDING_BUFF;break; - case 1: ability = SPELL_KNOCK_BUFF;break; - case 2: ability = SPELL_MANAB_BUFF;break; - case 3: ability = SPELL_REFLECTAF_BUFF;break; - case 4: ability = SPELL_REFLECTSFr_BUFF;break; - case 5: ability = SPELL_THORNS_BUFF;break; - case 6: ability = SPELL_THUNDER_BUFF;break; - case 7: ability = SPELL_MSTRIKE_BUFF;break; - case 8: ability = SPELL_STORM_BUFF;break; + case 0: + ability = SPELL_MENDING_BUFF; + break; + case 1: + ability = SPELL_KNOCK_BUFF; + break; + case 2: + ability = SPELL_MANAB_BUFF; + break; + case 3: + ability = SPELL_REFLECTAF_BUFF; + break; + case 4: + ability = SPELL_REFLECTSFr_BUFF; + break; + case 5: + ability = SPELL_THORNS_BUFF; + break; + case 6: + ability = SPELL_THUNDER_BUFF; + break; + case 7: + ability = SPELL_MSTRIKE_BUFF; + break; + case 8: + ability = SPELL_STORM_BUFF; + break; } } @@ -96,7 +114,7 @@ public: if (CreatureGUID == me->GetGUID()) return; - for (int i=0; i<3; ++i) + for (int i = 0; i < 3; ++i) { if (NearbyGUID[i] == CreatureGUID) return; @@ -111,7 +129,7 @@ public: void GiveBuddyMyList(Creature* c) { aqsentinelAI* cai = CAST_AI(aqsentinelAI, (c)->AI()); - for (int i=0; i<3; ++i) + for (int i = 0; i < 3; ++i) if (NearbyGUID[i] && NearbyGUID[i] != c->GetGUID()) cai->AddBuddyToList(NearbyGUID[i]); cai->AddBuddyToList(me->GetGUID()); @@ -119,14 +137,14 @@ public: void SendMyListToBuddies() { - for (int i=0; i<3; ++i) + for (int i = 0; i < 3; ++i) if (Creature* pNearby = ObjectAccessor::GetCreature(*me, NearbyGUID[i])) GiveBuddyMyList(pNearby); } void CallBuddiesToAttack(Unit* who) { - for (int i=0; i<3; ++i) + for (int i = 0; i < 3; ++i) { Creature* c = ObjectAccessor::GetCreature(*me, NearbyGUID[i]); if (c) @@ -153,11 +171,11 @@ public: AddBuddyToList((*iter)->GetGUID()); } - int pickAbilityRandom(bool *chosenAbilities) + int pickAbilityRandom(bool* chosenAbilities) { for (int t = 0; t < 2; ++t) { - for (int i = !t ? (rand()%9) : 0; i < 9; ++i) + for (int i = !t ? (rand() % 9) : 0; i < 9; ++i) { if (!chosenAbilities[i]) { @@ -171,8 +189,8 @@ public: void GetOtherSentinels(Unit* who) { - bool *chosenAbilities = new bool[9]; - memset(chosenAbilities, 0, 9*sizeof(bool)); + bool* chosenAbilities = new bool[9]; + memset(chosenAbilities, 0, 9 * sizeof(bool)); selectAbility(pickAbilityRandom(chosenAbilities)); ClearBuddyList(); @@ -205,7 +223,7 @@ public: { if (!me->isDead()) { - for (int i=0; i<3; ++i) + for (int i = 0; i < 3; ++i) { if (!NearbyGUID[i]) continue; @@ -236,7 +254,7 @@ public: void JustDied(Unit* /*killer*/) { - for (int ni=0; ni<3; ++ni) + for (int ni = 0; ni < 3; ++ni) { Creature* sent = ObjectAccessor::GetCreature(*me, NearbyGUID[ni]); if (!sent) diff --git a/src/server/scripts/Kalimdor/WailingCaverns/instance_wailing_caverns.cpp b/src/server/scripts/Kalimdor/WailingCaverns/instance_wailing_caverns.cpp index 4aabc8c14..b6f3bcd57 100644 --- a/src/server/scripts/Kalimdor/WailingCaverns/instance_wailing_caverns.cpp +++ b/src/server/scripts/Kalimdor/WailingCaverns/instance_wailing_caverns.cpp @@ -8,110 +8,110 @@ class instance_wailing_caverns : public InstanceMapScript { - public: - instance_wailing_caverns() : InstanceMapScript("instance_wailing_caverns", 43) { } +public: + instance_wailing_caverns() : InstanceMapScript("instance_wailing_caverns", 43) { } - InstanceScript* GetInstanceScript(InstanceMap* map) const + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_wailing_caverns_InstanceMapScript(map); + } + + struct instance_wailing_caverns_InstanceMapScript : public InstanceScript + { + instance_wailing_caverns_InstanceMapScript(Map* map) : InstanceScript(map) { } + + void Initialize() { - return new instance_wailing_caverns_InstanceMapScript(map); + memset(&_encounters, 0, sizeof(_encounters)); + + DiscipleOfNaralexGUID = 0; + SerpentisGUID = 0; } - struct instance_wailing_caverns_InstanceMapScript : public InstanceScript + void OnCreatureCreate(Creature* creature) { - instance_wailing_caverns_InstanceMapScript(Map* map) : InstanceScript(map) { } + if (creature->GetEntry() == NPC_DISCIPLE_OF_NARALEX) + DiscipleOfNaralexGUID = creature->GetGUID(); + else if (creature->GetEntry() == NPC_LORD_SERPENTIS) + SerpentisGUID = creature->GetGUID(); + } - void Initialize() + void SetData(uint32 type, uint32 data) + { + switch (type) { - memset(&_encounters, 0, sizeof(_encounters)); - - DiscipleOfNaralexGUID = 0; - SerpentisGUID = 0; + case TYPE_LORD_COBRAHN: + case TYPE_LORD_PYTHAS: + case TYPE_LADY_ANACONDRA: + case TYPE_LORD_SERPENTIS: + case TYPE_MUTANUS: + _encounters[type] = data; + break; } - void OnCreatureCreate(Creature* creature) + if (data == DONE) + SaveToDB(); + + if (type == TYPE_LORD_COBRAHN && _encounters[TYPE_LORD_SERPENTIS] != DONE) { - if (creature->GetEntry() == NPC_DISCIPLE_OF_NARALEX) - DiscipleOfNaralexGUID = creature->GetGUID(); - else if (creature->GetEntry() == NPC_LORD_SERPENTIS) - SerpentisGUID = creature->GetGUID(); + instance->LoadGrid(-120.163f, -24.624f); + if (Creature* serpentis = instance->GetCreature(SerpentisGUID)) + serpentis->AI()->Talk(SAY_SERPENTIS); } - void SetData(uint32 type, uint32 data) - { - switch (type) - { - case TYPE_LORD_COBRAHN: - case TYPE_LORD_PYTHAS: - case TYPE_LADY_ANACONDRA: - case TYPE_LORD_SERPENTIS: - case TYPE_MUTANUS: - _encounters[type] = data; - break; - } - - if (data == DONE) - SaveToDB(); - - if (type == TYPE_LORD_COBRAHN && _encounters[TYPE_LORD_SERPENTIS] != DONE) - { - instance->LoadGrid(-120.163f, -24.624f); - if (Creature* serpentis = instance->GetCreature(SerpentisGUID)) - serpentis->AI()->Talk(SAY_SERPENTIS); - } - - if (type != TYPE_MUTANUS && _encounters[TYPE_LORD_COBRAHN] == DONE && _encounters[TYPE_LORD_PYTHAS] == DONE && + if (type != TYPE_MUTANUS && _encounters[TYPE_LORD_COBRAHN] == DONE && _encounters[TYPE_LORD_PYTHAS] == DONE && _encounters[TYPE_LADY_ANACONDRA] == DONE && _encounters[TYPE_LORD_SERPENTIS] == DONE) + { + instance->LoadGrid(-134.97f, 125.402f); + if (Creature* disciple = instance->GetCreature(DiscipleOfNaralexGUID)) + disciple->AI()->Talk(SAY_DISCIPLE); + } + } + + uint32 GetData(uint32 type) const + { + switch (type) + { + case TYPE_LORD_COBRAHN: + case TYPE_LORD_PYTHAS: + case TYPE_LADY_ANACONDRA: + case TYPE_LORD_SERPENTIS: + return _encounters[type]; + } + return 0; + } + + std::string GetSaveData() + { + std::ostringstream saveStream; + saveStream << "W C " << _encounters[0] << ' ' << _encounters[1] << ' ' << _encounters[2] << ' ' << _encounters[3] << ' ' << _encounters[4]; + return saveStream.str(); + } + + void Load(const char* in) + { + if (!in) + return; + + char dataHead1, dataHead2; + std::istringstream loadStream(in); + loadStream >> dataHead1 >> dataHead2; + if (dataHead1 == 'W' && dataHead2 == 'C') + { + for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) { - instance->LoadGrid(-134.97f, 125.402f); - if (Creature* disciple = instance->GetCreature(DiscipleOfNaralexGUID)) - disciple->AI()->Talk(SAY_DISCIPLE); + loadStream >> _encounters[i]; + if (_encounters[i] == IN_PROGRESS) + _encounters[i] = NOT_STARTED; } } + } - uint32 GetData(uint32 type) const - { - switch (type) - { - case TYPE_LORD_COBRAHN: - case TYPE_LORD_PYTHAS: - case TYPE_LADY_ANACONDRA: - case TYPE_LORD_SERPENTIS: - return _encounters[type]; - } - return 0; - } - - std::string GetSaveData() - { - std::ostringstream saveStream; - saveStream << "W C " << _encounters[0] << ' ' << _encounters[1] << ' ' << _encounters[2] << ' ' << _encounters[3] << ' ' << _encounters[4]; - return saveStream.str(); - } - - void Load(const char* in) - { - if (!in) - return; - - char dataHead1, dataHead2; - std::istringstream loadStream(in); - loadStream >> dataHead1 >> dataHead2; - if (dataHead1 == 'W' && dataHead2 == 'C') - { - for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) - { - loadStream >> _encounters[i]; - if (_encounters[i] == IN_PROGRESS) - _encounters[i] = NOT_STARTED; - } - } - } - - private: - uint32 _encounters[MAX_ENCOUNTERS]; - uint64 DiscipleOfNaralexGUID; - uint64 SerpentisGUID; - }; + private: + uint32 _encounters[MAX_ENCOUNTERS]; + uint64 DiscipleOfNaralexGUID; + uint64 SerpentisGUID; + }; }; void AddSC_instance_wailing_caverns() diff --git a/src/server/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp b/src/server/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp index b4bf5570b..0419b3d2d 100644 --- a/src/server/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp +++ b/src/server/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp @@ -12,154 +12,154 @@ class instance_zulfarrak : public InstanceMapScript { - public: - instance_zulfarrak() : InstanceMapScript("instance_zulfarrak", 209) { } +public: + instance_zulfarrak() : InstanceMapScript("instance_zulfarrak", 209) { } - InstanceScript* GetInstanceScript(InstanceMap* map) const + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_zulfarrak_InstanceMapScript(map); + } + + struct instance_zulfarrak_InstanceMapScript : public InstanceScript + { + instance_zulfarrak_InstanceMapScript(Map* map) : InstanceScript(map) { } + + void Initialize() { - return new instance_zulfarrak_InstanceMapScript(map); + _pyramidEventProgress = NOT_STARTED; + _gahzrillaSummoned = NOT_STARTED; } - struct instance_zulfarrak_InstanceMapScript : public InstanceScript + void OnGameObjectCreate(GameObject* gameobject) { - instance_zulfarrak_InstanceMapScript(Map* map) : InstanceScript(map) { } + if (gameobject->GetEntry() == GO_END_DOOR && _pyramidEventProgress == DONE) + gameobject->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); + } - void Initialize() + uint32 GetData(uint32 type) const + { + if (type == TYPE_PYRAMID_EVENT) + return _pyramidEventProgress; + return 0; + } + + void SetData(uint32 type, uint32 data) + { + switch (type) { - _pyramidEventProgress = NOT_STARTED; - _gahzrillaSummoned = NOT_STARTED; + case TYPE_PYRAMID_EVENT: + _pyramidEventProgress = data; + break; + case TYPE_GAHZRILLA: + _gahzrillaSummoned = data; + break; } - void OnGameObjectCreate(GameObject* gameobject) + SaveToDB(); + } + + std::string GetSaveData() + { + std::ostringstream saveStream; + saveStream << "Z F " << _pyramidEventProgress << ' ' << _gahzrillaSummoned; + return saveStream.str(); + } + + void Load(const char* str) + { + if (!str) + return; + + char dataHead1, dataHead2; + std::istringstream loadStream(str); + loadStream >> dataHead1 >> dataHead2; + + if (dataHead1 == 'Z' && dataHead2 == 'F') { - if (gameobject->GetEntry() == GO_END_DOOR && _pyramidEventProgress == DONE) - gameobject->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); + loadStream >> _pyramidEventProgress; + loadStream >> _gahzrillaSummoned; } + } - uint32 GetData(uint32 type) const - { - if (type == TYPE_PYRAMID_EVENT) - return _pyramidEventProgress; - return 0; - } - - void SetData(uint32 type, uint32 data) - { - switch (type) - { - case TYPE_PYRAMID_EVENT: - _pyramidEventProgress = data; - break; - case TYPE_GAHZRILLA: - _gahzrillaSummoned = data; - break; - } - - SaveToDB(); - } - - std::string GetSaveData() - { - std::ostringstream saveStream; - saveStream << "Z F " << _pyramidEventProgress << ' ' << _gahzrillaSummoned; - return saveStream.str(); - } - - void Load(const char* str) - { - if (!str) - return; - - char dataHead1, dataHead2; - std::istringstream loadStream(str); - loadStream >> dataHead1 >> dataHead2; - - if (dataHead1 == 'Z' && dataHead2 == 'F') - { - loadStream >> _pyramidEventProgress; - loadStream >> _gahzrillaSummoned; - } - } - - private: - uint32 _pyramidEventProgress; - uint32 _gahzrillaSummoned; - }; + private: + uint32 _pyramidEventProgress; + uint32 _gahzrillaSummoned; + }; }; class spell_zulfarrak_summon_zulfarrak_zombies : public SpellScriptLoader { - public: - spell_zulfarrak_summon_zulfarrak_zombies() : SpellScriptLoader("spell_zulfarrak_summon_zulfarrak_zombies") { } +public: + spell_zulfarrak_summon_zulfarrak_zombies() : SpellScriptLoader("spell_zulfarrak_summon_zulfarrak_zombies") { } - class spell_zulfarrak_summon_zulfarrak_zombies_SpellScript : public SpellScript + class spell_zulfarrak_summon_zulfarrak_zombies_SpellScript : public SpellScript + { + PrepareSpellScript(spell_zulfarrak_summon_zulfarrak_zombies_SpellScript); + + void HandleSummon(SpellEffIndex effIndex) { - PrepareSpellScript(spell_zulfarrak_summon_zulfarrak_zombies_SpellScript); - - void HandleSummon(SpellEffIndex effIndex) + if (effIndex == EFFECT_0) { - if (effIndex == EFFECT_0) - { - if (roll_chance_i(30)) - { - PreventHitDefaultEffect(effIndex); - return; - } - } - else if (roll_chance_i(40)) + if (roll_chance_i(30)) { PreventHitDefaultEffect(effIndex); return; } } - - void Register() + else if (roll_chance_i(40)) { - OnEffectHit += SpellEffectFn(spell_zulfarrak_summon_zulfarrak_zombies_SpellScript::HandleSummon, EFFECT_0, SPELL_EFFECT_SUMMON); - OnEffectHit += SpellEffectFn(spell_zulfarrak_summon_zulfarrak_zombies_SpellScript::HandleSummon, EFFECT_1, SPELL_EFFECT_SUMMON); + PreventHitDefaultEffect(effIndex); + return; } - }; - - SpellScript* GetSpellScript() const - { - return new spell_zulfarrak_summon_zulfarrak_zombies_SpellScript; } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_zulfarrak_summon_zulfarrak_zombies_SpellScript::HandleSummon, EFFECT_0, SPELL_EFFECT_SUMMON); + OnEffectHit += SpellEffectFn(spell_zulfarrak_summon_zulfarrak_zombies_SpellScript::HandleSummon, EFFECT_1, SPELL_EFFECT_SUMMON); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_zulfarrak_summon_zulfarrak_zombies_SpellScript; + } }; class spell_zulfarrak_unlocking : public SpellScriptLoader { - public: - spell_zulfarrak_unlocking() : SpellScriptLoader("spell_zulfarrak_unlocking") { } +public: + spell_zulfarrak_unlocking() : SpellScriptLoader("spell_zulfarrak_unlocking") { } - class spell_zulfarrak_unlocking_SpellScript : public SpellScript + class spell_zulfarrak_unlocking_SpellScript : public SpellScript + { + PrepareSpellScript(spell_zulfarrak_unlocking_SpellScript); + + void HandleOpenLock(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_zulfarrak_unlocking_SpellScript); - - void HandleOpenLock(SpellEffIndex /*effIndex*/) + GameObject* cage = GetHitGObj(); + std::list cagesList; + acore::AllWorldObjectsInRange objects(GetCaster(), 15.0f); + acore::WorldObjectListSearcher searcher(GetCaster(), cagesList, objects); + GetCaster()->VisitNearbyObject(15.0f, searcher); + for (std::list::const_iterator itr = cagesList.begin(); itr != cagesList.end(); ++itr) { - GameObject* cage = GetHitGObj(); - std::list cagesList; - acore::AllWorldObjectsInRange objects(GetCaster(), 15.0f); - acore::WorldObjectListSearcher searcher(GetCaster(), cagesList, objects); - GetCaster()->VisitNearbyObject(15.0f, searcher); - for (std::list::const_iterator itr = cagesList.begin(); itr != cagesList.end(); ++itr) - { - if (GameObject* go = (*itr)->ToGameObject()) - if (go->GetDisplayId() == cage->GetDisplayId()) - go->UseDoorOrButton(0, false, GetCaster()); - } + if (GameObject* go = (*itr)->ToGameObject()) + if (go->GetDisplayId() == cage->GetDisplayId()) + go->UseDoorOrButton(0, false, GetCaster()); } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_zulfarrak_unlocking_SpellScript::HandleOpenLock, EFFECT_0, SPELL_EFFECT_OPEN_LOCK); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_zulfarrak_unlocking_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_zulfarrak_unlocking_SpellScript::HandleOpenLock, EFFECT_0, SPELL_EFFECT_OPEN_LOCK); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_zulfarrak_unlocking_SpellScript(); + } }; void AddSC_instance_zulfarrak() diff --git a/src/server/scripts/Kalimdor/boss_azuregos.cpp b/src/server/scripts/Kalimdor/boss_azuregos.cpp index 6dc8eb249..33435e4c4 100644 --- a/src/server/scripts/Kalimdor/boss_azuregos.cpp +++ b/src/server/scripts/Kalimdor/boss_azuregos.cpp @@ -85,13 +85,14 @@ public: Unit* unit = ObjectAccessor::GetUnit(*me, (*i)->getUnitGuid()); if (unit && (unit->GetTypeId() == TYPEID_PLAYER)) { - DoTeleportPlayer(unit, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+3, unit->GetOrientation()); + DoTeleportPlayer(unit, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 3, unit->GetOrientation()); } } DoResetThreat(); TeleportTimer = 30000; - } else TeleportTimer -= diff; + } + else TeleportTimer -= diff; // //MarkOfFrostTimer // if (MarkOfFrostTimer <= diff) @@ -105,14 +106,16 @@ public: { DoCastVictim(SPELL_CHILL); ChillTimer = urand(13000, 25000); - } else ChillTimer -= diff; + } + else ChillTimer -= diff; //BreathTimer if (BreathTimer <= diff) { DoCastVictim(SPELL_FROSTBREATH); BreathTimer = urand(10000, 15000); - } else BreathTimer -= diff; + } + else BreathTimer -= diff; //ManaStormTimer if (ManaStormTimer <= diff) @@ -120,21 +123,24 @@ public: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) DoCast(target, SPELL_MANASTORM); ManaStormTimer = urand(7500, 12500); - } else ManaStormTimer -= diff; + } + else ManaStormTimer -= diff; //ReflectTimer if (ReflectTimer <= diff) { DoCast(me, SPELL_REFLECT); ReflectTimer = urand(20000, 35000); - } else ReflectTimer -= diff; + } + else ReflectTimer -= diff; //CleaveTimer if (CleaveTimer <= diff) { DoCastVictim(SPELL_CLEAVE); CleaveTimer = 7000; - } else CleaveTimer -= diff; + } + else CleaveTimer -= diff; //EnrageTimer if (HealthBelowPct(26) && !Enraged) diff --git a/src/server/scripts/Kalimdor/zone_ashenvale.cpp b/src/server/scripts/Kalimdor/zone_ashenvale.cpp index 99184fffe..0937ec431 100644 --- a/src/server/scripts/Kalimdor/zone_ashenvale.cpp +++ b/src/server/scripts/Kalimdor/zone_ashenvale.cpp @@ -210,83 +210,83 @@ public: } } - void WaypointReached(uint32 waypointId) + void WaypointReached(uint32 waypointId) + { + if (Player* player = GetPlayerForEscort()) { - if (Player* player = GetPlayerForEscort()) + switch (waypointId) { - switch (waypointId) - { - case 0: - Talk(SAY_MUG_START2, player); - break; - case 24: - Talk(SAY_MUG_BRAZIER, player); - - if (GameObject* go = GetClosestGameObjectWithEntry(me, GO_NAGA_BRAZIER, INTERACTION_DISTANCE*2)) - { - go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - SetEscortPaused(true); - } - break; - case 25: - Talk(SAY_MUG_GRATITUDE); - player->GroupEventHappens(QUEST_VORSHA, me); - break; - case 26: - Talk(SAY_MUG_PATROL); - break; - case 27: - Talk(SAY_MUG_RETURN); - break; - } - } - } - - void DoWaveSummon() - { - switch (waveId) - { - case 1: - me->SummonCreature(NPC_WRATH_RIDER, FirstNagaCoord[0], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); - me->SummonCreature(NPC_WRATH_SORCERESS, FirstNagaCoord[1], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); - me->SummonCreature(NPC_WRATH_RAZORTAIL, FirstNagaCoord[2], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); + case 0: + Talk(SAY_MUG_START2, player); break; - case 2: - me->SummonCreature(NPC_WRATH_PRIESTESS, SecondNagaCoord[0], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); - me->SummonCreature(NPC_WRATH_MYRMIDON, SecondNagaCoord[1], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); - me->SummonCreature(NPC_WRATH_SEAWITCH, SecondNagaCoord[2], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); - break; - case 3: - me->SummonCreature(NPC_VORSHA, VorshaCoord, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); - break; - case 4: - SetEscortPaused(false); - Talk(SAY_MUG_DONE); - break; - } - } + case 24: + Talk(SAY_MUG_BRAZIER, player); - void UpdateAI(uint32 diff) - { - npc_escortAI::UpdateAI(diff); - - if (!me->GetVictim()) - { - if (HasEscortState(STATE_ESCORT_PAUSED) && _isBrazierExtinguished) - { - if (eventTimer < diff) + if (GameObject* go = GetClosestGameObjectWithEntry(me, GO_NAGA_BRAZIER, INTERACTION_DISTANCE * 2)) { - ++waveId; - DoWaveSummon(); - eventTimer = 10000; + go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + SetEscortPaused(true); } - else - eventTimer -= diff; - } - return; + break; + case 25: + Talk(SAY_MUG_GRATITUDE); + player->GroupEventHappens(QUEST_VORSHA, me); + break; + case 26: + Talk(SAY_MUG_PATROL); + break; + case 27: + Talk(SAY_MUG_RETURN); + break; } - DoMeleeAttackIfReady(); } + } + + void DoWaveSummon() + { + switch (waveId) + { + case 1: + me->SummonCreature(NPC_WRATH_RIDER, FirstNagaCoord[0], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); + me->SummonCreature(NPC_WRATH_SORCERESS, FirstNagaCoord[1], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); + me->SummonCreature(NPC_WRATH_RAZORTAIL, FirstNagaCoord[2], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); + break; + case 2: + me->SummonCreature(NPC_WRATH_PRIESTESS, SecondNagaCoord[0], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); + me->SummonCreature(NPC_WRATH_MYRMIDON, SecondNagaCoord[1], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); + me->SummonCreature(NPC_WRATH_SEAWITCH, SecondNagaCoord[2], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); + break; + case 3: + me->SummonCreature(NPC_VORSHA, VorshaCoord, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); + break; + case 4: + SetEscortPaused(false); + Talk(SAY_MUG_DONE); + break; + } + } + + void UpdateAI(uint32 diff) + { + npc_escortAI::UpdateAI(diff); + + if (!me->GetVictim()) + { + if (HasEscortState(STATE_ESCORT_PAUSED) && _isBrazierExtinguished) + { + if (eventTimer < diff) + { + ++waveId; + DoWaveSummon(); + eventTimer = 10000; + } + else + eventTimer -= diff; + } + return; + } + DoMeleeAttackIfReady(); + } private: uint32 eventTimer; @@ -309,7 +309,7 @@ public: bool OnGossipHello(Player* /*player*/, GameObject* go) override { - if (Creature* creature = GetClosestCreatureWithEntry(go, NPC_MUGLASH, INTERACTION_DISTANCE*2)) + if (Creature* creature = GetClosestCreatureWithEntry(go, NPC_MUGLASH, INTERACTION_DISTANCE * 2)) { if (npc_muglash::npc_muglashAI* pEscortAI = CAST_AI(npc_muglash::npc_muglashAI, creature->AI())) { diff --git a/src/server/scripts/Kalimdor/zone_azshara.cpp b/src/server/scripts/Kalimdor/zone_azshara.cpp index 7b3fa9abe..6c96854f2 100644 --- a/src/server/scripts/Kalimdor/zone_azshara.cpp +++ b/src/server/scripts/Kalimdor/zone_azshara.cpp @@ -90,9 +90,9 @@ public: return; } // walk 5 seconds before summoning - if (spellhit && morphtimer<5000) + if (spellhit && morphtimer < 5000) { - morphtimer+=diff; + morphtimer += diff; if (morphtimer >= 5000) { DoCast(me, SPELL_POLYMORPH_BACKFIRE); // summon copies @@ -275,7 +275,8 @@ public: { me->DespawnOrUnsummon(); return; - } else MustDieTimer -= diff; + } + else MustDieTimer -= diff; } if (!Escape) @@ -287,7 +288,8 @@ public: { DoCast(me, SPELL_RIZZLE_ESCAPE, false); SpellEscapeTimer = 10000; - } else SpellEscapeTimer -= diff; + } + else SpellEscapeTimer -= diff; if (TeleportTimer <= diff) { @@ -307,7 +309,8 @@ public: me->GetMotionMaster()->MovementExpired(); me->GetMotionMaster()->MovePoint(CurrWP, WPs[CurrWP]); Escape = true; - } else TeleportTimer -= diff; + } + else TeleportTimer -= diff; return; } @@ -322,11 +325,12 @@ public: { if (Player* player = ObjectAccessor::GetPlayer(*me, PlayerGUID)) { - Talk(SAY_RIZZLE_GRENADE, player); - DoCast(player, SPELL_RIZZLE_FROST_GRENADE, true); + Talk(SAY_RIZZLE_GRENADE, player); + DoCast(player, SPELL_RIZZLE_FROST_GRENADE, true); } GrenadeTimer = 30000; - } else GrenadeTimer -= diff; + } + else GrenadeTimer -= diff; if (CheckTimer <= diff) { @@ -348,7 +352,8 @@ public: } CheckTimer = 1000; - } else CheckTimer -= diff; + } + else CheckTimer -= diff; } private: @@ -372,7 +377,7 @@ public: AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_GET_MOONSTONE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); SendGossipMenuFor(player, 10811, creature->GetGUID()); - + return true; } diff --git a/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp index 6dfc3d4ad..8bd6a617b 100644 --- a/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp +++ b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp @@ -1,8 +1,8 @@ - /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license: https://github.com/azerothcore/azerothcore-wotlk/blob/master/LICENSE-GPL2 - * Copyright (C) 2008-2016 TrinityCore - * Copyright (C) 2005-2009 MaNGOS - */ +/* +* Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license: https://github.com/azerothcore/azerothcore-wotlk/blob/master/LICENSE-GPL2 +* Copyright (C) 2008-2016 TrinityCore +* Copyright (C) 2005-2009 MaNGOS +*/ /* ScriptData SDName: Azuremyst_Isle @@ -126,7 +126,8 @@ public: RunAwayTimer = 10000; SayThanksTimer = 0; - } else SayThanksTimer -= diff; + } + else SayThanksTimer -= diff; return; } @@ -145,7 +146,8 @@ public: { CanSayHelp = true; SayHelpTimer = 20000; - } else SayHelpTimer -= diff; + } + else SayHelpTimer -= diff; } }; @@ -220,7 +222,8 @@ public: Talk(SAY_TEXT); Talk(SAY_EMOTE); EmoteTimer = urand(120000, 150000); - } else EmoteTimer -= diff; + } + else EmoteTimer -= diff; } else if (IsTreeEvent) return; @@ -232,7 +235,8 @@ public: { DoCastVictim(SPELL_DYNAMITE); DynamiteTimer = 8000; - } else DynamiteTimer -= diff; + } + else DynamiteTimer -= diff; DoMeleeAttackIfReady(); } @@ -481,7 +485,8 @@ public: DespawnNagaFlag(false); me->DespawnOrUnsummon(1); return 5000; - default: return 99999999; + default: + return 99999999; } } @@ -574,7 +579,7 @@ public: struct npc_death_ravagerAI : public ScriptedAI { - npc_death_ravagerAI(Creature* creature) : ScriptedAI(creature){ } + npc_death_ravagerAI(Creature* creature) : ScriptedAI(creature) { } uint32 RendTimer; uint32 EnragingBiteTimer; @@ -635,70 +640,70 @@ enum BristlelimbCage class npc_stillpine_capitive : public CreatureScript { - public: - npc_stillpine_capitive() : CreatureScript("npc_stillpine_capitive") { } +public: + npc_stillpine_capitive() : CreatureScript("npc_stillpine_capitive") { } - struct npc_stillpine_capitiveAI : public ScriptedAI + struct npc_stillpine_capitiveAI : public ScriptedAI + { + npc_stillpine_capitiveAI(Creature* creature) : ScriptedAI(creature) { } + + void Reset() { - npc_stillpine_capitiveAI(Creature* creature) : ScriptedAI(creature) { } - - void Reset() + if (GameObject* cage = me->FindNearestGameObject(GO_BRISTELIMB_CAGE, 5.0f)) { - if (GameObject* cage = me->FindNearestGameObject(GO_BRISTELIMB_CAGE, 5.0f)) - { - cage->SetLootState(GO_JUST_DEACTIVATED); - cage->SetGoState(GO_STATE_READY); - } - _events.Reset(); - _playerGUID = 0; - _movementComplete = false; + cage->SetLootState(GO_JUST_DEACTIVATED); + cage->SetGoState(GO_STATE_READY); } - - void StartMoving(Player* owner) - { - if (owner) - { - Talk(CAPITIVE_SAY, owner); - _playerGUID = owner->GetGUID(); - } - Position pos; - me->GetNearPosition(pos, 3.0f, 0.0f); - me->GetMotionMaster()->MovePoint(POINT_INIT, pos); - } - - void MovementInform(uint32 type, uint32 id) - { - if (type != POINT_MOTION_TYPE || id != POINT_INIT) - return; - - if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) - player->KilledMonsterCredit(me->GetEntry(), me->GetGUID()); - - _movementComplete = true; - _events.ScheduleEvent(EVENT_DESPAWN, 3500); - } - - void UpdateAI(uint32 diff) - { - if (!_movementComplete) - return; - - _events.Update(diff); - - if (_events.ExecuteEvent() == EVENT_DESPAWN) - me->DespawnOrUnsummon(); - } - - private: - uint64 _playerGUID; - EventMap _events; - bool _movementComplete; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_stillpine_capitiveAI(creature); + _events.Reset(); + _playerGUID = 0; + _movementComplete = false; } + + void StartMoving(Player* owner) + { + if (owner) + { + Talk(CAPITIVE_SAY, owner); + _playerGUID = owner->GetGUID(); + } + Position pos; + me->GetNearPosition(pos, 3.0f, 0.0f); + me->GetMotionMaster()->MovePoint(POINT_INIT, pos); + } + + void MovementInform(uint32 type, uint32 id) + { + if (type != POINT_MOTION_TYPE || id != POINT_INIT) + return; + + if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) + player->KilledMonsterCredit(me->GetEntry(), me->GetGUID()); + + _movementComplete = true; + _events.ScheduleEvent(EVENT_DESPAWN, 3500); + } + + void UpdateAI(uint32 diff) + { + if (!_movementComplete) + return; + + _events.Update(diff); + + if (_events.ExecuteEvent() == EVENT_DESPAWN) + me->DespawnOrUnsummon(); + } + + private: + uint64 _playerGUID; + EventMap _events; + bool _movementComplete; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_stillpine_capitiveAI(creature); + } }; class go_bristlelimb_cage : public GameObjectScript diff --git a/src/server/scripts/Kalimdor/zone_darkshore.cpp b/src/server/scripts/Kalimdor/zone_darkshore.cpp index 3ee244dd4..e29f386bd 100644 --- a/src/server/scripts/Kalimdor/zone_darkshore.cpp +++ b/src/server/scripts/Kalimdor/zone_darkshore.cpp @@ -80,48 +80,48 @@ public: spawnTimer = 0; switch (phase) { - case 0: - if (!me->FindNearestCreature(NPC_GREYMIST_WARRIOR, 80.0f, true) && !me->FindNearestCreature(NPC_GREYMIST_HUNTER, 80.0f, true)) - { - Player *player = me->SelectNearestPlayer(100.0f); - if (!player) - return; + case 0: + if (!me->FindNearestCreature(NPC_GREYMIST_WARRIOR, 80.0f, true) && !me->FindNearestCreature(NPC_GREYMIST_HUNTER, 80.0f, true)) + { + Player* player = me->SelectNearestPlayer(100.0f); + if (!player) + return; - phase++; - for (int i = 0; i < 3; ++i) - if (Creature* cr = me->SummonCreature(NPC_GREYMIST_COASTRUNNER, me->GetPositionX()+irand(-5, 5), me->GetPositionY()+irand(-5, 5), me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000)) + phase++; + for (int i = 0; i < 3; ++i) + if (Creature* cr = me->SummonCreature(NPC_GREYMIST_COASTRUNNER, me->GetPositionX() + irand(-5, 5), me->GetPositionY() + irand(-5, 5), me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000)) + cr->AI()->AttackStart(player); + } + return; + case 1: + if (!me->FindNearestCreature(NPC_GREYMIST_COASTRUNNER, 80.0f)) + { + Player* player = me->SelectNearestPlayer(100.0f); + if (!player) + return; + + phase++; + for (int i = 0; i < 2; ++i) + if (Creature* cr = me->SummonCreature(NPC_GREYMIST_WARRIOR, me->GetPositionX() + irand(-5, 5), me->GetPositionY() + irand(-5, 5), me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000)) + cr->AI()->AttackStart(player); + } + return; + case 2: + if (!me->FindNearestCreature(NPC_GREYMIST_WARRIOR, 80.0f)) + { + Player* player = me->SelectNearestPlayer(100.0f); + if (!player) + return; + + phase++; + if (Creature* cr = me->SummonCreature(NPC_GREYMIST_HUNTER, me->GetPositionX() + irand(-5, 5), me->GetPositionY() + irand(-5, 5), me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000)) cr->AI()->AttackStart(player); - } - return; - case 1: - if (!me->FindNearestCreature(NPC_GREYMIST_COASTRUNNER, 80.0f)) - { - Player *player = me->SelectNearestPlayer(100.0f); - if (!player) - return; - phase++; - for (int i = 0; i < 2; ++i) - if (Creature* cr = me->SummonCreature(NPC_GREYMIST_WARRIOR, me->GetPositionX()+irand(-5, 5), me->GetPositionY()+irand(-5, 5), me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000)) - cr->AI()->AttackStart(player); - } - return; - case 2: - if (!me->FindNearestCreature(NPC_GREYMIST_WARRIOR, 80.0f)) - { - Player *player = me->SelectNearestPlayer(100.0f); - if (!player) - return; - - phase++; - if (Creature* cr = me->SummonCreature(NPC_GREYMIST_HUNTER, me->GetPositionX()+irand(-5, 5), me->GetPositionY()+irand(-5, 5), me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000)) - cr->AI()->AttackStart(player); - - me->SetReactState(REACT_AGGRESSIVE); - me->SetVisible(true); - AttackStart(player); - } - return; + me->SetReactState(REACT_AGGRESSIVE); + me->SetVisible(true); + AttackStart(player); + } + return; } } @@ -195,7 +195,7 @@ public: if (!me->GetVictim() && !HasFollowState(STATE_FOLLOW_COMPLETE) && who->GetEntry() == NPC_LILADRIS) { - if (me->IsWithinDistInMap(who, INTERACTION_DISTANCE*5)) + if (me->IsWithinDistInMap(who, INTERACTION_DISTANCE * 5)) { if (Player* player = GetLeaderForFollower()) { @@ -469,7 +469,7 @@ public: bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override { ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF + 1) { CloseGossipMenuFor(player); @@ -486,7 +486,7 @@ public: bool OnGossipHello(Player* player, Creature* creature) override { if (player->GetQuestStatus(QUEST_GYROMAST_REV) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_INSERT_KEY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_INSERT_KEY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); return true; diff --git a/src/server/scripts/Kalimdor/zone_desolace.cpp b/src/server/scripts/Kalimdor/zone_desolace.cpp index 5b73917ae..19d085a93 100644 --- a/src/server/scripts/Kalimdor/zone_desolace.cpp +++ b/src/server/scripts/Kalimdor/zone_desolace.cpp @@ -45,8 +45,8 @@ enum Caravan MAX_CARAVAN_SUMMONS = 3, - TIME_SHOP_STOP = 10*MINUTE*IN_MILLISECONDS, - TIME_HIRE_STOP = 4*MINUTE*IN_MILLISECONDS, + TIME_SHOP_STOP = 10 * MINUTE * IN_MILLISECONDS, + TIME_HIRE_STOP = 4 * MINUTE * IN_MILLISECONDS, // Ambush NPC_KOLKAR_WAYLAYER = 12976, @@ -59,271 +59,271 @@ enum Caravan class npc_cork_gizelton : public CreatureScript { - public: - npc_cork_gizelton() : CreatureScript("npc_cork_gizelton") { } +public: + npc_cork_gizelton() : CreatureScript("npc_cork_gizelton") { } - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) + bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) + { + if (quest->GetQuestId() == QUEST_BODYGUARD_FOR_HIRE) + creature->AI()->SetGUID(player->GetGUID(), player->getFaction()); + + return true; + } + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_cork_gizeltonAI(creature); + } + + struct npc_cork_gizeltonAI : public npc_escortAI + { + npc_cork_gizeltonAI(Creature* creature) : npc_escortAI(creature) { - if (quest->GetQuestId() == QUEST_BODYGUARD_FOR_HIRE) - creature->AI()->SetGUID(player->GetGUID(), player->getFaction()); + memset(&summons, 0, sizeof(summons)); + } + EventMap events; + uint64 summons[MAX_CARAVAN_SUMMONS]; + bool headNorth; + + uint64 _playerGUID; + uint32 _faction; + + void Initialize() + { + _playerGUID = 0; + _faction = 35; + headNorth = true; + me->setActive(true); + events.ScheduleEvent(EVENT_RESTART_ESCORT, 0); + } + + void JustRespawned() + { + npc_escortAI::JustRespawned(); + Initialize(); + } + + void InitializeAI() + { + npc_escortAI::InitializeAI(); + Initialize(); + } + + void JustDied(Unit* killer) + { + RemoveSummons(); + npc_escortAI::JustDied(killer); + } + + void EnterEvadeMode() + { + SummonsFollow(); + ImmuneFlagSet(false, 35); + npc_escortAI::EnterEvadeMode(); + } + + void CheckPlayer() + { + if (_playerGUID) + if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) + if (me->IsWithinDist(player, 60.0f)) + return; + + _playerGUID = 0; + _faction = 35; + ImmuneFlagSet(false, _faction); + } + + void SetGUID(uint64 playerGUID, int32 faction) + { + _playerGUID = playerGUID; + _faction = faction; + SetEscortPaused(false); + if (Creature* active = !headNorth ? me : ObjectAccessor::GetCreature(*me, summons[0])) + active->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER); + events.CancelEvent(EVENT_WAIT_FOR_ASSIST); + } + + void SetData(uint32 field, uint32 data) + { + if (field == 1 && data == 1) + if (Player* player = me->SelectNearestPlayer(50.0f)) + SetGUID(player->GetGUID(), player->getFaction()); + } + + bool CheckCaravan() + { + for (uint8 i = 0; i < MAX_CARAVAN_SUMMONS; ++i) + { + if (summons[i] == 0) + { + SummonHelpers(); + return false; + } + + Creature* summon = ObjectAccessor::GetCreature(*me, summons[i]); + if (!summon || me->GetDistance2d(summon) > 25.0f) + { + SummonHelpers(); + return false; + } + } return true; } - CreatureAI* GetAI(Creature* creature) const + void RemoveSummons() { - return new npc_cork_gizeltonAI(creature); + for (uint8 i = 0; i < MAX_CARAVAN_SUMMONS; ++i) + { + if (Creature* summon = ObjectAccessor::GetCreature(*me, summons[i])) + summon->DespawnOrUnsummon(); + + summons[i] = 0; + } } - struct npc_cork_gizeltonAI : public npc_escortAI + void SummonHelpers() { - npc_cork_gizeltonAI(Creature* creature) : npc_escortAI(creature) + RemoveSummons(); + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER); + + Creature* cr = nullptr; + if ((cr = me->SummonCreature(NPC_RIGGER_GIZELTON, *me))) { - memset(&summons, 0, sizeof(summons)); + cr->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER); + summons[0] = cr->GetGUID(); } + if ((cr = me->SummonCreature(NPC_CARAVAN_KODO, *me))) + summons[1] = cr->GetGUID(); + if ((cr = me->SummonCreature(NPC_CARAVAN_KODO, *me))) + summons[2] = cr->GetGUID(); - EventMap events; - uint64 summons[MAX_CARAVAN_SUMMONS]; - bool headNorth; + SummonsFollow(); + } - uint64 _playerGUID; - uint32 _faction; + void SummonedCreatureDies(Creature* creature, Unit*) + { + if (creature->GetGUID() == summons[0]) + summons[0] = 0; + else if (creature->GetGUID() == summons[1]) + summons[1] = 0; + else if (creature->GetGUID() == summons[2]) + summons[2] = 0; + } - void Initialize() + void SummonedCreatureDespawn(Creature* creature) + { + if (creature->GetGUID() == summons[0]) + summons[0] = 0; + else if (creature->GetGUID() == summons[1]) + summons[1] = 0; + else if (creature->GetGUID() == summons[2]) + summons[2] = 0; + } + + void SummonsFollow() + { + float dist = 1.0f; + for (uint8 i = 0; i < MAX_CARAVAN_SUMMONS; ++i) + if (Creature* summon = ObjectAccessor::GetCreature(*me, summons[i])) + { + summon->GetMotionMaster()->Clear(false); + summon->StopMoving(); + summon->GetMotionMaster()->MoveFollow(me, dist, M_PI, MOTION_SLOT_ACTIVE); + dist += (i == 1 ? 9.5f : 3.0f); + } + } + + void RelocateSummons() + { + for (uint8 i = 0; i < MAX_CARAVAN_SUMMONS; ++i) + if (Creature* summon = ObjectAccessor::GetCreature(*me, summons[i])) + summon->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); + } + + void ImmuneFlagSet(bool remove, uint32 faction) + { + for (uint8 i = 0; i < MAX_CARAVAN_SUMMONS; ++i) + if (Creature* summon = ObjectAccessor::GetCreature(*me, summons[i])) + { + summon->setFaction(faction); + if (remove) + summon->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC); + else + summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC); + } + if (remove) + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC); + else + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC); + me->setFaction(faction); + } + + void WaypointReached(uint32 waypointId) + { + RelocateSummons(); + switch (waypointId) { - _playerGUID = 0; - _faction = 35; - headNorth = true; - me->setActive(true); - events.ScheduleEvent(EVENT_RESTART_ESCORT, 0); - } - - void JustRespawned() - { - npc_escortAI::JustRespawned(); - Initialize(); - } - - void InitializeAI() - { - npc_escortAI::InitializeAI(); - Initialize(); - } - - void JustDied(Unit* killer) - { - RemoveSummons(); - npc_escortAI::JustDied(killer); - } - - void EnterEvadeMode() - { - SummonsFollow(); - ImmuneFlagSet(false, 35); - npc_escortAI::EnterEvadeMode(); - } - - void CheckPlayer() - { - if (_playerGUID) + // Finished north path + case 52: + me->SummonCreature(NPC_VENDOR_TRON, -694.61f, 1460.7f, 90.794f, 2.4f, TEMPSUMMON_TIMED_DESPAWN, TIME_SHOP_STOP + 15 * IN_MILLISECONDS); + SetEscortPaused(true); + events.ScheduleEvent(EVENT_RESUME_PATH, TIME_SHOP_STOP); + CheckCaravan(); + break; + // Finished south path + case 193: + me->SummonCreature(NPC_SUPER_SELLER, -1905.5f, 2463.3f, 61.52f, 5.87f, TEMPSUMMON_TIMED_DESPAWN, TIME_SHOP_STOP + 15 * IN_MILLISECONDS); + SetEscortPaused(true); + events.ScheduleEvent(EVENT_RESUME_PATH, TIME_SHOP_STOP); + CheckCaravan(); + break; + // North -> South - hire + case 77: + SetEscortPaused(true); + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER); + Talk(SAY_CARAVAN_HIRE); + events.ScheduleEvent(EVENT_WAIT_FOR_ASSIST, TIME_HIRE_STOP); + break; + // Sout -> North - hire + case 208: + SetEscortPaused(true); + if (Creature* rigger = ObjectAccessor::GetCreature(*me, summons[0])) + { + rigger->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER); + rigger->AI()->Talk(SAY_CARAVAN_HIRE); + } + events.ScheduleEvent(EVENT_WAIT_FOR_ASSIST, TIME_HIRE_STOP); + break; + // North -> South - complete + case 103: if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) - if (me->IsWithinDist(player, 60.0f)) - return; - - _playerGUID = 0; - _faction = 35; - ImmuneFlagSet(false, _faction); - } - - void SetGUID(uint64 playerGUID, int32 faction) - { - _playerGUID = playerGUID; - _faction = faction; - SetEscortPaused(false); - if (Creature* active = !headNorth ? me : ObjectAccessor::GetCreature(*me, summons[0])) - active->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER); - events.CancelEvent(EVENT_WAIT_FOR_ASSIST); - } - - void SetData(uint32 field, uint32 data) - { - if (field == 1 && data == 1) - if (Player* player = me->SelectNearestPlayer(50.0f)) - SetGUID(player->GetGUID(), player->getFaction()); - } - - bool CheckCaravan() - { - for (uint8 i = 0; i < MAX_CARAVAN_SUMMONS; ++i) - { - if (summons[i] == 0) { - SummonHelpers(); - return false; - } - - Creature* summon = ObjectAccessor::GetCreature(*me, summons[i]); - if (!summon || me->GetDistance2d(summon) > 25.0f) - { - SummonHelpers(); - return false; - } - } - return true; - } - - void RemoveSummons() - { - for (uint8 i = 0; i < MAX_CARAVAN_SUMMONS; ++i) - { - if (Creature* summon = ObjectAccessor::GetCreature(*me, summons[i])) - summon->DespawnOrUnsummon(); - - summons[i] = 0; - } - } - - void SummonHelpers() - { - RemoveSummons(); - me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER); - - Creature* cr = nullptr; - if ((cr = me->SummonCreature(NPC_RIGGER_GIZELTON, *me))) - { - cr->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER); - summons[0] = cr->GetGUID(); - } - if ((cr = me->SummonCreature(NPC_CARAVAN_KODO, *me))) - summons[1] = cr->GetGUID(); - if ((cr = me->SummonCreature(NPC_CARAVAN_KODO, *me))) - summons[2] = cr->GetGUID(); - - SummonsFollow(); - } - - void SummonedCreatureDies(Creature* creature, Unit*) - { - if (creature->GetGUID() == summons[0]) - summons[0] = 0; - else if (creature->GetGUID() == summons[1]) - summons[1] = 0; - else if (creature->GetGUID() == summons[2]) - summons[2] = 0; - } - - void SummonedCreatureDespawn(Creature* creature) - { - if (creature->GetGUID() == summons[0]) - summons[0] = 0; - else if (creature->GetGUID() == summons[1]) - summons[1] = 0; - else if (creature->GetGUID() == summons[2]) - summons[2] = 0; - } - - void SummonsFollow() - { - float dist = 1.0f; - for (uint8 i = 0; i < MAX_CARAVAN_SUMMONS; ++i) - if (Creature* summon = ObjectAccessor::GetCreature(*me, summons[i])) - { - summon->GetMotionMaster()->Clear(false); - summon->StopMoving(); - summon->GetMotionMaster()->MoveFollow(me, dist, M_PI, MOTION_SLOT_ACTIVE); - dist += (i == 1 ? 9.5f : 3.0f); - } - } - - void RelocateSummons() - { - for (uint8 i = 0; i < MAX_CARAVAN_SUMMONS; ++i) - if (Creature* summon = ObjectAccessor::GetCreature(*me, summons[i])) - summon->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); - } - - void ImmuneFlagSet(bool remove, uint32 faction) - { - for (uint8 i = 0; i < MAX_CARAVAN_SUMMONS; ++i) - if (Creature* summon = ObjectAccessor::GetCreature(*me, summons[i])) - { - summon->setFaction(faction); - if (remove) - summon->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC); + if (CheckCaravan()) + player->GroupEventHappens(QUEST_BODYGUARD_FOR_HIRE, player); else - summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC); + player->FailQuest(QUEST_BODYGUARD_FOR_HIRE); } - if (remove) - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC); - else - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC); - me->setFaction(faction); - } - - void WaypointReached(uint32 waypointId) - { - RelocateSummons(); - switch (waypointId) - { - // Finished north path - case 52: - me->SummonCreature(NPC_VENDOR_TRON, -694.61f, 1460.7f, 90.794f, 2.4f, TEMPSUMMON_TIMED_DESPAWN, TIME_SHOP_STOP+15*IN_MILLISECONDS); - SetEscortPaused(true); - events.ScheduleEvent(EVENT_RESUME_PATH, TIME_SHOP_STOP); - CheckCaravan(); - break; - // Finished south path - case 193: - me->SummonCreature(NPC_SUPER_SELLER, -1905.5f, 2463.3f, 61.52f, 5.87f, TEMPSUMMON_TIMED_DESPAWN, TIME_SHOP_STOP+15*IN_MILLISECONDS); - SetEscortPaused(true); - events.ScheduleEvent(EVENT_RESUME_PATH, TIME_SHOP_STOP); - CheckCaravan(); - break; - // North -> South - hire - case 77: - SetEscortPaused(true); - me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER); - Talk(SAY_CARAVAN_HIRE); - events.ScheduleEvent(EVENT_WAIT_FOR_ASSIST, TIME_HIRE_STOP); - break; - // Sout -> North - hire - case 208: - SetEscortPaused(true); - if (Creature* rigger = ObjectAccessor::GetCreature(*me, summons[0])) - { - rigger->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER); - rigger->AI()->Talk(SAY_CARAVAN_HIRE); - } - events.ScheduleEvent(EVENT_WAIT_FOR_ASSIST, TIME_HIRE_STOP); - break; - // North -> South - complete - case 103: - if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) - { - if (CheckCaravan()) - player->GroupEventHappens(QUEST_BODYGUARD_FOR_HIRE, player); - else - player->FailQuest(QUEST_BODYGUARD_FOR_HIRE); - } - _playerGUID = 0; - CheckPlayer(); - break; - // South -> North - complete - case 235: - if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) - { - if (CheckCaravan()) - player->GroupEventHappens(QUEST_GIZELTON_CARAVAN, player); - else - player->FailQuest(QUEST_GIZELTON_CARAVAN); - } - _playerGUID = 0; - CheckPlayer(); - break; - // North -> South - spawn attackers - case 83: - case 93: - case 100: + _playerGUID = 0; + CheckPlayer(); + break; + // South -> North - complete + case 235: + if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) + { + if (CheckCaravan()) + player->GroupEventHappens(QUEST_GIZELTON_CARAVAN, player); + else + player->FailQuest(QUEST_GIZELTON_CARAVAN); + } + _playerGUID = 0; + CheckPlayer(); + break; + // North -> South - spawn attackers + case 83: + case 93: + case 100: { if (!_playerGUID) return; @@ -331,11 +331,11 @@ class npc_cork_gizelton : public CreatureScript Creature* cr = nullptr; for (uint8 i = 0; i < 4; ++i) { - float o = (i*M_PI/2)+(M_PI/4); - float x = me->GetPositionX()+cos(o)*15.0f; - float y = me->GetPositionY()+sin(o)*15.0f; - if ((cr = me->SummonCreature((i%2 == 0 ? NPC_KOLKAR_WAYLAYER : NPC_KOLKAR_AMBUSHER), - x, y, me->GetMap()->GetHeight(x, y, MAX_HEIGHT), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000))) + float o = (i * M_PI / 2) + (M_PI / 4); + float x = me->GetPositionX() + cos(o) * 15.0f; + float y = me->GetPositionY() + sin(o) * 15.0f; + if ((cr = me->SummonCreature((i % 2 == 0 ? NPC_KOLKAR_WAYLAYER : NPC_KOLKAR_AMBUSHER), + x, y, me->GetMap()->GetHeight(x, y, MAX_HEIGHT), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000))) cr->AI()->AttackStart(me); } if (cr) @@ -345,10 +345,10 @@ class npc_cork_gizelton : public CreatureScript } break; } - // South -> North - spawn attackers - case 221: - case 228: - case 233: + // South -> North - spawn attackers + case 221: + case 228: + case 233: { if (!_playerGUID) return; @@ -356,9 +356,9 @@ class npc_cork_gizelton : public CreatureScript Creature* cr = nullptr; for (uint8 i = 0; i < 3; ++i) { - float o = i*2*M_PI/3; - float x = me->GetPositionX()+cos(o)*10.0f; - float y = me->GetPositionY()+sin(o)*10.0f; + float o = i * 2 * M_PI / 3; + float x = me->GetPositionX() + cos(o) * 10.0f; + float y = me->GetPositionY() + sin(o) * 10.0f; uint32 entry = NPC_LESSER_INFERNAL; if (i) entry = i == 1 ? NPC_DOOMWARDER : NPC_NETHER; @@ -373,43 +373,43 @@ class npc_cork_gizelton : public CreatureScript } break; } - case 282: - events.ScheduleEvent(EVENT_RESTART_ESCORT, 1000); - break; + case 282: + events.ScheduleEvent(EVENT_RESTART_ESCORT, 1000); + break; - } } + } - void UpdateEscortAI(uint32 diff) + void UpdateEscortAI(uint32 diff) + { + events.Update(diff); + switch (events.ExecuteEvent()) { - events.Update(diff); - switch (events.ExecuteEvent()) - { - case EVENT_RESUME_PATH: - SetEscortPaused(false); - if (Creature* talker = headNorth ? me : ObjectAccessor::GetCreature(*me, summons[0])) - talker->AI()->Talk(SAY_CARAVAN_LEAVE); + case EVENT_RESUME_PATH: + SetEscortPaused(false); + if (Creature* talker = headNorth ? me : ObjectAccessor::GetCreature(*me, summons[0])) + talker->AI()->Talk(SAY_CARAVAN_LEAVE); - headNorth = !headNorth; - break; - case EVENT_WAIT_FOR_ASSIST: - SetEscortPaused(false); - if (Creature* active = !headNorth ? me : ObjectAccessor::GetCreature(*me, summons[0])) - active->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER); - break; - case EVENT_RESTART_ESCORT: - CheckCaravan(); - SetDespawnAtEnd(false); - Start(true, true, 0, 0, false, false, true); - break; - } - - if (!UpdateVictim()) - return; - - DoMeleeAttackIfReady(); + headNorth = !headNorth; + break; + case EVENT_WAIT_FOR_ASSIST: + SetEscortPaused(false); + if (Creature* active = !headNorth ? me : ObjectAccessor::GetCreature(*me, summons[0])) + active->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER); + break; + case EVENT_RESTART_ESCORT: + CheckCaravan(); + SetDespawnAtEnd(false); + Start(true, true, 0, 0, false, false, true); + break; } - }; + + if (!UpdateVictim()) + return; + + DoMeleeAttackIfReady(); + } + }; }; @@ -465,7 +465,7 @@ public: if (spell->Id == SPELL_KODO_KOMBO_ITEM) { if (!(caster->HasAura(SPELL_KODO_KOMBO_PLAYER_BUFF) || me->HasAura(SPELL_KODO_KOMBO_DESPAWN_BUFF)) - && (me->GetEntry() == NPC_AGED_KODO || me->GetEntry() == NPC_DYING_KODO || me->GetEntry() == NPC_ANCIENT_KODO)) + && (me->GetEntry() == NPC_AGED_KODO || me->GetEntry() == NPC_DYING_KODO || me->GetEntry() == NPC_ANCIENT_KODO)) { me->UpdateEntry(NPC_TAMED_KODO, NULL, false); EnterEvadeMode(); @@ -561,7 +561,7 @@ public: bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) { if (quest->GetQuestId() == QUEST_RETURN_TO_VAHLARRIEL) - { + { if (npc_escortAI* escortAI = CAST_AI(npc_dalinda::npc_dalindaAI, creature->AI())) { escortAI->Start(true, false, player->GetGUID()); @@ -589,19 +589,19 @@ enum DemonPortal class go_demon_portal : public GameObjectScript { - public: - go_demon_portal() : GameObjectScript("go_demon_portal") { } +public: + go_demon_portal() : GameObjectScript("go_demon_portal") { } - bool OnGossipHello(Player* player, GameObject* go) override + bool OnGossipHello(Player* player, GameObject* go) override + { + if (player->GetQuestStatus(QUEST_PORTAL_OF_THE_LEGION) == QUEST_STATUS_INCOMPLETE && !go->FindNearestCreature(NPC_DEMON_GUARDIAN, 5.0f, true)) { - if (player->GetQuestStatus(QUEST_PORTAL_OF_THE_LEGION) == QUEST_STATUS_INCOMPLETE && !go->FindNearestCreature(NPC_DEMON_GUARDIAN, 5.0f, true)) - { - if (Creature* guardian = player->SummonCreature(NPC_DEMON_GUARDIAN, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), 0.0f, TEMPSUMMON_DEAD_DESPAWN, 0)) - guardian->AI()->AttackStart(player); - } - - return true; + if (Creature* guardian = player->SummonCreature(NPC_DEMON_GUARDIAN, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), 0.0f, TEMPSUMMON_DEAD_DESPAWN, 0)) + guardian->AI()->AttackStart(player); } + + return true; + } }; void AddSC_desolace() diff --git a/src/server/scripts/Kalimdor/zone_durotar.cpp b/src/server/scripts/Kalimdor/zone_durotar.cpp index d1f7a3e77..4d28eca88 100644 --- a/src/server/scripts/Kalimdor/zone_durotar.cpp +++ b/src/server/scripts/Kalimdor/zone_durotar.cpp @@ -80,362 +80,364 @@ enum Points class npc_tiger_matriarch_credit : public CreatureScript { - public: - npc_tiger_matriarch_credit() : CreatureScript("npc_tiger_matriarch_credit") { } +public: + npc_tiger_matriarch_credit() : CreatureScript("npc_tiger_matriarch_credit") { } - struct npc_tiger_matriarch_creditAI : public ScriptedAI + struct npc_tiger_matriarch_creditAI : public ScriptedAI + { + npc_tiger_matriarch_creditAI(Creature* creature) : ScriptedAI(creature) { - npc_tiger_matriarch_creditAI(Creature* creature) : ScriptedAI(creature) - { - SetCombatMovement(false); - events.ScheduleEvent(EVENT_CHECK_SUMMON_AURA, 2000); - } - - void UpdateAI(uint32 diff) - { - events.Update(diff); - - if (events.ExecuteEvent() == EVENT_CHECK_SUMMON_AURA) - { - std::list tigers; - GetCreatureListWithEntryInGrid(tigers, me, NPC_TIGER_VEHICLE, 15.0f); - if (!tigers.empty()) - { - for (std::list::iterator itr = tigers.begin(); itr != tigers.end(); ++itr) - { - if (!(*itr)->IsSummon()) - continue; - - if (Unit* summoner = (*itr)->ToTempSummon()->GetSummoner()) - if (!summoner->HasAura(SPELL_NO_SUMMON_AURA) && !summoner->HasAura(SPELL_SUMMON_ZENTABRA_TRIGGER) - && !summoner->IsInCombat()) - { - me->AddAura(SPELL_NO_SUMMON_AURA, summoner); - me->AddAura(SPELL_DETECT_INVIS, summoner); - summoner->CastSpell(summoner, SPELL_SUMMON_MATRIARCH, true); - Talk(SAY_MATRIARCH_AGGRO, summoner); - } - } - } - - events.ScheduleEvent(EVENT_CHECK_SUMMON_AURA, 5000); - } - } - - private: - EventMap events; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_tiger_matriarch_creditAI(creature); + SetCombatMovement(false); + events.ScheduleEvent(EVENT_CHECK_SUMMON_AURA, 2000); } + + void UpdateAI(uint32 diff) + { + events.Update(diff); + + if (events.ExecuteEvent() == EVENT_CHECK_SUMMON_AURA) + { + std::list tigers; + GetCreatureListWithEntryInGrid(tigers, me, NPC_TIGER_VEHICLE, 15.0f); + if (!tigers.empty()) + { + for (std::list::iterator itr = tigers.begin(); itr != tigers.end(); ++itr) + { + if (!(*itr)->IsSummon()) + continue; + + if (Unit* summoner = (*itr)->ToTempSummon()->GetSummoner()) + if (!summoner->HasAura(SPELL_NO_SUMMON_AURA) && !summoner->HasAura(SPELL_SUMMON_ZENTABRA_TRIGGER) + && !summoner->IsInCombat()) + { + me->AddAura(SPELL_NO_SUMMON_AURA, summoner); + me->AddAura(SPELL_DETECT_INVIS, summoner); + summoner->CastSpell(summoner, SPELL_SUMMON_MATRIARCH, true); + Talk(SAY_MATRIARCH_AGGRO, summoner); + } + } + } + + events.ScheduleEvent(EVENT_CHECK_SUMMON_AURA, 5000); + } + } + + private: + EventMap events; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_tiger_matriarch_creditAI(creature); + } }; class npc_tiger_matriarch : public CreatureScript { - public: - npc_tiger_matriarch() : CreatureScript("npc_tiger_matriarch") { } +public: + npc_tiger_matriarch() : CreatureScript("npc_tiger_matriarch") { } - struct npc_tiger_matriarchAI : public ScriptedAI + struct npc_tiger_matriarchAI : public ScriptedAI + { + npc_tiger_matriarchAI(Creature* creature) : ScriptedAI(creature), + _tigerGuid(0) { - npc_tiger_matriarchAI(Creature* creature) : ScriptedAI(creature), - _tigerGuid(0) + } + + void EnterCombat(Unit* /*target*/) + { + _events.Reset(); + _events.ScheduleEvent(EVENT_POUNCE, 100); + _events.ScheduleEvent(EVENT_NOSUMMON, 50000); + } + + void IsSummonedBy(Unit* summoner) + { + if (summoner->GetTypeId() != TYPEID_PLAYER || !summoner->GetVehicle()) + return; + + _tigerGuid = summoner->GetVehicle()->GetBase()->GetGUID(); + if (Unit* tiger = ObjectAccessor::GetUnit(*me, _tigerGuid)) { + me->AddThreat(tiger, 500000.0f); + DoCast(me, SPELL_FURIOUS_BITE); } + } - void EnterCombat(Unit* /*target*/) + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() != TYPEID_UNIT || !victim->IsSummon()) + return; + + if (Unit* vehSummoner = victim->ToTempSummon()->GetSummoner()) { - _events.Reset(); - _events.ScheduleEvent(EVENT_POUNCE, 100); - _events.ScheduleEvent(EVENT_NOSUMMON, 50000); + vehSummoner->RemoveAurasDueToSpell(SPELL_NO_SUMMON_AURA); + vehSummoner->RemoveAurasDueToSpell(SPELL_DETECT_INVIS); + vehSummoner->RemoveAurasDueToSpell(SPELL_SPIRIT_OF_THE_TIGER_RIDER); + vehSummoner->RemoveAurasDueToSpell(SPELL_SUMMON_ZENTABRA_TRIGGER); } + me->DespawnOrUnsummon(); + } - void IsSummonedBy(Unit* summoner) + void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType, SpellSchoolMask) + { + if (!attacker || !attacker->IsSummon()) + return; + + if (HealthBelowPct(20)) { - if (summoner->GetTypeId() != TYPEID_PLAYER || !summoner->GetVehicle()) - return; - - _tigerGuid = summoner->GetVehicle()->GetBase()->GetGUID(); - if (Unit* tiger = ObjectAccessor::GetUnit(*me, _tigerGuid)) - { - me->AddThreat(tiger, 500000.0f); - DoCast(me, SPELL_FURIOUS_BITE); - } - } - - void KilledUnit(Unit* victim) - { - if (victim->GetTypeId() != TYPEID_UNIT || !victim->IsSummon()) - return; - - if (Unit* vehSummoner = victim->ToTempSummon()->GetSummoner()) + damage = 0; + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + if (Unit* vehSummoner = attacker->ToTempSummon()->GetSummoner()) { + vehSummoner->AddAura(SPELL_SUMMON_ZENTABRA_TRIGGER, vehSummoner); + vehSummoner->CastSpell(vehSummoner, SPELL_SUMMON_ZENTABRA, true); + attacker->CastSpell(attacker, SPELL_EJECT_PASSENGERS, true); vehSummoner->RemoveAurasDueToSpell(SPELL_NO_SUMMON_AURA); vehSummoner->RemoveAurasDueToSpell(SPELL_DETECT_INVIS); vehSummoner->RemoveAurasDueToSpell(SPELL_SPIRIT_OF_THE_TIGER_RIDER); vehSummoner->RemoveAurasDueToSpell(SPELL_SUMMON_ZENTABRA_TRIGGER); } + me->DespawnOrUnsummon(); } - - void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType, SpellSchoolMask) - { - if (!attacker || !attacker->IsSummon()) - return; - - if (HealthBelowPct(20)) - { - damage = 0; - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - if (Unit* vehSummoner = attacker->ToTempSummon()->GetSummoner()) - { - vehSummoner->AddAura(SPELL_SUMMON_ZENTABRA_TRIGGER, vehSummoner); - vehSummoner->CastSpell(vehSummoner, SPELL_SUMMON_ZENTABRA, true); - attacker->CastSpell(attacker, SPELL_EJECT_PASSENGERS, true); - vehSummoner->RemoveAurasDueToSpell(SPELL_NO_SUMMON_AURA); - vehSummoner->RemoveAurasDueToSpell(SPELL_DETECT_INVIS); - vehSummoner->RemoveAurasDueToSpell(SPELL_SPIRIT_OF_THE_TIGER_RIDER); - vehSummoner->RemoveAurasDueToSpell(SPELL_SUMMON_ZENTABRA_TRIGGER); - } - - me->DespawnOrUnsummon(); - } - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - if (!_tigerGuid) - return; - - _events.Update(diff); - - while (uint32 eventId = _events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_POUNCE: - DoCastVictim(SPELL_POUNCE); - _events.ScheduleEvent(EVENT_POUNCE, 30000); - break; - case EVENT_NOSUMMON: // Reapply SPELL_NO_SUMMON_AURA - if (Unit* tiger = ObjectAccessor::GetUnit(*me, _tigerGuid)) - { - if (tiger->IsSummon()) - if (Unit* vehSummoner = tiger->ToTempSummon()->GetSummoner()) - me->AddAura(SPELL_NO_SUMMON_AURA, vehSummoner); - } - _events.ScheduleEvent(EVENT_NOSUMMON, 50000); - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); - } - - private: - EventMap _events; - uint64 _tigerGuid; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_tiger_matriarchAI(creature); } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + if (!_tigerGuid) + return; + + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_POUNCE: + DoCastVictim(SPELL_POUNCE); + _events.ScheduleEvent(EVENT_POUNCE, 30000); + break; + case EVENT_NOSUMMON: // Reapply SPELL_NO_SUMMON_AURA + if (Unit* tiger = ObjectAccessor::GetUnit(*me, _tigerGuid)) + { + if (tiger->IsSummon()) + if (Unit* vehSummoner = tiger->ToTempSummon()->GetSummoner()) + me->AddAura(SPELL_NO_SUMMON_AURA, vehSummoner); + } + _events.ScheduleEvent(EVENT_NOSUMMON, 50000); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + + private: + EventMap _events; + uint64 _tigerGuid; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_tiger_matriarchAI(creature); + } }; // These models was found in sniff. /// @todo generalize these models with race from dbc uint32 const trollmodel[] = -{11665, 11734, 11750, 12037, 12038, 12042, 12049, 12849, 13529, 14759, 15570, 15701, -15702, 1882, 1897, 1976, 2025, 27286, 2734, 2735, 4084, 4085, 4087, 4089, 4231, 4357, -4358, 4360, 4361, 4362, 4363, 4370, 4532, 4537, 4540, 4610, 6839, 7037, 9767, 9768}; +{ + 11665, 11734, 11750, 12037, 12038, 12042, 12049, 12849, 13529, 14759, 15570, 15701, + 15702, 1882, 1897, 1976, 2025, 27286, 2734, 2735, 4084, 4085, 4087, 4089, 4231, 4357, + 4358, 4360, 4361, 4362, 4363, 4370, 4532, 4537, 4540, 4610, 6839, 7037, 9767, 9768 +}; class npc_troll_volunteer : public CreatureScript { - public: - npc_troll_volunteer() : CreatureScript("npc_troll_volunteer") { } +public: + npc_troll_volunteer() : CreatureScript("npc_troll_volunteer") { } - struct npc_troll_volunteerAI : public ScriptedAI + struct npc_troll_volunteerAI : public ScriptedAI + { + npc_troll_volunteerAI(Creature* creature) : ScriptedAI(creature) { - npc_troll_volunteerAI(Creature* creature) : ScriptedAI(creature) - { - } - - void InitializeAI() - { - if (me->isDead() || !me->GetOwner()) - return; - - Reset(); - - switch (urand(0, 3)) - { - case 0: - _mountModel = 6471; - break; - case 1: - _mountModel = 6473; - break; - case 2: - _mountModel = 6469; - break; - default: - _mountModel = 6472; - break; - } - me->SetDisplayId(trollmodel[urand(0, 39)]); - if (Player* player = me->GetOwner()->ToPlayer()) - me->GetMotionMaster()->MoveFollow(player, 5.0f, float(rand_norm() + 1.0f) * M_PI / 3.0f * 4.0f); - } - - void Reset() - { - _complete = false; - me->AddAura(SPELL_VOLUNTEER_AURA, me); - me->AddAura(SPELL_MOUNTING_CHECK, me); - DoCast(me, SPELL_PETACT_AURA); - me->SetReactState(REACT_PASSIVE); - Talk(SAY_VOLUNTEER_START); - } - - // This is needed for mount check aura to know what mountmodel the npc got stored - uint32 GetMountId() - { - return _mountModel; - } - - void MovementInform(uint32 type, uint32 id) - { - if (type != POINT_MOTION_TYPE) - return; - if (id == POINT_URUZIN) - me->DespawnOrUnsummon(); - } - - void SpellHit(Unit* caster, SpellInfo const* spell) - { - if (spell->Id == SPELL_AOE_TURNIN && caster->GetEntry() == NPC_URUZIN && !_complete) - { - _complete = true; // Preventing from giving credit twice - DoCast(me, SPELL_TURNIN); - DoCast(me, SPELL_QUEST_CREDIT); - me->RemoveAurasDueToSpell(SPELL_MOUNTING_CHECK); - me->Dismount(); - Talk(SAY_VOLUNTEER_END); - me->GetMotionMaster()->MovePoint(POINT_URUZIN, caster->GetPositionX(), caster->GetPositionY(), caster->GetPositionZ()); - } - } - - private: - uint32 _mountModel; - bool _complete; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_troll_volunteerAI(creature); } + + void InitializeAI() + { + if (me->isDead() || !me->GetOwner()) + return; + + Reset(); + + switch (urand(0, 3)) + { + case 0: + _mountModel = 6471; + break; + case 1: + _mountModel = 6473; + break; + case 2: + _mountModel = 6469; + break; + default: + _mountModel = 6472; + break; + } + me->SetDisplayId(trollmodel[urand(0, 39)]); + if (Player* player = me->GetOwner()->ToPlayer()) + me->GetMotionMaster()->MoveFollow(player, 5.0f, float(rand_norm() + 1.0f) * M_PI / 3.0f * 4.0f); + } + + void Reset() + { + _complete = false; + me->AddAura(SPELL_VOLUNTEER_AURA, me); + me->AddAura(SPELL_MOUNTING_CHECK, me); + DoCast(me, SPELL_PETACT_AURA); + me->SetReactState(REACT_PASSIVE); + Talk(SAY_VOLUNTEER_START); + } + + // This is needed for mount check aura to know what mountmodel the npc got stored + uint32 GetMountId() + { + return _mountModel; + } + + void MovementInform(uint32 type, uint32 id) + { + if (type != POINT_MOTION_TYPE) + return; + if (id == POINT_URUZIN) + me->DespawnOrUnsummon(); + } + + void SpellHit(Unit* caster, SpellInfo const* spell) + { + if (spell->Id == SPELL_AOE_TURNIN && caster->GetEntry() == NPC_URUZIN && !_complete) + { + _complete = true; // Preventing from giving credit twice + DoCast(me, SPELL_TURNIN); + DoCast(me, SPELL_QUEST_CREDIT); + me->RemoveAurasDueToSpell(SPELL_MOUNTING_CHECK); + me->Dismount(); + Talk(SAY_VOLUNTEER_END); + me->GetMotionMaster()->MovePoint(POINT_URUZIN, caster->GetPositionX(), caster->GetPositionY(), caster->GetPositionZ()); + } + } + + private: + uint32 _mountModel; + bool _complete; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_troll_volunteerAI(creature); + } }; typedef npc_troll_volunteer::npc_troll_volunteerAI VolunteerAI; class spell_mount_check : public SpellScriptLoader { - public: - spell_mount_check() : SpellScriptLoader("spell_mount_check") { } +public: + spell_mount_check() : SpellScriptLoader("spell_mount_check") { } - class spell_mount_check_AuraScript : public AuraScript + class spell_mount_check_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mount_check_AuraScript) + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_mount_check_AuraScript) - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_MOUNTING_CHECK)) - return false; - return true; - } - - void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) - { - Unit* target = GetTarget(); - Unit* owner = target->GetOwner(); - - if (!owner) - return; - - if (owner->IsMounted() && !target->IsMounted()) - { - if (VolunteerAI* volunteerAI = CAST_AI(VolunteerAI, target->GetAI())) - target->Mount(volunteerAI->GetMountId()); - } - else if (!owner->IsMounted() && target->IsMounted()) - target->Dismount(); - - target->SetSpeed(MOVE_RUN, owner->GetSpeedRate(MOVE_RUN)); - target->SetSpeed(MOVE_WALK, owner->GetSpeedRate(MOVE_WALK)); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_mount_check_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_mount_check_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_MOUNTING_CHECK)) + return false; + return true; } + + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) + { + Unit* target = GetTarget(); + Unit* owner = target->GetOwner(); + + if (!owner) + return; + + if (owner->IsMounted() && !target->IsMounted()) + { + if (VolunteerAI* volunteerAI = CAST_AI(VolunteerAI, target->GetAI())) + target->Mount(volunteerAI->GetMountId()); + } + else if (!owner->IsMounted() && target->IsMounted()) + target->Dismount(); + + target->SetSpeed(MOVE_RUN, owner->GetSpeedRate(MOVE_RUN)); + target->SetSpeed(MOVE_WALK, owner->GetSpeedRate(MOVE_WALK)); + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_mount_check_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_mount_check_AuraScript(); + } }; class spell_voljin_war_drums : public SpellScriptLoader { - public: - spell_voljin_war_drums() : SpellScriptLoader("spell_voljin_war_drums") { } +public: + spell_voljin_war_drums() : SpellScriptLoader("spell_voljin_war_drums") { } - class spell_voljin_war_drums_SpellScript : public SpellScript + class spell_voljin_war_drums_SpellScript : public SpellScript + { + PrepareSpellScript(spell_voljin_war_drums_SpellScript) + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_voljin_war_drums_SpellScript) - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_MOTIVATE_1)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_MOTIVATE_2)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - if (Unit* target = GetHitUnit()) - { - uint32 motivate = 0; - if (target->GetEntry() == NPC_CITIZEN_1) - motivate = SPELL_MOTIVATE_1; - else if (target->GetEntry() == NPC_CITIZEN_2) - motivate = SPELL_MOTIVATE_2; - if (motivate) - caster->CastSpell(target, motivate, false); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_voljin_war_drums_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_voljin_war_drums_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_MOTIVATE_1)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_MOTIVATE_2)) + return false; + return true; } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (Unit* target = GetHitUnit()) + { + uint32 motivate = 0; + if (target->GetEntry() == NPC_CITIZEN_1) + motivate = SPELL_MOTIVATE_1; + else if (target->GetEntry() == NPC_CITIZEN_2) + motivate = SPELL_MOTIVATE_2; + if (motivate) + caster->CastSpell(target, motivate, false); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_voljin_war_drums_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_voljin_war_drums_SpellScript(); + } }; enum VoodooSpells @@ -452,40 +454,40 @@ enum VoodooSpells // 17009 class spell_voodoo : public SpellScriptLoader { - public: - spell_voodoo() : SpellScriptLoader("spell_voodoo") { } +public: + spell_voodoo() : SpellScriptLoader("spell_voodoo") { } - class spell_voodoo_SpellScript : public SpellScript + class spell_voodoo_SpellScript : public SpellScript + { + PrepareSpellScript(spell_voodoo_SpellScript) + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_voodoo_SpellScript) - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_BREW) || !sSpellMgr->GetSpellInfo(SPELL_GHOSTLY) || + if (!sSpellMgr->GetSpellInfo(SPELL_BREW) || !sSpellMgr->GetSpellInfo(SPELL_GHOSTLY) || !sSpellMgr->GetSpellInfo(SPELL_HEX1) || !sSpellMgr->GetSpellInfo(SPELL_HEX2) || !sSpellMgr->GetSpellInfo(SPELL_HEX3) || !sSpellMgr->GetSpellInfo(SPELL_GROW) || !sSpellMgr->GetSpellInfo(SPELL_LAUNCH)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - uint32 spellid = RAND(SPELL_BREW, SPELL_GHOSTLY, RAND(SPELL_HEX1, SPELL_HEX2, SPELL_HEX3), SPELL_GROW, SPELL_LAUNCH); - if (Unit* target = GetHitUnit()) - GetCaster()->CastSpell(target, spellid, false); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_voodoo_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_voodoo_SpellScript(); + return false; + return true; } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + uint32 spellid = RAND(SPELL_BREW, SPELL_GHOSTLY, RAND(SPELL_HEX1, SPELL_HEX2, SPELL_HEX3), SPELL_GROW, SPELL_LAUNCH); + if (Unit* target = GetHitUnit()) + GetCaster()->CastSpell(target, spellid, false); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_voodoo_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_voodoo_SpellScript(); + } }; void AddSC_durotar() diff --git a/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp b/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp index 05898fd16..274d5be3f 100644 --- a/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp +++ b/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp @@ -169,7 +169,7 @@ public: AttackStart(pAttacker); } - void DamageTaken(Unit* pDoneBy, uint32 &Damage, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit* pDoneBy, uint32& Damage, DamageEffectType, SpellSchoolMask) { if (Damage >= me->GetHealth() || me->HealthBelowPctDamaged(20, Damage)) { @@ -213,7 +213,7 @@ public: return true; } - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const { return new npc_archmage_tervoshAI(creature); } @@ -311,133 +311,133 @@ enum SpellScripts class spell_ooze_zap : public SpellScriptLoader { - public: - spell_ooze_zap() : SpellScriptLoader("spell_ooze_zap") { } +public: + spell_ooze_zap() : SpellScriptLoader("spell_ooze_zap") { } - class spell_ooze_zap_SpellScript : public SpellScript + class spell_ooze_zap_SpellScript : public SpellScript + { + PrepareSpellScript(spell_ooze_zap_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_ooze_zap_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_OOZE_ZAP)) - return false; - return true; - } - - SpellCastResult CheckRequirement() - { - if (!GetCaster()->HasAura(GetSpellInfo()->Effects[EFFECT_1].CalcValue())) - return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; // This is actually correct - - if (!GetExplTargetUnit()) - return SPELL_FAILED_BAD_TARGETS; - - return SPELL_CAST_OK; - } - - void HandleDummy(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (GetHitUnit()) - GetCaster()->CastSpell(GetHitUnit(), uint32(GetEffectValue()), true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_ooze_zap_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - OnCheckCast += SpellCheckCastFn(spell_ooze_zap_SpellScript::CheckRequirement); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_ooze_zap_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_OOZE_ZAP)) + return false; + return true; } + + SpellCastResult CheckRequirement() + { + if (!GetCaster()->HasAura(GetSpellInfo()->Effects[EFFECT_1].CalcValue())) + return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; // This is actually correct + + if (!GetExplTargetUnit()) + return SPELL_FAILED_BAD_TARGETS; + + return SPELL_CAST_OK; + } + + void HandleDummy(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (GetHitUnit()) + GetCaster()->CastSpell(GetHitUnit(), uint32(GetEffectValue()), true); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_ooze_zap_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + OnCheckCast += SpellCheckCastFn(spell_ooze_zap_SpellScript::CheckRequirement); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_ooze_zap_SpellScript(); + } }; class spell_ooze_zap_channel_end : public SpellScriptLoader { - public: - spell_ooze_zap_channel_end() : SpellScriptLoader("spell_ooze_zap_channel_end") { } +public: + spell_ooze_zap_channel_end() : SpellScriptLoader("spell_ooze_zap_channel_end") { } - class spell_ooze_zap_channel_end_SpellScript : public SpellScript + class spell_ooze_zap_channel_end_SpellScript : public SpellScript + { + PrepareSpellScript(spell_ooze_zap_channel_end_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_ooze_zap_channel_end_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_OOZE_ZAP_CHANNEL_END)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Player* player = GetCaster()->ToPlayer()) - player->CastSpell(player, SPELL_OOZE_CHANNEL_CREDIT, true); - Unit::Kill(GetHitUnit(), GetHitUnit()); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_ooze_zap_channel_end_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_ooze_zap_channel_end_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_OOZE_ZAP_CHANNEL_END)) + return false; + return true; } + + void HandleDummy(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (Player* player = GetCaster()->ToPlayer()) + player->CastSpell(player, SPELL_OOZE_CHANNEL_CREDIT, true); + Unit::Kill(GetHitUnit(), GetHitUnit()); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_ooze_zap_channel_end_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_ooze_zap_channel_end_SpellScript(); + } }; class spell_energize_aoe : public SpellScriptLoader { - public: - spell_energize_aoe() : SpellScriptLoader("spell_energize_aoe") { } +public: + spell_energize_aoe() : SpellScriptLoader("spell_energize_aoe") { } - class spell_energize_aoe_SpellScript : public SpellScript + class spell_energize_aoe_SpellScript : public SpellScript + { + PrepareSpellScript(spell_energize_aoe_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_energize_aoe_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_ENERGIZED)) - return false; - return true; - } - - void FilterTargets(std::list& targets) - { - for (std::list::iterator itr = targets.begin(); itr != targets.end();) - { - if ((*itr)->GetTypeId() == TYPEID_PLAYER && (*itr)->ToPlayer()->GetQuestStatus(GetSpellInfo()->Effects[EFFECT_1].CalcValue()) == QUEST_STATUS_INCOMPLETE) - ++itr; - else - targets.erase(itr++); - } - targets.push_back(GetCaster()); - } - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetCaster()->CastSpell(GetCaster(), uint32(GetEffectValue()), true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_energize_aoe_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_energize_aoe_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_energize_aoe_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENTRY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_energize_aoe_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_ENERGIZED)) + return false; + return true; } + + void FilterTargets(std::list& targets) + { + for (std::list::iterator itr = targets.begin(); itr != targets.end();) + { + if ((*itr)->GetTypeId() == TYPEID_PLAYER && (*itr)->ToPlayer()->GetQuestStatus(GetSpellInfo()->Effects[EFFECT_1].CalcValue()) == QUEST_STATUS_INCOMPLETE) + ++itr; + else + targets.erase(itr++); + } + targets.push_back(GetCaster()); + } + + void HandleScript(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + GetCaster()->CastSpell(GetCaster(), uint32(GetEffectValue()), true); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_energize_aoe_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_energize_aoe_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_energize_aoe_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENTRY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_energize_aoe_SpellScript(); + } }; void AddSC_dustwallow_marsh() diff --git a/src/server/scripts/Kalimdor/zone_felwood.cpp b/src/server/scripts/Kalimdor/zone_felwood.cpp index e5f188446..0d170b99f 100644 --- a/src/server/scripts/Kalimdor/zone_felwood.cpp +++ b/src/server/scripts/Kalimdor/zone_felwood.cpp @@ -45,7 +45,7 @@ public: bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override { ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF + 1) { CloseGossipMenuFor(player); creature->CastSpell(player, SPELL_CENARION_BEACON, false); @@ -64,10 +64,11 @@ public: { if (player->GetQuestRewardStatus(QUEST_CLEASING_FELWOOD_A)) { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BEACON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BEACON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); SendGossipMenuFor(player, 2848, creature->GetGUID()); - } else if (player->GetTeamId() == TEAM_HORDE) - SendGossipMenuFor(player, 2845, creature->GetGUID()); + } + else if (player->GetTeamId() == TEAM_HORDE) + SendGossipMenuFor(player, 2845, creature->GetGUID()); else SendGossipMenuFor(player, 2844, creature->GetGUID()); } @@ -76,10 +77,11 @@ public: { if (player->GetQuestRewardStatus(QUEST_CLEASING_FELWOOD_H)) { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BEACON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BEACON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); SendGossipMenuFor(player, 2849, creature->GetGUID()); - } else if (player->GetTeamId() == TEAM_ALLIANCE) - SendGossipMenuFor(player, 2843, creature->GetGUID()); + } + else if (player->GetTeamId() == TEAM_ALLIANCE) + SendGossipMenuFor(player, 2843, creature->GetGUID()); else SendGossipMenuFor(player, 2842, creature->GetGUID()); } @@ -103,25 +105,25 @@ enum AncientMisc class at_ancient_leaf : public AreaTriggerScript { - public: - at_ancient_leaf() : AreaTriggerScript("at_ancient_leaf") { } +public: + at_ancient_leaf() : AreaTriggerScript("at_ancient_leaf") { } - bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/) - { - if (player->IsGameMaster() || !player->IsAlive()) - return false; - - // Handle Call Ancients event start - The area trigger summons 3 ancients - if ((player->GetQuestStatus(QUEST_ANCIENT_LEAF) == QUEST_STATUS_COMPLETE) || (player->GetQuestStatus(QUEST_ANCIENT_LEAF) == QUEST_STATUS_REWARDED)) - { - // If ancients are already spawned, skip the rest - if (GetClosestCreatureWithEntry(player, NPC_VARTRUS, 50.0f) || GetClosestCreatureWithEntry(player, NPC_STOMA, 50.0f) || GetClosestCreatureWithEntry(player, NPC_HASTAT, 50.0f)) - return true; - - player->GetMap()->SummonCreatureGroup(CREATURE_GROUP_ANCIENTS); - } + bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/) + { + if (player->IsGameMaster() || !player->IsAlive()) return false; + + // Handle Call Ancients event start - The area trigger summons 3 ancients + if ((player->GetQuestStatus(QUEST_ANCIENT_LEAF) == QUEST_STATUS_COMPLETE) || (player->GetQuestStatus(QUEST_ANCIENT_LEAF) == QUEST_STATUS_REWARDED)) + { + // If ancients are already spawned, skip the rest + if (GetClosestCreatureWithEntry(player, NPC_VARTRUS, 50.0f) || GetClosestCreatureWithEntry(player, NPC_STOMA, 50.0f) || GetClosestCreatureWithEntry(player, NPC_HASTAT, 50.0f)) + return true; + + player->GetMap()->SummonCreatureGroup(CREATURE_GROUP_ANCIENTS); } + return false; + } }; void AddSC_felwood() diff --git a/src/server/scripts/Kalimdor/zone_feralas.cpp b/src/server/scripts/Kalimdor/zone_feralas.cpp index 798b5cd14..29f199775 100644 --- a/src/server/scripts/Kalimdor/zone_feralas.cpp +++ b/src/server/scripts/Kalimdor/zone_feralas.cpp @@ -33,7 +33,7 @@ public: bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override { ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF + 1) { AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); SendGossipMenuFor(player, 2434, creature->GetGUID()); @@ -49,7 +49,7 @@ public: player->PrepareQuestMenu(creature->GetGUID()); if (creature->IsVendor() && player->GetQuestStatus(3909) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); SendGossipMenuFor(player, 2433, creature->GetGUID()); return true; @@ -178,33 +178,33 @@ enum GordunniTrap class spell_gordunni_trap : public SpellScriptLoader { - public: - spell_gordunni_trap() : SpellScriptLoader("spell_gordunni_trap") { } +public: + spell_gordunni_trap() : SpellScriptLoader("spell_gordunni_trap") { } - class spell_gordunni_trap_SpellScript : public SpellScript + class spell_gordunni_trap_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gordunni_trap_SpellScript); + + void HandleDummy() { - PrepareSpellScript(spell_gordunni_trap_SpellScript); - - void HandleDummy() - { - if (Unit* caster = GetCaster()) - if (GameObject* chest = caster->SummonGameObject(GO_GORDUNNI_DIRT_MOUND, caster->GetPositionX(), caster->GetPositionY(), caster->GetPositionZ(), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0)) - { - chest->SetSpellId(GetSpellInfo()->Id); - caster->RemoveGameObject(chest, false); - } - } - - void Register() - { - OnCast += SpellCastFn(spell_gordunni_trap_SpellScript::HandleDummy); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gordunni_trap_SpellScript(); + if (Unit* caster = GetCaster()) + if (GameObject* chest = caster->SummonGameObject(GO_GORDUNNI_DIRT_MOUND, caster->GetPositionX(), caster->GetPositionY(), caster->GetPositionZ(), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0)) + { + chest->SetSpellId(GetSpellInfo()->Id); + caster->RemoveGameObject(chest, false); + } } + + void Register() + { + OnCast += SpellCastFn(spell_gordunni_trap_SpellScript::HandleDummy); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gordunni_trap_SpellScript(); + } }; /*###### diff --git a/src/server/scripts/Kalimdor/zone_moonglade.cpp b/src/server/scripts/Kalimdor/zone_moonglade.cpp index 4c01c8c44..eb4d714f4 100644 --- a/src/server/scripts/Kalimdor/zone_moonglade.cpp +++ b/src/server/scripts/Kalimdor/zone_moonglade.cpp @@ -216,7 +216,7 @@ public: float const Clintar_spirit_WP[41][5] = { - //pos_x pos_y pos_z orien waitTime + //pos_x pos_y pos_z orien waitTime {7465.28f, -3115.46f, 439.327f, 0.83f, 4000}, {7476.49f, -3101, 443.457f, 0.89f, 0}, {7486.57f, -3085.59f, 439.478f, 1.07f, 0}, @@ -390,7 +390,8 @@ public: if (player && player->IsInCombat() && player->getAttackerForHelper()) AttackStart(player->getAttackerForHelper()); checkPlayerTimer = 1000; - } else checkPlayerTimer -= diff; + } + else checkPlayerTimer -= diff; } if (EventOnWait && EventTimer <= diff) @@ -531,7 +532,8 @@ public: break; } - } else if (EventOnWait) EventTimer -= diff; + } + else if (EventOnWait) EventTimer -= diff; } void WaypointReached(uint32 waypointId) @@ -662,7 +664,7 @@ public: void Reset() { events.Reset(); - events.ScheduleEvent(EVENT_DESPAWN, 5*MINUTE*IN_MILLISECONDS); + events.ScheduleEvent(EVENT_DESPAWN, 5 * MINUTE * IN_MILLISECONDS); } void UpdateAI(uint32 diff) diff --git a/src/server/scripts/Kalimdor/zone_orgrimmar.cpp b/src/server/scripts/Kalimdor/zone_orgrimmar.cpp index b98413c39..4b3319572 100644 --- a/src/server/scripts/Kalimdor/zone_orgrimmar.cpp +++ b/src/server/scripts/Kalimdor/zone_orgrimmar.cpp @@ -83,7 +83,8 @@ public: player->FailQuest(QUEST_SHATTERED_SALUTE); } Reset(); - } else ResetTimer -= diff; + } + else ResetTimer -= diff; } if (CanTalk && !CanEmote) @@ -93,7 +94,8 @@ public: me->HandleEmoteCommand(EMOTE_ONESHOT_SALUTE); CanEmote = true; ResetTimer = 60000; - } else SaluteTimer -= diff; + } + else SaluteTimer -= diff; } if (!UpdateVictim()) @@ -149,27 +151,27 @@ public: switch (action) { case GOSSIP_ACTION_INFO_DEF+1: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_STW1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_STW1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); SendGossipMenuFor(player, 5733, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+2: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_STW2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_STW2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); SendGossipMenuFor(player, 5734, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+3: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_STW3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_STW3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); SendGossipMenuFor(player, 5735, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+4: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_STW4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_STW4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); SendGossipMenuFor(player, 5736, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+5: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_STW5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+6); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_STW5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); SendGossipMenuFor(player, 5737, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+6: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_STW6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+7); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_STW6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 7); SendGossipMenuFor(player, 5738, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+7: @@ -186,7 +188,7 @@ public: player->PrepareQuestMenu(creature->GetGUID()); if (player->GetQuestStatus(QUEST_6566) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HTW, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HTW, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); return true; @@ -221,13 +223,15 @@ public: { DoCastVictim(SPELL_CHAIN_LIGHTNING); ChainLightningTimer = 9000; - } else ChainLightningTimer -= diff; + } + else ChainLightningTimer -= diff; if (ShockTimer <= diff) { DoCastVictim(SPELL_SHOCK); ShockTimer = 15000; - } else ShockTimer -= diff; + } + else ShockTimer -= diff; DoMeleeAttackIfReady(); } diff --git a/src/server/scripts/Kalimdor/zone_silithus.cpp b/src/server/scripts/Kalimdor/zone_silithus.cpp index d73846313..cf5184562 100644 --- a/src/server/scripts/Kalimdor/zone_silithus.cpp +++ b/src/server/scripts/Kalimdor/zone_silithus.cpp @@ -88,7 +88,7 @@ public: break; case GOSSIP_ACTION_INFO_DEF + 6: SendGossipMenuFor(player, 7761, creature->GetGUID()); - //'kill' our trigger to update quest status + //'kill' our trigger to update quest status player->KilledMonsterCredit(TRIGGER_RUTGAR, 0); break; @@ -114,7 +114,7 @@ public: break; case GOSSIP_ACTION_INFO_DEF + 14: SendGossipMenuFor(player, 7767, creature->GetGUID()); - //'kill' our trigger to update quest status + //'kill' our trigger to update quest status player->KilledMonsterCredit(TRIGGER_FRANKAL, 0); break; } @@ -127,14 +127,14 @@ public: player->PrepareQuestMenu(creature->GetGUID()); if (player->GetQuestStatus(8304) == QUEST_STATUS_INCOMPLETE && - creature->GetEntry() == 15170 && - !player->GetReqKillOrCastCurrentCount(8304, TRIGGER_RUTGAR)) + creature->GetEntry() == 15170 && + !player->GetReqKillOrCastCurrentCount(8304, TRIGGER_RUTGAR)) AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); if (player->GetQuestStatus(8304) == QUEST_STATUS_INCOMPLETE && - creature->GetEntry() == 15171 && - player->GetReqKillOrCastCurrentCount(8304, TRIGGER_RUTGAR)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+9); + creature->GetEntry() == 15171 && + player->GetReqKillOrCastCurrentCount(8304, TRIGGER_RUTGAR)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9); SendGossipMenuFor(player, 7754, creature->GetGUID()); @@ -223,7 +223,7 @@ struct QuestCinematic }; // Creature 0 - Anachronos, 1 - Fandral, 2 - Arygos, 3 - Merithra, 4 - Caelestrasz -static QuestCinematic EventAnim[]= +static QuestCinematic EventAnim[] = { {ANACHRONOS_SAY_1, 0, 2000}, {FANDRAL_SAY_1, 1, 4000}, @@ -636,20 +636,20 @@ public: Fandral->CastSpell(-8127, 1525, 17.5f, 33806, true); break; case 51: - { - uint32 entries[4] = { 15423, 15424, 15414, 15422 }; - Unit* mob = nullptr; - for (uint8 i = 0; i < 4; ++i) { - mob = player->FindNearestCreature(entries[i], 50, me); - while (mob) + uint32 entries[4] = { 15423, 15424, 15414, 15422 }; + Unit* mob = nullptr; + for (uint8 i = 0; i < 4; ++i) { - mob->RemoveFromWorld(); - mob = player->FindNearestCreature(15423, 50, me); + mob = player->FindNearestCreature(entries[i], 50, me); + while (mob) + { + mob->RemoveFromWorld(); + mob = player->FindNearestCreature(15423, 50, me); + } } + break; } - break; - } case 52: Fandral->GetMotionMaster()->MoveCharge(-8028.75f, 1538.795f, 2.61f, 4); Fandral->AI()->Talk(ANACHRONOS_SAY_9, me); @@ -702,7 +702,7 @@ public: { Talk(ARYGOS_YELL_1); AnachronosQuestTrigger->AI()->EnterEvadeMode(); - eventEnd=true; + eventEnd = true; } break; } @@ -775,24 +775,27 @@ public: SpellTimer4 = SpawnCast[0].Timer1; Timers = true; } - if (me->GetEntry() == 15424 || me->GetEntry() == 15422|| me->GetEntry() == 15414) + if (me->GetEntry() == 15424 || me->GetEntry() == 15422 || me->GetEntry() == 15414) { if (SpellTimer1 <= diff) { DoCast(me, SpawnCast[1].SpellId); DoCast(me, 24319); SpellTimer1 = SpawnCast[1].Timer2; - } else SpellTimer1 -= diff; + } + else SpellTimer1 -= diff; if (SpellTimer2 <= diff) { DoCast(me, SpawnCast[2].SpellId); SpellTimer2 = SpawnCast[2].Timer2; - } else SpellTimer2 -= diff; + } + else SpellTimer2 -= diff; if (SpellTimer3 <= diff) { DoCast(me, SpawnCast[3].SpellId); SpellTimer3 = SpawnCast[3].Timer2; - } else SpellTimer3 -= diff; + } + else SpellTimer3 -= diff; } if (me->GetEntry() == 15423 || me->GetEntry() == 15424 || me->GetEntry() == 15422 || me->GetEntry() == 15414) { @@ -802,7 +805,8 @@ public: me->AttackStop(); DoCast(me, 15533); SpellTimer4 = SpawnCast[0].Timer2; - } else SpellTimer4 -= diff; + } + else SpellTimer4 -= diff; } if (!hasTarget) { @@ -897,7 +901,7 @@ public: if (Creature* spawn = me->SummonCreature(WavesInfo[WaveCount].CreatureId, SpawnLocation[i], TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, desptimer)) { if (spawn->GetEntry() == 15423) - spawn->SetUInt32Value(UNIT_FIELD_DISPLAYID, 15427+rand()%4); + spawn->SetUInt32Value(UNIT_FIELD_DISPLAYID, 15427 + rand() % 4); if (i >= 30) WaveCount = 1; if (i >= 33) WaveCount = 2; if (i >= 45) WaveCount = 3; @@ -934,14 +938,14 @@ public: Group::MemberSlotList const& members = EventGroup->GetMemberSlots(); - for (Group::member_citerator itr = members.begin(); itr!= members.end(); ++itr) + for (Group::member_citerator itr = members.begin(); itr != members.end(); ++itr) { groupMember = ObjectAccessor::GetPlayer(*me, itr->guid); if (!groupMember) continue; if (!groupMember->IsWithinDistInMap(me, EVENT_AREA_RADIUS) && groupMember->GetQuestStatus(QUEST_A_PAWN_ON_THE_ETERNAL_BOARD) == QUEST_STATUS_INCOMPLETE) { - groupMember->FailQuest(QUEST_A_PAWN_ON_THE_ETERNAL_BOARD); + groupMember->FailQuest(QUEST_A_PAWN_ON_THE_ETERNAL_BOARD); ++FailedMemberCount; } ++GroupMemberCount; @@ -973,7 +977,8 @@ public: { Talk(WavesInfo[WaveCount].WaveTextId); Announced = true; - } else AnnounceTimer -= diff; + } + else AnnounceTimer -= diff; if (WaveTimer <= diff) SummonNextWave(); @@ -1179,33 +1184,33 @@ enum WSTexts class go_wind_stone : public GameObjectScript { - public: - go_wind_stone() : GameObjectScript("go_wind_stone") { } +public: + go_wind_stone() : GameObjectScript("go_wind_stone") { } - private: - uint8 GetPlayerRank(Player* player) // For random summoning +private: + uint8 GetPlayerRank(Player* player) // For random summoning + { + bool setAura = player->HasAura(AURA_TWILIGHT_SET, player->GetGUID()); + bool medallionAura = player->HasAura(AURA_MEDALLION, player->GetGUID()); + bool ringAura = player->HasAura(AURA_RING, player->GetGUID()); + + if (setAura && medallionAura && ringAura) + return 3; + else if (setAura && medallionAura) + return 2; + else if (setAura) + return 1; + else + return 0; + } + + uint8 GetItems(Player* player, WS type) + { + uint8 result = 0x0; + + switch (type) { - bool setAura = player->HasAura(AURA_TWILIGHT_SET, player->GetGUID()); - bool medallionAura = player->HasAura(AURA_MEDALLION, player->GetGUID()); - bool ringAura = player->HasAura(AURA_RING, player->GetGUID()); - - if (setAura && medallionAura && ringAura) - return 3; - else if (setAura && medallionAura) - return 2; - else if (setAura) - return 1; - else - return 0; - } - - uint8 GetItems(Player* player, WS type) - { - uint8 result = 0x0; - - switch (type) - { - case TEMPLAR: + case TEMPLAR: { if (player->HasItemCount(ITEM_TEMPLAR_FIRE)) result |= FIRE; @@ -1217,7 +1222,7 @@ class go_wind_stone : public GameObjectScript result |= AIR; break; } - case DUKE: + case DUKE: { if (player->HasItemCount(ITEM_DUKE_FIRE)) result |= FIRE; @@ -1229,7 +1234,7 @@ class go_wind_stone : public GameObjectScript result |= AIR; break; } - case ROYAL: + case ROYAL: { if (player->HasItemCount(ITEM_ROYAL_FIRE)) result |= FIRE; @@ -1241,72 +1246,72 @@ class go_wind_stone : public GameObjectScript result |= AIR; break; } - default: - break; - } - return result; + default: + break; } + return result; + } - void SummonNPC(GameObject* go, Player* player, uint32 npc, uint32 spellId) + void SummonNPC(GameObject* go, Player* player, uint32 npc, uint32 spellId) + { + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); + if (!spellInfo) + return; + SpellInfo const* spellInfoTrigger = sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_0].TriggerSpell); + if (!spellInfoTrigger) + return; + Spell* spell = new Spell(player, spellInfoTrigger, TRIGGERED_NONE); + SpellCastResult result = spell->CheckCast(true); + delete spell; + if (result != SPELL_CAST_OK) { - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); - if (!spellInfo) - return; - SpellInfo const* spellInfoTrigger = sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_0].TriggerSpell); - if (!spellInfoTrigger) - return; - Spell* spell = new Spell(player, spellInfoTrigger, TRIGGERED_NONE); - SpellCastResult result = spell->CheckCast(true); - delete spell; - if (result != SPELL_CAST_OK) + if (result == SPELL_FAILED_REAGENTS) { - if (result == SPELL_FAILED_REAGENTS) - { - std::string accountName; - AccountMgr::GetName(player->GetSession()->GetAccountId(), accountName); - sBan->BanAccount(accountName, "0s", "Wind Stone exploit", "Server"); - } - return; + std::string accountName; + AccountMgr::GetName(player->GetSession()->GetAccountId(), accountName); + sBan->BanAccount(accountName, "0s", "Wind Stone exploit", "Server"); } - player->CastSpell(player, spellInfoTrigger->Id, false); - TempSummon* summons = go->SummonCreature(npc, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), player->GetOrientation() - M_PI, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10 * 60 * 1000); - summons->CastSpell(summons, SPELL_SPAWN_IN, false); - switch (summons->GetEntry()) - { - case NPC_TEMPLAR_FIRE: - case NPC_TEMPLAR_WATER: - case NPC_TEMPLAR_AIR: - case NPC_TEMPLAR_EARTH: - summons->AI()->Talk(SAY_TEMPLAR_AGGRO); - break; - - case NPC_DUKE_FIRE: - case NPC_DUKE_WATER: - case NPC_DUKE_EARTH: - case NPC_DUKE_AIR: - summons->AI()->Talk(SAY_DUKE_AGGRO); - break; - case NPC_ROYAL_FIRE: - case NPC_ROYAL_AIR: - case NPC_ROYAL_EARTH: - case NPC_ROYAL_WATER: - summons->AI()->Talk(YELL_ROYAL_AGGRO); - break; - } - summons->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - summons->SendMeleeAttackStart(player); - summons->CombatStart(player); + return; } - - public: - bool OnGossipHello(Player* player, GameObject* go) override + player->CastSpell(player, spellInfoTrigger->Id, false); + TempSummon* summons = go->SummonCreature(npc, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), player->GetOrientation() - M_PI, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10 * 60 * 1000); + summons->CastSpell(summons, SPELL_SPAWN_IN, false); + switch (summons->GetEntry()) { - uint8 rank = GetPlayerRank(player); + case NPC_TEMPLAR_FIRE: + case NPC_TEMPLAR_WATER: + case NPC_TEMPLAR_AIR: + case NPC_TEMPLAR_EARTH: + summons->AI()->Talk(SAY_TEMPLAR_AGGRO); + break; - uint32 gossipId = go->GetGOInfo()->GetGossipMenuId(); - switch (gossipId) - { - case GOSSIPID_LESSER_WS: + case NPC_DUKE_FIRE: + case NPC_DUKE_WATER: + case NPC_DUKE_EARTH: + case NPC_DUKE_AIR: + summons->AI()->Talk(SAY_DUKE_AGGRO); + break; + case NPC_ROYAL_FIRE: + case NPC_ROYAL_AIR: + case NPC_ROYAL_EARTH: + case NPC_ROYAL_WATER: + summons->AI()->Talk(YELL_ROYAL_AGGRO); + break; + } + summons->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + summons->SendMeleeAttackStart(player); + summons->CombatStart(player); + } + +public: + bool OnGossipHello(Player* player, GameObject* go) override + { + uint8 rank = GetPlayerRank(player); + + uint32 gossipId = go->GetGOInfo()->GetGossipMenuId(); + switch (gossipId) + { + case GOSSIPID_LESSER_WS: { if (rank >= 1) // 1 or 2 or 3 AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_TEMPLAR_RANDOM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); @@ -1327,7 +1332,7 @@ class go_wind_stone : public GameObjectScript AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_TEMPLAR_AIR, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); break; } - case GOSSIPID_WS: + case GOSSIPID_WS: { if (rank >= 2) // 2 or 3 AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_DUKE_RANDOM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); @@ -1348,7 +1353,7 @@ class go_wind_stone : public GameObjectScript AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_DUKE_AIR, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 10); break; } - case GOSSIPID_GREATER_WS: + case GOSSIPID_GREATER_WS: { if (rank == 3) // 3 AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ROYAL_RANDOM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11); @@ -1369,74 +1374,74 @@ class go_wind_stone : public GameObjectScript AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ROYAL_AIR, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 15); break; } - default: - break; - } - - SendGossipMenuFor(player, player->GetGossipTextId(gossipId, go), go->GetGUID()); - return true; + default: + break; } - bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 action) override + SendGossipMenuFor(player, player->GetGossipTextId(gossipId, go), go->GetGUID()); + return true; + } + + bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 action) override + { + ClearGossipMenuFor(player); + player->PlayerTalkClass->SendCloseGossip(); + + switch (action) { - ClearGossipMenuFor(player); - player->PlayerTalkClass->SendCloseGossip(); + case GOSSIP_ACTION_INFO_DEF + 1: + SummonNPC(go, player, RAND(NPC_TEMPLAR_WATER, NPC_TEMPLAR_FIRE, NPC_TEMPLAR_EARTH, NPC_TEMPLAR_AIR), SPELL_TEMPLAR_RANDOM); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + SummonNPC(go, player, NPC_TEMPLAR_FIRE, SPELL_TEMPLAR_FIRE); + break; + case GOSSIP_ACTION_INFO_DEF + 3: + SummonNPC(go, player, NPC_TEMPLAR_WATER, SPELL_TEMPLAR_WATER); + break; + case GOSSIP_ACTION_INFO_DEF + 4: + SummonNPC(go, player, NPC_TEMPLAR_EARTH, SPELL_TEMPLAR_EARTH); + break; + case GOSSIP_ACTION_INFO_DEF + 5: + SummonNPC(go, player, NPC_TEMPLAR_AIR, SPELL_TEMPLAR_AIR); + break; - switch (action) - { - case GOSSIP_ACTION_INFO_DEF + 1: - SummonNPC(go, player, RAND(NPC_TEMPLAR_WATER, NPC_TEMPLAR_FIRE, NPC_TEMPLAR_EARTH, NPC_TEMPLAR_AIR), SPELL_TEMPLAR_RANDOM); - break; - case GOSSIP_ACTION_INFO_DEF + 2: - SummonNPC(go, player, NPC_TEMPLAR_FIRE, SPELL_TEMPLAR_FIRE); - break; - case GOSSIP_ACTION_INFO_DEF + 3: - SummonNPC(go, player, NPC_TEMPLAR_WATER, SPELL_TEMPLAR_WATER); - break; - case GOSSIP_ACTION_INFO_DEF + 4: - SummonNPC(go, player, NPC_TEMPLAR_EARTH, SPELL_TEMPLAR_EARTH); - break; - case GOSSIP_ACTION_INFO_DEF + 5: - SummonNPC(go, player, NPC_TEMPLAR_AIR, SPELL_TEMPLAR_AIR); - break; + case GOSSIP_ACTION_INFO_DEF + 6: + SummonNPC(go, player, RAND(NPC_DUKE_FIRE, NPC_DUKE_WATER, NPC_DUKE_EARTH, NPC_DUKE_AIR), SPELL_DUKE_RANDOM); + break; + case GOSSIP_ACTION_INFO_DEF + 7: + SummonNPC(go, player, NPC_DUKE_FIRE, SPELL_DUKE_FIRE); + break; + case GOSSIP_ACTION_INFO_DEF + 8: + SummonNPC(go, player, NPC_DUKE_WATER, SPELL_DUKE_WATER); + break; + case GOSSIP_ACTION_INFO_DEF + 9: + SummonNPC(go, player, NPC_DUKE_EARTH, SPELL_DUKE_EARTH); + break; + case GOSSIP_ACTION_INFO_DEF + 10: + SummonNPC(go, player, NPC_DUKE_AIR, SPELL_DUKE_AIR); + break; - case GOSSIP_ACTION_INFO_DEF + 6: - SummonNPC(go, player, RAND(NPC_DUKE_FIRE, NPC_DUKE_WATER, NPC_DUKE_EARTH, NPC_DUKE_AIR), SPELL_DUKE_RANDOM); - break; - case GOSSIP_ACTION_INFO_DEF + 7: - SummonNPC(go, player, NPC_DUKE_FIRE, SPELL_DUKE_FIRE); - break; - case GOSSIP_ACTION_INFO_DEF + 8: - SummonNPC(go, player, NPC_DUKE_WATER, SPELL_DUKE_WATER); - break; - case GOSSIP_ACTION_INFO_DEF + 9: - SummonNPC(go, player, NPC_DUKE_EARTH, SPELL_DUKE_EARTH); - break; - case GOSSIP_ACTION_INFO_DEF + 10: - SummonNPC(go, player, NPC_DUKE_AIR, SPELL_DUKE_AIR); - break; + case GOSSIP_ACTION_INFO_DEF + 11: + SummonNPC(go, player, RAND(NPC_ROYAL_FIRE, NPC_ROYAL_AIR, NPC_ROYAL_EARTH, NPC_ROYAL_WATER), SPELL_ROYAL_RANDOM); + break; + case GOSSIP_ACTION_INFO_DEF + 12: + SummonNPC(go, player, NPC_ROYAL_FIRE, SPELL_ROYAL_FIRE); + break; + case GOSSIP_ACTION_INFO_DEF + 13: + SummonNPC(go, player, NPC_ROYAL_WATER, SPELL_ROYAL_WATER); + break; + case GOSSIP_ACTION_INFO_DEF + 14: + SummonNPC(go, player, NPC_ROYAL_EARTH, SPELL_ROYAL_EARTH); + break; + case GOSSIP_ACTION_INFO_DEF + 15: + SummonNPC(go, player, NPC_ROYAL_AIR, SPELL_ROYAL_AIR); + break; - case GOSSIP_ACTION_INFO_DEF + 11: - SummonNPC(go, player, RAND(NPC_ROYAL_FIRE, NPC_ROYAL_AIR, NPC_ROYAL_EARTH, NPC_ROYAL_WATER), SPELL_ROYAL_RANDOM); - break; - case GOSSIP_ACTION_INFO_DEF + 12: - SummonNPC(go, player, NPC_ROYAL_FIRE, SPELL_ROYAL_FIRE); - break; - case GOSSIP_ACTION_INFO_DEF + 13: - SummonNPC(go, player, NPC_ROYAL_WATER, SPELL_ROYAL_WATER); - break; - case GOSSIP_ACTION_INFO_DEF + 14: - SummonNPC(go, player, NPC_ROYAL_EARTH, SPELL_ROYAL_EARTH); - break; - case GOSSIP_ACTION_INFO_DEF + 15: - SummonNPC(go, player, NPC_ROYAL_AIR, SPELL_ROYAL_AIR); - break; - - default: - break; - } - return true; + default: + break; } + return true; + } }; void AddSC_silithus() diff --git a/src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp b/src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp index 726c098b0..9d06c2aa3 100644 --- a/src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp +++ b/src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp @@ -40,13 +40,13 @@ public: bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override { ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF + 1) { CloseGossipMenuFor(player); creature->CastSpell(player, 6766, false); } - if (action == GOSSIP_ACTION_INFO_DEF+2) + if (action == GOSSIP_ACTION_INFO_DEF + 2) { CloseGossipMenuFor(player); player->AreaExploredOrEventHappens(6627); @@ -61,11 +61,11 @@ public: if (player->GetQuestStatus(6627) == QUEST_STATUS_INCOMPLETE) { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HBD1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HBD2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HBD3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HBD4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HBD5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HBD1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HBD2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HBD3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HBD4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HBD5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); SendGossipMenuFor(player, 5820, creature->GetGUID()); } @@ -132,7 +132,7 @@ public: summoned->AI()->AttackStart(me); } - void Reset(){} + void Reset() {} }; bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) diff --git a/src/server/scripts/Kalimdor/zone_tanaris.cpp b/src/server/scripts/Kalimdor/zone_tanaris.cpp index 32d307b1f..922607308 100644 --- a/src/server/scripts/Kalimdor/zone_tanaris.cpp +++ b/src/server/scripts/Kalimdor/zone_tanaris.cpp @@ -77,9 +77,9 @@ public: Player* player = receiver->ToPlayer(); if (player && player->HasItemCount(11169, 1, false) && - player->HasItemCount(11172, 11, false) && - player->HasItemCount(11173, 1, false) && - !player->HasItemCount(11522, 1, true)) + player->HasItemCount(11172, 11, false) && + player->HasItemCount(11173, 1, false) && + !player->HasItemCount(11522, 1, true)) { ItemPosCountVec dest; uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, 11522, 1, nullptr); @@ -101,7 +101,8 @@ public: { me->setFaction(91); isFriendly = false; - } else SwitchFactionTimer -= diff; + } + else SwitchFactionTimer -= diff; } if (!UpdateVictim()) @@ -114,20 +115,23 @@ public: if (me->GetVictim()->GetTypeId() == TYPEID_PLAYER) SendItem(me->GetVictim()); SendItemTimer = 5000; - } else SendItemTimer -= diff; + } + else SendItemTimer -= diff; } if (FrostShockTimer <= diff) { DoCastVictim(SPELL_FROST_SHOCK); FrostShockTimer = 15000; - } else FrostShockTimer -= diff; + } + else FrostShockTimer -= diff; if (AquaJetTimer <= diff) { DoCast(me, SPELL_AQUA_JET); AquaJetTimer = 15000; - } else AquaJetTimer -= diff; + } + else AquaJetTimer -= diff; DoMeleeAttackIfReady(); } @@ -336,23 +340,23 @@ public: switch (action) { case GOSSIP_ACTION_INFO_DEF: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_NORGANNON_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_NORGANNON_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); SendGossipMenuFor(player, 1675, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+1: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_NORGANNON_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_NORGANNON_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); SendGossipMenuFor(player, 1676, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+2: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_NORGANNON_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_NORGANNON_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); SendGossipMenuFor(player, 1677, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+3: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_NORGANNON_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_NORGANNON_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); SendGossipMenuFor(player, 1678, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+4: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_NORGANNON_6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_NORGANNON_6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); SendGossipMenuFor(player, 1679, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+5: diff --git a/src/server/scripts/Kalimdor/zone_the_barrens.cpp b/src/server/scripts/Kalimdor/zone_the_barrens.cpp index e897558f1..23e65698d 100644 --- a/src/server/scripts/Kalimdor/zone_the_barrens.cpp +++ b/src/server/scripts/Kalimdor/zone_the_barrens.cpp @@ -46,7 +46,7 @@ public: bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override { ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF +1) + if (action == GOSSIP_ACTION_INFO_DEF + 1) { SendGossipMenuFor(player, 3558, creature->GetGUID()); player->TalkedToCreature(creature->GetEntry(), creature->GetGUID()); @@ -57,7 +57,7 @@ public: bool OnGossipHello(Player* player, Creature* creature) override { if (player->GetQuestStatus(QUEST_LOST_IN_BATTLE) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(QUEST_LOST_IN_BATTLE) == QUEST_STATUS_COMPLETE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_CORPSE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_CORPSE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); SendGossipMenuFor(player, 3557, creature->GetGUID()); return true; @@ -149,7 +149,7 @@ public: void EnterCombat(Unit* who) { //not always use - if (rand()%4) + if (rand() % 4) return; //only aggro text if not player and only in this area @@ -238,7 +238,8 @@ public: { EnterEvadeMode(); return; - } else ResetTimer -= diff; + } + else ResetTimer -= diff; } if (!UpdateVictim()) @@ -427,7 +428,8 @@ public: } } ChallengerChecker = 1000; - } else ChallengerChecker -= diff; + } + else ChallengerChecker -= diff; if (WaveTimer <= diff) { @@ -530,7 +532,7 @@ public: if (!HasEscortState(STATE_ESCORT_ESCORTING)) { if (me->getStandState() == UNIT_STAND_STATE_DEAD) - me->SetStandState(UNIT_STAND_STATE_STAND); + me->SetStandState(UNIT_STAND_STATE_STAND); IsPostEvent = false; PostEventTimer = 1000; diff --git a/src/server/scripts/Kalimdor/zone_thousand_needles.cpp b/src/server/scripts/Kalimdor/zone_thousand_needles.cpp index 5f1683486..2153241cf 100644 --- a/src/server/scripts/Kalimdor/zone_thousand_needles.cpp +++ b/src/server/scripts/Kalimdor/zone_thousand_needles.cpp @@ -111,7 +111,7 @@ public: void DoSpawnBandits(int AmbushId) { for (int i = 0; i < 2; ++i) - me->SummonCreature(NPC_GRIM_BANDIT, BanditLoc[i+AmbushId], TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); + me->SummonCreature(NPC_GRIM_BANDIT, BanditLoc[i + AmbushId], TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); } }; @@ -221,7 +221,7 @@ public: case GOSSIP_ACTION_INFO_DEF+1: CloseGossipMenuFor(player); player->CompleteQuest(QUEST_SCOOP); - break; + break; } return true; } @@ -229,7 +229,7 @@ public: bool OnGossipHello(Player* player, Creature* creature) override { if (player->GetQuestStatus(QUEST_SCOOP) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_P, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_P, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); SendGossipMenuFor(player, 738, creature->GetGUID()); diff --git a/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp b/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp index cbfc719d0..b73ea4969 100644 --- a/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp +++ b/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp @@ -96,31 +96,36 @@ public: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) DoCast(target, SPELL_BERSERKER_CHARGE); BerserkerChargeTimer = 25000; - } else BerserkerChargeTimer -= diff; + } + else BerserkerChargeTimer -= diff; if (UppercutTimer <= diff) { DoCastVictim(SPELL_UPPERCUT); UppercutTimer = 20000; - } else UppercutTimer -= diff; + } + else UppercutTimer -= diff; if (ThunderclapTimer <= diff) { DoCastVictim(SPELL_THUNDERCLAP); ThunderclapTimer = 15000; - } else ThunderclapTimer -= diff; + } + else ThunderclapTimer -= diff; if (MortalStrikeTimer <= diff) { DoCastVictim(SPELL_MORTAL_STRIKE); MortalStrikeTimer = 15000; - } else MortalStrikeTimer -= diff; + } + else MortalStrikeTimer -= diff; if (CleaveTimer <= diff) { DoCastVictim(SPELL_CLEAVE); CleaveTimer = 7000; - } else CleaveTimer -= diff; + } + else CleaveTimer -= diff; DoMeleeAttackIfReady(); } diff --git a/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp b/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp index 44054ffc2..4f19831db 100644 --- a/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp +++ b/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp @@ -124,7 +124,8 @@ public: { DoCastVictim(SPELL_DEMORALIZINGSHOUT); DemoralizingShoutTimer = 70000; - } else DemoralizingShoutTimer -= diff; + } + else DemoralizingShoutTimer -= diff; } }; }; diff --git a/src/server/scripts/Kalimdor/zone_winterspring.cpp b/src/server/scripts/Kalimdor/zone_winterspring.cpp index 9fa686391..502693c5d 100644 --- a/src/server/scripts/Kalimdor/zone_winterspring.cpp +++ b/src/server/scripts/Kalimdor/zone_winterspring.cpp @@ -71,11 +71,21 @@ public: changeEntry = me->GetEntry(); switch (me->GetEntry()) { - case NPC_SIMONE_NORMAL: changeEntry = NPC_SIMONE_EVIL; break; - case NPC_FRANKLIN_NORMAL: changeEntry = NPC_FRANKLIN_EVIL; break; - case NPC_ARTORIUS_NORMAL: changeEntry = NPC_ARTORIUS_EVIL; break; - case NPC_NELSON_NORMAL: changeEntry = NPC_NELSON_EVIL; break; - case NPC_PRECIOUS: changeEntry = NPC_PRECIOUS_EVIL; break; + case NPC_SIMONE_NORMAL: + changeEntry = NPC_SIMONE_EVIL; + break; + case NPC_FRANKLIN_NORMAL: + changeEntry = NPC_FRANKLIN_EVIL; + break; + case NPC_ARTORIUS_NORMAL: + changeEntry = NPC_ARTORIUS_EVIL; + break; + case NPC_NELSON_NORMAL: + changeEntry = NPC_NELSON_EVIL; + break; + case NPC_PRECIOUS: + changeEntry = NPC_PRECIOUS_EVIL; + break; } } @@ -322,46 +332,46 @@ class DialogueHelper public: // The array MUST be terminated by {0, 0, 0} DialogueHelper(DialogueEntry const* dialogueArray) : - _dialogueArray(dialogueArray), - _currentEntry(nullptr), - _actionTimer(0) - { } - // The array MUST be terminated by {0, 0, 0, 0, 0} + _dialogueArray(dialogueArray), + _currentEntry(nullptr), + _actionTimer(0) + { } + // The array MUST be terminated by {0, 0, 0, 0, 0} - /// Function to initialize the dialogue helper for instances. If not used with instances, GetSpeakerByEntry MUST be overwritten to obtain the speakers - /// Set if take first entries or second entries + /// Function to initialize the dialogue helper for instances. If not used with instances, GetSpeakerByEntry MUST be overwritten to obtain the speakers + /// Set if take first entries or second entries - void StartNextDialogueText(int32 textEntry) - { - // Find textEntry - bool found = false; + void StartNextDialogueText(int32 textEntry) + { + // Find textEntry + bool found = false; - for (DialogueEntry const* entry = _dialogueArray; entry->TextEntry; ++entry) - { - if (entry->TextEntry == textEntry) - { - _currentEntry = entry; - found = true; - break; - } - } + for (DialogueEntry const* entry = _dialogueArray; entry->TextEntry; ++entry) + { + if (entry->TextEntry == textEntry) + { + _currentEntry = entry; + found = true; + break; + } + } - if (!found) - return; + if (!found) + return; - DoNextDialogueStep(); - } + DoNextDialogueStep(); + } - void DialogueUpdate(uint32 diff) - { - if (_actionTimer) - { - if (_actionTimer <= diff) - DoNextDialogueStep(); - else - _actionTimer -= diff; - } - } + void DialogueUpdate(uint32 diff) + { + if (_actionTimer) + { + if (_actionTimer <= diff) + DoNextDialogueStep(); + else + _actionTimer -= diff; + } + } protected: /// Will be called when a dialogue step was done @@ -579,23 +589,23 @@ public: SetEscortPaused(true); break; case 41: - { - // Search for all nearest lights and respawn them - std::list eluneLights; - GetGameObjectListWithEntryInGrid(eluneLights, me, GO_ELUNE_LIGHT, 20.0f); - for (std::list::const_iterator itr = eluneLights.begin(); itr != eluneLights.end(); ++itr) { - if ((*itr)->isSpawned()) - continue; + // Search for all nearest lights and respawn them + std::list eluneLights; + GetGameObjectListWithEntryInGrid(eluneLights, me, GO_ELUNE_LIGHT, 20.0f); + for (std::list::const_iterator itr = eluneLights.begin(); itr != eluneLights.end(); ++itr) + { + if ((*itr)->isSpawned()) + continue; - (*itr)->SetRespawnTime(115); - (*itr)->Refresh(); + (*itr)->SetRespawnTime(115); + (*itr)->Refresh(); + } + + if (GameObject* altar = me->GetMap()->GetGameObject(_altarGUID)) + me->SetFacingToObject(altar); + break; } - - if (GameObject* altar = me->GetMap()->GetGameObject(_altarGUID)) - me->SetFacingToObject(altar); - break; - } case 42: // Summon the 2 priestess SetEscortPaused(true); diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp index fcabf03a5..f1f7e0538 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp @@ -57,259 +57,259 @@ enum Misc class boss_anub_arak : public CreatureScript { - public: - boss_anub_arak() : CreatureScript("boss_anub_arak") { } +public: + boss_anub_arak() : CreatureScript("boss_anub_arak") { } - struct boss_anub_arakAI : public BossAI + struct boss_anub_arakAI : public BossAI + { + boss_anub_arakAI(Creature* creature) : BossAI(creature, DATA_ANUBARAK_EVENT) { - boss_anub_arakAI(Creature* creature) : BossAI(creature, DATA_ANUBARAK_EVENT) - { - me->m_SightDistance = 120.0f; - intro = false; - } - - bool intro; - - void EnterEvadeMode() - { - me->DisableRotate(false); - BossAI::EnterEvadeMode(); - } - - void MoveInLineOfSight(Unit* who) - { - if (!intro && who->GetTypeId() == TYPEID_PLAYER) - { - intro = true; - Talk(SAY_INTRO); - } - BossAI::MoveInLineOfSight(who); - } - - void JustDied(Unit* killer) - { - Talk(SAY_DEATH); - BossAI::JustDied(killer); - } - - void KilledUnit(Unit* /*victim*/) - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(SAY_SLAY); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); - } - } - - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - if (!summon->IsTrigger()) - summon->SetInCombatWithZone(); - } - - void Reset() - { - BossAI::Reset(); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); - instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); - } - - void EnterCombat(Unit* ) - { - Talk(SAY_AGGRO); - instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); - - events.ScheduleEvent(EVENT_CARRION_BEETELS, 6500); - events.ScheduleEvent(EVENT_LEECHING_SWARM, 20000); - events.ScheduleEvent(EVENT_POUND, 15000); - events.ScheduleEvent(EVENT_CHECK_HEALTH_75, 1000); - events.ScheduleEvent(EVENT_CHECK_HEALTH_50, 1000); - events.ScheduleEvent(EVENT_CHECK_HEALTH_25, 1000); - events.ScheduleEvent(EVENT_CLOSE_DOORS, 5000); - } - - void SummonHelpers(float x, float y, float z, uint32 spellId) - { - const SpellInfo* spellInfo = sSpellMgr->GetSpellInfo(spellId); - me->SummonCreature(spellInfo->Effects[EFFECT_0].MiscValue, x, y, z); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (uint32 eventId = events.ExecuteEvent()) - { - case EVENT_CLOSE_DOORS: - _EnterCombat(); - break; - case EVENT_CARRION_BEETELS: - me->CastSpell(me, SPELL_CARRION_BEETLES, false); - events.ScheduleEvent(EVENT_CARRION_BEETELS, 25000); - break; - case EVENT_LEECHING_SWARM: - Talk(SAY_LOCUST); - me->CastSpell(me, SPELL_LEECHING_SWARM, false); - events.ScheduleEvent(EVENT_LEECHING_SWARM, 20000); - break; - case EVENT_POUND: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 10.0f)) - { - me->CastSpell(me, SPELL_SELF_ROOT, true); - me->DisableRotate(true); - me->SendMovementFlagUpdate(); - events.ScheduleEvent(EVENT_ENABLE_ROTATE, 3300); - me->CastSpell(target, SPELL_POUND, false); - } - events.ScheduleEvent(EVENT_POUND, 18000); - break; - case EVENT_ENABLE_ROTATE: - me->RemoveAurasDueToSpell(SPELL_SELF_ROOT); - me->DisableRotate(false); - break; - case EVENT_CHECK_HEALTH_25: - case EVENT_CHECK_HEALTH_50: - case EVENT_CHECK_HEALTH_75: - if (me->HealthBelowPct(eventId*25)) - { - Talk(SAY_SUBMERGE); - me->CastSpell(me, SPELL_IMPALE_PERIODIC, true); - me->CastSpell(me, SPELL_SUBMERGE, false); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); - - events.DelayEvents(46000, 0); - events.ScheduleEvent(EVENT_EMERGE, 45000); - events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 2000); - events.ScheduleEvent(EVENT_SUMMON_GUARDIAN, 4000); - events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 15000); - events.ScheduleEvent(EVENT_SUMMON_VENOMANCER, 20000); - events.ScheduleEvent(EVENT_SUMMON_DARTER, 30000); - events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 35000); - break; - } - events.ScheduleEvent(eventId, 500); - break; - case EVENT_EMERGE: - me->CastSpell(me, SPELL_EMERGE, true); - me->RemoveAura(SPELL_SUBMERGE); - me->RemoveAura(SPELL_IMPALE_PERIODIC); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); - break; - case EVENT_SUMMON_ASSASSINS: - SummonHelpers(509.32f, 247.42f, 239.48f, SPELL_SUMMON_ASSASSIN); - SummonHelpers(589.51f, 240.19f, 236.0f, SPELL_SUMMON_ASSASSIN); - break; - case EVENT_SUMMON_DARTER: - SummonHelpers(509.32f, 247.42f, 239.48f, SPELL_SUMMON_DARTER); - SummonHelpers(589.51f, 240.19f, 236.0f, SPELL_SUMMON_DARTER); - break; - case EVENT_SUMMON_GUARDIAN: - SummonHelpers(550.34f, 316.00f, 234.30f, SPELL_SUMMON_GUARDIAN); - break; - case EVENT_SUMMON_VENOMANCER: - SummonHelpers(550.34f, 316.00f, 234.30f, SPELL_SUMMON_VENOMANCER); - break; - } - - if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)) - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_anub_arakAI(creature); + me->m_SightDistance = 120.0f; + intro = false; } + + bool intro; + + void EnterEvadeMode() + { + me->DisableRotate(false); + BossAI::EnterEvadeMode(); + } + + void MoveInLineOfSight(Unit* who) + { + if (!intro && who->GetTypeId() == TYPEID_PLAYER) + { + intro = true; + Talk(SAY_INTRO); + } + BossAI::MoveInLineOfSight(who); + } + + void JustDied(Unit* killer) + { + Talk(SAY_DEATH); + BossAI::JustDied(killer); + } + + void KilledUnit(Unit* /*victim*/) + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + { + Talk(SAY_SLAY); + events.ScheduleEvent(EVENT_KILL_TALK, 6000); + } + } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + if (!summon->IsTrigger()) + summon->SetInCombatWithZone(); + } + + void Reset() + { + BossAI::Reset(); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); + instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); + } + + void EnterCombat(Unit* ) + { + Talk(SAY_AGGRO); + instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); + + events.ScheduleEvent(EVENT_CARRION_BEETELS, 6500); + events.ScheduleEvent(EVENT_LEECHING_SWARM, 20000); + events.ScheduleEvent(EVENT_POUND, 15000); + events.ScheduleEvent(EVENT_CHECK_HEALTH_75, 1000); + events.ScheduleEvent(EVENT_CHECK_HEALTH_50, 1000); + events.ScheduleEvent(EVENT_CHECK_HEALTH_25, 1000); + events.ScheduleEvent(EVENT_CLOSE_DOORS, 5000); + } + + void SummonHelpers(float x, float y, float z, uint32 spellId) + { + const SpellInfo* spellInfo = sSpellMgr->GetSpellInfo(spellId); + me->SummonCreature(spellInfo->Effects[EFFECT_0].MiscValue, x, y, z); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (uint32 eventId = events.ExecuteEvent()) + { + case EVENT_CLOSE_DOORS: + _EnterCombat(); + break; + case EVENT_CARRION_BEETELS: + me->CastSpell(me, SPELL_CARRION_BEETLES, false); + events.ScheduleEvent(EVENT_CARRION_BEETELS, 25000); + break; + case EVENT_LEECHING_SWARM: + Talk(SAY_LOCUST); + me->CastSpell(me, SPELL_LEECHING_SWARM, false); + events.ScheduleEvent(EVENT_LEECHING_SWARM, 20000); + break; + case EVENT_POUND: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 10.0f)) + { + me->CastSpell(me, SPELL_SELF_ROOT, true); + me->DisableRotate(true); + me->SendMovementFlagUpdate(); + events.ScheduleEvent(EVENT_ENABLE_ROTATE, 3300); + me->CastSpell(target, SPELL_POUND, false); + } + events.ScheduleEvent(EVENT_POUND, 18000); + break; + case EVENT_ENABLE_ROTATE: + me->RemoveAurasDueToSpell(SPELL_SELF_ROOT); + me->DisableRotate(false); + break; + case EVENT_CHECK_HEALTH_25: + case EVENT_CHECK_HEALTH_50: + case EVENT_CHECK_HEALTH_75: + if (me->HealthBelowPct(eventId * 25)) + { + Talk(SAY_SUBMERGE); + me->CastSpell(me, SPELL_IMPALE_PERIODIC, true); + me->CastSpell(me, SPELL_SUBMERGE, false); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); + + events.DelayEvents(46000, 0); + events.ScheduleEvent(EVENT_EMERGE, 45000); + events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 2000); + events.ScheduleEvent(EVENT_SUMMON_GUARDIAN, 4000); + events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 15000); + events.ScheduleEvent(EVENT_SUMMON_VENOMANCER, 20000); + events.ScheduleEvent(EVENT_SUMMON_DARTER, 30000); + events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 35000); + break; + } + events.ScheduleEvent(eventId, 500); + break; + case EVENT_EMERGE: + me->CastSpell(me, SPELL_EMERGE, true); + me->RemoveAura(SPELL_SUBMERGE); + me->RemoveAura(SPELL_IMPALE_PERIODIC); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); + break; + case EVENT_SUMMON_ASSASSINS: + SummonHelpers(509.32f, 247.42f, 239.48f, SPELL_SUMMON_ASSASSIN); + SummonHelpers(589.51f, 240.19f, 236.0f, SPELL_SUMMON_ASSASSIN); + break; + case EVENT_SUMMON_DARTER: + SummonHelpers(509.32f, 247.42f, 239.48f, SPELL_SUMMON_DARTER); + SummonHelpers(589.51f, 240.19f, 236.0f, SPELL_SUMMON_DARTER); + break; + case EVENT_SUMMON_GUARDIAN: + SummonHelpers(550.34f, 316.00f, 234.30f, SPELL_SUMMON_GUARDIAN); + break; + case EVENT_SUMMON_VENOMANCER: + SummonHelpers(550.34f, 316.00f, 234.30f, SPELL_SUMMON_VENOMANCER); + break; + } + + if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)) + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_anub_arakAI(creature); + } }; class spell_azjol_nerub_carrion_beetels : public SpellScriptLoader { - public: - spell_azjol_nerub_carrion_beetels() : SpellScriptLoader("spell_azjol_nerub_carrion_beetels") { } +public: + spell_azjol_nerub_carrion_beetels() : SpellScriptLoader("spell_azjol_nerub_carrion_beetels") { } - class spell_azjol_nerub_carrion_beetelsAuraScript : public AuraScript + class spell_azjol_nerub_carrion_beetelsAuraScript : public AuraScript + { + PrepareAuraScript(spell_azjol_nerub_carrion_beetelsAuraScript) + + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_azjol_nerub_carrion_beetelsAuraScript) - - void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) - { - // Xinef: 2 each second - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_CARRION_BEETLES, true); - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_CARRION_BEETLES, true); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_azjol_nerub_carrion_beetelsAuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript *GetAuraScript() const - { - return new spell_azjol_nerub_carrion_beetelsAuraScript(); + // Xinef: 2 each second + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_CARRION_BEETLES, true); + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_CARRION_BEETLES, true); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_azjol_nerub_carrion_beetelsAuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_azjol_nerub_carrion_beetelsAuraScript(); + } }; class spell_azjol_nerub_pound : public SpellScriptLoader { - public: - spell_azjol_nerub_pound() : SpellScriptLoader("spell_azjol_nerub_pound") { } +public: + spell_azjol_nerub_pound() : SpellScriptLoader("spell_azjol_nerub_pound") { } - class spell_azjol_nerub_pound_SpellScript : public SpellScript + class spell_azjol_nerub_pound_SpellScript : public SpellScript + { + PrepareSpellScript(spell_azjol_nerub_pound_SpellScript); + + void HandleApplyAura(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_azjol_nerub_pound_SpellScript); - - void HandleApplyAura(SpellEffIndex /*effIndex*/) - { - if (Unit* unitTarget = GetHitUnit()) - GetCaster()->CastSpell(unitTarget, SPELL_POUND_DAMAGE, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_azjol_nerub_pound_SpellScript::HandleApplyAura, EFFECT_0, SPELL_EFFECT_APPLY_AURA); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_azjol_nerub_pound_SpellScript(); + if (Unit* unitTarget = GetHitUnit()) + GetCaster()->CastSpell(unitTarget, SPELL_POUND_DAMAGE, true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_azjol_nerub_pound_SpellScript::HandleApplyAura, EFFECT_0, SPELL_EFFECT_APPLY_AURA); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_azjol_nerub_pound_SpellScript(); + } }; class spell_azjol_nerub_impale_summon : public SpellScriptLoader { - public: - spell_azjol_nerub_impale_summon() : SpellScriptLoader("spell_azjol_nerub_impale_summon") { } +public: + spell_azjol_nerub_impale_summon() : SpellScriptLoader("spell_azjol_nerub_impale_summon") { } - class spell_azjol_nerub_impale_summon_SpellScript : public SpellScript + class spell_azjol_nerub_impale_summon_SpellScript : public SpellScript + { + PrepareSpellScript(spell_azjol_nerub_impale_summon_SpellScript); + + void SetDest(SpellDestination& dest) { - PrepareSpellScript(spell_azjol_nerub_impale_summon_SpellScript); - - void SetDest(SpellDestination& dest) - { - // Adjust effect summon position - float floorZ = GetCaster()->GetMap()->GetHeight(GetCaster()->GetPositionX(), GetCaster()->GetPositionY(), GetCaster()->GetPositionZ(), true); - if (floorZ > INVALID_HEIGHT) - dest._position.m_positionZ = floorZ; - } - - void Register() - { - OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_azjol_nerub_impale_summon_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_azjol_nerub_impale_summon_SpellScript(); + // Adjust effect summon position + float floorZ = GetCaster()->GetMap()->GetHeight(GetCaster()->GetPositionX(), GetCaster()->GetPositionY(), GetCaster()->GetPositionZ(), true); + if (floorZ > INVALID_HEIGHT) + dest._position.m_positionZ = floorZ; } + + void Register() + { + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_azjol_nerub_impale_summon_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_azjol_nerub_impale_summon_SpellScript(); + } }; void AddSC_boss_anub_arak() diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp index 228d80cd5..a3829c50a 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp @@ -20,7 +20,7 @@ enum Spells SPELL_LEECH_POISON_HEAL = 53800, SPELL_WEB_GRAB = 57731, SPELL_PIERCE_ARMOR = 53418, - + SPELL_SMASH = 53318, SPELL_FRENZY = 53801 }; @@ -53,7 +53,7 @@ enum Misc ACTION_START_EVENT = 2 }; -const Position hadronoxSteps[4] = +const Position hadronoxSteps[4] = { {607.9f, 512.8f, 695.3f, 0.0f}, {611.67f, 564.11f, 720.0f, 0.0f}, @@ -63,332 +63,332 @@ const Position hadronoxSteps[4] = class boss_hadronox : public CreatureScript { - public: - boss_hadronox() : CreatureScript("boss_hadronox") { } +public: + boss_hadronox() : CreatureScript("boss_hadronox") { } - struct boss_hadronoxAI : public BossAI + struct boss_hadronoxAI : public BossAI + { + boss_hadronoxAI(Creature* creature) : BossAI(creature, DATA_HADRONOX_EVENT) { - boss_hadronoxAI(Creature* creature) : BossAI(creature, DATA_HADRONOX_EVENT) - { - } - - void Reset() - { - summons.DoAction(ACTION_DESPAWN_ADDS); - BossAI::Reset(); - me->SummonCreature(NPC_ANUB_AR_CRUSHER, 542.9f, 519.5f, 741.24f, 2.14f); - } - - void DoAction(int32 param) - { - if (param == ACTION_START_EVENT) - { - instance->SetBossState(DATA_HADRONOX_EVENT, IN_PROGRESS); - me->setActive(true); - events.ScheduleEvent(EVENT_HADRONOX_MOVE1, 20000); - events.ScheduleEvent(EVENT_HADRONOX_MOVE2, 40000); - events.ScheduleEvent(EVENT_HADRONOX_MOVE3, 60000); - events.ScheduleEvent(EVENT_HADRONOX_MOVE4, 80000); - } - } - - uint32 GetData(uint32 data) const - { - if (data == me->GetEntry()) - return !me->isActiveObject() || events.GetNextEventTime(EVENT_HADRONOX_MOVE4) != 0; - return 0; - } - - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - - // Xinef: cannot use pathfinding... - if (summon->GetDistance(477.0f, 618.0f, 771.0f) < 5.0f) - summon->GetMotionMaster()->MovePath(3000012, false); - else if (summon->GetDistance(583.0f, 617.0f, 771.0f) < 5.0f) - summon->GetMotionMaster()->MovePath(3000013, false); - else if (summon->GetDistance(581.0f, 608.5f, 739.0f) < 5.0f) - summon->GetMotionMaster()->MovePath(3000014, false); - } - - void KilledUnit(Unit* victim) - { - if (!me->IsAlive() || !victim->HasAura(SPELL_LEECH_POISON)) - return; - - me->ModifyHealth(int32(me->CountPctFromMaxHealth(10))); - } - - void JustDied(Unit* killer) - { - BossAI::JustDied(killer); - } - - void EnterCombat(Unit*) - { - events.RescheduleEvent(EVENT_HADRONOX_ACID, 10000); - events.RescheduleEvent(EVENT_HADRONOX_LEECH, 4000); - events.RescheduleEvent(EVENT_HADRONOX_PIERCE, 1000); - events.RescheduleEvent(EVENT_HADRONOX_GRAB, 15000); - } - - bool AnyPlayerValid() const - { - Map::PlayerList const& playerList = me->GetMap()->GetPlayers(); - for(Map::PlayerList::const_iterator itr = playerList.begin(); itr != playerList.end(); ++itr) - if (me->GetDistance(itr->GetSource()) < 130.0f && itr->GetSource()->IsAlive() && !itr->GetSource()->IsGameMaster() && me->CanCreatureAttack(itr->GetSource()) && me->_CanDetectFeignDeathOf(itr->GetSource())) - return true; - - return false; - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (uint32 eventId = events.ExecuteEvent()) - { - case EVENT_HADRONOX_PIERCE: - me->CastSpell(me->GetVictim(), SPELL_PIERCE_ARMOR, false); - events.ScheduleEvent(EVENT_HADRONOX_PIERCE, 8000); - break; - case EVENT_HADRONOX_ACID: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, false)) - me->CastSpell(target, SPELL_ACID_CLOUD, false); - events.ScheduleEvent(EVENT_HADRONOX_ACID, 25000); - break; - case EVENT_HADRONOX_LEECH: - me->CastSpell(me, SPELL_LEECH_POISON, false); - events.ScheduleEvent(EVENT_HADRONOX_LEECH, 12000); - break; - case EVENT_HADRONOX_GRAB: - me->CastSpell(me, SPELL_WEB_GRAB, false); - events.ScheduleEvent(EVENT_HADRONOX_GRAB, 25000); - break; - case EVENT_HADRONOX_MOVE4: - me->CastSpell(me, SPELL_WEB_FRONT_DOORS, true); - [[fallthrough]]; // TODO: Not sure whether the fallthrough was a mistake (forgetting a break) or intended. This should be double-checked. - case EVENT_HADRONOX_MOVE1: - case EVENT_HADRONOX_MOVE2: - case EVENT_HADRONOX_MOVE3: - Talk(SAY_HADRONOX_EMOTE); - me->GetMotionMaster()->MoveCharge(hadronoxSteps[eventId-1].GetPositionX(), hadronoxSteps[eventId-1].GetPositionY(), hadronoxSteps[eventId-1].GetPositionZ(), 10.0f, 0, NULL, true); - break; - - } - - DoMeleeAttackIfReady(); - EnterEvadeIfOutOfCombatArea(); - } - - bool CheckEvadeIfOutOfCombatArea() const - { - return me->isActiveObject() && !AnyPlayerValid(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_hadronoxAI(creature); } + + void Reset() + { + summons.DoAction(ACTION_DESPAWN_ADDS); + BossAI::Reset(); + me->SummonCreature(NPC_ANUB_AR_CRUSHER, 542.9f, 519.5f, 741.24f, 2.14f); + } + + void DoAction(int32 param) + { + if (param == ACTION_START_EVENT) + { + instance->SetBossState(DATA_HADRONOX_EVENT, IN_PROGRESS); + me->setActive(true); + events.ScheduleEvent(EVENT_HADRONOX_MOVE1, 20000); + events.ScheduleEvent(EVENT_HADRONOX_MOVE2, 40000); + events.ScheduleEvent(EVENT_HADRONOX_MOVE3, 60000); + events.ScheduleEvent(EVENT_HADRONOX_MOVE4, 80000); + } + } + + uint32 GetData(uint32 data) const + { + if (data == me->GetEntry()) + return !me->isActiveObject() || events.GetNextEventTime(EVENT_HADRONOX_MOVE4) != 0; + return 0; + } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + + // Xinef: cannot use pathfinding... + if (summon->GetDistance(477.0f, 618.0f, 771.0f) < 5.0f) + summon->GetMotionMaster()->MovePath(3000012, false); + else if (summon->GetDistance(583.0f, 617.0f, 771.0f) < 5.0f) + summon->GetMotionMaster()->MovePath(3000013, false); + else if (summon->GetDistance(581.0f, 608.5f, 739.0f) < 5.0f) + summon->GetMotionMaster()->MovePath(3000014, false); + } + + void KilledUnit(Unit* victim) + { + if (!me->IsAlive() || !victim->HasAura(SPELL_LEECH_POISON)) + return; + + me->ModifyHealth(int32(me->CountPctFromMaxHealth(10))); + } + + void JustDied(Unit* killer) + { + BossAI::JustDied(killer); + } + + void EnterCombat(Unit*) + { + events.RescheduleEvent(EVENT_HADRONOX_ACID, 10000); + events.RescheduleEvent(EVENT_HADRONOX_LEECH, 4000); + events.RescheduleEvent(EVENT_HADRONOX_PIERCE, 1000); + events.RescheduleEvent(EVENT_HADRONOX_GRAB, 15000); + } + + bool AnyPlayerValid() const + { + Map::PlayerList const& playerList = me->GetMap()->GetPlayers(); + for(Map::PlayerList::const_iterator itr = playerList.begin(); itr != playerList.end(); ++itr) + if (me->GetDistance(itr->GetSource()) < 130.0f && itr->GetSource()->IsAlive() && !itr->GetSource()->IsGameMaster() && me->CanCreatureAttack(itr->GetSource()) && me->_CanDetectFeignDeathOf(itr->GetSource())) + return true; + + return false; + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (uint32 eventId = events.ExecuteEvent()) + { + case EVENT_HADRONOX_PIERCE: + me->CastSpell(me->GetVictim(), SPELL_PIERCE_ARMOR, false); + events.ScheduleEvent(EVENT_HADRONOX_PIERCE, 8000); + break; + case EVENT_HADRONOX_ACID: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, false)) + me->CastSpell(target, SPELL_ACID_CLOUD, false); + events.ScheduleEvent(EVENT_HADRONOX_ACID, 25000); + break; + case EVENT_HADRONOX_LEECH: + me->CastSpell(me, SPELL_LEECH_POISON, false); + events.ScheduleEvent(EVENT_HADRONOX_LEECH, 12000); + break; + case EVENT_HADRONOX_GRAB: + me->CastSpell(me, SPELL_WEB_GRAB, false); + events.ScheduleEvent(EVENT_HADRONOX_GRAB, 25000); + break; + case EVENT_HADRONOX_MOVE4: + me->CastSpell(me, SPELL_WEB_FRONT_DOORS, true); + [[fallthrough]]; // TODO: Not sure whether the fallthrough was a mistake (forgetting a break) or intended. This should be double-checked. + case EVENT_HADRONOX_MOVE1: + case EVENT_HADRONOX_MOVE2: + case EVENT_HADRONOX_MOVE3: + Talk(SAY_HADRONOX_EMOTE); + me->GetMotionMaster()->MoveCharge(hadronoxSteps[eventId - 1].GetPositionX(), hadronoxSteps[eventId - 1].GetPositionY(), hadronoxSteps[eventId - 1].GetPositionZ(), 10.0f, 0, NULL, true); + break; + + } + + DoMeleeAttackIfReady(); + EnterEvadeIfOutOfCombatArea(); + } + + bool CheckEvadeIfOutOfCombatArea() const + { + return me->isActiveObject() && !AnyPlayerValid(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_hadronoxAI(creature); + } }; class npc_anub_ar_crusher : public CreatureScript { - public: - npc_anub_ar_crusher() : CreatureScript("npc_anub_ar_crusher") { } +public: + npc_anub_ar_crusher() : CreatureScript("npc_anub_ar_crusher") { } - struct npc_anub_ar_crusherAI : public ScriptedAI + struct npc_anub_ar_crusherAI : public ScriptedAI + { + npc_anub_ar_crusherAI(Creature* c) : ScriptedAI(c), summons(me) {} + + EventMap events; + SummonList summons; + + void Reset() { - npc_anub_ar_crusherAI(Creature *c) : ScriptedAI(c), summons(me) {} + summons.DespawnAll(); + events.Reset(); - EventMap events; - SummonList summons; - - void Reset() - { - summons.DespawnAll(); - events.Reset(); - - if (me->ToTempSummon()) - if (Unit* summoner = me->ToTempSummon()->GetSummoner()) - if (summoner->GetEntry() == me->GetEntry()) - { - me->CastSpell(me, RAND(SPELL_SUMMON_ANUBAR_CHAMPION, SPELL_SUMMON_ANUBAR_CRYPT_FIEND, SPELL_SUMMON_ANUBAR_NECROMANCER), true); - me->CastSpell(me, RAND(SPELL_SUMMON_ANUBAR_CHAMPION, SPELL_SUMMON_ANUBAR_CRYPT_FIEND, SPELL_SUMMON_ANUBAR_NECROMANCER), true); - } - } - - void JustSummoned(Creature* summon) - { - if(summon->GetEntry() != me->GetEntry()) - { - summon->GetMotionMaster()->MovePoint(0, *me, false); - summon->GetMotionMaster()->MoveFollow(me, 0.1f, 0.0f + M_PI*0.3f*summons.size()); - } - summons.Summon(summon); - } - - void DoAction(int32 param) - { - if (param == ACTION_DESPAWN_ADDS) - { - summons.DoAction(ACTION_DESPAWN_ADDS); - summons.DespawnAll(); - } - } - - void EnterCombat(Unit*) - { - if (me->ToTempSummon()) - if (Unit* summoner = me->ToTempSummon()->GetSummoner()) - if (summoner->GetEntry() != me->GetEntry()) - { - summoner->GetAI()->DoAction(ACTION_START_EVENT); - me->SummonCreature(NPC_ANUB_AR_CRUSHER, 519.58f, 573.73f, 734.30f, 4.50f); - me->SummonCreature(NPC_ANUB_AR_CRUSHER, 539.38f, 573.25f, 732.20f, 4.738f); - Talk(SAY_CRUSHER_AGGRO); - } - - events.ScheduleEvent(EVENT_CRUSHER_SMASH, 8000, 0, 0); - events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_CRUSHER_SMASH: - me->CastSpell(me->GetVictim(), SPELL_SMASH, false); - events.ScheduleEvent(EVENT_CRUSHER_SMASH, 15000); - break; - case EVENT_CHECK_HEALTH: - if (me->HealthBelowPct(30)) - { - Talk(SAY_CRUSHER_EMOTE); - me->CastSpell(me, SPELL_FRENZY, false); - break; - } - events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); - break; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_anub_ar_crusherAI(creature); + if (me->ToTempSummon()) + if (Unit* summoner = me->ToTempSummon()->GetSummoner()) + if (summoner->GetEntry() == me->GetEntry()) + { + me->CastSpell(me, RAND(SPELL_SUMMON_ANUBAR_CHAMPION, SPELL_SUMMON_ANUBAR_CRYPT_FIEND, SPELL_SUMMON_ANUBAR_NECROMANCER), true); + me->CastSpell(me, RAND(SPELL_SUMMON_ANUBAR_CHAMPION, SPELL_SUMMON_ANUBAR_CRYPT_FIEND, SPELL_SUMMON_ANUBAR_NECROMANCER), true); + } } + + void JustSummoned(Creature* summon) + { + if(summon->GetEntry() != me->GetEntry()) + { + summon->GetMotionMaster()->MovePoint(0, *me, false); + summon->GetMotionMaster()->MoveFollow(me, 0.1f, 0.0f + M_PI * 0.3f * summons.size()); + } + summons.Summon(summon); + } + + void DoAction(int32 param) + { + if (param == ACTION_DESPAWN_ADDS) + { + summons.DoAction(ACTION_DESPAWN_ADDS); + summons.DespawnAll(); + } + } + + void EnterCombat(Unit*) + { + if (me->ToTempSummon()) + if (Unit* summoner = me->ToTempSummon()->GetSummoner()) + if (summoner->GetEntry() != me->GetEntry()) + { + summoner->GetAI()->DoAction(ACTION_START_EVENT); + me->SummonCreature(NPC_ANUB_AR_CRUSHER, 519.58f, 573.73f, 734.30f, 4.50f); + me->SummonCreature(NPC_ANUB_AR_CRUSHER, 539.38f, 573.25f, 732.20f, 4.738f); + Talk(SAY_CRUSHER_AGGRO); + } + + events.ScheduleEvent(EVENT_CRUSHER_SMASH, 8000, 0, 0); + events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_CRUSHER_SMASH: + me->CastSpell(me->GetVictim(), SPELL_SMASH, false); + events.ScheduleEvent(EVENT_CRUSHER_SMASH, 15000); + break; + case EVENT_CHECK_HEALTH: + if (me->HealthBelowPct(30)) + { + Talk(SAY_CRUSHER_EMOTE); + me->CastSpell(me, SPELL_FRENZY, false); + break; + } + events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); + break; + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_anub_ar_crusherAI(creature); + } }; class spell_hadronox_summon_periodic : public SpellScriptLoader { +public: + spell_hadronox_summon_periodic(const char* name, uint32 delay, uint32 spellEntry) : SpellScriptLoader(name), _delay(delay), _spellEntry(spellEntry) { } + + class spell_hadronox_summon_periodic_AuraScript : public AuraScript + { public: - spell_hadronox_summon_periodic(const char* name, uint32 delay, uint32 spellEntry) : SpellScriptLoader(name), _delay(delay), _spellEntry(spellEntry) { } + spell_hadronox_summon_periodic_AuraScript(uint32 delay, uint32 spellEntry) : _delay(delay), _spellEntry(spellEntry) { } + PrepareAuraScript(spell_hadronox_summon_periodic_AuraScript); - class spell_hadronox_summon_periodic_AuraScript : public AuraScript + void HandlePeriodic(AuraEffect const* /*aurEff*/) { - public: - spell_hadronox_summon_periodic_AuraScript(uint32 delay, uint32 spellEntry) : _delay(delay), _spellEntry(spellEntry) { } - PrepareAuraScript(spell_hadronox_summon_periodic_AuraScript); + PreventDefaultAction(); + Unit* owner = GetUnitOwner(); + if (InstanceScript* instance = owner->GetInstanceScript()) + if (instance->GetBossState(DATA_HADRONOX_EVENT) != DONE) + { + if (!owner->HasAura(SPELL_WEB_FRONT_DOORS)) + owner->CastSpell(owner, _spellEntry, true); + else if (!instance->IsEncounterInProgress()) + owner->RemoveAurasDueToSpell(SPELL_WEB_FRONT_DOORS); + } + } - void HandlePeriodic(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - Unit* owner = GetUnitOwner(); - if (InstanceScript* instance = owner->GetInstanceScript()) - if (instance->GetBossState(DATA_HADRONOX_EVENT) != DONE) - { - if (!owner->HasAura(SPELL_WEB_FRONT_DOORS)) - owner->CastSpell(owner, _spellEntry, true); - else if (!instance->IsEncounterInProgress()) - owner->RemoveAurasDueToSpell(SPELL_WEB_FRONT_DOORS); - } - } - - void OnApply(AuraEffect const* auraEffect, AuraEffectHandleModes) - { - GetAura()->GetEffect(auraEffect->GetEffIndex())->SetPeriodicTimer(_delay); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_hadronox_summon_periodic_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - OnEffectApply += AuraEffectApplyFn(spell_hadronox_summon_periodic_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - - private: - uint32 _delay; - uint32 _spellEntry; - }; - - AuraScript* GetAuraScript() const + void OnApply(AuraEffect const* auraEffect, AuraEffectHandleModes) { - return new spell_hadronox_summon_periodic_AuraScript(_delay, _spellEntry); + GetAura()->GetEffect(auraEffect->GetEffIndex())->SetPeriodicTimer(_delay); + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_hadronox_summon_periodic_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + OnEffectApply += AuraEffectApplyFn(spell_hadronox_summon_periodic_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); } private: uint32 _delay; uint32 _spellEntry; + }; + + AuraScript* GetAuraScript() const + { + return new spell_hadronox_summon_periodic_AuraScript(_delay, _spellEntry); + } + +private: + uint32 _delay; + uint32 _spellEntry; }; class spell_hadronox_leech_poison : public SpellScriptLoader { - public: - spell_hadronox_leech_poison() : SpellScriptLoader("spell_hadronox_leech_poison") { } +public: + spell_hadronox_leech_poison() : SpellScriptLoader("spell_hadronox_leech_poison") { } - class spell_hadronox_leech_poison_AuraScript : public AuraScript + class spell_hadronox_leech_poison_AuraScript : public AuraScript + { + PrepareAuraScript(spell_hadronox_leech_poison_AuraScript) + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_hadronox_leech_poison_AuraScript) - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_DEATH) - if (Unit* caster = GetCaster()) - caster->CastSpell(caster, SPELL_LEECH_POISON_HEAL, true); - } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_hadronox_leech_poison_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_LEECH, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_hadronox_leech_poison_AuraScript(); + if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_DEATH) + if (Unit* caster = GetCaster()) + caster->CastSpell(caster, SPELL_LEECH_POISON_HEAL, true); } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_hadronox_leech_poison_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_LEECH, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_hadronox_leech_poison_AuraScript(); + } }; class achievement_hadronox_denied : public AchievementCriteriaScript { - public: - achievement_hadronox_denied() : AchievementCriteriaScript("achievement_hadronox_denied") - { - } +public: + achievement_hadronox_denied() : AchievementCriteriaScript("achievement_hadronox_denied") + { + } - bool OnCheck(Player* /*player*/, Unit* target) - { - if (!target) - return false; + bool OnCheck(Player* /*player*/, Unit* target) + { + if (!target) + return false; - return target->GetAI()->GetData(target->GetEntry()); - } + return target->GetAI()->GetData(target->GetEntry()); + } }; void AddSC_boss_hadronox() diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp index 45a42b005..ad74e491d 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp @@ -50,186 +50,186 @@ enum Yells class boss_krik_thir : public CreatureScript { - public: - boss_krik_thir() : CreatureScript("boss_krik_thir") { } +public: + boss_krik_thir() : CreatureScript("boss_krik_thir") { } - struct boss_krik_thirAI : public BossAI + struct boss_krik_thirAI : public BossAI + { + boss_krik_thirAI(Creature* creature) : BossAI(creature, DATA_KRIKTHIR_THE_GATEWATCHER_EVENT) { - boss_krik_thirAI(Creature* creature) : BossAI(creature, DATA_KRIKTHIR_THE_GATEWATCHER_EVENT) - { - _initTalk = false; - } - - EventMap events2; - bool _initTalk; - - void Reset() - { - BossAI::Reset(); - events2.Reset(); - - me->SummonCreature(NPC_WATCHER_NARJIL, 511.8f, 666.493f, 776.278f, 0.977f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); - me->SummonCreature(NPC_SHADOWCASTER, 518.13f, 667.0f, 775.74f, 1.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); - me->SummonCreature(NPC_WARRIOR, 506.75f, 670.7f, 776.24f, 0.92f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); - me->SummonCreature(NPC_WATCHER_GASHRA, 526.66f, 663.605f, 775.805f, 1.23f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); - me->SummonCreature(NPC_SKIRMISHER, 522.23f, 668.97f, 775.66f, 1.18f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); - me->SummonCreature(NPC_WARRIOR, 532.4f, 666.47f, 775.67f, 1.45f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); - me->SummonCreature(NPC_WATCHER_SILTHIK, 543.826f, 665.123f, 776.245f, 1.55f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); - me->SummonCreature(NPC_SKIRMISHER, 547.5f, 669.96f, 776.1f, 2.3f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); - me->SummonCreature(NPC_SHADOWCASTER, 536.96f, 667.28f, 775.6f, 1.72f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); - } - - void MoveInLineOfSight(Unit *who) - { - if (who->GetTypeId() != TYPEID_PLAYER) - return; - - if (!_initTalk) - { - _initTalk = true; - Talk(SAY_PREFIGHT); - } - - if (events.Empty() && who->GetPositionZ() < 785.0f) - { - events2.ScheduleEvent(EVENT_KRIK_START_WAVE, 10000); - events2.ScheduleEvent(EVENT_KRIK_START_WAVE, 40000); - events2.ScheduleEvent(EVENT_KRIK_START_WAVE, 70000); - events2.ScheduleEvent(EVENT_KRIK_ENTER_COMBAT, 100000); - events2.ScheduleEvent(EVENT_KRIK_CHECK_EVADE, 5000); - - events.ScheduleEvent(EVENT_KRIK_HEALTH_CHECK, 1000); - events.ScheduleEvent(EVENT_KRIK_MIND_FLAY, 13000); - events.ScheduleEvent(EVENT_KRIK_SUMMON, 17000); - events.ScheduleEvent(EVENT_KRIK_CURSE, 8000); - events.ScheduleEvent(EVENT_CALL_ADDS, 1000); - me->setActive(true); - } - } - - uint32 GetData(uint32 data) const - { - if (data == me->GetEntry()) - return summons.HasEntry(NPC_WATCHER_NARJIL) && summons.HasEntry(NPC_WATCHER_GASHRA) && summons.HasEntry(NPC_WATCHER_SILTHIK); - return 0; - } - - void EnterCombat(Unit* who) - { - BossAI::EnterCombat(who); - Talk(SAY_AGGRO); - events2.Reset(); - } - - void JustDied(Unit* killer) - { - BossAI::JustDied(killer); - Talk(SAY_DEATH); - } - - void KilledUnit(Unit* ) - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(SAY_SLAY); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); - } - } - - void JustSummoned(Creature* summon) - { - summon->SetNoCallAssistance(true); - summons.Summon(summon); - } - - void SummonedCreatureDies(Creature* summon, Unit*) - { - summons.Despawn(summon); - } - - void UpdateAI(uint32 diff) - { - events2.Update(diff); - switch (events2.ExecuteEvent()) - { - case EVENT_KRIK_START_WAVE: - me->CastCustomSpell(SPELL_SUBBOSS_AGGRO_TRIGGER, SPELLVALUE_MAX_TARGETS, 1, me, true); - Talk(SAY_SEND_GROUP); - break; - case EVENT_KRIK_ENTER_COMBAT: - me->SetInCombatWithZone(); - break; - case EVENT_KRIK_CHECK_EVADE: - if (!SelectTargetFromPlayerList(100.0f)) - { - EnterEvadeMode(); - return; - } - events2.ScheduleEvent(EVENT_KRIK_CHECK_EVADE, 5000); - break; - } - - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_KRIK_HEALTH_CHECK: - if (HealthBelowPct(10)) - { - events.PopEvent(); - me->CastSpell(me, SPELL_FRENZY, true); - break; - } - events.ScheduleEvent(EVENT_KRIK_HEALTH_CHECK, 1000); - break; - case EVENT_KRIK_SUMMON: - Talk(SAY_SWARM); - me->CastSpell(me, SPELL_SWARM, false); - events.ScheduleEvent(EVENT_KRIK_SUMMON, 20000); - break; - case EVENT_KRIK_MIND_FLAY: - me->CastSpell(me->GetVictim(), SPELL_MIND_FLAY, false); - events.ScheduleEvent(EVENT_KRIK_MIND_FLAY, 15000); - break; - case EVENT_KRIK_CURSE: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - me->CastSpell(target, SPELL_CURSE_OF_FATIGUE, true); - events.ScheduleEvent(EVENT_KRIK_CURSE, 10000); - break; - case EVENT_CALL_ADDS: - summons.DoZoneInCombat(); - break; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI *GetAI(Creature *creature) const - { - return new boss_krik_thirAI(creature); + _initTalk = false; } + + EventMap events2; + bool _initTalk; + + void Reset() + { + BossAI::Reset(); + events2.Reset(); + + me->SummonCreature(NPC_WATCHER_NARJIL, 511.8f, 666.493f, 776.278f, 0.977f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); + me->SummonCreature(NPC_SHADOWCASTER, 518.13f, 667.0f, 775.74f, 1.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); + me->SummonCreature(NPC_WARRIOR, 506.75f, 670.7f, 776.24f, 0.92f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); + me->SummonCreature(NPC_WATCHER_GASHRA, 526.66f, 663.605f, 775.805f, 1.23f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); + me->SummonCreature(NPC_SKIRMISHER, 522.23f, 668.97f, 775.66f, 1.18f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); + me->SummonCreature(NPC_WARRIOR, 532.4f, 666.47f, 775.67f, 1.45f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); + me->SummonCreature(NPC_WATCHER_SILTHIK, 543.826f, 665.123f, 776.245f, 1.55f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); + me->SummonCreature(NPC_SKIRMISHER, 547.5f, 669.96f, 776.1f, 2.3f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); + me->SummonCreature(NPC_SHADOWCASTER, 536.96f, 667.28f, 775.6f, 1.72f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); + } + + void MoveInLineOfSight(Unit* who) + { + if (who->GetTypeId() != TYPEID_PLAYER) + return; + + if (!_initTalk) + { + _initTalk = true; + Talk(SAY_PREFIGHT); + } + + if (events.Empty() && who->GetPositionZ() < 785.0f) + { + events2.ScheduleEvent(EVENT_KRIK_START_WAVE, 10000); + events2.ScheduleEvent(EVENT_KRIK_START_WAVE, 40000); + events2.ScheduleEvent(EVENT_KRIK_START_WAVE, 70000); + events2.ScheduleEvent(EVENT_KRIK_ENTER_COMBAT, 100000); + events2.ScheduleEvent(EVENT_KRIK_CHECK_EVADE, 5000); + + events.ScheduleEvent(EVENT_KRIK_HEALTH_CHECK, 1000); + events.ScheduleEvent(EVENT_KRIK_MIND_FLAY, 13000); + events.ScheduleEvent(EVENT_KRIK_SUMMON, 17000); + events.ScheduleEvent(EVENT_KRIK_CURSE, 8000); + events.ScheduleEvent(EVENT_CALL_ADDS, 1000); + me->setActive(true); + } + } + + uint32 GetData(uint32 data) const + { + if (data == me->GetEntry()) + return summons.HasEntry(NPC_WATCHER_NARJIL) && summons.HasEntry(NPC_WATCHER_GASHRA) && summons.HasEntry(NPC_WATCHER_SILTHIK); + return 0; + } + + void EnterCombat(Unit* who) + { + BossAI::EnterCombat(who); + Talk(SAY_AGGRO); + events2.Reset(); + } + + void JustDied(Unit* killer) + { + BossAI::JustDied(killer); + Talk(SAY_DEATH); + } + + void KilledUnit(Unit* ) + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + { + Talk(SAY_SLAY); + events.ScheduleEvent(EVENT_KILL_TALK, 6000); + } + } + + void JustSummoned(Creature* summon) + { + summon->SetNoCallAssistance(true); + summons.Summon(summon); + } + + void SummonedCreatureDies(Creature* summon, Unit*) + { + summons.Despawn(summon); + } + + void UpdateAI(uint32 diff) + { + events2.Update(diff); + switch (events2.ExecuteEvent()) + { + case EVENT_KRIK_START_WAVE: + me->CastCustomSpell(SPELL_SUBBOSS_AGGRO_TRIGGER, SPELLVALUE_MAX_TARGETS, 1, me, true); + Talk(SAY_SEND_GROUP); + break; + case EVENT_KRIK_ENTER_COMBAT: + me->SetInCombatWithZone(); + break; + case EVENT_KRIK_CHECK_EVADE: + if (!SelectTargetFromPlayerList(100.0f)) + { + EnterEvadeMode(); + return; + } + events2.ScheduleEvent(EVENT_KRIK_CHECK_EVADE, 5000); + break; + } + + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_KRIK_HEALTH_CHECK: + if (HealthBelowPct(10)) + { + events.PopEvent(); + me->CastSpell(me, SPELL_FRENZY, true); + break; + } + events.ScheduleEvent(EVENT_KRIK_HEALTH_CHECK, 1000); + break; + case EVENT_KRIK_SUMMON: + Talk(SAY_SWARM); + me->CastSpell(me, SPELL_SWARM, false); + events.ScheduleEvent(EVENT_KRIK_SUMMON, 20000); + break; + case EVENT_KRIK_MIND_FLAY: + me->CastSpell(me->GetVictim(), SPELL_MIND_FLAY, false); + events.ScheduleEvent(EVENT_KRIK_MIND_FLAY, 15000); + break; + case EVENT_KRIK_CURSE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) + me->CastSpell(target, SPELL_CURSE_OF_FATIGUE, true); + events.ScheduleEvent(EVENT_KRIK_CURSE, 10000); + break; + case EVENT_CALL_ADDS: + summons.DoZoneInCombat(); + break; + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_krik_thirAI(creature); + } }; class achievement_watch_him_die : public AchievementCriteriaScript { - public: - achievement_watch_him_die() : AchievementCriteriaScript("achievement_watch_him_die") - { - } +public: + achievement_watch_him_die() : AchievementCriteriaScript("achievement_watch_him_die") + { + } - bool OnCheck(Player* /*player*/, Unit* target) - { - if (!target) - return false; + bool OnCheck(Player* /*player*/, Unit* target) + { + if (!target) + return false; - return target->GetAI()->GetData(target->GetEntry()); - } + return target->GetAI()->GetData(target->GetEntry()); + } }; void AddSC_boss_krik_thir() diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp index aa98b6245..a4a75d371 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp @@ -17,173 +17,173 @@ DoorData const doorData[] = class instance_azjol_nerub : public InstanceMapScript { - public: - instance_azjol_nerub() : InstanceMapScript("instance_azjol_nerub", 601) { } +public: + instance_azjol_nerub() : InstanceMapScript("instance_azjol_nerub", 601) { } - struct instance_azjol_nerub_InstanceScript : public InstanceScript + struct instance_azjol_nerub_InstanceScript : public InstanceScript + { + instance_azjol_nerub_InstanceScript(Map* map) : InstanceScript(map) { - instance_azjol_nerub_InstanceScript(Map* map) : InstanceScript(map) - { - SetBossNumber(MAX_ENCOUNTERS); - LoadDoorData(doorData); - _krikthirGUID = 0; - _hadronoxGUID = 0; - }; - - void OnCreatureCreate(Creature* creature) - { - switch (creature->GetEntry()) - { - case NPC_KRIKTHIR_THE_GATEWATCHER: - _krikthirGUID = creature->GetGUID(); - break; - case NPC_HADRONOX: - _hadronoxGUID = creature->GetGUID(); - break; - case NPC_SKITTERING_SWARMER: - case NPC_SKITTERING_INFECTIOR: - if (Creature* krikthir = instance->GetCreature(_krikthirGUID)) - krikthir->AI()->JustSummoned(creature); - break; - case NPC_ANUB_AR_CHAMPION: - case NPC_ANUB_AR_NECROMANCER: - case NPC_ANUB_AR_CRYPTFIEND: - if (Creature* hadronox = instance->GetCreature(_hadronoxGUID)) - hadronox->AI()->JustSummoned(creature); - break; - - } - } - - void OnGameObjectCreate(GameObject* go) - { - switch (go->GetEntry()) - { - case GO_KRIKTHIR_DOORS: - case GO_ANUBARAK_DOORS1: - case GO_ANUBARAK_DOORS2: - case GO_ANUBARAK_DOORS3: - AddDoor(go, true); - break; - } - } - - void OnGameObjectRemove(GameObject* go) - { - switch (go->GetEntry()) - { - case GO_KRIKTHIR_DOORS: - case GO_ANUBARAK_DOORS1: - case GO_ANUBARAK_DOORS2: - case GO_ANUBARAK_DOORS3: - AddDoor(go, false); - break; - } - } - - bool SetBossState(uint32 id, EncounterState state) - { - return InstanceScript::SetBossState(id, state); - } - - std::string GetSaveData() - { - std::ostringstream saveStream; - saveStream << "A N " << GetBossSaveData(); - return saveStream.str(); - } - - void Load(const char* in) - { - if( !in ) - return; - - char dataHead1, dataHead2; - std::istringstream loadStream(in); - loadStream >> dataHead1 >> dataHead2; - if (dataHead1 == 'A' && dataHead2 == 'N') - { - for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) - { - uint32 tmpState; - loadStream >> tmpState; - if (tmpState == IN_PROGRESS || tmpState > SPECIAL) - tmpState = NOT_STARTED; - SetBossState(i, EncounterState(tmpState)); - } - } - } - - private: - uint64 _krikthirGUID; - uint64 _hadronoxGUID; + SetBossNumber(MAX_ENCOUNTERS); + LoadDoorData(doorData); + _krikthirGUID = 0; + _hadronoxGUID = 0; }; - InstanceScript* GetInstanceScript(InstanceMap *map) const + void OnCreatureCreate(Creature* creature) { - return new instance_azjol_nerub_InstanceScript(map); + switch (creature->GetEntry()) + { + case NPC_KRIKTHIR_THE_GATEWATCHER: + _krikthirGUID = creature->GetGUID(); + break; + case NPC_HADRONOX: + _hadronoxGUID = creature->GetGUID(); + break; + case NPC_SKITTERING_SWARMER: + case NPC_SKITTERING_INFECTIOR: + if (Creature* krikthir = instance->GetCreature(_krikthirGUID)) + krikthir->AI()->JustSummoned(creature); + break; + case NPC_ANUB_AR_CHAMPION: + case NPC_ANUB_AR_NECROMANCER: + case NPC_ANUB_AR_CRYPTFIEND: + if (Creature* hadronox = instance->GetCreature(_hadronoxGUID)) + hadronox->AI()->JustSummoned(creature); + break; + + } } + + void OnGameObjectCreate(GameObject* go) + { + switch (go->GetEntry()) + { + case GO_KRIKTHIR_DOORS: + case GO_ANUBARAK_DOORS1: + case GO_ANUBARAK_DOORS2: + case GO_ANUBARAK_DOORS3: + AddDoor(go, true); + break; + } + } + + void OnGameObjectRemove(GameObject* go) + { + switch (go->GetEntry()) + { + case GO_KRIKTHIR_DOORS: + case GO_ANUBARAK_DOORS1: + case GO_ANUBARAK_DOORS2: + case GO_ANUBARAK_DOORS3: + AddDoor(go, false); + break; + } + } + + bool SetBossState(uint32 id, EncounterState state) + { + return InstanceScript::SetBossState(id, state); + } + + std::string GetSaveData() + { + std::ostringstream saveStream; + saveStream << "A N " << GetBossSaveData(); + return saveStream.str(); + } + + void Load(const char* in) + { + if( !in ) + return; + + char dataHead1, dataHead2; + std::istringstream loadStream(in); + loadStream >> dataHead1 >> dataHead2; + if (dataHead1 == 'A' && dataHead2 == 'N') + { + for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) + { + uint32 tmpState; + loadStream >> tmpState; + if (tmpState == IN_PROGRESS || tmpState > SPECIAL) + tmpState = NOT_STARTED; + SetBossState(i, EncounterState(tmpState)); + } + } + } + + private: + uint64 _krikthirGUID; + uint64 _hadronoxGUID; + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_azjol_nerub_InstanceScript(map); + } }; class spell_azjol_nerub_fixate : public SpellScriptLoader { - public: - spell_azjol_nerub_fixate() : SpellScriptLoader("spell_azjol_nerub_fixate") { } +public: + spell_azjol_nerub_fixate() : SpellScriptLoader("spell_azjol_nerub_fixate") { } - class spell_azjol_nerub_fixate_SpellScript : public SpellScript + class spell_azjol_nerub_fixate_SpellScript : public SpellScript + { + PrepareSpellScript(spell_azjol_nerub_fixate_SpellScript); + + void HandleScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_azjol_nerub_fixate_SpellScript); - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - target->CastSpell(GetCaster(), GetEffectValue(), true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_azjol_nerub_fixate_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_azjol_nerub_fixate_SpellScript(); + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) + target->CastSpell(GetCaster(), GetEffectValue(), true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_azjol_nerub_fixate_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_azjol_nerub_fixate_SpellScript(); + } }; class spell_azjol_nerub_web_wrap : public SpellScriptLoader { - public: - spell_azjol_nerub_web_wrap() : SpellScriptLoader("spell_azjol_nerub_web_wrap") { } +public: + spell_azjol_nerub_web_wrap() : SpellScriptLoader("spell_azjol_nerub_web_wrap") { } - class spell_azjol_nerub_web_wrap_AuraScript : public AuraScript + class spell_azjol_nerub_web_wrap_AuraScript : public AuraScript + { + PrepareAuraScript(spell_azjol_nerub_web_wrap_AuraScript); + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_azjol_nerub_web_wrap_AuraScript); - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - if (!target->HasAura(SPELL_WEB_WRAP_TRIGGER)) - target->CastSpell(target, SPELL_WEB_WRAP_TRIGGER, true); - } - - void Register() - { - OnEffectRemove += AuraEffectRemoveFn(spell_azjol_nerub_web_wrap_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_MOD_ROOT, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_azjol_nerub_web_wrap_AuraScript(); + Unit* target = GetTarget(); + if (!target->HasAura(SPELL_WEB_WRAP_TRIGGER)) + target->CastSpell(target, SPELL_WEB_WRAP_TRIGGER, true); } + + void Register() + { + OnEffectRemove += AuraEffectRemoveFn(spell_azjol_nerub_web_wrap_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_MOD_ROOT, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_azjol_nerub_web_wrap_AuraScript(); + } }; void AddSC_instance_azjol_nerub() { - new instance_azjol_nerub(); - new spell_azjol_nerub_fixate(); - new spell_azjol_nerub_web_wrap(); + new instance_azjol_nerub(); + new spell_azjol_nerub_fixate(); + new spell_azjol_nerub_web_wrap(); } diff --git a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/ahnkahet.h b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/ahnkahet.h index 036767fc4..3465e874c 100644 --- a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/ahnkahet.h +++ b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/ahnkahet.h @@ -34,7 +34,7 @@ enum Npc NPC_JEDOGA_SHADOWSEEKER = 29310, NPC_HERALD_JOLAZJ = 29311, NPC_AMANITAR = 30258, - + //spells SPELL_SHADOW_SICKLE = 56701, // Shadow Sickle Normal SPELL_SHADOW_SICKLE_H = 59104 // Shadow Sickle Heroic diff --git a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_amanitar.cpp b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_amanitar.cpp index 3a8fe13fb..3b671e787 100644 --- a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_amanitar.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_amanitar.cpp @@ -40,7 +40,7 @@ public: struct boss_amanitarAI : public ScriptedAI { - boss_amanitarAI(Creature *c) : ScriptedAI(c), summons(me) + boss_amanitarAI(Creature* c) : ScriptedAI(c), summons(me) { pInstance = c->GetInstanceScript(); me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, true); @@ -85,7 +85,7 @@ public: events.ScheduleEvent(EVENT_AMANITAR_SPAWN, 0); } - void JustSummoned(Creature *cr) { summons.Summon(cr); } + void JustSummoned(Creature* cr) { summons.Summon(cr); } void SpawnAdds() { @@ -95,17 +95,17 @@ public: for (uint8 i = 0; i < 25; ++i) { - float orientation = 2*rand_norm()*M_PI; - float x = center.GetPositionX() + i*2*cos(orientation); - float y = center.GetPositionY() + i*2*sin(orientation); + float orientation = 2 * rand_norm() * M_PI; + float x = center.GetPositionX() + i * 2 * cos(orientation); + float y = center.GetPositionY() + i * 2 * sin(orientation); me->SummonCreature(NPC_POISONOUS_MUSHROOM, x, y, me->GetMap()->GetHeight(x, y, MAX_HEIGHT)); } for (uint8 i = 0; i < 25; ++i) { - float orientation = 2*rand_norm()*M_PI; - float x = center.GetPositionX() + i*2*cos(orientation); - float y = center.GetPositionY() + i*2*sin(orientation); + float orientation = 2 * rand_norm() * M_PI; + float x = center.GetPositionX() + i * 2 * cos(orientation); + float y = center.GetPositionY() + i * 2 * sin(orientation); me->SummonCreature(NPC_HEALTHY_MUSHROOM, x, y, me->GetMap()->GetHeight(x, y, MAX_HEIGHT)); } } @@ -123,46 +123,46 @@ public: switch (events.GetEvent()) { case EVENT_AMANITAR_SPAWN: - { - SpawnAdds(); - events.RepeatEvent(urand(35000, 40000)); - break; - } + { + SpawnAdds(); + events.RepeatEvent(urand(35000, 40000)); + break; + } case EVENT_AMANITAR_ROOTS: - { - if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - me->CastSpell(pTarget, SPELL_ENTANGLING_ROOTS, false); + { + if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) + me->CastSpell(pTarget, SPELL_ENTANGLING_ROOTS, false); - events.RepeatEvent(urand(15000, 20000)); - break; - } + events.RepeatEvent(urand(15000, 20000)); + break; + } case EVENT_AMANITAR_BASH: - { - me->CastSpell(me->GetVictim(), SPELL_BASH, false); - events.RepeatEvent(urand(15000, 20000)); - break; - } + { + me->CastSpell(me->GetVictim(), SPELL_BASH, false); + events.RepeatEvent(urand(15000, 20000)); + break; + } case EVENT_AMANITAR_BOLT: - { - if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - me->CastSpell(pTarget, SPELL_VENOM_BOLT_VOLLEY, false); - - events.RepeatEvent(urand(15000, 20000)); - break; - } + { + if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) + me->CastSpell(pTarget, SPELL_VENOM_BOLT_VOLLEY, false); + + events.RepeatEvent(urand(15000, 20000)); + break; + } case EVENT_AMANITAR_MINI: - { - me->CastSpell(me, SPELL_MINI, false); - events.RepeatEvent(30000); - break; - } + { + me->CastSpell(me, SPELL_MINI, false); + events.RepeatEvent(30000); + break; + } } DoMeleeAttackIfReady(); } }; - CreatureAI *GetAI(Creature *creature) const + CreatureAI* GetAI(Creature* creature) const { return new boss_amanitarAI(creature); } @@ -232,7 +232,7 @@ public: } }; - CreatureAI *GetAI(Creature *creature) const + CreatureAI* GetAI(Creature* creature) const { return new npc_amanitar_mushroomsAI(creature); } 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 5d9e06e19..dab73ae08 100644 --- a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_elder_nadox.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_elder_nadox.cpp @@ -62,18 +62,18 @@ public: struct boss_elder_nadoxAI : public ScriptedAI { - boss_elder_nadoxAI(Creature *c) : ScriptedAI(c), summons(me) + boss_elder_nadoxAI(Creature* c) : ScriptedAI(c), summons(me) { pInstance = c->GetInstanceScript(); } EventMap events; - InstanceScript *pInstance; + InstanceScript* pInstance; SummonList summons; void SummonHelpers(bool swarm) { - Creature *cr; + Creature* cr; if (swarm) { if ((cr = me->SummonCreature(NPC_AHNKAHAR_SWARMER, 640.425f, -919.544f, 25.8701f, 2.56563f))) @@ -100,14 +100,14 @@ public: } } - void EnterCombat(Unit * /*who*/) + void EnterCombat(Unit* /*who*/) { Talk(SAY_AGGRO); events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); events.ScheduleEvent(EVENT_SWARMER, 10000); events.ScheduleEvent(EVENT_CHECK_HOME, 2000); - events.ScheduleEvent(EVENT_PLAGUE, 5000+rand()%3000); + events.ScheduleEvent(EVENT_PLAGUE, 5000 + rand() % 3000); events.ScheduleEvent(EVENT_BROOD_RAGE, 5000); if (pInstance) @@ -133,7 +133,7 @@ public: { events.Reset(); summons.DespawnAll(); - + Talk(SAY_DEATH); if (pInstance) @@ -146,7 +146,7 @@ public: { if (cr->GetEntry() == NPC_AHNKAHAR_GUARDIAN_ENTRY ) Talk(SAY_EGG_SAC); - + summons.Summon(cr); } } @@ -164,64 +164,64 @@ public: switch ( events.GetEvent() ) { case EVENT_CHECK_HEALTH: - { - events.RepeatEvent(1000); - if (HealthBelowPct(50)) { - events.CancelEvent(EVENT_CHECK_HEALTH); - events.ScheduleEvent(EVENT_SUMMON_GUARD, 100); - } - break; - } - case EVENT_SUMMON_GUARD: - { - Talk(EMOTE_HATCHES, me); - SummonHelpers(false); - events.PopEvent(); - break; - } - case EVENT_BROOD_RAGE: - { - if (Creature *pSwarmer = me->FindNearestCreature(NPC_AHNKAHAR_SWARMER, 40, true)) - me->CastSpell(pSwarmer, SPELL_BROOD_RAGE_H, true); - - events.RepeatEvent(10000); - break; - } - case EVENT_PLAGUE: - { - me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_BROOD_PLAGUE, SPELL_BROOD_PLAGUE_H), false); - events.RepeatEvent(12000+rand()%5000); - break; - } - case EVENT_SWARMER: - { - SummonHelpers(true); - events.RepeatEvent(10000); - break; - } - case EVENT_CHECK_HOME: - { - if (me->HasAura(SPELL_ENRAGE)) + events.RepeatEvent(1000); + if (HealthBelowPct(50)) + { + events.CancelEvent(EVENT_CHECK_HEALTH); + events.ScheduleEvent(EVENT_SUMMON_GUARD, 100); + } break; - - if (me->GetPositionZ() < 24) + } + case EVENT_SUMMON_GUARD: { - me->CastSpell(me, SPELL_ENRAGE, true); + Talk(EMOTE_HATCHES, me); + SummonHelpers(false); events.PopEvent(); break; } + case EVENT_BROOD_RAGE: + { + if (Creature* pSwarmer = me->FindNearestCreature(NPC_AHNKAHAR_SWARMER, 40, true)) + me->CastSpell(pSwarmer, SPELL_BROOD_RAGE_H, true); - events.RepeatEvent(2000); - break; - } + events.RepeatEvent(10000); + break; + } + case EVENT_PLAGUE: + { + me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_BROOD_PLAGUE, SPELL_BROOD_PLAGUE_H), false); + events.RepeatEvent(12000 + rand() % 5000); + break; + } + case EVENT_SWARMER: + { + SummonHelpers(true); + events.RepeatEvent(10000); + break; + } + case EVENT_CHECK_HOME: + { + if (me->HasAura(SPELL_ENRAGE)) + break; + + if (me->GetPositionZ() < 24) + { + me->CastSpell(me, SPELL_ENRAGE, true); + events.PopEvent(); + break; + } + + events.RepeatEvent(2000); + break; + } } DoMeleeAttackIfReady(); } }; - CreatureAI *GetAI(Creature *creature) const + CreatureAI* GetAI(Creature* creature) const { return new boss_elder_nadoxAI(creature); } @@ -234,9 +234,9 @@ public: struct npc_ahnkahar_nerubianAI : public ScriptedAI { - npc_ahnkahar_nerubianAI(Creature *c) : ScriptedAI(c) { } + npc_ahnkahar_nerubianAI(Creature* c) : ScriptedAI(c) { } + - uint32 uiSprintTimer; void Reset() { @@ -244,19 +244,19 @@ public: me->CastSpell(me, SPELL_GUARDIAN_AURA, true); else // Swarmers me->CastSpell(me, SPELL_SWARMER_AURA, true); - + if (me->GetEntry() == NPC_AHNKAHAR_SWARMER || me->GetEntry() == NPC_AHNKAHAR_GUARDIAN_ENTRY) me->SetInCombatWithZone(); uiSprintTimer = 10000; } - void JustDied(Unit * /*killer*/) + void JustDied(Unit* /*killer*/) { if (me->GetEntry() == NPC_AHNKAHAR_GUARDIAN_ENTRY) { - if (InstanceScript *pInstance = me->GetInstanceScript()) - if (Creature *nadox = ObjectAccessor::GetCreature(*me, pInstance->GetData64(DATA_ELDER_NADOX))) + if (InstanceScript* pInstance = me->GetInstanceScript()) + if (Creature* nadox = ObjectAccessor::GetCreature(*me, pInstance->GetData64(DATA_ELDER_NADOX))) nadox->AI()->DoAction(ACTION_GUARDIAN_DIED); me->RemoveAllAuras(); @@ -273,14 +273,14 @@ public: me->CastSpell(me, SPELL_SPRINT, false); uiSprintTimer = 15000; } - else + else uiSprintTimer -= diff; DoMeleeAttackIfReady(); } }; - CreatureAI *GetAI(Creature *creature) const + CreatureAI* GetAI(Creature* creature) const { return new npc_ahnkahar_nerubianAI(creature); } @@ -288,54 +288,54 @@ public: class spell_ahn_kahet_swarmer_aura : public SpellScriptLoader { - public: - spell_ahn_kahet_swarmer_aura() : SpellScriptLoader("spell_ahn_kahet_swarmer_aura") { } +public: + spell_ahn_kahet_swarmer_aura() : SpellScriptLoader("spell_ahn_kahet_swarmer_aura") { } - class spell_ahn_kahet_swarmer_aura_SpellScript : public SpellScript + class spell_ahn_kahet_swarmer_aura_SpellScript : public SpellScript + { + PrepareSpellScript(spell_ahn_kahet_swarmer_aura_SpellScript) + + void HandleDummy(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_ahn_kahet_swarmer_aura_SpellScript) + Unit* caster = GetCaster(); + std::list swarm, swarm2; + caster->GetCreaturesWithEntryInRange(swarm, 40.0f, 30338); + caster->GetCreaturesWithEntryInRange(swarm2, 40.0f, 30178); + int32 aliveCount = -1; // minus self - void HandleDummy(SpellEffIndex /*effIndex*/) + std::list::const_iterator itr; + for (itr = swarm.begin(); itr != swarm.end(); ++itr) + if ((*itr)->IsAlive()) + aliveCount++; + for (itr = swarm2.begin(); itr != swarm2.end(); ++itr) + if ((*itr)->IsAlive()) + aliveCount++; + + if (Aura* aur = caster->GetAura(56281)) { - Unit* caster = GetCaster(); - std::list swarm, swarm2; - caster->GetCreaturesWithEntryInRange(swarm, 40.0f, 30338); - caster->GetCreaturesWithEntryInRange(swarm2, 40.0f, 30178); - int32 aliveCount = -1; // minus self - - std::list::const_iterator itr; - for (itr = swarm.begin(); itr != swarm.end(); ++itr) - if ((*itr)->IsAlive()) - aliveCount++; - for (itr = swarm2.begin(); itr != swarm2.end(); ++itr) - if ((*itr)->IsAlive()) - aliveCount++; - - if (Aura *aur = caster->GetAura(56281)) - { - if (aliveCount > 0) - aur->SetStackAmount(aliveCount); - else - aur->Remove(); - } - else if (aliveCount > 0) - { - caster->CastCustomSpell(caster, 56281, &aliveCount, &aliveCount, &aliveCount, true); - if (Aura *aur = caster->GetAura(56281)) - aur->SetStackAmount(aliveCount); - } + if (aliveCount > 0) + aur->SetStackAmount(aliveCount); + else + aur->Remove(); } - - void Register() + else if (aliveCount > 0) { - OnEffectHitTarget += SpellEffectFn(spell_ahn_kahet_swarmer_aura_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + caster->CastCustomSpell(caster, 56281, &aliveCount, &aliveCount, &aliveCount, true); + if (Aura* aur = caster->GetAura(56281)) + aur->SetStackAmount(aliveCount); } - }; - - SpellScript* GetSpellScript() const - { - return new spell_ahn_kahet_swarmer_aura_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_ahn_kahet_swarmer_aura_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_ahn_kahet_swarmer_aura_SpellScript(); + } }; void AddSC_boss_elder_nadox() diff --git a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_herald_volazj.cpp b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_herald_volazj.cpp index 040fed137..5339c2528 100644 --- a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_herald_volazj.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_herald_volazj.cpp @@ -64,7 +64,7 @@ public: pInstance = pCreature->GetInstanceScript(); } - InstanceScript *pInstance; + InstanceScript* pInstance; EventMap events; SummonList summons; uint8 insanityTimes; @@ -77,7 +77,7 @@ public: insanityTimes = insanityHandled = 0; // Visible for all players in insanity - me->SetPhaseMask((1|16|32|64|128|256), true); + me->SetPhaseMask((1 | 16 | 32 | 64 | 128 | 256), true); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetControlled(false, UNIT_STATE_STUNNED); ResetPlayersPhaseMask(); @@ -89,7 +89,7 @@ public: } } - void SpellHitTarget(Unit* pTarget, const SpellInfo *spell) + void SpellHitTarget(Unit* pTarget, const SpellInfo* spell) { if (spell->Id == SPELL_INSANITY) { @@ -107,13 +107,13 @@ public: } // phase mask - pTarget->CastSpell(pTarget, SPELL_INSANITY_TARGET+insanityHandled, true); - + pTarget->CastSpell(pTarget, SPELL_INSANITY_TARGET + insanityHandled, true); + // summon twisted party members for this target - Map::PlayerList const &players = me->GetMap()->GetPlayers(); + Map::PlayerList const& players = me->GetMap()->GetPlayers(); for (Map::PlayerList::const_iterator i = players.begin(); i != players.end(); ++i) { - Player *plr = i->GetSource(); + Player* plr = i->GetSource(); if (!plr || !plr->IsAlive() || pTarget->GetGUID() == plr->GetGUID()) continue; @@ -125,7 +125,7 @@ public: pTarget->SetInCombatWith(summon); plr->CastSpell(summon, SPELL_CLONE_PLAYER, true); - summon->SetPhaseMask(1|(1<<(4+insanityHandled)), true); + summon->SetPhaseMask(1 | (1 << (4 + insanityHandled)), true); summon->SetUInt32Value(UNIT_FIELD_MINDAMAGE, plr->GetUInt32Value(UNIT_FIELD_MINDAMAGE)); summon->SetUInt32Value(UNIT_FIELD_MAXDAMAGE, plr->GetUInt32Value(UNIT_FIELD_MAXDAMAGE)); } @@ -137,7 +137,7 @@ public: void ResetPlayersPhaseMask() { - Map::PlayerList const &players = me->GetMap()->GetPlayers(); + Map::PlayerList const& players = me->GetMap()->GetPlayers(); for (Map::PlayerList::const_iterator i = players.begin(); i != players.end(); ++i) { if (Player* pPlayer = i->GetSource()) @@ -164,7 +164,7 @@ public: me->SetInCombatWithZone(); } - void JustSummoned(Creature *summon) { summons.Summon(summon); } + void JustSummoned(Creature* summon) { summons.Summon(summon); } uint32 GetSpellForPhaseMask(uint32 phase) { @@ -202,11 +202,11 @@ public: uint16 phase = 1; for (std::list::iterator itr = summons.begin(); itr != summons.end(); ++itr) { - if (Creature *summon = ObjectAccessor::GetCreature(*me, *itr)) + if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr)) phase |= summon->GetPhaseMask(); } - Map::PlayerList const &players = me->GetMap()->GetPlayers(); + Map::PlayerList const& players = me->GetMap()->GetPlayers(); for (Map::PlayerList::const_iterator i = players.begin(); i != players.end(); ++i) { if (Player* pPlayer = i->GetSource()) @@ -241,41 +241,41 @@ public: switch (events.GetEvent()) { case EVENT_HERALD_HEALTH: - { - if (insanityTimes == 0 && me->GetHealthPct() <= 66) { - me->CastSpell(me, SPELL_INSANITY, false); - insanityTimes++; - } - else if (insanityTimes == 1 && me->GetHealthPct() <= 33) - { - me->CastSpell(me, SPELL_INSANITY, false); - insanityTimes++; - } + if (insanityTimes == 0 && me->GetHealthPct() <= 66) + { + me->CastSpell(me, SPELL_INSANITY, false); + insanityTimes++; + } + else if (insanityTimes == 1 && me->GetHealthPct() <= 33) + { + me->CastSpell(me, SPELL_INSANITY, false); + insanityTimes++; + } - events.RepeatEvent(1000); - break; - } + events.RepeatEvent(1000); + break; + } case EVENT_HERALD_MIND_FLAY: - { - me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_MIND_FLAY_H : SPELL_MIND_FLAY, false); - events.RepeatEvent(20000); - break; - } + { + me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_MIND_FLAY_H : SPELL_MIND_FLAY, false); + events.RepeatEvent(20000); + break; + } case EVENT_HERALD_SHADOW: - { - me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_SHADOW_BOLT_VOLLEY_H : SPELL_SHADOW_BOLT_VOLLEY, false); - events.RepeatEvent(5000); - break; - } + { + me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_SHADOW_BOLT_VOLLEY_H : SPELL_SHADOW_BOLT_VOLLEY, false); + events.RepeatEvent(5000); + break; + } case EVENT_HERALD_SHIVER: - { - if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0)) - me->CastSpell(pTarget, IsHeroic() ? SPELL_SHIVER_H : SPELL_SHIVER, false); + { + if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0)) + me->CastSpell(pTarget, IsHeroic() ? SPELL_SHIVER_H : SPELL_SHIVER, false); - events.RepeatEvent(15000); - break; - } + events.RepeatEvent(15000); + break; + } } DoMeleeAttackIfReady(); @@ -294,13 +294,13 @@ public: ResetPlayersPhaseMask(); } - void KilledUnit(Unit * /*victim*/) + void KilledUnit(Unit* /*victim*/) { Talk(SAY_SLAY); } }; - CreatureAI *GetAI(Creature *creature) const + CreatureAI* GetAI(Creature* creature) const { return new boss_volazjAI(creature); } 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 8ad9afb8f..4851abde7 100644 --- a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_jedoga_shadowseeker.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_jedoga_shadowseeker.cpp @@ -88,8 +88,8 @@ public: bool isFlying; bool startFly; - void JustSummoned(Creature *cr) { summons.Summon(cr); } - void MoveInLineOfSight(Unit *) { } + void JustSummoned(Creature* cr) { summons.Summon(cr); } + void MoveInLineOfSight(Unit*) { } void SpawnInitiate(bool start) { @@ -144,11 +144,11 @@ public: if (!summons.size()) return; - uint8 rnd = urand(0, summons.size()-1); + uint8 rnd = urand(0, summons.size() - 1); uint8 loop = 0; for (std::list::iterator i = summons.begin(); i != summons.end();) { - Creature *summon = ObjectAccessor::GetCreature(*me, *i); + Creature* summon = ObjectAccessor::GetCreature(*me, *i); if (summon && summon->GetEntry() == NPC_INITIATE && loop >= rnd) { summon->AI()->DoAction(ACTION_ACTIVATE); @@ -262,10 +262,10 @@ public: me->SetDisableGravity(true); } - + void MovementInform(uint32 Type, uint32 PointId) { - if (Type != POINT_MOTION_TYPE) + if (Type != POINT_MOTION_TYPE) return; if (PointId == POINT_DOWN) @@ -338,54 +338,54 @@ public: switch (events.GetEvent()) { case EVENT_JEDOGA_CYCLONE: - { - me->CastSpell(me, IsHeroic() ? SPELL_CYCLONE_STRIKE_H : SPELL_CYCLONE_STRIKE, false); - events.RepeatEvent(urand(10000, 14000)); - break; - } - case EVENT_JEDOGA_LIGHTNING_BOLT: - { - if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - me->CastSpell(pTarget, IsHeroic() ? SPELL_LIGHTNING_BOLT_H : SPELL_LIGHTNING_BOLT, false); - - events.RepeatEvent(urand(11000, 15000)); - break; - } - case EVENT_JEDOGA_THUNDERSHOCK: - { - if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - me->CastSpell(pTarget, IsHeroic() ? SPELL_THUNDERSHOCK_H : SPELL_THUNDERSHOCK, false); - - events.RepeatEvent(urand(16000, 22000)); - break; - } - case EVENT_JEDOGA_MOVE_UP: - { - events.PopEvent(); - if (!summons.HasEntry(NPC_INITIATE)) - break; - - if (Creature *cr = me->SummonCreature(NPC_JEDOGA_CONTROLLER, 373.48f, -706.00f, -16.18f)) { - cr->CastSpell(cr, SPELL_SACRIFICE_VISUAL, true); - summons.Summon(cr); + me->CastSpell(me, IsHeroic() ? SPELL_CYCLONE_STRIKE_H : SPELL_CYCLONE_STRIKE, false); + events.RepeatEvent(urand(10000, 14000)); + break; } + case EVENT_JEDOGA_LIGHTNING_BOLT: + { + if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) + me->CastSpell(pTarget, IsHeroic() ? SPELL_LIGHTNING_BOLT_H : SPELL_LIGHTNING_BOLT, false); - Talk(TEXT_SACRIFICE_1); + events.RepeatEvent(urand(11000, 15000)); + break; + } + case EVENT_JEDOGA_THUNDERSHOCK: + { + if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) + me->CastSpell(pTarget, IsHeroic() ? SPELL_THUNDERSHOCK_H : SPELL_THUNDERSHOCK, false); - isFlying = true; - me->GetMotionMaster()->Clear(true); - me->GetMotionMaster()->MovePoint(POINT_RITUAL, JedogaPosition[1]); - break; - } + events.RepeatEvent(urand(16000, 22000)); + break; + } + case EVENT_JEDOGA_MOVE_UP: + { + events.PopEvent(); + if (!summons.HasEntry(NPC_INITIATE)) + break; + + if (Creature* cr = me->SummonCreature(NPC_JEDOGA_CONTROLLER, 373.48f, -706.00f, -16.18f)) + { + cr->CastSpell(cr, SPELL_SACRIFICE_VISUAL, true); + summons.Summon(cr); + } + + Talk(TEXT_SACRIFICE_1); + + isFlying = true; + me->GetMotionMaster()->Clear(true); + me->GetMotionMaster()->MovePoint(POINT_RITUAL, JedogaPosition[1]); + break; + } case EVENT_JEDOGA_MOVE_DOWN: - { - Talk(TEXT_SACRIFICE_2); - summons.DespawnEntry(NPC_JEDOGA_CONTROLLER); - MoveDown(); - events.PopEvent(); - break; - } + { + Talk(TEXT_SACRIFICE_2); + summons.DespawnEntry(NPC_JEDOGA_CONTROLLER); + MoveDown(); + events.PopEvent(); + break; + } } DoMeleeAttackIfReady(); @@ -393,7 +393,7 @@ public: } }; - CreatureAI *GetAI(Creature *creature) const + CreatureAI* GetAI(Creature* creature) const { return new boss_jedoga_shadowseekerAI(creature); } @@ -420,7 +420,7 @@ public: ScriptedAI::AttackStart(who); } - void MoveInLineOfSight(Unit *who) + void MoveInLineOfSight(Unit* who) { if (!Timer) ScriptedAI::MoveInLineOfSight(who); @@ -523,7 +523,7 @@ public: } }; - CreatureAI *GetAI(Creature *creature) const + CreatureAI* GetAI(Creature* creature) const { return new npc_jedoga_initiandAI(creature); } 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 7fe3913fd..920dea49c 100644 --- a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_prince_taldaram.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_prince_taldaram.cpp @@ -62,7 +62,7 @@ public: struct boss_taldaramAI : public ScriptedAI { - boss_taldaramAI(Creature *c) : ScriptedAI(c), summons(me) + boss_taldaramAI(Creature* c) : ScriptedAI(c), summons(me) { pInstance = c->GetInstanceScript(); } @@ -130,7 +130,7 @@ public: vanishDamage = 0; } - void SpellHitTarget(Unit *, const SpellInfo *spellInfo) + void SpellHitTarget(Unit*, const SpellInfo* spellInfo) { if (spellInfo->Id == SPELL_CONJURE_FLAME_SPHERE) summons.DoAction(ACTION_SPHERE); @@ -148,83 +148,83 @@ public: switch (events.GetEvent()) { case EVENT_PRINCE_BLOODTHIRST: - { - me->CastSpell(me->GetVictim(), SPELL_BLOODTHIRST, false); - events.RepeatEvent(10000); - break; - } + { + me->CastSpell(me->GetVictim(), SPELL_BLOODTHIRST, false); + events.RepeatEvent(10000); + break; + } case EVENT_PRINCE_FLAME_SPHERES: - { - me->CastSpell(me->GetVictim(), SPELL_CONJURE_FLAME_SPHERE, false); - events.RescheduleEvent(EVENT_PRINCE_VANISH, 14000); - Creature *cr; - if ((cr = me->SummonCreature(CREATURE_FLAME_SPHERE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+5.0f, 0.0f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10*IN_MILLISECONDS))) - summons.Summon(cr); - - if (me->GetMap()->IsHeroic()) { - if ((cr = me->SummonCreature(CREATURE_FLAME_SPHERE_1, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+5.0f, 0.0f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10*IN_MILLISECONDS))) + me->CastSpell(me->GetVictim(), SPELL_CONJURE_FLAME_SPHERE, false); + events.RescheduleEvent(EVENT_PRINCE_VANISH, 14000); + Creature* cr; + if ((cr = me->SummonCreature(CREATURE_FLAME_SPHERE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 5.0f, 0.0f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10 * IN_MILLISECONDS))) summons.Summon(cr); - if ((cr = me->SummonCreature(CREATURE_FLAME_SPHERE_2, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+5.0f, 0.0f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10*IN_MILLISECONDS))) - summons.Summon(cr); + if (me->GetMap()->IsHeroic()) + { + if ((cr = me->SummonCreature(CREATURE_FLAME_SPHERE_1, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 5.0f, 0.0f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10 * IN_MILLISECONDS))) + summons.Summon(cr); + + if ((cr = me->SummonCreature(CREATURE_FLAME_SPHERE_2, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 5.0f, 0.0f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10 * IN_MILLISECONDS))) + summons.Summon(cr); + } + events.RepeatEvent(15000); + break; } - events.RepeatEvent(15000); - break; - } case EVENT_PRINCE_VANISH: - { - events.PopEvent(); - //Count alive players - uint8 count = 0; - Unit *pTarget; - std::list t_list = me->getThreatManager().getThreatList(); - for (std::list::const_iterator itr = t_list.begin(); itr!= t_list.end(); ++itr) { - pTarget = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid()); - if (pTarget && pTarget->GetTypeId() == TYPEID_PLAYER && pTarget->IsAlive()) - count++; - } - //He only vanishes if there are 3 or more alive players - if (count > 2) - { - Talk(SAY_VANISH); - me->CastSpell(me, SPELL_VANISH, false); + events.PopEvent(); + //Count alive players + uint8 count = 0; + Unit* pTarget; + std::list t_list = me->getThreatManager().getThreatList(); + for (std::list::const_iterator itr = t_list.begin(); itr != t_list.end(); ++itr) + { + pTarget = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid()); + if (pTarget && pTarget->GetTypeId() == TYPEID_PLAYER && pTarget->IsAlive()) + count++; + } + //He only vanishes if there are 3 or more alive players + if (count > 2) + { + Talk(SAY_VANISH); + me->CastSpell(me, SPELL_VANISH, false); - events.CancelEvent(EVENT_PRINCE_FLAME_SPHERES); - events.CancelEvent(EVENT_PRINCE_BLOODTHIRST); - events.ScheduleEvent(EVENT_PRINCE_VANISH_RUN, 2499); - if (Unit* pEmbraceTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - vanishTarget = pEmbraceTarget->GetGUID(); + events.CancelEvent(EVENT_PRINCE_FLAME_SPHERES); + events.CancelEvent(EVENT_PRINCE_BLOODTHIRST); + events.ScheduleEvent(EVENT_PRINCE_VANISH_RUN, 2499); + if (Unit* pEmbraceTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) + vanishTarget = pEmbraceTarget->GetGUID(); + } + break; } - break; - } case EVENT_PRINCE_VANISH_RUN: - { - if (Unit *vT = ObjectAccessor::GetUnit(*me, vanishTarget)) { - me->UpdatePosition(vT->GetPositionX(), vT->GetPositionY(), vT->GetPositionZ(), me->GetAngle(vT), true); - me->CastSpell(vT, SPELL_EMBRACE_OF_THE_VAMPYR, false); - me->RemoveAura(SPELL_VANISH); - } + if (Unit* vT = ObjectAccessor::GetUnit(*me, vanishTarget)) + { + me->UpdatePosition(vT->GetPositionX(), vT->GetPositionY(), vT->GetPositionZ(), me->GetAngle(vT), true); + me->CastSpell(vT, SPELL_EMBRACE_OF_THE_VAMPYR, false); + me->RemoveAura(SPELL_VANISH); + } - events.PopEvent(); - events.ScheduleEvent(EVENT_PRINCE_RESCHEDULE, 20000); - break; - } + events.PopEvent(); + events.ScheduleEvent(EVENT_PRINCE_RESCHEDULE, 20000); + break; + } case EVENT_PRINCE_RESCHEDULE: - { - events.PopEvent(); - ScheduleEvents(); - break; - } + { + events.PopEvent(); + ScheduleEvents(); + break; + } } if (me->IsVisible()) DoMeleeAttackIfReady(); } - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) { if (vanishTarget) { @@ -246,9 +246,9 @@ public: pInstance->SetData(DATA_PRINCE_TALDARAM_EVENT, DONE); } - void KilledUnit(Unit * victim) + void KilledUnit(Unit* victim) { - if (urand(0,1)) + if (urand(0, 1)) return; if (vanishTarget && victim->GetGUID() == vanishTarget) @@ -258,7 +258,7 @@ public: } }; - CreatureAI *GetAI(Creature *creature) const + CreatureAI* GetAI(Creature* creature) const { return new boss_taldaramAI(creature); } @@ -271,7 +271,7 @@ public: struct npc_taldaram_flamesphereAI : public ScriptedAI { - npc_taldaram_flamesphereAI(Creature *c) : ScriptedAI(c) + npc_taldaram_flamesphereAI(Creature* c) : ScriptedAI(c) { } @@ -283,7 +283,7 @@ public: { me->CastSpell(me, me->GetMap()->IsHeroic() ? SPELL_FLAME_SPHERE_PERIODIC_H : SPELL_FLAME_SPHERE_PERIODIC, true); - float angle = rand_norm()*2*M_PI; + float angle = rand_norm() * 2 * M_PI; float x = me->GetPositionX() + DATA_SPHERE_DISTANCE * cos(angle); float y = me->GetPositionY() + DATA_SPHERE_DISTANCE * sin(angle); me->GetMotionMaster()->MovePoint(0, x, y, me->GetPositionZ()); @@ -300,11 +300,11 @@ public: { me->CastSpell(me, SPELL_FLAME_SPHERE_SPAWN_EFFECT, true); me->CastSpell(me, SPELL_FLAME_SPHERE_VISUAL, true); - uiDespawnTimer = 13*IN_MILLISECONDS; + uiDespawnTimer = 13 * IN_MILLISECONDS; } - void EnterCombat(Unit * /*who*/) {} - void MoveInLineOfSight(Unit * /*who*/) {} + void EnterCombat(Unit* /*who*/) {} + void MoveInLineOfSight(Unit* /*who*/) {} void JustDied(Unit* /*who*/) { @@ -320,7 +320,7 @@ public: } }; - CreatureAI *GetAI(Creature *creature) const + CreatureAI* GetAI(Creature* creature) const { return new npc_taldaram_flamesphereAI(creature); } @@ -331,13 +331,13 @@ class go_prince_taldaram_sphere : public GameObjectScript public: go_prince_taldaram_sphere() : GameObjectScript("go_prince_taldaram_sphere") { } - bool OnGossipHello(Player * /*pPlayer*/, GameObject *go) override + bool OnGossipHello(Player* /*pPlayer*/, GameObject* go) override { - InstanceScript *pInstance = go->GetInstanceScript(); + InstanceScript* pInstance = go->GetInstanceScript(); if (!pInstance) return false; - Creature *pPrinceTaldaram = ObjectAccessor::GetCreature(*go, pInstance->GetData64(DATA_PRINCE_TALDARAM)); + Creature* pPrinceTaldaram = ObjectAccessor::GetCreature(*go, pInstance->GetData64(DATA_PRINCE_TALDARAM)); if (pPrinceTaldaram && pPrinceTaldaram->IsAlive()) { go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); diff --git a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/instance_ahnkahet.cpp b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/instance_ahnkahet.cpp index 7707158ca..826d3fc2d 100644 --- a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/instance_ahnkahet.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/instance_ahnkahet.cpp @@ -84,11 +84,11 @@ public: { switch(pGo->GetEntry()) { - case 193564: + case 193564: Prince_TaldaramPlatform = pGo->GetGUID(); - if (m_auiEncounter[1] == DONE) - HandleGameObject(0,true,pGo); - + if (m_auiEncounter[1] == DONE) + HandleGameObject(0, true, pGo); + break; case 193093: if (spheres == DONE) @@ -96,9 +96,9 @@ public: pGo->SetGoState(GO_STATE_ACTIVE); pGo->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); } - else + else pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - + break; case 193094: if (spheres == DONE) @@ -106,15 +106,15 @@ public: pGo->SetGoState(GO_STATE_ACTIVE); pGo->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); } - else + else pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - + break; - case 192236: + case 192236: Prince_TaldaramGate = pGo->GetGUID(); // Web gate past Prince Taldaram if (m_auiEncounter[1] == DONE) - HandleGameObject(0,true,pGo); - + HandleGameObject(0, true, pGo); + break; } } @@ -123,12 +123,18 @@ public: { switch(identifier) { - case DATA_ELDER_NADOX: return Elder_Nadox; - case DATA_PRINCE_TALDARAM: return Prince_Taldaram; - case DATA_JEDOGA_SHADOWSEEKER: return Jedoga_Shadowseeker; - case DATA_HERALD_VOLAZJ: return Herald_Volazj; - case DATA_AMANITAR: return Amanitar; - case DATA_PRINCE_TALDARAM_PLATFORM: return Prince_TaldaramPlatform; + case DATA_ELDER_NADOX: + return Elder_Nadox; + case DATA_PRINCE_TALDARAM: + return Prince_Taldaram; + case DATA_JEDOGA_SHADOWSEEKER: + return Jedoga_Shadowseeker; + case DATA_HERALD_VOLAZJ: + return Herald_Volazj; + case DATA_AMANITAR: + return Amanitar; + case DATA_PRINCE_TALDARAM_PLATFORM: + return Prince_TaldaramPlatform; } return 0; @@ -152,14 +158,14 @@ public: { case DATA_HERALD_VOLAZJ_EVENT: case DATA_AMANITAR_EVENT: - case DATA_ELDER_NADOX_EVENT: + case DATA_ELDER_NADOX_EVENT: case DATA_JEDOGA_SHADOWSEEKER_EVENT: m_auiEncounter[type] = data; break; case DATA_PRINCE_TALDARAM_EVENT: if (data == DONE) HandleGameObject(Prince_TaldaramGate, true); - + m_auiEncounter[type] = data; break; case DATA_SPHERE_EVENT: @@ -188,7 +194,7 @@ public: case DATA_AMANITAR_EVENT: return m_auiEncounter[type]; - case DATA_SPHERE_EVENT: + case DATA_SPHERE_EVENT: return spheres; } @@ -201,8 +207,8 @@ public: std::ostringstream saveStream; saveStream << "A K " << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' ' - << m_auiEncounter[2] << ' ' << m_auiEncounter[3] << ' ' << m_auiEncounter[4] << ' ' - << spheres; + << m_auiEncounter[2] << ' ' << m_auiEncounter[3] << ' ' << m_auiEncounter[4] << ' ' + << spheres; OUT_SAVE_INST_DATA_COMPLETE; return saveStream.str(); @@ -238,62 +244,63 @@ public: spheres = data5; - } else OUT_LOAD_INST_DATA_FAIL; + } + else OUT_LOAD_INST_DATA_FAIL; OUT_LOAD_INST_DATA_COMPLETE; } }; - InstanceScript* GetInstanceScript(InstanceMap *map) const + InstanceScript* GetInstanceScript(InstanceMap* map) const { - return new instance_ahnkahet_InstanceScript(map); + return new instance_ahnkahet_InstanceScript(map); } }; class spell_shadow_sickle_periodic_damage : public SpellScriptLoader { - public: - spell_shadow_sickle_periodic_damage() : SpellScriptLoader("spell_shadow_sickle_periodic_damage") { } +public: + spell_shadow_sickle_periodic_damage() : SpellScriptLoader("spell_shadow_sickle_periodic_damage") { } - class spell_shadow_sickle_periodic_damage_AuraScript : public AuraScript + class spell_shadow_sickle_periodic_damage_AuraScript : public AuraScript + { + PrepareAuraScript(spell_shadow_sickle_periodic_damage_AuraScript); + + void HandlePeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_shadow_sickle_periodic_damage_AuraScript); + PreventDefaultAction(); - void HandlePeriodic(AuraEffect const* /*aurEff*/) + if (Unit* caster = GetCaster()) { - PreventDefaultAction(); + std::list PlayerList; + PlayerList.clear(); - if (Unit* caster = GetCaster()) - { - std::list PlayerList; - PlayerList.clear(); + Map::PlayerList const& players = caster->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + if (Player* player = itr->GetSource()->ToPlayer()) + if (player->IsWithinDist(caster, 40.0f) && player->IsAlive()) // SPELL_SHADOW_SICKLE_H & SPELL_SHADOW_SICKLE range is 40 yards + PlayerList.push_back(player); - Map::PlayerList const &players = caster->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) - if (Player* player = itr->GetSource()->ToPlayer()) - if (player->IsWithinDist(caster, 40.0f) && player->IsAlive()) // SPELL_SHADOW_SICKLE_H & SPELL_SHADOW_SICKLE range is 40 yards - PlayerList.push_back(player); + if (!PlayerList.empty()) + caster->CastSpell(acore::Containers::SelectRandomContainerElement(PlayerList), caster->GetMap()->IsHeroic() ? SPELL_SHADOW_SICKLE_H : SPELL_SHADOW_SICKLE, true); - if (!PlayerList.empty()) - caster->CastSpell(acore::Containers::SelectRandomContainerElement(PlayerList), caster->GetMap()->IsHeroic() ? SPELL_SHADOW_SICKLE_H : SPELL_SHADOW_SICKLE, true); - - } } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_shadow_sickle_periodic_damage_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_shadow_sickle_periodic_damage_AuraScript(); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_shadow_sickle_periodic_damage_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_shadow_sickle_periodic_damage_AuraScript(); + } }; void AddSC_instance_ahnkahet() { - new instance_ahnkahet; - new spell_shadow_sickle_periodic_damage(); + new instance_ahnkahet; + new spell_shadow_sickle_periodic_damage(); } diff --git a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp index 047e4a993..15994e202 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp @@ -73,7 +73,7 @@ enum Spells SPELL_SARTHARION_PYROBUFFET = 56916, SPELL_SARTHARION_BERSERK = 61632, SPELL_SARTHARION_TWILIGHT_REVENGE = 60639, - + // Sartharion with drakes SPELL_WILL_OF_SARTHARION = 61254, SPELL_POWER_OF_TENEBRON = 61248, @@ -141,7 +141,7 @@ enum Events EVENT_SARTHARION_LAVA_STRIKE = 16, EVENT_SARTHARION_HEALTH_CHECK = 17, EVENT_SARTHARION_BERSERK = 18, - + // Drake abilities called by sartharion EVENT_SARTHARION_CALL_TENEBRON = 30, EVENT_SARTHARION_CALL_SHADRON = 31, @@ -150,7 +150,7 @@ enum Events EVENT_SARTHARION_BOUNDARY = 33 }; -const Position portalPos[4] = +const Position portalPos[4] = { {3247.29f, 529.804f, 58.9595f, 0.0f}, {3248.62f, 646.739f, 85.2939f, 0.0f}, @@ -158,14 +158,14 @@ const Position portalPos[4] = {3351.78f, 517.138f, 99.1620f, 0.0f}, }; -const Position EggsPos[12] = +const Position EggsPos[12] = { // Tenebron {3253.09f, 657.439f, 86.9921f, 3.16334f}, {3247.76f, 662.413f, 87.7281f, 4.12938f}, {3246.01f, 656.606f, 86.8737f, 4.12938f}, {3246.7f, 649.558f, 85.8179f, 4.12938f}, - {3238.72f, 650.386f, 85.9625f, 0.897469f}, + {3238.72f, 650.386f, 85.9625f, 0.897469f}, {3257.89f, 651.323f, 85.9177f, 0.897469f}, // Sartharion {3237.24f, 524.20f, 58.95f, 0.0f}, @@ -216,7 +216,7 @@ public: me->SummonCreature(NPC_FIRE_CYCLONE, 3281.57f, 507.984f, 57.0833f, 5.54346f); me->SummonCreature(NPC_FIRE_CYCLONE, 3210.11f, 531.957f, 57.0833f, 3.76777f); me->SummonCreature(NPC_FIRE_CYCLONE, 3286.42f, 585.010f, 57.0833f, 4.10307f); - + me->SummonCreature(NPC_SAFE_AREA_TRIGGER, 3244.14f, 512.597f, 58.6534f, 0.0f); me->SummonCreature(NPC_SAFE_AREA_TRIGGER, 3242.84f, 553.979f, 58.8272f, 0.0f); } @@ -229,16 +229,16 @@ public: events.ScheduleEvent(EVENT_SARTHARION_FINISH_LAVA, 9000); // Send wave from left - if (urand(0,1)) + if (urand(0, 1)) { for (uint8 i = 0; i < 3; ++i) - me->SummonCreature(NPC_FLAME_TSUNAMI, 3208.44f, 580.0f-(i*50.0f), 55.8f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 12000); + me->SummonCreature(NPC_FLAME_TSUNAMI, 3208.44f, 580.0f - (i * 50.0f), 55.8f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 12000); } // from right else { for (uint8 i = 0; i < 2; ++i) - me->SummonCreature(NPC_FLAME_TSUNAMI, 3283.44f, 555.0f-(i*50.0f), 55.8f, 3.14f, TEMPSUMMON_TIMED_DESPAWN, 12000); + me->SummonCreature(NPC_FLAME_TSUNAMI, 3283.44f, 555.0f - (i * 50.0f), 55.8f, 3.14f, TEMPSUMMON_TIMED_DESPAWN, 12000); } } @@ -264,7 +264,7 @@ public: { Unit* cr = nullptr; for (uint8 i = 0; i < 3; ++i) - if ((cr = ObjectAccessor::GetUnit(*me, pInstance->GetData64(DATA_TENEBRON+i)))) + if ((cr = ObjectAccessor::GetUnit(*me, pInstance->GetData64(DATA_TENEBRON + i)))) { if (!cr->IsAlive()) continue; @@ -275,7 +275,7 @@ public: me->AddLootMode(1 << dragonsCount); cr->SetHealth(cr->GetMaxHealth()); - switch(DATA_TENEBRON+i) + switch(DATA_TENEBRON + i) { case DATA_TENEBRON: cr->CastSpell(cr, SPELL_POWER_OF_TENEBRON, true); @@ -431,9 +431,9 @@ public: EnterEvadeMode(); events.RepeatEvent(1000); - break; + break; case EVENT_SARTHARION_SUMMON_LAVA: - if (!urand(0,3)) + if (!urand(0, 3)) Talk(SAY_SARTHARION_SPECIAL); SummonLavaWaves(); @@ -479,29 +479,29 @@ void boss_sartharion::boss_sartharionAI::HandleSartharionAbilities() break; case EVENT_SARTHARION_LAVA_STRIKE: { - if (!urand(0,2)) - Talk(SAY_SARTHARION_SPECIAL_4); + if (!urand(0, 2)) + Talk(SAY_SARTHARION_SPECIAL_4); - Creature* cr = nullptr; - summons.RemoveNotExisting(); - uint8 rand = urand(0,4); // 5 - numer of cyclones - uint8 iter = 0; - for (SummonList::iterator i = summons.begin(); i != summons.end(); ++i) - { - if ((cr = ObjectAccessor::GetCreature(*me, *i))) - if (cr->GetEntry() == NPC_FIRE_CYCLONE) - { - if (iter == rand) + Creature* cr = nullptr; + summons.RemoveNotExisting(); + uint8 rand = urand(0, 4); // 5 - numer of cyclones + uint8 iter = 0; + for (SummonList::iterator i = summons.begin(); i != summons.end(); ++i) + { + if ((cr = ObjectAccessor::GetCreature(*me, *i))) + if (cr->GetEntry() == NPC_FIRE_CYCLONE) { - cr->CastSpell(cr, SPELL_CYCLONE_AURA_PERIODIC, true); - break; + if (iter == rand) + { + cr->CastSpell(cr, SPELL_CYCLONE_AURA_PERIODIC, true); + break; + } + ++iter; } - ++iter; - } - } + } - events.RepeatEvent(20000); - break; + events.RepeatEvent(20000); + break; } case EVENT_SARTHARION_HEALTH_CHECK: if (dragonsCount && !usedBerserk && me->HealthBelowPct(36)) @@ -633,7 +633,7 @@ public: { summons2.DespawnAll(); ClearInstance(); - + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC); me->SetDisableGravity(false); me->SetSpeed(MOVE_FLIGHT, 1.0f); @@ -695,7 +695,7 @@ public: void JustKilled(Unit* victim) { - if (victim->GetTypeId() != TYPEID_PLAYER || urand(0,2)) + if (victim->GetTypeId() != TYPEID_PLAYER || urand(0, 2)) return; Talk(SAY_TENEBRON_SLAY); @@ -721,7 +721,7 @@ public: Talk(SAY_TENEBRON_RESPOND); me->SetCanFly(true); me->SetSpeed(MOVE_FLIGHT, 3.0f); - me->GetMotionMaster()->MovePath(me->GetEntry()*10, false); + me->GetMotionMaster()->MovePath(me->GetEntry() * 10, false); timer = 0; } } @@ -736,7 +736,7 @@ public: switch (events.GetEvent()) { case EVENT_MINIBOSS_SHADOW_BREATH: - if (!urand(0,10)) + if (!urand(0, 10)) Talk(SAY_TENEBRON_BREATH); me->CastSpell(me->GetVictim(), SPELL_SHADOW_BREATH, false); events.RepeatEvent(17500); @@ -749,7 +749,7 @@ public: case EVENT_MINIBOSS_OPEN_PORTAL: Talk(WHISPER_OPEN_PORTAL); Talk(SAY_TENEBRON_SPECIAL); - + if (!isSartharion) { if (GameObject* Portal = me->GetVictim()->SummonGameObject(GO_TWILIGHT_PORTAL, portalPos[BOSS_TENEBRON_EVENT].GetPositionX(), portalPos[BOSS_TENEBRON_EVENT].GetPositionY(), portalPos[BOSS_TENEBRON_EVENT].GetPositionZ(), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0)) @@ -758,61 +758,61 @@ public: else if (pInstance) pInstance->SetData(DATA_ADD_PORTAL, 0); - + events.ScheduleEvent(EVENT_MINIBOSS_SPAWN_HELPERS, 2000); events.RepeatEvent(60000); break; case EVENT_MINIBOSS_SPAWN_HELPERS: - { - Talk(WHISPER_HATCH_EGGS); - Creature* cr = nullptr; - for (uint8 i = 0; i < 6; ++i) { - if ((cr = me->SummonCreature(NPC_TWILIGHT_EGG, EggsPos[isSartharion ? i+6 : i].GetPositionX(), EggsPos[isSartharion ? i+6 : i].GetPositionY(), EggsPos[isSartharion ? i+6 : i].GetPositionZ(), EggsPos[isSartharion ? i+6 : i].GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000))) + Talk(WHISPER_HATCH_EGGS); + Creature* cr = nullptr; + for (uint8 i = 0; i < 6; ++i) { - summons.Summon(cr); - cr->SetPhaseMask(16, true); + if ((cr = me->SummonCreature(NPC_TWILIGHT_EGG, EggsPos[isSartharion ? i + 6 : i].GetPositionX(), EggsPos[isSartharion ? i + 6 : i].GetPositionY(), EggsPos[isSartharion ? i + 6 : i].GetPositionZ(), EggsPos[isSartharion ? i + 6 : i].GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000))) + { + summons.Summon(cr); + cr->SetPhaseMask(16, true); + } } - } - events.ScheduleEvent(EVENT_MINIBOSS_HATCH_EGGS, 25000); - events.PopEvent(); - break; - } + events.ScheduleEvent(EVENT_MINIBOSS_HATCH_EGGS, 25000); + events.PopEvent(); + break; + } case EVENT_MINIBOSS_HATCH_EGGS: - { - Creature* cr = nullptr; - summons.RemoveNotExisting(); - summons.DespawnEntry(NPC_TWILIGHT_WHELP); - for (SummonList::iterator i = summons.begin(); i != summons.end(); ++i) { - if ((cr = ObjectAccessor::GetCreature(*me, *i))) + Creature* cr = nullptr; + summons.RemoveNotExisting(); + summons.DespawnEntry(NPC_TWILIGHT_WHELP); + for (SummonList::iterator i = summons.begin(); i != summons.end(); ++i) { - if (!cr->IsAlive()) - continue; + if ((cr = ObjectAccessor::GetCreature(*me, *i))) + { + if (!cr->IsAlive()) + continue; - if (cr->GetEntry() == NPC_TWILIGHT_EGG) - if ((cr = me->SummonCreature(NPC_TWILIGHT_WHELP, cr->GetPositionX(), cr->GetPositionY(), cr->GetPositionZ(), cr->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000))) - summons2.Summon(cr); + if (cr->GetEntry() == NPC_TWILIGHT_EGG) + if ((cr = me->SummonCreature(NPC_TWILIGHT_WHELP, cr->GetPositionX(), cr->GetPositionY(), cr->GetPositionZ(), cr->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000))) + summons2.Summon(cr); + } } + + if (!isSartharion) + { + // Remove phase shift + if (InstanceScript* instance = me->GetInstanceScript()) + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_TWILIGHT_SHIFT); + + RemoveTwilightPortal(); + } + else if (pInstance) + pInstance->SetData(DATA_CLEAR_PORTAL, 0); + + EntryCheckPredicate pred(NPC_TWILIGHT_EGG); + summons.DoAction(ACTION_SWITCH_PHASE, pred); + events.PopEvent(); + break; } - - if (!isSartharion) - { - // Remove phase shift - if (InstanceScript* instance = me->GetInstanceScript()) - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_TWILIGHT_SHIFT); - - RemoveTwilightPortal(); - } - else if (pInstance) - pInstance->SetData(DATA_CLEAR_PORTAL, 0); - - EntryCheckPredicate pred(NPC_TWILIGHT_EGG); - summons.DoAction(ACTION_SWITCH_PHASE, pred); - events.PopEvent(); - break; - } } DoMeleeAttackIfReady(); @@ -918,7 +918,7 @@ public: events.ScheduleEvent(EVENT_MINIBOSS_SHADOW_FISSURE, 20000); events.ScheduleEvent(EVENT_MINIBOSS_SHADOW_BREATH, 10000); events.ScheduleEvent(EVENT_MINIBOSS_OPEN_PORTAL, 15000); - + if (pInstance && !isSartharion) pInstance->SetData(BOSS_SHADRON_EVENT, IN_PROGRESS); @@ -949,13 +949,13 @@ public: void JustKilled(Unit* victim) { - if (victim->GetTypeId() != TYPEID_PLAYER || urand(0,2)) + if (victim->GetTypeId() != TYPEID_PLAYER || urand(0, 2)) return; Talk(SAY_SHADRON_SLAY); } - void SummonedCreatureDies(Creature * /*summon*/, Unit*) + void SummonedCreatureDies(Creature* /*summon*/, Unit*) { if (isSartharion && pInstance) { @@ -993,7 +993,7 @@ public: Talk(SAY_SHADRON_RESPOND); me->SetCanFly(true); me->SetSpeed(MOVE_FLIGHT, 3.0f); - me->GetMotionMaster()->MovePath(me->GetEntry()*10, false); + me->GetMotionMaster()->MovePath(me->GetEntry() * 10, false); timer = 0; } } @@ -1008,7 +1008,7 @@ public: switch (events.GetEvent()) { case EVENT_MINIBOSS_SHADOW_BREATH: - if (!urand(0,10)) + if (!urand(0, 10)) Talk(SAY_SHADRON_BREATH); me->CastSpell(me->GetVictim(), SPELL_SHADOW_BREATH, false); events.RepeatEvent(17500); @@ -1028,7 +1028,7 @@ public: } else if (pInstance) pInstance->SetData(DATA_ADD_PORTAL, 0); - + events.ScheduleEvent(EVENT_MINIBOSS_SPAWN_HELPERS, 2000); events.PopEvent(); break; @@ -1183,13 +1183,13 @@ public: void JustKilled(Unit* victim) { - if (victim->GetTypeId() != TYPEID_PLAYER || urand(0,2)) + if (victim->GetTypeId() != TYPEID_PLAYER || urand(0, 2)) return; Talk(SAY_VESPERON_SLAY); } - void SummonedCreatureDies(Creature * /*summon*/, Unit*) + void SummonedCreatureDies(Creature* /*summon*/, Unit*) { if (!isSartharion) ClearInstance(); @@ -1222,7 +1222,7 @@ public: Talk(SAY_VESPERON_RESPOND); me->SetCanFly(true); me->SetSpeed(MOVE_FLIGHT, 3.0f); - me->GetMotionMaster()->MovePath(me->GetEntry()*10, false); + me->GetMotionMaster()->MovePath(me->GetEntry() * 10, false); timer = 0; } return; @@ -1238,7 +1238,7 @@ public: switch (events.GetEvent()) { case EVENT_MINIBOSS_SHADOW_BREATH: - if (!urand(0,10)) + if (!urand(0, 10)) Talk(SAY_SHADRON_BREATH); me->CastSpell(me->GetVictim(), SPELL_SHADOW_BREATH, false); events.RepeatEvent(17500); @@ -1258,7 +1258,7 @@ public: } else if (pInstance) pInstance->SetData(DATA_ADD_PORTAL, 0); - + events.ScheduleEvent(EVENT_MINIBOSS_SPAWN_HELPERS, 2000); events.PopEvent(); break; @@ -1310,7 +1310,7 @@ public: void DoAction(int32 param) { if (param == ACTION_SWITCH_PHASE) - { + { me->DespawnOrUnsummon(1); } } @@ -1338,7 +1338,7 @@ public: class spell_sartharion_lava_strike : public SpellScriptLoader { - public: +public: spell_sartharion_lava_strike() : SpellScriptLoader("spell_sartharion_lava_strike") {} class spell_sartharion_lava_strike_SpellScript : public SpellScript diff --git a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/instance_obsidian_sanctum.cpp b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/instance_obsidian_sanctum.cpp index ba12bfc02..97fdf3ada 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/instance_obsidian_sanctum.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/instance_obsidian_sanctum.cpp @@ -149,7 +149,7 @@ public: if (cr->AI()->GetData(DATA_ACHIEVEMENT_DRAGONS_COUNT) >= 3) return true; break; - + } return false; } @@ -206,7 +206,7 @@ public: OUT_SAVE_INST_DATA_COMPLETE; return saveStream.str(); } - + void Load(const char* strIn) { if (!strIn) 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 3ec8c2ae9..1cac78e9d 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 @@ -71,398 +71,398 @@ enum Actions class DelayedTalk : public BasicEvent { - public: - DelayedTalk(Creature* owner, uint32 talkId) : _owner(owner), _talkId(talkId) { } +public: + DelayedTalk(Creature* owner, uint32 talkId) : _owner(owner), _talkId(talkId) { } - bool Execute(uint64 /*execTime*/, uint32 /*diff*/) - { - _owner->AI()->Talk(_talkId); - return true; - } + bool Execute(uint64 /*execTime*/, uint32 /*diff*/) + { + _owner->AI()->Talk(_talkId); + return true; + } - private: - Creature* _owner; - uint32 _talkId; +private: + Creature* _owner; + uint32 _talkId; }; class RestoreFight : public BasicEvent { - public: - RestoreFight(Creature* owner) : _owner(owner) { } +public: + RestoreFight(Creature* owner) : _owner(owner) { } - bool Execute(uint64 /*execTime*/, uint32 /*diff*/) - { - _owner->SetReactState(REACT_AGGRESSIVE); - _owner->SetInCombatWithZone(); - return true; - } + bool Execute(uint64 /*execTime*/, uint32 /*diff*/) + { + _owner->SetReactState(REACT_AGGRESSIVE); + _owner->SetInCombatWithZone(); + return true; + } - private: - Creature* _owner; +private: + Creature* _owner; }; class boss_baltharus_the_warborn : public CreatureScript { - public: - boss_baltharus_the_warborn() : CreatureScript("boss_baltharus_the_warborn") { } +public: + boss_baltharus_the_warborn() : CreatureScript("boss_baltharus_the_warborn") { } - struct boss_baltharus_the_warbornAI : public BossAI + struct boss_baltharus_the_warbornAI : public BossAI + { + boss_baltharus_the_warbornAI(Creature* creature) : BossAI(creature, DATA_BALTHARUS_THE_WARBORN) { - boss_baltharus_the_warbornAI(Creature* creature) : BossAI(creature, DATA_BALTHARUS_THE_WARBORN) - { - _introDone = false; - } - - void Reset() - { - BossAI::Reset(); - } - - void InitializeAI() - { - BossAI::InitializeAI(); - me->CastSpell(me, SPELL_BARRIER_CHANNEL, false); - } - - void JustReachedHome() - { - BossAI::JustReachedHome(); - me->CastSpell(me, SPELL_BARRIER_CHANNEL, false); - } - - void DoAction(int32 action) - { - if (action == ACTION_INTRO_BALTHARUS && !_introDone) - { - _introDone = true; - me->m_Events.AddEvent(new DelayedTalk(me, SAY_BALTHARUS_INTRO), me->m_Events.CalculateTime(6000)); - } - else if (action == ACTION_CLONE) - { - me->CastSpell(me, SPELL_REPELLING_WAVE, false); - me->CastSpell(me, SPELL_CLEAR_DEBUFFS, false); - events.ScheduleEvent(EVENT_SUMMON_CLONE, 1000); - } - } - - void EnterCombat(Unit* who) - { - Talk(SAY_AGGRO); - BossAI::EnterCombat(who); - me->InterruptNonMeleeSpells(false); - - events.ScheduleEvent(EVENT_CLEAVE, 11000); - events.ScheduleEvent(EVENT_ENERVATING_BRAND, 13000); - events.ScheduleEvent(EVENT_BLADE_TEMPEST, 15000); - if (!Is25ManRaid()) - events.ScheduleEvent(EVENT_CHECK_HEALTH1, 1000); - else - { - events.ScheduleEvent(EVENT_CHECK_HEALTH2, 1000); - events.ScheduleEvent(EVENT_CHECK_HEALTH3, 1000); - } - } - - void JustDied(Unit* killer) - { - Talk(SAY_DEATH); - BossAI::JustDied(killer); - - if (Creature* xerestrasza = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_XERESTRASZA))) - xerestrasza->AI()->DoAction(ACTION_BALTHARUS_DEATH); - } - - void KilledUnit(Unit* /*victim*/) - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(SAY_KILL); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); - } - } - - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - summon->SetHealth(me->GetHealth()); - summon->CastSpell(summon, SPELL_SPAWN_EFFECT, true); - summon->SetReactState(REACT_PASSIVE); - summon->m_Events.AddEvent(new RestoreFight(summon), summon->m_Events.CalculateTime(2000)); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_CLEAVE: - me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false); - events.ScheduleEvent(EVENT_CLEAVE, 24000); - break; - case EVENT_BLADE_TEMPEST: - me->CastSpell(me, SPELL_BLADE_TEMPEST, false); - events.ScheduleEvent(EVENT_BLADE_TEMPEST, 24000); - break; - case EVENT_ENERVATING_BRAND: - for (uint8 i = 0; i < RAID_MODE(2, 4, 2, 4); i++) - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45.0f, true, -SPELL_ENERVATING_BRAND)) - me->CastSpell(target, SPELL_ENERVATING_BRAND, true); - events.ScheduleEvent(EVENT_ENERVATING_BRAND, 26000); - break; - case EVENT_CHECK_HEALTH1: - if (me->HealthBelowPct(50)) - { - DoAction(ACTION_CLONE); - break; - } - events.ScheduleEvent(EVENT_CHECK_HEALTH1, 1000); - break; - case EVENT_CHECK_HEALTH2: - if (me->HealthBelowPct(66)) - { - DoAction(ACTION_CLONE); - break; - } - events.ScheduleEvent(EVENT_CHECK_HEALTH2, 1000); - break; - case EVENT_CHECK_HEALTH3: - if (me->HealthBelowPct(33)) - { - DoAction(ACTION_CLONE); - break; - } - events.ScheduleEvent(EVENT_CHECK_HEALTH3, 1000); - break; - case EVENT_SUMMON_CLONE: - me->CastSpell(me, SPELL_CLONE, false); - Talk(SAY_CLONE); - break; - } - - DoMeleeAttackIfReady(); - } - - private: - bool _introDone; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + _introDone = false; } + + void Reset() + { + BossAI::Reset(); + } + + void InitializeAI() + { + BossAI::InitializeAI(); + me->CastSpell(me, SPELL_BARRIER_CHANNEL, false); + } + + void JustReachedHome() + { + BossAI::JustReachedHome(); + me->CastSpell(me, SPELL_BARRIER_CHANNEL, false); + } + + void DoAction(int32 action) + { + if (action == ACTION_INTRO_BALTHARUS && !_introDone) + { + _introDone = true; + me->m_Events.AddEvent(new DelayedTalk(me, SAY_BALTHARUS_INTRO), me->m_Events.CalculateTime(6000)); + } + else if (action == ACTION_CLONE) + { + me->CastSpell(me, SPELL_REPELLING_WAVE, false); + me->CastSpell(me, SPELL_CLEAR_DEBUFFS, false); + events.ScheduleEvent(EVENT_SUMMON_CLONE, 1000); + } + } + + void EnterCombat(Unit* who) + { + Talk(SAY_AGGRO); + BossAI::EnterCombat(who); + me->InterruptNonMeleeSpells(false); + + events.ScheduleEvent(EVENT_CLEAVE, 11000); + events.ScheduleEvent(EVENT_ENERVATING_BRAND, 13000); + events.ScheduleEvent(EVENT_BLADE_TEMPEST, 15000); + if (!Is25ManRaid()) + events.ScheduleEvent(EVENT_CHECK_HEALTH1, 1000); + else + { + events.ScheduleEvent(EVENT_CHECK_HEALTH2, 1000); + events.ScheduleEvent(EVENT_CHECK_HEALTH3, 1000); + } + } + + void JustDied(Unit* killer) + { + Talk(SAY_DEATH); + BossAI::JustDied(killer); + + if (Creature* xerestrasza = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_XERESTRASZA))) + xerestrasza->AI()->DoAction(ACTION_BALTHARUS_DEATH); + } + + void KilledUnit(Unit* /*victim*/) + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + { + Talk(SAY_KILL); + events.ScheduleEvent(EVENT_KILL_TALK, 6000); + } + } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + summon->SetHealth(me->GetHealth()); + summon->CastSpell(summon, SPELL_SPAWN_EFFECT, true); + summon->SetReactState(REACT_PASSIVE); + summon->m_Events.AddEvent(new RestoreFight(summon), summon->m_Events.CalculateTime(2000)); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_CLEAVE: + me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false); + events.ScheduleEvent(EVENT_CLEAVE, 24000); + break; + case EVENT_BLADE_TEMPEST: + me->CastSpell(me, SPELL_BLADE_TEMPEST, false); + events.ScheduleEvent(EVENT_BLADE_TEMPEST, 24000); + break; + case EVENT_ENERVATING_BRAND: + for (uint8 i = 0; i < RAID_MODE(2, 4, 2, 4); i++) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45.0f, true, -SPELL_ENERVATING_BRAND)) + me->CastSpell(target, SPELL_ENERVATING_BRAND, true); + events.ScheduleEvent(EVENT_ENERVATING_BRAND, 26000); + break; + case EVENT_CHECK_HEALTH1: + if (me->HealthBelowPct(50)) + { + DoAction(ACTION_CLONE); + break; + } + events.ScheduleEvent(EVENT_CHECK_HEALTH1, 1000); + break; + case EVENT_CHECK_HEALTH2: + if (me->HealthBelowPct(66)) + { + DoAction(ACTION_CLONE); + break; + } + events.ScheduleEvent(EVENT_CHECK_HEALTH2, 1000); + break; + case EVENT_CHECK_HEALTH3: + if (me->HealthBelowPct(33)) + { + DoAction(ACTION_CLONE); + break; + } + events.ScheduleEvent(EVENT_CHECK_HEALTH3, 1000); + break; + case EVENT_SUMMON_CLONE: + me->CastSpell(me, SPELL_CLONE, false); + Talk(SAY_CLONE); + break; + } + + DoMeleeAttackIfReady(); + } + + private: + bool _introDone; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class npc_baltharus_the_warborn_clone : public CreatureScript { - public: - npc_baltharus_the_warborn_clone() : CreatureScript("npc_baltharus_the_warborn_clone") { } +public: + npc_baltharus_the_warborn_clone() : CreatureScript("npc_baltharus_the_warborn_clone") { } - struct npc_baltharus_the_warborn_cloneAI : public ScriptedAI + struct npc_baltharus_the_warborn_cloneAI : public ScriptedAI + { + npc_baltharus_the_warborn_cloneAI(Creature* creature) : ScriptedAI(creature) { - npc_baltharus_the_warborn_cloneAI(Creature* creature) : ScriptedAI(creature) - { - } - - void EnterCombat(Unit* /*who*/) - { - _events.Reset(); - _events.ScheduleEvent(EVENT_CLEAVE, urand(5000, 10000)); - _events.ScheduleEvent(EVENT_BLADE_TEMPEST, urand(18000, 25000)); - _events.ScheduleEvent(EVENT_ENERVATING_BRAND, urand(10000, 15000)); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - _events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (_events.ExecuteEvent()) - { - case EVENT_CLEAVE: - me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false); - _events.ScheduleEvent(EVENT_CLEAVE, 24000); - break; - case EVENT_BLADE_TEMPEST: - me->CastSpell(me, SPELL_BLADE_TEMPEST, false); - _events.ScheduleEvent(EVENT_BLADE_TEMPEST, 24000); - break; - case EVENT_ENERVATING_BRAND: - for (uint8 i = 0; i < RAID_MODE(4, 10, 4, 10); i++) - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45.0f, true, -SPELL_ENERVATING_BRAND)) - me->CastSpell(target, SPELL_ENERVATING_BRAND, true); - _events.ScheduleEvent(EVENT_ENERVATING_BRAND, 26000); - break; - } - - DoMeleeAttackIfReady(); - } - - private: - EventMap _events; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); } + + void EnterCombat(Unit* /*who*/) + { + _events.Reset(); + _events.ScheduleEvent(EVENT_CLEAVE, urand(5000, 10000)); + _events.ScheduleEvent(EVENT_BLADE_TEMPEST, urand(18000, 25000)); + _events.ScheduleEvent(EVENT_ENERVATING_BRAND, urand(10000, 15000)); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + _events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (_events.ExecuteEvent()) + { + case EVENT_CLEAVE: + me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false); + _events.ScheduleEvent(EVENT_CLEAVE, 24000); + break; + case EVENT_BLADE_TEMPEST: + me->CastSpell(me, SPELL_BLADE_TEMPEST, false); + _events.ScheduleEvent(EVENT_BLADE_TEMPEST, 24000); + break; + case EVENT_ENERVATING_BRAND: + for (uint8 i = 0; i < RAID_MODE(4, 10, 4, 10); i++) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45.0f, true, -SPELL_ENERVATING_BRAND)) + me->CastSpell(target, SPELL_ENERVATING_BRAND, true); + _events.ScheduleEvent(EVENT_ENERVATING_BRAND, 26000); + break; + } + + DoMeleeAttackIfReady(); + } + + private: + EventMap _events; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class spell_baltharus_enervating_brand_trigger : public SpellScriptLoader { - public: - spell_baltharus_enervating_brand_trigger() : SpellScriptLoader("spell_baltharus_enervating_brand_trigger") { } +public: + spell_baltharus_enervating_brand_trigger() : SpellScriptLoader("spell_baltharus_enervating_brand_trigger") { } - class spell_baltharus_enervating_brand_trigger_SpellScript : public SpellScript + class spell_baltharus_enervating_brand_trigger_SpellScript : public SpellScript + { + PrepareSpellScript(spell_baltharus_enervating_brand_trigger_SpellScript); + + void CheckDistance() { - PrepareSpellScript(spell_baltharus_enervating_brand_trigger_SpellScript); - - void CheckDistance() - { - if (Unit* caster = GetOriginalCaster()) - if (Unit* target = GetHitUnit()) - if (target == GetCaster() + if (Unit* caster = GetOriginalCaster()) + if (Unit* target = GetHitUnit()) + if (target == GetCaster() // the spell has an unlimited range, so we need this check && target->GetDistance2d(caster) <= 12.0f) - target->CastSpell(caster, SPELL_SIPHONED_MIGHT, true); - } - - void Register() - { - OnHit += SpellHitFn(spell_baltharus_enervating_brand_trigger_SpellScript::CheckDistance); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_baltharus_enervating_brand_trigger_SpellScript(); + target->CastSpell(caster, SPELL_SIPHONED_MIGHT, true); } + + void Register() + { + OnHit += SpellHitFn(spell_baltharus_enervating_brand_trigger_SpellScript::CheckDistance); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_baltharus_enervating_brand_trigger_SpellScript(); + } }; class npc_xerestrasza : public CreatureScript { - public: - npc_xerestrasza() : CreatureScript("npc_xerestrasza") { } +public: + npc_xerestrasza() : CreatureScript("npc_xerestrasza") { } - struct npc_xerestraszaAI : public ScriptedAI + struct npc_xerestraszaAI : public ScriptedAI + { + npc_xerestraszaAI(Creature* creature) : ScriptedAI(creature) { - npc_xerestraszaAI(Creature* creature) : ScriptedAI(creature) - { - _isIntro = true; - _introDone = false; - } - - void Reset() - { - _events.Reset(); - me->RemoveFlag(UNIT_NPC_FLAGS, GOSSIP_OPTION_QUESTGIVER); - - // Xinef: after soft reset npc is no longer present - if (me->GetInstanceScript()->GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE) - me->DespawnOrUnsummon(1); - } - - void DoAction(int32 action) - { - if (action == ACTION_BALTHARUS_DEATH) - { - me->setActive(true); - _isIntro = false; - - _events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_0, 6000); - _events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_1, 22000); - _events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_2, 31000); - _events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_3, 38000); - _events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_4, 48000); - _events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_5, 57000); - _events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_6, 67000); - _events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_7, 75000); - } - else if (action == ACTION_INTRO_BALTHARUS && !_introDone && me->IsAlive()) - { - _introDone = true; - Talk(SAY_XERESTRASZA_INTRO); - } - } - - void UpdateAI(uint32 diff) - { - if (_isIntro) - return; - - _events.Update(diff); - switch (_events.ExecuteEvent()) - { - case EVENT_XERESTRASZA_EVENT_0: - Talk(SAY_XERESTRASZA_EVENT); - me->SetWalk(true); - me->GetMotionMaster()->MovePoint(0, 3151.236f, 379.8733f, 86.31996f); - break; - case EVENT_XERESTRASZA_EVENT_1: - Talk(SAY_XERESTRASZA_EVENT_1); - break; - case EVENT_XERESTRASZA_EVENT_2: - Talk(SAY_XERESTRASZA_EVENT_2); - break; - case EVENT_XERESTRASZA_EVENT_3: - Talk(SAY_XERESTRASZA_EVENT_3); - break; - case EVENT_XERESTRASZA_EVENT_4: - Talk(SAY_XERESTRASZA_EVENT_4); - break; - case EVENT_XERESTRASZA_EVENT_5: - Talk(SAY_XERESTRASZA_EVENT_5); - break; - case EVENT_XERESTRASZA_EVENT_6: - Talk(SAY_XERESTRASZA_EVENT_6); - break; - case EVENT_XERESTRASZA_EVENT_7: - me->SetFlag(UNIT_NPC_FLAGS, GOSSIP_OPTION_QUESTGIVER); - Talk(SAY_XERESTRASZA_EVENT_7); - me->setActive(false); - break; - } - } - - private: - EventMap _events; - bool _isIntro; - bool _introDone; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + _isIntro = true; + _introDone = false; } + + void Reset() + { + _events.Reset(); + me->RemoveFlag(UNIT_NPC_FLAGS, GOSSIP_OPTION_QUESTGIVER); + + // Xinef: after soft reset npc is no longer present + if (me->GetInstanceScript()->GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE) + me->DespawnOrUnsummon(1); + } + + void DoAction(int32 action) + { + if (action == ACTION_BALTHARUS_DEATH) + { + me->setActive(true); + _isIntro = false; + + _events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_0, 6000); + _events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_1, 22000); + _events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_2, 31000); + _events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_3, 38000); + _events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_4, 48000); + _events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_5, 57000); + _events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_6, 67000); + _events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_7, 75000); + } + else if (action == ACTION_INTRO_BALTHARUS && !_introDone && me->IsAlive()) + { + _introDone = true; + Talk(SAY_XERESTRASZA_INTRO); + } + } + + void UpdateAI(uint32 diff) + { + if (_isIntro) + return; + + _events.Update(diff); + switch (_events.ExecuteEvent()) + { + case EVENT_XERESTRASZA_EVENT_0: + Talk(SAY_XERESTRASZA_EVENT); + me->SetWalk(true); + me->GetMotionMaster()->MovePoint(0, 3151.236f, 379.8733f, 86.31996f); + break; + case EVENT_XERESTRASZA_EVENT_1: + Talk(SAY_XERESTRASZA_EVENT_1); + break; + case EVENT_XERESTRASZA_EVENT_2: + Talk(SAY_XERESTRASZA_EVENT_2); + break; + case EVENT_XERESTRASZA_EVENT_3: + Talk(SAY_XERESTRASZA_EVENT_3); + break; + case EVENT_XERESTRASZA_EVENT_4: + Talk(SAY_XERESTRASZA_EVENT_4); + break; + case EVENT_XERESTRASZA_EVENT_5: + Talk(SAY_XERESTRASZA_EVENT_5); + break; + case EVENT_XERESTRASZA_EVENT_6: + Talk(SAY_XERESTRASZA_EVENT_6); + break; + case EVENT_XERESTRASZA_EVENT_7: + me->SetFlag(UNIT_NPC_FLAGS, GOSSIP_OPTION_QUESTGIVER); + Talk(SAY_XERESTRASZA_EVENT_7); + me->setActive(false); + break; + } + } + + private: + EventMap _events; + bool _isIntro; + bool _introDone; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class at_baltharus_plateau : public AreaTriggerScript { - public: - at_baltharus_plateau() : AreaTriggerScript("at_baltharus_plateau") { } +public: + at_baltharus_plateau() : AreaTriggerScript("at_baltharus_plateau") { } - bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) + bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) + { + if (InstanceScript* instance = player->GetInstanceScript()) { - if (InstanceScript* instance = player->GetInstanceScript()) - { - if (Creature* xerestrasza = ObjectAccessor::GetCreature(*player, instance->GetData64(NPC_XERESTRASZA))) - xerestrasza->AI()->DoAction(ACTION_INTRO_BALTHARUS); + if (Creature* xerestrasza = ObjectAccessor::GetCreature(*player, instance->GetData64(NPC_XERESTRASZA))) + xerestrasza->AI()->DoAction(ACTION_INTRO_BALTHARUS); - if (Creature* baltharus = ObjectAccessor::GetCreature(*player, instance->GetData64(NPC_BALTHARUS_THE_WARBORN))) - baltharus->AI()->DoAction(ACTION_INTRO_BALTHARUS); - } - - return true; + if (Creature* baltharus = ObjectAccessor::GetCreature(*player, instance->GetData64(NPC_BALTHARUS_THE_WARBORN))) + baltharus->AI()->DoAction(ACTION_INTRO_BALTHARUS); } + + return true; + } }; void AddSC_boss_baltharus_the_warborn() diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp index be41b4b4b..b895c5805 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp @@ -79,204 +79,204 @@ Position const FlamecallerWaypointsW[MAX_PATH_FLAMECALLER_WAYPOINTS] = class boss_general_zarithrian : public CreatureScript { - public: - boss_general_zarithrian() : CreatureScript("boss_general_zarithrian") { } +public: + boss_general_zarithrian() : CreatureScript("boss_general_zarithrian") { } - struct boss_general_zarithrianAI : public BossAI + struct boss_general_zarithrianAI : public BossAI + { + boss_general_zarithrianAI(Creature* creature) : BossAI(creature, DATA_GENERAL_ZARITHRIAN) { - boss_general_zarithrianAI(Creature* creature) : BossAI(creature, DATA_GENERAL_ZARITHRIAN) - { - } - - void Reset() - { - BossAI::Reset(); - if (instance->GetBossState(DATA_SAVIANA_RAGEFIRE) == DONE && instance->GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE) - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NOT_SELECTABLE); - } - - void EnterCombat(Unit* who) - { - BossAI::EnterCombat(who); - Talk(SAY_AGGRO); - - events.ScheduleEvent(EVENT_CLEAVE, 9000); - events.ScheduleEvent(EVENT_INTIDMDATING_ROAR, 14000); - events.ScheduleEvent(EVENT_SUMMON_ADDS1, 18000); - if (Is25ManRaid()) - events.ScheduleEvent(EVENT_SUMMON_ADDS2, 20000); - } - - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - } - - void JustDied(Unit* killer) - { - BossAI::JustDied(killer); - Talk(SAY_DEATH); - } - - void KilledUnit(Unit* /*victim*/) - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(SAY_KILL); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); - } - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SUMMON_ADDS1: - Talk(SAY_ADDS); - if (Creature* stalker1 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ZARITHRIAN_SPAWN_STALKER_1))) - stalker1->CastSpell(stalker1, SPELL_SUMMON_FLAMECALLER, false); - if (Creature* stalker2 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ZARITHRIAN_SPAWN_STALKER_2))) - stalker2->CastSpell(stalker2, SPELL_SUMMON_FLAMECALLER, false); - events.ScheduleEvent(EVENT_SUMMON_ADDS1, 40000); - break; - case EVENT_SUMMON_ADDS2: - if (Creature* stalker1 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ZARITHRIAN_SPAWN_STALKER_1))) - stalker1->CastSpell(stalker1, SPELL_SUMMON_FLAMECALLER, false); - if (Creature* stalker2 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ZARITHRIAN_SPAWN_STALKER_2))) - stalker2->CastSpell(stalker2, SPELL_SUMMON_FLAMECALLER, false); - events.ScheduleEvent(EVENT_SUMMON_ADDS2, 40000); - break; - case EVENT_INTIDMDATING_ROAR: - me->CastSpell(me, SPELL_INTIMIDATING_ROAR, false); - events.ScheduleEvent(EVENT_INTIDMDATING_ROAR, 30000); - break; - case EVENT_CLEAVE: - me->CastSpell(me->GetVictim(), SPELL_CLEAVE_ARMOR, false); - events.ScheduleEvent(EVENT_CLEAVE, 15000); - break; - } - - DoMeleeAttackIfReady(); - EnterEvadeIfOutOfCombatArea(); - } - - bool CheckEvadeIfOutOfCombatArea() const - { - return me->GetPositionX() > 3060.0f; - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); } + + void Reset() + { + BossAI::Reset(); + if (instance->GetBossState(DATA_SAVIANA_RAGEFIRE) == DONE && instance->GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE) + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NOT_SELECTABLE); + } + + void EnterCombat(Unit* who) + { + BossAI::EnterCombat(who); + Talk(SAY_AGGRO); + + events.ScheduleEvent(EVENT_CLEAVE, 9000); + events.ScheduleEvent(EVENT_INTIDMDATING_ROAR, 14000); + events.ScheduleEvent(EVENT_SUMMON_ADDS1, 18000); + if (Is25ManRaid()) + events.ScheduleEvent(EVENT_SUMMON_ADDS2, 20000); + } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + } + + void JustDied(Unit* killer) + { + BossAI::JustDied(killer); + Talk(SAY_DEATH); + } + + void KilledUnit(Unit* /*victim*/) + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + { + Talk(SAY_KILL); + events.ScheduleEvent(EVENT_KILL_TALK, 6000); + } + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_SUMMON_ADDS1: + Talk(SAY_ADDS); + if (Creature* stalker1 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ZARITHRIAN_SPAWN_STALKER_1))) + stalker1->CastSpell(stalker1, SPELL_SUMMON_FLAMECALLER, false); + if (Creature* stalker2 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ZARITHRIAN_SPAWN_STALKER_2))) + stalker2->CastSpell(stalker2, SPELL_SUMMON_FLAMECALLER, false); + events.ScheduleEvent(EVENT_SUMMON_ADDS1, 40000); + break; + case EVENT_SUMMON_ADDS2: + if (Creature* stalker1 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ZARITHRIAN_SPAWN_STALKER_1))) + stalker1->CastSpell(stalker1, SPELL_SUMMON_FLAMECALLER, false); + if (Creature* stalker2 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ZARITHRIAN_SPAWN_STALKER_2))) + stalker2->CastSpell(stalker2, SPELL_SUMMON_FLAMECALLER, false); + events.ScheduleEvent(EVENT_SUMMON_ADDS2, 40000); + break; + case EVENT_INTIDMDATING_ROAR: + me->CastSpell(me, SPELL_INTIMIDATING_ROAR, false); + events.ScheduleEvent(EVENT_INTIDMDATING_ROAR, 30000); + break; + case EVENT_CLEAVE: + me->CastSpell(me->GetVictim(), SPELL_CLEAVE_ARMOR, false); + events.ScheduleEvent(EVENT_CLEAVE, 15000); + break; + } + + DoMeleeAttackIfReady(); + EnterEvadeIfOutOfCombatArea(); + } + + bool CheckEvadeIfOutOfCombatArea() const + { + return me->GetPositionX() > 3060.0f; + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class npc_onyx_flamecaller : public CreatureScript { - public: - npc_onyx_flamecaller() : CreatureScript("npc_onyx_flamecaller") { } +public: + npc_onyx_flamecaller() : CreatureScript("npc_onyx_flamecaller") { } - struct npc_onyx_flamecallerAI : public npc_escortAI + struct npc_onyx_flamecallerAI : public npc_escortAI + { + npc_onyx_flamecallerAI(Creature* creature) : npc_escortAI(creature), _instance(creature->GetInstanceScript()) { - npc_onyx_flamecallerAI(Creature* creature) : npc_escortAI(creature), _instance(creature->GetInstanceScript()) - { - npc_escortAI::SetDespawnAtEnd(false); - } - - void Reset() - { - _lavaGoutCount = 0; - AddWaypoints(); - Start(true, true); - } - - void EnterCombat(Unit* /*who*/) - { - _events.Reset(); - _events.ScheduleEvent(EVENT_BLAST_NOVA, urand(20000, 30000)); - _events.ScheduleEvent(EVENT_LAVA_GOUT, 5000); - } - - void EnterEvadeMode() - { - // Prevent EvadeMode - } - - void IsSummonedBy(Unit* /*summoner*/) - { - // Let Zarithrian count as summoner. _instance cant be null since we got GetRubySanctumAI - if (Creature* zarithrian = ObjectAccessor::GetCreature(*me, _instance->GetData64(NPC_GENERAL_ZARITHRIAN))) - zarithrian->AI()->JustSummoned(me); - } - - void WaypointReached(uint32 waypointId) - { - if (waypointId == MAX_PATH_FLAMECALLER_WAYPOINTS) - me->SetInCombatWithZone(); - } - - void AddWaypoints() - { - if (me->GetPositionY() < 500.0f) - { - for (uint8 i = 0; i < MAX_PATH_FLAMECALLER_WAYPOINTS; i++) - AddWaypoint(i+1, FlamecallerWaypointsE[i].GetPositionX(), FlamecallerWaypointsE[i].GetPositionY(), FlamecallerWaypointsE[i].GetPositionZ()); - } - else - { - for (uint8 i = 0; i < MAX_PATH_FLAMECALLER_WAYPOINTS; i++) - AddWaypoint(i+1, FlamecallerWaypointsW[i].GetPositionX(), FlamecallerWaypointsW[i].GetPositionY(), FlamecallerWaypointsW[i].GetPositionZ()); - } - } - - void UpdateEscortAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - _events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (_events.ExecuteEvent()) - { - case EVENT_BLAST_NOVA: - DoCastAOE(SPELL_BLAST_NOVA); - _events.ScheduleEvent(EVENT_BLAST_NOVA, urand(20000, 30000)); - break; - case EVENT_LAVA_GOUT: - if (_lavaGoutCount >= 3) - { - _lavaGoutCount = 0; - _events.ScheduleEvent(EVENT_LAVA_GOUT, 8000); - break; - } - DoCastVictim(SPELL_LAVA_GOUT); - _lavaGoutCount++; - _events.ScheduleEvent(EVENT_LAVA_GOUT, 1500); - break; - } - - DoMeleeAttackIfReady(); - } - private: - EventMap _events; - InstanceScript* _instance; - uint8 _lavaGoutCount; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + npc_escortAI::SetDespawnAtEnd(false); } + + void Reset() + { + _lavaGoutCount = 0; + AddWaypoints(); + Start(true, true); + } + + void EnterCombat(Unit* /*who*/) + { + _events.Reset(); + _events.ScheduleEvent(EVENT_BLAST_NOVA, urand(20000, 30000)); + _events.ScheduleEvent(EVENT_LAVA_GOUT, 5000); + } + + void EnterEvadeMode() + { + // Prevent EvadeMode + } + + void IsSummonedBy(Unit* /*summoner*/) + { + // Let Zarithrian count as summoner. _instance cant be null since we got GetRubySanctumAI + if (Creature* zarithrian = ObjectAccessor::GetCreature(*me, _instance->GetData64(NPC_GENERAL_ZARITHRIAN))) + zarithrian->AI()->JustSummoned(me); + } + + void WaypointReached(uint32 waypointId) + { + if (waypointId == MAX_PATH_FLAMECALLER_WAYPOINTS) + me->SetInCombatWithZone(); + } + + void AddWaypoints() + { + if (me->GetPositionY() < 500.0f) + { + for (uint8 i = 0; i < MAX_PATH_FLAMECALLER_WAYPOINTS; i++) + AddWaypoint(i + 1, FlamecallerWaypointsE[i].GetPositionX(), FlamecallerWaypointsE[i].GetPositionY(), FlamecallerWaypointsE[i].GetPositionZ()); + } + else + { + for (uint8 i = 0; i < MAX_PATH_FLAMECALLER_WAYPOINTS; i++) + AddWaypoint(i + 1, FlamecallerWaypointsW[i].GetPositionX(), FlamecallerWaypointsW[i].GetPositionY(), FlamecallerWaypointsW[i].GetPositionZ()); + } + } + + void UpdateEscortAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + _events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (_events.ExecuteEvent()) + { + case EVENT_BLAST_NOVA: + DoCastAOE(SPELL_BLAST_NOVA); + _events.ScheduleEvent(EVENT_BLAST_NOVA, urand(20000, 30000)); + break; + case EVENT_LAVA_GOUT: + if (_lavaGoutCount >= 3) + { + _lavaGoutCount = 0; + _events.ScheduleEvent(EVENT_LAVA_GOUT, 8000); + break; + } + DoCastVictim(SPELL_LAVA_GOUT); + _lavaGoutCount++; + _events.ScheduleEvent(EVENT_LAVA_GOUT, 1500); + break; + } + + DoMeleeAttackIfReady(); + } + private: + EventMap _events; + InstanceScript* _instance; + uint8 _lavaGoutCount; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; void AddSC_boss_general_zarithrian() diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp index b52ab56b4..d9432de74 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp @@ -166,1273 +166,1273 @@ uint32 const _corporealityReference[MAX_CORPOREALITY_STATE] = class SendEncounterUnit : public BasicEvent { - public: - SendEncounterUnit(Player* owner) : _owner(owner) { } +public: + SendEncounterUnit(Player* owner) : _owner(owner) { } - bool Execute(uint64 /*execTime*/, uint32 /*diff*/) + bool Execute(uint64 /*execTime*/, uint32 /*diff*/) + { + InstanceScript* instance = _owner->GetInstanceScript(); + if (!instance || _owner->GetMapId() != 724) + return true; + + if (instance->GetBossState(DATA_HALION) != IN_PROGRESS) { - InstanceScript* instance = _owner->GetInstanceScript(); - if (!instance || _owner->GetMapId() != 724) - return true; - - if (instance->GetBossState(DATA_HALION) != IN_PROGRESS) - { - _owner->RemoveAurasDueToSpell(SPELL_TWILIGHT_REALM); - return true; - } - - WorldPacket data(SMSG_UPDATE_INSTANCE_ENCOUNTER_UNIT, 4); - data << uint32(ENCOUNTER_FRAME_REFRESH_FRAMES); - _owner->GetSession()->SendPacket(&data); + _owner->RemoveAurasDueToSpell(SPELL_TWILIGHT_REALM); return true; } - private: - Player* _owner; + WorldPacket data(SMSG_UPDATE_INSTANCE_ENCOUNTER_UNIT, 4); + data << uint32(ENCOUNTER_FRAME_REFRESH_FRAMES); + _owner->GetSession()->SendPacket(&data); + return true; + } + +private: + Player* _owner; }; class boss_halion : public CreatureScript { - public: - boss_halion() : CreatureScript("boss_halion") { } +public: + boss_halion() : CreatureScript("boss_halion") { } - struct boss_halionAI : public BossAI + struct boss_halionAI : public BossAI + { + boss_halionAI(Creature* creature) : BossAI(creature, DATA_HALION) { - boss_halionAI(Creature* creature) : BossAI(creature, DATA_HALION) - { - } - - void Reset() - { - _livingEmberCount = 0; - BossAI::Reset(); - me->RemoveAurasDueToSpell(SPELL_TWILIGHT_PHASING); - me->CastSpell(me, SPELL_CLEAR_DEBUFFS, false); - - me->SetVisible(false); - me->SetReactState(REACT_PASSIVE); - _events2.Reset(); - _events2.RescheduleEvent(EVENT_HALION_VISIBILITY, 30000); - } - - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - switch (summon->GetEntry()) - { - case NPC_METEOR_STRIKE_MARK: - summon->CastSpell(summon, SPELL_METEOR_STRIKE_COUNTDOWN, false); - summon->CastSpell(summon, SPELL_BIRTH_NO_VISUAL, false); - break; - case NPC_METEOR_STRIKE_FLAME: - if (Is25ManRaid() && IsHeroic() && roll_chance_i(90) && summons.GetEntryCount(NPC_LIVING_EMBER) < _livingEmberCount + 12) - if (Creature* ember = me->SummonCreature(NPC_LIVING_EMBER, *summon, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1000)) - { - ember->SetVisible(false); - } - [[fallthrough]]; - case NPC_METEOR_STRIKE_NORTH: - case NPC_METEOR_STRIKE_SOUTH: - case NPC_METEOR_STRIKE_WEST: - case NPC_METEOR_STRIKE_EAST: - summon->CastSpell(summon, SPELL_METEOR_STRIKE_FIRE_AURA_2, true); - if (summons.GetEntryCount(NPC_METEOR_STRIKE_FLAME) <= 16) - summon->CastSpell(summon, SPELL_METEOR_STRIKE_SPREAD, true); - if (Unit* summoner = summon->ToTempSummon()->GetSummoner()) - summon->SetOrientation(summoner->GetAngle(summon)); - break; - } - } - - bool CanAIAttack(const Unit* who) const - { - return me->GetHomePosition().GetExactDist2d(who) < 52.0f; - } - - bool IsAnyPlayerValid() - { - Map::PlayerList const& playerList = me->GetMap()->GetPlayers(); - for(Map::PlayerList::const_iterator itr = playerList.begin(); itr != playerList.end(); ++itr) - if (Player* player = itr->GetSource()) - if (!player->IsGameMaster() && player->IsAlive() && me->GetHomePosition().GetExactDist2d(player) < 52.0f && me->IsWithinLOSInMap(player) && !player->HasAuraType(SPELL_AURA_MOD_INVISIBILITY) && !player->HasAuraType(SPELL_AURA_MOD_STEALTH) && !player->HasAuraType(SPELL_AURA_MOD_UNATTACKABLE)) - return true; - return false; - } - - void EnterEvadeMode() - { - if (IsAnyPlayerValid()) - return; - - BossAI::EnterEvadeMode(); - } - - void AttackStart(Unit* who) - { - me->SetReactState(REACT_AGGRESSIVE); - BossAI::AttackStart(who); - } - - void JustReachedHome() - { - instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); - if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_HALION_CONTROLLER))) - controller->AI()->DoAction(ACTION_RESET_ENCOUNTER); - BossAI::JustReachedHome(); - } - - void EnterCombat(Unit* who) - { - BossAI::EnterCombat(who); - Talk(SAY_AGGRO); - instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1); - - events.ScheduleEvent(EVENT_CLEAVE, urand(8000, 10000)); - events.ScheduleEvent(EVENT_TAIL_LASH, 10000); - events.ScheduleEvent(EVENT_BREATH, urand(10000, 15000)); - events.ScheduleEvent(EVENT_ACTIVATE_FIREWALL, 5000); - events.ScheduleEvent(EVENT_METEOR_STRIKE, urand(20000, 25000)); - events.ScheduleEvent(EVENT_FIERY_COMBUSTION, urand(15000, 18000)); - events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); - _events2.ScheduleEvent(EVENT_TRIGGER_BERSERK, 8*MINUTE*IN_MILLISECONDS); - } - - void KilledUnit(Unit* victim) - { - if (victim->GetTypeId() == TYPEID_PLAYER && events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(SAY_KILL); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); - } - } - - void JustDied(Unit* killer) - { - BossAI::JustDied(killer); - Talk(SAY_DEATH); - instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); - me->CastSpell(me, SPELL_CLEAR_DEBUFFS, false); - - if (Creature* twilightHalion = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_TWILIGHT_HALION))) - if (twilightHalion->IsAlive()) - Unit::Kill(twilightHalion, twilightHalion); - - if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_HALION_CONTROLLER))) - if (controller->IsAlive()) - Unit::Kill(controller, controller); - } - - void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType, SpellSchoolMask) - { - if (events.GetNextEventTime(EVENT_CHECK_HEALTH) != 0) - return; - - if (!attacker || !me->InSamePhase(attacker)) - return; - - if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_HALION_CONTROLLER))) - controller->AI()->SetData(DATA_MATERIAL_DAMAGE_TAKEN, damage); - } - - void UpdateAI(uint32 diff) - { - _events2.Update(diff); - switch (_events2.ExecuteEvent()) - { - case EVENT_HALION_VISIBILITY: - me->SetVisible(instance->GetBossState(DATA_HALION_INTRO_DONE) == DONE); - me->SetReactState(instance->GetBossState(DATA_HALION_INTRO_DONE) == DONE ? REACT_AGGRESSIVE : REACT_PASSIVE); - break; - case EVENT_TRIGGER_BERSERK: - me->CastSpell(me, SPELL_BERSERK, true); - if (Creature* twilightHalion = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_TWILIGHT_HALION))) - twilightHalion->CastSpell(twilightHalion, SPELL_BERSERK, true); - break; - } - - if (!UpdateVictim()) - return; - - // Xinef: halion is invisible (second phase) - if (me->GetDisplayId() != me->GetNativeDisplayId()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_CLEAVE: - me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false); - events.ScheduleEvent(EVENT_CLEAVE, urand(8000, 10000)); - break; - case EVENT_TAIL_LASH: - me->CastSpell(me, SPELL_TAIL_LASH, false); - events.ScheduleEvent(EVENT_TAIL_LASH, 10000); - break; - case EVENT_BREATH: - me->CastSpell(me->GetVictim(), SPELL_FLAME_BREATH, false); - events.ScheduleEvent(EVENT_BREATH, urand(10000, 12000)); - break; - case EVENT_ACTIVATE_FIREWALL: - instance->HandleGameObject(instance->GetData64(GO_FLAME_RING), false, nullptr); - instance->HandleGameObject(instance->GetData64(GO_TWILIGHT_FLAME_RING), false, nullptr); - break; - case EVENT_METEOR_STRIKE: - _livingEmberCount = summons.GetEntryCount(NPC_LIVING_EMBER); - me->CastCustomSpell(SPELL_METEOR_STRIKE_TARGETING, SPELLVALUE_MAX_TARGETS, 1, me, false); - Talk(SAY_METEOR_STRIKE); - events.ScheduleEvent(EVENT_METEOR_STRIKE, 40000); - break; - case EVENT_FIERY_COMBUSTION: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100.0f, true, -SPELL_TWILIGHT_REALM)) - me->CastSpell(target, SPELL_FIERY_COMBUSTION, false); - events.ScheduleEvent(EVENT_FIERY_COMBUSTION, 25000); - break; - case EVENT_CHECK_HEALTH: - if (me->HealthBelowPct(75)) - { - Talk(SAY_PHASE_TWO); - me->CastSpell(me, SPELL_TWILIGHT_PHASING, false); - events.DelayEvents(10000); - return; - } - events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); - break; - } - - DoMeleeAttackIfReady(); - } - - private: - EventMap _events2; - uint32 _livingEmberCount; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); } + + void Reset() + { + _livingEmberCount = 0; + BossAI::Reset(); + me->RemoveAurasDueToSpell(SPELL_TWILIGHT_PHASING); + me->CastSpell(me, SPELL_CLEAR_DEBUFFS, false); + + me->SetVisible(false); + me->SetReactState(REACT_PASSIVE); + _events2.Reset(); + _events2.RescheduleEvent(EVENT_HALION_VISIBILITY, 30000); + } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + switch (summon->GetEntry()) + { + case NPC_METEOR_STRIKE_MARK: + summon->CastSpell(summon, SPELL_METEOR_STRIKE_COUNTDOWN, false); + summon->CastSpell(summon, SPELL_BIRTH_NO_VISUAL, false); + break; + case NPC_METEOR_STRIKE_FLAME: + if (Is25ManRaid() && IsHeroic() && roll_chance_i(90) && summons.GetEntryCount(NPC_LIVING_EMBER) < _livingEmberCount + 12) + if (Creature* ember = me->SummonCreature(NPC_LIVING_EMBER, *summon, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1000)) + { + ember->SetVisible(false); + } + [[fallthrough]]; + case NPC_METEOR_STRIKE_NORTH: + case NPC_METEOR_STRIKE_SOUTH: + case NPC_METEOR_STRIKE_WEST: + case NPC_METEOR_STRIKE_EAST: + summon->CastSpell(summon, SPELL_METEOR_STRIKE_FIRE_AURA_2, true); + if (summons.GetEntryCount(NPC_METEOR_STRIKE_FLAME) <= 16) + summon->CastSpell(summon, SPELL_METEOR_STRIKE_SPREAD, true); + if (Unit* summoner = summon->ToTempSummon()->GetSummoner()) + summon->SetOrientation(summoner->GetAngle(summon)); + break; + } + } + + bool CanAIAttack(const Unit* who) const + { + return me->GetHomePosition().GetExactDist2d(who) < 52.0f; + } + + bool IsAnyPlayerValid() + { + Map::PlayerList const& playerList = me->GetMap()->GetPlayers(); + for(Map::PlayerList::const_iterator itr = playerList.begin(); itr != playerList.end(); ++itr) + if (Player* player = itr->GetSource()) + if (!player->IsGameMaster() && player->IsAlive() && me->GetHomePosition().GetExactDist2d(player) < 52.0f && me->IsWithinLOSInMap(player) && !player->HasAuraType(SPELL_AURA_MOD_INVISIBILITY) && !player->HasAuraType(SPELL_AURA_MOD_STEALTH) && !player->HasAuraType(SPELL_AURA_MOD_UNATTACKABLE)) + return true; + return false; + } + + void EnterEvadeMode() + { + if (IsAnyPlayerValid()) + return; + + BossAI::EnterEvadeMode(); + } + + void AttackStart(Unit* who) + { + me->SetReactState(REACT_AGGRESSIVE); + BossAI::AttackStart(who); + } + + void JustReachedHome() + { + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_HALION_CONTROLLER))) + controller->AI()->DoAction(ACTION_RESET_ENCOUNTER); + BossAI::JustReachedHome(); + } + + void EnterCombat(Unit* who) + { + BossAI::EnterCombat(who); + Talk(SAY_AGGRO); + instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1); + + events.ScheduleEvent(EVENT_CLEAVE, urand(8000, 10000)); + events.ScheduleEvent(EVENT_TAIL_LASH, 10000); + events.ScheduleEvent(EVENT_BREATH, urand(10000, 15000)); + events.ScheduleEvent(EVENT_ACTIVATE_FIREWALL, 5000); + events.ScheduleEvent(EVENT_METEOR_STRIKE, urand(20000, 25000)); + events.ScheduleEvent(EVENT_FIERY_COMBUSTION, urand(15000, 18000)); + events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); + _events2.ScheduleEvent(EVENT_TRIGGER_BERSERK, 8 * MINUTE * IN_MILLISECONDS); + } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER && events.GetNextEventTime(EVENT_KILL_TALK) == 0) + { + Talk(SAY_KILL); + events.ScheduleEvent(EVENT_KILL_TALK, 6000); + } + } + + void JustDied(Unit* killer) + { + BossAI::JustDied(killer); + Talk(SAY_DEATH); + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + me->CastSpell(me, SPELL_CLEAR_DEBUFFS, false); + + if (Creature* twilightHalion = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_TWILIGHT_HALION))) + if (twilightHalion->IsAlive()) + Unit::Kill(twilightHalion, twilightHalion); + + if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_HALION_CONTROLLER))) + if (controller->IsAlive()) + Unit::Kill(controller, controller); + } + + void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType, SpellSchoolMask) + { + if (events.GetNextEventTime(EVENT_CHECK_HEALTH) != 0) + return; + + if (!attacker || !me->InSamePhase(attacker)) + return; + + if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_HALION_CONTROLLER))) + controller->AI()->SetData(DATA_MATERIAL_DAMAGE_TAKEN, damage); + } + + void UpdateAI(uint32 diff) + { + _events2.Update(diff); + switch (_events2.ExecuteEvent()) + { + case EVENT_HALION_VISIBILITY: + me->SetVisible(instance->GetBossState(DATA_HALION_INTRO_DONE) == DONE); + me->SetReactState(instance->GetBossState(DATA_HALION_INTRO_DONE) == DONE ? REACT_AGGRESSIVE : REACT_PASSIVE); + break; + case EVENT_TRIGGER_BERSERK: + me->CastSpell(me, SPELL_BERSERK, true); + if (Creature* twilightHalion = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_TWILIGHT_HALION))) + twilightHalion->CastSpell(twilightHalion, SPELL_BERSERK, true); + break; + } + + if (!UpdateVictim()) + return; + + // Xinef: halion is invisible (second phase) + if (me->GetDisplayId() != me->GetNativeDisplayId()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_CLEAVE: + me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false); + events.ScheduleEvent(EVENT_CLEAVE, urand(8000, 10000)); + break; + case EVENT_TAIL_LASH: + me->CastSpell(me, SPELL_TAIL_LASH, false); + events.ScheduleEvent(EVENT_TAIL_LASH, 10000); + break; + case EVENT_BREATH: + me->CastSpell(me->GetVictim(), SPELL_FLAME_BREATH, false); + events.ScheduleEvent(EVENT_BREATH, urand(10000, 12000)); + break; + case EVENT_ACTIVATE_FIREWALL: + instance->HandleGameObject(instance->GetData64(GO_FLAME_RING), false, nullptr); + instance->HandleGameObject(instance->GetData64(GO_TWILIGHT_FLAME_RING), false, nullptr); + break; + case EVENT_METEOR_STRIKE: + _livingEmberCount = summons.GetEntryCount(NPC_LIVING_EMBER); + me->CastCustomSpell(SPELL_METEOR_STRIKE_TARGETING, SPELLVALUE_MAX_TARGETS, 1, me, false); + Talk(SAY_METEOR_STRIKE); + events.ScheduleEvent(EVENT_METEOR_STRIKE, 40000); + break; + case EVENT_FIERY_COMBUSTION: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100.0f, true, -SPELL_TWILIGHT_REALM)) + me->CastSpell(target, SPELL_FIERY_COMBUSTION, false); + events.ScheduleEvent(EVENT_FIERY_COMBUSTION, 25000); + break; + case EVENT_CHECK_HEALTH: + if (me->HealthBelowPct(75)) + { + Talk(SAY_PHASE_TWO); + me->CastSpell(me, SPELL_TWILIGHT_PHASING, false); + events.DelayEvents(10000); + return; + } + events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); + break; + } + + DoMeleeAttackIfReady(); + } + + private: + EventMap _events2; + uint32 _livingEmberCount; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class boss_twilight_halion : public CreatureScript { - public: - boss_twilight_halion() : CreatureScript("boss_twilight_halion") { } +public: + boss_twilight_halion() : CreatureScript("boss_twilight_halion") { } - struct boss_twilight_halionAI : public ScriptedAI + struct boss_twilight_halionAI : public ScriptedAI + { + boss_twilight_halionAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { - boss_twilight_halionAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) - { - Creature* halion = ObjectAccessor::GetCreature(*me, _instance->GetData64(NPC_HALION)); - if (!halion) - return; + Creature* halion = ObjectAccessor::GetCreature(*me, _instance->GetData64(NPC_HALION)); + if (!halion) + return; - halion->AddAura(SPELL_COPY_DAMAGE, me); - me->AddAura(SPELL_COPY_DAMAGE, halion); - me->AddAura(SPELL_DUSK_SHROUD, me); + halion->AddAura(SPELL_COPY_DAMAGE, me); + me->AddAura(SPELL_COPY_DAMAGE, halion); + me->AddAura(SPELL_DUSK_SHROUD, me); - me->SetHealth(halion->GetHealth()); - me->setActive(true); - } - - void Reset() - { - _events.Reset(); - me->SetPhaseMask(0x21, true); - me->SetInCombatWithZone(); - me->SetPhaseMask(0x20, true); - me->SetReactState(REACT_DEFENSIVE); - } - - void EnterCombat(Unit* /*who*/) - { - _events.Reset(); - _events.ScheduleEvent(EVENT_CLEAVE, urand(8000, 10000)); - _events.ScheduleEvent(EVENT_TAIL_LASH, 10000); - _events.ScheduleEvent(EVENT_BREATH, urand(10000, 15000)); - _events.ScheduleEvent(EVENT_SOUL_CONSUMPTION, 20000); - _events.ScheduleEvent(EVENT_SHADOW_PULSARS, 16000); - _events.ScheduleEvent(EVENT_SEND_ENCOUNTER_UNIT, 2000); - _events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); - - me->SetInCombatWithZone(); - } - - void EnterEvadeMode() - { - } - - void KilledUnit(Unit* victim) - { - if (victim->GetTypeId() == TYPEID_PLAYER && _events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(SAY_KILL); - _events.ScheduleEvent(EVENT_KILL_TALK, 6000); - } - } - - void JustDied(Unit* killer) - { - if (Creature* halion = ObjectAccessor::GetCreature(*me, _instance->GetData64(NPC_HALION))) - { - // Ensure looting - if (me->IsDamageEnoughForLootingAndReward()) - halion->LowerPlayerDamageReq(halion->GetMaxHealth()); - - if (halion->IsAlive()) - Unit::Kill(killer, halion); - } - - if (Creature* controller = ObjectAccessor::GetCreature(*me, _instance->GetData64(NPC_HALION_CONTROLLER))) - if (controller->IsAlive()) - Unit::Kill(controller, controller); - - _instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); - me->CastSpell(me, SPELL_CLEAR_DEBUFFS, false); - } - - void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType, SpellSchoolMask) - { - if (!attacker || !me->InSamePhase(attacker)) - return; - - if (Creature* controller = ObjectAccessor::GetCreature(*me, _instance->GetData64(NPC_HALION_CONTROLLER))) - controller->AI()->SetData(DATA_TWILIGHT_DAMAGE_TAKEN, damage); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - _events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (_events.ExecuteEvent()) - { - case EVENT_SEND_ENCOUNTER_UNIT: - _instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 2); - break; - case EVENT_CLEAVE: - me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false); - _events.ScheduleEvent(EVENT_CLEAVE, urand(8000, 10000)); - break; - case EVENT_TAIL_LASH: - me->CastSpell(me, SPELL_TAIL_LASH, false); - _events.ScheduleEvent(EVENT_TAIL_LASH, 10000); - break; - case EVENT_BREATH: - me->CastSpell(me->GetVictim(), SPELL_DARK_BREATH, false); - _events.ScheduleEvent(EVENT_BREATH, urand(10000, 12000)); - break; - case EVENT_SOUL_CONSUMPTION: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100.0f, true, SPELL_TWILIGHT_REALM)) - me->CastSpell(target, SPELL_SOUL_CONSUMPTION, false); - _events.ScheduleEvent(EVENT_SOUL_CONSUMPTION, 20000); - break; - case EVENT_CHECK_HEALTH: - if (me->HealthBelowPct(50)) - { - me->CastStop(); - me->CastSpell(me, SPELL_TWILIGHT_DIVISION, false); - Talk(SAY_PHASE_THREE); - return; - } - _events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); - break; - case EVENT_SHADOW_PULSARS: - Talk(SAY_SPHERE_PULSE); - Talk(EMOTE_WARN_LASER); - _events.ScheduleEvent(EVENT_SHADOW_PULSARS, 29000); - _events.ScheduleEvent(EVENT_SHADOW_PULSARS_SHOOT, 5000); - break; - case EVENT_SHADOW_PULSARS_SHOOT: - if (Creature* orbCarrier = ObjectAccessor::GetCreature(*me, _instance->GetData64(NPC_ORB_CARRIER))) - orbCarrier->AI()->DoAction(ACTION_SHOOT); - break; - } - - DoMeleeAttackIfReady(); - } - - private: - EventMap _events; - InstanceScript* _instance; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + me->SetHealth(halion->GetHealth()); + me->setActive(true); } + + void Reset() + { + _events.Reset(); + me->SetPhaseMask(0x21, true); + me->SetInCombatWithZone(); + me->SetPhaseMask(0x20, true); + me->SetReactState(REACT_DEFENSIVE); + } + + void EnterCombat(Unit* /*who*/) + { + _events.Reset(); + _events.ScheduleEvent(EVENT_CLEAVE, urand(8000, 10000)); + _events.ScheduleEvent(EVENT_TAIL_LASH, 10000); + _events.ScheduleEvent(EVENT_BREATH, urand(10000, 15000)); + _events.ScheduleEvent(EVENT_SOUL_CONSUMPTION, 20000); + _events.ScheduleEvent(EVENT_SHADOW_PULSARS, 16000); + _events.ScheduleEvent(EVENT_SEND_ENCOUNTER_UNIT, 2000); + _events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); + + me->SetInCombatWithZone(); + } + + void EnterEvadeMode() + { + } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER && _events.GetNextEventTime(EVENT_KILL_TALK) == 0) + { + Talk(SAY_KILL); + _events.ScheduleEvent(EVENT_KILL_TALK, 6000); + } + } + + void JustDied(Unit* killer) + { + if (Creature* halion = ObjectAccessor::GetCreature(*me, _instance->GetData64(NPC_HALION))) + { + // Ensure looting + if (me->IsDamageEnoughForLootingAndReward()) + halion->LowerPlayerDamageReq(halion->GetMaxHealth()); + + if (halion->IsAlive()) + Unit::Kill(killer, halion); + } + + if (Creature* controller = ObjectAccessor::GetCreature(*me, _instance->GetData64(NPC_HALION_CONTROLLER))) + if (controller->IsAlive()) + Unit::Kill(controller, controller); + + _instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + me->CastSpell(me, SPELL_CLEAR_DEBUFFS, false); + } + + void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType, SpellSchoolMask) + { + if (!attacker || !me->InSamePhase(attacker)) + return; + + if (Creature* controller = ObjectAccessor::GetCreature(*me, _instance->GetData64(NPC_HALION_CONTROLLER))) + controller->AI()->SetData(DATA_TWILIGHT_DAMAGE_TAKEN, damage); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + _events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (_events.ExecuteEvent()) + { + case EVENT_SEND_ENCOUNTER_UNIT: + _instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 2); + break; + case EVENT_CLEAVE: + me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false); + _events.ScheduleEvent(EVENT_CLEAVE, urand(8000, 10000)); + break; + case EVENT_TAIL_LASH: + me->CastSpell(me, SPELL_TAIL_LASH, false); + _events.ScheduleEvent(EVENT_TAIL_LASH, 10000); + break; + case EVENT_BREATH: + me->CastSpell(me->GetVictim(), SPELL_DARK_BREATH, false); + _events.ScheduleEvent(EVENT_BREATH, urand(10000, 12000)); + break; + case EVENT_SOUL_CONSUMPTION: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100.0f, true, SPELL_TWILIGHT_REALM)) + me->CastSpell(target, SPELL_SOUL_CONSUMPTION, false); + _events.ScheduleEvent(EVENT_SOUL_CONSUMPTION, 20000); + break; + case EVENT_CHECK_HEALTH: + if (me->HealthBelowPct(50)) + { + me->CastStop(); + me->CastSpell(me, SPELL_TWILIGHT_DIVISION, false); + Talk(SAY_PHASE_THREE); + return; + } + _events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); + break; + case EVENT_SHADOW_PULSARS: + Talk(SAY_SPHERE_PULSE); + Talk(EMOTE_WARN_LASER); + _events.ScheduleEvent(EVENT_SHADOW_PULSARS, 29000); + _events.ScheduleEvent(EVENT_SHADOW_PULSARS_SHOOT, 5000); + break; + case EVENT_SHADOW_PULSARS_SHOOT: + if (Creature* orbCarrier = ObjectAccessor::GetCreature(*me, _instance->GetData64(NPC_ORB_CARRIER))) + orbCarrier->AI()->DoAction(ACTION_SHOOT); + break; + } + + DoMeleeAttackIfReady(); + } + + private: + EventMap _events; + InstanceScript* _instance; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class npc_halion_controller : public CreatureScript { - public: - npc_halion_controller() : CreatureScript("npc_halion_controller") { } +public: + npc_halion_controller() : CreatureScript("npc_halion_controller") { } - struct npc_halion_controllerAI : public NullCreatureAI + struct npc_halion_controllerAI : public NullCreatureAI + { + npc_halion_controllerAI(Creature* creature) : NullCreatureAI(creature), _instance(creature->GetInstanceScript()) { - npc_halion_controllerAI(Creature* creature) : NullCreatureAI(creature), _instance(creature->GetInstanceScript()) - { - } + } - void Reset() + void Reset() + { + _events.Reset(); + } + + void SetData(uint32 id, uint32 value) + { + if (_events.GetNextEventTime(EVENT_CHECK_CORPOREALITY) == 0) + return; + + if (id == DATA_MATERIAL_DAMAGE_TAKEN) + _materialDamage += value; + else + _twilightDamage += value; + } + + void DoAction(int32 action) + { + if (action == ACTION_INTRO_HALION) + _events.ScheduleEvent(EVENT_START_INTRO, 2000); + else if (action == ACTION_CHECK_CORPOREALITY) + { + _materialDamage = 1; + _twilightDamage = 1; + _corporeality = 5; + _events.ScheduleEvent(EVENT_CHECK_CORPOREALITY, 7000); + } + else if (action == ACTION_RESET_ENCOUNTER) { _events.Reset(); - } - - void SetData(uint32 id, uint32 value) - { - if (_events.GetNextEventTime(EVENT_CHECK_CORPOREALITY) == 0) - return; - - if (id == DATA_MATERIAL_DAMAGE_TAKEN) - _materialDamage += value; - else - _twilightDamage += value; - } - - void DoAction(int32 action) - { - if (action == ACTION_INTRO_HALION) - _events.ScheduleEvent(EVENT_START_INTRO, 2000); - else if (action == ACTION_CHECK_CORPOREALITY) - { - _materialDamage = 1; - _twilightDamage = 1; - _corporeality = 5; - _events.ScheduleEvent(EVENT_CHECK_CORPOREALITY, 7000); - } - else if (action == ACTION_RESET_ENCOUNTER) - { - _events.Reset(); - _materialDamage = 1; - _twilightDamage = 1; - _corporeality = 5; - } - } - - void UpdateAI(uint32 diff) - { - _events.Update(diff); - switch (_events.ExecuteEvent()) - { - // Intro - case EVENT_START_INTRO: - me->CastSpell(me, SPELL_COSMETIC_FIRE_PILLAR, false); - _events.ScheduleEvent(EVENT_INTRO_PROGRESS_1, 5000); - break; - case EVENT_INTRO_PROGRESS_1: - _instance->SetBossState(DATA_HALION_INTRO1, NOT_STARTED); - _instance->SetBossState(DATA_HALION_INTRO1, DONE); - _events.ScheduleEvent(EVENT_INTRO_PROGRESS_2, 5000); - break; - case EVENT_INTRO_PROGRESS_2: - _instance->SetBossState(DATA_HALION_INTRO2, NOT_STARTED); - _instance->SetBossState(DATA_HALION_INTRO2, DONE); - _events.ScheduleEvent(EVENT_INTRO_PROGRESS_3, 4000); - break; - case EVENT_INTRO_PROGRESS_3: - _instance->SetBossState(DATA_HALION_INTRO_DONE, NOT_STARTED); - _instance->SetBossState(DATA_HALION_INTRO_DONE, DONE); - me->CastSpell(me, SPELL_FIERY_EXPLOSION, false); - _events.ScheduleEvent(EVENT_INTRO_PROGRESS_4, 500); - break; - case EVENT_INTRO_PROGRESS_4: - if (Creature* halion = ObjectAccessor::GetCreature(*me, _instance->GetData64(NPC_HALION))) - { - halion->SetVisible(true); - halion->SetReactState(REACT_AGGRESSIVE); - halion->AI()->Talk(SAY_INTRO); - } - break; - case EVENT_TWILIGHT_MENDING: - me->CastSpell((Unit*)NULL, SPELL_TWILIGHT_MENDING, true); - break; - case EVENT_CHECK_CORPOREALITY: - UpdateCorporeality(); - _events.ScheduleEvent(EVENT_CHECK_CORPOREALITY, 10000); - break; - } - } - - private: - void UpdateCorporeality() - { - if (!_instance->IsEncounterInProgress()) - { - DoAction(ACTION_RESET_ENCOUNTER); - return; - } - - uint8 oldValue = _corporeality; - float damageRatio = float(_materialDamage) / float(_twilightDamage); - - if (_twilightDamage == 1 || _materialDamage == 1) - _events.ScheduleEvent(EVENT_TWILIGHT_MENDING, 4000); - - _twilightDamage = 1; _materialDamage = 1; + _twilightDamage = 1; + _corporeality = 5; + } + } - CorporealityEvent action = CORPOREALITY_NONE; - if (damageRatio < 0.98f) - action = CORPOREALITY_INCREASE; - else if (1.02f < damageRatio) - action = CORPOREALITY_DECREASE; - else - return; + void UpdateAI(uint32 diff) + { + _events.Update(diff); + switch (_events.ExecuteEvent()) + { + // Intro + case EVENT_START_INTRO: + me->CastSpell(me, SPELL_COSMETIC_FIRE_PILLAR, false); + _events.ScheduleEvent(EVENT_INTRO_PROGRESS_1, 5000); + break; + case EVENT_INTRO_PROGRESS_1: + _instance->SetBossState(DATA_HALION_INTRO1, NOT_STARTED); + _instance->SetBossState(DATA_HALION_INTRO1, DONE); + _events.ScheduleEvent(EVENT_INTRO_PROGRESS_2, 5000); + break; + case EVENT_INTRO_PROGRESS_2: + _instance->SetBossState(DATA_HALION_INTRO2, NOT_STARTED); + _instance->SetBossState(DATA_HALION_INTRO2, DONE); + _events.ScheduleEvent(EVENT_INTRO_PROGRESS_3, 4000); + break; + case EVENT_INTRO_PROGRESS_3: + _instance->SetBossState(DATA_HALION_INTRO_DONE, NOT_STARTED); + _instance->SetBossState(DATA_HALION_INTRO_DONE, DONE); + me->CastSpell(me, SPELL_FIERY_EXPLOSION, false); + _events.ScheduleEvent(EVENT_INTRO_PROGRESS_4, 500); + break; + case EVENT_INTRO_PROGRESS_4: + if (Creature* halion = ObjectAccessor::GetCreature(*me, _instance->GetData64(NPC_HALION))) + { + halion->SetVisible(true); + halion->SetReactState(REACT_AGGRESSIVE); + halion->AI()->Talk(SAY_INTRO); + } + break; + case EVENT_TWILIGHT_MENDING: + me->CastSpell((Unit*)NULL, SPELL_TWILIGHT_MENDING, true); + break; + case EVENT_CHECK_CORPOREALITY: + UpdateCorporeality(); + _events.ScheduleEvent(EVENT_CHECK_CORPOREALITY, 10000); + break; + } + } - switch (action) - { - case CORPOREALITY_INCREASE: + private: + void UpdateCorporeality() + { + if (!_instance->IsEncounterInProgress()) + { + DoAction(ACTION_RESET_ENCOUNTER); + return; + } + + uint8 oldValue = _corporeality; + float damageRatio = float(_materialDamage) / float(_twilightDamage); + + if (_twilightDamage == 1 || _materialDamage == 1) + _events.ScheduleEvent(EVENT_TWILIGHT_MENDING, 4000); + + _twilightDamage = 1; + _materialDamage = 1; + + CorporealityEvent action = CORPOREALITY_NONE; + if (damageRatio < 0.98f) + action = CORPOREALITY_INCREASE; + else if (1.02f < damageRatio) + action = CORPOREALITY_DECREASE; + else + return; + + switch (action) + { + case CORPOREALITY_INCREASE: { if (_corporeality == (MAX_CORPOREALITY_STATE - 1)) return; ++_corporeality; break; } - case CORPOREALITY_DECREASE: + case CORPOREALITY_DECREASE: { if (_corporeality == 0) return; --_corporeality; break; } - default: - break; - } - - _instance->DoUpdateWorldState(WORLDSTATE_CORPOREALITY_MATERIAL, _corporeality * 10); - _instance->DoUpdateWorldState(WORLDSTATE_CORPOREALITY_TWILIGHT, 100 - _corporeality * 10); - - if (Creature* twilightHalion = ObjectAccessor::GetCreature(*me, _instance->GetData64(NPC_TWILIGHT_HALION))) - { - twilightHalion->RemoveAurasDueToSpell(_corporealityReference[MAX_CORPOREALITY_STATE - 1 - oldValue]); - twilightHalion->CastSpell(twilightHalion, _corporealityReference[MAX_CORPOREALITY_STATE - 1 - _corporeality], true); - twilightHalion->AI()->Talk(oldValue < _corporeality ? EMOTE_CORPOREALITY_TOT : EMOTE_CORPOREALITY_TIT); - } - - if (Creature* halion = ObjectAccessor::GetCreature(*me, _instance->GetData64(NPC_HALION))) - { - halion->RemoveAurasDueToSpell(_corporealityReference[oldValue]); - halion->CastSpell(halion, _corporealityReference[_corporeality], true); - halion->AI()->Talk(oldValue > _corporeality ? EMOTE_CORPOREALITY_POT : EMOTE_CORPOREALITY_PIP); - } + default: + break; } - EventMap _events; - InstanceScript* _instance; - uint8 _corporeality; - uint32 _materialDamage; - uint32 _twilightDamage; - }; + _instance->DoUpdateWorldState(WORLDSTATE_CORPOREALITY_MATERIAL, _corporeality * 10); + _instance->DoUpdateWorldState(WORLDSTATE_CORPOREALITY_TWILIGHT, 100 - _corporeality * 10); - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + if (Creature* twilightHalion = ObjectAccessor::GetCreature(*me, _instance->GetData64(NPC_TWILIGHT_HALION))) + { + twilightHalion->RemoveAurasDueToSpell(_corporealityReference[MAX_CORPOREALITY_STATE - 1 - oldValue]); + twilightHalion->CastSpell(twilightHalion, _corporealityReference[MAX_CORPOREALITY_STATE - 1 - _corporeality], true); + twilightHalion->AI()->Talk(oldValue < _corporeality ? EMOTE_CORPOREALITY_TOT : EMOTE_CORPOREALITY_TIT); + } + + if (Creature* halion = ObjectAccessor::GetCreature(*me, _instance->GetData64(NPC_HALION))) + { + halion->RemoveAurasDueToSpell(_corporealityReference[oldValue]); + halion->CastSpell(halion, _corporealityReference[_corporeality], true); + halion->AI()->Talk(oldValue > _corporeality ? EMOTE_CORPOREALITY_POT : EMOTE_CORPOREALITY_PIP); + } } + + EventMap _events; + InstanceScript* _instance; + uint8 _corporeality; + uint32 _materialDamage; + uint32 _twilightDamage; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class npc_orb_carrier : public CreatureScript { - public: - npc_orb_carrier() : CreatureScript("npc_orb_carrier") { } +public: + npc_orb_carrier() : CreatureScript("npc_orb_carrier") { } - struct npc_orb_carrierAI : public NullCreatureAI + struct npc_orb_carrierAI : public NullCreatureAI + { + npc_orb_carrierAI(Creature* creature) : NullCreatureAI(creature) { - npc_orb_carrierAI(Creature* creature) : NullCreatureAI(creature) - { - ASSERT(creature->GetVehicleKit()); - } - - void UpdateAI(uint32 /*diff*/) - { - if (!me->HasUnitState(UNIT_STATE_CASTING)) - me->CastSpell((Unit*)NULL, SPELL_TRACK_ROTATION, false); - } - - void DoAction(int32 action) - { - if (action == ACTION_SHOOT) - { - Vehicle* vehicle = me->GetVehicleKit(); - Unit* southOrb = vehicle->GetPassenger(SEAT_SOUTH); - Unit* northOrb = vehicle->GetPassenger(SEAT_NORTH); - if (southOrb && northOrb) - TriggerCutter(northOrb, southOrb); - - if (!me->GetMap()->IsHeroic()) - return; - - Unit* eastOrb = vehicle->GetPassenger(SEAT_EAST); - Unit* westOrb = vehicle->GetPassenger(SEAT_WEST); - if (eastOrb && westOrb) - TriggerCutter(eastOrb, westOrb); - } - } - - void TriggerCutter(Unit* caster, Unit* target) - { - caster->CastSpell(caster, SPELL_TWILIGHT_PULSE_PERIODIC, true); - target->CastSpell(target, SPELL_TWILIGHT_PULSE_PERIODIC, true); - caster->CastSpell(target, SPELL_TWILIGHT_CUTTER, false); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + ASSERT(creature->GetVehicleKit()); } + + void UpdateAI(uint32 /*diff*/) + { + if (!me->HasUnitState(UNIT_STATE_CASTING)) + me->CastSpell((Unit*)NULL, SPELL_TRACK_ROTATION, false); + } + + void DoAction(int32 action) + { + if (action == ACTION_SHOOT) + { + Vehicle* vehicle = me->GetVehicleKit(); + Unit* southOrb = vehicle->GetPassenger(SEAT_SOUTH); + Unit* northOrb = vehicle->GetPassenger(SEAT_NORTH); + if (southOrb && northOrb) + TriggerCutter(northOrb, southOrb); + + if (!me->GetMap()->IsHeroic()) + return; + + Unit* eastOrb = vehicle->GetPassenger(SEAT_EAST); + Unit* westOrb = vehicle->GetPassenger(SEAT_WEST); + if (eastOrb && westOrb) + TriggerCutter(eastOrb, westOrb); + } + } + + void TriggerCutter(Unit* caster, Unit* target) + { + caster->CastSpell(caster, SPELL_TWILIGHT_PULSE_PERIODIC, true); + target->CastSpell(target, SPELL_TWILIGHT_PULSE_PERIODIC, true); + caster->CastSpell(target, SPELL_TWILIGHT_CUTTER, false); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class spell_halion_meteor_strike_targeting : public SpellScriptLoader { - public: - spell_halion_meteor_strike_targeting() : SpellScriptLoader("spell_halion_meteor_strike_targeting") { } +public: + spell_halion_meteor_strike_targeting() : SpellScriptLoader("spell_halion_meteor_strike_targeting") { } - class spell_halion_meteor_strike_targeting_SpellScript : public SpellScript + class spell_halion_meteor_strike_targeting_SpellScript : public SpellScript + { + PrepareSpellScript(spell_halion_meteor_strike_targeting_SpellScript); + + void HandleDummy(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_halion_meteor_strike_targeting_SpellScript); - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - GetCaster()->CastSpell(target, SPELL_METEOR_STRIKE, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_halion_meteor_strike_targeting_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_halion_meteor_strike_targeting_SpellScript(); + if (Unit* target = GetHitUnit()) + GetCaster()->CastSpell(target, SPELL_METEOR_STRIKE, true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_halion_meteor_strike_targeting_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_halion_meteor_strike_targeting_SpellScript(); + } }; class spell_halion_meteor_strike_marker : public SpellScriptLoader { - public: - spell_halion_meteor_strike_marker() : SpellScriptLoader("spell_halion_meteor_strike_marker") { } +public: + spell_halion_meteor_strike_marker() : SpellScriptLoader("spell_halion_meteor_strike_marker") { } - class spell_halion_meteor_strike_marker_AuraScript : public AuraScript + class spell_halion_meteor_strike_marker_AuraScript : public AuraScript + { + PrepareAuraScript(spell_halion_meteor_strike_marker_AuraScript); + + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_halion_meteor_strike_marker_AuraScript); - - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - SetDuration(6500); - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) - { - if (!caster->GetInstanceScript() || !caster->GetInstanceScript()->IsEncounterInProgress()) - return; - - caster->CastSpell(caster, SPELL_METEOR_STRIKE_AOE_DAMAGE, true); - caster->CastSpell(caster, SPELL_METEOR_STRIKE_FIRE_AURA_1, true); - for (uint32 spellId = SPELL_SUMMON_METEOR_STRIKE1; spellId <= SPELL_SUMMON_METEOR_STRIKE4; ++spellId) - caster->CastSpell(caster, spellId, true); - } - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_halion_meteor_strike_marker_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_halion_meteor_strike_marker_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_halion_meteor_strike_marker_AuraScript(); + SetDuration(6500); } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* caster = GetCaster()) + { + if (!caster->GetInstanceScript() || !caster->GetInstanceScript()->IsEncounterInProgress()) + return; + + caster->CastSpell(caster, SPELL_METEOR_STRIKE_AOE_DAMAGE, true); + caster->CastSpell(caster, SPELL_METEOR_STRIKE_FIRE_AURA_1, true); + for (uint32 spellId = SPELL_SUMMON_METEOR_STRIKE1; spellId <= SPELL_SUMMON_METEOR_STRIKE4; ++spellId) + caster->CastSpell(caster, spellId, true); + } + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_halion_meteor_strike_marker_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_halion_meteor_strike_marker_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_halion_meteor_strike_marker_AuraScript(); + } }; class spell_halion_meteor_strike_spread : public SpellScriptLoader { - public: - spell_halion_meteor_strike_spread() : SpellScriptLoader("spell_halion_meteor_strike_spread") { } +public: + spell_halion_meteor_strike_spread() : SpellScriptLoader("spell_halion_meteor_strike_spread") { } - class spell_halion_meteor_strike_spread_AuraScript : public AuraScript + class spell_halion_meteor_strike_spread_AuraScript : public AuraScript + { + PrepareAuraScript(spell_halion_meteor_strike_spread_AuraScript); + + void HandlePeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_halion_meteor_strike_spread_AuraScript); + PreventDefaultAction(); // xinef: 3/5 straight, 2/5 turn + if (!GetUnitOwner()->GetInstanceScript() || !GetUnitOwner()->GetInstanceScript()->IsEncounterInProgress()) + return; - void HandlePeriodic(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); // xinef: 3/5 straight, 2/5 turn - if (!GetUnitOwner()->GetInstanceScript() || !GetUnitOwner()->GetInstanceScript()->IsEncounterInProgress()) - return; - - GetUnitOwner()->CastSpell(GetUnitOwner(), RAND(SPELL_SUMMON_METEOR_FLAME1, SPELL_SUMMON_METEOR_FLAME2, SPELL_SUMMON_METEOR_FLAME2, SPELL_SUMMON_METEOR_FLAME2, SPELL_SUMMON_METEOR_FLAME3), true); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_halion_meteor_strike_spread_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_halion_meteor_strike_spread_AuraScript(); + GetUnitOwner()->CastSpell(GetUnitOwner(), RAND(SPELL_SUMMON_METEOR_FLAME1, SPELL_SUMMON_METEOR_FLAME2, SPELL_SUMMON_METEOR_FLAME2, SPELL_SUMMON_METEOR_FLAME2, SPELL_SUMMON_METEOR_FLAME3), true); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_halion_meteor_strike_spread_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_halion_meteor_strike_spread_AuraScript(); + } }; class spell_halion_blazing_aura : public SpellScriptLoader { - public: - spell_halion_blazing_aura() : SpellScriptLoader("spell_halion_blazing_aura") { } +public: + spell_halion_blazing_aura() : SpellScriptLoader("spell_halion_blazing_aura") { } - class spell_halion_blazing_aura_SpellScript : public SpellScript + class spell_halion_blazing_aura_SpellScript : public SpellScript + { + PrepareSpellScript(spell_halion_blazing_aura_SpellScript); + + void HandleForceCast(SpellEffIndex effIndex) { - PrepareSpellScript(spell_halion_blazing_aura_SpellScript); - - void HandleForceCast(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - target->CastSpell(target, GetSpellInfo()->Effects[effIndex].TriggerSpell, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_halion_blazing_aura_SpellScript::HandleForceCast, EFFECT_1, SPELL_EFFECT_FORCE_CAST); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_halion_blazing_aura_SpellScript(); + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) + target->CastSpell(target, GetSpellInfo()->Effects[effIndex].TriggerSpell, true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_halion_blazing_aura_SpellScript::HandleForceCast, EFFECT_1, SPELL_EFFECT_FORCE_CAST); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_halion_blazing_aura_SpellScript(); + } }; class spell_halion_combustion_consumption : public SpellScriptLoader { +public: + spell_halion_combustion_consumption(char const* scriptName, uint32 spell) : SpellScriptLoader(scriptName), _spellID(spell) { } + + class spell_halion_combustion_consumption_AuraScript : public AuraScript + { + PrepareAuraScript(spell_halion_combustion_consumption_AuraScript); + public: - spell_halion_combustion_consumption(char const* scriptName, uint32 spell) : SpellScriptLoader(scriptName), _spellID(spell) { } + spell_halion_combustion_consumption_AuraScript(uint32 spellID) : AuraScript(), _markSpell(spellID) { } - class spell_halion_combustion_consumption_AuraScript : public AuraScript + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_halion_combustion_consumption_AuraScript); - - public: - spell_halion_combustion_consumption_AuraScript(uint32 spellID) : AuraScript(), _markSpell(spellID) { } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetTarget()->RemoveAurasDueToSpell(_markSpell, 0, 0, AURA_REMOVE_BY_EXPIRE); - } - - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetTarget()->CastSpell(GetTarget(), _markSpell, true); - } - - void AddMarkStack(AuraEffect const* /*aurEff*/) - { - GetTarget()->CastSpell(GetTarget(), _markSpell, true); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_halion_combustion_consumption_AuraScript::AddMarkStack, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); - AfterEffectApply += AuraEffectApplyFn(spell_halion_combustion_consumption_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_halion_combustion_consumption_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); - } - - uint32 _markSpell; - }; - - AuraScript* GetAuraScript() const - { - return new spell_halion_combustion_consumption_AuraScript(_spellID); + GetTarget()->RemoveAurasDueToSpell(_markSpell, 0, 0, AURA_REMOVE_BY_EXPIRE); } - private: - uint32 _spellID; + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->CastSpell(GetTarget(), _markSpell, true); + } + + void AddMarkStack(AuraEffect const* /*aurEff*/) + { + GetTarget()->CastSpell(GetTarget(), _markSpell, true); + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_halion_combustion_consumption_AuraScript::AddMarkStack, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + AfterEffectApply += AuraEffectApplyFn(spell_halion_combustion_consumption_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_halion_combustion_consumption_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); + } + + uint32 _markSpell; + }; + + AuraScript* GetAuraScript() const + { + return new spell_halion_combustion_consumption_AuraScript(_spellID); + } + +private: + uint32 _spellID; }; class spell_halion_marks : public SpellScriptLoader { +public: + spell_halion_marks(char const* scriptName, uint32 summonSpell, uint32 removeSpell) : SpellScriptLoader(scriptName), _summonSpell(summonSpell), _removeSpell(removeSpell) { } + + class spell_halion_marks_AuraScript : public AuraScript + { + PrepareAuraScript(spell_halion_marks_AuraScript); + public: - spell_halion_marks(char const* scriptName, uint32 summonSpell, uint32 removeSpell) : SpellScriptLoader(scriptName), _summonSpell(summonSpell), _removeSpell(removeSpell) { } + spell_halion_marks_AuraScript(uint32 summonSpell, uint32 removeSpell) : AuraScript(), _summonSpellId(summonSpell), _removeSpellId(removeSpell) { } - class spell_halion_marks_AuraScript : public AuraScript + void BeforeDispel(DispelInfo* dispelData) { - PrepareAuraScript(spell_halion_marks_AuraScript); + dispelData->SetRemovedCharges(0); - public: - spell_halion_marks_AuraScript(uint32 summonSpell, uint32 removeSpell) : AuraScript(), _summonSpellId(summonSpell), _removeSpellId(removeSpell) { } - - void BeforeDispel(DispelInfo* dispelData) - { - dispelData->SetRemovedCharges(0); - - if (Unit* dispelledUnit = GetUnitOwner()) - if (dispelledUnit->HasAura(_removeSpellId)) - dispelledUnit->RemoveAurasDueToSpell(_removeSpellId, 0, 0, AURA_REMOVE_BY_EXPIRE); - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) - return; - - if (!GetTarget()->GetInstanceScript() || !GetTarget()->GetInstanceScript()->IsEncounterInProgress() || GetTarget()->GetMapId() != 724) - return; - - GetTarget()->CastCustomSpell(_summonSpellId, SPELLVALUE_BASE_POINT1, GetAura()->GetStackAmount(), GetTarget(), TRIGGERED_FULL_MASK, nullptr, nullptr, GetCasterGUID()); - } - - void Register() - { - OnDispel += AuraDispelFn(spell_halion_marks_AuraScript::BeforeDispel); - AfterEffectRemove += AuraEffectRemoveFn(spell_halion_marks_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - - uint32 _summonSpellId; - uint32 _removeSpellId; - }; - - AuraScript* GetAuraScript() const - { - return new spell_halion_marks_AuraScript(_summonSpell, _removeSpell); + if (Unit* dispelledUnit = GetUnitOwner()) + if (dispelledUnit->HasAura(_removeSpellId)) + dispelledUnit->RemoveAurasDueToSpell(_removeSpellId, 0, 0, AURA_REMOVE_BY_EXPIRE); } - private: - uint32 _summonSpell; - uint32 _removeSpell; + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) + return; + + if (!GetTarget()->GetInstanceScript() || !GetTarget()->GetInstanceScript()->IsEncounterInProgress() || GetTarget()->GetMapId() != 724) + return; + + GetTarget()->CastCustomSpell(_summonSpellId, SPELLVALUE_BASE_POINT1, GetAura()->GetStackAmount(), GetTarget(), TRIGGERED_FULL_MASK, nullptr, nullptr, GetCasterGUID()); + } + + void Register() + { + OnDispel += AuraDispelFn(spell_halion_marks_AuraScript::BeforeDispel); + AfterEffectRemove += AuraEffectRemoveFn(spell_halion_marks_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + + uint32 _summonSpellId; + uint32 _removeSpellId; + }; + + AuraScript* GetAuraScript() const + { + return new spell_halion_marks_AuraScript(_summonSpell, _removeSpell); + } + +private: + uint32 _summonSpell; + uint32 _removeSpell; }; class spell_halion_damage_aoe_summon : public SpellScriptLoader { +public: + spell_halion_damage_aoe_summon(char const* scriptName, uint32 explosionSpell, uint32 auraSpell) : SpellScriptLoader(scriptName), _explosionSpell(explosionSpell), _auraSpell(auraSpell) { } + + class spell_halion_damage_aoe_summon_SpellScript : public SpellScript + { + PrepareSpellScript(spell_halion_damage_aoe_summon_SpellScript); + public: - spell_halion_damage_aoe_summon(char const* scriptName, uint32 explosionSpell, uint32 auraSpell) : SpellScriptLoader(scriptName), _explosionSpell(explosionSpell), _auraSpell(auraSpell) { } + spell_halion_damage_aoe_summon_SpellScript(uint32 explosionSpell, uint32 auraSpell) : SpellScript(), _explosionSpell(explosionSpell), _auraSpell(auraSpell) { } - class spell_halion_damage_aoe_summon_SpellScript : public SpellScript + void HandleSummon(SpellEffIndex effIndex) { - PrepareSpellScript(spell_halion_damage_aoe_summon_SpellScript); + PreventHitDefaultEffect(effIndex); + Unit* caster = GetCaster(); + uint32 entry = uint32(GetSpellInfo()->Effects[effIndex].MiscValue); + SummonPropertiesEntry const* properties = sSummonPropertiesStore.LookupEntry(uint32(GetSpellInfo()->Effects[effIndex].MiscValueB)); + uint32 duration = uint32(GetSpellInfo()->GetDuration()); - public: - spell_halion_damage_aoe_summon_SpellScript(uint32 explosionSpell, uint32 auraSpell) : SpellScript(), _explosionSpell(explosionSpell), _auraSpell(auraSpell) { } - - void HandleSummon(SpellEffIndex effIndex) + Position pos; + caster->GetPosition(&pos); + if (Creature* summon = caster->GetMap()->SummonCreature(entry, pos, properties, duration, caster, GetSpellInfo()->Id)) { - PreventHitDefaultEffect(effIndex); - Unit* caster = GetCaster(); - uint32 entry = uint32(GetSpellInfo()->Effects[effIndex].MiscValue); - SummonPropertiesEntry const* properties = sSummonPropertiesStore.LookupEntry(uint32(GetSpellInfo()->Effects[effIndex].MiscValueB)); - uint32 duration = uint32(GetSpellInfo()->GetDuration()); + bool heroic = summon->GetMap()->IsHeroic(); + bool raid = summon->GetMap()->Is25ManRaid(); - Position pos; - caster->GetPosition(&pos); - if (Creature* summon = caster->GetMap()->SummonCreature(entry, pos, properties, duration, caster, GetSpellInfo()->Id)) - { - bool heroic = summon->GetMap()->IsHeroic(); - bool raid = summon->GetMap()->Is25ManRaid(); + if (heroic) + summon->SetPhaseMask(0x01 | 0x20, true); + else if (summon->GetEntry() == NPC_COMBUSTION) + summon->SetPhaseMask(0x01, true); + else + summon->SetPhaseMask(0x20, true); - if (heroic) - summon->SetPhaseMask(0x01|0x20, true); - else if (summon->GetEntry() == NPC_COMBUSTION) - summon->SetPhaseMask(0x01, true); - else - summon->SetPhaseMask(0x20, true); + summon->CastCustomSpell(SPELL_SCALE_AURA, SPELLVALUE_AURA_STACK, GetSpellValue()->EffectBasePoints[EFFECT_1], summon); + summon->CastSpell(summon, _auraSpell, true); - summon->CastCustomSpell(SPELL_SCALE_AURA, SPELLVALUE_AURA_STACK, GetSpellValue()->EffectBasePoints[EFFECT_1], summon); - summon->CastSpell(summon, _auraSpell, true); - - int32 damage = int32((1500 + (GetSpellValue()->EffectBasePoints[EFFECT_1] * 1250)) * (heroic ? 1.25f : 1.0f) * (raid ? 1.5f : 1.0f)); - caster->CastCustomSpell(_explosionSpell, SPELLVALUE_BASE_POINT0, damage, caster); - } + int32 damage = int32((1500 + (GetSpellValue()->EffectBasePoints[EFFECT_1] * 1250)) * (heroic ? 1.25f : 1.0f) * (raid ? 1.5f : 1.0f)); + caster->CastCustomSpell(_explosionSpell, SPELLVALUE_BASE_POINT0, damage, caster); } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_halion_damage_aoe_summon_SpellScript::HandleSummon, EFFECT_0, SPELL_EFFECT_SUMMON); - } - - uint32 _explosionSpell; - uint32 _auraSpell; - }; - - SpellScript* GetSpellScript() const - { - return new spell_halion_damage_aoe_summon_SpellScript(_explosionSpell, _auraSpell); } - private: + void Register() + { + OnEffectHit += SpellEffectFn(spell_halion_damage_aoe_summon_SpellScript::HandleSummon, EFFECT_0, SPELL_EFFECT_SUMMON); + } + uint32 _explosionSpell; uint32 _auraSpell; + }; + + SpellScript* GetSpellScript() const + { + return new spell_halion_damage_aoe_summon_SpellScript(_explosionSpell, _auraSpell); + } + +private: + uint32 _explosionSpell; + uint32 _auraSpell; }; class spell_halion_clear_debuffs : public SpellScriptLoader { - public: - spell_halion_clear_debuffs() : SpellScriptLoader("spell_halion_clear_debuffs") { } +public: + spell_halion_clear_debuffs() : SpellScriptLoader("spell_halion_clear_debuffs") { } - class spell_halion_clear_debuffs_SpellScript : public SpellScript + class spell_halion_clear_debuffs_SpellScript : public SpellScript + { + PrepareSpellScript(spell_halion_clear_debuffs_SpellScript); + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_halion_clear_debuffs_SpellScript); - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) + if (GetHitUnit()) { - if (GetHitUnit()) - { - GetHitUnit()->RemoveAurasDueToSpell(GetSpellInfo()->Effects[EFFECT_0].CalcValue()); - GetHitUnit()->RemoveAurasDueToSpell(GetSpellInfo()->Effects[EFFECT_1].CalcValue()); - GetHitUnit()->RemoveAurasDueToSpell(SPELL_FIERY_COMBUSTION); - } + GetHitUnit()->RemoveAurasDueToSpell(GetSpellInfo()->Effects[EFFECT_0].CalcValue()); + GetHitUnit()->RemoveAurasDueToSpell(GetSpellInfo()->Effects[EFFECT_1].CalcValue()); + GetHitUnit()->RemoveAurasDueToSpell(SPELL_FIERY_COMBUSTION); } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_halion_clear_debuffs_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_halion_clear_debuffs_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_halion_clear_debuffs_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_halion_clear_debuffs_SpellScript(); + } }; class spell_halion_twilight_phasing : public SpellScriptLoader { - public: - spell_halion_twilight_phasing() : SpellScriptLoader("spell_halion_twilight_phasing") { } +public: + spell_halion_twilight_phasing() : SpellScriptLoader("spell_halion_twilight_phasing") { } - class spell_halion_twilight_phasing_SpellScript : public SpellScript + class spell_halion_twilight_phasing_SpellScript : public SpellScript + { + PrepareSpellScript(spell_halion_twilight_phasing_SpellScript); + + bool Load() { - PrepareSpellScript(spell_halion_twilight_phasing_SpellScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_UNIT; - } - - void Phase() - { - Unit* caster = GetCaster(); - caster->CastSpell(caster->GetPositionX(), caster->GetPositionY(), caster->GetPositionZ(), SPELL_SUMMON_TWILIGHT_PORTAL, true); - caster->GetMap()->SummonCreature(NPC_TWILIGHT_HALION, caster->ToCreature()->GetHomePosition(), NULL, 0, caster); - } - - void Register() - { - OnHit += SpellHitFn(spell_halion_twilight_phasing_SpellScript::Phase); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_halion_twilight_phasing_SpellScript(); + return GetCaster()->GetTypeId() == TYPEID_UNIT; } - class spell_halion_twilight_phasing_AuraScript : public AuraScript + void Phase() { - PrepareAuraScript(spell_halion_twilight_phasing_AuraScript); - - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*handle*/) - { - GetTarget()->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - GetTarget()->ToCreature()->SetReactState(REACT_DEFENSIVE); - GetTarget()->GetMotionMaster()->Clear(); - GetTarget()->getThreatManager().clearReferences(); - GetTarget()->RemoveAllAttackers(); - GetTarget()->AttackStop(); - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*handle*/) - { - GetTarget()->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - GetTarget()->ToCreature()->SetReactState(REACT_DEFENSIVE); - GetTarget()->GetMotionMaster()->Clear(); - GetTarget()->getThreatManager().clearReferences(); - GetTarget()->RemoveAllAttackers(); - GetTarget()->AttackStop(); - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_halion_twilight_phasing_AuraScript::OnApply, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_halion_twilight_phasing_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_halion_twilight_phasing_AuraScript(); + Unit* caster = GetCaster(); + caster->CastSpell(caster->GetPositionX(), caster->GetPositionY(), caster->GetPositionZ(), SPELL_SUMMON_TWILIGHT_PORTAL, true); + caster->GetMap()->SummonCreature(NPC_TWILIGHT_HALION, caster->ToCreature()->GetHomePosition(), NULL, 0, caster); } + + void Register() + { + OnHit += SpellHitFn(spell_halion_twilight_phasing_SpellScript::Phase); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_halion_twilight_phasing_SpellScript(); + } + + class spell_halion_twilight_phasing_AuraScript : public AuraScript + { + PrepareAuraScript(spell_halion_twilight_phasing_AuraScript); + + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*handle*/) + { + GetTarget()->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + GetTarget()->ToCreature()->SetReactState(REACT_DEFENSIVE); + GetTarget()->GetMotionMaster()->Clear(); + GetTarget()->getThreatManager().clearReferences(); + GetTarget()->RemoveAllAttackers(); + GetTarget()->AttackStop(); + } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*handle*/) + { + GetTarget()->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + GetTarget()->ToCreature()->SetReactState(REACT_DEFENSIVE); + GetTarget()->GetMotionMaster()->Clear(); + GetTarget()->getThreatManager().clearReferences(); + GetTarget()->RemoveAllAttackers(); + GetTarget()->AttackStop(); + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_halion_twilight_phasing_AuraScript::OnApply, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_halion_twilight_phasing_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_halion_twilight_phasing_AuraScript(); + } }; class spell_halion_twilight_realm : public SpellScriptLoader { - public: - spell_halion_twilight_realm() : SpellScriptLoader("spell_halion_twilight_realm") { } +public: + spell_halion_twilight_realm() : SpellScriptLoader("spell_halion_twilight_realm") { } - class spell_halion_twilight_realm_AuraScript : public AuraScript + class spell_halion_twilight_realm_AuraScript : public AuraScript + { + PrepareAuraScript(spell_halion_twilight_realm_AuraScript); + + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*handle*/) { - PrepareAuraScript(spell_halion_twilight_realm_AuraScript); + Unit* target = GetTarget(); + if (!target) + return; - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*handle*/) - { - Unit* target = GetTarget(); - if (!target) - return; - - target->RemoveAurasDueToSpell(SPELL_FIERY_COMBUSTION, 0, 0, AURA_REMOVE_BY_ENEMY_SPELL); - if (GetTarget()->GetTypeId() != TYPEID_PLAYER) - return; - GetTarget()->m_Events.AddEvent(new SendEncounterUnit(GetTarget()->ToPlayer()), GetTarget()->m_Events.CalculateTime(500)); - } - - void Register() - { - AfterEffectApply += AuraEffectApplyFn(spell_halion_twilight_realm_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PHASE, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_halion_twilight_realm_AuraScript(); + target->RemoveAurasDueToSpell(SPELL_FIERY_COMBUSTION, 0, 0, AURA_REMOVE_BY_ENEMY_SPELL); + if (GetTarget()->GetTypeId() != TYPEID_PLAYER) + return; + GetTarget()->m_Events.AddEvent(new SendEncounterUnit(GetTarget()->ToPlayer()), GetTarget()->m_Events.CalculateTime(500)); } + + void Register() + { + AfterEffectApply += AuraEffectApplyFn(spell_halion_twilight_realm_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PHASE, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_halion_twilight_realm_AuraScript(); + } }; class spell_halion_leave_twilight_realm : public SpellScriptLoader { - public: - spell_halion_leave_twilight_realm() : SpellScriptLoader("spell_halion_leave_twilight_realm") { } +public: + spell_halion_leave_twilight_realm() : SpellScriptLoader("spell_halion_leave_twilight_realm") { } - class spell_halion_leave_twilight_realm_AuraScript : public AuraScript + class spell_halion_leave_twilight_realm_AuraScript : public AuraScript + { + PrepareAuraScript(spell_halion_leave_twilight_realm_AuraScript); + + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*handle*/) { - PrepareAuraScript(spell_halion_leave_twilight_realm_AuraScript); + Unit* target = GetTarget(); + if (!target) + return; - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*handle*/) - { - Unit* target = GetTarget(); - if (!target) - return; - - target->RemoveAurasDueToSpell(SPELL_SOUL_CONSUMPTION, 0, 0, AURA_REMOVE_BY_ENEMY_SPELL); - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*handle*/) - { - GetTarget()->RemoveAurasDueToSpell(SPELL_TWILIGHT_REALM); - - if (GetTarget()->GetTypeId() != TYPEID_PLAYER) - return; - GetTarget()->m_Events.AddEvent(new SendEncounterUnit(GetTarget()->ToPlayer()), GetTarget()->m_Events.CalculateTime(500)); - } - - void Register() - { - AfterEffectApply += AuraEffectApplyFn(spell_halion_leave_twilight_realm_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_halion_leave_twilight_realm_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_halion_leave_twilight_realm_AuraScript(); + target->RemoveAurasDueToSpell(SPELL_SOUL_CONSUMPTION, 0, 0, AURA_REMOVE_BY_ENEMY_SPELL); } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*handle*/) + { + GetTarget()->RemoveAurasDueToSpell(SPELL_TWILIGHT_REALM); + + if (GetTarget()->GetTypeId() != TYPEID_PLAYER) + return; + GetTarget()->m_Events.AddEvent(new SendEncounterUnit(GetTarget()->ToPlayer()), GetTarget()->m_Events.CalculateTime(500)); + } + + void Register() + { + AfterEffectApply += AuraEffectApplyFn(spell_halion_leave_twilight_realm_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_halion_leave_twilight_realm_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_halion_leave_twilight_realm_AuraScript(); + } }; class spell_halion_twilight_cutter_periodic : public SpellScriptLoader { - public: - spell_halion_twilight_cutter_periodic() : SpellScriptLoader("spell_halion_twilight_cutter_periodic") { } +public: + spell_halion_twilight_cutter_periodic() : SpellScriptLoader("spell_halion_twilight_cutter_periodic") { } - class spell_halion_twilight_cutter_periodic_AuraScript : public AuraScript + class spell_halion_twilight_cutter_periodic_AuraScript : public AuraScript + { + PrepareAuraScript(spell_halion_twilight_cutter_periodic_AuraScript); + + void HandlePeriodic(AuraEffect const* aurEff) { - PrepareAuraScript(spell_halion_twilight_cutter_periodic_AuraScript); - - void HandlePeriodic(AuraEffect const* aurEff) - { - PreventDefaultAction(); - GetUnitOwner()->CastSpell((Unit*)NULL, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_halion_twilight_cutter_periodic_AuraScript::HandlePeriodic, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_halion_twilight_cutter_periodic_AuraScript(); + PreventDefaultAction(); + GetUnitOwner()->CastSpell((Unit*)NULL, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_halion_twilight_cutter_periodic_AuraScript::HandlePeriodic, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_halion_twilight_cutter_periodic_AuraScript(); + } }; class TwilightCutterSelector { - public: - TwilightCutterSelector(WorldObject* caster, WorldObject* cutterCaster) : _caster(caster), _cutterCaster(cutterCaster) {} +public: + TwilightCutterSelector(WorldObject* caster, WorldObject* cutterCaster) : _caster(caster), _cutterCaster(cutterCaster) {} - bool operator()(WorldObject* unit) - { - return !unit->IsInBetween(_caster, _cutterCaster, 2.5f); - } + bool operator()(WorldObject* unit) + { + return !unit->IsInBetween(_caster, _cutterCaster, 2.5f); + } - private: - WorldObject* _caster; - WorldObject* _cutterCaster; +private: + WorldObject* _caster; + WorldObject* _cutterCaster; }; class spell_halion_twilight_cutter : public SpellScriptLoader { - public: - spell_halion_twilight_cutter() : SpellScriptLoader("spell_halion_twilight_cutter") { } +public: + spell_halion_twilight_cutter() : SpellScriptLoader("spell_halion_twilight_cutter") { } - class spell_halion_twilight_cutter_SpellScript : public SpellScript + class spell_halion_twilight_cutter_SpellScript : public SpellScript + { + PrepareSpellScript(spell_halion_twilight_cutter_SpellScript); + + void RemoveNotBetween(std::list& unitList) { - PrepareSpellScript(spell_halion_twilight_cutter_SpellScript); + if (unitList.empty()) + return; - void RemoveNotBetween(std::list& unitList) - { - if (unitList.empty()) + if (Aura* cutter = GetCaster()->GetAura(SPELL_TWILIGHT_CUTTER)) + if (Unit* cutterCaster = cutter->GetCaster()) + { + unitList.remove_if(TwilightCutterSelector(GetCaster(), cutterCaster)); return; + } - if (Aura* cutter = GetCaster()->GetAura(SPELL_TWILIGHT_CUTTER)) - if (Unit* cutterCaster = cutter->GetCaster()) - { - unitList.remove_if(TwilightCutterSelector(GetCaster(), cutterCaster)); - return; - } - - unitList.clear(); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_halion_twilight_cutter_SpellScript::RemoveNotBetween, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_halion_twilight_cutter_SpellScript(); + unitList.clear(); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_halion_twilight_cutter_SpellScript::RemoveNotBetween, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_halion_twilight_cutter_SpellScript(); + } }; class spell_halion_summon_exit_portals : public SpellScriptLoader { - public: - spell_halion_summon_exit_portals() : SpellScriptLoader("spell_halion_summon_exit_portals") { } +public: + spell_halion_summon_exit_portals() : SpellScriptLoader("spell_halion_summon_exit_portals") { } - class spell_halion_summon_exit_portals_SpellScript : public SpellScript + class spell_halion_summon_exit_portals_SpellScript : public SpellScript + { + PrepareSpellScript(spell_halion_summon_exit_portals_SpellScript); + + void OnSummon(SpellEffIndex effIndex) { - PrepareSpellScript(spell_halion_summon_exit_portals_SpellScript); + WorldLocation summonPos = *GetExplTargetDest(); + Position offset = {0.0f, 0.0f, 0.0f, 0.0f}; + if (GetSpellInfo()->Id == SPELL_SUMMON_EXIT_PORTALS) + offset.m_positionY = effIndex == EFFECT_1 ? -35.0f : 35.0f; + else + offset.m_positionX = effIndex == EFFECT_1 ? -35.0f : 35.0f; - void OnSummon(SpellEffIndex effIndex) - { - WorldLocation summonPos = *GetExplTargetDest(); - Position offset = {0.0f, 0.0f, 0.0f, 0.0f}; - if (GetSpellInfo()->Id == SPELL_SUMMON_EXIT_PORTALS) - offset.m_positionY = effIndex == EFFECT_1 ? -35.0f : 35.0f; - else - offset.m_positionX = effIndex == EFFECT_1 ? -35.0f : 35.0f; + summonPos.RelocateOffset(offset); - summonPos.RelocateOffset(offset); - - SetExplTargetDest(summonPos); - GetHitDest()->RelocateOffset(offset); - } - - void Register() - { - 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); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_halion_summon_exit_portals_SpellScript(); + SetExplTargetDest(summonPos); + GetHitDest()->RelocateOffset(offset); } + + void Register() + { + 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); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_halion_summon_exit_portals_SpellScript(); + } }; class spell_halion_twilight_division : public SpellScriptLoader { - public: - spell_halion_twilight_division() : SpellScriptLoader("spell_halion_twilight_division") { } +public: + spell_halion_twilight_division() : SpellScriptLoader("spell_halion_twilight_division") { } - class spell_halion_twilight_division_SpellScript : public SpellScript + class spell_halion_twilight_division_SpellScript : public SpellScript + { + PrepareSpellScript(spell_halion_twilight_division_SpellScript); + + void HandleDummy(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_halion_twilight_division_SpellScript); + InstanceScript* instance = GetCaster()->GetInstanceScript(); + Creature* controller = ObjectAccessor::GetCreature(*GetCaster(), instance->GetData64(NPC_HALION_CONTROLLER)); + Creature* halion = ObjectAccessor::GetCreature(*GetCaster(), instance->GetData64(NPC_HALION)); - void HandleDummy(SpellEffIndex /*effIndex*/) - { - InstanceScript* instance = GetCaster()->GetInstanceScript(); - Creature* controller = ObjectAccessor::GetCreature(*GetCaster(), instance->GetData64(NPC_HALION_CONTROLLER)); - Creature* halion = ObjectAccessor::GetCreature(*GetCaster(), instance->GetData64(NPC_HALION)); + if (!controller || !halion) + return; - if (!controller || !halion) - return; + GetCaster()->CastSpell(GetCaster(), _corporealityReference[5], true); + halion->CastSpell(halion, _corporealityReference[5], true); - GetCaster()->CastSpell(GetCaster(), _corporealityReference[5], true); - halion->CastSpell(halion, _corporealityReference[5], true); + controller->CastSpell(controller, SPELL_SUMMON_EXIT_PORTALS_NORMAL, true); + controller->CastSpell(controller, SPELL_SUMMON_EXIT_PORTALS, true); + controller->AI()->DoAction(ACTION_CHECK_CORPOREALITY); - controller->CastSpell(controller, SPELL_SUMMON_EXIT_PORTALS_NORMAL, true); - controller->CastSpell(controller, SPELL_SUMMON_EXIT_PORTALS, true); - controller->AI()->DoAction(ACTION_CHECK_CORPOREALITY); + halion->RemoveAurasDueToSpell(SPELL_TWILIGHT_PHASING); + if (GameObject* gobject = halion->FindNearestGameObject(GO_HALION_PORTAL_1, 100.0f)) + gobject->Delete(); - halion->RemoveAurasDueToSpell(SPELL_TWILIGHT_PHASING); - if (GameObject* gobject = halion->FindNearestGameObject(GO_HALION_PORTAL_1, 100.0f)) - gobject->Delete(); - - instance->DoUpdateWorldState(WORLDSTATE_CORPOREALITY_TOGGLE, 1); - instance->DoUpdateWorldState(WORLDSTATE_CORPOREALITY_MATERIAL, 50); - instance->DoUpdateWorldState(WORLDSTATE_CORPOREALITY_TWILIGHT, 50); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_halion_twilight_division_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_halion_twilight_division_SpellScript(); + instance->DoUpdateWorldState(WORLDSTATE_CORPOREALITY_TOGGLE, 1); + instance->DoUpdateWorldState(WORLDSTATE_CORPOREALITY_MATERIAL, 50); + instance->DoUpdateWorldState(WORLDSTATE_CORPOREALITY_TWILIGHT, 50); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_halion_twilight_division_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_halion_twilight_division_SpellScript(); + } }; class spell_halion_twilight_mending : public SpellScriptLoader { - public: - spell_halion_twilight_mending() : SpellScriptLoader("spell_halion_twilight_mending") { } +public: + spell_halion_twilight_mending() : SpellScriptLoader("spell_halion_twilight_mending") { } - class spell_halion_twilight_mending_SpellScript : public SpellScript + class spell_halion_twilight_mending_SpellScript : public SpellScript + { + PrepareSpellScript(spell_halion_twilight_mending_SpellScript); + + void HandleHealPct(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_halion_twilight_mending_SpellScript); - - void HandleHealPct(SpellEffIndex /*effIndex*/) - { - if (Creature* target = GetHitCreature()) - target->AI()->Talk(SAY_REGENERATE); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_halion_twilight_mending_SpellScript::HandleHealPct, EFFECT_ALL, SPELL_EFFECT_HEAL_PCT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_halion_twilight_mending_SpellScript(); + if (Creature* target = GetHitCreature()) + target->AI()->Talk(SAY_REGENERATE); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_halion_twilight_mending_SpellScript::HandleHealPct, EFFECT_ALL, SPELL_EFFECT_HEAL_PCT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_halion_twilight_mending_SpellScript(); + } }; class npc_living_inferno : public CreatureScript @@ -1440,27 +1440,27 @@ class npc_living_inferno : public CreatureScript public: npc_living_inferno() : CreatureScript("npc_living_inferno") { } - struct npc_living_infernoAI : public ScriptedAI + struct npc_living_infernoAI : public ScriptedAI { npc_living_infernoAI(Creature* creature) : ScriptedAI(creature) { } - void IsSummonedBy(Unit* /*summoner*/) + void IsSummonedBy(Unit* /*summoner*/) { me->SetInCombatWithZone(); me->CastSpell(me, SPELL_BLAZING_AURA, true); - if (InstanceScript* instance = me->GetInstanceScript()) + if (InstanceScript* instance = me->GetInstanceScript()) if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_HALION_CONTROLLER))) controller->AI()->JustSummoned(me); } - void JustDied(Unit* /*killer*/) + void JustDied(Unit* /*killer*/) { me->DespawnOrUnsummon(1); } }; - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const { return GetInstanceAI(creature); } diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp index a4675477b..b6b62e0f7 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp @@ -46,183 +46,183 @@ enum Misc class boss_saviana_ragefire : public CreatureScript { - public: - boss_saviana_ragefire() : CreatureScript("boss_saviana_ragefire") { } +public: + boss_saviana_ragefire() : CreatureScript("boss_saviana_ragefire") { } - struct boss_saviana_ragefireAI : public BossAI + struct boss_saviana_ragefireAI : public BossAI + { + boss_saviana_ragefireAI(Creature* creature) : BossAI(creature, DATA_SAVIANA_RAGEFIRE) { - boss_saviana_ragefireAI(Creature* creature) : BossAI(creature, DATA_SAVIANA_RAGEFIRE) + } + + void Reset() + { + BossAI::Reset(); + me->SetReactState(REACT_AGGRESSIVE); + } + + void EnterCombat(Unit* who) + { + BossAI::EnterCombat(who); + Talk(SAY_AGGRO); + + events.ScheduleEvent(EVENT_ENRAGE, 15000); + events.ScheduleEvent(EVENT_FLAME_BREATH, 10000); + events.ScheduleEvent(EVENT_FLIGHT, 30000); + } + + void JustDied(Unit* killer) + { + BossAI::JustDied(killer); + me->PlayDirectSound(SOUND_ID_DEATH); + } + + void MovementInform(uint32 type, uint32 point) + { + if (type != POINT_MOTION_TYPE && type != EFFECT_MOTION_TYPE) + return; + + switch (point) { + case POINT_FLIGHT: + me->SetFacingTo(4.69f); + events.ScheduleEvent(EVENT_CONFLAGRATION, 1000); + events.ScheduleEvent(EVENT_LAND_BACK, 7000); + Talk(SAY_CONFLAGRATION); + break; + case POINT_LAND: + me->SetDisableGravity(false); + events.ScheduleEvent(EVENT_LAND_GROUND, 500); + break; } + } - void Reset() + void JustReachedHome() + { + BossAI::JustReachedHome(); + me->SetDisableGravity(false); + me->SetHover(false); + } + + void KilledUnit(Unit* /*victim*/) + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) { - BossAI::Reset(); - me->SetReactState(REACT_AGGRESSIVE); + Talk(SAY_KILL); + events.ScheduleEvent(EVENT_KILL_TALK, 6000); } + } - void EnterCombat(Unit* who) + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) { - BossAI::EnterCombat(who); - Talk(SAY_AGGRO); - - events.ScheduleEvent(EVENT_ENRAGE, 15000); - events.ScheduleEvent(EVENT_FLAME_BREATH, 10000); - events.ScheduleEvent(EVENT_FLIGHT, 30000); - } - - void JustDied(Unit* killer) - { - BossAI::JustDied(killer); - me->PlayDirectSound(SOUND_ID_DEATH); - } - - void MovementInform(uint32 type, uint32 point) - { - if (type != POINT_MOTION_TYPE && type != EFFECT_MOTION_TYPE) - return; - - switch (point) - { - case POINT_FLIGHT: - me->SetFacingTo(4.69f); - events.ScheduleEvent(EVENT_CONFLAGRATION, 1000); - events.ScheduleEvent(EVENT_LAND_BACK, 7000); - Talk(SAY_CONFLAGRATION); - break; - case POINT_LAND: - me->SetDisableGravity(false); - events.ScheduleEvent(EVENT_LAND_GROUND, 500); - break; - } - } - - void JustReachedHome() - { - BossAI::JustReachedHome(); - me->SetDisableGravity(false); - me->SetHover(false); - } - - void KilledUnit(Unit* /*victim*/) - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(SAY_KILL); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); - } - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_FLIGHT: + case EVENT_FLIGHT: { me->SetReactState(REACT_PASSIVE); me->AttackStop(); me->SetDisableGravity(true); - me->GetMotionMaster()->MovePoint(POINT_TAKEOFF, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+6.0f, false); + me->GetMotionMaster()->MovePoint(POINT_TAKEOFF, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 6.0f, false); events.ScheduleEvent(EVENT_FLIGHT, 50000); events.DelayEvents(15000); events.ScheduleEvent(EVENT_AIR_MOVEMENT, 2000); break; } - case EVENT_CONFLAGRATION: - me->CastCustomSpell(SPELL_CONFLAGRATION, SPELLVALUE_MAX_TARGETS, RAID_MODE(3, 6, 3, 6), me, true); - break; - case EVENT_ENRAGE: - me->CastSpell(me, SPELL_ENRAGE, false); - Talk(EMOTE_ENRAGED); - events.ScheduleEvent(EVENT_ENRAGE, urand(15000, 20000)); - break; - case EVENT_FLAME_BREATH: - me->CastSpell(me->GetVictim(), SPELL_FLAME_BREATH, false); - events.ScheduleEvent(EVENT_FLAME_BREATH, urand(20000, 30000)); - break; - case EVENT_AIR_MOVEMENT: - me->GetMotionMaster()->MovePoint(POINT_FLIGHT, 3155.51f, 683.844f, 95.0f, false); - break; - case EVENT_LAND_BACK: - me->GetMotionMaster()->MovePoint(POINT_LAND, 3151.07f, 636.443f, 80.0f, false); - break; - case EVENT_LAND_GROUND: - me->SetReactState(REACT_AGGRESSIVE); - if (me->GetVictim()) - me->GetMotionMaster()->MoveChase(me->GetVictim()); - break; - } - - DoMeleeAttackIfReady(); + case EVENT_CONFLAGRATION: + me->CastCustomSpell(SPELL_CONFLAGRATION, SPELLVALUE_MAX_TARGETS, RAID_MODE(3, 6, 3, 6), me, true); + break; + case EVENT_ENRAGE: + me->CastSpell(me, SPELL_ENRAGE, false); + Talk(EMOTE_ENRAGED); + events.ScheduleEvent(EVENT_ENRAGE, urand(15000, 20000)); + break; + case EVENT_FLAME_BREATH: + me->CastSpell(me->GetVictim(), SPELL_FLAME_BREATH, false); + events.ScheduleEvent(EVENT_FLAME_BREATH, urand(20000, 30000)); + break; + case EVENT_AIR_MOVEMENT: + me->GetMotionMaster()->MovePoint(POINT_FLIGHT, 3155.51f, 683.844f, 95.0f, false); + break; + case EVENT_LAND_BACK: + me->GetMotionMaster()->MovePoint(POINT_LAND, 3151.07f, 636.443f, 80.0f, false); + break; + case EVENT_LAND_GROUND: + me->SetReactState(REACT_AGGRESSIVE); + if (me->GetVictim()) + me->GetMotionMaster()->MoveChase(me->GetVictim()); + break; } - }; - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + DoMeleeAttackIfReady(); } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class spell_saviana_conflagration_init : public SpellScriptLoader { - public: - spell_saviana_conflagration_init() : SpellScriptLoader("spell_saviana_conflagration_init") { } +public: + spell_saviana_conflagration_init() : SpellScriptLoader("spell_saviana_conflagration_init") { } - class spell_saviana_conflagration_init_SpellScript : public SpellScript + class spell_saviana_conflagration_init_SpellScript : public SpellScript + { + PrepareSpellScript(spell_saviana_conflagration_init_SpellScript); + + void HandleDummy(SpellEffIndex effIndex) { - PrepareSpellScript(spell_saviana_conflagration_init_SpellScript); - - void HandleDummy(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetCaster()->CastSpell(GetHitUnit(), SPELL_FLAME_BEACON, true); - GetCaster()->CastSpell(GetHitUnit(), SPELL_CONFLAGRATION_MISSLE, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_saviana_conflagration_init_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_saviana_conflagration_init_SpellScript(); + PreventHitDefaultEffect(effIndex); + GetCaster()->CastSpell(GetHitUnit(), SPELL_FLAME_BEACON, true); + GetCaster()->CastSpell(GetHitUnit(), SPELL_CONFLAGRATION_MISSLE, true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_saviana_conflagration_init_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_saviana_conflagration_init_SpellScript(); + } }; class spell_saviana_conflagration_throwback : public SpellScriptLoader { - public: - spell_saviana_conflagration_throwback() : SpellScriptLoader("spell_saviana_conflagration_throwback") { } +public: + spell_saviana_conflagration_throwback() : SpellScriptLoader("spell_saviana_conflagration_throwback") { } - class spell_saviana_conflagration_throwback_SpellScript : public SpellScript + class spell_saviana_conflagration_throwback_SpellScript : public SpellScript + { + PrepareSpellScript(spell_saviana_conflagration_throwback_SpellScript); + + void HandleScript(SpellEffIndex effIndex) { - PrepareSpellScript(spell_saviana_conflagration_throwback_SpellScript); - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetHitUnit()->CastSpell(GetCaster(), uint32(GetEffectValue()), true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_saviana_conflagration_throwback_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_saviana_conflagration_throwback_SpellScript(); + PreventHitDefaultEffect(effIndex); + GetHitUnit()->CastSpell(GetCaster(), uint32(GetEffectValue()), true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_saviana_conflagration_throwback_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_saviana_conflagration_throwback_SpellScript(); + } }; void AddSC_boss_saviana_ragefire() diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp index eaca5f612..0d878e245 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp @@ -25,285 +25,285 @@ DoorData const doorData[] = class instance_ruby_sanctum : public InstanceMapScript { - public: - instance_ruby_sanctum() : InstanceMapScript("instance_ruby_sanctum", 724) { } +public: + instance_ruby_sanctum() : InstanceMapScript("instance_ruby_sanctum", 724) { } - struct instance_ruby_sanctum_InstanceMapScript : public InstanceScript + struct instance_ruby_sanctum_InstanceMapScript : public InstanceScript + { + instance_ruby_sanctum_InstanceMapScript(InstanceMap* map) : InstanceScript(map) { - instance_ruby_sanctum_InstanceMapScript(InstanceMap* map) : InstanceScript(map) - { - SetBossNumber(MAX_ENCOUNTERS); - LoadDoorData(doorData); + SetBossNumber(MAX_ENCOUNTERS); + LoadDoorData(doorData); - BaltharusTheWarbornGUID = 0; - XerestraszaGUID = 0; - GeneralZarithrianGUID = 0; - memset(ZarithrianSpawnStalkerGUID, 0, 2 * sizeof(uint64)); + BaltharusTheWarbornGUID = 0; + XerestraszaGUID = 0; + GeneralZarithrianGUID = 0; + memset(ZarithrianSpawnStalkerGUID, 0, 2 * sizeof(uint64)); - HalionGUID = 0; - TwilightHalionGUID = 0; - OrbCarrierGUID = 0; - HalionControllerGUID = 0; - FlameRingGUID = 0; - } - - void OnPlayerEnter(Player* /*player*/) - { - if (GetBossState(DATA_HALION_INTRO_DONE) != DONE && GetBossState(DATA_GENERAL_ZARITHRIAN) == DONE) - { - instance->LoadGrid(3156.0f, 537.0f); - if (Creature* halionController = instance->GetCreature(HalionControllerGUID)) - halionController->AI()->DoAction(ACTION_INTRO_HALION); - } - } - - void OnCreatureCreate(Creature* creature) - { - switch (creature->GetEntry()) - { - case NPC_BALTHARUS_THE_WARBORN: - BaltharusTheWarbornGUID = creature->GetGUID(); - break; - case NPC_XERESTRASZA: - XerestraszaGUID = creature->GetGUID(); - break; - case NPC_GENERAL_ZARITHRIAN: - GeneralZarithrianGUID = creature->GetGUID(); - break; - case NPC_ZARITHRIAN_SPAWN_STALKER: - if (!ZarithrianSpawnStalkerGUID[0]) - ZarithrianSpawnStalkerGUID[0] = creature->GetGUID(); - else - ZarithrianSpawnStalkerGUID[1] = creature->GetGUID(); - break; - case NPC_HALION: - HalionGUID = creature->GetGUID(); - break; - case NPC_TWILIGHT_HALION: - TwilightHalionGUID = creature->GetGUID(); - break; - case NPC_HALION_CONTROLLER: - HalionControllerGUID = creature->GetGUID(); - break; - case NPC_ORB_CARRIER: - OrbCarrierGUID = creature->GetGUID(); - break; - - case NPC_LIVING_INFERNO: - case NPC_LIVING_EMBER: - case NPC_METEOR_STRIKE_NORTH: - case NPC_METEOR_STRIKE_SOUTH: - case NPC_METEOR_STRIKE_EAST: - case NPC_METEOR_STRIKE_WEST: - case NPC_METEOR_STRIKE_FLAME: - case NPC_COMBUSTION: - case NPC_CONSUMPTION: - if (Creature* halion = instance->GetCreature(HalionGUID)) - halion->AI()->JustSummoned(creature); - break; - - } - } - - void OnGameObjectCreate(GameObject* go) - { - switch (go->GetEntry()) - { - case GO_FIRE_FIELD: - case GO_FLAME_WALLS: - case GO_BURNING_TREE_1: - case GO_BURNING_TREE_2: - case GO_BURNING_TREE_3: - case GO_BURNING_TREE_4: - case GO_TWILIGHT_FLAME_RING: - AddDoor(go, true); - break; - case GO_FLAME_RING: - FlameRingGUID = go->GetGUID(); - break; - } - } - - void OnGameObjectRemove(GameObject* go) - { - switch (go->GetEntry()) - { - case GO_FIRE_FIELD: - case GO_FLAME_WALLS: - case GO_BURNING_TREE_1: - case GO_BURNING_TREE_2: - case GO_BURNING_TREE_3: - case GO_BURNING_TREE_4: - AddDoor(go, false); - break; - } - } - - uint64 GetData64(uint32 type) const - { - switch (type) - { - case NPC_BALTHARUS_THE_WARBORN: - return BaltharusTheWarbornGUID; - case NPC_XERESTRASZA: - return XerestraszaGUID; - case NPC_GENERAL_ZARITHRIAN: - return GeneralZarithrianGUID; - case DATA_ZARITHRIAN_SPAWN_STALKER_1: - case DATA_ZARITHRIAN_SPAWN_STALKER_2: - return ZarithrianSpawnStalkerGUID[type - DATA_ZARITHRIAN_SPAWN_STALKER_1]; - case NPC_HALION_CONTROLLER: - return HalionControllerGUID; - case NPC_HALION: - return HalionGUID; - case NPC_TWILIGHT_HALION: - return TwilightHalionGUID; - case NPC_ORB_CARRIER: - return OrbCarrierGUID; - - case GO_FLAME_RING: - return FlameRingGUID; - } - - return 0; - } - - bool SetBossState(uint32 type, EncounterState state) - { - if (!InstanceScript::SetBossState(type, state)) - return false; - - switch (type) - { - case DATA_SAVIANA_RAGEFIRE: - case DATA_BALTHARUS_THE_WARBORN: - if (GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE && GetBossState(DATA_SAVIANA_RAGEFIRE) == DONE) - if (Creature* zarithrian = instance->GetCreature(GeneralZarithrianGUID)) - zarithrian->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NOT_SELECTABLE); - break; - case DATA_GENERAL_ZARITHRIAN: - if (state == DONE) - if (Creature* halionController = instance->GetCreature(HalionControllerGUID)) - halionController->AI()->DoAction(ACTION_INTRO_HALION); - break; - case DATA_HALION: - DoUpdateWorldState(WORLDSTATE_CORPOREALITY_TOGGLE, 0); - DoUpdateWorldState(WORLDSTATE_CORPOREALITY_TWILIGHT, 0); - DoUpdateWorldState(WORLDSTATE_CORPOREALITY_MATERIAL, 0); - HandleGameObject(FlameRingGUID, true); - break; - } - - return true; - } - - std::string GetSaveData() - { - OUT_SAVE_INST_DATA; - - std::ostringstream saveStream; - saveStream << "R S " << GetBossSaveData(); - - OUT_SAVE_INST_DATA_COMPLETE; - return saveStream.str(); - } - - void FillInitialWorldStates(WorldPacket& data) - { - data << uint32(WORLDSTATE_CORPOREALITY_MATERIAL) << uint32(50); - data << uint32(WORLDSTATE_CORPOREALITY_TWILIGHT) << uint32(50); - data << uint32(WORLDSTATE_CORPOREALITY_TOGGLE) << uint32(0); - } - - void Load(char const* str) - { - 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 == 'R' && dataHead2 == 'S') - { - for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) - { - uint32 tmpState; - loadStream >> tmpState; - if (tmpState == IN_PROGRESS || tmpState > SPECIAL) - tmpState = NOT_STARTED; - - SetBossState(i, EncounterState(tmpState)); - } - - // Xinef: additional check - if (GetBossState(DATA_HALION_INTRO_DONE) != DONE) - { - SetBossState(DATA_HALION_INTRO1, NOT_STARTED); - SetBossState(DATA_HALION_INTRO2, NOT_STARTED); - } - } - else - OUT_LOAD_INST_DATA_FAIL; - - OUT_LOAD_INST_DATA_COMPLETE; - } - - protected: - uint64 BaltharusTheWarbornGUID; - uint64 XerestraszaGUID; - uint64 GeneralZarithrianGUID; - uint64 ZarithrianSpawnStalkerGUID[2]; - - uint64 HalionGUID; - uint64 TwilightHalionGUID; - uint64 HalionControllerGUID; - uint64 OrbCarrierGUID; - uint64 FlameRingGUID; - }; - - InstanceScript* GetInstanceScript(InstanceMap* map) const - { - return new instance_ruby_sanctum_InstanceMapScript(map); + HalionGUID = 0; + TwilightHalionGUID = 0; + OrbCarrierGUID = 0; + HalionControllerGUID = 0; + FlameRingGUID = 0; } + + void OnPlayerEnter(Player* /*player*/) + { + if (GetBossState(DATA_HALION_INTRO_DONE) != DONE && GetBossState(DATA_GENERAL_ZARITHRIAN) == DONE) + { + instance->LoadGrid(3156.0f, 537.0f); + if (Creature* halionController = instance->GetCreature(HalionControllerGUID)) + halionController->AI()->DoAction(ACTION_INTRO_HALION); + } + } + + void OnCreatureCreate(Creature* creature) + { + switch (creature->GetEntry()) + { + case NPC_BALTHARUS_THE_WARBORN: + BaltharusTheWarbornGUID = creature->GetGUID(); + break; + case NPC_XERESTRASZA: + XerestraszaGUID = creature->GetGUID(); + break; + case NPC_GENERAL_ZARITHRIAN: + GeneralZarithrianGUID = creature->GetGUID(); + break; + case NPC_ZARITHRIAN_SPAWN_STALKER: + if (!ZarithrianSpawnStalkerGUID[0]) + ZarithrianSpawnStalkerGUID[0] = creature->GetGUID(); + else + ZarithrianSpawnStalkerGUID[1] = creature->GetGUID(); + break; + case NPC_HALION: + HalionGUID = creature->GetGUID(); + break; + case NPC_TWILIGHT_HALION: + TwilightHalionGUID = creature->GetGUID(); + break; + case NPC_HALION_CONTROLLER: + HalionControllerGUID = creature->GetGUID(); + break; + case NPC_ORB_CARRIER: + OrbCarrierGUID = creature->GetGUID(); + break; + + case NPC_LIVING_INFERNO: + case NPC_LIVING_EMBER: + case NPC_METEOR_STRIKE_NORTH: + case NPC_METEOR_STRIKE_SOUTH: + case NPC_METEOR_STRIKE_EAST: + case NPC_METEOR_STRIKE_WEST: + case NPC_METEOR_STRIKE_FLAME: + case NPC_COMBUSTION: + case NPC_CONSUMPTION: + if (Creature* halion = instance->GetCreature(HalionGUID)) + halion->AI()->JustSummoned(creature); + break; + + } + } + + void OnGameObjectCreate(GameObject* go) + { + switch (go->GetEntry()) + { + case GO_FIRE_FIELD: + case GO_FLAME_WALLS: + case GO_BURNING_TREE_1: + case GO_BURNING_TREE_2: + case GO_BURNING_TREE_3: + case GO_BURNING_TREE_4: + case GO_TWILIGHT_FLAME_RING: + AddDoor(go, true); + break; + case GO_FLAME_RING: + FlameRingGUID = go->GetGUID(); + break; + } + } + + void OnGameObjectRemove(GameObject* go) + { + switch (go->GetEntry()) + { + case GO_FIRE_FIELD: + case GO_FLAME_WALLS: + case GO_BURNING_TREE_1: + case GO_BURNING_TREE_2: + case GO_BURNING_TREE_3: + case GO_BURNING_TREE_4: + AddDoor(go, false); + break; + } + } + + uint64 GetData64(uint32 type) const + { + switch (type) + { + case NPC_BALTHARUS_THE_WARBORN: + return BaltharusTheWarbornGUID; + case NPC_XERESTRASZA: + return XerestraszaGUID; + case NPC_GENERAL_ZARITHRIAN: + return GeneralZarithrianGUID; + case DATA_ZARITHRIAN_SPAWN_STALKER_1: + case DATA_ZARITHRIAN_SPAWN_STALKER_2: + return ZarithrianSpawnStalkerGUID[type - DATA_ZARITHRIAN_SPAWN_STALKER_1]; + case NPC_HALION_CONTROLLER: + return HalionControllerGUID; + case NPC_HALION: + return HalionGUID; + case NPC_TWILIGHT_HALION: + return TwilightHalionGUID; + case NPC_ORB_CARRIER: + return OrbCarrierGUID; + + case GO_FLAME_RING: + return FlameRingGUID; + } + + return 0; + } + + bool SetBossState(uint32 type, EncounterState state) + { + if (!InstanceScript::SetBossState(type, state)) + return false; + + switch (type) + { + case DATA_SAVIANA_RAGEFIRE: + case DATA_BALTHARUS_THE_WARBORN: + if (GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE && GetBossState(DATA_SAVIANA_RAGEFIRE) == DONE) + if (Creature* zarithrian = instance->GetCreature(GeneralZarithrianGUID)) + zarithrian->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NOT_SELECTABLE); + break; + case DATA_GENERAL_ZARITHRIAN: + if (state == DONE) + if (Creature* halionController = instance->GetCreature(HalionControllerGUID)) + halionController->AI()->DoAction(ACTION_INTRO_HALION); + break; + case DATA_HALION: + DoUpdateWorldState(WORLDSTATE_CORPOREALITY_TOGGLE, 0); + DoUpdateWorldState(WORLDSTATE_CORPOREALITY_TWILIGHT, 0); + DoUpdateWorldState(WORLDSTATE_CORPOREALITY_MATERIAL, 0); + HandleGameObject(FlameRingGUID, true); + break; + } + + return true; + } + + std::string GetSaveData() + { + OUT_SAVE_INST_DATA; + + std::ostringstream saveStream; + saveStream << "R S " << GetBossSaveData(); + + OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); + } + + void FillInitialWorldStates(WorldPacket& data) + { + data << uint32(WORLDSTATE_CORPOREALITY_MATERIAL) << uint32(50); + data << uint32(WORLDSTATE_CORPOREALITY_TWILIGHT) << uint32(50); + data << uint32(WORLDSTATE_CORPOREALITY_TOGGLE) << uint32(0); + } + + void Load(char const* str) + { + 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 == 'R' && dataHead2 == 'S') + { + for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) + { + uint32 tmpState; + loadStream >> tmpState; + if (tmpState == IN_PROGRESS || tmpState > SPECIAL) + tmpState = NOT_STARTED; + + SetBossState(i, EncounterState(tmpState)); + } + + // Xinef: additional check + if (GetBossState(DATA_HALION_INTRO_DONE) != DONE) + { + SetBossState(DATA_HALION_INTRO1, NOT_STARTED); + SetBossState(DATA_HALION_INTRO2, NOT_STARTED); + } + } + else + OUT_LOAD_INST_DATA_FAIL; + + OUT_LOAD_INST_DATA_COMPLETE; + } + + protected: + uint64 BaltharusTheWarbornGUID; + uint64 XerestraszaGUID; + uint64 GeneralZarithrianGUID; + uint64 ZarithrianSpawnStalkerGUID[2]; + + uint64 HalionGUID; + uint64 TwilightHalionGUID; + uint64 HalionControllerGUID; + uint64 OrbCarrierGUID; + uint64 FlameRingGUID; + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_ruby_sanctum_InstanceMapScript(map); + } }; class spell_ruby_sanctum_rallying_shout : public SpellScriptLoader { - public: - spell_ruby_sanctum_rallying_shout() : SpellScriptLoader("spell_ruby_sanctum_rallying_shout") { } +public: + spell_ruby_sanctum_rallying_shout() : SpellScriptLoader("spell_ruby_sanctum_rallying_shout") { } - class spell_ruby_sanctum_rallying_shout_SpellScript : public SpellScript + class spell_ruby_sanctum_rallying_shout_SpellScript : public SpellScript + { + PrepareSpellScript(spell_ruby_sanctum_rallying_shout_SpellScript); + + void CountAllies() { - PrepareSpellScript(spell_ruby_sanctum_rallying_shout_SpellScript); + uint32 count = GetSpell()->GetUniqueTargetInfo()->size(); + if (count == GetCaster()->GetAuraCount(SPELL_RALLY)) + return; - void CountAllies() - { - uint32 count = GetSpell()->GetUniqueTargetInfo()->size(); - if (count == GetCaster()->GetAuraCount(SPELL_RALLY)) - return; - - GetCaster()->RemoveAurasDueToSpell(SPELL_RALLY); - if (count > 0) - GetCaster()->CastCustomSpell(SPELL_RALLY, SPELLVALUE_AURA_STACK, count, GetCaster(), true); - } - - void Register() - { - AfterHit += SpellHitFn(spell_ruby_sanctum_rallying_shout_SpellScript::CountAllies); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_ruby_sanctum_rallying_shout_SpellScript(); + GetCaster()->RemoveAurasDueToSpell(SPELL_RALLY); + if (count > 0) + GetCaster()->CastCustomSpell(SPELL_RALLY, SPELLVALUE_AURA_STACK, count, GetCaster(), true); } + + void Register() + { + AfterHit += SpellHitFn(spell_ruby_sanctum_rallying_shout_SpellScript::CountAllies); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_ruby_sanctum_rallying_shout_SpellScript(); + } }; void AddSC_instance_ruby_sanctum() diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h index 085fb12ff..5eb3e0905 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h @@ -23,7 +23,7 @@ enum DataTypes DATA_HALION_INTRO2 = 4, DATA_HALION_INTRO_DONE = 5, DATA_HALION = 6, - + MAX_ENCOUNTERS = 7, // Etc diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp index 26793fc28..47f36d8ad 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp @@ -95,18 +95,18 @@ public: if( pInstance ) pInstance->SetData(BOSS_ARGENT_CHALLENGE, NOT_STARTED); } - + void MovementInform(uint32 type, uint32 id) { if( type == POINT_MOTION_TYPE && id == 1 ) - me->SetFacingTo(3*M_PI/2); + me->SetFacingTo(3 * M_PI / 2); } void KilledUnit(Unit* who) { if( who->GetTypeId() == TYPEID_PLAYER ) { - if( urand(0,1) ) + if( urand(0, 1) ) Talk(TEXT_EADRIC_SLAIN_1); else Talk(TEXT_EADRIC_SLAIN_2); @@ -130,7 +130,7 @@ public: me->CastSpell(me, 68197, true); } - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) { if( damage >= me->GetHealth() ) { @@ -226,18 +226,18 @@ public: if( pInstance ) pInstance->SetData(BOSS_ARGENT_CHALLENGE, NOT_STARTED); } - + void MovementInform(uint32 type, uint32 id) { if( type == POINT_MOTION_TYPE && id == 1 ) - me->SetFacingTo(3*M_PI/2); + me->SetFacingTo(3 * M_PI / 2); } void KilledUnit(Unit* who) { if( who->GetTypeId() == TYPEID_PLAYER ) { - if( urand(0,1) ) + if( urand(0, 1) ) Talk(TEXT_PALETRESS_SLAIN_1); else Talk(TEXT_PALETRESS_SLAIN_2); @@ -247,8 +247,8 @@ public: void EnterCombat(Unit* /*who*/) { events.Reset(); - events.ScheduleEvent(EVENT_SPELL_HOLY_FIRE, urand(9000,12000)); - events.ScheduleEvent(EVENT_SPELL_SMITE, urand(2000,3000)); + events.ScheduleEvent(EVENT_SPELL_HOLY_FIRE, urand(9000, 12000)); + events.ScheduleEvent(EVENT_SPELL_SMITE, urand(2000, 3000)); me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); Talk(TEXT_PALETRESS_AGGRO); if( pInstance ) @@ -274,7 +274,7 @@ public: } } - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) { //if( me->HasAura(SPELL_SHIELD) ) // return; @@ -311,8 +311,8 @@ public: void SummonMemory() { - uint8 uiRandom = urand(0,25); - uint32 uiSpells[26] = {66704,66705,66706,66707,66709,66710,66711,66712,66713,66714,66715,66708,66708,66691,66692,66694,66695,66696,66697,66698,66699,66700,66701,66702,66703,66543}; + uint8 uiRandom = urand(0, 25); + uint32 uiSpells[26] = {66704, 66705, 66706, 66707, 66709, 66710, 66711, 66712, 66713, 66714, 66715, 66708, 66708, 66691, 66692, 66694, 66695, 66696, 66697, 66698, 66699, 66700, 66701, 66702, 66703, 66543}; me->CastSpell(me, uiSpells[uiRandom], true); } @@ -332,7 +332,7 @@ public: me->CastSpell((Unit*)NULL, SPELL_SUMMON_MEMORY, false); SummonMemory(); me->CastSpell((Unit*)NULL, SPELL_CONFESS, false); - events.ScheduleEvent(EVENT_SPELL_RENEW, urand(6000,8000)); + events.ScheduleEvent(EVENT_SPELL_RENEW, urand(6000, 8000)); summoned = true; return; } @@ -347,12 +347,12 @@ public: case EVENT_SPELL_SMITE: if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true) ) me->CastSpell(target, SPELL_SMITE, false); - events.RepeatEvent(urand(3000,4000)); + events.RepeatEvent(urand(3000, 4000)); break; case EVENT_SPELL_HOLY_FIRE: if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true) ) me->CastSpell(target, SPELL_HOLY_FIRE, false); - events.RepeatEvent(urand(9000,12000)); + events.RepeatEvent(urand(9000, 12000)); break; case EVENT_SPELL_RENEW: if( !MemoryGUID ) @@ -360,12 +360,12 @@ public: events.PopEvent(); break; } - if( urand(0,1) ) + if( urand(0, 1) ) me->CastSpell(me, SPELL_RENEW, false); else if( Creature* memory = ObjectAccessor::GetCreature(*me, MemoryGUID) ) if( memory->IsAlive() ) me->CastSpell(memory, SPELL_RENEW, false); - events.RepeatEvent(urand(15000,17000)); + events.RepeatEvent(urand(15000, 17000)); break; } @@ -436,7 +436,7 @@ public: me->SetReactState(REACT_AGGRESSIVE); events.ScheduleEvent(EVENT_SPELL_OLD_WOUNDS, 8000); events.ScheduleEvent(EVENT_SPELL_SHADOWS_PAST, 4000); - events.ScheduleEvent(EVENT_SPELL_WAKING_NIGHTMARE, urand(20000,30000)); + events.ScheduleEvent(EVENT_SPELL_WAKING_NIGHTMARE, urand(20000, 30000)); events.PopEvent(); break; case EVENT_SPELL_OLD_WOUNDS: @@ -447,7 +447,7 @@ public: case EVENT_SPELL_SHADOWS_PAST: if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true) ) me->CastSpell(target, SPELL_SHADOWS_PAST, false); - events.RepeatEvent(urand(15000,20000)); + events.RepeatEvent(urand(15000, 20000)); break; case EVENT_SPELL_WAKING_NIGHTMARE: me->CastSpell(me, SPELL_WAKING_NIGHTMARE, false); @@ -471,7 +471,7 @@ enum ArgentSoldierSpells // monk SPELL_FLURRY_OF_BLOWS = 67233, SPELL_PUMMEL = 67235, - SPELL_DIVINE_SHIELD_H = 67251, + SPELL_DIVINE_SHIELD_H = 67251, SPELL_FINAL_MEDITATION_H = 67255, // priestess @@ -561,13 +561,13 @@ public: switch( uiType ) { case 0: - AddWaypoint(1,716.321f,647.047f,411.93f); + AddWaypoint(1, 716.321f, 647.047f, 411.93f); break; case 1: - AddWaypoint(1,742.44f,650.29f,411.79f); + AddWaypoint(1, 742.44f, 650.29f, 411.79f); break; case 2: - AddWaypoint(1,772.6314f,651.7f,411.93f); + AddWaypoint(1, 772.6314f, 651.7f, 411.93f); break; } break; @@ -575,13 +575,13 @@ public: switch( uiType ) { case 0: - AddWaypoint(1,717.86f,649.0f,411.923f); + AddWaypoint(1, 717.86f, 649.0f, 411.923f); break; case 1: - AddWaypoint(1,746.73f,650.24f,411.56f); + AddWaypoint(1, 746.73f, 650.24f, 411.56f); break; case 2: - AddWaypoint(1,775.567f,648.26f,411.93f); + AddWaypoint(1, 775.567f, 648.26f, 411.93f); break; } break; @@ -589,19 +589,19 @@ public: switch( uiType ) { case 0: - AddWaypoint(1,719.872f,650.94f,411.93f); + AddWaypoint(1, 719.872f, 650.94f, 411.93f); break; case 1: - AddWaypoint(1,750.72f,650.20f,411.77f); + AddWaypoint(1, 750.72f, 650.20f, 411.77f); break; case 2: - AddWaypoint(1,777.78f,645.70f,411.93f); + AddWaypoint(1, 777.78f, 645.70f, 411.93f); break; } break; } - Start(false,true,0); + Start(false, true, 0); uiWaypoint = uiType; } @@ -610,7 +610,7 @@ public: if( bCheck && damage >= me->GetHealth() ) { bCheck = false; - damage = me->GetHealth()-1; + damage = me->GetHealth() - 1; events.DelayEvents(10000); me->CastSpell(me, SPELL_DIVINE_SHIELD_H, true); me->CastSpell((Unit*)NULL, SPELL_FINAL_MEDITATION_H, true); @@ -628,19 +628,19 @@ public: bCheck = true; break; case NPC_PRIESTESS: - events.RescheduleEvent(EVENT_PRIESTESS_SPELL_HOLY_SMITE, urand(5000,8000)); - events.RescheduleEvent(EVENT_PRIESTESS_SPELL_SHADOW_WORD_PAIN, urand(3000,6000)); - events.RescheduleEvent(EVENT_PRIESTESS_SPELL_FOUNTAIN_OF_LIGHT, urand(8000,15000)); + events.RescheduleEvent(EVENT_PRIESTESS_SPELL_HOLY_SMITE, urand(5000, 8000)); + events.RescheduleEvent(EVENT_PRIESTESS_SPELL_SHADOW_WORD_PAIN, urand(3000, 6000)); + events.RescheduleEvent(EVENT_PRIESTESS_SPELL_FOUNTAIN_OF_LIGHT, urand(8000, 15000)); if( IsHeroic() ) events.RescheduleEvent(EVENT_PRIESTESS_SPELL_MIND_CONTROL_H, 12000); break; case NPC_ARGENT_LIGHTWIELDER: - events.RescheduleEvent(EVENT_LIGHTWIELDER_SPELL_BLAZING_LIGHT, urand(12000,15000)); - events.RescheduleEvent(EVENT_LIGHTWIELDER_SPELL_CLEAVE, urand(3000,5000)); + events.RescheduleEvent(EVENT_LIGHTWIELDER_SPELL_BLAZING_LIGHT, urand(12000, 15000)); + events.RescheduleEvent(EVENT_LIGHTWIELDER_SPELL_CLEAVE, urand(3000, 5000)); if( IsHeroic() ) - events.RescheduleEvent(EVENT_LIGHTWIELDER_SPELL_UNBALANCING_STRIKE_H, urand(8000,12000)); + events.RescheduleEvent(EVENT_LIGHTWIELDER_SPELL_UNBALANCING_STRIKE_H, urand(8000, 12000)); break; - } + } } void UpdateAI(uint32 diff) @@ -662,32 +662,32 @@ public: case EVENT_MONK_SPELL_FLURRY_OF_BLOWS: me->CastSpell(me, SPELL_FLURRY_OF_BLOWS, false); - events.RepeatEvent(urand(12000,18000)); + events.RepeatEvent(urand(12000, 18000)); break; case EVENT_MONK_SPELL_PUMMEL: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_PUMMEL, false); - events.RepeatEvent(urand(8000,11000)); + events.RepeatEvent(urand(8000, 11000)); break; case EVENT_PRIESTESS_SPELL_HOLY_SMITE: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_HOLY_SMITE, false); - events.RepeatEvent(urand(6000,8000)); + events.RepeatEvent(urand(6000, 8000)); break; case EVENT_PRIESTESS_SPELL_SHADOW_WORD_PAIN: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_SHADOW_WORD_PAIN, false); - events.RepeatEvent(urand(12000,15000)); + events.RepeatEvent(urand(12000, 15000)); break; case EVENT_PRIESTESS_SPELL_FOUNTAIN_OF_LIGHT: me->CastSpell((Unit*)NULL, SPELL_FOUNTAIN_OF_LIGHT, false); - events.RepeatEvent(urand(35000,45000)); + events.RepeatEvent(urand(35000, 45000)); break; case EVENT_PRIESTESS_SPELL_MIND_CONTROL_H: if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true) ) me->CastSpell(target, SPELL_MIND_CONTROL_H, false); - events.RepeatEvent(urand(22000,30000)); + events.RepeatEvent(urand(22000, 30000)); break; case EVENT_LIGHTWIELDER_SPELL_BLAZING_LIGHT: @@ -696,18 +696,18 @@ public: if( !target ) target = me; me->CastSpell(target, SPELL_BLAZING_LIGHT, false); - events.RepeatEvent(urand(8000,12000)); + events.RepeatEvent(urand(8000, 12000)); } break; case EVENT_LIGHTWIELDER_SPELL_CLEAVE: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false); - events.RepeatEvent(urand(6000,8000)); + events.RepeatEvent(urand(6000, 8000)); break; case EVENT_LIGHTWIELDER_SPELL_UNBALANCING_STRIKE_H: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_UNBALANCING_STRIKE_H, false); - events.RepeatEvent(urand(12000,15000)); + events.RepeatEvent(urand(12000, 15000)); break; } @@ -730,103 +730,103 @@ public: class spell_eadric_radiance : public SpellScriptLoader { - public: - spell_eadric_radiance() : SpellScriptLoader("spell_eadric_radiance") { } +public: + spell_eadric_radiance() : SpellScriptLoader("spell_eadric_radiance") { } - class spell_eadric_radiance_SpellScript : public SpellScript + class spell_eadric_radiance_SpellScript : public SpellScript + { + PrepareSpellScript(spell_eadric_radiance_SpellScript); + + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_eadric_radiance_SpellScript); + std::list tmplist; + for( std::list::const_iterator itr = targets.begin(); itr != targets.end(); ++itr) + if( (*itr)->ToUnit()->HasInArc(M_PI, GetCaster()) ) + tmplist.push_back(*itr); - void FilterTargets(std::list& targets) - { - std::list tmplist; - for( std::list::const_iterator itr = targets.begin(); itr != targets.end(); ++itr) - if( (*itr)->ToUnit()->HasInArc(M_PI, GetCaster()) ) - tmplist.push_back(*itr); - - targets.clear(); - for( std::list::iterator itr = tmplist.begin(); itr != tmplist.end(); ++itr ) - targets.push_back(*itr); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_eadric_radiance_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_eadric_radiance_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_eadric_radiance_SpellScript(); + targets.clear(); + for( std::list::iterator itr = tmplist.begin(); itr != tmplist.end(); ++itr ) + targets.push_back(*itr); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_eadric_radiance_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_eadric_radiance_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_eadric_radiance_SpellScript(); + } }; class spell_toc5_light_rain : public SpellScriptLoader { - public: - spell_toc5_light_rain() : SpellScriptLoader("spell_toc5_light_rain") { } +public: + spell_toc5_light_rain() : SpellScriptLoader("spell_toc5_light_rain") { } - class spell_toc5_light_rain_SpellScript : public SpellScript + class spell_toc5_light_rain_SpellScript : public SpellScript + { + PrepareSpellScript(spell_toc5_light_rain_SpellScript); + + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_toc5_light_rain_SpellScript); - - void FilterTargets(std::list& targets) + for( std::list::iterator itr = targets.begin(); itr != targets.end(); ) { - for( std::list::iterator itr = targets.begin(); itr != targets.end(); ) - { - if ((*itr)->GetTypeId() == TYPEID_UNIT) - if ((*itr)->ToCreature()->GetEntry() == NPC_FOUNTAIN_OF_LIGHT) - { - targets.erase(itr); - itr = targets.begin(); - continue; - } - ++itr; - } + if ((*itr)->GetTypeId() == TYPEID_UNIT) + if ((*itr)->ToCreature()->GetEntry() == NPC_FOUNTAIN_OF_LIGHT) + { + targets.erase(itr); + itr = targets.begin(); + continue; + } + ++itr; } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_toc5_light_rain_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_toc5_light_rain_SpellScript(); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_toc5_light_rain_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_toc5_light_rain_SpellScript(); + } }; class spell_reflective_shield : public SpellScriptLoader { - public: - spell_reflective_shield() : SpellScriptLoader("spell_reflective_shield") { } +public: + spell_reflective_shield() : SpellScriptLoader("spell_reflective_shield") { } - class spell_reflective_shield_AuraScript : public AuraScript + class spell_reflective_shield_AuraScript : public AuraScript + { + PrepareAuraScript(spell_reflective_shield_AuraScript) + + void HandleAfterEffectAbsorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount) { - PrepareAuraScript(spell_reflective_shield_AuraScript) - - void HandleAfterEffectAbsorb(AuraEffect * /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount) - { - if( Unit* attacker = dmgInfo.GetAttacker() ) - if( GetOwner() && attacker->GetGUID() != GetOwner()->GetGUID() ) - { - int32 damage = (int32)(absorbAmount*0.25f); - GetOwner()->ToUnit()->CastCustomSpell(attacker, 33619, &damage, nullptr, nullptr, true); - } - } - - void Register() - { - AfterEffectAbsorb += AuraEffectAbsorbFn(spell_reflective_shield_AuraScript::HandleAfterEffectAbsorb, EFFECT_0); - } - }; - - AuraScript *GetAuraScript() const - { - return new spell_reflective_shield_AuraScript(); + if( Unit* attacker = dmgInfo.GetAttacker() ) + if( GetOwner() && attacker->GetGUID() != GetOwner()->GetGUID() ) + { + int32 damage = (int32)(absorbAmount * 0.25f); + GetOwner()->ToUnit()->CastCustomSpell(attacker, 33619, &damage, nullptr, nullptr, true); + } } + + void Register() + { + AfterEffectAbsorb += AuraEffectAbsorbFn(spell_reflective_shield_AuraScript::HandleAfterEffectAbsorb, EFFECT_0); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_reflective_shield_AuraScript(); + } }; void AddSC_boss_argent_challenge() diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp index 694454085..35aad13da 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp @@ -122,7 +122,7 @@ public: ScriptedAI::EnterEvadeMode(); } - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) { if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) { @@ -163,16 +163,16 @@ public: pInstance->SetData(BOSS_BLACK_KNIGHT, IN_PROGRESS); Talk(TEXT_BK_AGGRO); - me->CastSpell((Unit*)NULL, (pInstance->GetData(DATA_TEAMID_IN_INSTANCE)==TEAM_HORDE ? SPELL_RAISE_DEAD_JAEREN : SPELL_RAISE_DEAD_ARELAS), false); + me->CastSpell((Unit*)NULL, (pInstance->GetData(DATA_TEAMID_IN_INSTANCE) == TEAM_HORDE ? SPELL_RAISE_DEAD_JAEREN : SPELL_RAISE_DEAD_ARELAS), false); if( Creature* announcer = pInstance->instance->GetCreature(pInstance->GetData64(DATA_ANNOUNCER)) ) announcer->DespawnOrUnsummon(); events.Reset(); events.ScheduleEvent(EVENT_ANNOUNCER_SAY_ZOMBIE, 2500); - events.ScheduleEvent(EVENT_SPELL_PLAGUE_STRIKE, urand(7000,9000)); - events.ScheduleEvent(EVENT_SPELL_ICY_TOUCH, urand(3500,7000)); - events.ScheduleEvent(EVENT_SPELL_DEATH_RESPITE, urand(13000,15000)); - events.ScheduleEvent(EVENT_SPELL_OBLITERATE, urand(11000,19000)); + events.ScheduleEvent(EVENT_SPELL_PLAGUE_STRIKE, urand(7000, 9000)); + events.ScheduleEvent(EVENT_SPELL_ICY_TOUCH, urand(3500, 7000)); + events.ScheduleEvent(EVENT_SPELL_DEATH_RESPITE, urand(13000, 15000)); + events.ScheduleEvent(EVENT_SPELL_OBLITERATE, urand(11000, 19000)); } } @@ -184,7 +184,7 @@ public: me->SetHealth(me->GetMaxHealth()); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->SetControlled(false, UNIT_STATE_STUNNED); - + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29); me->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); @@ -200,10 +200,10 @@ public: me->CastSpell(me, SPELL_ARMY_DEAD, false); events.Reset(); - events.ScheduleEvent(EVENT_SPELL_PLAGUE_STRIKE, urand(7000,9000)); - events.ScheduleEvent(EVENT_SPELL_ICY_TOUCH, urand(3500,7000)); - events.ScheduleEvent(EVENT_SPELL_OBLITERATE, urand(11000,19000)); - events.ScheduleEvent(EVENT_SPELL_DESECRATION, urand(2000,3000)); + events.ScheduleEvent(EVENT_SPELL_PLAGUE_STRIKE, urand(7000, 9000)); + events.ScheduleEvent(EVENT_SPELL_ICY_TOUCH, urand(3500, 7000)); + events.ScheduleEvent(EVENT_SPELL_OBLITERATE, urand(11000, 19000)); + events.ScheduleEvent(EVENT_SPELL_DESECRATION, urand(2000, 3000)); break; case 3: me->SetDisplayId(MODEL_GHOST); @@ -244,31 +244,31 @@ public: case EVENT_SPELL_PLAGUE_STRIKE: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_PLAGUE_STRIKE, false); - events.RepeatEvent(urand(10000,12000)); + events.RepeatEvent(urand(10000, 12000)); break; case EVENT_SPELL_ICY_TOUCH: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_ICY_TOUCH, false); - events.RepeatEvent(urand(5000,6000)); + events.RepeatEvent(urand(5000, 6000)); break; case EVENT_SPELL_DEATH_RESPITE: if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true) ) me->CastSpell(target, SPELL_DEATH_RESPITE, false); - events.RepeatEvent(urand(13000,15000)); + events.RepeatEvent(urand(13000, 15000)); break; case EVENT_SPELL_OBLITERATE: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_OBLITERATE, false); - events.RepeatEvent(urand(15000,17000)); + events.RepeatEvent(urand(15000, 17000)); break; case EVENT_SPELL_DESECRATION: if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true) ) me->CastSpell(target, SPELL_DESECRATION, false); - events.RepeatEvent(urand(14000,17000)); + events.RepeatEvent(urand(14000, 17000)); break; case EVENT_SPELL_DEATH_BITE: me->CastSpell((Unit*)NULL, SPELL_DEATH_BITE, false); - events.RepeatEvent(urand(2000,4000)); + events.RepeatEvent(urand(2000, 4000)); break; case EVENT_SPELL_MARKED_DEATH: if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.000000f, true) ) @@ -294,7 +294,7 @@ public: { if( victim->GetTypeId() == TYPEID_PLAYER ) { - if( urand(0,1) ) + if( urand(0, 1) ) Talk(TEXT_BK_SLAIN_1); else Talk(TEXT_BK_SLAIN_2); @@ -312,7 +312,7 @@ public: } }; - CreatureAI* GetAI(Creature *pCreature) const + CreatureAI* GetAI(Creature* pCreature) const { return new boss_black_knightAI (pCreature); } @@ -329,7 +329,7 @@ public: void Reset() { - Start(false,true,0,NULL); + Start(false, true, 0, NULL); SetDespawnAtEnd(true); } @@ -397,7 +397,7 @@ public: events.Reset(); if (me->GetEntry() == NPC_RISEN_JAEREN || me->GetEntry() == NPC_RISEN_ARELAS) events.RescheduleEvent(1, 1000); // leap - events.RescheduleEvent(2, urand(3000,4000)); // claw + events.RescheduleEvent(2, urand(3000, 4000)); // claw } void SpellHit(Unit* /*caster*/, const SpellInfo* spell) @@ -457,7 +457,7 @@ public: case 2: // claw if (Unit* target = me->GetVictim()) me->CastSpell(target, SPELL_CLAW_N, false); - events.RepeatEvent(urand(6000,8000)); + events.RepeatEvent(urand(6000, 8000)); break; } @@ -465,7 +465,7 @@ public: } }; - CreatureAI* GetAI(Creature *pCreature) const + CreatureAI* GetAI(Creature* pCreature) const { return new npc_black_knight_ghoulAI (pCreature); } 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 18cbd880b..c522a1a9f 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp @@ -114,7 +114,7 @@ enum ChampionEvents EVENT_ROGUE_SPELL_EVISCERATE, EVENT_ROGUE_SPELL_FAN_OF_KNIVES, - EVENT_ROGUE_SPELL_POISON_BOTTLE, + EVENT_ROGUE_SPELL_POISON_BOTTLE, EVENT_WARRIOR_SPELL_MORTAL_STRIKE, EVENT_WARRIOR_SPELL_BLADESTORM, @@ -178,7 +178,7 @@ public: { me->RemoveAura(SPELL_PLAYER_VEHICLE_DEFEND); who->RemoveAura(SPELL_PLAYER_VEHICLE_DEFEND); - for (uint8 i=0; i<3; ++i) + for (uint8 i = 0; i < 3; ++i) who->RemoveAura(SPELL_SHIELD_LEVEL_1_VISUAL + i); } } @@ -233,9 +233,9 @@ public: void EnterCombat(Unit* /*who*/) { events.Reset(); - events.ScheduleEvent(EVENT_MOUNT_CHARGE, urand(2500,4000)); - events.ScheduleEvent(EVENT_SHIELD_BREAKER, urand(5000,8000)); - events.ScheduleEvent(EVENT_THRUST, urand(3000,5000)); + events.ScheduleEvent(EVENT_MOUNT_CHARGE, urand(2500, 4000)); + events.ScheduleEvent(EVENT_SHIELD_BREAKER, urand(5000, 8000)); + events.ScheduleEvent(EVENT_THRUST, urand(3000, 5000)); me->CastSpell(me, SPELL_TRAMPLE_AURA, true); } @@ -264,7 +264,7 @@ public: case EVENT_MOUNT_CHARGE: { std::vector LIST; - Map::PlayerList const &pl = me->GetMap()->GetPlayers(); + Map::PlayerList const& pl = me->GetMap()->GetPlayers(); for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr ) if( Player* plr = itr->GetSource() ) { @@ -279,8 +279,8 @@ public: } } if( !LIST.empty() ) - { - uint8 rnd = LIST.size()>1 ? urand(0,LIST.size()-1) : 0; + { + uint8 rnd = LIST.size() > 1 ? urand(0, LIST.size() - 1) : 0; if( Unit* target = ObjectAccessor::GetUnit(*me, LIST.at(rnd)) ) { me->getThreatManager().resetAllAggro(); @@ -289,13 +289,13 @@ public: me->CastSpell(target, SPELL_MINIONS_CHARGE, false); } } - events.RepeatEvent(urand(4500,6000)); + events.RepeatEvent(urand(4500, 6000)); } break; case EVENT_SHIELD_BREAKER: { std::vector LIST; - Map::PlayerList const &pl = me->GetMap()->GetPlayers(); + Map::PlayerList const& pl = me->GetMap()->GetPlayers(); for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr ) if( Player* plr = itr->GetSource() ) { @@ -306,18 +306,18 @@ public: LIST.push_back(mount->GetGUID()); } if( !LIST.empty() ) - { - uint8 rnd = LIST.size()>1 ? urand(0,LIST.size()-1) : 0; + { + uint8 rnd = LIST.size() > 1 ? urand(0, LIST.size() - 1) : 0; if( Unit* target = ObjectAccessor::GetCreature(*me, LIST.at(rnd)) ) me->CastSpell(target, SPELL_NPC_SHIELD_BREAKER, false); } - events.RepeatEvent(urand(6000,8000)); + events.RepeatEvent(urand(6000, 8000)); } break; case EVENT_THRUST: if( me->GetVictim() && me->GetExactDist(me->GetVictim()) <= 5.5f ) me->CastSpell(me->GetVictim(), SPELL_PLAYER_VEHICLE_THRUST, false); - events.RepeatEvent(urand(3000,5000)); + events.RepeatEvent(urand(3000, 5000)); break; } } @@ -351,9 +351,9 @@ public: me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED); events.Reset(); - events.ScheduleEvent(EVENT_MOUNT_CHARGE, urand(2500,4000)); - events.ScheduleEvent(EVENT_SHIELD_BREAKER, urand(5000,8000)); - events.ScheduleEvent(EVENT_THRUST, urand(3000,5000)); + events.ScheduleEvent(EVENT_MOUNT_CHARGE, urand(2500, 4000)); + events.ScheduleEvent(EVENT_SHIELD_BREAKER, urand(5000, 8000)); + events.ScheduleEvent(EVENT_THRUST, urand(3000, 5000)); me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_CHARM, true); me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DISORIENTED, true); @@ -416,9 +416,9 @@ public: case NPC_COLOSOS: // Colosos case NPC_RUNOK: // Runok Wildmane events.RescheduleEvent(EVENT_SHAMAN_SPELL_CHAIN_LIGHTNING, 16000); - events.RescheduleEvent(EVENT_SHAMAN_SPELL_EARTH_SHIELD, urand(30000,35000)); + events.RescheduleEvent(EVENT_SHAMAN_SPELL_EARTH_SHIELD, urand(30000, 35000)); events.RescheduleEvent(EVENT_SHAMAN_SPELL_HEALING_WAVE, 12000); - events.RescheduleEvent(EVENT_SHAMAN_SPELL_HEX_OF_MENDING, urand(20000,25000)); + events.RescheduleEvent(EVENT_SHAMAN_SPELL_HEX_OF_MENDING, urand(20000, 25000)); break; case NPC_JAELYNE: // Jaelyne Evensong case NPC_ZULTORE: // Zul'tore @@ -434,8 +434,8 @@ public: break; case NPC_JACOB: // Marshal Jacob Alerius case NPC_MOKRA: // Mokra the Skullcrusher - events.RescheduleEvent(EVENT_WARRIOR_SPELL_MORTAL_STRIKE, urand(8000,12000)); - events.RescheduleEvent(EVENT_WARRIOR_SPELL_BLADESTORM, urand(15000,20000)); + events.RescheduleEvent(EVENT_WARRIOR_SPELL_MORTAL_STRIKE, urand(8000, 12000)); + events.RescheduleEvent(EVENT_WARRIOR_SPELL_BLADESTORM, urand(15000, 20000)); events.RescheduleEvent(EVENT_WARRIOR_SPELL_INTERCEPT, 7000); //events.RescheduleEvent(EVENT_WARRIOR_SPELL_ROLLING_THROW, x); break; @@ -446,7 +446,7 @@ public: void AddCreatureAddonAuras() { - CreatureAddon const *cainfo = me->GetCreatureAddon(); + CreatureAddon const* cainfo = me->GetCreatureAddon(); if (!cainfo) return; @@ -454,7 +454,7 @@ public: { for (std::vector::const_iterator itr = cainfo->auras.begin(); itr != cainfo->auras.end(); ++itr) { - SpellInfo const *AdditionalSpellInfo = sSpellMgr->GetSpellInfo(*itr); + SpellInfo const* AdditionalSpellInfo = sSpellMgr->GetSpellInfo(*itr); if (!AdditionalSpellInfo) continue; @@ -496,27 +496,27 @@ public: case 0: if (uiData == 0) // 1 == short version { - AddWaypoint(0,747.36f,634.07f,411.572f); - AddWaypoint(1,780.43f,607.15f,411.82f); + AddWaypoint(0, 747.36f, 634.07f, 411.572f); + AddWaypoint(1, 780.43f, 607.15f, 411.82f); } - AddWaypoint(2,785.99f,599.41f,411.92f); - AddWaypoint(3,778.44f,601.64f,411.79f); + AddWaypoint(2, 785.99f, 599.41f, 411.92f); + AddWaypoint(3, 778.44f, 601.64f, 411.79f); break; case 1: if (uiData == 0) // 1 == short version { - AddWaypoint(0,747.35f,634.07f,411.57f); - AddWaypoint(1,768.72f,581.01f,411.92f); + AddWaypoint(0, 747.35f, 634.07f, 411.57f); + AddWaypoint(1, 768.72f, 581.01f, 411.92f); } - AddWaypoint(2,763.55f,590.52f,411.71f); + AddWaypoint(2, 763.55f, 590.52f, 411.71f); break; case 2: if (uiData == 0) // 1 == short version { - AddWaypoint(0,747.35f,634.07f,411.57f); - AddWaypoint(1,784.02f,645.33f,412.39f); + AddWaypoint(0, 747.35f, 634.07f, 411.57f); + AddWaypoint(1, 784.02f, 645.33f, 412.39f); } - AddWaypoint(2,775.67f,641.91f,411.91f); + AddWaypoint(2, 775.67f, 641.91f, 411.91f); break; default: return; @@ -525,7 +525,7 @@ public: Start(false, true, 0, nullptr); } - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) { if( MountPhase ) { @@ -534,7 +534,7 @@ public: else if( damage >= me->GetHealth() ) { events.Reset(); - damage = me->GetHealth()-1; + damage = me->GetHealth() - 1; me->SetReactState(REACT_PASSIVE); me->RemoveAllAuras(); AddCreatureAddonAuras(); @@ -563,7 +563,7 @@ public: if( damage >= me->GetHealth() ) { events.Reset(); - damage = me->GetHealth()-1; + damage = me->GetHealth() - 1; me->SetReactState(REACT_PASSIVE); me->RemoveAllAuras(); AddCreatureAddonAuras(); @@ -585,7 +585,7 @@ public: if( !pInstance ) return; - if( (i==2 && (BossOrder==1 || BossOrder==2)) || (i==3 && BossOrder==0) ) + if( (i == 2 && (BossOrder == 1 || BossOrder == 2)) || (i == 3 && BossOrder == 0) ) pInstance->SetData(DATA_GRAND_CHAMPION_REACHED_DEST, BossOrder); } @@ -597,7 +597,7 @@ public: if( type == POINT_MOTION_TYPE ) { if( id == 5 ) - me->SetFacingTo(3*M_PI/2); + me->SetFacingTo(3 * M_PI / 2); else if( id == 7 ) // reached new mount! { if( NewMountGUID ) @@ -610,9 +610,9 @@ public: me->CastSpell(me, SPELL_BOSS_DEFEND_PERIODIC, true); me->SetRegeneratingHealth(true); events.Reset(); - events.ScheduleEvent(EVENT_MOUNT_CHARGE, urand(2500,4000)); - events.ScheduleEvent(EVENT_SHIELD_BREAKER, urand(5000,8000)); - events.ScheduleEvent(EVENT_THRUST, urand(3000,5000)); + events.ScheduleEvent(EVENT_MOUNT_CHARGE, urand(2500, 4000)); + events.ScheduleEvent(EVENT_SHIELD_BREAKER, urand(5000, 8000)); + events.ScheduleEvent(EVENT_THRUST, urand(3000, 5000)); me->SetReactState(REACT_AGGRESSIVE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); if( Unit* target = me->SelectNearestTarget(200.0f) ) @@ -649,10 +649,10 @@ public: if ( !UpdateVictim() && !NewMountGUID ) return; - + events.Update(diff); - if( me->HasUnitState(UNIT_STATE_CASTING) || ((me->GetEntry()==NPC_JACOB || me->GetEntry()==NPC_MOKRA) && me->HasAura(SPELL_BLADESTORM)) ) + if( me->HasUnitState(UNIT_STATE_CASTING) || ((me->GetEntry() == NPC_JACOB || me->GetEntry() == NPC_MOKRA) && me->HasAura(SPELL_BLADESTORM)) ) return; switch( events.GetEvent() ) @@ -666,12 +666,12 @@ public: events.RepeatEvent(200); break; } - + // hackfix, trample won't hit grand champions because of UNIT_FLAG_NON_ATTACKABLE if( pInstance ) { bool trample = false; - Map::PlayerList const &pl = me->GetMap()->GetPlayers(); + Map::PlayerList const& pl = me->GetMap()->GetPlayers(); for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr ) if( Player* plr = itr->GetSource() ) if( me->GetExactDist(plr) <= 5.0f ) @@ -719,7 +719,7 @@ public: case EVENT_MOUNT_CHARGE: { std::vector LIST; - Map::PlayerList const &pl = me->GetMap()->GetPlayers(); + Map::PlayerList const& pl = me->GetMap()->GetPlayers(); for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr ) if( Player* plr = itr->GetSource() ) { @@ -735,7 +735,7 @@ public: } if( !LIST.empty() ) { - uint8 rnd = LIST.size()>1 ? urand(0,LIST.size()-1) : 0; + uint8 rnd = LIST.size() > 1 ? urand(0, LIST.size() - 1) : 0; if( Unit* target = ObjectAccessor::GetUnit(*me, LIST.at(rnd)) ) { me->getThreatManager().resetAllAggro(); @@ -744,13 +744,13 @@ public: me->CastSpell(target, SPELL_MINIONS_CHARGE, false); } } - events.RepeatEvent(urand(4500,6000)); + events.RepeatEvent(urand(4500, 6000)); } break; case EVENT_SHIELD_BREAKER: { std::vector LIST; - Map::PlayerList const &pl = me->GetMap()->GetPlayers(); + Map::PlayerList const& pl = me->GetMap()->GetPlayers(); for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr ) if( Player* plr = itr->GetSource() ) { @@ -762,18 +762,18 @@ public: } if( !LIST.empty() ) { - uint8 rnd = LIST.size()>1 ? urand(0,LIST.size()-1) : 0; + uint8 rnd = LIST.size() > 1 ? urand(0, LIST.size() - 1) : 0; if( Unit* target = ObjectAccessor::GetCreature(*me, LIST.at(rnd)) ) me->CastSpell(target, SPELL_NPC_SHIELD_BREAKER, false); } - events.RepeatEvent(urand(6000,8000)); + events.RepeatEvent(urand(6000, 8000)); } break; case EVENT_THRUST: if( Unit* victim = me->GetVictim() ) if( me->GetExactDist(victim) <= 6.0f ) me->CastSpell(victim, SPELL_PLAYER_VEHICLE_THRUST, false); - events.RepeatEvent(urand(3000,5000)); + events.RepeatEvent(urand(3000, 5000)); break; /******************* MAGE *******************/ @@ -805,12 +805,12 @@ public: break; case EVENT_SHAMAN_SPELL_EARTH_SHIELD: me->CastSpell(me, SPELL_EARTH_SHIELD, false); - events.RepeatEvent(urand(30000,35000)); + events.RepeatEvent(urand(30000, 35000)); break; case EVENT_SHAMAN_SPELL_HEALING_WAVE: { Unit* target = nullptr; - if( urand(0,1) ) + if( urand(0, 1) ) { target = DoSelectLowestHpFriendly(40.0f); if( !target ) @@ -825,7 +825,7 @@ public: case EVENT_SHAMAN_SPELL_HEX_OF_MENDING: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_HEX_OF_MENDING, false); - events.RepeatEvent(urand(20000,25000)); + events.RepeatEvent(urand(20000, 25000)); break; /**************** SHAMAN END ****************/ @@ -835,7 +835,7 @@ public: break; case EVENT_HUNTER_SPELL_LIGHTNING_ARROWS: me->CastSpell((Unit*)NULL, SPELL_LIGHTNING_ARROWS, false); - events.RepeatEvent(urand(20000,25000)); + events.RepeatEvent(urand(20000, 25000)); break; case EVENT_HUNTER_SPELL_MULTI_SHOT: { @@ -869,7 +869,7 @@ public: } UnitTargetGUID = 0; } - events.RepeatEvent(urand(15000,20000)); + events.RepeatEvent(urand(15000, 20000)); } break; /**************** HUNTER END ****************/ @@ -895,12 +895,12 @@ public: case EVENT_WARRIOR_SPELL_MORTAL_STRIKE: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_MORTAL_STRIKE, false); - events.RepeatEvent(urand(8000,12000)); + events.RepeatEvent(urand(8000, 12000)); break; case EVENT_WARRIOR_SPELL_BLADESTORM: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_BLADESTORM, false); - events.RepeatEvent(urand(15000,20000)); + events.RepeatEvent(urand(15000, 20000)); break; case EVENT_WARRIOR_SPELL_INTERCEPT: { @@ -911,7 +911,7 @@ public: if( player && me->IsInRange(player, 8.0f, 25.0f, false) ) { DoResetThreat(); - me->AddThreat(player,5.0f); + me->AddThreat(player, 5.0f); me->CastSpell(player, SPELL_INTERCEPT, false); break; } @@ -922,7 +922,7 @@ public: case EVENT_WARRIOR_SPELL_ROLLING_THROW: events.PopEvent(); break; - /*************** WARRIOR END ****************/ + /*************** WARRIOR END ****************/ } DoMeleeAttackIfReady(); diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp index ac9ef20b7..47157f88b 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp @@ -95,7 +95,7 @@ public: { if (TeamIdInInstance == TEAM_NEUTRAL) { - Map::PlayerList const &players = instance->GetPlayers(); + Map::PlayerList const& players = instance->GetPlayers(); if( !players.isEmpty() ) if( Player* pPlayer = players.begin()->GetSource() ) TeamIdInInstance = pPlayer->GetTeamId(); @@ -126,23 +126,23 @@ public: break; // Grand Champion Minions: - case NPC_ORGRIMMAR_MINION: + case NPC_ORGRIMMAR_MINION: if( TeamIdInInstance == TEAM_HORDE ) creature->UpdateEntry(NPC_STORMWIND_MINION); break; - case NPC_SILVERMOON_MINION: + case NPC_SILVERMOON_MINION: if( TeamIdInInstance == TEAM_HORDE ) creature->UpdateEntry(NPC_GNOMEREGAN_MINION); break; - case NPC_THUNDER_BLUFF_MINION: + case NPC_THUNDER_BLUFF_MINION: if( TeamIdInInstance == TEAM_HORDE ) creature->UpdateEntry(NPC_EXODAR_MINION); break; - case NPC_SENJIN_MINION: + case NPC_SENJIN_MINION: if( TeamIdInInstance == TEAM_HORDE ) creature->UpdateEntry(NPC_DARNASSUS_MINION); break; - case NPC_UNDERCITY_MINION: + case NPC_UNDERCITY_MINION: if( TeamIdInInstance == TEAM_HORDE ) creature->UpdateEntry(NPC_IRONFORGE_MINION); break; @@ -255,7 +255,7 @@ public: // EVENT STUFF BELOW: - void OnPlayerEnter(Player *) + void OnPlayerEnter(Player*) { if( DoNeedCleanup(true) ) InstanceCleanup(); @@ -266,13 +266,13 @@ public: bool DoNeedCleanup(bool /*enter*/) { uint8 aliveCount = 0; - Map::PlayerList const &pl = instance->GetPlayers(); + Map::PlayerList const& pl = instance->GetPlayers(); for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr ) if( Player* plr = itr->GetSource() ) if( plr->IsAlive() && !plr->IsGameMaster() ) ++aliveCount; - bool need = aliveCount==0; + bool need = aliveCount == 0; if( !need && CLEANED ) CLEANED = false; return need; @@ -298,9 +298,9 @@ public: veh->DespawnOrUnsummon(); veh->SetRespawnTime(3); } - for( uint8 i=0; i<3; ++i ) + for( uint8 i = 0; i < 3; ++i ) { - for( uint8 j=0; j<3; ++j ) + for( uint8 j = 0; j < 3; ++j ) { if( Creature* c = instance->GetCreature(NPC_GrandChampionMinionsGUID[i][j]) ) c->DespawnOrUnsummon(); @@ -331,7 +331,7 @@ public: announcer->SetRespawnTime(3); announcer->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - for( uint8 i=0; i<3; ++i ) + for( uint8 i = 0; i < 3; ++i ) if( Creature* c = instance->GetCreature(NPC_GrandChampionGUID[i]) ) { uint32 entry = c->GetEntry(); @@ -339,21 +339,21 @@ public: switch( i ) { case 0: - if( Creature* pBoss = announcer->SummonCreature(entry, 736.695f, 650.02f, 412.4f, 3*M_PI/2) ) + if( Creature* pBoss = announcer->SummonCreature(entry, 736.695f, 650.02f, 412.4f, 3 * M_PI / 2) ) { NPC_GrandChampionGUID[0] = pBoss->GetGUID(); pBoss->AI()->SetData(0, 2); } break; case 1: - if( Creature* pBoss = announcer->SummonCreature(entry, 756.32f, 650.05f, 412.4f, 3*M_PI/2) ) + if( Creature* pBoss = announcer->SummonCreature(entry, 756.32f, 650.05f, 412.4f, 3 * M_PI / 2) ) { NPC_GrandChampionGUID[1] = pBoss->GetGUID(); pBoss->AI()->SetData(1, 2); } break; case 2: - if( Creature* pBoss = announcer->SummonCreature(entry, 746.5f, 650.65f, 411.7f, 3*M_PI/2) ) + if( Creature* pBoss = announcer->SummonCreature(entry, 746.5f, 650.65f, 411.7f, 3 * M_PI / 2) ) { NPC_GrandChampionGUID[2] = pBoss->GetGUID(); pBoss->AI()->SetData(2, 2); @@ -368,8 +368,8 @@ public: case INSTANCE_PROGRESS_ARGENT_SOLDIERS_DIED: // revert to INSTANCE_PROGRESS_CHAMPIONS_DEAD { - for( uint8 i=0; i<3; ++i ) - for( uint8 j=0; j<3; ++j ) + for( uint8 i = 0; i < 3; ++i ) + for( uint8 j = 0; j < 3; ++j ) { if( Creature* c = instance->GetCreature(NPC_ArgentSoldierGUID[i][j]) ) c->DespawnOrUnsummon(); @@ -483,12 +483,14 @@ public: { shortver = true; - temp1 = urand(0,4); + temp1 = urand(0, 4); DoSummonGrandChampion(temp1, 0); - do { temp2 = urand(0,4); } while( temp1 == temp2 ); + do { temp2 = urand(0, 4); } + while( temp1 == temp2 ); DoSummonGrandChampion(temp2, 1); uint8 number = 0; - do { number = urand(0,4); } while( number == temp1 || number == temp2 ); + do { number = urand(0, 4); } + while( number == temp1 || number == temp2 ); DoSummonGrandChampion(number, 2); InstanceProgress = INSTANCE_PROGRESS_GRAND_CHAMPIONS_REACHED_DEST; @@ -504,7 +506,7 @@ public: case INSTANCE_PROGRESS_CHAMPIONS_DEAD: if( Creature* announcer = instance->GetCreature(NPC_AnnouncerGUID) ) { - Counter = urand(0,1); + Counter = urand(0, 1); if( Counter ) announcer->AI()->Talk(TEXT_INTRODUCE_EADRIC); else @@ -598,7 +600,7 @@ public: InstanceProgress = INSTANCE_PROGRESS_CHAMPIONS_DEAD; m_auiEncounter[0] = DONE; bool creditCasted = false; - for( uint8 i=0; i<3; ++i ) + for( uint8 i = 0; i < 3; ++i ) if( Creature* c = instance->GetCreature(NPC_GrandChampionGUID[i]) ) { c->GetMotionMaster()->MovePoint(9, 747.36f, 670.07f, 411.9f); @@ -729,7 +731,7 @@ public: if( Creature* pBoss = instance->SummonCreature(CHAMPION_TO_SUMMON, SpawnPos) ) { NPC_GrandChampionGUID[BossOrder] = pBoss->GetGUID(); - pBoss->ToCreature()->SetHomePosition(748.309f, 619.448f, 411.3f, M_PI/2); + pBoss->ToCreature()->SetHomePosition(748.309f, 619.448f, 411.3f, M_PI / 2); pBoss->ToCreature()->SetReactState(REACT_PASSIVE); pBoss->AI()->SetData(BossOrder, (shortver ? 1 : 0)); @@ -737,20 +739,20 @@ public: if( Creature* pAdd = instance->SummonCreature(MINION_TO_SUMMON, SpawnPos) ) { NPC_GrandChampionMinionsGUID[BossOrder][i] = pAdd->GetGUID(); - pAdd->SetHomePosition(748.309f, 619.448f, 411.3f, M_PI/2); - pAdd->GetMotionMaster()->MoveFollow(pBoss, 2.0f, (i+1)*M_PI/2); + pAdd->SetHomePosition(748.309f, 619.448f, 411.3f, M_PI / 2); + pAdd->GetMotionMaster()->MoveFollow(pBoss, 2.0f, (i + 1)*M_PI / 2); pAdd->SetReactState(REACT_PASSIVE); } } - + if (!shortver) if( Creature* announcer = instance->GetCreature(NPC_AnnouncerGUID) ) { if( TeamIdInInstance == TEAM_HORDE ) TEXT_ID -= 10; announcer->AI()->Talk(TEXT_ID); - announcer->AI()->Talk(TEXT_ID+1); + announcer->AI()->Talk(TEXT_ID + 1); } } @@ -770,7 +772,7 @@ public: break; case EVENT_SUMMON_GRAND_CHAMPION_1: { - temp1 = urand(0,4); + temp1 = urand(0, 4); DoSummonGrandChampion(temp1, 0); HandleGameObject(GO_MainGateGUID, true); events.ScheduleEvent(EVENT_CLOSE_GATE, 6000); @@ -779,7 +781,8 @@ public: break; case EVENT_SUMMON_GRAND_CHAMPION_2: { - do { temp2 = urand(0,4); } while( temp1 == temp2 ); + do { temp2 = urand(0, 4); } + while( temp1 == temp2 ); DoSummonGrandChampion(temp2, 1); HandleGameObject(GO_MainGateGUID, true); events.ScheduleEvent(EVENT_CLOSE_GATE, 6000); @@ -789,7 +792,8 @@ public: case EVENT_SUMMON_GRAND_CHAMPION_3: { uint8 number = 0; - do { number = urand(0,4); } while( number == temp1 || number == temp2 ); + do { number = urand(0, 4); } + while( number == temp1 || number == temp2 ); DoSummonGrandChampion(number, 2); HandleGameObject(GO_MainGateGUID, true); events.ScheduleEvent(EVENT_CLOSE_GATE, 6000); @@ -819,11 +823,11 @@ public: tirion->AI()->Talk(TEXT_BEGIN); HandleGameObject(GO_EnterGateGUID, false); } - for( uint8 i=0; i<3; ++i ) + for( uint8 i = 0; i < 3; ++i ) if( Creature* c = instance->GetCreature(NPC_GrandChampionMinionsGUID[1][i]) ) { - float angle = rand_norm()*2*M_PI; - c->GetMotionMaster()->MovePoint(0, 748.309f+3.0f*cos(angle), 619.448f+3.0f*sin(angle), 411.3f); + float angle = rand_norm() * 2 * M_PI; + c->GetMotionMaster()->MovePoint(0, 748.309f + 3.0f * cos(angle), 619.448f + 3.0f * sin(angle), 411.3f); } events.ScheduleEvent(EVENT_GRAND_GROUP_1_ATTACK, 3000); @@ -832,7 +836,7 @@ public: break; case EVENT_GRAND_GROUP_1_ATTACK: { - for( uint8 i=0; i<3; ++i ) + for( uint8 i = 0; i < 3; ++i ) if( Creature* c = instance->GetCreature(NPC_GrandChampionMinionsGUID[1][i]) ) { c->SetReactState(REACT_AGGRESSIVE); @@ -847,11 +851,11 @@ public: break; case EVENT_GRAND_GROUP_2_MOVE_MIDDLE: { - for( uint8 i=0; i<3; ++i ) + for( uint8 i = 0; i < 3; ++i ) if( Creature* c = instance->GetCreature(NPC_GrandChampionMinionsGUID[0][i]) ) { - float angle = rand_norm()*2*M_PI; - c->GetMotionMaster()->MovePoint(0, 748.309f+3.0f*cos(angle), 619.448f+3.0f*sin(angle), 411.3f); + float angle = rand_norm() * 2 * M_PI; + c->GetMotionMaster()->MovePoint(0, 748.309f + 3.0f * cos(angle), 619.448f + 3.0f * sin(angle), 411.3f); } events.ScheduleEvent(EVENT_GRAND_GROUP_2_ATTACK, 3000); @@ -860,7 +864,7 @@ public: break; case EVENT_GRAND_GROUP_2_ATTACK: { - for( uint8 i=0; i<3; ++i ) + for( uint8 i = 0; i < 3; ++i ) if( Creature* c = instance->GetCreature(NPC_GrandChampionMinionsGUID[0][i]) ) { c->SetReactState(REACT_AGGRESSIVE); @@ -874,11 +878,11 @@ public: break; case EVENT_GRAND_GROUP_3_MOVE_MIDDLE: { - for( uint8 i=0; i<3; ++i ) + for( uint8 i = 0; i < 3; ++i ) if( Creature* c = instance->GetCreature(NPC_GrandChampionMinionsGUID[2][i]) ) { - float angle = rand_norm()*2*M_PI; - c->GetMotionMaster()->MovePoint(0, 748.309f+3.0f*cos(angle), 619.448f+3.0f*sin(angle), 411.3f); + float angle = rand_norm() * 2 * M_PI; + c->GetMotionMaster()->MovePoint(0, 748.309f + 3.0f * cos(angle), 619.448f + 3.0f * sin(angle), 411.3f); } events.ScheduleEvent(EVENT_GRAND_GROUP_3_ATTACK, 3000); @@ -887,7 +891,7 @@ public: break; case EVENT_GRAND_GROUP_3_ATTACK: { - for( uint8 i=0; i<3; ++i ) + for( uint8 i = 0; i < 3; ++i ) if( Creature* c = instance->GetCreature(NPC_GrandChampionMinionsGUID[2][i]) ) { c->SetReactState(REACT_AGGRESSIVE); @@ -901,11 +905,11 @@ public: break; case EVENT_GRAND_CHAMPIONS_MOVE_MIDDLE: { - for( uint8 i=0; i<3; ++i ) + for( uint8 i = 0; i < 3; ++i ) if( Creature* c = instance->GetCreature(NPC_GrandChampionGUID[i]) ) { - float angle = rand_norm()*2*M_PI; - c->GetMotionMaster()->MovePoint(4, 748.309f+3.0f*cos(angle), 619.448f+3.0f*sin(angle), 411.3f); + float angle = rand_norm() * 2 * M_PI; + c->GetMotionMaster()->MovePoint(4, 748.309f + 3.0f * cos(angle), 619.448f + 3.0f * sin(angle), 411.3f); } events.ScheduleEvent(EVENT_GRAND_CHAMPIONS_MOUNTS_ATTACK, 3000); @@ -914,7 +918,7 @@ public: break; case EVENT_GRAND_CHAMPIONS_MOUNTS_ATTACK: { - for( uint8 i=0; i<3; ++i ) + for( uint8 i = 0; i < 3; ++i ) if( Creature* c = instance->GetCreature(NPC_GrandChampionGUID[i]) ) { c->SetReactState(REACT_AGGRESSIVE); @@ -929,7 +933,7 @@ public: break; case EVENT_GRAND_CHAMPIONS_MOVE_SIDE: { - for( uint8 i=0; i<3; ++i ) + for( uint8 i = 0; i < 3; ++i ) if( Creature* c = instance->GetCreature(NPC_GrandChampionGUID[i]) ) { c->AI()->DoAction(1); @@ -953,7 +957,7 @@ public: break; case EVENT_GRAND_CHAMPIONS_ATTACK: { - for( uint8 i=0; i<3; ++i ) + for( uint8 i = 0; i < 3; ++i ) if( Creature* c = instance->GetCreature(NPC_GrandChampionGUID[i]) ) { c->SetReactState(REACT_AGGRESSIVE); @@ -1002,28 +1006,28 @@ public: announcer->AI()->Talk(TEXT_CHEER_PALETRESS_2); } } - + for( int8 i = 0; i < 3; ++i ) { Position pos(SpawnPosition); float x = pos.GetPositionX(); - pos.m_positionX = x-2.0f+(i-1)*10.0f; + pos.m_positionX = x - 2.0f + (i - 1) * 10.0f; if( Creature* pTrash = instance->SummonCreature(NPC_ARGENT_LIGHTWIELDER, pos) ) { - pTrash->AI()->SetData(i,0); + pTrash->AI()->SetData(i, 0); NPC_ArgentSoldierGUID[i][0] = pTrash->GetGUID(); } - pos.m_positionX = x+(i-1)*10.0f; + pos.m_positionX = x + (i - 1) * 10.0f; if( Creature* pTrash = instance->SummonCreature(NPC_ARGENT_MONK, pos) ) { - pTrash->AI()->SetData(i,0); + pTrash->AI()->SetData(i, 0); NPC_ArgentSoldierGUID[i][1] = pTrash->GetGUID(); } - pos.m_positionX = x+2.0f+(i-1)*10.0f; + pos.m_positionX = x + 2.0f + (i - 1) * 10.0f; if( Creature* pTrash = instance->SummonCreature(NPC_PRIESTESS, pos) ) { - pTrash->AI()->SetData(i,0); + pTrash->AI()->SetData(i, 0); NPC_ArgentSoldierGUID[i][2] = pTrash->GetGUID(); } } @@ -1062,8 +1066,8 @@ public: case EVENT_ARGENT_SOLDIER_GROUP_ATTACK: { Counter = 0; - for( uint8 i=0; i<3; ++i ) - for( uint8 j=0; j<3; ++j ) + for( uint8 i = 0; i < 3; ++i ) + for( uint8 j = 0; j < 3; ++j ) if( Creature* c = instance->GetCreature(NPC_ArgentSoldierGUID[i][j]) ) { c->SetReactState(REACT_AGGRESSIVE); @@ -1077,11 +1081,12 @@ public: break; case EVENT_ARGENT_CHALLENGE_MOVE_FORWARD: { - if (Creature* boss = instance->GetCreature(NPC_ArgentChampionGUID)) { - boss->GetMotionMaster()->MovePoint(0, 746.881f, 635.263f, 411.7f); - } - events.ScheduleEvent(EVENT_ARGENT_CHALLENGE_ATTACK, 3000); - events.PopEvent(); + if (Creature* boss = instance->GetCreature(NPC_ArgentChampionGUID)) + { + boss->GetMotionMaster()->MovePoint(0, 746.881f, 635.263f, 411.7f); + } + events.ScheduleEvent(EVENT_ARGENT_CHALLENGE_ATTACK, 3000); + events.PopEvent(); } break; case EVENT_ARGENT_CHALLENGE_ATTACK: @@ -1241,7 +1246,7 @@ public: events.PopEvent(); } break; - } + } } bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* /*source*/, Unit const* /*target*/, uint32 /*miscvalue1*/) 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 bc57063be..3e95115c7 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 @@ -30,31 +30,31 @@ public: uint32 gossipTextId = 0; switch (pInstance->GetData(DATA_INSTANCE_PROGRESS)) { - case INSTANCE_PROGRESS_INITIAL: - if (!player->GetVehicle()) - { - if (pInstance->GetData(DATA_TEAMID_IN_INSTANCE) == TEAM_HORDE) - gossipTextId = 15043; //Horde text + case INSTANCE_PROGRESS_INITIAL: + if (!player->GetVehicle()) + { + if (pInstance->GetData(DATA_TEAMID_IN_INSTANCE) == TEAM_HORDE) + gossipTextId = 15043; //Horde text + else + gossipTextId = 14757; //Alliance text + } else - gossipTextId = 14757; //Alliance text - } - else - { - gossipTextId = 14688; - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_START_EVENT1a, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1338); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_START_EVENT1b, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1341); - } - break; - case INSTANCE_PROGRESS_CHAMPIONS_DEAD: - gossipTextId = 14737; - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_START_EVENT2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1339); - break; - case INSTANCE_PROGRESS_ARGENT_CHALLENGE_DIED: - gossipTextId = 14738; - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_START_EVENT3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1340); - break; - default: - return true; + { + gossipTextId = 14688; + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_START_EVENT1a, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1338); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_START_EVENT1b, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1341); + } + break; + case INSTANCE_PROGRESS_CHAMPIONS_DEAD: + gossipTextId = 14737; + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_START_EVENT2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1339); + break; + case INSTANCE_PROGRESS_ARGENT_CHALLENGE_DIED: + gossipTextId = 14738; + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_START_EVENT3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1340); + break; + default: + return true; } SendGossipMenuFor(player, gossipTextId, creature->GetGUID()); @@ -70,9 +70,9 @@ public: if(!pInstance) return true; - if(uiAction == GOSSIP_ACTION_INFO_DEF+1338 || uiAction == GOSSIP_ACTION_INFO_DEF+1341 || uiAction == GOSSIP_ACTION_INFO_DEF+1339 || uiAction == GOSSIP_ACTION_INFO_DEF+1340) + if(uiAction == GOSSIP_ACTION_INFO_DEF + 1338 || uiAction == GOSSIP_ACTION_INFO_DEF + 1341 || uiAction == GOSSIP_ACTION_INFO_DEF + 1339 || uiAction == GOSSIP_ACTION_INFO_DEF + 1340) { - pInstance->SetData(DATA_ANNOUNCER_GOSSIP_SELECT, (uiAction == GOSSIP_ACTION_INFO_DEF+1341 ? 1 : 0)); + pInstance->SetData(DATA_ANNOUNCER_GOSSIP_SELECT, (uiAction == GOSSIP_ACTION_INFO_DEF + 1341 ? 1 : 0)); creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); } @@ -87,7 +87,7 @@ public: struct npc_announcer_toc5AI : public CreatureAI { - npc_announcer_toc5AI(Creature *creature) : CreatureAI(creature) {} + npc_announcer_toc5AI(Creature* creature) : CreatureAI(creature) {} void Reset() override { @@ -102,7 +102,7 @@ public: void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override { if (damage >= me->GetHealth()) // for bk scene so strangulate doesn't kill him - damage = me->GetHealth()-1; + damage = me->GetHealth() - 1; } void MovementInform(uint32 type, uint32 /*id*/) override 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 8f935bde2..a9bbdab1b 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp @@ -33,7 +33,7 @@ enum AnubNPCs NPC_SPIKE = 34660, }; -const Position AnubLocs[]= +const Position AnubLocs[] = { // scarab's beginning pos {722.65f, 135.41f, 142.16f, M_PI}, @@ -148,7 +148,7 @@ public: events.Reset(); bIntro = false; bPhase3 = false; - me->ApplySpellImmune(0, IMMUNITY_ID, RAID_MODE(66193,67855,67856,67857), true); + me->ApplySpellImmune(0, IMMUNITY_ID, RAID_MODE(66193, 67855, 67856, 67857), true); me->m_SightDistance = 90.0f; // for MoveInLineOfSight distance } @@ -165,11 +165,11 @@ public: me->SetStandState(UNIT_STAND_STATE_SUBMERGED); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); summons.DespawnAll(); - for( uint8 i=0; i<10; ++i ) + for( uint8 i = 0; i < 10; ++i ) { - float angle = rand_norm()*2*M_PI; - float dist = rand_norm()*40.0f; - if( Creature* c = me->SummonCreature(NPC_SCARAB, AnubLocs[0].GetPositionX()+cos(angle)*dist, AnubLocs[0].GetPositionY()+sin(angle)*dist, AnubLocs[0].GetPositionZ(), 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000) ) + float angle = rand_norm() * 2 * M_PI; + float dist = rand_norm() * 40.0f; + if( Creature* c = me->SummonCreature(NPC_SCARAB, AnubLocs[0].GetPositionX() + cos(angle) * dist, AnubLocs[0].GetPositionY() + sin(angle) * dist, AnubLocs[0].GetPositionZ(), 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000) ) { c->setFaction(31); c->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); @@ -193,9 +193,9 @@ public: me->setActive(true); events.Reset(); events.RescheduleEvent(EVENT_ENRAGE, 600000); - events.RescheduleEvent(EVENT_SPELL_FREEZING_SLASH, urand(7000,15000)); - events.RescheduleEvent(EVENT_SPELL_PENETRATING_COLD, urand(15000,20000)); - events.RescheduleEvent(EVENT_SUMMON_NERUBIAN, urand(5000,8000)); + events.RescheduleEvent(EVENT_SPELL_FREEZING_SLASH, urand(7000, 15000)); + events.RescheduleEvent(EVENT_SPELL_PENETRATING_COLD, urand(15000, 20000)); + events.RescheduleEvent(EVENT_SUMMON_NERUBIAN, urand(5000, 8000)); events.RescheduleEvent(EVENT_SUBMERGE, SUBMERGE_INTERVAL); if( !IsHeroic() ) events.RescheduleEvent(EVENT_RESPAWN_SPHERE, 4000); @@ -210,11 +210,11 @@ public: c->AI()->DoAction(1); } summons.clear(); - for( uint8 i=0; i<4; ++i ) - if( Creature* c = me->SummonCreature(NPC_BURROW, AnubLocs[i+1]) ) + for( uint8 i = 0; i < 4; ++i ) + if( Creature* c = me->SummonCreature(NPC_BURROW, AnubLocs[i + 1]) ) BurrowGUID[i] = c->GetGUID(); - for( uint8 i=0; i<6; ++i ) - if( Creature* c = me->SummonCreature(NPC_FROST_SPHERE, AnubLocs[i+5]) ) + for( uint8 i = 0; i < 6; ++i ) + if( Creature* c = me->SummonCreature(NPC_FROST_SPHERE, AnubLocs[i + 5]) ) SphereGUID[i] = c->GetGUID(); Talk(SAY_AGGRO); @@ -264,20 +264,19 @@ public: break; case EVENT_RESPAWN_SPHERE: { - uint8 StartAt = urand(0,5); + uint8 StartAt = urand(0, 5); uint8 i = StartAt; do { if( Creature* c = ObjectAccessor::GetCreature(*me, SphereGUID[i]) ) if( !c->HasAura(SPELL_FROST_SPHERE) ) { - if( Creature* c = me->SummonCreature(NPC_FROST_SPHERE, AnubLocs[i+5]) ) + if( Creature* c = me->SummonCreature(NPC_FROST_SPHERE, AnubLocs[i + 5]) ) SphereGUID[i] = c->GetGUID(); break; } - i = (i+1)%6; - } - while( i != StartAt ); + i = (i + 1) % 6; + } while( i != StartAt ); events.RepeatEvent(4000); } break; @@ -285,18 +284,18 @@ public: { if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_FREEZING_SLASH, false); - events.RepeatEvent(urand(15000,20000)); + events.RepeatEvent(urand(15000, 20000)); } break; case EVENT_SPELL_PENETRATING_COLD: { - me->CastCustomSpell(SPELL_PENETRATING_COLD, SPELLVALUE_MAX_TARGETS, RAID_MODE(2,5,2,5)); + me->CastCustomSpell(SPELL_PENETRATING_COLD, SPELLVALUE_MAX_TARGETS, RAID_MODE(2, 5, 2, 5)); events.RepeatEvent(18000); } break; case EVENT_SUMMON_NERUBIAN: { - me->CastCustomSpell(SPELL_SUMMON_BURROWER, SPELLVALUE_MAX_TARGETS, RAID_MODE(1,2,2,4)); + me->CastCustomSpell(SPELL_SUMMON_BURROWER, SPELLVALUE_MAX_TARGETS, RAID_MODE(1, 2, 2, 4)); events.RepeatEvent(45000); } break; @@ -321,7 +320,7 @@ public: break; case EVENT_SUMMON_SCARAB: { - uint8 i = urand(0,3); + uint8 i = urand(0, 3); if( Creature* c = ObjectAccessor::GetCreature(*me, BurrowGUID[i]) ) me->CastSpell(c, SPELL_SUMMON_SCARAB, true); events.RepeatEvent(4000); @@ -343,9 +342,9 @@ public: me->setAttackTimer(BASE_ATTACK, 3000); me->RemoveAura(SPELL_SUBMERGE); me->CastSpell(me, SPELL_EMERGE, false); - events.RescheduleEvent(EVENT_SUMMON_NERUBIAN, urand(5000,8000)); - events.RescheduleEvent(EVENT_SPELL_FREEZING_SLASH, urand(7000,15000)); - events.RescheduleEvent(EVENT_SPELL_PENETRATING_COLD, urand(15000,20000)); + events.RescheduleEvent(EVENT_SUMMON_NERUBIAN, urand(5000, 8000)); + events.RescheduleEvent(EVENT_SPELL_FREEZING_SLASH, urand(7000, 15000)); + events.RescheduleEvent(EVENT_SPELL_PENETRATING_COLD, urand(15000, 20000)); events.RescheduleEvent(EVENT_SUBMERGE, SUBMERGE_INTERVAL); events.PopEvent(); } @@ -385,7 +384,7 @@ public: // remove loot for the other faction (items are invisible for players, done in conditions), so corpse can be skinned for( std::vector::iterator itr = me->loot.items.begin(); itr != me->loot.items.end(); ++itr ) - if( ItemTemplate const *iProto = sObjectMgr->GetItemTemplate((*itr).itemid) ) + if( ItemTemplate const* iProto = sObjectMgr->GetItemTemplate((*itr).itemid) ) if( ((iProto->Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY) && plr->GetTeamId() != TEAM_HORDE) || ((iProto->Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY) && plr->GetTeamId() != TEAM_ALLIANCE) ) { (*itr).count = 0; @@ -393,7 +392,7 @@ public: --me->loot.unlootedCount; } } - + void KilledUnit(Unit* who) { if( who->GetTypeId() == TYPEID_PLAYER ) @@ -408,7 +407,7 @@ public: if( pInstance ) pInstance->SetData(TYPE_FAILED, 1); } - + void MoveInLineOfSight(Unit* who) { if (who->GetTypeId() != TYPEID_PLAYER || me->GetExactDistSq(who) > 6400.0f) // 80yd*80yd @@ -459,9 +458,9 @@ public: void Reset() { - me->SetCorpseDelay(10*60); + me->SetCorpseDelay(10 * 60); me->CastSpell(me, SPELL_ACID_MANDIBLE, true); - determinationTimer = urand(10000,50000); + determinationTimer = urand(10000, 50000); despawnTimer = 0; if( me->getFaction() == 16 ) // hostile - it's phase 2 if( Unit* target = me->SelectNearestTarget(250.0f) ) @@ -502,7 +501,7 @@ public: if( determinationTimer <= (int32)diff ) { me->CastSpell(me, SPELL_DETERMINATION, false); - determinationTimer = urand(20000,60000); + determinationTimer = urand(20000, 60000); } else determinationTimer -= diff; @@ -541,10 +540,18 @@ public: if (me->GetMap()) switch (me->GetMap()->GetDifficulty()) { - case RAID_DIFFICULTY_10MAN_NORMAL: ID = 66118; break; - case RAID_DIFFICULTY_25MAN_NORMAL: ID = 67630; break; - case RAID_DIFFICULTY_10MAN_HEROIC: ID = 68646; break; - case RAID_DIFFICULTY_25MAN_HEROIC: ID = 68647; break; + case RAID_DIFFICULTY_10MAN_NORMAL: + ID = 66118; + break; + case RAID_DIFFICULTY_25MAN_NORMAL: + ID = 67630; + break; + case RAID_DIFFICULTY_10MAN_HEROIC: + ID = 68646; + break; + case RAID_DIFFICULTY_25MAN_HEROIC: + ID = 68647; + break; } if (ID) me->ApplySpellImmune(0, IMMUNITY_ID, ID, true); @@ -552,7 +559,7 @@ public: permafrostTimer = 0; me->CastSpell(me, SPELL_FROST_SPHERE, true); me->GetMotionMaster()->MoveRandom(20.0f); - me->SetCorpseDelay(15*60*1000); + me->SetCorpseDelay(15 * 60 * 1000); } uint32 permafrostTimer; @@ -629,13 +636,13 @@ public: void Reset() { - me->SetCorpseDelay(10*60); + me->SetCorpseDelay(10 * 60); me->CastSpell(me, SPELL_EXPOSE_WEAKNESS, true); me->CastSpell(me, SPELL_SPIDER_FRENZY, true); events.Reset(); events.RescheduleEvent(EVENT_SUBMERGE, 30000); if( IsHeroic() ) - events.RescheduleEvent(EVENT_SPELL_SHADOW_STRIKE, urand(30000,45000)); + events.RescheduleEvent(EVENT_SPELL_SHADOW_STRIKE, urand(30000, 45000)); if( Unit* target = me->SelectNearestTarget(250.0f) ) { AttackStart(target); @@ -655,7 +662,7 @@ public: o -= M_PI; else o += M_PI; - me->NearTeleportTo(target->GetPositionX()+cos(o)*5.0f, target->GetPositionY()+sin(o)*5.0f, target->GetPositionZ()+0.6f, target->GetOrientation()); + me->NearTeleportTo(target->GetPositionX() + cos(o) * 5.0f, target->GetPositionY() + sin(o) * 5.0f, target->GetPositionZ() + 0.6f, target->GetOrientation()); AttackStart(target); me->GetMotionMaster()->MoveChase(target); events.DelayEvents(3000); @@ -679,10 +686,10 @@ public: case EVENT_SPELL_SHADOW_STRIKE: if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 250.0f, true) ) me->CastSpell(target, SPELL_SHADOW_STRIKE, false); - events.RepeatEvent(urand(30000,45000)); + events.RepeatEvent(urand(30000, 45000)); break; case EVENT_SUBMERGE: - if( HealthBelowPct(80) && !me->HasAura(RAID_MODE(66193,67855,67856,67857)) ) // not having permafrost - allow submerge + if( HealthBelowPct(80) && !me->HasAura(RAID_MODE(66193, 67855, 67856, 67857)) ) // not having permafrost - allow submerge { me->GetMotionMaster()->MoveIdle(); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); @@ -834,40 +841,40 @@ public: class spell_pursuing_spikes : public SpellScriptLoader { - public: - spell_pursuing_spikes() : SpellScriptLoader("spell_pursuing_spikes") { } +public: + spell_pursuing_spikes() : SpellScriptLoader("spell_pursuing_spikes") { } - class spell_pursuing_spikesAuraScript : public AuraScript + class spell_pursuing_spikesAuraScript : public AuraScript + { + PrepareAuraScript(spell_pursuing_spikesAuraScript) + + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_pursuing_spikesAuraScript) - - void HandleEffectPeriodic(AuraEffect const * /*aurEff*/) + if( Unit* target = GetTarget() ) { - if( Unit* target = GetTarget() ) + if( Creature* c = target->FindNearestCreature(NPC_FROST_SPHERE, 8.0f, true) ) { - if( Creature* c = target->FindNearestCreature(NPC_FROST_SPHERE, 8.0f, true) ) - { - target->UpdatePosition(*c, false); - target->CastCustomSpell(SPELL_SPIKE_FAIL, SPELLVALUE_MAX_TARGETS, 1); - if( target->GetTypeId() == TYPEID_UNIT ) - target->ToCreature()->AI()->DoAction(-1); - Remove(); - return; - } - target->CastSpell((Unit*)NULL, SPELL_IMPALE, true); + target->UpdatePosition(*c, false); + target->CastCustomSpell(SPELL_SPIKE_FAIL, SPELLVALUE_MAX_TARGETS, 1); + if( target->GetTypeId() == TYPEID_UNIT ) + target->ToCreature()->AI()->DoAction(-1); + Remove(); + return; } + target->CastSpell((Unit*)NULL, SPELL_IMPALE, true); } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_pursuing_spikesAuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript *GetAuraScript() const - { - return new spell_pursuing_spikesAuraScript(); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_pursuing_spikesAuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_pursuing_spikesAuraScript(); + } }; // 66118 Leeching Swarm @@ -879,21 +886,21 @@ enum eLeechingSwarmSpells class spell_gen_leeching_swarm : public SpellScriptLoader { - public: +public: spell_gen_leeching_swarm() : SpellScriptLoader("spell_gen_leeching_swarm") { } class spell_gen_leeching_swarm_AuraScript : public AuraScript { PrepareAuraScript(spell_gen_leeching_swarm_AuraScript); - bool Validate(SpellInfo const* /*spellEntry*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_LEECHING_SWARM_DMG)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_LEECHING_SWARM_HEAL)) - return false; - return true; - } + bool Validate(SpellInfo const* /*spellEntry*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_LEECHING_SWARM_DMG)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_LEECHING_SWARM_HEAL)) + return false; + return true; + } void HandleEffectPeriodic(AuraEffect const* aurEff) { @@ -922,7 +929,7 @@ class spell_gen_leeching_swarm : public SpellScriptLoader class spell_gen_leeching_swarm_dmg : public SpellScriptLoader { - public: +public: spell_gen_leeching_swarm_dmg() : SpellScriptLoader("spell_gen_leeching_swarm_dmg") {} class spell_gen_leeching_swarm_dmg_SpellScript : public SpellScript diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp index 9d0966064..2156dab8a 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp @@ -78,11 +78,12 @@ struct boss_faction_championsAI : public ScriptedAI // third try: float unimportant_dist = (mAIType == AI_MELEE || mAIType == AI_PET ? 5.0f : 35.0f); - if (dist > unimportant_dist) dist -= unimportant_dist; else dist = 0.0f; + if (dist > unimportant_dist) dist -= unimportant_dist; + else dist = 0.0f; const float dist_factor = (mAIType == AI_MELEE || mAIType == AI_PET ? 15.0f : 25.0f); - float mod_dist = dist_factor/(dist_factor + dist); // 0.2 .. 1.0 - float mod_health = health > 40000 ? 2.0f : (60000-health)/10000.0f; // 2.0 .. 6.0 - float mod_armor = (mAIType == AI_MELEE || mAIType == AI_PET) ? Unit::CalcArmorReducedDamage(me, target, 10000, nullptr)/10000.0f : 1.0f; + float mod_dist = dist_factor / (dist_factor + dist); // 0.2 .. 1.0 + float mod_health = health > 40000 ? 2.0f : (60000 - health) / 10000.0f; // 2.0 .. 6.0 + float mod_armor = (mAIType == AI_MELEE || mAIType == AI_PET) ? Unit::CalcArmorReducedDamage(me, target, 10000, nullptr) / 10000.0f : 1.0f; return mod_dist * mod_health * mod_armor; } @@ -103,7 +104,7 @@ struct boss_faction_championsAI : public ScriptedAI } } - void EventMapGCD(EventMap &e, uint32 delay, uint32 gcd = 0) + void EventMapGCD(EventMap& e, uint32 delay, uint32 gcd = 0) { e.DelayEventsToMax(delay, gcd); } @@ -147,12 +148,12 @@ struct boss_faction_championsAI : public ScriptedAI Creature* SelectTarget_MostHPLostFriendlyMissingBuff(uint32 spell, float range) { - std::list lst = DoFindFriendlyMissingBuff(range, spell); + std::list lst = DoFindFriendlyMissingBuff(range, spell); if( lst.empty() ) return nullptr; - std::list::const_iterator iter = lst.begin(); + std::list::const_iterator iter = lst.begin(); uint32 lowestHP = (*iter)->GetMaxHealth() - (*iter)->GetHealth(); - for( std::list::const_iterator itr = lst.begin(); itr != lst.end(); ++itr ) + for( std::list::const_iterator itr = lst.begin(); itr != lst.end(); ++itr ) if( ((*itr)->GetMaxHealth() - (*itr)->GetHealth()) > lowestHP ) { iter = itr; @@ -165,7 +166,7 @@ struct boss_faction_championsAI : public ScriptedAI { ThreatContainer::StorageType const& tList = me->getThreatManager().getThreatList(); uint32 count = 0; - Unit *target; + Unit* target; for( ThreatContainer::StorageType::const_iterator iter = tList.begin(); iter != tList.end(); ++iter ) { target = ObjectAccessor::GetUnit((*me), (*iter)->getUnitGuid()); @@ -178,7 +179,7 @@ struct boss_faction_championsAI : public ScriptedAI Unit* SelectEnemyCaster(bool casting, float range) { ThreatContainer::StorageType const& tList = me->getThreatManager().getThreatList(); - Unit *target; + Unit* target; for( ThreatContainer::StorageType::const_iterator iter = tList.begin(); iter != tList.end(); ++iter ) { target = ObjectAccessor::GetUnit((*me), (*iter)->getUnitGuid()); @@ -205,7 +206,7 @@ struct boss_faction_championsAI : public ScriptedAI { if( powerTimer <= diff ) { - me->ModifyPower(POWER_MANA, me->GetMaxPower(POWER_MANA)/3); + me->ModifyPower(POWER_MANA, me->GetMaxPower(POWER_MANA) / 3); powerTimer = 4000; } else @@ -215,7 +216,7 @@ struct boss_faction_championsAI : public ScriptedAI { if( powerTimer <= diff ) { - me->ModifyPower(POWER_ENERGY, me->GetMaxPower(POWER_ENERGY)/3); + me->ModifyPower(POWER_ENERGY, me->GetMaxPower(POWER_ENERGY) / 3); powerTimer = 1000; } else @@ -253,7 +254,7 @@ class npc_toc_druid : public CreatureScript public: npc_toc_druid() : CreatureScript("npc_toc_druid") { } - CreatureAI* GetAI(Creature *pCreature) const + CreatureAI* GetAI(Creature* pCreature) const { return new npc_toc_druidAI (pCreature); } @@ -264,14 +265,14 @@ public: { SetEquipmentSlots(false, 51799, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); events.Reset(); - events.RescheduleEvent(EVENT_SPELL_LIFEBLOOM, urand(5000,15000)); - events.RescheduleEvent(EVENT_SPELL_NOURISH, urand(5000,15000)); - events.RescheduleEvent(EVENT_SPELL_REGROWTH, urand(5000,15000)); - events.RescheduleEvent(EVENT_SPELL_REJUVENATION, urand(5000,15000)); - events.RescheduleEvent(EVENT_SPELL_TRANQUILITY, urand(25000,40000)); + events.RescheduleEvent(EVENT_SPELL_LIFEBLOOM, urand(5000, 15000)); + events.RescheduleEvent(EVENT_SPELL_NOURISH, urand(5000, 15000)); + events.RescheduleEvent(EVENT_SPELL_REGROWTH, urand(5000, 15000)); + events.RescheduleEvent(EVENT_SPELL_REJUVENATION, urand(5000, 15000)); + events.RescheduleEvent(EVENT_SPELL_TRANQUILITY, urand(25000, 40000)); events.RescheduleEvent(EVENT_SPELL_BARKSKIN, 10000); - events.RescheduleEvent(EVENT_SPELL_THORNS, urand(5000,15000)); - events.RescheduleEvent(EVENT_SPELL_NATURE_GRASP, urand(5000,15000)); + events.RescheduleEvent(EVENT_SPELL_THORNS, urand(5000, 15000)); + events.RescheduleEvent(EVENT_SPELL_NATURE_GRASP, urand(5000, 15000)); } EventMap events; @@ -299,36 +300,36 @@ public: case EVENT_SPELL_LIFEBLOOM: if( Creature* target = SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_LIFEBLOOM, 40.0f) ) me->CastSpell(target, SPELL_LIFEBLOOM, false); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_NOURISH: if( Creature* target = SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_NOURISH, 40.0f) ) me->CastSpell(target, SPELL_NOURISH, false); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_REGROWTH: if( Creature* target = SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_REGROWTH, 40.0f) ) me->CastSpell(target, SPELL_REGROWTH, false); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_REJUVENATION: if( Creature* target = SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_REJUVENATION, 40.0f) ) me->CastSpell(target, SPELL_REJUVENATION, false); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_THORNS: if( Creature* target = SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_THORNS, 30.0f) ) me->CastSpell(target, SPELL_THORNS, false); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_TRANQUILITY: me->CastSpell(me, SPELL_TRANQUILITY, false); - events.RepeatEvent(urand(120000,180000)); + events.RepeatEvent(urand(120000, 180000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_BARKSKIN: @@ -383,24 +384,24 @@ class npc_toc_shaman : public CreatureScript public: npc_toc_shaman() : CreatureScript("npc_toc_shaman") { } - CreatureAI* GetAI(Creature *pCreature) const + CreatureAI* GetAI(Creature* pCreature) const { return new npc_toc_shamanAI (pCreature); } struct npc_toc_shamanAI : public boss_faction_championsAI { - npc_toc_shamanAI(Creature *pCreature) : boss_faction_championsAI(pCreature, AI_HEALER) + npc_toc_shamanAI(Creature* pCreature) : boss_faction_championsAI(pCreature, AI_HEALER) { SetEquipmentSlots(false, 49992, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); events.Reset(); - events.RescheduleEvent(EVENT_SPELL_HEALING_WAVE, urand(3000,10000)); - events.RescheduleEvent(EVENT_SPELL_RIPTIDE, urand(3000,10000)); - events.RescheduleEvent(EVENT_SPELL_SPIRIT_CLEANSE, urand(10000,15000)); - events.RescheduleEvent(EVENT_SPELL_HEROISM_OR_BLOODLUST, urand(25000,40000)); - events.RescheduleEvent(EVENT_SPELL_HEX, urand(3000,10000)); - events.RescheduleEvent(EVENT_SPELL_EARTH_SHIELD, urand(15000,25000)); - events.RescheduleEvent(EVENT_SPELL_EARTH_SHOCK, urand(3000,10000)); + events.RescheduleEvent(EVENT_SPELL_HEALING_WAVE, urand(3000, 10000)); + events.RescheduleEvent(EVENT_SPELL_RIPTIDE, urand(3000, 10000)); + events.RescheduleEvent(EVENT_SPELL_SPIRIT_CLEANSE, urand(10000, 15000)); + events.RescheduleEvent(EVENT_SPELL_HEROISM_OR_BLOODLUST, urand(25000, 40000)); + events.RescheduleEvent(EVENT_SPELL_HEX, urand(3000, 10000)); + events.RescheduleEvent(EVENT_SPELL_EARTH_SHIELD, urand(15000, 25000)); + events.RescheduleEvent(EVENT_SPELL_EARTH_SHOCK, urand(3000, 10000)); } EventMap events; @@ -428,19 +429,19 @@ public: case EVENT_SPELL_HEALING_WAVE: if( Creature* target = SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_HEALING_WAVE, 40.0f) ) me->CastSpell(target, SPELL_HEALING_WAVE, false); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_RIPTIDE: if( Creature* target = SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_RIPTIDE, 40.0f) ) me->CastSpell(target, SPELL_RIPTIDE, false); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_SPIRIT_CLEANSE: if( Creature* target = SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_SPIRIT_CLEANSE, 40.0f) ) me->CastSpell(target, SPELL_SPIRIT_CLEANSE, false); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_HEROISM_OR_BLOODLUST: @@ -460,13 +461,13 @@ public: case EVENT_SPELL_EARTH_SHIELD: if( Creature* target = SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_EARTH_SHIELD, 40.0f) ) me->CastSpell(target, SPELL_EARTH_SHIELD, false); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_EARTH_SHOCK: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_EARTH_SHOCK, false); - events.RepeatEvent(urand(5000,10000)); + events.RepeatEvent(urand(5000, 10000)); EventMapGCD(events, 1500); break; } @@ -505,25 +506,25 @@ class npc_toc_paladin : public CreatureScript public: npc_toc_paladin() : CreatureScript("npc_toc_paladin") { } - CreatureAI* GetAI(Creature *pCreature) const + CreatureAI* GetAI(Creature* pCreature) const { return new npc_toc_paladinAI (pCreature); } struct npc_toc_paladinAI : public boss_faction_championsAI { - npc_toc_paladinAI(Creature *pCreature) : boss_faction_championsAI(pCreature, AI_HEALER) + npc_toc_paladinAI(Creature* pCreature) : boss_faction_championsAI(pCreature, AI_HEALER) { SetEquipmentSlots(false, 50771, 47079, EQUIP_NO_CHANGE); events.Reset(); - events.RescheduleEvent(EVENT_SPELL_HAND_OF_FREEDOM, urand(10000,15000)); + events.RescheduleEvent(EVENT_SPELL_HAND_OF_FREEDOM, urand(10000, 15000)); events.RescheduleEvent(EVENT_SPELL_BUBBLE, 10000); - events.RescheduleEvent(EVENT_SPELL_CLEANSE, urand(10000,15000)); - events.RescheduleEvent(EVENT_SPELL_FLASH_OF_LIGHT, urand(3000,10000)); - events.RescheduleEvent(EVENT_SPELL_HOLY_LIGHT, urand(5000,15000)); - events.RescheduleEvent(EVENT_SPELL_HOLY_SHOCK, urand(3000,10000)); - events.RescheduleEvent(EVENT_SPELL_HAND_OF_PROTECTION, urand(20000,35000)); - events.RescheduleEvent(EVENT_SPELL_HAMMER_OF_JUSTICE, urand(10000,20000)); + events.RescheduleEvent(EVENT_SPELL_CLEANSE, urand(10000, 15000)); + events.RescheduleEvent(EVENT_SPELL_FLASH_OF_LIGHT, urand(3000, 10000)); + events.RescheduleEvent(EVENT_SPELL_HOLY_LIGHT, urand(5000, 15000)); + events.RescheduleEvent(EVENT_SPELL_HOLY_SHOCK, urand(3000, 10000)); + events.RescheduleEvent(EVENT_SPELL_HAND_OF_PROTECTION, urand(20000, 35000)); + events.RescheduleEvent(EVENT_SPELL_HAMMER_OF_JUSTICE, urand(10000, 20000)); } EventMap events; @@ -567,25 +568,25 @@ public: case EVENT_SPELL_CLEANSE: if( Creature* target = SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_CLEANSE, 40.0f) ) me->CastSpell(target, SPELL_CLEANSE, false); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_FLASH_OF_LIGHT: if( Creature* target = SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_FLASH_OF_LIGHT, 40.0f) ) me->CastSpell(target, SPELL_FLASH_OF_LIGHT, false); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_HOLY_LIGHT: if( Creature* target = SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_HOLY_LIGHT, 40.0f) ) me->CastSpell(target, SPELL_HOLY_LIGHT, false); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_HOLY_SHOCK: if( Creature* target = SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_HOLY_SHOCK, 40.0f) ) me->CastSpell(target, SPELL_HOLY_SHOCK, false); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_HAND_OF_PROTECTION: @@ -640,22 +641,22 @@ class npc_toc_priest : public CreatureScript public: npc_toc_priest() : CreatureScript("npc_toc_priest") { } - CreatureAI* GetAI(Creature *pCreature) const + CreatureAI* GetAI(Creature* pCreature) const { return new npc_toc_priestAI (pCreature); } struct npc_toc_priestAI : public boss_faction_championsAI { - npc_toc_priestAI(Creature *pCreature) : boss_faction_championsAI(pCreature, AI_HEALER) + npc_toc_priestAI(Creature* pCreature) : boss_faction_championsAI(pCreature, AI_HEALER) { SetEquipmentSlots(false, 49992, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); events.Reset(); - events.RescheduleEvent(EVENT_SPELL_RENEW, urand(3000,10000)); - events.RescheduleEvent(EVENT_SPELL_SHIELD, urand(3000,10000)); - events.RescheduleEvent(EVENT_SPELL_FLASH_HEAL, urand(3000,10000)); - events.RescheduleEvent(EVENT_SPELL_DISPEL, urand(3000,10000)); - events.RescheduleEvent(EVENT_SPELL_MANA_BURN, urand(3000,10000)); + events.RescheduleEvent(EVENT_SPELL_RENEW, urand(3000, 10000)); + events.RescheduleEvent(EVENT_SPELL_SHIELD, urand(3000, 10000)); + events.RescheduleEvent(EVENT_SPELL_FLASH_HEAL, urand(3000, 10000)); + events.RescheduleEvent(EVENT_SPELL_DISPEL, urand(3000, 10000)); + events.RescheduleEvent(EVENT_SPELL_MANA_BURN, urand(3000, 10000)); events.RescheduleEvent(EVENT_SPELL_PSYCHIC_SCREAM, 10000); } @@ -684,32 +685,32 @@ public: case EVENT_SPELL_RENEW: if( Creature* target = SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_RENEW, 40.0f) ) me->CastSpell(target, SPELL_RENEW, false); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_SHIELD: if( Creature* target = SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_SHIELD, 40.0f) ) me->CastSpell(target, SPELL_SHIELD, false); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_FLASH_HEAL: if( Creature* target = SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_FLASH_HEAL, 40.0f) ) me->CastSpell(target, SPELL_FLASH_HEAL, false); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_DISPEL: - if( Unit* target = (urand(0,1) ? SelectTarget(SELECT_TARGET_TOPAGGRO, 0, 30.0f, true) : SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_DISPEL, 40.0f)) ) + if( Unit* target = (urand(0, 1) ? SelectTarget(SELECT_TARGET_TOPAGGRO, 0, 30.0f, true) : SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_DISPEL, 40.0f)) ) me->CastSpell(target, SPELL_DISPEL, false); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_MANA_BURN: if( Unit* target = SelectEnemyCaster(false, 30.0f) ) { me->CastSpell(target, SPELL_MANA_BURN, false); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); EventMapGCD(events, 1500); } else @@ -760,25 +761,25 @@ class npc_toc_shadow_priest : public CreatureScript public: npc_toc_shadow_priest() : CreatureScript("npc_toc_shadow_priest") {} - CreatureAI* GetAI(Creature *pCreature) const + CreatureAI* GetAI(Creature* pCreature) const { return new npc_toc_shadow_priestAI (pCreature); } struct npc_toc_shadow_priestAI : public boss_faction_championsAI { - npc_toc_shadow_priestAI(Creature *pCreature) : boss_faction_championsAI(pCreature, AI_RANGED) + npc_toc_shadow_priestAI(Creature* pCreature) : boss_faction_championsAI(pCreature, AI_RANGED) { SetEquipmentSlots(false, 50040, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); events.Reset(); - events.RescheduleEvent(EVENT_SPELL_SILENCE, urand(3000,10000)); - events.RescheduleEvent(EVENT_SPELL_VAMPIRIC_TOUCH, urand(3000,10000)); - events.RescheduleEvent(EVENT_SPELL_SW_PAIN, urand(3000,10000)); - events.RescheduleEvent(EVENT_SPELL_MIND_FLAY, urand(3000,10000)); - events.RescheduleEvent(EVENT_SPELL_MIND_BLAST, urand(3000,10000)); - events.RescheduleEvent(EVENT_SPELL_HORROR, urand(3000,10000)); + events.RescheduleEvent(EVENT_SPELL_SILENCE, urand(3000, 10000)); + events.RescheduleEvent(EVENT_SPELL_VAMPIRIC_TOUCH, urand(3000, 10000)); + events.RescheduleEvent(EVENT_SPELL_SW_PAIN, urand(3000, 10000)); + events.RescheduleEvent(EVENT_SPELL_MIND_FLAY, urand(3000, 10000)); + events.RescheduleEvent(EVENT_SPELL_MIND_BLAST, urand(3000, 10000)); + events.RescheduleEvent(EVENT_SPELL_HORROR, urand(3000, 10000)); events.RescheduleEvent(EVENT_SPELL_DISPERSION, 10000); - events.RescheduleEvent(EVENT_SPELL_DISPEL, urand(5000,10000)); + events.RescheduleEvent(EVENT_SPELL_DISPEL, urand(5000, 10000)); events.RescheduleEvent(EVENT_SPELL_PSYCHIC_SCREAM, 10000); } @@ -818,25 +819,25 @@ public: case EVENT_SPELL_VAMPIRIC_TOUCH: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_VAMPIRIC_TOUCH, false); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_SW_PAIN: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_SW_PAIN, false); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_MIND_FLAY: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_MIND_FLAY, false); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_MIND_BLAST: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_MIND_BLAST, false); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_HORROR: @@ -860,9 +861,9 @@ public: events.RepeatEvent(6000); break; case EVENT_SPELL_DISPEL: - if( Unit* target = (urand(0,1) ? SelectTarget(SELECT_TARGET_TOPAGGRO, 0, 30.0f, true) : SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_DISPEL, 40.0f)) ) + if( Unit* target = (urand(0, 1) ? SelectTarget(SELECT_TARGET_TOPAGGRO, 0, 30.0f, true) : SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_DISPEL, 40.0f)) ) me->CastSpell(target, SPELL_DISPEL, false); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_PSYCHIC_SCREAM: @@ -914,25 +915,25 @@ class npc_toc_warlock : public CreatureScript public: npc_toc_warlock() : CreatureScript("npc_toc_warlock") { } - CreatureAI* GetAI(Creature *pCreature) const + CreatureAI* GetAI(Creature* pCreature) const { return new npc_toc_warlockAI (pCreature); } struct npc_toc_warlockAI : public boss_faction_championsAI { - npc_toc_warlockAI(Creature *pCreature) : boss_faction_championsAI(pCreature, AI_RANGED) + npc_toc_warlockAI(Creature* pCreature) : boss_faction_championsAI(pCreature, AI_RANGED) { SetEquipmentSlots(false, 49992, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); events.Reset(); events.RescheduleEvent(EVENT_SPELL_HELLFIRE, 10000); - events.RescheduleEvent(EVENT_SPELL_CORRUPTION, urand(3000,10000)); - events.RescheduleEvent(EVENT_SPELL_CURSE_OF_AGONY, urand(3000,10000)); - events.RescheduleEvent(EVENT_SPELL_CURSE_OF_EXHAUSTION, urand(3000,10000)); - events.RescheduleEvent(EVENT_SPELL_FEAR, urand(3000,10000)); - events.RescheduleEvent(EVENT_SPELL_SEARING_PAIN, urand(3000,10000)); - events.RescheduleEvent(EVENT_SPELL_SHADOW_BOLT, urand(3000,10000)); - events.RescheduleEvent(EVENT_SPELL_UNSTABLE_AFFLICTION, urand(3000,10000)); + events.RescheduleEvent(EVENT_SPELL_CORRUPTION, urand(3000, 10000)); + events.RescheduleEvent(EVENT_SPELL_CURSE_OF_AGONY, urand(3000, 10000)); + events.RescheduleEvent(EVENT_SPELL_CURSE_OF_EXHAUSTION, urand(3000, 10000)); + events.RescheduleEvent(EVENT_SPELL_FEAR, urand(3000, 10000)); + events.RescheduleEvent(EVENT_SPELL_SEARING_PAIN, urand(3000, 10000)); + events.RescheduleEvent(EVENT_SPELL_SHADOW_BOLT, urand(3000, 10000)); + events.RescheduleEvent(EVENT_SPELL_UNSTABLE_AFFLICTION, urand(3000, 10000)); events.RescheduleEvent(EVENT_SPELL_SUMMON_FELHUNTER, 0); } @@ -981,43 +982,43 @@ public: case EVENT_SPELL_CORRUPTION: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_CORRUPTION, false); - events.RepeatEvent(urand(10000,20000)); + events.RepeatEvent(urand(10000, 20000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_CURSE_OF_AGONY: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_CURSE_OF_AGONY, false); - events.RepeatEvent(urand(10000,20000)); + events.RepeatEvent(urand(10000, 20000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_CURSE_OF_EXHAUSTION: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_CURSE_OF_EXHAUSTION, false); - events.RepeatEvent(urand(10000,20000)); + events.RepeatEvent(urand(10000, 20000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_FEAR: if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 20.0f, true) ) me->CastSpell(target, SPELL_FEAR, false); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_SEARING_PAIN: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_SEARING_PAIN, false); - events.RepeatEvent(urand(5000,15000)); + events.RepeatEvent(urand(5000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_SHADOW_BOLT: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_SHADOW_BOLT, false); - events.RepeatEvent(urand(5000,15000)); + events.RepeatEvent(urand(5000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_UNSTABLE_AFFLICTION: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_UNSTABLE_AFFLICTION, false); - events.RepeatEvent(urand(5000,15000)); + events.RepeatEvent(urand(5000, 15000)); EventMapGCD(events, 1500); break; } @@ -1058,25 +1059,25 @@ class npc_toc_mage : public CreatureScript public: npc_toc_mage() : CreatureScript("npc_toc_mage") { } - CreatureAI* GetAI(Creature *pCreature) const + CreatureAI* GetAI(Creature* pCreature) const { return new npc_toc_mageAI (pCreature); } struct npc_toc_mageAI : public boss_faction_championsAI { - npc_toc_mageAI(Creature *pCreature) : boss_faction_championsAI(pCreature, AI_RANGED) + npc_toc_mageAI(Creature* pCreature) : boss_faction_championsAI(pCreature, AI_RANGED) { SetEquipmentSlots(false, 47524, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); events.Reset(); - events.RescheduleEvent(EVENT_SPELL_ARCANE_BARRAGE, urand(3000,10000)); - events.RescheduleEvent(EVENT_SPELL_ARCANE_BLAST, urand(3000,10000)); - events.RescheduleEvent(EVENT_SPELL_ARCANE_EXPLOSION, urand(3000,10000)); + events.RescheduleEvent(EVENT_SPELL_ARCANE_BARRAGE, urand(3000, 10000)); + events.RescheduleEvent(EVENT_SPELL_ARCANE_BLAST, urand(3000, 10000)); + events.RescheduleEvent(EVENT_SPELL_ARCANE_EXPLOSION, urand(3000, 10000)); events.RescheduleEvent(EVENT_SPELL_BLINK, 10000); - events.RescheduleEvent(EVENT_SPELL_COUNTERSPELL, urand(10000,20000)); - events.RescheduleEvent(EVENT_SPELL_FROSTBOLT, urand(3000,10000)); + events.RescheduleEvent(EVENT_SPELL_COUNTERSPELL, urand(10000, 20000)); + events.RescheduleEvent(EVENT_SPELL_FROSTBOLT, urand(3000, 10000)); events.RescheduleEvent(EVENT_SPELL_ICE_BLOCK, 10000); - events.RescheduleEvent(EVENT_SPELL_POLYMORPH, urand(5000,10000)); + events.RescheduleEvent(EVENT_SPELL_POLYMORPH, urand(5000, 10000)); } EventMap events; @@ -1104,13 +1105,13 @@ public: case EVENT_SPELL_ARCANE_BARRAGE: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_ARCANE_BARRAGE, false); - events.RepeatEvent(urand(5000,15000)); + events.RepeatEvent(urand(5000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_ARCANE_BLAST: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_ARCANE_BLAST, false); - events.RepeatEvent(urand(5000,15000)); + events.RepeatEvent(urand(5000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_ARCANE_EXPLOSION: @@ -1147,7 +1148,7 @@ public: case EVENT_SPELL_FROSTBOLT: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_FROSTBOLT, false); - events.RepeatEvent(urand(5000,15000)); + events.RepeatEvent(urand(5000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_ICE_BLOCK: @@ -1205,25 +1206,25 @@ class npc_toc_hunter : public CreatureScript public: npc_toc_hunter() : CreatureScript("npc_toc_hunter") { } - CreatureAI* GetAI(Creature *pCreature) const + CreatureAI* GetAI(Creature* pCreature) const { return new npc_toc_hunterAI (pCreature); } struct npc_toc_hunterAI : public boss_faction_championsAI { - npc_toc_hunterAI(Creature *pCreature) : boss_faction_championsAI(pCreature, AI_RANGED) + npc_toc_hunterAI(Creature* pCreature) : boss_faction_championsAI(pCreature, AI_RANGED) { SetEquipmentSlots(false, 47156, EQUIP_NO_CHANGE, 48711); events.Reset(); - events.RescheduleEvent(EVENT_SPELL_AIMED_SHOT, urand(3000,10000)); + events.RescheduleEvent(EVENT_SPELL_AIMED_SHOT, urand(3000, 10000)); events.RescheduleEvent(EVENT_SPELL_DETERRENCE, 10000); //events.RescheduleEvent(EVENT_SPELL_DISENGAGE, 10000); - events.RescheduleEvent(EVENT_SPELL_EXPLOSIVE_SHOT, urand(3000,10000)); - events.RescheduleEvent(EVENT_SPELL_FROST_TRAP, urand(15000,20000)); - events.RescheduleEvent(EVENT_SPELL_STEADY_SHOT, urand(3000,10000)); + events.RescheduleEvent(EVENT_SPELL_EXPLOSIVE_SHOT, urand(3000, 10000)); + events.RescheduleEvent(EVENT_SPELL_FROST_TRAP, urand(15000, 20000)); + events.RescheduleEvent(EVENT_SPELL_STEADY_SHOT, urand(3000, 10000)); events.RescheduleEvent(EVENT_SPELL_WING_CLIP, 10000); - events.RescheduleEvent(EVENT_SPELL_WYVERN_STING, urand(5000,15000)); + events.RescheduleEvent(EVENT_SPELL_WYVERN_STING, urand(5000, 15000)); events.RescheduleEvent(EVENT_SPELL_CALL_PET, 0); } @@ -1262,7 +1263,7 @@ public: case EVENT_SPELL_AIMED_SHOT: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_AIMED_SHOT, false); - events.RepeatEvent(urand(5000,15000)); + events.RepeatEvent(urand(5000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_DETERRENCE: @@ -1288,7 +1289,7 @@ public: case EVENT_SPELL_EXPLOSIVE_SHOT: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_EXPLOSIVE_SHOT, false); - events.RepeatEvent(urand(5000,15000)); + events.RepeatEvent(urand(5000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_FROST_TRAP: @@ -1299,7 +1300,7 @@ public: case EVENT_SPELL_STEADY_SHOT: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_STEADY_SHOT, false); - events.RepeatEvent(urand(5000,15000)); + events.RepeatEvent(urand(5000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_WING_CLIP: @@ -1358,26 +1359,26 @@ class npc_toc_boomkin : public CreatureScript public: npc_toc_boomkin() : CreatureScript("npc_toc_boomkin") { } - CreatureAI* GetAI(Creature *pCreature) const + CreatureAI* GetAI(Creature* pCreature) const { return new npc_toc_boomkinAI (pCreature); } struct npc_toc_boomkinAI : public boss_faction_championsAI { - npc_toc_boomkinAI(Creature *pCreature) : boss_faction_championsAI(pCreature, AI_RANGED) + npc_toc_boomkinAI(Creature* pCreature) : boss_faction_championsAI(pCreature, AI_RANGED) { SetEquipmentSlots(false, 50966, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); events.Reset(); events.RescheduleEvent(EVENT_SPELL_BARKSKIN, 10000); - events.RescheduleEvent(EVENT_SPELL_WRATH, urand(3000,10000)); - events.RescheduleEvent(EVENT_SPELL_MOONFIRE, urand(3000,10000)); - events.RescheduleEvent(EVENT_SPELL_STARFIRE, urand(3000,10000)); - events.RescheduleEvent(EVENT_SPELL_INSECT_SWARM, urand(3000,10000)); - events.RescheduleEvent(EVENT_SPELL_ENTANGLING_ROOTS, urand(3000,10000)); - events.RescheduleEvent(EVENT_SPELL_FAERIE_FIRE, urand(3000,10000)); - events.RescheduleEvent(EVENT_SPELL_CYCLONE, urand(10000,15000)); - events.RescheduleEvent(EVENT_SPELL_FORCE_OF_NATURE, urand(20000,40000)); + events.RescheduleEvent(EVENT_SPELL_WRATH, urand(3000, 10000)); + events.RescheduleEvent(EVENT_SPELL_MOONFIRE, urand(3000, 10000)); + events.RescheduleEvent(EVENT_SPELL_STARFIRE, urand(3000, 10000)); + events.RescheduleEvent(EVENT_SPELL_INSECT_SWARM, urand(3000, 10000)); + events.RescheduleEvent(EVENT_SPELL_ENTANGLING_ROOTS, urand(3000, 10000)); + events.RescheduleEvent(EVENT_SPELL_FAERIE_FIRE, urand(3000, 10000)); + events.RescheduleEvent(EVENT_SPELL_CYCLONE, urand(10000, 15000)); + events.RescheduleEvent(EVENT_SPELL_FORCE_OF_NATURE, urand(20000, 40000)); } EventMap events; @@ -1421,43 +1422,43 @@ public: case EVENT_SPELL_WRATH: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_WRATH, false); - events.RepeatEvent(urand(5000,15000)); + events.RepeatEvent(urand(5000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_MOONFIRE: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_MOONFIRE, false); - events.RepeatEvent(urand(5000,15000)); + events.RepeatEvent(urand(5000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_STARFIRE: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_STARFIRE, false); - events.RepeatEvent(urand(5000,15000)); + events.RepeatEvent(urand(5000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_INSECT_SWARM: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_INSECT_SWARM, false); - events.RepeatEvent(urand(5000,15000)); + events.RepeatEvent(urand(5000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_ENTANGLING_ROOTS: if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true) ) me->CastSpell(target, SPELL_ENTANGLING_ROOTS, false); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_FAERIE_FIRE: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_FAERIE_FIRE, false); - events.RepeatEvent(urand(15000,20000)); + events.RepeatEvent(urand(15000, 20000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_CYCLONE: if( Unit* target = SelectTarget(SELECT_TARGET_NEAREST, 0, 20.0f, true) ) me->CastSpell(target, SPELL_CYCLONE, false); - events.RepeatEvent(urand(25000,40000)); + events.RepeatEvent(urand(25000, 40000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_FORCE_OF_NATURE: @@ -1503,26 +1504,26 @@ class npc_toc_warrior : public CreatureScript public: npc_toc_warrior() : CreatureScript("npc_toc_warrior") { } - CreatureAI* GetAI(Creature *pCreature) const + CreatureAI* GetAI(Creature* pCreature) const { return new npc_toc_warriorAI (pCreature); } struct npc_toc_warriorAI : public boss_faction_championsAI { - npc_toc_warriorAI(Creature *pCreature) : boss_faction_championsAI(pCreature, AI_MELEE) + npc_toc_warriorAI(Creature* pCreature) : boss_faction_championsAI(pCreature, AI_MELEE) { SetEquipmentSlots(false, 47427, 46964, EQUIP_NO_CHANGE); events.Reset(); events.RescheduleEvent(EVENT_SPELL_BLADESTORM, 20000); events.RescheduleEvent(EVENT_SPELL_INTIMIDATING_SHOUT, 14000); - events.RescheduleEvent(EVENT_SPELL_MORTAL_STRIKE, urand(5000,10000)); + events.RescheduleEvent(EVENT_SPELL_MORTAL_STRIKE, urand(5000, 10000)); events.RescheduleEvent(EVENT_SPELL_CHARGE, 3000); - events.RescheduleEvent(EVENT_SPELL_DISARM, urand(15000,25000)); - events.RescheduleEvent(EVENT_SPELL_OVERPOWER, urand(5000,10000)); - events.RescheduleEvent(EVENT_SPELL_SUNDER_ARMOR, urand(5000,10000)); - events.RescheduleEvent(EVENT_SPELL_SHATTERING_THROW, urand(25000,40000)); - events.RescheduleEvent(EVENT_SPELL_RETALIATION, urand(25000,40000)); + events.RescheduleEvent(EVENT_SPELL_DISARM, urand(15000, 25000)); + events.RescheduleEvent(EVENT_SPELL_OVERPOWER, urand(5000, 10000)); + events.RescheduleEvent(EVENT_SPELL_SUNDER_ARMOR, urand(5000, 10000)); + events.RescheduleEvent(EVENT_SPELL_SHATTERING_THROW, urand(25000, 40000)); + events.RescheduleEvent(EVENT_SPELL_RETALIATION, urand(25000, 40000)); } EventMap events; @@ -1580,7 +1581,7 @@ public: } if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_MORTAL_STRIKE, false); - events.RepeatEvent(urand(6000,8000)); + events.RepeatEvent(urand(6000, 8000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_CHARGE: @@ -1612,7 +1613,7 @@ public: if( me->GetVictim() && me->GetDistance2d(me->GetVictim()) < 5.0f ) { me->CastSpell(me->GetVictim(), SPELL_OVERPOWER, false); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); EventMapGCD(events, 1500); } else @@ -1627,7 +1628,7 @@ public: if( me->GetVictim() && me->GetDistance2d(me->GetVictim()) < 5.0f ) { me->CastSpell(me->GetVictim(), SPELL_SUNDER_ARMOR, false); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); EventMapGCD(events, 1500); } else @@ -1697,24 +1698,24 @@ class npc_toc_dk : public CreatureScript public: npc_toc_dk() : CreatureScript("npc_toc_dk") { } - CreatureAI* GetAI(Creature *pCreature) const + CreatureAI* GetAI(Creature* pCreature) const { return new npc_toc_dkAI (pCreature); } struct npc_toc_dkAI : public boss_faction_championsAI { - npc_toc_dkAI(Creature *pCreature) : boss_faction_championsAI(pCreature, AI_MELEE) + npc_toc_dkAI(Creature* pCreature) : boss_faction_championsAI(pCreature, AI_MELEE) { SetEquipmentSlots(false, 47518, 51021, EQUIP_NO_CHANGE); events.Reset(); - events.RescheduleEvent(EVENT_SPELL_CHAINS_OF_ICE, urand(3000,10000)); - events.RescheduleEvent(EVENT_SPELL_DEATH_COIL, urand(3000,10000)); + events.RescheduleEvent(EVENT_SPELL_CHAINS_OF_ICE, urand(3000, 10000)); + events.RescheduleEvent(EVENT_SPELL_DEATH_COIL, urand(3000, 10000)); events.RescheduleEvent(EVENT_SPELL_DEATH_GRIP, 0); - events.RescheduleEvent(EVENT_SPELL_FROST_STRIKE, urand(3000,10000)); + events.RescheduleEvent(EVENT_SPELL_FROST_STRIKE, urand(3000, 10000)); events.RescheduleEvent(EVENT_SPELL_ICEBOUND_FORTITUDE, 10000); - events.RescheduleEvent(EVENT_SPELL_ICY_TOUCH, urand(3000,10000)); - events.RescheduleEvent(EVENT_SPELL_STRANGULATE, urand(20000,30000)); + events.RescheduleEvent(EVENT_SPELL_ICY_TOUCH, urand(3000, 10000)); + events.RescheduleEvent(EVENT_SPELL_STRANGULATE, urand(20000, 30000)); } EventMap events; @@ -1743,7 +1744,7 @@ public: if( me->GetVictim() && me->GetDistance2d(me->GetVictim()) <= 25.0f ) { me->CastSpell(me->GetVictim(), SPELL_CHAINS_OF_ICE, false); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); EventMapGCD(events, 1500); } else @@ -1753,7 +1754,7 @@ public: if( me->GetVictim() && me->GetDistance2d(me->GetVictim()) <= 30.0f ) { me->CastSpell(me->GetVictim(), SPELL_DEATH_COIL, false); - events.RepeatEvent(urand(5000,8000)); + events.RepeatEvent(urand(5000, 8000)); EventMapGCD(events, 1500); } else @@ -1765,7 +1766,7 @@ public: me->CastSpell(me->GetVictim(), SPELL_DEATH_GRIP, false); Position pos; float x, y, z; - me->GetClosePoint(x,y,z,3.0f); + me->GetClosePoint(x, y, z, 3.0f); pos.Relocate(x, y, z); me->GetVictim()->CastSpell(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), 49575, true); events.RepeatEvent(35000); @@ -1783,7 +1784,7 @@ public: if( me->GetVictim() && me->GetDistance2d(me->GetVictim()) < 5.0f ) { me->CastSpell(me->GetVictim(), SPELL_FROST_STRIKE, false); - events.RepeatEvent(urand(6000,10000)); + events.RepeatEvent(urand(6000, 10000)); EventMapGCD(events, 1500); } else @@ -1803,7 +1804,7 @@ public: if( me->GetVictim() && me->GetDistance2d(me->GetVictim()) < 20.0f ) { me->CastSpell(me->GetVictim(), SPELL_ICY_TOUCH, false); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); EventMapGCD(events, 1500); } else @@ -1853,25 +1854,25 @@ class npc_toc_rogue : public CreatureScript public: npc_toc_rogue() : CreatureScript("npc_toc_rogue") { } - CreatureAI* GetAI(Creature *pCreature) const + CreatureAI* GetAI(Creature* pCreature) const { return new npc_toc_rogueAI (pCreature); } struct npc_toc_rogueAI : public boss_faction_championsAI { - npc_toc_rogueAI(Creature *pCreature) : boss_faction_championsAI(pCreature, AI_MELEE) + npc_toc_rogueAI(Creature* pCreature) : boss_faction_championsAI(pCreature, AI_MELEE) { SetEquipmentSlots(false, 47422, 49982, EQUIP_NO_CHANGE); me->setPowerType(POWER_ENERGY); events.Reset(); events.RescheduleEvent(EVENT_SPELL_FAN_OF_KNIVES, 10000); - events.RescheduleEvent(EVENT_SPELL_BLIND, urand(10000,15000)); + events.RescheduleEvent(EVENT_SPELL_BLIND, urand(10000, 15000)); events.RescheduleEvent(EVENT_SPELL_CLOAK, 10000); - events.RescheduleEvent(EVENT_SPELL_BLADE_FLURRY, urand(20000,40000)); + events.RescheduleEvent(EVENT_SPELL_BLADE_FLURRY, urand(20000, 40000)); //events.RescheduleEvent(EVENT_SPELL_SHADOWSTEP, urand(15000,25000)); - events.RescheduleEvent(EVENT_SPELL_HEMORRHAGE, urand(3000,5000)); - events.RescheduleEvent(EVENT_SPELL_EVISCERATE, urand(20000,25000)); + events.RescheduleEvent(EVENT_SPELL_HEMORRHAGE, urand(3000, 5000)); + events.RescheduleEvent(EVENT_SPELL_EVISCERATE, urand(20000, 25000)); } EventMap events; @@ -1905,7 +1906,7 @@ public: if( EnemiesInRange(10.0f) >= 3 ) { me->CastSpell(me->GetVictim(), SPELL_FAN_OF_KNIVES, false); - events.RepeatEvent(urand(6000,10000)); + events.RepeatEvent(urand(6000, 10000)); EventMapGCD(events, 1500); } else @@ -1975,7 +1976,7 @@ public: if( me->GetVictim() && me->GetDistance2d(me->GetVictim()) <= 5.0f ) { me->CastSpell(me->GetVictim(), SPELL_EVISCERATE, false); - events.RepeatEvent(urand(15000,25000)); + events.RepeatEvent(urand(15000, 25000)); EventMapGCD(events, 1500); } else @@ -2012,25 +2013,25 @@ class npc_toc_enh_shaman : public CreatureScript public: npc_toc_enh_shaman() : CreatureScript("npc_toc_enh_shaman") { } - CreatureAI* GetAI(Creature *pCreature) const + CreatureAI* GetAI(Creature* pCreature) const { return new npc_toc_enh_shamanAI (pCreature); } struct npc_toc_enh_shamanAI : public boss_faction_championsAI { - npc_toc_enh_shamanAI(Creature *pCreature) : boss_faction_championsAI(pCreature, AI_MELEE) + npc_toc_enh_shamanAI(Creature* pCreature) : boss_faction_championsAI(pCreature, AI_MELEE) { SetEquipmentSlots(false, 51803, 48013, EQUIP_NO_CHANGE); me->SetModifierValue(UNIT_MOD_DAMAGE_OFFHAND, TOTAL_PCT, 1.0f); me->UpdateDamagePhysical(OFF_ATTACK); events.Reset(); - events.RescheduleEvent(EVENT_SPELL_HEROISM_OR_BLOODLUST, urand(25000,40000)); - events.RescheduleEvent(EVENT_SPELL_EARTH_SHOCK_ENH, urand(3000,10000)); - events.RescheduleEvent(EVENT_SPELL_LAVA_LASH, urand(3000,10000)); - events.RescheduleEvent(EVENT_SPELL_STORMSTRIKE, urand(3000,10000)); - events.RescheduleEvent(EVENT_SUMMON_TOTEM, urand(10000,20000)); + events.RescheduleEvent(EVENT_SPELL_HEROISM_OR_BLOODLUST, urand(25000, 40000)); + events.RescheduleEvent(EVENT_SPELL_EARTH_SHOCK_ENH, urand(3000, 10000)); + events.RescheduleEvent(EVENT_SPELL_LAVA_LASH, urand(3000, 10000)); + events.RescheduleEvent(EVENT_SPELL_STORMSTRIKE, urand(3000, 10000)); + events.RescheduleEvent(EVENT_SUMMON_TOTEM, urand(10000, 20000)); } EventMap events; @@ -2064,7 +2065,7 @@ public: if( Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 0, 25.0f, true) ) { me->CastSpell(target, SPELL_EARTH_SHOCK_ENH, false); - events.RepeatEvent(urand(6000,8000)); + events.RepeatEvent(urand(6000, 8000)); EventMapGCD(events, 1500); } else @@ -2079,7 +2080,7 @@ public: if( Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 0, 5.0f, true) ) { me->CastSpell(target, SPELL_LAVA_LASH, false); - events.RepeatEvent(urand(6000,8000)); + events.RepeatEvent(urand(6000, 8000)); EventMapGCD(events, 1500); } else @@ -2094,7 +2095,7 @@ public: if( Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 0, 5.0f, true) ) { me->CastSpell(target, SPELL_STORMSTRIKE, false); - events.RepeatEvent(urand(8000,9000)); + events.RepeatEvent(urand(8000, 9000)); EventMapGCD(events, 1500); } else @@ -2109,7 +2110,7 @@ public: EventMapGCD(events, 1500); break; case EVENT_SUMMON_TOTEM: - me->CastSpell((Unit*)NULL, RAND(SPELL_GROUNDING_TOTEM,SPELL_WINDFURY_TOTEM,SPELL_TREMOR_TOTEM), false); + me->CastSpell((Unit*)NULL, RAND(SPELL_GROUNDING_TOTEM, SPELL_WINDFURY_TOTEM, SPELL_TREMOR_TOTEM), false); events.RepeatEvent(30000); EventMapGCD(events, 1500); break; @@ -2151,25 +2152,25 @@ class npc_toc_retro_paladin : public CreatureScript public: npc_toc_retro_paladin() : CreatureScript("npc_toc_retro_paladin") { } - CreatureAI* GetAI(Creature *pCreature) const + CreatureAI* GetAI(Creature* pCreature) const { return new npc_toc_retro_paladinAI (pCreature); } struct npc_toc_retro_paladinAI : public boss_faction_championsAI { - npc_toc_retro_paladinAI(Creature *pCreature) : boss_faction_championsAI(pCreature, AI_MELEE) + npc_toc_retro_paladinAI(Creature* pCreature) : boss_faction_championsAI(pCreature, AI_MELEE) { SetEquipmentSlots(false, 47519, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); events.Reset(); - events.RescheduleEvent(EVENT_SPELL_AVENGING_WRATH, urand(20000,30000)); - events.RescheduleEvent(EVENT_SPELL_CRUSADER_STRIKE, urand(3000,10000)); + events.RescheduleEvent(EVENT_SPELL_AVENGING_WRATH, urand(20000, 30000)); + events.RescheduleEvent(EVENT_SPELL_CRUSADER_STRIKE, urand(3000, 10000)); events.RescheduleEvent(EVENT_SPELL_DIVINE_SHIELD, 10000); - events.RescheduleEvent(EVENT_SPELL_DIVINE_STORM, urand(3000,10000)); - events.RescheduleEvent(EVENT_SPELL_HAMMER_OF_JUSTICE_RET, urand(15000,25000)); - events.RescheduleEvent(EVENT_SPELL_HAND_OF_PROTECTION_RET, urand(25000,40000)); - events.RescheduleEvent(EVENT_SPELL_JUDGEMENT_OF_COMMAND, urand(3000,10000)); - events.RescheduleEvent(EVENT_SPELL_REPENTANCE, urand(10000,15000)); + events.RescheduleEvent(EVENT_SPELL_DIVINE_STORM, urand(3000, 10000)); + events.RescheduleEvent(EVENT_SPELL_HAMMER_OF_JUSTICE_RET, urand(15000, 25000)); + events.RescheduleEvent(EVENT_SPELL_HAND_OF_PROTECTION_RET, urand(25000, 40000)); + events.RescheduleEvent(EVENT_SPELL_JUDGEMENT_OF_COMMAND, urand(3000, 10000)); + events.RescheduleEvent(EVENT_SPELL_REPENTANCE, urand(10000, 15000)); } EventMap events; @@ -2208,7 +2209,7 @@ public: if( Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 0, 5.0f, true) ) { me->CastSpell(target, SPELL_CRUSADER_STRIKE, false); - events.RepeatEvent(urand(6000,8000)); + events.RepeatEvent(urand(6000, 8000)); EventMapGCD(events, 1500); } else @@ -2233,7 +2234,7 @@ public: if( EnemiesInRange(5.0f) >= 3 ) { me->CastSpell((Unit*)NULL, SPELL_DIVINE_STORM, false); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); EventMapGCD(events, 1500); } else @@ -2263,7 +2264,7 @@ public: if( Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 0, 20.0f, true) ) { me->CastSpell(target, SPELL_JUDGEMENT_OF_COMMAND, false); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); EventMapGCD(events, 1500); } else @@ -2303,18 +2304,18 @@ class npc_toc_pet_warlock : public CreatureScript public: npc_toc_pet_warlock() : CreatureScript("npc_toc_pet_warlock") { } - CreatureAI* GetAI(Creature *pCreature) const + CreatureAI* GetAI(Creature* pCreature) const { return new npc_toc_pet_warlockAI (pCreature); } struct npc_toc_pet_warlockAI : public boss_faction_championsAI { - npc_toc_pet_warlockAI(Creature *pCreature) : boss_faction_championsAI(pCreature, AI_PET) + npc_toc_pet_warlockAI(Creature* pCreature) : boss_faction_championsAI(pCreature, AI_PET) { events.Reset(); - events.RescheduleEvent(EVENT_SPELL_DEVOUR_MAGIC, urand(5000,15000)); - events.RescheduleEvent(EVENT_SPELL_SPELL_LOCK, urand(5000,15000)); + events.RescheduleEvent(EVENT_SPELL_DEVOUR_MAGIC, urand(5000, 15000)); + events.RescheduleEvent(EVENT_SPELL_SPELL_LOCK, urand(5000, 15000)); } EventMap events; @@ -2342,7 +2343,7 @@ public: case EVENT_SPELL_DEVOUR_MAGIC: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_DEVOUR_MAGIC, false); - events.RepeatEvent(urand(8000,15000)); + events.RepeatEvent(urand(8000, 15000)); EventMapGCD(events, 1500); break; case EVENT_SPELL_SPELL_LOCK: @@ -2379,17 +2380,17 @@ class npc_toc_pet_hunter : public CreatureScript public: npc_toc_pet_hunter() : CreatureScript("npc_toc_pet_hunter") { } - CreatureAI* GetAI(Creature *pCreature) const + CreatureAI* GetAI(Creature* pCreature) const { return new npc_toc_pet_hunterAI (pCreature); } struct npc_toc_pet_hunterAI : public boss_faction_championsAI { - npc_toc_pet_hunterAI(Creature *pCreature) : boss_faction_championsAI(pCreature, AI_PET) + npc_toc_pet_hunterAI(Creature* pCreature) : boss_faction_championsAI(pCreature, AI_PET) { events.Reset(); - events.RescheduleEvent(EVENT_SPELL_CLAW, urand(5000,15000)); + events.RescheduleEvent(EVENT_SPELL_CLAW, urand(5000, 15000)); } EventMap events; @@ -2417,7 +2418,7 @@ public: case EVENT_SPELL_CLAW: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_CLAW, false); - events.RepeatEvent(urand(8000,15000)); + events.RepeatEvent(urand(8000, 15000)); break; } @@ -2445,7 +2446,7 @@ public: return false; for(std::vector::iterator itr = go->loot.items.begin(); itr != go->loot.items.end(); ++itr) - if( ItemTemplate const *iProto = sObjectMgr->GetItemTemplate((*itr).itemid) ) + if( ItemTemplate const* iProto = sObjectMgr->GetItemTemplate((*itr).itemid) ) if( ((iProto->Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY) && player->GetTeamId() != TEAM_HORDE) || ((iProto->Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY) && player->GetTeamId() != TEAM_ALLIANCE) ) if (!((*itr).is_looted)) { @@ -2461,36 +2462,36 @@ public: class spell_faction_champion_warl_unstable_affliction : public SpellScriptLoader { - public: - spell_faction_champion_warl_unstable_affliction() : SpellScriptLoader("spell_faction_champion_warl_unstable_affliction") { } +public: + spell_faction_champion_warl_unstable_affliction() : SpellScriptLoader("spell_faction_champion_warl_unstable_affliction") { } - class spell_faction_champion_warl_unstable_affliction_AuraScript : public AuraScript + class spell_faction_champion_warl_unstable_affliction_AuraScript : public AuraScript + { + PrepareAuraScript(spell_faction_champion_warl_unstable_affliction_AuraScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareAuraScript(spell_faction_champion_warl_unstable_affliction_AuraScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_UNSTABLE_AFFLICTION_DISPEL)) - return false; - return true; - } - - void HandleDispel(DispelInfo* dispelInfo) - { - if (Unit* caster = GetCaster()) - caster->CastSpell(dispelInfo->GetDispeller(), SPELL_UNSTABLE_AFFLICTION_DISPEL, true, NULL, GetEffect(EFFECT_0)); - } - - void Register() - { - AfterDispel += AuraDispelFn(spell_faction_champion_warl_unstable_affliction_AuraScript::HandleDispel); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_faction_champion_warl_unstable_affliction_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_UNSTABLE_AFFLICTION_DISPEL)) + return false; + return true; } + + void HandleDispel(DispelInfo* dispelInfo) + { + if (Unit* caster = GetCaster()) + caster->CastSpell(dispelInfo->GetDispeller(), SPELL_UNSTABLE_AFFLICTION_DISPEL, true, NULL, GetEffect(EFFECT_0)); + } + + void Register() + { + AfterDispel += AuraDispelFn(spell_faction_champion_warl_unstable_affliction_AuraScript::HandleDispel); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_faction_champion_warl_unstable_affliction_AuraScript(); + } }; void AddSC_boss_faction_champions() 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 44f2d4cc8..772b18d12 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp @@ -118,9 +118,9 @@ public: me->setActive(true); events.Reset(); events.RescheduleEvent(EVENT_SPELL_FEL_FIREBALL, 5000); - events.RescheduleEvent(EVENT_SPELL_FEL_LIGHTNING, urand(10000,15000)); - events.RescheduleEvent(EVENT_SPELL_INCINERATE_FLESH, urand(24000,26000)); - events.RescheduleEvent(EVENT_SPELL_NETHER_POWER, urand(25000,45000)); + events.RescheduleEvent(EVENT_SPELL_FEL_LIGHTNING, urand(10000, 15000)); + events.RescheduleEvent(EVENT_SPELL_INCINERATE_FLESH, urand(24000, 26000)); + events.RescheduleEvent(EVENT_SPELL_NETHER_POWER, urand(25000, 45000)); events.RescheduleEvent(EVENT_SPELL_LEGION_FLAME, 30000); //if( GetDifficulty() == RAID_DIFFICULTY_25MAN_HEROIC ) // events.RescheduleEvent(EVENT_SPELL_TOUCH_OF_JARAXXUS, urand(10000,15000)); @@ -151,15 +151,23 @@ public: uint32 id = 0; switch( me->GetMap()->GetDifficulty() ) { - case 0: id = 66228; break; - case 1: id = 67106; break; - case 2: id = 67107; break; - case 3: id = 67108; break; + case 0: + id = 66228; + break; + case 1: + id = 67106; + break; + case 2: + id = 67107; + break; + case 3: + id = 67108; + break; } if( Aura* a = me->GetAura(id) ) { if( a->GetStackAmount() > 1 ) - a->ModStackAmount(-1); + a->ModStackAmount(-1); else a->Remove(); caster->CastSpell(caster, SPELL_NETHER_POWER, true); @@ -188,12 +196,12 @@ public: case EVENT_SPELL_FEL_FIREBALL: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_FEL_FIREBALL, false); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); break; case EVENT_SPELL_FEL_LIGHTNING: if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true) ) me->CastSpell(target, SPELL_FEL_LIGHTNING, false); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); break; case EVENT_SPELL_INCINERATE_FLESH: if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true) ) @@ -202,12 +210,12 @@ public: Talk(SAY_INCINERATE); me->CastSpell(target, SPELL_INCINERATE_FLESH, false); } - events.RepeatEvent(urand(20000,25000)); + events.RepeatEvent(urand(20000, 25000)); break; case EVENT_SPELL_NETHER_POWER: me->CastSpell(me, SPELL_NETHER_POWER, false); events.DelayEvents(5000); - events.RepeatEvent(urand(25000,45000)); + events.RepeatEvent(urand(25000, 45000)); break; case EVENT_SPELL_LEGION_FLAME: if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true) ) @@ -220,7 +228,7 @@ public: case EVENT_SPELL_TOUCH_OF_JARAXXUS: if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true) ) me->CastSpell(target, SPELL_TOUCH_OF_JARAXXUS, false); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); break; case EVENT_SUMMON_NETHER_PORTAL: Talk(EMOTE_NETHER_PORTAL); @@ -296,7 +304,7 @@ public: DoZoneInCombat(); } events.Reset(); - events.RescheduleEvent(EVENT_SPELL_FEL_STEAK, urand(7000,20000)); + events.RescheduleEvent(EVENT_SPELL_FEL_STEAK, urand(7000, 20000)); } void UpdateAI(uint32 diff) @@ -367,10 +375,10 @@ public: DoZoneInCombat(); } events.Reset(); - events.RescheduleEvent(EVENT_SPELL_SHIVAN_SLASH, urand(10000,20000)); - events.RescheduleEvent(EVENT_SPELL_SPINNING_PAIN_SPIKE, urand(22000,30000)); + events.RescheduleEvent(EVENT_SPELL_SHIVAN_SLASH, urand(10000, 20000)); + events.RescheduleEvent(EVENT_SPELL_SPINNING_PAIN_SPIKE, urand(22000, 30000)); if( IsHeroic() ) - events.RescheduleEvent(EVENT_SPELL_MISTRESS_KISS, urand(10000,15000)); + events.RescheduleEvent(EVENT_SPELL_MISTRESS_KISS, urand(10000, 15000)); } void SpellHit(Unit* /*caster*/, const SpellInfo* /*spell*/) @@ -396,16 +404,16 @@ public: case EVENT_SPELL_SHIVAN_SLASH: if( me->GetVictim() ) me->CastSpell(me->GetVictim(), SPELL_SHIVAN_SLASH, false); - events.RepeatEvent(urand(15000,25000)); + events.RepeatEvent(urand(15000, 25000)); break; case EVENT_SPELL_SPINNING_PAIN_SPIKE: if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 140.0f, true) ) me->CastSpell(target, SPELL_SPINNING_PAIN_SPIKE, false); - events.RepeatEvent(urand(25000,30000)); + events.RepeatEvent(urand(25000, 30000)); break; case EVENT_SPELL_MISTRESS_KISS: me->CastSpell((Unit*)NULL, SPELL_MISTRESS_KISS, false); - events.RepeatEvent(urand(25000,35000)); + events.RepeatEvent(urand(25000, 35000)); break; } @@ -434,7 +442,7 @@ public: { PrepareAuraScript(spell_toc25_mistress_kiss_AuraScript) - void HandleEffectPeriodic(AuraEffect const * /*aurEff*/) + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) { if (Unit* caster = GetCaster()) if (Unit* target = GetTarget()) @@ -451,7 +459,7 @@ public: } }; - AuraScript *GetAuraScript() const + AuraScript* GetAuraScript() const { return new spell_toc25_mistress_kiss_AuraScript(); } @@ -459,42 +467,42 @@ public: class spell_mistress_kiss_area : public SpellScriptLoader { - public: - spell_mistress_kiss_area() : SpellScriptLoader("spell_mistress_kiss_area") {} +public: + spell_mistress_kiss_area() : SpellScriptLoader("spell_mistress_kiss_area") {} - class spell_mistress_kiss_area_SpellScript : public SpellScript + class spell_mistress_kiss_area_SpellScript : public SpellScript + { + PrepareSpellScript(spell_mistress_kiss_area_SpellScript) + + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_mistress_kiss_area_SpellScript) + // get a list of players with mana + targets.remove_if(acore::ObjectTypeIdCheck(TYPEID_PLAYER, false)); + targets.remove_if(acore::PowerCheck(POWER_MANA, false)); + if (targets.empty()) + return; - void FilterTargets(std::list& targets) - { - // get a list of players with mana - targets.remove_if(acore::ObjectTypeIdCheck(TYPEID_PLAYER, false)); - targets.remove_if(acore::PowerCheck(POWER_MANA, false)); - if (targets.empty()) - return; - - WorldObject* target = acore::Containers::SelectRandomContainerElement(targets); - targets.clear(); - targets.push_back(target); - } - - void HandleScript(SpellEffIndex /*effIndex*/) - { - GetCaster()->CastSpell(GetHitUnit(), uint32(GetEffectValue()), true); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mistress_kiss_area_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - OnEffectHitTarget += SpellEffectFn(spell_mistress_kiss_area_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_mistress_kiss_area_SpellScript(); + WorldObject* target = acore::Containers::SelectRandomContainerElement(targets); + targets.clear(); + targets.push_back(target); } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetCaster()->CastSpell(GetHitUnit(), uint32(GetEffectValue()), true); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mistress_kiss_area_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_mistress_kiss_area_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_mistress_kiss_area_SpellScript(); + } }; void AddSC_boss_jaraxxus() 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 6254402f8..a242cabdf 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp @@ -87,7 +87,7 @@ public: void Reset() { events.Reset(); - events.ScheduleEvent(EVENT_SPELL_FIRE_BOMB, urand(10000,30000)); + events.ScheduleEvent(EVENT_SPELL_FIRE_BOMB, urand(10000, 30000)); } void EnterCombat(Unit* /*who*/) @@ -127,7 +127,7 @@ public: if( Creature* gormok = ObjectAccessor::GetCreature(*me, pInstance->GetData64(TYPE_GORMOK)) ) if( gormok->IsAlive() ) if( Vehicle* vk = gormok->GetVehicleKit() ) - for( uint8 i=0; i<4; ++i ) + for( uint8 i = 0; i < 4; ++i ) if( !vk->GetPassenger(i) ) { me->EnterVehicleUnattackable(gormok, i); @@ -155,25 +155,25 @@ public: case EVENT_SPELL_BATTER: if( t->GetTypeId() == TYPEID_PLAYER ) me->CastSpell(t, SPELL_BATTER); - events.RepeatEvent(urand(6000,8000)); + events.RepeatEvent(urand(6000, 8000)); break; case EVENT_SPELL_FIRE_BOMB: { if( t->GetTypeId() != TYPEID_PLAYER && pInstance ) { std::vector validPlayers; - Map::PlayerList const &pl = me->GetMap()->GetPlayers(); + Map::PlayerList const& pl = me->GetMap()->GetPlayers(); Creature* gormok = ObjectAccessor::GetCreature(*me, pInstance->GetData64(TYPE_GORMOK)); for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr ) { if( Player* p = itr->GetSource() ) - if( p->IsAlive() && p->GetGUID()!=TargetGUID && (!gormok || !p->IsWithinMeleeRange(gormok)) ) + if( p->IsAlive() && p->GetGUID() != TargetGUID && (!gormok || !p->IsWithinMeleeRange(gormok)) ) validPlayers.push_back(p->GetGUID()); } if( !validPlayers.empty() ) - if( Player* p = ObjectAccessor::GetPlayer(*me, validPlayers.at(urand(0,validPlayers.size()-1))) ) + if( Player* p = ObjectAccessor::GetPlayer(*me, validPlayers.at(urand(0, validPlayers.size() - 1))) ) if( Creature* trigger = me->SummonCreature(NPC_FIRE_BOMB, *p, TEMPSUMMON_TIMED_DESPAWN, 60000) ) { me->CastSpell(trigger, SPELL_FIRE_BOMB_AURA, true); // periodic damage aura, speed 14.0f @@ -181,13 +181,13 @@ public: } } - events.RepeatEvent(urand(20000,30000)); + events.RepeatEvent(urand(20000, 30000)); } break; case EVENT_SPELL_HEAD_CRACK: if( t->GetTypeId() == TYPEID_PLAYER ) me->CastSpell(t, SPELL_HEAD_CRACK); - events.RepeatEvent(urand(30000,35000)); + events.RepeatEvent(urand(30000, 35000)); break; } @@ -247,13 +247,13 @@ public: { me->setActive(true); events.Reset(); - events.RescheduleEvent(EVENT_SPELL_IMPALE, urand(9000,10000)); + events.RescheduleEvent(EVENT_SPELL_IMPALE, urand(9000, 10000)); events.RescheduleEvent(EVENT_SPELL_STAGGERING_STOMP, 15000); - events.RescheduleEvent(EVENT_PICK_SNOBOLD_TARGET, urand(16000,24000)); + events.RescheduleEvent(EVENT_PICK_SNOBOLD_TARGET, urand(16000, 24000)); // refresh snobold position if( Vehicle* vk = me->GetVehicleKit() ) - for( uint8 i=0; i<4; ++i ) + for( uint8 i = 0; i < 4; ++i ) if( Unit* snobold = vk->GetPassenger(i) ) snobold->SendMovementFlagUpdate(); } @@ -284,22 +284,22 @@ public: { if( Unit* victim = me->GetVictim() ) me->CastSpell(victim, SPELL_IMPALE, false); - events.RepeatEvent(urand(9000,10000)); + events.RepeatEvent(urand(9000, 10000)); } else events.RepeatEvent(2500); break; case EVENT_SPELL_STAGGERING_STOMP: me->CastSpell((Unit*)NULL, SPELL_STAGGERING_STOMP, false); - events.RepeatEvent(urand(20000,25000)); + events.RepeatEvent(urand(20000, 25000)); break; case EVENT_PICK_SNOBOLD_TARGET: if( Vehicle* vk = me->GetVehicleKit() ) - for( uint8 i=0; i<4; ++i ) + for( uint8 i = 0; i < 4; ++i ) if( Unit* snobold = vk->GetPassenger(i) ) { std::vector validPlayers; - Map::PlayerList const &pl = me->GetMap()->GetPlayers(); + Map::PlayerList const& pl = me->GetMap()->GetPlayers(); for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr ) { if( Player* p = itr->GetSource() ) @@ -308,7 +308,7 @@ public: } if( !validPlayers.empty() ) - if( Player* p = ObjectAccessor::GetPlayer(*me, validPlayers.at(urand(0,validPlayers.size()-1))) ) + if( Player* p = ObjectAccessor::GetPlayer(*me, validPlayers.at(urand(0, validPlayers.size() - 1))) ) { snobold->ChangeSeat(4); // switch to hand me->setAttackTimer(BASE_ATTACK, 3000); @@ -318,7 +318,7 @@ public: break; } - events.RepeatEvent(urand(16000,24000)); + events.RepeatEvent(urand(16000, 24000)); break; case EVENT_RELEASE_SNOBOLD: { @@ -347,7 +347,7 @@ public: if( snobold->GetTypeId() == TYPEID_UNIT ) { bool needDespawn = true; - for( uint8 i=0; i<4; ++i ) + for( uint8 i = 0; i < 4; ++i ) if( !vk->GetPassenger(i) ) { snobold->ChangeSeat(i); @@ -503,17 +503,17 @@ struct boss_jormungarAI : public ScriptedAI { me->SetAttackTime(BASE_ATTACK, 1500); events.RescheduleEvent(EVENT_SPELL_SPRAY, (me->GetEntry() == NPC_ACIDMAW ? 20000 : 15000)); - events.RescheduleEvent(EVENT_SPELL_SWEEP, urand(15000,30000)); + events.RescheduleEvent(EVENT_SPELL_SWEEP, urand(15000, 30000)); } else { me->SetAttackTime(BASE_ATTACK, 2000); events.RescheduleEvent(EVENT_SPELL_BITE, (me->GetEntry() == NPC_ACIDMAW ? 20000 : 15000)); - events.RescheduleEvent(EVENT_SPELL_SPEW, urand(15000,30000)); + events.RescheduleEvent(EVENT_SPELL_SPEW, urand(15000, 30000)); events.RescheduleEvent(EVENT_SPELL_SLIME_POOL, 15000); } if( !me->HasAura(SPELL_ENRAGE) ) - events.RescheduleEvent(EVENT_SUBMERGE, urand(45000,50000)); + events.RescheduleEvent(EVENT_SUBMERGE, urand(45000, 50000)); } void EnterCombat(Unit* /*who*/) @@ -572,15 +572,15 @@ struct boss_jormungarAI : public ScriptedAI break; case EVENT_MOVE_UNDERGROUND: { - float angle=me->GetAngle(Locs[LOC_CENTER].GetPositionX()+urand(0,20)-10.0f, Locs[LOC_CENTER].GetPositionY()+urand(0,20)-10.0f), dist=urand(10,35); + float angle = me->GetAngle(Locs[LOC_CENTER].GetPositionX() + urand(0, 20) - 10.0f, Locs[LOC_CENTER].GetPositionY() + urand(0, 20) - 10.0f), dist = urand(10, 35); if( Creature* c = me->SummonCreature(NPC_WORLD_TRIGGER, *me, TEMPSUMMON_TIMED_DESPAWN, 6000) ) { c->SetSpeed(MOVE_RUN, 2.5f); c->CastSpell(c, SPELL_CHURNING_GROUND, true); c->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_PACIFIED); - c->GetMotionMaster()->MovePoint(0, Locs[LOC_CENTER].GetPositionX()+cos(angle)*dist, Locs[LOC_CENTER].GetPositionY()+sin(angle)*dist, me->GetPositionZ()); + c->GetMotionMaster()->MovePoint(0, Locs[LOC_CENTER].GetPositionX() + cos(angle)*dist, Locs[LOC_CENTER].GetPositionY() + sin(angle)*dist, me->GetPositionZ()); } - me->UpdatePosition(Locs[LOC_CENTER].GetPositionX()+cos(angle)*dist, Locs[LOC_CENTER].GetPositionY()+sin(angle)*dist, me->GetPositionZ(), me->GetOrientation(), true); + me->UpdatePosition(Locs[LOC_CENTER].GetPositionX() + cos(angle)*dist, Locs[LOC_CENTER].GetPositionY() + sin(angle)*dist, me->GetPositionZ(), me->GetOrientation(), true); me->StopMovingOnCurrentPos(); DoResetThreat(); events.PopEvent(); @@ -618,7 +618,7 @@ struct boss_jormungarAI : public ScriptedAI break; case EVENT_SPELL_SWEEP: me->CastSpell((Unit*)NULL, SPELL_SWEEP_0, false); - events.RepeatEvent(urand(15000,30000)); + events.RepeatEvent(urand(15000, 30000)); break; case EVENT_SPELL_BITE: if( Unit* victim = me->GetVictim() ) @@ -627,7 +627,7 @@ struct boss_jormungarAI : public ScriptedAI break; case EVENT_SPELL_SPEW: me->CastSpell(me->GetVictim(), _SPELL_SPEW, false); - events.RepeatEvent(urand(15000,30000)); + events.RepeatEvent(urand(15000, 30000)); break; case EVENT_SPELL_SLIME_POOL: if( Creature* c = me->SummonCreature(NPC_SLIME_POOL, *me, TEMPSUMMON_TIMED_DESPAWN, 30000) ) @@ -667,7 +667,7 @@ struct boss_jormungarAI : public ScriptedAI class boss_acidmaw : public CreatureScript { - public: +public: boss_acidmaw() : CreatureScript("boss_acidmaw") { } struct boss_acidmawAI : public boss_jormungarAI @@ -793,8 +793,8 @@ public: { me->setActive(true); events.Reset(); - events.ScheduleEvent(EVENT_SPELL_FEROCIOUS_BUTT, urand(15000,30000)); - events.RescheduleEvent(EVENT_SPELL_WHIRL, urand(10000,12000)); + events.ScheduleEvent(EVENT_SPELL_FEROCIOUS_BUTT, urand(15000, 30000)); + events.RescheduleEvent(EVENT_SPELL_WHIRL, urand(10000, 12000)); events.RescheduleEvent(EVENT_SPELL_ARCTIC_BREATH, 14000); events.RescheduleEvent(EVENT_JUMP_MIDDLE, 30000); } @@ -806,7 +806,7 @@ public: bool DoTrampleIfValid() { - Map::PlayerList const &lPlayers = me->GetMap()->GetPlayers(); + Map::PlayerList const& lPlayers = me->GetMap()->GetPlayers(); for( Map::PlayerList::const_iterator itr = lPlayers.begin(); itr != lPlayers.end(); ++itr ) if( Unit* p = itr->GetSource() ) if( p->IsAlive() && p->GetExactDist(me) <= 12.0f ) @@ -823,13 +823,13 @@ public: if( id == EVENT_CHARGE ) { events.Reset(); - events.RescheduleEvent(EVENT_SPELL_FEROCIOUS_BUTT, urand(5000,15000)); - events.RescheduleEvent(EVENT_SPELL_WHIRL, urand(2000,5000)); - events.RescheduleEvent(EVENT_SPELL_ARCTIC_BREATH, urand(5000,8000)); - events.RescheduleEvent(EVENT_JUMP_MIDDLE, urand(30000,50000)); + events.RescheduleEvent(EVENT_SPELL_FEROCIOUS_BUTT, urand(5000, 15000)); + events.RescheduleEvent(EVENT_SPELL_WHIRL, urand(2000, 5000)); + events.RescheduleEvent(EVENT_SPELL_ARCTIC_BREATH, urand(5000, 8000)); + events.RescheduleEvent(EVENT_JUMP_MIDDLE, urand(30000, 50000)); float angle = me->GetAngle(&Locs[LOC_CENTER]); - angle = angle >= M_PI ? angle-M_PI : angle+M_PI; + angle = angle >= M_PI ? angle - M_PI : angle + M_PI; me->UpdatePosition(destX, destY, destZ, angle, true); me->StopMovingOnCurrentPos(); @@ -868,16 +868,16 @@ public: case EVENT_SPELL_FEROCIOUS_BUTT: if( Unit* victim = me->GetVictim() ) me->CastSpell(victim, SPELL_FEROCIOUS_BUTT, false); - events.RepeatEvent(urand(15000,30000)); + events.RepeatEvent(urand(15000, 30000)); break; case EVENT_SPELL_WHIRL: me->CastSpell((Unit*)NULL, SPELL_WHIRL, false); - events.RepeatEvent(urand(15000,20000)); + events.RepeatEvent(urand(15000, 20000)); break; case EVENT_SPELL_ARCTIC_BREATH: if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 90.0f, true) ) me->CastSpell(target, SPELL_ARCTIC_BREATH, false); - events.RepeatEvent(urand(20000,30000)); + events.RepeatEvent(urand(20000, 30000)); break; case EVENT_JUMP_MIDDLE: me->StopMoving(); @@ -908,10 +908,10 @@ public: } else // in case something went wrong { - events.RescheduleEvent(EVENT_SPELL_FEROCIOUS_BUTT, urand(5000,15000)); - events.RescheduleEvent(EVENT_SPELL_WHIRL, urand(2000,5000)); - events.RescheduleEvent(EVENT_SPELL_ARCTIC_BREATH, urand(5000,8000)); - events.RescheduleEvent(EVENT_JUMP_MIDDLE, urand(30000,50000)); + events.RescheduleEvent(EVENT_SPELL_FEROCIOUS_BUTT, urand(5000, 15000)); + events.RescheduleEvent(EVENT_SPELL_WHIRL, urand(2000, 5000)); + events.RescheduleEvent(EVENT_SPELL_ARCTIC_BREATH, urand(5000, 8000)); + events.RescheduleEvent(EVENT_JUMP_MIDDLE, urand(30000, 50000)); me->GetMotionMaster()->MovementExpired(); me->SetReactState(REACT_AGGRESSIVE); } @@ -923,17 +923,17 @@ public: if( Unit* target = ObjectAccessor::GetPlayer(*me, TargetGUID) ) angle = me->GetAngle(target); else // in case something went wrong - angle = rand_norm()*2*M_PI; + angle = rand_norm() * 2 * M_PI; - float jumpangle = angle >= M_PI ? angle-M_PI : angle+M_PI; + float jumpangle = angle >= M_PI ? angle - M_PI : angle + M_PI; float dist = 50.0f; if( angle > 1.0f && angle < 2.0f ) // near main gate dist = 46.0f; - destX = Locs[LOC_CENTER].GetPositionX()+cos(angle)*dist; - destY = Locs[LOC_CENTER].GetPositionY()+sin(angle)*dist; - destZ = Locs[LOC_CENTER].GetPositionZ()+1.0f; + destX = Locs[LOC_CENTER].GetPositionX() + cos(angle) * dist; + destY = Locs[LOC_CENTER].GetPositionY() + sin(angle) * dist; + destZ = Locs[LOC_CENTER].GetPositionZ() + 1.0f; me->StopMoving(); - me->GetMotionMaster()->MoveJump(Locs[LOC_CENTER].GetPositionX()+cos(jumpangle)*35.0f, Locs[LOC_CENTER].GetPositionY()+sin(jumpangle)*35.0f, Locs[LOC_CENTER].GetPositionZ()+1.0f, 40.0f, 12.0f); + me->GetMotionMaster()->MoveJump(Locs[LOC_CENTER].GetPositionX() + cos(jumpangle) * 35.0f, Locs[LOC_CENTER].GetPositionY() + sin(jumpangle) * 35.0f, Locs[LOC_CENTER].GetPositionZ() + 1.0f, 40.0f, 12.0f); events.PopEvent(); events.RescheduleEvent(EVENT_TRAMPLE, 1500); @@ -962,7 +962,7 @@ public: //Talk(EMOTE_TRAMPLE_START); me->DisableSpline(); me->GetMotionMaster()->Clear(); - me->GetMotionMaster()->MoveCharge(destX, destY, destZ+1.0f, 65.0f); + me->GetMotionMaster()->MoveCharge(destX, destY, destZ + 1.0f, 65.0f); me->SetUInt64Value(UNIT_FIELD_TARGET, 0); events.RescheduleEvent(EVENT_CHECK_TRAMPLE_PLAYERS, 100); events.PopEvent(); @@ -971,10 +971,10 @@ public: if( DoTrampleIfValid() ) { events.Reset(); - events.RescheduleEvent(EVENT_SPELL_FEROCIOUS_BUTT, urand(5000,15000)); - events.RescheduleEvent(EVENT_SPELL_WHIRL, urand(2000,5000)); - events.RescheduleEvent(EVENT_SPELL_ARCTIC_BREATH, urand(5000,8000)); - events.RescheduleEvent(EVENT_JUMP_MIDDLE, urand(30000,50000)); + events.RescheduleEvent(EVENT_SPELL_FEROCIOUS_BUTT, urand(5000, 15000)); + events.RescheduleEvent(EVENT_SPELL_WHIRL, urand(2000, 5000)); + events.RescheduleEvent(EVENT_SPELL_ARCTIC_BREATH, urand(5000, 8000)); + events.RescheduleEvent(EVENT_JUMP_MIDDLE, urand(30000, 50000)); Talk(EMOTE_TRAMPLE_FAIL); me->CastSpell(me, SPELL_FROTHING_RAGE, true); me->GetMotionMaster()->MovementExpired(); @@ -1016,7 +1016,7 @@ public: // remove loot for the other faction (items are invisible for players, done in conditions), so corpse can be skinned for( std::vector::iterator itr = me->loot.items.begin(); itr != me->loot.items.end(); ++itr ) - if( ItemTemplate const *iProto = sObjectMgr->GetItemTemplate((*itr).itemid) ) + if( ItemTemplate const* iProto = sObjectMgr->GetItemTemplate((*itr).itemid) ) if( ((iProto->Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY) && plr->GetTeamId() != TEAM_HORDE) || ((iProto->Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY) && plr->GetTeamId() != TEAM_ALLIANCE) ) { (*itr).count = 0; 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 30a9aa110..429c811a7 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp @@ -41,7 +41,7 @@ enum ValkyrNPCs NPC_DARK_ESSENCE = 34567, NPC_LIGHT_ESSENCE = 34568, NPC_CONCENTRATED_DARK = 34628, - NPC_CONCENTRATED_LIGHT= 34630, + NPC_CONCENTRATED_LIGHT = 34630, }; enum ValkyrSpells @@ -108,12 +108,12 @@ struct boss_twin_valkyrAI : public ScriptedAI // special events here events.RescheduleEvent(EVENT_BERSERK, IsHeroic() ? 360000 : 600000); - events.RescheduleEvent(EVENT_SUMMON_BALLS_1, urand(10000,15000)); + events.RescheduleEvent(EVENT_SUMMON_BALLS_1, urand(10000, 15000)); events.RescheduleEvent(EVENT_SPECIAL, 45000); } - events.RescheduleEvent(EVENT_SPELL_SPIKE, urand(5000,8000)); + events.RescheduleEvent(EVENT_SPELL_SPIKE, urand(5000, 8000)); if( IsHeroic() ) - events.RescheduleEvent(EVENT_SPELL_TOUCH, urand(10000,25000), 1); + events.RescheduleEvent(EVENT_SPELL_TOUCH, urand(10000, 25000), 1); me->SetDisableGravity(true); me->SetHover(true); @@ -188,7 +188,7 @@ struct boss_twin_valkyrAI : public ScriptedAI Creature* GetSister() { - return ObjectAccessor::GetCreature(*me, pInstance->GetData64(me->GetEntry()==NPC_DARKBANE ? NPC_LIGHTBANE : NPC_DARKBANE)); + return ObjectAccessor::GetCreature(*me, pInstance->GetData64(me->GetEntry() == NPC_DARKBANE ? NPC_LIGHTBANE : NPC_DARKBANE)); } /*void AttackStart(Unit* victim) @@ -227,7 +227,7 @@ struct boss_twin_valkyrAI : public ScriptedAI if (me->HasUnitState(UNIT_STATE_CASTING)) return; - Unit *victim = me->GetVictim(); + Unit* victim = me->GetVictim(); if (!victim || !victim->IsInWorld()) return; @@ -297,13 +297,13 @@ struct boss_twin_valkyrAI : public ScriptedAI uint8 eventId = events.GetEvent(); uint8 count = 0; if( IsHeroic() ) - count = eventId==EVENT_SUMMON_BALLS_3 ? 36 : 6; + count = eventId == EVENT_SUMMON_BALLS_3 ? 36 : 6; else - count = eventId==EVENT_SUMMON_BALLS_3 ? 24 : 4; - for( uint8 i=0; iSummonCreature((i%2) ? NPC_CONCENTRATED_DARK : NPC_CONCENTRATED_LIGHT, Locs[LOC_CENTER].GetPositionX()+cos(angle)*47.0f, Locs[LOC_CENTER].GetPositionY()+sin(angle)*47.0f, Locs[LOC_CENTER].GetPositionZ()+1.5f, 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1500) ) + float angle = rand_norm() * 2 * M_PI; + if( Creature* ball = me->SummonCreature((i % 2) ? NPC_CONCENTRATED_DARK : NPC_CONCENTRATED_LIGHT, Locs[LOC_CENTER].GetPositionX() + cos(angle) * 47.0f, Locs[LOC_CENTER].GetPositionY() + sin(angle) * 47.0f, Locs[LOC_CENTER].GetPositionZ() + 1.5f, 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1500) ) boss_twin_valkyrAI::JustSummoned(ball); } events.PopEvent(); @@ -322,8 +322,8 @@ struct boss_twin_valkyrAI : public ScriptedAI } break; case EVENT_SPELL_SPIKE: - me->CastSpell(me->GetVictim(), me->GetEntry()==NPC_LIGHTBANE ? SPELL_LIGHT_TWIN_SPIKE : SPELL_DARK_TWIN_SPIKE, false); - events.RepeatEvent(urand(7000,10000)); + me->CastSpell(me->GetVictim(), me->GetEntry() == NPC_LIGHTBANE ? SPELL_LIGHT_TWIN_SPIKE : SPELL_DARK_TWIN_SPIKE, false); + events.RepeatEvent(urand(7000, 10000)); break; case EVENT_SPELL_TOUCH: { @@ -373,7 +373,7 @@ struct boss_twin_valkyrAI : public ScriptedAI */ std::vector tList; - Map::PlayerList const &pList = me->GetMap()->GetPlayers(); + Map::PlayerList const& pList = me->GetMap()->GetPlayers(); if (pList.getSize()) { for (Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr) @@ -383,10 +383,10 @@ struct boss_twin_valkyrAI : public ScriptedAI tList.push_back(plr->GetGUID()); if (!tList.empty()) - if (Player* target = ObjectAccessor::GetPlayer(*me, tList[urand(0,tList.size()-1)])) + if (Player* target = ObjectAccessor::GetPlayer(*me, tList[urand(0, tList.size() - 1)])) { - me->CastSpell(target, me->GetEntry()==NPC_LIGHTBANE ? SPELL_LIGHT_TOUCH : SPELL_DARK_TOUCH, false); - events.RepeatEvent(urand(45000,50000)); + me->CastSpell(target, me->GetEntry() == NPC_LIGHTBANE ? SPELL_LIGHT_TOUCH : SPELL_DARK_TOUCH, false); + events.RepeatEvent(urand(45000, 50000)); break; } } @@ -396,8 +396,9 @@ struct boss_twin_valkyrAI : public ScriptedAI case EVENT_SPECIAL: { uint8 s; - do s=urand(0,3); while( SpecialMask & (1<GetTypeId() == TYPEID_PLAYER ) { - int32 id = urand(0,1) ? SAY_KILL_PLAYER_1 : SAY_KILL_PLAYER_2; + int32 id = urand(0, 1) ? SAY_KILL_PLAYER_1 : SAY_KILL_PLAYER_2; Talk(id); if( Creature* twin = GetSister() ) twin->AI()->Talk(id); @@ -513,7 +514,7 @@ public: { boss_eydisAI(Creature* pCreature) : boss_twin_valkyrAI(pCreature) { - me->SetFlag(UNIT_FIELD_AURASTATE, 1<<(19-1)); + me->SetFlag(UNIT_FIELD_AURASTATE, 1 << (19 - 1)); SetEquipmentSlots(false, EQUIP_MAIN_2, EQUIP_OFFHAND_2, EQUIP_RANGED_2); if( Creature* c = me->SummonCreature(NPC_DARK_ESSENCE, Locs[LOC_DARKESS_1]) ) boss_twin_valkyrAI::JustSummoned(c); @@ -539,7 +540,7 @@ public: { boss_fjolaAI(Creature* pCreature) : boss_twin_valkyrAI(pCreature) { - me->SetFlag(UNIT_FIELD_AURASTATE, 1<<(22-1)); + me->SetFlag(UNIT_FIELD_AURASTATE, 1 << (22 - 1)); SetEquipmentSlots(false, EQUIP_MAIN_1, EQUIP_OFFHAND_1, EQUIP_RANGED_1); if( Creature* c = me->SummonCreature(NPC_LIGHT_ESSENCE, Locs[LOC_LIGHTESS_1]) ) boss_twin_valkyrAI::JustSummoned(c); @@ -665,14 +666,14 @@ class npc_concentrated_ball : public CreatureScript public: npc_concentrated_ball() : CreatureScript("npc_concentrated_ball") { } - CreatureAI* GetAI(Creature *pCreature) const + CreatureAI* GetAI(Creature* pCreature) const { return new npc_concentrated_ballAI(pCreature); } struct npc_concentrated_ballAI : public NullCreatureAI { - npc_concentrated_ballAI(Creature *pCreature) : NullCreatureAI(pCreature) + npc_concentrated_ballAI(Creature* pCreature) : NullCreatureAI(pCreature) { me->SetReactState(REACT_PASSIVE); me->SetCanFly(true); @@ -694,14 +695,14 @@ public: if( type != POINT_MOTION_TYPE || id != 0 ) return; - if( urand(0,2) ) + if( urand(0, 2) ) me->DespawnOrUnsummon(0); } void MoveToNextPoint() { - float angle = rand_norm()*2*M_PI; - me->GetMotionMaster()->MovePoint(0, Locs[LOC_CENTER].GetPositionX()+cos(angle)*47.0f, Locs[LOC_CENTER].GetPositionY()+sin(angle)*47.0f, me->GetPositionZ()); + float angle = rand_norm() * 2 * M_PI; + me->GetMotionMaster()->MovePoint(0, Locs[LOC_CENTER].GetPositionX() + cos(angle) * 47.0f, Locs[LOC_CENTER].GetPositionY() + sin(angle) * 47.0f, me->GetPositionZ()); } void UpdateAI(uint32 /*diff*/) @@ -717,184 +718,184 @@ public: class spell_valkyr_essence : public SpellScriptLoader { - public: - spell_valkyr_essence() : SpellScriptLoader("spell_valkyr_essence") { } +public: + spell_valkyr_essence() : SpellScriptLoader("spell_valkyr_essence") { } - class spell_valkyr_essence_auraAuraScript : public AuraScript + class spell_valkyr_essence_auraAuraScript : public AuraScript + { + PrepareAuraScript(spell_valkyr_essence_auraAuraScript) + + void HandleAfterEffectAbsorb(AuraEffect* /*aurEff*/, DamageInfo& /*dmgInfo*/, uint32& absorbAmount) { - PrepareAuraScript(spell_valkyr_essence_auraAuraScript) + uint16 count = absorbAmount / 1000; + if( !count || !GetOwner() ) + return; - void HandleAfterEffectAbsorb(AuraEffect * /*aurEff*/, DamageInfo & /*dmgInfo*/, uint32 & absorbAmount) - { - uint16 count = absorbAmount/1000; - if( !count || !GetOwner() ) - return; - - if( const SpellInfo* se = GetAura()->GetSpellInfo() ) - if( Unit* owner = GetOwner()->ToUnit() ) + if( const SpellInfo* se = GetAura()->GetSpellInfo() ) + if( Unit* owner = GetOwner()->ToUnit() ) + { + uint32 auraId = 0; + uint32 empoweredId = 0; + switch( se->Id ) { - uint32 auraId = 0; - uint32 empoweredId = 0; - switch( se->Id ) + case 65686: + auraId = 67590; + empoweredId = 65748; + break; + case 65684: + auraId = 67590; + empoweredId = 65724; + break; + case 67222: + auraId = 67602; + empoweredId = 65748; + break; + case 67176: + auraId = 67602; + empoweredId = 65724; + break; + case 67223: + auraId = 67603; + empoweredId = 65748; + break; + case 67177: + auraId = 67603; + empoweredId = 65724; + break; + case 67224: + auraId = 67604; + empoweredId = 65748; + break; + case 67178: + auraId = 67604; + empoweredId = 65724; + break; + } + if( !owner->HasAura(auraId) ) + { + owner->CastSpell(owner, SPELL_POWERING_UP, true); + if( --count == 0 ) + return; + } + if( Aura* aur = owner->GetAura(auraId) ) + { + if( aur->GetStackAmount() + count < 100 ) { - case 65686: - auraId = 67590; - empoweredId = 65748; - break; - case 65684: - auraId = 67590; - empoweredId = 65724; - break; - case 67222: - auraId = 67602; - empoweredId = 65748; - break; - case 67176: - auraId = 67602; - empoweredId = 65724; - break; - case 67223: - auraId = 67603; - empoweredId = 65748; - break; - case 67177: - auraId = 67603; - empoweredId = 65724; - break; - case 67224: - auraId = 67604; - empoweredId = 65748; - break; - case 67178: - auraId = 67604; - empoweredId = 65724; - break; - } - if( !owner->HasAura(auraId) ) - { - owner->CastSpell(owner, SPELL_POWERING_UP, true); - if( --count == 0 ) - return; - } - if( Aura* aur = owner->GetAura(auraId) ) - { - if( aur->GetStackAmount()+count < 100 ) - { - aur->ModStackAmount(count); + aur->ModStackAmount(count); - if (roll_chance_i(30)) // 30% chance to gain extra speed for collecting - owner->CastSpell(owner, SPELL_SURGE_OF_SPEED, true); - } - else - { - owner->CastSpell(owner, empoweredId, true); - aur->Remove(); - } + if (roll_chance_i(30)) // 30% chance to gain extra speed for collecting + owner->CastSpell(owner, SPELL_SURGE_OF_SPEED, true); + } + else + { + owner->CastSpell(owner, empoweredId, true); + aur->Remove(); } } - } - - void Register() - { - AfterEffectAbsorb += AuraEffectAbsorbFn(spell_valkyr_essence_auraAuraScript::HandleAfterEffectAbsorb, EFFECT_0); - } - }; - - AuraScript *GetAuraScript() const - { - return new spell_valkyr_essence_auraAuraScript(); + } } + + void Register() + { + AfterEffectAbsorb += AuraEffectAbsorbFn(spell_valkyr_essence_auraAuraScript::HandleAfterEffectAbsorb, EFFECT_0); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_valkyr_essence_auraAuraScript(); + } }; class spell_valkyr_touch : public SpellScriptLoader { - public: - spell_valkyr_touch() : SpellScriptLoader("spell_valkyr_touch") { } +public: + spell_valkyr_touch() : SpellScriptLoader("spell_valkyr_touch") { } - class spell_valkyr_touchAuraScript : public AuraScript + class spell_valkyr_touchAuraScript : public AuraScript + { + PrepareAuraScript(spell_valkyr_touchAuraScript) + + void HandleEffectPeriodic(AuraEffect const* aurEff) { - PrepareAuraScript(spell_valkyr_touchAuraScript) - - void HandleEffectPeriodic(AuraEffect const * aurEff) + PreventDefaultAction(); + Unit* caster = GetCaster(); + if( !caster ) + return; + if( caster->GetMap()->GetId() == 649 ) { - PreventDefaultAction(); - Unit* caster = GetCaster(); - if( !caster ) - return; - if( caster->GetMap()->GetId() == 649 ) - { - uint32 excludedID = GetSpellInfo()->ExcludeTargetAuraSpell; - Map::PlayerList const &pl = caster->GetMap()->GetPlayers(); - for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr ) - if( Player* plr = itr->GetSource() ) - if( plr->IsAlive() && !plr->HasAura(excludedID) && !plr->HasAuraType(SPELL_AURA_SPIRIT_OF_REDEMPTION) ) - { - uint32 absorb=0; - uint32 resist=0; - CleanDamage(0, 0, BASE_ATTACK, MELEE_HIT_NORMAL); - int32 dmg = urand(2925,3075)*(caster->GetMap()->GetDifficulty()-1); - if (caster->CanApplyResilience()) - Unit::ApplyResilience(plr, NULL, &dmg, false, CR_CRIT_TAKEN_SPELL); - uint32 damage = dmg; - Unit::CalcAbsorbResist(caster, plr, GetSpellInfo()->GetSchoolMask(), DOT, damage, &absorb, &resist, GetSpellInfo()); - Unit::DealDamageMods(plr,damage,&absorb); - int32 overkill = damage - plr->GetHealth(); - if (overkill < 0) - overkill = 0; - SpellPeriodicAuraLogInfo pInfo(aurEff, damage, overkill, absorb, resist, 0.0f, false); - plr->SendPeriodicAuraLog(&pInfo); - Unit::DealDamage(caster, plr, damage, 0, DOT, GetSpellInfo()->GetSchoolMask(), GetSpellInfo(), true); - } - } + uint32 excludedID = GetSpellInfo()->ExcludeTargetAuraSpell; + Map::PlayerList const& pl = caster->GetMap()->GetPlayers(); + for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr ) + if( Player* plr = itr->GetSource() ) + if( plr->IsAlive() && !plr->HasAura(excludedID) && !plr->HasAuraType(SPELL_AURA_SPIRIT_OF_REDEMPTION) ) + { + uint32 absorb = 0; + uint32 resist = 0; + CleanDamage(0, 0, BASE_ATTACK, MELEE_HIT_NORMAL); + int32 dmg = urand(2925, 3075) * (caster->GetMap()->GetDifficulty() - 1); + if (caster->CanApplyResilience()) + Unit::ApplyResilience(plr, NULL, &dmg, false, CR_CRIT_TAKEN_SPELL); + uint32 damage = dmg; + Unit::CalcAbsorbResist(caster, plr, GetSpellInfo()->GetSchoolMask(), DOT, damage, &absorb, &resist, GetSpellInfo()); + Unit::DealDamageMods(plr, damage, &absorb); + int32 overkill = damage - plr->GetHealth(); + if (overkill < 0) + overkill = 0; + SpellPeriodicAuraLogInfo pInfo(aurEff, damage, overkill, absorb, resist, 0.0f, false); + plr->SendPeriodicAuraLog(&pInfo); + Unit::DealDamage(caster, plr, damage, 0, DOT, GetSpellInfo()->GetSchoolMask(), GetSpellInfo(), true); + } } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_valkyr_touchAuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); - } - }; - - AuraScript *GetAuraScript() const - { - return new spell_valkyr_touchAuraScript(); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_valkyr_touchAuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_valkyr_touchAuraScript(); + } }; class spell_valkyr_ball_periodic_dummy : public SpellScriptLoader { - public: - spell_valkyr_ball_periodic_dummy() : SpellScriptLoader("spell_valkyr_ball_periodic_dummy") { } +public: + spell_valkyr_ball_periodic_dummy() : SpellScriptLoader("spell_valkyr_ball_periodic_dummy") { } - class spell_valkyr_ball_periodic_dummyAuraScript : public AuraScript + class spell_valkyr_ball_periodic_dummyAuraScript : public AuraScript + { + PrepareAuraScript(spell_valkyr_ball_periodic_dummyAuraScript) + + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_valkyr_ball_periodic_dummyAuraScript) - - void HandleEffectPeriodic(AuraEffect const * /*aurEff*/) - { - if (Unit* target = GetTarget()) - if (target->GetDisplayId() != 11686) - if (Creature* me = target->ToCreature()) - if (Player* p = me->SelectNearestPlayer(2.75f)) - if (me->GetExactDist2d(p) <= 2.75f) - { - me->AI()->DoAction(1); // despawning = true; - me->GetMotionMaster()->MoveIdle(); - me->CastSpell((Unit*)NULL, me->GetEntry()==NPC_CONCENTRATED_LIGHT ? SPELL_UNLEASHED_LIGHT : SPELL_UNLEASHED_DARK, false); - me->SetDisplayId(11686); - me->DespawnOrUnsummon(1500); - } - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_valkyr_ball_periodic_dummyAuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript *GetAuraScript() const - { - return new spell_valkyr_ball_periodic_dummyAuraScript(); + if (Unit* target = GetTarget()) + if (target->GetDisplayId() != 11686) + if (Creature* me = target->ToCreature()) + if (Player* p = me->SelectNearestPlayer(2.75f)) + if (me->GetExactDist2d(p) <= 2.75f) + { + me->AI()->DoAction(1); // despawning = true; + me->GetMotionMaster()->MoveIdle(); + me->CastSpell((Unit*)NULL, me->GetEntry() == NPC_CONCENTRATED_LIGHT ? SPELL_UNLEASHED_LIGHT : SPELL_UNLEASHED_DARK, false); + me->SetDisplayId(11686); + me->DespawnOrUnsummon(1500); + } } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_valkyr_ball_periodic_dummyAuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_valkyr_ball_periodic_dummyAuraScript(); + } }; void AddSC_boss_twin_valkyr() diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp index e53db816d..e9195f714 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp @@ -116,16 +116,16 @@ public: if (validDedicatedInsanityItems.empty()) { - for (uint32 i=0; iGetPlayers(); + Map::PlayerList const& pl = instance->GetPlayers(); for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) if (Player* plr = itr->GetSource()) if (!plr->IsGameMaster() && plr->IsInCombat() /*performance*/) { - for (uint8 i=EQUIPMENT_SLOT_START; iGetItemByPos(INVENTORY_SLOT_BAG_0, i)) if (!IsValidDedicatedInsanityItem(item->GetTemplate())) { @@ -189,7 +189,7 @@ public: bool IsEncounterInProgress() const { - Map::PlayerList const &pl = instance->GetPlayers(); + Map::PlayerList const& pl = instance->GetPlayers(); for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr ) if( Player* plr = itr->GetSource() ) if( plr->IsAlive() && !plr->IsGameMaster() ) @@ -288,7 +288,7 @@ public: { if( AttemptsLeft > 0 ) --AttemptsLeft; - Map::PlayerList const &pl = instance->GetPlayers(); + Map::PlayerList const& pl = instance->GetPlayers(); for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr ) if( Player* plr = itr->GetSource() ) plr->SendUpdateWorldState(UPDATE_STATE_UI_COUNT, AttemptsLeft); @@ -358,7 +358,7 @@ public: c->DespawnOrUnsummon(10000); if( Creature* c = instance->GetCreature(NPC_DreadscaleGUID) ) c->DespawnOrUnsummon(10000); - if( AchievementTimer+10 >= time(nullptr) ) + if( AchievementTimer + 10 >= time(nullptr) ) DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_JORMUNGAR_ACHIEV); AchievementTimer = 0; @@ -450,7 +450,7 @@ public: } if (GameObject* go = c->SummonGameObject(cacheEntry, Locs[LOC_CENTER].GetPositionX(), Locs[LOC_CENTER].GetPositionY(), Locs[LOC_CENTER].GetPositionZ(), Locs[LOC_CENTER].GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 630000000)) { - Map::PlayerList const &pl = instance->GetPlayers(); + Map::PlayerList const& pl = instance->GetPlayers(); for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) if (Player* plr = itr->GetSource()) if (Group* g = plr->GetGroup()) @@ -464,7 +464,7 @@ public: HandleGameObject(GO_EnterGateGUID, true); - if( AchievementTimer+60 >= time(nullptr) ) + if( AchievementTimer + 60 >= time(nullptr) ) DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_RESILIENCE_WILL_FIX_IT_CREDIT); AchievementTimer = 0; @@ -486,16 +486,15 @@ public: } break; case TYPE_FACTION_CHAMPIONS_PLAYER_DIED: - if( urand(0,2) == 0 ) + if( urand(0, 2) == 0 ) { if( TeamIdInInstance == TEAM_HORDE ) { if( Creature* pTemp = instance->GetCreature(NPC_VarianGUID) ) pTemp->AI()->Talk(SAY_VARIAN_KILL_HORDE_PLAYER_1); } - else - if( Creature* pTemp = instance->GetCreature(NPC_GarroshGUID) ) - pTemp->AI()->Talk(SAY_GARROSH_KILL_ALLIANCE_PLAYER_1); + else if( Creature* pTemp = instance->GetCreature(NPC_GarroshGUID) ) + pTemp->AI()->Talk(SAY_GARROSH_KILL_ALLIANCE_PLAYER_1); } break; case TYPE_VALKYR: @@ -544,7 +543,8 @@ public: { switch( type ) { - case TYPE_INSTANCE_PROGRESS: return InstanceProgress; + case TYPE_INSTANCE_PROGRESS: + return InstanceProgress; } return 0; } @@ -553,12 +553,18 @@ public: { switch( type ) { - case TYPE_GORMOK: return NPC_GormokGUID; - case TYPE_DREADSCALE: return NPC_DreadscaleGUID; - case TYPE_ACIDMAW: return NPC_AcidmawGUID; - case NPC_DARKBANE: return NPC_DarkbaneGUID; - case NPC_LIGHTBANE: return NPC_LightbaneGUID; - case TYPE_ANUBARAK: return NPC_AnubarakGUID; + case TYPE_GORMOK: + return NPC_GormokGUID; + case TYPE_DREADSCALE: + return NPC_DreadscaleGUID; + case TYPE_ACIDMAW: + return NPC_AcidmawGUID; + case NPC_DARKBANE: + return NPC_DarkbaneGUID; + case NPC_LIGHTBANE: + return NPC_LightbaneGUID; + case TYPE_ANUBARAK: + return NPC_AnubarakGUID; } return 0; } @@ -693,7 +699,7 @@ public: if( Creature* c = instance->GetCreature(NPC_TirionGUID) ) { if( Creature* dreadscale = c->SummonCreature(NPC_DREADSCALE, Locs[LOC_BEHIND_GATE].GetPositionX(), Locs[LOC_BEHIND_GATE].GetPositionY(), Locs[LOC_BEHIND_GATE].GetPositionZ(), Locs[LOC_BEHIND_GATE].GetOrientation(), TEMPSUMMON_MANUAL_DESPAWN) ) - dreadscale->GetMotionMaster()->MovePoint(0, Locs[LOC_BEHIND_GATE].GetPositionX(), Locs[LOC_BEHIND_GATE].GetPositionY()-25.0f, Locs[LOC_BEHIND_GATE].GetPositionZ()); + dreadscale->GetMotionMaster()->MovePoint(0, Locs[LOC_BEHIND_GATE].GetPositionX(), Locs[LOC_BEHIND_GATE].GetPositionY() - 25.0f, Locs[LOC_BEHIND_GATE].GetPositionZ()); if( Creature* acidmaw = c->SummonCreature(NPC_ACIDMAW, Locs[LOC_ACIDMAW].GetPositionX(), Locs[LOC_ACIDMAW].GetPositionY(), Locs[LOC_ACIDMAW].GetPositionZ(), Locs[LOC_ACIDMAW].GetOrientation(), TEMPSUMMON_MANUAL_DESPAWN) ) acidmaw->AddAura(53421, acidmaw); } @@ -793,14 +799,14 @@ public: if( Creature* fizzlebang = c->SummonCreature(NPC_FIZZLEBANG, Locs[LOC_BEHIND_GATE].GetPositionX(), Locs[LOC_BEHIND_GATE].GetPositionY(), Locs[LOC_BEHIND_GATE].GetPositionZ(), Locs[LOC_BEHIND_GATE].GetOrientation(), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000) ) { fizzlebang->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); - fizzlebang->GetMotionMaster()->MovePoint(0, Locs[LOC_BEHIND_GATE].GetPositionX(), Locs[LOC_BEHIND_GATE].GetPositionY()-65.0f, Locs[LOC_BEHIND_GATE].GetPositionZ()-1.0f); + fizzlebang->GetMotionMaster()->MovePoint(0, Locs[LOC_BEHIND_GATE].GetPositionX(), Locs[LOC_BEHIND_GATE].GetPositionY() - 65.0f, Locs[LOC_BEHIND_GATE].GetPositionZ() - 1.0f); } events.RescheduleEvent(EVENT_SCENE_102, 20000); // move Icehowl to side, can't remove corpse because of loot! if( Creature* icehowl = instance->GetCreature(NPC_IcehowlGUID) ) { - icehowl->UpdatePosition(513.19f, 139.48f, 395.22f, 3*M_PI/2, true); + icehowl->UpdatePosition(513.19f, 139.48f, 395.22f, 3 * M_PI / 2, true); icehowl->StopMovingOnCurrentPos(); icehowl->DestroyForNearbyPlayers(); } @@ -852,7 +858,7 @@ public: if( Creature* c = instance->GetCreature(NPC_FizzlebangGUID) ) { if( Creature* jaraxxus = c->SummonCreature(NPC_JARAXXUS, Locs[LOC_CENTER].GetPositionX(), Locs[LOC_CENTER].GetPositionY(), Locs[LOC_CENTER].GetPositionZ(), Locs[LOC_CENTER].GetOrientation(), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 630000000) ) - jaraxxus->GetMotionMaster()->MovePoint(0, Locs[LOC_CENTER].GetPositionX(), Locs[LOC_CENTER].GetPositionY()-10.0f, Locs[LOC_CENTER].GetPositionZ()); + jaraxxus->GetMotionMaster()->MovePoint(0, Locs[LOC_CENTER].GetPositionX(), Locs[LOC_CENTER].GetPositionY() - 10.0f, Locs[LOC_CENTER].GetPositionZ()); c->HandleEmoteCommand(EMOTE_STATE_NONE); c->AI()->Talk(SAY_STAGE_1_04); } @@ -863,7 +869,7 @@ public: case EVENT_SCENE_105: { if( Creature* c = instance->GetCreature(NPC_JaraxxusGUID) ) - c->SetFacingTo(M_PI/2); + c->SetFacingTo(M_PI / 2); if( Creature* c = instance->GetCreature(NPC_PurpleGroundGUID) ) c->DespawnOrUnsummon(); NPC_PurpleGroundGUID = 0; @@ -909,7 +915,7 @@ public: case EVENT_SCENE_109: { if( Creature* c = instance->GetCreature(NPC_JaraxxusGUID) ) - c->SetFacingTo(3*M_PI/2); + c->SetFacingTo(3 * M_PI / 2); if( Creature* c = instance->GetCreature(NPC_TirionGUID) ) c->AI()->Talk(SAY_STAGE_1_07); events.PopEvent(); @@ -971,7 +977,7 @@ public: // move Jaraxxus to side, can't remove corpse because of loot! if( Creature* jaraxxus = instance->GetCreature(NPC_JaraxxusGUID) ) { - jaraxxus->UpdatePosition(613.83f, 139.5f, 395.22f, 3*M_PI/2, true); + jaraxxus->UpdatePosition(613.83f, 139.5f, 395.22f, 3 * M_PI / 2, true); jaraxxus->StopMovingOnCurrentPos(); jaraxxus->DestroyForNearbyPlayers(); } @@ -984,7 +990,7 @@ public: break; case EVENT_SCENE_202: { - Map::PlayerList const &pl = instance->GetPlayers(); + Map::PlayerList const& pl = instance->GetPlayers(); for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr ) if( Player* plr = itr->GetSource() ) if( !plr->IsGameMaster() ) @@ -1062,7 +1068,7 @@ public: healersSubtracted = 1; for( uint8 i = 0; i < healersSubtracted; ++i ) { - uint8 pos = urand(0, vHealerEntries.size()-1); + uint8 pos = urand(0, vHealerEntries.size() - 1); switch( vHealerEntries[pos] ) { case NPC_ALLIANCE_DRUID_RESTORATION: @@ -1090,12 +1096,12 @@ public: vOtherEntries.push_back(NPC_HORDE_SHAMAN_ENHANCEMENT); break; } - vHealerEntries.erase(vHealerEntries.begin()+pos); + vHealerEntries.erase(vHealerEntries.begin() + pos); } if( instance->GetSpawnMode() == RAID_DIFFICULTY_10MAN_NORMAL || instance->GetSpawnMode() == RAID_DIFFICULTY_10MAN_HEROIC ) - for( uint8 i=0; i<4; ++i ) - vOtherEntries.erase(vOtherEntries.begin()+urand(0, vOtherEntries.size()-1)); + for( uint8 i = 0; i < 4; ++i ) + vOtherEntries.erase(vOtherEntries.begin() + urand(0, vOtherEntries.size() - 1)); for( std::vector::iterator itr = vHealerEntries.begin(); itr != vHealerEntries.end(); ++itr ) vOtherEntries.push_back(*itr); @@ -1103,11 +1109,11 @@ public: uint8 pos2 = 10; for( std::vector::iterator itr = vOtherEntries.begin(); itr != vOtherEntries.end(); ++itr ) { - if( Creature* pTemp = instance->SummonCreature(*itr, FactionChampionLoc[urand(0, 4)+(TeamIdInInstance == TEAM_ALLIANCE ? 0 : 5)]) ) + if( Creature* pTemp = instance->SummonCreature(*itr, FactionChampionLoc[urand(0, 4) + (TeamIdInInstance == TEAM_ALLIANCE ? 0 : 5)]) ) { NPC_ChampionGUIDs.push_back(pTemp->GetGUID()); - pTemp->SetHomePosition((TeamIdInInstance == TEAM_ALLIANCE ? FactionChampionLoc[pos2].GetPositionX() : (Locs[LOC_CENTER].GetPositionX()*2-FactionChampionLoc[pos2].GetPositionX())), FactionChampionLoc[pos2].GetPositionY(), FactionChampionLoc[pos2].GetPositionZ(), 0.0f); - pTemp->GetMotionMaster()->MoveJump((TeamIdInInstance == TEAM_ALLIANCE ? FactionChampionLoc[pos2].GetPositionX() : (Locs[LOC_CENTER].GetPositionX()*2-FactionChampionLoc[pos2].GetPositionX())), FactionChampionLoc[pos2].GetPositionY(), FactionChampionLoc[pos2].GetPositionZ(), 20.0f, 20.0f); + pTemp->SetHomePosition((TeamIdInInstance == TEAM_ALLIANCE ? FactionChampionLoc[pos2].GetPositionX() : (Locs[LOC_CENTER].GetPositionX() * 2 - FactionChampionLoc[pos2].GetPositionX())), FactionChampionLoc[pos2].GetPositionY(), FactionChampionLoc[pos2].GetPositionZ(), 0.0f); + pTemp->GetMotionMaster()->MoveJump((TeamIdInInstance == TEAM_ALLIANCE ? FactionChampionLoc[pos2].GetPositionX() : (Locs[LOC_CENTER].GetPositionX() * 2 - FactionChampionLoc[pos2].GetPositionX())), FactionChampionLoc[pos2].GetPositionY(), FactionChampionLoc[pos2].GetPositionZ(), 20.0f, 20.0f); } ++pos2; } @@ -1216,7 +1222,7 @@ public: { if (TeamIdInInstance == TEAM_NEUTRAL) { - Map::PlayerList const &pl = instance->GetPlayers(); + Map::PlayerList const& pl = instance->GetPlayers(); for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr ) if( Player* plr = itr->GetSource() ) if( !plr->IsGameMaster() ) @@ -1402,7 +1408,7 @@ public: { chest->SetRespawnTime(chest->GetRespawnDelay()); - Map::PlayerList const &pl = instance->GetPlayers(); + Map::PlayerList const& pl = instance->GetPlayers(); for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) if (Player* plr = itr->GetSource()) if (Group* g = plr->GetGroup()) @@ -1443,13 +1449,13 @@ public: bool DoNeedCleanup(bool /*enter*/) { uint8 aliveCount = 0; - Map::PlayerList const &pl = instance->GetPlayers(); + Map::PlayerList const& pl = instance->GetPlayers(); for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr ) if( Player* plr = itr->GetSource() ) if( plr->IsAlive() && !plr->IsGameMaster() ) ++aliveCount; - bool need = aliveCount==0; + bool need = aliveCount == 0; if( !need && CLEANED ) CLEANED = false; return need; @@ -1588,7 +1594,7 @@ public: if (instance->IsHeroic() && AttemptsLeft > 0 && !fromFailed && EncounterStatus == IN_PROGRESS) { --AttemptsLeft; - Map::PlayerList const &pl = instance->GetPlayers(); + Map::PlayerList const& pl = instance->GetPlayers(); for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr ) if( Player* plr = itr->GetSource() ) plr->SendUpdateWorldState(UPDATE_STATE_UI_COUNT, AttemptsLeft); 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 7c9ed86de..78aa35c83 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 @@ -52,7 +52,7 @@ public: return true; } - AddGossipItemFor(player, GOSSIP_ICON_CHAT, "We are ready!", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1337); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, "We are ready!", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1337); SendGossipMenuFor(player, gossipTextId, creature->GetGUID()); return true; } @@ -66,7 +66,7 @@ public: if( !pInstance ) return true; - if( uiAction == GOSSIP_ACTION_INFO_DEF+1337 ) + if( uiAction == GOSSIP_ACTION_INFO_DEF + 1337 ) { pInstance->SetData(TYPE_ANNOUNCER_GOSSIP_SELECT, 0); creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h index 2f69de307..ce153d000 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h @@ -253,20 +253,20 @@ enum eTexts SAY_STAGE_4_07 = 18, }; -const Position Locs[] = +const Position Locs[] = { - {563.8f, 216.1f, 395.1f, 3*M_PI/2}, // 0 - {563.93f, 178.37f, 394.49f, 3*M_PI/2}, // 1 - {575.74f, 171.5f, 394.75f, 3*M_PI/2}, // 2 - {549.93f, 171.5f, 394.75f, 3*M_PI/2}, // 3 - {563.672974f, 139.571f, 393.837006f, 3*M_PI/2}, // 4 - {577.347839f, 210.0f, 395.14f /*+ 6.0f*/, 3*M_PI/2}, // 5 - {550.955933f, 210.0f, 395.14f /*+ 6.0f*/, 3*M_PI/2}, // 6 + {563.8f, 216.1f, 395.1f, 3 * M_PI / 2}, // 0 + {563.93f, 178.37f, 394.49f, 3 * M_PI / 2}, // 1 + {575.74f, 171.5f, 394.75f, 3 * M_PI / 2}, // 2 + {549.93f, 171.5f, 394.75f, 3 * M_PI / 2}, // 3 + {563.672974f, 139.571f, 393.837006f, 3 * M_PI / 2}, // 4 + {577.347839f, 210.0f, 395.14f /*+ 6.0f*/, 3 * M_PI / 2}, // 5 + {550.955933f, 210.0f, 395.14f /*+ 6.0f*/, 3 * M_PI / 2}, // 6 {573.5f, 180.5f, 395.14f /*+ 6.0f*/, 0}, // 7 {553.5f, 180.5f, 395.14f /*+ 6.0f*/, 0}, // 8 {585.5f, 170.0f, 395.14f /*+ 6.0f*/, 0}, // 9 {545.5f, 170.0f, 395.14f /*+ 6.0f*/, 0}, // 10 - {563.833008f, 179.244995f, 394.5f, 3*M_PI/2}, // 11 + {563.833008f, 179.244995f, 394.5f, 3 * M_PI / 2}, // 11 {563.547f, 141.613f, 393.908f, 0}, // 12 {586.060242f, 117.514809f, 394.314026f, 0}, // 13 - Dark essence 1 {541.602112f, 161.879837f, 394.587952f, 0}, // 14 - Dark essence 2 @@ -301,7 +301,7 @@ enum LocNames LOC_MAGE, }; -const Position FactionChampionLoc[]= +const Position FactionChampionLoc[] = { {514.231f, 105.569f, 418.234f, 0}, // 0 - Horde Initial Pos 0 {508.334f, 115.377f, 418.234f, 0}, // 1 - Horde Initial Pos 1 @@ -369,20 +369,22 @@ enum euiWorldStates }; const uint32 dIIc = 405; -const uint32 dedicatedInsanityItems[405] = { -47658, 47659, 47660, 47661, 47662, 47664, 47665, 47666, 47667, 47668, 47670, 47671, 47672, 47673, 47674, 47675, 47677, 47678, 47681, 47682, 47684, 47685, 47686, 47687, 47688, 47689, 47690, 47691, 47692, 47693, -47694, 47695, 47696, 47697, 47698, 47699, 47701, 47702, 47704, 47705, 47706, 47707, 47708, 47709, 47710, 47712, 47713, 47714, 47715, 47716, 47729, 47730, 47731, 47732, 47733, 47734, 47735, 47753, 47754, 47755, -47756, 47757, 47768, 47769, 47770, 47771, 47772, 47778, 47779, 47780, 47781, 47782, 47803, 47804, 47805, 47806, 47807, 47915, 47916, 47917, 47918, 47919, 47920, 47921, 47922, 47923, 47924, 47925, 47926, 47927, -47928, 47929, 47930, 47931, 47932, 47933, 47934, 47935, 47937, 47938, 47939, 47940, 47941, 47942, 47943, 47944, 47945, 47946, 47947, 47948, 47949, 47950, 47951, 47952, 47953, 47954, 47955, 47956, 47957, 47958, -47959, 47960, 47961, 47962, 47963, 47964, 47965, 47966, 47967, 47968, 47969, 47970, 47971, 47972, 47973, 47974, 47975, 47976, 47977, 47978, 47979, 47983, 47984, 47985, 47986, 47987, 47988, 47989, 47990, 47991, -47992, 47993, 47994, 47995, 47996, 47997, 47998, 47999, 48000, 48001, 48002, 48003, 48004, 48005, 48006, 48007, 48008, 48009, 48010, 48011, 48012, 48013, 48014, 48015, 48016, 48017, 48018, 48019, 48020, 48021, -48022, 48023, 48024, 48025, 48026, 48027, 48028, 48030, 48032, 48034, 48036, 48038, 48039, 48040, 48041, 48042, 48043, 48044, 48045, 48046, 48047, 48048, 48049, 48050, 48051, 48052, 48053, 48054, 48055, 48056, -48062, 48063, 48064, 48065, 48066, 48077, 48078, 48079, 48080, 48081, 48092, 48093, 48094, 48095, 48096, 48133, 48134, 48135, 48136, 48137, 48148, 48149, 48150, 48151, 48152, 48163, 48164, 48165, 48166, 48167, -48178, 48179, 48180, 48181, 48182, 48193, 48194, 48195, 48196, 48197, 48208, 48209, 48210, 48211, 48212, 48223, 48224, 48225, 48226, 48227, 48238, 48239, 48240, 48241, 48242, 48255, 48256, 48257, 48258, 48259, -48270, 48271, 48272, 48273, 48274, 48285, 48286, 48287, 48288, 48289, 48300, 48301, 48302, 48303, 48304, 48316, 48317, 48318, 48319, 48320, 48331, 48332, 48333, 48334, 48335, 48346, 48347, 48348, 48349, 48350, -48361, 48362, 48363, 48364, 48365, 48376, 48377, 48378, 48379, 48380, 48391, 48392, 48393, 48394, 48395, 48430, 48446, 48450, 48452, 48454, 48461, 48462, 48463, 48464, 48465, 48481, 48482, 48483, 48484, 48485, -48496, 48497, 48498, 48499, 48500, 48538, 48539, 48540, 48541, 48542, 48553, 48554, 48555, 48556, 48557, 48575, 48576, 48577, 48578, 48579, 48590, 48591, 48592, 48593, 48594, 48607, 48608, 48609, 48610, 48611, -48622, 48623, 48624, 48625, 48626, 48637, 48638, 48639, 48640, 48641, 48657, 48658, 48659, 48660, 48661, 48666, 48667, 48668, 48669, 48670, 48671, 48672, 48673, 48674, 48675, 48693, 48695, 48697, 48699, 48701, -48703, 48705, 48708, 48709, 48710, 48711, 48712, 48713, 48714, 48722, 48724, 49233, 49234, 49237, 49238 }; +const uint32 dedicatedInsanityItems[405] = +{ + 47658, 47659, 47660, 47661, 47662, 47664, 47665, 47666, 47667, 47668, 47670, 47671, 47672, 47673, 47674, 47675, 47677, 47678, 47681, 47682, 47684, 47685, 47686, 47687, 47688, 47689, 47690, 47691, 47692, 47693, + 47694, 47695, 47696, 47697, 47698, 47699, 47701, 47702, 47704, 47705, 47706, 47707, 47708, 47709, 47710, 47712, 47713, 47714, 47715, 47716, 47729, 47730, 47731, 47732, 47733, 47734, 47735, 47753, 47754, 47755, + 47756, 47757, 47768, 47769, 47770, 47771, 47772, 47778, 47779, 47780, 47781, 47782, 47803, 47804, 47805, 47806, 47807, 47915, 47916, 47917, 47918, 47919, 47920, 47921, 47922, 47923, 47924, 47925, 47926, 47927, + 47928, 47929, 47930, 47931, 47932, 47933, 47934, 47935, 47937, 47938, 47939, 47940, 47941, 47942, 47943, 47944, 47945, 47946, 47947, 47948, 47949, 47950, 47951, 47952, 47953, 47954, 47955, 47956, 47957, 47958, + 47959, 47960, 47961, 47962, 47963, 47964, 47965, 47966, 47967, 47968, 47969, 47970, 47971, 47972, 47973, 47974, 47975, 47976, 47977, 47978, 47979, 47983, 47984, 47985, 47986, 47987, 47988, 47989, 47990, 47991, + 47992, 47993, 47994, 47995, 47996, 47997, 47998, 47999, 48000, 48001, 48002, 48003, 48004, 48005, 48006, 48007, 48008, 48009, 48010, 48011, 48012, 48013, 48014, 48015, 48016, 48017, 48018, 48019, 48020, 48021, + 48022, 48023, 48024, 48025, 48026, 48027, 48028, 48030, 48032, 48034, 48036, 48038, 48039, 48040, 48041, 48042, 48043, 48044, 48045, 48046, 48047, 48048, 48049, 48050, 48051, 48052, 48053, 48054, 48055, 48056, + 48062, 48063, 48064, 48065, 48066, 48077, 48078, 48079, 48080, 48081, 48092, 48093, 48094, 48095, 48096, 48133, 48134, 48135, 48136, 48137, 48148, 48149, 48150, 48151, 48152, 48163, 48164, 48165, 48166, 48167, + 48178, 48179, 48180, 48181, 48182, 48193, 48194, 48195, 48196, 48197, 48208, 48209, 48210, 48211, 48212, 48223, 48224, 48225, 48226, 48227, 48238, 48239, 48240, 48241, 48242, 48255, 48256, 48257, 48258, 48259, + 48270, 48271, 48272, 48273, 48274, 48285, 48286, 48287, 48288, 48289, 48300, 48301, 48302, 48303, 48304, 48316, 48317, 48318, 48319, 48320, 48331, 48332, 48333, 48334, 48335, 48346, 48347, 48348, 48349, 48350, + 48361, 48362, 48363, 48364, 48365, 48376, 48377, 48378, 48379, 48380, 48391, 48392, 48393, 48394, 48395, 48430, 48446, 48450, 48452, 48454, 48461, 48462, 48463, 48464, 48465, 48481, 48482, 48483, 48484, 48485, + 48496, 48497, 48498, 48499, 48500, 48538, 48539, 48540, 48541, 48542, 48553, 48554, 48555, 48556, 48557, 48575, 48576, 48577, 48578, 48579, 48590, 48591, 48592, 48593, 48594, 48607, 48608, 48609, 48610, 48611, + 48622, 48623, 48624, 48625, 48626, 48637, 48638, 48639, 48640, 48641, 48657, 48658, 48659, 48660, 48661, 48666, 48667, 48668, 48669, 48670, 48671, 48672, 48673, 48674, 48675, 48693, 48695, 48697, 48699, 48701, + 48703, 48705, 48708, 48709, 48710, 48711, 48712, 48713, 48714, 48722, 48724, 49233, 49234, 49237, 49238 +}; #endif diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_dred.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_dred.cpp index 1c79b3f95..28d08cbf8 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/boss_dred.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/boss_dred.cpp @@ -35,182 +35,182 @@ enum Misc class boss_dred : public CreatureScript { - public: - boss_dred() : CreatureScript("boss_dred") {} +public: + boss_dred() : CreatureScript("boss_dred") {} - CreatureAI *GetAI(Creature *creature) const + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } + + struct boss_dredAI : public BossAI + { + boss_dredAI(Creature* creature) : BossAI(creature, DATA_DRED) { - return GetInstanceAI(creature); } - struct boss_dredAI : public BossAI + void Reset() { - boss_dredAI(Creature* creature) : BossAI(creature, DATA_DRED) + BossAI::Reset(); + _raptorCount = 0; + } + + uint32 GetData(uint32 data) const + { + if (data == me->GetEntry()) + return uint32(_raptorCount); + return 0; + } + + void SetData(uint32 type, uint32) + { + if (type == me->GetEntry()) + ++_raptorCount; + } + + void EnterCombat(Unit* who) + { + BossAI::EnterCombat(who); + _raptorCount = 0; + + events.ScheduleEvent(EVENT_SPELL_BELLOWING_ROAR, 33000); + events.ScheduleEvent(EVENT_SPELL_GRIEVOUS_BITE, 20000); + events.ScheduleEvent(EVENT_SPELL_MANGLING_SLASH, 18500); + events.ScheduleEvent(EVENT_SPELL_FEARSOME_ROAR, urand(10000, 20000)); + events.ScheduleEvent(EVENT_SPELL_PIERCING_SLASH, 17000); + if (IsHeroic()) { + events.ScheduleEvent(EVENT_MENACING_CLAW, 21000); + events.ScheduleEvent(EVENT_SPELL_RAPTOR_CALL, urand(20000, 25000)); } + } - void Reset() + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) { - BossAI::Reset(); - _raptorCount = 0; - } - - uint32 GetData(uint32 data) const - { - if (data == me->GetEntry()) - return uint32(_raptorCount); - return 0; - } - - void SetData(uint32 type, uint32) - { - if (type == me->GetEntry()) - ++_raptorCount; - } - - void EnterCombat(Unit* who) - { - BossAI::EnterCombat(who); - _raptorCount = 0; - - events.ScheduleEvent(EVENT_SPELL_BELLOWING_ROAR, 33000); - events.ScheduleEvent(EVENT_SPELL_GRIEVOUS_BITE, 20000); - events.ScheduleEvent(EVENT_SPELL_MANGLING_SLASH, 18500); - events.ScheduleEvent(EVENT_SPELL_FEARSOME_ROAR, urand(10000,20000)); - events.ScheduleEvent(EVENT_SPELL_PIERCING_SLASH, 17000); - if (IsHeroic()) - { - events.ScheduleEvent(EVENT_MENACING_CLAW, 21000); - events.ScheduleEvent(EVENT_SPELL_RAPTOR_CALL, urand(20000,25000)); - } - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_BELLOWING_ROAR: - me->CastSpell(me, SPELL_BELLOWING_ROAR, false); - events.ScheduleEvent(EVENT_SPELL_BELLOWING_ROAR, 40000); - break; - case EVENT_SPELL_GRIEVOUS_BITE: - me->CastSpell(me->GetVictim(), SPELL_GRIEVOUS_BITE, false); - events.ScheduleEvent(EVENT_SPELL_GRIEVOUS_BITE, 20000); - break; - case EVENT_SPELL_MANGLING_SLASH: - me->CastSpell(me->GetVictim(), SPELL_MANGLING_SLASH, false); - events.ScheduleEvent(EVENT_SPELL_MANGLING_SLASH, 20000); - break; - case EVENT_SPELL_FEARSOME_ROAR: - me->CastSpell(me, SPELL_FEARSOME_ROAR, false); - events.ScheduleEvent(EVENT_SPELL_FEARSOME_ROAR, 17000); - break; - case EVENT_SPELL_PIERCING_SLASH: - me->CastSpell(me->GetVictim(), SPELL_PIERCING_SLASH, false); - events.ScheduleEvent(EVENT_SPELL_PIERCING_SLASH, 20000); - break; - case EVENT_SPELL_RAPTOR_CALL: - me->CastSpell(me, SPELL_RAPTOR_CALL, false); - events.ScheduleEvent(EVENT_SPELL_RAPTOR_CALL, 20000); - break; - case EVENT_MENACING_CLAW: - Talk(SAY_CLAW_EMOTE); - me->setAttackTimer(BASE_ATTACK, 2000); + case EVENT_SPELL_BELLOWING_ROAR: + me->CastSpell(me, SPELL_BELLOWING_ROAR, false); + events.ScheduleEvent(EVENT_SPELL_BELLOWING_ROAR, 40000); + break; + case EVENT_SPELL_GRIEVOUS_BITE: + me->CastSpell(me->GetVictim(), SPELL_GRIEVOUS_BITE, false); + events.ScheduleEvent(EVENT_SPELL_GRIEVOUS_BITE, 20000); + break; + case EVENT_SPELL_MANGLING_SLASH: + me->CastSpell(me->GetVictim(), SPELL_MANGLING_SLASH, false); + events.ScheduleEvent(EVENT_SPELL_MANGLING_SLASH, 20000); + break; + case EVENT_SPELL_FEARSOME_ROAR: + me->CastSpell(me, SPELL_FEARSOME_ROAR, false); + events.ScheduleEvent(EVENT_SPELL_FEARSOME_ROAR, 17000); + break; + case EVENT_SPELL_PIERCING_SLASH: + me->CastSpell(me->GetVictim(), SPELL_PIERCING_SLASH, false); + events.ScheduleEvent(EVENT_SPELL_PIERCING_SLASH, 20000); + break; + case EVENT_SPELL_RAPTOR_CALL: + me->CastSpell(me, SPELL_RAPTOR_CALL, false); + events.ScheduleEvent(EVENT_SPELL_RAPTOR_CALL, 20000); + break; + case EVENT_MENACING_CLAW: + Talk(SAY_CLAW_EMOTE); + me->setAttackTimer(BASE_ATTACK, 2000); + me->AttackerStateUpdate(me->GetVictim()); + if (me->GetVictim()) me->AttackerStateUpdate(me->GetVictim()); - if (me->GetVictim()) - me->AttackerStateUpdate(me->GetVictim()); - if (me->GetVictim()) - me->AttackerStateUpdate(me->GetVictim()); - events.ScheduleEvent(EVENT_MENACING_CLAW, 20000); - break; - } - - DoMeleeAttackIfReady(); + if (me->GetVictim()) + me->AttackerStateUpdate(me->GetVictim()); + events.ScheduleEvent(EVENT_MENACING_CLAW, 20000); + break; } - private: - uint8 _raptorCount; - }; + DoMeleeAttackIfReady(); + } + + private: + uint8 _raptorCount; + }; }; class spell_dred_grievious_bite : public SpellScriptLoader { - public: - spell_dred_grievious_bite() : SpellScriptLoader("spell_dred_grievious_bite") { } +public: + spell_dred_grievious_bite() : SpellScriptLoader("spell_dred_grievious_bite") { } - class spell_dred_grievious_bite_AuraScript : public AuraScript + class spell_dred_grievious_bite_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dred_grievious_bite_AuraScript); + + void OnPeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_dred_grievious_bite_AuraScript); - - void OnPeriodic(AuraEffect const* /*aurEff*/) - { - if (Unit* target = GetTarget()) - if (target->GetHealth() == target->GetMaxHealth()) - { - PreventDefaultAction(); - SetDuration(0); - } - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_dred_grievious_bite_AuraScript::OnPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dred_grievious_bite_AuraScript(); + if (Unit* target = GetTarget()) + if (target->GetHealth() == target->GetMaxHealth()) + { + PreventDefaultAction(); + SetDuration(0); + } } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_dred_grievious_bite_AuraScript::OnPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dred_grievious_bite_AuraScript(); + } }; class spell_dred_raptor_call : public SpellScriptLoader { - public: - spell_dred_raptor_call() : SpellScriptLoader("spell_dred_raptor_call") { } +public: + spell_dred_raptor_call() : SpellScriptLoader("spell_dred_raptor_call") { } - class spell_dred_raptor_call_SpellScript : public SpellScript + class spell_dred_raptor_call_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dred_raptor_call_SpellScript); + + void HandleDummy(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_dred_raptor_call_SpellScript); - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - GetCaster()->SummonCreature(RAND(NPC_DRAKKARI_GUTRIPPER, NPC_DRAKKARI_SCYTHECLAW), -522.02f, -718.89f, 30.26f, 2.41f); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_dred_raptor_call_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dred_raptor_call_SpellScript(); + GetCaster()->SummonCreature(RAND(NPC_DRAKKARI_GUTRIPPER, NPC_DRAKKARI_SCYTHECLAW), -522.02f, -718.89f, 30.26f, 2.41f); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_dred_raptor_call_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dred_raptor_call_SpellScript(); + } }; class achievement_better_off_dred : public AchievementCriteriaScript { - public: - achievement_better_off_dred() : AchievementCriteriaScript("achievement_better_off_dred") - { - } +public: + achievement_better_off_dred() : AchievementCriteriaScript("achievement_better_off_dred") + { + } - bool OnCheck(Player* /*player*/, Unit* target) - { - if (!target) - return false; + bool OnCheck(Player* /*player*/, Unit* target) + { + if (!target) + return false; - return target->GetAI()->GetData(target->GetEntry()); - } + return target->GetAI()->GetData(target->GetEntry()); + } }; void AddSC_boss_dred() diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp index d4ea288e2..56fe5cb9e 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp @@ -48,7 +48,7 @@ enum Misc EVENT_KILL_TALK = 6, EVENT_CHECK_PHASE = 7, EVENT_SPELL_SUMMON_MINIONS = 8, - + ROOM_RIGHT = 0, ROOM_LEFT = 1, ROOM_STAIRS = 2 @@ -63,286 +63,286 @@ std::unordered_map> const npcSummon = class boss_novos : public CreatureScript { - public: - boss_novos() : CreatureScript("boss_novos") { } +public: + boss_novos() : CreatureScript("boss_novos") { } - struct boss_novosAI : public BossAI + struct boss_novosAI : public BossAI + { + boss_novosAI(Creature* creature) : BossAI(creature, DATA_NOVOS) { - boss_novosAI(Creature* creature) : BossAI(creature, DATA_NOVOS) - { - } - - void Reset() - { - BossAI::Reset(); - instance->SetBossState(DATA_NOVOS_CRYSTALS, IN_PROGRESS); - instance->SetBossState(DATA_NOVOS_CRYSTALS, NOT_STARTED); - _crystalCounter = _summonTargetRightGUID = _summonTargetLeftGUID = _stage = 0; - - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - - _achievement = true; - } - - uint32 GetData(uint32 data) const - { - if (data == me->GetEntry()) - return uint32(_achievement); - return 0; - } - - void SetData(uint32 type, uint32) - { - if (type == me->GetEntry()) - _achievement = false; - } - - void MoveInLineOfSight(Unit* /*who*/) { } - - void EnterCombat(Unit* who) - { - Talk(SAY_AGGRO); - BossAI::EnterCombat(who); - - events.ScheduleEvent(EVENT_SUMMON_FETID_TROLL, 3000); - events.ScheduleEvent(EVENT_SUMMON_SHADOWCASTER, 9000); - events.ScheduleEvent(EVENT_SUMMON_HULKING_CORPSE, 30000); - events.ScheduleEvent(EVENT_SUMMON_CRYSTAL_HANDLER, 20000); - events.ScheduleEvent(EVENT_CHECK_PHASE, 80000); - - me->CastSpell(me, SPELL_ARCANE_BLAST, true); - me->CastSpell(me, SPELL_ARCANE_FIELD, true); - me->CastSpell(me, SPELL_DESPAWN_CRYSTAL_HANDLER, true); - - for (auto itr : npcSummon) - { - uint32 summonEntry; - Position summonPos; - std::tie(summonEntry, summonPos) = itr.second; - if (Creature *creature = me->SummonCreature(summonEntry, summonPos)) - switch (itr.first) - { - case ROOM_LEFT: - _summonTargetLeftGUID = creature->GetGUID(); - break; - case ROOM_RIGHT: - _summonTargetRightGUID = creature->GetGUID(); - break; - } - } - - me->SetUInt64Value(UNIT_FIELD_TARGET, 0); - me->RemoveAllAuras(); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - } - - void JustDied(Unit* killer) - { - Talk(SAY_DEATH); - BossAI::JustDied(killer); - instance->SetBossState(DATA_NOVOS_CRYSTALS, DONE); - } - - void KilledUnit(Unit* /*victim*/) - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(SAY_KILL); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); - } - } - - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE) && summon->GetEntry() != NPC_CRYSTAL_CHANNEL_TARGET && summon->GetEntry() != NPC_CRYSTAL_HANDLER) - summon->SetReactState(REACT_DEFENSIVE); - else if (summon->GetEntry() != NPC_CRYSTAL_CHANNEL_TARGET) - summon->SetInCombatWithZone(); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - switch (events.ExecuteEvent()) - { - case EVENT_SUMMON_FETID_TROLL: - if (Creature* trigger = summons.GetCreatureWithEntry(NPC_CRYSTAL_CHANNEL_TARGET)) - trigger->CastSpell(trigger, SPELL_SUMMON_FETID_TROLL_CORPSE, true, nullptr, nullptr, me->GetGUID()); - events.ScheduleEvent(EVENT_SUMMON_FETID_TROLL, 3000); - break; - case EVENT_SUMMON_HULKING_CORPSE: - if (Creature* trigger = summons.GetCreatureWithEntry(NPC_CRYSTAL_CHANNEL_TARGET)) - trigger->CastSpell(trigger, SPELL_SUMMON_HULKING_CORPSE, true, nullptr, nullptr, me->GetGUID()); - events.ScheduleEvent(EVENT_SUMMON_HULKING_CORPSE, 30000); - break; - case EVENT_SUMMON_SHADOWCASTER: - if (Creature* trigger = summons.GetCreatureWithEntry(NPC_CRYSTAL_CHANNEL_TARGET)) - trigger->CastSpell(trigger, SPELL_SUMMON_RISEN_SHADOWCASTER, true, nullptr, nullptr, me->GetGUID()); - events.ScheduleEvent(EVENT_SUMMON_SHADOWCASTER, 10000); - break; - case EVENT_SUMMON_CRYSTAL_HANDLER: - if (_crystalCounter++ < 4) - { - Talk(SAY_SUMMONING_ADDS); - Talk(EMOTE_SUMMONING_ADDS); - if (Creature* target = ObjectAccessor::GetCreature(*me, _stage ? _summonTargetLeftGUID : _summonTargetRightGUID)) - target->CastSpell(target, SPELL_SUMMON_CRYSTAL_HANDLER, true, nullptr, nullptr, me->GetGUID()); - _stage = _stage ? 0 : 1; - events.ScheduleEvent(EVENT_SUMMON_CRYSTAL_HANDLER, 20000); - } - break; - case EVENT_CHECK_PHASE: - if (me->HasAura(SPELL_BEAM_CHANNEL)) - { - events.ScheduleEvent(EVENT_CHECK_PHASE, 2000); - break; - } - events.Reset(); - events.ScheduleEvent(EVENT_CAST_OFFENSIVE_SPELL, 3000); - events.ScheduleEvent(EVENT_SPELL_SUMMON_MINIONS, 10000); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->InterruptNonMeleeSpells(false); - break; - case EVENT_CAST_OFFENSIVE_SPELL: - if (!me->HasUnitState(UNIT_STATE_CASTING)) - if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - me->CastSpell(target, RAND(SPELL_BLIZZARD,SPELL_FROSTBOLT,SPELL_TOUCH_OF_MISERY), false); - - events.ScheduleEvent(EVENT_CAST_OFFENSIVE_SPELL, 500); - break; - case EVENT_SPELL_SUMMON_MINIONS: - if (me->HasUnitState(UNIT_STATE_CASTING)) - { - me->CastSpell(me, SPELL_SUMMON_MINIONS, false); - events.ScheduleEvent(EVENT_SPELL_SUMMON_MINIONS, 15000); - break; - } - events.ScheduleEvent(EVENT_SPELL_SUMMON_MINIONS, 500); - break; - } - - EnterEvadeIfOutOfCombatArea(); - } - - bool CheckEvadeIfOutOfCombatArea() const - { - return !SelectTargetFromPlayerList(80.0f); - } - - private: - uint8 _crystalCounter; - uint8 _stage; - uint64 _summonTargetRightGUID; - uint64 _summonTargetLeftGUID; - - bool _achievement; - }; - - CreatureAI *GetAI(Creature *creature) const - { - return GetInstanceAI(creature); } + + void Reset() + { + BossAI::Reset(); + instance->SetBossState(DATA_NOVOS_CRYSTALS, IN_PROGRESS); + instance->SetBossState(DATA_NOVOS_CRYSTALS, NOT_STARTED); + _crystalCounter = _summonTargetRightGUID = _summonTargetLeftGUID = _stage = 0; + + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + + _achievement = true; + } + + uint32 GetData(uint32 data) const + { + if (data == me->GetEntry()) + return uint32(_achievement); + return 0; + } + + void SetData(uint32 type, uint32) + { + if (type == me->GetEntry()) + _achievement = false; + } + + void MoveInLineOfSight(Unit* /*who*/) { } + + void EnterCombat(Unit* who) + { + Talk(SAY_AGGRO); + BossAI::EnterCombat(who); + + events.ScheduleEvent(EVENT_SUMMON_FETID_TROLL, 3000); + events.ScheduleEvent(EVENT_SUMMON_SHADOWCASTER, 9000); + events.ScheduleEvent(EVENT_SUMMON_HULKING_CORPSE, 30000); + events.ScheduleEvent(EVENT_SUMMON_CRYSTAL_HANDLER, 20000); + events.ScheduleEvent(EVENT_CHECK_PHASE, 80000); + + me->CastSpell(me, SPELL_ARCANE_BLAST, true); + me->CastSpell(me, SPELL_ARCANE_FIELD, true); + me->CastSpell(me, SPELL_DESPAWN_CRYSTAL_HANDLER, true); + + for (auto itr : npcSummon) + { + uint32 summonEntry; + Position summonPos; + std::tie(summonEntry, summonPos) = itr.second; + if (Creature* creature = me->SummonCreature(summonEntry, summonPos)) + switch (itr.first) + { + case ROOM_LEFT: + _summonTargetLeftGUID = creature->GetGUID(); + break; + case ROOM_RIGHT: + _summonTargetRightGUID = creature->GetGUID(); + break; + } + } + + me->SetUInt64Value(UNIT_FIELD_TARGET, 0); + me->RemoveAllAuras(); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + } + + void JustDied(Unit* killer) + { + Talk(SAY_DEATH); + BossAI::JustDied(killer); + instance->SetBossState(DATA_NOVOS_CRYSTALS, DONE); + } + + void KilledUnit(Unit* /*victim*/) + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + { + Talk(SAY_KILL); + events.ScheduleEvent(EVENT_KILL_TALK, 6000); + } + } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE) && summon->GetEntry() != NPC_CRYSTAL_CHANNEL_TARGET && summon->GetEntry() != NPC_CRYSTAL_HANDLER) + summon->SetReactState(REACT_DEFENSIVE); + else if (summon->GetEntry() != NPC_CRYSTAL_CHANNEL_TARGET) + summon->SetInCombatWithZone(); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + switch (events.ExecuteEvent()) + { + case EVENT_SUMMON_FETID_TROLL: + if (Creature* trigger = summons.GetCreatureWithEntry(NPC_CRYSTAL_CHANNEL_TARGET)) + trigger->CastSpell(trigger, SPELL_SUMMON_FETID_TROLL_CORPSE, true, nullptr, nullptr, me->GetGUID()); + events.ScheduleEvent(EVENT_SUMMON_FETID_TROLL, 3000); + break; + case EVENT_SUMMON_HULKING_CORPSE: + if (Creature* trigger = summons.GetCreatureWithEntry(NPC_CRYSTAL_CHANNEL_TARGET)) + trigger->CastSpell(trigger, SPELL_SUMMON_HULKING_CORPSE, true, nullptr, nullptr, me->GetGUID()); + events.ScheduleEvent(EVENT_SUMMON_HULKING_CORPSE, 30000); + break; + case EVENT_SUMMON_SHADOWCASTER: + if (Creature* trigger = summons.GetCreatureWithEntry(NPC_CRYSTAL_CHANNEL_TARGET)) + trigger->CastSpell(trigger, SPELL_SUMMON_RISEN_SHADOWCASTER, true, nullptr, nullptr, me->GetGUID()); + events.ScheduleEvent(EVENT_SUMMON_SHADOWCASTER, 10000); + break; + case EVENT_SUMMON_CRYSTAL_HANDLER: + if (_crystalCounter++ < 4) + { + Talk(SAY_SUMMONING_ADDS); + Talk(EMOTE_SUMMONING_ADDS); + if (Creature* target = ObjectAccessor::GetCreature(*me, _stage ? _summonTargetLeftGUID : _summonTargetRightGUID)) + target->CastSpell(target, SPELL_SUMMON_CRYSTAL_HANDLER, true, nullptr, nullptr, me->GetGUID()); + _stage = _stage ? 0 : 1; + events.ScheduleEvent(EVENT_SUMMON_CRYSTAL_HANDLER, 20000); + } + break; + case EVENT_CHECK_PHASE: + if (me->HasAura(SPELL_BEAM_CHANNEL)) + { + events.ScheduleEvent(EVENT_CHECK_PHASE, 2000); + break; + } + events.Reset(); + events.ScheduleEvent(EVENT_CAST_OFFENSIVE_SPELL, 3000); + events.ScheduleEvent(EVENT_SPELL_SUMMON_MINIONS, 10000); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->InterruptNonMeleeSpells(false); + break; + case EVENT_CAST_OFFENSIVE_SPELL: + if (!me->HasUnitState(UNIT_STATE_CASTING)) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) + me->CastSpell(target, RAND(SPELL_BLIZZARD, SPELL_FROSTBOLT, SPELL_TOUCH_OF_MISERY), false); + + events.ScheduleEvent(EVENT_CAST_OFFENSIVE_SPELL, 500); + break; + case EVENT_SPELL_SUMMON_MINIONS: + if (me->HasUnitState(UNIT_STATE_CASTING)) + { + me->CastSpell(me, SPELL_SUMMON_MINIONS, false); + events.ScheduleEvent(EVENT_SPELL_SUMMON_MINIONS, 15000); + break; + } + events.ScheduleEvent(EVENT_SPELL_SUMMON_MINIONS, 500); + break; + } + + EnterEvadeIfOutOfCombatArea(); + } + + bool CheckEvadeIfOutOfCombatArea() const + { + return !SelectTargetFromPlayerList(80.0f); + } + + private: + uint8 _crystalCounter; + uint8 _stage; + uint64 _summonTargetRightGUID; + uint64 _summonTargetLeftGUID; + + bool _achievement; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class spell_novos_despawn_crystal_handler : public SpellScriptLoader { - public: - spell_novos_despawn_crystal_handler() : SpellScriptLoader("spell_novos_despawn_crystal_handler") { } +public: + spell_novos_despawn_crystal_handler() : SpellScriptLoader("spell_novos_despawn_crystal_handler") { } - class spell_novos_despawn_crystal_handler_SpellScript : public SpellScript + class spell_novos_despawn_crystal_handler_SpellScript : public SpellScript + { + PrepareSpellScript(spell_novos_despawn_crystal_handler_SpellScript); + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_novos_despawn_crystal_handler_SpellScript); - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - target->CastSpell(GetCaster(), SPELL_BEAM_CHANNEL, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_novos_despawn_crystal_handler_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_novos_despawn_crystal_handler_SpellScript(); + if (Unit* target = GetHitUnit()) + target->CastSpell(GetCaster(), SPELL_BEAM_CHANNEL, true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_novos_despawn_crystal_handler_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_novos_despawn_crystal_handler_SpellScript(); + } }; class spell_novos_crystal_handler_death : public SpellScriptLoader { - public: - spell_novos_crystal_handler_death() : SpellScriptLoader("spell_novos_crystal_handler_death") { } +public: + spell_novos_crystal_handler_death() : SpellScriptLoader("spell_novos_crystal_handler_death") { } - class spell_novos_crystal_handler_death_AuraScript : public AuraScript + class spell_novos_crystal_handler_death_AuraScript : public AuraScript + { + PrepareAuraScript(spell_novos_crystal_handler_death_AuraScript) + + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_novos_crystal_handler_death_AuraScript) - - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetUnitOwner()->InterruptNonMeleeSpells(false); - if (GameObject* crystal = GetUnitOwner()->FindNearestGameObjectOfType(GAMEOBJECT_TYPE_DOOR, 5.0f)) - crystal->SetGoState(GO_STATE_READY); - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_novos_crystal_handler_death_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_novos_crystal_handler_death_AuraScript(); + GetUnitOwner()->InterruptNonMeleeSpells(false); + if (GameObject* crystal = GetUnitOwner()->FindNearestGameObjectOfType(GAMEOBJECT_TYPE_DOOR, 5.0f)) + crystal->SetGoState(GO_STATE_READY); } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_novos_crystal_handler_death_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_novos_crystal_handler_death_AuraScript(); + } }; class spell_novos_summon_minions : public SpellScriptLoader { - public: - spell_novos_summon_minions() : SpellScriptLoader("spell_novos_summon_minions") { } +public: + spell_novos_summon_minions() : SpellScriptLoader("spell_novos_summon_minions") { } - class spell_novos_summon_minions_SpellScript : public SpellScript + class spell_novos_summon_minions_SpellScript : public SpellScript + { + PrepareSpellScript(spell_novos_summon_minions_SpellScript); + + void HandleScript(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_novos_summon_minions_SpellScript); - - void HandleScript(SpellEffIndex /*effIndex*/) - { - for (uint8 i = 0; i < 4; ++i) - GetCaster()->CastSpell((Unit*)NULL, SPELL_COPY_OF_SUMMON_MINIONS, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_novos_summon_minions_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_novos_summon_minions_SpellScript(); + for (uint8 i = 0; i < 4; ++i) + GetCaster()->CastSpell((Unit*)NULL, SPELL_COPY_OF_SUMMON_MINIONS, true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_novos_summon_minions_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_novos_summon_minions_SpellScript(); + } }; class achievement_oh_novos : public AchievementCriteriaScript { - public: - achievement_oh_novos() : AchievementCriteriaScript("achievement_oh_novos") { } +public: + achievement_oh_novos() : AchievementCriteriaScript("achievement_oh_novos") { } - bool OnCheck(Player* /*player*/, Unit* target) - { - return target && target->GetAI()->GetData(target->GetEntry()); - } + bool OnCheck(Player* /*player*/, Unit* target) + { + return target && target->GetAI()->GetData(target->GetEntry()); + } }; void AddSC_boss_novos() diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp index 40d3068da..7b51291af 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp @@ -54,240 +54,240 @@ enum Misc class boss_tharon_ja : public CreatureScript { - public: - boss_tharon_ja() : CreatureScript("boss_tharon_ja") { } +public: + boss_tharon_ja() : CreatureScript("boss_tharon_ja") { } - CreatureAI *GetAI(Creature *creature) const + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } + + struct boss_tharon_jaAI : public BossAI + { + boss_tharon_jaAI(Creature* creature) : BossAI(creature, DATA_THARON_JA) { - return GetInstanceAI(creature); } - struct boss_tharon_jaAI : public BossAI + void Reset() { - boss_tharon_jaAI(Creature* creature) : BossAI(creature, DATA_THARON_JA) - { - } + BossAI::Reset(); + me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true); + me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK_DEST, true); + me->SetDisplayId(me->GetNativeDisplayId()); + me->CastSpell(me, SPELL_CLEAR_GIFT, true); + } - void Reset() + void EnterCombat(Unit* who) + { + Talk(SAY_AGGRO); + BossAI::EnterCombat(who); + events.ScheduleEvent(EVENT_SPELL_CURSE_OF_LIFE, 5000); + events.ScheduleEvent(EVENT_SPELL_RAIN_OF_FIRE, urand(14000, 18000)); + events.ScheduleEvent(EVENT_SPELL_SHADOW_VOLLEY, urand(8000, 10000)); + events.ScheduleEvent(EVENT_SPELL_TURN_FLESH, 1000); + } + + void KilledUnit(Unit* /*victim*/) + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + { + Talk(SAY_KILL); + events.ScheduleEvent(EVENT_KILL_TALK, 6000); + } + } + + void DoAction(int32 param) + { + if (param == ACTION_TURN_BONES && me->IsAlive()) + { + Talk(SAY_SKELETON); + events.Reset(); + events.ScheduleEvent(EVENT_TURN_BONES_REAL, 3000); + } + } + + void JustDied(Unit* killer) + { + Talk(SAY_DEATH); + BossAI::JustDied(killer); + me->CastSpell(me, SPELL_ACHIEVEMENT_CHECK, true); + me->CastSpell(me, SPELL_CLEAR_GIFT, true); + if (me->GetDisplayId() != me->GetNativeDisplayId()) { - BossAI::Reset(); - me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true); - me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK_DEST, true); me->SetDisplayId(me->GetNativeDisplayId()); - me->CastSpell(me, SPELL_CLEAR_GIFT, true); + me->CastSpell(me, SPELL_FLESH_VISUAL, true); } + } - void EnterCombat(Unit* who) - { - Talk(SAY_AGGRO); - BossAI::EnterCombat(who); - events.ScheduleEvent(EVENT_SPELL_CURSE_OF_LIFE, 5000); - events.ScheduleEvent(EVENT_SPELL_RAIN_OF_FIRE, urand(14000,18000)); - events.ScheduleEvent(EVENT_SPELL_SHADOW_VOLLEY, urand(8000,10000)); - events.ScheduleEvent(EVENT_SPELL_TURN_FLESH, 1000); - } + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; - void KilledUnit(Unit * /*victim*/) - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(SAY_KILL); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); - } - } + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - void DoAction(int32 param) + switch (events.ExecuteEvent()) { - if (param == ACTION_TURN_BONES && me->IsAlive()) - { - Talk(SAY_SKELETON); - events.Reset(); - events.ScheduleEvent(EVENT_TURN_BONES_REAL, 3000); - } - } + case EVENT_SPELL_CURSE_OF_LIFE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true)) + me->CastSpell(target, SPELL_CURSE_OF_LIFE, false); + events.ScheduleEvent(EVENT_SPELL_CURSE_OF_LIFE, 13000); + break; + case EVENT_SPELL_RAIN_OF_FIRE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true)) + me->CastSpell(target, SPELL_RAIN_OF_FIRE, false); + events.ScheduleEvent(EVENT_SPELL_RAIN_OF_FIRE, 16000); + break; + case EVENT_SPELL_SHADOW_VOLLEY: + me->CastSpell(me, SPELL_SHADOW_VOLLEY, false); + events.ScheduleEvent(EVENT_SPELL_SHADOW_VOLLEY, 9000); + break; + case EVENT_SPELL_TURN_FLESH: + if (me->HealthBelowPct(50)) + { + Talk(SAY_FLESH); + me->getThreatManager().resetAllAggro(); + me->CastSpell((Unit*)NULL, SPELL_TURN_FLESH, false); - void JustDied(Unit* killer) - { - Talk(SAY_DEATH); - BossAI::JustDied(killer); - me->CastSpell(me, SPELL_ACHIEVEMENT_CHECK, true); - me->CastSpell(me, SPELL_CLEAR_GIFT, true); - if (me->GetDisplayId() != me->GetNativeDisplayId()) - { + events.Reset(); + events.ScheduleEvent(EVENT_TURN_FLESH_REAL, 3000); + return; + } + events.ScheduleEvent(EVENT_SPELL_TURN_FLESH, 1000); + break; + case EVENT_TURN_FLESH_REAL: + me->CastSpell(me, SPELL_DUMMY, true); + + me->GetMotionMaster()->MoveChase(me->GetVictim()); + events.ScheduleEvent(EVENT_SPELL_EYE_BEAM, 11000); + events.ScheduleEvent(EVENT_SPELL_LIGHTNING_BREATH, 3000); + events.ScheduleEvent(EVENT_SPELL_POISON_CLOUD, 6000); + break; + case EVENT_SPELL_EYE_BEAM: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 35.0f, true)) + me->CastSpell(target, SPELL_EYE_BEAM, false); + break; + case EVENT_SPELL_LIGHTNING_BREATH: + me->CastSpell(me->GetVictim(), SPELL_LIGHTNING_BREATH, false); + events.ScheduleEvent(EVENT_SPELL_LIGHTNING_BREATH, 8000); + break; + case EVENT_SPELL_POISON_CLOUD: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 35.0f, true)) + me->CastSpell(target, SPELL_POISON_CLOUD, false); + events.ScheduleEvent(EVENT_SPELL_POISON_CLOUD, 10000); + break; + case EVENT_TURN_BONES_REAL: me->SetDisplayId(me->GetNativeDisplayId()); me->CastSpell(me, SPELL_FLESH_VISUAL, true); - } + me->CastSpell(me, SPELL_CLEAR_GIFT, true); + events.Reset(); + events.ScheduleEvent(EVENT_SPELL_CURSE_OF_LIFE, 1000); + events.ScheduleEvent(EVENT_SPELL_RAIN_OF_FIRE, urand(12000, 14000)); + events.ScheduleEvent(EVENT_SPELL_SHADOW_VOLLEY, urand(8000, 10000)); + break; } - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_CURSE_OF_LIFE: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true)) - me->CastSpell(target, SPELL_CURSE_OF_LIFE, false); - events.ScheduleEvent(EVENT_SPELL_CURSE_OF_LIFE, 13000); - break; - case EVENT_SPELL_RAIN_OF_FIRE: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true)) - me->CastSpell(target, SPELL_RAIN_OF_FIRE, false); - events.ScheduleEvent(EVENT_SPELL_RAIN_OF_FIRE, 16000); - break; - case EVENT_SPELL_SHADOW_VOLLEY: - me->CastSpell(me, SPELL_SHADOW_VOLLEY, false); - events.ScheduleEvent(EVENT_SPELL_SHADOW_VOLLEY, 9000); - break; - case EVENT_SPELL_TURN_FLESH: - if (me->HealthBelowPct(50)) - { - Talk(SAY_FLESH); - me->getThreatManager().resetAllAggro(); - me->CastSpell((Unit*)NULL, SPELL_TURN_FLESH, false); - - events.Reset(); - events.ScheduleEvent(EVENT_TURN_FLESH_REAL, 3000); - return; - } - events.ScheduleEvent(EVENT_SPELL_TURN_FLESH, 1000); - break; - case EVENT_TURN_FLESH_REAL: - me->CastSpell(me, SPELL_DUMMY, true); - - me->GetMotionMaster()->MoveChase(me->GetVictim()); - events.ScheduleEvent(EVENT_SPELL_EYE_BEAM, 11000); - events.ScheduleEvent(EVENT_SPELL_LIGHTNING_BREATH, 3000); - events.ScheduleEvent(EVENT_SPELL_POISON_CLOUD, 6000); - break; - case EVENT_SPELL_EYE_BEAM: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 35.0f, true)) - me->CastSpell(target, SPELL_EYE_BEAM, false); - break; - case EVENT_SPELL_LIGHTNING_BREATH: - me->CastSpell(me->GetVictim(), SPELL_LIGHTNING_BREATH, false); - events.ScheduleEvent(EVENT_SPELL_LIGHTNING_BREATH, 8000); - break; - case EVENT_SPELL_POISON_CLOUD: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 35.0f, true)) - me->CastSpell(target, SPELL_POISON_CLOUD, false); - events.ScheduleEvent(EVENT_SPELL_POISON_CLOUD, 10000); - break; - case EVENT_TURN_BONES_REAL: - me->SetDisplayId(me->GetNativeDisplayId()); - me->CastSpell(me, SPELL_FLESH_VISUAL, true); - me->CastSpell(me, SPELL_CLEAR_GIFT, true); - events.Reset(); - events.ScheduleEvent(EVENT_SPELL_CURSE_OF_LIFE, 1000); - events.ScheduleEvent(EVENT_SPELL_RAIN_OF_FIRE, urand(12000,14000)); - events.ScheduleEvent(EVENT_SPELL_SHADOW_VOLLEY, urand(8000,10000)); - break; - } - - DoMeleeAttackIfReady(); - } - }; + DoMeleeAttackIfReady(); + } + }; }; class spell_tharon_ja_curse_of_life : public SpellScriptLoader { - public: - spell_tharon_ja_curse_of_life() : SpellScriptLoader("spell_tharon_ja_curse_of_life") { } +public: + spell_tharon_ja_curse_of_life() : SpellScriptLoader("spell_tharon_ja_curse_of_life") { } - class spell_tharon_ja_curse_of_life_AuraScript : public AuraScript + class spell_tharon_ja_curse_of_life_AuraScript : public AuraScript + { + PrepareAuraScript(spell_tharon_ja_curse_of_life_AuraScript); + + void OnPeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_tharon_ja_curse_of_life_AuraScript); - - void OnPeriodic(AuraEffect const* /*aurEff*/) + if (GetUnitOwner()->HealthBelowPct(50)) { - if (GetUnitOwner()->HealthBelowPct(50)) - { - PreventDefaultAction(); - SetDuration(0); - } + PreventDefaultAction(); + SetDuration(0); } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_tharon_ja_curse_of_life_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_tharon_ja_curse_of_life_AuraScript(); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_tharon_ja_curse_of_life_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_tharon_ja_curse_of_life_AuraScript(); + } }; class spell_tharon_ja_dummy : public SpellScriptLoader { - public: - spell_tharon_ja_dummy() : SpellScriptLoader("spell_tharon_ja_dummy") { } +public: + spell_tharon_ja_dummy() : SpellScriptLoader("spell_tharon_ja_dummy") { } - class spell_tharon_ja_dummy_AuraScript : public AuraScript + class spell_tharon_ja_dummy_AuraScript : public AuraScript + { + PrepareAuraScript(spell_tharon_ja_dummy_AuraScript) + + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_tharon_ja_dummy_AuraScript) - - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - PreventDefaultAction(); - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_FLESH_VISUAL, true); - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_GIFT_OF_THARON_JA, true); - GetUnitOwner()->SetDisplayId(GetUnitOwner()->GetNativeDisplayId()+1); - } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - PreventDefaultAction(); - GetUnitOwner()->getThreatManager().resetAllAggro(); - GetUnitOwner()->GetMotionMaster()->Clear(); - GetUnitOwner()->CastSpell((Unit*)NULL, SPELL_TURN_BONES, false); - GetUnitOwner()->GetAI()->DoAction(ACTION_TURN_BONES); - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_tharon_ja_dummy_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_tharon_ja_dummy_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_tharon_ja_dummy_AuraScript(); + PreventDefaultAction(); + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_FLESH_VISUAL, true); + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_GIFT_OF_THARON_JA, true); + GetUnitOwner()->SetDisplayId(GetUnitOwner()->GetNativeDisplayId() + 1); } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + PreventDefaultAction(); + GetUnitOwner()->getThreatManager().resetAllAggro(); + GetUnitOwner()->GetMotionMaster()->Clear(); + GetUnitOwner()->CastSpell((Unit*)NULL, SPELL_TURN_BONES, false); + GetUnitOwner()->GetAI()->DoAction(ACTION_TURN_BONES); + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_tharon_ja_dummy_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_tharon_ja_dummy_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_tharon_ja_dummy_AuraScript(); + } }; class spell_tharon_ja_clear_gift_of_tharon_ja : public SpellScriptLoader { - public: - spell_tharon_ja_clear_gift_of_tharon_ja() : SpellScriptLoader("spell_tharon_ja_clear_gift_of_tharon_ja") { } +public: + spell_tharon_ja_clear_gift_of_tharon_ja() : SpellScriptLoader("spell_tharon_ja_clear_gift_of_tharon_ja") { } - class spell_tharon_ja_clear_gift_of_tharon_ja_SpellScript : public SpellScript + class spell_tharon_ja_clear_gift_of_tharon_ja_SpellScript : public SpellScript + { + PrepareSpellScript(spell_tharon_ja_clear_gift_of_tharon_ja_SpellScript); + + void HandleScript(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_tharon_ja_clear_gift_of_tharon_ja_SpellScript); - - void HandleScript(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - target->RemoveAura(SPELL_GIFT_OF_THARON_JA); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_tharon_ja_clear_gift_of_tharon_ja_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_tharon_ja_clear_gift_of_tharon_ja_SpellScript(); + if (Unit* target = GetHitUnit()) + target->RemoveAura(SPELL_GIFT_OF_THARON_JA); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_tharon_ja_clear_gift_of_tharon_ja_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_tharon_ja_clear_gift_of_tharon_ja_SpellScript(); + } }; void AddSC_boss_tharon_ja() diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp index 00b9170d3..3c7de390b 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp @@ -43,223 +43,223 @@ enum Events class boss_trollgore : public CreatureScript { - public: - boss_trollgore() : CreatureScript("boss_trollgore") { } +public: + boss_trollgore() : CreatureScript("boss_trollgore") { } - struct boss_trollgoreAI : public BossAI + struct boss_trollgoreAI : public BossAI + { + boss_trollgoreAI(Creature* creature) : BossAI(creature, DATA_TROLLGORE) { - boss_trollgoreAI(Creature* creature) : BossAI(creature, DATA_TROLLGORE) - { - } - - void Reset() - { - BossAI::Reset(); - events2.Reset(); - events2.ScheduleEvent(EVENT_SPAWN_INVADERS, 30000); - } - - void EnterCombat(Unit* who) - { - events.ScheduleEvent(EVENT_SPELL_INFECTED_WOUND, urand(6000,10000)); - events.ScheduleEvent(EVENT_SPELL_CRUSH, urand(3000,5000)); - events.ScheduleEvent(EVENT_SPELL_CONSUME, 15000); - events.ScheduleEvent(EVENT_SPELL_CORPSE_EXPLODE, 35000); - events.ScheduleEvent(EVENT_SPAWN_INVADERS, 20000, 30000); - - me->setActive(true); - instance->SetBossState(DATA_TROLLGORE, IN_PROGRESS); - if (who->GetTypeId() == TYPEID_PLAYER) - { - Talk(SAY_AGGRO); - me->SetInCombatWithZone(); - } - } - - void JustDied(Unit* killer) - { - Talk(SAY_DEATH); - BossAI::JustDied(killer); - } - - void KilledUnit(Unit* /*victim*/) - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(SAY_KILL); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); - } - } - - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - } - - void UpdateAI(uint32 diff) - { - events2.Update(diff); - switch (events2.ExecuteEvent()) - { - case EVENT_SPAWN_INVADERS: - me->CastSpell(me, SPELL_SUMMON_INVADER_A, true); - me->CastSpell(me, SPELL_SUMMON_INVADER_B, true); - me->CastSpell(me, SPELL_SUMMON_INVADER_C, true); - events2.ScheduleEvent(EVENT_SPAWN_INVADERS, 30000); - break; - } - - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch(events.ExecuteEvent()) - { - case EVENT_SPELL_INFECTED_WOUND: - me->CastSpell(me->GetVictim(), SPELL_INFECTED_WOUND, false); - events.ScheduleEvent(EVENT_SPELL_INFECTED_WOUND, urand(25000,35000)); - break; - case EVENT_SPELL_CRUSH: - me->CastSpell(me->GetVictim(), SPELL_CRUSH, false); - events.ScheduleEvent(EVENT_SPELL_CRUSH, urand(10000,15000)); - break; - case EVENT_SPELL_CONSUME: - Talk(SAY_CONSUME); - me->CastSpell(me, SPELL_CONSUME, false); - events.ScheduleEvent(EVENT_SPELL_CONSUME, 15000); - break; - case EVENT_SPELL_CORPSE_EXPLODE: - Talk(SAY_EXPLODE); - me->CastSpell(me, SPELL_CORPSE_EXPLODE, false); - events.ScheduleEvent(EVENT_SPELL_CORPSE_EXPLODE, urand(15000,19000)); - break; - } - - DoMeleeAttackIfReady(); - EnterEvadeIfOutOfCombatArea(); - } - - bool CheckEvadeIfOutOfCombatArea() const - { - return me->GetHomePosition().GetExactDist2d(me) > 60.0f; - } - - private: - EventMap events2; - }; - - CreatureAI *GetAI(Creature *creature) const - { - return GetInstanceAI(creature); } + + void Reset() + { + BossAI::Reset(); + events2.Reset(); + events2.ScheduleEvent(EVENT_SPAWN_INVADERS, 30000); + } + + void EnterCombat(Unit* who) + { + events.ScheduleEvent(EVENT_SPELL_INFECTED_WOUND, urand(6000, 10000)); + events.ScheduleEvent(EVENT_SPELL_CRUSH, urand(3000, 5000)); + events.ScheduleEvent(EVENT_SPELL_CONSUME, 15000); + events.ScheduleEvent(EVENT_SPELL_CORPSE_EXPLODE, 35000); + events.ScheduleEvent(EVENT_SPAWN_INVADERS, 20000, 30000); + + me->setActive(true); + instance->SetBossState(DATA_TROLLGORE, IN_PROGRESS); + if (who->GetTypeId() == TYPEID_PLAYER) + { + Talk(SAY_AGGRO); + me->SetInCombatWithZone(); + } + } + + void JustDied(Unit* killer) + { + Talk(SAY_DEATH); + BossAI::JustDied(killer); + } + + void KilledUnit(Unit* /*victim*/) + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + { + Talk(SAY_KILL); + events.ScheduleEvent(EVENT_KILL_TALK, 6000); + } + } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + } + + void UpdateAI(uint32 diff) + { + events2.Update(diff); + switch (events2.ExecuteEvent()) + { + case EVENT_SPAWN_INVADERS: + me->CastSpell(me, SPELL_SUMMON_INVADER_A, true); + me->CastSpell(me, SPELL_SUMMON_INVADER_B, true); + me->CastSpell(me, SPELL_SUMMON_INVADER_C, true); + events2.ScheduleEvent(EVENT_SPAWN_INVADERS, 30000); + break; + } + + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch(events.ExecuteEvent()) + { + case EVENT_SPELL_INFECTED_WOUND: + me->CastSpell(me->GetVictim(), SPELL_INFECTED_WOUND, false); + events.ScheduleEvent(EVENT_SPELL_INFECTED_WOUND, urand(25000, 35000)); + break; + case EVENT_SPELL_CRUSH: + me->CastSpell(me->GetVictim(), SPELL_CRUSH, false); + events.ScheduleEvent(EVENT_SPELL_CRUSH, urand(10000, 15000)); + break; + case EVENT_SPELL_CONSUME: + Talk(SAY_CONSUME); + me->CastSpell(me, SPELL_CONSUME, false); + events.ScheduleEvent(EVENT_SPELL_CONSUME, 15000); + break; + case EVENT_SPELL_CORPSE_EXPLODE: + Talk(SAY_EXPLODE); + me->CastSpell(me, SPELL_CORPSE_EXPLODE, false); + events.ScheduleEvent(EVENT_SPELL_CORPSE_EXPLODE, urand(15000, 19000)); + break; + } + + DoMeleeAttackIfReady(); + EnterEvadeIfOutOfCombatArea(); + } + + bool CheckEvadeIfOutOfCombatArea() const + { + return me->GetHomePosition().GetExactDist2d(me) > 60.0f; + } + + private: + EventMap events2; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class spell_trollgore_consume : public SpellScriptLoader { - public: - spell_trollgore_consume() : SpellScriptLoader("spell_trollgore_consume") { } +public: + spell_trollgore_consume() : SpellScriptLoader("spell_trollgore_consume") { } - class spell_trollgore_consume_SpellScript : public SpellScript + class spell_trollgore_consume_SpellScript : public SpellScript + { + PrepareSpellScript(spell_trollgore_consume_SpellScript); + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_trollgore_consume_SpellScript); - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - target->CastSpell(GetCaster(), SPELL_CONSUME_AURA, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_trollgore_consume_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_trollgore_consume_SpellScript(); + if (Unit* target = GetHitUnit()) + target->CastSpell(GetCaster(), SPELL_CONSUME_AURA, true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_trollgore_consume_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_trollgore_consume_SpellScript(); + } }; class spell_trollgore_corpse_explode : public SpellScriptLoader { - public: - spell_trollgore_corpse_explode() : SpellScriptLoader("spell_trollgore_corpse_explode") { } +public: + spell_trollgore_corpse_explode() : SpellScriptLoader("spell_trollgore_corpse_explode") { } - class spell_trollgore_corpse_explode_AuraScript : public AuraScript + class spell_trollgore_corpse_explode_AuraScript : public AuraScript + { + PrepareAuraScript(spell_trollgore_corpse_explode_AuraScript); + + void PeriodicTick(AuraEffect const* aurEff) { - PrepareAuraScript(spell_trollgore_corpse_explode_AuraScript); - - void PeriodicTick(AuraEffect const* aurEff) - { - if (aurEff->GetTickNumber() == 2) - if (Unit* caster = GetCaster()) - caster->CastSpell(GetTarget(), SPELL_CORPSE_EXPLODE_DAMAGE, true); - } - - void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Creature* target = GetTarget()->ToCreature()) - target->DespawnOrUnsummon(1); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_trollgore_corpse_explode_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - AfterEffectRemove += AuraEffectRemoveFn(spell_trollgore_corpse_explode_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_trollgore_corpse_explode_AuraScript(); + if (aurEff->GetTickNumber() == 2) + if (Unit* caster = GetCaster()) + caster->CastSpell(GetTarget(), SPELL_CORPSE_EXPLODE_DAMAGE, true); } + + void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Creature* target = GetTarget()->ToCreature()) + target->DespawnOrUnsummon(1); + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_trollgore_corpse_explode_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + AfterEffectRemove += AuraEffectRemoveFn(spell_trollgore_corpse_explode_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_trollgore_corpse_explode_AuraScript(); + } }; class spell_trollgore_invader_taunt : public SpellScriptLoader { - public: - spell_trollgore_invader_taunt() : SpellScriptLoader("spell_trollgore_invader_taunt") { } +public: + spell_trollgore_invader_taunt() : SpellScriptLoader("spell_trollgore_invader_taunt") { } - class spell_trollgore_invader_taunt_SpellScript : public SpellScript + class spell_trollgore_invader_taunt_SpellScript : public SpellScript + { + PrepareSpellScript(spell_trollgore_invader_taunt_SpellScript); + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_trollgore_invader_taunt_SpellScript); - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - target->CastSpell(GetCaster(), uint32(GetEffectValue()), true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_trollgore_invader_taunt_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_trollgore_invader_taunt_SpellScript(); + if (Unit* target = GetHitUnit()) + target->CastSpell(GetCaster(), uint32(GetEffectValue()), true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_trollgore_invader_taunt_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_trollgore_invader_taunt_SpellScript(); + } }; class achievement_consumption_junction : public AchievementCriteriaScript { - public: - achievement_consumption_junction() : AchievementCriteriaScript("achievement_consumption_junction") - { - } +public: + achievement_consumption_junction() : AchievementCriteriaScript("achievement_consumption_junction") + { + } - bool OnCheck(Player* /*player*/, Unit* target) - { - if (!target) - return false; + bool OnCheck(Player* /*player*/, Unit* target) + { + if (!target) + return false; - return target->GetAuraCount(sSpellMgr->GetSpellIdForDifficulty(SPELL_CONSUME_AURA, target)) < 10; - } + return target->GetAuraCount(sSpellMgr->GetSpellIdForDifficulty(SPELL_CONSUME_AURA, target)) < 10; + } }; void AddSC_boss_trollgore() diff --git a/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp b/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp index 163603139..4f0e3de3e 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp @@ -17,134 +17,134 @@ DoorData const doorData[] = class instance_drak_tharon_keep : public InstanceMapScript { - public: - instance_drak_tharon_keep() : InstanceMapScript("instance_drak_tharon_keep", 600) { } +public: + instance_drak_tharon_keep() : InstanceMapScript("instance_drak_tharon_keep", 600) { } - struct instance_drak_tharon_keep_InstanceScript : public InstanceScript + struct instance_drak_tharon_keep_InstanceScript : public InstanceScript + { + instance_drak_tharon_keep_InstanceScript(Map* map) : InstanceScript(map) { - instance_drak_tharon_keep_InstanceScript(Map* map) : InstanceScript(map) - { - SetBossNumber(MAX_ENCOUNTERS); - LoadDoorData(doorData); - } - - void OnGameObjectCreate(GameObject* go) - { - switch (go->GetEntry()) - { - case GO_NOVOS_CRYSTAL_1: - case GO_NOVOS_CRYSTAL_2: - case GO_NOVOS_CRYSTAL_3: - case GO_NOVOS_CRYSTAL_4: - AddDoor(go, true); - break; - } - } - - void OnGameObjectRemove(GameObject* go) - { - switch (go->GetEntry()) - { - case GO_NOVOS_CRYSTAL_1: - case GO_NOVOS_CRYSTAL_2: - case GO_NOVOS_CRYSTAL_3: - case GO_NOVOS_CRYSTAL_4: - AddDoor(go, false); - break; - } - } - - std::string GetSaveData() - { - std::ostringstream saveStream; - saveStream << "D K " << GetBossSaveData(); - return saveStream.str(); - } - - void Load(const char* in) - { - if( !in ) - return; - - char dataHead1, dataHead2; - std::istringstream loadStream(in); - loadStream >> dataHead1 >> dataHead2; - if (dataHead1 == 'D' && dataHead2 == 'K') - { - for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) - { - uint32 tmpState; - loadStream >> tmpState; - if (tmpState == IN_PROGRESS || tmpState > SPECIAL) - tmpState = NOT_STARTED; - SetBossState(i, EncounterState(tmpState)); - } - } - } - }; - - InstanceScript* GetInstanceScript(InstanceMap *map) const - { - return new instance_drak_tharon_keep_InstanceScript(map); + SetBossNumber(MAX_ENCOUNTERS); + LoadDoorData(doorData); } + + void OnGameObjectCreate(GameObject* go) + { + switch (go->GetEntry()) + { + case GO_NOVOS_CRYSTAL_1: + case GO_NOVOS_CRYSTAL_2: + case GO_NOVOS_CRYSTAL_3: + case GO_NOVOS_CRYSTAL_4: + AddDoor(go, true); + break; + } + } + + void OnGameObjectRemove(GameObject* go) + { + switch (go->GetEntry()) + { + case GO_NOVOS_CRYSTAL_1: + case GO_NOVOS_CRYSTAL_2: + case GO_NOVOS_CRYSTAL_3: + case GO_NOVOS_CRYSTAL_4: + AddDoor(go, false); + break; + } + } + + std::string GetSaveData() + { + std::ostringstream saveStream; + saveStream << "D K " << GetBossSaveData(); + return saveStream.str(); + } + + void Load(const char* in) + { + if( !in ) + return; + + char dataHead1, dataHead2; + std::istringstream loadStream(in); + loadStream >> dataHead1 >> dataHead2; + if (dataHead1 == 'D' && dataHead2 == 'K') + { + for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) + { + uint32 tmpState; + loadStream >> tmpState; + if (tmpState == IN_PROGRESS || tmpState > SPECIAL) + tmpState = NOT_STARTED; + SetBossState(i, EncounterState(tmpState)); + } + } + } + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_drak_tharon_keep_InstanceScript(map); + } }; class spell_dtk_raise_dead : public SpellScriptLoader { - public: - spell_dtk_raise_dead() : SpellScriptLoader("spell_dtk_raise_dead") { } +public: + spell_dtk_raise_dead() : SpellScriptLoader("spell_dtk_raise_dead") { } - class spell_dtk_raise_dead_AuraScript : public AuraScript + class spell_dtk_raise_dead_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dtk_raise_dead_AuraScript) + + bool Load() { - PrepareAuraScript(spell_dtk_raise_dead_AuraScript) - - bool Load() - { - return GetUnitOwner()->GetTypeId() == TYPEID_UNIT; - } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetUnitOwner()->ToCreature()->DespawnOrUnsummon(1); - GetUnitOwner()->SummonCreature(NPC_RISEN_DRAKKARI_WARRIOR, *GetUnitOwner()); - } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_dtk_raise_dead_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dtk_raise_dead_AuraScript(); + return GetUnitOwner()->GetTypeId() == TYPEID_UNIT; } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetUnitOwner()->ToCreature()->DespawnOrUnsummon(1); + GetUnitOwner()->SummonCreature(NPC_RISEN_DRAKKARI_WARRIOR, *GetUnitOwner()); + } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_dtk_raise_dead_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dtk_raise_dead_AuraScript(); + } }; class spell_dtk_summon_random_drakkari : public SpellScriptLoader { - public: - spell_dtk_summon_random_drakkari() : SpellScriptLoader("spell_dtk_summon_random_drakkari") { } +public: + spell_dtk_summon_random_drakkari() : SpellScriptLoader("spell_dtk_summon_random_drakkari") { } - class spell_dtk_summon_random_drakkari_SpellScript : public SpellScript + class spell_dtk_summon_random_drakkari_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dtk_summon_random_drakkari_SpellScript); + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_dtk_summon_random_drakkari_SpellScript); - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) - { - GetCaster()->CastSpell(GetCaster(), RAND(SPELL_SUMMON_DRAKKARI_SHAMAN, SPELL_SUMMON_DRAKKARI_GUARDIAN), true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_dtk_summon_random_drakkari_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dtk_summon_random_drakkari_SpellScript(); + GetCaster()->CastSpell(GetCaster(), RAND(SPELL_SUMMON_DRAKKARI_SHAMAN, SPELL_SUMMON_DRAKKARI_GUARDIAN), true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_dtk_summon_random_drakkari_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dtk_summon_random_drakkari_SpellScript(); + } }; void AddSC_instance_drak_tharon_keep() diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp index 3a0bcac14..e4ab2197d 100644 --- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp @@ -192,7 +192,7 @@ public: } }; - CreatureAI *GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const { return new boss_bronjahmAI(creature); } @@ -241,11 +241,11 @@ public: else timer -= diff; } - + } }; - CreatureAI *GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const { return new npc_fos_corrupted_soul_fragmentAI(creature); } @@ -270,7 +270,7 @@ public: { const int32 maxDamage = caster->GetMap()->GetSpawnMode() == 1 ? 15000 : 10000; int32 newDamage = GetHitDamage(); - newDamage += GetHitUnit()->GetMaxPower(POWER_MANA)/2; + newDamage += GetHitUnit()->GetMaxPower(POWER_MANA) / 2; newDamage = std::min(maxDamage, newDamage); SetHitDamage(newDamage); @@ -302,7 +302,7 @@ public: void HandlePeriodicTick(AuraEffect const* aurEff) { PreventDefaultAction(); - GetTarget()->CastSpell(GetTarget(), 68904+(aurEff->GetTickNumber()%4), true); + GetTarget()->CastSpell(GetTarget(), 68904 + (aurEff->GetTickNumber() % 4), true); } void Register() @@ -331,12 +331,20 @@ public: { PreventDefaultAction(); uint32 spellId = 0; - switch (aurEff->GetTickNumber()%4) + switch (aurEff->GetTickNumber() % 4) { - case 0: spellId = 68886; break; - case 1: spellId = 68896; break; - case 2: spellId = 68897; break; - case 3: spellId = 68898; break; + case 0: + spellId = 68886; + break; + case 1: + spellId = 68896; + break; + case 2: + spellId = 68897; + break; + case 3: + spellId = 68898; + break; } GetTarget()->CastSpell(GetTarget(), spellId, true); } diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp index d95735031..e7bb9e881 100644 --- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp @@ -37,7 +37,7 @@ enum eSpells SPELL_WAILING_SOULS = 68899, // target 1.0,1.0, change model, triggers 68871, cast time 3 secs SPELL_WAILING_SOULS_SCRIPT_EFFECT = 68871, // target 1.0, script effect, instant SPELL_WAILING_SOULS_PERIODIC_DUMMY = 68875, // target 1.0, aura 226, instant - SPELL_WAILING_SOULS_PERIODIC_DUMMY_2= 68876, // target 1.0, aura 226, instant + SPELL_WAILING_SOULS_PERIODIC_DUMMY_2 = 68876, // target 1.0, aura 226, instant SPELL_WAILING_SOULS_TARGETING = 68912, // target 22.15, aura dummy, 50000yd, cast instant, duration 4 secs SPELL_WAILING_SOULS_DMG_N = 68873, // 100yd, 104.0 SPELL_WAILING_SOULS_DMG_H = 70324, // 100yd, 104.0 @@ -110,8 +110,8 @@ public: events.Reset(); events.RescheduleEvent(EVENT_SPELL_PHANTOM_BLAST, 5000); events.RescheduleEvent(EVENT_SPELL_MIRRORED_SOUL, 9000); - events.RescheduleEvent(EVENT_SPELL_WELL_OF_SOULS, urand(6000,8000)); - events.RescheduleEvent(EVENT_SPELL_UNLEASHED_SOULS, urand(18000,20000)); + events.RescheduleEvent(EVENT_SPELL_WELL_OF_SOULS, urand(6000, 8000)); + events.RescheduleEvent(EVENT_SPELL_UNLEASHED_SOULS, urand(18000, 20000)); events.RescheduleEvent(EVENT_SPELL_WAILING_SOULS, 65000); if (pInstance) @@ -123,7 +123,7 @@ public: { Player* player = itr->GetSource(); if ((player->GetTeamId() == TEAM_ALLIANCE && player->GetQuestStatus(QUEST_TEMPERING_THE_BLADE_A) == QUEST_STATUS_INCOMPLETE) || - (player->GetTeamId() == TEAM_HORDE && player->GetQuestStatus(QUEST_TEMPERING_THE_BLADE_H) == QUEST_STATUS_INCOMPLETE)) + (player->GetTeamId() == TEAM_HORDE && player->GetQuestStatus(QUEST_TEMPERING_THE_BLADE_H) == QUEST_STATUS_INCOMPLETE)) { if (!me->FindNearestCreature(NPC_CRUCIBLE_OF_SOULS, 100.0f)) me->SummonCreature(NPC_CRUCIBLE_OF_SOULS, 5672.29f, 2520.69f, 713.44f, 0.96f); @@ -131,7 +131,7 @@ public: } } - void SpellHitTarget(Unit* target, const SpellInfo *spell) + void SpellHitTarget(Unit* target, const SpellInfo* spell) { if (spell->Id == SPELL_PHANTOM_BLAST_H) bAchiev = false; @@ -205,19 +205,19 @@ public: me->setAttackTimer(BASE_ATTACK, 2500); Talk(EMOTE_MIRRORED_SOUL); } - events.RepeatEvent(urand(20000,30000)); + events.RepeatEvent(urand(20000, 30000)); break; case EVENT_SPELL_WELL_OF_SOULS: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true)) me->CastSpell(target, SPELL_WELL_OF_SOULS, false); - events.RepeatEvent(urand(25000,30000)); + events.RepeatEvent(urand(25000, 30000)); events.DelayEventsToMax(4000, 0); break; case EVENT_SPELL_UNLEASHED_SOULS: me->CastSpell(me, SPELL_UNLEASHED_SOULS, false); Talk(SAY_FACE_UNLEASH_SOUL); Talk(EMOTE_UNLEASH_SOUL); - events.RepeatEvent(urand(30000,40000)); + events.RepeatEvent(urand(30000, 40000)); events.DelayEventsToMax(5000, 0); me->setAttackTimer(BASE_ATTACK, 5500); break; @@ -288,7 +288,7 @@ public: } }; - CreatureAI *GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const { return new boss_devourer_of_soulsAI(creature); } @@ -308,7 +308,7 @@ public: bool Load() { - dir = urand(0,1) ? 1 : -1; + dir = urand(0, 1) ? 1 : -1; return true; } @@ -320,12 +320,12 @@ public: if (aurEff->GetTickNumber() < 30) { // spinning, casting, etc. - float diff = (2*M_PI)/(4*30); - float new_o = t->GetOrientation() + diff*dir; - if (new_o >= 2*M_PI) - new_o -= 2*M_PI; + float diff = (2 * M_PI) / (4 * 30); + float new_o = t->GetOrientation() + diff * dir; + if (new_o >= 2 * M_PI) + new_o -= 2 * M_PI; else if (new_o < 0) - new_o += 2*M_PI; + new_o += 2 * M_PI; t->UpdateOrientation(new_o); t->SetFacingTo(new_o); t->CastSpell(t, SPELL_WAILING_SOULS_DMG_N, true); diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp index eb7cb9e88..3204bd355 100644 --- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp @@ -237,7 +237,7 @@ public: } }; - CreatureAI *GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const { return new npc_fos_leader_secondAI(creature); } @@ -263,10 +263,10 @@ public: return true; } - void HandleAfterEffectAbsorb(AuraEffect* /*aurEff*/, DamageInfo & /*dmgInfo*/, uint32 & absorbAmount) + void HandleAfterEffectAbsorb(AuraEffect* /*aurEff*/, DamageInfo& /*dmgInfo*/, uint32& absorbAmount) { amount += absorbAmount; - if (!fired && amount >= GetSpellInfo()->Effects[EFFECT_0].BasePoints+1) + if (!fired && amount >= GetSpellInfo()->Effects[EFFECT_0].BasePoints + 1) if (Unit* caster = GetCaster()) { fired = true; diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.h b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.h index 0dd0cc863..2125ad740 100644 --- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.h +++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.h @@ -48,27 +48,27 @@ struct outroPosition const outroPosition outroPositions[] = { - { { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 5590.47f, 2427.79f, 705.935f, 0.802851f }, PATH_BEGIN_VALUE+14 }, - { { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 5593.59f, 2428.34f, 705.935f, 0.977384f }, PATH_BEGIN_VALUE+15 }, - { { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 5600.81f, 2429.31f, 705.935f, 0.890118f }, PATH_BEGIN_VALUE+5 }, - { { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 5600.81f, 2421.12f, 705.935f, 0.890118f }, PATH_BEGIN_VALUE+18 }, - { { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 5601.43f, 2426.53f, 705.935f, 0.890118f }, PATH_BEGIN_VALUE+6 }, - { { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 5601.55f, 2418.36f, 705.935f, 1.15192f }, PATH_BEGIN_VALUE+17 }, - { { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 5598, 2429.14f, 705.935f, 1.0472f }, PATH_BEGIN_VALUE+4 }, - { { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 5594.04f, 2424.87f, 705.935f, 1.15192f }, PATH_BEGIN_VALUE+16 }, - { { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 5597.89f, 2421.54f, 705.935f, 0.610865f }, PATH_BEGIN_VALUE+19 }, - { { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_2_HORDE }, { 5598.57f, 2434.62f, 705.935f, 1.13446f }, PATH_BEGIN_VALUE+2 }, - { { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_2_HORDE }, { 5585.46f, 2417.99f, 705.935f, 1.06465f }, PATH_BEGIN_VALUE+12 }, - { { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_2_HORDE }, { 5605.81f, 2428.42f, 705.935f, 0.820305f }, PATH_BEGIN_VALUE+3 }, - { { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_2_HORDE }, { 5591.61f, 2412.66f, 705.935f, 0.925025f }, PATH_BEGIN_VALUE+11 }, - { { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_2_HORDE }, { 5593.9f, 2410.64f, 705.935f, 0.872665f }, PATH_BEGIN_VALUE+10 }, - { { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_2_HORDE }, { 5586.76f, 2416.73f, 705.935f, 0.942478f }, PATH_BEGIN_VALUE+13 }, - { { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_3_HORDE }, { 5592.23f, 2419.14f, 705.935f, 0.855211f }, PATH_BEGIN_VALUE+8 }, - { { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_3_HORDE }, { 5594.61f, 2416.87f, 705.935f, 0.907571f }, PATH_BEGIN_VALUE+7 }, - { { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_3_HORDE }, { 5589.77f, 2421.03f, 705.935f, 0.855211f }, PATH_BEGIN_VALUE+9 }, + { { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 5590.47f, 2427.79f, 705.935f, 0.802851f }, PATH_BEGIN_VALUE + 14 }, + { { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 5593.59f, 2428.34f, 705.935f, 0.977384f }, PATH_BEGIN_VALUE + 15 }, + { { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 5600.81f, 2429.31f, 705.935f, 0.890118f }, PATH_BEGIN_VALUE + 5 }, + { { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 5600.81f, 2421.12f, 705.935f, 0.890118f }, PATH_BEGIN_VALUE + 18 }, + { { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 5601.43f, 2426.53f, 705.935f, 0.890118f }, PATH_BEGIN_VALUE + 6 }, + { { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 5601.55f, 2418.36f, 705.935f, 1.15192f }, PATH_BEGIN_VALUE + 17 }, + { { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 5598, 2429.14f, 705.935f, 1.0472f }, PATH_BEGIN_VALUE + 4 }, + { { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 5594.04f, 2424.87f, 705.935f, 1.15192f }, PATH_BEGIN_VALUE + 16 }, + { { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 5597.89f, 2421.54f, 705.935f, 0.610865f }, PATH_BEGIN_VALUE + 19 }, + { { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_2_HORDE }, { 5598.57f, 2434.62f, 705.935f, 1.13446f }, PATH_BEGIN_VALUE + 2 }, + { { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_2_HORDE }, { 5585.46f, 2417.99f, 705.935f, 1.06465f }, PATH_BEGIN_VALUE + 12 }, + { { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_2_HORDE }, { 5605.81f, 2428.42f, 705.935f, 0.820305f }, PATH_BEGIN_VALUE + 3 }, + { { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_2_HORDE }, { 5591.61f, 2412.66f, 705.935f, 0.925025f }, PATH_BEGIN_VALUE + 11 }, + { { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_2_HORDE }, { 5593.9f, 2410.64f, 705.935f, 0.872665f }, PATH_BEGIN_VALUE + 10 }, + { { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_2_HORDE }, { 5586.76f, 2416.73f, 705.935f, 0.942478f }, PATH_BEGIN_VALUE + 13 }, + { { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_3_HORDE }, { 5592.23f, 2419.14f, 705.935f, 0.855211f }, PATH_BEGIN_VALUE + 8 }, + { { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_3_HORDE }, { 5594.61f, 2416.87f, 705.935f, 0.907571f }, PATH_BEGIN_VALUE + 7 }, + { { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_3_HORDE }, { 5589.77f, 2421.03f, 705.935f, 0.855211f }, PATH_BEGIN_VALUE + 9 }, - { { NPC_KORELN, NPC_LORALEN }, { 5602.58f, 2435.95f, 705.935f, 0.959931f }, PATH_BEGIN_VALUE+0 }, - { { NPC_ELANDRA, NPC_KALIRA }, { 5606.13f, 2433.16f, 705.935f, 0.785398f }, PATH_BEGIN_VALUE+1 }, + { { NPC_KORELN, NPC_LORALEN }, { 5602.58f, 2435.95f, 705.935f, 0.959931f }, PATH_BEGIN_VALUE + 0 }, + { { NPC_ELANDRA, NPC_KALIRA }, { 5606.13f, 2433.16f, 705.935f, 0.785398f }, PATH_BEGIN_VALUE + 1 }, { { 0, 0 }, { 0.0f, 0.0f, 0.0f, 0.0f }, 0 } }; diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/instance_forge_of_souls.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/instance_forge_of_souls.cpp index d8b52b191..7a46bbe87 100644 --- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/instance_forge_of_souls.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/instance_forge_of_souls.cpp @@ -12,7 +12,7 @@ class instance_forge_of_souls : public InstanceMapScript public: instance_forge_of_souls() : InstanceMapScript("instance_forge_of_souls", 632) { } - InstanceScript* GetInstanceScript(InstanceMap *map) const + InstanceScript* GetInstanceScript(InstanceMap* map) const { return new instance_forge_of_souls_InstanceScript(map); } @@ -67,7 +67,7 @@ public: { if (teamIdInInstance == TEAM_NEUTRAL) { - Map::PlayerList const &players = instance->GetPlayers(); + Map::PlayerList const& players = instance->GetPlayers(); if (!players.isEmpty()) if (Player* player = players.begin()->GetSource()) teamIdInInstance = player->GetTeamId(); @@ -124,7 +124,7 @@ public: if (Creature* boss = instance->GetCreature(NPC_DevourerGUID)) { float angle = boss->GetAngle(leader); - leader->GetMotionMaster()->MovePoint(1, boss->GetPositionX()+10.0f*cos(angle), boss->GetPositionY()+10.0f*sin(angle), boss->GetPositionZ()); + leader->GetMotionMaster()->MovePoint(1, boss->GetPositionX() + 10.0f * cos(angle), boss->GetPositionY() + 10.0f * sin(angle), boss->GetPositionZ()); } for (int8 i = 0; outroPositions[i].entry[teamIdInInstance] != 0; ++i) @@ -154,7 +154,8 @@ public: { switch (type) { - case DATA_BRONJAHM: return NPC_BronjahmGUID; + case DATA_BRONJAHM: + return NPC_BronjahmGUID; } return 0; diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp index 4a4568c86..088c6548a 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp @@ -129,7 +129,7 @@ public: if ((uiHopelessnessCount == 0 && HealthBelowPct(67)) || (uiHopelessnessCount == 1 && HealthBelowPct(34)) || (uiHopelessnessCount == 2 && HealthBelowPct(11))) { if (uiHopelessnessCount) - me->RemoveOwnedAura(hopelessnessId[uiHopelessnessCount-1][DUNGEON_MODE(0, 1)]); + me->RemoveOwnedAura(hopelessnessId[uiHopelessnessCount - 1][DUNGEON_MODE(0, 1)]); me->CastSpell((Unit*)NULL, hopelessnessId[uiHopelessnessCount][DUNGEON_MODE(0, 1)], true); ++uiHopelessnessCount; } diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp index 8690a0b7f..4744ded40 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp @@ -179,7 +179,7 @@ public: if (p->IsAlive()) ++count; ticks = (a->GetDuration() / int32(a->GetSpellInfo()->Effects[0].Amplitude)) + 1; - int32 dmg = (ticks*dmgPerTick)/count; + int32 dmg = (ticks * dmgPerTick) / count; caster->CastCustomSpell(GetTarget(), 72373, NULL, &dmg, NULL, true); } } 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 6926dc236..306a0f8e1 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp @@ -94,16 +94,16 @@ public: { QuestStatus status = player->GetQuestStatus(creature->GetEntry() == NPC_SYLVANAS_PART1 ? QUEST_DELIVRANCE_FROM_THE_PIT_H2 : QUEST_DELIVRANCE_FROM_THE_PIT_A2); if (status == QUEST_STATUS_COMPLETE || status == QUEST_STATUS_REWARDED) - AddGossipItemFor(player, 0, "Can you remove the sword?", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + AddGossipItemFor(player, 0, "Can you remove the sword?", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); // once last quest is completed, she offers this shortcut of the starting event status = player->GetQuestStatus(creature->GetEntry() == NPC_SYLVANAS_PART1 ? QUEST_WRATH_OF_THE_LICH_KING_H2 : QUEST_WRATH_OF_THE_LICH_KING_A2); if (status == QUEST_STATUS_COMPLETE || status == QUEST_STATUS_REWARDED) { if (creature->GetEntry() == NPC_SYLVANAS_PART1) - AddGossipItemFor(player, 0, "Dark Lady, I think I hear Arthas coming. Whatever you're going to do, do it quickly.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); + AddGossipItemFor(player, 0, "Dark Lady, I think I hear Arthas coming. Whatever you're going to do, do it quickly.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); else - AddGossipItemFor(player, 0, "My Lady, I think I hear Arthas coming. Whatever you're going to do, do it quickly.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); + AddGossipItemFor(player, 0, "My Lady, I think I hear Arthas coming. Whatever you're going to do, do it quickly.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); } } @@ -238,7 +238,7 @@ public: events.ScheduleEvent(EVENT_INTRO_LK_1, 0); break; - // A2 Intro Events + // A2 Intro Events case EVENT_INTRO_A2_1: Talk(SAY_JAINA_INTRO_3); events.ScheduleEvent(EVENT_INTRO_A2_2, 5000); @@ -335,7 +335,7 @@ public: events.ScheduleEvent(EVENT_INTRO_LK_1, 2000); break; - // H2 Intro Events + // H2 Intro Events case EVENT_INTRO_H2_2: Talk(SAY_SYLVANAS_INTRO_2); events.ScheduleEvent(EVENT_INTRO_H2_3, 6000); @@ -411,7 +411,7 @@ public: events.ScheduleEvent(EVENT_INTRO_LK_1, 2000); break; - // Remaining Intro Events common for both faction + // Remaining Intro Events common for both faction case EVENT_INTRO_LK_1: if (Creature* pLichKing = pInstance->instance->GetCreature(pInstance->GetData64(NPC_LICH_KING_EVENT))) { @@ -819,7 +819,7 @@ public: case EVENT_HALLUCINATION: //me->CastSpell(me, SPELL_HALLUCINATION, false); me->SummonCreature(NPC_PHANTOM_HALLUCINATION, *me, TEMPSUMMON_TIMED_DESPAWN, 30000); - me->CastSpell(me, SPELL_HALLUCINATION+1, true); + me->CastSpell(me, SPELL_HALLUCINATION + 1, true); break; } @@ -1264,7 +1264,7 @@ public: { case EVENT_BALEFUL_STRIKE: me->CastSpell(me->GetVictim(), SPELL_BALEFUL_STRIKE, false); - events.ScheduleEvent(EVENT_BALEFUL_STRIKE, urand(4000,7000)); + events.ScheduleEvent(EVENT_BALEFUL_STRIKE, urand(4000, 7000)); break; } @@ -1292,23 +1292,23 @@ public: class at_hor_shadow_throne : public AreaTriggerScript { - public: - at_hor_shadow_throne() : AreaTriggerScript("at_hor_shadow_throne") { } - - bool OnTrigger(Player* player, const AreaTrigger* /*at*/) - { - if (player->IsGameMaster()) - return false; - - InstanceScript* inst = player->GetInstanceScript(); - if (!inst) - return false; - - if (inst->GetData(DATA_FROSTSWORN_GENERAL) && !inst->GetData(DATA_LK_INTRO)) - inst->SetData(DATA_LK_INTRO, DONE); +public: + at_hor_shadow_throne() : AreaTriggerScript("at_hor_shadow_throne") { } + bool OnTrigger(Player* player, const AreaTrigger* /*at*/) + { + if (player->IsGameMaster()) return false; - } + + InstanceScript* inst = player->GetInstanceScript(); + if (!inst) + return false; + + if (inst->GetData(DATA_FROSTSWORN_GENERAL) && !inst->GetData(DATA_LK_INTRO)) + inst->SetData(DATA_LK_INTRO, DONE); + + return false; + } }; enum eFightEvents @@ -1424,15 +1424,15 @@ public: if (events.GetNextEventTime(EVENT_DECREASE_REQ_COUNT_BY_100)) events.RescheduleEvent(EVENT_DECREASE_REQ_COUNT_BY_100, 10000); summons.Summon(s); - s->SetHomePosition(PathWaypoints[WP_STOP[currentWall+1]]); - s->GetMotionMaster()->MovePoint(0, PathWaypoints[WP_STOP[currentWall+1]]); + s->SetHomePosition(PathWaypoints[WP_STOP[currentWall + 1]]); + s->GetMotionMaster()->MovePoint(0, PathWaypoints[WP_STOP[currentWall + 1]]); s->SetInCombatWithZone(); if (Unit* target = s->SelectNearestPlayer(350.0f)) { s->AddThreat(target, 1000.0f); s->AI()->AttackStart(target); } - s->SetHomePosition(PathWaypoints[WP_STOP[currentWall+1]]); + s->SetHomePosition(PathWaypoints[WP_STOP[currentWall + 1]]); } void SummonedCreatureDespawn(Creature* s) @@ -1449,7 +1449,7 @@ public: void UpdateAI(uint32 diff) { if (me->HealthBelowPct(70)) - me->SetHealth(me->GetMaxHealth()*3/4); + me->SetHealth(me->GetMaxHealth() * 3 / 4); events.Update(diff); @@ -1509,10 +1509,10 @@ public: break; case EVENT_LK_START_FOLLOWING: { - me->SetSpeed(MOVE_RUN, 9.0f/7.0f); + me->SetSpeed(MOVE_RUN, 9.0f / 7.0f); Movement::PointsArray path; path.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ())); - for (uint8 i=0; i<=2; ++i) + for (uint8 i = 0; i <= 2; ++i) path.push_back(G3D::Vector3(PathWaypoints[i].GetPositionX(), PathWaypoints[i].GetPositionY(), PathWaypoints[i].GetPositionZ())); me->GetMotionMaster()->MoveSplinePath(&path); } @@ -1524,7 +1524,7 @@ public: me->CastSpell(me, SPELL_REMORSELESS_WINTER, true); Movement::PointsArray path; path.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ())); - for (uint8 i=3; iGetMotionMaster()->MoveSplinePath(&path); me->GetMotionMaster()->propagateSpeedChange(); @@ -1570,7 +1570,7 @@ public: } break; case EVENT_DECREASE_REQ_COUNT_BY_100: - reqKillCount = (reqKillCount <= 100 ? 0 : reqKillCount-100); + reqKillCount = (reqKillCount <= 100 ? 0 : reqKillCount - 100); DoAction(ACTION_CHECK_TRASH_DIED); break; case EVENT_LK_SUMMON_GHOULS: @@ -1583,8 +1583,8 @@ public: me->CastSpell((Unit*)NULL, SPELL_SUMMON_LUMBERING_ABOMINATION, false); break; case EVENT_LK_SUMMON_NEXT_ICE_WALL: - Talk(SAY_LK_IW_1+currentWall); - if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(NPC_ICE_WALL_TARGET+currentWall))) + Talk(SAY_LK_IW_1 + currentWall); + if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(NPC_ICE_WALL_TARGET + currentWall))) me->CastSpell(c, SPELL_SUMMON_ICE_WALL, false); break; } @@ -1660,7 +1660,7 @@ public: void DamageTaken(Unit*, uint32& dmg, DamageEffectType, SpellSchoolMask) override { if (dmg >= me->GetHealth()) - dmg = me->GetHealth()-1; + dmg = me->GetHealth() - 1; } void MoveToNextStopPoint() @@ -1669,7 +1669,7 @@ public: ++currentStopPoint; Movement::PointsArray path; path.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ())); - for (uint8 i=WP_STOP[currentStopPoint-1]+(currentStopPoint == 1 ? 0 : 1); i<=WP_STOP[currentStopPoint]; ++i) + for (uint8 i = WP_STOP[currentStopPoint - 1] + (currentStopPoint == 1 ? 0 : 1); i <= WP_STOP[currentStopPoint]; ++i) path.push_back(G3D::Vector3(PathWaypoints[i].GetPositionX(), PathWaypoints[i].GetPositionY(), PathWaypoints[i].GetPositionZ())); me->GetMotionMaster()->MoveSplinePath(&path); } @@ -1749,11 +1749,21 @@ public: int32 textId = 0; switch (currentStopPoint) { - case 1: textId = SAY_SYLVANAS_IW_1; break; - case 2: textId = SAY_SYLVANAS_IW_2; break; - case 3: textId = SAY_SYLVANAS_IW_3; break; - case 4: textId = SAY_SYLVANAS_IW_4; break; - case 5: textId = SAY_SYLVANAS_END; break; + case 1: + textId = SAY_SYLVANAS_IW_1; + break; + case 2: + textId = SAY_SYLVANAS_IW_2; + break; + case 3: + textId = SAY_SYLVANAS_IW_3; + break; + case 4: + textId = SAY_SYLVANAS_IW_4; + break; + case 5: + textId = SAY_SYLVANAS_END; + break; } if (me->GetEntry() == NPC_JAINA_PART2) textId += 10; @@ -1762,7 +1772,7 @@ public: me->CastSpell((Unit*)NULL, (me->GetEntry() == NPC_JAINA_PART2 ? SPELL_DESTROY_WALL_JAINA : SPELL_DESTROY_WALL_SYLVANAS), false); else { - me->SetFacingTo(PathWaypoints[PATH_WP_COUNT-1].GetOrientation()); + me->SetFacingTo(PathWaypoints[PATH_WP_COUNT - 1].GetOrientation()); me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_READY1H); } } @@ -1968,11 +1978,11 @@ public: { PrepareAuraScript(spell_hor_gunship_cannon_fireAuraScript) - void HandleEffectPeriodic(AuraEffect const * /*aurEff*/) + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) { PreventDefaultAction(); if (Unit* caster = GetCaster()) - if (Creature* c = caster->SummonCreature(WORLD_TRIGGER, CannonFirePos[caster->GetEntry() == NPC_JAINA_PART2 ? 0 : 1][urand(0,2)], TEMPSUMMON_TIMED_DESPAWN, 1)) + if (Creature* c = caster->SummonCreature(WORLD_TRIGGER, CannonFirePos[caster->GetEntry() == NPC_JAINA_PART2 ? 0 : 1][urand(0, 2)], TEMPSUMMON_TIMED_DESPAWN, 1)) c->CastSpell((Unit*)NULL, 70021, true); } @@ -1982,7 +1992,7 @@ public: } }; - AuraScript *GetAuraScript() const + AuraScript* GetAuraScript() const { return new spell_hor_gunship_cannon_fireAuraScript(); } @@ -1992,37 +2002,37 @@ public: class at_hor_battered_hilt_start : public AreaTriggerScript { - public: - at_hor_battered_hilt_start() : AreaTriggerScript("at_hor_battered_hilt_start") { } +public: + at_hor_battered_hilt_start() : AreaTriggerScript("at_hor_battered_hilt_start") { } - bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) - { - if (player->HasAura(70013)) - if (InstanceScript* instance = player->GetInstanceScript()) - instance->SetData(DATA_BATTERED_HILT, 2); - return true; - } + bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) + { + if (player->HasAura(70013)) + if (InstanceScript* instance = player->GetInstanceScript()) + instance->SetData(DATA_BATTERED_HILT, 2); + return true; + } }; class at_hor_battered_hilt_throw : public AreaTriggerScript { - public: - at_hor_battered_hilt_throw() : AreaTriggerScript("at_hor_battered_hilt_throw") { } +public: + at_hor_battered_hilt_throw() : AreaTriggerScript("at_hor_battered_hilt_throw") { } - bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) - { - if (player->HasAura(70013)) - if (InstanceScript* instance = player->GetInstanceScript()) - { - uint32 bhd = instance->GetData(DATA_BATTERED_HILT); - if (bhd != BHSF_STARTED) - return true; - player->CastSpell(player, 70698, true); - player->DestroyItemCount(49766, 1, true); - instance->SetData(DATA_BATTERED_HILT, 3); - } - return true; - } + bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) + { + if (player->HasAura(70013)) + if (InstanceScript* instance = player->GetInstanceScript()) + { + uint32 bhd = instance->GetData(DATA_BATTERED_HILT); + if (bhd != BHSF_STARTED) + return true; + player->CastSpell(player, 70698, true); + player->DestroyItemCount(49766, 1, true); + instance->SetData(DATA_BATTERED_HILT, 3); + } + return true; + } }; void AddSC_halls_of_reflection() 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 1a0a91f8d..0263ab2ea 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h @@ -319,7 +319,7 @@ const Position CannonFirePos[2][3] = } }; -const Position StairsPos[2][3] = +const Position StairsPos[2][3] = { { {5226.36f, 1640.87f, 785.737f, 5.56137f}, diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp index 8907a8516..8cf5f52e3 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp @@ -8,97 +8,97 @@ class UtherBatteredHiltEvent : public BasicEvent { - public: - UtherBatteredHiltEvent(Creature& owner, uint8 eventId) : _owner(owner), _eventId(eventId) { } +public: + UtherBatteredHiltEvent(Creature& owner, uint8 eventId) : _owner(owner), _eventId(eventId) { } - bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/) + bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/) + { + switch (_eventId) { - switch (_eventId) - { - case 1: - _owner.UpdatePosition(5300.53f, 1987.80f, 707.70f, 3.89f, true); + case 1: + _owner.UpdatePosition(5300.53f, 1987.80f, 707.70f, 3.89f, true); + _owner.StopMovingOnCurrentPos(); + _owner.GetMotionMaster()->Clear(); + _owner.SetVisible(true); + _owner.NearTeleportTo(5300.53f, 1987.80f, 707.70f, 3.89f); + _owner.m_Events.AddEvent(new UtherBatteredHiltEvent(_owner, 2), _owner.m_Events.CalculateTime(1000)); + break; + case 2: + _owner.AI()->Talk(SAY_BATTERED_HILT_HALT); + break; + case 3: + _owner.CastSpell((Unit*)NULL, 69966, true); + _owner.AI()->Talk(SAY_BATTERED_HILT_REALIZE); + if (InstanceScript* instance = _owner.GetInstanceScript()) + instance->SetData(DATA_BATTERED_HILT, 4); + _owner.m_Events.AddEvent(new UtherBatteredHiltEvent(_owner, 4), _owner.m_Events.CalculateTime(3500)); + break; + case 4: + _owner.SetWalk(false); + _owner.GetMotionMaster()->MovePoint(0, 5337.53f, 1981.21f, 709.32f); + _owner.m_Events.AddEvent(new UtherBatteredHiltEvent(_owner, 5), _owner.m_Events.CalculateTime(6000)); + break; + case 5: + _owner.SetFacingTo(2.82f); + _owner.SetStandState(UNIT_STAND_STATE_KNEEL); + break; + case 6: + if (InstanceScript* instance = _owner.GetInstanceScript()) + instance->SetData(DATA_BATTERED_HILT, 6); + _owner.m_Events.AddEvent(new UtherBatteredHiltEvent(_owner, 7), _owner.m_Events.CalculateTime(2000)); + break; + case 7: + if (InstanceScript* instance = _owner.GetInstanceScript()) + instance->SetData(DATA_BATTERED_HILT, 7); + _owner.AI()->Talk(SAY_BATTERED_HILT_PREPARE); + _owner.m_Events.AddEvent(new UtherBatteredHiltEvent(_owner, 8), _owner.m_Events.CalculateTime(4000)); + break; + case 8: + _owner.SetReactState(REACT_AGGRESSIVE); + _owner.RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + if (InstanceScript* instance = _owner.GetInstanceScript()) + instance->SetData(DATA_BATTERED_HILT, 8); + break; + case 9: + _owner.AI()->Talk(SAY_BATTERED_HILT_OUTRO1); + _owner.m_Events.AddEvent(new UtherBatteredHiltEvent(_owner, _eventId + 1), _owner.m_Events.CalculateTime(11000)); + break; + case 10: + _owner.AI()->Talk(SAY_BATTERED_HILT_OUTRO2); + _owner.m_Events.AddEvent(new UtherBatteredHiltEvent(_owner, _eventId + 1), _owner.m_Events.CalculateTime(7500)); + break; + case 11: + _owner.AI()->Talk(SAY_BATTERED_HILT_OUTRO3); + _owner.m_Events.AddEvent(new UtherBatteredHiltEvent(_owner, _eventId + 1), _owner.m_Events.CalculateTime(8000)); + break; + case 12: + _owner.AI()->Talk(SAY_BATTERED_HILT_OUTRO4); + _owner.m_Events.AddEvent(new UtherBatteredHiltEvent(_owner, _eventId + 1), _owner.m_Events.CalculateTime(5000)); + break; + case 13: + _owner.CastSpell((Unit*)NULL, 73036, true); + _owner.m_Events.AddEvent(new UtherBatteredHiltEvent(_owner, _eventId + 1), _owner.m_Events.CalculateTime(3000)); + break; + case 14: + { + Position homePos = _owner.GetHomePosition(); + _owner.SetReactState(REACT_PASSIVE); + _owner.SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + _owner.SetVisible(false); + _owner.UpdatePosition(homePos.GetPositionX(), homePos.GetPositionY(), homePos.GetPositionZ(), homePos.GetOrientation(), true); _owner.StopMovingOnCurrentPos(); _owner.GetMotionMaster()->Clear(); - _owner.SetVisible(true); - _owner.NearTeleportTo(5300.53f, 1987.80f, 707.70f, 3.89f); - _owner.m_Events.AddEvent(new UtherBatteredHiltEvent(_owner, 2), _owner.m_Events.CalculateTime(1000)); - break; - case 2: - _owner.AI()->Talk(SAY_BATTERED_HILT_HALT); - break; - case 3: - _owner.CastSpell((Unit*)NULL, 69966, true); - _owner.AI()->Talk(SAY_BATTERED_HILT_REALIZE); if (InstanceScript* instance = _owner.GetInstanceScript()) - instance->SetData(DATA_BATTERED_HILT, 4); - _owner.m_Events.AddEvent(new UtherBatteredHiltEvent(_owner, 4), _owner.m_Events.CalculateTime(3500)); - break; - case 4: - _owner.SetWalk(false); - _owner.GetMotionMaster()->MovePoint(0, 5337.53f, 1981.21f, 709.32f); - _owner.m_Events.AddEvent(new UtherBatteredHiltEvent(_owner, 5), _owner.m_Events.CalculateTime(6000)); - break; - case 5: - _owner.SetFacingTo(2.82f); - _owner.SetStandState(UNIT_STAND_STATE_KNEEL); - break; - case 6: - if (InstanceScript* instance = _owner.GetInstanceScript()) - instance->SetData(DATA_BATTERED_HILT, 6); - _owner.m_Events.AddEvent(new UtherBatteredHiltEvent(_owner, 7), _owner.m_Events.CalculateTime(2000)); - break; - case 7: - if (InstanceScript* instance = _owner.GetInstanceScript()) - instance->SetData(DATA_BATTERED_HILT, 7); - _owner.AI()->Talk(SAY_BATTERED_HILT_PREPARE); - _owner.m_Events.AddEvent(new UtherBatteredHiltEvent(_owner, 8), _owner.m_Events.CalculateTime(4000)); - break; - case 8: - _owner.SetReactState(REACT_AGGRESSIVE); - _owner.RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); - if (InstanceScript* instance = _owner.GetInstanceScript()) - instance->SetData(DATA_BATTERED_HILT, 8); - break; - case 9: - _owner.AI()->Talk(SAY_BATTERED_HILT_OUTRO1); - _owner.m_Events.AddEvent(new UtherBatteredHiltEvent(_owner, _eventId+1), _owner.m_Events.CalculateTime(11000)); - break; - case 10: - _owner.AI()->Talk(SAY_BATTERED_HILT_OUTRO2); - _owner.m_Events.AddEvent(new UtherBatteredHiltEvent(_owner, _eventId+1), _owner.m_Events.CalculateTime(7500)); - break; - case 11: - _owner.AI()->Talk(SAY_BATTERED_HILT_OUTRO3); - _owner.m_Events.AddEvent(new UtherBatteredHiltEvent(_owner, _eventId+1), _owner.m_Events.CalculateTime(8000)); - break; - case 12: - _owner.AI()->Talk(SAY_BATTERED_HILT_OUTRO4); - _owner.m_Events.AddEvent(new UtherBatteredHiltEvent(_owner, _eventId+1), _owner.m_Events.CalculateTime(5000)); - break; - case 13: - _owner.CastSpell((Unit*)NULL, 73036, true); - _owner.m_Events.AddEvent(new UtherBatteredHiltEvent(_owner, _eventId+1), _owner.m_Events.CalculateTime(3000)); - break; - case 14: - { - Position homePos = _owner.GetHomePosition(); - _owner.SetReactState(REACT_PASSIVE); - _owner.SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); - _owner.SetVisible(false); - _owner.UpdatePosition(homePos.GetPositionX(), homePos.GetPositionY(), homePos.GetPositionZ(), homePos.GetOrientation(), true); - _owner.StopMovingOnCurrentPos(); - _owner.GetMotionMaster()->Clear(); - if (InstanceScript* instance = _owner.GetInstanceScript()) - instance->SetData(DATA_BATTERED_HILT, 9); - } - break; - } - return true; + instance->SetData(DATA_BATTERED_HILT, 9); + } + break; } + return true; + } - private: - Creature& _owner; - uint8 _eventId; +private: + Creature& _owner; + uint8 _eventId; }; class instance_halls_of_reflection : public InstanceMapScript @@ -215,7 +215,7 @@ public: { if (TeamIdInInstance == TEAM_NEUTRAL) { - Map::PlayerList const &players = instance->GetPlayers(); + Map::PlayerList const& players = instance->GetPlayers(); if (!players.isEmpty()) for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) if (Player* p = itr->GetSource()) @@ -283,7 +283,7 @@ public: NPC_FrostswornGeneralGUID = creature->GetGUID(); break; case NPC_SPIRITUAL_REFLECTION: - for (uint8 i=0; i<5; ++i) + for (uint8 i = 0; i < 5; ++i) if (!NPC_SpiritualReflectionGUID[i]) { NPC_SpiritualReflectionGUID[i] = creature->GetGUID(); @@ -309,7 +309,7 @@ public: creature->SetVisible(false); NPC_LichKingGUID = creature->GetGUID(); - creature->SetHealth((creature->GetMaxHealth()*3)/4); + creature->SetHealth((creature->GetMaxHealth() * 3) / 4); creature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); break; case NPC_SYLVANAS_PART2: @@ -318,7 +318,7 @@ public: NPC_LeaderGUID = creature->GetGUID(); if (TeamIdInInstance == TEAM_ALLIANCE) creature->UpdateEntry(NPC_JAINA_PART2); - creature->SetHealth(creature->GetMaxHealth()/20); + creature->SetHealth(creature->GetMaxHealth() / 20); if (!(EncounterMask & (1 << DATA_FROSTSWORN_GENERAL))) creature->SetVisible(false); @@ -342,8 +342,8 @@ public: } else { - instance->LoadGrid(PathWaypoints[PATH_WP_COUNT-1].GetPositionX(), PathWaypoints[PATH_WP_COUNT-1].GetPositionY()); - creature->UpdatePosition(PathWaypoints[PATH_WP_COUNT-1], true); + instance->LoadGrid(PathWaypoints[PATH_WP_COUNT - 1].GetPositionX(), PathWaypoints[PATH_WP_COUNT - 1].GetPositionY()); + creature->UpdatePosition(PathWaypoints[PATH_WP_COUNT - 1], true); creature->StopMovingOnCurrentPos(); } creature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); @@ -469,7 +469,7 @@ public: break; case ACTION_SPIRITUAL_REFLECTIONS_COPY: { - uint8 i=0; + uint8 i = 0; Map::PlayerList const& pl = instance->GetPlayers(); for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) if (Player* p = itr->GetSource()) @@ -496,7 +496,7 @@ public: break; case ACTION_SPIRITUAL_REFLECTIONS_ACTIVATE: if (Creature* fg = instance->GetCreature(NPC_FrostswornGeneralGUID)) - for (uint8 i=0; i<5; ++i) + for (uint8 i = 0; i < 5; ++i) if (Creature* c = instance->GetCreature(NPC_SpiritualReflectionGUID[i])) if (c->IsVisible()) { @@ -507,7 +507,7 @@ public: } break; case ACTION_SPIRITUAL_REFLECTIONS_HIDE: - for (uint8 i=0; i<5; ++i) + for (uint8 i = 0; i < 5; ++i) if (Creature* c = instance->GetCreature(NPC_SpiritualReflectionGUID[i])) c->AI()->EnterEvadeMode(); break; @@ -544,7 +544,7 @@ public: c->StopMovingOnCurrentPos(); c->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER); c->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - c->SetHealth(c->GetMaxHealth()/20); + c->SetHealth(c->GetMaxHealth() / 20); c->AI()->Reset(); c->setActive(false); c->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); @@ -705,7 +705,7 @@ public: case NPC_ICE_WALL_TARGET+1: case NPC_ICE_WALL_TARGET+2: case NPC_ICE_WALL_TARGET+3: - return NPC_IceWallTargetGUID[type-NPC_ICE_WALL_TARGET]; + return NPC_IceWallTargetGUID[type - NPC_ICE_WALL_TARGET]; case GO_FROSTMOURNE: return GO_FrostmourneGUID; case GO_ARTHAS_DOOR: @@ -759,7 +759,7 @@ public: { if (WaveNumber && reqKillCount) if (unit->GetEntry() == NPC_WAVE_MERCENARY || unit->GetEntry() == NPC_WAVE_FOOTMAN || unit->GetEntry() == NPC_WAVE_RIFLEMAN || unit->GetEntry() == NPC_WAVE_PRIEST || unit->GetEntry() == NPC_WAVE_MAGE) - if ((--reqKillCount) == 0 && WaveNumber%5 && NextWaveTimer > 5000) + if ((--reqKillCount) == 0 && WaveNumber % 5 && NextWaveTimer > 5000) NextWaveTimer = 5000; if (unit->GetEntry() == NPC_QUEL_DELAR) @@ -774,8 +774,8 @@ public: void RandomizeCompositionsAndShow() { - uint8 r1 = urand(0,1), r2 = urand(2,3); - for (uint8 i=0; i<5; ++i) + uint8 r1 = urand(0, 1), r2 = urand(2, 3); + for (uint8 i = 0; i < 5; ++i) { chosenComposition[0][i] = allowedCompositions[r1][i]; chosenComposition[1][i] = allowedCompositions[r1 == 0 ? 1 : 0][i]; @@ -783,18 +783,18 @@ public: chosenComposition[3][i] = allowedCompositions[r2 == 2 ? 3 : 2][i]; } bool left[4] = {true, true, true, true}; - for (uint8 k=4; k>0; --k) + for (uint8 k = 4; k > 0; --k) { - uint8 r = urand(0, k-1); + uint8 r = urand(0, k - 1); uint8 ur = 0; - for (uint8 j=0; j<4; ++j) + for (uint8 j = 0; j < 4; ++j) if (left[j]) { if (ur == r) { left[j] = false; - for (uint8 i=0; i<5; ++i) - chosenComposition[8-k][i] = allowedCompositions[j+4][i]; + for (uint8 i = 0; i < 5; ++i) + chosenComposition[8 - k][i] = allowedCompositions[j + 4][i]; break; } ++ur; @@ -811,11 +811,11 @@ public: else num_to_activate = 4; - for (uint8 i=0; i=0); (forward ? ++j : --j)) + bool forward = !!urand(0, 1); + for (int8 j = (forward ? 0 : NUM_OF_TRASH - 1); (forward ? j= 0); (forward ? ++j : --j)) if (!TrashActive[j]) if (Creature* c = instance->GetCreature(NPC_TrashGUID[j])) if (c->GetEntry() == entry) @@ -829,7 +829,7 @@ public: WaveNumber = 5; } - for (uint8 i=0; iGetCreature(NPC_TrashGUID[i])) { @@ -853,7 +853,7 @@ public: // some of them could go back to spawn due to vanish, etc. // on activating next wave make those attack again - for (uint8 i=0; iGetCreature(NPC_TrashGUID[i])) if (c->IsAlive() && !c->IsInCombat()) @@ -891,11 +891,11 @@ public: reqKillCount += num_to_activate; - for (uint8 i=0; i 5 ? 2 : 1)][i]; - bool forward = !!urand(0,1); - for (int8 j = (forward ? 0 : NUM_OF_TRASH-1); (forward ? j=0); (forward ? ++j : --j)) + uint32 entry = chosenComposition[WaveNumber - (WaveNumber > 5 ? 2 : 1)][i]; + bool forward = !!urand(0, 1); + for (int8 j = (forward ? 0 : NUM_OF_TRASH - 1); (forward ? j= 0); (forward ? ++j : --j)) if (!TrashActive[j]) if (Creature* c = instance->GetCreature(NPC_TrashGUID[j])) if (c->GetEntry() == entry) @@ -923,7 +923,7 @@ public: NextWaveTimer = 0; memset(&chosenComposition, 0, sizeof(chosenComposition)); - for (uint8 i=0; iGetCreature(NPC_TrashGUID[i])) { @@ -1055,7 +1055,7 @@ public: NextWaveTimer = 7000; break; default: - for (uint8 i=0; iGetCreature(NPC_TrashGUID[i])) c->SetVisible(false); if (Creature* falric = instance->GetCreature(NPC_FalricGUID)) @@ -1080,7 +1080,7 @@ public: case 1: if (Creature* lk = instance->GetCreature(NPC_LichKingGUID)) { - lk->UpdatePosition(PathWaypoints[PATH_WP_COUNT-2], true); + lk->UpdatePosition(PathWaypoints[PATH_WP_COUNT - 2], true); lk->StopMovingOnCurrentPos(); lk->RemoveAllAuras(); lk->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_CUSTOM_SPELL_02); @@ -1088,7 +1088,7 @@ public: lk->SetVisible(true); if (Creature* leader = instance->GetCreature(NPC_LeaderGUID)) { - leader->UpdatePosition(PathWaypoints[PATH_WP_COUNT-1], true); + leader->UpdatePosition(PathWaypoints[PATH_WP_COUNT - 1], true); leader->StopMovingOnCurrentPos(); leader->RemoveAllAuras(); leader->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_READY1H); @@ -1162,7 +1162,7 @@ public: if (Creature* leader = instance->GetCreature(NPC_LeaderGUID)) { uint8 index = TeamIdInInstance == TEAM_ALLIANCE ? 0 : 1; - for (uint8 i=0; i<3; ++i) + for (uint8 i = 0; i < 3; ++i) if (StairsPos[index][i].GetPositionX()) if (GameObject* go = leader->SummonGameObject(TeamIdInInstance == TEAM_ALLIANCE ? GO_STAIRS_ALLIANCE : GO_STAIRS_HORDE, StairsPos[index][i].GetPositionX(), StairsPos[index][i].GetPositionY(), StairsPos[index][i].GetPositionZ(), StairsPos[index][i].GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 86400, false)) go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND | GO_FLAG_NOT_SELECTABLE); @@ -1210,7 +1210,7 @@ public: if (Creature* c = instance->GetCreature(NPC_LeaderGUID)) c->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER); ++outroStep; - outroTimer = 300*1000; + outroTimer = 300 * 1000; break; case 12: outroStep = 0; 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 078d88011..6a0a83935 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp @@ -102,7 +102,7 @@ public: Talk(SAY_AGGRO); DoZoneInCombat(); - events.RescheduleEvent(EVENT_SPELL_THROW_SARONITE, urand(5000,7500)); + events.RescheduleEvent(EVENT_SPELL_THROW_SARONITE, urand(5000, 7500)); if (pInstance) pInstance->SetData(DATA_GARFROST, IN_PROGRESS); @@ -201,9 +201,9 @@ public: if (me->GetVictim()) { - float x,y,z; + float x, y, z; me->GetVictim()->GetPosition(x, y, z); - if (x<600.0f || x>770.0f || y<-270.0f || y>-137.0f || z<514.0f || z>550.0f) + if (x < 600.0f || x > 770.0f || y < -270.0f || y > -137.0f || z < 514.0f || z > 550.0f) { me->SetHealth(me->GetMaxHealth()); EnterEvadeMode(); @@ -236,7 +236,7 @@ public: target->ToPlayer()->GetSession()->SendPacket(&data); me->CastSpell(target, SPELL_THROW_SARONITE, false); } - events.RepeatEvent(urand(12500,20000)); + events.RepeatEvent(urand(12500, 20000)); break; case EVENT_JUMP: me->DisableRotate(true); diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp index 5a52a0b19..ebf6c6e17 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp @@ -91,7 +91,7 @@ public: k->AI()->Talk(SAY_AGGRO); DoZoneInCombat(); events.Reset(); - events.RescheduleEvent(EVENT_SPELL_TOXIC_WASTE, urand(3000,5000)); + events.RescheduleEvent(EVENT_SPELL_TOXIC_WASTE, urand(3000, 5000)); events.RescheduleEvent(EVENT_SPELL_MIGHTY_KICK, urand(10000, 20000)); events.RescheduleEvent(EVENT_SPELL_SHADOW_BOLT, 10000); events.RescheduleEvent(EVENT_SPECIAL, 25000); @@ -110,7 +110,7 @@ public: ChatHandler::BuildChatPacket(data, CHAT_MSG_RAID_BOSS_EMOTE, LANG_UNIVERSAL, me, NULL, EMOTE_ICK_CHASING); target->ToPlayer()->GetSession()->SendPacket(&data); - + AttackStart(target); me->SetReactState(REACT_PASSIVE); events.RescheduleEvent(EVENT_SET_REACT_AGGRESSIVE, 12000); @@ -133,9 +133,9 @@ public: krick->InterruptNonMeleeSpells(true); krick->RemoveAllAuras(); Position myPos(*me), exitPos; - float ang = me->GetOrientation()+3*M_PI/2; + float ang = me->GetOrientation() + 3 * M_PI / 2; float dist = 3.0f; - exitPos.Relocate(myPos.GetPositionX()+dist*cos(ang), myPos.GetPositionY()+dist*sin(ang), 515.0f, M_PI); + exitPos.Relocate(myPos.GetPositionX() + dist * cos(ang), myPos.GetPositionY() + dist * sin(ang), 515.0f, M_PI); exitPos.m_positionZ = me->GetMap()->GetHeight(exitPos.GetPositionX(), exitPos.GetPositionY(), exitPos.GetPositionZ()); if (exitPos.GetPositionZ() < 505.0f || exitPos.GetPositionZ() > 512.0f || !me->IsWithinLOS(exitPos.GetPositionX(), exitPos.GetPositionY(), exitPos.GetPositionZ())) @@ -153,9 +153,9 @@ public: if (me->GetVictim()) { - float x,y,z; + float x, y, z; me->GetVictim()->GetPosition(x, y, z); - if (KrickCenterPos.GetExactDist(x,y,z) > 80.0f || z > KrickCenterPos.GetPositionZ()+20.0f || z < KrickCenterPos.GetPositionZ()-20.0f) + if (KrickCenterPos.GetExactDist(x, y, z) > 80.0f || z > KrickCenterPos.GetPositionZ() + 20.0f || z < KrickCenterPos.GetPositionZ() - 20.0f) { me->SetHealth(me->GetMaxHealth()); EnterEvadeMode(); @@ -178,14 +178,14 @@ public: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true)) { k->CastSpell(target, SPELL_TOXIC_WASTE); - events.RepeatEvent(urand(7000,10000)); + events.RepeatEvent(urand(7000, 10000)); break; } events.RepeatEvent(2500); break; case EVENT_SPELL_MIGHTY_KICK: me->CastSpell(me->GetVictim(), SPELL_MIGHTY_KICK, false); - events.RepeatEvent(urand(20000,25000)); + events.RepeatEvent(urand(20000, 25000)); break; case EVENT_SPELL_SHADOW_BOLT: if (Creature* k = GetKrick()) @@ -205,7 +205,7 @@ public: events.PopEvent(); break; case EVENT_SPECIAL: - switch(urand(0,2)) + switch(urand(0, 2)) { case 0: // Pursuit if (Creature* k = GetKrick()) @@ -234,7 +234,7 @@ public: events.DelayEvents(20000); break; } - events.RepeatEvent(urand(25000,30000)); + events.RepeatEvent(urand(25000, 30000)); break; } @@ -288,7 +288,7 @@ public: void DoAction(int32 a) { - if (a==1) + if (a == 1) { me->setActive(true); events.RescheduleEvent(20, 0); @@ -326,13 +326,13 @@ public: { float angle = me->GetAngle(c); me->SetFacingTo(angle); - float x = me->GetPositionX()+cos(angle)*7.0f; - float y = me->GetPositionY()+sin(angle)*7.0f; + float x = me->GetPositionX() + cos(angle) * 7.0f; + float y = me->GetPositionY() + sin(angle) * 7.0f; c->GetMotionMaster()->MovePoint(0, x, y, me->GetPositionZ()); } - for (uint8 i=0; i<2; ++i) - if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_GUARD_1_GUID+i))) + for (uint8 i = 0; i < 2; ++i) + if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_GUARD_1_GUID + i))) c->DespawnOrUnsummon(); } events.PopEvent(); @@ -362,7 +362,7 @@ public: if (pInstance) { if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_TYRANNUS_EVENT_GUID))) - c->GetMotionMaster()->MovePath(PATH_BEGIN_VALUE+10, false); + c->GetMotionMaster()->MovePath(PATH_BEGIN_VALUE + 10, false); if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_LEADER_FIRST_GUID))) c->AI()->Talk(c->GetEntry() == NPC_JAINA_PART1 ? SAY_JAINA_KRICK_2 : SAY_SYLVANAS_KRICK_2); } @@ -390,7 +390,7 @@ public: me->SetCanFly(true); me->SetDisableGravity(true); me->SendMovementFlagUpdate(); - me->GetMotionMaster()->MoveTakeoff(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+9.0f, 0.5f * 7.0f); + me->GetMotionMaster()->MoveTakeoff(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 9.0f, 0.5f * 7.0f); events.PopEvent(); events.RescheduleEvent(8, 2000); @@ -433,7 +433,7 @@ public: if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_LEADER_FIRST_GUID))) { c->AI()->Talk(c->GetEntry() == NPC_JAINA_PART1 ? SAY_JAINA_KRICK_3 : SAY_SYLVANAS_KRICK_3); - c->GetMotionMaster()->MovePath(PATH_BEGIN_VALUE+11, false); + c->GetMotionMaster()->MovePath(PATH_BEGIN_VALUE + 11, false); } } me->setActive(false); @@ -465,7 +465,7 @@ public: if (Unit* caster = GetCaster()) if (caster->GetTypeId() == TYPEID_UNIT) { - Map::PlayerList const &players = caster->GetMap()->GetPlayers(); + Map::PlayerList const& players = caster->GetMap()->GetPlayers(); for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) if (Player* player = itr->GetSource()) if (player->IsWithinDist(caster, 100.0f)) diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp index 1f4ebae51..b4d5222a3 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp @@ -97,7 +97,7 @@ public: { c->RemoveAura(46598); c->GetMotionMaster()->Clear(); - c->GetMotionMaster()->MovePath(PATH_BEGIN_VALUE+18, true); + c->GetMotionMaster()->MovePath(PATH_BEGIN_VALUE + 18, true); } me->SetHomePosition(exitPos); me->GetMotionMaster()->MoveJump(exitPos, 10.0f, 2.0f); @@ -109,8 +109,8 @@ public: me->CastSpell(me, 43979, true); Talk(SAY_AGGRO); events.Reset(); - events.RescheduleEvent(EVENT_SPELL_FORCEFUL_SMASH, urand(14000,16000)); - events.RescheduleEvent(EVENT_SPELL_OVERLORDS_BRAND, urand(4000,6000)); + events.RescheduleEvent(EVENT_SPELL_FORCEFUL_SMASH, urand(14000, 16000)); + events.RescheduleEvent(EVENT_SPELL_OVERLORDS_BRAND, urand(4000, 6000)); events.RescheduleEvent(EVENT_RIMEFANG_SPELL_ICY_BLAST, 5000); events.RescheduleEvent(EVENT_SPELL_MARK_OF_RIMEFANG, 25000); } @@ -123,9 +123,9 @@ public: if (me->GetVictim()) { - float x,y,z; + float x, y, z; me->GetVictim()->GetPosition(x, y, z); - if (TSDistCheckPos.GetExactDist(x,y,z) > 100.0f || z > TSDistCheckPos.GetPositionZ()+20.0f || z < TSDistCheckPos.GetPositionZ()-20.0f) + if (TSDistCheckPos.GetExactDist(x, y, z) > 100.0f || z > TSDistCheckPos.GetPositionZ() + 20.0f || z < TSDistCheckPos.GetPositionZ() - 20.0f) { me->SetHealth(me->GetMaxHealth()); EnterEvadeMode(); @@ -162,7 +162,7 @@ public: case EVENT_SPELL_OVERLORDS_BRAND: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 95.0f, true)) me->CastSpell(target, SPELL_OVERLORDS_BRAND, false); - events.RepeatEvent(urand(11000,12000)); + events.RepeatEvent(urand(11000, 12000)); break; case EVENT_RIMEFANG_SPELL_ICY_BLAST: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 190.0f, true)) @@ -198,7 +198,7 @@ public: void KilledUnit(Unit* who) { if (who->GetTypeId() == TYPEID_PLAYER) - Talk(RAND(SAY_SLAY_1,SAY_SLAY_2)); + Talk(RAND(SAY_SLAY_1, SAY_SLAY_2)); } bool CanAIAttack(const Unit* who) const diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp index a29b8b294..a5d5d951e 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp @@ -78,14 +78,14 @@ public: { instance->LoadGrid(LeaderIntroPos.GetPositionX(), LeaderIntroPos.GetPositionY()); if (Creature* c = instance->GetCreature(GetData64(DATA_LEADER_FIRST_GUID))) - c->AI()->SetData(DATA_START_INTRO, 0); + c->AI()->SetData(DATA_START_INTRO, 0); } uint32 GetCreatureEntry(uint32 /*guidLow*/, CreatureData const* data) { if (teamIdInInstance == TEAM_NEUTRAL) { - Map::PlayerList const &players = instance->GetPlayers(); + Map::PlayerList const& players = instance->GetPlayers(); if (!players.isEmpty()) if (Player* player = players.begin()->GetSource()) teamIdInInstance = player->GetTeamId(); @@ -111,7 +111,7 @@ public: { if (teamIdInInstance == TEAM_NEUTRAL) { - Map::PlayerList const &players = instance->GetPlayers(); + Map::PlayerList const& players = instance->GetPlayers(); if (!players.isEmpty()) if (Player* player = players.begin()->GetSource()) teamIdInInstance = player->GetTeamId(); @@ -166,7 +166,7 @@ public: break; } NPC_TyrannusEventGUID = creature->GetGUID(); - + } break; case NPC_LORALEN: @@ -183,38 +183,38 @@ public: break; case NPC_HORDE_SLAVE_1: if (teamIdInInstance == TEAM_ALLIANCE) - creature->UpdateEntry(NPC_ALLIANCE_SLAVE_1); + creature->UpdateEntry(NPC_ALLIANCE_SLAVE_1); break; case NPC_HORDE_SLAVE_2: if (teamIdInInstance == TEAM_ALLIANCE) - creature->UpdateEntry(NPC_ALLIANCE_SLAVE_2); + creature->UpdateEntry(NPC_ALLIANCE_SLAVE_2); break; case NPC_HORDE_SLAVE_3: if (teamIdInInstance == TEAM_ALLIANCE) - creature->UpdateEntry(NPC_ALLIANCE_SLAVE_3); + creature->UpdateEntry(NPC_ALLIANCE_SLAVE_3); break; case NPC_HORDE_SLAVE_4: if (teamIdInInstance == TEAM_ALLIANCE) - creature->UpdateEntry(NPC_ALLIANCE_SLAVE_4); + creature->UpdateEntry(NPC_ALLIANCE_SLAVE_4); break; case NPC_GORKUN_IRONSKULL_1: if (teamIdInInstance == TEAM_ALLIANCE) - creature->UpdateEntry(NPC_MARTIN_VICTUS_1); + creature->UpdateEntry(NPC_MARTIN_VICTUS_1); break; case NPC_GARFROST: NPC_GarfrostGUID = creature->GetGUID(); break; case NPC_FREED_SLAVE_1_HORDE: if (teamIdInInstance == TEAM_ALLIANCE) - creature->UpdateEntry(NPC_FREED_SLAVE_1_ALLIANCE); + creature->UpdateEntry(NPC_FREED_SLAVE_1_ALLIANCE); break; case NPC_FREED_SLAVE_2_HORDE: if (teamIdInInstance == TEAM_ALLIANCE) - creature->UpdateEntry(NPC_FREED_SLAVE_2_ALLIANCE); + creature->UpdateEntry(NPC_FREED_SLAVE_2_ALLIANCE); break; case NPC_FREED_SLAVE_3_HORDE: if (teamIdInInstance == TEAM_ALLIANCE) - creature->UpdateEntry(NPC_FREED_SLAVE_3_ALLIANCE); + creature->UpdateEntry(NPC_FREED_SLAVE_3_ALLIANCE); break; case NPC_GORKUN_IRONSKULL_2: if (NPC_MartinOrGorkunGUID) @@ -224,7 +224,7 @@ public: c->DespawnOrUnsummon(); } if (teamIdInInstance == TEAM_ALLIANCE) - creature->UpdateEntry(NPC_MARTIN_VICTUS_2); + creature->UpdateEntry(NPC_MARTIN_VICTUS_2); NPC_MartinOrGorkunGUID = creature->GetGUID(); break; case NPC_RIMEFANG: diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp index 7b4a6ba56..87214cd7d 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp @@ -130,11 +130,11 @@ public: n2->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY1H); } // TODO This spell check is invalid -// if (SPELL_NECROLYTE_CHANNELING) -// { - n1->RemoveAura(SPELL_NECROLYTE_CHANNELING); - n2->RemoveAura(SPELL_NECROLYTE_CHANNELING); -// } + // if (SPELL_NECROLYTE_CHANNELING) + // { + n1->RemoveAura(SPELL_NECROLYTE_CHANNELING); + n2->RemoveAura(SPELL_NECROLYTE_CHANNELING); + // } for (SummonList::iterator itr = summons.begin(); itr != summons.end(); ++itr) if (Creature* c = pInstance->instance->GetCreature(*itr)) @@ -142,9 +142,9 @@ public: if (c->GetPositionX() < 440.0f) continue; if (c->GetPositionY() > 215.0f) - c->GetMotionMaster()->MoveChase(n2, 0.0f, rand_norm()*2*M_PI); + c->GetMotionMaster()->MoveChase(n2, 0.0f, rand_norm() * 2 * M_PI); else - c->GetMotionMaster()->MoveChase(n1, 0.0f, rand_norm()*2*M_PI); + c->GetMotionMaster()->MoveChase(n1, 0.0f, rand_norm() * 2 * M_PI); } } } @@ -185,9 +185,9 @@ public: c->SetDisableGravity(true); c->SetHover(true); c->SendMovementFlagUpdate(); - float dist = rand_norm()*2.0f; - float angle = rand_norm()*2*M_PI; - c->GetMotionMaster()->MoveTakeoff(0, c->GetPositionX()+dist*cos(angle), c->GetPositionY()+dist*sin(angle), c->GetPositionZ()+6.0f+(float)urand(0,4), 1.5f+frand(0.0f, 1.5f)); + float dist = rand_norm() * 2.0f; + float angle = rand_norm() * 2 * M_PI; + c->GetMotionMaster()->MoveTakeoff(0, c->GetPositionX() + dist * cos(angle), c->GetPositionY() + dist * sin(angle), c->GetPositionZ() + 6.0f + (float)urand(0, 4), 1.5f + frand(0.0f, 1.5f)); } } events.PopEvent(); @@ -266,11 +266,11 @@ public: continue; c->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); float dist = rand_norm(); - float angle = rand_norm()*2*M_PI; + float angle = rand_norm() * 2 * M_PI; c->SetSpeed(MOVE_RUN, 0.8f); c->SetInCombatWithZone(); c->GetMotionMaster()->MoveChase(me, dist, angle); - c->SetHomePosition(me->GetPositionX()+dist*cos(angle), me->GetPositionY()+dist*sin(angle), me->GetPositionZ(), 0.0f); + c->SetHomePosition(me->GetPositionX() + dist * cos(angle), me->GetPositionY() + dist * sin(angle), me->GetPositionZ(), 0.0f); } } events.PopEvent(); @@ -287,8 +287,8 @@ public: else { me->CastSpell(me, 59514, false); - for (uint8 i=0; i<2; ++i) - if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_GUARD_1_GUID+i))) + for (uint8 i = 0; i < 2; ++i) + if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_GUARD_1_GUID + i))) c->CastSpell(c, 70513, false); } } @@ -303,8 +303,8 @@ public: if (me->GetEntry() == NPC_JAINA_PART1) { - for (uint8 i=0; i<2; ++i) - if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_GUARD_1_GUID+i))) + for (uint8 i = 0; i < 2; ++i) + if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_GUARD_1_GUID + i))) c->CastSpell(c, 70464, false); } } @@ -315,8 +315,8 @@ public: Talk(me->GetEntry() == NPC_JAINA_PART1 ? SAY_JAINA_INTRO_4 : SAY_SYLVANAS_INTRO_3); if (pInstance) { - for (uint8 i=0; i<2; ++i) - if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_GUARD_1_GUID+i))) + for (uint8 i = 0; i < 2; ++i) + if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_GUARD_1_GUID + i))) c->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); for (SummonList::iterator itr = summons.begin(); itr != summons.end(); ++itr) @@ -354,7 +354,7 @@ public: summons.Summon(s); } - void SummonedCreatureDespawn(Creature *s) + void SummonedCreatureDespawn(Creature* s) { summons.Despawn(s); } @@ -363,7 +363,7 @@ public: void MoveInLineOfSight(Unit* /*who*/) {} }; - CreatureAI *GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const { return new npc_pos_leaderAI(creature); } @@ -396,12 +396,12 @@ public: if (pInstance && pInstance->GetData(DATA_INSTANCE_PROGRESS) == INSTANCE_PROGRESS_NONE) { if ((me->GetPositionX() > 490.0f && me->GetPositionX() < 504.0f && me->GetPositionY() > 192.0f && me->GetPositionY() < 206.0f) || - (me->GetPositionX() > 490.0f && me->GetPositionX() < 504.0f && me->GetPositionY() > 240.0f && me->GetPositionY() < 254.0f)) + (me->GetPositionX() > 490.0f && me->GetPositionX() < 504.0f && me->GetPositionY() > 240.0f && me->GetPositionY() < 254.0f)) { isInvincible = true; // TODO This spell check is invalid -// if (SPELL_NECROLYTE_CHANNELING) + // if (SPELL_NECROLYTE_CHANNELING) me->CastSpell(me, SPELL_NECROLYTE_CHANNELING, false); if (me->GetPositionY() < 206.0f) @@ -425,11 +425,11 @@ public: void EnterCombat(Unit* /*who*/) { // TODO This spell check is invalid -// if (SPELL_NECROLYTE_CHANNELING) + // if (SPELL_NECROLYTE_CHANNELING) me->RemoveAura(SPELL_NECROLYTE_CHANNELING); events.Reset(); events.RescheduleEvent(1, 0); - events.RescheduleEvent(2, urand(5000,9000)); + events.RescheduleEvent(2, urand(5000, 9000)); if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_LEADER_FIRST_GUID))) c->AI()->SetData(DATA_START_INTRO, 0); @@ -438,7 +438,7 @@ public: void DamageTaken(Unit* /*doneBy*/, uint32& damage, DamageEffectType, SpellSchoolMask) { if (isInvincible && damage >= me->GetHealth()) - damage = me->GetHealth()-1; + damage = me->GetHealth() - 1; } void DoAction(int32 a) @@ -468,7 +468,7 @@ public: case 2: // Conversion Beam if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true)) me->CastSpell(target, 69578, false); - events.RepeatEvent(urand(20000,25000)); + events.RepeatEvent(urand(20000, 25000)); break; } @@ -478,7 +478,7 @@ public: void MoveInLineOfSight(Unit* /*who*/) {} }; - CreatureAI *GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const { return new npc_pos_deathwhisper_necrolyteAI(creature); } @@ -525,29 +525,29 @@ public: case 0: break; case 1: - { - if (pInstance) - if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_GARFROST_GUID))) - { - float angle = c->GetAngle(me); - float x = c->GetPositionX()+cos(angle)*12.0f; - float y = c->GetPositionY()+sin(angle)*12.0f; - me->GetMotionMaster()->MovePoint(2, x, y, c->GetPositionZ()); - } - - uint8 i=0; - while (FBSData[i].entry) { - if (Creature* c = me->SummonCreature(FBSData[i].entry, 688.69f+i*1.8f, FBSSpawnPos.GetPositionY()+(float)irand(-2,2), FBSSpawnPos.GetPositionZ(), 3*M_PI/2)) - c->GetMotionMaster()->MovePath(FBSData[i].pathId, false); - ++i; + if (pInstance) + if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_GARFROST_GUID))) + { + float angle = c->GetAngle(me); + float x = c->GetPositionX() + cos(angle) * 12.0f; + float y = c->GetPositionY() + sin(angle) * 12.0f; + me->GetMotionMaster()->MovePoint(2, x, y, c->GetPositionZ()); + } + + uint8 i = 0; + while (FBSData[i].entry) + { + if (Creature* c = me->SummonCreature(FBSData[i].entry, 688.69f + i * 1.8f, FBSSpawnPos.GetPositionY() + (float)irand(-2, 2), FBSSpawnPos.GetPositionZ(), 3 * M_PI / 2)) + c->GetMotionMaster()->MovePath(FBSData[i].pathId, false); + ++i; + } + events.PopEvent(); + events.RescheduleEvent(2, 3000); + break; } - events.PopEvent(); - events.RescheduleEvent(2, 3000); - break; - } case 2: - if (Creature* c = me->SummonCreature(NPC_TYRANNUS_VOICE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()-10.0f, me->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN, 1)) + if (Creature* c = me->SummonCreature(NPC_TYRANNUS_VOICE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() - 10.0f, me->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN, 1)) c->AI()->Talk(SAY_TYRANNUS_GARFROST); events.PopEvent(); events.RescheduleEvent(3, 4000); @@ -560,7 +560,7 @@ public: } }; - CreatureAI *GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const { return new npc_pos_after_first_bossAI(creature); } @@ -653,7 +653,7 @@ public: if (killsLeft != 0) return; pInstance->SetData(DATA_INSTANCE_PROGRESS, INSTANCE_PROGRESS_AFTER_TUNNEL_WARN); - if (Creature* c = me->SummonCreature(NPC_TYRANNUS_VOICE, 950.16f, -102.17f, 594.90f-10.0f, 5.43f, TEMPSUMMON_TIMED_DESPAWN, 1)) + if (Creature* c = me->SummonCreature(NPC_TYRANNUS_VOICE, 950.16f, -102.17f, 594.90f - 10.0f, 5.43f, TEMPSUMMON_TIMED_DESPAWN, 1)) c->AI()->Talk(SAY_TYRANNUS_TRAP_TUNNEL); break; } @@ -678,7 +678,7 @@ public: me->SetFacingTo(PTSTyrannusWaitPos2.GetOrientation()); break; case 5: - me->GetMotionMaster()->MoveTakeoff(10, me->GetPositionX()+2.0f*cos(me->GetOrientation()), me->GetPositionY()+2.0f*sin(me->GetOrientation()), me->GetPositionZ()+30.0f, 7.0f); + me->GetMotionMaster()->MoveTakeoff(10, me->GetPositionX() + 2.0f * cos(me->GetOrientation()), me->GetPositionY() + 2.0f * sin(me->GetOrientation()), me->GetPositionZ() + 30.0f, 7.0f); break; case 6: me->GetMotionMaster()->MovePoint(4, PTSTyrannusWaitPos3, false); @@ -763,14 +763,14 @@ public: break; case 60: { - Position startPos[6] = { {927.11f, -72.60f, 592.2f, 1.52f},{922.92f, -72.64f, 592.3f, 1.52f},{930.46f, -72.57f, 592.1f, 1.52f},{934.52f, -72.52f, 592.1f, 1.52f},{934.57f, -77.66f, 592.20f, 1.52f},{927.15f, -77.07f, 592.20f, 1.52f} }; + Position startPos[6] = { {927.11f, -72.60f, 592.2f, 1.52f}, {922.92f, -72.64f, 592.3f, 1.52f}, {930.46f, -72.57f, 592.1f, 1.52f}, {934.52f, -72.52f, 592.1f, 1.52f}, {934.57f, -77.66f, 592.20f, 1.52f}, {927.15f, -77.07f, 592.20f, 1.52f} }; Position endPos = {926.10f, -46.63f, 591.2f, 1.52f}; - for (uint8 i=0; i<6; ++i) + for (uint8 i = 0; i < 6; ++i) if (Creature* s = me->SummonCreature(i < 4 ? NPC_FALLEN_WARRIOR : NPC_WRATHBONE_COLDWRAITH, startPos[i])) { s->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); Position finalPos = endPos; - s->MovePosition(finalPos, startPos[i].GetExactDist(&startPos[0]), Position::NormalizeOrientation(startPos[i].GetAngle(&startPos[0])+1.52f)); + s->MovePosition(finalPos, startPos[i].GetExactDist(&startPos[0]), Position::NormalizeOrientation(startPos[i].GetAngle(&startPos[0]) + 1.52f)); Movement::PointsArray path; path.push_back(G3D::Vector3(s->GetPositionX(), s->GetPositionY(), s->GetPositionZ())); @@ -782,17 +782,17 @@ public: if (Difficulty(me->GetMap()->GetSpawnMode()) == DUNGEON_DIFFICULTY_HEROIC) { - Position startPos[6] = { {925.485f, -65.67f, 592.5f, 1.4f},{921.77f, -65.10f, 592.5f, 1.4f},{929.19f, -66.24f, 592.5f, 1.4f},{932.46f, -66.74f, 592.5f, 1.4f},{924.66f, -71.03f, 592.5f, 1.4f},{928.81f, -71.66f, 592.5f, 1.4f} }; + Position startPos[6] = { {925.485f, -65.67f, 592.5f, 1.4f}, {921.77f, -65.10f, 592.5f, 1.4f}, {929.19f, -66.24f, 592.5f, 1.4f}, {932.46f, -66.74f, 592.5f, 1.4f}, {924.66f, -71.03f, 592.5f, 1.4f}, {928.81f, -71.66f, 592.5f, 1.4f} }; Position middlePos = {928.43f, -29.31f, 589.0f, 1.4f}; Position endPos = {937.8f, 21.20f, 574.6f, 1.4f}; - for (uint8 i=0; i<6; ++i) + for (uint8 i = 0; i < 6; ++i) if (Creature* s = me->SummonCreature(i < 4 ? NPC_FALLEN_WARRIOR : NPC_WRATHBONE_COLDWRAITH, startPos[i])) { s->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); Position midPos = middlePos; Position finalPos = endPos; - s->MovePosition(midPos, startPos[i].GetExactDist(&startPos[0]), Position::NormalizeOrientation(startPos[i].GetAngle(&startPos[0])+1.4f)); - s->MovePosition(finalPos, startPos[i].GetExactDist(&startPos[0]), Position::NormalizeOrientation(startPos[i].GetAngle(&startPos[0])+1.4f)); + s->MovePosition(midPos, startPos[i].GetExactDist(&startPos[0]), Position::NormalizeOrientation(startPos[i].GetAngle(&startPos[0]) + 1.4f)); + s->MovePosition(finalPos, startPos[i].GetExactDist(&startPos[0]), Position::NormalizeOrientation(startPos[i].GetAngle(&startPos[0]) + 1.4f)); Movement::PointsArray path; path.push_back(G3D::Vector3(s->GetPositionX(), s->GetPositionY(), s->GetPositionZ())); @@ -809,7 +809,7 @@ public: } }; - CreatureAI *GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const { return new npc_pos_tyrannus_eventsAI(creature); } @@ -839,14 +839,14 @@ public: { if (pInstance->GetData(DATA_INSTANCE_PROGRESS) == INSTANCE_PROGRESS_AFTER_TUNNEL_WARN) me->CastSpell(me, SPELL_TUNNEL_ICICLE, false); - timer = urand(16000,24000); + timer = urand(16000, 24000); } else timer -= diff; } }; - CreatureAI *GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const { return new npc_pos_icicle_triggerAI(creature); } @@ -897,7 +897,7 @@ public: } }; - CreatureAI *GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const { return new npc_pos_collapsing_icicleAI(creature); } @@ -949,9 +949,9 @@ public: void DoAction(int32 p) { - if (p==1) + if (p == 1) summons.DespawnAll(); - else if (p==2) + else if (p == 2) { events.Reset(); summons.DespawnEntry(NPC_FALLEN_WARRIOR); @@ -972,10 +972,10 @@ public: c->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_CHEER); float ang = frand(1.92f, 2.36f); float dist = urand(50, 85); - c->GetMotionMaster()->MovePoint(0, TSSpawnPos.GetPositionX()+cos(ang)*dist, TSSpawnPos.GetPositionY()+sin(ang)*dist, 628.2f); + c->GetMotionMaster()->MovePoint(0, TSSpawnPos.GetPositionX() + cos(ang)*dist, TSSpawnPos.GetPositionY() + sin(ang)*dist, 628.2f); } } - else if (p==3) + else if (p == 3) { if (pInstance) if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_SINDRAGOSA_GUID))) @@ -1060,7 +1060,7 @@ public: if (Creature* c = me->SummonCreature(NPC_FALLEN_WARRIOR, 1060.95f, 102.79f, 630.2f, 2.01f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000)) { float offset = frand(0.0f, 10.0f); - c->GetMotionMaster()->MovePoint(0, 1047.0f+offset, 118.0f+offset, 628.2f); + c->GetMotionMaster()->MovePoint(0, 1047.0f + offset, 118.0f + offset, 628.2f); c->SetHomePosition(*me); for (std::list::iterator itr = summons.begin(); itr != summons.end(); ++itr) if (Creature* s = pInstance->instance->GetCreature(*itr)) @@ -1084,7 +1084,7 @@ public: } }; - CreatureAI *GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const { return new npc_pos_martin_or_gorkun_secondAI(creature); } @@ -1125,7 +1125,7 @@ public: } }; - CreatureAI *GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const { return new npc_pos_freed_slaveAI(creature); } @@ -1178,9 +1178,9 @@ public: { if ((spell->Id == SPELL_TELEPORT_JAINA || spell->Id == SPELL_TELEPORT_SYLVANAS) && target && target->GetTypeId() == TYPEID_PLAYER) { - float angle = rand_norm()*2*M_PI; - float dist = urand(1,4); - target->ToPlayer()->NearTeleportTo(me->GetPositionX()+cos(angle)*dist, me->GetPositionY()+sin(angle)*dist, me->GetPositionZ(), me->GetOrientation()); + float angle = rand_norm() * 2 * M_PI; + float dist = urand(1, 4); + target->ToPlayer()->NearTeleportTo(me->GetPositionX() + cos(angle)*dist, me->GetPositionY() + sin(angle)*dist, me->GetPositionZ(), me->GetOrientation()); } } @@ -1274,7 +1274,7 @@ public: events.RescheduleEvent(8, 2000); break; case 8: - me->GetMotionMaster()->MovePath(me->GetEntry() == NPC_JAINA_PART2 ? PATH_BEGIN_VALUE+16 : PATH_BEGIN_VALUE+17, false); + me->GetMotionMaster()->MovePath(me->GetEntry() == NPC_JAINA_PART2 ? PATH_BEGIN_VALUE + 16 : PATH_BEGIN_VALUE + 17, false); events.PopEvent(); break; case 10: @@ -1286,7 +1286,7 @@ public: } }; - CreatureAI *GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const { return new npc_pos_leader_secondAI(creature); } @@ -1302,9 +1302,9 @@ public: npc_frostbite_invisible_stalkerAI(Creature* creature) : NullCreatureAI(creature) { timer = 3500; - for (uint8 i = 0; i<3; ++i) + for (uint8 i = 0; i < 3; ++i) { - me->SetOrientation(i*M_PI/3); + me->SetOrientation(i * M_PI / 3); me->CastSpell(me, 34740, true); me->CastSpell(me, 34746, true); } @@ -1328,7 +1328,7 @@ public: } }; - CreatureAI *GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const { return new npc_frostbite_invisible_stalkerAI(creature); } @@ -1343,11 +1343,11 @@ public: { PrepareAuraScript(spell_pos_empowered_blizzardAuraScript) - void HandleEffectPeriodic(AuraEffect const * /*aurEff*/) + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) { PreventDefaultAction(); if (Unit* caster = GetCaster()) - caster->CastSpell((float)urand(447,480), (float)urand(200,235), 528.71f, 70131, true); + caster->CastSpell((float)urand(447, 480), (float)urand(200, 235), 528.71f, 70131, true); } void Register() @@ -1356,13 +1356,14 @@ public: } }; - AuraScript *GetAuraScript() const + AuraScript* GetAuraScript() const { return new spell_pos_empowered_blizzardAuraScript(); } }; -const Position slaveFreePos[4] = { +const Position slaveFreePos[4] = +{ {699.82f, -82.68f, 512.6f, 0.0f}, {643.51f, 79.20f, 511.57f, 0.0f}, {800.09f, 78.66f, 510.2f, 0.0f}, @@ -1371,29 +1372,29 @@ const Position slaveFreePos[4] = { class SlaveRunEvent : public BasicEvent { - public: - SlaveRunEvent(Creature& owner) : _owner(owner) { } +public: + SlaveRunEvent(Creature& owner) : _owner(owner) { } - bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/) + bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/) + { + uint32 pointId = 0; + float minDist = _owner.GetExactDist2dSq(&slaveFreePos[pointId]); + for (uint32 i = 1; i < 4; ++i) { - uint32 pointId = 0; - float minDist = _owner.GetExactDist2dSq(&slaveFreePos[pointId]); - for (uint32 i=1; i<4; ++i) + float dist = _owner.GetExactDist2dSq(&slaveFreePos[i]); + if (dist < minDist) { - float dist = _owner.GetExactDist2dSq(&slaveFreePos[i]); - if (dist < minDist) - { - minDist = dist; - pointId = i; - } + minDist = dist; + pointId = i; } - if (minDist < 200.0f*200.0f) - _owner.GetMotionMaster()->MovePoint(0, slaveFreePos[pointId], true, false); - return true; } + if (minDist < 200.0f * 200.0f) + _owner.GetMotionMaster()->MovePoint(0, slaveFreePos[pointId], true, false); + return true; + } - private: - Creature& _owner; +private: + Creature& _owner; }; class spell_pos_slave_trigger_closest : public SpellScriptLoader @@ -1416,7 +1417,7 @@ public: { p->RewardPlayerAndGroupAtEvent(36764, caster); // alliance p->RewardPlayerAndGroupAtEvent(36770, caster); // horde - + target->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); if (Creature* c = target->ToCreature()) { @@ -1482,7 +1483,7 @@ public: { PrepareAuraScript(spell_pos_blightAuraScript) - void HandleEffectPeriodic(AuraEffect const * aurEff) + void HandleEffectPeriodic(AuraEffect const* aurEff) { if (aurEff->GetTotalTicks() >= 0 && aurEff->GetTickNumber() == uint32(aurEff->GetTotalTicks())) if (Unit* target = GetTarget()) @@ -1495,7 +1496,7 @@ public: } }; - AuraScript *GetAuraScript() const + AuraScript* GetAuraScript() const { return new spell_pos_blightAuraScript(); } @@ -1510,7 +1511,7 @@ public: { PrepareAuraScript(spell_pos_glacial_strikeAuraScript) - void HandleEffectPeriodic(AuraEffect const * aurEff) + void HandleEffectPeriodic(AuraEffect const* aurEff) { if (Unit* target = GetTarget()) if (target->GetHealth() == target->GetMaxHealth()) @@ -1527,7 +1528,7 @@ public: } }; - AuraScript *GetAuraScript() const + AuraScript* GetAuraScript() const { return new spell_pos_glacial_strikeAuraScript(); } @@ -1535,28 +1536,28 @@ public: class at_tyrannus_event_starter : public AreaTriggerScript { - public: - at_tyrannus_event_starter() : AreaTriggerScript("at_tyrannus_event_starter") { } - - bool OnTrigger(Player* player, const AreaTrigger* /*at*/) - { - InstanceScript* inst = player->GetInstanceScript(); - if (!inst) - return false; - - if (inst->GetData(DATA_INSTANCE_PROGRESS) < INSTANCE_PROGRESS_AFTER_TUNNEL_WARN) - return false; - - if (inst->GetData(DATA_GARFROST) == DONE && inst->GetData(DATA_ICK) == DONE && inst->GetData(DATA_TYRANNUS) != DONE && !inst->GetData64(DATA_MARTIN_OR_GORKUN_GUID)) - { - if (Creature* c = inst->instance->SummonCreature(NPC_GORKUN_IRONSKULL_2, TSSpawnPos)) - c->GetMotionMaster()->MovePoint(0, TSMidPos); - - inst->SetData(DATA_INSTANCE_PROGRESS, INSTANCE_PROGRESS_TYRANNUS_INTRO); - } +public: + at_tyrannus_event_starter() : AreaTriggerScript("at_tyrannus_event_starter") { } + bool OnTrigger(Player* player, const AreaTrigger* /*at*/) + { + InstanceScript* inst = player->GetInstanceScript(); + if (!inst) return false; + + if (inst->GetData(DATA_INSTANCE_PROGRESS) < INSTANCE_PROGRESS_AFTER_TUNNEL_WARN) + return false; + + if (inst->GetData(DATA_GARFROST) == DONE && inst->GetData(DATA_ICK) == DONE && inst->GetData(DATA_TYRANNUS) != DONE && !inst->GetData64(DATA_MARTIN_OR_GORKUN_GUID)) + { + if (Creature* c = inst->instance->SummonCreature(NPC_GORKUN_IRONSKULL_2, TSSpawnPos)) + c->GetMotionMaster()->MovePoint(0, TSMidPos); + + inst->SetData(DATA_INSTANCE_PROGRESS, INSTANCE_PROGRESS_TYRANNUS_INTRO); } + + return false; + } }; void AddSC_pit_of_saron() diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h index 3b813f568..3e1549b4a 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h @@ -191,7 +191,7 @@ enum eFBSTexts SAY_TYRANNUS_GARFROST = 20, }; -const Position FBSSpawnPos = {695.685f, -118.825f, 513.877f, 3*M_PI/2}; +const Position FBSSpawnPos = {695.685f, -118.825f, 513.877f, 3 * M_PI / 2}; struct FBSPosition { @@ -201,15 +201,15 @@ struct FBSPosition const FBSPosition FBSData[] = { - { NPC_HORDE_SLAVE_1, PATH_BEGIN_VALUE+0 }, - { NPC_HORDE_SLAVE_1, PATH_BEGIN_VALUE+1 }, - { NPC_HORDE_SLAVE_2, PATH_BEGIN_VALUE+2 }, - { NPC_HORDE_SLAVE_2, PATH_BEGIN_VALUE+3 }, - { NPC_HORDE_SLAVE_2, PATH_BEGIN_VALUE+4 }, - { NPC_HORDE_SLAVE_3, PATH_BEGIN_VALUE+5 }, - { NPC_HORDE_SLAVE_3, PATH_BEGIN_VALUE+6 }, - { NPC_HORDE_SLAVE_4, PATH_BEGIN_VALUE+7 }, - { NPC_HORDE_SLAVE_4, PATH_BEGIN_VALUE+8 }, + { NPC_HORDE_SLAVE_1, PATH_BEGIN_VALUE + 0 }, + { NPC_HORDE_SLAVE_1, PATH_BEGIN_VALUE + 1 }, + { NPC_HORDE_SLAVE_2, PATH_BEGIN_VALUE + 2 }, + { NPC_HORDE_SLAVE_2, PATH_BEGIN_VALUE + 3 }, + { NPC_HORDE_SLAVE_2, PATH_BEGIN_VALUE + 4 }, + { NPC_HORDE_SLAVE_3, PATH_BEGIN_VALUE + 5 }, + { NPC_HORDE_SLAVE_3, PATH_BEGIN_VALUE + 6 }, + { NPC_HORDE_SLAVE_4, PATH_BEGIN_VALUE + 7 }, + { NPC_HORDE_SLAVE_4, PATH_BEGIN_VALUE + 8 }, { 0, 0 } }; @@ -269,7 +269,7 @@ const Position TSSindragosaPos2 = {948.39f, 215.47f, 653.71f, 5.51f}; struct TSPosition { uint32 entry; - float x,y; + float x, y; }; const TSPosition TSData[] = diff --git a/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp b/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp index 55f674f79..7fb10827e 100644 --- a/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp +++ b/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp @@ -62,418 +62,418 @@ static Position mojoPosition[] = class RestoreFight : public BasicEvent { - public: - RestoreFight(Creature* owner) : _owner(owner) { } +public: + RestoreFight(Creature* owner) : _owner(owner) { } - bool Execute(uint64 /*execTime*/, uint32 /*diff*/) - { - _owner->SetReactState(REACT_AGGRESSIVE); - _owner->SetInCombatWithZone(); - return true; - } + bool Execute(uint64 /*execTime*/, uint32 /*diff*/) + { + _owner->SetReactState(REACT_AGGRESSIVE); + _owner->SetInCombatWithZone(); + return true; + } - private: - Creature* _owner; +private: + Creature* _owner; }; class boss_drakkari_colossus : public CreatureScript { - public: - boss_drakkari_colossus() : CreatureScript("boss_drakkari_colossus") { } +public: + boss_drakkari_colossus() : CreatureScript("boss_drakkari_colossus") { } - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const + { + return new boss_drakkari_colossusAI (creature); + } + struct boss_drakkari_colossusAI : public BossAI + { + boss_drakkari_colossusAI(Creature* creature) : BossAI(creature, DATA_DRAKKARI_COLOSSUS) { - return new boss_drakkari_colossusAI (creature); } - struct boss_drakkari_colossusAI : public BossAI + + void MoveInLineOfSight(Unit* /*who*/) { - boss_drakkari_colossusAI(Creature* creature) : BossAI(creature, DATA_DRAKKARI_COLOSSUS) - { - } + } - void MoveInLineOfSight(Unit* /*who*/) + void DoAction(int32 param) + { + if (param == ACTION_INFORM) { + me->SetInCombatWithZone(); + summons.DoAction(ACTION_MERGE); + events.ScheduleEvent(EVENT_COLOSSUS_START_FIGHT, 3500); } + } - void DoAction(int32 param) + void Reset() + { + BossAI::Reset(); + for (uint8 i = 0; i < 5; i++) + me->SummonCreature(NPC_LIVING_MOJO, mojoPosition[i].GetPositionX(), mojoPosition[i].GetPositionY(), mojoPosition[i].GetPositionZ(), 0, TEMPSUMMON_MANUAL_DESPAWN, 0); + + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + } + + void InitializeAI() + { + BossAI::InitializeAI(); + me->CastSpell(me, SPELL_FREEZE_ANIM, true); + } + + void JustReachedHome() + { + BossAI::JustReachedHome(); + me->CastSpell(me, SPELL_FREEZE_ANIM, true); + } + + void EnterCombat(Unit* who) + { + BossAI::EnterCombat(who); + events.ScheduleEvent(EVENT_COLOSSUS_MIGHTY_BLOW, 10000); + events.ScheduleEvent(EVENT_COLOSSUS_HEALTH_1, 1000); + events.ScheduleEvent(EVENT_COLOSSUS_HEALTH_2, 1000); + } + + void JustSummoned(Creature* summon) + { + if (summon->GetEntry() == NPC_DRAKKARI_ELEMENTAL) { - if (param == ACTION_INFORM) + summon->SetRegeneratingHealth(false); + summon->SetReactState(REACT_PASSIVE); + summon->m_Events.AddEvent(new RestoreFight(summon), summon->m_Events.CalculateTime(3000)); + if (events.GetNextEventTime(EVENT_COLOSSUS_HEALTH_2) == 0) { - me->SetInCombatWithZone(); - summons.DoAction(ACTION_MERGE); - events.ScheduleEvent(EVENT_COLOSSUS_START_FIGHT, 3500); + summon->SetHealth(summon->GetMaxHealth() / 2); + summon->LowerPlayerDamageReq(summon->GetMaxHealth() / 2); + summon->AI()->DoAction(ACTION_INFORM); } } - void Reset() - { - BossAI::Reset(); - for (uint8 i = 0; i < 5; i++) - me->SummonCreature(NPC_LIVING_MOJO, mojoPosition[i].GetPositionX(), mojoPosition[i].GetPositionY(), mojoPosition[i].GetPositionZ(), 0, TEMPSUMMON_MANUAL_DESPAWN, 0); + summons.Summon(summon); + } - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + void SummonedCreatureDies(Creature* summon, Unit*) + { + summons.Despawn(summon); + if (summon->GetEntry() == NPC_DRAKKARI_ELEMENTAL) + Unit::Kill(me, me); + } + + void SummonedCreatureDespawn(Creature* summon) + { + summons.Despawn(summon); + if (summon->GetEntry() == NPC_DRAKKARI_ELEMENTAL) + { me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->RemoveAurasDueToSpell(SPELL_FREEZE_ANIM); + if (me->GetVictim()) + me->GetMotionMaster()->MoveChase(me->GetVictim()); } + } - void InitializeAI() - { - BossAI::InitializeAI(); - me->CastSpell(me, SPELL_FREEZE_ANIM, true); - } + void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType, SpellSchoolMask) + { + if (damage >= me->GetHealth()) + damage = 0; + } - void JustReachedHome() - { - BossAI::JustReachedHome(); - me->CastSpell(me, SPELL_FREEZE_ANIM, true); - } - - void EnterCombat(Unit* who) - { - BossAI::EnterCombat(who); - events.ScheduleEvent(EVENT_COLOSSUS_MIGHTY_BLOW, 10000); - events.ScheduleEvent(EVENT_COLOSSUS_HEALTH_1, 1000); - events.ScheduleEvent(EVENT_COLOSSUS_HEALTH_2, 1000); - } + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; - void JustSummoned(Creature* summon) - { - if (summon->GetEntry() == NPC_DRAKKARI_ELEMENTAL) - { - summon->SetRegeneratingHealth(false); - summon->SetReactState(REACT_PASSIVE); - summon->m_Events.AddEvent(new RestoreFight(summon), summon->m_Events.CalculateTime(3000)); - if (events.GetNextEventTime(EVENT_COLOSSUS_HEALTH_2) == 0) - { - summon->SetHealth(summon->GetMaxHealth()/2); - summon->LowerPlayerDamageReq(summon->GetMaxHealth()/2); - summon->AI()->DoAction(ACTION_INFORM); - } - } + if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)) + return; - summons.Summon(summon); - } - - void SummonedCreatureDies(Creature* summon, Unit*) + events.Update(diff); + switch (events.ExecuteEvent()) { - summons.Despawn(summon); - if (summon->GetEntry() == NPC_DRAKKARI_ELEMENTAL) - Unit::Kill(me, me); - } - - void SummonedCreatureDespawn(Creature* summon) - { - summons.Despawn(summon); - if (summon->GetEntry() == NPC_DRAKKARI_ELEMENTAL) - { - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + case EVENT_COLOSSUS_START_FIGHT: me->RemoveAurasDueToSpell(SPELL_FREEZE_ANIM); - if (me->GetVictim()) - me->GetMotionMaster()->MoveChase(me->GetVictim()); - } + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + break; + case EVENT_COLOSSUS_MIGHTY_BLOW: + me->CastSpell(me->GetVictim(), SPELL_MIGHTY_BLOW, false); + events.ScheduleEvent(EVENT_COLOSSUS_MIGHTY_BLOW, 10000); + break; + case EVENT_COLOSSUS_HEALTH_1: + if (me->HealthBelowPct(51)) + { + me->CastSpell(me, SPELL_EMERGE, false); + me->CastSpell(me, SPELL_EMERGE_SUMMON, true); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->GetMotionMaster()->Clear(); + break; + } + events.ScheduleEvent(EVENT_COLOSSUS_HEALTH_1, 1000); + break; + case EVENT_COLOSSUS_HEALTH_2: + if (me->HealthBelowPct(21)) + { + me->CastSpell(me, SPELL_EMERGE, false); + me->CastSpell(me, SPELL_EMERGE_SUMMON, true); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->GetMotionMaster()->Clear(); + break; + } + events.ScheduleEvent(EVENT_COLOSSUS_HEALTH_2, 1000); + break; } - void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType, SpellSchoolMask) - { - if (damage >= me->GetHealth()) - damage = 0; - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)) - return; - - events.Update(diff); - switch (events.ExecuteEvent()) - { - case EVENT_COLOSSUS_START_FIGHT: - me->RemoveAurasDueToSpell(SPELL_FREEZE_ANIM); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - break; - case EVENT_COLOSSUS_MIGHTY_BLOW: - me->CastSpell(me->GetVictim(), SPELL_MIGHTY_BLOW, false); - events.ScheduleEvent(EVENT_COLOSSUS_MIGHTY_BLOW, 10000); - break; - case EVENT_COLOSSUS_HEALTH_1: - if (me->HealthBelowPct(51)) - { - me->CastSpell(me, SPELL_EMERGE, false); - me->CastSpell(me, SPELL_EMERGE_SUMMON, true); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->GetMotionMaster()->Clear(); - break; - } - events.ScheduleEvent(EVENT_COLOSSUS_HEALTH_1, 1000); - break; - case EVENT_COLOSSUS_HEALTH_2: - if (me->HealthBelowPct(21)) - { - me->CastSpell(me, SPELL_EMERGE, false); - me->CastSpell(me, SPELL_EMERGE_SUMMON, true); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->GetMotionMaster()->Clear(); - break; - } - events.ScheduleEvent(EVENT_COLOSSUS_HEALTH_2, 1000); - break; - } - - DoMeleeAttackIfReady(); - } - }; + DoMeleeAttackIfReady(); + } + }; }; class boss_drakkari_elemental : public CreatureScript { - public: - boss_drakkari_elemental() : CreatureScript("boss_drakkari_elemental") { } +public: + boss_drakkari_elemental() : CreatureScript("boss_drakkari_elemental") { } - CreatureAI* GetAI(Creature* pCreature) const + CreatureAI* GetAI(Creature* pCreature) const + { + return new boss_drakkari_elementalAI (pCreature); + } + + struct boss_drakkari_elementalAI : public ScriptedAI + { + boss_drakkari_elementalAI(Creature* pCreature) : ScriptedAI(pCreature) { - return new boss_drakkari_elementalAI (pCreature); + events.ScheduleEvent(EVENT_ELEMENTAL_HEALTH, 1000); + events.ScheduleEvent(EVENT_ELEMENTAL_SURGE, 7000); + events.ScheduleEvent(EVENT_ELEMENTAL_VOLLEY, 0); } - struct boss_drakkari_elementalAI : public ScriptedAI + EventMap events; + + void DoAction(int32 param) { - boss_drakkari_elementalAI(Creature* pCreature) : ScriptedAI(pCreature) + if (param == ACTION_INFORM) + events.CancelEvent(EVENT_ELEMENTAL_HEALTH); + } + + void Reset() + { + me->CastSpell(me, SPELL_ELEMENTAL_SPAWN_EFFECT, false); + } + + void JustDied(Unit*) + { + Talk(EMOTE_ALTAR); + } + + void EnterCombat(Unit*) + { + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING) || me->HasUnitState(UNIT_STATE_CHARGING)) + return; + + switch (events.ExecuteEvent()) { - events.ScheduleEvent(EVENT_ELEMENTAL_HEALTH, 1000); - events.ScheduleEvent(EVENT_ELEMENTAL_SURGE, 7000); - events.ScheduleEvent(EVENT_ELEMENTAL_VOLLEY, 0); - } - - EventMap events; - - void DoAction(int32 param) - { - if (param == ACTION_INFORM) - events.CancelEvent(EVENT_ELEMENTAL_HEALTH); - } - - void Reset() - { - me->CastSpell(me, SPELL_ELEMENTAL_SPAWN_EFFECT, false); - } - - void JustDied(Unit*) - { - Talk(EMOTE_ALTAR); - } - - void EnterCombat(Unit*) - { - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING) || me->HasUnitState(UNIT_STATE_CHARGING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_ELEMENTAL_HEALTH: - if (me->HealthBelowPct(51)) - { - me->CastSpell(me, SPELL_FACE_ME, true); - me->CastSpell(me, SPELL_SURGE_VISUAL, true); - me->CastSpell(me, SPELL_MERGE, false); - me->DespawnOrUnsummon(2000); - events.Reset(); - break; - } - events.ScheduleEvent(EVENT_ELEMENTAL_HEALTH, 1000); - break; - case EVENT_ELEMENTAL_SURGE: - Talk(SAY_SURGE); + case EVENT_ELEMENTAL_HEALTH: + if (me->HealthBelowPct(51)) + { + me->CastSpell(me, SPELL_FACE_ME, true); me->CastSpell(me, SPELL_SURGE_VISUAL, true); - me->CastSpell(me->GetVictim(), SPELL_SURGE, false); - events.ScheduleEvent(EVENT_ELEMENTAL_SURGE, 15000); + me->CastSpell(me, SPELL_MERGE, false); + me->DespawnOrUnsummon(2000); + events.Reset(); break; - case EVENT_ELEMENTAL_VOLLEY: - me->CastSpell(me, SPELL_MOJO_VOLLEY, true); - break; - } - - - DoMeleeAttackIfReady(); + } + events.ScheduleEvent(EVENT_ELEMENTAL_HEALTH, 1000); + break; + case EVENT_ELEMENTAL_SURGE: + Talk(SAY_SURGE); + me->CastSpell(me, SPELL_SURGE_VISUAL, true); + me->CastSpell(me->GetVictim(), SPELL_SURGE, false); + events.ScheduleEvent(EVENT_ELEMENTAL_SURGE, 15000); + break; + case EVENT_ELEMENTAL_VOLLEY: + me->CastSpell(me, SPELL_MOJO_VOLLEY, true); + break; } - }; + + + DoMeleeAttackIfReady(); + } + }; }; class npc_living_mojo : public CreatureScript { - public: - npc_living_mojo() : CreatureScript("npc_living_mojo") { } +public: + npc_living_mojo() : CreatureScript("npc_living_mojo") { } - CreatureAI* GetAI(Creature* pCreature) const + CreatureAI* GetAI(Creature* pCreature) const + { + return new npc_living_mojoAI (pCreature); + } + + struct npc_living_mojoAI : public ScriptedAI + { + npc_living_mojoAI(Creature* pCreature) : ScriptedAI(pCreature) { - return new npc_living_mojoAI (pCreature); } - struct npc_living_mojoAI : public ScriptedAI + EventMap events; + + void Reset() { - npc_living_mojoAI(Creature* pCreature) : ScriptedAI(pCreature) + events.Reset(); + events.ScheduleEvent(EVENT_MOJO_MOJO_PUDDLE, 13000); + events.ScheduleEvent(EVENT_MOJO_MOJO_WAVE, 15000); + } + + void MoveInLineOfSight(Unit* who) + { + if (me->ToTempSummon()) + return; + + ScriptedAI::MoveInLineOfSight(who); + } + + void AttackStart(Unit* who) + { + if (me->ToTempSummon()) { + if (who->GetTypeId() == TYPEID_PLAYER || IS_PLAYER_GUID(who->GetOwnerGUID())) + if (Unit* summoner = me->ToTempSummon()->GetSummoner()) + summoner->GetAI()->DoAction(ACTION_INFORM); + return; } - EventMap events; + ScriptedAI::AttackStart(who); + } - void Reset() + void DoAction(int32 param) + { + if (param == ACTION_MERGE) { - events.Reset(); - events.ScheduleEvent(EVENT_MOJO_MOJO_PUDDLE, 13000); - events.ScheduleEvent(EVENT_MOJO_MOJO_WAVE, 15000); + me->SetReactState(REACT_PASSIVE); + me->GetMotionMaster()->MoveCharge(1672.96f, 743.488f, 143.338f, 7.0f, POINT_MERGE); + me->DespawnOrUnsummon(1200); } + } - void MoveInLineOfSight(Unit* who) + void UpdateAI(uint32 diff) + { + if (me->ToTempSummon() || !UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) { - if (me->ToTempSummon()) - return; - - ScriptedAI::MoveInLineOfSight(who); - } - - void AttackStart(Unit* who) - { - if (me->ToTempSummon()) - { - if (who->GetTypeId() == TYPEID_PLAYER || IS_PLAYER_GUID(who->GetOwnerGUID())) - if (Unit* summoner = me->ToTempSummon()->GetSummoner()) - summoner->GetAI()->DoAction(ACTION_INFORM); - return; - } - - ScriptedAI::AttackStart(who); - } - - void DoAction(int32 param) - { - if (param == ACTION_MERGE) - { - me->SetReactState(REACT_PASSIVE); - me->GetMotionMaster()->MoveCharge(1672.96f, 743.488f, 143.338f, 7.0f, POINT_MERGE); - me->DespawnOrUnsummon(1200); - } - } - - void UpdateAI(uint32 diff) - { - if (me->ToTempSummon() || !UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_MOJO_MOJO_PUDDLE: + case EVENT_MOJO_MOJO_PUDDLE: { me->CastSpell(me, SPELL_MOJO_PUDDLE, false); events.ScheduleEvent(EVENT_MOJO_MOJO_PUDDLE, 13000); break; } - case EVENT_MOJO_MOJO_WAVE: + case EVENT_MOJO_MOJO_WAVE: { me->CastSpell(me->GetVictim(), SPELL_MOJO_WAVE, false); events.ScheduleEvent(EVENT_MOJO_MOJO_WAVE, 15000); break; } - } - - DoMeleeAttackIfReady(); } - }; + + DoMeleeAttackIfReady(); + } + }; }; class spell_drakkari_colossus_emerge : public SpellScriptLoader { - public: - spell_drakkari_colossus_emerge() : SpellScriptLoader("spell_drakkari_colossus_emerge") { } +public: + spell_drakkari_colossus_emerge() : SpellScriptLoader("spell_drakkari_colossus_emerge") { } - class spell_drakkari_colossus_emerge_SpellScript : public SpellScript + class spell_drakkari_colossus_emerge_SpellScript : public SpellScript + { + PrepareSpellScript(spell_drakkari_colossus_emerge_SpellScript); + + void HandleDummy(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_drakkari_colossus_emerge_SpellScript); - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - GetCaster()->CastSpell(GetCaster(), SPELL_FREEZE_ANIM, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_drakkari_colossus_emerge_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_drakkari_colossus_emerge_SpellScript(); + GetCaster()->CastSpell(GetCaster(), SPELL_FREEZE_ANIM, true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_drakkari_colossus_emerge_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_drakkari_colossus_emerge_SpellScript(); + } }; class spell_drakkari_colossus_surge : public SpellScriptLoader { - public: - spell_drakkari_colossus_surge() : SpellScriptLoader("spell_drakkari_colossus_surge") { } +public: + spell_drakkari_colossus_surge() : SpellScriptLoader("spell_drakkari_colossus_surge") { } - class spell_drakkari_colossus_surge_SpellScript : public SpellScript + class spell_drakkari_colossus_surge_SpellScript : public SpellScript + { + PrepareSpellScript(spell_drakkari_colossus_surge_SpellScript); + + void HandleDummy(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_drakkari_colossus_surge_SpellScript); - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - GetCaster()->CastSpell(target, SPELL_SURGE_DAMAGE, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_drakkari_colossus_surge_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_drakkari_colossus_surge_SpellScript(); + if (Unit* target = GetHitUnit()) + GetCaster()->CastSpell(target, SPELL_SURGE_DAMAGE, true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_drakkari_colossus_surge_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_drakkari_colossus_surge_SpellScript(); + } }; class spell_drakkari_colossus_face_me : public SpellScriptLoader { - public: - spell_drakkari_colossus_face_me() : SpellScriptLoader("spell_drakkari_colossus_face_me") { } +public: + spell_drakkari_colossus_face_me() : SpellScriptLoader("spell_drakkari_colossus_face_me") { } - class spell_drakkari_colossus_face_me_SpellScript : public SpellScript + class spell_drakkari_colossus_face_me_SpellScript : public SpellScript + { + PrepareSpellScript(spell_drakkari_colossus_face_me_SpellScript); + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_drakkari_colossus_face_me_SpellScript); - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) + if (Unit* target = GetHitUnit()) { - if (Unit* target = GetHitUnit()) - { - GetCaster()->SetInFront(target); - GetCaster()->SetFacingTo(GetCaster()->GetAngle(target)); - } + GetCaster()->SetInFront(target); + GetCaster()->SetFacingTo(GetCaster()->GetAngle(target)); } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_drakkari_colossus_face_me_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_drakkari_colossus_face_me_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_drakkari_colossus_face_me_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_drakkari_colossus_face_me_SpellScript(); + } }; void AddSC_boss_drakkari_colossus() diff --git a/src/server/scripts/Northrend/Gundrak/boss_eck.cpp b/src/server/scripts/Northrend/Gundrak/boss_eck.cpp index ea3399d94..46dc71062 100644 --- a/src/server/scripts/Northrend/Gundrak/boss_eck.cpp +++ b/src/server/scripts/Northrend/Gundrak/boss_eck.cpp @@ -27,103 +27,103 @@ enum Misc class boss_eck : public CreatureScript { - public: - boss_eck() : CreatureScript("boss_eck") { } +public: + boss_eck() : CreatureScript("boss_eck") { } - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } + + struct boss_eckAI : public BossAI + { + boss_eckAI(Creature* creature) : BossAI(creature, DATA_ECK_THE_FEROCIOUS) { - return GetInstanceAI(creature); } - struct boss_eckAI : public BossAI + void InitializeAI() { - boss_eckAI(Creature* creature) : BossAI(creature, DATA_ECK_THE_FEROCIOUS) + BossAI::InitializeAI(); + me->GetMotionMaster()->MovePoint(POINT_START, 1638.55f, 919.76f, 104.95f, false); + me->SetHomePosition(1642.712f, 934.646f, 107.205f, 0.767f); + me->SetReactState(REACT_PASSIVE); + } + + void MovementInform(uint32 type, uint32 id) + { + if (type == POINT_MOTION_TYPE && id == POINT_START) { + me->CastSpell(me, SPELL_ECK_SPRING_INIT, true); + me->SetReactState(REACT_AGGRESSIVE); } + } - void InitializeAI() + void Reset() + { + BossAI::Reset(); + } + + void EnterCombat(Unit* who) + { + BossAI::EnterCombat(who); + events.ScheduleEvent(EVENT_ECK_BERSERK, urand(60000, 90000)); + events.ScheduleEvent(EVENT_ECK_BITE, 5000); + events.ScheduleEvent(EVENT_ECK_SPIT, 10000); + events.ScheduleEvent(EVENT_ECK_SPRING, 8000); + } + + void JustDied(Unit* killer) + { + BossAI::JustDied(killer); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) { - BossAI::InitializeAI(); - me->GetMotionMaster()->MovePoint(POINT_START, 1638.55f, 919.76f, 104.95f, false); - me->SetHomePosition(1642.712f, 934.646f, 107.205f, 0.767f); - me->SetReactState(REACT_PASSIVE); - } - - void MovementInform(uint32 type, uint32 id) - { - if (type == POINT_MOTION_TYPE && id == POINT_START) - { - me->CastSpell(me, SPELL_ECK_SPRING_INIT, true); - me->SetReactState(REACT_AGGRESSIVE); - } - } - - void Reset() - { - BossAI::Reset(); - } - - void EnterCombat(Unit* who) - { - BossAI::EnterCombat(who); - events.ScheduleEvent(EVENT_ECK_BERSERK, urand(60000, 90000)); - events.ScheduleEvent(EVENT_ECK_BITE, 5000); - events.ScheduleEvent(EVENT_ECK_SPIT, 10000); - events.ScheduleEvent(EVENT_ECK_SPRING, 8000); - } - - void JustDied(Unit* killer) - { - BossAI::JustDied(killer); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_ECK_HEALTH: - if (me->HealthBelowPct(21)) - { - events.CancelEvent(EVENT_ECK_BERSERK); - me->CastSpell(me, SPELL_ECK_BERSERK, false); - break; - } - events.ScheduleEvent(EVENT_ECK_HEALTH, 1000); - break; - case EVENT_ECK_BERSERK: + case EVENT_ECK_HEALTH: + if (me->HealthBelowPct(21)) + { + events.CancelEvent(EVENT_ECK_BERSERK); me->CastSpell(me, SPELL_ECK_BERSERK, false); - events.CancelEvent(EVENT_ECK_HEALTH); break; - case EVENT_ECK_BITE: - me->CastSpell(me->GetVictim(), SPELL_ECK_BITE, false); - events.ScheduleEvent(EVENT_ECK_BITE, urand(8000, 12000)); - break; - case EVENT_ECK_SPIT: - me->CastSpell(me->GetVictim(), SPELL_ECK_SPIT, false); - events.ScheduleEvent(EVENT_ECK_SPIT, 10000); - break; - case EVENT_ECK_SPRING: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 30.0f, true)) - { - me->getThreatManager().resetAllAggro(); - me->AddThreat(target, 500.0f); - me->CastSpell(target, SPELL_ECK_SPRING, false); - } + } + events.ScheduleEvent(EVENT_ECK_HEALTH, 1000); + break; + case EVENT_ECK_BERSERK: + me->CastSpell(me, SPELL_ECK_BERSERK, false); + events.CancelEvent(EVENT_ECK_HEALTH); + break; + case EVENT_ECK_BITE: + me->CastSpell(me->GetVictim(), SPELL_ECK_BITE, false); + events.ScheduleEvent(EVENT_ECK_BITE, urand(8000, 12000)); + break; + case EVENT_ECK_SPIT: + me->CastSpell(me->GetVictim(), SPELL_ECK_SPIT, false); + events.ScheduleEvent(EVENT_ECK_SPIT, 10000); + break; + case EVENT_ECK_SPRING: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 30.0f, true)) + { + me->getThreatManager().resetAllAggro(); + me->AddThreat(target, 500.0f); + me->CastSpell(target, SPELL_ECK_SPRING, false); + } - events.ScheduleEvent(EVENT_ECK_SPRING, urand(5000, 10000)); - break; - } - - DoMeleeAttackIfReady(); + events.ScheduleEvent(EVENT_ECK_SPRING, urand(5000, 10000)); + break; } - }; + + DoMeleeAttackIfReady(); + } + }; }; void AddSC_boss_eck() diff --git a/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp b/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp index e99cd9434..e6a4fc895 100644 --- a/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp +++ b/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp @@ -45,233 +45,233 @@ enum Events class boss_gal_darah : public CreatureScript { - public: - boss_gal_darah() : CreatureScript("boss_gal_darah") { } +public: + boss_gal_darah() : CreatureScript("boss_gal_darah") { } - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } + + struct boss_gal_darahAI : public BossAI + { + boss_gal_darahAI(Creature* creature) : BossAI(creature, DATA_GAL_DARAH) { - return GetInstanceAI(creature); } - struct boss_gal_darahAI : public BossAI + uint8 phaseCounter; + std::set impaledList; + + void Reset() { - boss_gal_darahAI(Creature* creature) : BossAI(creature, DATA_GAL_DARAH) + BossAI::Reset(); + impaledList.clear(); + phaseCounter = 0; + } + + void InitializeAI() + { + BossAI::InitializeAI(); + me->CastSpell(me, SPELL_START_VISUAL, false); + } + + void JustReachedHome() + { + BossAI::JustReachedHome(); + me->CastSpell(me, SPELL_START_VISUAL, false); + } + + void ScheduleEvents(bool troll) + { + events.Reset(); + if (troll) { + events.RescheduleEvent(EVENT_STAMPEDE, 10000); + events.RescheduleEvent(EVENT_WHIRLING_SLASH, 21000); + } + else + { + events.RescheduleEvent(EVENT_PUNCTURE, 10000); + events.RescheduleEvent(EVENT_ENRAGE, 15000); + events.RescheduleEvent(EVENT_IMPALING_CHARGE, 21000); + events.RescheduleEvent(EVENT_STOMP, 5000); + } + } + + void EnterCombat(Unit* who) + { + Talk(SAY_AGGRO); + BossAI::EnterCombat(who); + + ScheduleEvents(true); + me->RemoveAurasDueToSpell(SPELL_START_VISUAL); + me->InterruptNonMeleeSpells(true); + } + + void JustSummoned(Creature* summon) + { + uint32 despawnTime = 0; + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 60.0f, true)) + { + summon->CastSpell(target, SPELL_STAMPEDE_DMG, true); + despawnTime = (summon->GetDistance(target) / 40.0f * 1000) + 500; } - uint8 phaseCounter; - std::set impaledList; + summon->DespawnOrUnsummon(despawnTime); + } - void Reset() + uint32 GetData(uint32 /*type*/) const + { + return impaledList.size(); + } + + void JustDied(Unit* killer) + { + Talk(SAY_DEATH); + BossAI::JustDied(killer); + } + + void KilledUnit(Unit*) + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) { - BossAI::Reset(); - impaledList.clear(); - phaseCounter = 0; + Talk(SAY_SLAY); + events.ScheduleEvent(EVENT_KILL_TALK, 6000); + } + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING | UNIT_STATE_CHARGING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_STAMPEDE: + Talk(SAY_SUMMON_RHINO); + me->CastSpell(me->GetVictim(), SPELL_STAMPEDE, false); + events.ScheduleEvent(EVENT_STAMPEDE, 15000); + break; + case EVENT_WHIRLING_SLASH: + if (++phaseCounter >= 3) + { + ScheduleEvents(false); + me->CastSpell(me, SPELL_TRANSFORM_TO_RHINO, false); + Talk(SAY_TRANSFORM_1); + phaseCounter = 0; + return; + } + events.ScheduleEvent(EVENT_WHIRLING_SLASH, 21000); + me->CastSpell(me, SPELL_WHIRLING_SLASH, false); + break; + case EVENT_PUNCTURE: + me->CastSpell(me->GetVictim(), SPELL_PUNCTURE, false); + events.ScheduleEvent(EVENT_PUNCTURE, 8000); + break; + case EVENT_ENRAGE: + me->CastSpell(me, SPELL_ENRAGE, false); + events.ScheduleEvent(EVENT_ENRAGE, 20000); + break; + case EVENT_STOMP: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true)) + me->CastSpell(target, SPELL_STOMP, false); + events.ScheduleEvent(EVENT_STOMP, 20000); + break; + case EVENT_IMPALING_CHARGE: + if (++phaseCounter >= 3) + { + ScheduleEvents(true); + me->CastSpell(me, SPELL_TRANSFORM_TO_TROLL, false); + Talk(SAY_TRANSFORM_2); + phaseCounter = 0; + return; + } + events.ScheduleEvent(EVENT_IMPALING_CHARGE, 21000); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100.0f, true)) + { + me->CastSpell(target, SPELL_IMPALING_CHARGE, false); + impaledList.insert(target->GetGUID()); + } + break; } - void InitializeAI() - { - BossAI::InitializeAI(); - me->CastSpell(me, SPELL_START_VISUAL, false); - } - - void JustReachedHome() - { - BossAI::JustReachedHome(); - me->CastSpell(me, SPELL_START_VISUAL, false); - } - - void ScheduleEvents(bool troll) - { - events.Reset(); - if (troll) - { - events.RescheduleEvent(EVENT_STAMPEDE, 10000); - events.RescheduleEvent(EVENT_WHIRLING_SLASH, 21000); - } - else - { - events.RescheduleEvent(EVENT_PUNCTURE, 10000); - events.RescheduleEvent(EVENT_ENRAGE, 15000); - events.RescheduleEvent(EVENT_IMPALING_CHARGE, 21000); - events.RescheduleEvent(EVENT_STOMP, 5000); - } - } - - void EnterCombat(Unit* who) - { - Talk(SAY_AGGRO); - BossAI::EnterCombat(who); - - ScheduleEvents(true); - me->RemoveAurasDueToSpell(SPELL_START_VISUAL); - me->InterruptNonMeleeSpells(true); - } - - void JustSummoned(Creature* summon) - { - uint32 despawnTime = 0; - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 60.0f, true)) - { - summon->CastSpell(target, SPELL_STAMPEDE_DMG, true); - despawnTime = (summon->GetDistance(target)/40.0f*1000)+500; - } - - summon->DespawnOrUnsummon(despawnTime); - } - - uint32 GetData(uint32 /*type*/) const - { - return impaledList.size(); - } - - void JustDied(Unit* killer) - { - Talk(SAY_DEATH); - BossAI::JustDied(killer); - } - - void KilledUnit(Unit*) - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(SAY_SLAY); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); - } - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING|UNIT_STATE_CHARGING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_STAMPEDE: - Talk(SAY_SUMMON_RHINO); - me->CastSpell(me->GetVictim(), SPELL_STAMPEDE, false); - events.ScheduleEvent(EVENT_STAMPEDE, 15000); - break; - case EVENT_WHIRLING_SLASH: - if (++phaseCounter >= 3) - { - ScheduleEvents(false); - me->CastSpell(me, SPELL_TRANSFORM_TO_RHINO, false); - Talk(SAY_TRANSFORM_1); - phaseCounter = 0; - return; - } - events.ScheduleEvent(EVENT_WHIRLING_SLASH, 21000); - me->CastSpell(me, SPELL_WHIRLING_SLASH, false); - break; - case EVENT_PUNCTURE: - me->CastSpell(me->GetVictim(), SPELL_PUNCTURE, false); - events.ScheduleEvent(EVENT_PUNCTURE, 8000); - break; - case EVENT_ENRAGE: - me->CastSpell(me, SPELL_ENRAGE, false); - events.ScheduleEvent(EVENT_ENRAGE, 20000); - break; - case EVENT_STOMP: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true)) - me->CastSpell(target, SPELL_STOMP, false); - events.ScheduleEvent(EVENT_STOMP, 20000); - break; - case EVENT_IMPALING_CHARGE: - if (++phaseCounter >= 3) - { - ScheduleEvents(true); - me->CastSpell(me, SPELL_TRANSFORM_TO_TROLL, false); - Talk(SAY_TRANSFORM_2); - phaseCounter = 0; - return; - } - events.ScheduleEvent(EVENT_IMPALING_CHARGE, 21000); - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100.0f, true)) - { - me->CastSpell(target, SPELL_IMPALING_CHARGE, false); - impaledList.insert(target->GetGUID()); - } - break; - } - - DoMeleeAttackIfReady(); - } - }; + DoMeleeAttackIfReady(); + } + }; }; class spell_galdarah_impaling_charge : public SpellScriptLoader { - public: - spell_galdarah_impaling_charge() : SpellScriptLoader("spell_galdarah_impaling_charge") { } +public: + spell_galdarah_impaling_charge() : SpellScriptLoader("spell_galdarah_impaling_charge") { } - class spell_galdarah_impaling_charge_SpellScript : public SpellScript + class spell_galdarah_impaling_charge_SpellScript : public SpellScript + { + PrepareSpellScript(spell_galdarah_impaling_charge_SpellScript); + + void HandleApplyAura(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_galdarah_impaling_charge_SpellScript); - - void HandleApplyAura(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - target->CastSpell(GetCaster(), SPELL_IMPALING_CHARGE_VEHICLE, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_galdarah_impaling_charge_SpellScript::HandleApplyAura, EFFECT_1, SPELL_EFFECT_APPLY_AURA); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_galdarah_impaling_charge_SpellScript(); + if (Unit* target = GetHitUnit()) + target->CastSpell(GetCaster(), SPELL_IMPALING_CHARGE_VEHICLE, true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_galdarah_impaling_charge_SpellScript::HandleApplyAura, EFFECT_1, SPELL_EFFECT_APPLY_AURA); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_galdarah_impaling_charge_SpellScript(); + } }; class spell_galdarah_transform : public SpellScriptLoader { - public: - spell_galdarah_transform() : SpellScriptLoader("spell_galdarah_transform") { } +public: + spell_galdarah_transform() : SpellScriptLoader("spell_galdarah_transform") { } - class spell_galdarah_transform_SpellScript : public SpellScript + class spell_galdarah_transform_SpellScript : public SpellScript + { + PrepareSpellScript(spell_galdarah_transform_SpellScript); + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_galdarah_transform_SpellScript); - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - target->RemoveAurasDueToSpell(SPELL_TRANSFORM_TO_RHINO); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_galdarah_transform_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_galdarah_transform_SpellScript(); + if (Unit* target = GetHitUnit()) + target->RemoveAurasDueToSpell(SPELL_TRANSFORM_TO_RHINO); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_galdarah_transform_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_galdarah_transform_SpellScript(); + } }; class achievement_share_the_love : public AchievementCriteriaScript { - public: - achievement_share_the_love() : AchievementCriteriaScript("achievement_share_the_love") - { - } +public: + achievement_share_the_love() : AchievementCriteriaScript("achievement_share_the_love") + { + } - bool OnCheck(Player* /*player*/, Unit* target) - { - if (!target) - return false; + bool OnCheck(Player* /*player*/, Unit* target) + { + if (!target) + return false; - return target->GetAI()->GetData(target->GetEntry()) >= 5; - } + return target->GetAI()->GetData(target->GetEntry()) >= 5; + } }; void AddSC_boss_gal_darah() diff --git a/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp b/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp index beb4a70ee..9fffef19c 100644 --- a/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp +++ b/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp @@ -45,158 +45,158 @@ enum Events class boss_moorabi : public CreatureScript { - public: - boss_moorabi() : CreatureScript("boss_moorabi") { } +public: + boss_moorabi() : CreatureScript("boss_moorabi") { } - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } + + struct boss_moorabiAI : public BossAI + { + boss_moorabiAI(Creature* creature) : BossAI(creature, DATA_MOORABI) { - return GetInstanceAI(creature); } - struct boss_moorabiAI : public BossAI + EventMap events2; + + void Reset() { - boss_moorabiAI(Creature* creature) : BossAI(creature, DATA_MOORABI) + BossAI::Reset(); + events2.Reset(); + events2.ScheduleEvent(EVENT_PHANTOM, 21000); + } + + void EnterCombat(Unit* who) + { + Talk(SAY_AGGRO); + BossAI::EnterCombat(who); + me->CastSpell(me, SPELL_MOJO_FRENZY, true); + + events.ScheduleEvent(EVENT_GROUND_TREMOR, 18000); + events.ScheduleEvent(EVENT_NUMBLING_SHOUT, 10000); + events.ScheduleEvent(EVENT_DETERMINED_STAB, 20000); + events.ScheduleEvent(EVENT_TRANSFORMATION, 12000); + } + + void SpellHitTarget(Unit* /*caster*/, const SpellInfo* spellInfo) + { + if (spellInfo->Id == SPELL_TRANSFORMATION) { + me->RemoveAurasDueToSpell(SPELL_MOJO_FRENZY); + events.CancelEvent(EVENT_TRANSFORMATION); + Talk(EMOTE_TRANSFORMED); } + } - EventMap events2; + void JustDied(Unit* killer) + { + Talk(SAY_DEATH); + Talk(EMOTE_ALTAR); + BossAI::JustDied(killer); + } - void Reset() + void KilledUnit(Unit*) + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) { - BossAI::Reset(); - events2.Reset(); - events2.ScheduleEvent(EVENT_PHANTOM, 21000); + Talk(SAY_SLAY); + events.ScheduleEvent(EVENT_KILL_TALK, 6000); } + } - void EnterCombat(Unit* who) + void UpdateAI(uint32 diff) + { + if (!me->IsInCombat()) { - Talk(SAY_AGGRO); - BossAI::EnterCombat(who); - me->CastSpell(me, SPELL_MOJO_FRENZY, true); - - events.ScheduleEvent(EVENT_GROUND_TREMOR, 18000); - events.ScheduleEvent(EVENT_NUMBLING_SHOUT, 10000); - events.ScheduleEvent(EVENT_DETERMINED_STAB, 20000); - events.ScheduleEvent(EVENT_TRANSFORMATION, 12000); - } - - void SpellHitTarget(Unit* /*caster*/, const SpellInfo* spellInfo) - { - if (spellInfo->Id == SPELL_TRANSFORMATION) + events2.Update(diff); + if (events2.ExecuteEvent() == EVENT_PHANTOM) { - me->RemoveAurasDueToSpell(SPELL_MOJO_FRENZY); - events.CancelEvent(EVENT_TRANSFORMATION); - Talk(EMOTE_TRANSFORMED); + me->CastSpell(me, SPELL_SUMMON_PHANTOM, true); + events2.ScheduleEvent(EVENT_PHANTOM, urand(20000, 25000)); } } - void JustDied(Unit* killer) - { - Talk(SAY_DEATH); - Talk(EMOTE_ALTAR); - BossAI::JustDied(killer); - } - - void KilledUnit(Unit*) - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(SAY_SLAY); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); - } - } - - void UpdateAI(uint32 diff) - { - if (!me->IsInCombat()) - { - events2.Update(diff); - if (events2.ExecuteEvent() == EVENT_PHANTOM) - { - me->CastSpell(me, SPELL_SUMMON_PHANTOM, true); - events2.ScheduleEvent(EVENT_PHANTOM, urand(20000, 25000)); - } - } - - if (!UpdateVictim()) + if (!UpdateVictim()) return; - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - switch (events.ExecuteEvent()) - { - case EVENT_GROUND_TREMOR: - if (roll_chance_i(50)) - Talk(SAY_QUAKE); - me->CastSpell(me, me->GetDisplayId() != me->GetNativeDisplayId() ? SPELL_QUAKE : SPELL_GROUND_TREMOR, false); - events.ScheduleEvent(EVENT_GROUND_TREMOR, 10000); - break; - case EVENT_NUMBLING_SHOUT: - me->CastSpell(me, me->GetDisplayId() != me->GetNativeDisplayId() ? SPELL_NUMBING_ROAR : SPELL_NUMBING_SHOUT, false); - events.ScheduleEvent(EVENT_NUMBLING_SHOUT, 10000); - break; - case EVENT_DETERMINED_STAB: - me->CastSpell(me->GetVictim(), me->GetDisplayId() != me->GetNativeDisplayId() ? SPELL_DETERMINED_GORE : SPELL_DETERMINED_STAB, false); - events.ScheduleEvent(EVENT_DETERMINED_STAB, 8000); - break; - case EVENT_TRANSFORMATION: - Talk(EMOTE_TRANSFORM); - Talk(SAY_TRANSFORM); - me->CastSpell(me, SPELL_TRANSFORMATION, false); - me->CastSpell(me,SPELL_SUMMON_PHANTOM_TRANSFORM, true); - events.ScheduleEvent(EVENT_TRANSFORMATION, 10000); - break; - } - - DoMeleeAttackIfReady(); + switch (events.ExecuteEvent()) + { + case EVENT_GROUND_TREMOR: + if (roll_chance_i(50)) + Talk(SAY_QUAKE); + me->CastSpell(me, me->GetDisplayId() != me->GetNativeDisplayId() ? SPELL_QUAKE : SPELL_GROUND_TREMOR, false); + events.ScheduleEvent(EVENT_GROUND_TREMOR, 10000); + break; + case EVENT_NUMBLING_SHOUT: + me->CastSpell(me, me->GetDisplayId() != me->GetNativeDisplayId() ? SPELL_NUMBING_ROAR : SPELL_NUMBING_SHOUT, false); + events.ScheduleEvent(EVENT_NUMBLING_SHOUT, 10000); + break; + case EVENT_DETERMINED_STAB: + me->CastSpell(me->GetVictim(), me->GetDisplayId() != me->GetNativeDisplayId() ? SPELL_DETERMINED_GORE : SPELL_DETERMINED_STAB, false); + events.ScheduleEvent(EVENT_DETERMINED_STAB, 8000); + break; + case EVENT_TRANSFORMATION: + Talk(EMOTE_TRANSFORM); + Talk(SAY_TRANSFORM); + me->CastSpell(me, SPELL_TRANSFORMATION, false); + me->CastSpell(me, SPELL_SUMMON_PHANTOM_TRANSFORM, true); + events.ScheduleEvent(EVENT_TRANSFORMATION, 10000); + break; } - }; + + DoMeleeAttackIfReady(); + } + }; }; class spell_moorabi_mojo_frenzy : public SpellScriptLoader { - public: - spell_moorabi_mojo_frenzy() : SpellScriptLoader("spell_moorabi_mojo_frenzy") { } +public: + spell_moorabi_mojo_frenzy() : SpellScriptLoader("spell_moorabi_mojo_frenzy") { } - class spell_moorabi_mojo_frenzy_AuraScript : public AuraScript + class spell_moorabi_mojo_frenzy_AuraScript : public AuraScript + { + PrepareAuraScript(spell_moorabi_mojo_frenzy_AuraScript); + + void HandlePeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_moorabi_mojo_frenzy_AuraScript); + PreventDefaultAction(); - void HandlePeriodic(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - - if (GetUnitOwner()->GetMap()->IsHeroic()) - GetUnitOwner()->SetFloatValue(UNIT_MOD_CAST_SPEED, 1.0f * (GetUnitOwner()->GetHealthPct()*GetUnitOwner()->GetHealthPct()/10000.0f)); - else - GetUnitOwner()->SetFloatValue(UNIT_MOD_CAST_SPEED, 1.0f * (GetUnitOwner()->GetHealthPct()/100.0f)); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_moorabi_mojo_frenzy_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_moorabi_mojo_frenzy_AuraScript(); + if (GetUnitOwner()->GetMap()->IsHeroic()) + GetUnitOwner()->SetFloatValue(UNIT_MOD_CAST_SPEED, 1.0f * (GetUnitOwner()->GetHealthPct()*GetUnitOwner()->GetHealthPct() / 10000.0f)); + else + GetUnitOwner()->SetFloatValue(UNIT_MOD_CAST_SPEED, 1.0f * (GetUnitOwner()->GetHealthPct() / 100.0f)); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_moorabi_mojo_frenzy_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_moorabi_mojo_frenzy_AuraScript(); + } }; class achievement_less_rabi : public AchievementCriteriaScript { - public: - achievement_less_rabi() : AchievementCriteriaScript("achievement_less_rabi") - { - } +public: + achievement_less_rabi() : AchievementCriteriaScript("achievement_less_rabi") + { + } - bool OnCheck(Player* /*player*/, Unit* target) - { - return target && target->GetDisplayId() == target->GetNativeDisplayId(); - } + bool OnCheck(Player* /*player*/, Unit* target) + { + return target && target->GetDisplayId() == target->GetNativeDisplayId(); + } }; void AddSC_boss_moorabi() diff --git a/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp b/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp index 34a36969b..1928e445f 100644 --- a/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp +++ b/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp @@ -45,191 +45,191 @@ enum Misc EVENT_KILL_TALK = 8 }; -const Position SpawnLoc[]= +const Position SpawnLoc[] = { - {1783.81f, 646.637f, 133.948f, 3.71755f}, - {1775.03f, 606.586f, 134.165f, 1.43117f}, - {1765.66f, 646.542f, 134.02f, 5.11381f}, - {1717.39f, 630.041f, 129.282f, 5.96903f}, - {1716.76f, 635.159f, 129.282f, 0.191986f} + {1783.81f, 646.637f, 133.948f, 3.71755f}, + {1775.03f, 606.586f, 134.165f, 1.43117f}, + {1765.66f, 646.542f, 134.02f, 5.11381f}, + {1717.39f, 630.041f, 129.282f, 5.96903f}, + {1716.76f, 635.159f, 129.282f, 0.191986f} }; class boss_slad_ran : public CreatureScript { - public: - boss_slad_ran() : CreatureScript("boss_slad_ran") { } +public: + boss_slad_ran() : CreatureScript("boss_slad_ran") { } - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const + { + return new boss_slad_ranAI(creature); + } + + struct boss_slad_ranAI : public BossAI + { + boss_slad_ranAI(Creature* creature) : BossAI(creature, DATA_SLAD_RAN) { - return new boss_slad_ranAI(creature); } - struct boss_slad_ranAI : public BossAI + void Reset() { - boss_slad_ranAI(Creature* creature) : BossAI(creature, DATA_SLAD_RAN) + BossAI::Reset(); + _achievement = true; + } + + uint32 GetData(uint32 data) const + { + if (data == me->GetEntry()) + return uint32(_achievement); + return 0; + } + + void SetData(uint32 data, uint32) + { + if (data == me->GetEntry()) + _achievement = false; + } + + void EnterCombat(Unit* who) + { + Talk(SAY_AGGRO); + BossAI::EnterCombat(who); + + events.ScheduleEvent(EVENT_POISON_NOVA, 10000); + events.ScheduleEvent(EVENT_POWERFULL_BITE, 3000); + events.ScheduleEvent(EVENT_VENOM_BOLT, 15000); + events.ScheduleEvent(EVENT_CHECK_HEALTH1, 1000); + events.ScheduleEvent(EVENT_CHECK_HEALTH2, 1000); + } + + void JustDied(Unit* killer) + { + Talk(SAY_DEATH); + Talk(EMOTE_ALTAR); + BossAI::JustDied(killer); + } + + void KilledUnit(Unit*) + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) { + Talk(SAY_SLAY); + events.ScheduleEvent(EVENT_KILL_TALK, 6000); } + } - void Reset() + void JustSummoned(Creature* summon) + { + summon->SetInCombatWithZone(); + summons.Summon(summon); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) { - BossAI::Reset(); - _achievement = true; - } - - uint32 GetData(uint32 data) const - { - if (data == me->GetEntry()) - return uint32(_achievement); - return 0; - } - - void SetData(uint32 data, uint32) - { - if (data == me->GetEntry()) - _achievement = false; - } - - void EnterCombat(Unit* who) - { - Talk(SAY_AGGRO); - BossAI::EnterCombat(who); - - events.ScheduleEvent(EVENT_POISON_NOVA, 10000); - events.ScheduleEvent(EVENT_POWERFULL_BITE, 3000); - events.ScheduleEvent(EVENT_VENOM_BOLT, 15000); - events.ScheduleEvent(EVENT_CHECK_HEALTH1, 1000); - events.ScheduleEvent(EVENT_CHECK_HEALTH2, 1000); - } - - void JustDied(Unit* killer) - { - Talk(SAY_DEATH); - Talk(EMOTE_ALTAR); - BossAI::JustDied(killer); - } - - void KilledUnit(Unit*) - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(SAY_SLAY); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); - } - } - - void JustSummoned(Creature* summon) - { - summon->SetInCombatWithZone(); - summons.Summon(summon); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_CHECK_HEALTH1: - if (me->HealthBelowPct(70)) - { - Talk(SAY_SUMMON_SNAKES); - events.ScheduleEvent(EVENT_SUMMON1, 1000); - break; - } - events.ScheduleEvent(EVENT_CHECK_HEALTH1, 1000); + case EVENT_CHECK_HEALTH1: + if (me->HealthBelowPct(70)) + { + Talk(SAY_SUMMON_SNAKES); + events.ScheduleEvent(EVENT_SUMMON1, 1000); break; - case EVENT_CHECK_HEALTH2: - if (me->HealthBelowPct(50)) - { - Talk(SAY_SUMMON_CONSTRICTORS); - events.ScheduleEvent(EVENT_SUMMON2, 1000); - break; - } - events.ScheduleEvent(EVENT_CHECK_HEALTH2, 1000); + } + events.ScheduleEvent(EVENT_CHECK_HEALTH1, 1000); + break; + case EVENT_CHECK_HEALTH2: + if (me->HealthBelowPct(50)) + { + Talk(SAY_SUMMON_CONSTRICTORS); + events.ScheduleEvent(EVENT_SUMMON2, 1000); break; - case EVENT_POISON_NOVA: - Talk(EMOTE_NOVA); - me->CastSpell(me, SPELL_POISON_NOVA, false); - events.ScheduleEvent(EVENT_POISON_NOVA, 15000); - break; - case EVENT_POWERFULL_BITE: - me->CastSpell(me->GetVictim(), SPELL_POWERFULL_BITE, false); - events.ScheduleEvent(EVENT_POWERFULL_BITE, 10000); - break; - case EVENT_VENOM_BOLT: - me->CastSpell(me->GetVictim(), SPELL_VENOM_BOLT, false); - events.ScheduleEvent(EVENT_VENOM_BOLT, 10000); - break; - case EVENT_SUMMON1: - for (uint8 i = MAX_CONSTRICTOR; i < MAX_SUMMONS; ++i) - me->SummonCreature(NPC_SLADRAN_VIPER, SpawnLoc[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20*IN_MILLISECONDS); - events.ScheduleEvent(EVENT_SUMMON1, 8000); - break; - case EVENT_SUMMON2: - for (uint8 i = 0; i < MAX_CONSTRICTOR; ++i) - me->SummonCreature(NPC_SLADRAN_CONSTRICTORS, SpawnLoc[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20*IN_MILLISECONDS); - events.ScheduleEvent(EVENT_SUMMON2, urand(3000, 5000)); - break; - } - - DoMeleeAttackIfReady(); + } + events.ScheduleEvent(EVENT_CHECK_HEALTH2, 1000); + break; + case EVENT_POISON_NOVA: + Talk(EMOTE_NOVA); + me->CastSpell(me, SPELL_POISON_NOVA, false); + events.ScheduleEvent(EVENT_POISON_NOVA, 15000); + break; + case EVENT_POWERFULL_BITE: + me->CastSpell(me->GetVictim(), SPELL_POWERFULL_BITE, false); + events.ScheduleEvent(EVENT_POWERFULL_BITE, 10000); + break; + case EVENT_VENOM_BOLT: + me->CastSpell(me->GetVictim(), SPELL_VENOM_BOLT, false); + events.ScheduleEvent(EVENT_VENOM_BOLT, 10000); + break; + case EVENT_SUMMON1: + for (uint8 i = MAX_CONSTRICTOR; i < MAX_SUMMONS; ++i) + me->SummonCreature(NPC_SLADRAN_VIPER, SpawnLoc[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20 * IN_MILLISECONDS); + events.ScheduleEvent(EVENT_SUMMON1, 8000); + break; + case EVENT_SUMMON2: + for (uint8 i = 0; i < MAX_CONSTRICTOR; ++i) + me->SummonCreature(NPC_SLADRAN_CONSTRICTORS, SpawnLoc[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20 * IN_MILLISECONDS); + events.ScheduleEvent(EVENT_SUMMON2, urand(3000, 5000)); + break; } - private: - bool _achievement; - }; + DoMeleeAttackIfReady(); + } + + private: + bool _achievement; + }; }; class spell_sladran_grip_of_sladran : public SpellScriptLoader { - public: - spell_sladran_grip_of_sladran() : SpellScriptLoader("spell_sladran_grip_of_sladran") { } +public: + spell_sladran_grip_of_sladran() : SpellScriptLoader("spell_sladran_grip_of_sladran") { } - class spell_sladran_grip_of_sladran_AuraScript : public AuraScript + class spell_sladran_grip_of_sladran_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sladran_grip_of_sladran_AuraScript); + + void HandlePeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_sladran_grip_of_sladran_AuraScript); - - void HandlePeriodic(AuraEffect const* /*aurEff*/) + PreventDefaultAction(); + if (GetStackAmount() >= 5) { - PreventDefaultAction(); - if (GetStackAmount() >= 5) - { - SetDuration(0); - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SNAKE_WRAP, true); - } + SetDuration(0); + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SNAKE_WRAP, true); } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_sladran_grip_of_sladran_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_sladran_grip_of_sladran_AuraScript(); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_sladran_grip_of_sladran_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_sladran_grip_of_sladran_AuraScript(); + } }; class achievement_snakes_whyd_it_have_to_be_snakes : public AchievementCriteriaScript { - public: - achievement_snakes_whyd_it_have_to_be_snakes() : AchievementCriteriaScript("achievement_snakes_whyd_it_have_to_be_snakes") - { - } +public: + achievement_snakes_whyd_it_have_to_be_snakes() : AchievementCriteriaScript("achievement_snakes_whyd_it_have_to_be_snakes") + { + } - bool OnCheck(Player* /*player*/, Unit* target) - { - if (!target) - return false; + bool OnCheck(Player* /*player*/, Unit* target) + { + if (!target) + return false; - return target->GetAI()->GetData(target->GetEntry()); - } + return target->GetAI()->GetData(target->GetEntry()); + } }; void AddSC_boss_slad_ran() diff --git a/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp index 920bf184b..08c014c9b 100644 --- a/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp +++ b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp @@ -18,219 +18,219 @@ DoorData const doorData[] = class instance_gundrak : public InstanceMapScript { - public: - instance_gundrak() : InstanceMapScript("instance_gundrak", 604) { } +public: + instance_gundrak() : InstanceMapScript("instance_gundrak", 604) { } - InstanceScript* GetInstanceScript(InstanceMap* pMap) const + InstanceScript* GetInstanceScript(InstanceMap* pMap) const + { + return new instance_gundrak_InstanceMapScript(pMap); + } + + struct instance_gundrak_InstanceMapScript : public InstanceScript + { + instance_gundrak_InstanceMapScript(Map* map) : InstanceScript(map) { - return new instance_gundrak_InstanceMapScript(pMap); } - struct instance_gundrak_InstanceMapScript : public InstanceScript + uint64 _sladRanAltarGUID; + uint64 _moorabiAltarGUID; + uint64 _drakkariAltarGUID; + uint64 _bridgeGUIDs[6]; + uint32 _keysInCount; + uint32 _activateTimer; + + void Initialize() { - instance_gundrak_InstanceMapScript(Map* map) : InstanceScript(map) + SetBossNumber(MAX_ENCOUNTERS); + LoadDoorData(doorData); + + _sladRanAltarGUID = 0; + _moorabiAltarGUID = 0; + _drakkariAltarGUID = 0; + _keysInCount = 0; + _activateTimer = 0; + memset(&_bridgeGUIDs, 0, sizeof(_bridgeGUIDs)); + } + + void OnGameObjectCreate(GameObject* gameobject) + { + switch (gameobject->GetEntry()) { + case GO_ALTAR_OF_SLAD_RAN: + _sladRanAltarGUID = gameobject->GetGUID(); + gameobject->SetGoState(GetBossState(DATA_SLAD_RAN) == DONE ? GO_STATE_ACTIVE : GO_STATE_READY); + break; + case GO_ALTAR_OF_DRAKKARI: + _drakkariAltarGUID = gameobject->GetGUID(); + gameobject->SetGoState(GetBossState(DATA_DRAKKARI_COLOSSUS) == DONE ? GO_STATE_ACTIVE : GO_STATE_READY); + break; + case GO_ALTAR_OF_MOORABI: + _moorabiAltarGUID = gameobject->GetGUID(); + gameobject->SetGoState(GetBossState(DATA_MOORABI) == DONE ? GO_STATE_ACTIVE : GO_STATE_READY); + break; + case GO_STATUE_OF_SLAD_RAN: + _bridgeGUIDs[0] = gameobject->GetGUID(); + gameobject->SetGoState(_keysInCount == 3 ? GO_STATE_ACTIVE_ALTERNATIVE : (GetBossState(DATA_SLAD_RAN) == DONE ? GO_STATE_READY : GO_STATE_ACTIVE)); + break; + case GO_STATUE_OF_DRAKKARI: + _bridgeGUIDs[1] = gameobject->GetGUID(); + gameobject->SetGoState(_keysInCount == 3 ? GO_STATE_ACTIVE_ALTERNATIVE : (GetBossState(DATA_DRAKKARI_COLOSSUS) == DONE ? GO_STATE_READY : GO_STATE_ACTIVE)); + break; + case GO_STATUE_OF_MOORABI: + _bridgeGUIDs[2] = gameobject->GetGUID(); + gameobject->SetGoState(_keysInCount == 3 ? GO_STATE_ACTIVE_ALTERNATIVE : (GetBossState(DATA_MOORABI) == DONE ? GO_STATE_READY : GO_STATE_ACTIVE)); + break; + case GO_STATUE_OF_GAL_DARAH: + _bridgeGUIDs[3] = gameobject->GetGUID(); + gameobject->SetGoState(_keysInCount == 3 ? GO_STATE_ACTIVE_ALTERNATIVE : GO_STATE_READY); + break; + case GO_GUNDRAK_COLLISION: + _bridgeGUIDs[4] = gameobject->GetGUID(); + gameobject->SetGoState(_keysInCount == 3 ? GO_STATE_ACTIVE_ALTERNATIVE : GO_STATE_READY); + break; + case GO_GUNDRAK_BRIDGE: + _bridgeGUIDs[5] = gameobject->GetGUID(); + gameobject->SetGoState(GO_STATE_READY); + break; + case GO_ECK_DOORS: + case GO_ECK_UNDERWATER_GATE: + case GO_GAL_DARAH_DOORS0: + case GO_GAL_DARAH_DOORS1: + case GO_GAL_DARAH_DOORS2: + AddDoor(gameobject, true); + break; + } + } + + void OnGameObjectRemove(GameObject* gameobject) + { + switch (gameobject->GetEntry()) + { + case GO_ECK_DOORS: + case GO_ECK_UNDERWATER_GATE: + case GO_GAL_DARAH_DOORS0: + case GO_GAL_DARAH_DOORS1: + case GO_GAL_DARAH_DOORS2: + AddDoor(gameobject, false); + break; + } + } + + void SetData(uint32 type, uint32) + { + switch (type) + { + case NPC_ECK_THE_FEROCIOUS: + if (GetBossState(DATA_ECK_THE_FEROCIOUS_INIT) != DONE) + { + SetBossState(DATA_ECK_THE_FEROCIOUS_INIT, NOT_STARTED); + SetBossState(DATA_ECK_THE_FEROCIOUS_INIT, DONE); + } + break; + case GO_ALTAR_OF_SLAD_RAN: + if (GameObject* statue = instance->GetGameObject(_bridgeGUIDs[0])) + statue->SetGoState(GO_STATE_READY); + break; + case GO_ALTAR_OF_DRAKKARI: + if (GameObject* statue = instance->GetGameObject(_bridgeGUIDs[1])) + statue->SetGoState(GO_STATE_READY); + break; + case GO_ALTAR_OF_MOORABI: + if (GameObject* statue = instance->GetGameObject(_bridgeGUIDs[2])) + statue->SetGoState(GO_STATE_READY); + break; } - uint64 _sladRanAltarGUID; - uint64 _moorabiAltarGUID; - uint64 _drakkariAltarGUID; - uint64 _bridgeGUIDs[6]; - uint32 _keysInCount; - uint32 _activateTimer; - - void Initialize() + if (type >= GO_ALTAR_OF_SLAD_RAN) { - SetBossNumber(MAX_ENCOUNTERS); - LoadDoorData(doorData); + for (uint8 i = 0; i < 3; ++i) + if (GameObject* statue = instance->GetGameObject(_bridgeGUIDs[i])) + if (statue->GetGoState() != GO_STATE_READY) + return; + _activateTimer = 1; + } + } - _sladRanAltarGUID = 0; - _moorabiAltarGUID = 0; - _drakkariAltarGUID = 0; - _keysInCount = 0; - _activateTimer = 0; - memset(&_bridgeGUIDs, 0, sizeof(_bridgeGUIDs)); + bool SetBossState(uint32 type, EncounterState state) + { + if (!InstanceScript::SetBossState(type, state)) + { + if (state == DONE && (type == DATA_SLAD_RAN || type == DATA_MOORABI || type == DATA_DRAKKARI_COLOSSUS)) + ++_keysInCount; + return false; } - void OnGameObjectCreate(GameObject* gameobject) + if (state != DONE) + return true; + + switch (type) { - switch (gameobject->GetEntry()) - { - case GO_ALTAR_OF_SLAD_RAN: - _sladRanAltarGUID = gameobject->GetGUID(); - gameobject->SetGoState(GetBossState(DATA_SLAD_RAN) == DONE ? GO_STATE_ACTIVE : GO_STATE_READY); - break; - case GO_ALTAR_OF_DRAKKARI: - _drakkariAltarGUID = gameobject->GetGUID(); - gameobject->SetGoState(GetBossState(DATA_DRAKKARI_COLOSSUS) == DONE ? GO_STATE_ACTIVE : GO_STATE_READY); - break; - case GO_ALTAR_OF_MOORABI: - _moorabiAltarGUID = gameobject->GetGUID(); - gameobject->SetGoState(GetBossState(DATA_MOORABI) == DONE ? GO_STATE_ACTIVE : GO_STATE_READY); - break; - case GO_STATUE_OF_SLAD_RAN: - _bridgeGUIDs[0] = gameobject->GetGUID(); - gameobject->SetGoState(_keysInCount == 3 ? GO_STATE_ACTIVE_ALTERNATIVE : (GetBossState(DATA_SLAD_RAN) == DONE ? GO_STATE_READY : GO_STATE_ACTIVE)); - break; - case GO_STATUE_OF_DRAKKARI: - _bridgeGUIDs[1] = gameobject->GetGUID(); - gameobject->SetGoState(_keysInCount == 3 ? GO_STATE_ACTIVE_ALTERNATIVE : (GetBossState(DATA_DRAKKARI_COLOSSUS) == DONE ? GO_STATE_READY : GO_STATE_ACTIVE)); - break; - case GO_STATUE_OF_MOORABI: - _bridgeGUIDs[2] = gameobject->GetGUID(); - gameobject->SetGoState(_keysInCount == 3 ? GO_STATE_ACTIVE_ALTERNATIVE : (GetBossState(DATA_MOORABI) == DONE ? GO_STATE_READY : GO_STATE_ACTIVE)); - break; - case GO_STATUE_OF_GAL_DARAH: - _bridgeGUIDs[3] = gameobject->GetGUID(); - gameobject->SetGoState(_keysInCount == 3 ? GO_STATE_ACTIVE_ALTERNATIVE : GO_STATE_READY); - break; - case GO_GUNDRAK_COLLISION: - _bridgeGUIDs[4] = gameobject->GetGUID(); - gameobject->SetGoState(_keysInCount == 3 ? GO_STATE_ACTIVE_ALTERNATIVE : GO_STATE_READY); - break; - case GO_GUNDRAK_BRIDGE: - _bridgeGUIDs[5] = gameobject->GetGUID(); - gameobject->SetGoState(GO_STATE_READY); - break; - case GO_ECK_DOORS: - case GO_ECK_UNDERWATER_GATE: - case GO_GAL_DARAH_DOORS0: - case GO_GAL_DARAH_DOORS1: - case GO_GAL_DARAH_DOORS2: - AddDoor(gameobject, true); - break; - } - } - - void OnGameObjectRemove(GameObject* gameobject) - { - switch (gameobject->GetEntry()) - { - case GO_ECK_DOORS: - case GO_ECK_UNDERWATER_GATE: - case GO_GAL_DARAH_DOORS0: - case GO_GAL_DARAH_DOORS1: - case GO_GAL_DARAH_DOORS2: - AddDoor(gameobject, false); - break; - } - } - - void SetData(uint32 type, uint32) - { - switch (type) - { - case NPC_ECK_THE_FEROCIOUS: - if (GetBossState(DATA_ECK_THE_FEROCIOUS_INIT) != DONE) - { - SetBossState(DATA_ECK_THE_FEROCIOUS_INIT, NOT_STARTED); - SetBossState(DATA_ECK_THE_FEROCIOUS_INIT, DONE); - } - break; - case GO_ALTAR_OF_SLAD_RAN: - if (GameObject* statue = instance->GetGameObject(_bridgeGUIDs[0])) - statue->SetGoState(GO_STATE_READY); - break; - case GO_ALTAR_OF_DRAKKARI: - if (GameObject* statue = instance->GetGameObject(_bridgeGUIDs[1])) - statue->SetGoState(GO_STATE_READY); - break; - case GO_ALTAR_OF_MOORABI: - if (GameObject* statue = instance->GetGameObject(_bridgeGUIDs[2])) - statue->SetGoState(GO_STATE_READY); - break; - } - - if (type >= GO_ALTAR_OF_SLAD_RAN) - { - for (uint8 i = 0; i < 3; ++i) - if (GameObject* statue = instance->GetGameObject(_bridgeGUIDs[i])) - if (statue->GetGoState() != GO_STATE_READY) - return; - _activateTimer = 1; - } - } - - bool SetBossState(uint32 type, EncounterState state) - { - if (!InstanceScript::SetBossState(type, state)) - { - if (state == DONE && (type == DATA_SLAD_RAN || type == DATA_MOORABI || type == DATA_DRAKKARI_COLOSSUS)) - ++_keysInCount; - return false; - } - - if (state != DONE) - return true; - - switch (type) - { - case DATA_SLAD_RAN: - if (GameObject* altar = instance->GetGameObject(_sladRanAltarGUID)) - altar->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - break; - case DATA_MOORABI: - if (GameObject* altar = instance->GetGameObject(_moorabiAltarGUID)) - altar->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - break; - case DATA_DRAKKARI_COLOSSUS: - if (GameObject* altar = instance->GetGameObject(_drakkariAltarGUID)) - altar->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - break; - case DATA_ECK_THE_FEROCIOUS_INIT: + case DATA_SLAD_RAN: + if (GameObject* altar = instance->GetGameObject(_sladRanAltarGUID)) + altar->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + break; + case DATA_MOORABI: + if (GameObject* altar = instance->GetGameObject(_moorabiAltarGUID)) + altar->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + break; + case DATA_DRAKKARI_COLOSSUS: + if (GameObject* altar = instance->GetGameObject(_drakkariAltarGUID)) + altar->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + break; + case DATA_ECK_THE_FEROCIOUS_INIT: { Position pos = {1624.70f, 891.43f, 95.08f, 1.2f}; if (instance->IsHeroic()) instance->SummonCreature(NPC_ECK_THE_FEROCIOUS, pos); break; } - } - return true; } + return true; + } - std::string GetSaveData() + std::string GetSaveData() + { + std::ostringstream saveStream; + saveStream << "G D " << GetBossSaveData(); + return saveStream.str(); + } + + void Load(const char* in) + { + if (!in) + return; + + char dataHead1, dataHead2; + std::istringstream loadStream(in); + loadStream >> dataHead1 >> dataHead2; + if (dataHead1 == 'G' && dataHead2 == 'D') { - std::ostringstream saveStream; - saveStream << "G D " << GetBossSaveData(); - return saveStream.str(); - } - - void Load(const char* in) - { - if (!in) - return; - - char dataHead1, dataHead2; - std::istringstream loadStream(in); - loadStream >> dataHead1 >> dataHead2; - if (dataHead1 == 'G' && dataHead2 == 'D') + for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) { - for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) - { - uint32 tmpState; - loadStream >> tmpState; - if (tmpState == IN_PROGRESS || tmpState > SPECIAL) - tmpState = NOT_STARTED; - SetBossState(i, EncounterState(tmpState)); - } + uint32 tmpState; + loadStream >> tmpState; + if (tmpState == IN_PROGRESS || tmpState > SPECIAL) + tmpState = NOT_STARTED; + SetBossState(i, EncounterState(tmpState)); } } + } - void Update(uint32 diff) + void Update(uint32 diff) + { + if (!_activateTimer) + return; + + _activateTimer += diff; + if (_activateTimer >= 5000) { - if (!_activateTimer) - return; - - _activateTimer += diff; - if (_activateTimer >= 5000) - { - _activateTimer = 0; - for (uint8 i = 0; i < 5; ++i) - if (GameObject* go = instance->GetGameObject(_bridgeGUIDs[i])) - go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); - } + _activateTimer = 0; + for (uint8 i = 0; i < 5; ++i) + if (GameObject* go = instance->GetGameObject(_bridgeGUIDs[i])) + go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); } - }; + } + }; }; void AddSC_instance_gundrak() 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 aea5db652..924d0f277 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp @@ -137,32 +137,32 @@ enum Points class StandUpEvent : public BasicEvent { - public: - StandUpEvent(Creature& owner) : BasicEvent(), _owner(owner) { } +public: + StandUpEvent(Creature& owner) : BasicEvent(), _owner(owner) { } - bool Execute(uint64 /*eventTime*/, uint32 /*diff*/) - { - _owner.HandleEmoteCommand(EMOTE_ONESHOT_ROAR); - return true; - } + bool Execute(uint64 /*eventTime*/, uint32 /*diff*/) + { + _owner.HandleEmoteCommand(EMOTE_ONESHOT_ROAR); + return true; + } - private: - Creature& _owner; +private: + Creature& _owner; }; class ShockVortexExplodeEvent : public BasicEvent { - public: - ShockVortexExplodeEvent(Creature& owner) : BasicEvent(), _owner(owner) { } +public: + ShockVortexExplodeEvent(Creature& owner) : BasicEvent(), _owner(owner) { } - bool Execute(uint64 /*eventTime*/, uint32 /*diff*/) - { - _owner.CastSpell(&_owner, SPELL_SHOCK_VORTEX_PERIODIC, true); - return true; - } + bool Execute(uint64 /*eventTime*/, uint32 /*diff*/) + { + _owner.CastSpell(&_owner, SPELL_SHOCK_VORTEX_PERIODIC, true); + return true; + } - private: - Creature& _owner; +private: + Creature& _owner; }; Position const introFinalPos = {4660.490f, 2769.200f, 430.0000f, 0.000000f}; @@ -171,1605 +171,1605 @@ Position const triggerEndPos = {4680.180f, 2769.150f, 365.5000f, 3.121708f}; class boss_prince_keleseth_icc : public CreatureScript { - public: - boss_prince_keleseth_icc() : CreatureScript("boss_prince_keleseth_icc") { } +public: + boss_prince_keleseth_icc() : CreatureScript("boss_prince_keleseth_icc") { } - struct boss_prince_kelesethAI : public ScriptedAI + struct boss_prince_kelesethAI : public ScriptedAI + { + boss_prince_kelesethAI(Creature* creature) : ScriptedAI(creature), summons(creature), instance(creature->GetInstanceScript()) { - boss_prince_kelesethAI(Creature* creature) : ScriptedAI(creature), summons(creature), instance(creature->GetInstanceScript()) + if (!instance) { - if (!instance) - { - me->IsAIEnabled = false; - me->AddUnitState(UNIT_STATE_EVADE); - } - _canDie = true; + me->IsAIEnabled = false; + me->AddUnitState(UNIT_STATE_EVADE); } - - void InitializeAI() - { - ScriptedAI::InitializeAI(); - if (me->IsAlive()) - { - if (Creature* c = me->SummonCreature(WORLD_TRIGGER, me->GetHomePosition())) - { - c->SetObjectScale(1.75f); - c->CastSpell(c, SPELL_FEIGN_DEATH, true); - } - - me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); - me->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); - me->SetReactState(REACT_PASSIVE); - } - } - - EventMap events; - SummonList summons; - InstanceScript* instance; - bool _isEmpowered; - bool _evading; - bool _canDie; - - void Reset() - { - events.Reset(); - summons.DespawnAll(); - _isEmpowered = false; - _evading = false; - me->SetHealth(me->GetMaxHealth()); - me->SetReactState(REACT_AGGRESSIVE); - } - - void EnterCombat(Unit* who) - { - bool valid = true; - if (Creature* keleseth = instance->instance->GetCreature(instance->GetData64(DATA_PRINCE_KELESETH_GUID))) - if (!keleseth->IsAlive() || keleseth->IsInEvadeMode()) - valid = false; - if (Creature* taldaram = instance->instance->GetCreature(instance->GetData64(DATA_PRINCE_TALDARAM_GUID))) - if (!taldaram->IsAlive() || taldaram->IsInEvadeMode()) - valid = false; - if (Creature* valanar = instance->instance->GetCreature(instance->GetData64(DATA_PRINCE_VALANAR_GUID))) - if (!valanar->IsAlive() || valanar->IsInEvadeMode()) - valid = false; - if (!valid) - { - EnterEvadeMode(); - return; - } - - me->RemoveAurasDueToSpell(SPELL_FEIGN_DEATH); // just in case - me->setActive(true); - DoZoneInCombat(); - if (!me->hasLootRecipient()) - me->SetLootRecipient(who); - me->LowerPlayerDamageReq(me->GetMaxHealth()); - me->SetReactState(REACT_AGGRESSIVE); - instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me); - - if (Creature* taldaram = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_TALDARAM_GUID))) - if (!taldaram->IsInEvadeMode()) - taldaram->SetInCombatWithZone(); - if (Creature* valanar = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_VALANAR_GUID))) - if (!valanar->IsInEvadeMode()) - valanar->SetInCombatWithZone(); - - me->resetAttackTimer(BASE_ATTACK); - DoAction(ACTION_REMOVE_INVOCATION); - events.Reset(); - events.ScheduleEvent(EVENT_BERSERK, 600000); - events.ScheduleEvent(EVENT_SHADOW_RESONANCE, urand(10000, 15000)); - if (IsHeroic()) - me->AddAura(SPELL_SHADOW_PRISON, me); - } - - void AttackStart(Unit* who) - { - ScriptedAI::AttackStartCaster(who, 10.0f); - } - - void JustDied(Unit* /*killer*/) - { - events.Reset(); - summons.DespawnAll(); - instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); - - if (!_canDie) - { - me->RemoveCorpse(false); - me->SetRespawnTime(10); - me->SaveRespawnTime(); - Position homePos = me->GetHomePosition(); - me->UpdatePosition(homePos); - me->GetMotionMaster()->Clear(false); - me->GetMotionMaster()->MoveIdle(); - me->StopMovingOnCurrentPos(); - return; - } - - Talk(SAY_KELESETH_DEATH); - if (Creature* taldaram = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_TALDARAM_GUID))) - if (taldaram->IsAlive()) - Unit::Kill(taldaram, taldaram); - if (Creature* valanar = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_VALANAR_GUID))) - if (valanar->IsAlive()) - Unit::Kill(valanar, valanar); - } - - void JustRespawned() - { - ScriptedAI::JustRespawned(); - JustReachedHome(); - } - - void JustReachedHome() - { - _canDie = true; - me->setActive(false); - instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); - DoAction(ACTION_REMOVE_INVOCATION); - me->SetHealth(1); - } - - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - } - - void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType, SpellSchoolMask) - { - if (!_isEmpowered) - { - if (attacker) - me->AddThreat(attacker, float(damage)); - damage = 0; - } - } - - void DamageDealt(Unit* target, uint32& damage, DamageEffectType /*damageType*/) - { - if (target->GetTypeId() != TYPEID_PLAYER) - return; - - if (damage > RAID_MODE(23000, 25000, 23000, 25000)) - instance->SetData(DATA_ORB_WHISPERER_ACHIEVEMENT, 0); - } - - void KilledUnit(Unit* victim) - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_KELESETH_KILL); - } - - void SpellHit(Unit* /*caster*/, SpellInfo const* spell) - { - if (spell->Id == 71080 && me->IsInCombat() && !me->IsInEvadeMode()) - DoAction(ACTION_CAST_INVOCATION); - } - - void DoAction(int32 action) - { - switch (action) - { - case ACTION_STAND_UP: - summons.DespawnEntry(WORLD_TRIGGER); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29 | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); - me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); - me->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); - me->SetReactState(REACT_AGGRESSIVE); - me->ForceValuesUpdateAtIndex(UNIT_NPC_FLAGS); // was in sniff. don't ask why - me->m_Events.AddEvent(new StandUpEvent(*me), me->m_Events.CalculateTime(1000)); - DoAction(ACTION_REMOVE_INVOCATION); - me->SetHealth(1); - break; - case ACTION_CAST_INVOCATION: - Talk(SAY_KELESETH_INVOCATION); - me->CastSpell(me, SPELL_INVOCATION_OF_BLOOD_KELESETH, true); - me->CastSpell(me, SPELL_INVOCATION_VISUAL_ACTIVE, true); - _isEmpowered = true; - break; - case ACTION_REMOVE_INVOCATION: - _isEmpowered = false; - me->RemoveAurasDueToSpell(SPELL_INVOCATION_VISUAL_ACTIVE); - me->RemoveAurasDueToSpell(SPELL_INVOCATION_OF_BLOOD_KELESETH); - break; - default: - break; - } - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_BERSERK: - me->CastSpell(me, SPELL_BERSERK, true); - Talk(EMOTE_KELESETH_BERSERK); - break; - case EVENT_SHADOW_RESONANCE: - Talk(SAY_KELESETH_SPECIAL); - me->CastSpell(me, SPELL_SHADOW_RESONANCE, false); - events.ScheduleEvent(EVENT_SHADOW_RESONANCE, urand(10000, 15000)); - break; - } - - DoSpellAttackIfReady(_isEmpowered ? SPELL_EMPOWERED_SHADOW_LANCE : SPELL_SHADOW_LANCE); - } - - void EnterEvadeMode() - { - if (_evading) - return; - _canDie = false; - me->SetHealth(me->GetMaxHealth()); - DoAction(ACTION_REMOVE_INVOCATION); - _evading = true; - if (Creature* taldaram = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_TALDARAM_GUID))) - taldaram->AI()->EnterEvadeMode(); - if (Creature* valanar = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_VALANAR_GUID))) - valanar->AI()->EnterEvadeMode(); - ScriptedAI::EnterEvadeMode(); - _evading = false; - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + _canDie = true; } + + void InitializeAI() + { + ScriptedAI::InitializeAI(); + if (me->IsAlive()) + { + if (Creature* c = me->SummonCreature(WORLD_TRIGGER, me->GetHomePosition())) + { + c->SetObjectScale(1.75f); + c->CastSpell(c, SPELL_FEIGN_DEATH, true); + } + + me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); + me->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + me->SetReactState(REACT_PASSIVE); + } + } + + EventMap events; + SummonList summons; + InstanceScript* instance; + bool _isEmpowered; + bool _evading; + bool _canDie; + + void Reset() + { + events.Reset(); + summons.DespawnAll(); + _isEmpowered = false; + _evading = false; + me->SetHealth(me->GetMaxHealth()); + me->SetReactState(REACT_AGGRESSIVE); + } + + void EnterCombat(Unit* who) + { + bool valid = true; + if (Creature* keleseth = instance->instance->GetCreature(instance->GetData64(DATA_PRINCE_KELESETH_GUID))) + if (!keleseth->IsAlive() || keleseth->IsInEvadeMode()) + valid = false; + if (Creature* taldaram = instance->instance->GetCreature(instance->GetData64(DATA_PRINCE_TALDARAM_GUID))) + if (!taldaram->IsAlive() || taldaram->IsInEvadeMode()) + valid = false; + if (Creature* valanar = instance->instance->GetCreature(instance->GetData64(DATA_PRINCE_VALANAR_GUID))) + if (!valanar->IsAlive() || valanar->IsInEvadeMode()) + valid = false; + if (!valid) + { + EnterEvadeMode(); + return; + } + + me->RemoveAurasDueToSpell(SPELL_FEIGN_DEATH); // just in case + me->setActive(true); + DoZoneInCombat(); + if (!me->hasLootRecipient()) + me->SetLootRecipient(who); + me->LowerPlayerDamageReq(me->GetMaxHealth()); + me->SetReactState(REACT_AGGRESSIVE); + instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me); + + if (Creature* taldaram = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_TALDARAM_GUID))) + if (!taldaram->IsInEvadeMode()) + taldaram->SetInCombatWithZone(); + if (Creature* valanar = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_VALANAR_GUID))) + if (!valanar->IsInEvadeMode()) + valanar->SetInCombatWithZone(); + + me->resetAttackTimer(BASE_ATTACK); + DoAction(ACTION_REMOVE_INVOCATION); + events.Reset(); + events.ScheduleEvent(EVENT_BERSERK, 600000); + events.ScheduleEvent(EVENT_SHADOW_RESONANCE, urand(10000, 15000)); + if (IsHeroic()) + me->AddAura(SPELL_SHADOW_PRISON, me); + } + + void AttackStart(Unit* who) + { + ScriptedAI::AttackStartCaster(who, 10.0f); + } + + void JustDied(Unit* /*killer*/) + { + events.Reset(); + summons.DespawnAll(); + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + + if (!_canDie) + { + me->RemoveCorpse(false); + me->SetRespawnTime(10); + me->SaveRespawnTime(); + Position homePos = me->GetHomePosition(); + me->UpdatePosition(homePos); + me->GetMotionMaster()->Clear(false); + me->GetMotionMaster()->MoveIdle(); + me->StopMovingOnCurrentPos(); + return; + } + + Talk(SAY_KELESETH_DEATH); + if (Creature* taldaram = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_TALDARAM_GUID))) + if (taldaram->IsAlive()) + Unit::Kill(taldaram, taldaram); + if (Creature* valanar = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_VALANAR_GUID))) + if (valanar->IsAlive()) + Unit::Kill(valanar, valanar); + } + + void JustRespawned() + { + ScriptedAI::JustRespawned(); + JustReachedHome(); + } + + void JustReachedHome() + { + _canDie = true; + me->setActive(false); + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + DoAction(ACTION_REMOVE_INVOCATION); + me->SetHealth(1); + } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + } + + void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType, SpellSchoolMask) + { + if (!_isEmpowered) + { + if (attacker) + me->AddThreat(attacker, float(damage)); + damage = 0; + } + } + + void DamageDealt(Unit* target, uint32& damage, DamageEffectType /*damageType*/) + { + if (target->GetTypeId() != TYPEID_PLAYER) + return; + + if (damage > RAID_MODE(23000, 25000, 23000, 25000)) + instance->SetData(DATA_ORB_WHISPERER_ACHIEVEMENT, 0); + } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_KELESETH_KILL); + } + + void SpellHit(Unit* /*caster*/, SpellInfo const* spell) + { + if (spell->Id == 71080 && me->IsInCombat() && !me->IsInEvadeMode()) + DoAction(ACTION_CAST_INVOCATION); + } + + void DoAction(int32 action) + { + switch (action) + { + case ACTION_STAND_UP: + summons.DespawnEntry(WORLD_TRIGGER); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29 | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); + me->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); + me->SetReactState(REACT_AGGRESSIVE); + me->ForceValuesUpdateAtIndex(UNIT_NPC_FLAGS); // was in sniff. don't ask why + me->m_Events.AddEvent(new StandUpEvent(*me), me->m_Events.CalculateTime(1000)); + DoAction(ACTION_REMOVE_INVOCATION); + me->SetHealth(1); + break; + case ACTION_CAST_INVOCATION: + Talk(SAY_KELESETH_INVOCATION); + me->CastSpell(me, SPELL_INVOCATION_OF_BLOOD_KELESETH, true); + me->CastSpell(me, SPELL_INVOCATION_VISUAL_ACTIVE, true); + _isEmpowered = true; + break; + case ACTION_REMOVE_INVOCATION: + _isEmpowered = false; + me->RemoveAurasDueToSpell(SPELL_INVOCATION_VISUAL_ACTIVE); + me->RemoveAurasDueToSpell(SPELL_INVOCATION_OF_BLOOD_KELESETH); + break; + default: + break; + } + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_BERSERK: + me->CastSpell(me, SPELL_BERSERK, true); + Talk(EMOTE_KELESETH_BERSERK); + break; + case EVENT_SHADOW_RESONANCE: + Talk(SAY_KELESETH_SPECIAL); + me->CastSpell(me, SPELL_SHADOW_RESONANCE, false); + events.ScheduleEvent(EVENT_SHADOW_RESONANCE, urand(10000, 15000)); + break; + } + + DoSpellAttackIfReady(_isEmpowered ? SPELL_EMPOWERED_SHADOW_LANCE : SPELL_SHADOW_LANCE); + } + + void EnterEvadeMode() + { + if (_evading) + return; + _canDie = false; + me->SetHealth(me->GetMaxHealth()); + DoAction(ACTION_REMOVE_INVOCATION); + _evading = true; + if (Creature* taldaram = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_TALDARAM_GUID))) + taldaram->AI()->EnterEvadeMode(); + if (Creature* valanar = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_VALANAR_GUID))) + valanar->AI()->EnterEvadeMode(); + ScriptedAI::EnterEvadeMode(); + _evading = false; + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class boss_prince_taldaram_icc : public CreatureScript { - public: - boss_prince_taldaram_icc() : CreatureScript("boss_prince_taldaram_icc") { } +public: + boss_prince_taldaram_icc() : CreatureScript("boss_prince_taldaram_icc") { } - struct boss_prince_taldaramAI : public ScriptedAI + struct boss_prince_taldaramAI : public ScriptedAI + { + boss_prince_taldaramAI(Creature* creature) : ScriptedAI(creature), summons(creature), instance(creature->GetInstanceScript()) { - boss_prince_taldaramAI(Creature* creature) : ScriptedAI(creature), summons(creature), instance(creature->GetInstanceScript()) + if (!instance) { - if (!instance) - { - me->IsAIEnabled = false; - me->AddUnitState(UNIT_STATE_EVADE); - } - _canDie = true; + me->IsAIEnabled = false; + me->AddUnitState(UNIT_STATE_EVADE); } - - void InitializeAI() - { - ScriptedAI::InitializeAI(); - if (me->IsAlive()) - { - if (Creature* c = me->SummonCreature(WORLD_TRIGGER, me->GetHomePosition())) - { - c->SetObjectScale(1.75f); - c->CastSpell(c, SPELL_FEIGN_DEATH, true); - } - - me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); - me->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); - me->SetReactState(REACT_PASSIVE); - } - } - - EventMap events; - SummonList summons; - InstanceScript* instance; - bool _isEmpowered; - bool _evading; - bool _canDie; - - void Reset() - { - events.Reset(); - summons.DespawnAll(); - _isEmpowered = false; - _evading = false; - me->SetHealth(me->GetMaxHealth()); - me->SetReactState(REACT_AGGRESSIVE); - } - - void EnterCombat(Unit* who) - { - bool valid = true; - if (Creature* keleseth = instance->instance->GetCreature(instance->GetData64(DATA_PRINCE_KELESETH_GUID))) - if (!keleseth->IsAlive() || keleseth->IsInEvadeMode()) - valid = false; - if (Creature* taldaram = instance->instance->GetCreature(instance->GetData64(DATA_PRINCE_TALDARAM_GUID))) - if (!taldaram->IsAlive() || taldaram->IsInEvadeMode()) - valid = false; - if (Creature* valanar = instance->instance->GetCreature(instance->GetData64(DATA_PRINCE_VALANAR_GUID))) - if (!valanar->IsAlive() || valanar->IsInEvadeMode()) - valid = false; - if (!valid) - { - EnterEvadeMode(); - return; - } - - me->RemoveAurasDueToSpell(SPELL_FEIGN_DEATH); // just in case - me->setActive(true); - DoZoneInCombat(); - if (!me->hasLootRecipient()) - me->SetLootRecipient(who); - me->LowerPlayerDamageReq(me->GetMaxHealth()); - me->SetReactState(REACT_AGGRESSIVE); - instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me); - - if (Creature* keleseth = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_KELESETH_GUID))) - if (!keleseth->IsInEvadeMode()) - keleseth->SetInCombatWithZone(); - if (Creature* valanar = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_VALANAR_GUID))) - if (!valanar->IsInEvadeMode()) - valanar->SetInCombatWithZone(); - - DoAction(ACTION_REMOVE_INVOCATION); - events.Reset(); - events.ScheduleEvent(EVENT_BERSERK, 600000); - events.ScheduleEvent(EVENT_GLITTERING_SPARKS, urand(12000, 15000)); - events.ScheduleEvent(EVENT_CONJURE_FLAME, 20000); - if (IsHeroic()) - me->AddAura(SPELL_SHADOW_PRISON, me); - } - - void JustDied(Unit* /*killer*/) - { - events.Reset(); - summons.DespawnAll(); - instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); - - if (!_canDie) - { - me->RemoveCorpse(false); - me->SetRespawnTime(10); - me->SaveRespawnTime(); - Position homePos = me->GetHomePosition(); - me->UpdatePosition(homePos); - me->GetMotionMaster()->Clear(false); - me->GetMotionMaster()->MoveIdle(); - me->StopMovingOnCurrentPos(); - return; - } - - Talk(EMOTE_TALDARAM_DEATH); - if (Creature* keleseth = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_KELESETH_GUID))) - if (keleseth->IsAlive()) - Unit::Kill(keleseth, keleseth); - if (Creature* valanar = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_VALANAR_GUID))) - if (valanar->IsAlive()) - Unit::Kill(valanar, valanar); - } - - void JustRespawned() - { - ScriptedAI::JustRespawned(); - JustReachedHome(); - } - - void JustReachedHome() - { - _canDie = true; - me->setActive(false); - instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); - DoAction(ACTION_REMOVE_INVOCATION); - me->SetHealth(1); - } - - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, -10.0f, true); - if (!target) - target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true); - if (target) - { - if (summon->GetEntry() == NPC_BALL_OF_INFERNO_FLAME) - Talk(EMOTE_TALDARAM_FLAME, target); - summon->AI()->SetGUID(target->GetGUID()); - } - } - - void SummonedCreatureDespawn(Creature* s) - { - summons.Despawn(s); - } - - void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType, SpellSchoolMask) - { - if (!_isEmpowered) - { - if (attacker) - me->AddThreat(attacker, float(damage)); - damage = 0; - } - } - - void DamageDealt(Unit* target, uint32& damage, DamageEffectType /*damageType*/) - { - if (target->GetTypeId() != TYPEID_PLAYER) - return; - - if (damage > RAID_MODE(23000, 25000, 23000, 25000)) - instance->SetData(DATA_ORB_WHISPERER_ACHIEVEMENT, 0); - } - - void KilledUnit(Unit* victim) - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_TALDARAM_KILL); - } - - void SpellHit(Unit* /*caster*/, SpellInfo const* spell) - { - if (spell->Id == 71081 && me->IsInCombat() && !me->IsInEvadeMode()) - DoAction(ACTION_CAST_INVOCATION); - } - - void DoAction(int32 action) - { - switch (action) - { - case ACTION_STAND_UP: - summons.DespawnEntry(WORLD_TRIGGER); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29 | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); - me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); - me->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); - me->SetReactState(REACT_AGGRESSIVE); - me->ForceValuesUpdateAtIndex(UNIT_NPC_FLAGS); // was in sniff. don't ask why - me->m_Events.AddEvent(new StandUpEvent(*me), me->m_Events.CalculateTime(1000)); - DoAction(ACTION_REMOVE_INVOCATION); - me->SetHealth(1); - break; - case ACTION_CAST_INVOCATION: - Talk(SAY_TALDARAM_INVOCATION); - me->CastSpell(me, SPELL_INVOCATION_OF_BLOOD_TALDARAM, true); - me->CastSpell(me, SPELL_INVOCATION_VISUAL_ACTIVE, true); - _isEmpowered = true; - break; - case ACTION_REMOVE_INVOCATION: - _isEmpowered = false; - me->RemoveAurasDueToSpell(SPELL_INVOCATION_VISUAL_ACTIVE); - me->RemoveAurasDueToSpell(SPELL_INVOCATION_OF_BLOOD_TALDARAM); - break; - case ACTION_FLAME_BALL_CHASE: - summons.DoAction(ACTION_FLAME_BALL_CHASE, 1); - break; - default: - break; - } - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_BERSERK: - me->CastSpell(me, SPELL_BERSERK, true); - Talk(EMOTE_TALDARAM_BERSERK); - break; - case EVENT_GLITTERING_SPARKS: - me->CastSpell(me->GetVictim(), SPELL_GLITTERING_SPARKS, false); - events.ScheduleEvent(EVENT_GLITTERING_SPARKS, urand(15000, 25000)); - break; - case EVENT_CONJURE_FLAME: - if (_isEmpowered) - { - me->CastSpell(me, SPELL_CONJURE_EMPOWERED_FLAME, false); - events.ScheduleEvent(EVENT_CONJURE_FLAME, 15000); - } - else - { - me->CastSpell(me, SPELL_CONJURE_FLAME, false); - events.ScheduleEvent(EVENT_CONJURE_FLAME, urand(20000, 25000)); - } - Talk(SAY_TALDARAM_SPECIAL); - break; - } - - DoMeleeAttackIfReady(); - } - - void EnterEvadeMode() - { - if (_evading) - return; - _canDie = false; - me->SetHealth(me->GetMaxHealth()); - DoAction(ACTION_REMOVE_INVOCATION); - _evading = true; - if (Creature* keleseth = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_KELESETH_GUID))) - keleseth->AI()->EnterEvadeMode(); - if (Creature* valanar = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_VALANAR_GUID))) - valanar->AI()->EnterEvadeMode(); - ScriptedAI::EnterEvadeMode(); - _evading = false; - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + _canDie = true; } + + void InitializeAI() + { + ScriptedAI::InitializeAI(); + if (me->IsAlive()) + { + if (Creature* c = me->SummonCreature(WORLD_TRIGGER, me->GetHomePosition())) + { + c->SetObjectScale(1.75f); + c->CastSpell(c, SPELL_FEIGN_DEATH, true); + } + + me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); + me->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + me->SetReactState(REACT_PASSIVE); + } + } + + EventMap events; + SummonList summons; + InstanceScript* instance; + bool _isEmpowered; + bool _evading; + bool _canDie; + + void Reset() + { + events.Reset(); + summons.DespawnAll(); + _isEmpowered = false; + _evading = false; + me->SetHealth(me->GetMaxHealth()); + me->SetReactState(REACT_AGGRESSIVE); + } + + void EnterCombat(Unit* who) + { + bool valid = true; + if (Creature* keleseth = instance->instance->GetCreature(instance->GetData64(DATA_PRINCE_KELESETH_GUID))) + if (!keleseth->IsAlive() || keleseth->IsInEvadeMode()) + valid = false; + if (Creature* taldaram = instance->instance->GetCreature(instance->GetData64(DATA_PRINCE_TALDARAM_GUID))) + if (!taldaram->IsAlive() || taldaram->IsInEvadeMode()) + valid = false; + if (Creature* valanar = instance->instance->GetCreature(instance->GetData64(DATA_PRINCE_VALANAR_GUID))) + if (!valanar->IsAlive() || valanar->IsInEvadeMode()) + valid = false; + if (!valid) + { + EnterEvadeMode(); + return; + } + + me->RemoveAurasDueToSpell(SPELL_FEIGN_DEATH); // just in case + me->setActive(true); + DoZoneInCombat(); + if (!me->hasLootRecipient()) + me->SetLootRecipient(who); + me->LowerPlayerDamageReq(me->GetMaxHealth()); + me->SetReactState(REACT_AGGRESSIVE); + instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me); + + if (Creature* keleseth = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_KELESETH_GUID))) + if (!keleseth->IsInEvadeMode()) + keleseth->SetInCombatWithZone(); + if (Creature* valanar = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_VALANAR_GUID))) + if (!valanar->IsInEvadeMode()) + valanar->SetInCombatWithZone(); + + DoAction(ACTION_REMOVE_INVOCATION); + events.Reset(); + events.ScheduleEvent(EVENT_BERSERK, 600000); + events.ScheduleEvent(EVENT_GLITTERING_SPARKS, urand(12000, 15000)); + events.ScheduleEvent(EVENT_CONJURE_FLAME, 20000); + if (IsHeroic()) + me->AddAura(SPELL_SHADOW_PRISON, me); + } + + void JustDied(Unit* /*killer*/) + { + events.Reset(); + summons.DespawnAll(); + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + + if (!_canDie) + { + me->RemoveCorpse(false); + me->SetRespawnTime(10); + me->SaveRespawnTime(); + Position homePos = me->GetHomePosition(); + me->UpdatePosition(homePos); + me->GetMotionMaster()->Clear(false); + me->GetMotionMaster()->MoveIdle(); + me->StopMovingOnCurrentPos(); + return; + } + + Talk(EMOTE_TALDARAM_DEATH); + if (Creature* keleseth = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_KELESETH_GUID))) + if (keleseth->IsAlive()) + Unit::Kill(keleseth, keleseth); + if (Creature* valanar = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_VALANAR_GUID))) + if (valanar->IsAlive()) + Unit::Kill(valanar, valanar); + } + + void JustRespawned() + { + ScriptedAI::JustRespawned(); + JustReachedHome(); + } + + void JustReachedHome() + { + _canDie = true; + me->setActive(false); + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + DoAction(ACTION_REMOVE_INVOCATION); + me->SetHealth(1); + } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + + Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, -10.0f, true); + if (!target) + target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true); + if (target) + { + if (summon->GetEntry() == NPC_BALL_OF_INFERNO_FLAME) + Talk(EMOTE_TALDARAM_FLAME, target); + summon->AI()->SetGUID(target->GetGUID()); + } + } + + void SummonedCreatureDespawn(Creature* s) + { + summons.Despawn(s); + } + + void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType, SpellSchoolMask) + { + if (!_isEmpowered) + { + if (attacker) + me->AddThreat(attacker, float(damage)); + damage = 0; + } + } + + void DamageDealt(Unit* target, uint32& damage, DamageEffectType /*damageType*/) + { + if (target->GetTypeId() != TYPEID_PLAYER) + return; + + if (damage > RAID_MODE(23000, 25000, 23000, 25000)) + instance->SetData(DATA_ORB_WHISPERER_ACHIEVEMENT, 0); + } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_TALDARAM_KILL); + } + + void SpellHit(Unit* /*caster*/, SpellInfo const* spell) + { + if (spell->Id == 71081 && me->IsInCombat() && !me->IsInEvadeMode()) + DoAction(ACTION_CAST_INVOCATION); + } + + void DoAction(int32 action) + { + switch (action) + { + case ACTION_STAND_UP: + summons.DespawnEntry(WORLD_TRIGGER); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29 | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); + me->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); + me->SetReactState(REACT_AGGRESSIVE); + me->ForceValuesUpdateAtIndex(UNIT_NPC_FLAGS); // was in sniff. don't ask why + me->m_Events.AddEvent(new StandUpEvent(*me), me->m_Events.CalculateTime(1000)); + DoAction(ACTION_REMOVE_INVOCATION); + me->SetHealth(1); + break; + case ACTION_CAST_INVOCATION: + Talk(SAY_TALDARAM_INVOCATION); + me->CastSpell(me, SPELL_INVOCATION_OF_BLOOD_TALDARAM, true); + me->CastSpell(me, SPELL_INVOCATION_VISUAL_ACTIVE, true); + _isEmpowered = true; + break; + case ACTION_REMOVE_INVOCATION: + _isEmpowered = false; + me->RemoveAurasDueToSpell(SPELL_INVOCATION_VISUAL_ACTIVE); + me->RemoveAurasDueToSpell(SPELL_INVOCATION_OF_BLOOD_TALDARAM); + break; + case ACTION_FLAME_BALL_CHASE: + summons.DoAction(ACTION_FLAME_BALL_CHASE, 1); + break; + default: + break; + } + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_BERSERK: + me->CastSpell(me, SPELL_BERSERK, true); + Talk(EMOTE_TALDARAM_BERSERK); + break; + case EVENT_GLITTERING_SPARKS: + me->CastSpell(me->GetVictim(), SPELL_GLITTERING_SPARKS, false); + events.ScheduleEvent(EVENT_GLITTERING_SPARKS, urand(15000, 25000)); + break; + case EVENT_CONJURE_FLAME: + if (_isEmpowered) + { + me->CastSpell(me, SPELL_CONJURE_EMPOWERED_FLAME, false); + events.ScheduleEvent(EVENT_CONJURE_FLAME, 15000); + } + else + { + me->CastSpell(me, SPELL_CONJURE_FLAME, false); + events.ScheduleEvent(EVENT_CONJURE_FLAME, urand(20000, 25000)); + } + Talk(SAY_TALDARAM_SPECIAL); + break; + } + + DoMeleeAttackIfReady(); + } + + void EnterEvadeMode() + { + if (_evading) + return; + _canDie = false; + me->SetHealth(me->GetMaxHealth()); + DoAction(ACTION_REMOVE_INVOCATION); + _evading = true; + if (Creature* keleseth = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_KELESETH_GUID))) + keleseth->AI()->EnterEvadeMode(); + if (Creature* valanar = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_VALANAR_GUID))) + valanar->AI()->EnterEvadeMode(); + ScriptedAI::EnterEvadeMode(); + _evading = false; + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class boss_prince_valanar_icc : public CreatureScript { - public: - boss_prince_valanar_icc() : CreatureScript("boss_prince_valanar_icc") { } +public: + boss_prince_valanar_icc() : CreatureScript("boss_prince_valanar_icc") { } - struct boss_prince_valanarAI : public BossAI + struct boss_prince_valanarAI : public BossAI + { + boss_prince_valanarAI(Creature* creature) : BossAI(creature, DATA_BLOOD_PRINCE_COUNCIL) { - boss_prince_valanarAI(Creature* creature) : BossAI(creature, DATA_BLOOD_PRINCE_COUNCIL) + if (!instance) { - if (!instance) - { - me->IsAIEnabled = false; - me->AddUnitState(UNIT_STATE_EVADE); - } - _canDie = true; + me->IsAIEnabled = false; + me->AddUnitState(UNIT_STATE_EVADE); } - - void InitializeAI() - { - ScriptedAI::InitializeAI(); - if (me->IsAlive()) - { - if (Creature* c = me->SummonCreature(WORLD_TRIGGER, me->GetHomePosition())) - { - c->SetObjectScale(1.75f); - c->CastSpell(c, SPELL_FEIGN_DEATH, true); - } - - me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); - me->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); - me->SetReactState(REACT_PASSIVE); - } - } - - bool _isEmpowered; - bool _evading; - bool _canDie; - uint32 invocationOrder[3]; - uint8 currentInvocationIndex; - - void Reset() - { - events.Reset(); - summons.DespawnAll(); - _isEmpowered = false; - _evading = false; - me->SetHealth(me->GetMaxHealth()); - me->SetReactState(REACT_AGGRESSIVE); - instance->SetBossState(DATA_BLOOD_PRINCE_COUNCIL, NOT_STARTED); - } - - void EnterCombat(Unit* who) - { - bool valid = true; - if (Creature* keleseth = instance->instance->GetCreature(instance->GetData64(DATA_PRINCE_KELESETH_GUID))) - if (!keleseth->IsAlive() || keleseth->IsInEvadeMode()) - valid = false; - if (Creature* taldaram = instance->instance->GetCreature(instance->GetData64(DATA_PRINCE_TALDARAM_GUID))) - if (!taldaram->IsAlive() || taldaram->IsInEvadeMode()) - valid = false; - if (Creature* valanar = instance->instance->GetCreature(instance->GetData64(DATA_PRINCE_VALANAR_GUID))) - if (!valanar->IsAlive() || valanar->IsInEvadeMode()) - valid = false; - if (!valid) - { - EnterEvadeMode(); - return; - } - - instance->SetBossState(DATA_BLOOD_PRINCE_COUNCIL, IN_PROGRESS); - instance->SetData(DATA_ORB_WHISPERER_ACHIEVEMENT, 1); - me->RemoveAurasDueToSpell(SPELL_FEIGN_DEATH); // just in case - me->setActive(true); - DoZoneInCombat(); - if (!me->hasLootRecipient()) - me->SetLootRecipient(who); - me->LowerPlayerDamageReq(me->GetMaxHealth()); - me->SetReactState(REACT_AGGRESSIVE); - instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me); - - if (Creature* keleseth = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_KELESETH_GUID))) - if (!keleseth->IsInEvadeMode()) - keleseth->SetInCombatWithZone(); - if (Creature* taldaram = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_TALDARAM_GUID))) - if (!taldaram->IsInEvadeMode()) - taldaram->SetInCombatWithZone(); - - DoAction(ACTION_CAST_INVOCATION); - currentInvocationIndex = 0; - invocationOrder[0] = DATA_PRINCE_VALANAR_GUID; - invocationOrder[1] = RAND(DATA_PRINCE_KELESETH_GUID, DATA_PRINCE_TALDARAM_GUID); - invocationOrder[2] = DATA_PRINCE_KELESETH_GUID + DATA_PRINCE_TALDARAM_GUID - invocationOrder[1]; - - events.ScheduleEvent(EVENT_BERSERK, 600000); - events.ScheduleEvent(EVENT_KINETIC_BOMB, urand(18000, 24000)); - events.ScheduleEvent(EVENT_SHOCK_VORTEX, urand(15000, 20000)); - events.ScheduleEvent(EVENT_INVOCATION_OF_BLOOD, 45000); - if (IsHeroic()) - { - me->AddAura(SPELL_SHADOW_PRISON, me); - me->CastSpell(me, SPELL_SHADOW_PRISON_DUMMY, true); - } - } - - void JustDied(Unit* /*killer*/) - { - events.Reset(); - summons.DespawnAll(); - instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); - - if (!_canDie) - { - me->RemoveCorpse(false); - me->SetRespawnTime(10); - me->SaveRespawnTime(); - Position homePos = me->GetHomePosition(); - me->UpdatePosition(homePos); - me->GetMotionMaster()->Clear(false); - me->GetMotionMaster()->MoveIdle(); - me->StopMovingOnCurrentPos(); - return; - } - - Talk(SAY_VALANAR_DEATH); - instance->SetBossState(DATA_BLOOD_PRINCE_COUNCIL, DONE); - if (Creature* keleseth = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_KELESETH_GUID))) - if (keleseth->IsAlive()) - Unit::Kill(keleseth, keleseth); - if (Creature* taldaram = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_TALDARAM_GUID))) - if (taldaram->IsAlive()) - Unit::Kill(taldaram, taldaram); - } - - void JustRespawned() - { - BossAI::JustRespawned(); - JustReachedHome(); - } - - void JustReachedHome() - { - _canDie = true; - me->setActive(false); - instance->SetBossState(DATA_BLOOD_PRINCE_COUNCIL, FAIL); - instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); - me->SetHealth(me->GetMaxHealth()); - DoAction(ACTION_CAST_INVOCATION); - } - - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - switch (summon->GetEntry()) - { - case NPC_KINETIC_BOMB_TARGET: - summon->SetReactState(REACT_PASSIVE); - summon->CastSpell(summon, SPELL_KINETIC_BOMB, true, nullptr, nullptr, me->GetGUID()); - break; - case NPC_SHOCK_VORTEX: - summon->m_Events.AddEvent(new ShockVortexExplodeEvent(*summon), summon->m_Events.CalculateTime(4500)); - break; - default: - break; - } - } - - void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType, SpellSchoolMask) - { - if (!_isEmpowered) - { - if (attacker) - me->AddThreat(attacker, float(damage)); - damage = 0; - } - } - - void DamageDealt(Unit* target, uint32& damage, DamageEffectType /*damageType*/) - { - if (target->GetTypeId() != TYPEID_PLAYER) - return; - - if (damage > RAID_MODE(23000, 25000, 23000, 25000)) - instance->SetData(DATA_ORB_WHISPERER_ACHIEVEMENT, 0); - } - - void KilledUnit(Unit* victim) - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_VALANAR_KILL); - } - - void SpellHit(Unit* /*caster*/, SpellInfo const* spell) - { - if (spell->Id == 71070 && me->IsInCombat() && !me->IsInEvadeMode()) - DoAction(ACTION_CAST_INVOCATION); - } - - void DoAction(int32 action) - { - switch (action) - { - case ACTION_STAND_UP: - summons.DespawnEntry(WORLD_TRIGGER); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29 | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); - me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); - me->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); - me->SetReactState(REACT_AGGRESSIVE); - me->ForceValuesUpdateAtIndex(UNIT_NPC_FLAGS); // was in sniff. don't ask why - me->m_Events.AddEvent(new StandUpEvent(*me), me->m_Events.CalculateTime(1000)); - me->SetHealth(me->GetMaxHealth()); - DoAction(ACTION_CAST_INVOCATION); - break; - case ACTION_CAST_INVOCATION: - if (me->IsInCombat()) - Talk(SAY_VALANAR_INVOCATION); - me->CastSpell(me, SPELL_INVOCATION_OF_BLOOD_VALANAR, true); - me->CastSpell(me, SPELL_INVOCATION_VISUAL_ACTIVE, true); - _isEmpowered = true; - break; - case ACTION_REMOVE_INVOCATION: - _isEmpowered = false; - me->RemoveAurasDueToSpell(SPELL_INVOCATION_VISUAL_ACTIVE); - me->RemoveAurasDueToSpell(SPELL_INVOCATION_OF_BLOOD_VALANAR); - break; - default: - break; - } - } - - bool CheckRoom() - { - Creature* keleseth = instance->instance->GetCreature(instance->GetData64(DATA_PRINCE_KELESETH_GUID)); - Creature* taldaram = instance->instance->GetCreature(instance->GetData64(DATA_PRINCE_TALDARAM_GUID)); - if (keleseth && taldaram && CheckBoundary(me) && CheckBoundary(keleseth) && CheckBoundary(taldaram)) - return true; - - EnterEvadeMode(); - return false; - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim() || !CheckRoom()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_INVOCATION_OF_BLOOD: - { - uint32 visualSpellId = 0; - Creature* current = instance->instance->GetCreature(instance->GetData64(invocationOrder[currentInvocationIndex])); - if (++currentInvocationIndex >= 3) - currentInvocationIndex = 0; - Creature* next = instance->instance->GetCreature(instance->GetData64(invocationOrder[currentInvocationIndex])); - switch (invocationOrder[currentInvocationIndex]) - { - case DATA_PRINCE_KELESETH_GUID: - visualSpellId = 71080; - break; - case DATA_PRINCE_TALDARAM_GUID: - visualSpellId = 71081; - break; - case DATA_PRINCE_VALANAR_GUID: - visualSpellId = 71070; - break; - } - if (!visualSpellId || !current || !next || !current->IsInCombat() || !next->IsInCombat()) - { - EnterEvadeMode(); - return; - } - next->SetHealth(current->GetHealth()); - current->AI()->DoAction(ACTION_REMOVE_INVOCATION); - current->SetHealth(1); - current->CastSpell((Unit*)NULL, visualSpellId, true); - next->AI()->Talk(1); - } - events.ScheduleEvent(EVENT_INVOCATION_OF_BLOOD, 46000); - break; - case EVENT_BERSERK: - me->CastSpell(me, SPELL_BERSERK, true); - Talk(SAY_VALANAR_BERSERK); - break; - case EVENT_KINETIC_BOMB: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) - { - me->CastSpell(target, SPELL_KINETIC_BOMB_TARGET, false); - Talk(SAY_VALANAR_SPECIAL); - } - events.ScheduleEvent(EVENT_KINETIC_BOMB, me->GetMap()->Is25ManRaid() ? 20500 : 30500); - break; - case EVENT_SHOCK_VORTEX: - if (_isEmpowered) - { - me->CastSpell(me, SPELL_EMPOWERED_SHOCK_VORTEX, false); - Talk(EMOTE_VALANAR_SHOCK_VORTEX); - events.ScheduleEvent(EVENT_SHOCK_VORTEX, 30000); - } - else - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) - me->CastSpell(target, SPELL_SHOCK_VORTEX, false); - events.ScheduleEvent(EVENT_SHOCK_VORTEX, urand(18000, 23000)); - } - break; - } - - DoMeleeAttackIfReady(); - } - - void EnterEvadeMode() - { - if (_evading) - return; - _canDie = false; - me->SetHealth(me->GetMaxHealth()); - DoAction(ACTION_REMOVE_INVOCATION); - _evading = true; - if (Creature* keleseth = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_KELESETH_GUID))) - keleseth->AI()->EnterEvadeMode(); - if (Creature* taldaram = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_TALDARAM_GUID))) - taldaram->AI()->EnterEvadeMode(); - BossAI::EnterEvadeMode(); - _evading = false; - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + _canDie = true; } + + void InitializeAI() + { + ScriptedAI::InitializeAI(); + if (me->IsAlive()) + { + if (Creature* c = me->SummonCreature(WORLD_TRIGGER, me->GetHomePosition())) + { + c->SetObjectScale(1.75f); + c->CastSpell(c, SPELL_FEIGN_DEATH, true); + } + + me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); + me->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + me->SetReactState(REACT_PASSIVE); + } + } + + bool _isEmpowered; + bool _evading; + bool _canDie; + uint32 invocationOrder[3]; + uint8 currentInvocationIndex; + + void Reset() + { + events.Reset(); + summons.DespawnAll(); + _isEmpowered = false; + _evading = false; + me->SetHealth(me->GetMaxHealth()); + me->SetReactState(REACT_AGGRESSIVE); + instance->SetBossState(DATA_BLOOD_PRINCE_COUNCIL, NOT_STARTED); + } + + void EnterCombat(Unit* who) + { + bool valid = true; + if (Creature* keleseth = instance->instance->GetCreature(instance->GetData64(DATA_PRINCE_KELESETH_GUID))) + if (!keleseth->IsAlive() || keleseth->IsInEvadeMode()) + valid = false; + if (Creature* taldaram = instance->instance->GetCreature(instance->GetData64(DATA_PRINCE_TALDARAM_GUID))) + if (!taldaram->IsAlive() || taldaram->IsInEvadeMode()) + valid = false; + if (Creature* valanar = instance->instance->GetCreature(instance->GetData64(DATA_PRINCE_VALANAR_GUID))) + if (!valanar->IsAlive() || valanar->IsInEvadeMode()) + valid = false; + if (!valid) + { + EnterEvadeMode(); + return; + } + + instance->SetBossState(DATA_BLOOD_PRINCE_COUNCIL, IN_PROGRESS); + instance->SetData(DATA_ORB_WHISPERER_ACHIEVEMENT, 1); + me->RemoveAurasDueToSpell(SPELL_FEIGN_DEATH); // just in case + me->setActive(true); + DoZoneInCombat(); + if (!me->hasLootRecipient()) + me->SetLootRecipient(who); + me->LowerPlayerDamageReq(me->GetMaxHealth()); + me->SetReactState(REACT_AGGRESSIVE); + instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me); + + if (Creature* keleseth = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_KELESETH_GUID))) + if (!keleseth->IsInEvadeMode()) + keleseth->SetInCombatWithZone(); + if (Creature* taldaram = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_TALDARAM_GUID))) + if (!taldaram->IsInEvadeMode()) + taldaram->SetInCombatWithZone(); + + DoAction(ACTION_CAST_INVOCATION); + currentInvocationIndex = 0; + invocationOrder[0] = DATA_PRINCE_VALANAR_GUID; + invocationOrder[1] = RAND(DATA_PRINCE_KELESETH_GUID, DATA_PRINCE_TALDARAM_GUID); + invocationOrder[2] = DATA_PRINCE_KELESETH_GUID + DATA_PRINCE_TALDARAM_GUID - invocationOrder[1]; + + events.ScheduleEvent(EVENT_BERSERK, 600000); + events.ScheduleEvent(EVENT_KINETIC_BOMB, urand(18000, 24000)); + events.ScheduleEvent(EVENT_SHOCK_VORTEX, urand(15000, 20000)); + events.ScheduleEvent(EVENT_INVOCATION_OF_BLOOD, 45000); + if (IsHeroic()) + { + me->AddAura(SPELL_SHADOW_PRISON, me); + me->CastSpell(me, SPELL_SHADOW_PRISON_DUMMY, true); + } + } + + void JustDied(Unit* /*killer*/) + { + events.Reset(); + summons.DespawnAll(); + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + + if (!_canDie) + { + me->RemoveCorpse(false); + me->SetRespawnTime(10); + me->SaveRespawnTime(); + Position homePos = me->GetHomePosition(); + me->UpdatePosition(homePos); + me->GetMotionMaster()->Clear(false); + me->GetMotionMaster()->MoveIdle(); + me->StopMovingOnCurrentPos(); + return; + } + + Talk(SAY_VALANAR_DEATH); + instance->SetBossState(DATA_BLOOD_PRINCE_COUNCIL, DONE); + if (Creature* keleseth = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_KELESETH_GUID))) + if (keleseth->IsAlive()) + Unit::Kill(keleseth, keleseth); + if (Creature* taldaram = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_TALDARAM_GUID))) + if (taldaram->IsAlive()) + Unit::Kill(taldaram, taldaram); + } + + void JustRespawned() + { + BossAI::JustRespawned(); + JustReachedHome(); + } + + void JustReachedHome() + { + _canDie = true; + me->setActive(false); + instance->SetBossState(DATA_BLOOD_PRINCE_COUNCIL, FAIL); + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + me->SetHealth(me->GetMaxHealth()); + DoAction(ACTION_CAST_INVOCATION); + } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + switch (summon->GetEntry()) + { + case NPC_KINETIC_BOMB_TARGET: + summon->SetReactState(REACT_PASSIVE); + summon->CastSpell(summon, SPELL_KINETIC_BOMB, true, nullptr, nullptr, me->GetGUID()); + break; + case NPC_SHOCK_VORTEX: + summon->m_Events.AddEvent(new ShockVortexExplodeEvent(*summon), summon->m_Events.CalculateTime(4500)); + break; + default: + break; + } + } + + void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType, SpellSchoolMask) + { + if (!_isEmpowered) + { + if (attacker) + me->AddThreat(attacker, float(damage)); + damage = 0; + } + } + + void DamageDealt(Unit* target, uint32& damage, DamageEffectType /*damageType*/) + { + if (target->GetTypeId() != TYPEID_PLAYER) + return; + + if (damage > RAID_MODE(23000, 25000, 23000, 25000)) + instance->SetData(DATA_ORB_WHISPERER_ACHIEVEMENT, 0); + } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_VALANAR_KILL); + } + + void SpellHit(Unit* /*caster*/, SpellInfo const* spell) + { + if (spell->Id == 71070 && me->IsInCombat() && !me->IsInEvadeMode()) + DoAction(ACTION_CAST_INVOCATION); + } + + void DoAction(int32 action) + { + switch (action) + { + case ACTION_STAND_UP: + summons.DespawnEntry(WORLD_TRIGGER); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29 | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); + me->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); + me->SetReactState(REACT_AGGRESSIVE); + me->ForceValuesUpdateAtIndex(UNIT_NPC_FLAGS); // was in sniff. don't ask why + me->m_Events.AddEvent(new StandUpEvent(*me), me->m_Events.CalculateTime(1000)); + me->SetHealth(me->GetMaxHealth()); + DoAction(ACTION_CAST_INVOCATION); + break; + case ACTION_CAST_INVOCATION: + if (me->IsInCombat()) + Talk(SAY_VALANAR_INVOCATION); + me->CastSpell(me, SPELL_INVOCATION_OF_BLOOD_VALANAR, true); + me->CastSpell(me, SPELL_INVOCATION_VISUAL_ACTIVE, true); + _isEmpowered = true; + break; + case ACTION_REMOVE_INVOCATION: + _isEmpowered = false; + me->RemoveAurasDueToSpell(SPELL_INVOCATION_VISUAL_ACTIVE); + me->RemoveAurasDueToSpell(SPELL_INVOCATION_OF_BLOOD_VALANAR); + break; + default: + break; + } + } + + bool CheckRoom() + { + Creature* keleseth = instance->instance->GetCreature(instance->GetData64(DATA_PRINCE_KELESETH_GUID)); + Creature* taldaram = instance->instance->GetCreature(instance->GetData64(DATA_PRINCE_TALDARAM_GUID)); + if (keleseth && taldaram && CheckBoundary(me) && CheckBoundary(keleseth) && CheckBoundary(taldaram)) + return true; + + EnterEvadeMode(); + return false; + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim() || !CheckRoom()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_INVOCATION_OF_BLOOD: + { + uint32 visualSpellId = 0; + Creature* current = instance->instance->GetCreature(instance->GetData64(invocationOrder[currentInvocationIndex])); + if (++currentInvocationIndex >= 3) + currentInvocationIndex = 0; + Creature* next = instance->instance->GetCreature(instance->GetData64(invocationOrder[currentInvocationIndex])); + switch (invocationOrder[currentInvocationIndex]) + { + case DATA_PRINCE_KELESETH_GUID: + visualSpellId = 71080; + break; + case DATA_PRINCE_TALDARAM_GUID: + visualSpellId = 71081; + break; + case DATA_PRINCE_VALANAR_GUID: + visualSpellId = 71070; + break; + } + if (!visualSpellId || !current || !next || !current->IsInCombat() || !next->IsInCombat()) + { + EnterEvadeMode(); + return; + } + next->SetHealth(current->GetHealth()); + current->AI()->DoAction(ACTION_REMOVE_INVOCATION); + current->SetHealth(1); + current->CastSpell((Unit*)NULL, visualSpellId, true); + next->AI()->Talk(1); + } + events.ScheduleEvent(EVENT_INVOCATION_OF_BLOOD, 46000); + break; + case EVENT_BERSERK: + me->CastSpell(me, SPELL_BERSERK, true); + Talk(SAY_VALANAR_BERSERK); + break; + case EVENT_KINETIC_BOMB: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) + { + me->CastSpell(target, SPELL_KINETIC_BOMB_TARGET, false); + Talk(SAY_VALANAR_SPECIAL); + } + events.ScheduleEvent(EVENT_KINETIC_BOMB, me->GetMap()->Is25ManRaid() ? 20500 : 30500); + break; + case EVENT_SHOCK_VORTEX: + if (_isEmpowered) + { + me->CastSpell(me, SPELL_EMPOWERED_SHOCK_VORTEX, false); + Talk(EMOTE_VALANAR_SHOCK_VORTEX); + events.ScheduleEvent(EVENT_SHOCK_VORTEX, 30000); + } + else + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) + me->CastSpell(target, SPELL_SHOCK_VORTEX, false); + events.ScheduleEvent(EVENT_SHOCK_VORTEX, urand(18000, 23000)); + } + break; + } + + DoMeleeAttackIfReady(); + } + + void EnterEvadeMode() + { + if (_evading) + return; + _canDie = false; + me->SetHealth(me->GetMaxHealth()); + DoAction(ACTION_REMOVE_INVOCATION); + _evading = true; + if (Creature* keleseth = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_KELESETH_GUID))) + keleseth->AI()->EnterEvadeMode(); + if (Creature* taldaram = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_TALDARAM_GUID))) + taldaram->AI()->EnterEvadeMode(); + BossAI::EnterEvadeMode(); + _evading = false; + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class npc_blood_queen_lana_thel : public CreatureScript { - public: - npc_blood_queen_lana_thel() : CreatureScript("npc_blood_queen_lana_thel") { } +public: + npc_blood_queen_lana_thel() : CreatureScript("npc_blood_queen_lana_thel") { } - struct npc_blood_queen_lana_thelAI : public ScriptedAI + struct npc_blood_queen_lana_thelAI : public ScriptedAI + { + npc_blood_queen_lana_thelAI(Creature* creature) : ScriptedAI(creature) { - npc_blood_queen_lana_thelAI(Creature* creature) : ScriptedAI(creature) - { - _introDone = false; - _instance = creature->GetInstanceScript(); - me->m_SightDistance = 100.0f; // for MoveInLineOfSight distance - } - - void Reset() - { - _events.Reset(); - me->SetDisableGravity(true); - if (_instance->GetBossState(DATA_BLOOD_PRINCE_COUNCIL) == DONE) - { - me->SetVisible(false); - _introDone = true; - } - else - { - me->SetVisible(true); - } - } - - void MoveInLineOfSight(Unit* who) - { - if (_introDone) - return; - - if (who->GetTypeId() != TYPEID_PLAYER || me->GetExactDist2d(who) > 100.0f) - { - return; - } - - _introDone = true; - Talk(SAY_INTRO_1); - _events.SetPhase(1); - _events.ScheduleEvent(EVENT_INTRO_1, 14000); - // summon a visual trigger - if (Creature* summon = DoSummon(NPC_FLOATING_TRIGGER, triggerPos, 15000, TEMPSUMMON_TIMED_DESPAWN)) - { - summon->SetDisplayId(11686); // it's a general npc, and the template has 2 models (first is an infernal) - summon->CastSpell(summon, SPELL_OOC_INVOCATION_VISUAL, true); - summon->SetSpeed(MOVE_RUN, 0.15f, true); - summon->GetMotionMaster()->MovePoint(0, triggerEndPos); - } - } - - void MovementInform(uint32 type, uint32 id) - { - if (type == POINT_MOTION_TYPE && id == POINT_INTRO_DESPAWN) - { - me->SetVisible(false); - } - } - - void UpdateAI(uint32 diff) - { - if (!_events.GetPhaseMask()) - { - return; - } - - _events.Update(diff); - - if (_events.ExecuteEvent() == EVENT_INTRO_1) - { - Talk(SAY_INTRO_2); - me->GetMotionMaster()->MovePoint(POINT_INTRO_DESPAWN, introFinalPos); - _events.Reset(); - - if (Creature* keleseth = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_PRINCE_KELESETH_GUID))) - { - keleseth->AI()->DoAction(ACTION_STAND_UP); - } - if (Creature* taldaram = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_PRINCE_TALDARAM_GUID))) - { - taldaram->AI()->DoAction(ACTION_STAND_UP); - } - if (Creature* valanar = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_PRINCE_VALANAR_GUID))) - { - valanar->AI()->DoAction(ACTION_STAND_UP); - } - } - } - - private: - EventMap _events; - InstanceScript* _instance; - bool _introDone; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + _introDone = false; + _instance = creature->GetInstanceScript(); + me->m_SightDistance = 100.0f; // for MoveInLineOfSight distance } + + void Reset() + { + _events.Reset(); + me->SetDisableGravity(true); + if (_instance->GetBossState(DATA_BLOOD_PRINCE_COUNCIL) == DONE) + { + me->SetVisible(false); + _introDone = true; + } + else + { + me->SetVisible(true); + } + } + + void MoveInLineOfSight(Unit* who) + { + if (_introDone) + return; + + if (who->GetTypeId() != TYPEID_PLAYER || me->GetExactDist2d(who) > 100.0f) + { + return; + } + + _introDone = true; + Talk(SAY_INTRO_1); + _events.SetPhase(1); + _events.ScheduleEvent(EVENT_INTRO_1, 14000); + // summon a visual trigger + if (Creature* summon = DoSummon(NPC_FLOATING_TRIGGER, triggerPos, 15000, TEMPSUMMON_TIMED_DESPAWN)) + { + summon->SetDisplayId(11686); // it's a general npc, and the template has 2 models (first is an infernal) + summon->CastSpell(summon, SPELL_OOC_INVOCATION_VISUAL, true); + summon->SetSpeed(MOVE_RUN, 0.15f, true); + summon->GetMotionMaster()->MovePoint(0, triggerEndPos); + } + } + + void MovementInform(uint32 type, uint32 id) + { + if (type == POINT_MOTION_TYPE && id == POINT_INTRO_DESPAWN) + { + me->SetVisible(false); + } + } + + void UpdateAI(uint32 diff) + { + if (!_events.GetPhaseMask()) + { + return; + } + + _events.Update(diff); + + if (_events.ExecuteEvent() == EVENT_INTRO_1) + { + Talk(SAY_INTRO_2); + me->GetMotionMaster()->MovePoint(POINT_INTRO_DESPAWN, introFinalPos); + _events.Reset(); + + if (Creature* keleseth = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_PRINCE_KELESETH_GUID))) + { + keleseth->AI()->DoAction(ACTION_STAND_UP); + } + if (Creature* taldaram = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_PRINCE_TALDARAM_GUID))) + { + taldaram->AI()->DoAction(ACTION_STAND_UP); + } + if (Creature* valanar = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_PRINCE_VALANAR_GUID))) + { + valanar->AI()->DoAction(ACTION_STAND_UP); + } + } + } + + private: + EventMap _events; + InstanceScript* _instance; + bool _introDone; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class npc_dark_nucleus : public CreatureScript { - public: - npc_dark_nucleus() : CreatureScript("npc_dark_nucleus") { } +public: + npc_dark_nucleus() : CreatureScript("npc_dark_nucleus") { } - struct npc_dark_nucleusAI : public ScriptedAI + struct npc_dark_nucleusAI : public ScriptedAI + { + npc_dark_nucleusAI(Creature* creature) : ScriptedAI(creature) {} + + uint16 timer; + + void Reset() { - npc_dark_nucleusAI(Creature* creature) : ScriptedAI(creature) {} + timer = 0; + me->SetReactState(REACT_DEFENSIVE); + me->SetHover(true); + me->CastSpell(me, SPELL_SHADOW_RESONANCE_AURA, true); + } - uint16 timer; - - void Reset() + void AttackStart(Unit* who) + { + if (who != me->GetVictim()) { - timer = 0; - me->SetReactState(REACT_DEFENSIVE); - me->SetHover(true); - me->CastSpell(me, SPELL_SHADOW_RESONANCE_AURA, true); + me->InterruptNonMeleeSpells(true, 0, true); + me->CastSpell(who, SPELL_SHADOW_RESONANCE_RESIST, false); + me->ClearUnitState(UNIT_STATE_CASTING); + } + ScriptedAI::AttackStart(who); + } + + void DamageTaken(Unit* attacker, uint32& /*damage*/, DamageEffectType det, SpellSchoolMask) + { + if (!attacker || attacker == me || attacker == me->GetVictim() || (det != DIRECT_DAMAGE && det != SPELL_DIRECT_DAMAGE)) + return; + + me->DeleteThreatList(); + me->AddThreat(attacker, 500000000.0f); + } + + void JustDied(Unit* /*killer*/) + { + me->DespawnOrUnsummon(1); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + { + return; } - void AttackStart(Unit* who) + if (timer <= diff) { - if (who != me->GetVictim()) + timer = 1000; + if (Unit* victim = me->GetVictim()) { - me->InterruptNonMeleeSpells(true, 0, true); - me->CastSpell(who, SPELL_SHADOW_RESONANCE_RESIST, false); - me->ClearUnitState(UNIT_STATE_CASTING); - } - ScriptedAI::AttackStart(who); - } - - void DamageTaken(Unit* attacker, uint32& /*damage*/, DamageEffectType det, SpellSchoolMask) - { - if (!attacker || attacker == me || attacker == me->GetVictim() || (det != DIRECT_DAMAGE && det != SPELL_DIRECT_DAMAGE)) - return; - - me->DeleteThreatList(); - me->AddThreat(attacker, 500000000.0f); - } - - void JustDied(Unit* /*killer*/) - { - me->DespawnOrUnsummon(1); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - { - return; - } - - if (timer <= diff) - { - timer = 1000; - if (Unit* victim = me->GetVictim()) + if (me->GetDistance(victim) < 15.0f && !victim->HasAura(SPELL_SHADOW_RESONANCE_RESIST, me->GetGUID())) { - if (me->GetDistance(victim) < 15.0f && !victim->HasAura(SPELL_SHADOW_RESONANCE_RESIST, me->GetGUID())) - { - me->InterruptNonMeleeSpells(true, 0, true); - me->CastSpell(victim, SPELL_SHADOW_RESONANCE_RESIST, false); - me->ClearUnitState(UNIT_STATE_CASTING); - } + me->InterruptNonMeleeSpells(true, 0, true); + me->CastSpell(victim, SPELL_SHADOW_RESONANCE_RESIST, false); + me->ClearUnitState(UNIT_STATE_CASTING); } } - else - { - timer -= diff; - } } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + else + { + timer -= diff; + } } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class npc_ball_of_flame : public CreatureScript { - public: - npc_ball_of_flame() : CreatureScript("npc_ball_of_flame") { } +public: + npc_ball_of_flame() : CreatureScript("npc_ball_of_flame") { } - struct npc_ball_of_flameAI : public ScriptedAI + struct npc_ball_of_flameAI : public ScriptedAI + { + npc_ball_of_flameAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { - npc_ball_of_flameAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) - { - _chaseGUID = 0; - _exploded = false; - _started = false; - if (me->GetEntry() == NPC_BALL_OF_INFERNO_FLAME) - me->CastSpell(me, SPELL_BALL_OF_FLAMES_PROC, true); - me->NearTeleportTo(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+5.0f, me->GetOrientation()); - } - - InstanceScript* _instance; - uint64 _chaseGUID; - bool _exploded; - bool _started; - - void AttackStart(Unit* who) - { - if (_started) - ScriptedAI::AttackStart(who); - } - - void MoveInLineOfSight(Unit* /*who*/) {} - - void MovementInform(uint32 type, uint32 /*id*/) - { - if (type == CHASE_MOTION_TYPE && !_exploded) - { - me->RemoveAurasDueToSpell(SPELL_BALL_OF_FLAMES_PERIODIC); - me->SetReactState(REACT_PASSIVE); - me->SetControlled(true, UNIT_STATE_ROOT); - me->StopMoving(); - me->CastSpell(me, SPELL_FLAMES, true); - me->DespawnOrUnsummon(999); - me->CastSpell(me, SPELL_FLAME_SPHERE_DEATH_EFFECT, true); - _exploded = true; - } - } - - void SetGUID(uint64 guid, int32 /*type*/) - { - _chaseGUID = guid; - } - - void DoAction(int32 action) - { - if (action != ACTION_FLAME_BALL_CHASE || me->IsInCombat()) - { - return; - } - - Player* target = nullptr; - - if (_chaseGUID) - { - target = ObjectAccessor::GetPlayer(*me, _chaseGUID); - } - if (!target) - { - target = ScriptedAI::SelectTargetFromPlayerList(150.0f, 0, true); - } - if (target) - { - // need to clear states now because this call is before AuraEffect is fully removed - _started = true; - if (me->GetEntry() == NPC_BALL_OF_INFERNO_FLAME) - me->CastSpell(me, SPELL_BALL_OF_FLAMES_PERIODIC, true); - me->ClearUnitState(UNIT_STATE_CASTING | UNIT_STATE_STUNNED); - me->AddThreat(target, 1000.0f); - me->SetCanFly(true); - me->SetDisableGravity(true); - me->SetHover(true); - me->SendMovementFlagUpdate(); - AttackStart(target); - me->SetInCombatWithZone(); - return; - } - me->DespawnOrUnsummon(1); - } - - void DamageDealt(Unit* target, uint32& damage, DamageEffectType /*damageType*/) - { - if (target->GetTypeId() != TYPEID_PLAYER) - { - return; - } - - if (damage > RAID_MODE(23000, 25000, 23000, 25000)) - { - _instance->SetData(DATA_ORB_WHISPERER_ACHIEVEMENT, 0); - } - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + _chaseGUID = 0; + _exploded = false; + _started = false; + if (me->GetEntry() == NPC_BALL_OF_INFERNO_FLAME) + me->CastSpell(me, SPELL_BALL_OF_FLAMES_PROC, true); + me->NearTeleportTo(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 5.0f, me->GetOrientation()); } + + InstanceScript* _instance; + uint64 _chaseGUID; + bool _exploded; + bool _started; + + void AttackStart(Unit* who) + { + if (_started) + ScriptedAI::AttackStart(who); + } + + void MoveInLineOfSight(Unit* /*who*/) {} + + void MovementInform(uint32 type, uint32 /*id*/) + { + if (type == CHASE_MOTION_TYPE && !_exploded) + { + me->RemoveAurasDueToSpell(SPELL_BALL_OF_FLAMES_PERIODIC); + me->SetReactState(REACT_PASSIVE); + me->SetControlled(true, UNIT_STATE_ROOT); + me->StopMoving(); + me->CastSpell(me, SPELL_FLAMES, true); + me->DespawnOrUnsummon(999); + me->CastSpell(me, SPELL_FLAME_SPHERE_DEATH_EFFECT, true); + _exploded = true; + } + } + + void SetGUID(uint64 guid, int32 /*type*/) + { + _chaseGUID = guid; + } + + void DoAction(int32 action) + { + if (action != ACTION_FLAME_BALL_CHASE || me->IsInCombat()) + { + return; + } + + Player* target = nullptr; + + if (_chaseGUID) + { + target = ObjectAccessor::GetPlayer(*me, _chaseGUID); + } + if (!target) + { + target = ScriptedAI::SelectTargetFromPlayerList(150.0f, 0, true); + } + if (target) + { + // need to clear states now because this call is before AuraEffect is fully removed + _started = true; + if (me->GetEntry() == NPC_BALL_OF_INFERNO_FLAME) + me->CastSpell(me, SPELL_BALL_OF_FLAMES_PERIODIC, true); + me->ClearUnitState(UNIT_STATE_CASTING | UNIT_STATE_STUNNED); + me->AddThreat(target, 1000.0f); + me->SetCanFly(true); + me->SetDisableGravity(true); + me->SetHover(true); + me->SendMovementFlagUpdate(); + AttackStart(target); + me->SetInCombatWithZone(); + return; + } + me->DespawnOrUnsummon(1); + } + + void DamageDealt(Unit* target, uint32& damage, DamageEffectType /*damageType*/) + { + if (target->GetTypeId() != TYPEID_PLAYER) + { + return; + } + + if (damage > RAID_MODE(23000, 25000, 23000, 25000)) + { + _instance->SetData(DATA_ORB_WHISPERER_ACHIEVEMENT, 0); + } + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class npc_kinetic_bomb : public CreatureScript { - public: - npc_kinetic_bomb() : CreatureScript("npc_kinetic_bomb") { } +public: + npc_kinetic_bomb() : CreatureScript("npc_kinetic_bomb") { } - struct npc_kinetic_bombAI : public NullCreatureAI + struct npc_kinetic_bombAI : public NullCreatureAI + { + npc_kinetic_bombAI(Creature* creature) : NullCreatureAI(creature) { - npc_kinetic_bombAI(Creature* creature) : NullCreatureAI(creature) - { - } - - EventMap _events; - float _x; - float _y; - float _groundZ; - bool exploded; - - void IsSummonedBy(Unit* /*summoner*/) - { - if (InstanceScript* instance = me->GetInstanceScript()) - { - if (Creature* valanar = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_VALANAR_GUID))) - { - valanar->AI()->JustSummoned(me); - } - } - } - - void Reset() - { - _events.Reset(); - _events.RescheduleEvent(EVENT_BOMB_DESPAWN, 60000); - me->SetWalk(true); - exploded = false; - - float x, y, z; - me->GetPosition(x, y, z); - _x = x; - _y = y; - _groundZ = me->GetMap()->GetHeight(me->GetPhaseMask(), x, y, z, true, 500.0f); - me->GetMotionMaster()->MoveCharge(_x, _y, _groundZ, me->GetSpeed(MOVE_WALK)); - } - - void DoAction(int32 action) - { - if (action == SPELL_KINETIC_BOMB_EXPLOSION) - { - exploded = true; - _events.RescheduleEvent(EVENT_BOMB_DESPAWN, 1000); - } - else if (action == ACTION_KINETIC_BOMB_JUMP) - { - if (!me->HasAura(SPELL_KINETIC_BOMB_KNOCKBACK)) - { - me->GetMotionMaster()->MovementExpired(false); - me->StopMoving(); - me->GetMotionMaster()->MoveCharge(_x, _y, me->GetPositionZ() + 60.0f, me->GetSpeed(MOVE_RUN)); - } - _events.RescheduleEvent(EVENT_CONTINUE_FALLING, 3000); - } - } - - void UpdateAI(uint32 diff) - { - _events.Update(diff); - switch (_events.ExecuteEvent()) - { - case EVENT_BOMB_DESPAWN: - me->RemoveAllAuras(); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->DespawnOrUnsummon(exploded ? 5000 : 0); - break; - case EVENT_CONTINUE_FALLING: - me->GetMotionMaster()->MovementExpired(false); - me->StopMoving(); - me->GetMotionMaster()->MoveCharge(_x, _y, _groundZ, me->GetSpeed(MOVE_WALK)); - break; - } - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); } + + EventMap _events; + float _x; + float _y; + float _groundZ; + bool exploded; + + void IsSummonedBy(Unit* /*summoner*/) + { + if (InstanceScript* instance = me->GetInstanceScript()) + { + if (Creature* valanar = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_VALANAR_GUID))) + { + valanar->AI()->JustSummoned(me); + } + } + } + + void Reset() + { + _events.Reset(); + _events.RescheduleEvent(EVENT_BOMB_DESPAWN, 60000); + me->SetWalk(true); + exploded = false; + + float x, y, z; + me->GetPosition(x, y, z); + _x = x; + _y = y; + _groundZ = me->GetMap()->GetHeight(me->GetPhaseMask(), x, y, z, true, 500.0f); + me->GetMotionMaster()->MoveCharge(_x, _y, _groundZ, me->GetSpeed(MOVE_WALK)); + } + + void DoAction(int32 action) + { + if (action == SPELL_KINETIC_BOMB_EXPLOSION) + { + exploded = true; + _events.RescheduleEvent(EVENT_BOMB_DESPAWN, 1000); + } + else if (action == ACTION_KINETIC_BOMB_JUMP) + { + if (!me->HasAura(SPELL_KINETIC_BOMB_KNOCKBACK)) + { + me->GetMotionMaster()->MovementExpired(false); + me->StopMoving(); + me->GetMotionMaster()->MoveCharge(_x, _y, me->GetPositionZ() + 60.0f, me->GetSpeed(MOVE_RUN)); + } + _events.RescheduleEvent(EVENT_CONTINUE_FALLING, 3000); + } + } + + void UpdateAI(uint32 diff) + { + _events.Update(diff); + switch (_events.ExecuteEvent()) + { + case EVENT_BOMB_DESPAWN: + me->RemoveAllAuras(); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->DespawnOrUnsummon(exploded ? 5000 : 0); + break; + case EVENT_CONTINUE_FALLING: + me->GetMotionMaster()->MovementExpired(false); + me->StopMoving(); + me->GetMotionMaster()->MoveCharge(_x, _y, _groundZ, me->GetSpeed(MOVE_WALK)); + break; + } + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class spell_blood_council_shadow_prison : public SpellScriptLoader { - public: - spell_blood_council_shadow_prison() : SpellScriptLoader("spell_blood_council_shadow_prison") { } +public: + spell_blood_council_shadow_prison() : SpellScriptLoader("spell_blood_council_shadow_prison") { } - class spell_blood_council_shadow_prison_AuraScript : public AuraScript + class spell_blood_council_shadow_prison_AuraScript : public AuraScript + { + PrepareAuraScript(spell_blood_council_shadow_prison_AuraScript); + + void HandleDummyTick(AuraEffect const* aurEff) { - PrepareAuraScript(spell_blood_council_shadow_prison_AuraScript); - - void HandleDummyTick(AuraEffect const* aurEff) + if (GetTarget()->GetTypeId() == TYPEID_PLAYER && GetTarget()->isMoving()) { - if (GetTarget()->GetTypeId() == TYPEID_PLAYER && GetTarget()->isMoving()) - { - GetTarget()->CastSpell(GetTarget(), SPELL_SHADOW_PRISON_DAMAGE, true, NULL, aurEff); - } + GetTarget()->CastSpell(GetTarget(), SPELL_SHADOW_PRISON_DAMAGE, true, NULL, aurEff); } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_blood_council_shadow_prison_AuraScript::HandleDummyTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_blood_council_shadow_prison_AuraScript(); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_blood_council_shadow_prison_AuraScript::HandleDummyTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_blood_council_shadow_prison_AuraScript(); + } }; class spell_blood_council_shadow_prison_damage : public SpellScriptLoader { - public: - spell_blood_council_shadow_prison_damage() : SpellScriptLoader("spell_blood_council_shadow_prison_damage") { } +public: + spell_blood_council_shadow_prison_damage() : SpellScriptLoader("spell_blood_council_shadow_prison_damage") { } - class spell_blood_council_shadow_prison_SpellScript : public SpellScript + class spell_blood_council_shadow_prison_SpellScript : public SpellScript + { + PrepareSpellScript(spell_blood_council_shadow_prison_SpellScript); + + void AddExtraDamage() { - PrepareSpellScript(spell_blood_council_shadow_prison_SpellScript); - - void AddExtraDamage() + if (Aura* aur = GetHitUnit()->GetAura(GetSpellInfo()->Id)) { - if (Aura* aur = GetHitUnit()->GetAura(GetSpellInfo()->Id)) + if (AuraEffect const* eff = aur->GetEffect(EFFECT_1)) { - if (AuraEffect const* eff = aur->GetEffect(EFFECT_1)) - { - SetHitDamage(GetHitDamage() + eff->GetAmount()); - } + SetHitDamage(GetHitDamage() + eff->GetAmount()); } } - - void Register() - { - OnHit += SpellHitFn(spell_blood_council_shadow_prison_SpellScript::AddExtraDamage); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_blood_council_shadow_prison_SpellScript(); } + + void Register() + { + OnHit += SpellHitFn(spell_blood_council_shadow_prison_SpellScript::AddExtraDamage); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_blood_council_shadow_prison_SpellScript(); + } }; class spell_taldaram_glittering_sparks : public SpellScriptLoader { - public: - spell_taldaram_glittering_sparks() : SpellScriptLoader("spell_taldaram_glittering_sparks") { } +public: + spell_taldaram_glittering_sparks() : SpellScriptLoader("spell_taldaram_glittering_sparks") { } - class spell_taldaram_glittering_sparks_SpellScript : public SpellScript + class spell_taldaram_glittering_sparks_SpellScript : public SpellScript + { + PrepareSpellScript(spell_taldaram_glittering_sparks_SpellScript); + + void HandleScript(SpellEffIndex effIndex) { - PrepareSpellScript(spell_taldaram_glittering_sparks_SpellScript); - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetCaster()->CastSpell(GetCaster(), uint32(GetEffectValue()), true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_taldaram_glittering_sparks_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_taldaram_glittering_sparks_SpellScript(); + PreventHitDefaultEffect(effIndex); + GetCaster()->CastSpell(GetCaster(), uint32(GetEffectValue()), true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_taldaram_glittering_sparks_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_taldaram_glittering_sparks_SpellScript(); + } }; class spell_taldaram_summon_flame_ball : public SpellScriptLoader { - public: - spell_taldaram_summon_flame_ball() : SpellScriptLoader("spell_taldaram_summon_flame_ball") { } +public: + spell_taldaram_summon_flame_ball() : SpellScriptLoader("spell_taldaram_summon_flame_ball") { } - class spell_taldaram_summon_flame_ball_SpellScript : public SpellScript + class spell_taldaram_summon_flame_ball_SpellScript : public SpellScript + { + PrepareSpellScript(spell_taldaram_summon_flame_ball_SpellScript); + + bool Load() { - PrepareSpellScript(spell_taldaram_summon_flame_ball_SpellScript); - - bool Load() + if (GetCaster()->GetTypeId() != TYPEID_UNIT) { - if (GetCaster()->GetTypeId() != TYPEID_UNIT) - { - return false; - } - GetCaster()->CastSpell(GetCaster(), uint32(GetSpellInfo()->Effects[0].CalcValue()), true); - return true; + return false; } - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetCaster()->ToCreature()->AI()->DoAction(ACTION_FLAME_BALL_CHASE); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_taldaram_summon_flame_ball_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_taldaram_summon_flame_ball_SpellScript(); + GetCaster()->CastSpell(GetCaster(), uint32(GetSpellInfo()->Effects[0].CalcValue()), true); + return true; } + + void HandleScript(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + GetCaster()->ToCreature()->AI()->DoAction(ACTION_FLAME_BALL_CHASE); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_taldaram_summon_flame_ball_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_taldaram_summon_flame_ball_SpellScript(); + } }; class spell_taldaram_ball_of_inferno_flame : public SpellScriptLoader { - public: - spell_taldaram_ball_of_inferno_flame() : SpellScriptLoader("spell_taldaram_ball_of_inferno_flame") { } +public: + spell_taldaram_ball_of_inferno_flame() : SpellScriptLoader("spell_taldaram_ball_of_inferno_flame") { } - class spell_taldaram_ball_of_inferno_flame_SpellScript : public SpellScript + class spell_taldaram_ball_of_inferno_flame_SpellScript : public SpellScript + { + PrepareSpellScript(spell_taldaram_ball_of_inferno_flame_SpellScript); + + void ModAuraStack() { - PrepareSpellScript(spell_taldaram_ball_of_inferno_flame_SpellScript); - - void ModAuraStack() - { - if (Aura* aur = GetHitAura()) - aur->SetStackAmount(uint8(GetSpellInfo()->StackAmount)); - } - - void Register() - { - AfterHit += SpellHitFn(spell_taldaram_ball_of_inferno_flame_SpellScript::ModAuraStack); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_taldaram_ball_of_inferno_flame_SpellScript(); + if (Aura* aur = GetHitAura()) + aur->SetStackAmount(uint8(GetSpellInfo()->StackAmount)); } + + void Register() + { + AfterHit += SpellHitFn(spell_taldaram_ball_of_inferno_flame_SpellScript::ModAuraStack); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_taldaram_ball_of_inferno_flame_SpellScript(); + } }; class spell_valanar_kinetic_bomb : public SpellScriptLoader { - public: - spell_valanar_kinetic_bomb() : SpellScriptLoader("spell_valanar_kinetic_bomb") { } +public: + spell_valanar_kinetic_bomb() : SpellScriptLoader("spell_valanar_kinetic_bomb") { } - class spell_valanar_kinetic_bomb_SpellScript : public SpellScript + class spell_valanar_kinetic_bomb_SpellScript : public SpellScript + { + PrepareSpellScript(spell_valanar_kinetic_bomb_SpellScript); + + void ChangeSummonPos(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_valanar_kinetic_bomb_SpellScript); - - void ChangeSummonPos(SpellEffIndex /*effIndex*/) - { - WorldLocation summonPos = *GetExplTargetDest(); - Position offset = {0.0f, 0.0f, 20.0f, 0.0f}; - summonPos.RelocateOffset(offset); - SetExplTargetDest(summonPos); - GetHitDest()->RelocateOffset(offset); - } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_valanar_kinetic_bomb_SpellScript::ChangeSummonPos, EFFECT_0, SPELL_EFFECT_SUMMON); - } - }; - - class spell_valanar_kinetic_bomb_AuraScript : public AuraScript - { - PrepareAuraScript(spell_valanar_kinetic_bomb_AuraScript); - - void HandleDummyTick(AuraEffect const* /*aurEff*/) - { - Unit* target = GetTarget(); - if (target->GetTypeId() != TYPEID_UNIT) - return; - - if (Creature* bomb = target->FindNearestCreature(NPC_KINETIC_BOMB, 1.0f, true)) - { - bomb->CastSpell(bomb, SPELL_KINETIC_BOMB_EXPLOSION, true); - bomb->RemoveAurasDueToSpell(SPELL_KINETIC_BOMB_VISUAL); - target->RemoveAura(GetAura()); - bomb->AI()->DoAction(SPELL_KINETIC_BOMB_EXPLOSION); - } - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_valanar_kinetic_bomb_AuraScript::HandleDummyTick, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_valanar_kinetic_bomb_SpellScript(); + WorldLocation summonPos = *GetExplTargetDest(); + Position offset = {0.0f, 0.0f, 20.0f, 0.0f}; + summonPos.RelocateOffset(offset); + SetExplTargetDest(summonPos); + GetHitDest()->RelocateOffset(offset); } - AuraScript* GetAuraScript() const + void Register() { - return new spell_valanar_kinetic_bomb_AuraScript(); + OnEffectHit += SpellEffectFn(spell_valanar_kinetic_bomb_SpellScript::ChangeSummonPos, EFFECT_0, SPELL_EFFECT_SUMMON); } + }; + + class spell_valanar_kinetic_bomb_AuraScript : public AuraScript + { + PrepareAuraScript(spell_valanar_kinetic_bomb_AuraScript); + + void HandleDummyTick(AuraEffect const* /*aurEff*/) + { + Unit* target = GetTarget(); + if (target->GetTypeId() != TYPEID_UNIT) + return; + + if (Creature* bomb = target->FindNearestCreature(NPC_KINETIC_BOMB, 1.0f, true)) + { + bomb->CastSpell(bomb, SPELL_KINETIC_BOMB_EXPLOSION, true); + bomb->RemoveAurasDueToSpell(SPELL_KINETIC_BOMB_VISUAL); + target->RemoveAura(GetAura()); + bomb->AI()->DoAction(SPELL_KINETIC_BOMB_EXPLOSION); + } + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_valanar_kinetic_bomb_AuraScript::HandleDummyTick, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_valanar_kinetic_bomb_SpellScript(); + } + + AuraScript* GetAuraScript() const + { + return new spell_valanar_kinetic_bomb_AuraScript(); + } }; class spell_valanar_kinetic_bomb_absorb : public SpellScriptLoader { - public: - spell_valanar_kinetic_bomb_absorb() : SpellScriptLoader("spell_valanar_kinetic_bomb_absorb") { } +public: + spell_valanar_kinetic_bomb_absorb() : SpellScriptLoader("spell_valanar_kinetic_bomb_absorb") { } - class spell_valanar_kinetic_bomb_absorb_AuraScript : public AuraScript + class spell_valanar_kinetic_bomb_absorb_AuraScript : public AuraScript + { + PrepareAuraScript(spell_valanar_kinetic_bomb_absorb_AuraScript); + + void OnAbsorb(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount) { - PrepareAuraScript(spell_valanar_kinetic_bomb_absorb_AuraScript); - - void OnAbsorb(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount) - { - absorbAmount = CalculatePct(dmgInfo.GetDamage(), aurEff->GetAmount()); - RoundToInterval(absorbAmount, 0, dmgInfo.GetDamage()); - dmgInfo.AbsorbDamage(absorbAmount); - } - - void Register() - { - OnEffectAbsorb += AuraEffectAbsorbFn(spell_valanar_kinetic_bomb_absorb_AuraScript::OnAbsorb, EFFECT_0); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_valanar_kinetic_bomb_absorb_AuraScript(); + absorbAmount = CalculatePct(dmgInfo.GetDamage(), aurEff->GetAmount()); + RoundToInterval(absorbAmount, 0, dmgInfo.GetDamage()); + dmgInfo.AbsorbDamage(absorbAmount); } + + void Register() + { + OnEffectAbsorb += AuraEffectAbsorbFn(spell_valanar_kinetic_bomb_absorb_AuraScript::OnAbsorb, EFFECT_0); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_valanar_kinetic_bomb_absorb_AuraScript(); + } }; class spell_valanar_kinetic_bomb_knockback : public SpellScriptLoader { - public: - spell_valanar_kinetic_bomb_knockback() : SpellScriptLoader("spell_valanar_kinetic_bomb_knockback") { } +public: + spell_valanar_kinetic_bomb_knockback() : SpellScriptLoader("spell_valanar_kinetic_bomb_knockback") { } - class spell_valanar_kinetic_bomb_knockback_SpellScript : public SpellScript + class spell_valanar_kinetic_bomb_knockback_SpellScript : public SpellScript + { + PrepareSpellScript(spell_valanar_kinetic_bomb_knockback_SpellScript); + + void KnockIntoAir() { - PrepareSpellScript(spell_valanar_kinetic_bomb_knockback_SpellScript); - - void KnockIntoAir() - { - if (Creature* target = GetHitCreature()) - target->AI()->DoAction(ACTION_KINETIC_BOMB_JUMP); - } - - void Register() - { - BeforeHit += SpellHitFn(spell_valanar_kinetic_bomb_knockback_SpellScript::KnockIntoAir); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_valanar_kinetic_bomb_knockback_SpellScript(); + if (Creature* target = GetHitCreature()) + target->AI()->DoAction(ACTION_KINETIC_BOMB_JUMP); } + + void Register() + { + BeforeHit += SpellHitFn(spell_valanar_kinetic_bomb_knockback_SpellScript::KnockIntoAir); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_valanar_kinetic_bomb_knockback_SpellScript(); + } }; class spell_valanar_kinetic_bomb_summon : public SpellScriptLoader { - public: - spell_valanar_kinetic_bomb_summon() : SpellScriptLoader("spell_valanar_kinetic_bomb_summon") { } +public: + spell_valanar_kinetic_bomb_summon() : SpellScriptLoader("spell_valanar_kinetic_bomb_summon") { } - class spell_valanar_kinetic_bomb_summon_SpellScript : public SpellScript + class spell_valanar_kinetic_bomb_summon_SpellScript : public SpellScript + { + PrepareSpellScript(spell_valanar_kinetic_bomb_summon_SpellScript); + + void SelectDest() { - PrepareSpellScript(spell_valanar_kinetic_bomb_summon_SpellScript); - - void SelectDest() + if (Position* dest = const_cast(GetExplTargetDest())) { - if (Position* dest = const_cast(GetExplTargetDest())) - { - float angle = dest->GetAngle(GetCaster()); - Position offset = {6.0f*cos(angle), 6.0f*sin(angle), 10.0f, 0.0f}; - dest->RelocateOffset(offset); - GetCaster()->UpdateAllowedPositionZ(dest->GetPositionX(), dest->GetPositionY(), dest->m_positionZ); - } + float angle = dest->GetAngle(GetCaster()); + Position offset = {6.0f * cos(angle), 6.0f * sin(angle), 10.0f, 0.0f}; + dest->RelocateOffset(offset); + GetCaster()->UpdateAllowedPositionZ(dest->GetPositionX(), dest->GetPositionY(), dest->m_positionZ); } - - void Register() - { - BeforeCast += SpellCastFn(spell_valanar_kinetic_bomb_summon_SpellScript::SelectDest); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_valanar_kinetic_bomb_summon_SpellScript(); } + + void Register() + { + BeforeCast += SpellCastFn(spell_valanar_kinetic_bomb_summon_SpellScript::SelectDest); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_valanar_kinetic_bomb_summon_SpellScript(); + } }; class spell_blood_council_summon_shadow_resonance : public SpellScriptLoader { - public: - spell_blood_council_summon_shadow_resonance() : SpellScriptLoader("spell_blood_council_summon_shadow_resonance") { } +public: + spell_blood_council_summon_shadow_resonance() : SpellScriptLoader("spell_blood_council_summon_shadow_resonance") { } - class spell_blood_council_summon_shadow_resonance_SpellScript : public SpellScript + class spell_blood_council_summon_shadow_resonance_SpellScript : public SpellScript + { + PrepareSpellScript(spell_blood_council_summon_shadow_resonance_SpellScript); + + void SetDest(SpellDestination& dest) { - PrepareSpellScript(spell_blood_council_summon_shadow_resonance_SpellScript); + Unit* summoner = GetCaster(); + float x = dest._position.GetPositionX(); + float y = dest._position.GetPositionY(); + float angle = summoner->GetAngle(x, y); + if (dest._position.GetExactDist2d(summoner) > 35.0f && x > 4585.0f && y > 2716.0f && y < 2822.0f) + return; - void SetDest(SpellDestination& dest) - { - Unit* summoner = GetCaster(); - float x = dest._position.GetPositionX(); - float y = dest._position.GetPositionY(); - float angle = summoner->GetAngle(x, y); - if (dest._position.GetExactDist2d(summoner) > 35.0f && x > 4585.0f && y > 2716.0f && y < 2822.0f) - return; - - for (uint8 a=0; a<2; ++a) - for (uint8 i=6; i>0; --i) + for (uint8 a = 0; a < 2; ++a) + for (uint8 i = 6; i > 0; --i) + { + float destX = summoner->GetPositionX() + cos(angle + a * M_PI) * i * 10.0f; + float destY = summoner->GetPositionY() + sin(angle + a * M_PI) * i * 10.0f; + if (summoner->GetMap()->isInLineOfSight(summoner->GetPositionX(), summoner->GetPositionY(), summoner->GetPositionZ() + 10.0f, destX, destY, summoner->GetPositionZ() + 10.0f, summoner->GetPhaseMask(), LINEOFSIGHT_ALL_CHECKS) && destX > 4585.0f && destY > 2716.0f && destY < 2822.0f) { - float destX = summoner->GetPositionX()+cos(angle + a*M_PI)*i*10.0f; - float destY = summoner->GetPositionY()+sin(angle + a*M_PI)*i*10.0f; - if (summoner->GetMap()->isInLineOfSight(summoner->GetPositionX(), summoner->GetPositionY(), summoner->GetPositionZ()+10.0f, destX, destY, summoner->GetPositionZ()+10.0f, summoner->GetPhaseMask(), LINEOFSIGHT_ALL_CHECKS) && destX > 4585.0f && destY > 2716.0f && destY < 2822.0f) + float destZ = summoner->GetMap()->GetHeight(summoner->GetPhaseMask(), destX, destY, summoner->GetPositionZ() + 10.0f); + if (fabs(destZ - summoner->GetPositionZ()) < 10.0f) // valid z found { - float destZ = summoner->GetMap()->GetHeight(summoner->GetPhaseMask(), destX, destY, summoner->GetPositionZ()+10.0f); - if (fabs(destZ-summoner->GetPositionZ()) < 10.0f) // valid z found - { - dest._position.Relocate(destX, destY, destZ); - return; - } + dest._position.Relocate(destX, destY, destZ); + return; } } + } - dest._position.Relocate(summoner->GetPositionX(), summoner->GetPositionY(), summoner->GetPositionZ()); - } - - void Register() - { - OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_blood_council_summon_shadow_resonance_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER_RANDOM); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_blood_council_summon_shadow_resonance_SpellScript(); + dest._position.Relocate(summoner->GetPositionX(), summoner->GetPositionY(), summoner->GetPositionZ()); } + + void Register() + { + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_blood_council_summon_shadow_resonance_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER_RANDOM); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_blood_council_summon_shadow_resonance_SpellScript(); + } }; void AddSC_boss_blood_prince_council() diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp index fa6065853..99dfb5c38 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp @@ -121,460 +121,460 @@ Position const mincharPos = {4629.3711f, 2782.6089f, 424.6390f, 0.000000f}; class boss_blood_queen_lana_thel : public CreatureScript { - public: - boss_blood_queen_lana_thel() : CreatureScript("boss_blood_queen_lana_thel") { } +public: + boss_blood_queen_lana_thel() : CreatureScript("boss_blood_queen_lana_thel") { } - struct boss_blood_queen_lana_thelAI : public BossAI + struct boss_blood_queen_lana_thelAI : public BossAI + { + boss_blood_queen_lana_thelAI(Creature* creature) : BossAI(creature, DATA_BLOOD_QUEEN_LANA_THEL) { - boss_blood_queen_lana_thelAI(Creature* creature) : BossAI(creature, DATA_BLOOD_QUEEN_LANA_THEL) + bEnteredCombat = false; + } + + bool _creditBloodQuickening; + bool _killMinchar; + uint64 _tankGUID; + uint64 _offtankGUID; + std::set _bloodboltedPlayers; + std::set _vampires; + bool bEnteredCombat; // needed for failing an attempt in JustReachedHome() + + void Reset() + { + _creditBloodQuickening = false; + _killMinchar = false; + _tankGUID = 0; + _offtankGUID = 0; + _vampires.clear(); + CleanAuras(); + me->SetReactState(REACT_AGGRESSIVE); + + events.Reset(); + summons.DespawnAll(); + if (instance->GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) != DONE) + instance->SetBossState(DATA_BLOOD_QUEEN_LANA_THEL, NOT_STARTED); + } + + void EnterCombat(Unit* who) + { + if (!instance->CheckRequiredBosses(DATA_BLOOD_QUEEN_LANA_THEL, who->ToPlayer()) || !me->IsVisible()) + { + EnterEvadeMode(); + instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT); + return; + } + + bEnteredCombat = true; + me->CastSpell(me, SPELL_SHROUD_OF_SORROW, true); + me->CastSpell(me, SPELL_FRENZIED_BLOODTHIRST_VISUAL, true); + events.Reset(); + events.ScheduleEvent(EVENT_BERSERK, 330000); + events.ScheduleEvent(EVENT_VAMPIRIC_BITE, 15000); + events.ScheduleEvent(EVENT_BLOOD_MIRROR, 2500); + events.ScheduleEvent(EVENT_DELIRIOUS_SLASH, urand(10000, 12000)); + events.ScheduleEvent(EVENT_PACT_OF_THE_DARKFALLEN, 20000); + events.ScheduleEvent(EVENT_SWARMING_SHADOWS, 30000); + events.ScheduleEvent(EVENT_TWILIGHT_BLOODBOLT, urand(15000, 25000)); + events.ScheduleEvent(EVENT_AIR_PHASE, 124000 + uint32(Is25ManRaid() ? 3000 : 0)); + + CleanAuras(); + me->setActive(true); + DoZoneInCombat(); + Talk(SAY_AGGRO); + if (instance->GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) != DONE) + instance->SetBossState(DATA_BLOOD_QUEEN_LANA_THEL, IN_PROGRESS); + _creditBloodQuickening = instance->GetData(DATA_BLOOD_QUICKENING_STATE) == IN_PROGRESS; + } + + void JustDied(Unit* /*killer*/) + { + _JustDied(); + Talk(SAY_DEATH); + + if (Is25ManRaid() && me->HasAura(SPELL_SHADOWS_FATE)) + DoCastAOE(SPELL_BLOOD_INFUSION_CREDIT, true); + + CleanAuras(); + + if (_creditBloodQuickening) + { + instance->SetData(DATA_BLOOD_QUICKENING_STATE, DONE); + Map::PlayerList const& pl = me->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) + if (Player* p = itr->GetSource()) + p->KilledMonsterCredit(RAID_MODE(NPC_INFILTRATOR_MINCHAR_BQ, NPC_BLOOD_QUICKENING_CREDIT_25), 0); + if (Creature* minchar = me->FindNearestCreature(NPC_INFILTRATOR_MINCHAR_BQ, 200.0f)) + { + minchar->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); + minchar->SetCanFly(false); + minchar->SetDisableGravity(false); + minchar->SetHover(false); + minchar->RemoveAllAuras(); + minchar->GetMotionMaster()->MoveCharge(4629.3711f, 2782.6089f, 401.5301f, SPEED_CHARGE / 3.0f); + } + } + } + + void GoToMinchar() + { + if (!me->IsAlive()) + return; + instance->SetData(DATA_BLOOD_QUICKENING_STATE, DONE); + me->AddUnitState(UNIT_STATE_EVADE); + me->SendMeleeAttackStop(me->GetVictim()); + me->GetMotionMaster()->MoveIdle(); + me->StopMoving(); + me->SetCanFly(true); + me->SetDisableGravity(true); + me->SetHover(true); + me->SendMovementFlagUpdate(); + me->GetMotionMaster()->MovePoint(POINT_MINCHAR, mincharPos); + } + + void DoAction(int32 action) + { + if (action != ACTION_KILL_MINCHAR) + return; + + if (instance->GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) == IN_PROGRESS) + _killMinchar = true; + else + GoToMinchar(); + } + + void JustReachedHome() + { + me->SetCanFly(false); + me->SetDisableGravity(false); + me->SetHover(false); + + _JustReachedHome(); + if (bEnteredCombat) { bEnteredCombat = false; + if (me->IsAlive() && instance->GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) != DONE) + instance->SetBossState(DATA_BLOOD_QUEEN_LANA_THEL, FAIL); } + } - bool _creditBloodQuickening; - bool _killMinchar; - uint64 _tankGUID; - uint64 _offtankGUID; - std::set _bloodboltedPlayers; - std::set _vampires; - bool bEnteredCombat; // needed for failing an attempt in JustReachedHome() + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_KILL); + } - void Reset() + void MovementInform(uint32 type, uint32 id) + { + if (type != EFFECT_MOTION_TYPE && type != POINT_MOTION_TYPE) + return; + + switch (id) { - _creditBloodQuickening = false; - _killMinchar = false; - _tankGUID = 0; - _offtankGUID = 0; - _vampires.clear(); - CleanAuras(); - me->SetReactState(REACT_AGGRESSIVE); - - events.Reset(); - summons.DespawnAll(); - if (instance->GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) != DONE) - instance->SetBossState(DATA_BLOOD_QUEEN_LANA_THEL, NOT_STARTED); + case POINT_CENTER: + me->CastSpell(me, SPELL_INCITE_TERROR, false); + events.ScheduleEvent(EVENT_AIR_PHASE, 100000 + uint32(Is25ManRaid() ? 0 : 20000)); + events.ScheduleEvent(EVENT_AIR_START_FLYING, 2500); + break; + case POINT_AIR: + _bloodboltedPlayers.clear(); + me->CastSpell(me, SPELL_BLOODBOLT_WHIRL, false); + Talk(SAY_AIR_PHASE); + events.ScheduleEvent(EVENT_AIR_FLY_DOWN, 7000); + break; + case POINT_GROUND: + me->SetCanFly(false); + me->SetDisableGravity(false); + me->SetHover(false); + me->SetReactState(REACT_AGGRESSIVE); + if (Unit* target = me->SelectVictim()) + AttackStart(target); + events.RescheduleEvent(EVENT_PACT_OF_THE_DARKFALLEN, 5000); + events.RescheduleEvent(EVENT_SWARMING_SHADOWS, 20000); + break; + case POINT_MINCHAR: + me->CastSpell(me, SPELL_ANNIHILATE, true); + me->GetMotionMaster()->MoveTargetedHome(); + Reset(); + default: + break; } + } - void EnterCombat(Unit* who) + void UpdateAI(uint32 diff) + { + if (!UpdateVictim() || !CheckInRoom()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) { - if (!instance->CheckRequiredBosses(DATA_BLOOD_QUEEN_LANA_THEL, who->ToPlayer()) || !me->IsVisible()) - { - EnterEvadeMode(); - instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT); - return; - } - - bEnteredCombat = true; - me->CastSpell(me, SPELL_SHROUD_OF_SORROW, true); - me->CastSpell(me, SPELL_FRENZIED_BLOODTHIRST_VISUAL, true); - events.Reset(); - events.ScheduleEvent(EVENT_BERSERK, 330000); - events.ScheduleEvent(EVENT_VAMPIRIC_BITE, 15000); - events.ScheduleEvent(EVENT_BLOOD_MIRROR, 2500); - events.ScheduleEvent(EVENT_DELIRIOUS_SLASH, urand(10000, 12000)); - events.ScheduleEvent(EVENT_PACT_OF_THE_DARKFALLEN, 20000); - events.ScheduleEvent(EVENT_SWARMING_SHADOWS, 30000); - events.ScheduleEvent(EVENT_TWILIGHT_BLOODBOLT, urand(15000, 25000)); - events.ScheduleEvent(EVENT_AIR_PHASE, 124000 + uint32(Is25ManRaid() ? 3000 : 0)); - - CleanAuras(); - me->setActive(true); - DoZoneInCombat(); - Talk(SAY_AGGRO); - if (instance->GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) != DONE) - instance->SetBossState(DATA_BLOOD_QUEEN_LANA_THEL, IN_PROGRESS); - _creditBloodQuickening = instance->GetData(DATA_BLOOD_QUICKENING_STATE) == IN_PROGRESS; - } - - void JustDied(Unit* /*killer*/) - { - _JustDied(); - Talk(SAY_DEATH); - - if (Is25ManRaid() && me->HasAura(SPELL_SHADOWS_FATE)) - DoCastAOE(SPELL_BLOOD_INFUSION_CREDIT, true); - - CleanAuras(); - - if (_creditBloodQuickening) - { - instance->SetData(DATA_BLOOD_QUICKENING_STATE, DONE); - Map::PlayerList const& pl = me->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) - if (Player* p = itr->GetSource()) - p->KilledMonsterCredit(RAID_MODE(NPC_INFILTRATOR_MINCHAR_BQ, NPC_BLOOD_QUICKENING_CREDIT_25), 0); - if (Creature* minchar = me->FindNearestCreature(NPC_INFILTRATOR_MINCHAR_BQ, 200.0f)) + case EVENT_BERSERK: + Talk(EMOTE_BERSERK_RAID); + Talk(SAY_BERSERK); + me->CastSpell(me, SPELL_BERSERK, true); + break; + case EVENT_VAMPIRIC_BITE: { - minchar->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); - minchar->SetCanFly(false); - minchar->SetDisableGravity(false); - minchar->SetHover(false); - minchar->RemoveAllAuras(); - minchar->GetMotionMaster()->MoveCharge(4629.3711f, 2782.6089f, 401.5301f, SPEED_CHARGE/3.0f); + Player* target = nullptr; + float maxThreat = 0.0f; + const Map::PlayerList& pl = me->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) + if (Player* p = itr->GetSource()) + if (p->IsAlive() && p != me->GetVictim() && p->GetGUID() != _offtankGUID && !p->IsGameMaster() && p->GetDistance(me) < 70.0f) + { + float th = me->getThreatManager().getThreatWithoutTemp(p); + if (!target || th > maxThreat) + { + target = p; + maxThreat = th; + } + } + + if (target) + { + me->CastSpell(target, SPELL_VAMPIRIC_BITE, false); + me->CastSpell((Unit*)NULL, SPELL_VAMPIRIC_BITE_DUMMY, true); + Talk(SAY_VAMPIRIC_BITE); + SetGUID(target->GetGUID(), GUID_VAMPIRE); + target->CastSpell(target, SPELL_PRESENCE_OF_THE_DARKFALLEN_DUMMY, TRIGGERED_FULL_MASK); + target->CastSpell(target, SPELL_PRESENCE_OF_THE_DARKFALLEN_SE, TRIGGERED_FULL_MASK); + } } - } + break; + case EVENT_BLOOD_MIRROR: + if (me->GetVictim()) + { + std::list myList; + const Map::PlayerList& pl = me->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) + if (Player* p = itr->GetSource()) + if (p->IsAlive() && p != me->GetVictim() && !p->IsGameMaster() && !p->HasAura(SPELL_UNCONTROLLABLE_FRENZY)) + myList.push_back(p); + if (!myList.empty()) + { + myList.sort(acore::ObjectDistanceOrderPred(me->GetVictim())); + Player* target = myList.front(); + if (me->GetVictim()->GetGUID() != _tankGUID || target->GetGUID() != _offtankGUID) + { + // remove manually from previous, single target flag has nothing to do with this shit as caster is in every case different... tc retards + if (_tankGUID) + if (Player* prevTank = ObjectAccessor::GetPlayer(*me, _tankGUID)) + { + prevTank->RemoveAurasDueToSpell(SPELL_BLOOD_MIRROR_DAMAGE); + prevTank->RemoveAurasDueToSpell(SPELL_BLOOD_MIRROR_VISUAL); + } + if (_offtankGUID) + if (Player* prevOfftank = ObjectAccessor::GetPlayer(*me, _offtankGUID)) + prevOfftank->RemoveAurasDueToSpell(SPELL_BLOOD_MIRROR_DUMMY); + + if (target->GetDistance(me->GetVictim()) > 39.0f || me->GetDistance(me->GetVictim()) > 39.0f) + { + _tankGUID = 0; + _offtankGUID = 0; + events.ScheduleEvent(EVENT_BLOOD_MIRROR, 2500); + break; + } + + _tankGUID = me->GetVictim()->GetGUID(); + _offtankGUID = target->GetGUID(); + target->CastSpell(me->GetVictim(), SPELL_BLOOD_MIRROR_DAMAGE, true); + me->GetVictim()->CastSpell(target, SPELL_BLOOD_MIRROR_DUMMY, true); + me->CastSpell(me->GetVictim(), SPELL_BLOOD_MIRROR_VISUAL, false); + + if (Is25ManRaid() && target->GetQuestStatus(QUEST_BLOOD_INFUSION) == QUEST_STATUS_INCOMPLETE && + target->HasAura(SPELL_UNSATED_CRAVING) && !target->HasAura(SPELL_THIRST_QUENCHED) && !target->HasAura(SPELL_GUSHING_WOUND)) + target->CastSpell(target, SPELL_GUSHING_WOUND, TRIGGERED_FULL_MASK); + } + } + } + events.ScheduleEvent(EVENT_BLOOD_MIRROR, 2500); + break; + case EVENT_DELIRIOUS_SLASH: + if (!me->HasReactState(REACT_PASSIVE)) + { + Unit* target = nullptr; + if (_offtankGUID) + if (Unit* t = ObjectAccessor::GetUnit(*me, _offtankGUID)) + if (t->IsAlive() && t->GetDistance(me) < 10.0f) + target = t; + if (!target) + if (me->GetVictim() && me->GetVictim()->GetDistance(me) < 10.0f) + target = me->GetVictim(); + if (!target) + { + events.ScheduleEvent(EVENT_DELIRIOUS_SLASH, 5000); + break; + } + me->CastSpell(target, SPELL_DELIRIOUS_SLASH, false); + events.ScheduleEvent(EVENT_DELIRIOUS_SLASH, urand(20000, 24000)); + break; + } + events.ScheduleEvent(EVENT_DELIRIOUS_SLASH, 5000); + break; + case EVENT_PACT_OF_THE_DARKFALLEN: + if (!me->HasReactState(REACT_PASSIVE)) + { + std::list myList; + const Map::PlayerList& pl = me->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) + if (Player* p = itr->GetSource()) + if (p->IsAlive() && p != me->GetVictim() && p->GetGUID() != _offtankGUID && !p->IsGameMaster() && p->GetDistance(me) < 100.0f && !p->HasAura(SPELL_UNCONTROLLABLE_FRENZY)) + myList.push_back(p); + acore::Containers::RandomResizeList(myList, Is25ManRaid() ? 3 : 2); + if (myList.size() > 1) + { + Talk(SAY_PACT_OF_THE_DARKFALLEN); + for (std::list::iterator itr = myList.begin(); itr != myList.end(); ++itr) + me->CastSpell(*itr, SPELL_PACT_OF_THE_DARKFALLEN, false); + events.ScheduleEvent(EVENT_PACT_OF_THE_DARKFALLEN, 30000); + } + else + events.ScheduleEvent(EVENT_PACT_OF_THE_DARKFALLEN, 5000); + break; + } + events.ScheduleEvent(EVENT_PACT_OF_THE_DARKFALLEN, 5000); + break; + case EVENT_SWARMING_SHADOWS: + if (!me->HasReactState(REACT_PASSIVE)) + { + std::list myList; + const Map::PlayerList& pl = me->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) + if (Player* p = itr->GetSource()) + if (p->IsAlive() && p != me->GetVictim() && p->GetGUID() != _offtankGUID && !p->IsGameMaster() && !p->HasAura(SPELL_PACT_OF_THE_DARKFALLEN) && !p->HasAura(SPELL_UNCONTROLLABLE_FRENZY)) + myList.push_back(p); + + if (!myList.empty()) + { + acore::Containers::RandomResizeList(myList, 1); + Player* target = myList.front(); + Talk(EMOTE_SWARMING_SHADOWS, target); + Talk(SAY_SWARMING_SHADOWS); + me->CastSpell(target, SPELL_SWARMING_SHADOWS, false); + } + + events.ScheduleEvent(EVENT_SWARMING_SHADOWS, 30000); + break; + } + events.ScheduleEvent(EVENT_SWARMING_SHADOWS, 5000); + break; + case EVENT_TWILIGHT_BLOODBOLT: + if (!me->HasReactState(REACT_PASSIVE)) + { + std::list myList; + const Map::PlayerList& pl = me->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) + if (Player* p = itr->GetSource()) + if (p->IsAlive() && p != me->GetVictim() && p->GetGUID() != _offtankGUID && !p->IsGameMaster() && !p->HasAura(SPELL_PACT_OF_THE_DARKFALLEN) && !p->HasAura(SPELL_UNCONTROLLABLE_FRENZY)) + myList.push_back(p); + + acore::Containers::RandomResizeList(myList, uint32(Is25ManRaid() ? 4 : 2)); + for (std::list::iterator itr = myList.begin(); itr != myList.end(); ++itr) + me->CastSpell(*itr, SPELL_TWILIGHT_BLOODBOLT, false); + me->CastSpell(me, SPELL_TWILIGHT_BLOODBOLT_TARGET, false); + events.ScheduleEvent(EVENT_TWILIGHT_BLOODBOLT, urand(10000, 15000)); + break; + } + events.ScheduleEvent(EVENT_TWILIGHT_BLOODBOLT, 5000); + break; + case EVENT_AIR_PHASE: + me->AttackStop(); + me->SetReactState(REACT_PASSIVE); + me->GetMotionMaster()->MovePoint(POINT_CENTER, centerPos); + break; + case EVENT_AIR_START_FLYING: + me->SendMeleeAttackStop(me->GetVictim()); + me->GetMotionMaster()->MoveIdle(); + me->DisableSpline(); + me->SetCanFly(true); + me->SetDisableGravity(true); + me->SetHover(true); + me->SendMovementFlagUpdate(); + me->GetMotionMaster()->MoveTakeoff(POINT_AIR, airPos, 0.642857f * 7.0f); + break; + case EVENT_AIR_FLY_DOWN: + me->GetMotionMaster()->MoveLand(POINT_GROUND, centerPos, 0.642857f * 7.0f); + break; } - void GoToMinchar() + DoMeleeAttackIfReady(); + } + + void CleanAuras() + { + instance->DoRemoveAurasDueToSpellOnPlayers(ESSENCE_OF_BLOOD_QUEEN); + instance->DoRemoveAurasDueToSpellOnPlayers(ESSENCE_OF_BLOOD_QUEEN_PLR); + instance->DoRemoveAurasDueToSpellOnPlayers(FRENZIED_BLOODTHIRST); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_FRENZIED_BLOODTHIRST_VISUAL); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_UNCONTROLLABLE_FRENZY); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BLOOD_MIRROR_DAMAGE); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BLOOD_MIRROR_VISUAL); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BLOOD_MIRROR_DUMMY); + instance->DoRemoveAurasDueToSpellOnPlayers(DELIRIOUS_SLASH); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_PACT_OF_THE_DARKFALLEN); + instance->DoRemoveAurasDueToSpellOnPlayers(PRESENCE_OF_THE_DARKFALLEN); + } + + bool WasVampire(uint64 guid) + { + return _vampires.count(guid) != 0; + } + + bool WasBloodbolted(uint64 guid) + { + return _bloodboltedPlayers.count(guid) != 0; + } + + void SetGUID(uint64 guid, int32 type = 0) + { + switch (type) + { + case GUID_BLOODBOLT: + _bloodboltedPlayers.insert(guid); + break; + case GUID_VAMPIRE: + _vampires.insert(guid); + break; + default: + break; + } + } + + void EnterEvadeMode() + { + const Map::PlayerList& pl = me->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) + if (Player* p = itr->GetSource()) + if (p->IsAlive() && p->HasAura(SPELL_UNCONTROLLABLE_FRENZY)) + Unit::Kill(me, p); + + if (_killMinchar) { if (!me->IsAlive()) return; - instance->SetData(DATA_BLOOD_QUICKENING_STATE, DONE); - me->AddUnitState(UNIT_STATE_EVADE); - me->SendMeleeAttackStop(me->GetVictim()); - me->GetMotionMaster()->MoveIdle(); - me->StopMoving(); - me->SetCanFly(true); - me->SetDisableGravity(true); - me->SetHover(true); - me->SendMovementFlagUpdate(); - me->GetMotionMaster()->MovePoint(POINT_MINCHAR, mincharPos); + _EnterEvadeMode(); + Reset(); + GoToMinchar(); + return; } - void DoAction(int32 action) - { - if (action != ACTION_KILL_MINCHAR) - return; - - if (instance->GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) == IN_PROGRESS) - _killMinchar = true; - else - GoToMinchar(); - } - - void JustReachedHome() - { - me->SetCanFly(false); - me->SetDisableGravity(false); - me->SetHover(false); - - _JustReachedHome(); - if (bEnteredCombat) - { - bEnteredCombat = false; - if (me->IsAlive() && instance->GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) != DONE) - instance->SetBossState(DATA_BLOOD_QUEEN_LANA_THEL, FAIL); - } - } - - void KilledUnit(Unit* victim) - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_KILL); - } - - void MovementInform(uint32 type, uint32 id) - { - if (type != EFFECT_MOTION_TYPE && type != POINT_MOTION_TYPE) - return; - - switch (id) - { - case POINT_CENTER: - me->CastSpell(me, SPELL_INCITE_TERROR, false); - events.ScheduleEvent(EVENT_AIR_PHASE, 100000 + uint32(Is25ManRaid() ? 0 : 20000)); - events.ScheduleEvent(EVENT_AIR_START_FLYING, 2500); - break; - case POINT_AIR: - _bloodboltedPlayers.clear(); - me->CastSpell(me, SPELL_BLOODBOLT_WHIRL, false); - Talk(SAY_AIR_PHASE); - events.ScheduleEvent(EVENT_AIR_FLY_DOWN, 7000); - break; - case POINT_GROUND: - me->SetCanFly(false); - me->SetDisableGravity(false); - me->SetHover(false); - me->SetReactState(REACT_AGGRESSIVE); - if (Unit* target = me->SelectVictim()) - AttackStart(target); - events.RescheduleEvent(EVENT_PACT_OF_THE_DARKFALLEN, 5000); - events.RescheduleEvent(EVENT_SWARMING_SHADOWS, 20000); - break; - case POINT_MINCHAR: - me->CastSpell(me, SPELL_ANNIHILATE, true); - me->GetMotionMaster()->MoveTargetedHome(); - Reset(); - default: - break; - } - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim() || !CheckInRoom()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_BERSERK: - Talk(EMOTE_BERSERK_RAID); - Talk(SAY_BERSERK); - me->CastSpell(me, SPELL_BERSERK, true); - break; - case EVENT_VAMPIRIC_BITE: - { - Player* target = nullptr; - float maxThreat = 0.0f; - const Map::PlayerList &pl = me->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) - if (Player* p = itr->GetSource()) - if (p->IsAlive() && p != me->GetVictim() && p->GetGUID() != _offtankGUID && !p->IsGameMaster() && p->GetDistance(me) < 70.0f) - { - float th = me->getThreatManager().getThreatWithoutTemp(p); - if (!target || th > maxThreat) - { - target = p; - maxThreat = th; - } - } - - if (target) - { - me->CastSpell(target, SPELL_VAMPIRIC_BITE, false); - me->CastSpell((Unit*)NULL, SPELL_VAMPIRIC_BITE_DUMMY, true); - Talk(SAY_VAMPIRIC_BITE); - SetGUID(target->GetGUID(), GUID_VAMPIRE); - target->CastSpell(target, SPELL_PRESENCE_OF_THE_DARKFALLEN_DUMMY, TRIGGERED_FULL_MASK); - target->CastSpell(target, SPELL_PRESENCE_OF_THE_DARKFALLEN_SE, TRIGGERED_FULL_MASK); - } - } - break; - case EVENT_BLOOD_MIRROR: - if (me->GetVictim()) - { - std::list myList; - const Map::PlayerList &pl = me->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) - if (Player* p = itr->GetSource()) - if (p->IsAlive() && p != me->GetVictim() && !p->IsGameMaster() && !p->HasAura(SPELL_UNCONTROLLABLE_FRENZY)) - myList.push_back(p); - if (!myList.empty()) - { - myList.sort(acore::ObjectDistanceOrderPred(me->GetVictim())); - Player* target = myList.front(); - if (me->GetVictim()->GetGUID() != _tankGUID || target->GetGUID() != _offtankGUID) - { - // remove manually from previous, single target flag has nothing to do with this shit as caster is in every case different... tc retards - if (_tankGUID) - if (Player* prevTank = ObjectAccessor::GetPlayer(*me, _tankGUID)) - { - prevTank->RemoveAurasDueToSpell(SPELL_BLOOD_MIRROR_DAMAGE); - prevTank->RemoveAurasDueToSpell(SPELL_BLOOD_MIRROR_VISUAL); - } - if (_offtankGUID) - if (Player* prevOfftank = ObjectAccessor::GetPlayer(*me, _offtankGUID)) - prevOfftank->RemoveAurasDueToSpell(SPELL_BLOOD_MIRROR_DUMMY); - - if (target->GetDistance(me->GetVictim()) > 39.0f || me->GetDistance(me->GetVictim()) > 39.0f) - { - _tankGUID = 0; - _offtankGUID = 0; - events.ScheduleEvent(EVENT_BLOOD_MIRROR, 2500); - break; - } - - _tankGUID = me->GetVictim()->GetGUID(); - _offtankGUID = target->GetGUID(); - target->CastSpell(me->GetVictim(), SPELL_BLOOD_MIRROR_DAMAGE, true); - me->GetVictim()->CastSpell(target, SPELL_BLOOD_MIRROR_DUMMY, true); - me->CastSpell(me->GetVictim(), SPELL_BLOOD_MIRROR_VISUAL, false); - - if (Is25ManRaid() && target->GetQuestStatus(QUEST_BLOOD_INFUSION) == QUEST_STATUS_INCOMPLETE && - target->HasAura(SPELL_UNSATED_CRAVING) && !target->HasAura(SPELL_THIRST_QUENCHED) && !target->HasAura(SPELL_GUSHING_WOUND)) - target->CastSpell(target, SPELL_GUSHING_WOUND, TRIGGERED_FULL_MASK); - } - } - } - events.ScheduleEvent(EVENT_BLOOD_MIRROR, 2500); - break; - case EVENT_DELIRIOUS_SLASH: - if (!me->HasReactState(REACT_PASSIVE)) - { - Unit* target = nullptr; - if (_offtankGUID) - if (Unit* t = ObjectAccessor::GetUnit(*me, _offtankGUID)) - if (t->IsAlive() && t->GetDistance(me) < 10.0f) - target = t; - if (!target) - if (me->GetVictim() && me->GetVictim()->GetDistance(me) < 10.0f) - target = me->GetVictim(); - if (!target) - { - events.ScheduleEvent(EVENT_DELIRIOUS_SLASH, 5000); - break; - } - me->CastSpell(target, SPELL_DELIRIOUS_SLASH, false); - events.ScheduleEvent(EVENT_DELIRIOUS_SLASH, urand(20000, 24000)); - break; - } - events.ScheduleEvent(EVENT_DELIRIOUS_SLASH, 5000); - break; - case EVENT_PACT_OF_THE_DARKFALLEN: - if (!me->HasReactState(REACT_PASSIVE)) - { - std::list myList; - const Map::PlayerList &pl = me->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) - if (Player* p = itr->GetSource()) - if (p->IsAlive() && p != me->GetVictim() && p->GetGUID() != _offtankGUID && !p->IsGameMaster() && p->GetDistance(me) < 100.0f && !p->HasAura(SPELL_UNCONTROLLABLE_FRENZY)) - myList.push_back(p); - acore::Containers::RandomResizeList(myList, Is25ManRaid() ? 3 : 2); - if (myList.size() > 1) - { - Talk(SAY_PACT_OF_THE_DARKFALLEN); - for (std::list::iterator itr = myList.begin(); itr != myList.end(); ++itr) - me->CastSpell(*itr, SPELL_PACT_OF_THE_DARKFALLEN, false); - events.ScheduleEvent(EVENT_PACT_OF_THE_DARKFALLEN, 30000); - } - else - events.ScheduleEvent(EVENT_PACT_OF_THE_DARKFALLEN, 5000); - break; - } - events.ScheduleEvent(EVENT_PACT_OF_THE_DARKFALLEN, 5000); - break; - case EVENT_SWARMING_SHADOWS: - if (!me->HasReactState(REACT_PASSIVE)) - { - std::list myList; - const Map::PlayerList &pl = me->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) - if (Player* p = itr->GetSource()) - if (p->IsAlive() && p != me->GetVictim() && p->GetGUID() != _offtankGUID && !p->IsGameMaster() && !p->HasAura(SPELL_PACT_OF_THE_DARKFALLEN) && !p->HasAura(SPELL_UNCONTROLLABLE_FRENZY)) - myList.push_back(p); - - if (!myList.empty()) - { - acore::Containers::RandomResizeList(myList, 1); - Player* target = myList.front(); - Talk(EMOTE_SWARMING_SHADOWS, target); - Talk(SAY_SWARMING_SHADOWS); - me->CastSpell(target, SPELL_SWARMING_SHADOWS, false); - } - - events.ScheduleEvent(EVENT_SWARMING_SHADOWS, 30000); - break; - } - events.ScheduleEvent(EVENT_SWARMING_SHADOWS, 5000); - break; - case EVENT_TWILIGHT_BLOODBOLT: - if (!me->HasReactState(REACT_PASSIVE)) - { - std::list myList; - const Map::PlayerList &pl = me->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) - if (Player* p = itr->GetSource()) - if (p->IsAlive() && p != me->GetVictim() && p->GetGUID() != _offtankGUID && !p->IsGameMaster() && !p->HasAura(SPELL_PACT_OF_THE_DARKFALLEN) && !p->HasAura(SPELL_UNCONTROLLABLE_FRENZY)) - myList.push_back(p); - - acore::Containers::RandomResizeList(myList, uint32(Is25ManRaid() ? 4 : 2)); - for (std::list::iterator itr = myList.begin(); itr != myList.end(); ++itr) - me->CastSpell(*itr, SPELL_TWILIGHT_BLOODBOLT, false); - me->CastSpell(me, SPELL_TWILIGHT_BLOODBOLT_TARGET, false); - events.ScheduleEvent(EVENT_TWILIGHT_BLOODBOLT, urand(10000, 15000)); - break; - } - events.ScheduleEvent(EVENT_TWILIGHT_BLOODBOLT, 5000); - break; - case EVENT_AIR_PHASE: - me->AttackStop(); - me->SetReactState(REACT_PASSIVE); - me->GetMotionMaster()->MovePoint(POINT_CENTER, centerPos); - break; - case EVENT_AIR_START_FLYING: - me->SendMeleeAttackStop(me->GetVictim()); - me->GetMotionMaster()->MoveIdle(); - me->DisableSpline(); - me->SetCanFly(true); - me->SetDisableGravity(true); - me->SetHover(true); - me->SendMovementFlagUpdate(); - me->GetMotionMaster()->MoveTakeoff(POINT_AIR, airPos, 0.642857f * 7.0f); - break; - case EVENT_AIR_FLY_DOWN: - me->GetMotionMaster()->MoveLand(POINT_GROUND, centerPos, 0.642857f * 7.0f); - break; - } - - DoMeleeAttackIfReady(); - } - - void CleanAuras() - { - instance->DoRemoveAurasDueToSpellOnPlayers(ESSENCE_OF_BLOOD_QUEEN); - instance->DoRemoveAurasDueToSpellOnPlayers(ESSENCE_OF_BLOOD_QUEEN_PLR); - instance->DoRemoveAurasDueToSpellOnPlayers(FRENZIED_BLOODTHIRST); - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_FRENZIED_BLOODTHIRST_VISUAL); - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_UNCONTROLLABLE_FRENZY); - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BLOOD_MIRROR_DAMAGE); - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BLOOD_MIRROR_VISUAL); - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BLOOD_MIRROR_DUMMY); - instance->DoRemoveAurasDueToSpellOnPlayers(DELIRIOUS_SLASH); - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_PACT_OF_THE_DARKFALLEN); - instance->DoRemoveAurasDueToSpellOnPlayers(PRESENCE_OF_THE_DARKFALLEN); - } - - bool WasVampire(uint64 guid) - { - return _vampires.count(guid) != 0; - } - - bool WasBloodbolted(uint64 guid) - { - return _bloodboltedPlayers.count(guid) != 0; - } - - void SetGUID(uint64 guid, int32 type = 0) - { - switch (type) - { - case GUID_BLOODBOLT: - _bloodboltedPlayers.insert(guid); - break; - case GUID_VAMPIRE: - _vampires.insert(guid); - break; - default: - break; - } - } - - void EnterEvadeMode() - { - const Map::PlayerList &pl = me->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) - if (Player* p = itr->GetSource()) - if (p->IsAlive() && p->HasAura(SPELL_UNCONTROLLABLE_FRENZY)) - Unit::Kill(me, p); - - if (_killMinchar) - { - if (!me->IsAlive()) - return; - _EnterEvadeMode(); - Reset(); - GoToMinchar(); - return; - } - - BossAI::EnterEvadeMode(); - } - - bool CanAIAttack(const Unit* /*target*/) const - { - return me->IsVisible(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + BossAI::EnterEvadeMode(); } + + bool CanAIAttack(const Unit* /*target*/) const + { + return me->IsVisible(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; // shortened version for clear code @@ -582,401 +582,401 @@ typedef boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI LanaThelAI; class spell_blood_queen_pact_of_the_darkfallen_dmg : public SpellScriptLoader { - public: - spell_blood_queen_pact_of_the_darkfallen_dmg() : SpellScriptLoader("spell_blood_queen_pact_of_the_darkfallen_dmg") { } +public: + spell_blood_queen_pact_of_the_darkfallen_dmg() : SpellScriptLoader("spell_blood_queen_pact_of_the_darkfallen_dmg") { } - class spell_blood_queen_pact_of_the_darkfallen_dmg_AuraScript : public AuraScript + class spell_blood_queen_pact_of_the_darkfallen_dmg_AuraScript : public AuraScript + { + PrepareAuraScript(spell_blood_queen_pact_of_the_darkfallen_dmg_AuraScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareAuraScript(spell_blood_queen_pact_of_the_darkfallen_dmg_AuraScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_PACT_OF_THE_DARKFALLEN_DAMAGE)) - return false; - return true; - } - - // this is an additional effect to be executed - void PeriodicTick(AuraEffect const* aurEff) - { - if ((aurEff->GetTickNumber()%2) == 0) - return; - SpellInfo const* damageSpell = sSpellMgr->GetSpellInfo(SPELL_PACT_OF_THE_DARKFALLEN_DAMAGE); - int32 damage = damageSpell->Effects[EFFECT_0].CalcValue(); - float herobonus = ((GetTarget()->FindMap() && GetTarget()->FindMap()->IsHeroic()) ? 0.2f : 0.0f); - float multiplier = 0.5f + herobonus + 0.1f * uint32(aurEff->GetTickNumber()/10); // do not convert to 0.01f - we need tick number/10 as INT (damage increases every 10 ticks) - damage = int32(damage * multiplier); - GetTarget()->CastCustomSpell(SPELL_PACT_OF_THE_DARKFALLEN_DAMAGE, SPELLVALUE_BASE_POINT0, damage, GetTarget(), true); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_blood_queen_pact_of_the_darkfallen_dmg_AuraScript::PeriodicTick, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_blood_queen_pact_of_the_darkfallen_dmg_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_PACT_OF_THE_DARKFALLEN_DAMAGE)) + return false; + return true; } + + // this is an additional effect to be executed + void PeriodicTick(AuraEffect const* aurEff) + { + if ((aurEff->GetTickNumber() % 2) == 0) + return; + SpellInfo const* damageSpell = sSpellMgr->GetSpellInfo(SPELL_PACT_OF_THE_DARKFALLEN_DAMAGE); + int32 damage = damageSpell->Effects[EFFECT_0].CalcValue(); + float herobonus = ((GetTarget()->FindMap() && GetTarget()->FindMap()->IsHeroic()) ? 0.2f : 0.0f); + float multiplier = 0.5f + herobonus + 0.1f * uint32(aurEff->GetTickNumber() / 10); // do not convert to 0.01f - we need tick number/10 as INT (damage increases every 10 ticks) + damage = int32(damage * multiplier); + GetTarget()->CastCustomSpell(SPELL_PACT_OF_THE_DARKFALLEN_DAMAGE, SPELLVALUE_BASE_POINT0, damage, GetTarget(), true); + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_blood_queen_pact_of_the_darkfallen_dmg_AuraScript::PeriodicTick, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_blood_queen_pact_of_the_darkfallen_dmg_AuraScript(); + } }; class spell_blood_queen_pact_of_the_darkfallen : public SpellScriptLoader { - public: - spell_blood_queen_pact_of_the_darkfallen() : SpellScriptLoader("spell_blood_queen_pact_of_the_darkfallen") { } +public: + spell_blood_queen_pact_of_the_darkfallen() : SpellScriptLoader("spell_blood_queen_pact_of_the_darkfallen") { } - class spell_blood_queen_pact_of_the_darkfallen_SpellScript : public SpellScript + class spell_blood_queen_pact_of_the_darkfallen_SpellScript : public SpellScript + { + PrepareSpellScript(spell_blood_queen_pact_of_the_darkfallen_SpellScript); + + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_blood_queen_pact_of_the_darkfallen_SpellScript); + targets.remove_if(acore::UnitAuraCheck(false, SPELL_PACT_OF_THE_DARKFALLEN)); - void FilterTargets(std::list& targets) + bool remove = true; + std::list::const_iterator itr, itr2, itrEnd = targets.end(); + for (itr = targets.begin(); itr != itrEnd && remove; ++itr) { - targets.remove_if(acore::UnitAuraCheck(false, SPELL_PACT_OF_THE_DARKFALLEN)); + if (GetCaster()->GetExactDist2d(*itr) > 5.0f) + remove = false; - bool remove = true; - std::list::const_iterator itr, itr2, itrEnd = targets.end(); - for (itr = targets.begin(); itr != itrEnd && remove; ++itr) - { - if (GetCaster()->GetExactDist2d(*itr) > 5.0f) + for (itr2 = targets.begin(); itr2 != itrEnd && remove; ++itr2) + if (itr != itr2 && (*itr2)->GetExactDist2d(*itr) > 5.0f) remove = false; + } - for (itr2 = targets.begin(); itr2 != itrEnd && remove; ++itr2) - if (itr != itr2 && (*itr2)->GetExactDist2d(*itr) > 5.0f) - remove = false; + if (remove) + if (InstanceScript* instance = GetCaster()->GetInstanceScript()) + { + targets.clear(); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_PACT_OF_THE_DARKFALLEN); } - - if (remove) - if (InstanceScript* instance = GetCaster()->GetInstanceScript()) - { - targets.clear(); - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_PACT_OF_THE_DARKFALLEN); - } - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_blood_queen_pact_of_the_darkfallen_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_blood_queen_pact_of_the_darkfallen_SpellScript(); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_blood_queen_pact_of_the_darkfallen_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_blood_queen_pact_of_the_darkfallen_SpellScript(); + } }; class spell_blood_queen_pact_of_the_darkfallen_dmg_target : public SpellScriptLoader { - public: - spell_blood_queen_pact_of_the_darkfallen_dmg_target() : SpellScriptLoader("spell_blood_queen_pact_of_the_darkfallen_dmg_target") { } +public: + spell_blood_queen_pact_of_the_darkfallen_dmg_target() : SpellScriptLoader("spell_blood_queen_pact_of_the_darkfallen_dmg_target") { } - class spell_blood_queen_pact_of_the_darkfallen_dmg_SpellScript : public SpellScript + class spell_blood_queen_pact_of_the_darkfallen_dmg_SpellScript : public SpellScript + { + PrepareSpellScript(spell_blood_queen_pact_of_the_darkfallen_dmg_SpellScript); + + void FilterTargets(std::list& unitList) { - PrepareSpellScript(spell_blood_queen_pact_of_the_darkfallen_dmg_SpellScript); - - void FilterTargets(std::list& unitList) - { - unitList.remove_if(acore::UnitAuraCheck(true, SPELL_PACT_OF_THE_DARKFALLEN)); - unitList.push_back(GetCaster()); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_blood_queen_pact_of_the_darkfallen_dmg_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_blood_queen_pact_of_the_darkfallen_dmg_SpellScript(); + unitList.remove_if(acore::UnitAuraCheck(true, SPELL_PACT_OF_THE_DARKFALLEN)); + unitList.push_back(GetCaster()); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_blood_queen_pact_of_the_darkfallen_dmg_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_blood_queen_pact_of_the_darkfallen_dmg_SpellScript(); + } }; class BloodboltHitCheck { - public: - explicit BloodboltHitCheck(LanaThelAI* ai) : _ai(ai) {} +public: + explicit BloodboltHitCheck(LanaThelAI* ai) : _ai(ai) {} - bool operator()(WorldObject* object) const - { - return _ai->WasBloodbolted(object->GetGUID()); - } + bool operator()(WorldObject* object) const + { + return _ai->WasBloodbolted(object->GetGUID()); + } - private: - LanaThelAI* _ai; +private: + LanaThelAI* _ai; }; class spell_blood_queen_bloodbolt : public SpellScriptLoader { - public: - spell_blood_queen_bloodbolt() : SpellScriptLoader("spell_blood_queen_bloodbolt") { } +public: + spell_blood_queen_bloodbolt() : SpellScriptLoader("spell_blood_queen_bloodbolt") { } - class spell_blood_queen_bloodbolt_SpellScript : public SpellScript + class spell_blood_queen_bloodbolt_SpellScript : public SpellScript + { + PrepareSpellScript(spell_blood_queen_bloodbolt_SpellScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareSpellScript(spell_blood_queen_bloodbolt_SpellScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_TWILIGHT_BLOODBOLT_FROM_WHIRL)) - return false; - return true; - } - - bool Load() - { - return GetCaster()->GetEntry() == NPC_BLOOD_QUEEN_LANA_THEL; - } - - void FilterTargets(std::list& targets) - { - uint32 targetCount = (targets.size() + 2) / 3; - targets.remove_if(BloodboltHitCheck(static_cast(GetCaster()->GetAI()))); - acore::Containers::RandomResizeList(targets, targetCount); - // mark targets now, effect hook has missile travel time delay (might cast next in that time) - for (std::list::const_iterator itr = targets.begin(); itr != targets.end(); ++itr) - GetCaster()->GetAI()->SetGUID((*itr)->GetGUID(), GUID_BLOODBOLT); - } - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetCaster()->CastSpell(GetHitUnit(), SPELL_TWILIGHT_BLOODBOLT_FROM_WHIRL, true); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_blood_queen_bloodbolt_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); - OnEffectHitTarget += SpellEffectFn(spell_blood_queen_bloodbolt_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_blood_queen_bloodbolt_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_TWILIGHT_BLOODBOLT_FROM_WHIRL)) + return false; + return true; } + + bool Load() + { + return GetCaster()->GetEntry() == NPC_BLOOD_QUEEN_LANA_THEL; + } + + void FilterTargets(std::list& targets) + { + uint32 targetCount = (targets.size() + 2) / 3; + targets.remove_if(BloodboltHitCheck(static_cast(GetCaster()->GetAI()))); + acore::Containers::RandomResizeList(targets, targetCount); + // mark targets now, effect hook has missile travel time delay (might cast next in that time) + for (std::list::const_iterator itr = targets.begin(); itr != targets.end(); ++itr) + GetCaster()->GetAI()->SetGUID((*itr)->GetGUID(), GUID_BLOODBOLT); + } + + void HandleScript(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + GetCaster()->CastSpell(GetHitUnit(), SPELL_TWILIGHT_BLOODBOLT_FROM_WHIRL, true); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_blood_queen_bloodbolt_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_blood_queen_bloodbolt_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_blood_queen_bloodbolt_SpellScript(); + } }; class spell_blood_queen_frenzied_bloodthirst : public SpellScriptLoader { - public: - spell_blood_queen_frenzied_bloodthirst() : SpellScriptLoader("spell_blood_queen_frenzied_bloodthirst") { } +public: + spell_blood_queen_frenzied_bloodthirst() : SpellScriptLoader("spell_blood_queen_frenzied_bloodthirst") { } - class spell_blood_queen_frenzied_bloodthirst_AuraScript : public AuraScript + class spell_blood_queen_frenzied_bloodthirst_AuraScript : public AuraScript + { + PrepareAuraScript(spell_blood_queen_frenzied_bloodthirst_AuraScript); + + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_blood_queen_frenzied_bloodthirst_AuraScript); - - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (InstanceScript* instance = GetTarget()->GetInstanceScript()) - if (Creature* bloodQueen = ObjectAccessor::GetCreature(*GetTarget(), instance->GetData64(DATA_BLOOD_QUEEN_LANA_THEL))) - bloodQueen->AI()->Talk(EMOTE_BLOODTHIRST, GetTarget()); - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE) - if (InstanceScript* instance = target->GetInstanceScript()) - if (Creature* bloodQueen = ObjectAccessor::GetCreature(*target, instance->GetData64(DATA_BLOOD_QUEEN_LANA_THEL))) - if (bloodQueen->IsAlive() && bloodQueen->IsInCombat()) - { - // this needs to be done BEFORE charm aura or we hit an assert in Unit::SetCharmedBy - if (target->GetVehicleKit()) - target->RemoveVehicleKit(); - - bloodQueen->AI()->Talk(SAY_MIND_CONTROL); - bloodQueen->CastSpell(target, SPELL_UNCONTROLLABLE_FRENZY, true); - } - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_blood_queen_frenzied_bloodthirst_AuraScript::OnApply, EFFECT_0, SPELL_AURA_OVERRIDE_SPELLS, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_blood_queen_frenzied_bloodthirst_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_OVERRIDE_SPELLS, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_blood_queen_frenzied_bloodthirst_AuraScript(); + if (InstanceScript* instance = GetTarget()->GetInstanceScript()) + if (Creature* bloodQueen = ObjectAccessor::GetCreature(*GetTarget(), instance->GetData64(DATA_BLOOD_QUEEN_LANA_THEL))) + bloodQueen->AI()->Talk(EMOTE_BLOODTHIRST, GetTarget()); } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE) + if (InstanceScript* instance = target->GetInstanceScript()) + if (Creature* bloodQueen = ObjectAccessor::GetCreature(*target, instance->GetData64(DATA_BLOOD_QUEEN_LANA_THEL))) + if (bloodQueen->IsAlive() && bloodQueen->IsInCombat()) + { + // this needs to be done BEFORE charm aura or we hit an assert in Unit::SetCharmedBy + if (target->GetVehicleKit()) + target->RemoveVehicleKit(); + + bloodQueen->AI()->Talk(SAY_MIND_CONTROL); + bloodQueen->CastSpell(target, SPELL_UNCONTROLLABLE_FRENZY, true); + } + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_blood_queen_frenzied_bloodthirst_AuraScript::OnApply, EFFECT_0, SPELL_AURA_OVERRIDE_SPELLS, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_blood_queen_frenzied_bloodthirst_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_OVERRIDE_SPELLS, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_blood_queen_frenzied_bloodthirst_AuraScript(); + } }; class spell_blood_queen_essence_of_the_blood_queen : public SpellScriptLoader { - public: - spell_blood_queen_essence_of_the_blood_queen() : SpellScriptLoader("spell_blood_queen_essence_of_the_blood_queen") { } +public: + spell_blood_queen_essence_of_the_blood_queen() : SpellScriptLoader("spell_blood_queen_essence_of_the_blood_queen") { } - class spell_blood_queen_essence_of_the_blood_queen_AuraScript : public AuraScript + class spell_blood_queen_essence_of_the_blood_queen_AuraScript : public AuraScript + { + PrepareAuraScript(spell_blood_queen_essence_of_the_blood_queen_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_blood_queen_essence_of_the_blood_queen_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_ESSENCE_OF_THE_BLOOD_QUEEN_HEAL)) - return false; - return true; - } - - void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - int32 heal = CalculatePct(int32(eventInfo.GetDamageInfo()->GetDamage()), aurEff->GetAmount()); - GetTarget()->CastCustomSpell(SPELL_ESSENCE_OF_THE_BLOOD_QUEEN_HEAL, SPELLVALUE_BASE_POINT0, heal, GetTarget(), TRIGGERED_FULL_MASK, NULL, aurEff); - } - - void Register() - { - OnEffectProc += AuraEffectProcFn(spell_blood_queen_essence_of_the_blood_queen_AuraScript::OnProc, EFFECT_1, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_blood_queen_essence_of_the_blood_queen_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_ESSENCE_OF_THE_BLOOD_QUEEN_HEAL)) + return false; + return true; } + + void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + int32 heal = CalculatePct(int32(eventInfo.GetDamageInfo()->GetDamage()), aurEff->GetAmount()); + GetTarget()->CastCustomSpell(SPELL_ESSENCE_OF_THE_BLOOD_QUEEN_HEAL, SPELLVALUE_BASE_POINT0, heal, GetTarget(), TRIGGERED_FULL_MASK, NULL, aurEff); + } + + void Register() + { + OnEffectProc += AuraEffectProcFn(spell_blood_queen_essence_of_the_blood_queen_AuraScript::OnProc, EFFECT_1, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_blood_queen_essence_of_the_blood_queen_AuraScript(); + } }; class spell_blood_queen_vampiric_bite : public SpellScriptLoader { - public: - spell_blood_queen_vampiric_bite() : SpellScriptLoader("spell_blood_queen_vampiric_bite") { } +public: + spell_blood_queen_vampiric_bite() : SpellScriptLoader("spell_blood_queen_vampiric_bite") { } - class spell_blood_queen_vampiric_bite_SpellScript : public SpellScript + class spell_blood_queen_vampiric_bite_SpellScript : public SpellScript + { + PrepareSpellScript(spell_blood_queen_vampiric_bite_SpellScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareSpellScript(spell_blood_queen_vampiric_bite_SpellScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_ESSENCE_OF_THE_BLOOD_QUEEN_PLR)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_FRENZIED_BLOODTHIRST)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_PRESENCE_OF_THE_DARKFALLEN_DUMMY)) - return false; - return true; - } - - SpellCastResult CheckTarget() - { - if (GetExplTargetUnit()->GetMapId() != 631) - return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; - if (IsVampire(GetExplTargetUnit())) - { - SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_CANT_TARGET_VAMPIRES); - return SPELL_FAILED_CUSTOM_ERROR; - } - if (InstanceScript* instance = GetExplTargetUnit()->GetInstanceScript()) - if (instance->GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) == IN_PROGRESS) - return SPELL_CAST_OK; - - return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; - } - - void OnCast() - { - if (GetCaster()->GetTypeId() != TYPEID_PLAYER || GetCaster()->GetMapId() != 631) - return; - InstanceScript* instance = GetCaster()->GetInstanceScript(); - if (!instance || instance->GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) != IN_PROGRESS) - return; - - uint32 spellId = sSpellMgr->GetSpellIdForDifficulty(SPELL_FRENZIED_BLOODTHIRST, GetCaster()); - GetCaster()->RemoveAura(spellId, 0, 0, AURA_REMOVE_BY_ENEMY_SPELL); - GetCaster()->CastSpell(GetCaster(), SPELL_ESSENCE_OF_THE_BLOOD_QUEEN_PLR, TRIGGERED_FULL_MASK); - - if (Aura* aura = GetCaster()->GetAura(SPELL_GUSHING_WOUND)) - { - if (aura->GetStackAmount() == 3) - { - GetCaster()->CastSpell(GetCaster(), SPELL_THIRST_QUENCHED, TRIGGERED_FULL_MASK); - GetCaster()->RemoveAura(aura); - } - else - GetCaster()->CastSpell(GetCaster(), SPELL_GUSHING_WOUND, TRIGGERED_FULL_MASK); - } - - if (InstanceScript* instance = GetCaster()->GetInstanceScript()) - if (Creature* bloodQueen = ObjectAccessor::GetCreature(*GetCaster(), instance->GetData64(DATA_BLOOD_QUEEN_LANA_THEL))) - bloodQueen->AI()->SetGUID(GetHitUnit()->GetGUID(), GUID_VAMPIRE); - } - - void HandlePresence(SpellEffIndex /*effIndex*/) - { - GetHitUnit()->CastSpell(GetHitUnit(), SPELL_PRESENCE_OF_THE_DARKFALLEN_DUMMY, TRIGGERED_FULL_MASK); - GetHitUnit()->CastSpell(GetHitUnit(), SPELL_PRESENCE_OF_THE_DARKFALLEN_SE, TRIGGERED_FULL_MASK); - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_blood_queen_vampiric_bite_SpellScript::CheckTarget); - BeforeHit += SpellHitFn(spell_blood_queen_vampiric_bite_SpellScript::OnCast); - OnEffectHitTarget += SpellEffectFn(spell_blood_queen_vampiric_bite_SpellScript::HandlePresence, EFFECT_1, SPELL_EFFECT_TRIGGER_SPELL); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_blood_queen_vampiric_bite_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_ESSENCE_OF_THE_BLOOD_QUEEN_PLR)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_FRENZIED_BLOODTHIRST)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_PRESENCE_OF_THE_DARKFALLEN_DUMMY)) + return false; + return true; } + + SpellCastResult CheckTarget() + { + if (GetExplTargetUnit()->GetMapId() != 631) + return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; + if (IsVampire(GetExplTargetUnit())) + { + SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_CANT_TARGET_VAMPIRES); + return SPELL_FAILED_CUSTOM_ERROR; + } + if (InstanceScript* instance = GetExplTargetUnit()->GetInstanceScript()) + if (instance->GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) == IN_PROGRESS) + return SPELL_CAST_OK; + + return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; + } + + void OnCast() + { + if (GetCaster()->GetTypeId() != TYPEID_PLAYER || GetCaster()->GetMapId() != 631) + return; + InstanceScript* instance = GetCaster()->GetInstanceScript(); + if (!instance || instance->GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) != IN_PROGRESS) + return; + + uint32 spellId = sSpellMgr->GetSpellIdForDifficulty(SPELL_FRENZIED_BLOODTHIRST, GetCaster()); + GetCaster()->RemoveAura(spellId, 0, 0, AURA_REMOVE_BY_ENEMY_SPELL); + GetCaster()->CastSpell(GetCaster(), SPELL_ESSENCE_OF_THE_BLOOD_QUEEN_PLR, TRIGGERED_FULL_MASK); + + if (Aura* aura = GetCaster()->GetAura(SPELL_GUSHING_WOUND)) + { + if (aura->GetStackAmount() == 3) + { + GetCaster()->CastSpell(GetCaster(), SPELL_THIRST_QUENCHED, TRIGGERED_FULL_MASK); + GetCaster()->RemoveAura(aura); + } + else + GetCaster()->CastSpell(GetCaster(), SPELL_GUSHING_WOUND, TRIGGERED_FULL_MASK); + } + + if (InstanceScript* instance = GetCaster()->GetInstanceScript()) + if (Creature* bloodQueen = ObjectAccessor::GetCreature(*GetCaster(), instance->GetData64(DATA_BLOOD_QUEEN_LANA_THEL))) + bloodQueen->AI()->SetGUID(GetHitUnit()->GetGUID(), GUID_VAMPIRE); + } + + void HandlePresence(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_PRESENCE_OF_THE_DARKFALLEN_DUMMY, TRIGGERED_FULL_MASK); + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_PRESENCE_OF_THE_DARKFALLEN_SE, TRIGGERED_FULL_MASK); + } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_blood_queen_vampiric_bite_SpellScript::CheckTarget); + BeforeHit += SpellHitFn(spell_blood_queen_vampiric_bite_SpellScript::OnCast); + OnEffectHitTarget += SpellEffectFn(spell_blood_queen_vampiric_bite_SpellScript::HandlePresence, EFFECT_1, SPELL_EFFECT_TRIGGER_SPELL); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_blood_queen_vampiric_bite_SpellScript(); + } }; class spell_blood_queen_swarming_shadows_floor_dmg : public SpellScriptLoader { - public: - spell_blood_queen_swarming_shadows_floor_dmg() : SpellScriptLoader("spell_blood_queen_swarming_shadows_floor_dmg") { } +public: + spell_blood_queen_swarming_shadows_floor_dmg() : SpellScriptLoader("spell_blood_queen_swarming_shadows_floor_dmg") { } - class spell_blood_queen_swarming_shadows_floor_dmg_SpellScript : public SpellScript + class spell_blood_queen_swarming_shadows_floor_dmg_SpellScript : public SpellScript + { + PrepareSpellScript(spell_blood_queen_swarming_shadows_floor_dmg_SpellScript); + + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_blood_queen_swarming_shadows_floor_dmg_SpellScript); - - void FilterTargets(std::list& targets) - { - targets.remove_if(acore::AllWorldObjectsInExactRange(GetCaster(), GetSpellInfo()->Effects[0].CalcRadius(), true)); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_blood_queen_swarming_shadows_floor_dmg_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_blood_queen_swarming_shadows_floor_dmg_SpellScript(); + targets.remove_if(acore::AllWorldObjectsInExactRange(GetCaster(), GetSpellInfo()->Effects[0].CalcRadius(), true)); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_blood_queen_swarming_shadows_floor_dmg_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_blood_queen_swarming_shadows_floor_dmg_SpellScript(); + } }; class spell_blood_queen_presence_of_the_darkfallen : public SpellScriptLoader { - public: - spell_blood_queen_presence_of_the_darkfallen() : SpellScriptLoader("spell_blood_queen_presence_of_the_darkfallen") { } +public: + spell_blood_queen_presence_of_the_darkfallen() : SpellScriptLoader("spell_blood_queen_presence_of_the_darkfallen") { } - class spell_blood_queen_presence_of_the_darkfallen_SpellScript : public SpellScript + class spell_blood_queen_presence_of_the_darkfallen_SpellScript : public SpellScript + { + PrepareSpellScript(spell_blood_queen_presence_of_the_darkfallen_SpellScript); + + void HandleScript(SpellEffIndex effIndex) { - PrepareSpellScript(spell_blood_queen_presence_of_the_darkfallen_SpellScript); + PreventHitDefaultEffect(effIndex); + if (!GetHitUnit()) + return; - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (!GetHitUnit()) - return; - - if (InstanceScript* instance = GetHitUnit()->GetInstanceScript()) - GetHitUnit()->CastSpell((Unit*)NULL, GetSpellInfo()->Effects[effIndex].TriggerSpell, true, nullptr, nullptr, instance->GetData64(DATA_BLOOD_QUEEN_LANA_THEL)); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_blood_queen_presence_of_the_darkfallen_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_FORCE_CAST); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_blood_queen_presence_of_the_darkfallen_SpellScript(); + if (InstanceScript* instance = GetHitUnit()->GetInstanceScript()) + GetHitUnit()->CastSpell((Unit*)NULL, GetSpellInfo()->Effects[effIndex].TriggerSpell, true, nullptr, nullptr, instance->GetData64(DATA_BLOOD_QUEEN_LANA_THEL)); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_blood_queen_presence_of_the_darkfallen_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_FORCE_CAST); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_blood_queen_presence_of_the_darkfallen_SpellScript(); + } }; class achievement_once_bitten_twice_shy : public AchievementCriteriaScript @@ -990,7 +990,7 @@ public: return false; if (LanaThelAI* lanaThelAI = CAST_AI(LanaThelAI, target->GetAI())) - return (target->GetMap()->GetSpawnMode()%2) == _spawnMode && lanaThelAI->WasVampire(source->GetGUID()) == _wasVampire; + return (target->GetMap()->GetSpawnMode() % 2) == _spawnMode && lanaThelAI->WasVampire(source->GetGUID()) == _wasVampire; return false; } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp index ea6e76022..94e00be0b 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp @@ -169,7 +169,7 @@ enum Phases PHASE_INTRO_H = 2, PHASE_COMBAT = 3, - PHASE_INTRO_MASK = (1 << (PHASE_INTRO_A-1)) | (1 << (PHASE_INTRO_H-1)), + PHASE_INTRO_MASK = (1 << (PHASE_INTRO_A - 1)) | (1 << (PHASE_INTRO_H - 1)), }; enum Actions @@ -225,481 +225,481 @@ Position const chokePos[6] = class boss_deathbringer_saurfang : public CreatureScript { - public: - boss_deathbringer_saurfang() : CreatureScript("boss_deathbringer_saurfang") { } +public: + boss_deathbringer_saurfang() : CreatureScript("boss_deathbringer_saurfang") { } - struct boss_deathbringer_saurfangAI : public BossAI + struct boss_deathbringer_saurfangAI : public BossAI + { + boss_deathbringer_saurfangAI(Creature* creature) : BossAI(creature, DATA_DEATHBRINGER_SAURFANG) { - boss_deathbringer_saurfangAI(Creature* creature) : BossAI(creature, DATA_DEATHBRINGER_SAURFANG) + ASSERT(creature->GetVehicleKit()); // we dont actually use it, just check if exists + } + + void Reset() + { + _Reset(); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NOT_SELECTABLE); + me->SetReactState(REACT_DEFENSIVE); + events.Reset(); + _introDone = false; + _frenzied = false; + _fallenChampionCastCount = 0; + _transportCheckTimer = 1000; + me->SetPower(POWER_ENERGY, 0); + DoCast(me, SPELL_ZERO_POWER, true); + DoCast(me, SPELL_BLOOD_LINK, true); + DoCast(me, SPELL_BLOOD_POWER, true); + DoCast(me, SPELL_MARK_OF_THE_FALLEN_CHAMPION_S, true); + DoCast(me, SPELL_RUNE_OF_BLOOD_S, true); + me->RemoveAurasDueToSpell(SPELL_BERSERK); + me->RemoveAurasDueToSpell(SPELL_FRENZY); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_MARK_OF_THE_FALLEN_CHAMPION); + } + + void EnterCombat(Unit* who) + { + if (!_introDone) { - ASSERT(creature->GetVehicleKit()); // we dont actually use it, just check if exists + me->CombatStop(); + return; } - void Reset() + // pussywizard: without this, the aura is not recalculated the first time + me->RemoveAurasDueToSpell(SPELL_BLOOD_POWER); + DoCast(me, SPELL_BLOOD_POWER, true); + + if (!instance->CheckRequiredBosses(DATA_DEATHBRINGER_SAURFANG, who->ToPlayer())) + { + EnterEvadeMode(); + instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT); + return; + } + + // oh just screw intro, enter combat - no exploits please + me->setActive(true); + DoZoneInCombat(); + Talk(SAY_AGGRO); + + events.Reset(); + events.ScheduleEvent(EVENT_SUMMON_BLOOD_BEAST, 30000); + events.ScheduleEvent(EVENT_BERSERK, (IsHeroic() ? 360000 : 480000)); + events.ScheduleEvent(EVENT_BOILING_BLOOD, 15500, 0); + events.ScheduleEvent(EVENT_BLOOD_NOVA, 17000, 0); + events.ScheduleEvent(EVENT_RUNE_OF_BLOOD, 20000, 0); + + _fallenChampionCastCount = 0; + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_MARK_OF_THE_FALLEN_CHAMPION); + instance->SetBossState(DATA_DEATHBRINGER_SAURFANG, IN_PROGRESS); + } + + void JustDied(Unit* /*killer*/) + { + _JustDied(); + DoCast(me, SPELL_ACHIEVEMENT, true); + Talk(SAY_DEATH); + + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_MARK_OF_THE_FALLEN_CHAMPION); + if (Creature* creature = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SAURFANG_EVENT_NPC))) + creature->AI()->DoAction(ACTION_START_OUTRO); + } + + bool CanAIAttack(const Unit* /*target*/) const + { + return _introDone; + } + + void AttackStart(Unit* victim) + { + if (!_introDone || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC)) + return; + + ScriptedAI::AttackStart(victim); + } + + void MoveInLineOfSight(Unit* /*who*/) {} + + void JustReachedHome() + { + _JustReachedHome(); + instance->SetBossState(DATA_DEATHBRINGER_SAURFANG, FAIL); + } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_KILL); + } + + void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask) + { + if (!_frenzied && HealthBelowPct(31)) // AT 30%, not below + { + _frenzied = true; + DoCast(me, SPELL_FRENZY); + Talk(SAY_FRENZY); + } + } + + void JustSummoned(Creature* summon) + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true)) + summon->AI()->AttackStart(target); + + //if (IsHeroic()) + // DoCast(summon, SPELL_SCENT_OF_BLOOD); + + summon->AI()->DoCast(summon, SPELL_BLOOD_LINK_BEAST, true); + summon->AI()->DoCast(summon, SPELL_RESISTANT_SKIN, true); + summons.Summon(summon); + DoZoneInCombat(summon); + } + + void SummonedCreatureDespawn(Creature* summon) + { + summons.Despawn(summon); + } + + void MovementInform(uint32 type, uint32 id) + { + if (type != POINT_MOTION_TYPE && id != POINT_SAURFANG) + return; + + instance->HandleGameObject(instance->GetData64(GO_SAURFANG_S_DOOR), false); + } + + void SpellHitTarget(Unit* /*target*/, SpellInfo const* spell) + { + switch (spell->Id) + { + case SPELL_MARK_OF_THE_FALLEN_CHAMPION: + Talk(SAY_MARK_OF_THE_FALLEN_CHAMPION); + break; + } + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (_transportCheckTimer <= diff) { - _Reset(); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NOT_SELECTABLE); - me->SetReactState(REACT_DEFENSIVE); - events.Reset(); - _introDone = false; - _frenzied = false; - _fallenChampionCastCount = 0; _transportCheckTimer = 1000; - me->SetPower(POWER_ENERGY, 0); - DoCast(me, SPELL_ZERO_POWER, true); - DoCast(me, SPELL_BLOOD_LINK, true); - DoCast(me, SPELL_BLOOD_POWER, true); - DoCast(me, SPELL_MARK_OF_THE_FALLEN_CHAMPION_S, true); - DoCast(me, SPELL_RUNE_OF_BLOOD_S, true); - me->RemoveAurasDueToSpell(SPELL_BERSERK); - me->RemoveAurasDueToSpell(SPELL_FRENZY); - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_MARK_OF_THE_FALLEN_CHAMPION); + Map::PlayerList const& pl = me->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) + if (Player* p = itr->GetSource()) + if (p->GetTransport()) + { + EnterEvadeMode(); + return; + } } + else + _transportCheckTimer -= diff; - void EnterCombat(Unit* who) + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + if (uint32 eventId = events.ExecuteEvent()) { - if (!_introDone) + switch (eventId) { - me->CombatStop(); - return; - } - - // pussywizard: without this, the aura is not recalculated the first time - me->RemoveAurasDueToSpell(SPELL_BLOOD_POWER); - DoCast(me, SPELL_BLOOD_POWER, true); - - if (!instance->CheckRequiredBosses(DATA_DEATHBRINGER_SAURFANG, who->ToPlayer())) - { - EnterEvadeMode(); - instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT); - return; - } - - // oh just screw intro, enter combat - no exploits please - me->setActive(true); - DoZoneInCombat(); - Talk(SAY_AGGRO); - - events.Reset(); - events.ScheduleEvent(EVENT_SUMMON_BLOOD_BEAST, 30000); - events.ScheduleEvent(EVENT_BERSERK, (IsHeroic() ? 360000 : 480000)); - events.ScheduleEvent(EVENT_BOILING_BLOOD, 15500, 0); - events.ScheduleEvent(EVENT_BLOOD_NOVA, 17000, 0); - events.ScheduleEvent(EVENT_RUNE_OF_BLOOD, 20000, 0); - - _fallenChampionCastCount = 0; - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_MARK_OF_THE_FALLEN_CHAMPION); - instance->SetBossState(DATA_DEATHBRINGER_SAURFANG, IN_PROGRESS); - } - - void JustDied(Unit* /*killer*/) - { - _JustDied(); - DoCast(me, SPELL_ACHIEVEMENT, true); - Talk(SAY_DEATH); - - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_MARK_OF_THE_FALLEN_CHAMPION); - if (Creature* creature = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SAURFANG_EVENT_NPC))) - creature->AI()->DoAction(ACTION_START_OUTRO); - } - - bool CanAIAttack(const Unit* /*target*/) const - { - return _introDone; - } - - void AttackStart(Unit* victim) - { - if (!_introDone || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC)) - return; - - ScriptedAI::AttackStart(victim); - } - - void MoveInLineOfSight(Unit* /*who*/) {} - - void JustReachedHome() - { - _JustReachedHome(); - instance->SetBossState(DATA_DEATHBRINGER_SAURFANG, FAIL); - } - - void KilledUnit(Unit* victim) - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_KILL); - } - - void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask) - { - if (!_frenzied && HealthBelowPct(31)) // AT 30%, not below - { - _frenzied = true; - DoCast(me, SPELL_FRENZY); - Talk(SAY_FRENZY); - } - } - - void JustSummoned(Creature* summon) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true)) - summon->AI()->AttackStart(target); - - //if (IsHeroic()) - // DoCast(summon, SPELL_SCENT_OF_BLOOD); - - summon->AI()->DoCast(summon, SPELL_BLOOD_LINK_BEAST, true); - summon->AI()->DoCast(summon, SPELL_RESISTANT_SKIN, true); - summons.Summon(summon); - DoZoneInCombat(summon); - } - - void SummonedCreatureDespawn(Creature* summon) - { - summons.Despawn(summon); - } - - void MovementInform(uint32 type, uint32 id) - { - if (type != POINT_MOTION_TYPE && id != POINT_SAURFANG) - return; - - instance->HandleGameObject(instance->GetData64(GO_SAURFANG_S_DOOR), false); - } - - void SpellHitTarget(Unit* /*target*/, SpellInfo const* spell) - { - switch (spell->Id) - { - case SPELL_MARK_OF_THE_FALLEN_CHAMPION: - Talk(SAY_MARK_OF_THE_FALLEN_CHAMPION); + case EVENT_SUMMON_BLOOD_BEAST: + for (uint32 i10 = 0; i10 < 2; ++i10) + DoCast(me, SPELL_SUMMON_BLOOD_BEAST + i10); + if (Is25ManRaid()) + for (uint32 i25 = 0; i25 < 3; ++i25) + DoCast(me, SPELL_SUMMON_BLOOD_BEAST_25_MAN + i25); + Talk(SAY_BLOOD_BEASTS); + events.ScheduleEvent(EVENT_SUMMON_BLOOD_BEAST, 40000); + if (IsHeroic()) + events.ScheduleEvent(EVENT_BLOOD_BEAST_SCENT_OF_BLOOD, 10000); break; - } - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (_transportCheckTimer <= diff) - { - _transportCheckTimer = 1000; - Map::PlayerList const& pl = me->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) - if (Player* p = itr->GetSource()) - if (p->GetTransport()) - { - EnterEvadeMode(); - return; - } - } - else - _transportCheckTimer -= diff; - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - if (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_SUMMON_BLOOD_BEAST: - for (uint32 i10 = 0; i10 < 2; ++i10) - DoCast(me, SPELL_SUMMON_BLOOD_BEAST+i10); - if (Is25ManRaid()) - for (uint32 i25 = 0; i25 < 3; ++i25) - DoCast(me, SPELL_SUMMON_BLOOD_BEAST_25_MAN+i25); - Talk(SAY_BLOOD_BEASTS); - events.ScheduleEvent(EVENT_SUMMON_BLOOD_BEAST, 40000); - if (IsHeroic()) - events.ScheduleEvent(EVENT_BLOOD_BEAST_SCENT_OF_BLOOD, 10000); - break; - case EVENT_BLOOD_BEAST_SCENT_OF_BLOOD: - Talk(EMOTE_SCENT_OF_BLOOD); - summons.DoAction(ACTION_GAIN_SCENT_OF_BLOOD); - break; - case EVENT_BLOOD_NOVA: + case EVENT_BLOOD_BEAST_SCENT_OF_BLOOD: + Talk(EMOTE_SCENT_OF_BLOOD); + summons.DoAction(ACTION_GAIN_SCENT_OF_BLOOD); + break; + case EVENT_BLOOD_NOVA: { me->CastSpell((Unit*)NULL, SPELL_BLOOD_NOVA_TRIGGER, false); events.ScheduleEvent(EVENT_BLOOD_NOVA, urand(20000, 25000)); break; } - case EVENT_RUNE_OF_BLOOD: - DoCastVictim(SPELL_RUNE_OF_BLOOD); - events.ScheduleEvent(EVENT_RUNE_OF_BLOOD, urand(20000, 25000)); - break; - case EVENT_BOILING_BLOOD: - me->CastSpell((Unit*)NULL, SPELL_BOILING_BLOOD, false); - events.ScheduleEvent(EVENT_BOILING_BLOOD, urand(15000, 20000)); - break; - case EVENT_BERSERK: - DoCast(me, SPELL_BERSERK); - Talk(SAY_BERSERK); - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); - } - - void DoAction(int32 action) - { - switch (action) - { - case ACTION_MARK_OF_THE_FALLEN_CHAMPION: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, -SPELL_MARK_OF_THE_FALLEN_CHAMPION)) - { - ++_fallenChampionCastCount; - me->CastSpell(target, SPELL_MARK_OF_THE_FALLEN_CHAMPION, false); - me->SetPower(POWER_ENERGY, 0); - if (Aura* bloodPower = me->GetAura(SPELL_BLOOD_POWER)) - bloodPower->RecalculateAmountOfEffects(); - } + case EVENT_RUNE_OF_BLOOD: + DoCastVictim(SPELL_RUNE_OF_BLOOD); + events.ScheduleEvent(EVENT_RUNE_OF_BLOOD, urand(20000, 25000)); break; - case ACTION_INTRO_DONE: - _introDone = true; + case EVENT_BOILING_BLOOD: + me->CastSpell((Unit*)NULL, SPELL_BOILING_BLOOD, false); + events.ScheduleEvent(EVENT_BOILING_BLOOD, urand(15000, 20000)); + break; + case EVENT_BERSERK: + DoCast(me, SPELL_BERSERK); + Talk(SAY_BERSERK); break; default: break; } } - uint32 GetData(uint32 type) const - { - if (type == DATA_MADE_A_MESS) - { - if (_fallenChampionCastCount < RAID_MODE(3, 5, 3, 5)) - return 1; - } - else if (type == FALLEN_CHAMPION_CAST_COUNT) - return _fallenChampionCastCount; - - return 0; - } - - void EnterEvadeMode() - { - BossAI::EnterEvadeMode(); - if (Creature* creature = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SAURFANG_EVENT_NPC))) - creature->AI()->DoAction(ACTION_EVADE); - } - - private: - uint32 _fallenChampionCastCount; - bool _introDone; - bool _frenzied; // faster than iterating all auras to find Frenzy - uint16 _transportCheckTimer; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + DoMeleeAttackIfReady(); } + + void DoAction(int32 action) + { + switch (action) + { + case ACTION_MARK_OF_THE_FALLEN_CHAMPION: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, -SPELL_MARK_OF_THE_FALLEN_CHAMPION)) + { + ++_fallenChampionCastCount; + me->CastSpell(target, SPELL_MARK_OF_THE_FALLEN_CHAMPION, false); + me->SetPower(POWER_ENERGY, 0); + if (Aura* bloodPower = me->GetAura(SPELL_BLOOD_POWER)) + bloodPower->RecalculateAmountOfEffects(); + } + break; + case ACTION_INTRO_DONE: + _introDone = true; + break; + default: + break; + } + } + + uint32 GetData(uint32 type) const + { + if (type == DATA_MADE_A_MESS) + { + if (_fallenChampionCastCount < RAID_MODE(3, 5, 3, 5)) + return 1; + } + else if (type == FALLEN_CHAMPION_CAST_COUNT) + return _fallenChampionCastCount; + + return 0; + } + + void EnterEvadeMode() + { + BossAI::EnterEvadeMode(); + if (Creature* creature = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SAURFANG_EVENT_NPC))) + creature->AI()->DoAction(ACTION_EVADE); + } + + private: + uint32 _fallenChampionCastCount; + bool _introDone; + bool _frenzied; // faster than iterating all auras to find Frenzy + uint16 _transportCheckTimer; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class npc_high_overlord_saurfang_icc : public CreatureScript { - public: - npc_high_overlord_saurfang_icc() : CreatureScript("npc_high_overlord_saurfang_icc") { } +public: + npc_high_overlord_saurfang_icc() : CreatureScript("npc_high_overlord_saurfang_icc") { } - struct npc_high_overlord_saurfangAI : public ScriptedAI + struct npc_high_overlord_saurfangAI : public ScriptedAI + { + npc_high_overlord_saurfangAI(Creature* creature) : ScriptedAI(creature) { - npc_high_overlord_saurfangAI(Creature* creature) : ScriptedAI(creature) - { - ASSERT(creature->GetVehicleKit()); - _instance = me->GetInstanceScript(); - } + ASSERT(creature->GetVehicleKit()); + _instance = me->GetInstanceScript(); + } - void Reset() override - { - _events.Reset(); - me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - me->SetReactState(REACT_PASSIVE); - } + void Reset() override + { + _events.Reset(); + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + me->SetReactState(REACT_PASSIVE); + } - void DoAction(int32 action) override + void DoAction(int32 action) override + { + switch (action) { - switch (action) + case ACTION_START_EVENT: + { + // Prevent crashes + if (_events.GetPhaseMask() & PHASE_INTRO_MASK) + return; + + Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG)); + if (!deathbringer || deathbringer->IsInEvadeMode()) + return; + + if (_guardList.empty()) + { + GetCreatureListWithEntryInGrid(_guardList, me, NPC_SE_KOR_KRON_REAVER, 20.0f); + _guardList.sort(acore::ObjectDistanceOrderPred(me)); + } + uint32 x = 1; + for (std::list::iterator itr = _guardList.begin(); itr != _guardList.end(); ++itr) + (*itr)->AI()->SetData(0, x++); + + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + Talk(SAY_INTRO_HORDE_1); + _events.SetPhase(PHASE_INTRO_H); + _events.ScheduleEvent(EVENT_INTRO_HORDE_2, 5000, 0, PHASE_INTRO_H); + _events.ScheduleEvent(EVENT_INTRO_HORDE_3, 18500, 0, PHASE_INTRO_H); + _instance->HandleGameObject(_instance->GetData64(GO_SAURFANG_S_DOOR), true); + + if (GameObject* teleporter = ObjectAccessor::GetGameObject(*me, _instance->GetData64(GO_SCOURGE_TRANSPORTER_SAURFANG))) + { + _instance->HandleGameObject(0, false, teleporter); + teleporter->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); + } + + deathbringer->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + deathbringer->SetWalk(false); + deathbringer->GetMotionMaster()->MovePoint(POINT_SAURFANG, deathbringerPos.GetPositionX(), deathbringerPos.GetPositionY(), deathbringerPos.GetPositionZ()); + } + break; + case ACTION_START_OUTRO: + { + me->RemoveAurasDueToSpell(SPELL_GRIP_OF_AGONY); + me->SetDisableGravity(false); + me->MonsterMoveWithSpeed(me->GetPositionX(), me->GetPositionY(), 539.2917f, 10.0f); + for (std::list::iterator itr = _guardList.begin(); itr != _guardList.end(); ++itr) + (*itr)->AI()->DoAction(ACTION_DESPAWN); + + /*Talk(SAY_OUTRO_HORDE_1); + _events.ScheduleEvent(EVENT_OUTRO_HORDE_1, 10000); + _events.ScheduleEvent(EVENT_OUTRO_HORDE_2, 18000); + _events.ScheduleEvent(EVENT_OUTRO_HORDE_3, 24000);*/ + + } + break; + case ACTION_EVADE: + { + float x, y, z, o; + me->GetMotionMaster()->Clear(); + me->GetHomePosition(x, y, z, o); + me->SetPosition(x, y, z, o); + me->StopMovingOnCurrentPos(); + me->SetDisableGravity(false); + EnterEvadeMode(); + for (std::list::iterator itr = _guardList.begin(); itr != _guardList.end(); ++itr) + { + (*itr)->GetMotionMaster()->Clear(); + (*itr)->GetHomePosition(x, y, z, o); + (*itr)->SetPosition(x, y, z, o); + (*itr)->StopMovingOnCurrentPos(); + (*itr)->SetDisableGravity(false); + (*itr)->AI()->EnterEvadeMode(); + } + } + break; + default: + break; + } + } + + void SpellHit(Unit* /*caster*/, SpellInfo const* spell) override + { + if (spell->Id == SPELL_GRIP_OF_AGONY) + { + me->SetDisableGravity(true); + me->GetMotionMaster()->MovePoint(POINT_CHOKE, chokePos[0]); + } + } + + void MovementInform(uint32 type, uint32 id) override + { + if (type == POINT_MOTION_TYPE) + { + switch (id) { - case ACTION_START_EVENT: - { - // Prevent crashes - if (_events.GetPhaseMask() & PHASE_INTRO_MASK) - return; - - Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG)); - if (!deathbringer || deathbringer->IsInEvadeMode()) - return; - - if (_guardList.empty()) - { - GetCreatureListWithEntryInGrid(_guardList, me, NPC_SE_KOR_KRON_REAVER, 20.0f); - _guardList.sort(acore::ObjectDistanceOrderPred(me)); - } - uint32 x = 1; - for (std::list::iterator itr = _guardList.begin(); itr != _guardList.end(); ++itr) - (*itr)->AI()->SetData(0, x++); - - me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - Talk(SAY_INTRO_HORDE_1); - _events.SetPhase(PHASE_INTRO_H); - _events.ScheduleEvent(EVENT_INTRO_HORDE_2, 5000, 0, PHASE_INTRO_H); - _events.ScheduleEvent(EVENT_INTRO_HORDE_3, 18500, 0, PHASE_INTRO_H); - _instance->HandleGameObject(_instance->GetData64(GO_SAURFANG_S_DOOR), true); - - if (GameObject* teleporter = ObjectAccessor::GetGameObject(*me, _instance->GetData64(GO_SCOURGE_TRANSPORTER_SAURFANG))) - { - _instance->HandleGameObject(0, false, teleporter); - teleporter->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); - } - - deathbringer->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - deathbringer->SetWalk(false); - deathbringer->GetMotionMaster()->MovePoint(POINT_SAURFANG, deathbringerPos.GetPositionX(), deathbringerPos.GetPositionY(), deathbringerPos.GetPositionZ()); - } + case POINT_FIRST_STEP: + me->SetWalk(false); + Talk(SAY_INTRO_HORDE_3); + _events.ScheduleEvent(EVENT_INTRO_HORDE_4, 6500, 0, PHASE_INTRO_H); + _events.ScheduleEvent(EVENT_INTRO_HORDE_5, 15500, 0, PHASE_INTRO_H); + _events.ScheduleEvent(EVENT_INTRO_HORDE_6, 29500, 0, PHASE_INTRO_H); + _events.ScheduleEvent(EVENT_INTRO_HORDE_7, 43800, 0, PHASE_INTRO_H); + _events.ScheduleEvent(EVENT_INTRO_HORDE_8, 47000, 0, PHASE_INTRO_H); + _events.ScheduleEvent(EVENT_INTRO_HORDE_9, 46700 + 1000 + 500, 0, PHASE_INTRO_H); + _events.ScheduleEvent(EVENT_INTRO_FINISH, 46700 + 1000 + 9000, 0, PHASE_INTRO_H); break; - case ACTION_START_OUTRO: + /*case POINT_CORPSE: + if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG))) { - me->RemoveAurasDueToSpell(SPELL_GRIP_OF_AGONY); - me->SetDisableGravity(false); - me->MonsterMoveWithSpeed(me->GetPositionX(), me->GetPositionY(), 539.2917f, 10.0f); - for (std::list::iterator itr = _guardList.begin(); itr != _guardList.end(); ++itr) - (*itr)->AI()->DoAction(ACTION_DESPAWN); - - /*Talk(SAY_OUTRO_HORDE_1); - _events.ScheduleEvent(EVENT_OUTRO_HORDE_1, 10000); - _events.ScheduleEvent(EVENT_OUTRO_HORDE_2, 18000); - _events.ScheduleEvent(EVENT_OUTRO_HORDE_3, 24000);*/ - - } - break; - case ACTION_EVADE: - { - float x, y, z, o; - me->GetMotionMaster()->Clear(); - me->GetHomePosition(x, y, z, o); - me->SetPosition(x, y, z, o); - me->StopMovingOnCurrentPos(); - me->SetDisableGravity(false); - EnterEvadeMode(); - for (std::list::iterator itr = _guardList.begin(); itr != _guardList.end(); ++itr) - { - (*itr)->GetMotionMaster()->Clear(); - (*itr)->GetHomePosition(x, y, z, o); - (*itr)->SetPosition(x, y, z, o); - (*itr)->StopMovingOnCurrentPos(); - (*itr)->SetDisableGravity(false); - (*itr)->AI()->EnterEvadeMode(); - } + deathbringer->CastSpell(me, SPELL_RIDE_VEHICLE, true); + deathbringer->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + deathbringer->setDeathState(ALIVE); } + _events.ScheduleEvent(EVENT_OUTRO_HORDE_4, 1000); + _events.ScheduleEvent(EVENT_OUTRO_HORDE_5, 4000); break; + case POINT_FINAL: + if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG))) + deathbringer->DespawnOrUnsummon(); + me->DespawnOrUnsummon(); + break;*/ default: break; } } + } - void SpellHit(Unit* /*caster*/, SpellInfo const* spell) override + void UpdateAI(uint32 diff) override + { + _events.Update(diff); + switch (_events.ExecuteEvent()) { - if (spell->Id == SPELL_GRIP_OF_AGONY) - { - me->SetDisableGravity(true); - me->GetMotionMaster()->MovePoint(POINT_CHOKE, chokePos[0]); - } - } - - void MovementInform(uint32 type, uint32 id) override - { - if (type == POINT_MOTION_TYPE) - { - switch (id) + case 0: + break; + case EVENT_INTRO_HORDE_2: + if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG))) + deathbringer->AI()->Talk(SAY_INTRO_HORDE_2); + break; + case EVENT_INTRO_HORDE_3: + me->SetWalk(true); + me->GetMotionMaster()->MovePoint(POINT_FIRST_STEP, firstStepPos.GetPositionX(), firstStepPos.GetPositionY(), firstStepPos.GetPositionZ()); + break; + case EVENT_INTRO_HORDE_4: + if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG))) + deathbringer->AI()->Talk(SAY_INTRO_HORDE_4); + break; + case EVENT_INTRO_HORDE_5: + Talk(SAY_INTRO_HORDE_5); + break; + case EVENT_INTRO_HORDE_6: + Talk(SAY_INTRO_HORDE_6); + break; + case EVENT_INTRO_HORDE_7: + Talk(SAY_INTRO_HORDE_7); + break; + case EVENT_INTRO_HORDE_8: + Talk(SAY_INTRO_HORDE_8); + for (std::list::iterator itr = _guardList.begin(); itr != _guardList.end(); ++itr) + (*itr)->AI()->DoAction(ACTION_CHARGE); + me->GetMotionMaster()->MoveCharge(chargePos[0].GetPositionX(), chargePos[0].GetPositionY(), chargePos[0].GetPositionZ(), 8.5f, POINT_CHARGE); + break; + case EVENT_INTRO_HORDE_9: + if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG))) { - case POINT_FIRST_STEP: - me->SetWalk(false); - Talk(SAY_INTRO_HORDE_3); - _events.ScheduleEvent(EVENT_INTRO_HORDE_4, 6500, 0, PHASE_INTRO_H); - _events.ScheduleEvent(EVENT_INTRO_HORDE_5, 15500, 0, PHASE_INTRO_H); - _events.ScheduleEvent(EVENT_INTRO_HORDE_6, 29500, 0, PHASE_INTRO_H); - _events.ScheduleEvent(EVENT_INTRO_HORDE_7, 43800, 0, PHASE_INTRO_H); - _events.ScheduleEvent(EVENT_INTRO_HORDE_8, 47000, 0, PHASE_INTRO_H); - _events.ScheduleEvent(EVENT_INTRO_HORDE_9, 46700+1000+500, 0, PHASE_INTRO_H); - _events.ScheduleEvent(EVENT_INTRO_FINISH, 46700+1000+9000, 0, PHASE_INTRO_H); - break; - /*case POINT_CORPSE: - if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG))) - { - deathbringer->CastSpell(me, SPELL_RIDE_VEHICLE, true); - deathbringer->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - deathbringer->setDeathState(ALIVE); - } - _events.ScheduleEvent(EVENT_OUTRO_HORDE_4, 1000); - _events.ScheduleEvent(EVENT_OUTRO_HORDE_5, 4000); - break; - case POINT_FINAL: - if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG))) - deathbringer->DespawnOrUnsummon(); - me->DespawnOrUnsummon(); - break;*/ - default: - break; + deathbringer->AI()->DoCast(me, SPELL_GRIP_OF_AGONY); + deathbringer->AI()->Talk(SAY_INTRO_HORDE_9); } - } - } - - void UpdateAI(uint32 diff) override - { - _events.Update(diff); - switch (_events.ExecuteEvent()) - { - case 0: - break; - case EVENT_INTRO_HORDE_2: - if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG))) - deathbringer->AI()->Talk(SAY_INTRO_HORDE_2); - break; - case EVENT_INTRO_HORDE_3: - me->SetWalk(true); - me->GetMotionMaster()->MovePoint(POINT_FIRST_STEP, firstStepPos.GetPositionX(), firstStepPos.GetPositionY(), firstStepPos.GetPositionZ()); - break; - case EVENT_INTRO_HORDE_4: - if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG))) - deathbringer->AI()->Talk(SAY_INTRO_HORDE_4); - break; - case EVENT_INTRO_HORDE_5: - Talk(SAY_INTRO_HORDE_5); - break; - case EVENT_INTRO_HORDE_6: - Talk(SAY_INTRO_HORDE_6); - break; - case EVENT_INTRO_HORDE_7: - Talk(SAY_INTRO_HORDE_7); - break; - case EVENT_INTRO_HORDE_8: - Talk(SAY_INTRO_HORDE_8); - for (std::list::iterator itr = _guardList.begin(); itr != _guardList.end(); ++itr) - (*itr)->AI()->DoAction(ACTION_CHARGE); - me->GetMotionMaster()->MoveCharge(chargePos[0].GetPositionX(), chargePos[0].GetPositionY(), chargePos[0].GetPositionZ(), 8.5f, POINT_CHARGE); - break; - case EVENT_INTRO_HORDE_9: - if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG))) - { - deathbringer->AI()->DoCast(me, SPELL_GRIP_OF_AGONY); - deathbringer->AI()->Talk(SAY_INTRO_HORDE_9); - } - break; - case EVENT_INTRO_FINISH: - if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG))) - { - deathbringer->AI()->DoAction(ACTION_INTRO_DONE); - deathbringer->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - if (Player* target = deathbringer->SelectNearestPlayer(100.0f)) - deathbringer->AI()->AttackStart(target); - } - break; + break; + case EVENT_INTRO_FINISH: + if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG))) + { + deathbringer->AI()->DoAction(ACTION_INTRO_DONE); + deathbringer->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + if (Player* target = deathbringer->SelectNearestPlayer(100.0f)) + deathbringer->AI()->AttackStart(target); + } + break; /*case EVENT_OUTRO_HORDE_1: if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG))) @@ -724,109 +724,109 @@ class npc_high_overlord_saurfang_icc : public CreatureScript case EVENT_OUTRO_HORDE_5: Talk(SAY_OUTRO_HORDE_4); break;*/ - } } - - private: - EventMap _events; - InstanceScript* _instance; - std::list _guardList; - }; - - bool OnGossipHello(Player* player, Creature* creature) override - { - InstanceScript* instance = creature->GetInstanceScript(); - if (instance && instance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != DONE && instance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != IN_PROGRESS) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, "We are ready to go, High Overlord. The Lich King must fall!", 631, -ACTION_START_EVENT); - SendGossipMenuFor(player, DEFAULT_GOSSIP_MESSAGE, creature->GetGUID()); - } - - return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - InstanceScript* instance = creature->GetInstanceScript(); - if (instance && instance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != DONE && instance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != IN_PROGRESS) - { - ClearGossipMenuFor(player); - CloseGossipMenuFor(player); - if (action == -ACTION_START_EVENT) - creature->AI()->DoAction(ACTION_START_EVENT); - } + private: + EventMap _events; + InstanceScript* _instance; + std::list _guardList; + }; - return true; + bool OnGossipHello(Player* player, Creature* creature) override + { + InstanceScript* instance = creature->GetInstanceScript(); + if (instance && instance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != DONE && instance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != IN_PROGRESS) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, "We are ready to go, High Overlord. The Lich King must fall!", 631, -ACTION_START_EVENT); + SendGossipMenuFor(player, DEFAULT_GOSSIP_MESSAGE, creature->GetGUID()); } - CreatureAI* GetAI(Creature* creature) const override + return true; + } + + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override + { + InstanceScript* instance = creature->GetInstanceScript(); + if (instance && instance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != DONE && instance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != IN_PROGRESS) { - return GetIcecrownCitadelAI(creature); + ClearGossipMenuFor(player); + CloseGossipMenuFor(player); + if (action == -ACTION_START_EVENT) + creature->AI()->DoAction(ACTION_START_EVENT); } + + return true; + } + + CreatureAI* GetAI(Creature* creature) const override + { + return GetIcecrownCitadelAI(creature); + } }; class npc_muradin_bronzebeard_icc : public CreatureScript { - public: - npc_muradin_bronzebeard_icc() : CreatureScript("npc_muradin_bronzebeard_icc") { } +public: + npc_muradin_bronzebeard_icc() : CreatureScript("npc_muradin_bronzebeard_icc") { } - struct npc_muradin_bronzebeard_iccAI : public ScriptedAI + struct npc_muradin_bronzebeard_iccAI : public ScriptedAI + { + npc_muradin_bronzebeard_iccAI(Creature* creature) : ScriptedAI(creature) { - npc_muradin_bronzebeard_iccAI(Creature* creature) : ScriptedAI(creature) - { - _instance = me->GetInstanceScript(); - } + _instance = me->GetInstanceScript(); + } - void Reset() override - { - _events.Reset(); - me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - me->SetReactState(REACT_PASSIVE); - } + void Reset() override + { + _events.Reset(); + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + me->SetReactState(REACT_PASSIVE); + } - void DoAction(int32 action) override + void DoAction(int32 action) override + { + switch (action) { - switch (action) - { - case ACTION_START_EVENT: + case ACTION_START_EVENT: + { + // Prevent crashes + if (_events.GetPhaseMask() & PHASE_INTRO_MASK) + return; + + Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG)); + if (!deathbringer || deathbringer->IsInEvadeMode()) + return; + + if (_guardList.empty()) { - // Prevent crashes - if (_events.GetPhaseMask() & PHASE_INTRO_MASK) - return; - - Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG)); - if (!deathbringer || deathbringer->IsInEvadeMode()) - return; - - if (_guardList.empty()) - { - GetCreatureListWithEntryInGrid(_guardList, me, NPC_SE_SKYBREAKER_MARINE, 20.0f); - _guardList.sort(acore::ObjectDistanceOrderPred(me)); - } - uint32 x = 1; - for (std::list::iterator itr = _guardList.begin(); itr != _guardList.end(); ++itr) - (*itr)->AI()->SetData(0, x++); - - me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - Talk(SAY_INTRO_ALLIANCE_1); - _events.SetPhase(PHASE_INTRO_A); - _events.ScheduleEvent(EVENT_INTRO_ALLIANCE_2, 2500, 0, PHASE_INTRO_A); - _events.ScheduleEvent(EVENT_INTRO_ALLIANCE_3, 20000, 0, PHASE_INTRO_A); - _events.ScheduleEvent(EVENT_INTRO_ALLIANCE_4, 2500+17500+9500, 0, PHASE_INTRO_A); - _instance->HandleGameObject(_instance->GetData64(GO_SAURFANG_S_DOOR), true); - - if (GameObject* teleporter = ObjectAccessor::GetGameObject(*me, _instance->GetData64(GO_SCOURGE_TRANSPORTER_SAURFANG))) - { - _instance->HandleGameObject(0, false, teleporter); - teleporter->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); - } - - deathbringer->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - deathbringer->SetWalk(false); - deathbringer->GetMotionMaster()->MovePoint(POINT_SAURFANG, deathbringerPos.GetPositionX(), deathbringerPos.GetPositionY(), deathbringerPos.GetPositionZ()); + GetCreatureListWithEntryInGrid(_guardList, me, NPC_SE_SKYBREAKER_MARINE, 20.0f); + _guardList.sort(acore::ObjectDistanceOrderPred(me)); } - break; - case ACTION_START_OUTRO: + uint32 x = 1; + for (std::list::iterator itr = _guardList.begin(); itr != _guardList.end(); ++itr) + (*itr)->AI()->SetData(0, x++); + + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + Talk(SAY_INTRO_ALLIANCE_1); + _events.SetPhase(PHASE_INTRO_A); + _events.ScheduleEvent(EVENT_INTRO_ALLIANCE_2, 2500, 0, PHASE_INTRO_A); + _events.ScheduleEvent(EVENT_INTRO_ALLIANCE_3, 20000, 0, PHASE_INTRO_A); + _events.ScheduleEvent(EVENT_INTRO_ALLIANCE_4, 2500 + 17500 + 9500, 0, PHASE_INTRO_A); + _instance->HandleGameObject(_instance->GetData64(GO_SAURFANG_S_DOOR), true); + + if (GameObject* teleporter = ObjectAccessor::GetGameObject(*me, _instance->GetData64(GO_SCOURGE_TRANSPORTER_SAURFANG))) + { + _instance->HandleGameObject(0, false, teleporter); + teleporter->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); + } + + deathbringer->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + deathbringer->SetWalk(false); + deathbringer->GetMotionMaster()->MovePoint(POINT_SAURFANG, deathbringerPos.GetPositionX(), deathbringerPos.GetPositionY(), deathbringerPos.GetPositionZ()); + } + break; + case ACTION_START_OUTRO: { me->RemoveAurasDueToSpell(SPELL_GRIP_OF_AGONY); me->SetDisableGravity(false); @@ -837,511 +837,514 @@ class npc_muradin_bronzebeard_icc : public CreatureScript //Talk(SAY_OUTRO_ALLIANCE_1); break; } - case ACTION_EVADE: + case ACTION_EVADE: + { + float x, y, z, o; + me->GetMotionMaster()->Clear(); + me->GetHomePosition(x, y, z, o); + me->SetPosition(x, y, z, o); + me->StopMovingOnCurrentPos(); + me->SetDisableGravity(false); + EnterEvadeMode(); + for (std::list::iterator itr = _guardList.begin(); itr != _guardList.end(); ++itr) { - float x, y, z, o; - me->GetMotionMaster()->Clear(); - me->GetHomePosition(x, y, z, o); - me->SetPosition(x, y, z, o); - me->StopMovingOnCurrentPos(); - me->SetDisableGravity(false); - EnterEvadeMode(); - for (std::list::iterator itr = _guardList.begin(); itr != _guardList.end(); ++itr) - { - (*itr)->GetMotionMaster()->Clear(); - (*itr)->GetHomePosition(x, y, z, o); - (*itr)->SetPosition(x, y, z, o); - (*itr)->StopMovingOnCurrentPos(); - (*itr)->SetDisableGravity(false); - (*itr)->AI()->EnterEvadeMode(); - } + (*itr)->GetMotionMaster()->Clear(); + (*itr)->GetHomePosition(x, y, z, o); + (*itr)->SetPosition(x, y, z, o); + (*itr)->StopMovingOnCurrentPos(); + (*itr)->SetDisableGravity(false); + (*itr)->AI()->EnterEvadeMode(); } + } + break; + default: + break; + } + } + + void SpellHit(Unit* /*caster*/, SpellInfo const* spell) override + { + if (spell->Id == SPELL_GRIP_OF_AGONY) + { + me->SetDisableGravity(true); + me->GetMotionMaster()->MovePoint(POINT_CHOKE, chokePos[0]); + } + } + + void MovementInform(uint32 type, uint32 id) override + { + if (type == POINT_MOTION_TYPE) + { + switch (id) + { + case POINT_FIRST_STEP: + me->SetWalk(false); + Talk(SAY_INTRO_ALLIANCE_4); + _events.ScheduleEvent(EVENT_INTRO_ALLIANCE_5, 5000, 0, PHASE_INTRO_A); + _events.ScheduleEvent(EVENT_INTRO_ALLIANCE_6, 6500 + 500, 0, PHASE_INTRO_A); + _events.ScheduleEvent(EVENT_INTRO_ALLIANCE_7, 6500 + 500 + 2000, 0, PHASE_INTRO_A); + _events.ScheduleEvent(EVENT_INTRO_FINISH, 6500 + 500 + 2000 + 5000, 0, PHASE_INTRO_A); break; default: break; } } + } - void SpellHit(Unit* /*caster*/, SpellInfo const* spell) override + void UpdateAI(uint32 diff) override + { + _events.Update(diff); + switch (_events.ExecuteEvent()) { - if (spell->Id == SPELL_GRIP_OF_AGONY) - { - me->SetDisableGravity(true); - me->GetMotionMaster()->MovePoint(POINT_CHOKE, chokePos[0]); - } - } - - void MovementInform(uint32 type, uint32 id) override - { - if (type == POINT_MOTION_TYPE) - { - switch (id) + case 0: + break; + case EVENT_INTRO_ALLIANCE_2: + if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG))) + deathbringer->AI()->Talk(SAY_INTRO_ALLIANCE_2); + break; + case EVENT_INTRO_ALLIANCE_3: + if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG))) + deathbringer->AI()->Talk(SAY_INTRO_ALLIANCE_3); + break; + case EVENT_INTRO_ALLIANCE_4: + me->SetWalk(true); + me->GetMotionMaster()->MovePoint(POINT_FIRST_STEP, firstStepPos.GetPositionX(), firstStepPos.GetPositionY(), firstStepPos.GetPositionZ()); + break; + case EVENT_INTRO_ALLIANCE_5: + Talk(SAY_INTRO_ALLIANCE_5); + for (std::list::iterator itr = _guardList.begin(); itr != _guardList.end(); ++itr) + (*itr)->AI()->DoAction(ACTION_CHARGE); + me->GetMotionMaster()->MoveCharge(chargePos[0].GetPositionX(), chargePos[0].GetPositionY(), chargePos[0].GetPositionZ(), 8.5f, POINT_CHARGE); + break; + case EVENT_INTRO_ALLIANCE_6: + if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG))) { - case POINT_FIRST_STEP: - me->SetWalk(false); - Talk(SAY_INTRO_ALLIANCE_4); - _events.ScheduleEvent(EVENT_INTRO_ALLIANCE_5, 5000, 0, PHASE_INTRO_A); - _events.ScheduleEvent(EVENT_INTRO_ALLIANCE_6, 6500+500, 0, PHASE_INTRO_A); - _events.ScheduleEvent(EVENT_INTRO_ALLIANCE_7, 6500+500+2000, 0, PHASE_INTRO_A); - _events.ScheduleEvent(EVENT_INTRO_FINISH, 6500+500+2000+5000, 0, PHASE_INTRO_A); - break; - default: - break; + deathbringer->AI()->Talk(SAY_INTRO_ALLIANCE_7); + deathbringer->AI()->DoCast(me, SPELL_GRIP_OF_AGONY); } - } + break; + case EVENT_INTRO_ALLIANCE_7: + if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG))) + { + deathbringer->AI()->Talk(SAY_INTRO_ALLIANCE_6); + } + break; + case EVENT_INTRO_FINISH: + if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG))) + { + deathbringer->AI()->DoAction(ACTION_INTRO_DONE); + deathbringer->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + if (Player* target = deathbringer->SelectNearestPlayer(100.0f)) + deathbringer->AI()->AttackStart(target); + } + break; } - - void UpdateAI(uint32 diff) override - { - _events.Update(diff); - switch (_events.ExecuteEvent()) - { - case 0: - break; - case EVENT_INTRO_ALLIANCE_2: - if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG))) - deathbringer->AI()->Talk(SAY_INTRO_ALLIANCE_2); - break; - case EVENT_INTRO_ALLIANCE_3: - if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG))) - deathbringer->AI()->Talk(SAY_INTRO_ALLIANCE_3); - break; - case EVENT_INTRO_ALLIANCE_4: - me->SetWalk(true); - me->GetMotionMaster()->MovePoint(POINT_FIRST_STEP, firstStepPos.GetPositionX(), firstStepPos.GetPositionY(), firstStepPos.GetPositionZ()); - break; - case EVENT_INTRO_ALLIANCE_5: - Talk(SAY_INTRO_ALLIANCE_5); - for (std::list::iterator itr = _guardList.begin(); itr != _guardList.end(); ++itr) - (*itr)->AI()->DoAction(ACTION_CHARGE); - me->GetMotionMaster()->MoveCharge(chargePos[0].GetPositionX(), chargePos[0].GetPositionY(), chargePos[0].GetPositionZ(), 8.5f, POINT_CHARGE); - break; - case EVENT_INTRO_ALLIANCE_6: - if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG))) - { - deathbringer->AI()->Talk(SAY_INTRO_ALLIANCE_7); - deathbringer->AI()->DoCast(me, SPELL_GRIP_OF_AGONY); - } - break; - case EVENT_INTRO_ALLIANCE_7: - if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG))) - { - deathbringer->AI()->Talk(SAY_INTRO_ALLIANCE_6); - } - break; - case EVENT_INTRO_FINISH: - if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG))) - { - deathbringer->AI()->DoAction(ACTION_INTRO_DONE); - deathbringer->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - if (Player* target = deathbringer->SelectNearestPlayer(100.0f)) - deathbringer->AI()->AttackStart(target); - } - break; - } - } - - private: - EventMap _events; - InstanceScript* _instance; - std::list _guardList; - }; - - bool OnGossipHello(Player* player, Creature* creature) override - { - InstanceScript* instance = creature->GetInstanceScript(); - if (instance && instance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != DONE && instance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != IN_PROGRESS) - { - AddGossipItemFor(player, 0, "Let it begin...", 631, -ACTION_START_EVENT + 1); - SendGossipMenuFor(player, DEFAULT_GOSSIP_MESSAGE, creature->GetGUID()); - } - - return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - InstanceScript* instance = creature->GetInstanceScript(); - if (instance && instance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != DONE && instance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != IN_PROGRESS) - { - ClearGossipMenuFor(player); - CloseGossipMenuFor(player); - if (action == -ACTION_START_EVENT + 1) - creature->AI()->DoAction(ACTION_START_EVENT); - } + private: + EventMap _events; + InstanceScript* _instance; + std::list _guardList; + }; - return true; + bool OnGossipHello(Player* player, Creature* creature) override + { + InstanceScript* instance = creature->GetInstanceScript(); + if (instance && instance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != DONE && instance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != IN_PROGRESS) + { + AddGossipItemFor(player, 0, "Let it begin...", 631, -ACTION_START_EVENT + 1); + SendGossipMenuFor(player, DEFAULT_GOSSIP_MESSAGE, creature->GetGUID()); } - CreatureAI* GetAI(Creature* creature) const override + return true; + } + + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override + { + InstanceScript* instance = creature->GetInstanceScript(); + if (instance && instance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != DONE && instance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != IN_PROGRESS) { - return GetIcecrownCitadelAI(creature); + ClearGossipMenuFor(player); + CloseGossipMenuFor(player); + if (action == -ACTION_START_EVENT + 1) + creature->AI()->DoAction(ACTION_START_EVENT); } + + return true; + } + + CreatureAI* GetAI(Creature* creature) const override + { + return GetIcecrownCitadelAI(creature); + } }; class npc_saurfang_event : public CreatureScript { - public: - npc_saurfang_event() : CreatureScript("npc_saurfang_event") { } +public: + npc_saurfang_event() : CreatureScript("npc_saurfang_event") { } - struct npc_saurfang_eventAI : public ScriptedAI + struct npc_saurfang_eventAI : public ScriptedAI + { + npc_saurfang_eventAI(Creature* creature) : ScriptedAI(creature) { - npc_saurfang_eventAI(Creature* creature) : ScriptedAI(creature) - { - _index = 0; - me->SetReactState(REACT_PASSIVE); - } - - void SetData(uint32 type, uint32 data) - { - ASSERT(!type && data && data < 6); - _index = data; - } - - void SpellHit(Unit* /*caster*/, SpellInfo const* spell) - { - if (spell->Id == SPELL_GRIP_OF_AGONY) - { - me->SetDisableGravity(true); - me->GetMotionMaster()->MovePoint(POINT_CHOKE, chokePos[_index]); - } - } - - void DoAction(int32 action) - { - if (action == ACTION_CHARGE && _index) - { - me->SetWalk(false); - me->GetMotionMaster()->MoveCharge(chargePos[_index].GetPositionX(), chargePos[_index].GetPositionY(), chargePos[_index].GetPositionZ(), 13.0f, POINT_CHARGE); - } - else if (action == ACTION_DESPAWN) - me->DespawnOrUnsummon(1); - } - - private: - uint32 _index; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + _index = 0; + me->SetReactState(REACT_PASSIVE); } + + void SetData(uint32 type, uint32 data) + { + ASSERT(!type && data && data < 6); + _index = data; + } + + void SpellHit(Unit* /*caster*/, SpellInfo const* spell) + { + if (spell->Id == SPELL_GRIP_OF_AGONY) + { + me->SetDisableGravity(true); + me->GetMotionMaster()->MovePoint(POINT_CHOKE, chokePos[_index]); + } + } + + void DoAction(int32 action) + { + if (action == ACTION_CHARGE && _index) + { + me->SetWalk(false); + me->GetMotionMaster()->MoveCharge(chargePos[_index].GetPositionX(), chargePos[_index].GetPositionY(), chargePos[_index].GetPositionZ(), 13.0f, POINT_CHARGE); + } + else if (action == ACTION_DESPAWN) + me->DespawnOrUnsummon(1); + } + + private: + uint32 _index; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class spell_deathbringer_blood_link_aura : public SpellScriptLoader { - public: - spell_deathbringer_blood_link_aura() : SpellScriptLoader("spell_deathbringer_blood_link_aura") { } +public: + spell_deathbringer_blood_link_aura() : SpellScriptLoader("spell_deathbringer_blood_link_aura") { } - class spell_deathbringer_blood_link_AuraScript : public AuraScript + class spell_deathbringer_blood_link_AuraScript : public AuraScript + { + PrepareAuraScript(spell_deathbringer_blood_link_AuraScript); + + void HandlePeriodicTick(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_deathbringer_blood_link_AuraScript); - - void HandlePeriodicTick(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - if (GetUnitOwner()->getPowerType() == POWER_ENERGY && GetUnitOwner()->GetPower(POWER_ENERGY) == GetUnitOwner()->GetMaxPower(POWER_ENERGY)) - if (Creature* saurfang = GetUnitOwner()->ToCreature()) - saurfang->AI()->DoAction(ACTION_MARK_OF_THE_FALLEN_CHAMPION); - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - SpellInfo const* procSpell = eventInfo.GetDamageInfo()->GetSpellInfo(); - return eventInfo.GetActor() && eventInfo.GetActionTarget() && (eventInfo.GetDamageInfo()->GetDamage() || eventInfo.GetHitMask() & PROC_EX_ABSORB) && procSpell && procSpell->SpellIconID != 2731; // Xinef: Mark of the Fallen Champion - } - - void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - Unit* victim = eventInfo.GetActionTarget(); - SpellInfo const* procSpell = eventInfo.GetDamageInfo()->GetSpellInfo(); - - //uint32 markCount = 0; - //if (Creature* saurfang = eventInfo.GetActor()->ToCreature()) - //markCount = saurfang->IsAIEnabled ? saurfang->AI()->GetData(123456 /*FALLEN_CHAMPION_CAST_COUNT*/) : 0; - int32 basepoints = int32(1.0f /*+ 0.5f + 0.5f*markCount*/); - switch (procSpell->Id) // some spells give more Blood Power - { - case 72380: case 72438: case 72439: case 72440: // Blood Nova - basepoints = int32(2.0f /*+ 0.5f + 0.75f*markCount*/); - break; - } - - victim->CastCustomSpell(SPELL_BLOOD_LINK_DUMMY, SPELLVALUE_BASE_POINT0, basepoints, eventInfo.GetActor(), true); - return; - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_deathbringer_blood_link_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_deathbringer_blood_link_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); - - OnEffectPeriodic += AuraEffectPeriodicFn(spell_deathbringer_blood_link_AuraScript::HandlePeriodicTick, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_deathbringer_blood_link_AuraScript(); + PreventDefaultAction(); + if (GetUnitOwner()->getPowerType() == POWER_ENERGY && GetUnitOwner()->GetPower(POWER_ENERGY) == GetUnitOwner()->GetMaxPower(POWER_ENERGY)) + if (Creature* saurfang = GetUnitOwner()->ToCreature()) + saurfang->AI()->DoAction(ACTION_MARK_OF_THE_FALLEN_CHAMPION); } + + bool CheckProc(ProcEventInfo& eventInfo) + { + SpellInfo const* procSpell = eventInfo.GetDamageInfo()->GetSpellInfo(); + return eventInfo.GetActor() && eventInfo.GetActionTarget() && (eventInfo.GetDamageInfo()->GetDamage() || eventInfo.GetHitMask() & PROC_EX_ABSORB) && procSpell && procSpell->SpellIconID != 2731; // Xinef: Mark of the Fallen Champion + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + Unit* victim = eventInfo.GetActionTarget(); + SpellInfo const* procSpell = eventInfo.GetDamageInfo()->GetSpellInfo(); + + //uint32 markCount = 0; + //if (Creature* saurfang = eventInfo.GetActor()->ToCreature()) + //markCount = saurfang->IsAIEnabled ? saurfang->AI()->GetData(123456 /*FALLEN_CHAMPION_CAST_COUNT*/) : 0; + int32 basepoints = int32(1.0f /*+ 0.5f + 0.5f*markCount*/); + switch (procSpell->Id) // some spells give more Blood Power + { + case 72380: + case 72438: + case 72439: + case 72440: // Blood Nova + basepoints = int32(2.0f /*+ 0.5f + 0.75f*markCount*/); + break; + } + + victim->CastCustomSpell(SPELL_BLOOD_LINK_DUMMY, SPELLVALUE_BASE_POINT0, basepoints, eventInfo.GetActor(), true); + return; + } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_deathbringer_blood_link_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_deathbringer_blood_link_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + + OnEffectPeriodic += AuraEffectPeriodicFn(spell_deathbringer_blood_link_AuraScript::HandlePeriodicTick, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_deathbringer_blood_link_AuraScript(); + } }; class spell_deathbringer_blood_link_blood_beast_aura : public SpellScriptLoader { - public: - spell_deathbringer_blood_link_blood_beast_aura() : SpellScriptLoader("spell_deathbringer_blood_link_blood_beast_aura") { } +public: + spell_deathbringer_blood_link_blood_beast_aura() : SpellScriptLoader("spell_deathbringer_blood_link_blood_beast_aura") { } - class spell_deathbringer_blood_link_blood_beast_aura_AuraScript : public AuraScript + class spell_deathbringer_blood_link_blood_beast_aura_AuraScript : public AuraScript + { + PrepareAuraScript(spell_deathbringer_blood_link_blood_beast_aura_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_deathbringer_blood_link_blood_beast_aura_AuraScript); - - bool CheckProc(ProcEventInfo& eventInfo) - { - SpellInfo const* procSpell = eventInfo.GetDamageInfo()->GetSpellInfo(); - return eventInfo.GetActor() && eventInfo.GetActionTarget() && (eventInfo.GetDamageInfo()->GetDamage() || eventInfo.GetHitMask() & PROC_EX_ABSORB) && (!procSpell || procSpell->SpellIconID != 2731); // Xinef: Mark of the Fallen Champion - } - - void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - - /* - uint32 markCount = 0; - if (Map* map = eventInfo.GetActor()->FindMap()) - if (InstanceMap* imap = map->ToInstanceMap()) - if (InstanceScript* isc = imap->GetInstanceScript()) - if (uint64 sguid = isc->GetData64(3) //DATA_DEATHBRINGER_SAURFANG - if (Creature* saurfang = ObjectAccessor::GetCreature(*eventInfo.GetActor(), sguid)) - markCount = saurfang->IsAIEnabled ? saurfang->AI()->GetData(123456) : 0; //FALLEN_CHAMPION_CAST_COUNT - */ - int32 basepoints = int32(3.0f /*+ 0.5f + 0.5f*markCount*/); - - eventInfo.GetActor()->CastCustomSpell(SPELL_BLOOD_LINK_DUMMY, SPELLVALUE_BASE_POINT0, basepoints, eventInfo.GetActionTarget(), true); - return; - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_deathbringer_blood_link_blood_beast_aura_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_deathbringer_blood_link_blood_beast_aura_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_deathbringer_blood_link_blood_beast_aura_AuraScript(); + SpellInfo const* procSpell = eventInfo.GetDamageInfo()->GetSpellInfo(); + return eventInfo.GetActor() && eventInfo.GetActionTarget() && (eventInfo.GetDamageInfo()->GetDamage() || eventInfo.GetHitMask() & PROC_EX_ABSORB) && (!procSpell || procSpell->SpellIconID != 2731); // Xinef: Mark of the Fallen Champion } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + /* + uint32 markCount = 0; + if (Map* map = eventInfo.GetActor()->FindMap()) + if (InstanceMap* imap = map->ToInstanceMap()) + if (InstanceScript* isc = imap->GetInstanceScript()) + if (uint64 sguid = isc->GetData64(3) //DATA_DEATHBRINGER_SAURFANG + if (Creature* saurfang = ObjectAccessor::GetCreature(*eventInfo.GetActor(), sguid)) + markCount = saurfang->IsAIEnabled ? saurfang->AI()->GetData(123456) : 0; //FALLEN_CHAMPION_CAST_COUNT + */ + int32 basepoints = int32(3.0f /*+ 0.5f + 0.5f*markCount*/); + + eventInfo.GetActor()->CastCustomSpell(SPELL_BLOOD_LINK_DUMMY, SPELLVALUE_BASE_POINT0, basepoints, eventInfo.GetActionTarget(), true); + return; + } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_deathbringer_blood_link_blood_beast_aura_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_deathbringer_blood_link_blood_beast_aura_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_deathbringer_blood_link_blood_beast_aura_AuraScript(); + } }; class spell_deathbringer_blood_link : public SpellScriptLoader { - public: - spell_deathbringer_blood_link() : SpellScriptLoader("spell_deathbringer_blood_link") { } +public: + spell_deathbringer_blood_link() : SpellScriptLoader("spell_deathbringer_blood_link") { } - class spell_deathbringer_blood_link_SpellScript : public SpellScript + class spell_deathbringer_blood_link_SpellScript : public SpellScript + { + PrepareSpellScript(spell_deathbringer_blood_link_SpellScript); + + void HandleDummy(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_deathbringer_blood_link_SpellScript); - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - GetHitUnit()->CastCustomSpell(SPELL_BLOOD_LINK_POWER, SPELLVALUE_BASE_POINT0, GetEffectValue(), GetHitUnit(), true); - if (Aura* bloodPower = GetHitUnit()->GetAura(SPELL_BLOOD_POWER)) - bloodPower->RecalculateAmountOfEffects(); - PreventHitDefaultEffect(EFFECT_0); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_deathbringer_blood_link_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_deathbringer_blood_link_SpellScript(); + GetHitUnit()->CastCustomSpell(SPELL_BLOOD_LINK_POWER, SPELLVALUE_BASE_POINT0, GetEffectValue(), GetHitUnit(), true); + if (Aura* bloodPower = GetHitUnit()->GetAura(SPELL_BLOOD_POWER)) + bloodPower->RecalculateAmountOfEffects(); + PreventHitDefaultEffect(EFFECT_0); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_deathbringer_blood_link_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_deathbringer_blood_link_SpellScript(); + } }; class spell_deathbringer_blood_power : public SpellScriptLoader { - public: - spell_deathbringer_blood_power() : SpellScriptLoader("spell_deathbringer_blood_power") { } +public: + spell_deathbringer_blood_power() : SpellScriptLoader("spell_deathbringer_blood_power") { } - class spell_deathbringer_blood_power_SpellScript : public SpellScript + class spell_deathbringer_blood_power_SpellScript : public SpellScript + { + PrepareSpellScript(spell_deathbringer_blood_power_SpellScript); + + void ModAuraValue() { - PrepareSpellScript(spell_deathbringer_blood_power_SpellScript); - - void ModAuraValue() - { - if (Aura* aura = GetHitAura()) - aura->RecalculateAmountOfEffects(); - } - - void Register() - { - AfterHit += SpellHitFn(spell_deathbringer_blood_power_SpellScript::ModAuraValue); - } - }; - - class spell_deathbringer_blood_power_AuraScript : public AuraScript - { - PrepareAuraScript(spell_deathbringer_blood_power_AuraScript); - - void RecalculateHook(AuraEffect const* /*aurEffect*/, int32& amount, bool& canBeRecalculated) - { - amount = int32(GetUnitOwner()->GetPower(POWER_ENERGY)); - canBeRecalculated = true; - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_deathbringer_blood_power_AuraScript::RecalculateHook, EFFECT_0, SPELL_AURA_MOD_SCALE); - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_deathbringer_blood_power_AuraScript::RecalculateHook, EFFECT_1, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE); - } - - bool Load() - { - if (GetUnitOwner()->getPowerType() != POWER_ENERGY) - return false; - return true; - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_deathbringer_blood_power_SpellScript(); + if (Aura* aura = GetHitAura()) + aura->RecalculateAmountOfEffects(); } - AuraScript* GetAuraScript() const + void Register() { - return new spell_deathbringer_blood_power_AuraScript(); + AfterHit += SpellHitFn(spell_deathbringer_blood_power_SpellScript::ModAuraValue); } + }; + + class spell_deathbringer_blood_power_AuraScript : public AuraScript + { + PrepareAuraScript(spell_deathbringer_blood_power_AuraScript); + + void RecalculateHook(AuraEffect const* /*aurEffect*/, int32& amount, bool& canBeRecalculated) + { + amount = int32(GetUnitOwner()->GetPower(POWER_ENERGY)); + canBeRecalculated = true; + } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_deathbringer_blood_power_AuraScript::RecalculateHook, EFFECT_0, SPELL_AURA_MOD_SCALE); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_deathbringer_blood_power_AuraScript::RecalculateHook, EFFECT_1, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE); + } + + bool Load() + { + if (GetUnitOwner()->getPowerType() != POWER_ENERGY) + return false; + return true; + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_deathbringer_blood_power_SpellScript(); + } + + AuraScript* GetAuraScript() const + { + return new spell_deathbringer_blood_power_AuraScript(); + } }; class spell_deathbringer_blood_nova_targeting : public SpellScriptLoader { - public: - spell_deathbringer_blood_nova_targeting() : SpellScriptLoader("spell_deathbringer_blood_nova_targeting") { } +public: + spell_deathbringer_blood_nova_targeting() : SpellScriptLoader("spell_deathbringer_blood_nova_targeting") { } - class spell_deathbringer_blood_nova_targeting_SpellScript : public SpellScript + class spell_deathbringer_blood_nova_targeting_SpellScript : public SpellScript + { + PrepareSpellScript(spell_deathbringer_blood_nova_targeting_SpellScript); + + bool Load() { - PrepareSpellScript(spell_deathbringer_blood_nova_targeting_SpellScript); - - bool Load() - { - // initialize variable - target = nullptr; - return true; - } - - void FilterTargetsInitial(std::list& targets) - { - // select one random target, with preference of ranged targets - uint32 targetsAtRange = 0; - uint32 const minTargets = uint32(GetCaster()->GetMap()->GetSpawnMode() & 1 ? 10 : 4); - targets.sort(acore::ObjectDistanceOrderPred(GetCaster(), false)); - - // get target count at range - for (std::list::iterator itr = targets.begin(); itr != targets.end(); ++itr, ++targetsAtRange) - if ((*itr)->GetDistance(GetCaster()) < 12.0f) - break; - - // set the upper cap - if (targetsAtRange < minTargets) - targetsAtRange = std::min(targets.size(), minTargets); - - if (!targetsAtRange) - return; - - std::list::iterator itrTarget = targets.begin(); - std::advance(itrTarget, urand(0,targetsAtRange-1)); - target = *itrTarget; - targets.clear(); - targets.push_back(target); - } - - // use the same target for first and second effect - void FilterTargetsSubsequent(std::list& targets) - { - if (!target) - return; - - targets.clear(); - targets.push_back(target); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_deathbringer_blood_nova_targeting_SpellScript::FilterTargetsInitial, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_deathbringer_blood_nova_targeting_SpellScript::FilterTargetsSubsequent, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); - } - - WorldObject* target; - }; - - SpellScript* GetSpellScript() const - { - return new spell_deathbringer_blood_nova_targeting_SpellScript(); + // initialize variable + target = nullptr; + return true; } + + void FilterTargetsInitial(std::list& targets) + { + // select one random target, with preference of ranged targets + uint32 targetsAtRange = 0; + uint32 const minTargets = uint32(GetCaster()->GetMap()->GetSpawnMode() & 1 ? 10 : 4); + targets.sort(acore::ObjectDistanceOrderPred(GetCaster(), false)); + + // get target count at range + for (std::list::iterator itr = targets.begin(); itr != targets.end(); ++itr, ++targetsAtRange) + if ((*itr)->GetDistance(GetCaster()) < 12.0f) + break; + + // set the upper cap + if (targetsAtRange < minTargets) + targetsAtRange = std::min(targets.size(), minTargets); + + if (!targetsAtRange) + return; + + std::list::iterator itrTarget = targets.begin(); + std::advance(itrTarget, urand(0, targetsAtRange - 1)); + target = *itrTarget; + targets.clear(); + targets.push_back(target); + } + + // use the same target for first and second effect + void FilterTargetsSubsequent(std::list& targets) + { + if (!target) + return; + + targets.clear(); + targets.push_back(target); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_deathbringer_blood_nova_targeting_SpellScript::FilterTargetsInitial, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_deathbringer_blood_nova_targeting_SpellScript::FilterTargetsSubsequent, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); + } + + WorldObject* target; + }; + + SpellScript* GetSpellScript() const + { + return new spell_deathbringer_blood_nova_targeting_SpellScript(); + } }; class spell_deathbringer_boiling_blood : public SpellScriptLoader { - public: - spell_deathbringer_boiling_blood() : SpellScriptLoader("spell_deathbringer_boiling_blood") { } +public: + spell_deathbringer_boiling_blood() : SpellScriptLoader("spell_deathbringer_boiling_blood") { } - class spell_deathbringer_boiling_blood_SpellScript : public SpellScript + class spell_deathbringer_boiling_blood_SpellScript : public SpellScript + { + PrepareSpellScript(spell_deathbringer_boiling_blood_SpellScript); + + bool Load() { - PrepareSpellScript(spell_deathbringer_boiling_blood_SpellScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_UNIT; - } - - void FilterTargets(std::list& targets) - { - targets.remove(GetCaster()->GetVictim()); - if (targets.empty()) - return; - - if (GetSpellInfo()->Id == 72385 || GetSpellInfo()->Id == 72442) // 10n, 10h - { - WorldObject* target = acore::Containers::SelectRandomContainerElement(targets); - targets.clear(); - targets.push_back(target); - } - else - acore::Containers::RandomResizeList(targets, 3); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_deathbringer_boiling_blood_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_deathbringer_boiling_blood_SpellScript(); + return GetCaster()->GetTypeId() == TYPEID_UNIT; } + + void FilterTargets(std::list& targets) + { + targets.remove(GetCaster()->GetVictim()); + if (targets.empty()) + return; + + if (GetSpellInfo()->Id == 72385 || GetSpellInfo()->Id == 72442) // 10n, 10h + { + WorldObject* target = acore::Containers::SelectRandomContainerElement(targets); + targets.clear(); + targets.push_back(target); + } + else + acore::Containers::RandomResizeList(targets, 3); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_deathbringer_boiling_blood_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_deathbringer_boiling_blood_SpellScript(); + } }; class achievement_ive_gone_and_made_a_mess : public AchievementCriteriaScript { - public: - achievement_ive_gone_and_made_a_mess() : AchievementCriteriaScript("achievement_ive_gone_and_made_a_mess") { } +public: + achievement_ive_gone_and_made_a_mess() : AchievementCriteriaScript("achievement_ive_gone_and_made_a_mess") { } - bool OnCheck(Player* /*source*/, Unit* target) - { - if (target) - if (Creature* saurfang = target->ToCreature()) - if (saurfang->AI()->GetData(DATA_MADE_A_MESS)) - return true; + bool OnCheck(Player* /*source*/, Unit* target) + { + if (target) + if (Creature* saurfang = target->ToCreature()) + if (saurfang->AI()->GetData(DATA_MADE_A_MESS)) + return true; - return false; - } + return false; + } }; class npc_icc_blood_beast : public CreatureScript diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp index 9307952f5..f46145882 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp @@ -67,158 +67,158 @@ enum Events class boss_festergut : public CreatureScript { - public: - boss_festergut() : CreatureScript("boss_festergut") { } +public: + boss_festergut() : CreatureScript("boss_festergut") { } - struct boss_festergutAI : public BossAI + struct boss_festergutAI : public BossAI + { + boss_festergutAI(Creature* creature) : BossAI(creature, DATA_FESTERGUT) { - boss_festergutAI(Creature* creature) : BossAI(creature, DATA_FESTERGUT) + _gasDummyGUID = 0; + } + + uint64 _gasDummyGUID; + uint32 _maxInoculatedStack; + uint32 _inhaleCounter; + + void Reset() + { + _maxInoculatedStack = 0; + _inhaleCounter = 0; + _Reset(); + events.Reset(); + if (Creature* gasDummy = me->FindNearestCreature(NPC_GAS_DUMMY, 100.0f, true)) { - _gasDummyGUID = 0; + _gasDummyGUID = gasDummy->GetGUID(); + for (uint8 i = 0; i < 3; ++i) + gasDummy->RemoveAurasDueToSpell(gaseousBlightVisual[i]); + } + } + + void EnterCombat(Unit* who) + { + if (!instance->CheckRequiredBosses(DATA_FESTERGUT, who->ToPlayer())) + { + EnterEvadeMode(); + instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT); + return; } - uint64 _gasDummyGUID; - uint32 _maxInoculatedStack; - uint32 _inhaleCounter; + events.ScheduleEvent(EVENT_BERSERK, 300000); + events.ScheduleEvent(EVENT_INHALE_BLIGHT, urand(25000, 30000)); + events.ScheduleEvent(EVENT_GAS_SPORE, urand(20000, 25000)); + events.ScheduleEvent(EVENT_VILE_GAS, urand(30000, 40000), 1); + events.ScheduleEvent(EVENT_GASTRIC_BLOAT, urand(12500, 15000)); + if (IsHeroic()) + events.ScheduleEvent(EVENT_FESTERGUT_GOO, urand(15000, 20000)); - void Reset() + me->setActive(true); + Talk(SAY_AGGRO); + DoZoneInCombat(); + + if (Creature* gasDummy = me->FindNearestCreature(NPC_GAS_DUMMY, 100.0f, true)) + _gasDummyGUID = gasDummy->GetGUID(); + if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) + professor->AI()->DoAction(ACTION_FESTERGUT_COMBAT); + } + + void JustDied(Unit* /*killer*/) + { + _JustDied(); + Talk(SAY_DEATH); + if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) + professor->AI()->DoAction(ACTION_FESTERGUT_DEATH); + + RemoveBlight(); + } + + void JustReachedHome() + { + _JustReachedHome(); + instance->SetBossState(DATA_FESTERGUT, FAIL); + } + + void EnterEvadeMode() + { + ScriptedAI::EnterEvadeMode(); + if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) + professor->AI()->EnterEvadeMode(); + } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_KILL); + } + + void SpellHitTarget(Unit* target, SpellInfo const* spell) + { + if (spell->Id == PUNGENT_BLIGHT_HELPER) + target->RemoveAurasDueToSpell(INOCULATED_HELPER); + else if (Player* p = target->ToPlayer()) { - _maxInoculatedStack = 0; - _inhaleCounter = 0; - _Reset(); - events.Reset(); - if (Creature* gasDummy = me->FindNearestCreature(NPC_GAS_DUMMY, 100.0f, true)) - { - _gasDummyGUID = gasDummy->GetGUID(); - for (uint8 i=0; i<3; ++i) - gasDummy->RemoveAurasDueToSpell(gaseousBlightVisual[i]); - } - } - - void EnterCombat(Unit* who) - { - if (!instance->CheckRequiredBosses(DATA_FESTERGUT, who->ToPlayer())) - { - EnterEvadeMode(); - instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT); - return; - } - - events.ScheduleEvent(EVENT_BERSERK, 300000); - events.ScheduleEvent(EVENT_INHALE_BLIGHT, urand(25000, 30000)); - events.ScheduleEvent(EVENT_GAS_SPORE, urand(20000, 25000)); - events.ScheduleEvent(EVENT_VILE_GAS, urand(30000, 40000), 1); - events.ScheduleEvent(EVENT_GASTRIC_BLOAT, urand(12500, 15000)); - if (IsHeroic()) - events.ScheduleEvent(EVENT_FESTERGUT_GOO, urand(15000, 20000)); - - me->setActive(true); - Talk(SAY_AGGRO); - DoZoneInCombat(); - - if (Creature* gasDummy = me->FindNearestCreature(NPC_GAS_DUMMY, 100.0f, true)) - _gasDummyGUID = gasDummy->GetGUID(); - if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) - professor->AI()->DoAction(ACTION_FESTERGUT_COMBAT); - } - - void JustDied(Unit* /*killer*/) - { - _JustDied(); - Talk(SAY_DEATH); - if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) - professor->AI()->DoAction(ACTION_FESTERGUT_DEATH); - - RemoveBlight(); - } - - void JustReachedHome() - { - _JustReachedHome(); - instance->SetBossState(DATA_FESTERGUT, FAIL); - } - - void EnterEvadeMode() - { - ScriptedAI::EnterEvadeMode(); - if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) - professor->AI()->EnterEvadeMode(); - } - - void KilledUnit(Unit* victim) - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_KILL); - } - - void SpellHitTarget(Unit* target, SpellInfo const* spell) - { - if (spell->Id == PUNGENT_BLIGHT_HELPER) - target->RemoveAurasDueToSpell(INOCULATED_HELPER); - else if (Player* p = target->ToPlayer()) - { - // Gaseous Blight damage - if (((spell->Id == 69159 || spell->Id == 70136 || spell->Id == 69161 || spell->Id == 70139 || spell->Id == 69163 || spell->Id == 70469) && p->GetQuestStatus(QUEST_RESIDUE_RENDEZVOUS_10) == QUEST_STATUS_INCOMPLETE) || + // Gaseous Blight damage + if (((spell->Id == 69159 || spell->Id == 70136 || spell->Id == 69161 || spell->Id == 70139 || spell->Id == 69163 || spell->Id == 70469) && p->GetQuestStatus(QUEST_RESIDUE_RENDEZVOUS_10) == QUEST_STATUS_INCOMPLETE) || ((spell->Id == 70135 || spell->Id == 70138 || spell->Id == 70468 || spell->Id == 70137 || spell->Id == 70140 || spell->Id == 70470) && p->GetQuestStatus(QUEST_RESIDUE_RENDEZVOUS_25) == QUEST_STATUS_INCOMPLETE)) - p->CastSpell(p, SPELL_ORANGE_BLIGHT_RESIDUE, true); - } + p->CastSpell(p, SPELL_ORANGE_BLIGHT_RESIDUE, true); } + } - void RemoveBlight() - { - if (Creature* gasDummy = ObjectAccessor::GetCreature(*me, _gasDummyGUID)) - for (uint8 i = 0; i < 3; ++i) - { - me->RemoveAurasDueToSpell(gaseousBlight[i]); - gasDummy->RemoveAurasDueToSpell(gaseousBlightVisual[i]); - } - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim() || !CheckInRoom()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) + void RemoveBlight() + { + if (Creature* gasDummy = ObjectAccessor::GetCreature(*me, _gasDummyGUID)) + for (uint8 i = 0; i < 3; ++i) { - case EVENT_BERSERK: - me->CastSpell(me, SPELL_BERSERK2, true); - Talk(SAY_BERSERK); - break; - case EVENT_INHALE_BLIGHT: - RemoveBlight(); - if (_inhaleCounter == 3) - { - Talk(EMOTE_WARN_PUNGENT_BLIGHT); - Talk(SAY_PUNGENT_BLIGHT); - me->CastSpell(me, SPELL_PUNGENT_BLIGHT, false); - _inhaleCounter = 0; - events.RescheduleEvent(EVENT_GAS_SPORE, urand(20000, 25000)); - } - else - { - me->CastSpell(me, SPELL_INHALE_BLIGHT, false); - // just cast and dont bother with target, conditions will handle it - ++_inhaleCounter; - if (_inhaleCounter < 3) - me->CastSpell(me, gaseousBlight[_inhaleCounter], true, nullptr, nullptr, me->GetGUID()); - } + me->RemoveAurasDueToSpell(gaseousBlight[i]); + gasDummy->RemoveAurasDueToSpell(gaseousBlightVisual[i]); + } + } - events.ScheduleEvent(EVENT_INHALE_BLIGHT, 34000); - break; - case EVENT_GAS_SPORE: - Talk(EMOTE_WARN_GAS_SPORE); - Talk(EMOTE_GAS_SPORE); - me->CastCustomSpell(SPELL_GAS_SPORE, SPELLVALUE_MAX_TARGETS, RAID_MODE(2, 3, 2, 3), me); - events.ScheduleEvent(EVENT_GAS_SPORE, urand(40000, 45000)); - events.DelayEventsToMax(20000, 1); // delay EVENT_VILE_GAS - break; - case EVENT_VILE_GAS: + void UpdateAI(uint32 diff) + { + if (!UpdateVictim() || !CheckInRoom()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_BERSERK: + me->CastSpell(me, SPELL_BERSERK2, true); + Talk(SAY_BERSERK); + break; + case EVENT_INHALE_BLIGHT: + RemoveBlight(); + if (_inhaleCounter == 3) + { + Talk(EMOTE_WARN_PUNGENT_BLIGHT); + Talk(SAY_PUNGENT_BLIGHT); + me->CastSpell(me, SPELL_PUNGENT_BLIGHT, false); + _inhaleCounter = 0; + events.RescheduleEvent(EVENT_GAS_SPORE, urand(20000, 25000)); + } + else + { + me->CastSpell(me, SPELL_INHALE_BLIGHT, false); + // just cast and dont bother with target, conditions will handle it + ++_inhaleCounter; + if (_inhaleCounter < 3) + me->CastSpell(me, gaseousBlight[_inhaleCounter], true, nullptr, nullptr, me->GetGUID()); + } + + events.ScheduleEvent(EVENT_INHALE_BLIGHT, 34000); + break; + case EVENT_GAS_SPORE: + Talk(EMOTE_WARN_GAS_SPORE); + Talk(EMOTE_GAS_SPORE); + me->CastCustomSpell(SPELL_GAS_SPORE, SPELLVALUE_MAX_TARGETS, RAID_MODE(2, 3, 2, 3), me); + events.ScheduleEvent(EVENT_GAS_SPORE, urand(40000, 45000)); + events.DelayEventsToMax(20000, 1); // delay EVENT_VILE_GAS + break; + case EVENT_VILE_GAS: { std::list targets; uint32 minTargets = RAID_MODE(3, 8, 3, 8); @@ -232,254 +232,254 @@ class boss_festergut : public CreatureScript events.ScheduleEvent(EVENT_VILE_GAS, urand(28000, 35000), 1); break; } - case EVENT_GASTRIC_BLOAT: - me->CastSpell(me->GetVictim(), SPELL_GASTRIC_BLOAT, false); - events.ScheduleEvent(EVENT_GASTRIC_BLOAT, urand(15000, 17500)); - break; - case EVENT_FESTERGUT_GOO: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(me))) - if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) - professor->CastSpell(target, SPELL_MALLABLE_GOO_H, true); - events.ScheduleEvent(EVENT_FESTERGUT_GOO, urand(15000, 20000)); - default: - break; - } - - DoMeleeAttackIfReady(); + case EVENT_GASTRIC_BLOAT: + me->CastSpell(me->GetVictim(), SPELL_GASTRIC_BLOAT, false); + events.ScheduleEvent(EVENT_GASTRIC_BLOAT, urand(15000, 17500)); + break; + case EVENT_FESTERGUT_GOO: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(me))) + if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) + professor->CastSpell(target, SPELL_MALLABLE_GOO_H, true); + events.ScheduleEvent(EVENT_FESTERGUT_GOO, urand(15000, 20000)); + default: + break; } - void SetData(uint32 type, uint32 data) - { - if (type == DATA_INOCULATED_STACK && data > _maxInoculatedStack) - _maxInoculatedStack = data; - } - - uint32 GetData(uint32 type) const - { - if (type == DATA_INOCULATED_STACK) - return _maxInoculatedStack; - - return 0; - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + DoMeleeAttackIfReady(); } + + void SetData(uint32 type, uint32 data) + { + if (type == DATA_INOCULATED_STACK && data > _maxInoculatedStack) + _maxInoculatedStack = data; + } + + uint32 GetData(uint32 type) const + { + if (type == DATA_INOCULATED_STACK) + return _maxInoculatedStack; + + return 0; + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class spell_festergut_pungent_blight : public SpellScriptLoader { - public: - spell_festergut_pungent_blight() : SpellScriptLoader("spell_festergut_pungent_blight") { } +public: + spell_festergut_pungent_blight() : SpellScriptLoader("spell_festergut_pungent_blight") { } - class spell_festergut_pungent_blight_SpellScript : public SpellScript + class spell_festergut_pungent_blight_SpellScript : public SpellScript + { + PrepareSpellScript(spell_festergut_pungent_blight_SpellScript); + + bool Load() { - PrepareSpellScript(spell_festergut_pungent_blight_SpellScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_UNIT; - } - - void HandleScript(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - if (caster->GetTypeId() != TYPEID_UNIT) - return; - - // Get Inhaled Blight id for our difficulty - uint32 blightId = sSpellMgr->GetSpellIdForDifficulty(uint32(GetEffectValue()), caster); - - // ...and remove it - caster->RemoveAurasDueToSpell(blightId); - caster->ToCreature()->AI()->Talk(EMOTE_PUNGENT_BLIGHT); - - if (InstanceScript* inst = caster->GetInstanceScript()) - if (Creature* professor = ObjectAccessor::GetCreature(*caster, inst->GetData64(DATA_PROFESSOR_PUTRICIDE))) - professor->AI()->DoAction(ACTION_FESTERGUT_GAS); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_festergut_pungent_blight_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_festergut_pungent_blight_SpellScript(); + return GetCaster()->GetTypeId() == TYPEID_UNIT; } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (caster->GetTypeId() != TYPEID_UNIT) + return; + + // Get Inhaled Blight id for our difficulty + uint32 blightId = sSpellMgr->GetSpellIdForDifficulty(uint32(GetEffectValue()), caster); + + // ...and remove it + caster->RemoveAurasDueToSpell(blightId); + caster->ToCreature()->AI()->Talk(EMOTE_PUNGENT_BLIGHT); + + if (InstanceScript* inst = caster->GetInstanceScript()) + if (Creature* professor = ObjectAccessor::GetCreature(*caster, inst->GetData64(DATA_PROFESSOR_PUTRICIDE))) + professor->AI()->DoAction(ACTION_FESTERGUT_GAS); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_festergut_pungent_blight_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_festergut_pungent_blight_SpellScript(); + } }; class spell_festergut_blighted_spores : public SpellScriptLoader { - public: - spell_festergut_blighted_spores() : SpellScriptLoader("spell_festergut_blighted_spores") { } +public: + spell_festergut_blighted_spores() : SpellScriptLoader("spell_festergut_blighted_spores") { } - class spell_festergut_blighted_spores_AuraScript : public AuraScript + class spell_festergut_blighted_spores_AuraScript : public AuraScript + { + PrepareAuraScript(spell_festergut_blighted_spores_AuraScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareAuraScript(spell_festergut_blighted_spores_AuraScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_INOCULATED)) - return false; - return true; - } - - void ExtraEffect(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - if (Aura* a = aurEff->GetBase()) - if (a->GetDuration() > a->GetMaxDuration()-1000) // this does not stack for different casters and previous is removed by new DoT, prevent it from giving inoculation in such case - return; - uint32 inoculatedId = sSpellMgr->GetSpellIdForDifficulty(SPELL_INOCULATED, GetTarget()); - uint8 inoculatedStack = 1; - if (Aura* a = GetTarget()->GetAura(inoculatedId)) - { - inoculatedStack += a->GetStackAmount(); - if (a->GetDuration() > a->GetMaxDuration()-10000) // player may gain only one stack at a time, no matter how many spores explode near him - return; - } - GetTarget()->CastSpell(GetTarget(), SPELL_INOCULATED, true); - if (InstanceScript* instance = GetTarget()->GetInstanceScript()) - if (Creature* festergut = ObjectAccessor::GetCreature(*GetTarget(), instance->GetData64(DATA_FESTERGUT))) - festergut->AI()->SetData(DATA_INOCULATED_STACK, inoculatedStack); - } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_festergut_blighted_spores_AuraScript::ExtraEffect, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_festergut_blighted_spores_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_INOCULATED)) + return false; + return true; } + + void ExtraEffect(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + if (Aura* a = aurEff->GetBase()) + if (a->GetDuration() > a->GetMaxDuration() - 1000) // this does not stack for different casters and previous is removed by new DoT, prevent it from giving inoculation in such case + return; + uint32 inoculatedId = sSpellMgr->GetSpellIdForDifficulty(SPELL_INOCULATED, GetTarget()); + uint8 inoculatedStack = 1; + if (Aura* a = GetTarget()->GetAura(inoculatedId)) + { + inoculatedStack += a->GetStackAmount(); + if (a->GetDuration() > a->GetMaxDuration() - 10000) // player may gain only one stack at a time, no matter how many spores explode near him + return; + } + GetTarget()->CastSpell(GetTarget(), SPELL_INOCULATED, true); + if (InstanceScript* instance = GetTarget()->GetInstanceScript()) + if (Creature* festergut = ObjectAccessor::GetCreature(*GetTarget(), instance->GetData64(DATA_FESTERGUT))) + festergut->AI()->SetData(DATA_INOCULATED_STACK, inoculatedStack); + } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_festergut_blighted_spores_AuraScript::ExtraEffect, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_festergut_blighted_spores_AuraScript(); + } }; class spell_festergut_gastric_bloat : public SpellScriptLoader { - public: - spell_festergut_gastric_bloat() : SpellScriptLoader("spell_festergut_gastric_bloat") { } +public: + spell_festergut_gastric_bloat() : SpellScriptLoader("spell_festergut_gastric_bloat") { } - class spell_festergut_gastric_bloat_SpellScript : public SpellScript + class spell_festergut_gastric_bloat_SpellScript : public SpellScript + { + PrepareSpellScript(spell_festergut_gastric_bloat_SpellScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareSpellScript(spell_festergut_gastric_bloat_SpellScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_GASTRIC_EXPLOSION)) - return false; - return true; - } - - void HandleScript(SpellEffIndex /*effIndex*/) - { - Aura const* aura = GetHitUnit()->GetAura(GetSpellInfo()->Id); - if (!(aura && aura->GetStackAmount() == 10)) - return; - - GetHitUnit()->RemoveAurasDueToSpell(GetSpellInfo()->Id); - GetHitUnit()->CastSpell(GetHitUnit(), SPELL_GASTRIC_EXPLOSION, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_festergut_gastric_bloat_SpellScript::HandleScript, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_festergut_gastric_bloat_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_GASTRIC_EXPLOSION)) + return false; + return true; } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Aura const* aura = GetHitUnit()->GetAura(GetSpellInfo()->Id); + if (!(aura && aura->GetStackAmount() == 10)) + return; + + GetHitUnit()->RemoveAurasDueToSpell(GetSpellInfo()->Id); + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_GASTRIC_EXPLOSION, true); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_festergut_gastric_bloat_SpellScript::HandleScript, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_festergut_gastric_bloat_SpellScript(); + } }; class achievement_flu_shot_shortage : public AchievementCriteriaScript { - public: - achievement_flu_shot_shortage() : AchievementCriteriaScript("achievement_flu_shot_shortage") { } +public: + achievement_flu_shot_shortage() : AchievementCriteriaScript("achievement_flu_shot_shortage") { } - bool OnCheck(Player* /*source*/, Unit* target) - { - if (target && target->GetTypeId() == TYPEID_UNIT) - return target->ToCreature()->AI()->GetData(DATA_INOCULATED_STACK) < 3; + bool OnCheck(Player* /*source*/, Unit* target) + { + if (target && target->GetTypeId() == TYPEID_UNIT) + return target->ToCreature()->AI()->GetData(DATA_INOCULATED_STACK) < 3; - return false; - } + return false; + } }; class npc_stinky_icc : public CreatureScript { - public: - npc_stinky_icc() : CreatureScript("npc_stinky_icc") { } +public: + npc_stinky_icc() : CreatureScript("npc_stinky_icc") { } - struct npc_stinky_iccAI : public ScriptedAI + struct npc_stinky_iccAI : public ScriptedAI + { + npc_stinky_iccAI(Creature* creature) : ScriptedAI(creature) {} + + void Reset() { - npc_stinky_iccAI(Creature* creature) : ScriptedAI(creature) {} - - void Reset() - { - events.Reset(); - } - - void EnterCombat(Unit* /*target*/) - { - me->setActive(true); - me->CastSpell(me, SPELL_PLAGUE_STENCH, true); - events.ScheduleEvent(EVENT_DECIMATE, urand(20000, 25000)); - events.ScheduleEvent(EVENT_MORTAL_WOUND, urand(1500, 2500)); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - if (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_DECIMATE: - me->CastSpell(me->GetVictim(), SPELL_DECIMATE, false); - events.ScheduleEvent(EVENT_DECIMATE, urand(20000, 25000)); - break; - case EVENT_MORTAL_WOUND: - me->CastSpell(me->GetVictim(), SPELL_MORTAL_WOUND, false); - events.ScheduleEvent(EVENT_MORTAL_WOUND, urand(1500, 2500)); - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); - } - - void JustDied(Unit* /*killer*/) - { - if (InstanceScript* _instance = me->GetInstanceScript()) - if (Creature* festergut = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_FESTERGUT))) - if (festergut->IsAlive()) - festergut->AI()->Talk(SAY_STINKY_DEAD); - } - - private: - EventMap events; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + events.Reset(); } + + void EnterCombat(Unit* /*target*/) + { + me->setActive(true); + me->CastSpell(me, SPELL_PLAGUE_STENCH, true); + events.ScheduleEvent(EVENT_DECIMATE, urand(20000, 25000)); + events.ScheduleEvent(EVENT_MORTAL_WOUND, urand(1500, 2500)); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + if (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_DECIMATE: + me->CastSpell(me->GetVictim(), SPELL_DECIMATE, false); + events.ScheduleEvent(EVENT_DECIMATE, urand(20000, 25000)); + break; + case EVENT_MORTAL_WOUND: + me->CastSpell(me->GetVictim(), SPELL_MORTAL_WOUND, false); + events.ScheduleEvent(EVENT_MORTAL_WOUND, urand(1500, 2500)); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + + void JustDied(Unit* /*killer*/) + { + if (InstanceScript* _instance = me->GetInstanceScript()) + if (Creature* festergut = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_FESTERGUT))) + if (festergut->IsAlive()) + festergut->AI()->Talk(SAY_STINKY_DEAD); + } + + private: + EventMap events; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; void AddSC_boss_festergut() diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp index 3265397af..36672fbe2 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp @@ -193,7 +193,7 @@ Position const OrgrimsHammerTeleportExit = { 7.461699f, 0.158853f, 35.72989f, 0. // Alliance encounter Position const OrgrimsHammerTeleportPortal = { 47.550990f, -0.101778f, 37.61111f, 0.0f }; Position const SkybreakerTeleportExit = { -17.55738f, -0.090421f, 21.18366f, 0.0f }; - + uint32 const MuradinExitPathSize = 10; Position const MuradinExitPath[MuradinExitPathSize] = { @@ -474,9 +474,9 @@ public: if (!_owner->IsAlive() || !_owner->GetTransport()) return true; - float x,y,z,o; - _dest.GetPosition(x,y,z,o); - _owner->GetTransport()->CalculatePassengerPosition(x,y,z,&o); + float x, y, z, o; + _dest.GetPosition(x, y, z, o); + _owner->GetTransport()->CalculatePassengerPosition(x, y, z, &o); _owner->GetMotionMaster()->MovePoint(EVENT_CHARGE_PREPATH, x, y, z, false); return true; } @@ -514,929 +514,929 @@ private: class npc_gunship : public CreatureScript { - public: - npc_gunship() : CreatureScript("npc_gunship") { } +public: + npc_gunship() : CreatureScript("npc_gunship") { } - struct npc_gunshipAI : public NullCreatureAI + struct npc_gunshipAI : public NullCreatureAI + { + npc_gunshipAI(Creature* creature) : NullCreatureAI(creature), _instance(creature->GetInstanceScript()), _teamIdInInstance(TeamId(creature->GetInstanceScript()->GetData(DATA_TEAMID_IN_INSTANCE))), _died(false), _summonedFirstMage(false) { - npc_gunshipAI(Creature* creature) : NullCreatureAI(creature), _instance(creature->GetInstanceScript()), _teamIdInInstance(TeamId(creature->GetInstanceScript()->GetData(DATA_TEAMID_IN_INSTANCE))), _died(false), _summonedFirstMage(false) + me->SetRegeneratingHealth(false); + } + + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) + { + if (_instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != IN_PROGRESS) { - me->SetRegeneratingHealth(false); + damage = 0; + return; } - void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) + if (damage >= me->GetHealth()) { - if (_instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != IN_PROGRESS) - { - damage = 0; - return; - } - - if (damage >= me->GetHealth()) - { - JustDied(nullptr); - damage = me->GetHealth() - 1; - return; - } - - if (_summonedFirstMage) - return; - - if (me->GetTransport()->GetEntry() != uint32(_teamIdInInstance == TEAM_HORDE ? GO_THE_SKYBREAKER_H : GO_ORGRIMS_HAMMER_A)) - return; - - if (!me->HealthBelowPctDamaged(90, damage)) - return; - - _summonedFirstMage = true; - if (Creature* captain = me->FindNearestCreature(_teamIdInInstance == TEAM_HORDE ? NPC_IGB_MURADIN_BRONZEBEARD : NPC_IGB_HIGH_OVERLORD_SAURFANG, 200.0f)) - captain->AI()->DoAction(ACTION_SPAWN_MAGE); + JustDied(nullptr); + damage = me->GetHealth() - 1; + return; } - void JustDied(Unit* /*killer*/) + if (_summonedFirstMage) + return; + + if (me->GetTransport()->GetEntry() != uint32(_teamIdInInstance == TEAM_HORDE ? GO_THE_SKYBREAKER_H : GO_ORGRIMS_HAMMER_A)) + return; + + if (!me->HealthBelowPctDamaged(90, damage)) + return; + + _summonedFirstMage = true; + if (Creature* captain = me->FindNearestCreature(_teamIdInInstance == TEAM_HORDE ? NPC_IGB_MURADIN_BRONZEBEARD : NPC_IGB_HIGH_OVERLORD_SAURFANG, 200.0f)) + captain->AI()->DoAction(ACTION_SPAWN_MAGE); + } + + void JustDied(Unit* /*killer*/) + { + if (_died || _instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != IN_PROGRESS) + return; + _died = true; + + bool isVictory = me->GetTransport()->GetEntry() == GO_THE_SKYBREAKER_H || me->GetTransport()->GetEntry() == GO_ORGRIMS_HAMMER_A; + _instance->SetBossState(DATA_ICECROWN_GUNSHIP_BATTLE, isVictory ? DONE : FAIL); + me->GetMap()->SetZoneMusic(AREA_ICECROWN_CITADEL, 0); + + if (Creature* creature = me->FindNearestCreature(me->GetEntry() == NPC_ORGRIMS_HAMMER ? NPC_THE_SKYBREAKER : NPC_ORGRIMS_HAMMER, 200.0f)) { - if (_died || _instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != IN_PROGRESS) - return; - _died = true; - - bool isVictory = me->GetTransport()->GetEntry() == GO_THE_SKYBREAKER_H || me->GetTransport()->GetEntry() == GO_ORGRIMS_HAMMER_A; - _instance->SetBossState(DATA_ICECROWN_GUNSHIP_BATTLE, isVictory ? DONE : FAIL); - me->GetMap()->SetZoneMusic(AREA_ICECROWN_CITADEL, 0); - - if (Creature* creature = me->FindNearestCreature(me->GetEntry() == NPC_ORGRIMS_HAMMER ? NPC_THE_SKYBREAKER : NPC_ORGRIMS_HAMMER, 200.0f)) - { - _instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, creature); - if (Aura* a = creature->GetAura(SPELL_CHECK_FOR_PLAYERS)) - a->SetDuration(0); - } - _instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); - if (Aura* a = me->GetAura(SPELL_CHECK_FOR_PLAYERS)) + _instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, creature); + if (Aura* a = creature->GetAura(SPELL_CHECK_FOR_PLAYERS)) a->SetDuration(0); + } + _instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + if (Aura* a = me->GetAura(SPELL_CHECK_FOR_PLAYERS)) + a->SetDuration(0); - uint32 explosionSpell = isVictory ? SPELL_EXPLOSION_VICTORY : SPELL_EXPLOSION_WIPE; - if (MotionTransport* t = (me->GetTransport() ? me->GetTransport()->ToMotionTransport() : nullptr)) + uint32 explosionSpell = isVictory ? SPELL_EXPLOSION_VICTORY : SPELL_EXPLOSION_WIPE; + if (MotionTransport* t = (me->GetTransport() ? me->GetTransport()->ToMotionTransport() : nullptr)) + { + Transport::PassengerSet const& passengers = t->GetStaticPassengers(); + for (Transport::PassengerSet::const_iterator itr = passengers.begin(); itr != passengers.end(); ++itr) + { + if ((*itr)->GetTypeId() != TYPEID_UNIT || (*itr)->GetEntry() != NPC_GUNSHIP_HULL) + continue; + (*itr)->ToCreature()->CastSpell((*itr)->ToCreature(), explosionSpell, true); + } + } + + uint32 cannonEntry = _teamIdInInstance == TEAM_HORDE ? NPC_HORDE_GUNSHIP_CANNON : NPC_ALLIANCE_GUNSHIP_CANNON; + if (GameObject* go = _instance->instance->GetGameObject(_instance->GetData64(DATA_ICECROWN_GUNSHIP_BATTLE))) + if (MotionTransport* t = go->ToMotionTransport()) { Transport::PassengerSet const& passengers = t->GetStaticPassengers(); for (Transport::PassengerSet::const_iterator itr = passengers.begin(); itr != passengers.end(); ++itr) { - if ((*itr)->GetTypeId() != TYPEID_UNIT || (*itr)->GetEntry() != NPC_GUNSHIP_HULL) + if ((*itr)->GetTypeId() != TYPEID_UNIT || (*itr)->GetEntry() != cannonEntry) continue; - (*itr)->ToCreature()->CastSpell((*itr)->ToCreature(), explosionSpell, true); + Creature* cannon = (*itr)->ToCreature(); + cannon->CastSpell(cannon, SPELL_EJECT_ALL_PASSENGERS, true); + + WorldPacket data(SMSG_PLAYER_VEHICLE_DATA, cannon->GetPackGUID().size() + 4); + data.append(cannon->GetPackGUID()); + data << uint32(0); + cannon->SendMessageToSet(&data, true); + + cannon->RemoveVehicleKit(); } } - uint32 cannonEntry = _teamIdInInstance == TEAM_HORDE ? NPC_HORDE_GUNSHIP_CANNON : NPC_ALLIANCE_GUNSHIP_CANNON; - if (GameObject* go = _instance->instance->GetGameObject(_instance->GetData64(DATA_ICECROWN_GUNSHIP_BATTLE))) - if (MotionTransport* t = go->ToMotionTransport()) - { - Transport::PassengerSet const& passengers = t->GetStaticPassengers(); - for (Transport::PassengerSet::const_iterator itr = passengers.begin(); itr != passengers.end(); ++itr) + uint32 creatureEntry = NPC_IGB_MURADIN_BRONZEBEARD; + uint8 textId = isVictory ? SAY_MURADIN_VICTORY : SAY_MURADIN_WIPE; + if (_teamIdInInstance == TEAM_HORDE) + { + creatureEntry = NPC_IGB_HIGH_OVERLORD_SAURFANG; + textId = isVictory ? SAY_SAURFANG_VICTORY : SAY_SAURFANG_WIPE; + } + if (Creature* creature = me->FindNearestCreature(creatureEntry, 200.0f)) + creature->AI()->Talk(textId); + + if (isVictory) + { + if (GameObject* go = HashMapHolder::Find(_instance->GetData64(DATA_ICECROWN_GUNSHIP_BATTLE))) + if (MotionTransport* otherTransport = go->ToMotionTransport()) + otherTransport->EnableMovement(true); + + me->GetTransport()->ToMotionTransport()->EnableMovement(true); + + if (Creature* ship = me->FindNearestCreature(_teamIdInInstance == TEAM_HORDE ? NPC_ORGRIMS_HAMMER : NPC_THE_SKYBREAKER, 200.0f)) + { + ship->CastSpell(ship, SPELL_TELEPORT_PLAYERS_ON_VICTORY, true); + ship->CastSpell(ship, SPELL_ACHIEVEMENT, true); + ship->CastSpell(ship, SPELL_AWARD_REPUTATION_BOSS_KILL, true); + } + + for (uint8 i = 0; i < 2; ++i) + if (GameObject* go = _instance->instance->GetGameObject(_instance->GetData64(i == 0 ? DATA_ICECROWN_GUNSHIP_BATTLE : DATA_ENEMY_GUNSHIP))) + if (MotionTransport* t = go->ToMotionTransport()) { - if ((*itr)->GetTypeId() != TYPEID_UNIT || (*itr)->GetEntry() != cannonEntry) - continue; - Creature* cannon = (*itr)->ToCreature(); - cannon->CastSpell(cannon, SPELL_EJECT_ALL_PASSENGERS, true); - - WorldPacket data(SMSG_PLAYER_VEHICLE_DATA, cannon->GetPackGUID().size() + 4); - data.append(cannon->GetPackGUID()); - data << uint32(0); - cannon->SendMessageToSet(&data, true); - - cannon->RemoveVehicleKit(); - } - } - - uint32 creatureEntry = NPC_IGB_MURADIN_BRONZEBEARD; - uint8 textId = isVictory ? SAY_MURADIN_VICTORY : SAY_MURADIN_WIPE; - if (_teamIdInInstance == TEAM_HORDE) - { - creatureEntry = NPC_IGB_HIGH_OVERLORD_SAURFANG; - textId = isVictory ? SAY_SAURFANG_VICTORY : SAY_SAURFANG_WIPE; - } - if (Creature* creature = me->FindNearestCreature(creatureEntry, 200.0f)) - creature->AI()->Talk(textId); - - if (isVictory) - { - if (GameObject* go = HashMapHolder::Find(_instance->GetData64(DATA_ICECROWN_GUNSHIP_BATTLE))) - if (MotionTransport* otherTransport = go->ToMotionTransport()) - otherTransport->EnableMovement(true); - - me->GetTransport()->ToMotionTransport()->EnableMovement(true); - - if (Creature* ship = me->FindNearestCreature(_teamIdInInstance == TEAM_HORDE ? NPC_ORGRIMS_HAMMER : NPC_THE_SKYBREAKER, 200.0f)) - { - ship->CastSpell(ship, SPELL_TELEPORT_PLAYERS_ON_VICTORY, true); - ship->CastSpell(ship, SPELL_ACHIEVEMENT, true); - ship->CastSpell(ship, SPELL_AWARD_REPUTATION_BOSS_KILL, true); - } - - for (uint8 i=0; i<2; ++i) - if (GameObject* go = _instance->instance->GetGameObject(_instance->GetData64(i == 0 ? DATA_ICECROWN_GUNSHIP_BATTLE : DATA_ENEMY_GUNSHIP))) - if (MotionTransport* t = go->ToMotionTransport()) + Transport::PassengerSet const& passengers = t->GetPassengers(); + for (Transport::PassengerSet::const_iterator itr = passengers.begin(); itr != passengers.end(); ++itr) { - Transport::PassengerSet const& passengers = t->GetPassengers(); - for (Transport::PassengerSet::const_iterator itr = passengers.begin(); itr != passengers.end(); ++itr) - { - if ((*itr)->GetTypeId() != TYPEID_UNIT) - continue; - Creature* c = (*itr)->ToCreature(); - if (c->GetEntry() == NPC_SKYBREAKER_MARINE || c->GetEntry() == NPC_SKYBREAKER_SERGEANT || c->GetEntry() == NPC_KOR_KRON_REAVER || c->GetEntry() == NPC_KOR_KRON_SERGEANT) - c->DespawnOrUnsummon(1); - } + if ((*itr)->GetTypeId() != TYPEID_UNIT) + continue; + Creature* c = (*itr)->ToCreature(); + if (c->GetEntry() == NPC_SKYBREAKER_MARINE || c->GetEntry() == NPC_SKYBREAKER_SERGEANT || c->GetEntry() == NPC_KOR_KRON_REAVER || c->GetEntry() == NPC_KOR_KRON_SERGEANT) + c->DespawnOrUnsummon(1); } + } + } + else + { + uint32 teleportSpellId = _teamIdInInstance == TEAM_HORDE ? SPELL_TELEPORT_PLAYERS_ON_RESET_H : SPELL_TELEPORT_PLAYERS_ON_RESET_A; + me->m_Events.AddEvent(new ResetEncounterEvent(me, teleportSpellId, _instance->GetData64(DATA_ENEMY_GUNSHIP)), me->m_Events.CalculateTime(8000)); + } + } + + void SetGUID(uint64 guid, int32 id/* = 0*/) + { + if (id != ACTION_SHIP_VISITS_ENEMY && id != ACTION_SHIP_VISITS_SELF) + return; + + std::map::iterator itr = _shipVisits.find(guid); + if (itr == _shipVisits.end()) + { + if (id == ACTION_SHIP_VISITS_ENEMY) + _shipVisits[guid] = ACTION_SHIP_VISITS_ENEMY; + } + else if (itr->second) // if 0 then achiev already failed + { + if (id == ACTION_SHIP_VISITS_SELF) + { + if (itr->second == ACTION_SHIP_VISITS_ENEMY) + itr->second = ACTION_SHIP_VISITS_SELF; + else if (itr->second == ACTION_SHIP_VISITS_ENEMY_2) + itr->second = ACTION_SHIP_VISITS_SELF_2; } else { - uint32 teleportSpellId = _teamIdInInstance == TEAM_HORDE ? SPELL_TELEPORT_PLAYERS_ON_RESET_H : SPELL_TELEPORT_PLAYERS_ON_RESET_A; - me->m_Events.AddEvent(new ResetEncounterEvent(me, teleportSpellId, _instance->GetData64(DATA_ENEMY_GUNSHIP)), me->m_Events.CalculateTime(8000)); - } - } - - void SetGUID(uint64 guid, int32 id/* = 0*/) - { - if (id != ACTION_SHIP_VISITS_ENEMY && id != ACTION_SHIP_VISITS_SELF) - return; - - std::map::iterator itr = _shipVisits.find(guid); - if (itr == _shipVisits.end()) - { - if (id == ACTION_SHIP_VISITS_ENEMY) - _shipVisits[guid] = ACTION_SHIP_VISITS_ENEMY; - } - else if (itr->second) // if 0 then achiev already failed - { - if (id == ACTION_SHIP_VISITS_SELF) + if (itr->second == ACTION_SHIP_VISITS_SELF) { - if (itr->second == ACTION_SHIP_VISITS_ENEMY) - itr->second = ACTION_SHIP_VISITS_SELF; - else if (itr->second == ACTION_SHIP_VISITS_ENEMY_2) - itr->second = ACTION_SHIP_VISITS_SELF_2; - } - else - { - if (itr->second == ACTION_SHIP_VISITS_SELF) - { - if (me->GetMap()->Is25ManRaid()) - itr->second = 0; - else - itr->second = ACTION_SHIP_VISITS_ENEMY_2; - } - else if (itr->second == ACTION_SHIP_VISITS_SELF_2) + if (me->GetMap()->Is25ManRaid()) itr->second = 0; + else + itr->second = ACTION_SHIP_VISITS_ENEMY_2; } + else if (itr->second == ACTION_SHIP_VISITS_SELF_2) + itr->second = 0; } } + } - uint32 GetData(uint32 id) const - { - if (id != ACTION_SHIP_VISITS_ENEMY) + uint32 GetData(uint32 id) const + { + if (id != ACTION_SHIP_VISITS_ENEMY) + return 0; + + for (std::map::const_iterator itr = _shipVisits.begin(); itr != _shipVisits.end(); ++itr) + if (itr->second == 0) return 0; - for (std::map::const_iterator itr = _shipVisits.begin(); itr != _shipVisits.end(); ++itr) - if (itr->second == 0) - return 0; - - return 1; - } - - private: - InstanceScript* _instance; - TeamId _teamIdInInstance; - std::map _shipVisits; - bool _died; - bool _summonedFirstMage; - }; - - CreatureAI* GetAI(Creature* creature) const - { - if (!creature->GetTransport()) - return nullptr; - - return GetIcecrownCitadelAI(creature); + return 1; } + + private: + InstanceScript* _instance; + TeamId _teamIdInInstance; + std::map _shipVisits; + bool _died; + bool _summonedFirstMage; + }; + + CreatureAI* GetAI(Creature* creature) const + { + if (!creature->GetTransport()) + return nullptr; + + return GetIcecrownCitadelAI(creature); + } }; class npc_high_overlord_saurfang_igb : public CreatureScript { - public: - npc_high_overlord_saurfang_igb() : CreatureScript("npc_high_overlord_saurfang_igb") { } +public: + npc_high_overlord_saurfang_igb() : CreatureScript("npc_high_overlord_saurfang_igb") { } - struct npc_high_overlord_saurfang_igbAI : public ScriptedAI + struct npc_high_overlord_saurfang_igbAI : public ScriptedAI + { + npc_high_overlord_saurfang_igbAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { - npc_high_overlord_saurfang_igbAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) - { - _events.Reset(); - _controller.ResetSlots(TEAM_HORDE, creature->GetTransport()->ToMotionTransport()); - me->SetRegeneratingHealth(false); - me->m_CombatDistance = 70.0f; - _firstMageCooldown = time(nullptr) + 45; - _axethrowersYellCooldown = time_t(0); - _rocketeersYellCooldown = time_t(0); - checkTimer = 1000; - } + _events.Reset(); + _controller.ResetSlots(TEAM_HORDE, creature->GetTransport()->ToMotionTransport()); + me->SetRegeneratingHealth(false); + me->m_CombatDistance = 70.0f; + _firstMageCooldown = time(nullptr) + 45; + _axethrowersYellCooldown = time_t(0); + _rocketeersYellCooldown = time_t(0); + checkTimer = 1000; + } - void sGossipSelect(Player* /*player*/, uint32 /*sender*/, uint32 /*action*/) - { - if (!me->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP)) - return; - me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - me->GetTransport()->setActive(true); - me->GetTransport()->ToMotionTransport()->EnableMovement(true); - _events.ScheduleEvent(EVENT_INTRO_H_1, 5000); - _events.ScheduleEvent(EVENT_INTRO_H_2, 16000); - _events.ScheduleEvent(EVENT_INTRO_SUMMON_SKYBREAKER, 24600); - _events.ScheduleEvent(EVENT_INTRO_H_3, 29600); - _events.ScheduleEvent(EVENT_INTRO_H_4, 39200); - } + void sGossipSelect(Player* /*player*/, uint32 /*sender*/, uint32 /*action*/) + { + if (!me->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP)) + return; + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + me->GetTransport()->setActive(true); + me->GetTransport()->ToMotionTransport()->EnableMovement(true); + _events.ScheduleEvent(EVENT_INTRO_H_1, 5000); + _events.ScheduleEvent(EVENT_INTRO_H_2, 16000); + _events.ScheduleEvent(EVENT_INTRO_SUMMON_SKYBREAKER, 24600); + _events.ScheduleEvent(EVENT_INTRO_H_3, 29600); + _events.ScheduleEvent(EVENT_INTRO_H_4, 39200); + } - void EnterCombat(Unit* /*target*/) - { - if (_instance->GetData(DATA_TEAMID_IN_INSTANCE) == TEAM_HORDE && !me->HasAura(SPELL_FRIENDLY_BOSS_DAMAGE_MOD)) - me->CastSpell(me, SPELL_FRIENDLY_BOSS_DAMAGE_MOD, true); - if (!me->HasAura(SPELL_BATTLE_FURY)) - me->CastSpell(me, SPELL_BATTLE_FURY, true); - _events.CancelEvent(EVENT_CLEAVE); - _events.ScheduleEvent(EVENT_CLEAVE, urand(3000, 6000)); - } + void EnterCombat(Unit* /*target*/) + { + if (_instance->GetData(DATA_TEAMID_IN_INSTANCE) == TEAM_HORDE && !me->HasAura(SPELL_FRIENDLY_BOSS_DAMAGE_MOD)) + me->CastSpell(me, SPELL_FRIENDLY_BOSS_DAMAGE_MOD, true); + if (!me->HasAura(SPELL_BATTLE_FURY)) + me->CastSpell(me, SPELL_BATTLE_FURY, true); + _events.CancelEvent(EVENT_CLEAVE); + _events.ScheduleEvent(EVENT_CLEAVE, urand(3000, 6000)); + } - void EnterEvadeMode() - { - if (!me->IsAlive()) - return; - me->DeleteThreatList(); - me->CombatStop(true); - me->GetMotionMaster()->MoveTargetedHome(); - Reset(); - } + void EnterEvadeMode() + { + if (!me->IsAlive()) + return; + me->DeleteThreatList(); + me->CombatStop(true); + me->GetMotionMaster()->MoveTargetedHome(); + Reset(); + } - void DoAction(int32 action) + void DoAction(int32 action) + { + if (action == ACTION_ENEMY_GUNSHIP_TALK) { - if (action == ACTION_ENEMY_GUNSHIP_TALK) + _instance->SetBossState(DATA_ICECROWN_GUNSHIP_BATTLE, IN_PROGRESS); + me->GetMap()->SetZoneMusic(AREA_ICECROWN_CITADEL, MUSIC_ENCOUNTER); + + if (Creature* muradin = me->FindNearestCreature(NPC_IGB_MURADIN_BRONZEBEARD, 200.0f)) + muradin->AI()->DoAction(ACTION_SPAWN_ALL_ADDS); + + Talk(SAY_SAURFANG_INTRO_5); + _events.ScheduleEvent(EVENT_INTRO_H_5, 4000); + _events.ScheduleEvent(EVENT_INTRO_H_6, 11000); + _events.ScheduleEvent(EVENT_KEEP_PLAYER_IN_COMBAT, 1); + + if (Creature* skybreaker = me->FindNearestCreature(NPC_THE_SKYBREAKER, 200.0f)) + _instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, skybreaker, 1); + if (Creature* orgrimsHammer = me->FindNearestCreature(NPC_ORGRIMS_HAMMER, 200.0f)) { - _instance->SetBossState(DATA_ICECROWN_GUNSHIP_BATTLE, IN_PROGRESS); - me->GetMap()->SetZoneMusic(AREA_ICECROWN_CITADEL, MUSIC_ENCOUNTER); + _instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, orgrimsHammer, 2); + orgrimsHammer->CastSpell(orgrimsHammer, SPELL_CHECK_FOR_PLAYERS, true); + } + } + else if (action == ACTION_SPAWN_MAGE) + { + time_t now = time(nullptr); + if (_firstMageCooldown > now) + _events.ScheduleEvent(EVENT_SUMMON_MAGE, (_firstMageCooldown - now) * IN_MILLISECONDS); + else + _events.ScheduleEvent(EVENT_SUMMON_MAGE, 1); + } + else if (action == ACTION_SPAWN_ALL_ADDS) + { + _events.ScheduleEvent(EVENT_ADDS, 12000); + _events.ScheduleEvent(EVENT_CHECK_RIFLEMAN, 13000); + _events.ScheduleEvent(EVENT_CHECK_MORTAR, 13000); + if (Is25ManRaid()) + _controller.SummonCreatures(me, SLOT_MAGE_1, SLOT_MORTAR_4); + else + { + _controller.SummonCreatures(me, SLOT_MAGE_1, SLOT_MAGE_2); + _controller.SummonCreatures(me, SLOT_MORTAR_1, SLOT_MORTAR_2); + _controller.SummonCreatures(me, SLOT_RIFLEMAN_1, SLOT_RIFLEMAN_4); + } + } + else if (action == ACTION_EXIT_SHIP) + { + G3D::Vector3 points[SaurfangExitPathSize]; + for (uint8 i = 0; i < SaurfangExitPathSize; ++i) + { + points[i].x = SaurfangExitPath[i].GetPositionX(); + points[i].y = SaurfangExitPath[i].GetPositionY(); + points[i].z = SaurfangExitPath[i].GetPositionZ(); + } + Movement::PointsArray path(points, points + SaurfangExitPathSize); + me->SetWalk(true); + Movement::MoveSplineInit init(me); + init.DisableTransportPathTransformations(); + init.MovebyPath(path, 0); + init.Launch(); + me->DespawnOrUnsummon(18000); + } + } - if (Creature* muradin = me->FindNearestCreature(NPC_IGB_MURADIN_BRONZEBEARD, 200.0f)) - muradin->AI()->DoAction(ACTION_SPAWN_ALL_ADDS); + void SetData(uint32 type, uint32 data) + { + if (type == ACTION_CLEAR_SLOT) + { + _controller.ClearSlot(PassengerSlots(data)); + if (data == SLOT_FREEZE_MAGE) + _events.ScheduleEvent(EVENT_SUMMON_MAGE, urand(30000, 33500)); + } + } - Talk(SAY_SAURFANG_INTRO_5); - _events.ScheduleEvent(EVENT_INTRO_H_5, 4000); - _events.ScheduleEvent(EVENT_INTRO_H_6, 11000); - _events.ScheduleEvent(EVENT_KEEP_PLAYER_IN_COMBAT, 1); + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) + { + if (me->HealthBelowPctDamaged(65, damage) && !me->HasAura(SPELL_TASTE_OF_BLOOD)) + me->CastSpell(me, SPELL_TASTE_OF_BLOOD, true); - if (Creature* skybreaker = me->FindNearestCreature(NPC_THE_SKYBREAKER, 200.0f)) - _instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, skybreaker, 1); - if (Creature* orgrimsHammer = me->FindNearestCreature(NPC_ORGRIMS_HAMMER, 200.0f)) + if (damage >= me->GetHealth()) + damage = me->GetHealth() - 1; + } + + void UpdateAI(uint32 diff) + { + if (_instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) == IN_PROGRESS) + { + if (me->GetVictim()) + { + if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE) { - _instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, orgrimsHammer, 2); - orgrimsHammer->CastSpell(orgrimsHammer, SPELL_CHECK_FOR_PLAYERS, true); - } - } - else if (action == ACTION_SPAWN_MAGE) - { - time_t now = time(nullptr); - if (_firstMageCooldown > now) - _events.ScheduleEvent(EVENT_SUMMON_MAGE, (_firstMageCooldown - now) * IN_MILLISECONDS); - else - _events.ScheduleEvent(EVENT_SUMMON_MAGE, 1); - } - else if (action == ACTION_SPAWN_ALL_ADDS) - { - _events.ScheduleEvent(EVENT_ADDS, 12000); - _events.ScheduleEvent(EVENT_CHECK_RIFLEMAN, 13000); - _events.ScheduleEvent(EVENT_CHECK_MORTAR, 13000); - if (Is25ManRaid()) - _controller.SummonCreatures(me, SLOT_MAGE_1, SLOT_MORTAR_4); - else - { - _controller.SummonCreatures(me, SLOT_MAGE_1, SLOT_MAGE_2); - _controller.SummonCreatures(me, SLOT_MORTAR_1, SLOT_MORTAR_2); - _controller.SummonCreatures(me, SLOT_RIFLEMAN_1, SLOT_RIFLEMAN_4); - } - } - else if (action == ACTION_EXIT_SHIP) - { - G3D::Vector3 points[SaurfangExitPathSize]; - for (uint8 i=0; iSetWalk(true); - Movement::MoveSplineInit init(me); - init.DisableTransportPathTransformations(); - init.MovebyPath(path, 0); - init.Launch(); - me->DespawnOrUnsummon(18000); - } - } - - void SetData(uint32 type, uint32 data) - { - if (type == ACTION_CLEAR_SLOT) - { - _controller.ClearSlot(PassengerSlots(data)); - if (data == SLOT_FREEZE_MAGE) - _events.ScheduleEvent(EVENT_SUMMON_MAGE, urand(30000, 33500)); - } - } - - void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) - { - if (me->HealthBelowPctDamaged(65, damage) && !me->HasAura(SPELL_TASTE_OF_BLOOD)) - me->CastSpell(me, SPELL_TASTE_OF_BLOOD, true); - - if (damage >= me->GetHealth()) - damage = me->GetHealth()-1; - } - - void UpdateAI(uint32 diff) - { - if (_instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) == IN_PROGRESS) - { - if (me->GetVictim()) - { - if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE) + if (me->GetVictim()->GetPositionZ() >= 478.0f) { - if (me->GetVictim()->GetPositionZ() >= 478.0f) + float x, y, z, o; + me->GetHomePosition(x, y, z, o); + me->GetMotionMaster()->MovePoint(0, x, y, z, false); + } + } + else + { + if (me->GetVictim()->GetPositionZ() < 478.0f) + me->GetMotionMaster()->MoveChase(me->GetVictim()); + } + } + + if (checkTimer <= diff) + { + checkTimer = 1000; + Map::PlayerList const& pl = me->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) + if (Player* p = itr->GetSource()) + if (CanAIAttack(p) && me->IsValidAttackTarget(p)) { - float x,y,z,o; - me->GetHomePosition(x, y, z, o); - me->GetMotionMaster()->MovePoint(0, x, y, z, false); + me->SetInCombatWith(p); + p->SetInCombatWith(me); + me->AddThreat(p, 0.0f); } - } - else - { - if (me->GetVictim()->GetPositionZ() < 478.0f) - me->GetMotionMaster()->MoveChase(me->GetVictim()); - } - } + } + else + checkTimer -= diff; + } - if (checkTimer <= diff) + UpdateVictim(); + _events.Update(diff); + + switch (_events.ExecuteEvent()) + { + case 0: + break; + case EVENT_INTRO_H_1: + Talk(SAY_SAURFANG_INTRO_1); + break; + case EVENT_INTRO_H_2: + Talk(SAY_SAURFANG_INTRO_2); + break; + case EVENT_INTRO_SUMMON_SKYBREAKER: + sTransportMgr->CreateTransport(GO_THE_SKYBREAKER_H, 0, me->GetMap()); + break; + case EVENT_INTRO_H_3: + Talk(SAY_SAURFANG_INTRO_3); + break; + case EVENT_INTRO_H_4: + Talk(SAY_SAURFANG_INTRO_4); + break; + case EVENT_INTRO_H_5: + if (Creature* muradin = me->FindNearestCreature(NPC_IGB_MURADIN_BRONZEBEARD, 200.0f)) + muradin->AI()->Talk(SAY_MURADIN_INTRO_H); + break; + case EVENT_INTRO_H_6: + Talk(SAY_SAURFANG_INTRO_6); + break; + case EVENT_KEEP_PLAYER_IN_COMBAT: + if (_instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) == IN_PROGRESS) { - checkTimer = 1000; + //_instance->DoCastSpellOnPlayers(SPELL_LOCK_PLAYERS_AND_TAP_CHEST); Map::PlayerList const& pl = me->GetMap()->GetPlayers(); for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) if (Player* p = itr->GetSource()) - if (CanAIAttack(p) && me->IsValidAttackTarget(p)) - { - me->SetInCombatWith(p); - p->SetInCombatWith(me); - me->AddThreat(p, 0.0f); - } + if (!p->IsGameMaster()) + p->SetInCombatState(true); + _events.ScheduleEvent(EVENT_KEEP_PLAYER_IN_COMBAT, 4000); } - else - checkTimer -= diff; - } + break; - UpdateVictim(); - _events.Update(diff); - - switch (_events.ExecuteEvent()) - { - case 0: - break; - case EVENT_INTRO_H_1: - Talk(SAY_SAURFANG_INTRO_1); - break; - case EVENT_INTRO_H_2: - Talk(SAY_SAURFANG_INTRO_2); - break; - case EVENT_INTRO_SUMMON_SKYBREAKER: - sTransportMgr->CreateTransport(GO_THE_SKYBREAKER_H, 0, me->GetMap()); - break; - case EVENT_INTRO_H_3: - Talk(SAY_SAURFANG_INTRO_3); - break; - case EVENT_INTRO_H_4: - Talk(SAY_SAURFANG_INTRO_4); - break; - case EVENT_INTRO_H_5: - if (Creature* muradin = me->FindNearestCreature(NPC_IGB_MURADIN_BRONZEBEARD, 200.0f)) - muradin->AI()->Talk(SAY_MURADIN_INTRO_H); - break; - case EVENT_INTRO_H_6: - Talk(SAY_SAURFANG_INTRO_6); - break; - case EVENT_KEEP_PLAYER_IN_COMBAT: - if (_instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) == IN_PROGRESS) - { - //_instance->DoCastSpellOnPlayers(SPELL_LOCK_PLAYERS_AND_TAP_CHEST); - Map::PlayerList const& pl = me->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) - if (Player* p = itr->GetSource()) - if (!p->IsGameMaster()) - p->SetInCombatState(true); - _events.ScheduleEvent(EVENT_KEEP_PLAYER_IN_COMBAT, 4000); - } - break; - - case EVENT_SUMMON_MAGE: - Talk(SAY_SAURFANG_MAGES); - _controller.SummonCreatures(me, SLOT_FREEZE_MAGE, SLOT_FREEZE_MAGE); - break; - case EVENT_ADDS: - Talk(SAY_SAURFANG_ENTER_SKYBREAKER); - _controller.SummonCreatures(me, SLOT_MAGE_1, SLOT_MAGE_2); - _controller.SummonCreatures(me, SLOT_MARINE_1, Is25ManRaid() ? SLOT_MARINE_4 : SLOT_MARINE_2); - _controller.SummonCreatures(me, SLOT_SERGEANT_1, Is25ManRaid() ? SLOT_SERGEANT_2 : SLOT_SERGEANT_1); - if (MotionTransport* orgrimsHammer = (me->GetTransport() ? me->GetTransport()->ToMotionTransport() : nullptr)) - { - float x,y,z,o; - OrgrimsHammerTeleportPortal.GetPosition(x,y,z,o); - orgrimsHammer->CalculatePassengerPosition(x,y,z,&o); - me->SummonCreature(NPC_TELEPORT_PORTAL, x, y, z, o, TEMPSUMMON_TIMED_DESPAWN, 21000); - } - - if (GameObject* go = HashMapHolder::Find(_instance->GetData64(DATA_ICECROWN_GUNSHIP_BATTLE))) - if (MotionTransport* skybreaker = go->ToMotionTransport()) - { - float x,y,z,o; - SkybreakerTeleportExit.GetPosition(x,y,z,o); - skybreaker->CalculatePassengerPosition(x,y,z,&o); - me->SummonCreature(NPC_TELEPORT_EXIT, x, y, z, o, TEMPSUMMON_TIMED_DESPAWN, 23000); - } - - _events.ScheduleEvent(EVENT_ADDS_BOARD_YELL, 6000); - _events.ScheduleEvent(EVENT_ADDS, 60000); - break; - case EVENT_ADDS_BOARD_YELL: - if (Creature* muradin = me->FindNearestCreature(NPC_IGB_MURADIN_BRONZEBEARD, 200.0f)) - muradin->AI()->Talk(SAY_MURADIN_BOARD); - break; - case EVENT_CHECK_RIFLEMAN: - if (_controller.SummonCreatures(me, SLOT_RIFLEMAN_1, Is25ManRaid() ? SLOT_RIFLEMAN_8 : SLOT_RIFLEMAN_4)) - { - if (_axethrowersYellCooldown < time(nullptr)) - { - Talk(SAY_SAURFANG_AXETHROWERS); - _axethrowersYellCooldown = time(nullptr) + 5; - } - } - _events.ScheduleEvent(EVENT_CHECK_RIFLEMAN, 1500); - break; - case EVENT_CHECK_MORTAR: - if (_controller.SummonCreatures(me, SLOT_MORTAR_1, Is25ManRaid() ? SLOT_MORTAR_4 : SLOT_MORTAR_2)) - { - if (_rocketeersYellCooldown < time(nullptr)) - { - Talk(SAY_SAURFANG_ROCKETEERS); - _rocketeersYellCooldown = time(nullptr) + 5; - } - } - _events.ScheduleEvent(EVENT_CHECK_MORTAR, 1500); - break; - case EVENT_CLEAVE: - if (me->GetVictim()) - me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false); - _events.ScheduleEvent(EVENT_CLEAVE, urand(4000, 8000)); - break; - - default: - break; - } - - if (!me->GetVictim() || me->HasUnitState(UNIT_STATE_CASTING)) - return; - - if (me->IsWithinMeleeRange(me->GetVictim())) - DoMeleeAttackIfReady(); - else if (me->isAttackReady()) - { - me->SetOrientation(me->GetAngle(me->GetVictim())); - me->CastSpell(me->GetVictim(), SPELL_RENDING_THROW, false); - me->resetAttackTimer(); - } - } - - void AttackStart(Unit* victim) - { - if (victim && me->Attack(victim, true)) - { - if (victim->GetPositionZ() < 478.0f) - me->GetMotionMaster()->MoveChase(victim); - else + case EVENT_SUMMON_MAGE: + Talk(SAY_SAURFANG_MAGES); + _controller.SummonCreatures(me, SLOT_FREEZE_MAGE, SLOT_FREEZE_MAGE); + break; + case EVENT_ADDS: + Talk(SAY_SAURFANG_ENTER_SKYBREAKER); + _controller.SummonCreatures(me, SLOT_MAGE_1, SLOT_MAGE_2); + _controller.SummonCreatures(me, SLOT_MARINE_1, Is25ManRaid() ? SLOT_MARINE_4 : SLOT_MARINE_2); + _controller.SummonCreatures(me, SLOT_SERGEANT_1, Is25ManRaid() ? SLOT_SERGEANT_2 : SLOT_SERGEANT_1); + if (MotionTransport* orgrimsHammer = (me->GetTransport() ? me->GetTransport()->ToMotionTransport() : nullptr)) { - float x,y,z,o; - me->GetHomePosition(x, y, z, o); - me->GetMotionMaster()->MovePoint(0, x, y, z, false); + float x, y, z, o; + OrgrimsHammerTeleportPortal.GetPosition(x, y, z, o); + orgrimsHammer->CalculatePassengerPosition(x, y, z, &o); + me->SummonCreature(NPC_TELEPORT_PORTAL, x, y, z, o, TEMPSUMMON_TIMED_DESPAWN, 21000); } + + if (GameObject* go = HashMapHolder::Find(_instance->GetData64(DATA_ICECROWN_GUNSHIP_BATTLE))) + if (MotionTransport* skybreaker = go->ToMotionTransport()) + { + float x, y, z, o; + SkybreakerTeleportExit.GetPosition(x, y, z, o); + skybreaker->CalculatePassengerPosition(x, y, z, &o); + me->SummonCreature(NPC_TELEPORT_EXIT, x, y, z, o, TEMPSUMMON_TIMED_DESPAWN, 23000); + } + + _events.ScheduleEvent(EVENT_ADDS_BOARD_YELL, 6000); + _events.ScheduleEvent(EVENT_ADDS, 60000); + break; + case EVENT_ADDS_BOARD_YELL: + if (Creature* muradin = me->FindNearestCreature(NPC_IGB_MURADIN_BRONZEBEARD, 200.0f)) + muradin->AI()->Talk(SAY_MURADIN_BOARD); + break; + case EVENT_CHECK_RIFLEMAN: + if (_controller.SummonCreatures(me, SLOT_RIFLEMAN_1, Is25ManRaid() ? SLOT_RIFLEMAN_8 : SLOT_RIFLEMAN_4)) + { + if (_axethrowersYellCooldown < time(nullptr)) + { + Talk(SAY_SAURFANG_AXETHROWERS); + _axethrowersYellCooldown = time(nullptr) + 5; + } + } + _events.ScheduleEvent(EVENT_CHECK_RIFLEMAN, 1500); + break; + case EVENT_CHECK_MORTAR: + if (_controller.SummonCreatures(me, SLOT_MORTAR_1, Is25ManRaid() ? SLOT_MORTAR_4 : SLOT_MORTAR_2)) + { + if (_rocketeersYellCooldown < time(nullptr)) + { + Talk(SAY_SAURFANG_ROCKETEERS); + _rocketeersYellCooldown = time(nullptr) + 5; + } + } + _events.ScheduleEvent(EVENT_CHECK_MORTAR, 1500); + break; + case EVENT_CLEAVE: + if (me->GetVictim()) + me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false); + _events.ScheduleEvent(EVENT_CLEAVE, urand(4000, 8000)); + break; + + default: + break; + } + + if (!me->GetVictim() || me->HasUnitState(UNIT_STATE_CASTING)) + return; + + if (me->IsWithinMeleeRange(me->GetVictim())) + DoMeleeAttackIfReady(); + else if (me->isAttackReady()) + { + me->SetOrientation(me->GetAngle(me->GetVictim())); + me->CastSpell(me->GetVictim(), SPELL_RENDING_THROW, false); + me->resetAttackTimer(); + } + } + + void AttackStart(Unit* victim) + { + if (victim && me->Attack(victim, true)) + { + if (victim->GetPositionZ() < 478.0f) + me->GetMotionMaster()->MoveChase(victim); + else + { + float x, y, z, o; + me->GetHomePosition(x, y, z, o); + me->GetMotionMaster()->MovePoint(0, x, y, z, false); } } - - bool CanAIAttack(const Unit* target) const - { - if (_instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != IN_PROGRESS) - return false; - if (target->GetEntry() == NPC_SKYBREAKER_MARINE || target->GetEntry() == NPC_SKYBREAKER_SERGEANT) - return target->ToCreature()->GetReactState() != REACT_PASSIVE; - return target->GetTransport() == me->GetTransport() && target->GetPositionY() < (_instance->GetData(DATA_TEAMID_IN_INSTANCE) == TEAM_HORDE ? 2431.0f : 2025.0f); - } - - private: - EventMap _events; - PassengerController _controller; - InstanceScript* _instance; - time_t _firstMageCooldown; - time_t _axethrowersYellCooldown; - time_t _rocketeersYellCooldown; - uint16 checkTimer; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); } + + bool CanAIAttack(const Unit* target) const + { + if (_instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != IN_PROGRESS) + return false; + if (target->GetEntry() == NPC_SKYBREAKER_MARINE || target->GetEntry() == NPC_SKYBREAKER_SERGEANT) + return target->ToCreature()->GetReactState() != REACT_PASSIVE; + return target->GetTransport() == me->GetTransport() && target->GetPositionY() < (_instance->GetData(DATA_TEAMID_IN_INSTANCE) == TEAM_HORDE ? 2431.0f : 2025.0f); + } + + private: + EventMap _events; + PassengerController _controller; + InstanceScript* _instance; + time_t _firstMageCooldown; + time_t _axethrowersYellCooldown; + time_t _rocketeersYellCooldown; + uint16 checkTimer; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class npc_muradin_bronzebeard_igb : public CreatureScript { - public: - npc_muradin_bronzebeard_igb() : CreatureScript("npc_muradin_bronzebeard_igb") { } +public: + npc_muradin_bronzebeard_igb() : CreatureScript("npc_muradin_bronzebeard_igb") { } - struct npc_muradin_bronzebeard_igbAI : public ScriptedAI + struct npc_muradin_bronzebeard_igbAI : public ScriptedAI + { + npc_muradin_bronzebeard_igbAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { - npc_muradin_bronzebeard_igbAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) - { - _events.Reset(); - _controller.ResetSlots(TEAM_ALLIANCE, creature->GetTransport()->ToMotionTransport()); - me->SetRegeneratingHealth(false); - me->m_CombatDistance = 70.0f; - _firstMageCooldown = time(nullptr) + 45; - _riflemanYellCooldown = time_t(0); - _mortarYellCooldown = time_t(0); - checkTimer = 1000; - } + _events.Reset(); + _controller.ResetSlots(TEAM_ALLIANCE, creature->GetTransport()->ToMotionTransport()); + me->SetRegeneratingHealth(false); + me->m_CombatDistance = 70.0f; + _firstMageCooldown = time(nullptr) + 45; + _riflemanYellCooldown = time_t(0); + _mortarYellCooldown = time_t(0); + checkTimer = 1000; + } - void sGossipSelect(Player* /*player*/, uint32 /*sender*/, uint32 /*action*/) - { - if (!me->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP)) - return; - me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - me->GetTransport()->setActive(true); - me->GetTransport()->ToMotionTransport()->EnableMovement(true); - _events.ScheduleEvent(EVENT_INTRO_A_1, 5000); - _events.ScheduleEvent(EVENT_INTRO_A_2, 10000); - _events.ScheduleEvent(EVENT_INTRO_SUMMON_ORGRIMS_HAMMER, 28000); - _events.ScheduleEvent(EVENT_INTRO_A_3, 33000); - _events.ScheduleEvent(EVENT_INTRO_A_4, 39000); - _events.ScheduleEvent(EVENT_INTRO_A_5, 45000); - } + void sGossipSelect(Player* /*player*/, uint32 /*sender*/, uint32 /*action*/) + { + if (!me->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP)) + return; + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + me->GetTransport()->setActive(true); + me->GetTransport()->ToMotionTransport()->EnableMovement(true); + _events.ScheduleEvent(EVENT_INTRO_A_1, 5000); + _events.ScheduleEvent(EVENT_INTRO_A_2, 10000); + _events.ScheduleEvent(EVENT_INTRO_SUMMON_ORGRIMS_HAMMER, 28000); + _events.ScheduleEvent(EVENT_INTRO_A_3, 33000); + _events.ScheduleEvent(EVENT_INTRO_A_4, 39000); + _events.ScheduleEvent(EVENT_INTRO_A_5, 45000); + } - void EnterCombat(Unit* /*target*/) - { - if (_instance->GetData(DATA_TEAMID_IN_INSTANCE) == TEAM_ALLIANCE && !me->HasAura(SPELL_FRIENDLY_BOSS_DAMAGE_MOD)) - me->CastSpell(me, SPELL_FRIENDLY_BOSS_DAMAGE_MOD, true); - if (!me->HasAura(SPELL_BATTLE_FURY)) - me->CastSpell(me, SPELL_BATTLE_FURY, true); - _events.CancelEvent(EVENT_CLEAVE); - _events.ScheduleEvent(EVENT_CLEAVE, urand(3000, 6000)); - } + void EnterCombat(Unit* /*target*/) + { + if (_instance->GetData(DATA_TEAMID_IN_INSTANCE) == TEAM_ALLIANCE && !me->HasAura(SPELL_FRIENDLY_BOSS_DAMAGE_MOD)) + me->CastSpell(me, SPELL_FRIENDLY_BOSS_DAMAGE_MOD, true); + if (!me->HasAura(SPELL_BATTLE_FURY)) + me->CastSpell(me, SPELL_BATTLE_FURY, true); + _events.CancelEvent(EVENT_CLEAVE); + _events.ScheduleEvent(EVENT_CLEAVE, urand(3000, 6000)); + } - void EnterEvadeMode() - { - if (!me->IsAlive()) - return; - me->DeleteThreatList(); - me->CombatStop(true); - me->GetMotionMaster()->MoveTargetedHome(); - Reset(); - } + void EnterEvadeMode() + { + if (!me->IsAlive()) + return; + me->DeleteThreatList(); + me->CombatStop(true); + me->GetMotionMaster()->MoveTargetedHome(); + Reset(); + } - void DoAction(int32 action) + void DoAction(int32 action) + { + if (action == ACTION_ENEMY_GUNSHIP_TALK) { - if (action == ACTION_ENEMY_GUNSHIP_TALK) + _instance->SetBossState(DATA_ICECROWN_GUNSHIP_BATTLE, IN_PROGRESS); + me->GetMap()->SetZoneMusic(AREA_ICECROWN_CITADEL, MUSIC_ENCOUNTER); + + if (Creature* saurfang = me->FindNearestCreature(NPC_IGB_HIGH_OVERLORD_SAURFANG, 200.0f)) + saurfang->AI()->DoAction(ACTION_SPAWN_ALL_ADDS); + + Talk(SAY_MURADIN_INTRO_6); + _events.ScheduleEvent(EVENT_INTRO_A_6, 5000); + _events.ScheduleEvent(EVENT_INTRO_A_7, 11000); + _events.ScheduleEvent(EVENT_KEEP_PLAYER_IN_COMBAT, 1); + + if (Creature* orgrimsHammer = me->FindNearestCreature(NPC_ORGRIMS_HAMMER, 200.0f)) + _instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, orgrimsHammer, 1); + if (Creature* skybreaker = me->FindNearestCreature(NPC_THE_SKYBREAKER, 200.0f)) { - _instance->SetBossState(DATA_ICECROWN_GUNSHIP_BATTLE, IN_PROGRESS); - me->GetMap()->SetZoneMusic(AREA_ICECROWN_CITADEL, MUSIC_ENCOUNTER); + _instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, skybreaker, 2); + skybreaker->CastSpell(skybreaker, SPELL_CHECK_FOR_PLAYERS, true); + } + } + else if (action == ACTION_SPAWN_MAGE) + { + time_t now = time(nullptr); + if (_firstMageCooldown > now) + _events.ScheduleEvent(EVENT_SUMMON_MAGE, (_firstMageCooldown - now) * IN_MILLISECONDS); + else + _events.ScheduleEvent(EVENT_SUMMON_MAGE, 1); + } + else if (action == ACTION_SPAWN_ALL_ADDS) + { + _events.ScheduleEvent(EVENT_ADDS, 12000); + _events.ScheduleEvent(EVENT_CHECK_RIFLEMAN, 13000); + _events.ScheduleEvent(EVENT_CHECK_MORTAR, 13000); + if (Is25ManRaid()) + _controller.SummonCreatures(me, SLOT_MAGE_1, SLOT_MORTAR_4); + else + { + _controller.SummonCreatures(me, SLOT_MAGE_1, SLOT_MAGE_2); + _controller.SummonCreatures(me, SLOT_MORTAR_1, SLOT_MORTAR_2); + _controller.SummonCreatures(me, SLOT_RIFLEMAN_1, SLOT_RIFLEMAN_4); + } + } + else if (action == ACTION_EXIT_SHIP) + { + G3D::Vector3 points[MuradinExitPathSize]; + for (uint8 i = 0; i < MuradinExitPathSize; ++i) + { + points[i].x = MuradinExitPath[i].GetPositionX(); + points[i].y = MuradinExitPath[i].GetPositionY(); + points[i].z = MuradinExitPath[i].GetPositionZ(); + } + Movement::PointsArray path(points, points + MuradinExitPathSize); + me->SetWalk(true); + Movement::MoveSplineInit init(me); + init.DisableTransportPathTransformations(); + init.MovebyPath(path, 0); + init.Launch(); + me->DespawnOrUnsummon(18000); + } + } - if (Creature* saurfang = me->FindNearestCreature(NPC_IGB_HIGH_OVERLORD_SAURFANG, 200.0f)) - saurfang->AI()->DoAction(ACTION_SPAWN_ALL_ADDS); + void SetData(uint32 type, uint32 data) + { + if (type == ACTION_CLEAR_SLOT) + { + _controller.ClearSlot(PassengerSlots(data)); + if (data == SLOT_FREEZE_MAGE) + _events.ScheduleEvent(EVENT_SUMMON_MAGE, urand(30000, 33500)); + } + } - Talk(SAY_MURADIN_INTRO_6); - _events.ScheduleEvent(EVENT_INTRO_A_6, 5000); - _events.ScheduleEvent(EVENT_INTRO_A_7, 11000); - _events.ScheduleEvent(EVENT_KEEP_PLAYER_IN_COMBAT, 1); + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) + { + if (me->HealthBelowPctDamaged(65, damage) && !me->HasAura(SPELL_TASTE_OF_BLOOD)) + me->CastSpell(me, SPELL_TASTE_OF_BLOOD, true); - if (Creature* orgrimsHammer = me->FindNearestCreature(NPC_ORGRIMS_HAMMER, 200.0f)) - _instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, orgrimsHammer, 1); - if (Creature* skybreaker = me->FindNearestCreature(NPC_THE_SKYBREAKER, 200.0f)) + if (damage >= me->GetHealth()) + damage = me->GetHealth() - 1; + } + + void UpdateAI(uint32 diff) + { + if (_instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) == IN_PROGRESS) + { + if (me->GetVictim()) + { + if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE) { - _instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, skybreaker, 2); - skybreaker->CastSpell(skybreaker, SPELL_CHECK_FOR_PLAYERS, true); - } - } - else if (action == ACTION_SPAWN_MAGE) - { - time_t now = time(nullptr); - if (_firstMageCooldown > now) - _events.ScheduleEvent(EVENT_SUMMON_MAGE, (_firstMageCooldown - now) * IN_MILLISECONDS); - else - _events.ScheduleEvent(EVENT_SUMMON_MAGE, 1); - } - else if (action == ACTION_SPAWN_ALL_ADDS) - { - _events.ScheduleEvent(EVENT_ADDS, 12000); - _events.ScheduleEvent(EVENT_CHECK_RIFLEMAN, 13000); - _events.ScheduleEvent(EVENT_CHECK_MORTAR, 13000); - if (Is25ManRaid()) - _controller.SummonCreatures(me, SLOT_MAGE_1, SLOT_MORTAR_4); - else - { - _controller.SummonCreatures(me, SLOT_MAGE_1, SLOT_MAGE_2); - _controller.SummonCreatures(me, SLOT_MORTAR_1, SLOT_MORTAR_2); - _controller.SummonCreatures(me, SLOT_RIFLEMAN_1, SLOT_RIFLEMAN_4); - } - } - else if (action == ACTION_EXIT_SHIP) - { - G3D::Vector3 points[MuradinExitPathSize]; - for (uint8 i=0; iSetWalk(true); - Movement::MoveSplineInit init(me); - init.DisableTransportPathTransformations(); - init.MovebyPath(path, 0); - init.Launch(); - me->DespawnOrUnsummon(18000); - } - } - - void SetData(uint32 type, uint32 data) - { - if (type == ACTION_CLEAR_SLOT) - { - _controller.ClearSlot(PassengerSlots(data)); - if (data == SLOT_FREEZE_MAGE) - _events.ScheduleEvent(EVENT_SUMMON_MAGE, urand(30000, 33500)); - } - } - - void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) - { - if (me->HealthBelowPctDamaged(65, damage) && !me->HasAura(SPELL_TASTE_OF_BLOOD)) - me->CastSpell(me, SPELL_TASTE_OF_BLOOD, true); - - if (damage >= me->GetHealth()) - damage = me->GetHealth()-1; - } - - void UpdateAI(uint32 diff) - { - if (_instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) == IN_PROGRESS) - { - if (me->GetVictim()) - { - if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE) + if (me->GetVictim()->GetPositionZ() >= 478.0f) { - if (me->GetVictim()->GetPositionZ() >= 478.0f) + float x, y, z, o; + me->GetHomePosition(x, y, z, o); + me->GetMotionMaster()->MovePoint(0, x, y, z, false); + } + } + else + { + if (me->GetVictim()->GetPositionZ() < 478.0f) + me->GetMotionMaster()->MoveChase(me->GetVictim()); + } + } + + if (checkTimer <= diff) + { + checkTimer = 1000; + Map::PlayerList const& pl = me->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) + if (Player* p = itr->GetSource()) + if (CanAIAttack(p) && me->IsValidAttackTarget(p)) { - float x,y,z,o; - me->GetHomePosition(x, y, z, o); - me->GetMotionMaster()->MovePoint(0, x, y, z, false); + me->SetInCombatWith(p); + p->SetInCombatWith(me); + me->AddThreat(p, 0.0f); } - } - else - { - if (me->GetVictim()->GetPositionZ() < 478.0f) - me->GetMotionMaster()->MoveChase(me->GetVictim()); - } - } + } + else + checkTimer -= diff; + } - if (checkTimer <= diff) + UpdateVictim(); + _events.Update(diff); + + switch (_events.ExecuteEvent()) + { + case 0: + break; + case EVENT_INTRO_A_1: + Talk(SAY_MURADIN_INTRO_1); + break; + case EVENT_INTRO_A_2: + Talk(SAY_MURADIN_INTRO_2); + break; + case EVENT_INTRO_SUMMON_ORGRIMS_HAMMER: + sTransportMgr->CreateTransport(GO_ORGRIMS_HAMMER_A, 0, me->GetMap()); + break; + case EVENT_INTRO_A_3: + Talk(SAY_MURADIN_INTRO_3); + break; + case EVENT_INTRO_A_4: + Talk(SAY_MURADIN_INTRO_4); + break; + case EVENT_INTRO_A_5: + Talk(SAY_MURADIN_INTRO_5); + break; + case EVENT_INTRO_A_6: + if (Creature* saurfang = me->FindNearestCreature(NPC_IGB_HIGH_OVERLORD_SAURFANG, 200.0f)) + saurfang->AI()->Talk(SAY_SAURFANG_INTRO_A); + break; + case EVENT_INTRO_A_7: + Talk(SAY_MURADIN_INTRO_7); + break; + case EVENT_KEEP_PLAYER_IN_COMBAT: + if (_instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) == IN_PROGRESS) { - checkTimer = 1000; + //_instance->DoCastSpellOnPlayers(SPELL_LOCK_PLAYERS_AND_TAP_CHEST); Map::PlayerList const& pl = me->GetMap()->GetPlayers(); for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) if (Player* p = itr->GetSource()) - if (CanAIAttack(p) && me->IsValidAttackTarget(p)) - { - me->SetInCombatWith(p); - p->SetInCombatWith(me); - me->AddThreat(p, 0.0f); - } + if (!p->IsGameMaster()) + p->SetInCombatState(true); + _events.ScheduleEvent(EVENT_KEEP_PLAYER_IN_COMBAT, 4000); } - else - checkTimer -= diff; - } + break; - UpdateVictim(); - _events.Update(diff); - - switch (_events.ExecuteEvent()) - { - case 0: - break; - case EVENT_INTRO_A_1: - Talk(SAY_MURADIN_INTRO_1); - break; - case EVENT_INTRO_A_2: - Talk(SAY_MURADIN_INTRO_2); - break; - case EVENT_INTRO_SUMMON_ORGRIMS_HAMMER: - sTransportMgr->CreateTransport(GO_ORGRIMS_HAMMER_A, 0, me->GetMap()); - break; - case EVENT_INTRO_A_3: - Talk(SAY_MURADIN_INTRO_3); - break; - case EVENT_INTRO_A_4: - Talk(SAY_MURADIN_INTRO_4); - break; - case EVENT_INTRO_A_5: - Talk(SAY_MURADIN_INTRO_5); - break; - case EVENT_INTRO_A_6: - if (Creature* saurfang = me->FindNearestCreature(NPC_IGB_HIGH_OVERLORD_SAURFANG, 200.0f)) - saurfang->AI()->Talk(SAY_SAURFANG_INTRO_A); - break; - case EVENT_INTRO_A_7: - Talk(SAY_MURADIN_INTRO_7); - break; - case EVENT_KEEP_PLAYER_IN_COMBAT: - if (_instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) == IN_PROGRESS) - { - //_instance->DoCastSpellOnPlayers(SPELL_LOCK_PLAYERS_AND_TAP_CHEST); - Map::PlayerList const& pl = me->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) - if (Player* p = itr->GetSource()) - if (!p->IsGameMaster()) - p->SetInCombatState(true); - _events.ScheduleEvent(EVENT_KEEP_PLAYER_IN_COMBAT, 4000); - } - break; - - case EVENT_SUMMON_MAGE: - Talk(SAY_MURADIN_SORCERERS); - _controller.SummonCreatures(me, SLOT_FREEZE_MAGE, SLOT_FREEZE_MAGE); - break; - case EVENT_ADDS: - Talk(SAY_MURADIN_ENTER_ORGRIMMS_HAMMER); - _controller.SummonCreatures(me, SLOT_MAGE_1, SLOT_MAGE_2); - _controller.SummonCreatures(me, SLOT_MARINE_1, Is25ManRaid() ? SLOT_MARINE_4 : SLOT_MARINE_2); - _controller.SummonCreatures(me, SLOT_SERGEANT_1, Is25ManRaid() ? SLOT_SERGEANT_2 : SLOT_SERGEANT_1); - if (MotionTransport* skybreaker = (me->GetTransport() ? me->GetTransport()->ToMotionTransport() : nullptr)) - { - float x,y,z,o; - SkybreakerTeleportPortal.GetPosition(x,y,z,o); - skybreaker->CalculatePassengerPosition(x,y,z,&o); - me->SummonCreature(NPC_TELEPORT_PORTAL, x, y, z, o, TEMPSUMMON_TIMED_DESPAWN, 21000); - } - - if (GameObject* go = HashMapHolder::Find(_instance->GetData64(DATA_ICECROWN_GUNSHIP_BATTLE))) - if (MotionTransport* orgrimsHammer = go->ToMotionTransport()) - { - float x,y,z,o; - OrgrimsHammerTeleportExit.GetPosition(x,y,z,o); - orgrimsHammer->CalculatePassengerPosition(x,y,z,&o); - me->SummonCreature(NPC_TELEPORT_EXIT, x, y, z, o, TEMPSUMMON_TIMED_DESPAWN, 23000); - } - - _events.ScheduleEvent(EVENT_ADDS_BOARD_YELL, 6000); - _events.ScheduleEvent(EVENT_ADDS, 60000); - break; - case EVENT_ADDS_BOARD_YELL: - if (Creature* saurfang = me->FindNearestCreature(NPC_IGB_HIGH_OVERLORD_SAURFANG, 200.0f)) - saurfang->AI()->Talk(SAY_SAURFANG_BOARD); - break; - case EVENT_CHECK_RIFLEMAN: - if (_controller.SummonCreatures(me, SLOT_RIFLEMAN_1, Is25ManRaid() ? SLOT_RIFLEMAN_8 : SLOT_RIFLEMAN_4)) - { - if (_riflemanYellCooldown < time(nullptr)) - { - Talk(SAY_MURADIN_RIFLEMAN); - _riflemanYellCooldown = time(nullptr) + 5; - } - } - _events.ScheduleEvent(EVENT_CHECK_RIFLEMAN, 1500); - break; - case EVENT_CHECK_MORTAR: - if (_controller.SummonCreatures(me, SLOT_MORTAR_1, Is25ManRaid() ? SLOT_MORTAR_4 : SLOT_MORTAR_2)) - { - if (_mortarYellCooldown < time(nullptr)) - { - Talk(SAY_MURADIN_MORTAR); - _mortarYellCooldown = time(nullptr) + 5; - } - } - _events.ScheduleEvent(EVENT_CHECK_MORTAR, 1500); - break; - case EVENT_CLEAVE: - if (me->GetVictim()) - me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false); - _events.ScheduleEvent(EVENT_CLEAVE, urand(4000, 8000)); - break; - - default: - break; - } - - if (!me->GetVictim() || me->HasUnitState(UNIT_STATE_CASTING)) - return; - - if (me->IsWithinMeleeRange(me->GetVictim())) - DoMeleeAttackIfReady(); - else if (me->isAttackReady()) - { - me->SetOrientation(me->GetAngle(me->GetVictim())); - me->CastSpell(me->GetVictim(), SPELL_RENDING_THROW, false); - me->resetAttackTimer(); - } - } - - void AttackStart(Unit* victim) - { - if (victim && me->Attack(victim, true)) - { - if (victim->GetPositionZ() < 478.0f) - me->GetMotionMaster()->MoveChase(victim); - else + case EVENT_SUMMON_MAGE: + Talk(SAY_MURADIN_SORCERERS); + _controller.SummonCreatures(me, SLOT_FREEZE_MAGE, SLOT_FREEZE_MAGE); + break; + case EVENT_ADDS: + Talk(SAY_MURADIN_ENTER_ORGRIMMS_HAMMER); + _controller.SummonCreatures(me, SLOT_MAGE_1, SLOT_MAGE_2); + _controller.SummonCreatures(me, SLOT_MARINE_1, Is25ManRaid() ? SLOT_MARINE_4 : SLOT_MARINE_2); + _controller.SummonCreatures(me, SLOT_SERGEANT_1, Is25ManRaid() ? SLOT_SERGEANT_2 : SLOT_SERGEANT_1); + if (MotionTransport* skybreaker = (me->GetTransport() ? me->GetTransport()->ToMotionTransport() : nullptr)) { - float x,y,z,o; - me->GetHomePosition(x, y, z, o); - me->GetMotionMaster()->MovePoint(0, x, y, z, false); + float x, y, z, o; + SkybreakerTeleportPortal.GetPosition(x, y, z, o); + skybreaker->CalculatePassengerPosition(x, y, z, &o); + me->SummonCreature(NPC_TELEPORT_PORTAL, x, y, z, o, TEMPSUMMON_TIMED_DESPAWN, 21000); } + + if (GameObject* go = HashMapHolder::Find(_instance->GetData64(DATA_ICECROWN_GUNSHIP_BATTLE))) + if (MotionTransport* orgrimsHammer = go->ToMotionTransport()) + { + float x, y, z, o; + OrgrimsHammerTeleportExit.GetPosition(x, y, z, o); + orgrimsHammer->CalculatePassengerPosition(x, y, z, &o); + me->SummonCreature(NPC_TELEPORT_EXIT, x, y, z, o, TEMPSUMMON_TIMED_DESPAWN, 23000); + } + + _events.ScheduleEvent(EVENT_ADDS_BOARD_YELL, 6000); + _events.ScheduleEvent(EVENT_ADDS, 60000); + break; + case EVENT_ADDS_BOARD_YELL: + if (Creature* saurfang = me->FindNearestCreature(NPC_IGB_HIGH_OVERLORD_SAURFANG, 200.0f)) + saurfang->AI()->Talk(SAY_SAURFANG_BOARD); + break; + case EVENT_CHECK_RIFLEMAN: + if (_controller.SummonCreatures(me, SLOT_RIFLEMAN_1, Is25ManRaid() ? SLOT_RIFLEMAN_8 : SLOT_RIFLEMAN_4)) + { + if (_riflemanYellCooldown < time(nullptr)) + { + Talk(SAY_MURADIN_RIFLEMAN); + _riflemanYellCooldown = time(nullptr) + 5; + } + } + _events.ScheduleEvent(EVENT_CHECK_RIFLEMAN, 1500); + break; + case EVENT_CHECK_MORTAR: + if (_controller.SummonCreatures(me, SLOT_MORTAR_1, Is25ManRaid() ? SLOT_MORTAR_4 : SLOT_MORTAR_2)) + { + if (_mortarYellCooldown < time(nullptr)) + { + Talk(SAY_MURADIN_MORTAR); + _mortarYellCooldown = time(nullptr) + 5; + } + } + _events.ScheduleEvent(EVENT_CHECK_MORTAR, 1500); + break; + case EVENT_CLEAVE: + if (me->GetVictim()) + me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false); + _events.ScheduleEvent(EVENT_CLEAVE, urand(4000, 8000)); + break; + + default: + break; + } + + if (!me->GetVictim() || me->HasUnitState(UNIT_STATE_CASTING)) + return; + + if (me->IsWithinMeleeRange(me->GetVictim())) + DoMeleeAttackIfReady(); + else if (me->isAttackReady()) + { + me->SetOrientation(me->GetAngle(me->GetVictim())); + me->CastSpell(me->GetVictim(), SPELL_RENDING_THROW, false); + me->resetAttackTimer(); + } + } + + void AttackStart(Unit* victim) + { + if (victim && me->Attack(victim, true)) + { + if (victim->GetPositionZ() < 478.0f) + me->GetMotionMaster()->MoveChase(victim); + else + { + float x, y, z, o; + me->GetHomePosition(x, y, z, o); + me->GetMotionMaster()->MovePoint(0, x, y, z, false); } } - - bool CanAIAttack(const Unit* target) const - { - if (_instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != IN_PROGRESS) - return false; - if (target->GetEntry() == NPC_KOR_KRON_REAVER || target->GetEntry() == NPC_KOR_KRON_SERGEANT) - return target->ToCreature()->GetReactState() != REACT_PASSIVE; - return target->GetTransport() == me->GetTransport() && target->GetPositionY() > (_instance->GetData(DATA_TEAMID_IN_INSTANCE) == TEAM_ALLIANCE ? 2042.0f : 2445.0f); - } - - private: - EventMap _events; - PassengerController _controller; - InstanceScript* _instance; - time_t _firstMageCooldown; - time_t _riflemanYellCooldown; - time_t _mortarYellCooldown; - uint16 checkTimer; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); } + + bool CanAIAttack(const Unit* target) const + { + if (_instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != IN_PROGRESS) + return false; + if (target->GetEntry() == NPC_KOR_KRON_REAVER || target->GetEntry() == NPC_KOR_KRON_SERGEANT) + return target->ToCreature()->GetReactState() != REACT_PASSIVE; + return target->GetTransport() == me->GetTransport() && target->GetPositionY() > (_instance->GetData(DATA_TEAMID_IN_INSTANCE) == TEAM_ALLIANCE ? 2042.0f : 2445.0f); + } + + private: + EventMap _events; + PassengerController _controller; + InstanceScript* _instance; + time_t _firstMageCooldown; + time_t _riflemanYellCooldown; + time_t _mortarYellCooldown; + uint16 checkTimer; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class npc_zafod_boombox : public CreatureScript { - public: - npc_zafod_boombox() : CreatureScript("npc_zafod_boombox") { } +public: + npc_zafod_boombox() : CreatureScript("npc_zafod_boombox") { } - struct npc_zafod_boomboxAI : public NullCreatureAI + struct npc_zafod_boomboxAI : public NullCreatureAI + { + npc_zafod_boomboxAI(Creature* creature) : NullCreatureAI(creature) { - npc_zafod_boomboxAI(Creature* creature) : NullCreatureAI(creature) - { - me->SetReactState(REACT_PASSIVE); - } - - void sGossipSelect(Player* player, uint32 /*sender*/, uint32 /*action*/) - { - player->AddItem(ITEM_GOBLIN_ROCKET_PACK, 1); - player->PlayerTalkClass->SendCloseGossip(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + me->SetReactState(REACT_PASSIVE); } + + void sGossipSelect(Player* player, uint32 /*sender*/, uint32 /*action*/) + { + player->AddItem(ITEM_GOBLIN_ROCKET_PACK, 1); + player->PlayerTalkClass->SendCloseGossip(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class npc_igb_ship_crew : public CreatureScript { - public: - npc_igb_ship_crew() : CreatureScript("npc_igb_ship_crew") { } +public: + npc_igb_ship_crew() : CreatureScript("npc_igb_ship_crew") { } - struct npc_igb_ship_crewAI : public ScriptedAI + struct npc_igb_ship_crewAI : public ScriptedAI + { + npc_igb_ship_crewAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) {} + + bool CanAIAttack(const Unit* target) const { - npc_igb_ship_crewAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) {} - - bool CanAIAttack(const Unit* target) const - { - return _instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) == IN_PROGRESS && target->GetTransport() == me->GetTransport() && target->GetPositionZ() < 478.0f && (me->GetEntry() == NPC_SKYBREAKER_DECKHAND ? (target->GetPositionY()>2042.0f) : (target->GetPositionY()<2431.0f)); - } - private: - InstanceScript* _instance; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + return _instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) == IN_PROGRESS && target->GetTransport() == me->GetTransport() && target->GetPositionZ() < 478.0f && (me->GetEntry() == NPC_SKYBREAKER_DECKHAND ? (target->GetPositionY() > 2042.0f) : (target->GetPositionY() < 2431.0f)); } + private: + InstanceScript* _instance; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; void TriggerBurningPitch(Creature* c) @@ -1609,7 +1609,7 @@ struct npc_gunship_boarding_addAI : public ScriptedAI bool CanAIAttack(const Unit* target) const { - return Instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) == IN_PROGRESS && target->GetTransport() && target->GetTransport() != me->GetTransport() && target->GetPositionZ() < 478.0f && (me->GetEntry() == NPC_SKYBREAKER_SERGEANT || me->GetEntry() == NPC_SKYBREAKER_MARINE ? (target->GetPositionY()<2431.0f) : (target->GetPositionY()>2042.0f)); + return Instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) == IN_PROGRESS && target->GetTransport() && target->GetTransport() != me->GetTransport() && target->GetPositionZ() < 478.0f && (me->GetEntry() == NPC_SKYBREAKER_SERGEANT || me->GetEntry() == NPC_SKYBREAKER_MARINE ? (target->GetPositionY() < 2431.0f) : (target->GetPositionY() > 2042.0f)); } protected: @@ -1629,1067 +1629,1067 @@ protected: class npc_gunship_boarding_leader : public CreatureScript { - public: - npc_gunship_boarding_leader() : CreatureScript("npc_gunship_boarding_leader") { } +public: + npc_gunship_boarding_leader() : CreatureScript("npc_gunship_boarding_leader") { } - struct npc_gunship_boarding_leaderAI : public npc_gunship_boarding_addAI + struct npc_gunship_boarding_leaderAI : public npc_gunship_boarding_addAI + { + npc_gunship_boarding_leaderAI(Creature* creature) : npc_gunship_boarding_addAI(creature) { - npc_gunship_boarding_leaderAI(Creature* creature) : npc_gunship_boarding_addAI(creature) - { - } - - void EnterCombat(Unit* /*target*/) - { - _events.Reset(); - _events.ScheduleEvent(EVENT_BLADESTORM, urand(13000, 18000)); - _events.ScheduleEvent(EVENT_WOUNDING_STRIKE, urand(5000, 10000)); - } - - void UpdateAI(uint32 diff) - { - if (Instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != IN_PROGRESS) - return; - if (me->GetReactState() == REACT_PASSIVE) - return; - npc_gunship_boarding_addAI::UpdateAI(diff); - _events.Update(diff); - UpdateVictim(); - if (me->HasUnitState(UNIT_STATE_CASTING) || me->HasAura(SPELL_BLADESTORM)) - return; - if (!anyValid) - { - TriggerBurningPitch(me); - return; - } - if (!me->GetVictim()) - return; - switch (_events.ExecuteEvent()) - { - case 0: - break; - case EVENT_BLADESTORM: - me->CastSpell(me->GetVictim(), SPELL_BLADESTORM, false); - _events.ScheduleEvent(EVENT_BLADESTORM, urand(25000, 30000)); - break; - case EVENT_WOUNDING_STRIKE: - me->CastSpell(me->GetVictim(), SPELL_WOUNDING_STRIKE, false); - _events.ScheduleEvent(EVENT_WOUNDING_STRIKE, urand(7000, 13000)); - break; - default: - break; - } - DoMeleeAttackIfReady(); - } - - private: - EventMap _events; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); } + + void EnterCombat(Unit* /*target*/) + { + _events.Reset(); + _events.ScheduleEvent(EVENT_BLADESTORM, urand(13000, 18000)); + _events.ScheduleEvent(EVENT_WOUNDING_STRIKE, urand(5000, 10000)); + } + + void UpdateAI(uint32 diff) + { + if (Instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != IN_PROGRESS) + return; + if (me->GetReactState() == REACT_PASSIVE) + return; + npc_gunship_boarding_addAI::UpdateAI(diff); + _events.Update(diff); + UpdateVictim(); + if (me->HasUnitState(UNIT_STATE_CASTING) || me->HasAura(SPELL_BLADESTORM)) + return; + if (!anyValid) + { + TriggerBurningPitch(me); + return; + } + if (!me->GetVictim()) + return; + switch (_events.ExecuteEvent()) + { + case 0: + break; + case EVENT_BLADESTORM: + me->CastSpell(me->GetVictim(), SPELL_BLADESTORM, false); + _events.ScheduleEvent(EVENT_BLADESTORM, urand(25000, 30000)); + break; + case EVENT_WOUNDING_STRIKE: + me->CastSpell(me->GetVictim(), SPELL_WOUNDING_STRIKE, false); + _events.ScheduleEvent(EVENT_WOUNDING_STRIKE, urand(7000, 13000)); + break; + default: + break; + } + DoMeleeAttackIfReady(); + } + + private: + EventMap _events; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class npc_gunship_boarding_add : public CreatureScript { - public: - npc_gunship_boarding_add() : CreatureScript("npc_gunship_boarding_add") { } +public: + npc_gunship_boarding_add() : CreatureScript("npc_gunship_boarding_add") { } - struct npc_gunship_boarding_add_realAI : public npc_gunship_boarding_addAI + struct npc_gunship_boarding_add_realAI : public npc_gunship_boarding_addAI + { + npc_gunship_boarding_add_realAI(Creature* creature) : npc_gunship_boarding_addAI(creature) { - npc_gunship_boarding_add_realAI(Creature* creature) : npc_gunship_boarding_addAI(creature) - { - } - - void UpdateAI(uint32 diff) - { - if (Instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != IN_PROGRESS) - return; - if (me->GetReactState() == REACT_PASSIVE) - return; - npc_gunship_boarding_addAI::UpdateAI(diff); - _events.Update(diff); - UpdateVictim(); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - if (!anyValid) - { - TriggerBurningPitch(me); - return; - } - if (!me->GetVictim()) - return; - DoMeleeAttackIfReady(); - } - - private: - EventMap _events; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); } + + void UpdateAI(uint32 diff) + { + if (Instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != IN_PROGRESS) + return; + if (me->GetReactState() == REACT_PASSIVE) + return; + npc_gunship_boarding_addAI::UpdateAI(diff); + _events.Update(diff); + UpdateVictim(); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + if (!anyValid) + { + TriggerBurningPitch(me); + return; + } + if (!me->GetVictim()) + return; + DoMeleeAttackIfReady(); + } + + private: + EventMap _events; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class npc_gunship_mage : public CreatureScript { - public: - npc_gunship_mage() : CreatureScript("npc_gunship_mage") { } +public: + npc_gunship_mage() : CreatureScript("npc_gunship_mage") { } - struct npc_gunship_mageAI : public gunship_npc_AI + struct npc_gunship_mageAI : public gunship_npc_AI + { + npc_gunship_mageAI(Creature* creature) : gunship_npc_AI(creature) { - npc_gunship_mageAI(Creature* creature) : gunship_npc_AI(creature) - { - me->m_CombatDistance = 70.0f; - } - - void AttackStart(Unit* target) - { - me->Attack(target, false); - } - - void MovementInform(uint32 type, uint32 pointId) - { - if (type == POINT_MOTION_TYPE && pointId == EVENT_CHARGE_PREPATH && Slot) - { - me->SetFacingTo(Slot->TargetPosition.GetOrientation()); - switch (Index) - { - case SLOT_FREEZE_MAGE: - if (Player* player = me->SelectNearestPlayer(50.0f)) - { - me->SetInCombatWithZone(); - me->AddThreat(player, 1.0f); - } - me->CastSpell((Unit*)NULL, SPELL_BELOW_ZERO, false); - break; - case SLOT_MAGE_1: - case SLOT_MAGE_2: - me->CastSpell((Unit*)NULL, SPELL_SHADOW_CHANNELING, false); - break; - default: - break; - } - - me->SetControlled(true, UNIT_STATE_ROOT); - } - } - - void UpdateAI(uint32 diff) - { - if (Instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != IN_PROGRESS) - return; - if (me->GetReactState() == REACT_PASSIVE) - return; - gunship_npc_AI::UpdateAI(diff); - } - - bool CanAIAttack(const Unit* /*target*/) const - { - return Instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) == IN_PROGRESS; - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + me->m_CombatDistance = 70.0f; } + + void AttackStart(Unit* target) + { + me->Attack(target, false); + } + + void MovementInform(uint32 type, uint32 pointId) + { + if (type == POINT_MOTION_TYPE && pointId == EVENT_CHARGE_PREPATH && Slot) + { + me->SetFacingTo(Slot->TargetPosition.GetOrientation()); + switch (Index) + { + case SLOT_FREEZE_MAGE: + if (Player* player = me->SelectNearestPlayer(50.0f)) + { + me->SetInCombatWithZone(); + me->AddThreat(player, 1.0f); + } + me->CastSpell((Unit*)NULL, SPELL_BELOW_ZERO, false); + break; + case SLOT_MAGE_1: + case SLOT_MAGE_2: + me->CastSpell((Unit*)NULL, SPELL_SHADOW_CHANNELING, false); + break; + default: + break; + } + + me->SetControlled(true, UNIT_STATE_ROOT); + } + } + + void UpdateAI(uint32 diff) + { + if (Instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != IN_PROGRESS) + return; + if (me->GetReactState() == REACT_PASSIVE) + return; + gunship_npc_AI::UpdateAI(diff); + } + + bool CanAIAttack(const Unit* /*target*/) const + { + return Instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) == IN_PROGRESS; + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class npc_gunship_gunner : public CreatureScript { - public: - npc_gunship_gunner() : CreatureScript("npc_gunship_gunner") { } +public: + npc_gunship_gunner() : CreatureScript("npc_gunship_gunner") { } - struct npc_gunship_gunnerAI : public gunship_npc_AI + struct npc_gunship_gunnerAI : public gunship_npc_AI + { + npc_gunship_gunnerAI(Creature* creature) : gunship_npc_AI(creature) { - npc_gunship_gunnerAI(Creature* creature) : gunship_npc_AI(creature) - { - anyValid = true; - checkTimer = 1000; - creature->m_CombatDistance = 150.0f; - } - - void AttackStart(Unit* target) - { - me->Attack(target, false); - } - - void MovementInform(uint32 type, uint32 pointId) - { - gunship_npc_AI::MovementInform(type, pointId); - if (type == POINT_MOTION_TYPE && pointId == EVENT_CHARGE_PREPATH) - me->SetControlled(true, UNIT_STATE_ROOT); - } - - void UpdateAI(uint32 diff) - { - if (Instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != IN_PROGRESS) - return; - if (me->GetReactState() == REACT_PASSIVE) - return; - if (checkTimer <= diff) - { - checkTimer = 1000; - anyValid = false; - Map::PlayerList const& pl = me->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) - if (Player* p = itr->GetSource()) - if (CanAIAttack(p) && me->IsValidAttackTarget(p)) - { - anyValid = true; - me->SetInCombatWith(p); - p->SetInCombatWith(me); - me->AddThreat(p, 0.0f); - } - } - else - checkTimer -= diff; - UpdateVictim(); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - if (!anyValid) - { - TriggerBurningPitch(me); - return; - } - if (!me->GetVictim()) - return; - DoSpellAttackIfReady(me->GetEntry() == NPC_SKYBREAKER_RIFLEMAN ? SPELL_SHOOT : SPELL_HURL_AXE); - } - - bool CanAIAttack(const Unit* target) const - { - return Instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) == IN_PROGRESS && target->GetTransport() && target->GetTransport() != me->GetTransport(); - } - - protected: - bool anyValid; - uint16 checkTimer; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + anyValid = true; + checkTimer = 1000; + creature->m_CombatDistance = 150.0f; } + + void AttackStart(Unit* target) + { + me->Attack(target, false); + } + + void MovementInform(uint32 type, uint32 pointId) + { + gunship_npc_AI::MovementInform(type, pointId); + if (type == POINT_MOTION_TYPE && pointId == EVENT_CHARGE_PREPATH) + me->SetControlled(true, UNIT_STATE_ROOT); + } + + void UpdateAI(uint32 diff) + { + if (Instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != IN_PROGRESS) + return; + if (me->GetReactState() == REACT_PASSIVE) + return; + if (checkTimer <= diff) + { + checkTimer = 1000; + anyValid = false; + Map::PlayerList const& pl = me->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) + if (Player* p = itr->GetSource()) + if (CanAIAttack(p) && me->IsValidAttackTarget(p)) + { + anyValid = true; + me->SetInCombatWith(p); + p->SetInCombatWith(me); + me->AddThreat(p, 0.0f); + } + } + else + checkTimer -= diff; + UpdateVictim(); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + if (!anyValid) + { + TriggerBurningPitch(me); + return; + } + if (!me->GetVictim()) + return; + DoSpellAttackIfReady(me->GetEntry() == NPC_SKYBREAKER_RIFLEMAN ? SPELL_SHOOT : SPELL_HURL_AXE); + } + + bool CanAIAttack(const Unit* target) const + { + return Instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) == IN_PROGRESS && target->GetTransport() && target->GetTransport() != me->GetTransport(); + } + + protected: + bool anyValid; + uint16 checkTimer; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class npc_gunship_rocketeer : public CreatureScript { - public: - npc_gunship_rocketeer() : CreatureScript("npc_gunship_rocketeer") { } +public: + npc_gunship_rocketeer() : CreatureScript("npc_gunship_rocketeer") { } - struct npc_gunship_rocketeerAI : public gunship_npc_AI + struct npc_gunship_rocketeerAI : public gunship_npc_AI + { + npc_gunship_rocketeerAI(Creature* creature) : gunship_npc_AI(creature) { - npc_gunship_rocketeerAI(Creature* creature) : gunship_npc_AI(creature) - { - creature->m_CombatDistance = 150.0f; - } - - void MovementInform(uint32 type, uint32 pointId) - { - gunship_npc_AI::MovementInform(type, pointId); - if (type == POINT_MOTION_TYPE && pointId == EVENT_CHARGE_PREPATH) - me->SetControlled(true, UNIT_STATE_ROOT); - } - - void UpdateAI(uint32 /*diff*/) - { - if (Instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != IN_PROGRESS) - return; - if (me->GetReactState() == REACT_PASSIVE) - return; - - UpdateVictim(); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - uint32 spellId = me->GetEntry() == NPC_SKYBREAKER_MORTAR_SOLDIER ? SPELL_ROCKET_ARTILLERY_A : SPELL_ROCKET_ARTILLERY_H; - if (me->HasSpellCooldown(spellId)) - return; - - me->CastSpell((Unit*)NULL, spellId, true); - me->_AddCreatureSpellCooldown(spellId, 9000); - } - - bool CanAIAttack(const Unit* /*target*/) const - { - return Instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) == IN_PROGRESS; - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + creature->m_CombatDistance = 150.0f; } + + void MovementInform(uint32 type, uint32 pointId) + { + gunship_npc_AI::MovementInform(type, pointId); + if (type == POINT_MOTION_TYPE && pointId == EVENT_CHARGE_PREPATH) + me->SetControlled(true, UNIT_STATE_ROOT); + } + + void UpdateAI(uint32 /*diff*/) + { + if (Instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != IN_PROGRESS) + return; + if (me->GetReactState() == REACT_PASSIVE) + return; + + UpdateVictim(); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + uint32 spellId = me->GetEntry() == NPC_SKYBREAKER_MORTAR_SOLDIER ? SPELL_ROCKET_ARTILLERY_A : SPELL_ROCKET_ARTILLERY_H; + if (me->HasSpellCooldown(spellId)) + return; + + me->CastSpell((Unit*)NULL, spellId, true); + me->_AddCreatureSpellCooldown(spellId, 9000); + } + + bool CanAIAttack(const Unit* /*target*/) const + { + return Instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) == IN_PROGRESS; + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class spell_igb_rocket_pack : public SpellScriptLoader { - public: - spell_igb_rocket_pack() : SpellScriptLoader("spell_igb_rocket_pack") { } +public: + spell_igb_rocket_pack() : SpellScriptLoader("spell_igb_rocket_pack") { } - class spell_igb_rocket_pack_AuraScript : public AuraScript + class spell_igb_rocket_pack_AuraScript : public AuraScript + { + PrepareAuraScript(spell_igb_rocket_pack_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_igb_rocket_pack_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_ROCKET_PACK_DAMAGE) || + if (!sSpellMgr->GetSpellInfo(SPELL_ROCKET_PACK_DAMAGE) || !sSpellMgr->GetSpellInfo(SPELL_ROCKET_BURST)) - return false; + return false; - return true; - } - - void HandlePeriodic(AuraEffect const* /*aurEff*/) - { - if (GetTarget()->movespline->Finalized()) - Remove(AURA_REMOVE_BY_EXPIRE); - } - - void HandleRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - SpellInfo const* damageInfo = sSpellMgr->GetSpellInfo(SPELL_ROCKET_PACK_DAMAGE); - GetTarget()->CastCustomSpell(SPELL_ROCKET_PACK_DAMAGE, SPELLVALUE_BASE_POINT0, 2 * (damageInfo->Effects[EFFECT_0].CalcValue() + aurEff->GetTickNumber() * aurEff->GetAmplitude()), NULL, true); - GetTarget()->CastSpell((Unit*)NULL, SPELL_ROCKET_BURST, true); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_igb_rocket_pack_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - OnEffectRemove += AuraEffectRemoveFn(spell_igb_rocket_pack_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_igb_rocket_pack_AuraScript(); + return true; } + + void HandlePeriodic(AuraEffect const* /*aurEff*/) + { + if (GetTarget()->movespline->Finalized()) + Remove(AURA_REMOVE_BY_EXPIRE); + } + + void HandleRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + SpellInfo const* damageInfo = sSpellMgr->GetSpellInfo(SPELL_ROCKET_PACK_DAMAGE); + GetTarget()->CastCustomSpell(SPELL_ROCKET_PACK_DAMAGE, SPELLVALUE_BASE_POINT0, 2 * (damageInfo->Effects[EFFECT_0].CalcValue() + aurEff->GetTickNumber() * aurEff->GetAmplitude()), NULL, true); + GetTarget()->CastSpell((Unit*)NULL, SPELL_ROCKET_BURST, true); + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_igb_rocket_pack_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + OnEffectRemove += AuraEffectRemoveFn(spell_igb_rocket_pack_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_igb_rocket_pack_AuraScript(); + } }; class spell_igb_rocket_pack_useable : public SpellScriptLoader { - public: - spell_igb_rocket_pack_useable() : SpellScriptLoader("spell_igb_rocket_pack_useable") { } +public: + spell_igb_rocket_pack_useable() : SpellScriptLoader("spell_igb_rocket_pack_useable") { } - class spell_igb_rocket_pack_useable_AuraScript : public AuraScript + class spell_igb_rocket_pack_useable_AuraScript : public AuraScript + { + PrepareAuraScript(spell_igb_rocket_pack_useable_AuraScript); + + bool Load() { - PrepareAuraScript(spell_igb_rocket_pack_useable_AuraScript); - - bool Load() - { - return GetOwner()->GetInstanceScript(); - } - - bool CheckAreaTarget(Unit* target) - { - return target->GetTypeId() == TYPEID_PLAYER && GetOwner()->GetInstanceScript()->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != DONE; - } - - void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Creature* owner = GetOwner()->ToCreature()) - if (Player* target = GetTarget()->ToPlayer()) - if (target->HasItemCount(ITEM_GOBLIN_ROCKET_PACK, 1)) - sCreatureTextMgr->SendChat(owner, SAY_ZAFOD_ROCKET_PACK_ACTIVE, target, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_NORMAL, 0, TEAM_NEUTRAL, false, target); - } - - void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Creature* owner = GetOwner()->ToCreature()) - if (Player* target = GetTarget()->ToPlayer()) - if (target->HasItemCount(ITEM_GOBLIN_ROCKET_PACK, 1)) - sCreatureTextMgr->SendChat(owner, SAY_ZAFOD_ROCKET_PACK_DISABLED, target, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_NORMAL, 0, TEAM_NEUTRAL, false, target); - } - - void Register() - { - DoCheckAreaTarget += AuraCheckAreaTargetFn(spell_igb_rocket_pack_useable_AuraScript::CheckAreaTarget); - AfterEffectApply += AuraEffectApplyFn(spell_igb_rocket_pack_useable_AuraScript::HandleApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_igb_rocket_pack_useable_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_igb_rocket_pack_useable_AuraScript(); + return GetOwner()->GetInstanceScript(); } + + bool CheckAreaTarget(Unit* target) + { + return target->GetTypeId() == TYPEID_PLAYER && GetOwner()->GetInstanceScript()->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != DONE; + } + + void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Creature* owner = GetOwner()->ToCreature()) + if (Player* target = GetTarget()->ToPlayer()) + if (target->HasItemCount(ITEM_GOBLIN_ROCKET_PACK, 1)) + sCreatureTextMgr->SendChat(owner, SAY_ZAFOD_ROCKET_PACK_ACTIVE, target, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_NORMAL, 0, TEAM_NEUTRAL, false, target); + } + + void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Creature* owner = GetOwner()->ToCreature()) + if (Player* target = GetTarget()->ToPlayer()) + if (target->HasItemCount(ITEM_GOBLIN_ROCKET_PACK, 1)) + sCreatureTextMgr->SendChat(owner, SAY_ZAFOD_ROCKET_PACK_DISABLED, target, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_NORMAL, 0, TEAM_NEUTRAL, false, target); + } + + void Register() + { + DoCheckAreaTarget += AuraCheckAreaTargetFn(spell_igb_rocket_pack_useable_AuraScript::CheckAreaTarget); + AfterEffectApply += AuraEffectApplyFn(spell_igb_rocket_pack_useable_AuraScript::HandleApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_igb_rocket_pack_useable_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_igb_rocket_pack_useable_AuraScript(); + } }; class spell_igb_teleport_to_enemy_ship : public SpellScriptLoader { - public: - spell_igb_teleport_to_enemy_ship() : SpellScriptLoader("spell_igb_teleport_to_enemy_ship") { } +public: + spell_igb_teleport_to_enemy_ship() : SpellScriptLoader("spell_igb_teleport_to_enemy_ship") { } - class spell_igb_teleport_to_enemy_ship_SpellScript : public SpellScript + class spell_igb_teleport_to_enemy_ship_SpellScript : public SpellScript + { + PrepareSpellScript(spell_igb_teleport_to_enemy_ship_SpellScript); + + void RelocateTransportOffset(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_igb_teleport_to_enemy_ship_SpellScript); + WorldLocation const* dest = GetHitDest(); + Unit* target = GetHitUnit(); + if (!dest || !target || !target->GetTransport()) + return; - void RelocateTransportOffset(SpellEffIndex /*effIndex*/) - { - WorldLocation const* dest = GetHitDest(); - Unit* target = GetHitUnit(); - if (!dest || !target || !target->GetTransport()) - return; - - float x, y, z, o; - dest->GetPosition(x, y, z, o); - target->GetTransport()->CalculatePassengerOffset(x, y, z, &o); - target->m_movementInfo.transport.pos.Relocate(x, y, z, o); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_igb_teleport_to_enemy_ship_SpellScript::RelocateTransportOffset, EFFECT_0, SPELL_EFFECT_TELEPORT_UNITS); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_igb_teleport_to_enemy_ship_SpellScript(); + float x, y, z, o; + dest->GetPosition(x, y, z, o); + target->GetTransport()->CalculatePassengerOffset(x, y, z, &o); + target->m_movementInfo.transport.pos.Relocate(x, y, z, o); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_igb_teleport_to_enemy_ship_SpellScript::RelocateTransportOffset, EFFECT_0, SPELL_EFFECT_TELEPORT_UNITS); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_igb_teleport_to_enemy_ship_SpellScript(); + } }; class spell_igb_check_for_players : public SpellScriptLoader { - public: - spell_igb_check_for_players() : SpellScriptLoader("spell_igb_check_for_players") { } +public: + spell_igb_check_for_players() : SpellScriptLoader("spell_igb_check_for_players") { } - class spell_igb_check_for_players_SpellScript : public SpellScript + class spell_igb_check_for_players_SpellScript : public SpellScript + { + PrepareSpellScript(spell_igb_check_for_players_SpellScript); + + bool Load() { - PrepareSpellScript(spell_igb_check_for_players_SpellScript); - - bool Load() - { - _playerCount = 0; - return GetCaster()->GetTypeId() == TYPEID_UNIT; - } - - void CountTargets(std::list& targets) - { - _playerCount = targets.size(); - } - - void TriggerWipe() - { - if (!_playerCount) - GetCaster()->ToCreature()->AI()->JustDied(nullptr); - } - - void TeleportPlayer(SpellEffIndex /*effIndex*/) - { - if (GetHitUnit()->GetPositionZ() < GetCaster()->GetPositionZ() - 10.0f) - GetHitUnit()->CastSpell(GetHitUnit(), SPELL_GUNSHIP_FALL_TELEPORT, true); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_igb_check_for_players_SpellScript::CountTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); - AfterCast += SpellCastFn(spell_igb_check_for_players_SpellScript::TriggerWipe); - OnEffectHitTarget += SpellEffectFn(spell_igb_check_for_players_SpellScript::TeleportPlayer, EFFECT_0, SPELL_EFFECT_DUMMY); - } - - uint32 _playerCount; - }; - - SpellScript* GetSpellScript() const - { - return new spell_igb_check_for_players_SpellScript(); + _playerCount = 0; + return GetCaster()->GetTypeId() == TYPEID_UNIT; } + + void CountTargets(std::list& targets) + { + _playerCount = targets.size(); + } + + void TriggerWipe() + { + if (!_playerCount) + GetCaster()->ToCreature()->AI()->JustDied(nullptr); + } + + void TeleportPlayer(SpellEffIndex /*effIndex*/) + { + if (GetHitUnit()->GetPositionZ() < GetCaster()->GetPositionZ() - 10.0f) + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_GUNSHIP_FALL_TELEPORT, true); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_igb_check_for_players_SpellScript::CountTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + AfterCast += SpellCastFn(spell_igb_check_for_players_SpellScript::TriggerWipe); + OnEffectHitTarget += SpellEffectFn(spell_igb_check_for_players_SpellScript::TeleportPlayer, EFFECT_0, SPELL_EFFECT_DUMMY); + } + + uint32 _playerCount; + }; + + SpellScript* GetSpellScript() const + { + return new spell_igb_check_for_players_SpellScript(); + } }; class spell_igb_gunship_fall_teleport : public SpellScriptLoader { - public: - spell_igb_gunship_fall_teleport() : SpellScriptLoader("spell_igb_gunship_fall_teleport") { } +public: + spell_igb_gunship_fall_teleport() : SpellScriptLoader("spell_igb_gunship_fall_teleport") { } - class spell_igb_gunship_fall_teleport_SpellScript : public SpellScript + class spell_igb_gunship_fall_teleport_SpellScript : public SpellScript + { + PrepareSpellScript(spell_igb_gunship_fall_teleport_SpellScript); + + bool Load() { - PrepareSpellScript(spell_igb_gunship_fall_teleport_SpellScript); - - bool Load() - { - return GetCaster()->GetInstanceScript(); - } - - void SelectTransport(WorldObject*& target) - { - if (InstanceScript* instance = target->GetInstanceScript()) - target = HashMapHolder::Find(instance->GetData64(DATA_ICECROWN_GUNSHIP_BATTLE)); - } - - void RelocateDest(SpellEffIndex /*effIndex*/) - { - Position offset = {0.0f, 0.0f, 0.0f, 0.0f}; - offset.m_positionZ = GetCaster()->GetInstanceScript()->GetData(DATA_TEAMID_IN_INSTANCE) == TEAM_HORDE ? 36.0f : 21.0f; - GetHitDest()->RelocateOffset(offset); - } - - void Register() - { - OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_igb_gunship_fall_teleport_SpellScript::SelectTransport, EFFECT_0, TARGET_DEST_NEARBY_ENTRY); - OnEffectLaunch += SpellEffectFn(spell_igb_gunship_fall_teleport_SpellScript::RelocateDest, EFFECT_0, SPELL_EFFECT_TELEPORT_UNITS); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_igb_gunship_fall_teleport_SpellScript(); + return GetCaster()->GetInstanceScript(); } + + void SelectTransport(WorldObject*& target) + { + if (InstanceScript* instance = target->GetInstanceScript()) + target = HashMapHolder::Find(instance->GetData64(DATA_ICECROWN_GUNSHIP_BATTLE)); + } + + void RelocateDest(SpellEffIndex /*effIndex*/) + { + Position offset = {0.0f, 0.0f, 0.0f, 0.0f}; + offset.m_positionZ = GetCaster()->GetInstanceScript()->GetData(DATA_TEAMID_IN_INSTANCE) == TEAM_HORDE ? 36.0f : 21.0f; + GetHitDest()->RelocateOffset(offset); + } + + void Register() + { + OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_igb_gunship_fall_teleport_SpellScript::SelectTransport, EFFECT_0, TARGET_DEST_NEARBY_ENTRY); + OnEffectLaunch += SpellEffectFn(spell_igb_gunship_fall_teleport_SpellScript::RelocateDest, EFFECT_0, SPELL_EFFECT_TELEPORT_UNITS); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_igb_gunship_fall_teleport_SpellScript(); + } }; class spell_igb_explosion_main : public SpellScriptLoader { - public: - spell_igb_explosion_main() : SpellScriptLoader("spell_igb_explosion_main") { } +public: + spell_igb_explosion_main() : SpellScriptLoader("spell_igb_explosion_main") { } - class spell_igb_explosion_main_AuraScript : public AuraScript + class spell_igb_explosion_main_AuraScript : public AuraScript + { + PrepareAuraScript(spell_igb_explosion_main_AuraScript); + + bool Load() { - PrepareAuraScript(spell_igb_explosion_main_AuraScript); - - bool Load() - { - tickNo = urand(0,3); - return true; - } - - void PeriodicTick(AuraEffect const* aurEff) - { - if ((aurEff->GetTickNumber() % 4) != tickNo) - PreventDefaultAction(); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_igb_explosion_main_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - - uint32 tickNo; - }; - - AuraScript* GetAuraScript() const - { - return new spell_igb_explosion_main_AuraScript(); + tickNo = urand(0, 3); + return true; } + + void PeriodicTick(AuraEffect const* aurEff) + { + if ((aurEff->GetTickNumber() % 4) != tickNo) + PreventDefaultAction(); + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_igb_explosion_main_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + + uint32 tickNo; + }; + + AuraScript* GetAuraScript() const + { + return new spell_igb_explosion_main_AuraScript(); + } }; class IgbExplosionCheck { - public: - IgbExplosionCheck(Unit* source) : _source(source) {} +public: + IgbExplosionCheck(Unit* source) : _source(source) {} - bool operator()(WorldObject* unit) - { - return unit->GetTransport() != _source->GetTransport(); - } + bool operator()(WorldObject* unit) + { + return unit->GetTransport() != _source->GetTransport(); + } - private: - Unit* _source; +private: + Unit* _source; }; class spell_igb_explosion : public SpellScriptLoader { - public: - spell_igb_explosion() : SpellScriptLoader("spell_igb_explosion") { } +public: + spell_igb_explosion() : SpellScriptLoader("spell_igb_explosion") { } - class spell_igb_explosion_SpellScript : public SpellScript + class spell_igb_explosion_SpellScript : public SpellScript + { + PrepareSpellScript(spell_igb_explosion_SpellScript); + + void SelectTarget(std::list& targets) { - PrepareSpellScript(spell_igb_explosion_SpellScript); - - void SelectTarget(std::list& targets) - { - targets.remove_if(IgbExplosionCheck(GetCaster())); - acore::Containers::RandomResizeList(targets, 1); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_igb_explosion_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_DEST_AREA_ENTRY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_igb_explosion_SpellScript(); + targets.remove_if(IgbExplosionCheck(GetCaster())); + acore::Containers::RandomResizeList(targets, 1); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_igb_explosion_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_DEST_AREA_ENTRY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_igb_explosion_SpellScript(); + } }; class IgbTeleportOnVictoryCheck { - public: - IgbTeleportOnVictoryCheck(InstanceScript* inst) : _inst(inst) {} +public: + IgbTeleportOnVictoryCheck(InstanceScript* inst) : _inst(inst) {} - bool operator()(WorldObject* unit) - { - return unit->GetTransGUID() != _inst->GetData64(DATA_ENEMY_GUNSHIP); - } + bool operator()(WorldObject* unit) + { + return unit->GetTransGUID() != _inst->GetData64(DATA_ENEMY_GUNSHIP); + } - private: - InstanceScript* _inst; +private: + InstanceScript* _inst; }; class spell_igb_teleport_players_on_victory : public SpellScriptLoader { - public: - spell_igb_teleport_players_on_victory() : SpellScriptLoader("spell_igb_teleport_players_on_victory") { } +public: + spell_igb_teleport_players_on_victory() : SpellScriptLoader("spell_igb_teleport_players_on_victory") { } - class spell_igb_teleport_players_on_victory_SpellScript : public SpellScript + class spell_igb_teleport_players_on_victory_SpellScript : public SpellScript + { + PrepareSpellScript(spell_igb_teleport_players_on_victory_SpellScript); + + bool Load() { - PrepareSpellScript(spell_igb_teleport_players_on_victory_SpellScript); - - bool Load() - { - return GetCaster()->GetInstanceScript(); - } - - void FilterTargets(std::list& targets) - { - InstanceScript* instance = GetCaster()->GetInstanceScript(); - targets.remove_if(IgbTeleportOnVictoryCheck(instance)); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_igb_teleport_players_on_victory_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ENTRY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_igb_teleport_players_on_victory_SpellScript(); + return GetCaster()->GetInstanceScript(); } + + void FilterTargets(std::list& targets) + { + InstanceScript* instance = GetCaster()->GetInstanceScript(); + targets.remove_if(IgbTeleportOnVictoryCheck(instance)); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_igb_teleport_players_on_victory_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ENTRY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_igb_teleport_players_on_victory_SpellScript(); + } }; class spell_igb_periodic_trigger_with_power_cost : public SpellScriptLoader { - public: - spell_igb_periodic_trigger_with_power_cost() : SpellScriptLoader("spell_igb_periodic_trigger_with_power_cost") { } +public: + spell_igb_periodic_trigger_with_power_cost() : SpellScriptLoader("spell_igb_periodic_trigger_with_power_cost") { } - class spell_igb_periodic_trigger_with_power_cost_AuraScript : public AuraScript + class spell_igb_periodic_trigger_with_power_cost_AuraScript : public AuraScript + { + PrepareAuraScript(spell_igb_periodic_trigger_with_power_cost_AuraScript); + + void HandlePeriodicTick(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_igb_periodic_trigger_with_power_cost_AuraScript); - - void HandlePeriodicTick(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - GetTarget()->CastSpell(GetTarget(), GetSpellInfo()->Effects[EFFECT_0].TriggerSpell, TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_IGNORE_POWER_AND_REAGENT_COST)); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_igb_periodic_trigger_with_power_cost_AuraScript::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_igb_periodic_trigger_with_power_cost_AuraScript(); + PreventDefaultAction(); + GetTarget()->CastSpell(GetTarget(), GetSpellInfo()->Effects[EFFECT_0].TriggerSpell, TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_IGNORE_POWER_AND_REAGENT_COST)); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_igb_periodic_trigger_with_power_cost_AuraScript::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_igb_periodic_trigger_with_power_cost_AuraScript(); + } }; class spell_igb_overheat : public SpellScriptLoader { - public: - spell_igb_overheat() : SpellScriptLoader("spell_igb_overheat") { } +public: + spell_igb_overheat() : SpellScriptLoader("spell_igb_overheat") { } - class spell_igb_overheat_AuraScript : public AuraScript + class spell_igb_overheat_AuraScript : public AuraScript + { + PrepareAuraScript(spell_igb_overheat_AuraScript); + + bool Load() { - PrepareAuraScript(spell_igb_overheat_AuraScript); + if (GetAura()->GetType() != UNIT_AURA_TYPE) + return false; + return GetUnitOwner()->IsVehicle(); + } - bool Load() + void SendClientControl(uint8 value) + { + if (Vehicle* vehicle = GetUnitOwner()->GetVehicleKit()) { - if (GetAura()->GetType() != UNIT_AURA_TYPE) - return false; - return GetUnitOwner()->IsVehicle(); - } - - void SendClientControl(uint8 value) - { - if (Vehicle* vehicle = GetUnitOwner()->GetVehicleKit()) + if (Unit* passenger = vehicle->GetPassenger(0)) { - if (Unit* passenger = vehicle->GetPassenger(0)) + if (Player* player = passenger->ToPlayer()) { - if (Player* player = passenger->ToPlayer()) - { - WorldPacket data(SMSG_CLIENT_CONTROL_UPDATE, GetUnitOwner()->GetPackGUID().size() + 1); - data.append(GetUnitOwner()->GetPackGUID()); - data << uint8(value); - player->GetSession()->SendPacket(&data); - } + WorldPacket data(SMSG_CLIENT_CONTROL_UPDATE, GetUnitOwner()->GetPackGUID().size() + 1); + data.append(GetUnitOwner()->GetPackGUID()); + data << uint8(value); + player->GetSession()->SendPacket(&data); } } } - - void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - SendClientControl(0); - } - - void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - SendClientControl(1); - } - - void Register() - { - AfterEffectApply += AuraEffectApplyFn(spell_igb_overheat_AuraScript::HandleApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_igb_overheat_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_igb_overheat_AuraScript(); } + + void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + SendClientControl(0); + } + + void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + SendClientControl(1); + } + + void Register() + { + AfterEffectApply += AuraEffectApplyFn(spell_igb_overheat_AuraScript::HandleApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_igb_overheat_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_igb_overheat_AuraScript(); + } }; class spell_igb_cannon_blast : public SpellScriptLoader { - public: - spell_igb_cannon_blast() : SpellScriptLoader("spell_igb_cannon_blast") { } +public: + spell_igb_cannon_blast() : SpellScriptLoader("spell_igb_cannon_blast") { } - class spell_igb_cannon_blast_SpellScript : public SpellScript + class spell_igb_cannon_blast_SpellScript : public SpellScript + { + PrepareSpellScript(spell_igb_cannon_blast_SpellScript); + + bool Load() { - PrepareSpellScript(spell_igb_cannon_blast_SpellScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_UNIT; - } - - void CheckEnergy() - { - if (GetCaster()->GetPower(POWER_ENERGY) >= 100) - { - GetCaster()->CastSpell(GetCaster(), SPELL_OVERHEAT, true); - if (Vehicle* vehicle = GetCaster()->GetVehicleKit()) - if (Unit* passenger = vehicle->GetPassenger(0)) - sCreatureTextMgr->SendChat(GetCaster()->ToCreature(), SAY_OVERHEAT, passenger); - } - } - - void Register() - { - AfterHit += SpellHitFn(spell_igb_cannon_blast_SpellScript::CheckEnergy); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_igb_cannon_blast_SpellScript(); + return GetCaster()->GetTypeId() == TYPEID_UNIT; } + + void CheckEnergy() + { + if (GetCaster()->GetPower(POWER_ENERGY) >= 100) + { + GetCaster()->CastSpell(GetCaster(), SPELL_OVERHEAT, true); + if (Vehicle* vehicle = GetCaster()->GetVehicleKit()) + if (Unit* passenger = vehicle->GetPassenger(0)) + sCreatureTextMgr->SendChat(GetCaster()->ToCreature(), SAY_OVERHEAT, passenger); + } + } + + void Register() + { + AfterHit += SpellHitFn(spell_igb_cannon_blast_SpellScript::CheckEnergy); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_igb_cannon_blast_SpellScript(); + } }; class spell_igb_incinerating_blast : public SpellScriptLoader { - public: - spell_igb_incinerating_blast() : SpellScriptLoader("spell_igb_incinerating_blast") { } +public: + spell_igb_incinerating_blast() : SpellScriptLoader("spell_igb_incinerating_blast") { } - class spell_igb_incinerating_blast_SpellScript : public SpellScript + class spell_igb_incinerating_blast_SpellScript : public SpellScript + { + PrepareSpellScript(spell_igb_incinerating_blast_SpellScript); + + void StoreEnergy() { - PrepareSpellScript(spell_igb_incinerating_blast_SpellScript); - - void StoreEnergy() - { - _energyLeft = GetCaster()->GetPower(POWER_ENERGY) - 10; - } - - void RemoveEnergy() - { - GetCaster()->SetPower(POWER_ENERGY, 0); - } - - void CalculateDamage(SpellEffIndex /*effIndex*/) - { - PreventHitEffect(EFFECT_0); - const SpellInfo* si = sSpellMgr->GetSpellInfo(GetSpellInfo()->Effects[0].TriggerSpell); - if (!si) - return; - SpellCastTargets targets; - Position dest; - GetExplTargetDest()->GetPosition(&dest); - targets.SetDst(dest); - CustomSpellValues values; - int32 damage = si->Effects[0].CalcValue() + _energyLeft * _energyLeft * 8; - values.AddSpellMod(SPELLVALUE_BASE_POINT0, damage); - values.AddSpellMod(SPELLVALUE_BASE_POINT1, damage); - values.AddSpellMod(SPELLVALUE_BASE_POINT2, damage); - GetCaster()->CastSpell(targets, si, &values, TRIGGERED_FULL_MASK); - //SetEffectValue(GetEffectValue() + _energyLeft * _energyLeft * 8); - } - - void Register() - { - OnCast += SpellCastFn(spell_igb_incinerating_blast_SpellScript::StoreEnergy); - AfterCast += SpellCastFn(spell_igb_incinerating_blast_SpellScript::RemoveEnergy); - OnEffectHit += SpellEffectFn(spell_igb_incinerating_blast_SpellScript::CalculateDamage, EFFECT_0, SPELL_EFFECT_TRIGGER_MISSILE); - } - - uint32 _energyLeft; - }; - - SpellScript* GetSpellScript() const - { - return new spell_igb_incinerating_blast_SpellScript(); + _energyLeft = GetCaster()->GetPower(POWER_ENERGY) - 10; } + + void RemoveEnergy() + { + GetCaster()->SetPower(POWER_ENERGY, 0); + } + + void CalculateDamage(SpellEffIndex /*effIndex*/) + { + PreventHitEffect(EFFECT_0); + const SpellInfo* si = sSpellMgr->GetSpellInfo(GetSpellInfo()->Effects[0].TriggerSpell); + if (!si) + return; + SpellCastTargets targets; + Position dest; + GetExplTargetDest()->GetPosition(&dest); + targets.SetDst(dest); + CustomSpellValues values; + int32 damage = si->Effects[0].CalcValue() + _energyLeft * _energyLeft * 8; + values.AddSpellMod(SPELLVALUE_BASE_POINT0, damage); + values.AddSpellMod(SPELLVALUE_BASE_POINT1, damage); + values.AddSpellMod(SPELLVALUE_BASE_POINT2, damage); + GetCaster()->CastSpell(targets, si, &values, TRIGGERED_FULL_MASK); + //SetEffectValue(GetEffectValue() + _energyLeft * _energyLeft * 8); + } + + void Register() + { + OnCast += SpellCastFn(spell_igb_incinerating_blast_SpellScript::StoreEnergy); + AfterCast += SpellCastFn(spell_igb_incinerating_blast_SpellScript::RemoveEnergy); + OnEffectHit += SpellEffectFn(spell_igb_incinerating_blast_SpellScript::CalculateDamage, EFFECT_0, SPELL_EFFECT_TRIGGER_MISSILE); + } + + uint32 _energyLeft; + }; + + SpellScript* GetSpellScript() const + { + return new spell_igb_incinerating_blast_SpellScript(); + } }; class BurningPitchFilterCheck { - public: - BurningPitchFilterCheck(uint32 entry) : _entry(entry) {} +public: + BurningPitchFilterCheck(uint32 entry) : _entry(entry) {} - bool operator()(WorldObject* unit) - { - if (Transport* transport = unit->GetTransport()) - return transport->GetEntry() != _entry; - return true; - } + bool operator()(WorldObject* unit) + { + if (Transport* transport = unit->GetTransport()) + return transport->GetEntry() != _entry; + return true; + } - private: - uint32 _entry; +private: + uint32 _entry; }; class spell_igb_burning_pitch_selector : public SpellScriptLoader { - public: - spell_igb_burning_pitch_selector() : SpellScriptLoader("spell_igb_burning_pitch_selector") { } +public: + spell_igb_burning_pitch_selector() : SpellScriptLoader("spell_igb_burning_pitch_selector") { } - class spell_igb_burning_pitch_selector_SpellScript : public SpellScript + class spell_igb_burning_pitch_selector_SpellScript : public SpellScript + { + PrepareSpellScript(spell_igb_burning_pitch_selector_SpellScript); + + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_igb_burning_pitch_selector_SpellScript); + TeamId teamId = TEAM_HORDE; + if (InstanceScript* instance = GetCaster()->GetInstanceScript()) + teamId = TeamId(instance->GetData(DATA_TEAMID_IN_INSTANCE)); - void FilterTargets(std::list& targets) + targets.remove_if(BurningPitchFilterCheck(teamId == TEAM_HORDE ? GO_ORGRIMS_HAMMER_H : GO_THE_SKYBREAKER_A)); + if (!targets.empty()) { - TeamId teamId = TEAM_HORDE; - if (InstanceScript* instance = GetCaster()->GetInstanceScript()) - teamId = TeamId(instance->GetData(DATA_TEAMID_IN_INSTANCE)); - - targets.remove_if(BurningPitchFilterCheck(teamId == TEAM_HORDE ? GO_ORGRIMS_HAMMER_H : GO_THE_SKYBREAKER_A)); - if (!targets.empty()) - { - WorldObject* target = acore::Containers::SelectRandomContainerElement(targets); - targets.clear(); - targets.push_back(target); - } + WorldObject* target = acore::Containers::SelectRandomContainerElement(targets); + targets.clear(); + targets.push_back(target); } - - void HandleDummy(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetCaster()->CastSpell(GetHitUnit(), uint32(GetEffectValue()), TRIGGERED_NONE); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_igb_burning_pitch_selector_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); - OnEffectHitTarget += SpellEffectFn(spell_igb_burning_pitch_selector_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_igb_burning_pitch_selector_SpellScript(); } + + void HandleDummy(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + GetCaster()->CastSpell(GetHitUnit(), uint32(GetEffectValue()), TRIGGERED_NONE); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_igb_burning_pitch_selector_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + OnEffectHitTarget += SpellEffectFn(spell_igb_burning_pitch_selector_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_igb_burning_pitch_selector_SpellScript(); + } }; class spell_igb_burning_pitch : public SpellScriptLoader { - public: - spell_igb_burning_pitch() : SpellScriptLoader("spell_igb_burning_pitch") { } +public: + spell_igb_burning_pitch() : SpellScriptLoader("spell_igb_burning_pitch") { } - class spell_igb_burning_pitch_SpellScript : public SpellScript + class spell_igb_burning_pitch_SpellScript : public SpellScript + { + PrepareSpellScript(spell_igb_burning_pitch_SpellScript); + + void HandleDummy(SpellEffIndex effIndex) { - PrepareSpellScript(spell_igb_burning_pitch_SpellScript); - - void HandleDummy(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetCaster()->CastCustomSpell(uint32(GetEffectValue()), SPELLVALUE_BASE_POINT0, 8000, NULL, TRIGGERED_FULL_MASK); - GetHitUnit()->CastSpell(GetHitUnit(), SPELL_BURNING_PITCH, TRIGGERED_FULL_MASK); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_igb_burning_pitch_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_igb_burning_pitch_SpellScript(); + PreventHitDefaultEffect(effIndex); + GetCaster()->CastCustomSpell(uint32(GetEffectValue()), SPELLVALUE_BASE_POINT0, 8000, NULL, TRIGGERED_FULL_MASK); + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_BURNING_PITCH, TRIGGERED_FULL_MASK); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_igb_burning_pitch_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_igb_burning_pitch_SpellScript(); + } }; class IgbArtilleryCheck { - public: - IgbArtilleryCheck(uint32 entry) : _entry(entry) {} +public: + IgbArtilleryCheck(uint32 entry) : _entry(entry) {} - bool operator()(WorldObject* unit) - { - return unit->GetTypeId() != TYPEID_PLAYER || unit->GetPositionZ() > 478.0f || !unit->GetTransport() || unit->GetTransport()->GetEntry() != _entry || unit->GetMap()->GetHeight(unit->GetPhaseMask(), unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ()) < 465.0f; - } + bool operator()(WorldObject* unit) + { + return unit->GetTypeId() != TYPEID_PLAYER || unit->GetPositionZ() > 478.0f || !unit->GetTransport() || unit->GetTransport()->GetEntry() != _entry || unit->GetMap()->GetHeight(unit->GetPhaseMask(), unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ()) < 465.0f; + } - private: - uint32 _entry; +private: + uint32 _entry; }; class spell_igb_rocket_artillery : public SpellScriptLoader { - public: - spell_igb_rocket_artillery() : SpellScriptLoader("spell_igb_rocket_artillery") { } +public: + spell_igb_rocket_artillery() : SpellScriptLoader("spell_igb_rocket_artillery") { } - class spell_igb_rocket_artillery_SpellScript : public SpellScript + class spell_igb_rocket_artillery_SpellScript : public SpellScript + { + PrepareSpellScript(spell_igb_rocket_artillery_SpellScript); + + void SelectRandomTarget(std::list& targets) { - PrepareSpellScript(spell_igb_rocket_artillery_SpellScript); + TeamId teamId = TEAM_HORDE; + if (InstanceScript* instance = GetCaster()->GetInstanceScript()) + teamId = TeamId(instance->GetData(DATA_TEAMID_IN_INSTANCE)); + targets.remove_if(IgbArtilleryCheck(teamId == TEAM_HORDE ? GO_ORGRIMS_HAMMER_H : GO_THE_SKYBREAKER_A)); - void SelectRandomTarget(std::list& targets) + if (!targets.empty()) { - TeamId teamId = TEAM_HORDE; - if (InstanceScript* instance = GetCaster()->GetInstanceScript()) - teamId = TeamId(instance->GetData(DATA_TEAMID_IN_INSTANCE)); - targets.remove_if(IgbArtilleryCheck(teamId == TEAM_HORDE ? GO_ORGRIMS_HAMMER_H : GO_THE_SKYBREAKER_A)); - - if (!targets.empty()) - { - WorldObject* target = acore::Containers::SelectRandomContainerElement(targets); - targets.clear(); - targets.push_back(target); - } + WorldObject* target = acore::Containers::SelectRandomContainerElement(targets); + targets.clear(); + targets.push_back(target); } - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetCaster()->CastSpell(GetHitUnit()->GetPositionX(), GetHitUnit()->GetPositionY(), GetHitUnit()->GetMap()->GetHeight(GetCaster()->GetPhaseMask(), GetHitUnit()->GetPositionX(), GetHitUnit()->GetPositionY(), GetHitUnit()->GetPositionZ()), uint32(GetEffectValue()), TRIGGERED_NONE); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_igb_rocket_artillery_SpellScript::SelectRandomTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - OnEffectHitTarget += SpellEffectFn(spell_igb_rocket_artillery_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_igb_rocket_artillery_SpellScript(); } + + void HandleScript(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + GetCaster()->CastSpell(GetHitUnit()->GetPositionX(), GetHitUnit()->GetPositionY(), GetHitUnit()->GetMap()->GetHeight(GetCaster()->GetPhaseMask(), GetHitUnit()->GetPositionX(), GetHitUnit()->GetPositionY(), GetHitUnit()->GetPositionZ()), uint32(GetEffectValue()), TRIGGERED_NONE); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_igb_rocket_artillery_SpellScript::SelectRandomTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_igb_rocket_artillery_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_igb_rocket_artillery_SpellScript(); + } }; class spell_igb_rocket_artillery_explosion : public SpellScriptLoader { - public: - spell_igb_rocket_artillery_explosion() : SpellScriptLoader("spell_igb_rocket_artillery_explosion") { } +public: + spell_igb_rocket_artillery_explosion() : SpellScriptLoader("spell_igb_rocket_artillery_explosion") { } - class spell_igb_rocket_artillery_explosion_SpellScript : public SpellScript + class spell_igb_rocket_artillery_explosion_SpellScript : public SpellScript + { + PrepareSpellScript(spell_igb_rocket_artillery_explosion_SpellScript); + + void DamageGunship(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_igb_rocket_artillery_explosion_SpellScript); - - void DamageGunship(SpellEffIndex /*effIndex*/) - { - if (InstanceScript* instance = GetCaster()->GetInstanceScript()) - GetCaster()->CastCustomSpell(instance->GetData(DATA_TEAMID_IN_INSTANCE) == TEAM_HORDE ? SPELL_BURNING_PITCH_DAMAGE_A : SPELL_BURNING_PITCH_DAMAGE_H, SPELLVALUE_BASE_POINT0, 5000, NULL, TRIGGERED_FULL_MASK); - } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_igb_rocket_artillery_explosion_SpellScript::DamageGunship, EFFECT_0, SPELL_EFFECT_TRIGGER_MISSILE); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_igb_rocket_artillery_explosion_SpellScript(); + if (InstanceScript* instance = GetCaster()->GetInstanceScript()) + GetCaster()->CastCustomSpell(instance->GetData(DATA_TEAMID_IN_INSTANCE) == TEAM_HORDE ? SPELL_BURNING_PITCH_DAMAGE_A : SPELL_BURNING_PITCH_DAMAGE_H, SPELLVALUE_BASE_POINT0, 5000, NULL, TRIGGERED_FULL_MASK); } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_igb_rocket_artillery_explosion_SpellScript::DamageGunship, EFFECT_0, SPELL_EFFECT_TRIGGER_MISSILE); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_igb_rocket_artillery_explosion_SpellScript(); + } }; class spell_igb_below_zero : public SpellScriptLoader { - public: - spell_igb_below_zero() : SpellScriptLoader("spell_igb_below_zero") { } +public: + spell_igb_below_zero() : SpellScriptLoader("spell_igb_below_zero") { } - class spell_igb_below_zero_SpellScript : public SpellScript + class spell_igb_below_zero_SpellScript : public SpellScript + { + PrepareSpellScript(spell_igb_below_zero_SpellScript); + + void RemovePassengers() { - PrepareSpellScript(spell_igb_below_zero_SpellScript); - - void RemovePassengers() - { - GetHitUnit()->SetPower(POWER_ENERGY, 0); - GetHitUnit()->CastSpell(GetHitUnit(), SPELL_EJECT_ALL_PASSENGERS, TRIGGERED_FULL_MASK); - } - - void Register() - { - BeforeHit += SpellHitFn(spell_igb_below_zero_SpellScript::RemovePassengers); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_igb_below_zero_SpellScript(); + GetHitUnit()->SetPower(POWER_ENERGY, 0); + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_EJECT_ALL_PASSENGERS, TRIGGERED_FULL_MASK); } + + void Register() + { + BeforeHit += SpellHitFn(spell_igb_below_zero_SpellScript::RemovePassengers); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_igb_below_zero_SpellScript(); + } }; class spell_igb_on_gunship_deck : public SpellScriptLoader { - public: - spell_igb_on_gunship_deck() : SpellScriptLoader("spell_igb_on_gunship_deck") { } +public: + spell_igb_on_gunship_deck() : SpellScriptLoader("spell_igb_on_gunship_deck") { } - class spell_igb_on_gunship_deck_AuraScript : public AuraScript + class spell_igb_on_gunship_deck_AuraScript : public AuraScript + { + PrepareAuraScript(spell_igb_on_gunship_deck_AuraScript); + + bool Load() { - PrepareAuraScript(spell_igb_on_gunship_deck_AuraScript); - - bool Load() - { - if (InstanceScript* instance = GetOwner()->GetInstanceScript()) - _teamIdInInstance = TeamId(instance->GetData(DATA_TEAMID_IN_INSTANCE)); - else - _teamIdInInstance = TEAM_ALLIANCE; - return true; - } - - bool CheckAreaTarget(Unit* unit) - { - return unit->GetTypeId() == TYPEID_PLAYER; - } - - void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - bool enemy = GetSpellInfo()->Id == uint32(_teamIdInInstance == TEAM_HORDE ? SPELL_ON_SKYBREAKER_DECK : SPELL_ON_ORGRIMS_HAMMER_DECK); - if (Creature* gunship = GetOwner()->FindNearestCreature(_teamIdInInstance == TEAM_HORDE ? NPC_ORGRIMS_HAMMER : NPC_THE_SKYBREAKER, 200.0f)) - gunship->AI()->SetGUID(GetTarget()->GetGUID(), enemy ? ACTION_SHIP_VISITS_ENEMY : ACTION_SHIP_VISITS_SELF); - } - - void Register() - { - DoCheckAreaTarget += AuraCheckAreaTargetFn(spell_igb_on_gunship_deck_AuraScript::CheckAreaTarget); - AfterEffectApply += AuraEffectApplyFn(spell_igb_on_gunship_deck_AuraScript::HandleApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - - TeamId _teamIdInInstance; - }; - - AuraScript* GetAuraScript() const - { - return new spell_igb_on_gunship_deck_AuraScript(); + if (InstanceScript* instance = GetOwner()->GetInstanceScript()) + _teamIdInInstance = TeamId(instance->GetData(DATA_TEAMID_IN_INSTANCE)); + else + _teamIdInInstance = TEAM_ALLIANCE; + return true; } + + bool CheckAreaTarget(Unit* unit) + { + return unit->GetTypeId() == TYPEID_PLAYER; + } + + void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + bool enemy = GetSpellInfo()->Id == uint32(_teamIdInInstance == TEAM_HORDE ? SPELL_ON_SKYBREAKER_DECK : SPELL_ON_ORGRIMS_HAMMER_DECK); + if (Creature* gunship = GetOwner()->FindNearestCreature(_teamIdInInstance == TEAM_HORDE ? NPC_ORGRIMS_HAMMER : NPC_THE_SKYBREAKER, 200.0f)) + gunship->AI()->SetGUID(GetTarget()->GetGUID(), enemy ? ACTION_SHIP_VISITS_ENEMY : ACTION_SHIP_VISITS_SELF); + } + + void Register() + { + DoCheckAreaTarget += AuraCheckAreaTargetFn(spell_igb_on_gunship_deck_AuraScript::CheckAreaTarget); + AfterEffectApply += AuraEffectApplyFn(spell_igb_on_gunship_deck_AuraScript::HandleApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + + TeamId _teamIdInInstance; + }; + + AuraScript* GetAuraScript() const + { + return new spell_igb_on_gunship_deck_AuraScript(); + } }; class achievement_im_on_a_boat : public AchievementCriteriaScript { - public: - achievement_im_on_a_boat() : AchievementCriteriaScript("achievement_im_on_a_boat") { } +public: + achievement_im_on_a_boat() : AchievementCriteriaScript("achievement_im_on_a_boat") { } - bool OnCheck(Player* /*source*/, Unit* target) - { - return target->GetAI() && target->GetAI()->GetData(ACTION_SHIP_VISITS_ENEMY) == 1; - } + bool OnCheck(Player* /*source*/, Unit* target) + { + return target->GetAI() && target->GetAI()->GetData(ACTION_SHIP_VISITS_ENEMY) == 1; + } }; void AddSC_boss_icecrown_gunship_battle() diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp index 3e2377b9b..c5264e5e0 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp @@ -157,8 +157,8 @@ enum Phases PHASE_ONE = 2, PHASE_TWO = 3, - PHASE_INTRO_MASK = 1 << (PHASE_INTRO-1), - PHASE_ONE_MASK = 1 << (PHASE_ONE-1), + PHASE_INTRO_MASK = 1 << (PHASE_INTRO - 1), + PHASE_ONE_MASK = 1 << (PHASE_ONE - 1), }; enum DeprogrammingData @@ -195,17 +195,17 @@ Position const SummonPositions[7] = class DaranavanMoveEvent : public BasicEvent { - public: - DaranavanMoveEvent(Creature& darnavan) : _darnavan(darnavan) { } +public: + DaranavanMoveEvent(Creature& darnavan) : _darnavan(darnavan) { } - bool Execute(uint64 /*time*/, uint32 /*diff*/) override - { - _darnavan.GetMotionMaster()->MovePoint(POINT_DESPAWN, SummonPositions[6]); - return true; - } + bool Execute(uint64 /*time*/, uint32 /*diff*/) override + { + _darnavan.GetMotionMaster()->MovePoint(POINT_DESPAWN, SummonPositions[6]); + return true; + } - private: - Creature& _darnavan; +private: + Creature& _darnavan; }; void ApplyMechanicImmune(Creature* c, bool apply) @@ -225,720 +225,720 @@ void ApplyMechanicImmune(Creature* c, bool apply) class boss_lady_deathwhisper : public CreatureScript { - public: - boss_lady_deathwhisper() : CreatureScript("boss_lady_deathwhisper") { } +public: + boss_lady_deathwhisper() : CreatureScript("boss_lady_deathwhisper") { } - struct boss_lady_deathwhisperAI : public BossAI + struct boss_lady_deathwhisperAI : public BossAI + { + boss_lady_deathwhisperAI(Creature* creature) : BossAI(creature, DATA_LADY_DEATHWHISPER), _introDone(false), _darnavanGUID(0) { } + + void Reset() override { - boss_lady_deathwhisperAI(Creature* creature) : BossAI(creature, DATA_LADY_DEATHWHISPER), _introDone(false), _darnavanGUID(0) { } + if (Creature* darnavan = ObjectAccessor::GetCreature(*me, _darnavanGUID)) + darnavan->DespawnOrUnsummon(); + _darnavanGUID = 0; + _waveCounter = 0; + _Reset(); + me->SetPower(POWER_MANA, me->GetMaxPower(POWER_MANA)); + events.SetPhase(PHASE_ONE); + me->CastSpell(me, SPELL_SHADOW_CHANNELING, false); + me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false); + me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, false); + } - void Reset() override + void AttackStart(Unit* victim) override + { + if (victim && me->Attack(victim, true) && !(events.GetPhaseMask() & PHASE_ONE_MASK)) + me->GetMotionMaster()->MoveChase(victim); + } + + void EnterCombat(Unit* who) override + { + if (!instance->CheckRequiredBosses(DATA_LADY_DEATHWHISPER, who->ToPlayer())) { - if (Creature* darnavan = ObjectAccessor::GetCreature(*me, _darnavanGUID)) - darnavan->DespawnOrUnsummon(); - _darnavanGUID = 0; - _waveCounter = 0; - _Reset(); - me->SetPower(POWER_MANA, me->GetMaxPower(POWER_MANA)); - events.SetPhase(PHASE_ONE); - me->CastSpell(me, SPELL_SHADOW_CHANNELING, false); - me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false); - me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, false); + EnterEvadeMode(); + instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT); + return; } - void AttackStart(Unit* victim) override - { - if (victim && me->Attack(victim, true) && !(events.GetPhaseMask() & PHASE_ONE_MASK)) - me->GetMotionMaster()->MoveChase(victim); - } + me->setActive(true); + DoZoneInCombat(); - void EnterCombat(Unit* who) override + events.Reset(); + events.SetPhase(PHASE_ONE); + events.ScheduleEvent(EVENT_BERSERK, 600000); + events.ScheduleEvent(EVENT_SPELL_DEATH_AND_DECAY, 10000); + if (GetDifficulty() != RAID_DIFFICULTY_10MAN_NORMAL) + events.ScheduleEvent(EVENT_SPELL_DOMINATE_MIND_25, 30000); + events.ScheduleEvent(EVENT_SPELL_SHADOW_BOLT, 2000, 0, PHASE_ONE); + events.ScheduleEvent(EVENT_SUMMON_WAVE_P1, 5000, 0, PHASE_ONE); + events.ScheduleEvent(EVENT_EMPOWER_CULTIST, urand(20000, 30000), 0, PHASE_ONE); + + Talk(SAY_AGGRO); + me->RemoveAurasDueToSpell(SPELL_SHADOW_CHANNELING); + me->CastSpell(me, SPELL_MANA_BARRIER, true); + + instance->SetBossState(DATA_LADY_DEATHWHISPER, IN_PROGRESS); + } + + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override + { + if (events.GetPhaseMask() & PHASE_ONE_MASK && damage >= me->GetPower(POWER_MANA)) { - if (!instance->CheckRequiredBosses(DATA_LADY_DEATHWHISPER, who->ToPlayer())) + // reset threat + ThreatContainer::StorageType const& threatlist = me->getThreatManager().getThreatList(); + for (ThreatContainer::StorageType::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr) { - EnterEvadeMode(); - instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT); - return; + Unit* unit = ObjectAccessor::GetUnit((*me), (*itr)->getUnitGuid()); + + if (unit && DoGetThreat(unit)) + DoModifyThreatPercent(unit, -100); } - me->setActive(true); - DoZoneInCombat(); + Talk(SAY_PHASE_2); + Talk(EMOTE_PHASE_2); + DoStartMovement(me->GetVictim()); + damage -= me->GetPower(POWER_MANA); + me->SetPower(POWER_MANA, 0); + me->RemoveAurasDueToSpell(SPELL_MANA_BARRIER); + events.SetPhase(PHASE_TWO); + events.ScheduleEvent(EVENT_SPELL_FROSTBOLT, urand(10000, 12000), 0, PHASE_TWO); + events.ScheduleEvent(EVENT_SPELL_FROSTBOLT_VOLLEY, urand(19000, 21000), 0, PHASE_TWO); + events.ScheduleEvent(EVENT_SPELL_TOUCH_OF_INSIGNIFICANCE, urand(6000, 9000), 0, PHASE_TWO); + events.ScheduleEvent(EVENT_SPELL_SUMMON_SHADE, urand(12000, 15000), 0, PHASE_TWO); + if (IsHeroic()) + { + me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true); + me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, true); + events.ScheduleEvent(EVENT_SUMMON_WAVE_P2, 45000, 0, PHASE_TWO); + } + } + } - events.Reset(); - events.SetPhase(PHASE_ONE); - events.ScheduleEvent(EVENT_BERSERK, 600000); - events.ScheduleEvent(EVENT_SPELL_DEATH_AND_DECAY, 10000); - if (GetDifficulty() != RAID_DIFFICULTY_10MAN_NORMAL) - events.ScheduleEvent(EVENT_SPELL_DOMINATE_MIND_25, 30000); - events.ScheduleEvent(EVENT_SPELL_SHADOW_BOLT, 2000, 0, PHASE_ONE); - events.ScheduleEvent(EVENT_SUMMON_WAVE_P1, 5000, 0, PHASE_ONE); - events.ScheduleEvent(EVENT_EMPOWER_CULTIST, urand(20000,30000), 0, PHASE_ONE); + void UpdateAI(uint32 diff) override + { + if ((!UpdateVictim() && !(events.GetPhaseMask() & PHASE_INTRO_MASK)) || !CheckInRoom()) + return; - Talk(SAY_AGGRO); - me->RemoveAurasDueToSpell(SPELL_SHADOW_CHANNELING); - me->CastSpell(me, SPELL_MANA_BARRIER, true); + events.Update(diff); - instance->SetBossState(DATA_LADY_DEATHWHISPER, IN_PROGRESS); + if (me->HasUnitState(UNIT_STATE_CASTING) && !(events.GetPhaseMask() & PHASE_INTRO_MASK)) + return; + + switch (events.GetEvent()) + { + case 0: + break; + case EVENT_INTRO_2: + Talk(SAY_INTRO_2); + events.PopEvent(); + break; + case EVENT_INTRO_3: + Talk(SAY_INTRO_3); + events.PopEvent(); + break; + case EVENT_INTRO_4: + Talk(SAY_INTRO_4); + events.PopEvent(); + break; + case EVENT_INTRO_5: + Talk(SAY_INTRO_5); + events.PopEvent(); + break; + case EVENT_INTRO_6: + Talk(SAY_INTRO_6); + events.PopEvent(); + break; + case EVENT_INTRO_7: + Talk(SAY_INTRO_7); + events.PopEvent(); + break; + case EVENT_BERSERK: + me->CastSpell(me, SPELL_BERSERK, true); + Talk(SAY_BERSERK); + events.PopEvent(); + break; + case EVENT_SPELL_DEATH_AND_DECAY: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) + me->CastSpell(target, SPELL_DEATH_AND_DECAY, false); + events.RepeatEvent(urand(22000, 30000)); + break; + case EVENT_SPELL_DOMINATE_MIND_25: + { + Talk(SAY_DOMINATE_MIND); + + std::vector validPlayers; + Map::PlayerList const& pList = me->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr) + if (Player* plr = itr->GetSource()) + if (plr->IsAlive() && !plr->IsGameMaster() && plr->GetExactDist2dSq(me) < (150.0f * 150.0f)) + if (!me->GetVictim() || me->GetVictim()->GetGUID() != plr->GetGUID()) + { + // shouldn't be casted on any victim of summoned mobs + bool valid = true; + for (std::list::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) + if (Creature* c = ObjectAccessor::GetCreature(*me, (*itr))) + if (c->IsAlive() && c->GetVictim() && c->GetVictim()->GetGUID() == plr->GetGUID()) + { + valid = false; + break; + } + if (valid) + validPlayers.push_back(plr); + } + + std::vector::iterator begin = validPlayers.begin(), end = validPlayers.end(); + + std::random_device rd; + std::shuffle(begin, end, std::default_random_engine{rd()}); + + for (uint8 i = 0; i < RAID_MODE(0, 1, 1, 3) && i < validPlayers.size(); i++) + { + Unit* target = validPlayers[i]; + me->CastSpell(target, SPELL_DOMINATE_MIND_25, true); + } + + events.RepeatEvent(urand(40000, 45000)); + } + break; + case EVENT_SPELL_SHADOW_BOLT: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) + me->CastSpell(target, SPELL_SHADOW_BOLT, false); + events.RepeatEvent(2100); + break; + case EVENT_SUMMON_WAVE_P1: + SummonWaveP1(); + events.RepeatEvent(IsHeroic() ? 45000 : 60000); + break; + case EVENT_EMPOWER_CULTIST: + EmpowerCultist(); + events.RepeatEvent(urand(18000, 25000)); + break; + case EVENT_SPELL_FROSTBOLT: + me->CastSpell(me->GetVictim(), SPELL_FROSTBOLT, false); + events.RepeatEvent(12000); + break; + case EVENT_SPELL_FROSTBOLT_VOLLEY: + me->CastSpell((Unit*)nullptr, SPELL_FROSTBOLT_VOLLEY, false); + events.RepeatEvent(urand(13000, 15000)); + break; + case EVENT_SPELL_TOUCH_OF_INSIGNIFICANCE: + me->CastSpell(me->GetVictim(), SPELL_TOUCH_OF_INSIGNIFICANCE, false); + events.RepeatEvent(urand(6000, 9000)); + break; + case EVENT_SUMMON_WAVE_P2: + SummonWaveP2(); + events.RepeatEvent(45000); + break; + case EVENT_SPELL_SUMMON_SHADE: + { + uint8 count = 1; + if (GetDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL) + count = 2; + else if (GetDifficulty() == RAID_DIFFICULTY_25MAN_HEROIC) + count = 3; + + std::list targets; + SelectTargetList(targets, NonTankTargetSelector(me, true), count, SELECT_TARGET_RANDOM); + if (!targets.empty()) + for (std::list::iterator itr = targets.begin(); itr != targets.end(); ++itr) + me->CastSpell(*itr, SPELL_SUMMON_SHADE, true); + } + events.RepeatEvent(12000); + break; } - void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override + if (me->HasAura(SPELL_MANA_BARRIER)) + return; + + DoMeleeAttackIfReady(); + } + + void JustSummoned(Creature* summon) override + { + if (summon->GetEntry() == NPC_DARNAVAN) + _darnavanGUID = summon->GetGUID(); + else + summons.Summon(summon); + + Unit* target = nullptr; + if (summon->GetEntry() == NPC_VENGEFUL_SHADE) { - if (events.GetPhaseMask() & PHASE_ONE_MASK && damage >= me->GetPower(POWER_MANA)) + float minrange = 250.0f; + Map::PlayerList const& pl = me->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) + if (Player* p = itr->GetSource()) + if (p != me->GetVictim() && summon->GetExactDist(p) < minrange && me->CanCreatureAttack(p) && me->_CanDetectFeignDeathOf(p)) + { + target = p; + minrange = summon->GetExactDist(p); + } + + + summon->ToTempSummon()->DespawnOrUnsummon(30000); + } + else + { + target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true); + } + + summon->AI()->AttackStart(target); + } + + void SummonedCreatureDespawn(Creature* summon) override + { + summons.Despawn(summon); + } + + void JustDied(Unit* killer) override + { + Talk(SAY_DEATH); + + std::set livingAddEntries; + // Full House achievement + for (SummonList::iterator itr = summons.begin(); itr != summons.end(); ++itr) + if (Unit* unit = ObjectAccessor::GetUnit(*me, *itr)) + if (unit->IsAlive() && unit->GetEntry() != NPC_VENGEFUL_SHADE) + livingAddEntries.insert(unit->GetEntry()); + + if (livingAddEntries.size() >= 5) + instance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_FULL_HOUSE, 0, me); + + if (Creature* darnavan = ObjectAccessor::GetCreature(*me, _darnavanGUID)) + { + if (darnavan->IsAlive()) { - // reset threat - ThreatContainer::StorageType const& threatlist = me->getThreatManager().getThreatList(); - for (ThreatContainer::StorageType::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr) + darnavan->RemoveAllAuras(); + darnavan->setFaction(35); + darnavan->DeleteThreatList(); + darnavan->CombatStop(true); + darnavan->GetMotionMaster()->MoveIdle(); + darnavan->StopMoving(); + darnavan->SetReactState(REACT_PASSIVE); + darnavan->m_Events.AddEvent(new DaranavanMoveEvent(*darnavan), darnavan->m_Events.CalculateTime(10000)); + darnavan->AI()->Talk(SAY_DARNAVAN_RESCUED); + if (Player* owner = killer->GetCharmerOrOwnerPlayerOrPlayerItself()) { - Unit* unit = ObjectAccessor::GetUnit((*me), (*itr)->getUnitGuid()); - - if (unit && DoGetThreat(unit)) - DoModifyThreatPercent(unit, -100); - } - - Talk(SAY_PHASE_2); - Talk(EMOTE_PHASE_2); - DoStartMovement(me->GetVictim()); - damage -= me->GetPower(POWER_MANA); - me->SetPower(POWER_MANA, 0); - me->RemoveAurasDueToSpell(SPELL_MANA_BARRIER); - events.SetPhase(PHASE_TWO); - events.ScheduleEvent(EVENT_SPELL_FROSTBOLT, urand(10000,12000), 0, PHASE_TWO); - events.ScheduleEvent(EVENT_SPELL_FROSTBOLT_VOLLEY, urand(19000,21000), 0, PHASE_TWO); - events.ScheduleEvent(EVENT_SPELL_TOUCH_OF_INSIGNIFICANCE, urand(6000, 9000), 0, PHASE_TWO); - events.ScheduleEvent(EVENT_SPELL_SUMMON_SHADE, urand(12000,15000), 0, PHASE_TWO); - if (IsHeroic()) - { - me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true); - me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, true); - events.ScheduleEvent(EVENT_SUMMON_WAVE_P2, 45000, 0, PHASE_TWO); + if (Group* group = owner->GetGroup()) + { + for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) + if (Player* member = itr->GetSource()) + if (member->IsInMap(owner)) + member->KilledMonsterCredit(NPC_DARNAVAN_CREDIT, 0); + } + else + owner->KilledMonsterCredit(NPC_DARNAVAN_CREDIT, 0); } } } - void UpdateAI(uint32 diff) override + _JustDied(); + } + + void KilledUnit(Unit* victim) override + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_KILL); + } + + void DoAction(int32 action) override + { + if (action != ACTION_START_INTRO) + return; + + if (!_introDone && !me->IsInCombat()) { - if ((!UpdateVictim() && !(events.GetPhaseMask() & PHASE_INTRO_MASK)) || !CheckInRoom()) - return; + _introDone = true; + Talk(SAY_INTRO_1); + events.SetPhase(PHASE_INTRO); + events.ScheduleEvent(EVENT_INTRO_2, 11000, 0, PHASE_INTRO); + events.ScheduleEvent(EVENT_INTRO_3, 21000, 0, PHASE_INTRO); + events.ScheduleEvent(EVENT_INTRO_4, 31500, 0, PHASE_INTRO); + events.ScheduleEvent(EVENT_INTRO_5, 39500, 0, PHASE_INTRO); + events.ScheduleEvent(EVENT_INTRO_6, 48500, 0, PHASE_INTRO); + events.ScheduleEvent(EVENT_INTRO_7, 58000, 0, PHASE_INTRO); + } + } - events.Update(diff); + void SummonWaveP1() + { + uint8 addIndex = _waveCounter & 1; + uint8 addIndexOther = uint8(addIndex ^ 1); - if (me->HasUnitState(UNIT_STATE_CASTING) && !(events.GetPhaseMask() & PHASE_INTRO_MASK)) - return; + // Summon first add, replace it with Darnavan if weekly quest is active + if (_waveCounter || instance->GetData(DATA_WEEKLY_QUEST_ID) != QUEST_DEPROGRAMMING_10) + Summon(SummonEntries[addIndex], SummonPositions[addIndex * 3]); + else + Summon(NPC_DARNAVAN, SummonPositions[addIndex * 3]); - switch (events.GetEvent()) - { - case 0: - break; - case EVENT_INTRO_2: - Talk(SAY_INTRO_2); - events.PopEvent(); - break; - case EVENT_INTRO_3: - Talk(SAY_INTRO_3); - events.PopEvent(); - break; - case EVENT_INTRO_4: - Talk(SAY_INTRO_4); - events.PopEvent(); - break; - case EVENT_INTRO_5: - Talk(SAY_INTRO_5); - events.PopEvent(); - break; - case EVENT_INTRO_6: - Talk(SAY_INTRO_6); - events.PopEvent(); - break; - case EVENT_INTRO_7: - Talk(SAY_INTRO_7); - events.PopEvent(); - break; - case EVENT_BERSERK: - me->CastSpell(me, SPELL_BERSERK, true); - Talk(SAY_BERSERK); - events.PopEvent(); - break; - case EVENT_SPELL_DEATH_AND_DECAY: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) - me->CastSpell(target, SPELL_DEATH_AND_DECAY, false); - events.RepeatEvent(urand(22000, 30000)); - break; - case EVENT_SPELL_DOMINATE_MIND_25: - { - Talk(SAY_DOMINATE_MIND); - - std::vector validPlayers; - Map::PlayerList const &pList = me->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr) - if (Player* plr = itr->GetSource()) - if (plr->IsAlive() && !plr->IsGameMaster() && plr->GetExactDist2dSq(me) < (150.0f * 150.0f)) - if (!me->GetVictim() || me->GetVictim()->GetGUID() != plr->GetGUID()) - { - // shouldn't be casted on any victim of summoned mobs - bool valid = true; - for (std::list::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) - if (Creature* c = ObjectAccessor::GetCreature(*me, (*itr))) - if (c->IsAlive() && c->GetVictim() && c->GetVictim()->GetGUID() == plr->GetGUID()) - { - valid = false; - break; - } - if (valid) - validPlayers.push_back(plr); - } - - std::vector::iterator begin=validPlayers.begin(), end=validPlayers.end(); - - std::random_device rd; - std::shuffle(begin, end, std::default_random_engine{rd()}); - - for (uint8 i = 0; i < RAID_MODE(0, 1, 1, 3) && i < validPlayers.size(); i++) - { - Unit* target = validPlayers[i]; - me->CastSpell(target, SPELL_DOMINATE_MIND_25, true); - } - - events.RepeatEvent(urand(40000, 45000)); - } - break; - case EVENT_SPELL_SHADOW_BOLT: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) - me->CastSpell(target, SPELL_SHADOW_BOLT, false); - events.RepeatEvent(2100); - break; - case EVENT_SUMMON_WAVE_P1: - SummonWaveP1(); - events.RepeatEvent(IsHeroic() ? 45000 : 60000); - break; - case EVENT_EMPOWER_CULTIST: - EmpowerCultist(); - events.RepeatEvent(urand(18000,25000)); - break; - case EVENT_SPELL_FROSTBOLT: - me->CastSpell(me->GetVictim(), SPELL_FROSTBOLT, false); - events.RepeatEvent(12000); - break; - case EVENT_SPELL_FROSTBOLT_VOLLEY: - me->CastSpell((Unit*)nullptr, SPELL_FROSTBOLT_VOLLEY, false); - events.RepeatEvent(urand(13000,15000)); - break; - case EVENT_SPELL_TOUCH_OF_INSIGNIFICANCE: - me->CastSpell(me->GetVictim(), SPELL_TOUCH_OF_INSIGNIFICANCE, false); - events.RepeatEvent(urand(6000, 9000)); - break; - case EVENT_SUMMON_WAVE_P2: - SummonWaveP2(); - events.RepeatEvent(45000); - break; - case EVENT_SPELL_SUMMON_SHADE: - { - uint8 count = 1; - if (GetDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL) - count = 2; - else if (GetDifficulty() == RAID_DIFFICULTY_25MAN_HEROIC) - count = 3; - - std::list targets; - SelectTargetList(targets, NonTankTargetSelector(me, true), count, SELECT_TARGET_RANDOM); - if (!targets.empty()) - for (std::list::iterator itr = targets.begin(); itr != targets.end(); ++itr) - me->CastSpell(*itr, SPELL_SUMMON_SHADE, true); - } - events.RepeatEvent(12000); - break; - } - - if (me->HasAura(SPELL_MANA_BARRIER)) - return; - - DoMeleeAttackIfReady(); + Summon(SummonEntries[addIndexOther], SummonPositions[addIndex * 3 + 1]); + Summon(SummonEntries[addIndex], SummonPositions[addIndex * 3 + 2]); + if (Is25ManRaid()) + { + Summon(SummonEntries[addIndexOther], SummonPositions[addIndexOther * 3]); + Summon(SummonEntries[addIndex], SummonPositions[addIndexOther * 3 + 1]); + Summon(SummonEntries[addIndexOther], SummonPositions[addIndexOther * 3 + 2]); + Summon(SummonEntries[urand(0, 1)], SummonPositions[6]); } - void JustSummoned(Creature* summon) override - { - if (summon->GetEntry() == NPC_DARNAVAN) - _darnavanGUID = summon->GetGUID(); - else - summons.Summon(summon); + ++_waveCounter; + } - Unit* target = nullptr; - if (summon->GetEntry() == NPC_VENGEFUL_SHADE) - { - float minrange = 250.0f; - Map::PlayerList const& pl = me->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) - if (Player* p = itr->GetSource()) - if (p != me->GetVictim() && summon->GetExactDist(p) < minrange && me->CanCreatureAttack(p) && me->_CanDetectFeignDeathOf(p)) - { - target = p; - minrange = summon->GetExactDist(p); - } - - - summon->ToTempSummon()->DespawnOrUnsummon(30000); - } - else - { - target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true); - } - - summon->AI()->AttackStart(target); - } - - void SummonedCreatureDespawn(Creature* summon) override - { - summons.Despawn(summon); - } - - void JustDied(Unit* killer) override - { - Talk(SAY_DEATH); - - std::set livingAddEntries; - // Full House achievement - for (SummonList::iterator itr = summons.begin(); itr != summons.end(); ++itr) - if (Unit* unit = ObjectAccessor::GetUnit(*me, *itr)) - if (unit->IsAlive() && unit->GetEntry() != NPC_VENGEFUL_SHADE) - livingAddEntries.insert(unit->GetEntry()); - - if (livingAddEntries.size() >= 5) - instance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_FULL_HOUSE, 0, me); - - if (Creature* darnavan = ObjectAccessor::GetCreature(*me, _darnavanGUID)) - { - if (darnavan->IsAlive()) - { - darnavan->RemoveAllAuras(); - darnavan->setFaction(35); - darnavan->DeleteThreatList(); - darnavan->CombatStop(true); - darnavan->GetMotionMaster()->MoveIdle(); - darnavan->StopMoving(); - darnavan->SetReactState(REACT_PASSIVE); - darnavan->m_Events.AddEvent(new DaranavanMoveEvent(*darnavan), darnavan->m_Events.CalculateTime(10000)); - darnavan->AI()->Talk(SAY_DARNAVAN_RESCUED); - if (Player* owner = killer->GetCharmerOrOwnerPlayerOrPlayerItself()) - { - if (Group* group = owner->GetGroup()) - { - for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) - if (Player* member = itr->GetSource()) - if (member->IsInMap(owner)) - member->KilledMonsterCredit(NPC_DARNAVAN_CREDIT, 0); - } - else - owner->KilledMonsterCredit(NPC_DARNAVAN_CREDIT, 0); - } - } - } - - _JustDied(); - } - - void KilledUnit(Unit* victim) override - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_KILL); - } - - void DoAction(int32 action) override - { - if (action != ACTION_START_INTRO) - return; - - if (!_introDone && !me->IsInCombat()) - { - _introDone = true; - Talk(SAY_INTRO_1); - events.SetPhase(PHASE_INTRO); - events.ScheduleEvent(EVENT_INTRO_2, 11000, 0, PHASE_INTRO); - events.ScheduleEvent(EVENT_INTRO_3, 21000, 0, PHASE_INTRO); - events.ScheduleEvent(EVENT_INTRO_4, 31500, 0, PHASE_INTRO); - events.ScheduleEvent(EVENT_INTRO_5, 39500, 0, PHASE_INTRO); - events.ScheduleEvent(EVENT_INTRO_6, 48500, 0, PHASE_INTRO); - events.ScheduleEvent(EVENT_INTRO_7, 58000, 0, PHASE_INTRO); - } - } - - void SummonWaveP1() + void SummonWaveP2() + { + if (Is25ManRaid()) { uint8 addIndex = _waveCounter & 1; - uint8 addIndexOther = uint8(addIndex ^ 1); - - // Summon first add, replace it with Darnavan if weekly quest is active - if (_waveCounter || instance->GetData(DATA_WEEKLY_QUEST_ID) != QUEST_DEPROGRAMMING_10) - Summon(SummonEntries[addIndex], SummonPositions[addIndex * 3]); - else - Summon(NPC_DARNAVAN, SummonPositions[addIndex * 3]); - - Summon(SummonEntries[addIndexOther], SummonPositions[addIndex * 3 + 1]); + Summon(SummonEntries[addIndex], SummonPositions[addIndex * 3]); + Summon(SummonEntries[addIndex ^ 1], SummonPositions[addIndex * 3 + 1]); Summon(SummonEntries[addIndex], SummonPositions[addIndex * 3 + 2]); - if (Is25ManRaid()) - { - Summon(SummonEntries[addIndexOther], SummonPositions[addIndexOther * 3]); - Summon(SummonEntries[addIndex], SummonPositions[addIndexOther * 3 + 1]); - Summon(SummonEntries[addIndexOther], SummonPositions[addIndexOther * 3 + 2]); - Summon(SummonEntries[urand(0, 1)], SummonPositions[6]); - } - - ++_waveCounter; } + else + Summon(SummonEntries[urand(0, 1)], SummonPositions[6]); - void SummonWaveP2() - { - if (Is25ManRaid()) - { - uint8 addIndex = _waveCounter & 1; - Summon(SummonEntries[addIndex], SummonPositions[addIndex * 3]); - Summon(SummonEntries[addIndex ^ 1], SummonPositions[addIndex * 3 + 1]); - Summon(SummonEntries[addIndex], SummonPositions[addIndex * 3+ 2]); - } - else - Summon(SummonEntries[urand(0, 1)], SummonPositions[6]); - - ++_waveCounter; - } - - // helper for summoning wave mobs - void Summon(uint32 entry, const Position& pos) - { - if (me->SummonCreature(entry, pos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000)) - if (TempSummon* trigger = me->SummonCreature(WORLD_TRIGGER, pos, TEMPSUMMON_TIMED_DESPAWN, 2000)) - { - trigger->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); - trigger->CastSpell(trigger, SPELL_TELEPORT_VISUAL, true); - } - } - - void EmpowerCultist() - { - if (summons.empty()) - return; - - std::list temp; - for (SummonList::iterator itr = summons.begin(); itr != summons.end(); ++itr) - if (Creature* cre = ObjectAccessor::GetCreature(*me, *itr)) - if (cre->IsAlive() && (cre->GetEntry() == NPC_CULT_FANATIC || cre->GetEntry() == NPC_CULT_ADHERENT)) - temp.push_back(cre); - - // noone to empower - if (temp.empty()) - return; - - // select random cultist - Creature* cultist = acore::Containers::SelectRandomContainerElement(temp); - if (!cultist) - return; - - if (RAND(0, 1)) - me->CastSpell(cultist, SPELL_DARK_MARTYRDOM_T); - else - { - me->CastSpell(cultist, cultist->GetEntry() == NPC_CULT_FANATIC ? SPELL_DARK_TRANSFORMATION_T : SPELL_DARK_EMPOWERMENT_T, true); - Talk(uint8(cultist->GetEntry() == NPC_CULT_FANATIC ? SAY_DARK_TRANSFORMATION : SAY_DARK_EMPOWERMENT)); - } - } - - void SpellHitTarget(Unit* target, SpellInfo const* spell) override - { - if (spell->Id == SPELL_DOMINATE_MIND_25) - { - const int32 val = 100; - target->CastCustomSpell(target, 73261, &val, nullptr, nullptr, true); // scale aura, +100% size - } - } - - private: - bool _introDone; - uint64 _darnavanGUID; - uint32 _waveCounter; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetIcecrownCitadelAI(creature); + ++_waveCounter; } + + // helper for summoning wave mobs + void Summon(uint32 entry, const Position& pos) + { + if (me->SummonCreature(entry, pos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000)) + if (TempSummon* trigger = me->SummonCreature(WORLD_TRIGGER, pos, TEMPSUMMON_TIMED_DESPAWN, 2000)) + { + trigger->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); + trigger->CastSpell(trigger, SPELL_TELEPORT_VISUAL, true); + } + } + + void EmpowerCultist() + { + if (summons.empty()) + return; + + std::list temp; + for (SummonList::iterator itr = summons.begin(); itr != summons.end(); ++itr) + if (Creature* cre = ObjectAccessor::GetCreature(*me, *itr)) + if (cre->IsAlive() && (cre->GetEntry() == NPC_CULT_FANATIC || cre->GetEntry() == NPC_CULT_ADHERENT)) + temp.push_back(cre); + + // noone to empower + if (temp.empty()) + return; + + // select random cultist + Creature* cultist = acore::Containers::SelectRandomContainerElement(temp); + if (!cultist) + return; + + if (RAND(0, 1)) + me->CastSpell(cultist, SPELL_DARK_MARTYRDOM_T); + else + { + me->CastSpell(cultist, cultist->GetEntry() == NPC_CULT_FANATIC ? SPELL_DARK_TRANSFORMATION_T : SPELL_DARK_EMPOWERMENT_T, true); + Talk(uint8(cultist->GetEntry() == NPC_CULT_FANATIC ? SAY_DARK_TRANSFORMATION : SAY_DARK_EMPOWERMENT)); + } + } + + void SpellHitTarget(Unit* target, SpellInfo const* spell) override + { + if (spell->Id == SPELL_DOMINATE_MIND_25) + { + const int32 val = 100; + target->CastCustomSpell(target, 73261, &val, nullptr, nullptr, true); // scale aura, +100% size + } + } + + private: + bool _introDone; + uint64 _darnavanGUID; + uint32 _waveCounter; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetIcecrownCitadelAI(creature); + } }; class npc_cult_fanatic : public CreatureScript { - public: - npc_cult_fanatic() : CreatureScript("npc_cult_fanatic") { } +public: + npc_cult_fanatic() : CreatureScript("npc_cult_fanatic") { } - struct npc_cult_fanaticAI : public ScriptedAI + struct npc_cult_fanaticAI : public ScriptedAI + { + npc_cult_fanaticAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) {} + + EventMap events; + InstanceScript* _instance; + + void Reset() override { - npc_cult_fanaticAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) {} - - EventMap events; - InstanceScript* _instance; - - void Reset() override - { - events.Reset(); - events.ScheduleEvent(EVENT_SPELL_FANATIC_NECROTIC_STRIKE, urand(10000, 12000)); - events.ScheduleEvent(EVENT_SPELL_FANATIC_SHADOW_CLEAVE, urand(14000, 16000)); - events.ScheduleEvent(EVENT_SPELL_FANATIC_VAMPIRIC_MIGHT, urand(20000, 27000)); - } - - void SpellHit(Unit* /*caster*/, SpellInfo const* spell) override - { - switch (spell->Id) - { - case SPELL_DARK_TRANSFORMATION: - me->UpdateEntry(NPC_DEFORMED_FANATIC); - break; - case SPELL_DARK_TRANSFORMATION_T: - me->InterruptNonMeleeSpells(true); - me->CastSpell(me, SPELL_DARK_TRANSFORMATION, false); - break; - case SPELL_DARK_MARTYRDOM_T: - me->SetReactState(REACT_PASSIVE); - me->InterruptNonMeleeSpells(true); - ApplyMechanicImmune(me, true); - me->AttackStop(); - me->GetMotionMaster()->MovementExpired(); - me->GetMotionMaster()->MoveIdle(); - me->StopMoving(); - me->CastSpell(me, SPELL_DARK_MARTYRDOM_FANATIC, false); - break; - case SPELL_DARK_MARTYRDOM_FANATIC: - case SPELL_DARK_MARTYRDOM_FANATIC_10H: - case SPELL_DARK_MARTYRDOM_FANATIC_25N: - case SPELL_DARK_MARTYRDOM_FANATIC_25H: - ApplyMechanicImmune(me, false); - events.ScheduleEvent(EVENT_SPELL_CULTIST_DARK_MARTYRDOM, 5); // Visual purposes only. - break; - } - } - - void EnterCombat(Unit* /*who*/) override { DoZoneInCombat(); } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.GetEvent()) - { - case EVENT_SPELL_FANATIC_NECROTIC_STRIKE: - me->CastSpell(me->GetVictim(), SPELL_NECROTIC_STRIKE, false); - events.RepeatEvent(urand(11000, 13000)); - break; - case EVENT_SPELL_FANATIC_SHADOW_CLEAVE: - me->CastSpell(me->GetVictim(), SPELL_SHADOW_CLEAVE, false); - events.RepeatEvent(urand(9500, 11000)); - break; - case EVENT_SPELL_FANATIC_VAMPIRIC_MIGHT: - me->CastSpell(me, SPELL_VAMPIRIC_MIGHT, false); - events.RepeatEvent(urand(20000, 27000)); - break; - case EVENT_CULTIST_DARK_MARTYRDOM_REVIVE: - me->RemoveAurasDueToSpell(SPELL_PERMANENT_FEIGN_DEATH); - me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); - me->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); - me->UpdateEntry(NPC_REANIMATED_FANATIC); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED | UNIT_FLAG_UNK_29 | UNIT_FLAG_NOT_SELECTABLE); - me->SetReactState(REACT_AGGRESSIVE); - DoZoneInCombat(me); - me->CastSpell(me, SPELL_FANATIC_S_DETERMINATION); - - if (Creature* ladyDeathwhisper = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_LADY_DEATHWHISPER))) - ladyDeathwhisper->AI()->Talk(SAY_ANIMATE_DEAD); - events.PopEvent(); - break; - case EVENT_SPELL_CULTIST_DARK_MARTYRDOM: - me->CastSpell(me, SPELL_PERMANENT_FEIGN_DEATH, true); - me->CastSpell(me, SPELL_CLEAR_ALL_DEBUFFS, true); - me->CastSpell(me, SPELL_FULL_HEAL, true); - me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); - me->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED | UNIT_FLAG_UNK_29 | UNIT_FLAG_NOT_SELECTABLE); - Reset(); - events.ScheduleEvent(EVENT_CULTIST_DARK_MARTYRDOM_REVIVE, 6000); - break; - default: - break; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetIcecrownCitadelAI(creature); + events.Reset(); + events.ScheduleEvent(EVENT_SPELL_FANATIC_NECROTIC_STRIKE, urand(10000, 12000)); + events.ScheduleEvent(EVENT_SPELL_FANATIC_SHADOW_CLEAVE, urand(14000, 16000)); + events.ScheduleEvent(EVENT_SPELL_FANATIC_VAMPIRIC_MIGHT, urand(20000, 27000)); } + + void SpellHit(Unit* /*caster*/, SpellInfo const* spell) override + { + switch (spell->Id) + { + case SPELL_DARK_TRANSFORMATION: + me->UpdateEntry(NPC_DEFORMED_FANATIC); + break; + case SPELL_DARK_TRANSFORMATION_T: + me->InterruptNonMeleeSpells(true); + me->CastSpell(me, SPELL_DARK_TRANSFORMATION, false); + break; + case SPELL_DARK_MARTYRDOM_T: + me->SetReactState(REACT_PASSIVE); + me->InterruptNonMeleeSpells(true); + ApplyMechanicImmune(me, true); + me->AttackStop(); + me->GetMotionMaster()->MovementExpired(); + me->GetMotionMaster()->MoveIdle(); + me->StopMoving(); + me->CastSpell(me, SPELL_DARK_MARTYRDOM_FANATIC, false); + break; + case SPELL_DARK_MARTYRDOM_FANATIC: + case SPELL_DARK_MARTYRDOM_FANATIC_10H: + case SPELL_DARK_MARTYRDOM_FANATIC_25N: + case SPELL_DARK_MARTYRDOM_FANATIC_25H: + ApplyMechanicImmune(me, false); + events.ScheduleEvent(EVENT_SPELL_CULTIST_DARK_MARTYRDOM, 5); // Visual purposes only. + break; + } + } + + void EnterCombat(Unit* /*who*/) override { DoZoneInCombat(); } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.GetEvent()) + { + case EVENT_SPELL_FANATIC_NECROTIC_STRIKE: + me->CastSpell(me->GetVictim(), SPELL_NECROTIC_STRIKE, false); + events.RepeatEvent(urand(11000, 13000)); + break; + case EVENT_SPELL_FANATIC_SHADOW_CLEAVE: + me->CastSpell(me->GetVictim(), SPELL_SHADOW_CLEAVE, false); + events.RepeatEvent(urand(9500, 11000)); + break; + case EVENT_SPELL_FANATIC_VAMPIRIC_MIGHT: + me->CastSpell(me, SPELL_VAMPIRIC_MIGHT, false); + events.RepeatEvent(urand(20000, 27000)); + break; + case EVENT_CULTIST_DARK_MARTYRDOM_REVIVE: + me->RemoveAurasDueToSpell(SPELL_PERMANENT_FEIGN_DEATH); + me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); + me->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); + me->UpdateEntry(NPC_REANIMATED_FANATIC); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED | UNIT_FLAG_UNK_29 | UNIT_FLAG_NOT_SELECTABLE); + me->SetReactState(REACT_AGGRESSIVE); + DoZoneInCombat(me); + me->CastSpell(me, SPELL_FANATIC_S_DETERMINATION); + + if (Creature* ladyDeathwhisper = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_LADY_DEATHWHISPER))) + ladyDeathwhisper->AI()->Talk(SAY_ANIMATE_DEAD); + events.PopEvent(); + break; + case EVENT_SPELL_CULTIST_DARK_MARTYRDOM: + me->CastSpell(me, SPELL_PERMANENT_FEIGN_DEATH, true); + me->CastSpell(me, SPELL_CLEAR_ALL_DEBUFFS, true); + me->CastSpell(me, SPELL_FULL_HEAL, true); + me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); + me->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED | UNIT_FLAG_UNK_29 | UNIT_FLAG_NOT_SELECTABLE); + Reset(); + events.ScheduleEvent(EVENT_CULTIST_DARK_MARTYRDOM_REVIVE, 6000); + break; + default: + break; + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetIcecrownCitadelAI(creature); + } }; class npc_cult_adherent : public CreatureScript { - public: - npc_cult_adherent() : CreatureScript("npc_cult_adherent") { } +public: + npc_cult_adherent() : CreatureScript("npc_cult_adherent") { } - struct npc_cult_adherentAI : public ScriptedAI + struct npc_cult_adherentAI : public ScriptedAI + { + npc_cult_adherentAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) {} + + EventMap events; + InstanceScript* _instance; + + void Reset() override { - npc_cult_adherentAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) {} - - EventMap events; - InstanceScript* _instance; - - void Reset() override - { - events.Reset(); - events.ScheduleEvent(EVENT_SPELL_ADHERENT_FROST_FEVER, urand(10000, 12000)); - events.ScheduleEvent(EVENT_SPELL_ADHERENT_DEATHCHILL, urand(14000, 16000)); - events.ScheduleEvent(EVENT_SPELL_ADHERENT_CURSE_OF_TORPOR, urand(14000, 16000)); - events.ScheduleEvent(EVENT_SPELL_ADHERENT_SHROUD_OF_THE_OCCULT, urand(32000, 39000)); - } - - void SpellHit(Unit* /*caster*/, SpellInfo const* spell) override - { - switch (spell->Id) - { - case SPELL_DARK_EMPOWERMENT: - me->UpdateEntry(NPC_EMPOWERED_ADHERENT); - break; - case SPELL_DARK_EMPOWERMENT_T: - me->InterruptNonMeleeSpells(true); - me->CastSpell(me, SPELL_DARK_EMPOWERMENT, false); - break; - case SPELL_DARK_MARTYRDOM_T: - me->SetReactState(REACT_PASSIVE); - me->InterruptNonMeleeSpells(true); - ApplyMechanicImmune(me, true); - me->AttackStop(); - me->GetMotionMaster()->MovementExpired(); - me->GetMotionMaster()->MoveIdle(); - me->StopMoving(); - me->CastSpell(me, SPELL_DARK_MARTYRDOM_ADHERENT, false); - break; - case SPELL_DARK_MARTYRDOM_ADHERENT: - case SPELL_DARK_MARTYRDOM_ADHERENT_10H: - case SPELL_DARK_MARTYRDOM_ADHERENT_25N: - case SPELL_DARK_MARTYRDOM_ADHERENT_25H: - ApplyMechanicImmune(me, false); - events.ScheduleEvent(EVENT_SPELL_CULTIST_DARK_MARTYRDOM, 5); // Visual purposes only. - break; - } - } - - void EnterCombat(Unit* /*who*/) override { DoZoneInCombat(); } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.GetEvent()) - { - case EVENT_SPELL_ADHERENT_FROST_FEVER: - me->CastSpell(me->GetVictim(), SPELL_FROST_FEVER, false); - events.RepeatEvent(urand(9000, 13000)); - break; - case EVENT_SPELL_ADHERENT_DEATHCHILL: - if (me->GetEntry() == NPC_EMPOWERED_ADHERENT) - me->CastSpell(me->GetVictim(), SPELL_DEATHCHILL_BLAST, false); - else - me->CastSpell(me->GetVictim(), SPELL_DEATHCHILL_BOLT, false); - events.RepeatEvent(urand(9000, 13000)); - break; - case EVENT_SPELL_ADHERENT_CURSE_OF_TORPOR: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1)) - me->CastSpell(target, SPELL_CURSE_OF_TORPOR, false); - events.RepeatEvent(urand(9000, 13000)); - break; - case EVENT_SPELL_ADHERENT_SHROUD_OF_THE_OCCULT: - me->CastSpell(me, SPELL_SHORUD_OF_THE_OCCULT, false); - events.RepeatEvent(urand(27000, 32000)); - break; - case EVENT_CULTIST_DARK_MARTYRDOM_REVIVE: - me->RemoveAurasDueToSpell(SPELL_PERMANENT_FEIGN_DEATH); - me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); - me->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); - me->UpdateEntry(NPC_REANIMATED_ADHERENT); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED | UNIT_FLAG_UNK_29 | UNIT_FLAG_NOT_SELECTABLE); - me->SetReactState(REACT_AGGRESSIVE); - DoZoneInCombat(me); - me->CastSpell(me, SPELL_ADHERENT_S_DETERMINATION); - - if (Creature* ladyDeathwhisper = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_LADY_DEATHWHISPER))) - ladyDeathwhisper->AI()->Talk(SAY_ANIMATE_DEAD); - events.PopEvent(); - break; - case EVENT_SPELL_CULTIST_DARK_MARTYRDOM: - me->CastSpell(me, SPELL_PERMANENT_FEIGN_DEATH, true); - me->CastSpell(me, SPELL_CLEAR_ALL_DEBUFFS, true); - me->CastSpell(me, SPELL_FULL_HEAL, true); - me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); - me->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED | UNIT_FLAG_UNK_29 | UNIT_FLAG_NOT_SELECTABLE); - Reset(); - events.ScheduleEvent(EVENT_CULTIST_DARK_MARTYRDOM_REVIVE, 6000); - break; - default: - break; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetIcecrownCitadelAI(creature); + events.Reset(); + events.ScheduleEvent(EVENT_SPELL_ADHERENT_FROST_FEVER, urand(10000, 12000)); + events.ScheduleEvent(EVENT_SPELL_ADHERENT_DEATHCHILL, urand(14000, 16000)); + events.ScheduleEvent(EVENT_SPELL_ADHERENT_CURSE_OF_TORPOR, urand(14000, 16000)); + events.ScheduleEvent(EVENT_SPELL_ADHERENT_SHROUD_OF_THE_OCCULT, urand(32000, 39000)); } + + void SpellHit(Unit* /*caster*/, SpellInfo const* spell) override + { + switch (spell->Id) + { + case SPELL_DARK_EMPOWERMENT: + me->UpdateEntry(NPC_EMPOWERED_ADHERENT); + break; + case SPELL_DARK_EMPOWERMENT_T: + me->InterruptNonMeleeSpells(true); + me->CastSpell(me, SPELL_DARK_EMPOWERMENT, false); + break; + case SPELL_DARK_MARTYRDOM_T: + me->SetReactState(REACT_PASSIVE); + me->InterruptNonMeleeSpells(true); + ApplyMechanicImmune(me, true); + me->AttackStop(); + me->GetMotionMaster()->MovementExpired(); + me->GetMotionMaster()->MoveIdle(); + me->StopMoving(); + me->CastSpell(me, SPELL_DARK_MARTYRDOM_ADHERENT, false); + break; + case SPELL_DARK_MARTYRDOM_ADHERENT: + case SPELL_DARK_MARTYRDOM_ADHERENT_10H: + case SPELL_DARK_MARTYRDOM_ADHERENT_25N: + case SPELL_DARK_MARTYRDOM_ADHERENT_25H: + ApplyMechanicImmune(me, false); + events.ScheduleEvent(EVENT_SPELL_CULTIST_DARK_MARTYRDOM, 5); // Visual purposes only. + break; + } + } + + void EnterCombat(Unit* /*who*/) override { DoZoneInCombat(); } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.GetEvent()) + { + case EVENT_SPELL_ADHERENT_FROST_FEVER: + me->CastSpell(me->GetVictim(), SPELL_FROST_FEVER, false); + events.RepeatEvent(urand(9000, 13000)); + break; + case EVENT_SPELL_ADHERENT_DEATHCHILL: + if (me->GetEntry() == NPC_EMPOWERED_ADHERENT) + me->CastSpell(me->GetVictim(), SPELL_DEATHCHILL_BLAST, false); + else + me->CastSpell(me->GetVictim(), SPELL_DEATHCHILL_BOLT, false); + events.RepeatEvent(urand(9000, 13000)); + break; + case EVENT_SPELL_ADHERENT_CURSE_OF_TORPOR: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1)) + me->CastSpell(target, SPELL_CURSE_OF_TORPOR, false); + events.RepeatEvent(urand(9000, 13000)); + break; + case EVENT_SPELL_ADHERENT_SHROUD_OF_THE_OCCULT: + me->CastSpell(me, SPELL_SHORUD_OF_THE_OCCULT, false); + events.RepeatEvent(urand(27000, 32000)); + break; + case EVENT_CULTIST_DARK_MARTYRDOM_REVIVE: + me->RemoveAurasDueToSpell(SPELL_PERMANENT_FEIGN_DEATH); + me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); + me->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); + me->UpdateEntry(NPC_REANIMATED_ADHERENT); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED | UNIT_FLAG_UNK_29 | UNIT_FLAG_NOT_SELECTABLE); + me->SetReactState(REACT_AGGRESSIVE); + DoZoneInCombat(me); + me->CastSpell(me, SPELL_ADHERENT_S_DETERMINATION); + + if (Creature* ladyDeathwhisper = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_LADY_DEATHWHISPER))) + ladyDeathwhisper->AI()->Talk(SAY_ANIMATE_DEAD); + events.PopEvent(); + break; + case EVENT_SPELL_CULTIST_DARK_MARTYRDOM: + me->CastSpell(me, SPELL_PERMANENT_FEIGN_DEATH, true); + me->CastSpell(me, SPELL_CLEAR_ALL_DEBUFFS, true); + me->CastSpell(me, SPELL_FULL_HEAL, true); + me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); + me->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED | UNIT_FLAG_UNK_29 | UNIT_FLAG_NOT_SELECTABLE); + Reset(); + events.ScheduleEvent(EVENT_CULTIST_DARK_MARTYRDOM_REVIVE, 6000); + break; + default: + break; + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetIcecrownCitadelAI(creature); + } }; class npc_vengeful_shade : public CreatureScript { - public: - npc_vengeful_shade() : CreatureScript("npc_vengeful_shade") { } +public: + npc_vengeful_shade() : CreatureScript("npc_vengeful_shade") { } - struct npc_vengeful_shadeAI : public ScriptedAI + struct npc_vengeful_shadeAI : public ScriptedAI + { + npc_vengeful_shadeAI(Creature* creature) : ScriptedAI(creature) { - npc_vengeful_shadeAI(Creature* creature) : ScriptedAI(creature) + me->SetControlled(true, UNIT_STATE_ROOT); + unroot_timer = 500; + targetGUID = 0; + } + + uint16 unroot_timer; + uint64 targetGUID; + + void Reset() override + { + me->setAttackTimer(BASE_ATTACK, 2000); + me->AddAura(SPELL_VENGEFUL_BLAST_PASSIVE, me); + } + + void AttackStart(Unit* who) override + { + if (!who) + return; + ScriptedAI::AttackStart(who); + if (!targetGUID) { - me->SetControlled(true, UNIT_STATE_ROOT); - unroot_timer = 500; - targetGUID = 0; + me->getThreatManager().resetAllAggro(); + me->AddThreat(who, 1000000.0f); + targetGUID = who->GetGUID(); } + } - uint16 unroot_timer; - uint64 targetGUID; - - void Reset() override + void SpellHitTarget(Unit* /*target*/, SpellInfo const* spell) override + { + switch (spell->Id) { - me->setAttackTimer(BASE_ATTACK, 2000); - me->AddAura(SPELL_VENGEFUL_BLAST_PASSIVE, me); - } - - void AttackStart(Unit* who) override - { - if (!who) - return; - ScriptedAI::AttackStart(who); - if (!targetGUID) - { - me->getThreatManager().resetAllAggro(); - me->AddThreat(who, 1000000.0f); - targetGUID = who->GetGUID(); - } - } - - void SpellHitTarget(Unit* /*target*/, SpellInfo const* spell) override - { - switch (spell->Id) - { case SPELL_VENGEFUL_BLAST_10N: case SPELL_VENGEFUL_BLAST_25N: case SPELL_VENGEFUL_BLAST_10H: @@ -950,214 +950,214 @@ class npc_vengeful_shade : public CreatureScript break; default: break; - } } + } - void UpdateAI(uint32 diff) override + void UpdateAI(uint32 diff) override + { + if (unroot_timer) { - if (unroot_timer) + if (unroot_timer <= diff) { - if (unroot_timer <= diff) - { - me->SetControlled(false, UNIT_STATE_ROOT); - me->SetInCombatWithZone(); - unroot_timer = 0; - } - else - { - unroot_timer -= diff; - return; - } + me->SetControlled(false, UNIT_STATE_ROOT); + me->SetInCombatWithZone(); + unroot_timer = 0; } - - UpdateVictim(); - - if (!me->GetVictim() || me->GetVictim()->GetGUID() != targetGUID) + else { - me->DespawnOrUnsummon(1); + unroot_timer -= diff; return; } - - DoMeleeAttackIfReady(); } - void MoveInLineOfSight(Unit* /*who*/) override {} - void EnterEvadeMode() override {} - }; + UpdateVictim(); - CreatureAI* GetAI(Creature* creature) const override - { - return GetIcecrownCitadelAI(creature); + if (!me->GetVictim() || me->GetVictim()->GetGUID() != targetGUID) + { + me->DespawnOrUnsummon(1); + return; + } + + DoMeleeAttackIfReady(); } + + void MoveInLineOfSight(Unit* /*who*/) override {} + void EnterEvadeMode() override {} + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetIcecrownCitadelAI(creature); + } }; class npc_darnavan : public CreatureScript { - public: - npc_darnavan() : CreatureScript("npc_darnavan") { } +public: + npc_darnavan() : CreatureScript("npc_darnavan") { } - struct npc_darnavanAI : public ScriptedAI + struct npc_darnavanAI : public ScriptedAI + { + npc_darnavanAI(Creature* creature) : ScriptedAI(creature) {} + + EventMap events; + bool _canCharge; + bool _canShatter; + + void Reset() override { - npc_darnavanAI(Creature* creature) : ScriptedAI(creature) {} - - EventMap events; - bool _canCharge; - bool _canShatter; - - void Reset() override - { - events.Reset(); - events.ScheduleEvent(EVENT_DARNAVAN_BLADESTORM, 10000); - events.ScheduleEvent(EVENT_DARNAVAN_INTIMIDATING_SHOUT, urand(20000, 25000)); - events.ScheduleEvent(EVENT_DARNAVAN_MORTAL_STRIKE, urand(25000, 30000)); - events.ScheduleEvent(EVENT_DARNAVAN_SUNDER_ARMOR, urand(5000, 8000)); - _canCharge = true; - _canShatter = true; - } - - void JustDied(Unit* killer) override - { - events.Reset(); - if (Player* owner = killer->GetCharmerOrOwnerPlayerOrPlayerItself()) - { - if (Group* group = owner->GetGroup()) - { - for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) - if (Player* member = itr->GetSource()) - if (member->IsInMap(owner)) - member->FailQuest(QUEST_DEPROGRAMMING); - } - else - owner->FailQuest(QUEST_DEPROGRAMMING); - } - } - - void MovementInform(uint32 type, uint32 id) override - { - if (type != POINT_MOTION_TYPE || id != POINT_DESPAWN) - return; - - me->DespawnOrUnsummon(); - } - - void EnterCombat(Unit* /*victim*/) override - { - DoZoneInCombat(); - Talk(SAY_DARNAVAN_AGGRO); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - if (_canShatter && me->GetVictim() && me->GetVictim()->IsImmunedToDamageOrSchool(SPELL_SCHOOL_MASK_NORMAL)) - { - me->CastSpell(me->GetVictim(), SPELL_SHATTERING_THROW, false); - _canShatter = false; - events.ScheduleEvent(EVENT_DARNAVAN_SHATTERING_THROW, 30000); - return; - } - - if (_canCharge && !me->IsWithinMeleeRange(me->GetVictim())) - { - me->CastSpell(me->GetVictim(), SPELL_CHARGE, false); - _canCharge = false; - events.ScheduleEvent(EVENT_DARNAVAN_CHARGE, 20000); - return; - } - - switch (events.GetEvent()) - { - case EVENT_DARNAVAN_BLADESTORM: - me->CastSpell((Unit*)nullptr, SPELL_BLADESTORM, false); - events.RepeatEvent(urand(90000, 100000)); - break; - case EVENT_DARNAVAN_CHARGE: - _canCharge = true; - events.PopEvent(); - break; - case EVENT_DARNAVAN_INTIMIDATING_SHOUT: - me->CastSpell((Unit*)nullptr, SPELL_INTIMIDATING_SHOUT, false); - events.RepeatEvent(urand(90000, 120000)); - break; - case EVENT_DARNAVAN_MORTAL_STRIKE: - me->CastSpell(me->GetVictim(), SPELL_MORTAL_STRIKE, false); - events.RepeatEvent(urand(15000, 30000)); - break; - case EVENT_DARNAVAN_SHATTERING_THROW: - _canShatter = true; - events.PopEvent(); - break; - case EVENT_DARNAVAN_SUNDER_ARMOR: - me->CastSpell(me->GetVictim(), SPELL_SUNDER_ARMOR, false); - events.RepeatEvent(urand(3000, 7000)); - break; - default: - break; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetIcecrownCitadelAI(creature); + events.Reset(); + events.ScheduleEvent(EVENT_DARNAVAN_BLADESTORM, 10000); + events.ScheduleEvent(EVENT_DARNAVAN_INTIMIDATING_SHOUT, urand(20000, 25000)); + events.ScheduleEvent(EVENT_DARNAVAN_MORTAL_STRIKE, urand(25000, 30000)); + events.ScheduleEvent(EVENT_DARNAVAN_SUNDER_ARMOR, urand(5000, 8000)); + _canCharge = true; + _canShatter = true; } + + void JustDied(Unit* killer) override + { + events.Reset(); + if (Player* owner = killer->GetCharmerOrOwnerPlayerOrPlayerItself()) + { + if (Group* group = owner->GetGroup()) + { + for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) + if (Player* member = itr->GetSource()) + if (member->IsInMap(owner)) + member->FailQuest(QUEST_DEPROGRAMMING); + } + else + owner->FailQuest(QUEST_DEPROGRAMMING); + } + } + + void MovementInform(uint32 type, uint32 id) override + { + if (type != POINT_MOTION_TYPE || id != POINT_DESPAWN) + return; + + me->DespawnOrUnsummon(); + } + + void EnterCombat(Unit* /*victim*/) override + { + DoZoneInCombat(); + Talk(SAY_DARNAVAN_AGGRO); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + if (_canShatter && me->GetVictim() && me->GetVictim()->IsImmunedToDamageOrSchool(SPELL_SCHOOL_MASK_NORMAL)) + { + me->CastSpell(me->GetVictim(), SPELL_SHATTERING_THROW, false); + _canShatter = false; + events.ScheduleEvent(EVENT_DARNAVAN_SHATTERING_THROW, 30000); + return; + } + + if (_canCharge && !me->IsWithinMeleeRange(me->GetVictim())) + { + me->CastSpell(me->GetVictim(), SPELL_CHARGE, false); + _canCharge = false; + events.ScheduleEvent(EVENT_DARNAVAN_CHARGE, 20000); + return; + } + + switch (events.GetEvent()) + { + case EVENT_DARNAVAN_BLADESTORM: + me->CastSpell((Unit*)nullptr, SPELL_BLADESTORM, false); + events.RepeatEvent(urand(90000, 100000)); + break; + case EVENT_DARNAVAN_CHARGE: + _canCharge = true; + events.PopEvent(); + break; + case EVENT_DARNAVAN_INTIMIDATING_SHOUT: + me->CastSpell((Unit*)nullptr, SPELL_INTIMIDATING_SHOUT, false); + events.RepeatEvent(urand(90000, 120000)); + break; + case EVENT_DARNAVAN_MORTAL_STRIKE: + me->CastSpell(me->GetVictim(), SPELL_MORTAL_STRIKE, false); + events.RepeatEvent(urand(15000, 30000)); + break; + case EVENT_DARNAVAN_SHATTERING_THROW: + _canShatter = true; + events.PopEvent(); + break; + case EVENT_DARNAVAN_SUNDER_ARMOR: + me->CastSpell(me->GetVictim(), SPELL_SUNDER_ARMOR, false); + events.RepeatEvent(urand(3000, 7000)); + break; + default: + break; + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetIcecrownCitadelAI(creature); + } }; class spell_deathwhisper_mana_barrier : public SpellScriptLoader { - public: - spell_deathwhisper_mana_barrier() : SpellScriptLoader("spell_deathwhisper_mana_barrier") { } +public: + spell_deathwhisper_mana_barrier() : SpellScriptLoader("spell_deathwhisper_mana_barrier") { } - class spell_deathwhisper_mana_barrier_AuraScript : public AuraScript + class spell_deathwhisper_mana_barrier_AuraScript : public AuraScript + { + PrepareAuraScript(spell_deathwhisper_mana_barrier_AuraScript); + + void HandlePeriodicTick(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_deathwhisper_mana_barrier_AuraScript); - - void HandlePeriodicTick(AuraEffect const* /*aurEff*/) + PreventDefaultAction(); + if (Unit* caster = GetCaster()) { - PreventDefaultAction(); - if (Unit* caster = GetCaster()) - { - int32 missingHealth = int32(caster->GetMaxHealth() - caster->GetHealth()); - caster->ModifyHealth(missingHealth); - caster->ModifyPower(POWER_MANA, -missingHealth); - } + int32 missingHealth = int32(caster->GetMaxHealth() - caster->GetHealth()); + caster->ModifyHealth(missingHealth); + caster->ModifyPower(POWER_MANA, -missingHealth); } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_deathwhisper_mana_barrier_AuraScript::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_deathwhisper_mana_barrier_AuraScript(); } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_deathwhisper_mana_barrier_AuraScript::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_deathwhisper_mana_barrier_AuraScript(); + } }; class at_lady_deathwhisper_entrance : public AreaTriggerScript { - public: - at_lady_deathwhisper_entrance() : AreaTriggerScript("at_lady_deathwhisper_entrance") { } +public: + at_lady_deathwhisper_entrance() : AreaTriggerScript("at_lady_deathwhisper_entrance") { } - bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) override - { - if (InstanceScript* instance = player->GetInstanceScript()) - if (instance->GetBossState(DATA_LADY_DEATHWHISPER) != DONE) - if (!player->IsGameMaster()) - if (Creature* ladyDeathwhisper = ObjectAccessor::GetCreature(*player, instance->GetData64(DATA_LADY_DEATHWHISPER))) - ladyDeathwhisper->AI()->DoAction(ACTION_START_INTRO); - return true; - } + bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) override + { + if (InstanceScript* instance = player->GetInstanceScript()) + if (instance->GetBossState(DATA_LADY_DEATHWHISPER) != DONE) + if (!player->IsGameMaster()) + if (Creature* ladyDeathwhisper = ObjectAccessor::GetCreature(*player, instance->GetData64(DATA_LADY_DEATHWHISPER))) + ladyDeathwhisper->AI()->DoAction(ACTION_START_INTRO); + return true; + } }; void AddSC_boss_lady_deathwhisper() diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp index 8ef58f590..f93237aaa 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp @@ -61,246 +61,246 @@ uint32 const boneSpikeSummonId[3] = {69062, 72669, 72670}; struct BoneStormMoveTargetSelector : public acore::unary_function { - public: - BoneStormMoveTargetSelector(Creature* source) : _source(source) { } - bool operator()(Unit const* target) const - { - if (!target) - return false; +public: + BoneStormMoveTargetSelector(Creature* source) : _source(source) { } + bool operator()(Unit const* target) const + { + if (!target) + return false; - if (target->GetExactDist(_source) > 175.0f) - return false; + if (target->GetExactDist(_source) > 175.0f) + return false; - if (target->GetTypeId() != TYPEID_PLAYER) - return false; + if (target->GetTypeId() != TYPEID_PLAYER) + return false; - if (target->GetPositionX() > -337.0f) - return false; + if (target->GetPositionX() > -337.0f) + return false; - return target != _source->GetVictim(); - } + return target != _source->GetVictim(); + } - private: - Creature const* _source; +private: + Creature const* _source; }; class boss_lord_marrowgar : public CreatureScript { - public: - boss_lord_marrowgar() : CreatureScript("boss_lord_marrowgar") { } +public: + boss_lord_marrowgar() : CreatureScript("boss_lord_marrowgar") { } - struct boss_lord_marrowgarAI : public BossAI + struct boss_lord_marrowgarAI : public BossAI + { + boss_lord_marrowgarAI(Creature* creature) : BossAI(creature, DATA_LORD_MARROWGAR) { - boss_lord_marrowgarAI(Creature* creature) : BossAI(creature, DATA_LORD_MARROWGAR) + _introDone = false; + _boneSlice = false; + } + + bool _introDone; + bool _boneSlice; + uint64 _lastBoneSliceTargets[3]; + + void Reset() + { + me->SetReactState(REACT_AGGRESSIVE); + _Reset(); + events.ScheduleEvent(EVENT_ENABLE_BONE_SLICE, 10000); + events.ScheduleEvent(EVENT_SPELL_BONE_SPIKE_GRAVEYARD, urand(10000, 15000)); + events.ScheduleEvent(EVENT_SPELL_COLDFLAME, 5000); + events.ScheduleEvent(EVENT_WARN_BONE_STORM, urand(45000, 50000)); + events.ScheduleEvent(EVENT_ENRAGE, 600000); + + _boneSlice = false; + memset(_lastBoneSliceTargets, 0, 3 * sizeof(uint64)); + + instance->SetData(DATA_BONED_ACHIEVEMENT, uint32(true)); + } + + void EnterCombat(Unit* /*who*/) + { + Talk(SAY_AGGRO); + me->setActive(true); + DoZoneInCombat(); + instance->SetBossState(DATA_LORD_MARROWGAR, IN_PROGRESS); + } + + void SpellHitTarget(Unit* target, const SpellInfo* spell) + { + if (target && (spell->Id == 69055 || spell->Id == 70814)) // Bone Slice (Saber Lash) + for (uint8 i = 0; i < 3; ++i) + if (!_lastBoneSliceTargets[i]) + { + _lastBoneSliceTargets[i] = target->GetGUID(); + break; + } + } + + uint64 GetGUID(int32 id) const + { + if (id >= 0 && id <= 2) + return _lastBoneSliceTargets[id]; + + return (uint64)0; + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim() || !CheckInRoom()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.GetEvent()) { - _introDone = false; - _boneSlice = false; + case 0: + break; + case EVENT_ENABLE_BONE_SLICE: + _boneSlice = true; + events.PopEvent(); + break; + case EVENT_SPELL_BONE_SPIKE_GRAVEYARD: + { + bool a = me->HasAura(SPELL_BONE_STORM); + if (IsHeroic() || !a) + me->CastSpell(me, SPELL_BONE_SPIKE_GRAVEYARD, a); + events.RepeatEvent(urand(15000, 20000)); + } + break; + case EVENT_SPELL_COLDFLAME: + if (!me->HasAura(SPELL_BONE_STORM)) + me->CastSpell((Unit*)NULL, SPELL_COLDFLAME_NORMAL, false); + events.RepeatEvent(5000); + break; + case EVENT_SPELL_COLDFLAME_BONE_STORM: + me->CastSpell(me, SPELL_COLDFLAME_BONE_STORM, false); + events.PopEvent(); + break; + case EVENT_WARN_BONE_STORM: + _boneSlice = false; + Talk(EMOTE_BONE_STORM); + Talk(SAY_BONE_STORM); + me->FinishSpell(CURRENT_MELEE_SPELL, false); + me->CastSpell(me, SPELL_BONE_STORM, false); + me->SetReactState(REACT_PASSIVE); // to prevent chasing another target on UpdateVictim() + me->GetMotionMaster()->MoveIdle(); + me->GetMotionMaster()->MovementExpired(); + events.RepeatEvent(urand(90000, 95000)); + events.ScheduleEvent(EVENT_BEGIN_BONE_STORM, 3050); + break; + case EVENT_BEGIN_BONE_STORM: + { + uint32 _boneStormDuration = RAID_MODE(20000, 30000, 20000, 30000); + if (Aura* pStorm = me->GetAura(SPELL_BONE_STORM)) + pStorm->SetDuration(int32(_boneStormDuration)); + events.PopEvent(); + events.ScheduleEvent(EVENT_BONE_STORM_MOVE, 0); + events.ScheduleEvent(EVENT_END_BONE_STORM, _boneStormDuration + 1); + } + break; + case EVENT_BONE_STORM_MOVE: + { + if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == POINT_MOTION_TYPE) + { + events.RepeatEvent(1); + break; + } + events.RepeatEvent(5000); + Unit* unit = SelectTarget(SELECT_TARGET_RANDOM, 0, BoneStormMoveTargetSelector(me)); + if (!unit) + { + if ((unit = SelectTarget(SELECT_TARGET_TOPAGGRO, 0, 175.0f, true))) + if (unit->GetPositionX() > -337.0f) + { + EnterEvadeMode(); + return; + } + } + if (unit) + me->GetMotionMaster()->MoveCharge(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ(), 25.0f, 1337); + break; + } + break; + case EVENT_END_BONE_STORM: + me->StopMoving(); + me->GetMotionMaster()->MovementExpired(); + me->SetReactState(REACT_AGGRESSIVE); + DoStartMovement(me->GetVictim()); + events.PopEvent(); + events.CancelEvent(EVENT_BONE_STORM_MOVE); + events.ScheduleEvent(EVENT_ENABLE_BONE_SLICE, 10000); + if (!IsHeroic()) + events.RescheduleEvent(EVENT_SPELL_BONE_SPIKE_GRAVEYARD, urand(15000, 20000)); + break; + case EVENT_ENRAGE: + me->CastSpell(me, SPELL_BERSERK, true); + Talk(SAY_BERSERK); + events.PopEvent(); + break; } - bool _introDone; - bool _boneSlice; - uint64 _lastBoneSliceTargets[3]; + if (me->HasAura(SPELL_BONE_STORM)) + return; - void Reset() - { - me->SetReactState(REACT_AGGRESSIVE); - _Reset(); - events.ScheduleEvent(EVENT_ENABLE_BONE_SLICE, 10000); - events.ScheduleEvent(EVENT_SPELL_BONE_SPIKE_GRAVEYARD, urand(10000, 15000)); - events.ScheduleEvent(EVENT_SPELL_COLDFLAME, 5000); - events.ScheduleEvent(EVENT_WARN_BONE_STORM, urand(45000, 50000)); - events.ScheduleEvent(EVENT_ENRAGE, 600000); + if (_boneSlice && !me->GetCurrentSpell(CURRENT_MELEE_SPELL)) + DoCastVictim(SPELL_BONE_SLICE); - _boneSlice = false; + if (_boneSlice && me->isAttackReady() && me->GetVictim() && !me->HasUnitState(UNIT_STATE_CASTING) && me->IsWithinMeleeRange(me->GetVictim())) memset(_lastBoneSliceTargets, 0, 3 * sizeof(uint64)); - instance->SetData(DATA_BONED_ACHIEVEMENT, uint32(true)); - } - - void EnterCombat(Unit* /*who*/) - { - Talk(SAY_AGGRO); - me->setActive(true); - DoZoneInCombat(); - instance->SetBossState(DATA_LORD_MARROWGAR, IN_PROGRESS); - } - - void SpellHitTarget(Unit* target, const SpellInfo* spell) - { - if (target && (spell->Id == 69055 || spell->Id == 70814)) // Bone Slice (Saber Lash) - for (uint8 i=0; i<3; ++i) - if (!_lastBoneSliceTargets[i]) - { - _lastBoneSliceTargets[i] = target->GetGUID(); - break; - } - } - - uint64 GetGUID(int32 id) const - { - if (id >= 0 && id <= 2) - return _lastBoneSliceTargets[id]; - - return (uint64)0; - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim() || !CheckInRoom()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.GetEvent()) - { - case 0: - break; - case EVENT_ENABLE_BONE_SLICE: - _boneSlice = true; - events.PopEvent(); - break; - case EVENT_SPELL_BONE_SPIKE_GRAVEYARD: - { - bool a = me->HasAura(SPELL_BONE_STORM); - if (IsHeroic() || !a) - me->CastSpell(me, SPELL_BONE_SPIKE_GRAVEYARD, a); - events.RepeatEvent(urand(15000, 20000)); - } - break; - case EVENT_SPELL_COLDFLAME: - if (!me->HasAura(SPELL_BONE_STORM)) - me->CastSpell((Unit*)NULL, SPELL_COLDFLAME_NORMAL, false); - events.RepeatEvent(5000); - break; - case EVENT_SPELL_COLDFLAME_BONE_STORM: - me->CastSpell(me, SPELL_COLDFLAME_BONE_STORM, false); - events.PopEvent(); - break; - case EVENT_WARN_BONE_STORM: - _boneSlice = false; - Talk(EMOTE_BONE_STORM); - Talk(SAY_BONE_STORM); - me->FinishSpell(CURRENT_MELEE_SPELL, false); - me->CastSpell(me, SPELL_BONE_STORM, false); - me->SetReactState(REACT_PASSIVE); // to prevent chasing another target on UpdateVictim() - me->GetMotionMaster()->MoveIdle(); - me->GetMotionMaster()->MovementExpired(); - events.RepeatEvent(urand(90000, 95000)); - events.ScheduleEvent(EVENT_BEGIN_BONE_STORM, 3050); - break; - case EVENT_BEGIN_BONE_STORM: - { - uint32 _boneStormDuration = RAID_MODE(20000, 30000, 20000, 30000); - if (Aura* pStorm = me->GetAura(SPELL_BONE_STORM)) - pStorm->SetDuration(int32(_boneStormDuration)); - events.PopEvent(); - events.ScheduleEvent(EVENT_BONE_STORM_MOVE, 0); - events.ScheduleEvent(EVENT_END_BONE_STORM, _boneStormDuration+1); - } - break; - case EVENT_BONE_STORM_MOVE: - { - if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == POINT_MOTION_TYPE) - { - events.RepeatEvent(1); - break; - } - events.RepeatEvent(5000); - Unit* unit = SelectTarget(SELECT_TARGET_RANDOM, 0, BoneStormMoveTargetSelector(me)); - if (!unit) - { - if ((unit = SelectTarget(SELECT_TARGET_TOPAGGRO, 0, 175.0f, true))) - if (unit->GetPositionX() > -337.0f) - { - EnterEvadeMode(); - return; - } - } - if (unit) - me->GetMotionMaster()->MoveCharge(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ(), 25.0f, 1337); - break; - } - break; - case EVENT_END_BONE_STORM: - me->StopMoving(); - me->GetMotionMaster()->MovementExpired(); - me->SetReactState(REACT_AGGRESSIVE); - DoStartMovement(me->GetVictim()); - events.PopEvent(); - events.CancelEvent(EVENT_BONE_STORM_MOVE); - events.ScheduleEvent(EVENT_ENABLE_BONE_SLICE, 10000); - if (!IsHeroic()) - events.RescheduleEvent(EVENT_SPELL_BONE_SPIKE_GRAVEYARD, urand(15000, 20000)); - break; - case EVENT_ENRAGE: - me->CastSpell(me, SPELL_BERSERK, true); - Talk(SAY_BERSERK); - events.PopEvent(); - break; - } - - if (me->HasAura(SPELL_BONE_STORM)) - return; - - if (_boneSlice && !me->GetCurrentSpell(CURRENT_MELEE_SPELL)) - DoCastVictim(SPELL_BONE_SLICE); - - if (_boneSlice && me->isAttackReady() && me->GetVictim() && !me->HasUnitState(UNIT_STATE_CASTING) && me->IsWithinMeleeRange(me->GetVictim())) - memset(_lastBoneSliceTargets, 0, 3 * sizeof(uint64)); - - DoMeleeAttackIfReady(); - } - - void MovementInform(uint32 type, uint32 id) - { - if (type != POINT_MOTION_TYPE || id != 1337) - return; - - events.ScheduleEvent(EVENT_SPELL_COLDFLAME_BONE_STORM, 0); - } - - void JustDied(Unit* /*killer*/) - { - Talk(SAY_DEATH); - _JustDied(); - } - - void JustReachedHome() - { - _JustReachedHome(); - instance->SetBossState(DATA_LORD_MARROWGAR, FAIL); - } - - void KilledUnit(Unit* victim) - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_KILL); - } - - void MoveInLineOfSight(Unit* who) - { - if (!_introDone && me->IsAlive() && who->GetTypeId() == TYPEID_PLAYER && me->GetExactDist2dSq(who) <= 10000.0f) // 100*100, moveinlineofsight limited to 60yd anyway - { - Talk(SAY_ENTER_ZONE); - _introDone = true; - } - - BossAI::MoveInLineOfSight(who); - } - - bool CanAIAttack(Unit const* target) const - { - return target->GetPositionX() < -337.0f; // main gate - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + DoMeleeAttackIfReady(); } + + void MovementInform(uint32 type, uint32 id) + { + if (type != POINT_MOTION_TYPE || id != 1337) + return; + + events.ScheduleEvent(EVENT_SPELL_COLDFLAME_BONE_STORM, 0); + } + + void JustDied(Unit* /*killer*/) + { + Talk(SAY_DEATH); + _JustDied(); + } + + void JustReachedHome() + { + _JustReachedHome(); + instance->SetBossState(DATA_LORD_MARROWGAR, FAIL); + } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_KILL); + } + + void MoveInLineOfSight(Unit* who) + { + if (!_introDone && me->IsAlive() && who->GetTypeId() == TYPEID_PLAYER && me->GetExactDist2dSq(who) <= 10000.0f) // 100*100, moveinlineofsight limited to 60yd anyway + { + Talk(SAY_ENTER_ZONE); + _introDone = true; + } + + BossAI::MoveInLineOfSight(who); + } + + bool CanAIAttack(Unit const* target) const + { + return target->GetPositionX() < -337.0f; // main gate + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class npc_coldflame : public CreatureScript @@ -333,18 +333,18 @@ public: break; case 1: { - me->m_positionZ = 42.5f; - me->DisableSpline(); - me->CastSpell(me, SPELL_COLDFLAME_SUMMON, true); - float nx = me->GetPositionX()+5.0f*cos(me->GetOrientation()); - float ny = me->GetPositionY()+5.0f*sin(me->GetOrientation()); - if (!me->IsWithinLOS(nx, ny, 42.5f)) - { - events.PopEvent(); - break; - } - me->NearTeleportTo(nx, ny, 42.5f, me->GetOrientation()); - events.RepeatEvent(450); + me->m_positionZ = 42.5f; + me->DisableSpline(); + me->CastSpell(me, SPELL_COLDFLAME_SUMMON, true); + float nx = me->GetPositionX() + 5.0f * cos(me->GetOrientation()); + float ny = me->GetPositionY() + 5.0f * sin(me->GetOrientation()); + if (!me->IsWithinLOS(nx, ny, 42.5f)) + { + events.PopEvent(); + break; + } + me->NearTeleportTo(nx, ny, 42.5f, me->GetOrientation()); + events.RepeatEvent(450); } break; case 2: @@ -491,15 +491,15 @@ public: { Unit* caster = GetCaster(); float angle = caster->GetAngle(GetHitUnit()); - float dist = caster->GetObjectSize()/2.0f; - float z = caster->GetPositionZ()+2.5f; - float nx = caster->GetPositionX()+dist*cos(angle); - float ny = caster->GetPositionY()+dist*sin(angle); + float dist = caster->GetObjectSize() / 2.0f; + float z = caster->GetPositionZ() + 2.5f; + float nx = caster->GetPositionX() + dist * cos(angle); + float ny = caster->GetPositionY() + dist * sin(angle); if (!caster->IsWithinLOS(nx, ny, z)) { - nx = caster->GetPositionX()+0.5f*cos(angle); - ny = caster->GetPositionY()+0.5f*sin(angle); + nx = caster->GetPositionX() + 0.5f * cos(angle); + ny = caster->GetPositionY() + 0.5f * sin(angle); } if (caster->IsWithinLOS(nx, ny, z)) @@ -541,7 +541,7 @@ public: uint8 boneSpikeCount = uint8(GetCaster()->GetMap()->GetSpawnMode() & 1 ? 3 : 1); std::vector validPlayers; - Map::PlayerList const &pList = marrowgar->GetMap()->GetPlayers(); + Map::PlayerList const& pList = marrowgar->GetMap()->GetPlayers(); for (Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr) if (Player* plr = itr->GetSource()) if (plr->IsAlive() && !plr->IsGameMaster() && plr->GetExactDist2dSq(marrowgar) < (150.0f * 150.0f) && !plr->HasAura(SPELL_IMPALED)) @@ -549,7 +549,7 @@ public: if (plr->GetGUID() != marrowgarAI->GetGUID(0) && plr->GetGUID() != marrowgarAI->GetGUID(1) && plr->GetGUID() != marrowgarAI->GetGUID(2)) // not a bone slice target validPlayers.push_back(plr); - std::vector::iterator begin=validPlayers.begin(), end=validPlayers.end(); + std::vector::iterator begin = validPlayers.begin(), end = validPlayers.end(); std::random_device rd; std::shuffle(begin, end, std::default_random_engine{rd()}); @@ -581,114 +581,114 @@ public: class spell_marrowgar_coldflame_bonestorm : public SpellScriptLoader { - public: - spell_marrowgar_coldflame_bonestorm() : SpellScriptLoader("spell_marrowgar_coldflame_bonestorm") { } +public: + spell_marrowgar_coldflame_bonestorm() : SpellScriptLoader("spell_marrowgar_coldflame_bonestorm") { } - class spell_marrowgar_coldflame_SpellScript : public SpellScript + class spell_marrowgar_coldflame_SpellScript : public SpellScript + { + PrepareSpellScript(spell_marrowgar_coldflame_SpellScript); + + void HandleScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_marrowgar_coldflame_SpellScript); - - void HandleScriptEffect(SpellEffIndex effIndex) + PreventHitDefaultEffect(effIndex); + Unit* caster = GetCaster(); + float x = caster->GetPositionX(); + float y = caster->GetPositionY(); + float z = caster->GetPositionZ() + 2.5f; + for (uint8 i = 0; i < 4; ++i) { - PreventHitDefaultEffect(effIndex); - Unit* caster = GetCaster(); - float x = caster->GetPositionX(); - float y = caster->GetPositionY(); - float z = caster->GetPositionZ()+2.5f; - for (uint8 i = 0; i < 4; ++i) + float nx = x + 2.5f * cos((M_PI / 4) + (i * (M_PI / 2))); + float ny = y + 2.5f * sin((M_PI / 4) + (i * (M_PI / 2))); + if (caster->IsWithinLOS(nx, ny, z)) { - float nx = x+2.5f*cos((M_PI/4)+(i*(M_PI/2))); - float ny = y+2.5f*sin((M_PI/4)+(i*(M_PI/2))); - if (caster->IsWithinLOS(nx, ny, z)) - { - caster->m_orientation = (M_PI/4)+(i*(M_PI/2)); - caster->CastSpell(nx, ny, z, uint32(GetEffectValue() + i), true); - } + caster->m_orientation = (M_PI / 4) + (i * (M_PI / 2)); + caster->CastSpell(nx, ny, z, uint32(GetEffectValue() + i), true); } } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_marrowgar_coldflame_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_marrowgar_coldflame_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_marrowgar_coldflame_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_marrowgar_coldflame_SpellScript(); + } }; class spell_marrowgar_bone_storm : public SpellScriptLoader { - public: - spell_marrowgar_bone_storm() : SpellScriptLoader("spell_marrowgar_bone_storm") { } +public: + spell_marrowgar_bone_storm() : SpellScriptLoader("spell_marrowgar_bone_storm") { } - class spell_marrowgar_bone_storm_SpellScript : public SpellScript + class spell_marrowgar_bone_storm_SpellScript : public SpellScript + { + PrepareSpellScript(spell_marrowgar_bone_storm_SpellScript); + + void RecalculateDamage() { - PrepareSpellScript(spell_marrowgar_bone_storm_SpellScript); - - void RecalculateDamage() - { - float dist = GetHitUnit()->GetExactDist2d(GetCaster()); - if (dist >= 9.0f) dist -= 9.0f; - else dist = 0.0f; - SetHitDamage(int32(GetHitDamage() / std::max(sqrtf(dist), 1.0f))); - } - - void Register() - { - OnHit += SpellHitFn(spell_marrowgar_bone_storm_SpellScript::RecalculateDamage); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_marrowgar_bone_storm_SpellScript(); + float dist = GetHitUnit()->GetExactDist2d(GetCaster()); + if (dist >= 9.0f) dist -= 9.0f; + else dist = 0.0f; + SetHitDamage(int32(GetHitDamage() / std::max(sqrtf(dist), 1.0f))); } + + void Register() + { + OnHit += SpellHitFn(spell_marrowgar_bone_storm_SpellScript::RecalculateDamage); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_marrowgar_bone_storm_SpellScript(); + } }; class spell_marrowgar_bone_slice : public SpellScriptLoader { - public: - spell_marrowgar_bone_slice() : SpellScriptLoader("spell_marrowgar_bone_slice") { } +public: + spell_marrowgar_bone_slice() : SpellScriptLoader("spell_marrowgar_bone_slice") { } - class spell_marrowgar_bone_slice_SpellScript : public SpellScript + class spell_marrowgar_bone_slice_SpellScript : public SpellScript + { + PrepareSpellScript(spell_marrowgar_bone_slice_SpellScript); + + bool Load() { - PrepareSpellScript(spell_marrowgar_bone_slice_SpellScript); - - bool Load() - { - _targetCount = 0; - return true; - } - - void CountTargets(std::list& targets) - { - _targetCount = std::min(targets.size(), GetSpellInfo()->MaxAffectedTargets); - } - - void SplitDamage() - { - if (!_targetCount) - return; // This spell can miss all targets - - SetHitDamage(GetHitDamage() / _targetCount); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_marrowgar_bone_slice_SpellScript::CountTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); - OnHit += SpellHitFn(spell_marrowgar_bone_slice_SpellScript::SplitDamage); - } - - uint32 _targetCount; - }; - - SpellScript* GetSpellScript() const - { - return new spell_marrowgar_bone_slice_SpellScript(); + _targetCount = 0; + return true; } + + void CountTargets(std::list& targets) + { + _targetCount = std::min(targets.size(), GetSpellInfo()->MaxAffectedTargets); + } + + void SplitDamage() + { + if (!_targetCount) + return; // This spell can miss all targets + + SetHitDamage(GetHitDamage() / _targetCount); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_marrowgar_bone_slice_SpellScript::CountTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); + OnHit += SpellHitFn(spell_marrowgar_bone_slice_SpellScript::SplitDamage); + } + + uint32 _targetCount; + }; + + SpellScript* GetSpellScript() const + { + return new spell_marrowgar_bone_slice_SpellScript(); + } }; void AddSC_boss_lord_marrowgar() diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp index 0e3b3b488..4c35d8fba 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp @@ -137,32 +137,32 @@ Position const tablePos = {4356.190f, 3262.90f, 389.4820f, 1.483530f}; class AbominationDespawner { - public: - explicit AbominationDespawner(Unit* owner) : _owner(owner) { } +public: + explicit AbominationDespawner(Unit* owner) : _owner(owner) { } - bool operator()(uint64 guid) + bool operator()(uint64 guid) + { + if (Unit* summon = ObjectAccessor::GetUnit(*_owner, guid)) { - if (Unit* summon = ObjectAccessor::GetUnit(*_owner, guid)) + if (summon->GetEntry() == NPC_MUTATED_ABOMINATION_10 || summon->GetEntry() == NPC_MUTATED_ABOMINATION_25) { - if (summon->GetEntry() == NPC_MUTATED_ABOMINATION_10 || summon->GetEntry() == NPC_MUTATED_ABOMINATION_25) - { - if (Vehicle* veh = summon->GetVehicleKit()) - veh->RemoveAllPassengers(); // also despawns the vehicle + if (Vehicle* veh = summon->GetVehicleKit()) + veh->RemoveAllPassengers(); // also despawns the vehicle - // Found unit is Mutated Abomination, remove it - return true; - } - - // Found unit is not Mutated Abomintaion, leave it - return false; + // Found unit is Mutated Abomination, remove it + return true; } - // No unit found, remove from SummonList - return true; + // Found unit is not Mutated Abomintaion, leave it + return false; } - private: - Unit* _owner; + // No unit found, remove from SummonList + return true; + } + +private: + Unit* _owner; }; class UnboundPlagueTargetSelector @@ -207,1498 +207,1500 @@ struct MalleableGooSelector : public acore::unary_function class boss_professor_putricide : public CreatureScript { - public: - boss_professor_putricide() : CreatureScript("boss_professor_putricide") { } +public: + boss_professor_putricide() : CreatureScript("boss_professor_putricide") { } - struct boss_professor_putricideAI : public BossAI + struct boss_professor_putricideAI : public BossAI + { + boss_professor_putricideAI(Creature* creature) : BossAI(creature, DATA_PROFESSOR_PUTRICIDE) { - boss_professor_putricideAI(Creature* creature) : BossAI(creature, DATA_PROFESSOR_PUTRICIDE) + bCallEvade = false; + bEnteredCombat = false; + } + + uint16 sayFestergutDeathTimer; + uint16 sayRotfaceDeathTimer; + bool bCallEvade; + uint8 _experimentState; + uint8 _phase; + bool bChangePhase; + bool bEnteredCombat; // needed for failing an attempt in JustReachedHome() + + void Reset() + { + sayFestergutDeathTimer = 0; + sayRotfaceDeathTimer = 0; + _experimentState = 0; + _phase = 1; + bChangePhase = false; + _Reset(); + me->SetReactState(REACT_AGGRESSIVE); + me->SetStandState(UNIT_STAND_STATE_STAND); + + if (instance->GetBossState(DATA_ROTFACE) == DONE && instance->GetBossState(DATA_FESTERGUT) == DONE) + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + } + + uint32 GetData(uint32 type) const + { + switch (type) + { + case DATA_EXPERIMENT_STAGE: + return (uint32)_experimentState; + case DATA_PHASE: + return (uint32)_phase; + case DATA_ABOMINATION: + return (uint32)(const_cast(&summons)->HasEntry(NPC_MUTATED_ABOMINATION_10) || const_cast(&summons)->HasEntry(NPC_MUTATED_ABOMINATION_25)); + } + + return 0; + } + + void SetData(uint32 id, uint32 data) + { + if (id == DATA_EXPERIMENT_STAGE) + _experimentState = (data ? 1 : 0); + } + + void AttackStart(Unit* who) + { + if (instance->CheckRequiredBosses(DATA_PROFESSOR_PUTRICIDE)) + BossAI::AttackStart(who); + } + + bool CanAIAttack(const Unit* target) const + { + return me->IsVisible() && target->GetPositionZ() > 388.0f && target->GetPositionZ() < 410.0f && target->GetPositionY() > 3157.1f && target->GetExactDist2dSq(4356.0f, 3211.0f) < 80.0f * 80.0f; + } + + void MoveInLineOfSight(Unit* who) + { + if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)) + BossAI::MoveInLineOfSight(who); + } + + void EnterCombat(Unit* who) + { + Position homePos = me->GetHomePosition(); + if (!instance->CheckRequiredBosses(DATA_PROFESSOR_PUTRICIDE, who->ToPlayer()) || me->GetExactDist2d(&homePos) > 10.0f || !me->IsVisible()) // check home position because during festergut/rotface fight, trigger missile after their death can trigger putricide combat + { + me->CombatStop(); + me->RemoveAllAuras(); + return; + } + + bEnteredCombat = true; + me->CastSpell(me, SPELL_OOZE_TANK_PROTECTION, true); + events.Reset(); + events.ScheduleEvent(EVENT_BERSERK, 600000); + events.ScheduleEvent(EVENT_SLIME_PUDDLE, 10000, EVENT_GROUP_ABILITIES); + events.ScheduleEvent(EVENT_UNSTABLE_EXPERIMENT, urand(30000, 35000), EVENT_GROUP_ABILITIES); + if (IsHeroic()) + events.ScheduleEvent(EVENT_UNBOUND_PLAGUE, 20000, EVENT_GROUP_ABILITIES); + + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_GAS_VARIABLE); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_OOZE_VARIABLE); + + me->setActive(true); + Talk(SAY_AGGRO); + DoZoneInCombat(me); + instance->SetBossState(DATA_PROFESSOR_PUTRICIDE, IN_PROGRESS); + instance->SetData(DATA_NAUSEA_ACHIEVEMENT, uint32(true)); + } + + void JustReachedHome() + { + _JustReachedHome(); + if (bEnteredCombat) + { + bEnteredCombat = false; + instance->SetBossState(DATA_PROFESSOR_PUTRICIDE, FAIL); + } + + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_GAS_VARIABLE); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_OOZE_VARIABLE); + } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_KILL); + } + + void JustDied(Unit* /*killer*/) + { + _JustDied(); + Talk(SAY_DEATH); + + if (Is25ManRaid() && me->HasAura(SPELL_SHADOWS_FATE)) + DoCastAOE(SPELL_UNHOLY_INFUSION_CREDIT, true); // ReqTargetAura in dbc + + me->CastSpell((Unit*)NULL, SPELL_MUTATED_PLAGUE_CLEAR, true); + } + + void JustSummoned(Creature* summon) + { + if (summon->GetEntry() != 38308 && summon->GetEntry() != 38309 && (!me->IsInCombat() || me->IsInEvadeMode())) + { + summon->DespawnOrUnsummon(1); + return; + } + + summons.Summon(summon); + + switch (summon->GetEntry()) + { + case NPC_GROWING_OOZE_PUDDLE: + // blizzard casts this spell 7 times initially (confirmed in sniff) + for (uint8 i = 0; i < 7; ++i) + summon->CastSpell(summon, SPELL_GROW, true); + return; + case NPC_GAS_CLOUD: + // no possible aura seen in sniff adding the aurastate + summon->ModifyAuraState(AURA_STATE_UNKNOWN22, true); + summon->CastSpell(summon, SPELL_GASEOUS_BLOAT_PROC, true); + summon->SetReactState(REACT_PASSIVE); + break; + case NPC_VOLATILE_OOZE: + // no possible aura seen in sniff adding the aurastate + summon->ModifyAuraState(AURA_STATE_UNKNOWN19, true); + summon->CastSpell(summon, SPELL_OOZE_ERUPTION_SEARCH_PERIODIC, true); + summon->SetReactState(REACT_PASSIVE); + break; + case NPC_CHOKING_GAS_BOMB: + summon->CastSpell(summon, SPELL_CHOKING_GAS_BOMB_PERIODIC, true); + summon->CastSpell(summon, SPELL_CHOKING_GAS_EXPLOSION_TRIGGER, true); + return; + case NPC_MUTATED_ABOMINATION_10: + case NPC_MUTATED_ABOMINATION_25: + return; + } + + if (me->IsInCombat()) + summon->SetInCombatWithZone(); + } + + void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType /*damagetype*/, SpellSchoolMask /*damageSchoolMask*/) + { + if (bChangePhase) + return; + + switch (_phase) + { + case 1: + if (HealthAbovePct(80)) + return; + me->SetReactState(REACT_PASSIVE); + bChangePhase = true; + break; + case 2: + if (HealthAbovePct(35)) + return; + me->SetReactState(REACT_PASSIVE); + bChangePhase = true; + break; + default: + break; + } + } + + void MovementInform(uint32 type, uint32 id) + { + if (type != POINT_MOTION_TYPE) + return; + switch (id) + { + case POINT_FESTERGUT: + if (Creature* c = instance->instance->GetCreature(instance->GetData64(DATA_FESTERGUT))) + { + if (c->IsInCombat()) + { + instance->SetBossState(DATA_FESTERGUT, IN_PROGRESS); + me->SetFacingTo(festergutWatchPos.GetOrientation()); + DoAction(ACTION_FESTERGUT_GAS); + c->CastSpell(c, SPELL_GASEOUS_BLIGHT_LARGE, true, nullptr, nullptr, c->GetGUID()); + } + else + { + bCallEvade = true; + } + } + break; + case POINT_ROTFACE: + if (Creature* c = instance->instance->GetCreature(instance->GetData64(DATA_ROTFACE))) + { + if (c->IsInCombat()) + { + instance->SetBossState(DATA_ROTFACE, IN_PROGRESS); + me->SetFacingTo(rotfaceWatchPos.GetOrientation()); + } + else + { + bCallEvade = true; + } + } + break; + case POINT_TABLE: + me->SetFacingTo(tablePos.GetOrientation()); + me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_USE_STANDING); + break; + case POINT_TABLE_COMBAT: + me->SetFacingTo(tablePos.GetOrientation()); + me->GetMotionMaster()->Clear(false); + me->GetMotionMaster()->MoveIdle(); + events.ScheduleEvent(EVENT_TABLE_DRINK_STUFF, IsHeroic() ? 25000 : 0); + break; + } + } + + void DoAction(int32 action) + { + switch (action) + { + case ACTION_FESTERGUT_COMBAT: + me->GetMotionMaster()->MoveCharge(festergutWatchPos.GetPositionX(), festergutWatchPos.GetPositionY(), festergutWatchPos.GetPositionZ(), 15.0f, POINT_FESTERGUT); + break; + case ACTION_FESTERGUT_DEATH: + sayFestergutDeathTimer = 4000; + break; + case ACTION_FESTERGUT_GAS: + Talk(SAY_FESTERGUT_GASEOUS_BLIGHT); + DoCast(me, SPELL_RELEASE_GAS_VISUAL, true); + break; + case ACTION_ROTFACE_COMBAT: + me->GetMotionMaster()->MoveCharge(rotfaceWatchPos.GetPositionX(), rotfaceWatchPos.GetPositionY(), rotfaceWatchPos.GetPositionZ(), 15.0f, POINT_ROTFACE); + break; + case ACTION_ROTFACE_DEATH: + sayRotfaceDeathTimer = 4500; + break; + default: + break; + } + } + + void UpdateAI(uint32 diff) + { + if (sayFestergutDeathTimer) + { + if (sayFestergutDeathTimer <= diff) + { + sayFestergutDeathTimer = 0; + Talk(SAY_FESTERGUT_DEATH); + EnterEvadeMode(); + } + else + sayFestergutDeathTimer -= diff; + } + else if (sayRotfaceDeathTimer) + { + if (sayRotfaceDeathTimer <= diff) + { + sayRotfaceDeathTimer = 0; + Talk(SAY_ROTFACE_DEATH); + EnterEvadeMode(); + } + else + sayRotfaceDeathTimer -= diff; + } + else if (bCallEvade) { bCallEvade = false; - bEnteredCombat = false; + EnterEvadeMode(); + return; } - uint16 sayFestergutDeathTimer; - uint16 sayRotfaceDeathTimer; - bool bCallEvade; - uint8 _experimentState; - uint8 _phase; - bool bChangePhase; - bool bEnteredCombat; // needed for failing an attempt in JustReachedHome() + if (!UpdateVictim() || !CheckInRoom()) + return; - void Reset() + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + if (bChangePhase) { - sayFestergutDeathTimer = 0; - sayRotfaceDeathTimer = 0; - _experimentState = 0; - _phase = 1; + ChangePhase(); bChangePhase = false; - _Reset(); - me->SetReactState(REACT_AGGRESSIVE); - me->SetStandState(UNIT_STAND_STATE_STAND); - - if (instance->GetBossState(DATA_ROTFACE) == DONE && instance->GetBossState(DATA_FESTERGUT) == DONE) - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + return; } - uint32 GetData(uint32 type) const + switch (events.ExecuteEvent()) { - switch (type) - { - case DATA_EXPERIMENT_STAGE: - return (uint32)_experimentState; - case DATA_PHASE: - return (uint32)_phase; - case DATA_ABOMINATION: - return (uint32)(const_cast(&summons)->HasEntry(NPC_MUTATED_ABOMINATION_10) || const_cast(&summons)->HasEntry(NPC_MUTATED_ABOMINATION_25)); - } - - return 0; - } - - void SetData(uint32 id, uint32 data) - { - if (id == DATA_EXPERIMENT_STAGE) - _experimentState = (data ? 1 : 0); - } - - void AttackStart(Unit* who) - { - if (instance->CheckRequiredBosses(DATA_PROFESSOR_PUTRICIDE)) - BossAI::AttackStart(who); - } - - bool CanAIAttack(const Unit* target) const - { - return me->IsVisible() && target->GetPositionZ() > 388.0f && target->GetPositionZ() < 410.0f && target->GetPositionY() > 3157.1f && target->GetExactDist2dSq(4356.0f, 3211.0f) < 80.0f*80.0f; - } - - void MoveInLineOfSight(Unit* who) - { - if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)) - BossAI::MoveInLineOfSight(who); - } - - void EnterCombat(Unit* who) - { - Position homePos = me->GetHomePosition(); - if (!instance->CheckRequiredBosses(DATA_PROFESSOR_PUTRICIDE, who->ToPlayer()) || me->GetExactDist2d(&homePos) > 10.0f || !me->IsVisible()) // check home position because during festergut/rotface fight, trigger missile after their death can trigger putricide combat - { - me->CombatStop(); - me->RemoveAllAuras(); - return; - } - - bEnteredCombat = true; - me->CastSpell(me, SPELL_OOZE_TANK_PROTECTION, true); - events.Reset(); - events.ScheduleEvent(EVENT_BERSERK, 600000); - events.ScheduleEvent(EVENT_SLIME_PUDDLE, 10000, EVENT_GROUP_ABILITIES); - events.ScheduleEvent(EVENT_UNSTABLE_EXPERIMENT, urand(30000, 35000), EVENT_GROUP_ABILITIES); - if (IsHeroic()) - events.ScheduleEvent(EVENT_UNBOUND_PLAGUE, 20000, EVENT_GROUP_ABILITIES); - - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_GAS_VARIABLE); - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_OOZE_VARIABLE); - - me->setActive(true); - Talk(SAY_AGGRO); - DoZoneInCombat(me); - instance->SetBossState(DATA_PROFESSOR_PUTRICIDE, IN_PROGRESS); - instance->SetData(DATA_NAUSEA_ACHIEVEMENT, uint32(true)); - } - - void JustReachedHome() - { - _JustReachedHome(); - if (bEnteredCombat) - { - bEnteredCombat = false; - instance->SetBossState(DATA_PROFESSOR_PUTRICIDE, FAIL); - } - - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_GAS_VARIABLE); - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_OOZE_VARIABLE); - } - - void KilledUnit(Unit* victim) - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_KILL); - } - - void JustDied(Unit* /*killer*/) - { - _JustDied(); - Talk(SAY_DEATH); - - if (Is25ManRaid() && me->HasAura(SPELL_SHADOWS_FATE)) - DoCastAOE(SPELL_UNHOLY_INFUSION_CREDIT, true); // ReqTargetAura in dbc - - me->CastSpell((Unit*)NULL, SPELL_MUTATED_PLAGUE_CLEAR, true); - } - - void JustSummoned(Creature* summon) - { - if (summon->GetEntry() != 38308 && summon->GetEntry() != 38309 && (!me->IsInCombat() || me->IsInEvadeMode())) - { - summon->DespawnOrUnsummon(1); - return; - } - - summons.Summon(summon); - - switch (summon->GetEntry()) - { - case NPC_GROWING_OOZE_PUDDLE: - // blizzard casts this spell 7 times initially (confirmed in sniff) - for (uint8 i = 0; i < 7; ++i) - summon->CastSpell(summon, SPELL_GROW, true); - return; - case NPC_GAS_CLOUD: - // no possible aura seen in sniff adding the aurastate - summon->ModifyAuraState(AURA_STATE_UNKNOWN22, true); - summon->CastSpell(summon, SPELL_GASEOUS_BLOAT_PROC, true); - summon->SetReactState(REACT_PASSIVE); - break; - case NPC_VOLATILE_OOZE: - // no possible aura seen in sniff adding the aurastate - summon->ModifyAuraState(AURA_STATE_UNKNOWN19, true); - summon->CastSpell(summon, SPELL_OOZE_ERUPTION_SEARCH_PERIODIC, true); - summon->SetReactState(REACT_PASSIVE); - break; - case NPC_CHOKING_GAS_BOMB: - summon->CastSpell(summon, SPELL_CHOKING_GAS_BOMB_PERIODIC, true); - summon->CastSpell(summon, SPELL_CHOKING_GAS_EXPLOSION_TRIGGER, true); - return; - case NPC_MUTATED_ABOMINATION_10: - case NPC_MUTATED_ABOMINATION_25: - return; - } - - if (me->IsInCombat()) - summon->SetInCombatWithZone(); - } - - void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType /*damagetype*/, SpellSchoolMask /*damageSchoolMask*/) - { - if (bChangePhase) - return; - - switch (_phase) - { - case 1: - if (HealthAbovePct(80)) - return; - me->SetReactState(REACT_PASSIVE); - bChangePhase = true; - break; - case 2: - if (HealthAbovePct(35)) - return; - me->SetReactState(REACT_PASSIVE); - bChangePhase = true; - break; - default: - break; - } - } - - void MovementInform(uint32 type, uint32 id) - { - if (type != POINT_MOTION_TYPE) - return; - switch (id) - { - case POINT_FESTERGUT: - if (Creature* c = instance->instance->GetCreature(instance->GetData64(DATA_FESTERGUT))) { - if (c->IsInCombat()) - { - instance->SetBossState(DATA_FESTERGUT, IN_PROGRESS); - me->SetFacingTo(festergutWatchPos.GetOrientation()); - DoAction(ACTION_FESTERGUT_GAS); - c->CastSpell(c, SPELL_GASEOUS_BLIGHT_LARGE, true, nullptr, nullptr, c->GetGUID()); - } - else - { - bCallEvade = true; - } - } - break; - case POINT_ROTFACE: - if (Creature* c = instance->instance->GetCreature(instance->GetData64(DATA_ROTFACE))) { - if (c->IsInCombat()) - { - instance->SetBossState(DATA_ROTFACE, IN_PROGRESS); - me->SetFacingTo(rotfaceWatchPos.GetOrientation()); - } - else - { - bCallEvade = true; - } - } - break; - case POINT_TABLE: - me->SetFacingTo(tablePos.GetOrientation()); - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_USE_STANDING); - break; - case POINT_TABLE_COMBAT: - me->SetFacingTo(tablePos.GetOrientation()); - me->GetMotionMaster()->Clear(false); - me->GetMotionMaster()->MoveIdle(); - events.ScheduleEvent(EVENT_TABLE_DRINK_STUFF, IsHeroic() ? 25000 : 0); - break; - } - } - - void DoAction(int32 action) - { - switch (action) - { - case ACTION_FESTERGUT_COMBAT: - me->GetMotionMaster()->MoveCharge(festergutWatchPos.GetPositionX(), festergutWatchPos.GetPositionY(), festergutWatchPos.GetPositionZ(), 15.0f, POINT_FESTERGUT); - break; - case ACTION_FESTERGUT_DEATH: - sayFestergutDeathTimer = 4000; - break; - case ACTION_FESTERGUT_GAS: - Talk(SAY_FESTERGUT_GASEOUS_BLIGHT); - DoCast(me, SPELL_RELEASE_GAS_VISUAL, true); - break; - case ACTION_ROTFACE_COMBAT: - me->GetMotionMaster()->MoveCharge(rotfaceWatchPos.GetPositionX(), rotfaceWatchPos.GetPositionY(), rotfaceWatchPos.GetPositionZ(), 15.0f, POINT_ROTFACE); - break; - case ACTION_ROTFACE_DEATH: - sayRotfaceDeathTimer = 4500; - break; - default: - break; - } - } - - void UpdateAI(uint32 diff) - { - if (sayFestergutDeathTimer) - { - if (sayFestergutDeathTimer <= diff) + case EVENT_BERSERK: + Talk(SAY_BERSERK); + DoCast(me, SPELL_BERSERK2); + break; + case EVENT_SLIME_PUDDLE: { - sayFestergutDeathTimer = 0; - Talk(SAY_FESTERGUT_DEATH); - EnterEvadeMode(); + std::list targets; + SelectTargetList(targets, 2, SELECT_TARGET_RANDOM, 0.0f, true); + if (!targets.empty()) + for (std::list::iterator itr = targets.begin(); itr != targets.end(); ++itr) + me->CastSpell(*itr, SPELL_SLIME_PUDDLE_TRIGGER, true); + events.ScheduleEvent(EVENT_SLIME_PUDDLE, 35000, EVENT_GROUP_ABILITIES); } - else - sayFestergutDeathTimer -= diff; - } - else if (sayRotfaceDeathTimer) - { - if (sayRotfaceDeathTimer <= diff) + break; + case EVENT_UNSTABLE_EXPERIMENT: + Talk(EMOTE_UNSTABLE_EXPERIMENT); + me->CastSpell(me, SPELL_UNSTABLE_EXPERIMENT, false); + events.ScheduleEvent(EVENT_UNSTABLE_EXPERIMENT, urand(35000, 40000), EVENT_GROUP_ABILITIES); + break; + case EVENT_GO_TO_TABLE: + me->CastSpell(me, SPELL_TEAR_GAS_PERIODIC_TRIGGER, true); + me->GetMotionMaster()->MoveCharge(tablePos.GetPositionX(), tablePos.GetPositionY(), tablePos.GetPositionZ(), 15.0f, POINT_TABLE_COMBAT); + break; + case EVENT_TABLE_DRINK_STUFF: + switch (_phase) { - sayRotfaceDeathTimer = 0; - Talk(SAY_ROTFACE_DEATH); - EnterEvadeMode(); - } - else - sayRotfaceDeathTimer -= diff; - } - else if (bCallEvade) - { - bCallEvade = false; - EnterEvadeMode(); - return; - } - - if (!UpdateVictim() || !CheckInRoom()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - if (bChangePhase) - { - ChangePhase(); - bChangePhase = false; - return; - } - - switch (events.ExecuteEvent()) - { - case EVENT_BERSERK: - Talk(SAY_BERSERK); - DoCast(me, SPELL_BERSERK2); - break; - case EVENT_SLIME_PUDDLE: - { - std::list targets; - SelectTargetList(targets, 2, SELECT_TARGET_RANDOM, 0.0f, true); - if (!targets.empty()) - for (std::list::iterator itr = targets.begin(); itr != targets.end(); ++itr) - me->CastSpell(*itr, SPELL_SLIME_PUDDLE_TRIGGER, true); - events.ScheduleEvent(EVENT_SLIME_PUDDLE, 35000, EVENT_GROUP_ABILITIES); - } - break; - case EVENT_UNSTABLE_EXPERIMENT: - Talk(EMOTE_UNSTABLE_EXPERIMENT); - me->CastSpell(me, SPELL_UNSTABLE_EXPERIMENT, false); - events.ScheduleEvent(EVENT_UNSTABLE_EXPERIMENT, urand(35000, 40000), EVENT_GROUP_ABILITIES); - break; - case EVENT_GO_TO_TABLE: - me->CastSpell(me, SPELL_TEAR_GAS_PERIODIC_TRIGGER, true); - me->GetMotionMaster()->MoveCharge(tablePos.GetPositionX(), tablePos.GetPositionY(), tablePos.GetPositionZ(), 15.0f, POINT_TABLE_COMBAT); - break; - case EVENT_TABLE_DRINK_STUFF: - switch (_phase) - { - case 2: + case 2: { SpellInfo const* spell = sSpellMgr->GetSpellInfo(SPELL_CREATE_CONCOCTION); me->CastSpell(me, SPELL_CREATE_CONCOCTION, false); events.ScheduleEvent(EVENT_PHASE_TRANSITION, sSpellMgr->GetSpellForDifficultyFromSpell(spell, me)->CalcCastTime() + 2250); break; } - case 3: + case 3: { SpellInfo const* spell = sSpellMgr->GetSpellInfo(SPELL_GUZZLE_POTIONS); me->CastSpell(me, SPELL_GUZZLE_POTIONS, false); events.ScheduleEvent(EVENT_PHASE_TRANSITION, sSpellMgr->GetSpellForDifficultyFromSpell(spell, me)->CalcCastTime() + 2250); break; } + default: + break; + } + break; + case EVENT_PHASE_TRANSITION: + { + switch (_phase) + { + case 2: + if (Creature* face = me->FindNearestCreature(NPC_TEAR_GAS_TARGET_STALKER, 50.0f)) + me->SetFacingToObject(face); + me->SetStandState(UNIT_STAND_STATE_KNEEL); + Talk(SAY_TRANSFORM_1); + events.ScheduleEvent(EVENT_RESUME_ATTACK, 5500); + break; + case 3: + if (Creature* face = me->FindNearestCreature(NPC_TEAR_GAS_TARGET_STALKER, 50.0f)) + me->SetFacingToObject(face); + me->SetStandState(UNIT_STAND_STATE_KNEEL); + Talk(SAY_TRANSFORM_2); + events.ScheduleEvent(EVENT_RESUME_ATTACK, 8500); + break; default: break; } - break; - case EVENT_PHASE_TRANSITION: - { - switch (_phase) - { - case 2: - if (Creature* face = me->FindNearestCreature(NPC_TEAR_GAS_TARGET_STALKER, 50.0f)) - me->SetFacingToObject(face); - me->SetStandState(UNIT_STAND_STATE_KNEEL); - Talk(SAY_TRANSFORM_1); - events.ScheduleEvent(EVENT_RESUME_ATTACK, 5500); - break; - case 3: - if (Creature* face = me->FindNearestCreature(NPC_TEAR_GAS_TARGET_STALKER, 50.0f)) - me->SetFacingToObject(face); - me->SetStandState(UNIT_STAND_STATE_KNEEL); - Talk(SAY_TRANSFORM_2); - events.ScheduleEvent(EVENT_RESUME_ATTACK, 8500); - break; - default: - break; - } - } - break; - case EVENT_RESUME_ATTACK: - me->SetReactState(REACT_AGGRESSIVE); - me->SetStandState(UNIT_STAND_STATE_STAND); - AttackStart(me->GetVictim()); - // remove Tear Gas - me->RemoveAurasDueToSpell(SPELL_TEAR_GAS_PERIODIC_TRIGGER); - DoCastAOE(SPELL_TEAR_GAS_CANCEL); - if (_phase == 3) - summons.DespawnIf(AbominationDespawner(me)); - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_GAS_VARIABLE); - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_OOZE_VARIABLE); - break; - case EVENT_UNBOUND_PLAGUE: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, UnboundPlagueTargetSelector(me))) - { - me->CastSpell(target, SPELL_UNBOUND_PLAGUE, false); - me->CastSpell(target, SPELL_UNBOUND_PLAGUE_SEARCHER, false); - events.ScheduleEvent(EVENT_UNBOUND_PLAGUE, 90000, EVENT_GROUP_ABILITIES); - } - else - events.ScheduleEvent(EVENT_UNBOUND_PLAGUE, 3500, EVENT_GROUP_ABILITIES); - break; - case EVENT_MALLEABLE_GOO: - if (Is25ManRaid()) - { - std::list targets; - SelectTargetList(targets, MalleableGooSelector(me), (IsHeroic() ? 3 : 2), SELECT_TARGET_RANDOM); - - if (!targets.empty()) - { - Talk(EMOTE_MALLEABLE_GOO); - for (std::list::iterator itr = targets.begin(); itr != targets.end(); ++itr) - me->CastSpell(*itr, SPELL_MALLEABLE_GOO, true); - } - } - else - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, MalleableGooSelector(me))) - { - Talk(EMOTE_MALLEABLE_GOO); - me->CastSpell(target, SPELL_MALLEABLE_GOO, true); - } - } - events.ScheduleEvent(EVENT_MALLEABLE_GOO, urand(25000, 30000), EVENT_GROUP_ABILITIES); - break; - case EVENT_CHOKING_GAS_BOMB: - Talk(EMOTE_CHOKING_GAS_BOMB); - me->CastSpell(me, SPELL_CHOKING_GAS_BOMB, false); - events.ScheduleEvent(EVENT_CHOKING_GAS_BOMB, urand(35000, 40000), EVENT_GROUP_ABILITIES); - break; - default: - break; - } - - DoMeleeAttackIfReady(); - } - - void EnterEvadeMode() - { - Position p = me->GetHomePosition(); - if (!me->IsInCombat() && me->GetExactDist2d(&p) > 10.0f) - me->GetMotionMaster()->MoveCharge(tablePos.GetPositionX(), tablePos.GetPositionY(), tablePos.GetPositionZ(), 15.0f, POINT_TABLE); - BossAI::EnterEvadeMode(); - } - - void ChangePhase() - { - uint32 heroicDelay = (IsHeroic() ? 25000 : 0); - events.DelayEvents(24000 + heroicDelay, EVENT_GROUP_ABILITIES); - me->AttackStop(); - if (!IsHeroic()) - { - me->CastSpell(me, SPELL_TEAR_GAS, false); - events.ScheduleEvent(EVENT_GO_TO_TABLE, 2500); - } - else - { - Talk(SAY_PHASE_TRANSITION_HEROIC); - DoCast(me, SPELL_UNSTABLE_EXPERIMENT, true); - DoCast(me, SPELL_UNSTABLE_EXPERIMENT, true); - // cast variables + } + break; + case EVENT_RESUME_ATTACK: + me->SetReactState(REACT_AGGRESSIVE); + me->SetStandState(UNIT_STAND_STATE_STAND); + AttackStart(me->GetVictim()); + // remove Tear Gas + me->RemoveAurasDueToSpell(SPELL_TEAR_GAS_PERIODIC_TRIGGER); + DoCastAOE(SPELL_TEAR_GAS_CANCEL); + if (_phase == 3) + summons.DespawnIf(AbominationDespawner(me)); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_GAS_VARIABLE); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_OOZE_VARIABLE); + break; + case EVENT_UNBOUND_PLAGUE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, UnboundPlagueTargetSelector(me))) + { + me->CastSpell(target, SPELL_UNBOUND_PLAGUE, false); + me->CastSpell(target, SPELL_UNBOUND_PLAGUE_SEARCHER, false); + events.ScheduleEvent(EVENT_UNBOUND_PLAGUE, 90000, EVENT_GROUP_ABILITIES); + } + else + events.ScheduleEvent(EVENT_UNBOUND_PLAGUE, 3500, EVENT_GROUP_ABILITIES); + break; + case EVENT_MALLEABLE_GOO: if (Is25ManRaid()) { - std::list targetList; + std::list targets; + SelectTargetList(targets, MalleableGooSelector(me), (IsHeroic() ? 3 : 2), SELECT_TARGET_RANDOM); - Map::PlayerList const& pl = me->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) - if (Player* p = itr->GetSource()) - if (!p->IsGameMaster()) - targetList.push_back(p); - - size_t half = targetList.size()/2; - // half gets ooze variable - while (half < targetList.size()) + if (!targets.empty()) { - std::list::iterator itr = targetList.begin(); - advance(itr, urand(0, targetList.size() - 1)); - (*itr)->CastSpell(*itr, SPELL_OOZE_VARIABLE, true); - targetList.erase(itr); + Talk(EMOTE_MALLEABLE_GOO); + for (std::list::iterator itr = targets.begin(); itr != targets.end(); ++itr) + me->CastSpell(*itr, SPELL_MALLEABLE_GOO, true); } - // and half gets gas - for (std::list::iterator itr = targetList.begin(); itr != targetList.end(); ++itr) - (*itr)->CastSpell(*itr, SPELL_GAS_VARIABLE, true); } - - me->GetMotionMaster()->MoveCharge(tablePos.GetPositionX(), tablePos.GetPositionY(), tablePos.GetPositionZ(), 15.0f, POINT_TABLE_COMBAT); - } - - switch (_phase) - { - case 1: - _phase = 2; - events.ScheduleEvent(EVENT_MALLEABLE_GOO, urand(25000, 28000) + heroicDelay, EVENT_GROUP_ABILITIES); - events.ScheduleEvent(EVENT_CHOKING_GAS_BOMB, urand(35000, 40000) + heroicDelay, EVENT_GROUP_ABILITIES); - break; - case 2: - _phase = 3; - events.CancelEvent(EVENT_UNSTABLE_EXPERIMENT); - break; - default: - break; - } + else + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, MalleableGooSelector(me))) + { + Talk(EMOTE_MALLEABLE_GOO); + me->CastSpell(target, SPELL_MALLEABLE_GOO, true); + } + } + events.ScheduleEvent(EVENT_MALLEABLE_GOO, urand(25000, 30000), EVENT_GROUP_ABILITIES); + break; + case EVENT_CHOKING_GAS_BOMB: + Talk(EMOTE_CHOKING_GAS_BOMB); + me->CastSpell(me, SPELL_CHOKING_GAS_BOMB, false); + events.ScheduleEvent(EVENT_CHOKING_GAS_BOMB, urand(35000, 40000), EVENT_GROUP_ABILITIES); + break; + default: + break; } - }; - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + DoMeleeAttackIfReady(); } + + void EnterEvadeMode() + { + Position p = me->GetHomePosition(); + if (!me->IsInCombat() && me->GetExactDist2d(&p) > 10.0f) + me->GetMotionMaster()->MoveCharge(tablePos.GetPositionX(), tablePos.GetPositionY(), tablePos.GetPositionZ(), 15.0f, POINT_TABLE); + BossAI::EnterEvadeMode(); + } + + void ChangePhase() + { + uint32 heroicDelay = (IsHeroic() ? 25000 : 0); + events.DelayEvents(24000 + heroicDelay, EVENT_GROUP_ABILITIES); + me->AttackStop(); + if (!IsHeroic()) + { + me->CastSpell(me, SPELL_TEAR_GAS, false); + events.ScheduleEvent(EVENT_GO_TO_TABLE, 2500); + } + else + { + Talk(SAY_PHASE_TRANSITION_HEROIC); + DoCast(me, SPELL_UNSTABLE_EXPERIMENT, true); + DoCast(me, SPELL_UNSTABLE_EXPERIMENT, true); + // cast variables + if (Is25ManRaid()) + { + std::list targetList; + + Map::PlayerList const& pl = me->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) + if (Player* p = itr->GetSource()) + if (!p->IsGameMaster()) + targetList.push_back(p); + + size_t half = targetList.size() / 2; + // half gets ooze variable + while (half < targetList.size()) + { + std::list::iterator itr = targetList.begin(); + advance(itr, urand(0, targetList.size() - 1)); + (*itr)->CastSpell(*itr, SPELL_OOZE_VARIABLE, true); + targetList.erase(itr); + } + // and half gets gas + for (std::list::iterator itr = targetList.begin(); itr != targetList.end(); ++itr) + (*itr)->CastSpell(*itr, SPELL_GAS_VARIABLE, true); + } + + me->GetMotionMaster()->MoveCharge(tablePos.GetPositionX(), tablePos.GetPositionY(), tablePos.GetPositionZ(), 15.0f, POINT_TABLE_COMBAT); + } + + switch (_phase) + { + case 1: + _phase = 2; + events.ScheduleEvent(EVENT_MALLEABLE_GOO, urand(25000, 28000) + heroicDelay, EVENT_GROUP_ABILITIES); + events.ScheduleEvent(EVENT_CHOKING_GAS_BOMB, urand(35000, 40000) + heroicDelay, EVENT_GROUP_ABILITIES); + break; + case 2: + _phase = 3; + events.CancelEvent(EVENT_UNSTABLE_EXPERIMENT); + break; + default: + break; + } + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class npc_putricide_oozeAI : public ScriptedAI { - public: - npc_putricide_oozeAI(Creature* creature, uint32 hitTargetSpellId) : ScriptedAI(creature), - _hitTargetSpellId(hitTargetSpellId), _newTargetSelectTimer(0) - { - targetGUID = 0; - me->SetReactState(REACT_PASSIVE); - } +public: + npc_putricide_oozeAI(Creature* creature, uint32 hitTargetSpellId) : ScriptedAI(creature), + _hitTargetSpellId(hitTargetSpellId), _newTargetSelectTimer(0) + { + targetGUID = 0; + me->SetReactState(REACT_PASSIVE); + } - uint64 targetGUID; + uint64 targetGUID; - void SetGUID(uint64 guid, int32 type) - { - if (type == -1) - targetGUID = guid; - } + void SetGUID(uint64 guid, int32 type) + { + if (type == -1) + targetGUID = guid; + } - void IsSummonedBy(Unit* /*summoner*/) - { - if (InstanceScript* instance = me->GetInstanceScript()) - if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) - { - if (!professor->IsInCombat()) - me->DespawnOrUnsummon(1); - else - professor->AI()->JustSummoned(me); - } - } - - void SelectNewTarget() - { - targetGUID = 0; - me->InterruptNonMeleeSpells(true); - me->AttackStop(); - me->GetMotionMaster()->Clear(); - me->StopMoving(); - _newTargetSelectTimer = 1000; - } - - void SpellHitTarget(Unit* /*target*/, SpellInfo const* spell) - { - if (!_newTargetSelectTimer && spell->Id == sSpellMgr->GetSpellIdForDifficulty(_hitTargetSpellId, me)) - SelectNewTarget(); - } - - void SpellHit(Unit* /*caster*/, SpellInfo const* spell) - { - if (spell->Id == SPELL_TEAR_GAS_CREATURE) - SelectNewTarget(); - } - - void UpdateAI(uint32 diff) - { - if (!_newTargetSelectTimer) + void IsSummonedBy(Unit* /*summoner*/) + { + if (InstanceScript* instance = me->GetInstanceScript()) + if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) { - if ((!me->HasUnitState(UNIT_STATE_CASTING) && !me->GetVictim()) || !me->IsNonMeleeSpellCast(false, false, true, false, true)) + if (!professor->IsInCombat()) + me->DespawnOrUnsummon(1); + else + professor->AI()->JustSummoned(me); + } + } + + void SelectNewTarget() + { + targetGUID = 0; + me->InterruptNonMeleeSpells(true); + me->AttackStop(); + me->GetMotionMaster()->Clear(); + me->StopMoving(); + _newTargetSelectTimer = 1000; + } + + void SpellHitTarget(Unit* /*target*/, SpellInfo const* spell) + { + if (!_newTargetSelectTimer && spell->Id == sSpellMgr->GetSpellIdForDifficulty(_hitTargetSpellId, me)) + SelectNewTarget(); + } + + void SpellHit(Unit* /*caster*/, SpellInfo const* spell) + { + if (spell->Id == SPELL_TEAR_GAS_CREATURE) + SelectNewTarget(); + } + + void UpdateAI(uint32 diff) + { + if (!_newTargetSelectTimer) + { + if ((!me->HasUnitState(UNIT_STATE_CASTING) && !me->GetVictim()) || !me->IsNonMeleeSpellCast(false, false, true, false, true)) + SelectNewTarget(); + else if (targetGUID) + { + Unit* target = ObjectAccessor::GetUnit(*me, targetGUID); + if (me->GetVictim()->GetGUID() != targetGUID || !target || !me->IsValidAttackTarget(target) || target->HasFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH) || target->GetExactDist2dSq(4356.0f, 3211.0f) > 80.0f * 80.0f || target->GetPositionZ() < 380.0f || target->GetPositionZ() > 405.0f) SelectNewTarget(); - else if (targetGUID) - { - Unit* target = ObjectAccessor::GetUnit(*me, targetGUID); - if (me->GetVictim()->GetGUID() != targetGUID || !target || !me->IsValidAttackTarget(target) || target->HasFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH) || target->GetExactDist2dSq(4356.0f, 3211.0f) > 80.0f*80.0f || target->GetPositionZ() < 380.0f || target->GetPositionZ() > 405.0f) - SelectNewTarget(); - } } - - DoMeleeAttackIfReady(); - - if (!_newTargetSelectTimer) - return; - - if (me->HasAura(SPELL_TEAR_GAS_CREATURE)) - return; - - if (_newTargetSelectTimer <= diff) - { - _newTargetSelectTimer = 0; - CastMainSpell(); - } - else - _newTargetSelectTimer -= diff; } - virtual void CastMainSpell() = 0; + DoMeleeAttackIfReady(); - private: - uint32 _hitTargetSpellId; - uint32 _newTargetSelectTimer; + if (!_newTargetSelectTimer) + return; + + if (me->HasAura(SPELL_TEAR_GAS_CREATURE)) + return; + + if (_newTargetSelectTimer <= diff) + { + _newTargetSelectTimer = 0; + CastMainSpell(); + } + else + _newTargetSelectTimer -= diff; + } + + virtual void CastMainSpell() = 0; + +private: + uint32 _hitTargetSpellId; + uint32 _newTargetSelectTimer; }; class npc_volatile_ooze : public CreatureScript { - public: - npc_volatile_ooze() : CreatureScript("npc_volatile_ooze") { } +public: + npc_volatile_ooze() : CreatureScript("npc_volatile_ooze") { } - struct npc_volatile_oozeAI : public npc_putricide_oozeAI + struct npc_volatile_oozeAI : public npc_putricide_oozeAI + { + npc_volatile_oozeAI(Creature* creature) : npc_putricide_oozeAI(creature, SPELL_OOZE_ERUPTION) { - npc_volatile_oozeAI(Creature* creature) : npc_putricide_oozeAI(creature, SPELL_OOZE_ERUPTION) - { - } - - void CastMainSpell() - { - me->CastSpell(me, SPELL_VOLATILE_OOZE_ADHESIVE, false); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); } + + void CastMainSpell() + { + me->CastSpell(me, SPELL_VOLATILE_OOZE_ADHESIVE, false); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class npc_gas_cloud : public CreatureScript { - public: - npc_gas_cloud() : CreatureScript("npc_gas_cloud") { } +public: + npc_gas_cloud() : CreatureScript("npc_gas_cloud") { } - struct npc_gas_cloudAI : public npc_putricide_oozeAI + struct npc_gas_cloudAI : public npc_putricide_oozeAI + { + npc_gas_cloudAI(Creature* creature) : npc_putricide_oozeAI(creature, SPELL_EXPUNGED_GAS) { - npc_gas_cloudAI(Creature* creature) : npc_putricide_oozeAI(creature, SPELL_EXPUNGED_GAS) - { - _newTargetSelectTimer = 0; - } - - void CastMainSpell() - { - me->CastCustomSpell(SPELL_GASEOUS_BLOAT, SPELLVALUE_AURA_STACK, 10, me, false); - } - - private: - uint32 _newTargetSelectTimer; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + _newTargetSelectTimer = 0; } + + void CastMainSpell() + { + me->CastCustomSpell(SPELL_GASEOUS_BLOAT, SPELLVALUE_AURA_STACK, 10, me, false); + } + + private: + uint32 _newTargetSelectTimer; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class spell_putricide_slime_puddle : public SpellScriptLoader { - public: - spell_putricide_slime_puddle() : SpellScriptLoader("spell_putricide_slime_puddle") { } +public: + spell_putricide_slime_puddle() : SpellScriptLoader("spell_putricide_slime_puddle") { } - class spell_putricide_slime_puddle_SpellScript : public SpellScript + class spell_putricide_slime_puddle_SpellScript : public SpellScript + { + PrepareSpellScript(spell_putricide_slime_puddle_SpellScript); + + void ScaleRange(std::list& targets) { - PrepareSpellScript(spell_putricide_slime_puddle_SpellScript); - - void ScaleRange(std::list& targets) - { - targets.remove_if(acore::AllWorldObjectsInExactRange(GetCaster(), 2.5f * GetCaster()->GetFloatValue(OBJECT_FIELD_SCALE_X), true)); - } - - // big hax to unlock Abomination Eat Ooze ability, requires caster aura spell from difficulty X, but unlocks clientside when got base aura - void HandleScript(SpellEffIndex /*effIndex*/) - { - const SpellInfo* s1 = sSpellMgr->GetSpellInfo(70346); - const SpellInfo* s2 = sSpellMgr->GetSpellInfo(72456); - if (s1 && s2) - if (Unit* target = GetHitUnit()) - { - Aura::TryRefreshStackOrCreate(s1, MAX_EFFECT_MASK, target, target); - Aura::TryRefreshStackOrCreate(s2, MAX_EFFECT_MASK, target, target); - } - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_slime_puddle_SpellScript::ScaleRange, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_slime_puddle_SpellScript::ScaleRange, EFFECT_1, TARGET_UNIT_DEST_AREA_ENTRY); - OnEffectHitTarget += SpellEffectFn(spell_putricide_slime_puddle_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_APPLY_AURA); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_putricide_slime_puddle_SpellScript(); + targets.remove_if(acore::AllWorldObjectsInExactRange(GetCaster(), 2.5f * GetCaster()->GetFloatValue(OBJECT_FIELD_SCALE_X), true)); } + + // big hax to unlock Abomination Eat Ooze ability, requires caster aura spell from difficulty X, but unlocks clientside when got base aura + void HandleScript(SpellEffIndex /*effIndex*/) + { + const SpellInfo* s1 = sSpellMgr->GetSpellInfo(70346); + const SpellInfo* s2 = sSpellMgr->GetSpellInfo(72456); + if (s1 && s2) + if (Unit* target = GetHitUnit()) + { + Aura::TryRefreshStackOrCreate(s1, MAX_EFFECT_MASK, target, target); + Aura::TryRefreshStackOrCreate(s2, MAX_EFFECT_MASK, target, target); + } + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_slime_puddle_SpellScript::ScaleRange, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_slime_puddle_SpellScript::ScaleRange, EFFECT_1, TARGET_UNIT_DEST_AREA_ENTRY); + OnEffectHitTarget += SpellEffectFn(spell_putricide_slime_puddle_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_APPLY_AURA); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_putricide_slime_puddle_SpellScript(); + } }; class spell_putricide_slime_puddle_spawn : public SpellScriptLoader { - public: - spell_putricide_slime_puddle_spawn() : SpellScriptLoader("spell_putricide_slime_puddle_spawn") { } +public: + spell_putricide_slime_puddle_spawn() : SpellScriptLoader("spell_putricide_slime_puddle_spawn") { } - class spell_putricide_slime_puddle_spawn_SpellScript : public SpellScript + class spell_putricide_slime_puddle_spawn_SpellScript : public SpellScript + { + PrepareSpellScript(spell_putricide_slime_puddle_spawn_SpellScript); + + void SelectDest() { - PrepareSpellScript(spell_putricide_slime_puddle_spawn_SpellScript); - - void SelectDest() + if (Position* dest = const_cast(GetExplTargetDest())) { - if (Position* dest = const_cast(GetExplTargetDest())) - { - float destZ = 395.0f; // random number close to ground, get exact in next call - GetCaster()->UpdateGroundPositionZ(dest->GetPositionX(), dest->GetPositionY(), destZ); - dest->m_positionZ = destZ; - } + float destZ = 395.0f; // random number close to ground, get exact in next call + GetCaster()->UpdateGroundPositionZ(dest->GetPositionX(), dest->GetPositionY(), destZ); + dest->m_positionZ = destZ; } - - void Register() - { - BeforeCast += SpellCastFn(spell_putricide_slime_puddle_spawn_SpellScript::SelectDest); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_putricide_slime_puddle_spawn_SpellScript(); } + + void Register() + { + BeforeCast += SpellCastFn(spell_putricide_slime_puddle_spawn_SpellScript::SelectDest); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_putricide_slime_puddle_spawn_SpellScript(); + } }; class spell_putricide_grow_stacker : public SpellScriptLoader { - public: - spell_putricide_grow_stacker() : SpellScriptLoader("spell_putricide_grow_stacker") { } +public: + spell_putricide_grow_stacker() : SpellScriptLoader("spell_putricide_grow_stacker") { } - class spell_putricide_grow_stacker_AuraScript : public AuraScript + class spell_putricide_grow_stacker_AuraScript : public AuraScript + { + PrepareAuraScript(spell_putricide_grow_stacker_AuraScript); + + void HandleTriggerSpell(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_putricide_grow_stacker_AuraScript); - - void HandleTriggerSpell(AuraEffect const* /*aurEff*/) - { - if (Unit* target = GetTarget()) - if (target->HasAura(SPELL_TEAR_GAS_CREATURE)) - PreventDefaultAction(); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_putricide_grow_stacker_AuraScript::HandleTriggerSpell, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_putricide_grow_stacker_AuraScript(); + if (Unit* target = GetTarget()) + if (target->HasAura(SPELL_TEAR_GAS_CREATURE)) + PreventDefaultAction(); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_putricide_grow_stacker_AuraScript::HandleTriggerSpell, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_putricide_grow_stacker_AuraScript(); + } }; class spell_putricide_unstable_experiment : public SpellScriptLoader { - public: - spell_putricide_unstable_experiment() : SpellScriptLoader("spell_putricide_unstable_experiment") { } +public: + spell_putricide_unstable_experiment() : SpellScriptLoader("spell_putricide_unstable_experiment") { } - class spell_putricide_unstable_experiment_SpellScript : public SpellScript + class spell_putricide_unstable_experiment_SpellScript : public SpellScript + { + PrepareSpellScript(spell_putricide_unstable_experiment_SpellScript); + + void HandleScript(SpellEffIndex effIndex) { - PrepareSpellScript(spell_putricide_unstable_experiment_SpellScript); + PreventHitDefaultEffect(effIndex); + if (GetCaster()->GetTypeId() != TYPEID_UNIT) + return; - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (GetCaster()->GetTypeId() != TYPEID_UNIT) - return; + Creature* creature = GetCaster()->ToCreature(); - Creature* creature = GetCaster()->ToCreature(); + uint8 stage = creature->AI()->GetData(DATA_EXPERIMENT_STAGE); + creature->AI()->SetData(DATA_EXPERIMENT_STAGE, stage ? 0 : 1); - uint8 stage = creature->AI()->GetData(DATA_EXPERIMENT_STAGE); - creature->AI()->SetData(DATA_EXPERIMENT_STAGE, stage ? 0 : 1); + Creature* target = nullptr; + std::list creList; + GetCreatureListWithEntryInGrid(creList, GetCaster(), NPC_ABOMINATION_WING_MAD_SCIENTIST_STALKER, 200.0f); + for (std::list::iterator itr = creList.begin(); itr != creList.end(); ++itr) + if (((*itr)->GetPositionX() > 4350.0f && stage == 0) || ((*itr)->GetPositionX() < 4350.0f && stage == 1)) + { + target = (*itr); + break; + } - Creature* target = nullptr; - std::list creList; - GetCreatureListWithEntryInGrid(creList, GetCaster(), NPC_ABOMINATION_WING_MAD_SCIENTIST_STALKER, 200.0f); - for (std::list::iterator itr = creList.begin(); itr != creList.end(); ++itr) - if (((*itr)->GetPositionX() > 4350.0f && stage == 0) || ((*itr)->GetPositionX() < 4350.0f && stage == 1)) - { - target = (*itr); - break; - } + if (Aura* aura = target->GetAura(uint32(GetSpellInfo()->Effects[stage].CalcValue()))) + if (aura->GetOwner() == target) // avoid assert(false) at any cost + aura->UpdateOwner(5000, target); // update whole aura so previous periodic ticks before refreshed by new one - if (Aura* aura = target->GetAura(uint32(GetSpellInfo()->Effects[stage].CalcValue()))) - if (aura->GetOwner() == target) // avoid assert(false) at any cost - aura->UpdateOwner(5000, target); // update whole aura so previous periodic ticks before refreshed by new one - - GetCaster()->CastSpell(target, uint32(GetSpellInfo()->Effects[stage].CalcValue()), true, nullptr, nullptr, GetCaster()->GetGUID()); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_putricide_unstable_experiment_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_putricide_unstable_experiment_SpellScript(); + GetCaster()->CastSpell(target, uint32(GetSpellInfo()->Effects[stage].CalcValue()), true, nullptr, nullptr, GetCaster()->GetGUID()); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_putricide_unstable_experiment_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_putricide_unstable_experiment_SpellScript(); + } }; class spell_putricide_tear_gas_effect : public SpellScriptLoader { - public: - spell_putricide_tear_gas_effect() : SpellScriptLoader("spell_putricide_tear_gas_effect") { } +public: + spell_putricide_tear_gas_effect() : SpellScriptLoader("spell_putricide_tear_gas_effect") { } - class spell_putricide_tear_gas_effect_SpellScript : public SpellScript + class spell_putricide_tear_gas_effect_SpellScript : public SpellScript + { + PrepareSpellScript(spell_putricide_tear_gas_effect_SpellScript); + + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_putricide_tear_gas_effect_SpellScript); - - void FilterTargets(std::list& targets) - { - // vanish rank 1-3, mage invisibility - targets.remove_if(acore::UnitAuraCheck(true, 11327)); - targets.remove_if(acore::UnitAuraCheck(true, 11329)); - targets.remove_if(acore::UnitAuraCheck(true, 26888)); - targets.remove_if(acore::UnitAuraCheck(true, 32612)); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_tear_gas_effect_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_tear_gas_effect_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_putricide_tear_gas_effect_SpellScript(); + // vanish rank 1-3, mage invisibility + targets.remove_if(acore::UnitAuraCheck(true, 11327)); + targets.remove_if(acore::UnitAuraCheck(true, 11329)); + targets.remove_if(acore::UnitAuraCheck(true, 26888)); + targets.remove_if(acore::UnitAuraCheck(true, 32612)); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_tear_gas_effect_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_tear_gas_effect_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_putricide_tear_gas_effect_SpellScript(); + } }; class spell_putricide_gaseous_bloat : public SpellScriptLoader { - public: - spell_putricide_gaseous_bloat() : SpellScriptLoader("spell_putricide_gaseous_bloat") { } +public: + spell_putricide_gaseous_bloat() : SpellScriptLoader("spell_putricide_gaseous_bloat") { } - class spell_putricide_gaseous_bloat_AuraScript : public AuraScript + class spell_putricide_gaseous_bloat_AuraScript : public AuraScript + { + PrepareAuraScript(spell_putricide_gaseous_bloat_AuraScript); + + void HandleExtraEffect(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_putricide_gaseous_bloat_AuraScript); - - void HandleExtraEffect(AuraEffect const* /*aurEff*/) - { - Unit* target = GetTarget(); - target->RemoveAuraFromStack(GetSpellInfo()->Id, GetCasterGUID()); - /*if (!target->HasAura(GetId())) - if (Unit* caster = GetCaster()) - caster->CastCustomSpell(SPELL_GASEOUS_BLOAT, SPELLVALUE_AURA_STACK, 10, caster, false);*/ - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_putricide_gaseous_bloat_AuraScript::HandleExtraEffect, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_putricide_gaseous_bloat_AuraScript(); + Unit* target = GetTarget(); + target->RemoveAuraFromStack(GetSpellInfo()->Id, GetCasterGUID()); + /*if (!target->HasAura(GetId())) + if (Unit* caster = GetCaster()) + caster->CastCustomSpell(SPELL_GASEOUS_BLOAT, SPELLVALUE_AURA_STACK, 10, caster, false);*/ } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_putricide_gaseous_bloat_AuraScript::HandleExtraEffect, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_putricide_gaseous_bloat_AuraScript(); + } }; class spell_putricide_ooze_channel : public SpellScriptLoader { - public: - spell_putricide_ooze_channel() : SpellScriptLoader("spell_putricide_ooze_channel") { } +public: + spell_putricide_ooze_channel() : SpellScriptLoader("spell_putricide_ooze_channel") { } - class spell_putricide_ooze_channel_SpellScript : public SpellScript + class spell_putricide_ooze_channel_SpellScript : public SpellScript + { + PrepareSpellScript(spell_putricide_ooze_channel_SpellScript); + + bool Validate(SpellInfo const* spell) { - PrepareSpellScript(spell_putricide_ooze_channel_SpellScript); - - bool Validate(SpellInfo const* spell) - { - if (!spell->ExcludeTargetAuraSpell) - return false; - if (!sSpellMgr->GetSpellInfo(spell->ExcludeTargetAuraSpell)) - return false; - return true; - } - - // set up initial variables and check if caster is creature - // this will let use safely use ToCreature() casts in entire script - bool Load() - { - _target = nullptr; - return GetCaster()->GetTypeId() == TYPEID_UNIT; - } - - void SelectTarget(std::list& targets) - { - // dbc has only 1 field for excluding, this will prevent anyone from getting both at the same time - targets.remove_if(acore::UnitAuraCheck(true, SPELL_VOLATILE_OOZE_PROTECTION)); - targets.remove_if(acore::UnitAuraCheck(true, SPELL_GASEOUS_BLOAT_PROTECTION)); - - if (targets.empty()) - { - FinishCast(SPELL_FAILED_NO_VALID_TARGETS); - GetCaster()->ToCreature()->DespawnOrUnsummon(1); // despawn next update - return; - } - - WorldObject* target = acore::Containers::SelectRandomContainerElement(targets); - targets.clear(); - targets.push_back(target); - _target = target; - } - - void SetTarget(std::list& targets) - { - targets.clear(); - if (_target) - targets.push_back(_target); - } - - void StartAttack() - { - GetCaster()->ClearUnitState(UNIT_STATE_CASTING); - GetCaster()->DeleteThreatList(); - GetCaster()->ToCreature()->SetInCombatWithZone(); - GetCaster()->ToCreature()->AI()->AttackStart(GetHitUnit()); - GetCaster()->AddThreat(GetHitUnit(), 500000000.0f); // value seen in sniff - if (Creature* c = GetCaster()->ToCreature()) - c->AI()->SetGUID(GetHitUnit()->GetGUID(), -1); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_ooze_channel_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_ooze_channel_SpellScript::SetTarget, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_ooze_channel_SpellScript::SetTarget, EFFECT_2, TARGET_UNIT_SRC_AREA_ENEMY); - AfterHit += SpellHitFn(spell_putricide_ooze_channel_SpellScript::StartAttack); - } - - WorldObject* _target; - }; - - SpellScript* GetSpellScript() const - { - return new spell_putricide_ooze_channel_SpellScript(); + if (!spell->ExcludeTargetAuraSpell) + return false; + if (!sSpellMgr->GetSpellInfo(spell->ExcludeTargetAuraSpell)) + return false; + return true; } + + // set up initial variables and check if caster is creature + // this will let use safely use ToCreature() casts in entire script + bool Load() + { + _target = nullptr; + return GetCaster()->GetTypeId() == TYPEID_UNIT; + } + + void SelectTarget(std::list& targets) + { + // dbc has only 1 field for excluding, this will prevent anyone from getting both at the same time + targets.remove_if(acore::UnitAuraCheck(true, SPELL_VOLATILE_OOZE_PROTECTION)); + targets.remove_if(acore::UnitAuraCheck(true, SPELL_GASEOUS_BLOAT_PROTECTION)); + + if (targets.empty()) + { + FinishCast(SPELL_FAILED_NO_VALID_TARGETS); + GetCaster()->ToCreature()->DespawnOrUnsummon(1); // despawn next update + return; + } + + WorldObject* target = acore::Containers::SelectRandomContainerElement(targets); + targets.clear(); + targets.push_back(target); + _target = target; + } + + void SetTarget(std::list& targets) + { + targets.clear(); + if (_target) + targets.push_back(_target); + } + + void StartAttack() + { + GetCaster()->ClearUnitState(UNIT_STATE_CASTING); + GetCaster()->DeleteThreatList(); + GetCaster()->ToCreature()->SetInCombatWithZone(); + GetCaster()->ToCreature()->AI()->AttackStart(GetHitUnit()); + GetCaster()->AddThreat(GetHitUnit(), 500000000.0f); // value seen in sniff + if (Creature* c = GetCaster()->ToCreature()) + c->AI()->SetGUID(GetHitUnit()->GetGUID(), -1); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_ooze_channel_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_ooze_channel_SpellScript::SetTarget, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_ooze_channel_SpellScript::SetTarget, EFFECT_2, TARGET_UNIT_SRC_AREA_ENEMY); + AfterHit += SpellHitFn(spell_putricide_ooze_channel_SpellScript::StartAttack); + } + + WorldObject* _target; + }; + + SpellScript* GetSpellScript() const + { + return new spell_putricide_ooze_channel_SpellScript(); + } }; class spell_putricide_ooze_eruption_searcher : public SpellScriptLoader { - public: - spell_putricide_ooze_eruption_searcher() : SpellScriptLoader("spell_putricide_ooze_eruption_searcher") { } +public: + spell_putricide_ooze_eruption_searcher() : SpellScriptLoader("spell_putricide_ooze_eruption_searcher") { } - class spell_putricide_ooze_eruption_searcher_SpellScript : public SpellScript + class spell_putricide_ooze_eruption_searcher_SpellScript : public SpellScript + { + PrepareSpellScript(spell_putricide_ooze_eruption_searcher_SpellScript); + + void HandleDummy(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_putricide_ooze_eruption_searcher_SpellScript); - - void HandleDummy(SpellEffIndex /*effIndex*/) + uint32 adhesiveId = sSpellMgr->GetSpellIdForDifficulty(SPELL_VOLATILE_OOZE_ADHESIVE, GetCaster()); + if (GetHitUnit()->HasAura(adhesiveId)) { - uint32 adhesiveId = sSpellMgr->GetSpellIdForDifficulty(SPELL_VOLATILE_OOZE_ADHESIVE, GetCaster()); - if (GetHitUnit()->HasAura(adhesiveId)) - { - GetHitUnit()->RemoveAurasDueToSpell(adhesiveId, GetCaster()->GetGUID(), 0, AURA_REMOVE_BY_ENEMY_SPELL); - GetCaster()->CastSpell(GetHitUnit(), SPELL_OOZE_ERUPTION, true); - } + GetHitUnit()->RemoveAurasDueToSpell(adhesiveId, GetCaster()->GetGUID(), 0, AURA_REMOVE_BY_ENEMY_SPELL); + GetCaster()->CastSpell(GetHitUnit(), SPELL_OOZE_ERUPTION, true); } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_putricide_ooze_eruption_searcher_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_putricide_ooze_eruption_searcher_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_putricide_ooze_eruption_searcher_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_putricide_ooze_eruption_searcher_SpellScript(); + } }; class spell_putricide_mutated_plague : public SpellScriptLoader { - public: - spell_putricide_mutated_plague() : SpellScriptLoader("spell_putricide_mutated_plague") { } +public: + spell_putricide_mutated_plague() : SpellScriptLoader("spell_putricide_mutated_plague") { } - class spell_putricide_mutated_plague_AuraScript : public AuraScript + class spell_putricide_mutated_plague_AuraScript : public AuraScript + { + PrepareAuraScript(spell_putricide_mutated_plague_AuraScript); + + void HandleTriggerSpell(AuraEffect const* aurEff) { - PrepareAuraScript(spell_putricide_mutated_plague_AuraScript); + PreventDefaultAction(); + Unit* caster = GetCaster(); + if (!caster) + return; - void HandleTriggerSpell(AuraEffect const* aurEff) - { - PreventDefaultAction(); - Unit* caster = GetCaster(); - if (!caster) - return; + uint32 triggerSpell = GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell; + SpellInfo const* spell = sSpellMgr->GetSpellInfo(triggerSpell); + spell = sSpellMgr->GetSpellForDifficultyFromSpell(spell, caster); - uint32 triggerSpell = GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell; - SpellInfo const* spell = sSpellMgr->GetSpellInfo(triggerSpell); - spell = sSpellMgr->GetSpellForDifficultyFromSpell(spell, caster); + int32 damage = spell->Effects[EFFECT_0].CalcValue(caster); + damage = damage * pow(2.5f, GetStackAmount()); - int32 damage = spell->Effects[EFFECT_0].CalcValue(caster); - damage = damage * pow(2.5f, GetStackAmount()); - - GetTarget()->CastCustomSpell(triggerSpell, SPELLVALUE_BASE_POINT0, damage, GetTarget(), true, NULL, aurEff, GetCasterGUID()); - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - uint32 healSpell = uint32(GetSpellInfo()->Effects[EFFECT_0].CalcValue()); - SpellInfo const* spell = sSpellMgr->GetSpellInfo(healSpell); - if (!spell) - return; - spell = sSpellMgr->GetSpellForDifficultyFromSpell(spell, GetTarget()); - int32 healAmount = spell->Effects[EFFECT_0].CalcValue(); - healAmount *= GetStackAmount(); - GetTarget()->CastCustomSpell(healSpell, SPELLVALUE_BASE_POINT0, healAmount, GetTarget(), TRIGGERED_FULL_MASK, nullptr, nullptr, GetCasterGUID()); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_putricide_mutated_plague_AuraScript::HandleTriggerSpell, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - AfterEffectRemove += AuraEffectRemoveFn(spell_putricide_mutated_plague_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_putricide_mutated_plague_AuraScript(); + GetTarget()->CastCustomSpell(triggerSpell, SPELLVALUE_BASE_POINT0, damage, GetTarget(), true, NULL, aurEff, GetCasterGUID()); } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + uint32 healSpell = uint32(GetSpellInfo()->Effects[EFFECT_0].CalcValue()); + SpellInfo const* spell = sSpellMgr->GetSpellInfo(healSpell); + if (!spell) + return; + spell = sSpellMgr->GetSpellForDifficultyFromSpell(spell, GetTarget()); + int32 healAmount = spell->Effects[EFFECT_0].CalcValue(); + healAmount *= GetStackAmount(); + GetTarget()->CastCustomSpell(healSpell, SPELLVALUE_BASE_POINT0, healAmount, GetTarget(), TRIGGERED_FULL_MASK, nullptr, nullptr, GetCasterGUID()); + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_putricide_mutated_plague_AuraScript::HandleTriggerSpell, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + AfterEffectRemove += AuraEffectRemoveFn(spell_putricide_mutated_plague_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_putricide_mutated_plague_AuraScript(); + } }; class spell_putricide_unbound_plague : public SpellScriptLoader { - public: - spell_putricide_unbound_plague() : SpellScriptLoader("spell_putricide_unbound_plague") { } +public: + spell_putricide_unbound_plague() : SpellScriptLoader("spell_putricide_unbound_plague") { } - class spell_putricide_unbound_plague_SpellScript : public SpellScript + class spell_putricide_unbound_plague_SpellScript : public SpellScript + { + PrepareSpellScript(spell_putricide_unbound_plague_SpellScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareSpellScript(spell_putricide_unbound_plague_SpellScript); + if (!sSpellMgr->GetSpellInfo(SPELL_UNBOUND_PLAGUE)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_UNBOUND_PLAGUE_SEARCHER)) + return false; + return true; + } - bool Validate(SpellInfo const* /*spell*/) + void FilterTargets(std::list& targets) + { + if (AuraEffect const* eff = GetCaster()->GetAuraEffect(SPELL_UNBOUND_PLAGUE_SEARCHER, EFFECT_0)) { - if (!sSpellMgr->GetSpellInfo(SPELL_UNBOUND_PLAGUE)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_UNBOUND_PLAGUE_SEARCHER)) - return false; - return true; - } - - void FilterTargets(std::list& targets) - { - if (AuraEffect const* eff = GetCaster()->GetAuraEffect(SPELL_UNBOUND_PLAGUE_SEARCHER, EFFECT_0)) + if (eff->GetTickNumber() < 2) { - if (eff->GetTickNumber() < 2) - { - targets.clear(); - return; - } + targets.clear(); + return; } - - - targets.remove_if(acore::UnitAuraCheck(true, sSpellMgr->GetSpellIdForDifficulty(SPELL_UNBOUND_PLAGUE, GetCaster()))); - acore::Containers::RandomResizeList(targets, 1); } - void HandleScript(SpellEffIndex /*effIndex*/) + + targets.remove_if(acore::UnitAuraCheck(true, sSpellMgr->GetSpellIdForDifficulty(SPELL_UNBOUND_PLAGUE, GetCaster()))); + acore::Containers::RandomResizeList(targets, 1); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + if (!GetHitUnit()) + return; + + InstanceScript* instance = GetCaster()->GetInstanceScript(); + if (!instance) + return; + + uint32 plagueId = sSpellMgr->GetSpellIdForDifficulty(SPELL_UNBOUND_PLAGUE, GetCaster()); + + if (!GetHitUnit()->HasAura(plagueId)) { - if (!GetHitUnit()) - return; - - InstanceScript* instance = GetCaster()->GetInstanceScript(); - if (!instance) - return; - - uint32 plagueId = sSpellMgr->GetSpellIdForDifficulty(SPELL_UNBOUND_PLAGUE, GetCaster()); - - if (!GetHitUnit()->HasAura(plagueId)) + if (Creature* professor = ObjectAccessor::GetCreature(*GetCaster(), instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) { - if (Creature* professor = ObjectAccessor::GetCreature(*GetCaster(), instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) + if (Aura* oldPlague = GetCaster()->GetAura(plagueId, professor->GetGUID())) { - if (Aura* oldPlague = GetCaster()->GetAura(plagueId, professor->GetGUID())) + if (Aura* newPlague = professor->AddAura(plagueId, GetHitUnit())) { - if (Aura* newPlague = professor->AddAura(plagueId, GetHitUnit())) - { - newPlague->SetMaxDuration(oldPlague->GetMaxDuration()); - newPlague->SetDuration(oldPlague->GetDuration()); - oldPlague->Remove(); - GetCaster()->RemoveAurasDueToSpell(SPELL_UNBOUND_PLAGUE_SEARCHER); - GetCaster()->CastSpell(GetCaster(), SPELL_PLAGUE_SICKNESS, true); - GetCaster()->CastSpell(GetCaster(), SPELL_UNBOUND_PLAGUE_PROTECTION, true); - professor->CastSpell(GetHitUnit(), SPELL_UNBOUND_PLAGUE_SEARCHER, true); - } + newPlague->SetMaxDuration(oldPlague->GetMaxDuration()); + newPlague->SetDuration(oldPlague->GetDuration()); + oldPlague->Remove(); + GetCaster()->RemoveAurasDueToSpell(SPELL_UNBOUND_PLAGUE_SEARCHER); + GetCaster()->CastSpell(GetCaster(), SPELL_PLAGUE_SICKNESS, true); + GetCaster()->CastSpell(GetCaster(), SPELL_UNBOUND_PLAGUE_PROTECTION, true); + professor->CastSpell(GetHitUnit(), SPELL_UNBOUND_PLAGUE_SEARCHER, true); } } } } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_unbound_plague_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); - OnEffectHitTarget += SpellEffectFn(spell_putricide_unbound_plague_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_putricide_unbound_plague_SpellScript(); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_unbound_plague_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); + OnEffectHitTarget += SpellEffectFn(spell_putricide_unbound_plague_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_putricide_unbound_plague_SpellScript(); + } }; class spell_putricide_unbound_plague_dmg : public SpellScriptLoader { - public: - spell_putricide_unbound_plague_dmg() : SpellScriptLoader("spell_putricide_unbound_plague_dmg") { } +public: + spell_putricide_unbound_plague_dmg() : SpellScriptLoader("spell_putricide_unbound_plague_dmg") { } - class spell_putricide_unbound_plague_dmg_AuraScript : public AuraScript + class spell_putricide_unbound_plague_dmg_AuraScript : public AuraScript + { + PrepareAuraScript(spell_putricide_unbound_plague_dmg_AuraScript); + + void HandlePeriodic(AuraEffect* aurEff) { - PrepareAuraScript(spell_putricide_unbound_plague_dmg_AuraScript); - - void HandlePeriodic(AuraEffect* aurEff) - { - int32 baseAmt = aurEff->GetSpellInfo()->Effects[0].CalcValue(); - int32 dmg = int32(baseAmt * pow(1.25f, float(aurEff->GetTickNumber()))); - if (dmg <= 0) // safety check, impossible - return; - aurEff->SetAmount(dmg); - } - - void Register() - { - OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_putricide_unbound_plague_dmg_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_putricide_unbound_plague_dmg_AuraScript(); + int32 baseAmt = aurEff->GetSpellInfo()->Effects[0].CalcValue(); + int32 dmg = int32(baseAmt * pow(1.25f, float(aurEff->GetTickNumber()))); + if (dmg <= 0) // safety check, impossible + return; + aurEff->SetAmount(dmg); } + + void Register() + { + OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_putricide_unbound_plague_dmg_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_putricide_unbound_plague_dmg_AuraScript(); + } }; class spell_putricide_choking_gas_bomb : public SpellScriptLoader { - public: - spell_putricide_choking_gas_bomb() : SpellScriptLoader("spell_putricide_choking_gas_bomb") { } +public: + spell_putricide_choking_gas_bomb() : SpellScriptLoader("spell_putricide_choking_gas_bomb") { } - class spell_putricide_choking_gas_bomb_SpellScript : public SpellScript + class spell_putricide_choking_gas_bomb_SpellScript : public SpellScript + { + PrepareSpellScript(spell_putricide_choking_gas_bomb_SpellScript); + + void HandleScript(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_putricide_choking_gas_bomb_SpellScript); - - void HandleScript(SpellEffIndex /*effIndex*/) + uint32 skipIndex = urand(0, 2); + for (uint32 i = 0; i < 3; ++i) { - uint32 skipIndex = urand(0, 2); - for (uint32 i = 0; i < 3; ++i) - { - if (i == skipIndex) - continue; + if (i == skipIndex) + continue; - uint32 spellId = uint32(GetSpellInfo()->Effects[i].CalcValue()); - GetCaster()->CastSpell(GetCaster(), spellId, true, nullptr, nullptr, GetCaster()->GetGUID()); - } + uint32 spellId = uint32(GetSpellInfo()->Effects[i].CalcValue()); + GetCaster()->CastSpell(GetCaster(), spellId, true, nullptr, nullptr, GetCaster()->GetGUID()); } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_putricide_choking_gas_bomb_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_putricide_choking_gas_bomb_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_putricide_choking_gas_bomb_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_putricide_choking_gas_bomb_SpellScript(); + } }; // Removes aura with id stored in effect value class spell_putricide_clear_aura_effect_value : public SpellScriptLoader { - public: - spell_putricide_clear_aura_effect_value() : SpellScriptLoader("spell_putricide_clear_aura_effect_value") { } +public: + spell_putricide_clear_aura_effect_value() : SpellScriptLoader("spell_putricide_clear_aura_effect_value") { } - class spell_putricide_clear_aura_effect_value_SpellScript : public SpellScript + class spell_putricide_clear_aura_effect_value_SpellScript : public SpellScript + { + PrepareSpellScript(spell_putricide_clear_aura_effect_value_SpellScript); + + void HandleScript(SpellEffIndex effIndex) { - PrepareSpellScript(spell_putricide_clear_aura_effect_value_SpellScript); - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - uint32 auraId = sSpellMgr->GetSpellIdForDifficulty(uint32(GetEffectValue()), GetCaster()); - GetHitUnit()->RemoveAurasDueToSpell(auraId); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_putricide_clear_aura_effect_value_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_putricide_clear_aura_effect_value_SpellScript(); + PreventHitDefaultEffect(effIndex); + uint32 auraId = sSpellMgr->GetSpellIdForDifficulty(uint32(GetEffectValue()), GetCaster()); + GetHitUnit()->RemoveAurasDueToSpell(auraId); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_putricide_clear_aura_effect_value_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_putricide_clear_aura_effect_value_SpellScript(); + } }; class spell_putricide_mutation_init : public SpellScriptLoader { - public: - spell_putricide_mutation_init() : SpellScriptLoader("spell_putricide_mutation_init") { } +public: + spell_putricide_mutation_init() : SpellScriptLoader("spell_putricide_mutation_init") { } - class spell_putricide_mutation_init_SpellScript : public SpellScript + class spell_putricide_mutation_init_SpellScript : public SpellScript + { + PrepareSpellScript(spell_putricide_mutation_init_SpellScript); + + SpellCastResult CheckRequirementInternal(SpellCustomErrors& extendedError) { - PrepareSpellScript(spell_putricide_mutation_init_SpellScript); + InstanceScript* instance = GetExplTargetUnit()->GetInstanceScript(); + if (!instance) + return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; - SpellCastResult CheckRequirementInternal(SpellCustomErrors& extendedError) + Creature* professor = ObjectAccessor::GetCreature(*GetExplTargetUnit(), instance->GetData64(DATA_PROFESSOR_PUTRICIDE)); + if (!professor) + return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; + + if (professor->AI()->GetData(DATA_PHASE) == 3 || !professor->IsAlive()) { - InstanceScript* instance = GetExplTargetUnit()->GetInstanceScript(); - if (!instance) - return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; - - Creature* professor = ObjectAccessor::GetCreature(*GetExplTargetUnit(), instance->GetData64(DATA_PROFESSOR_PUTRICIDE)); - if (!professor) - return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; - - if (professor->AI()->GetData(DATA_PHASE) == 3 || !professor->IsAlive()) - { - extendedError = SPELL_CUSTOM_ERROR_ALL_POTIONS_USED; - return SPELL_FAILED_CUSTOM_ERROR; - } - - if (professor->AI()->GetData(DATA_ABOMINATION)) - { - extendedError = SPELL_CUSTOM_ERROR_TOO_MANY_ABOMINATIONS; - return SPELL_FAILED_CUSTOM_ERROR; - } - - return SPELL_CAST_OK; + extendedError = SPELL_CUSTOM_ERROR_ALL_POTIONS_USED; + return SPELL_FAILED_CUSTOM_ERROR; } - SpellCastResult CheckRequirement() + if (professor->AI()->GetData(DATA_ABOMINATION)) { - if (!GetExplTargetUnit()) - return SPELL_FAILED_BAD_TARGETS; - - if (GetExplTargetUnit()->GetTypeId() != TYPEID_PLAYER) - return SPELL_FAILED_TARGET_NOT_PLAYER; - - SpellCustomErrors extension = SPELL_CUSTOM_ERROR_NONE; - SpellCastResult result = CheckRequirementInternal(extension); - if (result != SPELL_CAST_OK) - { - Spell::SendCastResult(GetExplTargetUnit()->ToPlayer(), GetSpellInfo(), 0, result, extension); - return result; - } - - return SPELL_CAST_OK; + extendedError = SPELL_CUSTOM_ERROR_TOO_MANY_ABOMINATIONS; + return SPELL_FAILED_CUSTOM_ERROR; } - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_putricide_mutation_init_SpellScript::CheckRequirement); - } - }; - - class spell_putricide_mutation_init_AuraScript : public AuraScript - { - PrepareAuraScript(spell_putricide_mutation_init_AuraScript); - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - uint32 spellId = 70311; - if (GetTarget()->GetMap()->GetSpawnMode() & 1) - spellId = 71503; - - GetTarget()->CastSpell(GetTarget(), spellId, true); - } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_putricide_mutation_init_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_putricide_mutation_init_SpellScript(); + return SPELL_CAST_OK; } - AuraScript* GetAuraScript() const + SpellCastResult CheckRequirement() { - return new spell_putricide_mutation_init_AuraScript(); + if (!GetExplTargetUnit()) + return SPELL_FAILED_BAD_TARGETS; + + if (GetExplTargetUnit()->GetTypeId() != TYPEID_PLAYER) + return SPELL_FAILED_TARGET_NOT_PLAYER; + + SpellCustomErrors extension = SPELL_CUSTOM_ERROR_NONE; + SpellCastResult result = CheckRequirementInternal(extension); + if (result != SPELL_CAST_OK) + { + Spell::SendCastResult(GetExplTargetUnit()->ToPlayer(), GetSpellInfo(), 0, result, extension); + return result; + } + + return SPELL_CAST_OK; } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_putricide_mutation_init_SpellScript::CheckRequirement); + } + }; + + class spell_putricide_mutation_init_AuraScript : public AuraScript + { + PrepareAuraScript(spell_putricide_mutation_init_AuraScript); + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + uint32 spellId = 70311; + if (GetTarget()->GetMap()->GetSpawnMode() & 1) + spellId = 71503; + + GetTarget()->CastSpell(GetTarget(), spellId, true); + } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_putricide_mutation_init_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_putricide_mutation_init_SpellScript(); + } + + AuraScript* GetAuraScript() const + { + return new spell_putricide_mutation_init_AuraScript(); + } }; class spell_putricide_mutated_transformation : public SpellScriptLoader { - public: - spell_putricide_mutated_transformation() : SpellScriptLoader("spell_putricide_mutated_transformation") { } +public: + spell_putricide_mutated_transformation() : SpellScriptLoader("spell_putricide_mutated_transformation") { } - class spell_putricide_mutated_transformation_SpellScript : public SpellScript + class spell_putricide_mutated_transformation_SpellScript : public SpellScript + { + PrepareSpellScript(spell_putricide_mutated_transformation_SpellScript); + + void HandleSummon(SpellEffIndex effIndex) { - PrepareSpellScript(spell_putricide_mutated_transformation_SpellScript); + PreventHitDefaultEffect(effIndex); + Unit* caster = GetOriginalCaster(); + if (!caster) + return; - void HandleSummon(SpellEffIndex effIndex) + InstanceScript* instance = caster->GetInstanceScript(); + if (!instance) + return; + + Creature* putricide = ObjectAccessor::GetCreature(*caster, instance->GetData64(DATA_PROFESSOR_PUTRICIDE)); + if (!putricide) + return; + + if (putricide->AI()->GetData(DATA_ABOMINATION)) { - PreventHitDefaultEffect(effIndex); - Unit* caster = GetOriginalCaster(); - if (!caster) - return; - - InstanceScript* instance = caster->GetInstanceScript(); - if (!instance) - return; - - Creature* putricide = ObjectAccessor::GetCreature(*caster, instance->GetData64(DATA_PROFESSOR_PUTRICIDE)); - if (!putricide) - return; - - if (putricide->AI()->GetData(DATA_ABOMINATION)) - { - if (Player* player = caster->ToPlayer()) - Spell::SendCastResult(player, GetSpellInfo(), 0, SPELL_FAILED_CUSTOM_ERROR, SPELL_CUSTOM_ERROR_TOO_MANY_ABOMINATIONS); - return; - } - - if (!putricide->IsInCombat()) - putricide->SetInCombatWithZone(); - - uint32 entry = uint32(GetSpellInfo()->Effects[effIndex].MiscValue); - SummonPropertiesEntry const* properties = sSummonPropertiesStore.LookupEntry(uint32(GetSpellInfo()->Effects[effIndex].MiscValueB)); - uint32 duration = uint32(GetSpellInfo()->GetDuration()); - - Position pos; - caster->GetPosition(&pos); - TempSummon* summon = caster->GetMap()->SummonCreature(entry, pos, properties, duration, caster, GetSpellInfo()->Id); - if (!summon || !summon->IsVehicle()) - return; - - summon->CastSpell(summon, SPELL_ABOMINATION_VEHICLE_POWER_DRAIN, true); - summon->CastSpell(summon, SPELL_MUTATED_TRANSFORMATION_DAMAGE, true); - caster->CastSpell(summon, SPELL_MUTATED_TRANSFORMATION_NAME, true); - - //EnterVehicle(summon, 0); // VEHICLE_SPELL_RIDE_HARDCODED is used according to sniff, this is ok - caster->CastCustomSpell(VEHICLE_SPELL_RIDE_HARDCODED, SPELLVALUE_BASE_POINT0, 1, summon, TRIGGERED_FULL_MASK); - summon->SetCreatorGUID(caster->GetGUID()); - putricide->AI()->JustSummoned(summon); - - summon->setPowerType(POWER_ENERGY); - summon->SetMaxPower(POWER_ENERGY, 100); - summon->SetPower(POWER_ENERGY, 0); - summon->SetStatFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER, 0); - summon->SetStatFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER, 0); + if (Player* player = caster->ToPlayer()) + Spell::SendCastResult(player, GetSpellInfo(), 0, SPELL_FAILED_CUSTOM_ERROR, SPELL_CUSTOM_ERROR_TOO_MANY_ABOMINATIONS); + return; } - void Register() - { - OnEffectHit += SpellEffectFn(spell_putricide_mutated_transformation_SpellScript::HandleSummon, EFFECT_0, SPELL_EFFECT_SUMMON); - } - }; + if (!putricide->IsInCombat()) + putricide->SetInCombatWithZone(); - SpellScript* GetSpellScript() const - { - return new spell_putricide_mutated_transformation_SpellScript(); + uint32 entry = uint32(GetSpellInfo()->Effects[effIndex].MiscValue); + SummonPropertiesEntry const* properties = sSummonPropertiesStore.LookupEntry(uint32(GetSpellInfo()->Effects[effIndex].MiscValueB)); + uint32 duration = uint32(GetSpellInfo()->GetDuration()); + + Position pos; + caster->GetPosition(&pos); + TempSummon* summon = caster->GetMap()->SummonCreature(entry, pos, properties, duration, caster, GetSpellInfo()->Id); + if (!summon || !summon->IsVehicle()) + return; + + summon->CastSpell(summon, SPELL_ABOMINATION_VEHICLE_POWER_DRAIN, true); + summon->CastSpell(summon, SPELL_MUTATED_TRANSFORMATION_DAMAGE, true); + caster->CastSpell(summon, SPELL_MUTATED_TRANSFORMATION_NAME, true); + + //EnterVehicle(summon, 0); // VEHICLE_SPELL_RIDE_HARDCODED is used according to sniff, this is ok + caster->CastCustomSpell(VEHICLE_SPELL_RIDE_HARDCODED, SPELLVALUE_BASE_POINT0, 1, summon, TRIGGERED_FULL_MASK); + summon->SetCreatorGUID(caster->GetGUID()); + putricide->AI()->JustSummoned(summon); + + summon->setPowerType(POWER_ENERGY); + summon->SetMaxPower(POWER_ENERGY, 100); + summon->SetPower(POWER_ENERGY, 0); + summon->SetStatFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER, 0); + summon->SetStatFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER, 0); } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_putricide_mutated_transformation_SpellScript::HandleSummon, EFFECT_0, SPELL_EFFECT_SUMMON); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_putricide_mutated_transformation_SpellScript(); + } }; class spell_putricide_mutated_transformation_dismiss : public SpellScriptLoader { - public: - spell_putricide_mutated_transformation_dismiss() : SpellScriptLoader("spell_putricide_mutated_transformation_dismiss") { } +public: + spell_putricide_mutated_transformation_dismiss() : SpellScriptLoader("spell_putricide_mutated_transformation_dismiss") { } - class spell_putricide_mutated_transformation_dismiss_AuraScript : public AuraScript + class spell_putricide_mutated_transformation_dismiss_AuraScript : public AuraScript + { + PrepareAuraScript(spell_putricide_mutated_transformation_dismiss_AuraScript); + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_putricide_mutated_transformation_dismiss_AuraScript); - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Vehicle* veh = GetTarget()->GetVehicleKit()) - veh->RemoveAllPassengers(); - } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_putricide_mutated_transformation_dismiss_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_putricide_mutated_transformation_dismiss_AuraScript(); + if (Vehicle* veh = GetTarget()->GetVehicleKit()) + veh->RemoveAllPassengers(); } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_putricide_mutated_transformation_dismiss_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_putricide_mutated_transformation_dismiss_AuraScript(); + } }; class spell_putricide_mutated_transformation_dmg : public SpellScriptLoader { - public: - spell_putricide_mutated_transformation_dmg() : SpellScriptLoader("spell_putricide_mutated_transformation_dmg") { } +public: + spell_putricide_mutated_transformation_dmg() : SpellScriptLoader("spell_putricide_mutated_transformation_dmg") { } - class spell_putricide_mutated_transformation_dmg_SpellScript : public SpellScript + class spell_putricide_mutated_transformation_dmg_SpellScript : public SpellScript + { + PrepareSpellScript(spell_putricide_mutated_transformation_dmg_SpellScript); + + void FilterTargetsInitial(std::list& targets) { - PrepareSpellScript(spell_putricide_mutated_transformation_dmg_SpellScript); - - void FilterTargetsInitial(std::list& targets) - { - if (Unit* owner = ObjectAccessor::GetUnit(*GetCaster(), GetCaster()->GetCreatorGUID())) - targets.remove(owner); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_mutated_transformation_dmg_SpellScript::FilterTargetsInitial, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_putricide_mutated_transformation_dmg_SpellScript(); + if (Unit* owner = ObjectAccessor::GetUnit(*GetCaster(), GetCaster()->GetCreatorGUID())) + targets.remove(owner); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_mutated_transformation_dmg_SpellScript::FilterTargetsInitial, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_putricide_mutated_transformation_dmg_SpellScript(); + } }; class spell_putricide_eat_ooze : public SpellScriptLoader { - public: - spell_putricide_eat_ooze() : SpellScriptLoader("spell_putricide_eat_ooze") { } +public: + spell_putricide_eat_ooze() : SpellScriptLoader("spell_putricide_eat_ooze") { } - class spell_putricide_eat_ooze_SpellScript : public SpellScript + class spell_putricide_eat_ooze_SpellScript : public SpellScript + { + PrepareSpellScript(spell_putricide_eat_ooze_SpellScript); + + void SelectTarget(std::list& targets) { - PrepareSpellScript(spell_putricide_eat_ooze_SpellScript); + if (targets.empty()) + return; - void SelectTarget(std::list& targets) - { - if (targets.empty()) - return; - - targets.sort(acore::ObjectDistanceOrderPred(GetCaster())); - WorldObject* target = targets.front(); - targets.clear(); - targets.push_back(target); - } - - void HandleScript(SpellEffIndex /*effIndex*/) - { - Creature* target = GetHitCreature(); - if (!target) - return; - - if (Aura* grow = target->GetAura(uint32(GetEffectValue()))) - { - if (grow->GetStackAmount() <= 4) - { - target->RemoveAurasDueToSpell(SPELL_GROW_STACKER); - target->RemoveAura(grow); - target->DespawnOrUnsummon(1); - } - else - grow->ModStackAmount(-4); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_putricide_eat_ooze_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_eat_ooze_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_DEST_AREA_ENTRY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_putricide_eat_ooze_SpellScript(); + targets.sort(acore::ObjectDistanceOrderPred(GetCaster())); + WorldObject* target = targets.front(); + targets.clear(); + targets.push_back(target); } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Creature* target = GetHitCreature(); + if (!target) + return; + + if (Aura* grow = target->GetAura(uint32(GetEffectValue()))) + { + if (grow->GetStackAmount() <= 4) + { + target->RemoveAurasDueToSpell(SPELL_GROW_STACKER); + target->RemoveAura(grow); + target->DespawnOrUnsummon(1); + } + else + grow->ModStackAmount(-4); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_putricide_eat_ooze_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_putricide_eat_ooze_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_DEST_AREA_ENTRY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_putricide_eat_ooze_SpellScript(); + } }; class spell_putricide_regurgitated_ooze : public SpellScriptLoader { - public: - spell_putricide_regurgitated_ooze() : SpellScriptLoader("spell_putricide_regurgitated_ooze") { } +public: + spell_putricide_regurgitated_ooze() : SpellScriptLoader("spell_putricide_regurgitated_ooze") { } - class spell_putricide_regurgitated_ooze_SpellScript : public SpellScript + class spell_putricide_regurgitated_ooze_SpellScript : public SpellScript + { + PrepareSpellScript(spell_putricide_regurgitated_ooze_SpellScript); + + // the only purpose of this hook is to fail the achievement + void ExtraEffect(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_putricide_regurgitated_ooze_SpellScript); - - // the only purpose of this hook is to fail the achievement - void ExtraEffect(SpellEffIndex /*effIndex*/) - { - if (InstanceScript* instance = GetCaster()->GetInstanceScript()) - instance->SetData(DATA_NAUSEA_ACHIEVEMENT, uint32(false)); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_putricide_regurgitated_ooze_SpellScript::ExtraEffect, EFFECT_0, SPELL_EFFECT_APPLY_AURA); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_putricide_regurgitated_ooze_SpellScript(); + if (InstanceScript* instance = GetCaster()->GetInstanceScript()) + instance->SetData(DATA_NAUSEA_ACHIEVEMENT, uint32(false)); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_putricide_regurgitated_ooze_SpellScript::ExtraEffect, EFFECT_0, SPELL_EFFECT_APPLY_AURA); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_putricide_regurgitated_ooze_SpellScript(); + } }; void AddSC_boss_professor_putricide() diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp index 636d55a20..20d23305a 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp @@ -84,10 +84,14 @@ uint32 getOozeFloodSpellIndex(uint32 id) { switch (id) { - case 69782: return 0; - case 69796: return 1; - case 69798: return 2; - case 69801: return 3; + case 69782: + return 0; + case 69796: + return 1; + case 69798: + return 2; + case 69801: + return 3; } return 0; } @@ -104,537 +108,600 @@ struct RotfaceHeightCheck class boss_rotface : public CreatureScript { - public: - boss_rotface() : CreatureScript("boss_rotface") { } +public: + boss_rotface() : CreatureScript("boss_rotface") { } - struct boss_rotfaceAI : public BossAI + struct boss_rotfaceAI : public BossAI + { + boss_rotfaceAI(Creature* creature) : BossAI(creature, DATA_ROTFACE) { - boss_rotfaceAI(Creature* creature) : BossAI(creature, DATA_ROTFACE) - { - } - - uint32 infectionCooldown; - uint64 _oozeFloodDummyGUIDs[4][2]; - uint8 _oozeFloodStage; - - void Reset() - { - infectionCooldown = 14000; - memset(&_oozeFloodDummyGUIDs, 0, sizeof(_oozeFloodDummyGUIDs)); - _oozeFloodStage = 0; - _Reset(); - events.Reset(); - } - - void EnterCombat(Unit* who) - { - if (!instance->CheckRequiredBosses(DATA_ROTFACE, who->ToPlayer())) - { - EnterEvadeMode(); - instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT); - return; - } - - // schedule events - events.Reset(); - events.ScheduleEvent(EVENT_SLIME_SPRAY, 20000); - events.ScheduleEvent(EVENT_HASTEN_INFECTIONS, 90000); - events.ScheduleEvent(EVENT_MUTATED_INFECTION, 14000); - events.ScheduleEvent(EVENT_ROTFACE_OOZE_FLOOD, 8000); - if (IsHeroic()) - events.ScheduleEvent(EVENT_ROTFACE_VILE_GAS, urand(15000, 20000)); - - me->setActive(true); - Talk(SAY_AGGRO); - DoZoneInCombat(); - - if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) - professor->AI()->DoAction(ACTION_ROTFACE_COMBAT); - - instance->SetData(DATA_OOZE_DANCE_ACHIEVEMENT, uint32(true)); // reset - - // randomize ooze flood - _oozeFloodStage = urand(0,3); - std::list list; - GetCreatureListWithEntryInGrid(list, me, NPC_PUDDLE_STALKER, 60.0f); - list.remove_if(RotfaceHeightCheck()); // remove from the list all on the ground - for (std::list::const_iterator itr = list.begin(); itr != list.end(); ++itr) - { - uint32 index = me->GetHomePosition().GetAngle(*itr)/(M_PI/2.0f); - if (index>3) index = 3; - if (_oozeFloodDummyGUIDs[index][0]) - _oozeFloodDummyGUIDs[index][1] = (*itr)->GetGUID(); - else - _oozeFloodDummyGUIDs[index][0] = (*itr)->GetGUID(); - } - } - - void JustDied(Unit* /*killer*/) - { - instance->DoRemoveAurasDueToSpellOnPlayers(MUTATED_INFECTION); - _JustDied(); - Talk(SAY_DEATH); - if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) - professor->AI()->DoAction(ACTION_ROTFACE_DEATH); - } - - void JustReachedHome() - { - _JustReachedHome(); - instance->SetBossState(DATA_ROTFACE, FAIL); - } - - void JustSummoned(Creature* summon) - { - if (me->IsAlive() && me->IsInCombat() && !me->IsInEvadeMode()) - summons.Summon(summon); - else - summon->DespawnOrUnsummon(1); - } - - void KilledUnit(Unit* victim) - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_KILL); - } - - void EnterEvadeMode() - { - me->SetControlled(false, UNIT_STATE_ROOT); - me->DisableRotate(false); - ScriptedAI::EnterEvadeMode(); - if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) - professor->AI()->EnterEvadeMode(); - } - - void SpellHitTarget(Unit* target, SpellInfo const* spell) - { - switch (spell->Id) - { - case SPELL_SLIME_SPRAY: - Talk(SAY_SLIME_SPRAY); - break; - case 69507: // Slime Spray damage - case 71213: - case 73189: - case 73190: - if (Player* p = target->ToPlayer()) - if (p->GetQuestStatus(QUEST_RESIDUE_RENDEZVOUS_10) == QUEST_STATUS_INCOMPLETE || p->GetQuestStatus(QUEST_RESIDUE_RENDEZVOUS_25) == QUEST_STATUS_INCOMPLETE) - p->CastSpell(p, SPELL_GREEN_BLIGHT_RESIDUE, true); - break; - case 69782: - case 69796: - case 69798: - case 69801: - { - uint32 index = getOozeFloodSpellIndex(spell->Id); - if (target->GetGUID() == _oozeFloodDummyGUIDs[index][0] || target->GetGUID() == _oozeFloodDummyGUIDs[index][1]) - target->CastSpell((Unit*)NULL, spell->Effects[0].CalcValue(), false); - } - break; - } - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim() || !CheckInRoom()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_UNROOT: - me->SetControlled(false, UNIT_STATE_ROOT); - me->DisableRotate(false); - break; - case EVENT_SLIME_SPRAY: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(me))) - { - if (Creature* c = me->SummonCreature(NPC_OOZE_SPRAY_STALKER, *target, TEMPSUMMON_TIMED_DESPAWN, 8000)) - { - me->SetOrientation(me->GetAngle(c)); - me->SetControlled(true, UNIT_STATE_ROOT); - me->DisableRotate(true); - me->SetFacingTo(me->GetAngle(c)); - me->SendMovementFlagUpdate(); - Talk(EMOTE_SLIME_SPRAY); - me->CastSpell(c, SPELL_SLIME_SPRAY, false); - } - } - events.DelayEvents(1); - events.ScheduleEvent(EVENT_SLIME_SPRAY, 20000); - events.ScheduleEvent(EVENT_UNROOT, 0); - break; - case EVENT_HASTEN_INFECTIONS: - if (infectionCooldown >= 8000) - { - infectionCooldown -= 2000; - events.ScheduleEvent(EVENT_HASTEN_INFECTIONS, 90000); - } - break; - case EVENT_MUTATED_INFECTION: - me->CastCustomSpell(SPELL_MUTATED_INFECTION, SPELLVALUE_MAX_TARGETS, 1, NULL, false); - events.ScheduleEvent(EVENT_MUTATED_INFECTION, infectionCooldown); - break; - case EVENT_ROTFACE_OOZE_FLOOD: - if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) - { - professor->AI()->Talk(SAY_ROTFACE_OOZE_FLOOD); - me->CastSpell((Unit*)NULL, oozeFloodSpells[_oozeFloodStage], true); - if (++_oozeFloodStage == 4) - _oozeFloodStage = 0; - } - events.ScheduleEvent(EVENT_ROTFACE_OOZE_FLOOD, 25000); - break; - case EVENT_ROTFACE_VILE_GAS: - { - std::list targets; - uint32 minTargets = RAID_MODE(3, 8, 3, 8); - SelectTargetList(targets, minTargets, SELECT_TARGET_RANDOM, -5.0f, true); - float minDist = 0.0f; - if (targets.size() >= minTargets) - minDist = -5.0f; - - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, minDist, true)) - if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) - professor->CastSpell(target, SPELL_VILE_GAS_H, true); // triggered, to skip LoS check - } - events.ScheduleEvent(EVENT_ROTFACE_VILE_GAS, urand(15000, 20000)); - break; - default: - break; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); } + + uint32 infectionCooldown; + uint64 _oozeFloodDummyGUIDs[4][2]; + uint8 _oozeFloodStage; + + void Reset() + { + infectionCooldown = 14000; + memset(&_oozeFloodDummyGUIDs, 0, sizeof(_oozeFloodDummyGUIDs)); + _oozeFloodStage = 0; + _Reset(); + events.Reset(); + } + + void EnterCombat(Unit* who) + { + if (!instance->CheckRequiredBosses(DATA_ROTFACE, who->ToPlayer())) + { + EnterEvadeMode(); + instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT); + return; + } + + // schedule events + events.Reset(); + events.ScheduleEvent(EVENT_SLIME_SPRAY, 20000); + events.ScheduleEvent(EVENT_HASTEN_INFECTIONS, 90000); + events.ScheduleEvent(EVENT_MUTATED_INFECTION, 14000); + events.ScheduleEvent(EVENT_ROTFACE_OOZE_FLOOD, 8000); + if (IsHeroic()) + events.ScheduleEvent(EVENT_ROTFACE_VILE_GAS, urand(15000, 20000)); + + me->setActive(true); + Talk(SAY_AGGRO); + DoZoneInCombat(); + + if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) + professor->AI()->DoAction(ACTION_ROTFACE_COMBAT); + + instance->SetData(DATA_OOZE_DANCE_ACHIEVEMENT, uint32(true)); // reset + + // randomize ooze flood + _oozeFloodStage = urand(0, 3); + std::list list; + GetCreatureListWithEntryInGrid(list, me, NPC_PUDDLE_STALKER, 60.0f); + list.remove_if(RotfaceHeightCheck()); // remove from the list all on the ground + for (std::list::const_iterator itr = list.begin(); itr != list.end(); ++itr) + { + uint32 index = me->GetHomePosition().GetAngle(*itr) / (M_PI / 2.0f); + if (index > 3) index = 3; + if (_oozeFloodDummyGUIDs[index][0]) + _oozeFloodDummyGUIDs[index][1] = (*itr)->GetGUID(); + else + _oozeFloodDummyGUIDs[index][0] = (*itr)->GetGUID(); + } + } + + void JustDied(Unit* /*killer*/) + { + instance->DoRemoveAurasDueToSpellOnPlayers(MUTATED_INFECTION); + _JustDied(); + Talk(SAY_DEATH); + if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) + professor->AI()->DoAction(ACTION_ROTFACE_DEATH); + } + + void JustReachedHome() + { + _JustReachedHome(); + instance->SetBossState(DATA_ROTFACE, FAIL); + } + + void JustSummoned(Creature* summon) + { + if (me->IsAlive() && me->IsInCombat() && !me->IsInEvadeMode()) + summons.Summon(summon); + else + summon->DespawnOrUnsummon(1); + } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_KILL); + } + + void EnterEvadeMode() + { + me->SetControlled(false, UNIT_STATE_ROOT); + me->DisableRotate(false); + ScriptedAI::EnterEvadeMode(); + if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) + professor->AI()->EnterEvadeMode(); + } + + void SpellHitTarget(Unit* target, SpellInfo const* spell) + { + switch (spell->Id) + { + case SPELL_SLIME_SPRAY: + Talk(SAY_SLIME_SPRAY); + break; + case 69507: // Slime Spray damage + case 71213: + case 73189: + case 73190: + if (Player* p = target->ToPlayer()) + if (p->GetQuestStatus(QUEST_RESIDUE_RENDEZVOUS_10) == QUEST_STATUS_INCOMPLETE || p->GetQuestStatus(QUEST_RESIDUE_RENDEZVOUS_25) == QUEST_STATUS_INCOMPLETE) + p->CastSpell(p, SPELL_GREEN_BLIGHT_RESIDUE, true); + break; + case 69782: + case 69796: + case 69798: + case 69801: + { + uint32 index = getOozeFloodSpellIndex(spell->Id); + if (target->GetGUID() == _oozeFloodDummyGUIDs[index][0] || target->GetGUID() == _oozeFloodDummyGUIDs[index][1]) + target->CastSpell((Unit*)NULL, spell->Effects[0].CalcValue(), false); + } + break; + } + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim() || !CheckInRoom()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_UNROOT: + me->SetControlled(false, UNIT_STATE_ROOT); + me->DisableRotate(false); + break; + case EVENT_SLIME_SPRAY: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(me))) + { + if (Creature* c = me->SummonCreature(NPC_OOZE_SPRAY_STALKER, *target, TEMPSUMMON_TIMED_DESPAWN, 8000)) + { + me->SetOrientation(me->GetAngle(c)); + me->SetControlled(true, UNIT_STATE_ROOT); + me->DisableRotate(true); + me->SetFacingTo(me->GetAngle(c)); + me->SendMovementFlagUpdate(); + Talk(EMOTE_SLIME_SPRAY); + me->CastSpell(c, SPELL_SLIME_SPRAY, false); + } + } + events.DelayEvents(1); + events.ScheduleEvent(EVENT_SLIME_SPRAY, 20000); + events.ScheduleEvent(EVENT_UNROOT, 0); + break; + case EVENT_HASTEN_INFECTIONS: + if (infectionCooldown >= 8000) + { + infectionCooldown -= 2000; + events.ScheduleEvent(EVENT_HASTEN_INFECTIONS, 90000); + } + break; + case EVENT_MUTATED_INFECTION: + me->CastCustomSpell(SPELL_MUTATED_INFECTION, SPELLVALUE_MAX_TARGETS, 1, NULL, false); + events.ScheduleEvent(EVENT_MUTATED_INFECTION, infectionCooldown); + break; + case EVENT_ROTFACE_OOZE_FLOOD: + if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) + { + professor->AI()->Talk(SAY_ROTFACE_OOZE_FLOOD); + me->CastSpell((Unit*)NULL, oozeFloodSpells[_oozeFloodStage], true); + if (++_oozeFloodStage == 4) + _oozeFloodStage = 0; + } + events.ScheduleEvent(EVENT_ROTFACE_OOZE_FLOOD, 25000); + break; + case EVENT_ROTFACE_VILE_GAS: + { + std::list targets; + uint32 minTargets = RAID_MODE(3, 8, 3, 8); + SelectTargetList(targets, minTargets, SELECT_TARGET_RANDOM, -5.0f, true); + float minDist = 0.0f; + if (targets.size() >= minTargets) + minDist = -5.0f; + + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, minDist, true)) + if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) + professor->CastSpell(target, SPELL_VILE_GAS_H, true); // triggered, to skip LoS check + } + events.ScheduleEvent(EVENT_ROTFACE_VILE_GAS, urand(15000, 20000)); + break; + default: + break; + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class npc_little_ooze : public CreatureScript { - public: - npc_little_ooze() : CreatureScript("npc_little_ooze") { } +public: + npc_little_ooze() : CreatureScript("npc_little_ooze") { } - struct npc_little_oozeAI : public ScriptedAI + struct npc_little_oozeAI : public ScriptedAI + { + npc_little_oozeAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) { - npc_little_oozeAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) - { - firstUpdate = true; - if (Creature* rotface = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ROTFACE))) - rotface->AI()->JustSummoned(me); - } - - bool firstUpdate; - EventMap events; - InstanceScript* instance; - - void IsSummonedBy(Unit* summoner) - { - if (!summoner) - return; - - me->AddThreat(summoner, 500000.0f); - AttackStart(summoner); - } - - void JustDied(Unit* /*killer*/) - { - if (Creature* rotface = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ROTFACE))) - rotface->AI()->SummonedCreatureDespawn(me); - me->DespawnOrUnsummon(0); - } - - void UpdateAI(uint32 diff) - { - if (firstUpdate) - { - firstUpdate = false; - me->CastSpell(me, SPELL_LITTLE_OOZE_COMBINE, true); - me->CastSpell(me, SPELL_WEAK_RADIATING_OOZE, true); - events.Reset(); - events.ScheduleEvent(EVENT_STICKY_OOZE, 5000); - DoResetThreat(); - me->SetInCombatWithZone(); - if (TempSummon* ts = me->ToTempSummon()) - if (Unit* summoner = ts->GetSummoner()) - { - me->AddThreat(summoner, 500000.0f); - AttackStart(summoner); - } - } - - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (events.ExecuteEvent() == EVENT_STICKY_OOZE) - { - me->CastSpell(me->GetVictim(), SPELL_STICKY_OOZE, false); - events.ScheduleEvent(EVENT_STICKY_OOZE, 15000); - } - - DoMeleeAttackIfReady(); - } - - void EnterEvadeMode() - { - me->SetInCombatWithZone(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + firstUpdate = true; + if (Creature* rotface = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ROTFACE))) + rotface->AI()->JustSummoned(me); } + + bool firstUpdate; + EventMap events; + InstanceScript* instance; + + void IsSummonedBy(Unit* summoner) + { + if (!summoner) + return; + + me->AddThreat(summoner, 500000.0f); + AttackStart(summoner); + } + + void JustDied(Unit* /*killer*/) + { + if (Creature* rotface = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ROTFACE))) + rotface->AI()->SummonedCreatureDespawn(me); + me->DespawnOrUnsummon(0); + } + + void UpdateAI(uint32 diff) + { + if (firstUpdate) + { + firstUpdate = false; + me->CastSpell(me, SPELL_LITTLE_OOZE_COMBINE, true); + me->CastSpell(me, SPELL_WEAK_RADIATING_OOZE, true); + events.Reset(); + events.ScheduleEvent(EVENT_STICKY_OOZE, 5000); + DoResetThreat(); + me->SetInCombatWithZone(); + if (TempSummon* ts = me->ToTempSummon()) + if (Unit* summoner = ts->GetSummoner()) + { + me->AddThreat(summoner, 500000.0f); + AttackStart(summoner); + } + } + + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (events.ExecuteEvent() == EVENT_STICKY_OOZE) + { + me->CastSpell(me->GetVictim(), SPELL_STICKY_OOZE, false); + events.ScheduleEvent(EVENT_STICKY_OOZE, 15000); + } + + DoMeleeAttackIfReady(); + } + + void EnterEvadeMode() + { + me->SetInCombatWithZone(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class npc_big_ooze : public CreatureScript { - public: - npc_big_ooze() : CreatureScript("npc_big_ooze") { } +public: + npc_big_ooze() : CreatureScript("npc_big_ooze") { } - struct npc_big_oozeAI : public ScriptedAI + struct npc_big_oozeAI : public ScriptedAI + { + npc_big_oozeAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) { - npc_big_oozeAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) - { - firstUpdate = true; - if (Creature* rotface = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ROTFACE))) - rotface->AI()->JustSummoned(me); - } + firstUpdate = true; + if (Creature* rotface = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ROTFACE))) + rotface->AI()->JustSummoned(me); + } - bool firstUpdate; - EventMap events; - InstanceScript* instance; + bool firstUpdate; + EventMap events; + InstanceScript* instance; - void IsSummonedBy(Unit* /*summoner*/) + void IsSummonedBy(Unit* /*summoner*/) + { + if (Player* p = me->SelectNearestPlayer(100.0f)) + AttackStart(p); + } + + void JustDied(Unit* /*killer*/) + { + if (Creature* rotface = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ROTFACE))) + rotface->AI()->SummonedCreatureDespawn(me); + me->DespawnOrUnsummon(); + } + + void DoAction(int32 action) + { + if (action == EVENT_STICKY_OOZE) + events.CancelEvent(EVENT_STICKY_OOZE); + } + + void UpdateAI(uint32 diff) + { + if (firstUpdate) { + firstUpdate = false; + me->CastSpell(me, SPELL_LARGE_OOZE_COMBINE, true); + me->CastSpell(me, SPELL_LARGE_OOZE_BUFF_COMBINE, true); + me->CastSpell(me, SPELL_RADIATING_OOZE, true); + me->CastSpell(me, SPELL_UNSTABLE_OOZE, true); + me->CastSpell(me, SPELL_GREEN_ABOMINATION_HITTIN__YA_PROC, true); + events.Reset(); + events.ScheduleEvent(EVENT_STICKY_OOZE, 5000); + DoResetThreat(); + me->SetInCombatWithZone(); if (Player* p = me->SelectNearestPlayer(100.0f)) AttackStart(p); } - void JustDied(Unit* /*killer*/) + if (!UpdateVictim()) + return; + + events.Update(diff); + + switch (events.ExecuteEvent()) { - if (Creature* rotface = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ROTFACE))) - rotface->AI()->SummonedCreatureDespawn(me); - me->DespawnOrUnsummon(); + case EVENT_STICKY_OOZE: + me->CastSpell(me->GetVictim(), SPELL_STICKY_OOZE, false); + events.ScheduleEvent(EVENT_STICKY_OOZE, 15000); + default: + break; } - void DoAction(int32 action) - { - if (action == EVENT_STICKY_OOZE) - events.CancelEvent(EVENT_STICKY_OOZE); - } - - void UpdateAI(uint32 diff) - { - if (firstUpdate) - { - firstUpdate = false; - me->CastSpell(me, SPELL_LARGE_OOZE_COMBINE, true); - me->CastSpell(me, SPELL_LARGE_OOZE_BUFF_COMBINE, true); - me->CastSpell(me, SPELL_RADIATING_OOZE, true); - me->CastSpell(me, SPELL_UNSTABLE_OOZE, true); - me->CastSpell(me, SPELL_GREEN_ABOMINATION_HITTIN__YA_PROC, true); - events.Reset(); - events.ScheduleEvent(EVENT_STICKY_OOZE, 5000); - DoResetThreat(); - me->SetInCombatWithZone(); - if (Player* p = me->SelectNearestPlayer(100.0f)) - AttackStart(p); - } - - if (!UpdateVictim()) - return; - - events.Update(diff); - - switch (events.ExecuteEvent()) - { - case EVENT_STICKY_OOZE: - me->CastSpell(me->GetVictim(), SPELL_STICKY_OOZE, false); - events.ScheduleEvent(EVENT_STICKY_OOZE, 15000); - default: - break; - } - - if (me->IsVisible()) - DoMeleeAttackIfReady(); - } - - void EnterEvadeMode() - { - me->SetInCombatWithZone(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + if (me->IsVisible()) + DoMeleeAttackIfReady(); } + + void EnterEvadeMode() + { + me->SetInCombatWithZone(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class spell_rotface_mutated_infection : public SpellScriptLoader { - public: - spell_rotface_mutated_infection() : SpellScriptLoader("spell_rotface_mutated_infection") { } +public: + spell_rotface_mutated_infection() : SpellScriptLoader("spell_rotface_mutated_infection") { } - class spell_rotface_mutated_infection_SpellScript : public SpellScript + class spell_rotface_mutated_infection_SpellScript : public SpellScript + { + PrepareSpellScript(spell_rotface_mutated_infection_SpellScript); + + bool Load() { - PrepareSpellScript(spell_rotface_mutated_infection_SpellScript); - - bool Load() - { - _target = nullptr; - return true; - } - - void FilterTargets(std::list& targets) - { - // remove targets with this aura already - // tank is not on this list - targets.remove_if(acore::UnitAuraCheck(true, GetSpellInfo()->Id)); - targets.remove(GetCaster()->GetVictim()); - if (targets.empty()) - return; - - WorldObject* target = acore::Containers::SelectRandomContainerElement(targets); - targets.clear(); - targets.push_back(target); - _target = target; - } - - void ReplaceTargets(std::list& targets) - { - targets.clear(); - if (_target) - targets.push_back(_target); - } - - void NotifyTargets() - { - if (Creature* caster = GetCaster()->ToCreature()) - if (Unit* target = GetHitUnit()) - caster->AI()->Talk(EMOTE_MUTATED_INFECTION, target); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_rotface_mutated_infection_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_rotface_mutated_infection_SpellScript::ReplaceTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_rotface_mutated_infection_SpellScript::ReplaceTargets, EFFECT_2, TARGET_UNIT_SRC_AREA_ENEMY); - AfterHit += SpellHitFn(spell_rotface_mutated_infection_SpellScript::NotifyTargets); - } - - WorldObject* _target; - }; - - class spell_rotface_mutated_infection_AuraScript : public AuraScript - { - PrepareAuraScript(spell_rotface_mutated_infection_AuraScript); - - void ExtraRemoveEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetTarget()->CastSpell(GetTarget(), GetSpellInfo()->Effects[2].CalcValue(), true); - } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_rotface_mutated_infection_AuraScript::ExtraRemoveEffect, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_rotface_mutated_infection_SpellScript(); + _target = nullptr; + return true; } - AuraScript* GetAuraScript() const + void FilterTargets(std::list& targets) { - return new spell_rotface_mutated_infection_AuraScript(); + // remove targets with this aura already + // tank is not on this list + targets.remove_if(acore::UnitAuraCheck(true, GetSpellInfo()->Id)); + targets.remove(GetCaster()->GetVictim()); + if (targets.empty()) + return; + + WorldObject* target = acore::Containers::SelectRandomContainerElement(targets); + targets.clear(); + targets.push_back(target); + _target = target; } + + void ReplaceTargets(std::list& targets) + { + targets.clear(); + if (_target) + targets.push_back(_target); + } + + void NotifyTargets() + { + if (Creature* caster = GetCaster()->ToCreature()) + if (Unit* target = GetHitUnit()) + caster->AI()->Talk(EMOTE_MUTATED_INFECTION, target); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_rotface_mutated_infection_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_rotface_mutated_infection_SpellScript::ReplaceTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_rotface_mutated_infection_SpellScript::ReplaceTargets, EFFECT_2, TARGET_UNIT_SRC_AREA_ENEMY); + AfterHit += SpellHitFn(spell_rotface_mutated_infection_SpellScript::NotifyTargets); + } + + WorldObject* _target; + }; + + class spell_rotface_mutated_infection_AuraScript : public AuraScript + { + PrepareAuraScript(spell_rotface_mutated_infection_AuraScript); + + void ExtraRemoveEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->CastSpell(GetTarget(), GetSpellInfo()->Effects[2].CalcValue(), true); + } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_rotface_mutated_infection_AuraScript::ExtraRemoveEffect, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_rotface_mutated_infection_SpellScript(); + } + + AuraScript* GetAuraScript() const + { + return new spell_rotface_mutated_infection_AuraScript(); + } }; class spell_rotface_little_ooze_combine : public SpellScriptLoader { - public: - spell_rotface_little_ooze_combine() : SpellScriptLoader("spell_rotface_little_ooze_combine") { } +public: + spell_rotface_little_ooze_combine() : SpellScriptLoader("spell_rotface_little_ooze_combine") { } - class spell_rotface_little_ooze_combine_SpellScript : public SpellScript + class spell_rotface_little_ooze_combine_SpellScript : public SpellScript + { + PrepareSpellScript(spell_rotface_little_ooze_combine_SpellScript); + + void HandleScript(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_rotface_little_ooze_combine_SpellScript); + // little targetting little - void HandleScript(SpellEffIndex /*effIndex*/) - { - // little targetting little + if (!GetHitCreature() || !GetHitCreature()->IsAlive()) + return; - if (!GetHitCreature() || !GetHitCreature()->IsAlive()) - return; - - GetCaster()->RemoveAurasDueToSpell(SPELL_LITTLE_OOZE_COMBINE); - GetHitCreature()->RemoveAurasDueToSpell(SPELL_LITTLE_OOZE_COMBINE); - GetHitCreature()->CastSpell(GetCaster(), SPELL_OOZE_MERGE, true); - GetHitCreature()->DespawnOrUnsummon(); - if (GetCaster()->ToCreature()) - GetCaster()->ToCreature()->DespawnOrUnsummon(); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_rotface_little_ooze_combine_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_rotface_little_ooze_combine_SpellScript(); + GetCaster()->RemoveAurasDueToSpell(SPELL_LITTLE_OOZE_COMBINE); + GetHitCreature()->RemoveAurasDueToSpell(SPELL_LITTLE_OOZE_COMBINE); + GetHitCreature()->CastSpell(GetCaster(), SPELL_OOZE_MERGE, true); + GetHitCreature()->DespawnOrUnsummon(); + if (GetCaster()->ToCreature()) + GetCaster()->ToCreature()->DespawnOrUnsummon(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_rotface_little_ooze_combine_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_rotface_little_ooze_combine_SpellScript(); + } }; class spell_rotface_large_ooze_combine : public SpellScriptLoader { - public: - spell_rotface_large_ooze_combine() : SpellScriptLoader("spell_rotface_large_ooze_combine") { } +public: + spell_rotface_large_ooze_combine() : SpellScriptLoader("spell_rotface_large_ooze_combine") { } - class spell_rotface_large_ooze_combine_SpellScript : public SpellScript + class spell_rotface_large_ooze_combine_SpellScript : public SpellScript + { + PrepareSpellScript(spell_rotface_large_ooze_combine_SpellScript); + + void HandleScript(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_rotface_large_ooze_combine_SpellScript); + // large targetting large - void HandleScript(SpellEffIndex /*effIndex*/) + if (!GetHitCreature() || !GetHitCreature()->IsAlive()) + return; + + uint8 casterStack = 1; + uint8 targetStack = 1; + Aura* casterAura = GetCaster()->GetAura(SPELL_UNSTABLE_OOZE); + if (casterAura) + casterStack = casterAura->GetStackAmount(); + Aura* targetAura = GetHitCreature()->GetAura(SPELL_UNSTABLE_OOZE); + if (targetAura) + targetStack = targetAura->GetStackAmount(); + uint8 newStack = casterStack + targetStack; + if (newStack > 5) + newStack = 5; + if (casterAura) + casterAura->SetStackAmount(newStack); + else { - // large targetting large + GetCaster()->CastSpell(GetCaster(), SPELL_UNSTABLE_OOZE, true); + if (Aura* aur = GetCaster()->GetAura(SPELL_UNSTABLE_OOZE)) + aur->SetStackAmount(newStack); + } - if (!GetHitCreature() || !GetHitCreature()->IsAlive()) - return; + // red color! + if (newStack >= 4) + GetCaster()->CastSpell(GetCaster(), 69844, true); - uint8 casterStack = 1; - uint8 targetStack = 1; - Aura* casterAura = GetCaster()->GetAura(SPELL_UNSTABLE_OOZE); - if (casterAura) - casterStack = casterAura->GetStackAmount(); - Aura* targetAura = GetHitCreature()->GetAura(SPELL_UNSTABLE_OOZE); - if (targetAura) - targetStack = targetAura->GetStackAmount(); - uint8 newStack = casterStack+targetStack; - if (newStack > 5) - newStack = 5; - if (casterAura) - casterAura->SetStackAmount(newStack); - else - { - GetCaster()->CastSpell(GetCaster(), SPELL_UNSTABLE_OOZE, true); - if (Aura* aur = GetCaster()->GetAura(SPELL_UNSTABLE_OOZE)) - aur->SetStackAmount(newStack); - } + // explode! + if (newStack >= 5) + { + GetCaster()->RemoveAurasDueToSpell(SPELL_LARGE_OOZE_BUFF_COMBINE); + GetCaster()->RemoveAurasDueToSpell(SPELL_LARGE_OOZE_COMBINE); + if (InstanceScript* instance = GetCaster()->GetInstanceScript()) + if (Creature* rotface = ObjectAccessor::GetCreature(*GetCaster(), instance->GetData64(DATA_ROTFACE))) + if (rotface->IsAlive()) + { + if (GetCaster()->GetTypeId() == TYPEID_UNIT) + GetCaster()->ToCreature()->AI()->Talk(EMOTE_UNSTABLE_EXPLOSION); + rotface->AI()->Talk(SAY_UNSTABLE_EXPLOSION); + } + + if (Creature* cre = GetCaster()->ToCreature()) + cre->AI()->DoAction(EVENT_STICKY_OOZE); + GetCaster()->CastSpell(GetCaster(), SPELL_UNSTABLE_OOZE_EXPLOSION, false, nullptr, nullptr, GetCaster()->GetGUID()); + if (InstanceScript* instance = GetCaster()->GetInstanceScript()) + instance->SetData(DATA_OOZE_DANCE_ACHIEVEMENT, uint32(false)); + } + + GetHitCreature()->RemoveAurasDueToSpell(SPELL_LARGE_OOZE_BUFF_COMBINE); + GetHitCreature()->RemoveAurasDueToSpell(SPELL_LARGE_OOZE_COMBINE); + GetHitCreature()->DespawnOrUnsummon(); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_rotface_large_ooze_combine_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_rotface_large_ooze_combine_SpellScript(); + } +}; + +class spell_rotface_large_ooze_buff_combine : public SpellScriptLoader +{ +public: + spell_rotface_large_ooze_buff_combine() : SpellScriptLoader("spell_rotface_large_ooze_buff_combine") { } + + class spell_rotface_large_ooze_buff_combine_SpellScript : public SpellScript + { + PrepareSpellScript(spell_rotface_large_ooze_buff_combine_SpellScript); + + void HandleScript(SpellEffIndex /*effIndex*/) + { + // large targetting little + + if (!GetHitCreature() || !GetHitCreature()->IsAlive()) + return; + + if (Aura* unstable = GetCaster()->GetAura(SPELL_UNSTABLE_OOZE)) + { + uint8 newStack = uint8(unstable->GetStackAmount() + 1); + unstable->SetStackAmount(newStack); // red color! if (newStack >= 4) @@ -660,288 +727,225 @@ class spell_rotface_large_ooze_combine : public SpellScriptLoader if (InstanceScript* instance = GetCaster()->GetInstanceScript()) instance->SetData(DATA_OOZE_DANCE_ACHIEVEMENT, uint32(false)); } - - GetHitCreature()->RemoveAurasDueToSpell(SPELL_LARGE_OOZE_BUFF_COMBINE); - GetHitCreature()->RemoveAurasDueToSpell(SPELL_LARGE_OOZE_COMBINE); - GetHitCreature()->DespawnOrUnsummon(); } - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_rotface_large_ooze_combine_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_rotface_large_ooze_combine_SpellScript(); + GetHitCreature()->RemoveAurasDueToSpell(SPELL_LITTLE_OOZE_COMBINE); + GetHitCreature()->DespawnOrUnsummon(); } -}; -class spell_rotface_large_ooze_buff_combine : public SpellScriptLoader -{ - public: - spell_rotface_large_ooze_buff_combine() : SpellScriptLoader("spell_rotface_large_ooze_buff_combine") { } - - class spell_rotface_large_ooze_buff_combine_SpellScript : public SpellScript + void Register() { - PrepareSpellScript(spell_rotface_large_ooze_buff_combine_SpellScript); - - void HandleScript(SpellEffIndex /*effIndex*/) - { - // large targetting little - - if (!GetHitCreature() || !GetHitCreature()->IsAlive()) - return; - - if (Aura* unstable = GetCaster()->GetAura(SPELL_UNSTABLE_OOZE)) - { - uint8 newStack = uint8(unstable->GetStackAmount()+1); - unstable->SetStackAmount(newStack); - - // red color! - if (newStack >= 4) - GetCaster()->CastSpell(GetCaster(), 69844, true); - - // explode! - if (newStack >= 5) - { - GetCaster()->RemoveAurasDueToSpell(SPELL_LARGE_OOZE_BUFF_COMBINE); - GetCaster()->RemoveAurasDueToSpell(SPELL_LARGE_OOZE_COMBINE); - if (InstanceScript* instance = GetCaster()->GetInstanceScript()) - if (Creature* rotface = ObjectAccessor::GetCreature(*GetCaster(), instance->GetData64(DATA_ROTFACE))) - if (rotface->IsAlive()) - { - if (GetCaster()->GetTypeId() == TYPEID_UNIT) - GetCaster()->ToCreature()->AI()->Talk(EMOTE_UNSTABLE_EXPLOSION); - rotface->AI()->Talk(SAY_UNSTABLE_EXPLOSION); - } - - if (Creature* cre = GetCaster()->ToCreature()) - cre->AI()->DoAction(EVENT_STICKY_OOZE); - GetCaster()->CastSpell(GetCaster(), SPELL_UNSTABLE_OOZE_EXPLOSION, false, nullptr, nullptr, GetCaster()->GetGUID()); - if (InstanceScript* instance = GetCaster()->GetInstanceScript()) - instance->SetData(DATA_OOZE_DANCE_ACHIEVEMENT, uint32(false)); - } - } - - GetHitCreature()->RemoveAurasDueToSpell(SPELL_LITTLE_OOZE_COMBINE); - GetHitCreature()->DespawnOrUnsummon(); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_rotface_large_ooze_buff_combine_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_rotface_large_ooze_buff_combine_SpellScript(); + OnEffectHitTarget += SpellEffectFn(spell_rotface_large_ooze_buff_combine_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } + }; + + SpellScript* GetSpellScript() const + { + return new spell_rotface_large_ooze_buff_combine_SpellScript(); + } }; class spell_rotface_unstable_ooze_explosion_init : public SpellScriptLoader { - public: - spell_rotface_unstable_ooze_explosion_init() : SpellScriptLoader("spell_rotface_unstable_ooze_explosion_init") { } +public: + spell_rotface_unstable_ooze_explosion_init() : SpellScriptLoader("spell_rotface_unstable_ooze_explosion_init") { } - class spell_rotface_unstable_ooze_explosion_init_SpellScript : public SpellScript + class spell_rotface_unstable_ooze_explosion_init_SpellScript : public SpellScript + { + PrepareSpellScript(spell_rotface_unstable_ooze_explosion_init_SpellScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareSpellScript(spell_rotface_unstable_ooze_explosion_init_SpellScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_UNSTABLE_OOZE_EXPLOSION_TRIGGER)) - return false; - return true; - } - - void HandleCast(SpellEffIndex effIndex) - { - PreventHitEffect(effIndex); - if (!GetHitUnit()) - return; - - float x, y, z; - GetHitUnit()->GetPosition(x, y, z); - Creature* dummy = GetCaster()->SummonCreature(NPC_UNSTABLE_EXPLOSION_STALKER, x, y, z, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 60000); - GetCaster()->CastSpell(dummy, SPELL_UNSTABLE_OOZE_EXPLOSION_TRIGGER, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_rotface_unstable_ooze_explosion_init_SpellScript::HandleCast, EFFECT_0, SPELL_EFFECT_FORCE_CAST); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_rotface_unstable_ooze_explosion_init_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_UNSTABLE_OOZE_EXPLOSION_TRIGGER)) + return false; + return true; } + + void HandleCast(SpellEffIndex effIndex) + { + PreventHitEffect(effIndex); + if (!GetHitUnit()) + return; + + float x, y, z; + GetHitUnit()->GetPosition(x, y, z); + Creature* dummy = GetCaster()->SummonCreature(NPC_UNSTABLE_EXPLOSION_STALKER, x, y, z, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 60000); + GetCaster()->CastSpell(dummy, SPELL_UNSTABLE_OOZE_EXPLOSION_TRIGGER, true); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_rotface_unstable_ooze_explosion_init_SpellScript::HandleCast, EFFECT_0, SPELL_EFFECT_FORCE_CAST); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_rotface_unstable_ooze_explosion_init_SpellScript(); + } }; class spell_rotface_unstable_ooze_explosion : public SpellScriptLoader { - public: - spell_rotface_unstable_ooze_explosion() : SpellScriptLoader("spell_rotface_unstable_ooze_explosion") { } +public: + spell_rotface_unstable_ooze_explosion() : SpellScriptLoader("spell_rotface_unstable_ooze_explosion") { } - class spell_rotface_unstable_ooze_explosion_SpellScript : public SpellScript + class spell_rotface_unstable_ooze_explosion_SpellScript : public SpellScript + { + PrepareSpellScript(spell_rotface_unstable_ooze_explosion_SpellScript); + + void CheckTarget(SpellEffIndex effIndex) { - PrepareSpellScript(spell_rotface_unstable_ooze_explosion_SpellScript); + PreventHitDefaultEffect(EFFECT_0); + if (!GetExplTargetDest()) + return; - void CheckTarget(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(EFFECT_0); - if (!GetExplTargetDest()) - return; + uint32 triggered_spell_id = GetSpellInfo()->Effects[effIndex].TriggerSpell; - uint32 triggered_spell_id = GetSpellInfo()->Effects[effIndex].TriggerSpell; - - float x, y, z; - GetExplTargetDest()->GetPosition(x, y, z); - // let Rotface handle the cast - caster dies before this executes - if (InstanceScript* script = GetCaster()->GetInstanceScript()) - if (Creature* rotface = script->instance->GetCreature(script->GetData64(DATA_ROTFACE))) - rotface->CastSpell(x, y, z, triggered_spell_id, true/*, nullptr, nullptr, GetCaster()->GetGUID()*/); // caster not available on clientside, no log in such case - } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_rotface_unstable_ooze_explosion_SpellScript::CheckTarget, EFFECT_0, SPELL_EFFECT_TRIGGER_MISSILE); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_rotface_unstable_ooze_explosion_SpellScript(); + float x, y, z; + GetExplTargetDest()->GetPosition(x, y, z); + // let Rotface handle the cast - caster dies before this executes + if (InstanceScript* script = GetCaster()->GetInstanceScript()) + if (Creature* rotface = script->instance->GetCreature(script->GetData64(DATA_ROTFACE))) + rotface->CastSpell(x, y, z, triggered_spell_id, true/*, nullptr, nullptr, GetCaster()->GetGUID()*/); // caster not available on clientside, no log in such case } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_rotface_unstable_ooze_explosion_SpellScript::CheckTarget, EFFECT_0, SPELL_EFFECT_TRIGGER_MISSILE); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_rotface_unstable_ooze_explosion_SpellScript(); + } }; class spell_rotface_unstable_ooze_explosion_suicide : public SpellScriptLoader { - public: - spell_rotface_unstable_ooze_explosion_suicide() : SpellScriptLoader("spell_rotface_unstable_ooze_explosion_suicide") { } +public: + spell_rotface_unstable_ooze_explosion_suicide() : SpellScriptLoader("spell_rotface_unstable_ooze_explosion_suicide") { } - class spell_rotface_unstable_ooze_explosion_suicide_AuraScript : public AuraScript + class spell_rotface_unstable_ooze_explosion_suicide_AuraScript : public AuraScript + { + PrepareAuraScript(spell_rotface_unstable_ooze_explosion_suicide_AuraScript); + + void DespawnSelf(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_rotface_unstable_ooze_explosion_suicide_AuraScript); + PreventDefaultAction(); + Unit* target = GetTarget(); + if (target->GetTypeId() != TYPEID_UNIT) + return; - void DespawnSelf(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - Unit* target = GetTarget(); - if (target->GetTypeId() != TYPEID_UNIT) - return; - - target->SetVisible(false); - target->RemoveAllAuras(); - //target->ToCreature()->DespawnOrUnsummon(); - target->ToCreature()->DespawnOrUnsummon(60000); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_rotface_unstable_ooze_explosion_suicide_AuraScript::DespawnSelf, EFFECT_2, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_rotface_unstable_ooze_explosion_suicide_AuraScript(); + target->SetVisible(false); + target->RemoveAllAuras(); + //target->ToCreature()->DespawnOrUnsummon(); + target->ToCreature()->DespawnOrUnsummon(60000); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_rotface_unstable_ooze_explosion_suicide_AuraScript::DespawnSelf, EFFECT_2, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_rotface_unstable_ooze_explosion_suicide_AuraScript(); + } }; class npc_precious_icc : public CreatureScript { - public: - npc_precious_icc() : CreatureScript("npc_precious_icc") { } +public: + npc_precious_icc() : CreatureScript("npc_precious_icc") { } - struct npc_precious_iccAI : public ScriptedAI + struct npc_precious_iccAI : public ScriptedAI + { + npc_precious_iccAI(Creature* creature) : ScriptedAI(creature), summons(me) {} + + void Reset() { - npc_precious_iccAI(Creature* creature) : ScriptedAI(creature), summons(me){} - - void Reset() - { - events.Reset(); - summons.DespawnAll(); - } - - void EnterCombat(Unit* /*target*/) - { - me->setActive(true); - events.ScheduleEvent(EVENT_DECIMATE, urand(20000, 25000)); - events.ScheduleEvent(EVENT_MORTAL_WOUND, urand(1500, 2500)); - events.ScheduleEvent(EVENT_SUMMON_ZOMBIES, urand(25000, 30000)); - } - - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - summon->AI()->AttackStart(target); - } - - void SummonedCreatureDespawn(Creature* summon) - { - summons.Despawn(summon); - } - - void JustDied(Unit* /*killer*/) - { - summons.DespawnAll(); - if (InstanceScript* _instance = me->GetInstanceScript()) - if (Creature* rotface = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ROTFACE))) - if (rotface->IsAlive()) - rotface->AI()->Talk(SAY_PRECIOUS_DIES); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_DECIMATE: - me->CastSpell(me->GetVictim(), SPELL_DECIMATE, false); - events.ScheduleEvent(EVENT_DECIMATE, urand(20000, 25000)); - break; - case EVENT_MORTAL_WOUND: - me->CastSpell(me->GetVictim(), SPELL_MORTAL_WOUND, false); - events.ScheduleEvent(EVENT_MORTAL_WOUND, urand(1500, 2500)); - break; - case EVENT_SUMMON_ZOMBIES: - Talk(EMOTE_PRECIOUS_ZOMBIES); - for (uint32 i = 0; i < 11; ++i) - me->CastSpell(me, SPELL_AWAKEN_PLAGUED_ZOMBIES, true); - events.ScheduleEvent(EVENT_SUMMON_ZOMBIES, urand(20000, 25000)); - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); - } - - private: - EventMap events; - SummonList summons; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + events.Reset(); + summons.DespawnAll(); } + + void EnterCombat(Unit* /*target*/) + { + me->setActive(true); + events.ScheduleEvent(EVENT_DECIMATE, urand(20000, 25000)); + events.ScheduleEvent(EVENT_MORTAL_WOUND, urand(1500, 2500)); + events.ScheduleEvent(EVENT_SUMMON_ZOMBIES, urand(25000, 30000)); + } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + summon->AI()->AttackStart(target); + } + + void SummonedCreatureDespawn(Creature* summon) + { + summons.Despawn(summon); + } + + void JustDied(Unit* /*killer*/) + { + summons.DespawnAll(); + if (InstanceScript* _instance = me->GetInstanceScript()) + if (Creature* rotface = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ROTFACE))) + if (rotface->IsAlive()) + rotface->AI()->Talk(SAY_PRECIOUS_DIES); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_DECIMATE: + me->CastSpell(me->GetVictim(), SPELL_DECIMATE, false); + events.ScheduleEvent(EVENT_DECIMATE, urand(20000, 25000)); + break; + case EVENT_MORTAL_WOUND: + me->CastSpell(me->GetVictim(), SPELL_MORTAL_WOUND, false); + events.ScheduleEvent(EVENT_MORTAL_WOUND, urand(1500, 2500)); + break; + case EVENT_SUMMON_ZOMBIES: + Talk(EMOTE_PRECIOUS_ZOMBIES); + for (uint32 i = 0; i < 11; ++i) + me->CastSpell(me, SPELL_AWAKEN_PLAGUED_ZOMBIES, true); + events.ScheduleEvent(EVENT_SUMMON_ZOMBIES, urand(20000, 25000)); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + + private: + EventMap events; + SummonList summons; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; void AddSC_boss_rotface() diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp index 86018f9bb..c319b9189 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp @@ -20,7 +20,7 @@ enum Texts SAY_PHASE_2 = 6, // Now feel my master's limitless power and despair! EMOTE_WARN_FROZEN_ORB = 7, // %s fires a frozen orb towards $N! SAY_KILL = 8, // Perish! - // A flaw of mortality... + // A flaw of mortality... SAY_BERSERK = 9, // Enough! I tire of these games! SAY_DEATH = 10, // Free...at last... EMOTE_BERSERK_RAID = 11, @@ -157,302 +157,302 @@ Position const SindragosaAirPosFar = {4525.600f, 2485.150f, 245.0820f, 3.141593f class FrostwyrmLandEvent : public BasicEvent { - public: - FrostwyrmLandEvent(Creature& owner, Position const& dest) : _owner(owner), _dest(dest) { } +public: + FrostwyrmLandEvent(Creature& owner, Position const& dest) : _owner(owner), _dest(dest) { } - bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/) - { - _owner.GetMotionMaster()->MoveLand(POINT_FROSTWYRM_LAND, _dest, 8.5f); - return true; - } + bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/) + { + _owner.GetMotionMaster()->MoveLand(POINT_FROSTWYRM_LAND, _dest, 8.5f); + return true; + } - private: - Creature& _owner; - Position const& _dest; +private: + Creature& _owner; + Position const& _dest; }; class FrostBombExplosion : public BasicEvent { - public: - FrostBombExplosion(Creature* owner, uint64 sindragosaGUID) : _owner(owner), _sindragosaGUID(sindragosaGUID) { } +public: + FrostBombExplosion(Creature* owner, uint64 sindragosaGUID) : _owner(owner), _sindragosaGUID(sindragosaGUID) { } - bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/) - { - _owner->CastSpell((Unit*)NULL, SPELL_FROST_BOMB, false, nullptr, nullptr, _sindragosaGUID); - _owner->RemoveAurasDueToSpell(SPELL_FROST_BOMB_VISUAL); - return true; - } + bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/) + { + _owner->CastSpell((Unit*)NULL, SPELL_FROST_BOMB, false, nullptr, nullptr, _sindragosaGUID); + _owner->RemoveAurasDueToSpell(SPELL_FROST_BOMB_VISUAL); + return true; + } - private: - Creature* _owner; - uint64 _sindragosaGUID; +private: + Creature* _owner; + uint64 _sindragosaGUID; }; class IceTombSummonEvent : public BasicEvent { - public: - IceTombSummonEvent(Unit* owner, uint64 sindragosaGUID) : _owner(owner), _sindragosaGUID(sindragosaGUID) { } +public: + IceTombSummonEvent(Unit* owner, uint64 sindragosaGUID) : _owner(owner), _sindragosaGUID(sindragosaGUID) { } - bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/) + bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/) + { + if (!_owner->IsAlive() || !_owner->HasAura(SPELL_ICE_TOMB_DAMAGE)) + return true; + if (Creature* sindragosa = ObjectAccessor::GetCreature(*_owner, _sindragosaGUID)) { - if (!_owner->IsAlive() || !_owner->HasAura(SPELL_ICE_TOMB_DAMAGE)) + if (!sindragosa->IsAlive()) return true; - if (Creature* sindragosa = ObjectAccessor::GetCreature(*_owner, _sindragosaGUID)) + Position pos; + _owner->GetPosition(&pos); + _owner->m_positionZ -= 1.0f; // +2.0f in UpdateGroundPositionZ, prevent going over GO model of another ice block, because new would be spawned on top of the old one xd + _owner->UpdateGroundPositionZ(pos.m_positionX, pos.m_positionY, pos.m_positionZ); + if (pos.GetPositionZ() < 203.0f) + pos.m_positionZ = 203.0f; + if (TempSummon* summon = sindragosa->SummonCreature(NPC_ICE_TOMB, pos)) { - if (!sindragosa->IsAlive()) - return true; - Position pos; - _owner->GetPosition(&pos); - _owner->m_positionZ -= 1.0f; // +2.0f in UpdateGroundPositionZ, prevent going over GO model of another ice block, because new would be spawned on top of the old one xd - _owner->UpdateGroundPositionZ(pos.m_positionX, pos.m_positionY, pos.m_positionZ); - if (pos.GetPositionZ() < 203.0f) - pos.m_positionZ = 203.0f; - if (TempSummon* summon = sindragosa->SummonCreature(NPC_ICE_TOMB, pos)) + summon->m_positionZ = summon->GetPositionZ() + 5.0f; + summon->AI()->SetGUID(_owner->GetGUID(), DATA_TRAPPED_PLAYER); + _owner->CastSpell(_owner, SPELL_ICE_TOMB_UNTARGETABLE, true); + if (GameObject* go = summon->SummonGameObject(GO_ICE_BLOCK, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ() - 3.5f, pos.GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 0)) { - summon->m_positionZ = summon->GetPositionZ()+5.0f; - summon->AI()->SetGUID(_owner->GetGUID(), DATA_TRAPPED_PLAYER); - _owner->CastSpell(_owner, SPELL_ICE_TOMB_UNTARGETABLE, true); - if (GameObject* go = summon->SummonGameObject(GO_ICE_BLOCK, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ()-3.5f, pos.GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 0)) - { - go->SetSpellId(SPELL_ICE_TOMB_DAMAGE); - summon->AddGameObject(go); - } + go->SetSpellId(SPELL_ICE_TOMB_DAMAGE); + summon->AddGameObject(go); } } - return true; } + return true; + } - private: - Unit* _owner; - uint64 _sindragosaGUID; +private: + Unit* _owner; + uint64 _sindragosaGUID; }; struct LastPhaseIceTombTargetSelector : public acore::unary_function { - public: - LastPhaseIceTombTargetSelector(Creature* source) : _source(source) { } - bool operator()(Unit const* target) const - { - if (!target) - return false; +public: + LastPhaseIceTombTargetSelector(Creature* source) : _source(source) { } + bool operator()(Unit const* target) const + { + if (!target) + return false; - if (target->GetExactDist(_source) > 80.0f) - return false; + if (target->GetExactDist(_source) > 80.0f) + return false; - if (target->GetTypeId() != TYPEID_PLAYER) - return false; + if (target->GetTypeId() != TYPEID_PLAYER) + return false; - if (target->HasAura(SPELL_FROST_IMBUED_BLADE)) - return false; + if (target->HasAura(SPELL_FROST_IMBUED_BLADE)) + return false; - if (target->IsImmunedToDamageOrSchool(SPELL_SCHOOL_MASK_ALL) || target->HasAura(SPELL_ICE_TOMB_UNTARGETABLE) || target->HasAura(SPELL_ICE_TOMB_DAMAGE) || target->HasAura(SPELL_TANK_MARKER_AURA) || target->HasAuraType(SPELL_AURA_SPIRIT_OF_REDEMPTION)) - return false; + if (target->IsImmunedToDamageOrSchool(SPELL_SCHOOL_MASK_ALL) || target->HasAura(SPELL_ICE_TOMB_UNTARGETABLE) || target->HasAura(SPELL_ICE_TOMB_DAMAGE) || target->HasAura(SPELL_TANK_MARKER_AURA) || target->HasAuraType(SPELL_AURA_SPIRIT_OF_REDEMPTION)) + return false; - return target != _source->GetVictim(); - } + return target != _source->GetVictim(); + } - private: - Creature const* _source; +private: + Creature const* _source; }; class boss_sindragosa : public CreatureScript { - public: - boss_sindragosa() : CreatureScript("boss_sindragosa") { } +public: + boss_sindragosa() : CreatureScript("boss_sindragosa") { } - struct boss_sindragosaAI : public BossAI + struct boss_sindragosaAI : public BossAI + { + boss_sindragosaAI(Creature* creature) : BossAI(creature, DATA_SINDRAGOSA), _summoned(false) { - boss_sindragosaAI(Creature* creature) : BossAI(creature, DATA_SINDRAGOSA), _summoned(false) + me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_HASTE_SPELLS, true); + } + + void Reset() + { + _didFirstFlyPhase = false; + _isBelow20Pct = false; + _isThirdPhase = false; + _bombCount = 0; + _mysticBuffetStack = 0; + _Reset(); + me->DisableRotate(false); + me->SetControlled(false, UNIT_STATE_ROOT); + me->SetSpeed(MOVE_RUN, me->GetCreatureTemplate()->speed_run); + me->SetReactState(REACT_AGGRESSIVE); + me->CastSpell(me, SPELL_TANK_MARKER, true); + + if (!_summoned) { - me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_HASTE_SPELLS, true); + me->SetDisableGravity(true); + me->SetHover(true); + me->SetCanFly(true); + } + } + + void MoveInLineOfSight(Unit* who) + { + if (!me->HasUnitMovementFlag(MOVEMENTFLAG_CAN_FLY)) + BossAI::MoveInLineOfSight(who); + } + + void JustDied(Unit* /* killer */) + { + _JustDied(); + Talk(SAY_DEATH); + + if (Is25ManRaid() && me->HasAura(SPELL_SHADOWS_FATE)) + DoCastAOE(SPELL_FROST_INFUSION_CREDIT, true); + + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_FROST_BEACON); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_ICE_TOMB_TARGET); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_ICE_TOMB_DUMMY); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_ICE_TOMB_UNTARGETABLE); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_ICE_TOMB_DAMAGE); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_ASPHYXIATION); + } + + void EnterCombat(Unit* victim) + { + if (!instance->CheckRequiredBosses(DATA_SINDRAGOSA, victim->ToPlayer()) || !me->IsVisible()) + { + EnterEvadeMode(); + instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT); + return; } - void Reset() - { - _didFirstFlyPhase = false; - _isBelow20Pct = false; - _isThirdPhase = false; - _bombCount = 0; - _mysticBuffetStack = 0; - _Reset(); - me->DisableRotate(false); - me->SetControlled(false, UNIT_STATE_ROOT); - me->SetSpeed(MOVE_RUN, me->GetCreatureTemplate()->speed_run); - me->SetReactState(REACT_AGGRESSIVE); - me->CastSpell(me, SPELL_TANK_MARKER, true); + _didFirstFlyPhase = false; + _isBelow20Pct = false; + _isThirdPhase = false; + _bombCount = 0; + _mysticBuffetStack = 0; - if (!_summoned) - { - me->SetDisableGravity(true); - me->SetHover(true); - me->SetCanFly(true); - } + summons.DespawnAll(); + events.Reset(); + events.ScheduleEvent(EVENT_BERSERK, 600000); + events.ScheduleEvent(EVENT_AIR_PHASE, 50000); + events.ScheduleEvent(EVENT_CLEAVE, 10000, EVENT_GROUP_LAND_PHASE); + events.ScheduleEvent(EVENT_TAIL_SMASH, 20000, EVENT_GROUP_LAND_PHASE); + events.ScheduleEvent(EVENT_FROST_BREATH, urand(8000, 12000), EVENT_GROUP_LAND_PHASE); + events.ScheduleEvent(EVENT_UNCHAINED_MAGIC, urand(9000, 14000), EVENT_GROUP_LAND_PHASE); + events.ScheduleEvent(EVENT_ICY_GRIP, 33500, EVENT_GROUP_LAND_PHASE); + + me->setActive(true); + me->SetInCombatWithZone(); + instance->SetBossState(DATA_SINDRAGOSA, IN_PROGRESS); + + me->CastSpell(me, SPELL_FROST_AURA, true); + me->CastSpell(me, SPELL_PERMAEATING_CHILL, true); + Talk(SAY_AGGRO); + } + + bool CanAIAttack(const Unit* target) const + { + return me->IsVisible() && target->GetEntry() != NPC_CROK_SCOURGEBANE; + } + + void JustReachedHome() + { + _JustReachedHome(); + instance->SetBossState(DATA_SINDRAGOSA, FAIL); + if (_summoned) + { + me->SetDisableGravity(false); + me->SetHover(false); + me->SetCanFly(false); } + } - void MoveInLineOfSight(Unit* who) + void EnterEvadeMode() + { + if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) // this flag is removed after she lands and can be engaged { - if (!me->HasUnitMovementFlag(MOVEMENTFLAG_CAN_FLY)) - BossAI::MoveInLineOfSight(who); + const Map::PlayerList& pl = me->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) + if (Player* p = itr->GetSource()) + if (p->IsAlive() && !p->IsGameMaster() && p->GetExactDist(&SindragosaLandPos) < 200.0f && !p->IsImmunedToDamageOrSchool(SPELL_SCHOOL_MASK_ALL)) + Unit::Kill(me, p); } + me->DisableRotate(false); + me->SetControlled(false, UNIT_STATE_ROOT); + BossAI::EnterEvadeMode(); + } - void JustDied(Unit* /* killer */) + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_KILL); + } + + void DoAction(int32 action) + { + if (action == ACTION_START_FROSTWYRM) { - _JustDied(); - Talk(SAY_DEATH); - - if (Is25ManRaid() && me->HasAura(SPELL_SHADOWS_FATE)) - DoCastAOE(SPELL_FROST_INFUSION_CREDIT, true); - - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_FROST_BEACON); - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_ICE_TOMB_TARGET); - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_ICE_TOMB_DUMMY); - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_ICE_TOMB_UNTARGETABLE); - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_ICE_TOMB_DAMAGE); - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_ASPHYXIATION); - } - - void EnterCombat(Unit* victim) - { - if (!instance->CheckRequiredBosses(DATA_SINDRAGOSA, victim->ToPlayer()) || !me->IsVisible()) - { - EnterEvadeMode(); - instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT); + if (_summoned) return; - } - _didFirstFlyPhase = false; - _isBelow20Pct = false; - _isThirdPhase = false; - _bombCount = 0; - _mysticBuffetStack = 0; + _summoned = true; + if (TempSummon* summon = me->ToTempSummon()) + summon->SetTempSummonType(TEMPSUMMON_DEAD_DESPAWN); - summons.DespawnAll(); - events.Reset(); - events.ScheduleEvent(EVENT_BERSERK, 600000); - events.ScheduleEvent(EVENT_AIR_PHASE, 50000); - events.ScheduleEvent(EVENT_CLEAVE, 10000, EVENT_GROUP_LAND_PHASE); - events.ScheduleEvent(EVENT_TAIL_SMASH, 20000, EVENT_GROUP_LAND_PHASE); - events.ScheduleEvent(EVENT_FROST_BREATH, urand(8000, 12000), EVENT_GROUP_LAND_PHASE); - events.ScheduleEvent(EVENT_UNCHAINED_MAGIC, urand(9000, 14000), EVENT_GROUP_LAND_PHASE); - events.ScheduleEvent(EVENT_ICY_GRIP, 33500, EVENT_GROUP_LAND_PHASE); + if (me->isDead()) + return; me->setActive(true); - me->SetInCombatWithZone(); - instance->SetBossState(DATA_SINDRAGOSA, IN_PROGRESS); - - me->CastSpell(me, SPELL_FROST_AURA, true); - me->CastSpell(me, SPELL_PERMAEATING_CHILL, true); - Talk(SAY_AGGRO); + me->SetCanFly(true); + me->SetDisableGravity(true); + me->SetHover(true); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + me->SetSpeed(MOVE_RUN, 4.28571f); + float moveTime = me->GetExactDist(&SindragosaFlyInPos) / (me->GetSpeed(MOVE_RUN) * 0.001f); + me->m_Events.AddEvent(new FrostwyrmLandEvent(*me, SindragosaLandPos), me->m_Events.CalculateTime(uint64(moveTime) + 250)); + me->GetMotionMaster()->MovePoint(POINT_FROSTWYRM_FLY_IN, SindragosaFlyInPos); + me->CastSpell(me, SPELL_SINDRAGOSA_S_FURY, true); } + } - bool CanAIAttack(const Unit* target) const - { - return me->IsVisible() && target->GetEntry() != NPC_CROK_SCOURGEBANE; - } + uint32 GetData(uint32 type) const + { + if (type == DATA_MYSTIC_BUFFET_STACK) + return _mysticBuffetStack; + return 0xFFFFFFFF; + } - void JustReachedHome() + void MovementInform(uint32 type, uint32 point) + { + if (type != POINT_MOTION_TYPE && type != EFFECT_MOTION_TYPE) + return; + + switch (point) { - _JustReachedHome(); - instance->SetBossState(DATA_SINDRAGOSA, FAIL); - if (_summoned) - { + case POINT_FROSTWYRM_LAND: + me->setActive(false); me->SetDisableGravity(false); me->SetHover(false); me->SetCanFly(false); - } - } + me->SetSpeed(MOVE_RUN, me->GetCreatureTemplate()->speed_run); + me->SetHomePosition(SindragosaLandPos); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - void EnterEvadeMode() - { - if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) // this flag is removed after she lands and can be engaged - { - const Map::PlayerList &pl = me->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) - if (Player* p = itr->GetSource()) - if (p->IsAlive() && !p->IsGameMaster() && p->GetExactDist(&SindragosaLandPos) < 200.0f && !p->IsImmunedToDamageOrSchool(SPELL_SCHOOL_MASK_ALL)) - Unit::Kill(me, p); - } - me->DisableRotate(false); - me->SetControlled(false, UNIT_STATE_ROOT); - BossAI::EnterEvadeMode(); - } - - void KilledUnit(Unit* victim) - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_KILL); - } - - void DoAction(int32 action) - { - if (action == ACTION_START_FROSTWYRM) - { - if (_summoned) - return; - - _summoned = true; - if (TempSummon* summon = me->ToTempSummon()) - summon->SetTempSummonType(TEMPSUMMON_DEAD_DESPAWN); - - if (me->isDead()) - return; - - me->setActive(true); - me->SetCanFly(true); - me->SetDisableGravity(true); - me->SetHover(true); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - me->SetSpeed(MOVE_RUN, 4.28571f); - float moveTime = me->GetExactDist(&SindragosaFlyInPos) / (me->GetSpeed(MOVE_RUN) * 0.001f); - me->m_Events.AddEvent(new FrostwyrmLandEvent(*me, SindragosaLandPos), me->m_Events.CalculateTime(uint64(moveTime) + 250)); - me->GetMotionMaster()->MovePoint(POINT_FROSTWYRM_FLY_IN, SindragosaFlyInPos); - me->CastSpell(me, SPELL_SINDRAGOSA_S_FURY, true); - } - } - - uint32 GetData(uint32 type) const - { - if (type == DATA_MYSTIC_BUFFET_STACK) - return _mysticBuffetStack; - return 0xFFFFFFFF; - } - - void MovementInform(uint32 type, uint32 point) - { - if (type != POINT_MOTION_TYPE && type != EFFECT_MOTION_TYPE) - return; - - switch (point) - { - case POINT_FROSTWYRM_LAND: - me->setActive(false); - me->SetDisableGravity(false); - me->SetHover(false); - me->SetCanFly(false); - me->SetSpeed(MOVE_RUN, me->GetCreatureTemplate()->speed_run); - me->SetHomePosition(SindragosaLandPos); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - - // Sindragosa enters combat as soon as she lands - me->SetInCombatWithZone(); - break; - case POINT_TAKEOFF: - events.ScheduleEvent(EVENT_AIR_MOVEMENT, 0); - break; - case POINT_AIR_PHASE: - me->CastCustomSpell(SPELL_ICE_TOMB_TARGET, SPELLVALUE_MAX_TARGETS, RAID_MODE(2, 5, 2, 6), nullptr); - me->SetFacingTo(float(M_PI)); - events.ScheduleEvent(EVENT_AIR_MOVEMENT_FAR, 0); // won't be processed during cast time anyway, so 0 - events.ScheduleEvent(EVENT_FROST_BOMB, 7000); - _bombCount = 0; - break; - case POINT_AIR_PHASE_FAR: - me->SetFacingTo(float(M_PI)); - break; - case POINT_LAND: - events.ScheduleEvent(EVENT_LAND_GROUND, 0); - break; - case POINT_LAND_GROUND: + // Sindragosa enters combat as soon as she lands + me->SetInCombatWithZone(); + break; + case POINT_TAKEOFF: + events.ScheduleEvent(EVENT_AIR_MOVEMENT, 0); + break; + case POINT_AIR_PHASE: + me->CastCustomSpell(SPELL_ICE_TOMB_TARGET, SPELLVALUE_MAX_TARGETS, RAID_MODE(2, 5, 2, 6), nullptr); + me->SetFacingTo(float(M_PI)); + events.ScheduleEvent(EVENT_AIR_MOVEMENT_FAR, 0); // won't be processed during cast time anyway, so 0 + events.ScheduleEvent(EVENT_FROST_BOMB, 7000); + _bombCount = 0; + break; + case POINT_AIR_PHASE_FAR: + me->SetFacingTo(float(M_PI)); + break; + case POINT_LAND: + events.ScheduleEvent(EVENT_LAND_GROUND, 0); + break; + case POINT_LAND_GROUND: { me->SetDisableGravity(false); me->SetHover(false); @@ -463,162 +463,162 @@ class boss_sindragosa : public CreatureScript AttackStart(target); break; } - default: - break; + default: + break; + } + } + + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) + { + if (!damage || me->IsInEvadeMode()) + return; + + if (!_didFirstFlyPhase) + return; + + if (!_isThirdPhase) + { + if (!HealthAbovePct(35)) + { + _isThirdPhase = true; + events.CancelEvent(EVENT_AIR_PHASE); + events.ScheduleEvent(EVENT_THIRD_PHASE_CHECK, 1000); } } - - void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) + else if (!_isBelow20Pct) { - if (!damage || me->IsInEvadeMode()) - return; - - if (!_didFirstFlyPhase) - return; - - if (!_isThirdPhase) + if (!HealthAbovePct(20)) { - if (!HealthAbovePct(35)) + _isBelow20Pct = true; + if (instance->GetData(DATA_WEEKLY_QUEST_ID) == QUEST_RESPITE_FOR_A_TORMENTED_SOUL_10) + Talk(EMOTE_WEAKENING); + } + } + } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + if (summon->GetEntry() == NPC_FROST_BOMB) + summon->m_Events.AddEvent(new FrostBombExplosion(summon, me->GetGUID()), summon->m_Events.CalculateTime(5500)); + } + + void SummonedCreatureDespawn(Creature* summon) + { + BossAI::SummonedCreatureDespawn(summon); + if (summon->GetEntry() == NPC_ICE_TOMB) + summon->AI()->JustDied(summon); + } + + void SpellHitTarget(Unit* target, SpellInfo const* spell) + { + if (target->GetTypeId() == TYPEID_PLAYER) + if (uint32 spellId = sSpellMgr->GetSpellIdForDifficulty(70127, me)) + if (spellId == spell->Id) + if (Aura const* mysticBuffet = target->GetAura(spell->Id)) + _mysticBuffetStack = std::max(_mysticBuffetStack, mysticBuffet->GetStackAmount()); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim() || !CheckInRoom()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_BERSERK: + Talk(EMOTE_BERSERK_RAID); + Talk(SAY_BERSERK); + me->CastSpell(me, SPELL_BERSERK, true); + break; + case EVENT_CLEAVE: + me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false); + events.ScheduleEvent(EVENT_CLEAVE, urand(10000, 15000), EVENT_GROUP_LAND_PHASE); + break; + case EVENT_TAIL_SMASH: + me->DisableRotate(true); + me->SetControlled(true, UNIT_STATE_ROOT); + me->SendMovementFlagUpdate(); + me->CastSpell(me->GetVictim(), SPELL_TAIL_SMASH, false); + events.DelayEventsToMax(1, 0); + events.ScheduleEvent(EVENT_UNROOT, 0); + events.ScheduleEvent(EVENT_TAIL_SMASH, urand(22000, 27000), EVENT_GROUP_LAND_PHASE); + break; + case EVENT_FROST_BREATH: + me->DisableRotate(true); + me->SetControlled(true, UNIT_STATE_ROOT); + me->SendMovementFlagUpdate(); + me->CastSpell(me->GetVictim(), _isThirdPhase ? SPELL_FROST_BREATH_P2 : SPELL_FROST_BREATH_P1, false); + events.DelayEventsToMax(1, 0); + events.ScheduleEvent(EVENT_UNROOT, 0); + events.ScheduleEvent(EVENT_FROST_BREATH, urand(20000, 25000), EVENT_GROUP_LAND_PHASE); + break; + case EVENT_UNROOT: + me->DisableRotate(false); + me->SetControlled(false, UNIT_STATE_ROOT); + break; + case EVENT_UNCHAINED_MAGIC: + Talk(SAY_UNCHAINED_MAGIC); + me->CastSpell((Unit*)NULL, SPELL_UNCHAINED_MAGIC, false); + events.ScheduleEvent(EVENT_UNCHAINED_MAGIC, urand(30000, 35000), EVENT_GROUP_LAND_PHASE); + break; + case EVENT_ICY_GRIP: + me->CastSpell((Unit*)NULL, SPELL_ICY_GRIP, false); + events.DelayEventsToMax(1001, 0); + events.ScheduleEvent(EVENT_BLISTERING_COLD, 1000, EVENT_GROUP_LAND_PHASE); + if (uint32 evTime = events.GetNextEventTime(EVENT_ICE_TOMB)) + if (events.GetTimer() > evTime || evTime - events.GetTimer() < 7000) + events.RescheduleEvent(EVENT_ICE_TOMB, 7000); + break; + case EVENT_BLISTERING_COLD: + Talk(EMOTE_WARN_BLISTERING_COLD); + me->CastSpell(me, SPELL_BLISTERING_COLD, false); + events.ScheduleEvent(EVENT_BLISTERING_COLD_YELL, 5000, EVENT_GROUP_LAND_PHASE); + if (_isThirdPhase) + events.RescheduleEvent(EVENT_ICY_GRIP, urand(65000, 70000)); + break; + case EVENT_BLISTERING_COLD_YELL: + Talk(SAY_BLISTERING_COLD); + break; + + // AIR PHASE EVENTS BELOW: + case EVENT_AIR_PHASE: + // pussywizard: unroot may be scheduled after this event cos of events shitness (time must be unique) + if (me->HasUnitState(UNIT_STATE_ROOT)) { - _isThirdPhase = true; - events.CancelEvent(EVENT_AIR_PHASE); - events.ScheduleEvent(EVENT_THIRD_PHASE_CHECK, 1000); - } - } - else if (!_isBelow20Pct) - { - if (!HealthAbovePct(20)) - { - _isBelow20Pct = true; - if (instance->GetData(DATA_WEEKLY_QUEST_ID) == QUEST_RESPITE_FOR_A_TORMENTED_SOUL_10) - Talk(EMOTE_WEAKENING); - } - } - } - - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - if (summon->GetEntry() == NPC_FROST_BOMB) - summon->m_Events.AddEvent(new FrostBombExplosion(summon, me->GetGUID()), summon->m_Events.CalculateTime(5500)); - } - - void SummonedCreatureDespawn(Creature* summon) - { - BossAI::SummonedCreatureDespawn(summon); - if (summon->GetEntry() == NPC_ICE_TOMB) - summon->AI()->JustDied(summon); - } - - void SpellHitTarget(Unit* target, SpellInfo const* spell) - { - if (target->GetTypeId() == TYPEID_PLAYER) - if (uint32 spellId = sSpellMgr->GetSpellIdForDifficulty(70127, me)) - if (spellId == spell->Id) - if (Aura const* mysticBuffet = target->GetAura(spell->Id)) - _mysticBuffetStack = std::max(_mysticBuffetStack, mysticBuffet->GetStackAmount()); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim() || !CheckInRoom()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_BERSERK: - Talk(EMOTE_BERSERK_RAID); - Talk(SAY_BERSERK); - me->CastSpell(me, SPELL_BERSERK, true); - break; - case EVENT_CLEAVE: - me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false); - events.ScheduleEvent(EVENT_CLEAVE, urand(10000, 15000), EVENT_GROUP_LAND_PHASE); - break; - case EVENT_TAIL_SMASH: - me->DisableRotate(true); - me->SetControlled(true, UNIT_STATE_ROOT); - me->SendMovementFlagUpdate(); - me->CastSpell(me->GetVictim(), SPELL_TAIL_SMASH, false); - events.DelayEventsToMax(1, 0); - events.ScheduleEvent(EVENT_UNROOT, 0); - events.ScheduleEvent(EVENT_TAIL_SMASH, urand(22000, 27000), EVENT_GROUP_LAND_PHASE); - break; - case EVENT_FROST_BREATH: - me->DisableRotate(true); - me->SetControlled(true, UNIT_STATE_ROOT); - me->SendMovementFlagUpdate(); - me->CastSpell(me->GetVictim(), _isThirdPhase ? SPELL_FROST_BREATH_P2 : SPELL_FROST_BREATH_P1, false); - events.DelayEventsToMax(1, 0); - events.ScheduleEvent(EVENT_UNROOT, 0); - events.ScheduleEvent(EVENT_FROST_BREATH, urand(20000, 25000), EVENT_GROUP_LAND_PHASE); - break; - case EVENT_UNROOT: + events.CancelEvent(EVENT_UNROOT); me->DisableRotate(false); me->SetControlled(false, UNIT_STATE_ROOT); - break; - case EVENT_UNCHAINED_MAGIC: - Talk(SAY_UNCHAINED_MAGIC); - me->CastSpell((Unit*)NULL, SPELL_UNCHAINED_MAGIC, false); - events.ScheduleEvent(EVENT_UNCHAINED_MAGIC, urand(30000, 35000), EVENT_GROUP_LAND_PHASE); - break; - case EVENT_ICY_GRIP: - me->CastSpell((Unit*)NULL, SPELL_ICY_GRIP, false); - events.DelayEventsToMax(1001, 0); - events.ScheduleEvent(EVENT_BLISTERING_COLD, 1000, EVENT_GROUP_LAND_PHASE); - if (uint32 evTime = events.GetNextEventTime(EVENT_ICE_TOMB)) - if (events.GetTimer() > evTime || evTime - events.GetTimer() < 7000) - events.RescheduleEvent(EVENT_ICE_TOMB, 7000); - break; - case EVENT_BLISTERING_COLD: - Talk(EMOTE_WARN_BLISTERING_COLD); - me->CastSpell(me, SPELL_BLISTERING_COLD, false); - events.ScheduleEvent(EVENT_BLISTERING_COLD_YELL, 5000, EVENT_GROUP_LAND_PHASE); - if (_isThirdPhase) - events.RescheduleEvent(EVENT_ICY_GRIP, urand(65000, 70000)); - break; - case EVENT_BLISTERING_COLD_YELL: - Talk(SAY_BLISTERING_COLD); - break; + } - // AIR PHASE EVENTS BELOW: - case EVENT_AIR_PHASE: - // pussywizard: unroot may be scheduled after this event cos of events shitness (time must be unique) - if (me->HasUnitState(UNIT_STATE_ROOT)) - { - events.CancelEvent(EVENT_UNROOT); - me->DisableRotate(false); - me->SetControlled(false, UNIT_STATE_ROOT); - } - - _didFirstFlyPhase = true; - Talk(SAY_AIR_PHASE); - me->SetReactState(REACT_PASSIVE); - me->SetSpeed(MOVE_RUN, 4.28571f); - me->SendMeleeAttackStop(me->GetVictim()); - me->AttackStop(); - me->GetMotionMaster()->MoveIdle(); - me->StopMoving(); - me->SetCanFly(true); - me->SetDisableGravity(true); - me->SetHover(true); - me->SendMovementFlagUpdate(); - me->GetMotionMaster()->MoveTakeoff(POINT_TAKEOFF, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+20.0f, 10.0f); - events.CancelEventGroup(EVENT_GROUP_LAND_PHASE); - events.ScheduleEvent(EVENT_AIR_PHASE, 110000); - break; - case EVENT_AIR_MOVEMENT: - me->GetMotionMaster()->MovePoint(POINT_AIR_PHASE, SindragosaAirPos); - break; - case EVENT_AIR_MOVEMENT_FAR: - me->GetMotionMaster()->MovePoint(POINT_AIR_PHASE_FAR, SindragosaAirPosFar); - break; - case EVENT_FROST_BOMB: + _didFirstFlyPhase = true; + Talk(SAY_AIR_PHASE); + me->SetReactState(REACT_PASSIVE); + me->SetSpeed(MOVE_RUN, 4.28571f); + me->SendMeleeAttackStop(me->GetVictim()); + me->AttackStop(); + me->GetMotionMaster()->MoveIdle(); + me->StopMoving(); + me->SetCanFly(true); + me->SetDisableGravity(true); + me->SetHover(true); + me->SendMovementFlagUpdate(); + me->GetMotionMaster()->MoveTakeoff(POINT_TAKEOFF, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 20.0f, 10.0f); + events.CancelEventGroup(EVENT_GROUP_LAND_PHASE); + events.ScheduleEvent(EVENT_AIR_PHASE, 110000); + break; + case EVENT_AIR_MOVEMENT: + me->GetMotionMaster()->MovePoint(POINT_AIR_PHASE, SindragosaAirPos); + break; + case EVENT_AIR_MOVEMENT_FAR: + me->GetMotionMaster()->MovePoint(POINT_AIR_PHASE_FAR, SindragosaAirPosFar); + break; + case EVENT_FROST_BOMB: { ++_bombCount; float destX, destY, destZ; @@ -633,7 +633,7 @@ class boss_sindragosa : public CreatureScript me->UpdateGroundPositionZ(destX, destY, destZ); bool ok = true; for (std::list::const_iterator itr = gl.begin(); itr != gl.end(); ++itr) - if ((*itr)->GetExactDist2dSq(destX, destY) < 3.0f*3.0f) + if ((*itr)->GetExactDist2dSq(destX, destY) < 3.0f * 3.0f) { ok = false; break; @@ -641,7 +641,7 @@ class boss_sindragosa : public CreatureScript if (ok) break; } while (--triesLeft); - + me->CastSpell(destX, destY, destZ, SPELL_FROST_BOMB_TRIGGER, false); if (_bombCount >= 4) events.ScheduleEvent(EVENT_LAND, 5500); @@ -649,225 +649,225 @@ class boss_sindragosa : public CreatureScript events.ScheduleEvent(EVENT_FROST_BOMB, 6000); break; } - case EVENT_LAND: - me->GetMotionMaster()->MovePoint(POINT_LAND, SindragosaFlyInPos); - break; - case EVENT_LAND_GROUND: - events.ScheduleEvent(EVENT_CLEAVE, urand(13000, 15000), EVENT_GROUP_LAND_PHASE); - events.ScheduleEvent(EVENT_TAIL_SMASH, urand(19000, 23000), EVENT_GROUP_LAND_PHASE); - events.ScheduleEvent(EVENT_FROST_BREATH, urand(7000, 10000), EVENT_GROUP_LAND_PHASE); - events.ScheduleEvent(EVENT_UNCHAINED_MAGIC, urand(12000, 17000), EVENT_GROUP_LAND_PHASE); - events.ScheduleEvent(EVENT_ICY_GRIP, urand(35000, 40000), EVENT_GROUP_LAND_PHASE); - me->GetMotionMaster()->MoveLand(POINT_LAND_GROUND, SindragosaLandPos, 10.0f); - break; - case EVENT_THIRD_PHASE_CHECK: - if (!me->HasByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_HOVER)) - { - Talk(SAY_PHASE_2); - events.ScheduleEvent(EVENT_ICE_TOMB, urand(7000, 10000)); - events.RescheduleEvent(EVENT_ICY_GRIP, urand(35000, 40000), EVENT_GROUP_LAND_PHASE); - me->CastSpell(me, SPELL_MYSTIC_BUFFET, true); - } - else - events.ScheduleEvent(EVENT_THIRD_PHASE_CHECK, 5000); - break; - case EVENT_ICE_TOMB: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, LastPhaseIceTombTargetSelector(me))) - { - Talk(EMOTE_WARN_FROZEN_ORB, target); - me->CastSpell(target, SPELL_ICE_TOMB_DUMMY, true); - me->CastSpell(target, SPELL_FROST_BEACON, true); - if (uint32 evTime = events.GetNextEventTime(EVENT_ICY_GRIP)) - if (events.GetTimer() > evTime || evTime - events.GetTimer() < 8000) - events.RescheduleEvent(EVENT_ICY_GRIP, 8000, EVENT_GROUP_LAND_PHASE); - } - events.ScheduleEvent(EVENT_ICE_TOMB, urand(18000, 22000)); - break; - default: - break; - } - - if (me->GetVictim() && me->IsWithinMeleeRange(me->GetVictim()) && me->GetMotionMaster()->GetCurrentMovementGeneratorType() != POINT_MOTION_TYPE && !me->IsWithinLOSInMap(me->GetVictim())) - me->GetMotionMaster()->MoveCharge(me->GetVictim()->GetPositionX(), me->GetVictim()->GetPositionY(), me->GetVictim()->GetPositionZ(), me->GetSpeed(MOVE_RUN), POINT_CHASE_VICTIM); - DoMeleeAttackIfReady(); + case EVENT_LAND: + me->GetMotionMaster()->MovePoint(POINT_LAND, SindragosaFlyInPos); + break; + case EVENT_LAND_GROUND: + events.ScheduleEvent(EVENT_CLEAVE, urand(13000, 15000), EVENT_GROUP_LAND_PHASE); + events.ScheduleEvent(EVENT_TAIL_SMASH, urand(19000, 23000), EVENT_GROUP_LAND_PHASE); + events.ScheduleEvent(EVENT_FROST_BREATH, urand(7000, 10000), EVENT_GROUP_LAND_PHASE); + events.ScheduleEvent(EVENT_UNCHAINED_MAGIC, urand(12000, 17000), EVENT_GROUP_LAND_PHASE); + events.ScheduleEvent(EVENT_ICY_GRIP, urand(35000, 40000), EVENT_GROUP_LAND_PHASE); + me->GetMotionMaster()->MoveLand(POINT_LAND_GROUND, SindragosaLandPos, 10.0f); + break; + case EVENT_THIRD_PHASE_CHECK: + if (!me->HasByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_HOVER)) + { + Talk(SAY_PHASE_2); + events.ScheduleEvent(EVENT_ICE_TOMB, urand(7000, 10000)); + events.RescheduleEvent(EVENT_ICY_GRIP, urand(35000, 40000), EVENT_GROUP_LAND_PHASE); + me->CastSpell(me, SPELL_MYSTIC_BUFFET, true); + } + else + events.ScheduleEvent(EVENT_THIRD_PHASE_CHECK, 5000); + break; + case EVENT_ICE_TOMB: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, LastPhaseIceTombTargetSelector(me))) + { + Talk(EMOTE_WARN_FROZEN_ORB, target); + me->CastSpell(target, SPELL_ICE_TOMB_DUMMY, true); + me->CastSpell(target, SPELL_FROST_BEACON, true); + if (uint32 evTime = events.GetNextEventTime(EVENT_ICY_GRIP)) + if (events.GetTimer() > evTime || evTime - events.GetTimer() < 8000) + events.RescheduleEvent(EVENT_ICY_GRIP, 8000, EVENT_GROUP_LAND_PHASE); + } + events.ScheduleEvent(EVENT_ICE_TOMB, urand(18000, 22000)); + break; + default: + break; } - private: - bool _summoned; - uint8 _bombCount; - uint8 _mysticBuffetStack; - bool _didFirstFlyPhase; - bool _isBelow20Pct; - bool _isThirdPhase; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + if (me->GetVictim() && me->IsWithinMeleeRange(me->GetVictim()) && me->GetMotionMaster()->GetCurrentMovementGeneratorType() != POINT_MOTION_TYPE && !me->IsWithinLOSInMap(me->GetVictim())) + me->GetMotionMaster()->MoveCharge(me->GetVictim()->GetPositionX(), me->GetVictim()->GetPositionY(), me->GetVictim()->GetPositionZ(), me->GetSpeed(MOVE_RUN), POINT_CHASE_VICTIM); + DoMeleeAttackIfReady(); } + + private: + bool _summoned; + uint8 _bombCount; + uint8 _mysticBuffetStack; + bool _didFirstFlyPhase; + bool _isBelow20Pct; + bool _isThirdPhase; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class npc_ice_tomb : public CreatureScript { - public: - npc_ice_tomb() : CreatureScript("npc_ice_tomb") { } +public: + npc_ice_tomb() : CreatureScript("npc_ice_tomb") { } - struct npc_ice_tombAI : public NullCreatureAI + struct npc_ice_tombAI : public NullCreatureAI + { + npc_ice_tombAI(Creature* creature) : NullCreatureAI(creature) { - npc_ice_tombAI(Creature* creature) : NullCreatureAI(creature) + me->SetReactState(REACT_PASSIVE); + _trappedPlayerGUID = 0; + _existenceCheckTimer = 1000; + _asphyxiationTimer = 22500; + } + + uint64 _trappedPlayerGUID; + uint32 _existenceCheckTimer; + uint16 _asphyxiationTimer; + + void SetGUID(uint64 guid, int32 type) + { + if (type == DATA_TRAPPED_PLAYER) + _trappedPlayerGUID = guid; + } + + void DamageTaken(Unit*, uint32& dmg, DamageEffectType, SpellSchoolMask) + { + if (dmg >= me->GetHealth()) + me->m_positionZ = me->GetPositionZ() - 5.0f; + } + + void JustDied(Unit* /*killer*/) + { + me->RemoveAllGameObjects(); + + if (Player* player = ObjectAccessor::GetPlayer(*me, _trappedPlayerGUID)) { - me->SetReactState(REACT_PASSIVE); _trappedPlayerGUID = 0; - _existenceCheckTimer = 1000; - _asphyxiationTimer = 22500; + player->RemoveAurasDueToSpell(SPELL_ICE_TOMB_DAMAGE); + player->RemoveAurasDueToSpell(SPELL_ASPHYXIATION); + player->RemoveAurasDueToSpell(SPELL_ICE_TOMB_UNTARGETABLE); + me->DespawnOrUnsummon(5000); } + } - uint64 _trappedPlayerGUID; - uint32 _existenceCheckTimer; - uint16 _asphyxiationTimer; + void UpdateAI(uint32 diff) + { + if (!_trappedPlayerGUID) + return; - void SetGUID(uint64 guid, int32 type) + if (_existenceCheckTimer <= diff) { - if (type == DATA_TRAPPED_PLAYER) - _trappedPlayerGUID = guid; - } - - void DamageTaken(Unit*, uint32 &dmg, DamageEffectType, SpellSchoolMask) - { - if (dmg >= me->GetHealth()) - me->m_positionZ = me->GetPositionZ() - 5.0f; - } - - void JustDied(Unit* /*killer*/) - { - me->RemoveAllGameObjects(); - - if (Player* player = ObjectAccessor::GetPlayer(*me, _trappedPlayerGUID)) + Player* player = ObjectAccessor::GetPlayer(*me, _trappedPlayerGUID); + if (!player || !player->IsAlive() || !player->HasAura(SPELL_ICE_TOMB_DAMAGE)) { - _trappedPlayerGUID = 0; - player->RemoveAurasDueToSpell(SPELL_ICE_TOMB_DAMAGE); - player->RemoveAurasDueToSpell(SPELL_ASPHYXIATION); - player->RemoveAurasDueToSpell(SPELL_ICE_TOMB_UNTARGETABLE); - me->DespawnOrUnsummon(5000); - } - } - - void UpdateAI(uint32 diff) - { - if (!_trappedPlayerGUID) + // Remove object + JustDied(me); + me->DespawnOrUnsummon(); return; + } + _existenceCheckTimer = 1000; + } + else + _existenceCheckTimer -= diff; - if (_existenceCheckTimer <= diff) + if (_asphyxiationTimer) + { + if (_asphyxiationTimer <= diff) { - Player* player = ObjectAccessor::GetPlayer(*me, _trappedPlayerGUID); - if (!player || !player->IsAlive() || !player->HasAura(SPELL_ICE_TOMB_DAMAGE)) + _asphyxiationTimer = 0; + if (Player* player = ObjectAccessor::GetPlayer(*me, _trappedPlayerGUID)) { - // Remove object - JustDied(me); - me->DespawnOrUnsummon(); - return; + player->RemoveAurasDueToSpell(SPELL_ICE_TOMB_UNTARGETABLE); + player->CastSpell(player, SPELL_ASPHYXIATION, true); } - _existenceCheckTimer = 1000; } else - _existenceCheckTimer -= diff; - - if (_asphyxiationTimer) - { - if (_asphyxiationTimer <= diff) - { - _asphyxiationTimer = 0; - if (Player* player = ObjectAccessor::GetPlayer(*me, _trappedPlayerGUID)) - { - player->RemoveAurasDueToSpell(SPELL_ICE_TOMB_UNTARGETABLE); - player->CastSpell(player, SPELL_ASPHYXIATION, true); - } - } - else - _asphyxiationTimer -= diff; - } + _asphyxiationTimer -= diff; } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class spell_sindragosa_s_fury : public SpellScriptLoader { - public: - spell_sindragosa_s_fury() : SpellScriptLoader("spell_sindragosa_s_fury") { } +public: + spell_sindragosa_s_fury() : SpellScriptLoader("spell_sindragosa_s_fury") { } - class spell_sindragosa_s_fury_SpellScript : public SpellScript + class spell_sindragosa_s_fury_SpellScript : public SpellScript + { + PrepareSpellScript(spell_sindragosa_s_fury_SpellScript); + + bool Load() { - PrepareSpellScript(spell_sindragosa_s_fury_SpellScript); + _targetCount = 0; - bool Load() - { - _targetCount = 0; + // This script should execute only in Icecrown Citadel + if (InstanceMap* instance = GetCaster()->GetMap()->ToInstanceMap()) + if (instance->GetInstanceScript()) + if (instance->GetScriptId() == sObjectMgr->GetScriptId(ICCScriptName)) + return true; - // This script should execute only in Icecrown Citadel - if (InstanceMap* instance = GetCaster()->GetMap()->ToInstanceMap()) - if (instance->GetInstanceScript()) - if (instance->GetScriptId() == sObjectMgr->GetScriptId(ICCScriptName)) - return true; - - return false; - } - - void SelectDest() - { - if (Position* dest = const_cast(GetExplTargetDest())) - { - float destX = float(rand_norm()) * 75.0f + 4350.0f; - float destY = float(rand_norm()) * 75.0f + 2450.0f; - float destZ = 205.0f; // random number close to ground, get exact in next call - GetCaster()->UpdateGroundPositionZ(destX, destY, destZ); - dest->Relocate(destX, destY, destZ); - } - } - - void CountTargets(std::list& targets) - { - _targetCount = targets.size(); - } - - void HandleDummy(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - - if (!GetHitUnit()->IsAlive() || (GetHitUnit()->GetTypeId() == TYPEID_PLAYER && GetHitUnit()->ToPlayer()->IsGameMaster()) || !_targetCount) - return; - - float resistance = float(GetHitUnit()->GetResistance(SpellSchoolMask(GetSpellInfo()->SchoolMask))); - float ResistFactor = ((resistance*2.0f) / (resistance + 510.0f)); - if (ResistFactor > 0.9f) - ResistFactor = 0.9f; - - uint32 damage = uint32( (GetEffectValue()/_targetCount) * (1.0f-ResistFactor) ); - - SpellNonMeleeDamage damageInfo(GetCaster(), GetHitUnit(), GetSpellInfo()->Id, GetSpellInfo()->SchoolMask); - damageInfo.damage = damage; - GetCaster()->SendSpellNonMeleeDamageLog(&damageInfo); - GetCaster()->DealSpellDamage(&damageInfo, false); - } - - void Register() - { - BeforeCast += SpellCastFn(spell_sindragosa_s_fury_SpellScript::SelectDest); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sindragosa_s_fury_SpellScript::CountTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ENTRY); - OnEffectHitTarget += SpellEffectFn(spell_sindragosa_s_fury_SpellScript::HandleDummy, EFFECT_1, SPELL_EFFECT_DUMMY); - } - - uint32 _targetCount; - }; - - SpellScript* GetSpellScript() const - { - return new spell_sindragosa_s_fury_SpellScript(); + return false; } + + void SelectDest() + { + if (Position* dest = const_cast(GetExplTargetDest())) + { + float destX = float(rand_norm()) * 75.0f + 4350.0f; + float destY = float(rand_norm()) * 75.0f + 2450.0f; + float destZ = 205.0f; // random number close to ground, get exact in next call + GetCaster()->UpdateGroundPositionZ(destX, destY, destZ); + dest->Relocate(destX, destY, destZ); + } + } + + void CountTargets(std::list& targets) + { + _targetCount = targets.size(); + } + + void HandleDummy(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + + if (!GetHitUnit()->IsAlive() || (GetHitUnit()->GetTypeId() == TYPEID_PLAYER && GetHitUnit()->ToPlayer()->IsGameMaster()) || !_targetCount) + return; + + float resistance = float(GetHitUnit()->GetResistance(SpellSchoolMask(GetSpellInfo()->SchoolMask))); + float ResistFactor = ((resistance * 2.0f) / (resistance + 510.0f)); + if (ResistFactor > 0.9f) + ResistFactor = 0.9f; + + uint32 damage = uint32( (GetEffectValue() / _targetCount) * (1.0f - ResistFactor) ); + + SpellNonMeleeDamage damageInfo(GetCaster(), GetHitUnit(), GetSpellInfo()->Id, GetSpellInfo()->SchoolMask); + damageInfo.damage = damage; + GetCaster()->SendSpellNonMeleeDamageLog(&damageInfo); + GetCaster()->DealSpellDamage(&damageInfo, false); + } + + void Register() + { + BeforeCast += SpellCastFn(spell_sindragosa_s_fury_SpellScript::SelectDest); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sindragosa_s_fury_SpellScript::CountTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ENTRY); + OnEffectHitTarget += SpellEffectFn(spell_sindragosa_s_fury_SpellScript::HandleDummy, EFFECT_1, SPELL_EFFECT_DUMMY); + } + + uint32 _targetCount; + }; + + SpellScript* GetSpellScript() const + { + return new spell_sindragosa_s_fury_SpellScript(); + } }; class UnchainedMagicTargetSelector @@ -899,751 +899,751 @@ private: class spell_sindragosa_unchained_magic : public SpellScriptLoader { - public: - spell_sindragosa_unchained_magic() : SpellScriptLoader("spell_sindragosa_unchained_magic") { } +public: + spell_sindragosa_unchained_magic() : SpellScriptLoader("spell_sindragosa_unchained_magic") { } - class spell_sindragosa_unchained_magic_SpellScript : public SpellScript + class spell_sindragosa_unchained_magic_SpellScript : public SpellScript + { + PrepareSpellScript(spell_sindragosa_unchained_magic_SpellScript); + + void FilterTargets(std::list& unitList) { - PrepareSpellScript(spell_sindragosa_unchained_magic_SpellScript); - - void FilterTargets(std::list& unitList) - { - std::list healList = unitList; - std::list dpsList = unitList; - unitList.clear(); - uint32 maxSize = uint32(GetCaster()->GetMap()->GetSpawnMode() & 1 ? 3 : 1); - healList.remove_if(UnchainedMagicTargetSelector(false)); - if (healList.size() > maxSize) - acore::Containers::RandomResizeList(healList, maxSize); - dpsList.remove_if(UnchainedMagicTargetSelector(true)); - if (dpsList.size() > maxSize) - acore::Containers::RandomResizeList(dpsList, maxSize); - unitList.splice(unitList.begin(), healList); - unitList.splice(unitList.begin(), dpsList); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sindragosa_unchained_magic_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_sindragosa_unchained_magic_SpellScript(); + std::list healList = unitList; + std::list dpsList = unitList; + unitList.clear(); + uint32 maxSize = uint32(GetCaster()->GetMap()->GetSpawnMode() & 1 ? 3 : 1); + healList.remove_if(UnchainedMagicTargetSelector(false)); + if (healList.size() > maxSize) + acore::Containers::RandomResizeList(healList, maxSize); + dpsList.remove_if(UnchainedMagicTargetSelector(true)); + if (dpsList.size() > maxSize) + acore::Containers::RandomResizeList(dpsList, maxSize); + unitList.splice(unitList.begin(), healList); + unitList.splice(unitList.begin(), dpsList); } - class spell_sindragosa_unchained_magic_AuraScript : public AuraScript + void Register() { - PrepareAuraScript(spell_sindragosa_unchained_magic_AuraScript); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sindragosa_unchained_magic_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; - std::map _lastMSTimeForSpell; + SpellScript* GetSpellScript() const + { + return new spell_sindragosa_unchained_magic_SpellScript(); + } - bool Validate(SpellInfo const* /*spellInfo*/) + class spell_sindragosa_unchained_magic_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sindragosa_unchained_magic_AuraScript); + + std::map _lastMSTimeForSpell; + + bool Validate(SpellInfo const* /*spellInfo*/) + { + _lastMSTimeForSpell.clear(); + return true; + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + const SpellInfo* spellInfo = eventInfo.GetDamageInfo()->GetSpellInfo(); + if (!spellInfo) + return false; + + uint32 currMSTime = World::GetGameTimeMS(); + std::map::iterator itr = _lastMSTimeForSpell.find(spellInfo->Id); + if (itr != _lastMSTimeForSpell.end()) { - _lastMSTimeForSpell.clear(); - return true; - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - const SpellInfo* spellInfo = eventInfo.GetDamageInfo()->GetSpellInfo(); - if (!spellInfo) + uint32 lastMSTime = itr->second; + itr->second = currMSTime; + if (getMSTimeDiff(lastMSTime, currMSTime) < 600) return false; - uint32 currMSTime = World::GetGameTimeMS(); - std::map::iterator itr = _lastMSTimeForSpell.find(spellInfo->Id); - if (itr != _lastMSTimeForSpell.end()) - { - uint32 lastMSTime = itr->second; - itr->second = currMSTime; - if (getMSTimeDiff(lastMSTime, currMSTime) < 600) - return false; - - return true; - } - - _lastMSTimeForSpell[spellInfo->Id] = currMSTime; return true; } - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_sindragosa_unchained_magic_AuraScript::CheckProc); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_sindragosa_unchained_magic_AuraScript(); + _lastMSTimeForSpell[spellInfo->Id] = currMSTime; + return true; } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_sindragosa_unchained_magic_AuraScript::CheckProc); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_sindragosa_unchained_magic_AuraScript(); + } }; class spell_sindragosa_permeating_chill : public SpellScriptLoader { - public: - spell_sindragosa_permeating_chill() : SpellScriptLoader("spell_sindragosa_permeating_chill") { } +public: + spell_sindragosa_permeating_chill() : SpellScriptLoader("spell_sindragosa_permeating_chill") { } - class spell_sindragosa_permeating_chill_AuraScript : public AuraScript + class spell_sindragosa_permeating_chill_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sindragosa_permeating_chill_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_sindragosa_permeating_chill_AuraScript); - - bool CheckProc(ProcEventInfo& eventInfo) - { - return eventInfo.GetProcTarget() && eventInfo.GetProcTarget()->GetEntry() == NPC_SINDRAGOSA; - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_sindragosa_permeating_chill_AuraScript::CheckProc); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_sindragosa_permeating_chill_AuraScript(); + return eventInfo.GetProcTarget() && eventInfo.GetProcTarget()->GetEntry() == NPC_SINDRAGOSA; } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_sindragosa_permeating_chill_AuraScript::CheckProc); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_sindragosa_permeating_chill_AuraScript(); + } }; class spell_sindragosa_instability : public SpellScriptLoader { - public: - spell_sindragosa_instability() : SpellScriptLoader("spell_sindragosa_instability") { } +public: + spell_sindragosa_instability() : SpellScriptLoader("spell_sindragosa_instability") { } - class spell_sindragosa_instability_AuraScript : public AuraScript + class spell_sindragosa_instability_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sindragosa_instability_AuraScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareAuraScript(spell_sindragosa_instability_AuraScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_BACKLASH)) - return false; - return true; - } - - void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE) - GetTarget()->CastCustomSpell(SPELL_BACKLASH, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetTarget(), true, NULL, aurEff, GetCasterGUID()); - } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_sindragosa_instability_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_sindragosa_instability_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_BACKLASH)) + return false; + return true; } + + void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE) + GetTarget()->CastCustomSpell(SPELL_BACKLASH, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetTarget(), true, NULL, aurEff, GetCasterGUID()); + } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_sindragosa_instability_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_sindragosa_instability_AuraScript(); + } }; class spell_sindragosa_icy_grip : public SpellScriptLoader { - public: - spell_sindragosa_icy_grip() : SpellScriptLoader("spell_sindragosa_icy_grip") { } +public: + spell_sindragosa_icy_grip() : SpellScriptLoader("spell_sindragosa_icy_grip") { } - class spell_sindragosa_icy_grip_SpellScript : public SpellScript + class spell_sindragosa_icy_grip_SpellScript : public SpellScript + { + PrepareSpellScript(spell_sindragosa_icy_grip_SpellScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareSpellScript(spell_sindragosa_icy_grip_SpellScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_ICY_GRIP_JUMP)) - return false; - return true; - } - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (!GetHitUnit()->IsWithinLOSInMap(GetCaster()) || GetHitUnit()->HasAura(SPELL_TANK_MARKER_AURA)) - return; - - GetHitUnit()->CastSpell(GetCaster(), SPELL_ICY_GRIP_JUMP, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_sindragosa_icy_grip_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_sindragosa_icy_grip_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_ICY_GRIP_JUMP)) + return false; + return true; } + + void HandleScript(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (!GetHitUnit()->IsWithinLOSInMap(GetCaster()) || GetHitUnit()->HasAura(SPELL_TANK_MARKER_AURA)) + return; + + GetHitUnit()->CastSpell(GetCaster(), SPELL_ICY_GRIP_JUMP, true); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_sindragosa_icy_grip_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_sindragosa_icy_grip_SpellScript(); + } }; class spell_sindragosa_icy_grip_jump : public SpellScriptLoader { - public: - spell_sindragosa_icy_grip_jump() : SpellScriptLoader("spell_sindragosa_icy_grip_jump") { } +public: + spell_sindragosa_icy_grip_jump() : SpellScriptLoader("spell_sindragosa_icy_grip_jump") { } - class spell_sindragosa_icy_grip_jump_SpellScript : public SpellScript + class spell_sindragosa_icy_grip_jump_SpellScript : public SpellScript + { + PrepareSpellScript(spell_sindragosa_icy_grip_jump_SpellScript); + + void HandleSpecial(SpellEffIndex effIndex) { - PrepareSpellScript(spell_sindragosa_icy_grip_jump_SpellScript); + PreventHitDefaultEffect(effIndex); - void HandleSpecial(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); + float x = GetHitUnit()->GetPositionX(); + float y = GetHitUnit()->GetPositionY(); + float z = GetHitUnit()->GetPositionZ() + 0.1f; + float speedXY, speedZ; - float x = GetHitUnit()->GetPositionX(); - float y = GetHitUnit()->GetPositionY(); - float z = GetHitUnit()->GetPositionZ()+0.1f; - float speedXY, speedZ; + if (GetSpellInfo()->Effects[effIndex].MiscValue) + speedZ = float(GetSpellInfo()->Effects[effIndex].MiscValue) / 10; + else if (GetSpellInfo()->Effects[effIndex].MiscValueB) + speedZ = float(GetSpellInfo()->Effects[effIndex].MiscValueB) / 10; + else + speedZ = 10.0f; + speedXY = GetCaster()->GetExactDist2d(x, y) * 10.0f / speedZ; - if (GetSpellInfo()->Effects[effIndex].MiscValue) - speedZ = float(GetSpellInfo()->Effects[effIndex].MiscValue)/10; - else if (GetSpellInfo()->Effects[effIndex].MiscValueB) - speedZ = float(GetSpellInfo()->Effects[effIndex].MiscValueB)/10; - else - speedZ = 10.0f; - speedXY = GetCaster()->GetExactDist2d(x, y) * 10.0f / speedZ; - - GetCaster()->GetMotionMaster()->MoveJump(x, y, z, speedXY, speedZ); - } - - void Register() - { - OnEffectLaunchTarget += SpellEffectFn(spell_sindragosa_icy_grip_jump_SpellScript::HandleSpecial, EFFECT_0, SPELL_EFFECT_JUMP); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_sindragosa_icy_grip_jump_SpellScript(); + GetCaster()->GetMotionMaster()->MoveJump(x, y, z, speedXY, speedZ); } + + void Register() + { + OnEffectLaunchTarget += SpellEffectFn(spell_sindragosa_icy_grip_jump_SpellScript::HandleSpecial, EFFECT_0, SPELL_EFFECT_JUMP); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_sindragosa_icy_grip_jump_SpellScript(); + } }; class spell_sindragosa_frost_beacon : public SpellScriptLoader { - public: - spell_sindragosa_frost_beacon() : SpellScriptLoader("spell_sindragosa_frost_beacon") { } +public: + spell_sindragosa_frost_beacon() : SpellScriptLoader("spell_sindragosa_frost_beacon") { } - class spell_sindragosa_frost_beacon_AuraScript : public AuraScript + class spell_sindragosa_frost_beacon_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sindragosa_frost_beacon_AuraScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareAuraScript(spell_sindragosa_frost_beacon_AuraScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_ICE_TOMB_DAMAGE)) - return false; - return true; - } - - void PeriodicTick(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - if (Unit* caster = GetCaster()) - caster->CastSpell(GetTarget(), SPELL_ICE_TOMB_DAMAGE, true); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_sindragosa_frost_beacon_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_sindragosa_frost_beacon_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_ICE_TOMB_DAMAGE)) + return false; + return true; } + + void PeriodicTick(AuraEffect const* /*aurEff*/) + { + PreventDefaultAction(); + if (Unit* caster = GetCaster()) + caster->CastSpell(GetTarget(), SPELL_ICE_TOMB_DAMAGE, true); + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_sindragosa_frost_beacon_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_sindragosa_frost_beacon_AuraScript(); + } }; class SindragosaIceTombCheck { - public: - bool operator()(Unit* unit) const - { - return unit->HasAura(SPELL_FROST_IMBUED_BLADE) || unit->IsImmunedToDamageOrSchool(SPELL_SCHOOL_MASK_ALL); - } +public: + bool operator()(Unit* unit) const + { + return unit->HasAura(SPELL_FROST_IMBUED_BLADE) || unit->IsImmunedToDamageOrSchool(SPELL_SCHOOL_MASK_ALL); + } - bool operator()(WorldObject* object) const - { - return object->ToUnit() && (object->ToUnit()->HasAura(SPELL_FROST_IMBUED_BLADE) || object->ToUnit()->IsImmunedToDamageOrSchool(SPELL_SCHOOL_MASK_ALL)); - } + bool operator()(WorldObject* object) const + { + return object->ToUnit() && (object->ToUnit()->HasAura(SPELL_FROST_IMBUED_BLADE) || object->ToUnit()->IsImmunedToDamageOrSchool(SPELL_SCHOOL_MASK_ALL)); + } }; class spell_sindragosa_ice_tomb_filter : public SpellScriptLoader { - public: - spell_sindragosa_ice_tomb_filter() : SpellScriptLoader("spell_sindragosa_ice_tomb_filter") { } +public: + spell_sindragosa_ice_tomb_filter() : SpellScriptLoader("spell_sindragosa_ice_tomb_filter") { } - class spell_sindragosa_ice_tomb_filter_SpellScript : public SpellScript + class spell_sindragosa_ice_tomb_filter_SpellScript : public SpellScript + { + PrepareSpellScript(spell_sindragosa_ice_tomb_filter_SpellScript); + + void FilterTargets(std::list& unitList) { - PrepareSpellScript(spell_sindragosa_ice_tomb_filter_SpellScript); - - void FilterTargets(std::list& unitList) - { - unitList.remove_if(SindragosaIceTombCheck()); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sindragosa_ice_tomb_filter_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_sindragosa_ice_tomb_filter_SpellScript(); + unitList.remove_if(SindragosaIceTombCheck()); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sindragosa_ice_tomb_filter_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_sindragosa_ice_tomb_filter_SpellScript(); + } }; class spell_sindragosa_ice_tomb : public SpellScriptLoader { - public: - spell_sindragosa_ice_tomb() : SpellScriptLoader("spell_sindragosa_ice_tomb_trap") { } +public: + spell_sindragosa_ice_tomb() : SpellScriptLoader("spell_sindragosa_ice_tomb_trap") { } - class spell_sindragosa_ice_tomb_SpellScript : public SpellScript + class spell_sindragosa_ice_tomb_SpellScript : public SpellScript + { + PrepareSpellScript(spell_sindragosa_ice_tomb_SpellScript); + + std::list targetList; + + bool Validate(SpellInfo const* /*spell*/) { - PrepareSpellScript(spell_sindragosa_ice_tomb_SpellScript); - - std::list targetList; - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sObjectMgr->GetCreatureTemplate(NPC_ICE_TOMB)) - return false; - if (!sObjectMgr->GetGameObjectTemplate(GO_ICE_BLOCK)) - return false; - return true; - } - - void FilterTargets(std::list& unitList) - { - unitList.remove_if(acore::UnitAuraCheck(true, GetSpellInfo()->Id)); - targetList.clear(); - targetList = unitList; - } - - void FilterTargetsSubseq(std::list& unitList) - { - unitList.clear(); - unitList = targetList; - } - - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sindragosa_ice_tomb_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ENEMY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sindragosa_ice_tomb_SpellScript::FilterTargetsSubseq, EFFECT_2, TARGET_UNIT_DEST_AREA_ENEMY); - } - }; - - class spell_sindragosa_ice_tomb_AuraScript : public AuraScript - { - PrepareAuraScript(spell_sindragosa_ice_tomb_AuraScript); - - void PeriodicTick(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - } - - void AfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* c = GetCaster()) - GetTarget()->m_Events.AddEvent(new IceTombSummonEvent(GetTarget(), c->GetGUID()), GetTarget()->m_Events.CalculateTime(500)); - } - - void ExtraRemoveEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetTarget()->RemoveAurasDueToSpell(SPELL_ASPHYXIATION); - GetTarget()->RemoveAurasDueToSpell(SPELL_ICE_TOMB_UNTARGETABLE); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_sindragosa_ice_tomb_AuraScript::PeriodicTick, EFFECT_2, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - AfterEffectRemove += AuraEffectRemoveFn(spell_sindragosa_ice_tomb_AuraScript::ExtraRemoveEffect, EFFECT_1, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL); - AfterEffectApply += AuraEffectApplyFn(spell_sindragosa_ice_tomb_AuraScript::AfterApply, EFFECT_1, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_sindragosa_ice_tomb_SpellScript(); + if (!sObjectMgr->GetCreatureTemplate(NPC_ICE_TOMB)) + return false; + if (!sObjectMgr->GetGameObjectTemplate(GO_ICE_BLOCK)) + return false; + return true; } - AuraScript* GetAuraScript() const + void FilterTargets(std::list& unitList) { - return new spell_sindragosa_ice_tomb_AuraScript(); + unitList.remove_if(acore::UnitAuraCheck(true, GetSpellInfo()->Id)); + targetList.clear(); + targetList = unitList; } + + void FilterTargetsSubseq(std::list& unitList) + { + unitList.clear(); + unitList = targetList; + } + + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sindragosa_ice_tomb_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ENEMY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sindragosa_ice_tomb_SpellScript::FilterTargetsSubseq, EFFECT_2, TARGET_UNIT_DEST_AREA_ENEMY); + } + }; + + class spell_sindragosa_ice_tomb_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sindragosa_ice_tomb_AuraScript); + + void PeriodicTick(AuraEffect const* /*aurEff*/) + { + PreventDefaultAction(); + } + + void AfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* c = GetCaster()) + GetTarget()->m_Events.AddEvent(new IceTombSummonEvent(GetTarget(), c->GetGUID()), GetTarget()->m_Events.CalculateTime(500)); + } + + void ExtraRemoveEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->RemoveAurasDueToSpell(SPELL_ASPHYXIATION); + GetTarget()->RemoveAurasDueToSpell(SPELL_ICE_TOMB_UNTARGETABLE); + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_sindragosa_ice_tomb_AuraScript::PeriodicTick, EFFECT_2, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + AfterEffectRemove += AuraEffectRemoveFn(spell_sindragosa_ice_tomb_AuraScript::ExtraRemoveEffect, EFFECT_1, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL); + AfterEffectApply += AuraEffectApplyFn(spell_sindragosa_ice_tomb_AuraScript::AfterApply, EFFECT_1, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_sindragosa_ice_tomb_SpellScript(); + } + + AuraScript* GetAuraScript() const + { + return new spell_sindragosa_ice_tomb_AuraScript(); + } }; class MysticBuffetTargetFilter { - public: - explicit MysticBuffetTargetFilter(Unit* caster) : _caster(caster) { } +public: + explicit MysticBuffetTargetFilter(Unit* caster) : _caster(caster) { } - bool operator()(WorldObject* unit) const - { - if (!unit->IsInMap(_caster)) - return true; + bool operator()(WorldObject* unit) const + { + if (!unit->IsInMap(_caster)) + return true; - // for standard creatures check full LOS - if (Creature* c = unit->ToCreature()) - if (!c->IsPet() && c->GetDBTableGUIDLow()) - return !_caster->IsWithinLOSInMap(unit); + // for standard creatures check full LOS + if (Creature* c = unit->ToCreature()) + if (!c->IsPet() && c->GetDBTableGUIDLow()) + return !_caster->IsWithinLOSInMap(unit); - // for players and pets check only dynamic los (ice block gameobjects) - float ox, oy, oz; - _caster->GetPosition(ox, oy, oz); - DynamicMapTree const& dTree = unit->GetMap()->GetDynamicMapTree(); - return !dTree.isInLineOfSight(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ()+2.f, ox, oy, oz+2.f, unit->GetPhaseMask()); - } + // for players and pets check only dynamic los (ice block gameobjects) + float ox, oy, oz; + _caster->GetPosition(ox, oy, oz); + DynamicMapTree const& dTree = unit->GetMap()->GetDynamicMapTree(); + return !dTree.isInLineOfSight(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ() + 2.f, ox, oy, oz + 2.f, unit->GetPhaseMask()); + } - private: - Unit* _caster; +private: + Unit* _caster; }; class spell_sindragosa_mystic_buffet : public SpellScriptLoader { - public: - spell_sindragosa_mystic_buffet() : SpellScriptLoader("spell_sindragosa_mystic_buffet") { } +public: + spell_sindragosa_mystic_buffet() : SpellScriptLoader("spell_sindragosa_mystic_buffet") { } - class spell_sindragosa_mystic_buffet_SpellScript : public SpellScript + class spell_sindragosa_mystic_buffet_SpellScript : public SpellScript + { + PrepareSpellScript(spell_sindragosa_mystic_buffet_SpellScript); + + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_sindragosa_mystic_buffet_SpellScript); - - void FilterTargets(std::list& targets) - { - targets.remove_if(MysticBuffetTargetFilter(GetCaster())); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sindragosa_mystic_buffet_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_sindragosa_mystic_buffet_SpellScript(); + targets.remove_if(MysticBuffetTargetFilter(GetCaster())); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sindragosa_mystic_buffet_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_sindragosa_mystic_buffet_SpellScript(); + } }; class spell_sindragosa_soul_preservation : public SpellScriptLoader { - public: - spell_sindragosa_soul_preservation() : SpellScriptLoader("spell_sindragosa_soul_preservation") { } +public: + spell_sindragosa_soul_preservation() : SpellScriptLoader("spell_sindragosa_soul_preservation") { } - class spell_sindragosa_soul_preservation_AuraScript : public AuraScript + class spell_sindragosa_soul_preservation_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sindragosa_soul_preservation_AuraScript); + + void PeriodicTick(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_sindragosa_soul_preservation_AuraScript); - - void PeriodicTick(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - if (Unit* s = GetTarget()) - if (GetStackAmount() >= (s->GetMap()->Is25ManRaid() ? 75 : 30)) - { - s->CastSpell(s, 72466, true); - s->RemoveAurasDueToSpell(72424); - if (s->GetTypeId() == TYPEID_UNIT) s->ToCreature()->SetLootMode(3); - SetDuration(1); - } - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_sindragosa_soul_preservation_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_sindragosa_soul_preservation_AuraScript(); + PreventDefaultAction(); + if (Unit* s = GetTarget()) + if (GetStackAmount() >= (s->GetMap()->Is25ManRaid() ? 75 : 30)) + { + s->CastSpell(s, 72466, true); + s->RemoveAurasDueToSpell(72424); + if (s->GetTypeId() == TYPEID_UNIT) s->ToCreature()->SetLootMode(3); + SetDuration(1); + } } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_sindragosa_soul_preservation_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_sindragosa_soul_preservation_AuraScript(); + } }; class achievement_all_you_can_eat : public AchievementCriteriaScript { - public: - achievement_all_you_can_eat() : AchievementCriteriaScript("achievement_all_you_can_eat") { } +public: + achievement_all_you_can_eat() : AchievementCriteriaScript("achievement_all_you_can_eat") { } - bool OnCheck(Player* /*source*/, Unit* target) - { - if (!target || target->GetEntry() != NPC_SINDRAGOSA) - return false; - return target->GetAI()->GetData(DATA_MYSTIC_BUFFET_STACK) <= 5; - } + bool OnCheck(Player* /*source*/, Unit* target) + { + if (!target || target->GetEntry() != NPC_SINDRAGOSA) + return false; + return target->GetAI()->GetData(DATA_MYSTIC_BUFFET_STACK) <= 5; + } }; class npc_spinestalker : public CreatureScript { - public: - npc_spinestalker() : CreatureScript("npc_spinestalker") { } +public: + npc_spinestalker() : CreatureScript("npc_spinestalker") { } - struct npc_spinestalkerAI : public ScriptedAI + struct npc_spinestalkerAI : public ScriptedAI + { + npc_spinestalkerAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()), _summoned(false) { - npc_spinestalkerAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()), _summoned(false) - { - } + } - void InitializeAI() + void InitializeAI() + { + if (!me->isDead()) { - if (!me->isDead()) - { - _instance->SetData(DATA_SINDRAGOSA_FROSTWYRMS, me->GetDBTableGUIDLow()); // this cannot be in Reset because reset also happens on evade - Reset(); - } - } - - void Reset() - { - _events.Reset(); - _events.ScheduleEvent(EVENT_BELLOWING_ROAR, urand(20000, 25000)); - _events.ScheduleEvent(EVENT_CLEAVE_SPINESTALKER, urand(10000, 15000)); - _events.ScheduleEvent(EVENT_TAIL_SWEEP, urand(8000, 12000)); - me->SetReactState(REACT_DEFENSIVE); - - if (!_summoned) - { - me->SetCanFly(true); - me->SetDisableGravity(true); - me->SetHover(true); - } - } - - void JustReachedHome() - { - ScriptedAI::JustReachedHome(); - if (_summoned) - { - me->SetCanFly(false); - me->SetDisableGravity(false); - me->SetHover(false); - } - } - - void JustRespawned() - { - ScriptedAI::JustRespawned(); _instance->SetData(DATA_SINDRAGOSA_FROSTWYRMS, me->GetDBTableGUIDLow()); // this cannot be in Reset because reset also happens on evade + Reset(); } + } - void JustDied(Unit* /*killer*/) + void Reset() + { + _events.Reset(); + _events.ScheduleEvent(EVENT_BELLOWING_ROAR, urand(20000, 25000)); + _events.ScheduleEvent(EVENT_CLEAVE_SPINESTALKER, urand(10000, 15000)); + _events.ScheduleEvent(EVENT_TAIL_SWEEP, urand(8000, 12000)); + me->SetReactState(REACT_DEFENSIVE); + + if (!_summoned) { - _events.Reset(); + me->SetCanFly(true); + me->SetDisableGravity(true); + me->SetHover(true); } + } - void DoAction(int32 action) + void JustReachedHome() + { + ScriptedAI::JustReachedHome(); + if (_summoned) { - if (action == ACTION_START_FROSTWYRM) - { - if (_summoned) - return; - - _summoned = true; - if (me->isDead()) - return; - - me->setActive(true); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - float moveTime = me->GetExactDist(&SpinestalkerFlyPos) / (me->GetSpeed(MOVE_RUN) * 0.001f); - me->m_Events.AddEvent(new FrostwyrmLandEvent(*me, SpinestalkerLandPos), me->m_Events.CalculateTime(uint64(moveTime) + 250)); - me->SetDefaultMovementType(IDLE_MOTION_TYPE); - me->GetMotionMaster()->MoveIdle(); - me->StopMoving(); - me->GetMotionMaster()->MovePoint(POINT_FROSTWYRM_FLY_IN, SpinestalkerFlyPos); - } - } - - void MovementInform(uint32 type, uint32 point) - { - if (type != EFFECT_MOTION_TYPE || point != POINT_FROSTWYRM_LAND) - return; - - me->setActive(false); me->SetCanFly(false); me->SetDisableGravity(false); me->SetHover(false); - me->SetHomePosition(SpinestalkerLandPos); - me->SetFacingTo(SpinestalkerLandPos.GetOrientation()); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - _events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (_events.ExecuteEvent()) - { - case EVENT_BELLOWING_ROAR: - me->CastSpell(me, SPELL_BELLOWING_ROAR, false); - _events.ScheduleEvent(EVENT_BELLOWING_ROAR, urand(25000, 30000)); - break; - case EVENT_CLEAVE_SPINESTALKER: - me->CastSpell(me->GetVictim(), SPELL_CLEAVE_SPINESTALKER, false); - _events.ScheduleEvent(EVENT_CLEAVE_SPINESTALKER, urand(10000, 15000)); - break; - case EVENT_TAIL_SWEEP: - me->CastSpell(me->GetVictim(), SPELL_TAIL_SWEEP, false); - _events.ScheduleEvent(EVENT_TAIL_SWEEP, urand(22000, 25000)); - break; - default: - break; - } - - DoMeleeAttackIfReady(); - } - - private: - EventMap _events; - InstanceScript* _instance; - bool _summoned; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); } + + void JustRespawned() + { + ScriptedAI::JustRespawned(); + _instance->SetData(DATA_SINDRAGOSA_FROSTWYRMS, me->GetDBTableGUIDLow()); // this cannot be in Reset because reset also happens on evade + } + + void JustDied(Unit* /*killer*/) + { + _events.Reset(); + } + + void DoAction(int32 action) + { + if (action == ACTION_START_FROSTWYRM) + { + if (_summoned) + return; + + _summoned = true; + if (me->isDead()) + return; + + me->setActive(true); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + float moveTime = me->GetExactDist(&SpinestalkerFlyPos) / (me->GetSpeed(MOVE_RUN) * 0.001f); + me->m_Events.AddEvent(new FrostwyrmLandEvent(*me, SpinestalkerLandPos), me->m_Events.CalculateTime(uint64(moveTime) + 250)); + me->SetDefaultMovementType(IDLE_MOTION_TYPE); + me->GetMotionMaster()->MoveIdle(); + me->StopMoving(); + me->GetMotionMaster()->MovePoint(POINT_FROSTWYRM_FLY_IN, SpinestalkerFlyPos); + } + } + + void MovementInform(uint32 type, uint32 point) + { + if (type != EFFECT_MOTION_TYPE || point != POINT_FROSTWYRM_LAND) + return; + + me->setActive(false); + me->SetCanFly(false); + me->SetDisableGravity(false); + me->SetHover(false); + me->SetHomePosition(SpinestalkerLandPos); + me->SetFacingTo(SpinestalkerLandPos.GetOrientation()); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + _events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (_events.ExecuteEvent()) + { + case EVENT_BELLOWING_ROAR: + me->CastSpell(me, SPELL_BELLOWING_ROAR, false); + _events.ScheduleEvent(EVENT_BELLOWING_ROAR, urand(25000, 30000)); + break; + case EVENT_CLEAVE_SPINESTALKER: + me->CastSpell(me->GetVictim(), SPELL_CLEAVE_SPINESTALKER, false); + _events.ScheduleEvent(EVENT_CLEAVE_SPINESTALKER, urand(10000, 15000)); + break; + case EVENT_TAIL_SWEEP: + me->CastSpell(me->GetVictim(), SPELL_TAIL_SWEEP, false); + _events.ScheduleEvent(EVENT_TAIL_SWEEP, urand(22000, 25000)); + break; + default: + break; + } + + DoMeleeAttackIfReady(); + } + + private: + EventMap _events; + InstanceScript* _instance; + bool _summoned; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class npc_rimefang : public CreatureScript { - public: - npc_rimefang() : CreatureScript("npc_rimefang_icc") { } +public: + npc_rimefang() : CreatureScript("npc_rimefang_icc") { } - struct npc_rimefangAI : public ScriptedAI + struct npc_rimefangAI : public ScriptedAI + { + npc_rimefangAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()), _summoned(false) { - npc_rimefangAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()), _summoned(false) - { - } + } - void InitializeAI() + void InitializeAI() + { + if (!me->isDead()) { - if (!me->isDead()) - { - _instance->SetData(DATA_SINDRAGOSA_FROSTWYRMS, me->GetDBTableGUIDLow()); // this cannot be in Reset because reset also happens on evade - Reset(); - } - } - - void Reset() - { - _events.Reset(); - _events.ScheduleEvent(EVENT_FROST_BREATH_RIMEFANG, urand(12000, 15000)); - _events.ScheduleEvent(EVENT_ICY_BLAST, urand(30000, 35000)); - me->SetReactState(REACT_DEFENSIVE); - _icyBlastCounter = 0; - - if (!_summoned) - { - me->SetCanFly(true); - me->SetDisableGravity(true); - me->SetHover(true); - } - } - - void JustReachedHome() - { - ScriptedAI::JustReachedHome(); - if (_summoned) - { - me->SetCanFly(false); - me->SetDisableGravity(false); - me->SetHover(false); - } - } - - void JustRespawned() - { - ScriptedAI::JustRespawned(); _instance->SetData(DATA_SINDRAGOSA_FROSTWYRMS, me->GetDBTableGUIDLow()); // this cannot be in Reset because reset also happens on evade + Reset(); } + } - void JustDied(Unit* /*killer*/) + void Reset() + { + _events.Reset(); + _events.ScheduleEvent(EVENT_FROST_BREATH_RIMEFANG, urand(12000, 15000)); + _events.ScheduleEvent(EVENT_ICY_BLAST, urand(30000, 35000)); + me->SetReactState(REACT_DEFENSIVE); + _icyBlastCounter = 0; + + if (!_summoned) { - _events.Reset(); + me->SetCanFly(true); + me->SetDisableGravity(true); + me->SetHover(true); } + } - void DoAction(int32 action) + void JustReachedHome() + { + ScriptedAI::JustReachedHome(); + if (_summoned) { - if (action == ACTION_START_FROSTWYRM) - { - if (_summoned) - return; - - _summoned = true; - if (me->isDead()) - return; - - me->setActive(true); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - float moveTime = me->GetExactDist(&RimefangFlyPos) / (me->GetSpeed(MOVE_RUN) * 0.001f); - me->m_Events.AddEvent(new FrostwyrmLandEvent(*me, RimefangLandPos), me->m_Events.CalculateTime(uint64(moveTime) + 250)); - me->SetDefaultMovementType(IDLE_MOTION_TYPE); - me->GetMotionMaster()->MoveIdle(); - me->StopMoving(); - me->GetMotionMaster()->MovePoint(POINT_FROSTWYRM_FLY_IN, RimefangFlyPos); - } + me->SetCanFly(false); + me->SetDisableGravity(false); + me->SetHover(false); } + } - void MovementInform(uint32 type, uint32 point) + void JustRespawned() + { + ScriptedAI::JustRespawned(); + _instance->SetData(DATA_SINDRAGOSA_FROSTWYRMS, me->GetDBTableGUIDLow()); // this cannot be in Reset because reset also happens on evade + } + + void JustDied(Unit* /*killer*/) + { + _events.Reset(); + } + + void DoAction(int32 action) + { + if (action == ACTION_START_FROSTWYRM) { - if (type != EFFECT_MOTION_TYPE) + if (_summoned) return; - if (point == POINT_FROSTWYRM_LAND) - { - me->setActive(false); - me->SetCanFly(false); - me->SetDisableGravity(false); - me->SetHover(false); - me->SetHomePosition(RimefangLandPos); - me->SetFacingTo(RimefangLandPos.GetOrientation()); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - } - else if (point == POINT_LAND_GROUND) - { - me->SetCanFly(false); - me->SetDisableGravity(false); - me->SetHover(false); - me->SetReactState(REACT_DEFENSIVE); - if (Unit* victim = me->SelectVictim()) - AttackStart(victim); - } - } - - void EnterCombat(Unit* /*victim*/) - { - me->CastSpell(me, SPELL_FROST_AURA_RIMEFANG, true); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) + _summoned = true; + if (me->isDead()) return; - _events.Update(diff); + me->setActive(true); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + float moveTime = me->GetExactDist(&RimefangFlyPos) / (me->GetSpeed(MOVE_RUN) * 0.001f); + me->m_Events.AddEvent(new FrostwyrmLandEvent(*me, RimefangLandPos), me->m_Events.CalculateTime(uint64(moveTime) + 250)); + me->SetDefaultMovementType(IDLE_MOTION_TYPE); + me->GetMotionMaster()->MoveIdle(); + me->StopMoving(); + me->GetMotionMaster()->MovePoint(POINT_FROSTWYRM_FLY_IN, RimefangFlyPos); + } + } - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + void MovementInform(uint32 type, uint32 point) + { + if (type != EFFECT_MOTION_TYPE) + return; - switch (_events.ExecuteEvent()) - { - case EVENT_FROST_BREATH_RIMEFANG: - if (!me->IsFlying()) - { - me->CastSpell(me->GetVictim(), SPELL_FROST_BREATH, false); - _events.ScheduleEvent(EVENT_FROST_BREATH_RIMEFANG, urand(20000, 25000)); - } - else - _events.ScheduleEvent(EVENT_FROST_BREATH_RIMEFANG, 5000); - break; - case EVENT_ICY_BLAST: + if (point == POINT_FROSTWYRM_LAND) + { + me->setActive(false); + me->SetCanFly(false); + me->SetDisableGravity(false); + me->SetHover(false); + me->SetHomePosition(RimefangLandPos); + me->SetFacingTo(RimefangLandPos.GetOrientation()); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + } + else if (point == POINT_LAND_GROUND) + { + me->SetCanFly(false); + me->SetDisableGravity(false); + me->SetHover(false); + me->SetReactState(REACT_DEFENSIVE); + if (Unit* victim = me->SelectVictim()) + AttackStart(victim); + } + } + + void EnterCombat(Unit* /*victim*/) + { + me->CastSpell(me, SPELL_FROST_AURA_RIMEFANG, true); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + _events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (_events.ExecuteEvent()) + { + case EVENT_FROST_BREATH_RIMEFANG: + if (!me->IsFlying()) + { + me->CastSpell(me->GetVictim(), SPELL_FROST_BREATH, false); + _events.ScheduleEvent(EVENT_FROST_BREATH_RIMEFANG, urand(20000, 25000)); + } + else + _events.ScheduleEvent(EVENT_FROST_BREATH_RIMEFANG, 5000); + break; + case EVENT_ICY_BLAST: { _icyBlastCounter = RAID_MODE(5, 7, 6, 8); me->SetReactState(REACT_PASSIVE); @@ -1657,415 +1657,415 @@ class npc_rimefang : public CreatureScript me->SetDisableGravity(true); me->SetHover(true); me->SendMovementFlagUpdate(); - float floorZ = me->GetMap()->GetHeight(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+2.0f); + float floorZ = me->GetMap()->GetHeight(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 2.0f); float destZ; if (floorZ > 190.0f) destZ = floorZ + 25.0f; else destZ = me->GetPositionZ() + 25.0f; me->GetMotionMaster()->MoveTakeoff(0, me->GetPositionX(), me->GetPositionY(), destZ, me->GetSpeed(MOVE_RUN)); - float moveTime = fabs(destZ-me->GetPositionZ())/(me->GetSpeed(MOVE_RUN)*0.001f); + float moveTime = fabs(destZ - me->GetPositionZ()) / (me->GetSpeed(MOVE_RUN) * 0.001f); _events.ScheduleEvent(EVENT_ICY_BLAST, uint32(moveTime) + urand(60000, 70000)); _events.ScheduleEvent(EVENT_ICY_BLAST_CAST, uint32(moveTime) + 250); break; } - case EVENT_ICY_BLAST_CAST: - if (--_icyBlastCounter) + case EVENT_ICY_BLAST_CAST: + if (--_icyBlastCounter) + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) - { - me->SetFacingToObject(target); - me->CastSpell(target, SPELL_ICY_BLAST, false); - } - _events.ScheduleEvent(EVENT_ICY_BLAST_CAST, 3000); + me->SetFacingToObject(target); + me->CastSpell(target, SPELL_ICY_BLAST, false); } - else - { - float floorZ = me->GetMap()->GetHeight(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+2.0f); - float destZ; - if (floorZ > 190.0f) destZ = floorZ; - else destZ = me->GetPositionZ() - 25.0f; - me->SendMeleeAttackStop(me->GetVictim()); - me->GetMotionMaster()->MoveLand(POINT_LAND_GROUND, me->GetPositionX(), me->GetPositionY(), destZ, me->GetSpeed(MOVE_RUN)); - } - break; - default: - break; - } - - DoMeleeAttackIfReady(); + _events.ScheduleEvent(EVENT_ICY_BLAST_CAST, 3000); + } + else + { + float floorZ = me->GetMap()->GetHeight(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 2.0f); + float destZ; + if (floorZ > 190.0f) destZ = floorZ; + else destZ = me->GetPositionZ() - 25.0f; + me->SendMeleeAttackStop(me->GetVictim()); + me->GetMotionMaster()->MoveLand(POINT_LAND_GROUND, me->GetPositionX(), me->GetPositionY(), destZ, me->GetSpeed(MOVE_RUN)); + } + break; + default: + break; } - private: - EventMap _events; - InstanceScript* _instance; - uint8 _icyBlastCounter; - bool _summoned; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + DoMeleeAttackIfReady(); } + + private: + EventMap _events; + InstanceScript* _instance; + uint8 _icyBlastCounter; + bool _summoned; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class spell_rimefang_icy_blast : public SpellScriptLoader { - public: - spell_rimefang_icy_blast() : SpellScriptLoader("spell_rimefang_icy_blast") { } +public: + spell_rimefang_icy_blast() : SpellScriptLoader("spell_rimefang_icy_blast") { } - class spell_rimefang_icy_blast_SpellScript : public SpellScript + class spell_rimefang_icy_blast_SpellScript : public SpellScript + { + PrepareSpellScript(spell_rimefang_icy_blast_SpellScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareSpellScript(spell_rimefang_icy_blast_SpellScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_ICY_BLAST_AREA)) - return false; - return true; - } - - void HandleTriggerMissile(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Position const* pos = GetExplTargetDest()) - if (TempSummon* summon = GetCaster()->SummonCreature(NPC_ICY_BLAST, *pos, TEMPSUMMON_TIMED_DESPAWN, 40000)) - summon->CastSpell(summon, SPELL_ICY_BLAST_AREA, true); - } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_rimefang_icy_blast_SpellScript::HandleTriggerMissile, EFFECT_1, SPELL_EFFECT_TRIGGER_MISSILE); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_rimefang_icy_blast_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_ICY_BLAST_AREA)) + return false; + return true; } + + void HandleTriggerMissile(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (Position const* pos = GetExplTargetDest()) + if (TempSummon* summon = GetCaster()->SummonCreature(NPC_ICY_BLAST, *pos, TEMPSUMMON_TIMED_DESPAWN, 40000)) + summon->CastSpell(summon, SPELL_ICY_BLAST_AREA, true); + } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_rimefang_icy_blast_SpellScript::HandleTriggerMissile, EFFECT_1, SPELL_EFFECT_TRIGGER_MISSILE); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_rimefang_icy_blast_SpellScript(); + } }; class at_sindragosa_lair : public AreaTriggerScript { - public: - at_sindragosa_lair() : AreaTriggerScript("at_sindragosa_lair") { } +public: + at_sindragosa_lair() : AreaTriggerScript("at_sindragosa_lair") { } - bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) + bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) + { + if (InstanceScript* instance = player->GetInstanceScript()) { - if (InstanceScript* instance = player->GetInstanceScript()) + if (!instance->GetData(DATA_SPINESTALKER)) + if (Creature* spinestalker = ObjectAccessor::GetCreature(*player, instance->GetData64(DATA_SPINESTALKER))) + spinestalker->AI()->DoAction(ACTION_START_FROSTWYRM); + + if (!instance->GetData(DATA_RIMEFANG)) + if (Creature* rimefang = ObjectAccessor::GetCreature(*player, instance->GetData64(DATA_RIMEFANG))) + rimefang->AI()->DoAction(ACTION_START_FROSTWYRM); + + if (!instance->GetData(DATA_SINDRAGOSA_FROSTWYRMS) && !instance->GetData64(DATA_SINDRAGOSA) && instance->GetBossState(DATA_SINDRAGOSA) != DONE) { - if (!instance->GetData(DATA_SPINESTALKER)) - if (Creature* spinestalker = ObjectAccessor::GetCreature(*player, instance->GetData64(DATA_SPINESTALKER))) - spinestalker->AI()->DoAction(ACTION_START_FROSTWYRM); + if (instance->GetData(DATA_HAS_LIMITED_ATTEMPTS) && !instance->GetData(DATA_HEROIC_ATTEMPTS)) + return true; - if (!instance->GetData(DATA_RIMEFANG)) - if (Creature* rimefang = ObjectAccessor::GetCreature(*player, instance->GetData64(DATA_RIMEFANG))) - rimefang->AI()->DoAction(ACTION_START_FROSTWYRM); - - if (!instance->GetData(DATA_SINDRAGOSA_FROSTWYRMS) && !instance->GetData64(DATA_SINDRAGOSA) && instance->GetBossState(DATA_SINDRAGOSA) != DONE) - { - if (instance->GetData(DATA_HAS_LIMITED_ATTEMPTS) && !instance->GetData(DATA_HEROIC_ATTEMPTS)) - return true; - - player->GetMap()->LoadGrid(SindragosaSpawnPos.GetPositionX(), SindragosaSpawnPos.GetPositionY()); - if (Creature* sindragosa = player->GetMap()->SummonCreature(NPC_SINDRAGOSA, SindragosaSpawnPos)) - sindragosa->AI()->DoAction(ACTION_START_FROSTWYRM); - } + player->GetMap()->LoadGrid(SindragosaSpawnPos.GetPositionX(), SindragosaSpawnPos.GetPositionY()); + if (Creature* sindragosa = player->GetMap()->SummonCreature(NPC_SINDRAGOSA, SindragosaSpawnPos)) + sindragosa->AI()->DoAction(ACTION_START_FROSTWYRM); } - - return true; } + + return true; + } }; /*** TRASH ***/ class npc_sindragosa_trash : public CreatureScript { - public: - npc_sindragosa_trash() : CreatureScript("npc_sindragosa_trash") { } +public: + npc_sindragosa_trash() : CreatureScript("npc_sindragosa_trash") { } - struct npc_sindragosa_trashAI : public ScriptedAI + struct npc_sindragosa_trashAI : public ScriptedAI + { + npc_sindragosa_trashAI(Creature* creature) : ScriptedAI(creature) { - npc_sindragosa_trashAI(Creature* creature) : ScriptedAI(creature) - { - _instance = creature->GetInstanceScript(); - } + _instance = creature->GetInstanceScript(); + } - void InitializeAI() + void InitializeAI() + { + _frostwyrmId = (me->GetHomePosition().GetPositionY() < 2484.35f) ? DATA_RIMEFANG : DATA_SPINESTALKER; + if (!me->isDead()) { - _frostwyrmId = (me->GetHomePosition().GetPositionY() < 2484.35f) ? DATA_RIMEFANG : DATA_SPINESTALKER; - if (!me->isDead()) - { - if (me->GetEntry() == NPC_FROSTWING_WHELP) - _instance->SetData(_frostwyrmId, me->GetDBTableGUIDLow()); // this cannot be in Reset because reset also happens on evade - Reset(); - } - } - - void Reset() - { - _isTaunted = false; - _events.Reset(); - if (me->GetEntry() == NPC_FROSTWARDEN_HANDLER) - { - _events.ScheduleEvent(EVENT_FROSTWARDEN_ORDER_WHELP, 3000); - _events.ScheduleEvent(EVENT_CONCUSSIVE_SHOCK, urand(8000, 10000)); - } - else - _events.ScheduleEvent(EVENT_WHELP_FROST_BLAST, urand(3000, 6000)); - } - - void EnterCombat(Unit* who) - { - if (me->GetEntry() == NPC_FROSTWARDEN_HANDLER) - { - std::list unitList; - GetCreatureListWithEntryInGrid(unitList, me, NPC_FROSTWING_WHELP, 40.0f); - for (std::list::const_iterator itr = unitList.begin(); itr != unitList.end(); ++itr) - if (!(*itr)->IsInCombat()) - (*itr)->AI()->AttackStart(who); - } - else - { - if (Creature* c = me->FindNearestCreature(NPC_FROSTWARDEN_HANDLER, 40.0f, true)) - if (!c->IsInCombat()) - c->AI()->AttackStart(who); - me->CallForHelp(15.0f); - } - } - - void JustRespawned() - { - ScriptedAI::JustRespawned(); - - // Increase add count if (me->GetEntry() == NPC_FROSTWING_WHELP) _instance->SetData(_frostwyrmId, me->GetDBTableGUIDLow()); // this cannot be in Reset because reset also happens on evade + Reset(); } - - void SetData(uint32 type, uint32 data) - { - if (type == DATA_WHELP_MARKER) - _isTaunted = data != 0; - } - - uint32 GetData(uint32 type) const - { - if (type == DATA_FROSTWYRM_OWNER) - return _frostwyrmId; - else if (type == DATA_WHELP_MARKER) - return uint32(_isTaunted); - return 0; - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - _events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (_events.ExecuteEvent()) - { - case EVENT_FROSTWARDEN_ORDER_WHELP: - me->CastSpell(me, SPELL_ORDER_WHELP, false); - _events.ScheduleEvent(EVENT_FROSTWARDEN_ORDER_WHELP, 3000); - break; - case EVENT_CONCUSSIVE_SHOCK: - me->CastSpell(me, SPELL_CONCUSSIVE_SHOCK, false); - _events.ScheduleEvent(EVENT_CONCUSSIVE_SHOCK, urand(10000, 13000)); - break; - case EVENT_WHELP_FROST_BLAST: - me->CastSpell(me->GetVictim(), 71361, false); - _events.ScheduleEvent(EVENT_WHELP_FROST_BLAST, urand(5000,8000)); - default: - break; - } - - DoMeleeAttackIfReady(); - } - - private: - EventMap _events; - InstanceScript* _instance; - uint32 _frostwyrmId; - bool _isTaunted; // Frostwing Whelp only - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); } + + void Reset() + { + _isTaunted = false; + _events.Reset(); + if (me->GetEntry() == NPC_FROSTWARDEN_HANDLER) + { + _events.ScheduleEvent(EVENT_FROSTWARDEN_ORDER_WHELP, 3000); + _events.ScheduleEvent(EVENT_CONCUSSIVE_SHOCK, urand(8000, 10000)); + } + else + _events.ScheduleEvent(EVENT_WHELP_FROST_BLAST, urand(3000, 6000)); + } + + void EnterCombat(Unit* who) + { + if (me->GetEntry() == NPC_FROSTWARDEN_HANDLER) + { + std::list unitList; + GetCreatureListWithEntryInGrid(unitList, me, NPC_FROSTWING_WHELP, 40.0f); + for (std::list::const_iterator itr = unitList.begin(); itr != unitList.end(); ++itr) + if (!(*itr)->IsInCombat()) + (*itr)->AI()->AttackStart(who); + } + else + { + if (Creature* c = me->FindNearestCreature(NPC_FROSTWARDEN_HANDLER, 40.0f, true)) + if (!c->IsInCombat()) + c->AI()->AttackStart(who); + me->CallForHelp(15.0f); + } + } + + void JustRespawned() + { + ScriptedAI::JustRespawned(); + + // Increase add count + if (me->GetEntry() == NPC_FROSTWING_WHELP) + _instance->SetData(_frostwyrmId, me->GetDBTableGUIDLow()); // this cannot be in Reset because reset also happens on evade + } + + void SetData(uint32 type, uint32 data) + { + if (type == DATA_WHELP_MARKER) + _isTaunted = data != 0; + } + + uint32 GetData(uint32 type) const + { + if (type == DATA_FROSTWYRM_OWNER) + return _frostwyrmId; + else if (type == DATA_WHELP_MARKER) + return uint32(_isTaunted); + return 0; + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + _events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (_events.ExecuteEvent()) + { + case EVENT_FROSTWARDEN_ORDER_WHELP: + me->CastSpell(me, SPELL_ORDER_WHELP, false); + _events.ScheduleEvent(EVENT_FROSTWARDEN_ORDER_WHELP, 3000); + break; + case EVENT_CONCUSSIVE_SHOCK: + me->CastSpell(me, SPELL_CONCUSSIVE_SHOCK, false); + _events.ScheduleEvent(EVENT_CONCUSSIVE_SHOCK, urand(10000, 13000)); + break; + case EVENT_WHELP_FROST_BLAST: + me->CastSpell(me->GetVictim(), 71361, false); + _events.ScheduleEvent(EVENT_WHELP_FROST_BLAST, urand(5000, 8000)); + default: + break; + } + + DoMeleeAttackIfReady(); + } + + private: + EventMap _events; + InstanceScript* _instance; + uint32 _frostwyrmId; + bool _isTaunted; // Frostwing Whelp only + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class OrderWhelpTargetSelector { - public: - explicit OrderWhelpTargetSelector(Creature* owner) : _owner(owner) { } +public: + explicit OrderWhelpTargetSelector(Creature* owner) : _owner(owner) { } - bool operator()(Creature* creature) - { - if (!creature->AI()->GetData(DATA_WHELP_MARKER) && creature->AI()->GetData(DATA_FROSTWYRM_OWNER) == _owner->AI()->GetData(DATA_FROSTWYRM_OWNER)) - return false; - return true; - } + bool operator()(Creature* creature) + { + if (!creature->AI()->GetData(DATA_WHELP_MARKER) && creature->AI()->GetData(DATA_FROSTWYRM_OWNER) == _owner->AI()->GetData(DATA_FROSTWYRM_OWNER)) + return false; + return true; + } - private: - Creature* _owner; +private: + Creature* _owner; }; class spell_frostwarden_handler_order_whelp : public SpellScriptLoader { - public: - spell_frostwarden_handler_order_whelp() : SpellScriptLoader("spell_frostwarden_handler_order_whelp") { } +public: + spell_frostwarden_handler_order_whelp() : SpellScriptLoader("spell_frostwarden_handler_order_whelp") { } - class spell_frostwarden_handler_order_whelp_SpellScript : public SpellScript + class spell_frostwarden_handler_order_whelp_SpellScript : public SpellScript + { + PrepareSpellScript(spell_frostwarden_handler_order_whelp_SpellScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareSpellScript(spell_frostwarden_handler_order_whelp_SpellScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_FOCUS_FIRE)) - return false; - return true; - } - - void FilterTargets(std::list& targets) - { - targets.remove_if(acore::ObjectTypeIdCheck(TYPEID_PLAYER, false)); - if (targets.empty()) - return; - - WorldObject* target = acore::Containers::SelectRandomContainerElement(targets); - targets.clear(); - targets.push_back(target); - } - - void HandleForcedCast(SpellEffIndex effIndex) - { - // caster is Frostwarden Handler, target is player, caster of triggered is whelp - PreventHitDefaultEffect(effIndex); - std::list unitList; - GetCreatureListWithEntryInGrid(unitList, GetCaster(), NPC_FROSTWING_WHELP, 150.0f); - if (Creature* creature = GetCaster()->ToCreature()) - unitList.remove_if(OrderWhelpTargetSelector(creature)); - - if (unitList.empty()) - return; - - acore::Containers::SelectRandomContainerElement(unitList)->CastSpell(GetHitUnit(), uint32(GetEffectValue()), true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_frostwarden_handler_order_whelp_SpellScript::HandleForcedCast, EFFECT_0, SPELL_EFFECT_FORCE_CAST); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_frostwarden_handler_order_whelp_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_frostwarden_handler_order_whelp_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_FOCUS_FIRE)) + return false; + return true; } + + void FilterTargets(std::list& targets) + { + targets.remove_if(acore::ObjectTypeIdCheck(TYPEID_PLAYER, false)); + if (targets.empty()) + return; + + WorldObject* target = acore::Containers::SelectRandomContainerElement(targets); + targets.clear(); + targets.push_back(target); + } + + void HandleForcedCast(SpellEffIndex effIndex) + { + // caster is Frostwarden Handler, target is player, caster of triggered is whelp + PreventHitDefaultEffect(effIndex); + std::list unitList; + GetCreatureListWithEntryInGrid(unitList, GetCaster(), NPC_FROSTWING_WHELP, 150.0f); + if (Creature* creature = GetCaster()->ToCreature()) + unitList.remove_if(OrderWhelpTargetSelector(creature)); + + if (unitList.empty()) + return; + + acore::Containers::SelectRandomContainerElement(unitList)->CastSpell(GetHitUnit(), uint32(GetEffectValue()), true); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_frostwarden_handler_order_whelp_SpellScript::HandleForcedCast, EFFECT_0, SPELL_EFFECT_FORCE_CAST); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_frostwarden_handler_order_whelp_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_frostwarden_handler_order_whelp_SpellScript(); + } }; class spell_frostwarden_handler_focus_fire : public SpellScriptLoader { - public: - spell_frostwarden_handler_focus_fire() : SpellScriptLoader("spell_frostwarden_handler_focus_fire") { } +public: + spell_frostwarden_handler_focus_fire() : SpellScriptLoader("spell_frostwarden_handler_focus_fire") { } - class spell_frostwarden_handler_focus_fire_SpellScript : public SpellScript + class spell_frostwarden_handler_focus_fire_SpellScript : public SpellScript + { + PrepareSpellScript(spell_frostwarden_handler_focus_fire_SpellScript); + + void HandleScript(SpellEffIndex effIndex) { - PrepareSpellScript(spell_frostwarden_handler_focus_fire_SpellScript); - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetCaster()->AddThreat(GetHitUnit(), float(GetEffectValue())); - GetCaster()->GetAI()->SetData(DATA_WHELP_MARKER, 1); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_frostwarden_handler_focus_fire_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - class spell_frostwarden_handler_focus_fire_AuraScript : public AuraScript - { - PrepareAuraScript(spell_frostwarden_handler_focus_fire_AuraScript); - - void PeriodicTick(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - if (Unit* caster = GetCaster()) - { - caster->AddThreat(GetTarget(), -float(GetSpellInfo()->Effects[EFFECT_1].CalcValue())); - caster->GetAI()->SetData(DATA_WHELP_MARKER, 0); - } - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_frostwarden_handler_focus_fire_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_frostwarden_handler_focus_fire_SpellScript(); + PreventHitDefaultEffect(effIndex); + GetCaster()->AddThreat(GetHitUnit(), float(GetEffectValue())); + GetCaster()->GetAI()->SetData(DATA_WHELP_MARKER, 1); } - AuraScript* GetAuraScript() const + void Register() { - return new spell_frostwarden_handler_focus_fire_AuraScript(); + OnEffectHitTarget += SpellEffectFn(spell_frostwarden_handler_focus_fire_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); } + }; + + class spell_frostwarden_handler_focus_fire_AuraScript : public AuraScript + { + PrepareAuraScript(spell_frostwarden_handler_focus_fire_AuraScript); + + void PeriodicTick(AuraEffect const* /*aurEff*/) + { + PreventDefaultAction(); + if (Unit* caster = GetCaster()) + { + caster->AddThreat(GetTarget(), -float(GetSpellInfo()->Effects[EFFECT_1].CalcValue())); + caster->GetAI()->SetData(DATA_WHELP_MARKER, 0); + } + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_frostwarden_handler_focus_fire_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_frostwarden_handler_focus_fire_SpellScript(); + } + + AuraScript* GetAuraScript() const + { + return new spell_frostwarden_handler_focus_fire_AuraScript(); + } }; class spell_sindragosa_frost_breath : public SpellScriptLoader { - public: - spell_sindragosa_frost_breath() : SpellScriptLoader("spell_sindragosa_frost_breath") { } +public: + spell_sindragosa_frost_breath() : SpellScriptLoader("spell_sindragosa_frost_breath") { } - class spell_sindragosa_frost_breath_SpellScript : public SpellScript + class spell_sindragosa_frost_breath_SpellScript : public SpellScript + { + PrepareSpellScript(spell_sindragosa_frost_breath_SpellScript); + + void HandleInfusion() { - PrepareSpellScript(spell_sindragosa_frost_breath_SpellScript); + Player* target = GetHitPlayer(); + if (!target) + return; - void HandleInfusion() + // Check difficulty and quest status + if (!(target->GetRaidDifficulty() & RAID_DIFFICULTY_MASK_25MAN) || target->GetQuestStatus(QUEST_FROST_INFUSION) != QUEST_STATUS_INCOMPLETE) + return; + + // Check if player has Shadow's Edge equipped and not ready for infusion + if (!target->HasAura(SPELL_UNSATED_CRAVING) || target->HasAura(SPELL_FROST_IMBUED_BLADE)) + return; + + Aura* infusion = target->GetAura(SPELL_FROST_INFUSION, target->GetGUID()); + if (infusion && infusion->GetStackAmount() >= 3) { - Player* target = GetHitPlayer(); - if (!target) - return; - - // Check difficulty and quest status - if (!(target->GetRaidDifficulty() & RAID_DIFFICULTY_MASK_25MAN) || target->GetQuestStatus(QUEST_FROST_INFUSION) != QUEST_STATUS_INCOMPLETE) - return; - - // Check if player has Shadow's Edge equipped and not ready for infusion - if (!target->HasAura(SPELL_UNSATED_CRAVING) || target->HasAura(SPELL_FROST_IMBUED_BLADE)) - return; - - Aura* infusion = target->GetAura(SPELL_FROST_INFUSION, target->GetGUID()); - if (infusion && infusion->GetStackAmount() >= 3) - { - target->RemoveAura(infusion); - target->CastSpell(target, SPELL_FROST_IMBUED_BLADE, TRIGGERED_FULL_MASK); - } - else - target->CastSpell(target, SPELL_FROST_INFUSION, TRIGGERED_FULL_MASK); + target->RemoveAura(infusion); + target->CastSpell(target, SPELL_FROST_IMBUED_BLADE, TRIGGERED_FULL_MASK); } - - void Register() - { - AfterHit += SpellHitFn(spell_sindragosa_frost_breath_SpellScript::HandleInfusion); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_sindragosa_frost_breath_SpellScript(); + else + target->CastSpell(target, SPELL_FROST_INFUSION, TRIGGERED_FULL_MASK); } + + void Register() + { + AfterHit += SpellHitFn(spell_sindragosa_frost_breath_SpellScript::HandleInfusion); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_sindragosa_frost_breath_SpellScript(); + } }; void AddSC_boss_sindragosa() diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp index 405aae564..868673221 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp @@ -344,7 +344,7 @@ enum MiscData bool IsValidPlatformTarget(Unit const* target) { - return target->GetExactDist2dSq(&CenterPosition) < 90.0f*90.0f && target->GetPositionZ() > 840.0f && target->GetPositionZ() < 875.0f; + return target->GetExactDist2dSq(&CenterPosition) < 90.0f * 90.0f && target->GetPositionZ() > 840.0f && target->GetPositionZ() < 875.0f; } void SendPacketToPlayers(WorldPacket const* data, Unit* source) @@ -449,103 +449,103 @@ private: class FrozenThroneResetWorker { - public: - FrozenThroneResetWorker() { } +public: + FrozenThroneResetWorker() { } - bool operator()(GameObject* go) + bool operator()(GameObject* go) + { + switch (go->GetEntry()) { - switch (go->GetEntry()) - { - case GO_ARTHAS_PLATFORM: - go->SetDestructibleState(GO_DESTRUCTIBLE_INTACT, NULL, true); - break; - case GO_DOODAD_ICECROWN_THRONEFROSTYWIND01: - go->SetGoState(GO_STATE_ACTIVE); - break; - case GO_DOODAD_ICECROWN_THRONEFROSTYEDGE01: - go->SetGoState(GO_STATE_READY); - break; - case GO_DOODAD_ICECROWN_SNOWEDGEWARNING01: - go->SetGoState(GO_STATE_READY); - break; - case GO_DOODAD_ICESHARD_STANDING02: - case GO_DOODAD_ICESHARD_STANDING01: - case GO_DOODAD_ICESHARD_STANDING03: - case GO_DOODAD_ICESHARD_STANDING04: - go->ResetDoorOrButton(); - break; - default: - break; - } - - return false; + case GO_ARTHAS_PLATFORM: + go->SetDestructibleState(GO_DESTRUCTIBLE_INTACT, NULL, true); + break; + case GO_DOODAD_ICECROWN_THRONEFROSTYWIND01: + go->SetGoState(GO_STATE_ACTIVE); + break; + case GO_DOODAD_ICECROWN_THRONEFROSTYEDGE01: + go->SetGoState(GO_STATE_READY); + break; + case GO_DOODAD_ICECROWN_SNOWEDGEWARNING01: + go->SetGoState(GO_STATE_READY); + break; + case GO_DOODAD_ICESHARD_STANDING02: + case GO_DOODAD_ICESHARD_STANDING01: + case GO_DOODAD_ICESHARD_STANDING03: + case GO_DOODAD_ICESHARD_STANDING04: + go->ResetDoorOrButton(); + break; + default: + break; } + + return false; + } }; class StartMovementEvent : public BasicEvent { - public: - StartMovementEvent(Creature* summoner, Creature* owner) : _summoner(summoner), _owner(owner) {} +public: + StartMovementEvent(Creature* summoner, Creature* owner) : _summoner(summoner), _owner(owner) {} - bool Execute(uint64 /*time*/, uint32 /*diff*/) - { - _owner->SetReactState(REACT_AGGRESSIVE); - if (!_owner->getThreatManager().isThreatListEmpty()) - if (Unit* target = _owner->SelectVictim()) - _owner->AI()->AttackStart(target); - if (!_owner->GetVictim()) - if (Unit* target = _summoner->AI()->SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankLKTargetSelector(_summoner))) - _owner->AI()->AttackStart(target); - _owner->AI()->DoZoneInCombat(); - return true; - } + bool Execute(uint64 /*time*/, uint32 /*diff*/) + { + _owner->SetReactState(REACT_AGGRESSIVE); + if (!_owner->getThreatManager().isThreatListEmpty()) + if (Unit* target = _owner->SelectVictim()) + _owner->AI()->AttackStart(target); + if (!_owner->GetVictim()) + if (Unit* target = _summoner->AI()->SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankLKTargetSelector(_summoner))) + _owner->AI()->AttackStart(target); + _owner->AI()->DoZoneInCombat(); + return true; + } - private: - Creature* _summoner; - Creature* _owner; +private: + Creature* _summoner; + Creature* _owner; }; class VileSpiritActivateEvent : public BasicEvent { - public: - explicit VileSpiritActivateEvent(Creature* owner) : _owner(owner) {} +public: + explicit VileSpiritActivateEvent(Creature* owner) : _owner(owner) {} - bool Execute(uint64 /*time*/, uint32 /*diff*/) - { - _owner->SetReactState(REACT_AGGRESSIVE); - _owner->CastSpell(_owner, SPELL_VILE_SPIRIT_MOVE_SEARCH, true); - _owner->CastSpell((Unit*)NULL, SPELL_VILE_SPIRIT_DAMAGE_SEARCH, true); - return true; - } + bool Execute(uint64 /*time*/, uint32 /*diff*/) + { + _owner->SetReactState(REACT_AGGRESSIVE); + _owner->CastSpell(_owner, SPELL_VILE_SPIRIT_MOVE_SEARCH, true); + _owner->CastSpell((Unit*)NULL, SPELL_VILE_SPIRIT_DAMAGE_SEARCH, true); + return true; + } - private: - Creature* _owner; +private: + Creature* _owner; }; class TriggerWickedSpirit : public BasicEvent { - public: - explicit TriggerWickedSpirit(Creature* owner) - : _owner(owner), _counter(13) +public: + explicit TriggerWickedSpirit(Creature* owner) + : _owner(owner), _counter(13) + { + } + + bool Execute(uint64 /*time*/, uint32 /*diff*/) + { + _owner->CastCustomSpell(SPELL_TRIGGER_VILE_SPIRIT_HEROIC, SPELLVALUE_MAX_TARGETS, 1, NULL, true); + + if (--_counter) { + _owner->m_Events.AddEvent(this, _owner->m_Events.CalculateTime(3000)); + return false; } - bool Execute(uint64 /*time*/, uint32 /*diff*/) - { - _owner->CastCustomSpell(SPELL_TRIGGER_VILE_SPIRIT_HEROIC, SPELLVALUE_MAX_TARGETS, 1, NULL, true); + return true; + } - if (--_counter) - { - _owner->m_Events.AddEvent(this, _owner->m_Events.CalculateTime(3000)); - return false; - } - - return true; - } - - private: - Creature* _owner; - uint32 _counter; +private: + Creature* _owner; + uint32 _counter; }; class LichKingDeathEvent : public BasicEvent @@ -581,280 +581,280 @@ private: class NecroticPlagueTargetCheck : public acore::unary_function { - public: - NecroticPlagueTargetCheck(Unit const* obj, uint32 notAura1, uint32 notAura2) : _sourceObj(obj), _notAura1(notAura1), _notAura2(notAura2) {} +public: + NecroticPlagueTargetCheck(Unit const* obj, uint32 notAura1, uint32 notAura2) : _sourceObj(obj), _notAura1(notAura1), _notAura2(notAura2) {} - bool operator()(Unit* unit) const - { - if (!unit || unit->GetTypeId() != TYPEID_PLAYER || unit == _sourceObj || _sourceObj->GetVictim() == unit || !unit->isTargetableForAttack()) - return false; - if (unit->HasAura(SPELL_PLAGUE_AVOIDANCE) || unit->HasAura(SPELL_BOSS_HITTIN_YA_AURA) || unit->HasAura(_notAura1) || unit->HasAura(_notAura2)) - return false; - if (!_sourceObj->IsWithinLOSInMap(unit)) - return false; - return true; - } + bool operator()(Unit* unit) const + { + if (!unit || unit->GetTypeId() != TYPEID_PLAYER || unit == _sourceObj || _sourceObj->GetVictim() == unit || !unit->isTargetableForAttack()) + return false; + if (unit->HasAura(SPELL_PLAGUE_AVOIDANCE) || unit->HasAura(SPELL_BOSS_HITTIN_YA_AURA) || unit->HasAura(_notAura1) || unit->HasAura(_notAura2)) + return false; + if (!_sourceObj->IsWithinLOSInMap(unit)) + return false; + return true; + } - private: - Unit const* _sourceObj; - uint32 _notAura1; - uint32 _notAura2; +private: + Unit const* _sourceObj; + uint32 _notAura1; + uint32 _notAura2; }; class HeightDifferenceCheck { - public: - HeightDifferenceCheck(GameObject* go, float diff, bool reverse) : _baseObject(go), _difference(diff), _reverse(reverse) {} - bool operator()(WorldObject* unit) const { return (unit->GetPositionZ() - _baseObject->GetPositionZ() > _difference) != _reverse; } - private: - GameObject* _baseObject; - float _difference; - bool _reverse; +public: + HeightDifferenceCheck(GameObject* go, float diff, bool reverse) : _baseObject(go), _difference(diff), _reverse(reverse) {} + bool operator()(WorldObject* unit) const { return (unit->GetPositionZ() - _baseObject->GetPositionZ() > _difference) != _reverse; } +private: + GameObject* _baseObject; + float _difference; + bool _reverse; }; class boss_the_lich_king : public CreatureScript { - public: - boss_the_lich_king() : CreatureScript("boss_the_lich_king") { } +public: + boss_the_lich_king() : CreatureScript("boss_the_lich_king") { } - struct boss_the_lich_kingAI : public BossAI + struct boss_the_lich_kingAI : public BossAI + { + boss_the_lich_kingAI(Creature* creature) : BossAI(creature, DATA_THE_LICH_KING) { - boss_the_lich_kingAI(Creature* creature) : BossAI(creature, DATA_THE_LICH_KING) - { - me->AddAura(SPELL_EMOTE_SIT_NO_SHEATH, me); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - me->SetReactState(REACT_PASSIVE); - } + me->AddAura(SPELL_EMOTE_SIT_NO_SHEATH, me); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + me->SetReactState(REACT_PASSIVE); + } - uint8 _phase; - uint32 _necroticPlagueStack; - uint32 _vileSpiritExplosions; - uint16 _positionCheckTimer; - uint32 _lastTalkTimeKill; - uint32 _lastTalkTimeBuff; - bool _bFrostmournePhase; - bool _bFordringMustFallYell; + uint8 _phase; + uint32 _necroticPlagueStack; + uint32 _vileSpiritExplosions; + uint16 _positionCheckTimer; + uint32 _lastTalkTimeKill; + uint32 _lastTalkTimeBuff; + bool _bFrostmournePhase; + bool _bFordringMustFallYell; - void Reset() - { - _phase = PHASE_NONE; - _necroticPlagueStack = 0; - _vileSpiritExplosions = 0; - _positionCheckTimer = 5000; - _lastTalkTimeKill = 0; - _lastTalkTimeBuff = 0; - _bFrostmournePhase = false; - _bFordringMustFallYell = false; + void Reset() + { + _phase = PHASE_NONE; + _necroticPlagueStack = 0; + _vileSpiritExplosions = 0; + _positionCheckTimer = 5000; + _lastTalkTimeKill = 0; + _lastTalkTimeBuff = 0; + _bFrostmournePhase = false; + _bFordringMustFallYell = false; - _Reset(); - DoAction(ACTION_RESTORE_LIGHT); - SetEquipmentSlots(true); - if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC)) - me->SetStandState(UNIT_STAND_STATE_SIT); - } - - void JustDied(Unit* /*killer*/) - { - _JustDied(); - DoAction(ACTION_RESTORE_LIGHT); - me->PlayDirectSound(17374); - } - - void EnterCombat(Unit* target) - { - if (!instance->CheckRequiredBosses(DATA_THE_LICH_KING, target->ToPlayer()) || !me->IsVisible()) - { - EnterEvadeMode(); - instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT); - return; - } - - _phase = PHASE_ONE; - instance->SetBossState(DATA_THE_LICH_KING, IN_PROGRESS); - me->setActive(true); - me->SetInCombatWithZone(); - me->RemoveAurasDueToSpell(SPELL_EMOTE_SIT_NO_SHEATH); // just to be sure - - events.ScheduleEvent(EVENT_BERSERK, 900000, EVENT_GROUP_BERSERK); - events.ScheduleEvent(EVENT_SUMMON_SHAMBLING_HORROR, 15000, EVENT_GROUP_ABILITIES); - events.ScheduleEvent(EVENT_SUMMON_DRUDGE_GHOUL, 10000, EVENT_GROUP_ABILITIES); - events.ScheduleEvent(EVENT_INFEST, 5000, EVENT_GROUP_ABILITIES); - events.ScheduleEvent(EVENT_NECROTIC_PLAGUE, urand(30000, 31000), EVENT_GROUP_ABILITIES); - if (IsHeroic()) - events.ScheduleEvent(EVENT_SHADOW_TRAP, 15500, EVENT_GROUP_ABILITIES); - } - - void JustReachedHome() - { - _JustReachedHome(); - DoAction(ACTION_RESTORE_LIGHT); - - // Reset The Frozen Throne gameobjects - FrozenThroneResetWorker reset; - acore::GameObjectWorker worker(me, reset); - me->VisitNearbyGridObject(333.0f, worker); - - me->AddAura(SPELL_EMOTE_SIT_NO_SHEATH, me); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - me->SetReactState(REACT_PASSIVE); + _Reset(); + DoAction(ACTION_RESTORE_LIGHT); + SetEquipmentSlots(true); + if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC)) me->SetStandState(UNIT_STAND_STATE_SIT); + } + void JustDied(Unit* /*killer*/) + { + _JustDied(); + DoAction(ACTION_RESTORE_LIGHT); + me->PlayDirectSound(17374); + } + + void EnterCombat(Unit* target) + { + if (!instance->CheckRequiredBosses(DATA_THE_LICH_KING, target->ToPlayer()) || !me->IsVisible()) + { + EnterEvadeMode(); + instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT); + return; } - bool CanAIAttack(Unit const* target) const + _phase = PHASE_ONE; + instance->SetBossState(DATA_THE_LICH_KING, IN_PROGRESS); + me->setActive(true); + me->SetInCombatWithZone(); + me->RemoveAurasDueToSpell(SPELL_EMOTE_SIT_NO_SHEATH); // just to be sure + + events.ScheduleEvent(EVENT_BERSERK, 900000, EVENT_GROUP_BERSERK); + events.ScheduleEvent(EVENT_SUMMON_SHAMBLING_HORROR, 15000, EVENT_GROUP_ABILITIES); + events.ScheduleEvent(EVENT_SUMMON_DRUDGE_GHOUL, 10000, EVENT_GROUP_ABILITIES); + events.ScheduleEvent(EVENT_INFEST, 5000, EVENT_GROUP_ABILITIES); + events.ScheduleEvent(EVENT_NECROTIC_PLAGUE, urand(30000, 31000), EVENT_GROUP_ABILITIES); + if (IsHeroic()) + events.ScheduleEvent(EVENT_SHADOW_TRAP, 15500, EVENT_GROUP_ABILITIES); + } + + void JustReachedHome() + { + _JustReachedHome(); + DoAction(ACTION_RESTORE_LIGHT); + + // Reset The Frozen Throne gameobjects + FrozenThroneResetWorker reset; + acore::GameObjectWorker worker(me, reset); + me->VisitNearbyGridObject(333.0f, worker); + + me->AddAura(SPELL_EMOTE_SIT_NO_SHEATH, me); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + me->SetReactState(REACT_PASSIVE); + me->SetStandState(UNIT_STAND_STATE_SIT); + + } + + bool CanAIAttack(Unit const* target) const + { + return me->IsVisible() && IsValidPlatformTarget(target) && !target->GetVehicle(); + } + + /*bool CanBeSeen(Player const* p) + { + return me->GetExactDistSq(p) < 200.0f*200.0f; + }*/ + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER && !me->IsInEvadeMode() && _phase != PHASE_OUTRO && _lastTalkTimeKill + 5 < time(nullptr)) { - return me->IsVisible() && IsValidPlatformTarget(target) && !target->GetVehicle(); + _lastTalkTimeKill = time(nullptr); + Talk(SAY_LK_KILL); } + } - /*bool CanBeSeen(Player const* p) + void DoAction(int32 action) + { + switch (action) { - return me->GetExactDistSq(p) < 200.0f*200.0f; - }*/ - - void KilledUnit(Unit* victim) - { - if (victim->GetTypeId() == TYPEID_PLAYER && !me->IsInEvadeMode() && _phase != PHASE_OUTRO && _lastTalkTimeKill+5 < time(nullptr)) - { - _lastTalkTimeKill = time(nullptr); - Talk(SAY_LK_KILL); - } - } - - void DoAction(int32 action) - { - switch (action) - { - case ACTION_RESTORE_LIGHT: - me->GetMap()->SetZoneOverrideLight(AREA_THE_FROZEN_THRONE, 0, 5000); - me->GetMap()->SetZoneWeather(AREA_THE_FROZEN_THRONE, WEATHER_STATE_FINE, 0.5f); - break; - case ACTION_START_ATTACK: - events.ScheduleEvent(EVENT_START_ATTACK, 5250); - break; - case ACTION_BREAK_FROSTMOURNE: - me->CastSpell((Unit*)NULL, SPELL_SUMMON_BROKEN_FROSTMOURNE, true); - me->CastSpell((Unit*)NULL, SPELL_SUMMON_BROKEN_FROSTMOURNE_2, false); - SetEquipmentSlots(false, EQUIP_BROKEN_FROSTMOURNE); - if (Creature* tirion = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_HIGHLORD_TIRION_FORDRING))) - tirion->AI()->DoAction(ACTION_BREAK_FROSTMOURNE); - break; - case ACTION_TELEPORT_BACK: - { - if (_phase == PHASE_FROSTMOURNE) - events.RescheduleEvent(EVENT_START_ATTACK, 1000); - EntryCheckPredicate pred(NPC_STRANGULATE_VEHICLE); - summons.DoAction(ACTION_TELEPORT_BACK, pred); - if (!IsHeroic() && _phase != PHASE_OUTRO && me->IsInCombat() && _lastTalkTimeBuff+5 <= time(nullptr)) - Talk(SAY_LK_FROSTMOURNE_ESCAPE); - } - break; - default: - break; - } - } - - void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType, SpellSchoolMask) - { - if (!attacker || (_bFrostmournePhase && attacker->GetExactDistSq(495.708f, -2523.76f, 1049.95f) > 40.0f*40.0f)) // frostmourne room, prevent exploiting (tele hack to get back and damage him) - { - damage = 0; - return; - } - - if (_phase == PHASE_ONE && !HealthAbovePct(70) && !me->HasUnitState(UNIT_STATE_CASTING)) - { - _phase = PHASE_TRANSITION; - me->SetReactState(REACT_PASSIVE); - me->AttackStop(); - events.CancelEventGroup(EVENT_GROUP_ABILITIES); - me->InterruptNonMeleeSpells(false); - me->GetMotionMaster()->MovePoint(POINT_CENTER_1, CenterPosition); - return; - } - - if (_phase == PHASE_TWO && !HealthAbovePct(40) && !me->HasUnitState(UNIT_STATE_CASTING)) - { - _phase = PHASE_TRANSITION; - me->SetReactState(REACT_PASSIVE); - me->AttackStop(); - events.CancelEventGroup(EVENT_GROUP_ABILITIES); - me->InterruptNonMeleeSpells(false); - me->GetMotionMaster()->MovePoint(POINT_CENTER_2, CenterPosition); - return; - } - - if (_phase == PHASE_THREE && HealthBelowPct(10) && !me->HasUnitState(UNIT_STATE_CASTING)) - { - _phase = PHASE_OUTRO; - EntryCheckPredicate pred(NPC_STRANGULATE_VEHICLE); - summons.DoAction(ACTION_TELEPORT_BACK, pred); - events.Reset(); - summons.DespawnAll(); - me->SetReactState(REACT_PASSIVE); - me->AttackStop(); - me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_FURY_OF_FROSTMOURNE); - me->InterruptNonMeleeSpells(true); - me->CastSpell((Unit*)NULL, SPELL_FURY_OF_FROSTMOURNE, false); - me->SetWalk(true); - + case ACTION_RESTORE_LIGHT: + me->GetMap()->SetZoneOverrideLight(AREA_THE_FROZEN_THRONE, 0, 5000); + me->GetMap()->SetZoneWeather(AREA_THE_FROZEN_THRONE, WEATHER_STATE_FINE, 0.5f); + break; + case ACTION_START_ATTACK: + events.ScheduleEvent(EVENT_START_ATTACK, 5250); + break; + case ACTION_BREAK_FROSTMOURNE: + me->CastSpell((Unit*)NULL, SPELL_SUMMON_BROKEN_FROSTMOURNE, true); + me->CastSpell((Unit*)NULL, SPELL_SUMMON_BROKEN_FROSTMOURNE_2, false); + SetEquipmentSlots(false, EQUIP_BROKEN_FROSTMOURNE); if (Creature* tirion = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_HIGHLORD_TIRION_FORDRING))) - tirion->AI()->DoAction(ACTION_OUTRO); - return; - } - - if (_phase == PHASE_OUTRO) - { - if (!me->HasByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_HOVER)) - damage = me->GetHealth() > 1 ? 1 : 0; - else if (damage >= me->GetHealth()) // dying... + tirion->AI()->DoAction(ACTION_BREAK_FROSTMOURNE); + break; + case ACTION_TELEPORT_BACK: { - damage = me->GetHealth()-1; - me->SetDisableGravity(false); - me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER); - me->SendMonsterMove(me->GetPositionX()+0.25f, me->GetPositionY(), 840.86f, 300, SPLINEFLAG_FALLING); - me->m_positionZ = 840.86f; - me->SetOrientation(0.0f); - if (Creature* frostmourne = me->FindNearestCreature(NPC_FROSTMOURNE_TRIGGER, 50.0f)) - frostmourne->DespawnOrUnsummon(1); - if (Creature* terenas = me->FindNearestCreature(NPC_TERENAS_MENETHIL_OUTRO, 50.0f)) - terenas->DespawnOrUnsummon(1); - - me->m_Events.AddEvent(new LichKingDeathEvent(*me), me->m_Events.CalculateTime(2500)); // die after spinning anim is over, so death anim is visible - me->m_Events.AddEvent(new LichKingMovieEvent(*me), me->m_Events.CalculateTime(11500)); + if (_phase == PHASE_FROSTMOURNE) + events.RescheduleEvent(EVENT_START_ATTACK, 1000); + EntryCheckPredicate pred(NPC_STRANGULATE_VEHICLE); + summons.DoAction(ACTION_TELEPORT_BACK, pred); + if (!IsHeroic() && _phase != PHASE_OUTRO && me->IsInCombat() && _lastTalkTimeBuff + 5 <= time(nullptr)) + Talk(SAY_LK_FROSTMOURNE_ESCAPE); } + break; + default: + break; + } + } - if (!_bFordringMustFallYell && me->GetHealth() < 500000) - { - _bFordringMustFallYell = true; - if (Creature* tirion = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_HIGHLORD_TIRION_FORDRING))) - { - tirion->MonsterYell("The Lich King must fall!", LANG_UNIVERSAL, 0); - tirion->PlayDirectSound(17389); - } - } - - } - else if (damage >= me->GetHealth()) - damage = me->GetHealth()-1; + void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType, SpellSchoolMask) + { + if (!attacker || (_bFrostmournePhase && attacker->GetExactDistSq(495.708f, -2523.76f, 1049.95f) > 40.0f * 40.0f)) // frostmourne room, prevent exploiting (tele hack to get back and damage him) + { + damage = 0; + return; } - void JustSummoned(Creature* summon) + if (_phase == PHASE_ONE && !HealthAbovePct(70) && !me->HasUnitState(UNIT_STATE_CASTING)) { - switch (summon->GetEntry()) + _phase = PHASE_TRANSITION; + me->SetReactState(REACT_PASSIVE); + me->AttackStop(); + events.CancelEventGroup(EVENT_GROUP_ABILITIES); + me->InterruptNonMeleeSpells(false); + me->GetMotionMaster()->MovePoint(POINT_CENTER_1, CenterPosition); + return; + } + + if (_phase == PHASE_TWO && !HealthAbovePct(40) && !me->HasUnitState(UNIT_STATE_CASTING)) + { + _phase = PHASE_TRANSITION; + me->SetReactState(REACT_PASSIVE); + me->AttackStop(); + events.CancelEventGroup(EVENT_GROUP_ABILITIES); + me->InterruptNonMeleeSpells(false); + me->GetMotionMaster()->MovePoint(POINT_CENTER_2, CenterPosition); + return; + } + + if (_phase == PHASE_THREE && HealthBelowPct(10) && !me->HasUnitState(UNIT_STATE_CASTING)) + { + _phase = PHASE_OUTRO; + EntryCheckPredicate pred(NPC_STRANGULATE_VEHICLE); + summons.DoAction(ACTION_TELEPORT_BACK, pred); + events.Reset(); + summons.DespawnAll(); + me->SetReactState(REACT_PASSIVE); + me->AttackStop(); + me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_FURY_OF_FROSTMOURNE); + me->InterruptNonMeleeSpells(true); + me->CastSpell((Unit*)NULL, SPELL_FURY_OF_FROSTMOURNE, false); + me->SetWalk(true); + + if (Creature* tirion = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_HIGHLORD_TIRION_FORDRING))) + tirion->AI()->DoAction(ACTION_OUTRO); + return; + } + + if (_phase == PHASE_OUTRO) + { + if (!me->HasByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_HOVER)) + damage = me->GetHealth() > 1 ? 1 : 0; + else if (damage >= me->GetHealth()) // dying... { - case NPC_SHAMBLING_HORROR: - case NPC_DRUDGE_GHOUL: - summon->SetHomePosition(CenterPosition); - summon->CastSpell(summon, SPELL_RISEN_WITCH_DOCTOR_SPAWN, true); - summon->SetReactState(REACT_PASSIVE); - summon->HandleEmoteCommand(EMOTE_ONESHOT_EMERGE); - summon->m_Events.AddEvent(new StartMovementEvent(me, summon), summon->m_Events.CalculateTime(5000)); - break; - case NPC_RAGING_SPIRIT: - summon->SetHomePosition(CenterPosition); - break; - case NPC_VILE_SPIRIT: + damage = me->GetHealth() - 1; + me->SetDisableGravity(false); + me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER); + me->SendMonsterMove(me->GetPositionX() + 0.25f, me->GetPositionY(), 840.86f, 300, SPLINEFLAG_FALLING); + me->m_positionZ = 840.86f; + me->SetOrientation(0.0f); + if (Creature* frostmourne = me->FindNearestCreature(NPC_FROSTMOURNE_TRIGGER, 50.0f)) + frostmourne->DespawnOrUnsummon(1); + if (Creature* terenas = me->FindNearestCreature(NPC_TERENAS_MENETHIL_OUTRO, 50.0f)) + terenas->DespawnOrUnsummon(1); + + me->m_Events.AddEvent(new LichKingDeathEvent(*me), me->m_Events.CalculateTime(2500)); // die after spinning anim is over, so death anim is visible + me->m_Events.AddEvent(new LichKingMovieEvent(*me), me->m_Events.CalculateTime(11500)); + } + + if (!_bFordringMustFallYell && me->GetHealth() < 500000) + { + _bFordringMustFallYell = true; + if (Creature* tirion = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_HIGHLORD_TIRION_FORDRING))) + { + tirion->MonsterYell("The Lich King must fall!", LANG_UNIVERSAL, 0); + tirion->PlayDirectSound(17389); + } + } + + } + else if (damage >= me->GetHealth()) + damage = me->GetHealth() - 1; + } + + void JustSummoned(Creature* summon) + { + switch (summon->GetEntry()) + { + case NPC_SHAMBLING_HORROR: + case NPC_DRUDGE_GHOUL: + summon->SetHomePosition(CenterPosition); + summon->CastSpell(summon, SPELL_RISEN_WITCH_DOCTOR_SPAWN, true); + summon->SetReactState(REACT_PASSIVE); + summon->HandleEmoteCommand(EMOTE_ONESHOT_EMERGE); + summon->m_Events.AddEvent(new StartMovementEvent(me, summon), summon->m_Events.CalculateTime(5000)); + break; + case NPC_RAGING_SPIRIT: + summon->SetHomePosition(CenterPosition); + break; + case NPC_VILE_SPIRIT: { summon->SetReactState(REACT_PASSIVE); summon->GetMotionMaster()->MoveRandom(10.0f); @@ -862,1567 +862,1569 @@ class boss_the_lich_king : public CreatureScript summon->m_Events.AddEvent(new VileSpiritActivateEvent(summon), summon->m_Events.CalculateTime(15000)); break; } - case NPC_STRANGULATE_VEHICLE: - summons.Summon(summon); - return; - case NPC_DEFILE: - case NPC_SHADOW_TRAP_TRIGGER: - summon->m_positionZ = 840.86f; - summon->UpdatePosition(summon->GetPositionX(), summon->GetPositionY(), summon->GetPositionZ(), summon->GetOrientation(), true); - summon->StopMovingOnCurrentPos(); - break; - case NPC_VALKYR_SHADOWGUARD: - if (_phase == PHASE_THREE || events.GetNextEventTime(EVENT_QUAKE_2)) - summon->DespawnOrUnsummon(1); - break; - default: - break; - } - - BossAI::JustSummoned(summon); + case NPC_STRANGULATE_VEHICLE: + summons.Summon(summon); + return; + case NPC_DEFILE: + case NPC_SHADOW_TRAP_TRIGGER: + summon->m_positionZ = 840.86f; + summon->UpdatePosition(summon->GetPositionX(), summon->GetPositionY(), summon->GetPositionZ(), summon->GetOrientation(), true); + summon->StopMovingOnCurrentPos(); + break; + case NPC_VALKYR_SHADOWGUARD: + if (_phase == PHASE_THREE || events.GetNextEventTime(EVENT_QUAKE_2)) + summon->DespawnOrUnsummon(1); + break; + default: + break; } - void SummonedCreatureDies(Creature* summon, Unit*) - { - switch (summon->GetEntry()) - { - case NPC_SHAMBLING_HORROR: - case NPC_DRUDGE_GHOUL: - case NPC_ICE_SPHERE: - case NPC_VALKYR_SHADOWGUARD: - case NPC_RAGING_SPIRIT: - case NPC_VILE_SPIRIT: - summon->ToTempSummon()->SetTimer(5000); - summon->ToTempSummon()->SetTempSummonType(TEMPSUMMON_TIMED_DESPAWN); - break; - default: - break; - } - } + BossAI::JustSummoned(summon); + } - void SpellHit(Unit* /*caster*/, SpellInfo const* spell) + void SummonedCreatureDies(Creature* summon, Unit*) + { + switch (summon->GetEntry()) { - if (spell->Id == HARVESTED_SOUL_BUFF && me->IsInCombat() && !IsHeroic() && _phase != PHASE_OUTRO && _lastTalkTimeBuff+5 <= time(nullptr)) - { - _lastTalkTimeBuff = time(nullptr); - Talk(SAY_LK_FROSTMOURNE_KILL); - } + case NPC_SHAMBLING_HORROR: + case NPC_DRUDGE_GHOUL: + case NPC_ICE_SPHERE: + case NPC_VALKYR_SHADOWGUARD: + case NPC_RAGING_SPIRIT: + case NPC_VILE_SPIRIT: + summon->ToTempSummon()->SetTimer(5000); + summon->ToTempSummon()->SetTempSummonType(TEMPSUMMON_TIMED_DESPAWN); + break; + default: + break; } + } - void SpellHitTarget(Unit* /*target*/, SpellInfo const* spell) + void SpellHit(Unit* /*caster*/, SpellInfo const* spell) + { + if (spell->Id == HARVESTED_SOUL_BUFF && me->IsInCombat() && !IsHeroic() && _phase != PHASE_OUTRO && _lastTalkTimeBuff + 5 <= time(nullptr)) { - if (spell->Id == REMORSELESS_WINTER_1 || spell->Id == REMORSELESS_WINTER_2) - { - me->GetMap()->SetZoneOverrideLight(AREA_THE_FROZEN_THRONE, LIGHT_SNOWSTORM, 5000); - me->GetMap()->SetZoneWeather(AREA_THE_FROZEN_THRONE, WEATHER_STATE_LIGHT_SNOW, 0.5f); - summons.DespawnEntry(NPC_SHADOW_TRAP_TRIGGER); - } + _lastTalkTimeBuff = time(nullptr); + Talk(SAY_LK_FROSTMOURNE_KILL); } + } - void MovementInform(uint32 type, uint32 pointId) + void SpellHitTarget(Unit* /*target*/, SpellInfo const* spell) + { + if (spell->Id == REMORSELESS_WINTER_1 || spell->Id == REMORSELESS_WINTER_2) { - if (type != POINT_MOTION_TYPE) + me->GetMap()->SetZoneOverrideLight(AREA_THE_FROZEN_THRONE, LIGHT_SNOWSTORM, 5000); + me->GetMap()->SetZoneWeather(AREA_THE_FROZEN_THRONE, WEATHER_STATE_LIGHT_SNOW, 0.5f); + summons.DespawnEntry(NPC_SHADOW_TRAP_TRIGGER); + } + } + + void MovementInform(uint32 type, uint32 pointId) + { + if (type != POINT_MOTION_TYPE) + return; + + switch (pointId) + { + case POINT_CENTER_1: + me->SetFacingTo(0.0f); + Talk(SAY_LK_REMORSELESS_WINTER); + me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_SPECIAL); + me->CastSpell(me, SPELL_REMORSELESS_WINTER_1, false); + //events.DelayEvents(62500, EVENT_GROUP_BERSERK); // delay berserk timer, its not ticking during phase transitions, bullshit, 15mins on movies + events.ScheduleEvent(EVENT_QUAKE, 62500); + events.ScheduleEvent(EVENT_PAIN_AND_SUFFERING, 3500, EVENT_GROUP_ABILITIES); + events.ScheduleEvent(EVENT_SUMMON_ICE_SPHERE, 8000, EVENT_GROUP_ABILITIES); + events.ScheduleEvent(EVENT_SUMMON_RAGING_SPIRIT, 4000, EVENT_GROUP_ABILITIES); + break; + case POINT_CENTER_2: + me->SetFacingTo(0.0f); + Talk(SAY_LK_REMORSELESS_WINTER); + me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_SPECIAL); + me->CastSpell(me, SPELL_REMORSELESS_WINTER_2, false); + summons.DespawnEntry(NPC_VALKYR_SHADOWGUARD); + //events.DelayEvents(62500, EVENT_GROUP_BERSERK); // delay berserk timer, its not ticking during phase transitions, bullshit, 15 mins on movies + events.ScheduleEvent(EVENT_QUAKE_2, 62500); + events.ScheduleEvent(EVENT_PAIN_AND_SUFFERING, 3500, EVENT_GROUP_ABILITIES); + events.ScheduleEvent(EVENT_SUMMON_ICE_SPHERE, 8000, EVENT_GROUP_ABILITIES); + events.ScheduleEvent(EVENT_SUMMON_RAGING_SPIRIT, 4000, EVENT_GROUP_ABILITIES); + break; + default: + break; + } + } + + void UpdateAI(uint32 diff) + { + if (_phase == PHASE_NONE) + return; + + // check phase first to prevent updating victim and entering evade mode when not wanted + if (!((1 << _phase) & PHASE_MASK_NO_VICTIM)) + if (!UpdateVictim()) return; - switch (pointId) - { - case POINT_CENTER_1: - me->SetFacingTo(0.0f); - Talk(SAY_LK_REMORSELESS_WINTER); - me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_SPECIAL); - me->CastSpell(me, SPELL_REMORSELESS_WINTER_1, false); - //events.DelayEvents(62500, EVENT_GROUP_BERSERK); // delay berserk timer, its not ticking during phase transitions, bullshit, 15mins on movies - events.ScheduleEvent(EVENT_QUAKE, 62500); - events.ScheduleEvent(EVENT_PAIN_AND_SUFFERING, 3500, EVENT_GROUP_ABILITIES); - events.ScheduleEvent(EVENT_SUMMON_ICE_SPHERE, 8000, EVENT_GROUP_ABILITIES); - events.ScheduleEvent(EVENT_SUMMON_RAGING_SPIRIT, 4000, EVENT_GROUP_ABILITIES); - break; - case POINT_CENTER_2: - me->SetFacingTo(0.0f); - Talk(SAY_LK_REMORSELESS_WINTER); - me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_SPECIAL); - me->CastSpell(me, SPELL_REMORSELESS_WINTER_2, false); - summons.DespawnEntry(NPC_VALKYR_SHADOWGUARD); - //events.DelayEvents(62500, EVENT_GROUP_BERSERK); // delay berserk timer, its not ticking during phase transitions, bullshit, 15 mins on movies - events.ScheduleEvent(EVENT_QUAKE_2, 62500); - events.ScheduleEvent(EVENT_PAIN_AND_SUFFERING, 3500, EVENT_GROUP_ABILITIES); - events.ScheduleEvent(EVENT_SUMMON_ICE_SPHERE, 8000, EVENT_GROUP_ABILITIES); - events.ScheduleEvent(EVENT_SUMMON_RAGING_SPIRIT, 4000, EVENT_GROUP_ABILITIES); - break; - default: - break; - } - } - - void UpdateAI(uint32 diff) + // handle falling players so they don't fall infinitely + if (_positionCheckTimer <= diff) { - if (_phase == PHASE_NONE) - return; + _positionCheckTimer = 5000; + Map::PlayerList const& players = me->GetMap()->GetPlayers(); + if (!players.isEmpty()) + for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + if (Player* player = itr->GetSource()) + if (player->GetPositionZ() < 700.0f) + Unit::Kill(me, player); + } + else + _positionCheckTimer -= diff; - // check phase first to prevent updating victim and entering evade mode when not wanted - if (!((1 << _phase) & PHASE_MASK_NO_VICTIM)) - if (!UpdateVictim()) - return; + events.Update(diff); - // handle falling players so they don't fall infinitely - if (_positionCheckTimer <= diff) - { - _positionCheckTimer = 5000; - Map::PlayerList const& players = me->GetMap()->GetPlayers(); - if (!players.isEmpty()) - for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) - if (Player* player = itr->GetSource()) - if (player->GetPositionZ() < 700.0f) - Unit::Kill(me, player); - } - else - _positionCheckTimer -= diff; + // during Remorseless Winter phases The Lich King is channeling a spell, but we must continue casting other spells + if (me->HasUnitState(UNIT_STATE_CASTING) && !((1 << _phase) & PHASE_MASK_NO_CAST_CHECK)) + return; - events.Update(diff); - - // during Remorseless Winter phases The Lich King is channeling a spell, but we must continue casting other spells - if (me->HasUnitState(UNIT_STATE_CASTING) && !((1 << _phase) & PHASE_MASK_NO_CAST_CHECK)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_BERSERK: - Talk(SAY_LK_BERSERK); - me->CastSpell(me, SPELL_BERSERK2, true); - break; - case EVENT_START_ATTACK: - me->SetReactState(REACT_AGGRESSIVE); - if (_phase == PHASE_FROSTMOURNE) - { - _bFrostmournePhase = false; - _phase = PHASE_THREE; - events.RescheduleEvent(EVENT_DEFILE, 0, EVENT_GROUP_ABILITIES); - events.RescheduleEvent(EVENT_SOUL_REAPER, urand(7000, 12000), EVENT_GROUP_ABILITIES); - - for (SummonList::iterator i = summons.begin(); i != summons.end(); ++i) - if (Creature* summon = ObjectAccessor::GetCreature(*me, *i)) - if (summon->GetEntry() == NPC_RAGING_SPIRIT) - summon->SetReactState(REACT_AGGRESSIVE); - } - break; - case EVENT_QUAKE: - _phase = PHASE_TWO; - events.CancelEventGroup(EVENT_GROUP_ABILITIES); - events.ScheduleEvent(EVENT_INFEST, 14000, EVENT_GROUP_ABILITIES); - events.ScheduleEvent(EVENT_SUMMON_VALKYR, 20000, EVENT_GROUP_ABILITIES); - events.ScheduleEvent(EVENT_SOUL_REAPER, 40000, EVENT_GROUP_ABILITIES); - events.ScheduleEvent(EVENT_DEFILE, 38000, EVENT_GROUP_ABILITIES); - - me->InterruptNonMeleeSpells(false); - me->ClearUnitState(UNIT_STATE_CASTING); - me->SetFacingTo(0.0f); - me->CastSpell((Unit*)NULL, SPELL_QUAKE, false); - me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_SPECIAL); - Talk(SAY_LK_QUAKE); - break; - case EVENT_QUAKE_2: + switch (events.ExecuteEvent()) + { + case EVENT_BERSERK: + Talk(SAY_LK_BERSERK); + me->CastSpell(me, SPELL_BERSERK2, true); + break; + case EVENT_START_ATTACK: + me->SetReactState(REACT_AGGRESSIVE); + if (_phase == PHASE_FROSTMOURNE) + { + _bFrostmournePhase = false; _phase = PHASE_THREE; - events.CancelEventGroup(EVENT_GROUP_ABILITIES); - events.ScheduleEvent(EVENT_SOUL_REAPER, 40000, EVENT_GROUP_ABILITIES); - events.ScheduleEvent(EVENT_DEFILE, 38000, EVENT_GROUP_ABILITIES); - events.ScheduleEvent(EVENT_VILE_SPIRITS, 20000, EVENT_GROUP_VILE_SPIRITS); - events.ScheduleEvent(IsHeroic() ? EVENT_HARVEST_SOULS : EVENT_HARVEST_SOUL, 14000, EVENT_GROUP_ABILITIES); - - me->InterruptNonMeleeSpells(false); - me->ClearUnitState(UNIT_STATE_CASTING); - me->SetFacingTo(0.0f); - me->CastSpell((Unit*)NULL, SPELL_QUAKE, false); - me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_SPECIAL); - Talk(SAY_LK_QUAKE); - break; - - // ABILITIES: - case EVENT_SUMMON_SHAMBLING_HORROR: - me->CastSpell(me, SPELL_SUMMON_SHAMBLING_HORROR, false); - me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_SPECIAL); - events.ScheduleEvent(EVENT_SUMMON_SHAMBLING_HORROR, 60000, EVENT_GROUP_ABILITIES); - break; - case EVENT_SUMMON_DRUDGE_GHOUL: - me->CastSpell(me, SPELL_SUMMON_DRUDGE_GHOULS, false); - events.ScheduleEvent(EVENT_SUMMON_DRUDGE_GHOUL, 30000, EVENT_GROUP_ABILITIES); - break; - case EVENT_INFEST: - me->CastSpell(me, SPELL_INFEST, false); - events.ScheduleEvent(EVENT_INFEST, 22500, EVENT_GROUP_ABILITIES); - break; - case EVENT_NECROTIC_PLAGUE: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NecroticPlagueTargetCheck(me, NECROTIC_PLAGUE_LK, NECROTIC_PLAGUE_PLR))) - { - Talk(EMOTE_NECROTIC_PLAGUE_WARNING, target); - me->CastSpell(target, SPELL_NECROTIC_PLAGUE, false); - events.ScheduleEvent(EVENT_NECROTIC_PLAGUE, urand(30000, 31000), EVENT_GROUP_ABILITIES); - } - else - events.ScheduleEvent(EVENT_NECROTIC_PLAGUE, 5000, EVENT_GROUP_ABILITIES); - break; - case EVENT_SHADOW_TRAP: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, ShadowTrapLKTargetSelector(me, true, true, 100.0f))) - me->CastSpell(target, SPELL_SHADOW_TRAP, false); - events.ScheduleEvent(EVENT_SHADOW_TRAP, 15500, EVENT_GROUP_ABILITIES); - break; - case EVENT_PAIN_AND_SUFFERING: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) - { - //events.DelayEventsToMax(500, EVENT_GROUP_ABILITIES); - me->SetFacingTo(me->GetAngle(target)); - me->CastSpell(target, SPELL_PAIN_AND_SUFFERING, false); - } - events.ScheduleEvent(EVENT_PAIN_AND_SUFFERING, (IsHeroic() ? urand(1250, 1750) : urand(1750, 2250)), EVENT_GROUP_ABILITIES); - break; - case EVENT_SUMMON_ICE_SPHERE: - me->CastSpell((Unit*)NULL, SPELL_SUMMON_ICE_SPHERE, false); - events.ScheduleEvent(EVENT_SUMMON_ICE_SPHERE, 7500, EVENT_GROUP_ABILITIES); - break; - case EVENT_SUMMON_RAGING_SPIRIT: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) - me->CastSpell(target, SPELL_RAGING_SPIRIT, false); - events.ScheduleEvent(EVENT_SUMMON_RAGING_SPIRIT, (!HealthAbovePct(40) ? 15000 : 20000), EVENT_GROUP_ABILITIES); - break; - case EVENT_DEFILE: - { - uint32 evTime = events.GetNextEventTime(EVENT_SUMMON_VALKYR); - // if defile (cast time 2sec) is less than 3 before valkyr appears - // we've to decide - if (evTime && (events.GetTimer() > evTime || evTime - events.GetTimer() < 5000)) - { - // if valkyr is less than 1.5 secs after defile (cast time 2 sec) then we've a sync issue, so - // we need to cancel it (break) and schedule a defile to be casted 5 or 4 seconds after valkyr - if (events.GetTimer() > evTime || evTime - events.GetTimer() < 3500) - { - uint32 t = events.GetTimer() > evTime ? 0 : evTime - events.GetTimer(); - events.ScheduleEvent(EVENT_DEFILE, t+(Is25ManRaid() ? 5000 : 4000), EVENT_GROUP_ABILITIES); - break; - } - - // if valkyr is coming between 1.5 and 3 seconds after defile then we've to - // delay valkyr just a bit - events.RescheduleEvent(EVENT_SUMMON_VALKYR, 5000, EVENT_GROUP_ABILITIES); - } - - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, DefileTargetSelector(me))) - { - Talk(EMOTE_DEFILE_WARNING); - me->CastSpell(target, SPELL_DEFILE, false); - // defile has a fixed CD (from dbm) that can be variable only - // if no target has been found at the moment (schedule after 1 second) - events.ScheduleEvent(EVENT_DEFILE, 32500, EVENT_GROUP_ABILITIES); - } - else { - // be sure it happen trying each seconds if no target - events.ScheduleEvent(EVENT_DEFILE, 1000, EVENT_GROUP_ABILITIES); - } - } - break; - case EVENT_SOUL_REAPER: - if (me->IsWithinMeleeRange(me->GetVictim())) - { - me->CastSpell(me->GetVictim(), SPELL_SOUL_REAPER, false); - events.ScheduleEvent(EVENT_SOUL_REAPER, 30500, EVENT_GROUP_ABILITIES); - } - else - events.ScheduleEvent(EVENT_SOUL_REAPER, 1000, EVENT_GROUP_ABILITIES); - break; - case EVENT_SUMMON_VALKYR: - { - me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_SPECIAL); - Talk(SAY_LK_SUMMON_VALKYR); - me->CastSpell((Unit*)NULL, SUMMON_VALKYR, false); - events.ScheduleEvent(EVENT_SUMMON_VALKYR, 45000, EVENT_GROUP_ABILITIES); - - // schedule a defile (or reschedule it) if next defile event - // doesn't exist ( now > next defile ) or defile is coming too soon - uint32 minTime = (Is25ManRaid() ? 5000 : 4000); - if (uint32 evTime = events.GetNextEventTime(EVENT_DEFILE)) - if (events.GetTimer() > evTime || evTime - events.GetTimer() < minTime) { - events.RescheduleEvent(EVENT_DEFILE, minTime, EVENT_GROUP_ABILITIES); - } - } - break; - case EVENT_VILE_SPIRITS: - me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_SPECIAL); - me->CastSpell((Unit*)NULL, SPELL_VILE_SPIRITS, false); - events.ScheduleEvent(EVENT_VILE_SPIRITS, 30000, EVENT_GROUP_VILE_SPIRITS); - break; - case EVENT_HARVEST_SOUL: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankLKTargetSelector(me, true, true, 55.0f))) - { - Talk(SAY_LK_HARVEST_SOUL); - me->CastSpell(target, SPELL_HARVEST_SOUL, false); - events.ScheduleEvent(EVENT_HARVEST_SOUL, 75000, EVENT_GROUP_ABILITIES); - } - else - events.ScheduleEvent(EVENT_HARVEST_SOUL, 10000, EVENT_GROUP_ABILITIES); - break; - case EVENT_HARVEST_SOULS: - Talk(SAY_LK_HARVEST_SOUL); - me->CastSpell((Unit*)NULL, SPELL_HARVEST_SOULS, false); - _phase = PHASE_FROSTMOURNE; - me->SetReactState(REACT_PASSIVE); - me->AttackStop(); - events.ScheduleEvent(EVENT_START_ATTACK, 55000); - events.DelayEvents(52500, EVENT_GROUP_VILE_SPIRITS); - events.CancelEvent(EVENT_DEFILE); - events.CancelEvent(EVENT_SOUL_REAPER); - events.ScheduleEvent(EVENT_FROSTMOURNE_HEROIC, 6000, EVENT_GROUP_ABILITIES); - events.ScheduleEvent(EVENT_HARVEST_SOULS, urand(100000, 110000), EVENT_GROUP_ABILITIES); + events.RescheduleEvent(EVENT_DEFILE, 0, EVENT_GROUP_ABILITIES); + events.RescheduleEvent(EVENT_SOUL_REAPER, urand(7000, 12000), EVENT_GROUP_ABILITIES); for (SummonList::iterator i = summons.begin(); i != summons.end(); ++i) if (Creature* summon = ObjectAccessor::GetCreature(*me, *i)) - { - if (summon->GetEntry() == NPC_VILE_SPIRIT) - { - summon->m_Events.KillAllEvents(true); - summon->m_Events.AddEvent(new VileSpiritActivateEvent(summon), summon->m_Events.CalculateTime(55000)); - summon->GetMotionMaster()->Clear(true); - summon->StopMoving(); - summon->SetReactState(REACT_PASSIVE); - summon->AttackStop(); - } - else if (summon->GetEntry() == NPC_RAGING_SPIRIT) - { - summon->GetMotionMaster()->Clear(true); - summon->StopMoving(); - summon->SetReactState(REACT_PASSIVE); - summon->AttackStop(); - } - } - break; - case EVENT_FROSTMOURNE_HEROIC: - _bFrostmournePhase = true; - if (TempSummon* terenas = me->GetMap()->SummonCreature(NPC_TERENAS_MENETHIL_FROSTMOURNE_H, TerenasSpawnHeroic, NULL, 55000)) + if (summon->GetEntry() == NPC_RAGING_SPIRIT) + summon->SetReactState(REACT_AGGRESSIVE); + } + break; + case EVENT_QUAKE: + _phase = PHASE_TWO; + events.CancelEventGroup(EVENT_GROUP_ABILITIES); + events.ScheduleEvent(EVENT_INFEST, 14000, EVENT_GROUP_ABILITIES); + events.ScheduleEvent(EVENT_SUMMON_VALKYR, 20000, EVENT_GROUP_ABILITIES); + events.ScheduleEvent(EVENT_SOUL_REAPER, 40000, EVENT_GROUP_ABILITIES); + events.ScheduleEvent(EVENT_DEFILE, 38000, EVENT_GROUP_ABILITIES); + + me->InterruptNonMeleeSpells(false); + me->ClearUnitState(UNIT_STATE_CASTING); + me->SetFacingTo(0.0f); + me->CastSpell((Unit*)NULL, SPELL_QUAKE, false); + me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_SPECIAL); + Talk(SAY_LK_QUAKE); + break; + case EVENT_QUAKE_2: + _phase = PHASE_THREE; + events.CancelEventGroup(EVENT_GROUP_ABILITIES); + events.ScheduleEvent(EVENT_SOUL_REAPER, 40000, EVENT_GROUP_ABILITIES); + events.ScheduleEvent(EVENT_DEFILE, 38000, EVENT_GROUP_ABILITIES); + events.ScheduleEvent(EVENT_VILE_SPIRITS, 20000, EVENT_GROUP_VILE_SPIRITS); + events.ScheduleEvent(IsHeroic() ? EVENT_HARVEST_SOULS : EVENT_HARVEST_SOUL, 14000, EVENT_GROUP_ABILITIES); + + me->InterruptNonMeleeSpells(false); + me->ClearUnitState(UNIT_STATE_CASTING); + me->SetFacingTo(0.0f); + me->CastSpell((Unit*)NULL, SPELL_QUAKE, false); + me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_SPECIAL); + Talk(SAY_LK_QUAKE); + break; + + // ABILITIES: + case EVENT_SUMMON_SHAMBLING_HORROR: + me->CastSpell(me, SPELL_SUMMON_SHAMBLING_HORROR, false); + me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_SPECIAL); + events.ScheduleEvent(EVENT_SUMMON_SHAMBLING_HORROR, 60000, EVENT_GROUP_ABILITIES); + break; + case EVENT_SUMMON_DRUDGE_GHOUL: + me->CastSpell(me, SPELL_SUMMON_DRUDGE_GHOULS, false); + events.ScheduleEvent(EVENT_SUMMON_DRUDGE_GHOUL, 30000, EVENT_GROUP_ABILITIES); + break; + case EVENT_INFEST: + me->CastSpell(me, SPELL_INFEST, false); + events.ScheduleEvent(EVENT_INFEST, 22500, EVENT_GROUP_ABILITIES); + break; + case EVENT_NECROTIC_PLAGUE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NecroticPlagueTargetCheck(me, NECROTIC_PLAGUE_LK, NECROTIC_PLAGUE_PLR))) + { + Talk(EMOTE_NECROTIC_PLAGUE_WARNING, target); + me->CastSpell(target, SPELL_NECROTIC_PLAGUE, false); + events.ScheduleEvent(EVENT_NECROTIC_PLAGUE, urand(30000, 31000), EVENT_GROUP_ABILITIES); + } + else + events.ScheduleEvent(EVENT_NECROTIC_PLAGUE, 5000, EVENT_GROUP_ABILITIES); + break; + case EVENT_SHADOW_TRAP: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, ShadowTrapLKTargetSelector(me, true, true, 100.0f))) + me->CastSpell(target, SPELL_SHADOW_TRAP, false); + events.ScheduleEvent(EVENT_SHADOW_TRAP, 15500, EVENT_GROUP_ABILITIES); + break; + case EVENT_PAIN_AND_SUFFERING: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) + { + //events.DelayEventsToMax(500, EVENT_GROUP_ABILITIES); + me->SetFacingTo(me->GetAngle(target)); + me->CastSpell(target, SPELL_PAIN_AND_SUFFERING, false); + } + events.ScheduleEvent(EVENT_PAIN_AND_SUFFERING, (IsHeroic() ? urand(1250, 1750) : urand(1750, 2250)), EVENT_GROUP_ABILITIES); + break; + case EVENT_SUMMON_ICE_SPHERE: + me->CastSpell((Unit*)NULL, SPELL_SUMMON_ICE_SPHERE, false); + events.ScheduleEvent(EVENT_SUMMON_ICE_SPHERE, 7500, EVENT_GROUP_ABILITIES); + break; + case EVENT_SUMMON_RAGING_SPIRIT: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) + me->CastSpell(target, SPELL_RAGING_SPIRIT, false); + events.ScheduleEvent(EVENT_SUMMON_RAGING_SPIRIT, (!HealthAbovePct(40) ? 15000 : 20000), EVENT_GROUP_ABILITIES); + break; + case EVENT_DEFILE: + { + uint32 evTime = events.GetNextEventTime(EVENT_SUMMON_VALKYR); + // if defile (cast time 2sec) is less than 3 before valkyr appears + // we've to decide + if (evTime && (events.GetTimer() > evTime || evTime - events.GetTimer() < 5000)) { - terenas->AI()->DoAction(ACTION_FROSTMOURNE_INTRO); - if (Creature* spawner = terenas->FindNearestCreature(NPC_WORLD_TRIGGER_INFINITE_AOI, 100.0f, true)) + // if valkyr is less than 1.5 secs after defile (cast time 2 sec) then we've a sync issue, so + // we need to cancel it (break) and schedule a defile to be casted 5 or 4 seconds after valkyr + if (events.GetTimer() > evTime || evTime - events.GetTimer() < 3500) { - spawner->CastSpell(spawner, SPELL_SUMMON_SPIRIT_BOMB_1, true); // summons bombs randomly - spawner->CastSpell(spawner, SPELL_SUMMON_SPIRIT_BOMB_2, true); // summons bombs on players - spawner->m_Events.AddEvent(new TriggerWickedSpirit(spawner), spawner->m_Events.CalculateTime(3000)); - terenas->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); // to avoid being healed by player trinket procs. terenas' health doesn't matter on heroic + uint32 t = events.GetTimer() > evTime ? 0 : evTime - events.GetTimer(); + events.ScheduleEvent(EVENT_DEFILE, t + (Is25ManRaid() ? 5000 : 4000), EVENT_GROUP_ABILITIES); + break; + } + + // if valkyr is coming between 1.5 and 3 seconds after defile then we've to + // delay valkyr just a bit + events.RescheduleEvent(EVENT_SUMMON_VALKYR, 5000, EVENT_GROUP_ABILITIES); + } + + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, DefileTargetSelector(me))) + { + Talk(EMOTE_DEFILE_WARNING); + me->CastSpell(target, SPELL_DEFILE, false); + // defile has a fixed CD (from dbm) that can be variable only + // if no target has been found at the moment (schedule after 1 second) + events.ScheduleEvent(EVENT_DEFILE, 32500, EVENT_GROUP_ABILITIES); + } + else + { + // be sure it happen trying each seconds if no target + events.ScheduleEvent(EVENT_DEFILE, 1000, EVENT_GROUP_ABILITIES); + } + } + break; + case EVENT_SOUL_REAPER: + if (me->IsWithinMeleeRange(me->GetVictim())) + { + me->CastSpell(me->GetVictim(), SPELL_SOUL_REAPER, false); + events.ScheduleEvent(EVENT_SOUL_REAPER, 30500, EVENT_GROUP_ABILITIES); + } + else + events.ScheduleEvent(EVENT_SOUL_REAPER, 1000, EVENT_GROUP_ABILITIES); + break; + case EVENT_SUMMON_VALKYR: + { + me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_SPECIAL); + Talk(SAY_LK_SUMMON_VALKYR); + me->CastSpell((Unit*)NULL, SUMMON_VALKYR, false); + events.ScheduleEvent(EVENT_SUMMON_VALKYR, 45000, EVENT_GROUP_ABILITIES); + + // schedule a defile (or reschedule it) if next defile event + // doesn't exist ( now > next defile ) or defile is coming too soon + uint32 minTime = (Is25ManRaid() ? 5000 : 4000); + if (uint32 evTime = events.GetNextEventTime(EVENT_DEFILE)) + if (events.GetTimer() > evTime || evTime - events.GetTimer() < minTime) + { + events.RescheduleEvent(EVENT_DEFILE, minTime, EVENT_GROUP_ABILITIES); + } + } + break; + case EVENT_VILE_SPIRITS: + me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_SPECIAL); + me->CastSpell((Unit*)NULL, SPELL_VILE_SPIRITS, false); + events.ScheduleEvent(EVENT_VILE_SPIRITS, 30000, EVENT_GROUP_VILE_SPIRITS); + break; + case EVENT_HARVEST_SOUL: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankLKTargetSelector(me, true, true, 55.0f))) + { + Talk(SAY_LK_HARVEST_SOUL); + me->CastSpell(target, SPELL_HARVEST_SOUL, false); + events.ScheduleEvent(EVENT_HARVEST_SOUL, 75000, EVENT_GROUP_ABILITIES); + } + else + events.ScheduleEvent(EVENT_HARVEST_SOUL, 10000, EVENT_GROUP_ABILITIES); + break; + case EVENT_HARVEST_SOULS: + Talk(SAY_LK_HARVEST_SOUL); + me->CastSpell((Unit*)NULL, SPELL_HARVEST_SOULS, false); + _phase = PHASE_FROSTMOURNE; + me->SetReactState(REACT_PASSIVE); + me->AttackStop(); + events.ScheduleEvent(EVENT_START_ATTACK, 55000); + events.DelayEvents(52500, EVENT_GROUP_VILE_SPIRITS); + events.CancelEvent(EVENT_DEFILE); + events.CancelEvent(EVENT_SOUL_REAPER); + events.ScheduleEvent(EVENT_FROSTMOURNE_HEROIC, 6000, EVENT_GROUP_ABILITIES); + events.ScheduleEvent(EVENT_HARVEST_SOULS, urand(100000, 110000), EVENT_GROUP_ABILITIES); + + for (SummonList::iterator i = summons.begin(); i != summons.end(); ++i) + if (Creature* summon = ObjectAccessor::GetCreature(*me, *i)) + { + if (summon->GetEntry() == NPC_VILE_SPIRIT) + { + summon->m_Events.KillAllEvents(true); + summon->m_Events.AddEvent(new VileSpiritActivateEvent(summon), summon->m_Events.CalculateTime(55000)); + summon->GetMotionMaster()->Clear(true); + summon->StopMoving(); + summon->SetReactState(REACT_PASSIVE); + summon->AttackStop(); + } + else if (summon->GetEntry() == NPC_RAGING_SPIRIT) + { + summon->GetMotionMaster()->Clear(true); + summon->StopMoving(); + summon->SetReactState(REACT_PASSIVE); + summon->AttackStop(); } } - break; + break; + case EVENT_FROSTMOURNE_HEROIC: + _bFrostmournePhase = true; + if (TempSummon* terenas = me->GetMap()->SummonCreature(NPC_TERENAS_MENETHIL_FROSTMOURNE_H, TerenasSpawnHeroic, NULL, 55000)) + { + terenas->AI()->DoAction(ACTION_FROSTMOURNE_INTRO); + if (Creature* spawner = terenas->FindNearestCreature(NPC_WORLD_TRIGGER_INFINITE_AOI, 100.0f, true)) + { + spawner->CastSpell(spawner, SPELL_SUMMON_SPIRIT_BOMB_1, true); // summons bombs randomly + spawner->CastSpell(spawner, SPELL_SUMMON_SPIRIT_BOMB_2, true); // summons bombs on players + spawner->m_Events.AddEvent(new TriggerWickedSpirit(spawner), spawner->m_Events.CalculateTime(3000)); + terenas->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); // to avoid being healed by player trinket procs. terenas' health doesn't matter on heroic + } + } + break; - default: - break; - } - - if (!me->HasReactState(REACT_PASSIVE) && me->GetVictim() && me->IsWithinMeleeRange(me->GetVictim()) && me->GetMotionMaster()->GetCurrentMovementGeneratorType() != POINT_MOTION_TYPE && !me->IsWithinLOSInMap(me->GetVictim())) - me->GetMotionMaster()->MoveCharge(me->GetVictim()->GetPositionX(), me->GetVictim()->GetPositionY(), me->GetVictim()->GetPositionZ(), me->GetSpeed(MOVE_RUN), POINT_NONE); - - DoMeleeAttackIfReady(); + default: + break; } - uint32 GetData(uint32 type) const - { - switch (type) - { - case DATA_PLAGUE_STACK: - return _necroticPlagueStack; - case DATA_VILE: - return _vileSpiritExplosions; - default: - break; - } + if (!me->HasReactState(REACT_PASSIVE) && me->GetVictim() && me->IsWithinMeleeRange(me->GetVictim()) && me->GetMotionMaster()->GetCurrentMovementGeneratorType() != POINT_MOTION_TYPE && !me->IsWithinLOSInMap(me->GetVictim())) + me->GetMotionMaster()->MoveCharge(me->GetVictim()->GetPositionX(), me->GetVictim()->GetPositionY(), me->GetVictim()->GetPositionZ(), me->GetSpeed(MOVE_RUN), POINT_NONE); - return 0; - } - - void SetData(uint32 type, uint32 value) - { - switch (type) - { - case DATA_PLAGUE_STACK: - _necroticPlagueStack = std::max(value, _necroticPlagueStack); - break; - case DATA_VILE: - _vileSpiritExplosions += value; - break; - default: - break; - } - } - - void EnterEvadeMode() - { - EntryCheckPredicate pred(NPC_STRANGULATE_VEHICLE); - summons.DoAction(ACTION_TELEPORT_BACK, pred); - instance->SetBossState(DATA_THE_LICH_KING, FAIL); - me->CastSpell((Unit*)NULL, SPELL_KILL_FROSTMOURNE_PLAYERS, true); - BossAI::EnterEvadeMode(); - me->SetReactState(REACT_AGGRESSIVE); - - if (Creature* tirion = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_HIGHLORD_TIRION_FORDRING))) - tirion->AI()->EnterEvadeMode(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + DoMeleeAttackIfReady(); } + + uint32 GetData(uint32 type) const + { + switch (type) + { + case DATA_PLAGUE_STACK: + return _necroticPlagueStack; + case DATA_VILE: + return _vileSpiritExplosions; + default: + break; + } + + return 0; + } + + void SetData(uint32 type, uint32 value) + { + switch (type) + { + case DATA_PLAGUE_STACK: + _necroticPlagueStack = std::max(value, _necroticPlagueStack); + break; + case DATA_VILE: + _vileSpiritExplosions += value; + break; + default: + break; + } + } + + void EnterEvadeMode() + { + EntryCheckPredicate pred(NPC_STRANGULATE_VEHICLE); + summons.DoAction(ACTION_TELEPORT_BACK, pred); + instance->SetBossState(DATA_THE_LICH_KING, FAIL); + me->CastSpell((Unit*)NULL, SPELL_KILL_FROSTMOURNE_PLAYERS, true); + BossAI::EnterEvadeMode(); + me->SetReactState(REACT_AGGRESSIVE); + + if (Creature* tirion = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_HIGHLORD_TIRION_FORDRING))) + tirion->AI()->EnterEvadeMode(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class npc_tirion_fordring_tft : public CreatureScript { - public: - npc_tirion_fordring_tft() : CreatureScript("npc_tirion_fordring_tft") { } +public: + npc_tirion_fordring_tft() : CreatureScript("npc_tirion_fordring_tft") { } - struct npc_tirion_fordringAI : public ScriptedAI + struct npc_tirion_fordringAI : public ScriptedAI + { + npc_tirion_fordringAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) {} + + void Reset() { - npc_tirion_fordringAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) {} + _events.Reset(); + if (_instance->GetBossState(DATA_THE_LICH_KING) == DONE || (me->GetMap()->IsHeroic() && !_instance->GetData(DATA_LK_HC_AVAILABLE))) + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + me->SetReactState(REACT_PASSIVE); + } - void Reset() + void MovementInform(uint32 type, uint32 id) + { + if (type != POINT_MOTION_TYPE) + return; + + switch (id) { - _events.Reset(); - if (_instance->GetBossState(DATA_THE_LICH_KING) == DONE || (me->GetMap()->IsHeroic() && !_instance->GetData(DATA_LK_HC_AVAILABLE))) - me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - me->SetReactState(REACT_PASSIVE); - } - - void MovementInform(uint32 type, uint32 id) - { - if (type != POINT_MOTION_TYPE) - return; - - switch (id) - { - case POINT_TIRION_INTRO: - if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) - { - if (!theLichKing->IsAlive() || !theLichKing->IsVisible()) - break; - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY2H); - theLichKing->SetStandState(UNIT_STAND_STATE_STAND); - theLichKing->SetSheath(SHEATH_STATE_MELEE); - theLichKing->RemoveAurasDueToSpell(SPELL_EMOTE_SIT_NO_SHEATH); - theLichKing->AI()->Talk(SAY_LK_INTRO_1); - me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_FROZEN_THRONE); - _events.ScheduleEvent(EVENT_INTRO_LK_MOVE, 3000); - } - break; - case POINT_TIRION_OUTRO: - _events.ScheduleEvent(EVENT_OUTRO_FORDRING_JUMP, 1); - break; - } - } - - void DoAction(int32 action) - { - switch (action) - { - case ACTION_OUTRO: - _events.ScheduleEvent(EVENT_OUTRO_LK_TALK_1, 2600); - _events.ScheduleEvent(EVENT_OUTRO_LK_EMOTE_TALK, 6600); - _events.ScheduleEvent(EVENT_OUTRO_LK_EMOTE_TALK, 17600); - _events.ScheduleEvent(EVENT_OUTRO_LK_TALK_2, 30000); - _events.ScheduleEvent(EVENT_OUTRO_LK_TALK_3, 39000); - _events.ScheduleEvent(EVENT_OUTRO_LK_EMOTE_CAST_SHOUT, 50000); - _events.ScheduleEvent(EVENT_OUTRO_LK_EMOTE_TALK, 54000); - _events.ScheduleEvent(EVENT_OUTRO_LK_MOVE_CENTER, 65000); - break; - case ACTION_BREAK_FROSTMOURNE: - _events.ScheduleEvent(EVENT_OUTRO_LK_TALK_6, 2500); - _events.ScheduleEvent(EVENT_OUTRO_SOUL_BARRAGE, 6500); - break; - } - } - - void SpellHit(Unit* /*caster*/, SpellInfo const* spell) - { - if (spell->Id == SPELL_ICE_LOCK) - { - me->StopMoving(); - me->GetMotionMaster()->Clear(true); - me->SetFacingTo(3.085098f); - } - else if (spell->Id == SPELL_BROKEN_FROSTMOURNE_KNOCK) - { - // remove glow on ashbringer and tirion - me->RemoveAllAuras(); - SetEquipmentSlots(true); - } - } - - void JustReachedHome() - { - ScriptedAI::JustReachedHome(); - if (!(_instance->GetBossState(DATA_THE_LICH_KING) == DONE || (me->GetMap()->IsHeroic() && !_instance->GetData(DATA_LK_HC_AVAILABLE)))) - me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); - } - - void sGossipSelect(Player* /*player*/, uint32 sender, uint32 action) - { - Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING)); - if (me->GetCreatureTemplate()->GossipMenuId == sender && !action && me->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP) && theLichKing && !theLichKing->IsInEvadeMode()) - { - if (me->GetMap()->IsHeroic() && !_instance->GetData(DATA_LK_HC_AVAILABLE)) - return; - me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - me->SetWalk(true); - me->GetMotionMaster()->MovePoint(POINT_TIRION_INTRO, TirionIntro); - } - } - - /*bool CanBeSeen(Player const* p) - { - return me->GetExactDistSq(p) < 200.0f*200.0f; - }*/ - - void UpdateAI(uint32 diff) - { - UpdateVictim(); - - _events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (_events.ExecuteEvent()) - { - case EVENT_INTRO_LK_MOVE: - if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) - { - Movement::PointsArray path; - path.push_back(G3D::Vector3(theLichKing->GetPositionX(), theLichKing->GetPositionY(), theLichKing->GetPositionZ())); - for (uint8 i=0; i<3; ++i) - path.push_back(G3D::Vector3(LichKingIntro[i].GetPositionX(), LichKingIntro[i].GetPositionY(), LichKingIntro[i].GetPositionZ())); - theLichKing->SetWalk(true); - theLichKing->GetMotionMaster()->MoveSplinePath(&path); - _events.ScheduleEvent(EVENT_INTRO_FORDRING_TALK_1, 11000); - } - break; - case EVENT_INTRO_LK_TALK_1: - if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) - { - theLichKing->AI()->Talk(SAY_LK_INTRO_2); - theLichKing->HandleEmoteCommand(EMOTE_ONESHOT_TALK_NO_SHEATHE); - _events.ScheduleEvent(EVENT_INTRO_LK_EMOTE_CAST_SHOUT, 7000); - _events.ScheduleEvent(EVENT_INTRO_LK_EMOTE_1, 13000); - _events.ScheduleEvent(EVENT_INTRO_LK_EMOTE_CAST_SHOUT, 18000); - _events.ScheduleEvent(EVENT_INTRO_LK_CAST_FREEZE, 31000); - } - break; - case EVENT_INTRO_LK_EMOTE_CAST_SHOUT: - if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) - theLichKing->CastSpell(theLichKing, SPELL_EMOTE_SHOUT_NO_SHEATH, false); - break; - case EVENT_INTRO_LK_EMOTE_1: - if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) - theLichKing->HandleEmoteCommand(EMOTE_ONESHOT_POINT_NO_SHEATHE); - break; - case EVENT_INTRO_LK_CAST_FREEZE: - if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) - { - theLichKing->AI()->Talk(SAY_LK_INTRO_3); - theLichKing->CastSpell((Unit*)NULL, SPELL_ICE_LOCK, false); - _events.ScheduleEvent(EVENT_INTRO_FINISH, 1000); - } - break; - case EVENT_INTRO_FORDRING_TALK_1: - { - Talk(SAY_TIRION_INTRO_1); - _events.ScheduleEvent(EVENT_INTRO_LK_TALK_1, 9000); - _events.ScheduleEvent(EVENT_INTRO_FORDRING_TALK_2, 34000); - } - break; - case EVENT_INTRO_FORDRING_TALK_2: - { - Talk(SAY_TIRION_INTRO_2); - _events.ScheduleEvent(EVENT_INTRO_FORDRING_EMOTE_1, 2000); - _events.ScheduleEvent(EVENT_INTRO_FORDRING_CHARGE, 5000); - } - break; - case EVENT_INTRO_FORDRING_EMOTE_1: - me->HandleEmoteCommand(EMOTE_ONESHOT_POINT_NO_SHEATHE); - break; - case EVENT_INTRO_FORDRING_CHARGE: - me->SetWalk(false); - me->GetMotionMaster()->MovePoint(0, TirionCharge); - break; - case EVENT_INTRO_FINISH: - if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) - { - theLichKing->SetWalk(false); - theLichKing->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - theLichKing->SetReactState(REACT_AGGRESSIVE); - theLichKing->SetInCombatWithZone(); - if (!theLichKing->IsInCombat()) - theLichKing->AI()->EnterEvadeMode(); - } - break; - - - case EVENT_OUTRO_LK_TALK_1: - if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) - { - theLichKing->AI()->Talk(SAY_LK_OUTRO_1); - theLichKing->CastSpell((Unit*)NULL, SPELL_FURY_OF_FROSTMOURNE_NO_REZ, true); - Map::PlayerList const& pl = me->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) - if (Player* p = itr->GetSource()) - if (p->IsAlive()) - Unit::Kill(me, p); - } - break; - case EVENT_OUTRO_LK_TALK_2: - if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) - { - theLichKing->AI()->Talk(SAY_LK_OUTRO_2); - theLichKing->CastSpell((Unit*)NULL, SPELL_EMOTE_QUESTION_NO_SHEATH, false); - } - break; - case EVENT_OUTRO_LK_EMOTE_TALK: - if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) - theLichKing->HandleEmoteCommand(EMOTE_ONESHOT_TALK_NO_SHEATHE); - break; - case EVENT_OUTRO_LK_TALK_3: - if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) - { - theLichKing->SetFacingToObject(me); - theLichKing->AI()->Talk(SAY_LK_OUTRO_3); - } - break; - case EVENT_OUTRO_LK_MOVE_CENTER: - if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) - { - theLichKing->GetMotionMaster()->MovePoint(0, CenterPosition); - uint32 travelTime = 1000*theLichKing->GetExactDist(&CenterPosition)/theLichKing->GetSpeed(MOVE_WALK) + 1000; - - _events.ScheduleEvent(EVENT_OUTRO_LK_TALK_4, 1+travelTime); - _events.ScheduleEvent(EVENT_OUTRO_LK_RAISE_DEAD, 1000+travelTime); - _events.ScheduleEvent(EVENT_OUTRO_LK_TALK_5, 29000+travelTime); - } - break; - case EVENT_OUTRO_LK_TALK_4: - if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) - { - theLichKing->SetFacingTo(0.01745329f); - theLichKing->AI()->Talk(SAY_LK_OUTRO_4); - } - break; - case EVENT_OUTRO_LK_RAISE_DEAD: - if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) - { - theLichKing->CastSpell((Unit*)NULL, SPELL_RAISE_DEAD, false); - theLichKing->ClearUnitState(UNIT_STATE_CASTING); - me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_FINAL); - } - break; - case EVENT_OUTRO_LK_TALK_5: - if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) - { - theLichKing->AI()->Talk(SAY_LK_OUTRO_5); - _events.ScheduleEvent(EVENT_OUTRO_FORDRING_TALK_1, 7000); - _events.ScheduleEvent(EVENT_OUTRO_FORDRING_BLESS, 18000); - _events.ScheduleEvent(EVENT_OUTRO_FORDRING_REMOVE_ICE, 23000); - _events.ScheduleEvent(EVENT_OUTRO_FORDRING_MOVE_1, 25000); - } - break; - case EVENT_OUTRO_LK_TALK_6: - if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) - { - theLichKing->AI()->Talk(SAY_LK_OUTRO_6); - me->SetFacingToObject(theLichKing); - theLichKing->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, EQUIP_UNEQUIP); - theLichKing->CastSpell((Unit*)NULL, SPELL_SUMMON_BROKEN_FROSTMOURNE_3, true); - me->GetMap()->SetZoneOverrideLight(AREA_THE_FROZEN_THRONE, LIGHT_SOULSTORM, 10000); - me->GetMap()->SetZoneWeather(AREA_THE_FROZEN_THRONE, WEATHER_STATE_BLACKSNOW, 0.5f); - - _events.ScheduleEvent(EVENT_OUTRO_AFTER_SUMMON_BROKEN_FROSTMOURNE, 1000); - _events.ScheduleEvent(EVENT_OUTRO_KNOCK_BACK, 3000); + case POINT_TIRION_INTRO: + if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) + { + if (!theLichKing->IsAlive() || !theLichKing->IsVisible()) break; - } + me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY2H); + theLichKing->SetStandState(UNIT_STAND_STATE_STAND); + theLichKing->SetSheath(SHEATH_STATE_MELEE); + theLichKing->RemoveAurasDueToSpell(SPELL_EMOTE_SIT_NO_SHEATH); + theLichKing->AI()->Talk(SAY_LK_INTRO_1); + me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_FROZEN_THRONE); + _events.ScheduleEvent(EVENT_INTRO_LK_MOVE, 3000); + } + break; + case POINT_TIRION_OUTRO: + _events.ScheduleEvent(EVENT_OUTRO_FORDRING_JUMP, 1); + break; + } + } + + void DoAction(int32 action) + { + switch (action) + { + case ACTION_OUTRO: + _events.ScheduleEvent(EVENT_OUTRO_LK_TALK_1, 2600); + _events.ScheduleEvent(EVENT_OUTRO_LK_EMOTE_TALK, 6600); + _events.ScheduleEvent(EVENT_OUTRO_LK_EMOTE_TALK, 17600); + _events.ScheduleEvent(EVENT_OUTRO_LK_TALK_2, 30000); + _events.ScheduleEvent(EVENT_OUTRO_LK_TALK_3, 39000); + _events.ScheduleEvent(EVENT_OUTRO_LK_EMOTE_CAST_SHOUT, 50000); + _events.ScheduleEvent(EVENT_OUTRO_LK_EMOTE_TALK, 54000); + _events.ScheduleEvent(EVENT_OUTRO_LK_MOVE_CENTER, 65000); + break; + case ACTION_BREAK_FROSTMOURNE: + _events.ScheduleEvent(EVENT_OUTRO_LK_TALK_6, 2500); + _events.ScheduleEvent(EVENT_OUTRO_SOUL_BARRAGE, 6500); + break; + } + } + + void SpellHit(Unit* /*caster*/, SpellInfo const* spell) + { + if (spell->Id == SPELL_ICE_LOCK) + { + me->StopMoving(); + me->GetMotionMaster()->Clear(true); + me->SetFacingTo(3.085098f); + } + else if (spell->Id == SPELL_BROKEN_FROSTMOURNE_KNOCK) + { + // remove glow on ashbringer and tirion + me->RemoveAllAuras(); + SetEquipmentSlots(true); + } + } + + void JustReachedHome() + { + ScriptedAI::JustReachedHome(); + if (!(_instance->GetBossState(DATA_THE_LICH_KING) == DONE || (me->GetMap()->IsHeroic() && !_instance->GetData(DATA_LK_HC_AVAILABLE)))) + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); + } + + void sGossipSelect(Player* /*player*/, uint32 sender, uint32 action) + { + Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING)); + if (me->GetCreatureTemplate()->GossipMenuId == sender && !action && me->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP) && theLichKing && !theLichKing->IsInEvadeMode()) + { + if (me->GetMap()->IsHeroic() && !_instance->GetData(DATA_LK_HC_AVAILABLE)) + return; + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + me->SetWalk(true); + me->GetMotionMaster()->MovePoint(POINT_TIRION_INTRO, TirionIntro); + } + } + + /*bool CanBeSeen(Player const* p) + { + return me->GetExactDistSq(p) < 200.0f*200.0f; + }*/ + + void UpdateAI(uint32 diff) + { + UpdateVictim(); + + _events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (_events.ExecuteEvent()) + { + case EVENT_INTRO_LK_MOVE: + if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) + { + Movement::PointsArray path; + path.push_back(G3D::Vector3(theLichKing->GetPositionX(), theLichKing->GetPositionY(), theLichKing->GetPositionZ())); + for (uint8 i = 0; i < 3; ++i) + path.push_back(G3D::Vector3(LichKingIntro[i].GetPositionX(), LichKingIntro[i].GetPositionY(), LichKingIntro[i].GetPositionZ())); + theLichKing->SetWalk(true); + theLichKing->GetMotionMaster()->MoveSplinePath(&path); + _events.ScheduleEvent(EVENT_INTRO_FORDRING_TALK_1, 11000); + } + break; + case EVENT_INTRO_LK_TALK_1: + if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) + { + theLichKing->AI()->Talk(SAY_LK_INTRO_2); + theLichKing->HandleEmoteCommand(EMOTE_ONESHOT_TALK_NO_SHEATHE); + _events.ScheduleEvent(EVENT_INTRO_LK_EMOTE_CAST_SHOUT, 7000); + _events.ScheduleEvent(EVENT_INTRO_LK_EMOTE_1, 13000); + _events.ScheduleEvent(EVENT_INTRO_LK_EMOTE_CAST_SHOUT, 18000); + _events.ScheduleEvent(EVENT_INTRO_LK_CAST_FREEZE, 31000); + } + break; + case EVENT_INTRO_LK_EMOTE_CAST_SHOUT: + if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) + theLichKing->CastSpell(theLichKing, SPELL_EMOTE_SHOUT_NO_SHEATH, false); + break; + case EVENT_INTRO_LK_EMOTE_1: + if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) + theLichKing->HandleEmoteCommand(EMOTE_ONESHOT_POINT_NO_SHEATHE); + break; + case EVENT_INTRO_LK_CAST_FREEZE: + if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) + { + theLichKing->AI()->Talk(SAY_LK_INTRO_3); + theLichKing->CastSpell((Unit*)NULL, SPELL_ICE_LOCK, false); + _events.ScheduleEvent(EVENT_INTRO_FINISH, 1000); + } + break; + case EVENT_INTRO_FORDRING_TALK_1: + { + Talk(SAY_TIRION_INTRO_1); + _events.ScheduleEvent(EVENT_INTRO_LK_TALK_1, 9000); + _events.ScheduleEvent(EVENT_INTRO_FORDRING_TALK_2, 34000); + } + break; + case EVENT_INTRO_FORDRING_TALK_2: + { + Talk(SAY_TIRION_INTRO_2); + _events.ScheduleEvent(EVENT_INTRO_FORDRING_EMOTE_1, 2000); + _events.ScheduleEvent(EVENT_INTRO_FORDRING_CHARGE, 5000); + } + break; + case EVENT_INTRO_FORDRING_EMOTE_1: + me->HandleEmoteCommand(EMOTE_ONESHOT_POINT_NO_SHEATHE); + break; + case EVENT_INTRO_FORDRING_CHARGE: + me->SetWalk(false); + me->GetMotionMaster()->MovePoint(0, TirionCharge); + break; + case EVENT_INTRO_FINISH: + if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) + { + theLichKing->SetWalk(false); + theLichKing->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + theLichKing->SetReactState(REACT_AGGRESSIVE); + theLichKing->SetInCombatWithZone(); + if (!theLichKing->IsInCombat()) + theLichKing->AI()->EnterEvadeMode(); + } + break; + + + case EVENT_OUTRO_LK_TALK_1: + if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) + { + theLichKing->AI()->Talk(SAY_LK_OUTRO_1); + theLichKing->CastSpell((Unit*)NULL, SPELL_FURY_OF_FROSTMOURNE_NO_REZ, true); + Map::PlayerList const& pl = me->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) + if (Player* p = itr->GetSource()) + if (p->IsAlive()) + Unit::Kill(me, p); + } + break; + case EVENT_OUTRO_LK_TALK_2: + if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) + { + theLichKing->AI()->Talk(SAY_LK_OUTRO_2); + theLichKing->CastSpell((Unit*)NULL, SPELL_EMOTE_QUESTION_NO_SHEATH, false); + } + break; + case EVENT_OUTRO_LK_EMOTE_TALK: + if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) + theLichKing->HandleEmoteCommand(EMOTE_ONESHOT_TALK_NO_SHEATHE); + break; + case EVENT_OUTRO_LK_TALK_3: + if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) + { + theLichKing->SetFacingToObject(me); + theLichKing->AI()->Talk(SAY_LK_OUTRO_3); + } + break; + case EVENT_OUTRO_LK_MOVE_CENTER: + if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) + { + theLichKing->GetMotionMaster()->MovePoint(0, CenterPosition); + uint32 travelTime = 1000 * theLichKing->GetExactDist(&CenterPosition) / theLichKing->GetSpeed(MOVE_WALK) + 1000; + + _events.ScheduleEvent(EVENT_OUTRO_LK_TALK_4, 1 + travelTime); + _events.ScheduleEvent(EVENT_OUTRO_LK_RAISE_DEAD, 1000 + travelTime); + _events.ScheduleEvent(EVENT_OUTRO_LK_TALK_5, 29000 + travelTime); + } + break; + case EVENT_OUTRO_LK_TALK_4: + if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) + { + theLichKing->SetFacingTo(0.01745329f); + theLichKing->AI()->Talk(SAY_LK_OUTRO_4); + } + break; + case EVENT_OUTRO_LK_RAISE_DEAD: + if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) + { + theLichKing->CastSpell((Unit*)NULL, SPELL_RAISE_DEAD, false); + theLichKing->ClearUnitState(UNIT_STATE_CASTING); + me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_FINAL); + } + break; + case EVENT_OUTRO_LK_TALK_5: + if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) + { + theLichKing->AI()->Talk(SAY_LK_OUTRO_5); + _events.ScheduleEvent(EVENT_OUTRO_FORDRING_TALK_1, 7000); + _events.ScheduleEvent(EVENT_OUTRO_FORDRING_BLESS, 18000); + _events.ScheduleEvent(EVENT_OUTRO_FORDRING_REMOVE_ICE, 23000); + _events.ScheduleEvent(EVENT_OUTRO_FORDRING_MOVE_1, 25000); + } + break; + case EVENT_OUTRO_LK_TALK_6: + if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) + { + theLichKing->AI()->Talk(SAY_LK_OUTRO_6); + me->SetFacingToObject(theLichKing); + theLichKing->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, EQUIP_UNEQUIP); + theLichKing->CastSpell((Unit*)NULL, SPELL_SUMMON_BROKEN_FROSTMOURNE_3, true); + me->GetMap()->SetZoneOverrideLight(AREA_THE_FROZEN_THRONE, LIGHT_SOULSTORM, 10000); + me->GetMap()->SetZoneWeather(AREA_THE_FROZEN_THRONE, WEATHER_STATE_BLACKSNOW, 0.5f); + + _events.ScheduleEvent(EVENT_OUTRO_AFTER_SUMMON_BROKEN_FROSTMOURNE, 1000); + _events.ScheduleEvent(EVENT_OUTRO_KNOCK_BACK, 3000); break; - case EVENT_OUTRO_AFTER_SUMMON_BROKEN_FROSTMOURNE: - if (Creature* frostmourne = me->FindNearestCreature(NPC_FROSTMOURNE_TRIGGER, 50.0f)) - frostmourne->CastSpell((Unit*)NULL, SPELL_BROKEN_FROSTMOURNE, true); - break; - case EVENT_OUTRO_KNOCK_BACK: - if (Creature* frostmourne = me->FindNearestCreature(NPC_FROSTMOURNE_TRIGGER, 50.0f)) - frostmourne->CastSpell((Unit*)NULL, SPELL_BROKEN_FROSTMOURNE_KNOCK, false); - break; - case EVENT_OUTRO_SOUL_BARRAGE: - if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) - { - theLichKing->CastSpell((Unit*)NULL, SPELL_SOUL_BARRAGE, TRIGGERED_IGNORE_CAST_IN_PROGRESS); - sCreatureTextMgr->SendSound(theLichKing, SOUND_PAIN, CHAT_MSG_MONSTER_YELL, 0, TEXT_RANGE_NORMAL, TEAM_NEUTRAL, false); - theLichKing->SetDisableGravity(true); - theLichKing->SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER); - theLichKing->GetMotionMaster()->MovePoint(0, OutroFlying); - - _events.ScheduleEvent(EVENT_OUTRO_AFTER_SOUL_BARRAGE, 3000); - } - break; - case EVENT_OUTRO_AFTER_SOUL_BARRAGE: - Talk(SAY_TIRION_OUTRO_2); - _events.ScheduleEvent(EVENT_OUTRO_SUMMON_TERENAS, 6000); - break; - case EVENT_OUTRO_SUMMON_TERENAS: - if (Creature* frostmourne = me->FindNearestCreature(NPC_FROSTMOURNE_TRIGGER, 50.0f)) - { - frostmourne->CastSpell((Unit*)NULL, SPELL_SUMMON_TERENAS, false); - if (Creature* terenas = me->FindNearestCreature(NPC_TERENAS_MENETHIL_OUTRO, 50.0f)) - terenas->SetFacingToObject(frostmourne); - } - _events.ScheduleEvent(EVENT_OUTRO_TERENAS_TALK_1, 2000); - _events.ScheduleEvent(EVENT_OUTRO_TERENAS_TALK_2, 14000); - break; - case EVENT_OUTRO_TERENAS_TALK_1: + } + break; + case EVENT_OUTRO_AFTER_SUMMON_BROKEN_FROSTMOURNE: + if (Creature* frostmourne = me->FindNearestCreature(NPC_FROSTMOURNE_TRIGGER, 50.0f)) + frostmourne->CastSpell((Unit*)NULL, SPELL_BROKEN_FROSTMOURNE, true); + break; + case EVENT_OUTRO_KNOCK_BACK: + if (Creature* frostmourne = me->FindNearestCreature(NPC_FROSTMOURNE_TRIGGER, 50.0f)) + frostmourne->CastSpell((Unit*)NULL, SPELL_BROKEN_FROSTMOURNE_KNOCK, false); + break; + case EVENT_OUTRO_SOUL_BARRAGE: + if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) + { + theLichKing->CastSpell((Unit*)NULL, SPELL_SOUL_BARRAGE, TRIGGERED_IGNORE_CAST_IN_PROGRESS); + sCreatureTextMgr->SendSound(theLichKing, SOUND_PAIN, CHAT_MSG_MONSTER_YELL, 0, TEXT_RANGE_NORMAL, TEAM_NEUTRAL, false); + theLichKing->SetDisableGravity(true); + theLichKing->SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER); + theLichKing->GetMotionMaster()->MovePoint(0, OutroFlying); + + _events.ScheduleEvent(EVENT_OUTRO_AFTER_SOUL_BARRAGE, 3000); + } + break; + case EVENT_OUTRO_AFTER_SOUL_BARRAGE: + Talk(SAY_TIRION_OUTRO_2); + _events.ScheduleEvent(EVENT_OUTRO_SUMMON_TERENAS, 6000); + break; + case EVENT_OUTRO_SUMMON_TERENAS: + if (Creature* frostmourne = me->FindNearestCreature(NPC_FROSTMOURNE_TRIGGER, 50.0f)) + { + frostmourne->CastSpell((Unit*)NULL, SPELL_SUMMON_TERENAS, false); if (Creature* terenas = me->FindNearestCreature(NPC_TERENAS_MENETHIL_OUTRO, 50.0f)) - terenas->AI()->Talk(SAY_TERENAS_OUTRO_1); - break; - case EVENT_OUTRO_TERENAS_TALK_2: - if (Creature* terenas = me->FindNearestCreature(NPC_TERENAS_MENETHIL_OUTRO, 50.0f)) - { - terenas->AI()->Talk(SAY_TERENAS_OUTRO_2); - terenas->CastSpell((Unit*)NULL, SPELL_MASS_RESURRECTION, false); - if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) - { - lichKing->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC); - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); - me->RemoveAllAuras(); - SetEquipmentSlots(true); - me->Attack(lichKing, true); - me->GetMotionMaster()->MovePoint(0, 512.16f, -2120.25f, 840.86f); - } - _events.ScheduleEvent(EVENT_OUTRO_LK_TALK_7, 7000); - _events.ScheduleEvent(EVENT_OUTRO_LK_TALK_8, 17000); - } - break; - case EVENT_OUTRO_LK_TALK_7: - if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) - theLichKing->AI()->Talk(SAY_LK_OUTRO_7); - break; - case EVENT_OUTRO_LK_TALK_8: - if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) - theLichKing->AI()->Talk(SAY_LK_OUTRO_8); - break; - case EVENT_OUTRO_FORDRING_TALK_1: - Talk(SAY_TIRION_OUTRO_1); - break; - case EVENT_OUTRO_FORDRING_BLESS: - me->CastSpell(me, SPELL_LIGHTS_BLESSING, false); - break; - case EVENT_OUTRO_FORDRING_REMOVE_ICE: - me->RemoveAurasDueToSpell(SPELL_ICE_LOCK); - SetEquipmentSlots(false, EQUIP_ASHBRINGER_GLOWING); + terenas->SetFacingToObject(frostmourne); + } + _events.ScheduleEvent(EVENT_OUTRO_TERENAS_TALK_1, 2000); + _events.ScheduleEvent(EVENT_OUTRO_TERENAS_TALK_2, 14000); + break; + case EVENT_OUTRO_TERENAS_TALK_1: + if (Creature* terenas = me->FindNearestCreature(NPC_TERENAS_MENETHIL_OUTRO, 50.0f)) + terenas->AI()->Talk(SAY_TERENAS_OUTRO_1); + break; + case EVENT_OUTRO_TERENAS_TALK_2: + if (Creature* terenas = me->FindNearestCreature(NPC_TERENAS_MENETHIL_OUTRO, 50.0f)) + { + terenas->AI()->Talk(SAY_TERENAS_OUTRO_2); + terenas->CastSpell((Unit*)NULL, SPELL_MASS_RESURRECTION, false); if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) { - me->SetFacingToObject(lichKing); - me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_FINAL); + lichKing->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC); + me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); + me->RemoveAllAuras(); + SetEquipmentSlots(true); + me->Attack(lichKing, true); + me->GetMotionMaster()->MovePoint(0, 512.16f, -2120.25f, 840.86f); } - break; - case EVENT_OUTRO_FORDRING_MOVE_1: - me->GetMotionMaster()->MovePoint(POINT_TIRION_OUTRO, OutroPosition1); - break; - case EVENT_OUTRO_FORDRING_JUMP: - me->CastSpell((Unit*)NULL, SPELL_JUMP, false); - break; + _events.ScheduleEvent(EVENT_OUTRO_LK_TALK_7, 7000); + _events.ScheduleEvent(EVENT_OUTRO_LK_TALK_8, 17000); + } + break; + case EVENT_OUTRO_LK_TALK_7: + if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) + theLichKing->AI()->Talk(SAY_LK_OUTRO_7); + break; + case EVENT_OUTRO_LK_TALK_8: + if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) + theLichKing->AI()->Talk(SAY_LK_OUTRO_8); + break; + case EVENT_OUTRO_FORDRING_TALK_1: + Talk(SAY_TIRION_OUTRO_1); + break; + case EVENT_OUTRO_FORDRING_BLESS: + me->CastSpell(me, SPELL_LIGHTS_BLESSING, false); + break; + case EVENT_OUTRO_FORDRING_REMOVE_ICE: + me->RemoveAurasDueToSpell(SPELL_ICE_LOCK); + SetEquipmentSlots(false, EQUIP_ASHBRINGER_GLOWING); + if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) + { + me->SetFacingToObject(lichKing); + me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_FINAL); + } + break; + case EVENT_OUTRO_FORDRING_MOVE_1: + me->GetMotionMaster()->MovePoint(POINT_TIRION_OUTRO, OutroPosition1); + break; + case EVENT_OUTRO_FORDRING_JUMP: + me->CastSpell((Unit*)NULL, SPELL_JUMP, false); + break; - default: - break; + default: + break; + } + + DoMeleeAttackIfReady(); + } + + void EnterEvadeMode() + { + if (!me->IsAlive()) + return; + + if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) + if (theLichKing->IsInEvadeMode()) + { + ScriptedAI::EnterEvadeMode(); + return; } - DoMeleeAttackIfReady(); - } - - void EnterEvadeMode() - { - if (!me->IsAlive()) - return; - - if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) - if (theLichKing->IsInEvadeMode()) - { - ScriptedAI::EnterEvadeMode(); - return; - } - - me->DeleteThreatList(); - me->CombatStop(false); - } - - bool CanAIAttack(Unit const* target) const - { - return target->GetEntry() == NPC_THE_LICH_KING; - } - - private: - EventMap _events; - InstanceScript* _instance; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + me->DeleteThreatList(); + me->CombatStop(false); } + + bool CanAIAttack(Unit const* target) const + { + return target->GetEntry() == NPC_THE_LICH_KING; + } + + private: + EventMap _events; + InstanceScript* _instance; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class spell_the_lich_king_quake : public SpellScriptLoader { - public: - spell_the_lich_king_quake() : SpellScriptLoader("spell_the_lich_king_quake") { } +public: + spell_the_lich_king_quake() : SpellScriptLoader("spell_the_lich_king_quake") { } - class spell_the_lich_king_quake_SpellScript : public SpellScript + class spell_the_lich_king_quake_SpellScript : public SpellScript + { + PrepareSpellScript(spell_the_lich_king_quake_SpellScript); + + bool Load() { - PrepareSpellScript(spell_the_lich_king_quake_SpellScript); - - bool Load() - { - return GetCaster()->GetInstanceScript() != nullptr; - } - - void FilterTargets(std::list& targets) - { - if (GameObject* platform = ObjectAccessor::GetGameObject(*GetCaster(), GetCaster()->GetInstanceScript()->GetData64(DATA_ARTHAS_PLATFORM))) - targets.remove_if(HeightDifferenceCheck(platform, 5.0f, false)); - } - - void HandleSendEvent(SpellEffIndex /*effIndex*/) - { - if (GetCaster()->IsAIEnabled) - GetCaster()->GetAI()->DoAction(ACTION_START_ATTACK); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_quake_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); - OnEffectHit += SpellEffectFn(spell_the_lich_king_quake_SpellScript::HandleSendEvent, EFFECT_1, SPELL_EFFECT_SEND_EVENT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_the_lich_king_quake_SpellScript(); + return GetCaster()->GetInstanceScript() != nullptr; } + + void FilterTargets(std::list& targets) + { + if (GameObject* platform = ObjectAccessor::GetGameObject(*GetCaster(), GetCaster()->GetInstanceScript()->GetData64(DATA_ARTHAS_PLATFORM))) + targets.remove_if(HeightDifferenceCheck(platform, 5.0f, false)); + } + + void HandleSendEvent(SpellEffIndex /*effIndex*/) + { + if (GetCaster()->IsAIEnabled) + GetCaster()->GetAI()->DoAction(ACTION_START_ATTACK); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_quake_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + OnEffectHit += SpellEffectFn(spell_the_lich_king_quake_SpellScript::HandleSendEvent, EFFECT_1, SPELL_EFFECT_SEND_EVENT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_the_lich_king_quake_SpellScript(); + } }; class spell_the_lich_king_jump : public SpellScriptLoader { - public: - spell_the_lich_king_jump() : SpellScriptLoader("spell_the_lich_king_jump") { } +public: + spell_the_lich_king_jump() : SpellScriptLoader("spell_the_lich_king_jump") { } - class spell_the_lich_king_jump_SpellScript : public SpellScript + class spell_the_lich_king_jump_SpellScript : public SpellScript + { + PrepareSpellScript(spell_the_lich_king_jump_SpellScript); + + void HandleScript(SpellEffIndex effIndex) { - PrepareSpellScript(spell_the_lich_king_jump_SpellScript); - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetHitUnit()->RemoveAurasDueToSpell(SPELL_RAISE_DEAD); - GetHitUnit()->InterruptNonMeleeSpells(true); - GetHitUnit()->CastSpell((Unit*)NULL, SPELL_JUMP_2, true); - if (Creature* creature = GetHitCreature()) - creature->AI()->DoAction(ACTION_BREAK_FROSTMOURNE); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_the_lich_king_jump_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_the_lich_king_jump_SpellScript(); + PreventHitDefaultEffect(effIndex); + GetHitUnit()->RemoveAurasDueToSpell(SPELL_RAISE_DEAD); + GetHitUnit()->InterruptNonMeleeSpells(true); + GetHitUnit()->CastSpell((Unit*)NULL, SPELL_JUMP_2, true); + if (Creature* creature = GetHitCreature()) + creature->AI()->DoAction(ACTION_BREAK_FROSTMOURNE); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_the_lich_king_jump_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_the_lich_king_jump_SpellScript(); + } }; class spell_the_lich_king_jump_remove_aura : public SpellScriptLoader { - public: - spell_the_lich_king_jump_remove_aura() : SpellScriptLoader("spell_the_lich_king_jump_remove_aura") { } +public: + spell_the_lich_king_jump_remove_aura() : SpellScriptLoader("spell_the_lich_king_jump_remove_aura") { } - class spell_the_lich_king_jump_SpellScript : public SpellScript + class spell_the_lich_king_jump_SpellScript : public SpellScript + { + PrepareSpellScript(spell_the_lich_king_jump_SpellScript); + + void HandleScript(SpellEffIndex effIndex) { - PrepareSpellScript(spell_the_lich_king_jump_SpellScript); - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetHitUnit()->RemoveAurasDueToSpell(uint32(GetEffectValue())); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_the_lich_king_jump_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_the_lich_king_jump_SpellScript(); + PreventHitDefaultEffect(effIndex); + GetHitUnit()->RemoveAurasDueToSpell(uint32(GetEffectValue())); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_the_lich_king_jump_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_the_lich_king_jump_SpellScript(); + } }; class spell_the_lich_king_play_movie : public SpellScriptLoader { - public: - spell_the_lich_king_play_movie() : SpellScriptLoader("spell_the_lich_king_play_movie") { } +public: + spell_the_lich_king_play_movie() : SpellScriptLoader("spell_the_lich_king_play_movie") { } - class spell_the_lich_king_play_movie_SpellScript : public SpellScript + class spell_the_lich_king_play_movie_SpellScript : public SpellScript + { + PrepareSpellScript(spell_the_lich_king_play_movie_SpellScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareSpellScript(spell_the_lich_king_play_movie_SpellScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sMovieStore.LookupEntry(MOVIE_FALL_OF_THE_LICH_KING)) - return false; - return true; - } - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Player* player = GetHitPlayer()) - player->SendMovieStart(MOVIE_FALL_OF_THE_LICH_KING); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_the_lich_king_play_movie_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_the_lich_king_play_movie_SpellScript(); + if (!sMovieStore.LookupEntry(MOVIE_FALL_OF_THE_LICH_KING)) + return false; + return true; } + + void HandleScript(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (Player* player = GetHitPlayer()) + player->SendMovieStart(MOVIE_FALL_OF_THE_LICH_KING); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_the_lich_king_play_movie_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_the_lich_king_play_movie_SpellScript(); + } }; /*** FIGHT STUFF BELOW ***/ class npc_shambling_horror_icc : public CreatureScript { - public: - npc_shambling_horror_icc() : CreatureScript("npc_shambling_horror_icc") { } +public: + npc_shambling_horror_icc() : CreatureScript("npc_shambling_horror_icc") { } - struct npc_shambling_horror_iccAI : public ScriptedAI + struct npc_shambling_horror_iccAI : public ScriptedAI + { + npc_shambling_horror_iccAI(Creature* creature) : ScriptedAI(creature) { - npc_shambling_horror_iccAI(Creature* creature) : ScriptedAI(creature) - { - _frenzied = false; - } - - EventMap _events; - bool _frenzied; - - void Reset() - { - _events.Reset(); - _events.ScheduleEvent(EVENT_SHOCKWAVE, urand(20000, 25000)); - _events.ScheduleEvent(EVENT_ENRAGE, urand(11000, 14000)); - } - - void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) - { - if (!_frenzied && IsHeroic() && me->HealthBelowPctDamaged(20, damage)) - { - _frenzied = true; - me->CastSpell(me, SPELL_FRENZY, true); - } - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - _events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (_events.ExecuteEvent()) - { - case EVENT_SHOCKWAVE: - me->CastSpell(me->GetVictim(), SPELL_SHOCKWAVE, false); - _events.ScheduleEvent(EVENT_SHOCKWAVE, urand(20000, 25000)); - break; - case EVENT_ENRAGE: - me->CastSpell(me, SPELL_ENRAGE, false); - _events.ScheduleEvent(EVENT_ENRAGE, urand(20000, 25000)); - break; - default: - break; - } - - DoMeleeAttackIfReady(); - } - - bool CanAIAttack(Unit const* target) const - { - return IsValidPlatformTarget(target) && !target->GetVehicle(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + _frenzied = false; } + + EventMap _events; + bool _frenzied; + + void Reset() + { + _events.Reset(); + _events.ScheduleEvent(EVENT_SHOCKWAVE, urand(20000, 25000)); + _events.ScheduleEvent(EVENT_ENRAGE, urand(11000, 14000)); + } + + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) + { + if (!_frenzied && IsHeroic() && me->HealthBelowPctDamaged(20, damage)) + { + _frenzied = true; + me->CastSpell(me, SPELL_FRENZY, true); + } + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + _events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (_events.ExecuteEvent()) + { + case EVENT_SHOCKWAVE: + me->CastSpell(me->GetVictim(), SPELL_SHOCKWAVE, false); + _events.ScheduleEvent(EVENT_SHOCKWAVE, urand(20000, 25000)); + break; + case EVENT_ENRAGE: + me->CastSpell(me, SPELL_ENRAGE, false); + _events.ScheduleEvent(EVENT_ENRAGE, urand(20000, 25000)); + break; + default: + break; + } + + DoMeleeAttackIfReady(); + } + + bool CanAIAttack(Unit const* target) const + { + return IsValidPlatformTarget(target) && !target->GetVehicle(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class spell_the_lich_king_infest : public SpellScriptLoader { - public: - spell_the_lich_king_infest() : SpellScriptLoader("spell_the_lich_king_infest") { } +public: + spell_the_lich_king_infest() : SpellScriptLoader("spell_the_lich_king_infest") { } - class spell_the_lich_king_infest_AuraScript : public AuraScript + class spell_the_lich_king_infest_AuraScript : public AuraScript + { + PrepareAuraScript(spell_the_lich_king_infest_AuraScript); + + void OnPeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_the_lich_king_infest_AuraScript); - - void OnPeriodic(AuraEffect const* /*aurEff*/) + if (GetUnitOwner()->HealthAbovePct(90)) { - if (GetUnitOwner()->HealthAbovePct(90)) - { - PreventDefaultAction(); - Remove(AURA_REMOVE_BY_ENEMY_SPELL); - } + PreventDefaultAction(); + Remove(AURA_REMOVE_BY_ENEMY_SPELL); } - - void OnUpdate(AuraEffect* aurEff) - { - // multiply, starting from 2nd tick - if (aurEff->GetTickNumber() == 1) - return; - - aurEff->SetAmount(int32(aurEff->GetAmount() * 1.15f)); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_the_lich_king_infest_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); - OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_the_lich_king_infest_AuraScript::OnUpdate, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_the_lich_king_infest_AuraScript(); } + + void OnUpdate(AuraEffect* aurEff) + { + // multiply, starting from 2nd tick + if (aurEff->GetTickNumber() == 1) + return; + + aurEff->SetAmount(int32(aurEff->GetAmount() * 1.15f)); + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_the_lich_king_infest_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_the_lich_king_infest_AuraScript::OnUpdate, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_the_lich_king_infest_AuraScript(); + } }; class spell_the_lich_king_necrotic_plague : public SpellScriptLoader { - public: - spell_the_lich_king_necrotic_plague() : SpellScriptLoader("spell_the_lich_king_necrotic_plague") { } +public: + spell_the_lich_king_necrotic_plague() : SpellScriptLoader("spell_the_lich_king_necrotic_plague") { } - class spell_the_lich_king_necrotic_plague_AuraScript : public AuraScript + class spell_the_lich_king_necrotic_plague_AuraScript : public AuraScript + { + PrepareAuraScript(spell_the_lich_king_necrotic_plague_AuraScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareAuraScript(spell_the_lich_king_necrotic_plague_AuraScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_NECROTIC_PLAGUE_JUMP)) - return false; - return true; - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - bool dispel = false; - switch (GetTargetApplication()->GetRemoveMode()) - { - case AURA_REMOVE_BY_ENEMY_SPELL: - dispel = true; - case AURA_REMOVE_BY_EXPIRE: - case AURA_REMOVE_BY_DEATH: - break; - default: - return; - } - - CustomSpellValues values; - if (dispel) - values.AddSpellMod(SPELLVALUE_BASE_POINT1, AURA_REMOVE_BY_ENEMY_SPELL); // add as marker (spell has no effect 1) - GetTarget()->CastCustomSpell(SPELL_NECROTIC_PLAGUE_JUMP, values, NULL, TRIGGERED_FULL_MASK, nullptr, nullptr, GetCasterGUID()); - - if (Unit* caster = GetCaster()) - caster->CastSpell(caster, SPELL_PLAGUE_SIPHON, true); - } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_the_lich_king_necrotic_plague_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_the_lich_king_necrotic_plague_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_NECROTIC_PLAGUE_JUMP)) + return false; + return true; } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + bool dispel = false; + switch (GetTargetApplication()->GetRemoveMode()) + { + case AURA_REMOVE_BY_ENEMY_SPELL: + dispel = true; + case AURA_REMOVE_BY_EXPIRE: + case AURA_REMOVE_BY_DEATH: + break; + default: + return; + } + + CustomSpellValues values; + if (dispel) + values.AddSpellMod(SPELLVALUE_BASE_POINT1, AURA_REMOVE_BY_ENEMY_SPELL); // add as marker (spell has no effect 1) + GetTarget()->CastCustomSpell(SPELL_NECROTIC_PLAGUE_JUMP, values, NULL, TRIGGERED_FULL_MASK, nullptr, nullptr, GetCasterGUID()); + + if (Unit* caster = GetCaster()) + caster->CastSpell(caster, SPELL_PLAGUE_SIPHON, true); + } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_the_lich_king_necrotic_plague_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_the_lich_king_necrotic_plague_AuraScript(); + } }; class spell_the_lich_king_necrotic_plague_jump : public SpellScriptLoader { - public: - spell_the_lich_king_necrotic_plague_jump() : SpellScriptLoader("spell_the_lich_king_necrotic_plague_jump") { } +public: + spell_the_lich_king_necrotic_plague_jump() : SpellScriptLoader("spell_the_lich_king_necrotic_plague_jump") { } - class spell_the_lich_king_necrotic_plague_SpellScript : public SpellScript + class spell_the_lich_king_necrotic_plague_SpellScript : public SpellScript + { + PrepareSpellScript(spell_the_lich_king_necrotic_plague_SpellScript); + + bool Load() { - PrepareSpellScript(spell_the_lich_king_necrotic_plague_SpellScript); - - bool Load() - { - _hadJumpingAura = false; - _hadInitialAura = false; - return true; - } - - void FilterTargets(std::list& targets) - { - targets.sort(acore::ObjectDistanceOrderPred(GetCaster())); - if (targets.size() <= 1) - return; - - targets.resize(1); - } - - void CheckAura() - { - if (GetHitUnit()->HasAura(GetSpellInfo()->Id)) - _hadJumpingAura = true; - else if (uint32 spellId = sSpellMgr->GetSpellIdForDifficulty(SPELL_NECROTIC_PLAGUE, GetHitUnit())) - if (GetHitUnit()->HasAura(spellId)) - _hadInitialAura = true; - } - - void AddMissingStack() - { - if (GetHitAura() && !_hadJumpingAura) - { - uint32 spellId = sSpellMgr->GetSpellIdForDifficulty(SPELL_NECROTIC_PLAGUE, GetHitUnit()); - if (GetSpellValue()->EffectBasePoints[EFFECT_1] != AURA_REMOVE_BY_ENEMY_SPELL || _hadInitialAura) - GetHitAura()->ModStackAmount(1); - if (_hadInitialAura) - if (Aura* a = GetHitUnit()->GetAura(spellId)) - a->Remove(AURA_REMOVE_BY_DEFAULT); - } - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_necrotic_plague_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); - BeforeHit += SpellHitFn(spell_the_lich_king_necrotic_plague_SpellScript::CheckAura); - OnHit += SpellHitFn(spell_the_lich_king_necrotic_plague_SpellScript::AddMissingStack); - } - - bool _hadJumpingAura; - bool _hadInitialAura; - }; - - class spell_the_lich_king_necrotic_plague_AuraScript : public AuraScript - { - PrepareAuraScript(spell_the_lich_king_necrotic_plague_AuraScript); - - bool Load() - { - _lastAmount = 0; - return true; - } - - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) - if (caster->GetAI()) - caster->GetAI()->SetData(DATA_PLAGUE_STACK, GetStackAmount()); - } - - void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - _lastAmount = aurEff->GetAmount(); - switch (GetTargetApplication()->GetRemoveMode()) - { - case AURA_REMOVE_BY_EXPIRE: - case AURA_REMOVE_BY_DEATH: - break; - default: - return; - } - - CustomSpellValues values; - values.AddSpellMod(SPELLVALUE_AURA_STACK, GetStackAmount()); - GetTarget()->CastCustomSpell(SPELL_NECROTIC_PLAGUE_JUMP, values, NULL, TRIGGERED_FULL_MASK, nullptr, nullptr, GetCasterGUID()); - if (Unit* caster = GetCaster()) - caster->CastSpell(caster, SPELL_PLAGUE_SIPHON, true); - } - - void OnDispel(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - _lastAmount = aurEff->GetAmount(); - } - - void AfterDispel(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - // this means the stack increased so don't process as if dispelled - if (aurEff->GetAmount() > _lastAmount) - return; - - CustomSpellValues values; - values.AddSpellMod(SPELLVALUE_AURA_STACK, GetStackAmount()); - values.AddSpellMod(SPELLVALUE_BASE_POINT1, AURA_REMOVE_BY_ENEMY_SPELL); // add as marker (spell has no effect 1) - GetTarget()->CastCustomSpell(SPELL_NECROTIC_PLAGUE_JUMP, values, NULL, TRIGGERED_FULL_MASK, nullptr, nullptr, GetCasterGUID()); - if (Unit* caster = GetCaster()) - caster->CastSpell(caster, SPELL_PLAGUE_SIPHON, true); - - Remove(AURA_REMOVE_BY_ENEMY_SPELL); - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_the_lich_king_necrotic_plague_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - AfterEffectRemove += AuraEffectRemoveFn(spell_the_lich_king_necrotic_plague_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_the_lich_king_necrotic_plague_AuraScript::OnDispel, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAPPLY); - AfterEffectApply += AuraEffectApplyFn(spell_the_lich_king_necrotic_plague_AuraScript::AfterDispel, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAPPLY); - } - - int32 _lastAmount; - }; - - SpellScript* GetSpellScript() const - { - return new spell_the_lich_king_necrotic_plague_SpellScript(); + _hadJumpingAura = false; + _hadInitialAura = false; + return true; } - AuraScript* GetAuraScript() const + void FilterTargets(std::list& targets) { - return new spell_the_lich_king_necrotic_plague_AuraScript(); + targets.sort(acore::ObjectDistanceOrderPred(GetCaster())); + if (targets.size() <= 1) + return; + + targets.resize(1); } + + void CheckAura() + { + if (GetHitUnit()->HasAura(GetSpellInfo()->Id)) + _hadJumpingAura = true; + else if (uint32 spellId = sSpellMgr->GetSpellIdForDifficulty(SPELL_NECROTIC_PLAGUE, GetHitUnit())) + if (GetHitUnit()->HasAura(spellId)) + _hadInitialAura = true; + } + + void AddMissingStack() + { + if (GetHitAura() && !_hadJumpingAura) + { + uint32 spellId = sSpellMgr->GetSpellIdForDifficulty(SPELL_NECROTIC_PLAGUE, GetHitUnit()); + if (GetSpellValue()->EffectBasePoints[EFFECT_1] != AURA_REMOVE_BY_ENEMY_SPELL || _hadInitialAura) + GetHitAura()->ModStackAmount(1); + if (_hadInitialAura) + if (Aura* a = GetHitUnit()->GetAura(spellId)) + a->Remove(AURA_REMOVE_BY_DEFAULT); + } + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_necrotic_plague_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + BeforeHit += SpellHitFn(spell_the_lich_king_necrotic_plague_SpellScript::CheckAura); + OnHit += SpellHitFn(spell_the_lich_king_necrotic_plague_SpellScript::AddMissingStack); + } + + bool _hadJumpingAura; + bool _hadInitialAura; + }; + + class spell_the_lich_king_necrotic_plague_AuraScript : public AuraScript + { + PrepareAuraScript(spell_the_lich_king_necrotic_plague_AuraScript); + + bool Load() + { + _lastAmount = 0; + return true; + } + + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* caster = GetCaster()) + if (caster->GetAI()) + caster->GetAI()->SetData(DATA_PLAGUE_STACK, GetStackAmount()); + } + + void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + _lastAmount = aurEff->GetAmount(); + switch (GetTargetApplication()->GetRemoveMode()) + { + case AURA_REMOVE_BY_EXPIRE: + case AURA_REMOVE_BY_DEATH: + break; + default: + return; + } + + CustomSpellValues values; + values.AddSpellMod(SPELLVALUE_AURA_STACK, GetStackAmount()); + GetTarget()->CastCustomSpell(SPELL_NECROTIC_PLAGUE_JUMP, values, NULL, TRIGGERED_FULL_MASK, nullptr, nullptr, GetCasterGUID()); + if (Unit* caster = GetCaster()) + caster->CastSpell(caster, SPELL_PLAGUE_SIPHON, true); + } + + void OnDispel(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + _lastAmount = aurEff->GetAmount(); + } + + void AfterDispel(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + // this means the stack increased so don't process as if dispelled + if (aurEff->GetAmount() > _lastAmount) + return; + + CustomSpellValues values; + values.AddSpellMod(SPELLVALUE_AURA_STACK, GetStackAmount()); + values.AddSpellMod(SPELLVALUE_BASE_POINT1, AURA_REMOVE_BY_ENEMY_SPELL); // add as marker (spell has no effect 1) + GetTarget()->CastCustomSpell(SPELL_NECROTIC_PLAGUE_JUMP, values, NULL, TRIGGERED_FULL_MASK, nullptr, nullptr, GetCasterGUID()); + if (Unit* caster = GetCaster()) + caster->CastSpell(caster, SPELL_PLAGUE_SIPHON, true); + + Remove(AURA_REMOVE_BY_ENEMY_SPELL); + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_the_lich_king_necrotic_plague_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + AfterEffectRemove += AuraEffectRemoveFn(spell_the_lich_king_necrotic_plague_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_the_lich_king_necrotic_plague_AuraScript::OnDispel, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAPPLY); + AfterEffectApply += AuraEffectApplyFn(spell_the_lich_king_necrotic_plague_AuraScript::AfterDispel, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAPPLY); + } + + int32 _lastAmount; + }; + + SpellScript* GetSpellScript() const + { + return new spell_the_lich_king_necrotic_plague_SpellScript(); + } + + AuraScript* GetAuraScript() const + { + return new spell_the_lich_king_necrotic_plague_AuraScript(); + } }; class spell_the_lich_king_shadow_trap_visual : public SpellScriptLoader { - public: - spell_the_lich_king_shadow_trap_visual() : SpellScriptLoader("spell_the_lich_king_shadow_trap_visual") { } +public: + spell_the_lich_king_shadow_trap_visual() : SpellScriptLoader("spell_the_lich_king_shadow_trap_visual") { } - class spell_the_lich_king_shadow_trap_visual_AuraScript : public AuraScript + class spell_the_lich_king_shadow_trap_visual_AuraScript : public AuraScript + { + PrepareAuraScript(spell_the_lich_king_shadow_trap_visual_AuraScript); + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_the_lich_king_shadow_trap_visual_AuraScript); - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE) - GetTarget()->CastSpell(GetTarget(), SPELL_SHADOW_TRAP_AURA, TRIGGERED_NONE); - } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_the_lich_king_shadow_trap_visual_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_the_lich_king_shadow_trap_visual_AuraScript(); + if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE) + GetTarget()->CastSpell(GetTarget(), SPELL_SHADOW_TRAP_AURA, TRIGGERED_NONE); } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_the_lich_king_shadow_trap_visual_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_the_lich_king_shadow_trap_visual_AuraScript(); + } }; class spell_the_lich_king_shadow_trap_periodic : public SpellScriptLoader { - public: - spell_the_lich_king_shadow_trap_periodic() : SpellScriptLoader("spell_the_lich_king_shadow_trap_periodic") { } +public: + spell_the_lich_king_shadow_trap_periodic() : SpellScriptLoader("spell_the_lich_king_shadow_trap_periodic") { } - class spell_the_lich_king_shadow_trap_periodic_SpellScript : public SpellScript + class spell_the_lich_king_shadow_trap_periodic_SpellScript : public SpellScript + { + PrepareSpellScript(spell_the_lich_king_shadow_trap_periodic_SpellScript); + + void CheckTargetCount(std::list& targets) { - PrepareSpellScript(spell_the_lich_king_shadow_trap_periodic_SpellScript); + if (targets.empty()) + return; - void CheckTargetCount(std::list& targets) - { - if (targets.empty()) - return; + GetCaster()->CastSpell((Unit*)NULL, SPELL_SHADOW_TRAP_KNOCKBACK, true); + if (Aura* a = GetCaster()->GetAura(SPELL_SHADOW_TRAP_AURA)) + a->SetDuration(0); + if (GetCaster()->GetTypeId() == TYPEID_UNIT) + GetCaster()->ToCreature()->DespawnOrUnsummon(3000); - GetCaster()->CastSpell((Unit*)NULL, SPELL_SHADOW_TRAP_KNOCKBACK, true); - if (Aura* a = GetCaster()->GetAura(SPELL_SHADOW_TRAP_AURA)) - a->SetDuration(0); - if (GetCaster()->GetTypeId() == TYPEID_UNIT) - GetCaster()->ToCreature()->DespawnOrUnsummon(3000); - - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_shadow_trap_periodic_SpellScript::CheckTargetCount, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_the_lich_king_shadow_trap_periodic_SpellScript(); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_shadow_trap_periodic_SpellScript::CheckTargetCount, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_the_lich_king_shadow_trap_periodic_SpellScript(); + } }; class spell_the_lich_king_ice_burst_target_search : public SpellScriptLoader { - public: - spell_the_lich_king_ice_burst_target_search() : SpellScriptLoader("spell_the_lich_king_ice_burst_target_search") { } +public: + spell_the_lich_king_ice_burst_target_search() : SpellScriptLoader("spell_the_lich_king_ice_burst_target_search") { } - class spell_the_lich_king_ice_burst_target_search_SpellScript : public SpellScript + class spell_the_lich_king_ice_burst_target_search_SpellScript : public SpellScript + { + PrepareSpellScript(spell_the_lich_king_ice_burst_target_search_SpellScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareSpellScript(spell_the_lich_king_ice_burst_target_search_SpellScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_ICE_BURST)) - return false; - return true; - } - - void CheckTargetCount(std::list& unitList) - { - if (unitList.empty()) - return; - - if (GetCaster()->GetTypeId() == TYPEID_UNIT) - GetCaster()->ToCreature()->AI()->DoAction(-1); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_ice_burst_target_search_SpellScript::CheckTargetCount, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_the_lich_king_ice_burst_target_search_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_ICE_BURST)) + return false; + return true; } + + void CheckTargetCount(std::list& unitList) + { + if (unitList.empty()) + return; + + if (GetCaster()->GetTypeId() == TYPEID_UNIT) + GetCaster()->ToCreature()->AI()->DoAction(-1); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_ice_burst_target_search_SpellScript::CheckTargetCount, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_the_lich_king_ice_burst_target_search_SpellScript(); + } }; class npc_icc_ice_sphere : public CreatureScript { - public: - npc_icc_ice_sphere() : CreatureScript("npc_icc_ice_sphere") { } +public: + npc_icc_ice_sphere() : CreatureScript("npc_icc_ice_sphere") { } - struct npc_icc_ice_sphereAI : public ScriptedAI + struct npc_icc_ice_sphereAI : public ScriptedAI + { + npc_icc_ice_sphereAI(Creature* creature) : ScriptedAI(creature) { - npc_icc_ice_sphereAI(Creature* creature) : ScriptedAI(creature) + targetGUID = 0; + timer = 250; + me->SetReactState(REACT_PASSIVE); + } + + uint64 targetGUID; + uint16 timer; + + void DoAction(int32 a) + { + if (a == -1) { + me->RemoveAllAuras(); + me->CastSpell(me, SPELL_ICE_BURST, true); + me->DespawnOrUnsummon(1000); targetGUID = 0; - timer = 250; - me->SetReactState(REACT_PASSIVE); - } - - uint64 targetGUID; - uint16 timer; - - void DoAction(int32 a) - { - if (a == -1) - { - me->RemoveAllAuras(); - me->CastSpell(me, SPELL_ICE_BURST, true); - me->DespawnOrUnsummon(1000); - targetGUID = 0; - timer = 9999; - me->InterruptNonMeleeSpells(true); - me->AttackStop(); - me->GetMotionMaster()->Clear(); - me->StopMoving(); - } - } - - void SelectNewTarget() - { - if (!me->HasAura(SPELL_ICE_SPHERE)) - me->CastSpell(me, SPELL_ICE_SPHERE, true); - targetGUID = 0; + timer = 9999; me->InterruptNonMeleeSpells(true); me->AttackStop(); me->GetMotionMaster()->Clear(); me->StopMoving(); - if (Player* p = ScriptedAI::SelectTargetFromPlayerList(120.0f, SPELL_ICE_PULSE, false)) - { - targetGUID = p->GetGUID(); - me->CastSpell(p, SPELL_ICE_PULSE, false); - me->ClearUnitState(UNIT_STATE_CASTING); - me->Attack(p, true); - me->GetMotionMaster()->MoveFollow(p, 0.01f, 0.0f); - } } - - void UpdateAI(uint32 diff) - { - if (timer > diff) - { - timer -= diff; - return; - } - timer = 1000; - - if (!targetGUID || !me->GetVictim() || !me->IsNonMeleeSpellCast(false, false, true, false, true)) - SelectNewTarget(); - else - { - Unit* target = ObjectAccessor::GetUnit(*me, targetGUID); - if (me->GetVictim()->GetGUID() != targetGUID || !target || !me->IsValidAttackTarget(target) || target->HasFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH) || target->GetExactDist2dSq(&CenterPosition) > 75.0f*75.0f || target->GetPositionZ() < 830.0f || target->GetPositionZ() > 855.0f) - SelectNewTarget(); - } - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); } + + void SelectNewTarget() + { + if (!me->HasAura(SPELL_ICE_SPHERE)) + me->CastSpell(me, SPELL_ICE_SPHERE, true); + targetGUID = 0; + me->InterruptNonMeleeSpells(true); + me->AttackStop(); + me->GetMotionMaster()->Clear(); + me->StopMoving(); + if (Player* p = ScriptedAI::SelectTargetFromPlayerList(120.0f, SPELL_ICE_PULSE, false)) + { + targetGUID = p->GetGUID(); + me->CastSpell(p, SPELL_ICE_PULSE, false); + me->ClearUnitState(UNIT_STATE_CASTING); + me->Attack(p, true); + me->GetMotionMaster()->MoveFollow(p, 0.01f, 0.0f); + } + } + + void UpdateAI(uint32 diff) + { + if (timer > diff) + { + timer -= diff; + return; + } + timer = 1000; + + if (!targetGUID || !me->GetVictim() || !me->IsNonMeleeSpellCast(false, false, true, false, true)) + SelectNewTarget(); + else + { + Unit* target = ObjectAccessor::GetUnit(*me, targetGUID); + if (me->GetVictim()->GetGUID() != targetGUID || !target || !me->IsValidAttackTarget(target) || target->HasFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH) || target->GetExactDist2dSq(&CenterPosition) > 75.0f * 75.0f || target->GetPositionZ() < 830.0f || target->GetPositionZ() > 855.0f) + SelectNewTarget(); + } + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class spell_the_lich_king_raging_spirit : public SpellScriptLoader { - public: - spell_the_lich_king_raging_spirit() : SpellScriptLoader("spell_the_lich_king_raging_spirit") { } +public: + spell_the_lich_king_raging_spirit() : SpellScriptLoader("spell_the_lich_king_raging_spirit") { } - class spell_the_lich_king_raging_spirit_SpellScript : public SpellScript + class spell_the_lich_king_raging_spirit_SpellScript : public SpellScript + { + PrepareSpellScript(spell_the_lich_king_raging_spirit_SpellScript); + + void HandleScript(SpellEffIndex effIndex) { - PrepareSpellScript(spell_the_lich_king_raging_spirit_SpellScript); - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - target->CastSpell(target, uint32(GetEffectValue()), true, 0, 0, target->GetGUID()); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_the_lich_king_raging_spirit_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_the_lich_king_raging_spirit_SpellScript(); + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) + target->CastSpell(target, uint32(GetEffectValue()), true, 0, 0, target->GetGUID()); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_the_lich_king_raging_spirit_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_the_lich_king_raging_spirit_SpellScript(); + } }; class npc_raging_spirit : public CreatureScript { - public: - npc_raging_spirit() : CreatureScript("npc_raging_spirit") { } +public: + npc_raging_spirit() : CreatureScript("npc_raging_spirit") { } - struct npc_raging_spiritAI : public ScriptedAI + struct npc_raging_spiritAI : public ScriptedAI + { + npc_raging_spiritAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { - npc_raging_spiritAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) - { - me->SetControlled(true, UNIT_STATE_ROOT); - } - - void Reset() - { - _events.Reset(); - _events.ScheduleEvent(EVENT_RAGING_SPIRIT_UNROOT, 3000); - _events.ScheduleEvent(EVENT_SOUL_SHRIEK, urand(12000, 15000)); - - bool valid = false; - me->CastSpell(me, SPELL_RAGING_SPIRIT_VISUAL, true); - if (TempSummon* summon = me->ToTempSummon()) - if (Unit* summoner = summon->GetSummoner()) - if (summoner->GetTypeId() == TYPEID_PLAYER && summoner->IsAlive() && !summoner->ToPlayer()->IsBeingTeleported() && summoner->FindMap() == me->GetMap()) - { - valid = true; - summoner->CastSpell(me, SPELL_RAGING_SPIRIT_VISUAL_CLONE, true); - } - if (!valid) - { - if (Player* plr = ScriptedAI::SelectTargetFromPlayerList(100.0f, 0, true)) - plr->CastSpell(me, SPELL_RAGING_SPIRIT_VISUAL_CLONE, true); - else - me->DespawnOrUnsummon(1); - } - } - - void IsSummonedBy(Unit* /*summoner*/) - { - // player is the spellcaster so register summon manually - if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) - lichKing->AI()->JustSummoned(me); - } - - void JustDied(Unit* /*killer*/) - { - if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) - lichKing->AI()->SummonedCreatureDespawn(me); - if (TempSummon* summon = me->ToTempSummon()) - { - summon->SetTimer(5000); - summon->SetTempSummonType(TEMPSUMMON_TIMED_DESPAWN); - } - } - - void AttackStart(Unit* who) - { - if (!me->HasUnitState(UNIT_STATE_ROOT)) - ScriptedAI::AttackStart(who); - } - - void UpdateAI(uint32 diff) - { - UpdateVictim(); - - _events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (_events.ExecuteEvent()) - { - case EVENT_RAGING_SPIRIT_UNROOT: - { - me->SetControlled(false, UNIT_STATE_ROOT); - - if (!me->getThreatManager().isThreatListEmpty()) - if (Unit* target = me->SelectVictim()) - AttackStart(target); - if (!me->GetVictim()) - { - bool valid = false; - if (TempSummon* summon = me->ToTempSummon()) - if (Unit* summoner = summon->GetSummoner()) - if (summoner->GetTypeId() == TYPEID_PLAYER && summoner->IsAlive() && !summoner->ToPlayer()->IsBeingTeleported() && summoner->FindMap() == me->GetMap()) - { - valid = true; - AttackStart(summoner); - } - if (!valid) - if (Player* plr = ScriptedAI::SelectTargetFromPlayerList(100.0f, 0, true)) - AttackStart(plr); - } - DoZoneInCombat(nullptr, 150.0f); - } - break; - case EVENT_SOUL_SHRIEK: - if (!me->HasReactState(REACT_PASSIVE)) - me->CastSpell(me->GetVictim(), SPELL_SOUL_SHRIEK, false); - _events.ScheduleEvent(EVENT_SOUL_SHRIEK, urand(12000, 15000)); - break; - default: - break; - } - - if (!me->HasUnitState(UNIT_STATE_ROOT)) - DoMeleeAttackIfReady(); - } - - bool CanAIAttack(Unit const* target) const - { - return IsValidPlatformTarget(target) && !target->GetVehicle(); - } - - private: - EventMap _events; - InstanceScript* _instance; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + me->SetControlled(true, UNIT_STATE_ROOT); } + + void Reset() + { + _events.Reset(); + _events.ScheduleEvent(EVENT_RAGING_SPIRIT_UNROOT, 3000); + _events.ScheduleEvent(EVENT_SOUL_SHRIEK, urand(12000, 15000)); + + bool valid = false; + me->CastSpell(me, SPELL_RAGING_SPIRIT_VISUAL, true); + if (TempSummon* summon = me->ToTempSummon()) + if (Unit* summoner = summon->GetSummoner()) + if (summoner->GetTypeId() == TYPEID_PLAYER && summoner->IsAlive() && !summoner->ToPlayer()->IsBeingTeleported() && summoner->FindMap() == me->GetMap()) + { + valid = true; + summoner->CastSpell(me, SPELL_RAGING_SPIRIT_VISUAL_CLONE, true); + } + if (!valid) + { + if (Player* plr = ScriptedAI::SelectTargetFromPlayerList(100.0f, 0, true)) + plr->CastSpell(me, SPELL_RAGING_SPIRIT_VISUAL_CLONE, true); + else + me->DespawnOrUnsummon(1); + } + } + + void IsSummonedBy(Unit* /*summoner*/) + { + // player is the spellcaster so register summon manually + if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) + lichKing->AI()->JustSummoned(me); + } + + void JustDied(Unit* /*killer*/) + { + if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) + lichKing->AI()->SummonedCreatureDespawn(me); + if (TempSummon* summon = me->ToTempSummon()) + { + summon->SetTimer(5000); + summon->SetTempSummonType(TEMPSUMMON_TIMED_DESPAWN); + } + } + + void AttackStart(Unit* who) + { + if (!me->HasUnitState(UNIT_STATE_ROOT)) + ScriptedAI::AttackStart(who); + } + + void UpdateAI(uint32 diff) + { + UpdateVictim(); + + _events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (_events.ExecuteEvent()) + { + case EVENT_RAGING_SPIRIT_UNROOT: + { + me->SetControlled(false, UNIT_STATE_ROOT); + + if (!me->getThreatManager().isThreatListEmpty()) + if (Unit* target = me->SelectVictim()) + AttackStart(target); + if (!me->GetVictim()) + { + bool valid = false; + if (TempSummon* summon = me->ToTempSummon()) + if (Unit* summoner = summon->GetSummoner()) + if (summoner->GetTypeId() == TYPEID_PLAYER && summoner->IsAlive() && !summoner->ToPlayer()->IsBeingTeleported() && summoner->FindMap() == me->GetMap()) + { + valid = true; + AttackStart(summoner); + } + if (!valid) + if (Player* plr = ScriptedAI::SelectTargetFromPlayerList(100.0f, 0, true)) + AttackStart(plr); + } + DoZoneInCombat(nullptr, 150.0f); + } + break; + case EVENT_SOUL_SHRIEK: + if (!me->HasReactState(REACT_PASSIVE)) + me->CastSpell(me->GetVictim(), SPELL_SOUL_SHRIEK, false); + _events.ScheduleEvent(EVENT_SOUL_SHRIEK, urand(12000, 15000)); + break; + default: + break; + } + + if (!me->HasUnitState(UNIT_STATE_ROOT)) + DoMeleeAttackIfReady(); + } + + bool CanAIAttack(Unit const* target) const + { + return IsValidPlatformTarget(target) && !target->GetVehicle(); + } + + private: + EventMap _events; + InstanceScript* _instance; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class VehicleCheck @@ -2436,149 +2438,149 @@ public: class spell_the_lich_king_defile : public SpellScriptLoader { - public: - spell_the_lich_king_defile() : SpellScriptLoader("spell_the_lich_king_defile") { } +public: + spell_the_lich_king_defile() : SpellScriptLoader("spell_the_lich_king_defile") { } - class spell_the_lich_king_defile_SpellScript : public SpellScript + class spell_the_lich_king_defile_SpellScript : public SpellScript + { + PrepareSpellScript(spell_the_lich_king_defile_SpellScript); + + void CorrectRange(std::list& targets) { - PrepareSpellScript(spell_the_lich_king_defile_SpellScript); - - void CorrectRange(std::list& targets) - { - targets.remove_if(VehicleCheck()); - targets.remove_if(acore::AllWorldObjectsInExactRange(GetCaster(), 10.0f * GetCaster()->GetFloatValue(OBJECT_FIELD_SCALE_X), true)); - uint32 strangulatedAura[4] = {68980, 74325, 74296, 74297}; - targets.remove_if(acore::UnitAuraCheck(true, strangulatedAura[GetCaster()->GetMap()->GetDifficulty()])); - } - - void ChangeDamageAndGrow() - { - SetHitDamage(int32(GetHitDamage() * GetCaster()->GetFloatValue(OBJECT_FIELD_SCALE_X))); - // HACK: target player should cast this spell on defile - // however with current aura handling auras cast by different units - // cannot stack on the same aura object increasing the stack count - GetCaster()->CastSpell(GetCaster(), SPELL_DEFILE_GROW, true); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_defile_SpellScript::CorrectRange, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_defile_SpellScript::CorrectRange, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); - OnHit += SpellHitFn(spell_the_lich_king_defile_SpellScript::ChangeDamageAndGrow); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_the_lich_king_defile_SpellScript(); + targets.remove_if(VehicleCheck()); + targets.remove_if(acore::AllWorldObjectsInExactRange(GetCaster(), 10.0f * GetCaster()->GetFloatValue(OBJECT_FIELD_SCALE_X), true)); + uint32 strangulatedAura[4] = {68980, 74325, 74296, 74297}; + targets.remove_if(acore::UnitAuraCheck(true, strangulatedAura[GetCaster()->GetMap()->GetDifficulty()])); } + + void ChangeDamageAndGrow() + { + SetHitDamage(int32(GetHitDamage() * GetCaster()->GetFloatValue(OBJECT_FIELD_SCALE_X))); + // HACK: target player should cast this spell on defile + // however with current aura handling auras cast by different units + // cannot stack on the same aura object increasing the stack count + GetCaster()->CastSpell(GetCaster(), SPELL_DEFILE_GROW, true); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_defile_SpellScript::CorrectRange, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_defile_SpellScript::CorrectRange, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); + OnHit += SpellHitFn(spell_the_lich_king_defile_SpellScript::ChangeDamageAndGrow); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_the_lich_king_defile_SpellScript(); + } }; class spell_the_lich_king_soul_reaper : public SpellScriptLoader { - public: - spell_the_lich_king_soul_reaper() : SpellScriptLoader("spell_the_lich_king_soul_reaper") { } +public: + spell_the_lich_king_soul_reaper() : SpellScriptLoader("spell_the_lich_king_soul_reaper") { } - class spell_the_lich_king_soul_reaper_AuraScript : public AuraScript + class spell_the_lich_king_soul_reaper_AuraScript : public AuraScript + { + PrepareAuraScript(spell_the_lich_king_soul_reaper_AuraScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareAuraScript(spell_the_lich_king_soul_reaper_AuraScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_SOUL_REAPER_BUFF)) - return false; - return true; - } - - void OnPeriodic(AuraEffect const* /*aurEff*/) - { - if (Unit* caster = GetCaster()) - GetTarget()->CastSpell(caster, SPELL_SOUL_REAPER_BUFF, true); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_the_lich_king_soul_reaper_AuraScript::OnPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_the_lich_king_soul_reaper_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_SOUL_REAPER_BUFF)) + return false; + return true; } + + void OnPeriodic(AuraEffect const* /*aurEff*/) + { + if (Unit* caster = GetCaster()) + GetTarget()->CastSpell(caster, SPELL_SOUL_REAPER_BUFF, true); + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_the_lich_king_soul_reaper_AuraScript::OnPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_the_lich_king_soul_reaper_AuraScript(); + } }; class npc_valkyr_shadowguard : public CreatureScript { - public: - npc_valkyr_shadowguard() : CreatureScript("npc_valkyr_shadowguard") { } +public: + npc_valkyr_shadowguard() : CreatureScript("npc_valkyr_shadowguard") { } - struct npc_valkyr_shadowguardAI : public NullCreatureAI + struct npc_valkyr_shadowguardAI : public NullCreatureAI + { + npc_valkyr_shadowguardAI(Creature* creature) : NullCreatureAI(creature), _grabbedPlayer(0), didbelow50pct(false), dropped(false), _instance(creature->GetInstanceScript()) { - npc_valkyr_shadowguardAI(Creature* creature) : NullCreatureAI(creature), _grabbedPlayer(0), didbelow50pct(false), dropped(false), _instance(creature->GetInstanceScript()) + me->SetReactState(REACT_PASSIVE); + me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true); + me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, true); + _events.Reset(); + _events.ScheduleEvent(EVENT_GRAB_PLAYER, 2500); + me->SetWalk(false); + } + + EventMap _events; + Position _destPoint; + uint64 _grabbedPlayer; + bool didbelow50pct; + bool dropped; + InstanceScript* _instance; + + bool IsHeroic() { return me->GetMap()->IsHeroic(); } + + void GoSiphon() + { + didbelow50pct = true; + me->CastSpell((Unit*)NULL, SPELL_EJECT_ALL_PASSENGERS, false); + float dist = rand_norm() * 10.0f + 5.0f; + float angle = CenterPosition.GetAngle(me); + _destPoint.Relocate(CenterPosition.GetPositionX() + dist * cos(angle), CenterPosition.GetPositionY() + dist * sin(angle), 855.0f + frand(0.0f, 4.0f), 0.0f); + me->SetHomePosition(_destPoint); + _events.Reset(); + _events.ScheduleEvent(EVENT_MOVE_TO_SIPHON_POS, 0); + } + + void OnCharmed(bool /*apply*/) {} + + void PassengerBoarded(Unit* pass, int8 /*seat*/, bool apply) + { + if (apply) { - me->SetReactState(REACT_PASSIVE); - me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true); - me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, true); - _events.Reset(); - _events.ScheduleEvent(EVENT_GRAB_PLAYER, 2500); - me->SetWalk(false); + //pass->ClearUnitState(UNIT_STATE_ONVEHICLE); + return; } + pass->RemoveAurasDueToSpell(VEHICLE_SPELL_PARACHUTE); + if (didbelow50pct || dropped) + return; + if (IsHeroic()) + GoSiphon(); + else + me->DespawnOrUnsummon(1000); + } - EventMap _events; - Position _destPoint; - uint64 _grabbedPlayer; - bool didbelow50pct; - bool dropped; - InstanceScript* _instance; + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) + { + if (IsHeroic() && !didbelow50pct && !dropped && me->HealthBelowPctDamaged(50, damage)) + GoSiphon(); + } - bool IsHeroic() { return me->GetMap()->IsHeroic(); } + void MovementInform(uint32 type, uint32 id) + { + if (type != POINT_MOTION_TYPE) + return; - void GoSiphon() + switch (id) { - didbelow50pct = true; - me->CastSpell((Unit*)NULL, SPELL_EJECT_ALL_PASSENGERS, false); - float dist = rand_norm()*10.0f + 5.0f; - float angle = CenterPosition.GetAngle(me); - _destPoint.Relocate(CenterPosition.GetPositionX()+dist*cos(angle), CenterPosition.GetPositionY()+dist*sin(angle), 855.0f+frand(0.0f, 4.0f), 0.0f); - me->SetHomePosition(_destPoint); - _events.Reset(); - _events.ScheduleEvent(EVENT_MOVE_TO_SIPHON_POS, 0); - } - - void OnCharmed(bool /*apply*/) {} - - void PassengerBoarded(Unit* pass, int8 /*seat*/, bool apply) - { - if (apply) - { - //pass->ClearUnitState(UNIT_STATE_ONVEHICLE); - return; - } - pass->RemoveAurasDueToSpell(VEHICLE_SPELL_PARACHUTE); - if (didbelow50pct || dropped) - return; - if (IsHeroic()) - GoSiphon(); - else - me->DespawnOrUnsummon(1000); - } - - void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) - { - if (IsHeroic() && !didbelow50pct && !dropped && me->HealthBelowPctDamaged(50, damage)) - GoSiphon(); - } - - void MovementInform(uint32 type, uint32 id) - { - if (type != POINT_MOTION_TYPE) - return; - - switch (id) - { - case EVENT_CHARGE: - { + case EVENT_CHARGE: + { bool valid = false; if (Player* target = ObjectAccessor::GetPlayer(*me, _grabbedPlayer)) if (target->FindMap() == me->GetMap() && target->GetExactDist(me) < 15.0f && !target->GetVehicle()) @@ -2608,1178 +2610,1184 @@ class npc_valkyr_shadowguard : public CreatureScript _events.ScheduleEvent(EVENT_GRAB_PLAYER, 500); _grabbedPlayer = 0; } - } - break; - case POINT_DROP_PLAYER: - { - if (didbelow50pct || dropped) - break; - if (me->GetExactDist(&_destPoint) > 1.5f) // movement was interrupted (probably by a stun, start again) - { - _events.Reset(); - _events.ScheduleEvent(EVENT_MOVE_TO_DROP_POS, 0); - break; - } - dropped = true; - _events.Reset(); - /*Player* p = nullptr; - if (Vehicle* v = me->GetVehicleKit()) - if (Unit* passenger = v->GetPassenger(0)) - p = passenger->ToPlayer();*/ - me->CastSpell((Unit*)NULL, SPELL_EJECT_ALL_PASSENGERS, false); - - if (IsHeroic()) - GoSiphon(); - else - me->DespawnOrUnsummon(1000); - } - break; - case POINT_START_SIPHON: + } + break; + case POINT_DROP_PLAYER: + { + if (didbelow50pct || dropped) + break; if (me->GetExactDist(&_destPoint) > 1.5f) // movement was interrupted (probably by a stun, start again) { _events.Reset(); - _events.ScheduleEvent(EVENT_MOVE_TO_SIPHON_POS, 0); + _events.ScheduleEvent(EVENT_MOVE_TO_DROP_POS, 0); break; } - me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false); - me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, false); - _events.ScheduleEvent(EVENT_LIFE_SIPHON, 2000); + dropped = true; + _events.Reset(); + /*Player* p = nullptr; + if (Vehicle* v = me->GetVehicleKit()) + if (Unit* passenger = v->GetPassenger(0)) + p = passenger->ToPlayer();*/ + me->CastSpell((Unit*)NULL, SPELL_EJECT_ALL_PASSENGERS, false); + + if (IsHeroic()) + GoSiphon(); + else + me->DespawnOrUnsummon(1000); + } + break; + case POINT_START_SIPHON: + if (me->GetExactDist(&_destPoint) > 1.5f) // movement was interrupted (probably by a stun, start again) + { + _events.Reset(); + _events.ScheduleEvent(EVENT_MOVE_TO_SIPHON_POS, 0); break; - } + } + me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false); + me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, false); + _events.ScheduleEvent(EVENT_LIFE_SIPHON, 2000); + break; } - - void SetGUID(uint64 guid, int32 /* = 0*/) - { - _grabbedPlayer = guid; - } - - void UpdateAI(uint32 diff) - { - _events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING | UNIT_STATE_STUNNED)) - return; - - switch (_events.ExecuteEvent()) - { - case EVENT_GRAB_PLAYER: - if (!_grabbedPlayer) - { - me->CastSpell((Unit*)NULL, SPELL_VALKYR_TARGET_SEARCH, false); - _events.ScheduleEvent(EVENT_GRAB_PLAYER, 2000); - } - break; - case EVENT_MOVE_TO_DROP_POS: - me->AddUnitState(UNIT_STATE_NO_ENVIRONMENT_UPD); - me->SetDisableGravity(false); - me->SetHover(false); - me->SetCanFly(false); - me->GetMotionMaster()->MovePoint(POINT_DROP_PLAYER, _destPoint, false); - me->SetDisableGravity(true, true); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - break; - case EVENT_MOVE_TO_SIPHON_POS: - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); // just in case if passenger disappears so quickly that EVENT_MOVE_TO_DROP_POS is never executed - { int32 bp0 = 80; me->CastCustomSpell(me, 1557, &bp0, nullptr, nullptr, true); } - me->SetDisableGravity(true); - me->SetHover(true); - me->SetCanFly(true); - me->SendMovementFlagUpdate(); - me->GetMotionMaster()->MovePoint(POINT_START_SIPHON, _destPoint); - break; - case EVENT_LIFE_SIPHON: - { - Unit* target = nullptr; - Unit::AuraEffectList const& tauntAuras = me->GetAuraEffectsByType(SPELL_AURA_MOD_TAUNT); - if (!tauntAuras.empty()) - for (Unit::AuraEffectList::const_reverse_iterator itr = tauntAuras.rbegin(); itr != tauntAuras.rend(); ++itr) - if (Unit* caster = (*itr)->GetCaster()) - if (me->IsValidAttackTarget(caster)) - { - target = caster; - break; - } - if (!target) - if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) - target = lichKing->AI()->SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankLKTargetSelector(lichKing, true, false, 100.0f)); - if (target) - me->CastSpell(target, SPELL_LIFE_SIPHON, false); - _events.ScheduleEvent(EVENT_LIFE_SIPHON, 2500); - } - break; - default: - break; - } - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); } + + void SetGUID(uint64 guid, int32 /* = 0*/) + { + _grabbedPlayer = guid; + } + + void UpdateAI(uint32 diff) + { + _events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING | UNIT_STATE_STUNNED)) + return; + + switch (_events.ExecuteEvent()) + { + case EVENT_GRAB_PLAYER: + if (!_grabbedPlayer) + { + me->CastSpell((Unit*)NULL, SPELL_VALKYR_TARGET_SEARCH, false); + _events.ScheduleEvent(EVENT_GRAB_PLAYER, 2000); + } + break; + case EVENT_MOVE_TO_DROP_POS: + me->AddUnitState(UNIT_STATE_NO_ENVIRONMENT_UPD); + me->SetDisableGravity(false); + me->SetHover(false); + me->SetCanFly(false); + me->GetMotionMaster()->MovePoint(POINT_DROP_PLAYER, _destPoint, false); + me->SetDisableGravity(true, true); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + break; + case EVENT_MOVE_TO_SIPHON_POS: + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); // just in case if passenger disappears so quickly that EVENT_MOVE_TO_DROP_POS is never executed + { int32 bp0 = 80; me->CastCustomSpell(me, 1557, &bp0, nullptr, nullptr, true); } + me->SetDisableGravity(true); + me->SetHover(true); + me->SetCanFly(true); + me->SendMovementFlagUpdate(); + me->GetMotionMaster()->MovePoint(POINT_START_SIPHON, _destPoint); + break; + case EVENT_LIFE_SIPHON: + { + Unit* target = nullptr; + Unit::AuraEffectList const& tauntAuras = me->GetAuraEffectsByType(SPELL_AURA_MOD_TAUNT); + if (!tauntAuras.empty()) + for (Unit::AuraEffectList::const_reverse_iterator itr = tauntAuras.rbegin(); itr != tauntAuras.rend(); ++itr) + if (Unit* caster = (*itr)->GetCaster()) + if (me->IsValidAttackTarget(caster)) + { + target = caster; + break; + } + if (!target) + if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) + target = lichKing->AI()->SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankLKTargetSelector(lichKing, true, false, 100.0f)); + if (target) + me->CastSpell(target, SPELL_LIFE_SIPHON, false); + _events.ScheduleEvent(EVENT_LIFE_SIPHON, 2500); + } + break; + default: + break; + } + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class spell_the_lich_king_summon_into_air : public SpellScriptLoader { - public: - spell_the_lich_king_summon_into_air() : SpellScriptLoader("spell_the_lich_king_summon_into_air") { } +public: + spell_the_lich_king_summon_into_air() : SpellScriptLoader("spell_the_lich_king_summon_into_air") { } - class spell_the_lich_king_summon_into_air_SpellScript : public SpellScript + class spell_the_lich_king_summon_into_air_SpellScript : public SpellScript + { + PrepareSpellScript(spell_the_lich_king_summon_into_air_SpellScript); + + void ModDestHeight(SpellEffIndex effIndex) { - PrepareSpellScript(spell_the_lich_king_summon_into_air_SpellScript); - - void ModDestHeight(SpellEffIndex effIndex) + float addZ; + switch (GetSpellInfo()->Effects[effIndex].MiscValue) { - float addZ; - switch (GetSpellInfo()->Effects[effIndex].MiscValue) - { - case NPC_SPIRIT_BOMB: addZ = 30.0f; break; - case NPC_VILE_SPIRIT: addZ = 13.0f; break; - default: addZ = 15.0f; break; - } - Position const offset = {0.0f, 0.0f, addZ, 0.0f}; - WorldLocation* dest = const_cast(GetExplTargetDest()); - dest->RelocateOffset(offset); - GetHitDest()->RelocateOffset(offset); + case NPC_SPIRIT_BOMB: + addZ = 30.0f; + break; + case NPC_VILE_SPIRIT: + addZ = 13.0f; + break; + default: + addZ = 15.0f; + break; } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_the_lich_king_summon_into_air_SpellScript::ModDestHeight, EFFECT_0, SPELL_EFFECT_SUMMON); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_the_lich_king_summon_into_air_SpellScript(); + Position const offset = {0.0f, 0.0f, addZ, 0.0f}; + WorldLocation* dest = const_cast(GetExplTargetDest()); + dest->RelocateOffset(offset); + GetHitDest()->RelocateOffset(offset); } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_the_lich_king_summon_into_air_SpellScript::ModDestHeight, EFFECT_0, SPELL_EFFECT_SUMMON); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_the_lich_king_summon_into_air_SpellScript(); + } }; class spell_the_lich_king_teleport_to_frostmourne_hc : public SpellScriptLoader { - public: - spell_the_lich_king_teleport_to_frostmourne_hc() : SpellScriptLoader("spell_the_lich_king_teleport_to_frostmourne_hc") { } +public: + spell_the_lich_king_teleport_to_frostmourne_hc() : SpellScriptLoader("spell_the_lich_king_teleport_to_frostmourne_hc") { } - class spell_the_lich_king_teleport_to_frostmourne_hc_SpellScript : public SpellScript + class spell_the_lich_king_teleport_to_frostmourne_hc_SpellScript : public SpellScript + { + PrepareSpellScript(spell_the_lich_king_teleport_to_frostmourne_hc_SpellScript); + + void ModDest(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_the_lich_king_teleport_to_frostmourne_hc_SpellScript); - - void ModDest(SpellEffIndex /*effIndex*/) - { - float dist = 2.0f + rand_norm()*18.0f; - float angle = rand_norm()*2*M_PI; - Position const offset = {dist*cos(angle), dist*sin(angle), 0.0f, 0.0f}; - WorldLocation* dest = const_cast(GetExplTargetDest()); - dest->RelocateOffset(offset); - GetHitDest()->RelocateOffset(offset); - } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_the_lich_king_teleport_to_frostmourne_hc_SpellScript::ModDest, EFFECT_1, SPELL_EFFECT_TELEPORT_UNITS); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_the_lich_king_teleport_to_frostmourne_hc_SpellScript(); + float dist = 2.0f + rand_norm() * 18.0f; + float angle = rand_norm() * 2 * M_PI; + Position const offset = {dist * cos(angle), dist * sin(angle), 0.0f, 0.0f}; + WorldLocation* dest = const_cast(GetExplTargetDest()); + dest->RelocateOffset(offset); + GetHitDest()->RelocateOffset(offset); } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_the_lich_king_teleport_to_frostmourne_hc_SpellScript::ModDest, EFFECT_1, SPELL_EFFECT_TELEPORT_UNITS); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_the_lich_king_teleport_to_frostmourne_hc_SpellScript(); + } }; class spell_the_lich_king_valkyr_target_search : public SpellScriptLoader { - public: - spell_the_lich_king_valkyr_target_search() : SpellScriptLoader("spell_the_lich_king_valkyr_target_search") { } +public: + spell_the_lich_king_valkyr_target_search() : SpellScriptLoader("spell_the_lich_king_valkyr_target_search") { } - class spell_the_lich_king_valkyr_target_search_SpellScript : public SpellScript + class spell_the_lich_king_valkyr_target_search_SpellScript : public SpellScript + { + PrepareSpellScript(spell_the_lich_king_valkyr_target_search_SpellScript); + + WorldObject* _target; + + bool Load() { - PrepareSpellScript(spell_the_lich_king_valkyr_target_search_SpellScript); - - WorldObject* _target; - - bool Load() - { - _target = nullptr; - return true; - } - - void SelectTarget(std::list& targets) - { - if (targets.empty()) - return; - Creature* caster = GetCaster()->ToCreature(); - if (!caster) - { - targets.clear(); - return; - } - targets.remove_if(acore::UnitAuraCheck(true, GetSpellInfo()->Id)); - targets.remove_if(acore::UnitAuraCheck(true, SPELL_BOSS_HITTIN_YA_AURA)); // done in dbc, but just to be sure xd - targets.remove_if(acore::UnitAuraCheck(true, SPELL_HARVEST_SOUL_VALKYR)); - if (InstanceScript* _instance = caster->GetInstanceScript()) - if (Creature* lichKing = ObjectAccessor::GetCreature(*caster, _instance->GetData64(DATA_THE_LICH_KING))) - if (Spell* s = lichKing->GetCurrentSpell(CURRENT_GENERIC_SPELL)) - if (s->GetSpellInfo()->Id == SPELL_DEFILE && s->m_targets.GetUnitTarget()) - targets.remove(s->m_targets.GetUnitTarget()); - - if (targets.empty()) - return; - - _target = acore::Containers::SelectRandomContainerElement(targets); - targets.clear(); - targets.push_back(_target); - if (Creature* caster = GetCaster()->ToCreature()) - caster->AI()->SetGUID(_target->GetGUID()); - } - - void ReplaceTarget(std::list& targets) - { - targets.clear(); - if (_target) - targets.push_back(_target); - } - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - { - GetCaster()->GetMotionMaster()->MoveCharge(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ()+4.0f, 42.0f, EVENT_CHARGE); - GetCaster()->SetDisableGravity(true, true); - } - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_valkyr_target_search_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_valkyr_target_search_SpellScript::ReplaceTarget, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); - OnEffectHitTarget += SpellEffectFn(spell_the_lich_king_valkyr_target_search_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_the_lich_king_valkyr_target_search_SpellScript(); + _target = nullptr; + return true; } + + void SelectTarget(std::list& targets) + { + if (targets.empty()) + return; + Creature* caster = GetCaster()->ToCreature(); + if (!caster) + { + targets.clear(); + return; + } + targets.remove_if(acore::UnitAuraCheck(true, GetSpellInfo()->Id)); + targets.remove_if(acore::UnitAuraCheck(true, SPELL_BOSS_HITTIN_YA_AURA)); // done in dbc, but just to be sure xd + targets.remove_if(acore::UnitAuraCheck(true, SPELL_HARVEST_SOUL_VALKYR)); + if (InstanceScript* _instance = caster->GetInstanceScript()) + if (Creature* lichKing = ObjectAccessor::GetCreature(*caster, _instance->GetData64(DATA_THE_LICH_KING))) + if (Spell* s = lichKing->GetCurrentSpell(CURRENT_GENERIC_SPELL)) + if (s->GetSpellInfo()->Id == SPELL_DEFILE && s->m_targets.GetUnitTarget()) + targets.remove(s->m_targets.GetUnitTarget()); + + if (targets.empty()) + return; + + _target = acore::Containers::SelectRandomContainerElement(targets); + targets.clear(); + targets.push_back(_target); + if (Creature* caster = GetCaster()->ToCreature()) + caster->AI()->SetGUID(_target->GetGUID()); + } + + void ReplaceTarget(std::list& targets) + { + targets.clear(); + if (_target) + targets.push_back(_target); + } + + void HandleScript(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) + { + GetCaster()->GetMotionMaster()->MoveCharge(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ() + 4.0f, 42.0f, EVENT_CHARGE); + GetCaster()->SetDisableGravity(true, true); + } + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_valkyr_target_search_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_valkyr_target_search_SpellScript::ReplaceTarget, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_the_lich_king_valkyr_target_search_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_the_lich_king_valkyr_target_search_SpellScript(); + } }; class spell_the_lich_king_cast_back_to_caster : public SpellScriptLoader { - public: - spell_the_lich_king_cast_back_to_caster() : SpellScriptLoader("spell_the_lich_king_cast_back_to_caster") { } +public: + spell_the_lich_king_cast_back_to_caster() : SpellScriptLoader("spell_the_lich_king_cast_back_to_caster") { } - class spell_the_lich_king_cast_back_to_caster_SpellScript : public SpellScript + class spell_the_lich_king_cast_back_to_caster_SpellScript : public SpellScript + { + PrepareSpellScript(spell_the_lich_king_cast_back_to_caster_SpellScript); + + void HandleScript(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_the_lich_king_cast_back_to_caster_SpellScript); - - void HandleScript(SpellEffIndex /*effIndex*/) - { - GetHitUnit()->CastSpell(GetCaster(), uint32(GetEffectValue()), true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_the_lich_king_cast_back_to_caster_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_the_lich_king_cast_back_to_caster_SpellScript(); + GetHitUnit()->CastSpell(GetCaster(), uint32(GetEffectValue()), true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_the_lich_king_cast_back_to_caster_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_the_lich_king_cast_back_to_caster_SpellScript(); + } }; class spell_the_lich_king_life_siphon : public SpellScriptLoader { - public: - spell_the_lich_king_life_siphon() : SpellScriptLoader("spell_the_lich_king_life_siphon") { } +public: + spell_the_lich_king_life_siphon() : SpellScriptLoader("spell_the_lich_king_life_siphon") { } - class spell_the_lich_king_life_siphon_SpellScript : public SpellScript + class spell_the_lich_king_life_siphon_SpellScript : public SpellScript + { + PrepareSpellScript(spell_the_lich_king_life_siphon_SpellScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareSpellScript(spell_the_lich_king_life_siphon_SpellScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_LIFE_SIPHON_HEAL)) - return false; - return true; - } - - void TriggerHeal() - { - GetHitUnit()->CastCustomSpell(SPELL_LIFE_SIPHON_HEAL, SPELLVALUE_BASE_POINT0, GetHitDamage() * 10, GetCaster(), true); - } - - void Register() - { - AfterHit += SpellHitFn(spell_the_lich_king_life_siphon_SpellScript::TriggerHeal); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_the_lich_king_life_siphon_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_LIFE_SIPHON_HEAL)) + return false; + return true; } + + void TriggerHeal() + { + GetHitUnit()->CastCustomSpell(SPELL_LIFE_SIPHON_HEAL, SPELLVALUE_BASE_POINT0, GetHitDamage() * 10, GetCaster(), true); + } + + void Register() + { + AfterHit += SpellHitFn(spell_the_lich_king_life_siphon_SpellScript::TriggerHeal); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_the_lich_king_life_siphon_SpellScript(); + } }; class spell_the_lich_king_vile_spirits : public SpellScriptLoader { - public: - spell_the_lich_king_vile_spirits() : SpellScriptLoader("spell_the_lich_king_vile_spirits") { } +public: + spell_the_lich_king_vile_spirits() : SpellScriptLoader("spell_the_lich_king_vile_spirits") { } - class spell_the_lich_king_vile_spirits_AuraScript : public AuraScript + class spell_the_lich_king_vile_spirits_AuraScript : public AuraScript + { + PrepareAuraScript(spell_the_lich_king_vile_spirits_AuraScript); + + bool Load() { - PrepareAuraScript(spell_the_lich_king_vile_spirits_AuraScript); - - bool Load() - { - _is25Man = GetUnitOwner()->GetMap()->Is25ManRaid(); - return true; - } - - void OnPeriodic(AuraEffect const* aurEff) - { - if (_is25Man || ((aurEff->GetTickNumber() - 1) % 5)) - GetTarget()->CastSpell((Unit*)NULL, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true, NULL, aurEff, GetCasterGUID()); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_the_lich_king_vile_spirits_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - - bool _is25Man; - }; - - AuraScript* GetAuraScript() const - { - return new spell_the_lich_king_vile_spirits_AuraScript(); + _is25Man = GetUnitOwner()->GetMap()->Is25ManRaid(); + return true; } + + void OnPeriodic(AuraEffect const* aurEff) + { + if (_is25Man || ((aurEff->GetTickNumber() - 1) % 5)) + GetTarget()->CastSpell((Unit*)NULL, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true, NULL, aurEff, GetCasterGUID()); + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_the_lich_king_vile_spirits_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + + bool _is25Man; + }; + + AuraScript* GetAuraScript() const + { + return new spell_the_lich_king_vile_spirits_AuraScript(); + } }; class spell_the_lich_king_vile_spirits_visual : public SpellScriptLoader { - public: - spell_the_lich_king_vile_spirits_visual() : SpellScriptLoader("spell_the_lich_king_vile_spirits_visual") { } +public: + spell_the_lich_king_vile_spirits_visual() : SpellScriptLoader("spell_the_lich_king_vile_spirits_visual") { } - class spell_the_lich_king_vile_spirits_visual_SpellScript : public SpellScript + class spell_the_lich_king_vile_spirits_visual_SpellScript : public SpellScript + { + PrepareSpellScript(spell_the_lich_king_vile_spirits_visual_SpellScript); + + void ModDestHeight(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_the_lich_king_vile_spirits_visual_SpellScript); - - void ModDestHeight(SpellEffIndex /*effIndex*/) - { - Position offset = {0.0f, 0.0f, 15.0f, 0.0f}; - const_cast(GetExplTargetDest())->RelocateOffset(offset); - } - - void Register() - { - OnEffectLaunch += SpellEffectFn(spell_the_lich_king_vile_spirits_visual_SpellScript::ModDestHeight, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_the_lich_king_vile_spirits_visual_SpellScript(); + Position offset = {0.0f, 0.0f, 15.0f, 0.0f}; + const_cast(GetExplTargetDest())->RelocateOffset(offset); } + + void Register() + { + OnEffectLaunch += SpellEffectFn(spell_the_lich_king_vile_spirits_visual_SpellScript::ModDestHeight, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_the_lich_king_vile_spirits_visual_SpellScript(); + } }; class spell_the_lich_king_vile_spirit_move_target_search : public SpellScriptLoader { - public: - spell_the_lich_king_vile_spirit_move_target_search() : SpellScriptLoader("spell_the_lich_king_vile_spirit_move_target_search") { } +public: + spell_the_lich_king_vile_spirit_move_target_search() : SpellScriptLoader("spell_the_lich_king_vile_spirit_move_target_search") { } - class spell_the_lich_king_vile_spirit_move_target_search_SpellScript : public SpellScript + class spell_the_lich_king_vile_spirit_move_target_search_SpellScript : public SpellScript + { + PrepareSpellScript(spell_the_lich_king_vile_spirit_move_target_search_SpellScript); + + bool Load() { - PrepareSpellScript(spell_the_lich_king_vile_spirit_move_target_search_SpellScript); - - bool Load() - { - _target = nullptr; - return GetCaster()->GetTypeId() == TYPEID_UNIT; - } - - void SelectTarget(std::list& targets) - { - if (targets.empty()) - return; - - _target = acore::Containers::SelectRandomContainerElement(targets); - } - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (GetHitUnit() != _target) - return; - - GetCaster()->ToCreature()->SetInCombatWithZone(); - GetCaster()->ToCreature()->AI()->AttackStart(GetHitUnit()); - GetCaster()->AddThreat(GetHitUnit(), GetCaster()->GetMaxHealth()*0.2f); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_vile_spirit_move_target_search_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - OnEffectHitTarget += SpellEffectFn(spell_the_lich_king_vile_spirit_move_target_search_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - - WorldObject* _target; - }; - - SpellScript* GetSpellScript() const - { - return new spell_the_lich_king_vile_spirit_move_target_search_SpellScript(); + _target = nullptr; + return GetCaster()->GetTypeId() == TYPEID_UNIT; } + + void SelectTarget(std::list& targets) + { + if (targets.empty()) + return; + + _target = acore::Containers::SelectRandomContainerElement(targets); + } + + void HandleScript(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (GetHitUnit() != _target) + return; + + GetCaster()->ToCreature()->SetInCombatWithZone(); + GetCaster()->ToCreature()->AI()->AttackStart(GetHitUnit()); + GetCaster()->AddThreat(GetHitUnit(), GetCaster()->GetMaxHealth() * 0.2f); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_vile_spirit_move_target_search_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_the_lich_king_vile_spirit_move_target_search_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + + WorldObject* _target; + }; + + SpellScript* GetSpellScript() const + { + return new spell_the_lich_king_vile_spirit_move_target_search_SpellScript(); + } }; class spell_the_lich_king_vile_spirit_damage_target_search : public SpellScriptLoader { - public: - spell_the_lich_king_vile_spirit_damage_target_search() : SpellScriptLoader("spell_the_lich_king_vile_spirit_damage_target_search") { } +public: + spell_the_lich_king_vile_spirit_damage_target_search() : SpellScriptLoader("spell_the_lich_king_vile_spirit_damage_target_search") { } - class spell_the_lich_king_vile_spirit_damage_target_search_SpellScript : public SpellScript + class spell_the_lich_king_vile_spirit_damage_target_search_SpellScript : public SpellScript + { + PrepareSpellScript(spell_the_lich_king_vile_spirit_damage_target_search_SpellScript); + + void CheckTargetCount(std::list& targets) { - PrepareSpellScript(spell_the_lich_king_vile_spirit_damage_target_search_SpellScript); + if (targets.empty()) + return; - void CheckTargetCount(std::list& targets) + if (TempSummon* summon = GetCaster()->ToTempSummon()) + if (Unit* summoner = summon->GetSummoner()) + summoner->GetAI()->SetData(DATA_VILE, 1); + + if (Creature* c = GetCaster()->ToCreature()) { - if (targets.empty()) - return; - - if (TempSummon* summon = GetCaster()->ToTempSummon()) - if (Unit* summoner = summon->GetSummoner()) - summoner->GetAI()->SetData(DATA_VILE, 1); - - if (Creature* c = GetCaster()->ToCreature()) - { - c->RemoveAurasDueToSpell(SPELL_VILE_SPIRIT_DAMAGE_SEARCH); - c->GetMotionMaster()->Clear(true); - c->StopMoving(); - c->CastSpell((Unit*)NULL, SPELL_SPIRIT_BURST, true); - c->DespawnOrUnsummon(3000); - c->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - } + c->RemoveAurasDueToSpell(SPELL_VILE_SPIRIT_DAMAGE_SEARCH); + c->GetMotionMaster()->Clear(true); + c->StopMoving(); + c->CastSpell((Unit*)NULL, SPELL_SPIRIT_BURST, true); + c->DespawnOrUnsummon(3000); + c->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_vile_spirit_damage_target_search_SpellScript::CheckTargetCount, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_the_lich_king_vile_spirit_damage_target_search_SpellScript(); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_vile_spirit_damage_target_search_SpellScript::CheckTargetCount, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_the_lich_king_vile_spirit_damage_target_search_SpellScript(); + } }; class spell_the_lich_king_harvest_soul : public SpellScriptLoader { - public: - spell_the_lich_king_harvest_soul() : SpellScriptLoader("spell_the_lich_king_harvest_soul") { } +public: + spell_the_lich_king_harvest_soul() : SpellScriptLoader("spell_the_lich_king_harvest_soul") { } - class spell_the_lich_king_harvest_soul_AuraScript : public AuraScript + class spell_the_lich_king_harvest_soul_AuraScript : public AuraScript + { + PrepareAuraScript(spell_the_lich_king_harvest_soul_AuraScript); + + bool Load() { - PrepareAuraScript(spell_the_lich_king_harvest_soul_AuraScript); - - bool Load() - { - return GetOwner()->GetInstanceScript() != nullptr; - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - // m_originalCaster to allow stacking from different casters, meh - if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_DEATH) - GetTarget()->CastSpell((Unit*)NULL, SPELL_HARVESTED_SOUL_LK_BUFF, true, nullptr, nullptr, GetTarget()->GetInstanceScript()->GetData64(DATA_THE_LICH_KING)); - } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_the_lich_king_harvest_soul_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_the_lich_king_harvest_soul_AuraScript(); + return GetOwner()->GetInstanceScript() != nullptr; } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + // m_originalCaster to allow stacking from different casters, meh + if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_DEATH) + GetTarget()->CastSpell((Unit*)NULL, SPELL_HARVESTED_SOUL_LK_BUFF, true, nullptr, nullptr, GetTarget()->GetInstanceScript()->GetData64(DATA_THE_LICH_KING)); + } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_the_lich_king_harvest_soul_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_the_lich_king_harvest_soul_AuraScript(); + } }; class npc_strangulate_vehicle : public CreatureScript { - public: - npc_strangulate_vehicle() : CreatureScript("npc_strangulate_vehicle") { } +public: + npc_strangulate_vehicle() : CreatureScript("npc_strangulate_vehicle") { } - struct npc_strangulate_vehicleAI : public NullCreatureAI + struct npc_strangulate_vehicleAI : public NullCreatureAI + { + npc_strangulate_vehicleAI(Creature* creature) : NullCreatureAI(creature), _instance(creature->GetInstanceScript()) {} + + EventMap _events; + InstanceScript* _instance; + + void IsSummonedBy(Unit* summoner) { - npc_strangulate_vehicleAI(Creature* creature) : NullCreatureAI(creature), _instance(creature->GetInstanceScript()) {} + if (!summoner) + return; - EventMap _events; - InstanceScript* _instance; - - void IsSummonedBy(Unit* summoner) + if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) { - if (!summoner) - return; - - if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) - { - me->SetWalk(false); - Movement::PointsArray path; - path.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ())); - path.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), 843.0f)); - me->GetMotionMaster()->MoveSplinePath(&path); - - uint64 petGUID = summoner->GetPetGUID(); - summoner->SetPetGUID(0); - summoner->StopMoving(); - me->CastSpell(summoner, SPELL_HARVEST_SOUL_VEHICLE, true); - //summoner->ClearUnitState(UNIT_STATE_ONVEHICLE); - summoner->SendMovementFlagUpdate(true); - summoner->SetPetGUID(petGUID); - _events.Reset(); - _events.ScheduleEvent(EVENT_MOVE_TO_LICH_KING, 1000); - _events.ScheduleEvent(EVENT_TELEPORT, 6250); - _events.ScheduleEvent(EVENT_DESPAWN_SELF, 6000+70000); - - // this will let us easily access all creatures of this entry on heroic mode when its time to teleport back - lichKing->AI()->JustSummoned(me); - } - } - - bool IsHeroic() { return me->GetMap()->IsHeroic(); } - void OnCharmed(bool /*apply*/) {} - void PassengerBoarded(Unit* pass, int8 /*seat*/, bool apply) - { - if (!apply) - pass->RemoveAurasDueToSpell(VEHICLE_SPELL_PARACHUTE); - } - - void DoAction(int32 action) - { - if (action != ACTION_TELEPORT_BACK) - return; - - if (TempSummon* summ = me->ToTempSummon()) - { - if (Unit* summoner = summ->GetSummoner()) - { - bool buff = _instance->GetBossState(DATA_THE_LICH_KING) == IN_PROGRESS && summoner->GetTypeId() == TYPEID_PLAYER && (!summoner->IsAlive() || summoner->ToPlayer()->IsBeingTeleported() || summoner->FindMap() != me->GetMap()); - if (summoner->GetTypeId() == TYPEID_PLAYER && !summoner->ToPlayer()->IsBeingTeleported() && summoner->FindMap() == me->GetMap()) - { - if (buff) - summoner->CastSpell((Unit*)NULL, SPELL_HARVESTED_SOUL_LK_BUFF, true, nullptr, nullptr, _instance->GetData64(DATA_THE_LICH_KING)); - - me->CastSpell(summoner, SPELL_HARVEST_SOUL_TELEPORT_BACK, false); - } - else if (buff) - me->CastSpell((Unit*)NULL, SPELL_HARVESTED_SOUL_LK_BUFF, true, nullptr, nullptr, _instance->GetData64(DATA_THE_LICH_KING)); - - summoner->RemoveAurasDueToSpell(IsHeroic() ? SPELL_HARVEST_SOULS_TELEPORT : SPELL_HARVEST_SOUL_TELEPORT); - } - else - me->CastSpell((Unit*)NULL, SPELL_HARVESTED_SOUL_LK_BUFF, true, nullptr, nullptr, _instance->GetData64(DATA_THE_LICH_KING)); - } + me->SetWalk(false); + Movement::PointsArray path; + path.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ())); + path.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), 843.0f)); + me->GetMotionMaster()->MoveSplinePath(&path); + uint64 petGUID = summoner->GetPetGUID(); + summoner->SetPetGUID(0); + summoner->StopMoving(); + me->CastSpell(summoner, SPELL_HARVEST_SOUL_VEHICLE, true); + //summoner->ClearUnitState(UNIT_STATE_ONVEHICLE); + summoner->SendMovementFlagUpdate(true); + summoner->SetPetGUID(petGUID); _events.Reset(); - me->RemoveAllAuras(); - me->DespawnOrUnsummon(500); + _events.ScheduleEvent(EVENT_MOVE_TO_LICH_KING, 1000); + _events.ScheduleEvent(EVENT_TELEPORT, 6250); + _events.ScheduleEvent(EVENT_DESPAWN_SELF, 6000 + 70000); - if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) - lichKing->AI()->SummonedCreatureDespawn(me); + // this will let us easily access all creatures of this entry on heroic mode when its time to teleport back + lichKing->AI()->JustSummoned(me); } - - void UpdateAI(uint32 diff) - { - _events.Update(diff); - - switch (_events.ExecuteEvent()) - { - case EVENT_TELEPORT: - me->GetMotionMaster()->Clear(false); - me->GetMotionMaster()->MoveIdle(); - if (TempSummon* summ = me->ToTempSummon()) - if (Unit* summoner = summ->GetSummoner()) - { - if (summoner->IsAlive() && summoner->GetTypeId() == TYPEID_PLAYER) - { - summoner->CastSpell((Unit*)NULL, SPELL_HARVEST_SOUL_VISUAL, true); - summoner->ExitVehicle(summoner); - me->UpdatePosition(me->GetPositionX(), me->GetPositionY(), 840.87f, me->GetOrientation(), true); - me->StopMovingOnCurrentPos(); - if (!IsHeroic()) - summoner->CastSpell(summoner, SPELL_HARVEST_SOUL_TELEPORT, true); - else - summoner->CastSpell(summoner, SPELL_HARVEST_SOULS_TELEPORT, true); - } - else - { - summoner->ExitVehicle(summoner); - _events.RescheduleEvent(EVENT_DESPAWN_SELF, 0); - } - } - break; - case EVENT_MOVE_TO_LICH_KING: - if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) - if (me->GetExactDist(lichKing) > 8.0f) - { - float dist = float(rand_norm()) * 5.0f + 8.0f; - float angle = lichKing->GetAngle(me); - Movement::PointsArray path; - path.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ())); - path.push_back(G3D::Vector3(lichKing->GetPositionX()+dist*cos(angle), lichKing->GetPositionY()+dist*sin(angle), 843.0f)); - me->GetMotionMaster()->MoveSplinePath(&path); - } - break; - case EVENT_DESPAWN_SELF: - if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) - lichKing->AI()->SummonedCreatureDespawn(me); - me->DespawnOrUnsummon(1); - break; - default: - break; - } - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); } + + bool IsHeroic() { return me->GetMap()->IsHeroic(); } + void OnCharmed(bool /*apply*/) {} + void PassengerBoarded(Unit* pass, int8 /*seat*/, bool apply) + { + if (!apply) + pass->RemoveAurasDueToSpell(VEHICLE_SPELL_PARACHUTE); + } + + void DoAction(int32 action) + { + if (action != ACTION_TELEPORT_BACK) + return; + + if (TempSummon* summ = me->ToTempSummon()) + { + if (Unit* summoner = summ->GetSummoner()) + { + bool buff = _instance->GetBossState(DATA_THE_LICH_KING) == IN_PROGRESS && summoner->GetTypeId() == TYPEID_PLAYER && (!summoner->IsAlive() || summoner->ToPlayer()->IsBeingTeleported() || summoner->FindMap() != me->GetMap()); + if (summoner->GetTypeId() == TYPEID_PLAYER && !summoner->ToPlayer()->IsBeingTeleported() && summoner->FindMap() == me->GetMap()) + { + if (buff) + summoner->CastSpell((Unit*)NULL, SPELL_HARVESTED_SOUL_LK_BUFF, true, nullptr, nullptr, _instance->GetData64(DATA_THE_LICH_KING)); + + me->CastSpell(summoner, SPELL_HARVEST_SOUL_TELEPORT_BACK, false); + } + else if (buff) + me->CastSpell((Unit*)NULL, SPELL_HARVESTED_SOUL_LK_BUFF, true, nullptr, nullptr, _instance->GetData64(DATA_THE_LICH_KING)); + + summoner->RemoveAurasDueToSpell(IsHeroic() ? SPELL_HARVEST_SOULS_TELEPORT : SPELL_HARVEST_SOUL_TELEPORT); + } + else + me->CastSpell((Unit*)NULL, SPELL_HARVESTED_SOUL_LK_BUFF, true, nullptr, nullptr, _instance->GetData64(DATA_THE_LICH_KING)); + } + + _events.Reset(); + me->RemoveAllAuras(); + me->DespawnOrUnsummon(500); + + if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) + lichKing->AI()->SummonedCreatureDespawn(me); + } + + void UpdateAI(uint32 diff) + { + _events.Update(diff); + + switch (_events.ExecuteEvent()) + { + case EVENT_TELEPORT: + me->GetMotionMaster()->Clear(false); + me->GetMotionMaster()->MoveIdle(); + if (TempSummon* summ = me->ToTempSummon()) + if (Unit* summoner = summ->GetSummoner()) + { + if (summoner->IsAlive() && summoner->GetTypeId() == TYPEID_PLAYER) + { + summoner->CastSpell((Unit*)NULL, SPELL_HARVEST_SOUL_VISUAL, true); + summoner->ExitVehicle(summoner); + me->UpdatePosition(me->GetPositionX(), me->GetPositionY(), 840.87f, me->GetOrientation(), true); + me->StopMovingOnCurrentPos(); + if (!IsHeroic()) + summoner->CastSpell(summoner, SPELL_HARVEST_SOUL_TELEPORT, true); + else + summoner->CastSpell(summoner, SPELL_HARVEST_SOULS_TELEPORT, true); + } + else + { + summoner->ExitVehicle(summoner); + _events.RescheduleEvent(EVENT_DESPAWN_SELF, 0); + } + } + break; + case EVENT_MOVE_TO_LICH_KING: + if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) + if (me->GetExactDist(lichKing) > 8.0f) + { + float dist = float(rand_norm()) * 5.0f + 8.0f; + float angle = lichKing->GetAngle(me); + Movement::PointsArray path; + path.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ())); + path.push_back(G3D::Vector3(lichKing->GetPositionX() + dist * cos(angle), lichKing->GetPositionY() + dist * sin(angle), 843.0f)); + me->GetMotionMaster()->MoveSplinePath(&path); + } + break; + case EVENT_DESPAWN_SELF: + if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) + lichKing->AI()->SummonedCreatureDespawn(me); + me->DespawnOrUnsummon(1); + break; + default: + break; + } + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class npc_terenas_menethil : public CreatureScript { - public: - npc_terenas_menethil() : CreatureScript("npc_terenas_menethil") { } +public: + npc_terenas_menethil() : CreatureScript("npc_terenas_menethil") { } - struct npc_terenas_menethilAI : public ScriptedAI + struct npc_terenas_menethilAI : public ScriptedAI + { + npc_terenas_menethilAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) {} + + EventMap _events; + InstanceScript* _instance; + + void DoAction(int32 action) { - npc_terenas_menethilAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) {} - - EventMap _events; - InstanceScript* _instance; - - void DoAction(int32 action) + switch (action) { - switch (action) - { - case ACTION_FROSTMOURNE_INTRO: - me->SetControlled(true, UNIT_STATE_ROOT); - me->setActive(true); - _events.Reset(); - _events.ScheduleEvent(EVENT_FROSTMOURNE_TALK_1, 2000); - _events.ScheduleEvent(EVENT_FROSTMOURNE_TALK_2, 11000); - if (!IsHeroic()) - { - me->SetHealth(me->GetMaxHealth() / 2); - _events.ScheduleEvent(EVENT_DESTROY_SOUL, 60000); - _events.ScheduleEvent(EVENT_FROSTMOURNE_TALK_3, 25000); - } - break; - case ACTION_TELEPORT_BACK: - if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)) - { - _events.Reset(); - me->CastSpell((Unit*)NULL, SPELL_RESTORE_SOUL, false); - me->DespawnOrUnsummon(3000); - } - break; - } - } - - void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) - { - if (damage >= me->GetHealth()) - { - damage = me->GetHealth() - 1; - if (IsHeroic()) - return; + case ACTION_FROSTMOURNE_INTRO: + me->SetControlled(true, UNIT_STATE_ROOT); + me->setActive(true); + _events.Reset(); + _events.ScheduleEvent(EVENT_FROSTMOURNE_TALK_1, 2000); + _events.ScheduleEvent(EVENT_FROSTMOURNE_TALK_2, 11000); + if (!IsHeroic()) + { + me->SetHealth(me->GetMaxHealth() / 2); + _events.ScheduleEvent(EVENT_DESTROY_SOUL, 60000); + _events.ScheduleEvent(EVENT_FROSTMOURNE_TALK_3, 25000); + } + break; + case ACTION_TELEPORT_BACK: if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)) { _events.Reset(); - _events.ScheduleEvent(EVENT_TELEPORT_BACK, 1000); - if (Creature* warden = me->FindNearestCreature(NPC_SPIRIT_WARDEN, 20.0f)) - { - warden->CastSpell((Unit*)NULL, SPELL_DESTROY_SOUL, false); - warden->DespawnOrUnsummon(2000); - } - me->CastSpell(me, SPELL_TERENAS_LOSES_INSIDE, false); - me->SetDisplayId(16946); - me->SetReactState(REACT_PASSIVE); - me->AttackStop(); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->DespawnOrUnsummon(2000); + me->CastSpell((Unit*)NULL, SPELL_RESTORE_SOUL, false); + me->DespawnOrUnsummon(3000); } - } + break; } - - void UpdateAI(uint32 diff) - { - UpdateVictim(); - - _events.Update(diff); - - switch (_events.ExecuteEvent()) - { - case EVENT_FROSTMOURNE_TALK_1: - me->SetControlled(false, UNIT_STATE_ROOT); - Talk(SAY_TERENAS_INTRO_1); - if (IsHeroic()) - me->CastSpell((Unit*)NULL, SPELL_RESTORE_SOULS, false); - break; - case EVENT_FROSTMOURNE_TALK_2: - Talk(SAY_TERENAS_INTRO_2); - break; - case EVENT_FROSTMOURNE_TALK_3: - Talk(SAY_TERENAS_INTRO_3); - break; - case EVENT_DESTROY_SOUL: - if (Creature* warden = me->FindNearestCreature(NPC_SPIRIT_WARDEN, 20.0f)) - warden->CastSpell((Unit*)NULL, SPELL_DESTROY_SOUL, false); - me->CastSpell(me, SPELL_TERENAS_LOSES_INSIDE, false); - me->SetDisplayId(16946); - me->SetReactState(REACT_PASSIVE); - me->AttackStop(); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - _events.Reset(); - _events.ScheduleEvent(EVENT_TELEPORT_BACK, 1000); - break; - case EVENT_TELEPORT_BACK: - if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) - lichKing->AI()->DoAction(ACTION_TELEPORT_BACK); - break; - default: - break; - } - - DoMeleeAttackIfReady(); - } - - bool CanAIAttack(Unit const* target) const - { - return target->GetEntry() != NPC_THE_LICH_KING; - } - - void EnterEvadeMode() - { - if (!me->IsAlive()) - return; - - me->DeleteThreatList(); - me->CombatStop(false); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); } + + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) + { + if (damage >= me->GetHealth()) + { + damage = me->GetHealth() - 1; + if (IsHeroic()) + return; + if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)) + { + _events.Reset(); + _events.ScheduleEvent(EVENT_TELEPORT_BACK, 1000); + if (Creature* warden = me->FindNearestCreature(NPC_SPIRIT_WARDEN, 20.0f)) + { + warden->CastSpell((Unit*)NULL, SPELL_DESTROY_SOUL, false); + warden->DespawnOrUnsummon(2000); + } + me->CastSpell(me, SPELL_TERENAS_LOSES_INSIDE, false); + me->SetDisplayId(16946); + me->SetReactState(REACT_PASSIVE); + me->AttackStop(); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->DespawnOrUnsummon(2000); + } + } + } + + void UpdateAI(uint32 diff) + { + UpdateVictim(); + + _events.Update(diff); + + switch (_events.ExecuteEvent()) + { + case EVENT_FROSTMOURNE_TALK_1: + me->SetControlled(false, UNIT_STATE_ROOT); + Talk(SAY_TERENAS_INTRO_1); + if (IsHeroic()) + me->CastSpell((Unit*)NULL, SPELL_RESTORE_SOULS, false); + break; + case EVENT_FROSTMOURNE_TALK_2: + Talk(SAY_TERENAS_INTRO_2); + break; + case EVENT_FROSTMOURNE_TALK_3: + Talk(SAY_TERENAS_INTRO_3); + break; + case EVENT_DESTROY_SOUL: + if (Creature* warden = me->FindNearestCreature(NPC_SPIRIT_WARDEN, 20.0f)) + warden->CastSpell((Unit*)NULL, SPELL_DESTROY_SOUL, false); + me->CastSpell(me, SPELL_TERENAS_LOSES_INSIDE, false); + me->SetDisplayId(16946); + me->SetReactState(REACT_PASSIVE); + me->AttackStop(); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + _events.Reset(); + _events.ScheduleEvent(EVENT_TELEPORT_BACK, 1000); + break; + case EVENT_TELEPORT_BACK: + if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING))) + lichKing->AI()->DoAction(ACTION_TELEPORT_BACK); + break; + default: + break; + } + + DoMeleeAttackIfReady(); + } + + bool CanAIAttack(Unit const* target) const + { + return target->GetEntry() != NPC_THE_LICH_KING; + } + + void EnterEvadeMode() + { + if (!me->IsAlive()) + return; + + me->DeleteThreatList(); + me->CombatStop(false); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class spell_the_lich_king_lights_favor : public SpellScriptLoader { - public: - spell_the_lich_king_lights_favor() : SpellScriptLoader("spell_the_lich_king_lights_favor") { } +public: + spell_the_lich_king_lights_favor() : SpellScriptLoader("spell_the_lich_king_lights_favor") { } - class spell_the_lich_king_lights_favor_AuraScript : public AuraScript + class spell_the_lich_king_lights_favor_AuraScript : public AuraScript + { + PrepareAuraScript(spell_the_lich_king_lights_favor_AuraScript); + + void OnPeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_the_lich_king_lights_favor_AuraScript); - - void OnPeriodic(AuraEffect const* /*aurEff*/) - { - if (Unit* caster = GetCaster()) - if (AuraEffect* effect = GetAura()->GetEffect(EFFECT_1)) - effect->RecalculateAmount(caster); - } - - void CalculateBonus(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) - { - canBeRecalculated = true; - amount = 0; - if (Unit* caster = GetCaster()) - amount = int32(caster->GetHealthPct()); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_the_lich_king_lights_favor_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_HEAL); - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_the_lich_king_lights_favor_AuraScript::CalculateBonus, EFFECT_1, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_the_lich_king_lights_favor_AuraScript(); + if (Unit* caster = GetCaster()) + if (AuraEffect* effect = GetAura()->GetEffect(EFFECT_1)) + effect->RecalculateAmount(caster); } + + void CalculateBonus(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) + { + canBeRecalculated = true; + amount = 0; + if (Unit* caster = GetCaster()) + amount = int32(caster->GetHealthPct()); + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_the_lich_king_lights_favor_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_HEAL); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_the_lich_king_lights_favor_AuraScript::CalculateBonus, EFFECT_1, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_the_lich_king_lights_favor_AuraScript(); + } }; class spell_the_lich_king_restore_soul : public SpellScriptLoader { - public: - spell_the_lich_king_restore_soul() : SpellScriptLoader("spell_the_lich_king_restore_soul") { } +public: + spell_the_lich_king_restore_soul() : SpellScriptLoader("spell_the_lich_king_restore_soul") { } - class spell_the_lich_king_restore_soul_SpellScript : public SpellScript + class spell_the_lich_king_restore_soul_SpellScript : public SpellScript + { + PrepareSpellScript(spell_the_lich_king_restore_soul_SpellScript); + + bool Load() { - PrepareSpellScript(spell_the_lich_king_restore_soul_SpellScript); - - bool Load() - { - _instance = GetCaster()->GetInstanceScript(); - return _instance != nullptr; - } - - void FilterTargets(std::list& unitList) - { - for (std::list::const_iterator itr = unitList.begin(); itr != unitList.end(); ++itr) - if (Unit* target = (*itr)->ToUnit()) - target->RemoveAurasDueToSpell(target->GetMap()->IsHeroic() ? SPELL_HARVEST_SOULS_TELEPORT : SPELL_HARVEST_SOUL_TELEPORT); - if (Creature* lichKing = ObjectAccessor::GetCreature(*GetCaster(), _instance->GetData64(DATA_THE_LICH_KING))) - lichKing->AI()->DoAction(ACTION_TELEPORT_BACK); - if (Creature* spawner = GetCaster()->FindNearestCreature(NPC_WORLD_TRIGGER_INFINITE_AOI, 50.0f, true)) - { - spawner->RemoveAllAuras(); - spawner->m_Events.KillAllEvents(true); - } - - std::list spirits; - GetCaster()->GetCreatureListWithEntryInGrid(spirits, NPC_WICKED_SPIRIT, 200.0f); - for (std::list::iterator itr = spirits.begin(); itr != spirits.end(); ++itr) - { - (*itr)->m_Events.KillAllEvents(true); - (*itr)->RemoveAllAuras(); - (*itr)->AI()->EnterEvadeMode(); - (*itr)->SetReactState(REACT_PASSIVE); - } - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_restore_soul_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); - } - - InstanceScript* _instance; - }; - - SpellScript* GetSpellScript() const - { - return new spell_the_lich_king_restore_soul_SpellScript(); + _instance = GetCaster()->GetInstanceScript(); + return _instance != nullptr; } + + void FilterTargets(std::list& unitList) + { + for (std::list::const_iterator itr = unitList.begin(); itr != unitList.end(); ++itr) + if (Unit* target = (*itr)->ToUnit()) + target->RemoveAurasDueToSpell(target->GetMap()->IsHeroic() ? SPELL_HARVEST_SOULS_TELEPORT : SPELL_HARVEST_SOUL_TELEPORT); + if (Creature* lichKing = ObjectAccessor::GetCreature(*GetCaster(), _instance->GetData64(DATA_THE_LICH_KING))) + lichKing->AI()->DoAction(ACTION_TELEPORT_BACK); + if (Creature* spawner = GetCaster()->FindNearestCreature(NPC_WORLD_TRIGGER_INFINITE_AOI, 50.0f, true)) + { + spawner->RemoveAllAuras(); + spawner->m_Events.KillAllEvents(true); + } + + std::list spirits; + GetCaster()->GetCreatureListWithEntryInGrid(spirits, NPC_WICKED_SPIRIT, 200.0f); + for (std::list::iterator itr = spirits.begin(); itr != spirits.end(); ++itr) + { + (*itr)->m_Events.KillAllEvents(true); + (*itr)->RemoveAllAuras(); + (*itr)->AI()->EnterEvadeMode(); + (*itr)->SetReactState(REACT_PASSIVE); + } + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_restore_soul_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + } + + InstanceScript* _instance; + }; + + SpellScript* GetSpellScript() const + { + return new spell_the_lich_king_restore_soul_SpellScript(); + } }; class npc_spirit_warden : public CreatureScript { - public: - npc_spirit_warden() : CreatureScript("npc_spirit_warden") { } +public: + npc_spirit_warden() : CreatureScript("npc_spirit_warden") { } - struct npc_spirit_wardenAI : public ScriptedAI + struct npc_spirit_wardenAI : public ScriptedAI + { + npc_spirit_wardenAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) {} + + EventMap _events; + InstanceScript* _instance; + + void Reset() { - npc_spirit_wardenAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) {} - - EventMap _events; - InstanceScript* _instance; - - void Reset() - { - _events.Reset(); - _events.ScheduleEvent(EVENT_SOUL_RIP, urand(12000, 15000)); - } - - void JustDied(Unit* /*killer*/) - { - if (Creature* terenas = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_TERENAS_MENETHIL))) - terenas->AI()->DoAction(ACTION_TELEPORT_BACK); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - _events.Update(diff); - - if (_events.ExecuteEvent() == EVENT_SOUL_RIP) - { - me->CastSpell(me->GetVictim(), SPELL_SOUL_RIP, false); - _events.ScheduleEvent(EVENT_SOUL_RIP, urand(23000, 27000)); - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + _events.Reset(); + _events.ScheduleEvent(EVENT_SOUL_RIP, urand(12000, 15000)); } + + void JustDied(Unit* /*killer*/) + { + if (Creature* terenas = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_TERENAS_MENETHIL))) + terenas->AI()->DoAction(ACTION_TELEPORT_BACK); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + _events.Update(diff); + + if (_events.ExecuteEvent() == EVENT_SOUL_RIP) + { + me->CastSpell(me->GetVictim(), SPELL_SOUL_RIP, false); + _events.ScheduleEvent(EVENT_SOUL_RIP, urand(23000, 27000)); + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class spell_the_lich_king_dark_hunger : public SpellScriptLoader { - public: - spell_the_lich_king_dark_hunger() : SpellScriptLoader("spell_the_lich_king_dark_hunger") { } +public: + spell_the_lich_king_dark_hunger() : SpellScriptLoader("spell_the_lich_king_dark_hunger") { } - class spell_the_lich_king_dark_hunger_AuraScript : public AuraScript + class spell_the_lich_king_dark_hunger_AuraScript : public AuraScript + { + PrepareAuraScript(spell_the_lich_king_dark_hunger_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_the_lich_king_dark_hunger_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_DARK_HUNGER_HEAL)) - return false; - return true; - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - int32 heal = int32(eventInfo.GetDamageInfo()->GetDamage() / 2); - GetTarget()->CastCustomSpell(SPELL_DARK_HUNGER_HEAL, SPELLVALUE_BASE_POINT0, heal, GetTarget(), true, NULL, aurEff); - } - - void Register() - { - OnEffectProc += AuraEffectProcFn(spell_the_lich_king_dark_hunger_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_the_lich_king_dark_hunger_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_DARK_HUNGER_HEAL)) + return false; + return true; } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + int32 heal = int32(eventInfo.GetDamageInfo()->GetDamage() / 2); + GetTarget()->CastCustomSpell(SPELL_DARK_HUNGER_HEAL, SPELLVALUE_BASE_POINT0, heal, GetTarget(), true, NULL, aurEff); + } + + void Register() + { + OnEffectProc += AuraEffectProcFn(spell_the_lich_king_dark_hunger_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_the_lich_king_dark_hunger_AuraScript(); + } }; class spell_the_lich_king_soul_rip : public SpellScriptLoader { - public: - spell_the_lich_king_soul_rip() : SpellScriptLoader("spell_the_lich_king_soul_rip") { } +public: + spell_the_lich_king_soul_rip() : SpellScriptLoader("spell_the_lich_king_soul_rip") { } - class spell_the_lich_king_soul_rip_AuraScript : public AuraScript + class spell_the_lich_king_soul_rip_AuraScript : public AuraScript + { + PrepareAuraScript(spell_the_lich_king_soul_rip_AuraScript); + + void OnPeriodic(AuraEffect const* aurEff) { - PrepareAuraScript(spell_the_lich_king_soul_rip_AuraScript); - - void OnPeriodic(AuraEffect const* aurEff) - { - PreventDefaultAction(); - // shouldn't be needed, this is channeled - if (Unit* caster = GetCaster()) - caster->CastCustomSpell(SPELL_SOUL_RIP_DAMAGE, SPELLVALUE_BASE_POINT0, 5000 * aurEff->GetTickNumber(), GetTarget(), true, NULL, aurEff, GetCasterGUID()); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_the_lich_king_soul_rip_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_the_lich_king_soul_rip_AuraScript(); + PreventDefaultAction(); + // shouldn't be needed, this is channeled + if (Unit* caster = GetCaster()) + caster->CastCustomSpell(SPELL_SOUL_RIP_DAMAGE, SPELLVALUE_BASE_POINT0, 5000 * aurEff->GetTickNumber(), GetTarget(), true, NULL, aurEff, GetCasterGUID()); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_the_lich_king_soul_rip_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_the_lich_king_soul_rip_AuraScript(); + } }; class npc_icc_lk_checktarget : public CreatureScript { - public: - npc_icc_lk_checktarget() : CreatureScript("npc_icc_lk_checktarget") { } +public: + npc_icc_lk_checktarget() : CreatureScript("npc_icc_lk_checktarget") { } - struct npc_icc_lk_checktargetAI : public ScriptedAI + struct npc_icc_lk_checktargetAI : public ScriptedAI + { + npc_icc_lk_checktargetAI(Creature* creature) : ScriptedAI(creature) {} + + bool CanAIAttack(Unit const* target) const { - npc_icc_lk_checktargetAI(Creature* creature) : ScriptedAI(creature) {} - - bool CanAIAttack(Unit const* target) const - { - return IsValidPlatformTarget(target) && !target->GetVehicle(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + return IsValidPlatformTarget(target) && !target->GetVehicle(); } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class spell_the_lich_king_summon_spirit_bomb : public SpellScriptLoader { - public: - spell_the_lich_king_summon_spirit_bomb() : SpellScriptLoader("spell_the_lich_king_summon_spirit_bomb") { } +public: + spell_the_lich_king_summon_spirit_bomb() : SpellScriptLoader("spell_the_lich_king_summon_spirit_bomb") { } - class spell_the_lich_king_summon_spirit_bomb_SpellScript : public SpellScript + class spell_the_lich_king_summon_spirit_bomb_SpellScript : public SpellScript + { + PrepareSpellScript(spell_the_lich_king_summon_spirit_bomb_SpellScript); + + void HandleScript(SpellEffIndex effIndex) { - PrepareSpellScript(spell_the_lich_king_summon_spirit_bomb_SpellScript); - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetHitUnit()->CastSpell((Unit*)NULL, uint32(GetEffectValue()), true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_the_lich_king_summon_spirit_bomb_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_the_lich_king_summon_spirit_bomb_SpellScript(); + PreventHitDefaultEffect(effIndex); + GetHitUnit()->CastSpell((Unit*)NULL, uint32(GetEffectValue()), true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_the_lich_king_summon_spirit_bomb_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_the_lich_king_summon_spirit_bomb_SpellScript(); + } }; class npc_lk_spirit_bomb : public CreatureScript { - public: - npc_lk_spirit_bomb() : CreatureScript("npc_lk_spirit_bomb") { } +public: + npc_lk_spirit_bomb() : CreatureScript("npc_lk_spirit_bomb") { } - struct npc_lk_spirit_bombAI : public NullCreatureAI + struct npc_lk_spirit_bombAI : public NullCreatureAI + { + npc_lk_spirit_bombAI(Creature* creature) : NullCreatureAI(creature) { - npc_lk_spirit_bombAI(Creature* creature) : NullCreatureAI(creature) - { - me->SetReactState(REACT_PASSIVE); - me->DespawnOrUnsummon(45000); // for safety - timer = 0; - } - - uint16 timer; - - void IsSummonedBy(Unit* /*summoner*/) - { - float destX, destY, destZ; - me->GetPosition(destX, destY); - destZ = 1055.0f; // approximation, gets more precise later - me->UpdateGroundPositionZ(destX, destY, destZ); - me->SetWalk(false); - me->GetMotionMaster()->MovePoint(POINT_GROUND, destX, destY, destZ); - } - - void MovementInform(uint32 type, uint32 point) - { - if (type != POINT_MOTION_TYPE || point != POINT_GROUND) - return; - - timer = 1000; - } - - void UpdateAI(uint32 diff) - { - if (timer) - { - if (timer <= diff) - { - timer = 0; - me->RemoveAllAuras(); - me->CastSpell((Unit*)NULL, SPELL_EXPLOSION, false); - me->DespawnOrUnsummon(1000); - } - else - timer -= diff; - } - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + me->SetReactState(REACT_PASSIVE); + me->DespawnOrUnsummon(45000); // for safety + timer = 0; } + + uint16 timer; + + void IsSummonedBy(Unit* /*summoner*/) + { + float destX, destY, destZ; + me->GetPosition(destX, destY); + destZ = 1055.0f; // approximation, gets more precise later + me->UpdateGroundPositionZ(destX, destY, destZ); + me->SetWalk(false); + me->GetMotionMaster()->MovePoint(POINT_GROUND, destX, destY, destZ); + } + + void MovementInform(uint32 type, uint32 point) + { + if (type != POINT_MOTION_TYPE || point != POINT_GROUND) + return; + + timer = 1000; + } + + void UpdateAI(uint32 diff) + { + if (timer) + { + if (timer <= diff) + { + timer = 0; + me->RemoveAllAuras(); + me->CastSpell((Unit*)NULL, SPELL_EXPLOSION, false); + me->DespawnOrUnsummon(1000); + } + else + timer -= diff; + } + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class spell_the_lich_king_trigger_vile_spirit : public SpellScriptLoader { - public: - spell_the_lich_king_trigger_vile_spirit() : SpellScriptLoader("spell_the_lich_king_trigger_vile_spirit") { } +public: + spell_the_lich_king_trigger_vile_spirit() : SpellScriptLoader("spell_the_lich_king_trigger_vile_spirit") { } - class spell_the_lich_king_trigger_vile_spirit_SpellScript : public SpellScript + class spell_the_lich_king_trigger_vile_spirit_SpellScript : public SpellScript + { + PrepareSpellScript(spell_the_lich_king_trigger_vile_spirit_SpellScript); + + void ActivateSpirit() { - PrepareSpellScript(spell_the_lich_king_trigger_vile_spirit_SpellScript); + Creature* target = GetHitCreature(); + if (!target) + return; - void ActivateSpirit() - { - Creature* target = GetHitCreature(); - if (!target) - return; - - target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_ATTACKABLE_1 | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); - target->ForceValuesUpdateAtIndex(UNIT_FIELD_FLAGS); - VileSpiritActivateEvent(target).Execute(0, 0); - } - - void Register() - { - OnHit += SpellHitFn(spell_the_lich_king_trigger_vile_spirit_SpellScript::ActivateSpirit); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_the_lich_king_trigger_vile_spirit_SpellScript(); + target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_ATTACKABLE_1 | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + target->ForceValuesUpdateAtIndex(UNIT_FIELD_FLAGS); + VileSpiritActivateEvent(target).Execute(0, 0); } + + void Register() + { + OnHit += SpellHitFn(spell_the_lich_king_trigger_vile_spirit_SpellScript::ActivateSpirit); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_the_lich_king_trigger_vile_spirit_SpellScript(); + } }; class npc_lk_wicked_spirit : public CreatureScript { - public: - npc_lk_wicked_spirit() : CreatureScript("npc_lk_wicked_spirit") { } +public: + npc_lk_wicked_spirit() : CreatureScript("npc_lk_wicked_spirit") { } - struct npc_lk_wicked_spiritAI : public ScriptedAI + struct npc_lk_wicked_spiritAI : public ScriptedAI + { + npc_lk_wicked_spiritAI(Creature* creature) : ScriptedAI(creature) { } + + void Reset() { - npc_lk_wicked_spiritAI(Creature* creature) : ScriptedAI(creature) { } - - void Reset() - { - me->SetCorpseDelay(0); - me->SetReactState(REACT_PASSIVE); - } - - void JustDied(Unit* /*killer*/) - { - me->SetReactState(REACT_PASSIVE); - } - - void JustRespawned() - { - me->SetReactState(REACT_PASSIVE); - } - - bool CanAIAttack(Unit const* target) const - { - return me->GetReactState() == REACT_AGGRESSIVE && target->GetTypeId() == TYPEID_PLAYER && target->GetExactDistSq(495.708f, -2523.76f, 1049.95f) < 40.0f*40.0f; - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + me->SetCorpseDelay(0); + me->SetReactState(REACT_PASSIVE); } + + void JustDied(Unit* /*killer*/) + { + me->SetReactState(REACT_PASSIVE); + } + + void JustRespawned() + { + me->SetReactState(REACT_PASSIVE); + } + + bool CanAIAttack(Unit const* target) const + { + return me->GetReactState() == REACT_AGGRESSIVE && target->GetTypeId() == TYPEID_PLAYER && target->GetExactDistSq(495.708f, -2523.76f, 1049.95f) < 40.0f * 40.0f; + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class achievement_been_waiting_long_time : public AchievementCriteriaScript { - public: - achievement_been_waiting_long_time() : AchievementCriteriaScript("achievement_been_waiting_long_time") { } +public: + achievement_been_waiting_long_time() : AchievementCriteriaScript("achievement_been_waiting_long_time") { } - bool OnCheck(Player* /*source*/, Unit* target) - { - if (!target) - return false; + bool OnCheck(Player* /*source*/, Unit* target) + { + if (!target) + return false; - return target->GetAI()->GetData(DATA_PLAGUE_STACK) >= 30; - } + return target->GetAI()->GetData(DATA_PLAGUE_STACK) >= 30; + } }; class achievement_neck_deep_in_vile : public AchievementCriteriaScript { - public: - achievement_neck_deep_in_vile() : AchievementCriteriaScript("achievement_neck_deep_in_vile") { } +public: + achievement_neck_deep_in_vile() : AchievementCriteriaScript("achievement_neck_deep_in_vile") { } - bool OnCheck(Player* /*source*/, Unit* target) - { - if (!target) - return false; + bool OnCheck(Player* /*source*/, Unit* target) + { + if (!target) + return false; - return !target->GetAI()->GetData(DATA_VILE); - } + return !target->GetAI()->GetData(DATA_VILE); + } }; void AddSC_boss_the_lich_king() diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp index 1426e223f..ce63bd183 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp @@ -135,1364 +135,1364 @@ Position const ValithriaSpawnPos = {4210.813f, 2484.443f, 364.9558f, 0.01745329f class RisenArchmageCheck { - public: - // look for all permanently spawned Risen Archmages that are not yet in combat - bool operator()(Creature* creature) - { - return creature->IsAlive() && creature->GetEntry() == NPC_RISEN_ARCHMAGE && - creature->GetDBTableGUIDLow() && !creature->IsInCombat(); - } +public: + // look for all permanently spawned Risen Archmages that are not yet in combat + bool operator()(Creature* creature) + { + return creature->IsAlive() && creature->GetEntry() == NPC_RISEN_ARCHMAGE && + creature->GetDBTableGUIDLow() && !creature->IsInCombat(); + } }; struct ManaVoidSelector : public acore::unary_function { - explicit ManaVoidSelector(WorldObject const* source) : _source(source) { } + explicit ManaVoidSelector(WorldObject const* source) : _source(source) { } - bool operator()(Unit* unit) const - { - return unit->getPowerType() == POWER_MANA && _source->GetDistance(unit) > 15.0f; - } + bool operator()(Unit* unit) const + { + return unit->getPowerType() == POWER_MANA && _source->GetDistance(unit) > 15.0f; + } - WorldObject const* _source; + WorldObject const* _source; }; class DelayedCastEvent : public BasicEvent { - public: - DelayedCastEvent(Creature* trigger, uint32 spellId, uint64 originalCaster, uint32 despawnTime) : _trigger(trigger), _originalCaster(originalCaster), _spellId(spellId), _despawnTime(despawnTime) - { - } +public: + DelayedCastEvent(Creature* trigger, uint32 spellId, uint64 originalCaster, uint32 despawnTime) : _trigger(trigger), _originalCaster(originalCaster), _spellId(spellId), _despawnTime(despawnTime) + { + } - bool Execute(uint64 /*time*/, uint32 /*diff*/) - { - _trigger->CastSpell(_trigger, _spellId, false, nullptr, nullptr, _originalCaster); - if (_despawnTime) - _trigger->DespawnOrUnsummon(_despawnTime); - return true; - } + bool Execute(uint64 /*time*/, uint32 /*diff*/) + { + _trigger->CastSpell(_trigger, _spellId, false, nullptr, nullptr, _originalCaster); + if (_despawnTime) + _trigger->DespawnOrUnsummon(_despawnTime); + return true; + } - private: - Creature* _trigger; - uint64 _originalCaster; - uint32 _spellId; - uint32 _despawnTime; +private: + Creature* _trigger; + uint64 _originalCaster; + uint32 _spellId; + uint32 _despawnTime; }; class AuraRemoveEvent : public BasicEvent { - public: - AuraRemoveEvent(Creature* trigger, uint32 spellId) : _trigger(trigger), _spellId(spellId) - { - } +public: + AuraRemoveEvent(Creature* trigger, uint32 spellId) : _trigger(trigger), _spellId(spellId) + { + } - bool Execute(uint64 /*time*/, uint32 /*diff*/) - { - _trigger->RemoveAurasDueToSpell(_spellId); - return true; - } + bool Execute(uint64 /*time*/, uint32 /*diff*/) + { + _trigger->RemoveAurasDueToSpell(_spellId); + return true; + } - private: - Creature* _trigger; - uint32 _spellId; +private: + Creature* _trigger; + uint32 _spellId; }; class ValithriaDespawner : public BasicEvent { - public: - explicit ValithriaDespawner(Creature* creature) : _creature(creature) - { - } +public: + explicit ValithriaDespawner(Creature* creature) : _creature(creature) + { + } - bool Execute(uint64 /*currTime*/, uint32 /*diff*/) - { - acore::CreatureWorker worker(_creature, *this); - _creature->VisitNearbyGridObject(333.0f, worker); - _creature->AI()->Reset(); - _creature->setActive(false); - return true; - } + bool Execute(uint64 /*currTime*/, uint32 /*diff*/) + { + acore::CreatureWorker worker(_creature, *this); + _creature->VisitNearbyGridObject(333.0f, worker); + _creature->AI()->Reset(); + _creature->setActive(false); + return true; + } - void operator()(Creature* creature) const + void operator()(Creature* creature) const + { + switch (creature->GetEntry()) { - switch (creature->GetEntry()) - { - case NPC_VALITHRIA_DREAMWALKER: - if (InstanceScript* instance = creature->GetInstanceScript()) - instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, creature); - break; - case NPC_THE_LICH_KING_VALITHRIA: - if (creature->IsAlive()) - creature->AI()->Reset(); - return; - case NPC_BLAZING_SKELETON: - case NPC_SUPPRESSER: - case NPC_BLISTERING_ZOMBIE: - case NPC_GLUTTONOUS_ABOMINATION: - case NPC_MANA_VOID: - case NPC_COLUMN_OF_FROST: - case NPC_ROT_WORM: + case NPC_VALITHRIA_DREAMWALKER: + if (InstanceScript* instance = creature->GetInstanceScript()) + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, creature); + break; + case NPC_THE_LICH_KING_VALITHRIA: + if (creature->IsAlive()) + creature->AI()->Reset(); + return; + case NPC_BLAZING_SKELETON: + case NPC_SUPPRESSER: + case NPC_BLISTERING_ZOMBIE: + case NPC_GLUTTONOUS_ABOMINATION: + case NPC_MANA_VOID: + case NPC_COLUMN_OF_FROST: + case NPC_ROT_WORM: + creature->DespawnOrUnsummon(); + return; + case NPC_RISEN_ARCHMAGE: + if (!creature->GetDBTableGUIDLow()) + { creature->DespawnOrUnsummon(); return; - case NPC_RISEN_ARCHMAGE: - if (!creature->GetDBTableGUIDLow()) - { - creature->DespawnOrUnsummon(); - return; - } - break; - default: - return; - } - - uint32 corpseDelay = creature->GetCorpseDelay(); - uint32 respawnDelay = creature->GetRespawnDelay(); - creature->SetCorpseDelay(1); - creature->SetRespawnDelay(10); - - if (CreatureData const* data = creature->GetCreatureData()) - creature->SetPosition(data->posX, data->posY, data->posZ, data->orientation); - if (!creature->IsAlive()) - { - creature->RemoveCorpse(false); - creature->SetRespawnTime(11); - } - else - creature->DespawnOrUnsummon(); - - creature->SetCorpseDelay(corpseDelay); - creature->SetRespawnDelay(respawnDelay); + } + break; + default: + return; } - private: - Creature* _creature; + uint32 corpseDelay = creature->GetCorpseDelay(); + uint32 respawnDelay = creature->GetRespawnDelay(); + creature->SetCorpseDelay(1); + creature->SetRespawnDelay(10); + + if (CreatureData const* data = creature->GetCreatureData()) + creature->SetPosition(data->posX, data->posY, data->posZ, data->orientation); + if (!creature->IsAlive()) + { + creature->RemoveCorpse(false); + creature->SetRespawnTime(11); + } + else + creature->DespawnOrUnsummon(); + + creature->SetCorpseDelay(corpseDelay); + creature->SetRespawnDelay(respawnDelay); + } + +private: + Creature* _creature; }; class boss_valithria_dreamwalker : public CreatureScript { - public: - boss_valithria_dreamwalker() : CreatureScript("boss_valithria_dreamwalker") { } +public: + boss_valithria_dreamwalker() : CreatureScript("boss_valithria_dreamwalker") { } - struct boss_valithria_dreamwalkerAI : public ScriptedAI + struct boss_valithria_dreamwalkerAI : public ScriptedAI + { + boss_valithria_dreamwalkerAI(Creature* creature) : ScriptedAI(creature), + _instance(creature->GetInstanceScript()), _portalCount(RAID_MODE(3, 8, 3, 8)) { - boss_valithria_dreamwalkerAI(Creature* creature) : ScriptedAI(creature), - _instance(creature->GetInstanceScript()), _portalCount(RAID_MODE(3, 8, 3, 8)) - { - me->SetReactState(REACT_PASSIVE); - _spawnHealth = 1; // just in case if not set below - if (CreatureData const* data = sObjectMgr->GetCreatureData(me->GetDBTableGUIDLow())) - if (data->curhealth) - _spawnHealth = data->curhealth; - } - - void Reset() - { - _events.Reset(); - me->SetHealth(_spawnHealth); - me->LoadCreaturesAddon(true); - // immune to percent heals - me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_OBS_MOD_HEALTH, true); - me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_HEAL_PCT, true); - // Glyph of Dispel Magic - not a percent heal by effect, its cast with custom basepoints - me->ApplySpellImmune(0, IMMUNITY_ID, 56131, true); - _instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); - _missedPortals = 0; - _under25PercentTalkDone = false; - _over75PercentTalkDone = false; - _justDied = false; - _done = false; - } - - void AttackStart(Unit* /*target*/) {} - void MoveInLineOfSight(Unit* /*who*/) {} - - void DoAction(int32 action) - { - if (action != ACTION_ENTER_COMBAT) - return; - - _instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me); - _events.Reset(); - _events.ScheduleEvent(EVENT_INTRO_TALK, 15000); - _events.ScheduleEvent(EVENT_DREAM_PORTAL, urand(45000, 48000)); - if (IsHeroic()) - _events.ScheduleEvent(EVENT_BERSERK, 420000); - } - - void HealReceived(Unit* healer, uint32& heal) - { - if (!me->hasLootRecipient()) - me->SetLootRecipient(healer); - me->LowerPlayerDamageReq(heal); - - // encounter complete - if (me->HealthAbovePctHealed(100, heal) && !_done) - { - _done = true; - Talk(SAY_VALITHRIA_SUCCESS); - _instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); - _instance->DoRemoveAurasDueToSpellOnPlayers(70766); - me->RemoveAurasDueToSpell(SPELL_CORRUPTION_VALITHRIA); - me->CastSpell(me, SPELL_ACHIEVEMENT_CHECK, true); - me->CastSpell((Unit*)NULL, SPELL_DREAMWALKERS_RAGE, false); - _events.Reset(); - _events.ScheduleEvent(EVENT_DREAM_SLIP, 3500); - _instance->SetBossState(DATA_VALITHRIA_DREAMWALKER, DONE); - - if (Creature* trigger = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_VALITHRIA_TRIGGER))) - trigger->AI()->EnterEvadeMode(); - if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_VALITHRIA_LICH_KING))) - lichKing->AI()->Reset(); - } - else if (!_over75PercentTalkDone && me->HealthAbovePctHealed(75, heal)) - { - _over75PercentTalkDone = true; - Talk(SAY_VALITHRIA_75_PERCENT); - } - else if (_instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) == NOT_STARTED) - if (Creature* trigger = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_VALITHRIA_TRIGGER))) - trigger->AI()->DoAction(ACTION_ENTER_COMBAT); - } - - void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) - { - if (me->HealthBelowPctDamaged(25, damage)) - { - if (!_under25PercentTalkDone) - { - _under25PercentTalkDone = true; - Talk(SAY_VALITHRIA_25_PERCENT); - } - - if (damage >= me->GetHealth()) - { - damage = 0; - if (!_justDied) - { - _justDied = true; - Talk(SAY_VALITHRIA_DEATH); - _instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); - if (Creature* trigger = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_VALITHRIA_TRIGGER))) - trigger->AI()->EnterEvadeMode(); - } - } - } - } - - void SpellHit(Unit* /*caster*/, SpellInfo const* spell) - { - if (spell->Id == SPELL_DREAM_SLIP) - { - me->CastSpell(me, SPELL_CLEAR_ALL, true); - me->CastSpell(me, SPELL_AWARD_REPUTATION_BOSS_KILL, true); - // this display id was found in sniff instead of the one on aura - me->SetDisplayId(11686); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->DespawnOrUnsummon(4000); - if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_VALITHRIA_LICH_KING))) - lichKing->CastSpell(lichKing, SPELL_SPAWN_CHEST, false); - _instance->SetData(DATA_WEEKLY_QUEST_ID, 0); // show hidden npc if necessary - } - } - - void JustSummoned(Creature* summon) - { - if (summon->GetEntry() == NPC_DREAM_PORTAL_PRE_EFFECT) - { - summon->m_Events.AddEvent(new DelayedCastEvent(summon, SPELL_SUMMON_DREAM_PORTAL, me->GetGUID(), 6000), summon->m_Events.CalculateTime(15000)); - summon->m_Events.AddEvent(new AuraRemoveEvent(summon, SPELL_DREAM_PORTAL_VISUAL_PRE), summon->m_Events.CalculateTime(15000)); - } - else if (summon->GetEntry() == NPC_NIGHTMARE_PORTAL_PRE_EFFECT) - { - summon->m_Events.AddEvent(new DelayedCastEvent(summon, SPELL_SUMMON_NIGHTMARE_PORTAL, me->GetGUID(), 6000), summon->m_Events.CalculateTime(15000)); - summon->m_Events.AddEvent(new AuraRemoveEvent(summon, SPELL_NIGHTMARE_PORTAL_VISUAL_PRE), summon->m_Events.CalculateTime(15000)); - } - } - - void SummonedCreatureDespawn(Creature* summon) - { - if (summon->GetEntry() == NPC_DREAM_PORTAL || summon->GetEntry() == NPC_NIGHTMARE_PORTAL) - if (summon->AI()->GetData(MISSED_PORTALS)) - ++_missedPortals; - } - - void UpdateAI(uint32 diff) - { - // does not enter combat - if (_instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) == NOT_STARTED) - { - if (me->GetHealth() != _spawnHealth) // healing when boss cannot be engaged (lower spire not finished, cheating) doesn't start the fight, prevent winning this way - me->SetHealth(_spawnHealth); - return; - } - - _events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (_events.ExecuteEvent()) - { - case EVENT_INTRO_TALK: - Talk(SAY_VALITHRIA_ENTER_COMBAT); - break; - case EVENT_BERSERK: - Talk(SAY_VALITHRIA_BERSERK); - break; - case EVENT_DREAM_PORTAL: - if (!IsHeroic()) - Talk(SAY_VALITHRIA_DREAM_PORTAL); - for (uint32 i = 0; i < _portalCount; ++i) - me->CastSpell(me, SUMMON_PORTAL, false); - _events.ScheduleEvent(EVENT_DREAM_PORTAL, urand(45000, 48000)); - break; - case EVENT_DREAM_SLIP: - me->CastSpell(me, SPELL_DREAM_SLIP, false); - break; - default: - break; - } - } - - uint32 GetData(uint32 type) const - { - if (type == MISSED_PORTALS) - return _missedPortals; - - return 0; - } - - private: - EventMap _events; - InstanceScript* _instance; - uint32 _spawnHealth; - uint32 const _portalCount; - uint32 _missedPortals; - bool _under25PercentTalkDone; - bool _over75PercentTalkDone; - bool _justDied; - bool _done; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + me->SetReactState(REACT_PASSIVE); + _spawnHealth = 1; // just in case if not set below + if (CreatureData const* data = sObjectMgr->GetCreatureData(me->GetDBTableGUIDLow())) + if (data->curhealth) + _spawnHealth = data->curhealth; } + + void Reset() + { + _events.Reset(); + me->SetHealth(_spawnHealth); + me->LoadCreaturesAddon(true); + // immune to percent heals + me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_OBS_MOD_HEALTH, true); + me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_HEAL_PCT, true); + // Glyph of Dispel Magic - not a percent heal by effect, its cast with custom basepoints + me->ApplySpellImmune(0, IMMUNITY_ID, 56131, true); + _instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + _missedPortals = 0; + _under25PercentTalkDone = false; + _over75PercentTalkDone = false; + _justDied = false; + _done = false; + } + + void AttackStart(Unit* /*target*/) {} + void MoveInLineOfSight(Unit* /*who*/) {} + + void DoAction(int32 action) + { + if (action != ACTION_ENTER_COMBAT) + return; + + _instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me); + _events.Reset(); + _events.ScheduleEvent(EVENT_INTRO_TALK, 15000); + _events.ScheduleEvent(EVENT_DREAM_PORTAL, urand(45000, 48000)); + if (IsHeroic()) + _events.ScheduleEvent(EVENT_BERSERK, 420000); + } + + void HealReceived(Unit* healer, uint32& heal) + { + if (!me->hasLootRecipient()) + me->SetLootRecipient(healer); + me->LowerPlayerDamageReq(heal); + + // encounter complete + if (me->HealthAbovePctHealed(100, heal) && !_done) + { + _done = true; + Talk(SAY_VALITHRIA_SUCCESS); + _instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + _instance->DoRemoveAurasDueToSpellOnPlayers(70766); + me->RemoveAurasDueToSpell(SPELL_CORRUPTION_VALITHRIA); + me->CastSpell(me, SPELL_ACHIEVEMENT_CHECK, true); + me->CastSpell((Unit*)NULL, SPELL_DREAMWALKERS_RAGE, false); + _events.Reset(); + _events.ScheduleEvent(EVENT_DREAM_SLIP, 3500); + _instance->SetBossState(DATA_VALITHRIA_DREAMWALKER, DONE); + + if (Creature* trigger = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_VALITHRIA_TRIGGER))) + trigger->AI()->EnterEvadeMode(); + if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_VALITHRIA_LICH_KING))) + lichKing->AI()->Reset(); + } + else if (!_over75PercentTalkDone && me->HealthAbovePctHealed(75, heal)) + { + _over75PercentTalkDone = true; + Talk(SAY_VALITHRIA_75_PERCENT); + } + else if (_instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) == NOT_STARTED) + if (Creature* trigger = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_VALITHRIA_TRIGGER))) + trigger->AI()->DoAction(ACTION_ENTER_COMBAT); + } + + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) + { + if (me->HealthBelowPctDamaged(25, damage)) + { + if (!_under25PercentTalkDone) + { + _under25PercentTalkDone = true; + Talk(SAY_VALITHRIA_25_PERCENT); + } + + if (damage >= me->GetHealth()) + { + damage = 0; + if (!_justDied) + { + _justDied = true; + Talk(SAY_VALITHRIA_DEATH); + _instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + if (Creature* trigger = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_VALITHRIA_TRIGGER))) + trigger->AI()->EnterEvadeMode(); + } + } + } + } + + void SpellHit(Unit* /*caster*/, SpellInfo const* spell) + { + if (spell->Id == SPELL_DREAM_SLIP) + { + me->CastSpell(me, SPELL_CLEAR_ALL, true); + me->CastSpell(me, SPELL_AWARD_REPUTATION_BOSS_KILL, true); + // this display id was found in sniff instead of the one on aura + me->SetDisplayId(11686); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->DespawnOrUnsummon(4000); + if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_VALITHRIA_LICH_KING))) + lichKing->CastSpell(lichKing, SPELL_SPAWN_CHEST, false); + _instance->SetData(DATA_WEEKLY_QUEST_ID, 0); // show hidden npc if necessary + } + } + + void JustSummoned(Creature* summon) + { + if (summon->GetEntry() == NPC_DREAM_PORTAL_PRE_EFFECT) + { + summon->m_Events.AddEvent(new DelayedCastEvent(summon, SPELL_SUMMON_DREAM_PORTAL, me->GetGUID(), 6000), summon->m_Events.CalculateTime(15000)); + summon->m_Events.AddEvent(new AuraRemoveEvent(summon, SPELL_DREAM_PORTAL_VISUAL_PRE), summon->m_Events.CalculateTime(15000)); + } + else if (summon->GetEntry() == NPC_NIGHTMARE_PORTAL_PRE_EFFECT) + { + summon->m_Events.AddEvent(new DelayedCastEvent(summon, SPELL_SUMMON_NIGHTMARE_PORTAL, me->GetGUID(), 6000), summon->m_Events.CalculateTime(15000)); + summon->m_Events.AddEvent(new AuraRemoveEvent(summon, SPELL_NIGHTMARE_PORTAL_VISUAL_PRE), summon->m_Events.CalculateTime(15000)); + } + } + + void SummonedCreatureDespawn(Creature* summon) + { + if (summon->GetEntry() == NPC_DREAM_PORTAL || summon->GetEntry() == NPC_NIGHTMARE_PORTAL) + if (summon->AI()->GetData(MISSED_PORTALS)) + ++_missedPortals; + } + + void UpdateAI(uint32 diff) + { + // does not enter combat + if (_instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) == NOT_STARTED) + { + if (me->GetHealth() != _spawnHealth) // healing when boss cannot be engaged (lower spire not finished, cheating) doesn't start the fight, prevent winning this way + me->SetHealth(_spawnHealth); + return; + } + + _events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (_events.ExecuteEvent()) + { + case EVENT_INTRO_TALK: + Talk(SAY_VALITHRIA_ENTER_COMBAT); + break; + case EVENT_BERSERK: + Talk(SAY_VALITHRIA_BERSERK); + break; + case EVENT_DREAM_PORTAL: + if (!IsHeroic()) + Talk(SAY_VALITHRIA_DREAM_PORTAL); + for (uint32 i = 0; i < _portalCount; ++i) + me->CastSpell(me, SUMMON_PORTAL, false); + _events.ScheduleEvent(EVENT_DREAM_PORTAL, urand(45000, 48000)); + break; + case EVENT_DREAM_SLIP: + me->CastSpell(me, SPELL_DREAM_SLIP, false); + break; + default: + break; + } + } + + uint32 GetData(uint32 type) const + { + if (type == MISSED_PORTALS) + return _missedPortals; + + return 0; + } + + private: + EventMap _events; + InstanceScript* _instance; + uint32 _spawnHealth; + uint32 const _portalCount; + uint32 _missedPortals; + bool _under25PercentTalkDone; + bool _over75PercentTalkDone; + bool _justDied; + bool _done; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class npc_green_dragon_combat_trigger : public CreatureScript { - public: - npc_green_dragon_combat_trigger() : CreatureScript("npc_green_dragon_combat_trigger") { } +public: + npc_green_dragon_combat_trigger() : CreatureScript("npc_green_dragon_combat_trigger") { } - struct npc_green_dragon_combat_triggerAI : public BossAI + struct npc_green_dragon_combat_triggerAI : public BossAI + { + npc_green_dragon_combat_triggerAI(Creature* creature) : BossAI(creature, DATA_VALITHRIA_DREAMWALKER) { - npc_green_dragon_combat_triggerAI(Creature* creature) : BossAI(creature, DATA_VALITHRIA_DREAMWALKER) - { - } + } - void Reset() - { - events.Reset(); - summons.DespawnAll(); - if (instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) != DONE) - instance->SetBossState(DATA_VALITHRIA_DREAMWALKER, NOT_STARTED); - me->SetReactState(REACT_PASSIVE); - checkTimer = 5000; - } + void Reset() + { + events.Reset(); + summons.DespawnAll(); + if (instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) != DONE) + instance->SetBossState(DATA_VALITHRIA_DREAMWALKER, NOT_STARTED); + me->SetReactState(REACT_PASSIVE); + checkTimer = 5000; + } - void EnterCombat(Unit* target) + void EnterCombat(Unit* target) + { + if (!instance->CheckRequiredBosses(DATA_VALITHRIA_DREAMWALKER, target->ToPlayer())) { - if (!instance->CheckRequiredBosses(DATA_VALITHRIA_DREAMWALKER, target->ToPlayer())) - { - me->setActive(true); - EnterEvadeMode(); - instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT); - return; - } - if (instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) == DONE) - { - me->CombatStop(); - return; - } - me->setActive(true); - me->SetInCombatWithZone(); - instance->SetBossState(DATA_VALITHRIA_DREAMWALKER, IN_PROGRESS); - if (Creature* valithria = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_VALITHRIA_DREAMWALKER))) - valithria->AI()->DoAction(ACTION_ENTER_COMBAT); - if (Creature* lichKing = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_VALITHRIA_LICH_KING))) - lichKing->AI()->DoAction(ACTION_ENTER_COMBAT); - - std::list archmages; - RisenArchmageCheck check; - acore::CreatureListSearcher searcher(me, archmages, check); - me->VisitNearbyGridObject(100.0f, searcher); - for (std::list::iterator itr = archmages.begin(); itr != archmages.end(); ++itr) - (*itr)->AI()->DoAction(ACTION_ENTER_COMBAT); + EnterEvadeMode(); + instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT); + return; } - - void AttackStart(Unit* target) + if (instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) == DONE) { - if (target->GetTypeId() == TYPEID_PLAYER) - BossAI::AttackStart(target); + me->CombatStop(); + return; } - void MoveInLineOfSight(Unit* /*who*/) {} + me->setActive(true); + me->SetInCombatWithZone(); + instance->SetBossState(DATA_VALITHRIA_DREAMWALKER, IN_PROGRESS); + if (Creature* valithria = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_VALITHRIA_DREAMWALKER))) + valithria->AI()->DoAction(ACTION_ENTER_COMBAT); + if (Creature* lichKing = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_VALITHRIA_LICH_KING))) + lichKing->AI()->DoAction(ACTION_ENTER_COMBAT); - bool CanAIAttack(Unit const* target) const - { - return target->GetTypeId() == TYPEID_PLAYER; - } + std::list archmages; + RisenArchmageCheck check; + acore::CreatureListSearcher searcher(me, archmages, check); + me->VisitNearbyGridObject(100.0f, searcher); + for (std::list::iterator itr = archmages.begin(); itr != archmages.end(); ++itr) + (*itr)->AI()->DoAction(ACTION_ENTER_COMBAT); + } - void JustReachedHome() - { - if (instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) != DONE) - DoAction(ACTION_DEATH); // setActive(false) in ValithriaDespawner - else - _JustReachedHome(); - } + void AttackStart(Unit* target) + { + if (target->GetTypeId() == TYPEID_PLAYER) + BossAI::AttackStart(target); + } - void DoAction(int32 action) - { - if (action == ACTION_DEATH) - me->m_Events.AddEvent(new ValithriaDespawner(me), me->m_Events.CalculateTime(5000)); - else if (action == ACTION_ENTER_COMBAT) - { - if (!me->IsInCombat()) - me->SetInCombatWithZone(); - } - } + void MoveInLineOfSight(Unit* /*who*/) {} - void UpdateAI(uint32 diff) + bool CanAIAttack(Unit const* target) const + { + return target->GetTypeId() == TYPEID_PLAYER; + } + + void JustReachedHome() + { + if (instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) != DONE) + DoAction(ACTION_DEATH); // setActive(false) in ValithriaDespawner + else + _JustReachedHome(); + } + + void DoAction(int32 action) + { + if (action == ACTION_DEATH) + me->m_Events.AddEvent(new ValithriaDespawner(me), me->m_Events.CalculateTime(5000)); + else if (action == ACTION_ENTER_COMBAT) { if (!me->IsInCombat()) - return; - - if (checkTimer <= diff) - { - checkTimer = 3000; me->SetInCombatWithZone(); - ThreatContainer::StorageType const& threatList = me->getThreatManager().getThreatList(); - if (!threatList.empty()) - for (ThreatContainer::StorageType::const_iterator itr = threatList.begin(); itr != threatList.end(); ++itr) - if (Unit* target = (*itr)->getTarget()) - if (target->IsAlive() && target->GetTypeId() == TYPEID_PLAYER && me->GetExactDist(target) < 200.0f && !target->IsImmunedToDamageOrSchool(SPELL_SCHOOL_MASK_ALL)) - return; - EnterEvadeMode(); - } - else - checkTimer -= diff; } - - private: - uint16 checkTimer; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); } + + void UpdateAI(uint32 diff) + { + if (!me->IsInCombat()) + return; + + if (checkTimer <= diff) + { + checkTimer = 3000; + me->SetInCombatWithZone(); + ThreatContainer::StorageType const& threatList = me->getThreatManager().getThreatList(); + if (!threatList.empty()) + for (ThreatContainer::StorageType::const_iterator itr = threatList.begin(); itr != threatList.end(); ++itr) + if (Unit* target = (*itr)->getTarget()) + if (target->IsAlive() && target->GetTypeId() == TYPEID_PLAYER && me->GetExactDist(target) < 200.0f && !target->IsImmunedToDamageOrSchool(SPELL_SCHOOL_MASK_ALL)) + return; + EnterEvadeMode(); + } + else + checkTimer -= diff; + } + + private: + uint16 checkTimer; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class npc_the_lich_king_controller : public CreatureScript { - public: - npc_the_lich_king_controller() : CreatureScript("npc_the_lich_king_controller") { } +public: + npc_the_lich_king_controller() : CreatureScript("npc_the_lich_king_controller") { } - struct npc_the_lich_king_controllerAI : public ScriptedAI + struct npc_the_lich_king_controllerAI : public ScriptedAI + { + npc_the_lich_king_controllerAI(Creature* creature) : ScriptedAI(creature), + _instance(creature->GetInstanceScript()) { - npc_the_lich_king_controllerAI(Creature* creature) : ScriptedAI(creature), - _instance(creature->GetInstanceScript()) - { - me->SetReactState(REACT_PASSIVE); - } - - void Reset() - { - _events.Reset(); - me->RemoveAllAuras(); - me->CombatStop(); - } - - void DoAction(int32 action) - { - if (action == ACTION_ENTER_COMBAT) - { - Talk(SAY_LICH_KING_INTRO); - _events.Reset(); - _events.ScheduleEvent(EVENT_GLUTTONOUS_ABOMINATION_SUMMONER, 5000); - _events.ScheduleEvent(EVENT_SUPPRESSER_SUMMONER, 10000); - _events.ScheduleEvent(EVENT_BLISTERING_ZOMBIE_SUMMONER, 15000); - _events.ScheduleEvent(EVENT_RISEN_ARCHMAGE_SUMMONER, 20000); - _events.ScheduleEvent(EVENT_BLAZING_SKELETON_SUMMONER, 30000); - } - } - - void AttackStart(Unit* /*who*/) {} - void MoveInLineOfSight(Unit* /*who*/) {} - - void JustSummoned(Creature* summon) - { - summon->SetPhaseMask((summon->GetPhaseMask() & ~0x10), true); // must not be in dream phase - if (summon->GetEntry() != NPC_SUPPRESSER) - if (Unit* target = SelectTargetFromPlayerList(200.0f)) - summon->AI()->AttackStart(target); - } - - void UpdateAI(uint32 diff) - { - // does not enter combat - if (_instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) != IN_PROGRESS) - return; - - _events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (_events.ExecuteEvent()) - { - case EVENT_GLUTTONOUS_ABOMINATION_SUMMONER: - me->CastSpell(me, SPELL_TIMER_GLUTTONOUS_ABOMINATION, false); - break; - case EVENT_SUPPRESSER_SUMMONER: - me->CastSpell(me, SPELL_TIMER_SUPPRESSER, false); - break; - case EVENT_BLISTERING_ZOMBIE_SUMMONER: - me->CastSpell(me, SPELL_TIMER_BLISTERING_ZOMBIE, false); - break; - case EVENT_RISEN_ARCHMAGE_SUMMONER: - me->CastSpell(me, SPELL_TIMER_RISEN_ARCHMAGE, false); - break; - case EVENT_BLAZING_SKELETON_SUMMONER: - me->CastSpell(me, SPELL_TIMER_BLAZING_SKELETON, false); - break; - default: - break; - } - } - - private: - EventMap _events; - InstanceScript* _instance; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_the_lich_king_controllerAI(creature); + me->SetReactState(REACT_PASSIVE); } + + void Reset() + { + _events.Reset(); + me->RemoveAllAuras(); + me->CombatStop(); + } + + void DoAction(int32 action) + { + if (action == ACTION_ENTER_COMBAT) + { + Talk(SAY_LICH_KING_INTRO); + _events.Reset(); + _events.ScheduleEvent(EVENT_GLUTTONOUS_ABOMINATION_SUMMONER, 5000); + _events.ScheduleEvent(EVENT_SUPPRESSER_SUMMONER, 10000); + _events.ScheduleEvent(EVENT_BLISTERING_ZOMBIE_SUMMONER, 15000); + _events.ScheduleEvent(EVENT_RISEN_ARCHMAGE_SUMMONER, 20000); + _events.ScheduleEvent(EVENT_BLAZING_SKELETON_SUMMONER, 30000); + } + } + + void AttackStart(Unit* /*who*/) {} + void MoveInLineOfSight(Unit* /*who*/) {} + + void JustSummoned(Creature* summon) + { + summon->SetPhaseMask((summon->GetPhaseMask() & ~0x10), true); // must not be in dream phase + if (summon->GetEntry() != NPC_SUPPRESSER) + if (Unit* target = SelectTargetFromPlayerList(200.0f)) + summon->AI()->AttackStart(target); + } + + void UpdateAI(uint32 diff) + { + // does not enter combat + if (_instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) != IN_PROGRESS) + return; + + _events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (_events.ExecuteEvent()) + { + case EVENT_GLUTTONOUS_ABOMINATION_SUMMONER: + me->CastSpell(me, SPELL_TIMER_GLUTTONOUS_ABOMINATION, false); + break; + case EVENT_SUPPRESSER_SUMMONER: + me->CastSpell(me, SPELL_TIMER_SUPPRESSER, false); + break; + case EVENT_BLISTERING_ZOMBIE_SUMMONER: + me->CastSpell(me, SPELL_TIMER_BLISTERING_ZOMBIE, false); + break; + case EVENT_RISEN_ARCHMAGE_SUMMONER: + me->CastSpell(me, SPELL_TIMER_RISEN_ARCHMAGE, false); + break; + case EVENT_BLAZING_SKELETON_SUMMONER: + me->CastSpell(me, SPELL_TIMER_BLAZING_SKELETON, false); + break; + default: + break; + } + } + + private: + EventMap _events; + InstanceScript* _instance; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_the_lich_king_controllerAI(creature); + } }; class npc_risen_archmage : public CreatureScript { - public: - npc_risen_archmage() : CreatureScript("npc_risen_archmage") { } +public: + npc_risen_archmage() : CreatureScript("npc_risen_archmage") { } - struct npc_risen_archmageAI : public ScriptedAI + struct npc_risen_archmageAI : public ScriptedAI + { + npc_risen_archmageAI(Creature* creature) : ScriptedAI(creature), + _instance(creature->GetInstanceScript()) { - npc_risen_archmageAI(Creature* creature) : ScriptedAI(creature), - _instance(creature->GetInstanceScript()) - { - } - - bool CanAIAttack(Unit const* target) const - { - return target->GetEntry() != NPC_VALITHRIA_DREAMWALKER; - } - - void Reset() - { - _events.Reset(); - _events.ScheduleEvent(EVENT_FROSTBOLT_VOLLEY, urand(5000, 15000)); - _events.ScheduleEvent(EVENT_MANA_VOID, urand(15000, 25000)); - _events.ScheduleEvent(EVENT_COLUMN_OF_FROST, urand(10000, 20000)); - } - - void EnterCombat(Unit* /*target*/) - { - me->FinishSpell(CURRENT_CHANNELED_SPELL, false); - me->SetInCombatWithZone(); - if (me->GetDBTableGUIDLow()) - if (Creature* trigger = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_VALITHRIA_TRIGGER))) - trigger->AI()->DoAction(ACTION_ENTER_COMBAT); - } - - void DoAction(int32 action) - { - if (action == ACTION_ENTER_COMBAT && !me->IsInCombat()) - me->SetInCombatWithZone(); - } - - void JustSummoned(Creature* summon) - { - if (summon->GetEntry() == NPC_COLUMN_OF_FROST) - summon->m_Events.AddEvent(new DelayedCastEvent(summon, SPELL_COLUMN_OF_FROST_DAMAGE, 0, 8000), summon->m_Events.CalculateTime(2000)); - else if (summon->GetEntry() == NPC_MANA_VOID) - summon->DespawnOrUnsummon(36000); - } - - void UpdateAI(uint32 diff) - { - if (!me->IsInCombat()) - if (me->GetDBTableGUIDLow()) - if (!me->GetCurrentSpell(CURRENT_CHANNELED_SPELL)) - me->CastSpell(me, SPELL_CORRUPTION, false); - - if (!UpdateVictim()) - return; - - _events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = _events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_FROSTBOLT_VOLLEY: - me->CastSpell(me, SPELL_FROSTBOLT_VOLLEY, false); - _events.ScheduleEvent(EVENT_FROSTBOLT_VOLLEY, urand(8000, 15000)); - break; - case EVENT_MANA_VOID: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, ManaVoidSelector(me))) - me->CastSpell(target, SPELL_MANA_VOID, false); - _events.ScheduleEvent(EVENT_MANA_VOID, urand(20000, 25000)); - break; - case EVENT_COLUMN_OF_FROST: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, -10.0f, true)) - me->CastSpell(target, SPELL_COLUMN_OF_FROST, false); - _events.ScheduleEvent(EVENT_COLUMN_OF_FROST, urand(15000, 25000)); - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); - } - - private: - EventMap _events; - InstanceScript* _instance; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); } + + bool CanAIAttack(Unit const* target) const + { + return target->GetEntry() != NPC_VALITHRIA_DREAMWALKER; + } + + void Reset() + { + _events.Reset(); + _events.ScheduleEvent(EVENT_FROSTBOLT_VOLLEY, urand(5000, 15000)); + _events.ScheduleEvent(EVENT_MANA_VOID, urand(15000, 25000)); + _events.ScheduleEvent(EVENT_COLUMN_OF_FROST, urand(10000, 20000)); + } + + void EnterCombat(Unit* /*target*/) + { + me->FinishSpell(CURRENT_CHANNELED_SPELL, false); + me->SetInCombatWithZone(); + if (me->GetDBTableGUIDLow()) + if (Creature* trigger = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_VALITHRIA_TRIGGER))) + trigger->AI()->DoAction(ACTION_ENTER_COMBAT); + } + + void DoAction(int32 action) + { + if (action == ACTION_ENTER_COMBAT && !me->IsInCombat()) + me->SetInCombatWithZone(); + } + + void JustSummoned(Creature* summon) + { + if (summon->GetEntry() == NPC_COLUMN_OF_FROST) + summon->m_Events.AddEvent(new DelayedCastEvent(summon, SPELL_COLUMN_OF_FROST_DAMAGE, 0, 8000), summon->m_Events.CalculateTime(2000)); + else if (summon->GetEntry() == NPC_MANA_VOID) + summon->DespawnOrUnsummon(36000); + } + + void UpdateAI(uint32 diff) + { + if (!me->IsInCombat()) + if (me->GetDBTableGUIDLow()) + if (!me->GetCurrentSpell(CURRENT_CHANNELED_SPELL)) + me->CastSpell(me, SPELL_CORRUPTION, false); + + if (!UpdateVictim()) + return; + + _events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_FROSTBOLT_VOLLEY: + me->CastSpell(me, SPELL_FROSTBOLT_VOLLEY, false); + _events.ScheduleEvent(EVENT_FROSTBOLT_VOLLEY, urand(8000, 15000)); + break; + case EVENT_MANA_VOID: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, ManaVoidSelector(me))) + me->CastSpell(target, SPELL_MANA_VOID, false); + _events.ScheduleEvent(EVENT_MANA_VOID, urand(20000, 25000)); + break; + case EVENT_COLUMN_OF_FROST: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, -10.0f, true)) + me->CastSpell(target, SPELL_COLUMN_OF_FROST, false); + _events.ScheduleEvent(EVENT_COLUMN_OF_FROST, urand(15000, 25000)); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + + private: + EventMap _events; + InstanceScript* _instance; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class npc_valithria_portal : public CreatureScript { - public: - npc_valithria_portal() : CreatureScript("npc_valithria_portal") { } +public: + npc_valithria_portal() : CreatureScript("npc_valithria_portal") { } - struct npc_valithria_portalAI : public NullCreatureAI + struct npc_valithria_portalAI : public NullCreatureAI + { + npc_valithria_portalAI(Creature* creature) : NullCreatureAI(creature), _used(false) {} + + void OnSpellClick(Unit* /*clicker*/, bool& result) { - npc_valithria_portalAI(Creature* creature) : NullCreatureAI(creature), _used(false) {} + if (!result) + return; - void OnSpellClick(Unit* /*clicker*/, bool& result) - { - if (!result) - return; - - _used = true; - me->DespawnOrUnsummon(); - } - - uint32 GetData(uint32 type) const - { - return (type == MISSED_PORTALS && _used) ? 0 : 1; - } - - private: - bool _used; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + _used = true; + me->DespawnOrUnsummon(); } + + uint32 GetData(uint32 type) const + { + return (type == MISSED_PORTALS && _used) ? 0 : 1; + } + + private: + bool _used; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class npc_valithria_cloud : public CreatureScript { - public: - npc_valithria_cloud() : CreatureScript("npc_valithria_cloud") { } +public: + npc_valithria_cloud() : CreatureScript("npc_valithria_cloud") { } - struct npc_valithria_cloudAI : public ScriptedAI + struct npc_valithria_cloudAI : public ScriptedAI + { + npc_valithria_cloudAI(Creature* creature) : ScriptedAI(creature), + _instance(creature->GetInstanceScript()) { - npc_valithria_cloudAI(Creature* creature) : ScriptedAI(creature), - _instance(creature->GetInstanceScript()) - { - } - - void Reset() - { - _events.Reset(); - _events.ScheduleEvent(EVENT_CHECK_PLAYER, 750); - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); - me->SetCorpseDelay(0); - me->LoadCreaturesAddon(true); - } - - void AttackStart(Unit*) {} - void MoveInLineOfSight(Unit*) {} - void EnterEvadeMode() {} - - void UpdateAI(uint32 diff) - { - if (_instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) != IN_PROGRESS) - return; - - _events.Update(diff); - - switch (_events.ExecuteEvent()) - { - case EVENT_CHECK_PLAYER: - if (me->SelectNearestPlayer(5.0f)) // also checks phase - _events.ScheduleEvent(EVENT_EXPLODE, 500); - else - _events.ScheduleEvent(EVENT_CHECK_PLAYER, 750); - break; - case EVENT_EXPLODE: - me->StopMoving(); - me->GetMotionMaster()->Clear(false); - me->GetMotionMaster()->MoveIdle(); - // must use originalCaster the same for all clouds to allow stacking - me->CastSpell(me, EMERALD_VIGOR, false, nullptr, nullptr, _instance->GetData64(DATA_VALITHRIA_DREAMWALKER)); - me->DespawnOrUnsummon(1000); - break; - default: - break; - } - } - - private: - EventMap _events; - InstanceScript* _instance; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); } + + void Reset() + { + _events.Reset(); + _events.ScheduleEvent(EVENT_CHECK_PLAYER, 750); + me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + me->SetCorpseDelay(0); + me->LoadCreaturesAddon(true); + } + + void AttackStart(Unit*) {} + void MoveInLineOfSight(Unit*) {} + void EnterEvadeMode() {} + + void UpdateAI(uint32 diff) + { + if (_instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) != IN_PROGRESS) + return; + + _events.Update(diff); + + switch (_events.ExecuteEvent()) + { + case EVENT_CHECK_PLAYER: + if (me->SelectNearestPlayer(5.0f)) // also checks phase + _events.ScheduleEvent(EVENT_EXPLODE, 500); + else + _events.ScheduleEvent(EVENT_CHECK_PLAYER, 750); + break; + case EVENT_EXPLODE: + me->StopMoving(); + me->GetMotionMaster()->Clear(false); + me->GetMotionMaster()->MoveIdle(); + // must use originalCaster the same for all clouds to allow stacking + me->CastSpell(me, EMERALD_VIGOR, false, nullptr, nullptr, _instance->GetData64(DATA_VALITHRIA_DREAMWALKER)); + me->DespawnOrUnsummon(1000); + break; + default: + break; + } + } + + private: + EventMap _events; + InstanceScript* _instance; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class npc_blazing_skeleton : public CreatureScript { - public: - npc_blazing_skeleton() : CreatureScript("npc_blazing_skeleton") { } +public: + npc_blazing_skeleton() : CreatureScript("npc_blazing_skeleton") { } - struct npc_blazing_skeletonAI : public ScriptedAI + struct npc_blazing_skeletonAI : public ScriptedAI + { + npc_blazing_skeletonAI(Creature* creature) : ScriptedAI(creature) { - npc_blazing_skeletonAI(Creature* creature) : ScriptedAI(creature) - { - } - - void Reset() - { - _events.Reset(); - _events.ScheduleEvent(EVENT_FIREBALL, urand(2000, 4000)); - _events.ScheduleEvent(EVENT_LEY_WASTE, urand(15000, 20000)); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - _events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (_events.ExecuteEvent()) - { - case EVENT_FIREBALL: - if (!me->IsWithinMeleeRange(me->GetVictim())) - me->CastSpell(me->GetVictim(), SPELL_FIREBALL, false); - _events.ScheduleEvent(EVENT_FIREBALL, urand(2000, 4000)); - break; - case EVENT_LEY_WASTE: - me->CastSpell(me, SPELL_LEY_WASTE, false); - _events.ScheduleEvent(EVENT_LEY_WASTE, urand(15000, 20000)); - break; - default: - break; - } - - DoMeleeAttackIfReady(); - } - - private: - EventMap _events; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); } + + void Reset() + { + _events.Reset(); + _events.ScheduleEvent(EVENT_FIREBALL, urand(2000, 4000)); + _events.ScheduleEvent(EVENT_LEY_WASTE, urand(15000, 20000)); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + _events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (_events.ExecuteEvent()) + { + case EVENT_FIREBALL: + if (!me->IsWithinMeleeRange(me->GetVictim())) + me->CastSpell(me->GetVictim(), SPELL_FIREBALL, false); + _events.ScheduleEvent(EVENT_FIREBALL, urand(2000, 4000)); + break; + case EVENT_LEY_WASTE: + me->CastSpell(me, SPELL_LEY_WASTE, false); + _events.ScheduleEvent(EVENT_LEY_WASTE, urand(15000, 20000)); + break; + default: + break; + } + + DoMeleeAttackIfReady(); + } + + private: + EventMap _events; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class npc_suppresser : public CreatureScript { - public: - npc_suppresser() : CreatureScript("npc_suppresser") { } +public: + npc_suppresser() : CreatureScript("npc_suppresser") { } - struct npc_suppresserAI : public ScriptedAI + struct npc_suppresserAI : public ScriptedAI + { + npc_suppresserAI(Creature* creature) : ScriptedAI(creature), + _instance(creature->GetInstanceScript()) { - npc_suppresserAI(Creature* creature) : ScriptedAI(creature), - _instance(creature->GetInstanceScript()) - { - me->SetReactState(REACT_PASSIVE); - } - - InstanceScript* const _instance; - - void AttackStart(Unit* who) - { - if (who->GetEntry() == NPC_VALITHRIA_DREAMWALKER) - ScriptedAI::AttackStart(who); - } - - void IsSummonedBy(Unit* /*summoner*/) - { - if (Creature* valithria = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_VALITHRIA_DREAMWALKER))) - AttackStart(valithria); - } - - void UpdateAI(uint32 /*diff*/) - { - if (!UpdateVictim()) - return; - - if (!me->GetVictim()) - if (Creature* valithria = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_VALITHRIA_DREAMWALKER))) - if (valithria->IsAlive()) - AttackStart(valithria); - - if (!me->GetVictim() || me->GetVictim()->GetEntry() != NPC_VALITHRIA_DREAMWALKER) - return; - - if (!me->HasUnitState(UNIT_STATE_CASTING) && !me->isMoving() && me->IsWithinMeleeRange(me->GetVictim())) - me->CastSpell((Unit*)NULL, SPELL_SUPPRESSION, false); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + me->SetReactState(REACT_PASSIVE); } + + InstanceScript* const _instance; + + void AttackStart(Unit* who) + { + if (who->GetEntry() == NPC_VALITHRIA_DREAMWALKER) + ScriptedAI::AttackStart(who); + } + + void IsSummonedBy(Unit* /*summoner*/) + { + if (Creature* valithria = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_VALITHRIA_DREAMWALKER))) + AttackStart(valithria); + } + + void UpdateAI(uint32 /*diff*/) + { + if (!UpdateVictim()) + return; + + if (!me->GetVictim()) + if (Creature* valithria = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_VALITHRIA_DREAMWALKER))) + if (valithria->IsAlive()) + AttackStart(valithria); + + if (!me->GetVictim() || me->GetVictim()->GetEntry() != NPC_VALITHRIA_DREAMWALKER) + return; + + if (!me->HasUnitState(UNIT_STATE_CASTING) && !me->isMoving() && me->IsWithinMeleeRange(me->GetVictim())) + me->CastSpell((Unit*)NULL, SPELL_SUPPRESSION, false); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class npc_blistering_zombie : public CreatureScript { - public: - npc_blistering_zombie() : CreatureScript("npc_blistering_zombie") { } +public: + npc_blistering_zombie() : CreatureScript("npc_blistering_zombie") { } - struct npc_blistering_zombieAI : public ScriptedAI + struct npc_blistering_zombieAI : public ScriptedAI + { + npc_blistering_zombieAI(Creature* creature) : ScriptedAI(creature) { - npc_blistering_zombieAI(Creature* creature) : ScriptedAI(creature) - { - timer = 0; - casted = false; - } - - uint16 timer; - bool casted; - - void DamageTaken(Unit*, uint32 &dmg, DamageEffectType, SpellSchoolMask) - { - if (dmg >= me->GetHealth()) - { - dmg = me->GetHealth()-1; - if (!casted) - { - casted = true; - me->StopMoving(); - me->GetMotionMaster()->Clear(false); - me->GetMotionMaster()->MoveIdle(); - me->SetControlled(true, UNIT_STATE_ROOT); - me->CastSpell(me, SPELL_ACID_BURST, false); - timer = 750; - } - } - } - - void UpdateAI(uint32 diff) - { - if (timer) - { - if (timer <= diff) - { - timer = 0; - me->SetDisplayId(11686); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->DespawnOrUnsummon(2000); - } - else - timer -= diff; - } - - if (casted) - return; - - if (!UpdateVictim()) - return; - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + timer = 0; + casted = false; } + + uint16 timer; + bool casted; + + void DamageTaken(Unit*, uint32& dmg, DamageEffectType, SpellSchoolMask) + { + if (dmg >= me->GetHealth()) + { + dmg = me->GetHealth() - 1; + if (!casted) + { + casted = true; + me->StopMoving(); + me->GetMotionMaster()->Clear(false); + me->GetMotionMaster()->MoveIdle(); + me->SetControlled(true, UNIT_STATE_ROOT); + me->CastSpell(me, SPELL_ACID_BURST, false); + timer = 750; + } + } + } + + void UpdateAI(uint32 diff) + { + if (timer) + { + if (timer <= diff) + { + timer = 0; + me->SetDisplayId(11686); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->DespawnOrUnsummon(2000); + } + else + timer -= diff; + } + + if (casted) + return; + + if (!UpdateVictim()) + return; + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class npc_gluttonous_abomination : public CreatureScript { - public: - npc_gluttonous_abomination() : CreatureScript("npc_gluttonous_abomination") { } +public: + npc_gluttonous_abomination() : CreatureScript("npc_gluttonous_abomination") { } - struct npc_gluttonous_abominationAI : public ScriptedAI + struct npc_gluttonous_abominationAI : public ScriptedAI + { + npc_gluttonous_abominationAI(Creature* creature) : ScriptedAI(creature) { - npc_gluttonous_abominationAI(Creature* creature) : ScriptedAI(creature) - { - } - - void Reset() - { - _events.Reset(); - _events.ScheduleEvent(EVENT_GUT_SPRAY, urand(10000, 13000)); - } - - void JustSummoned(Creature* summon) - { - if (me->GetInstanceScript() && me->GetInstanceScript()->GetBossState(DATA_VALITHRIA_DREAMWALKER) == DONE) - summon->DespawnOrUnsummon(1); - else if (Unit* target = SelectTargetFromPlayerList(200.0f)) - summon->AI()->AttackStart(target); - } - - void JustDied(Unit* /*killer*/) - { - me->CastSpell(me, SPELL_ROT_WORM_SPAWNER, true); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - _events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (_events.ExecuteEvent()) - { - case EVENT_GUT_SPRAY: - me->CastSpell(me, SPELL_GUT_SPRAY, false); - _events.ScheduleEvent(EVENT_GUT_SPRAY, urand(10000, 13000)); - break; - default: - break; - } - - DoMeleeAttackIfReady(); - } - - private: - EventMap _events; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); } + + void Reset() + { + _events.Reset(); + _events.ScheduleEvent(EVENT_GUT_SPRAY, urand(10000, 13000)); + } + + void JustSummoned(Creature* summon) + { + if (me->GetInstanceScript() && me->GetInstanceScript()->GetBossState(DATA_VALITHRIA_DREAMWALKER) == DONE) + summon->DespawnOrUnsummon(1); + else if (Unit* target = SelectTargetFromPlayerList(200.0f)) + summon->AI()->AttackStart(target); + } + + void JustDied(Unit* /*killer*/) + { + me->CastSpell(me, SPELL_ROT_WORM_SPAWNER, true); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + _events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (_events.ExecuteEvent()) + { + case EVENT_GUT_SPRAY: + me->CastSpell(me, SPELL_GUT_SPRAY, false); + _events.ScheduleEvent(EVENT_GUT_SPRAY, urand(10000, 13000)); + break; + default: + break; + } + + DoMeleeAttackIfReady(); + } + + private: + EventMap _events; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class spell_dreamwalker_summon_portal : public SpellScriptLoader { - public: - spell_dreamwalker_summon_portal() : SpellScriptLoader("spell_dreamwalker_summon_portal") { } +public: + spell_dreamwalker_summon_portal() : SpellScriptLoader("spell_dreamwalker_summon_portal") { } - class spell_dreamwalker_summon_portal_SpellScript : public SpellScript + class spell_dreamwalker_summon_portal_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dreamwalker_summon_portal_SpellScript); + + void HandleScript(SpellEffIndex effIndex) { - PrepareSpellScript(spell_dreamwalker_summon_portal_SpellScript); + PreventHitDefaultEffect(effIndex); + Unit* target = GetHitUnit(); + if (!target) + return; - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - Unit* target = GetHitUnit(); - if (!target) - return; - - uint32 spellId = (GetSpellInfo()->Id == 72224 ? 71301 : 71977); // spell implicit target replaced to TARGET_DEST_DEST - float minDist = 20.0f; - float maxDist = 30.0f; - float dist = (maxDist-minDist)*rand_norm() + minDist; - float startAngle = 3*M_PI/2; - float maxAddAngle = ((target->GetMap()->GetSpawnMode()%2) == 0 ? M_PI : 2*M_PI); - float angle = startAngle + rand_norm()*maxAddAngle; - target->CastSpell(target->GetPositionX()+cos(angle)*dist, target->GetPositionY()+sin(angle)*dist, target->GetPositionZ(), spellId, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_dreamwalker_summon_portal_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dreamwalker_summon_portal_SpellScript(); + uint32 spellId = (GetSpellInfo()->Id == 72224 ? 71301 : 71977); // spell implicit target replaced to TARGET_DEST_DEST + float minDist = 20.0f; + float maxDist = 30.0f; + float dist = (maxDist - minDist) * rand_norm() + minDist; + float startAngle = 3 * M_PI / 2; + float maxAddAngle = ((target->GetMap()->GetSpawnMode() % 2) == 0 ? M_PI : 2 * M_PI); + float angle = startAngle + rand_norm() * maxAddAngle; + target->CastSpell(target->GetPositionX() + cos(angle)*dist, target->GetPositionY() + sin(angle)*dist, target->GetPositionZ(), spellId, true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_dreamwalker_summon_portal_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dreamwalker_summon_portal_SpellScript(); + } }; class spell_dreamwalker_twisted_nightmares : public SpellScriptLoader { - public: - spell_dreamwalker_twisted_nightmares() : SpellScriptLoader("spell_dreamwalker_twisted_nightmares") { } +public: + spell_dreamwalker_twisted_nightmares() : SpellScriptLoader("spell_dreamwalker_twisted_nightmares") { } - class spell_dreamwalker_twisted_nightmares_SpellScript : public SpellScript + class spell_dreamwalker_twisted_nightmares_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dreamwalker_twisted_nightmares_SpellScript); + + void HandleScript(SpellEffIndex effIndex) { - PrepareSpellScript(spell_dreamwalker_twisted_nightmares_SpellScript); + PreventHitDefaultEffect(effIndex); + if (!GetHitUnit()) + return; - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (!GetHitUnit()) - return; - - if (InstanceScript* instance = GetHitUnit()->GetInstanceScript()) - GetHitUnit()->CastSpell((Unit*)NULL, GetSpellInfo()->Effects[effIndex].TriggerSpell, true, nullptr, nullptr, instance->GetData64(DATA_VALITHRIA_DREAMWALKER)); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_dreamwalker_twisted_nightmares_SpellScript::HandleScript, EFFECT_2, SPELL_EFFECT_FORCE_CAST); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dreamwalker_twisted_nightmares_SpellScript(); + if (InstanceScript* instance = GetHitUnit()->GetInstanceScript()) + GetHitUnit()->CastSpell((Unit*)NULL, GetSpellInfo()->Effects[effIndex].TriggerSpell, true, nullptr, nullptr, instance->GetData64(DATA_VALITHRIA_DREAMWALKER)); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_dreamwalker_twisted_nightmares_SpellScript::HandleScript, EFFECT_2, SPELL_EFFECT_FORCE_CAST); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dreamwalker_twisted_nightmares_SpellScript(); + } }; class spell_dreamwalker_nightmare_cloud : public SpellScriptLoader { - public: - spell_dreamwalker_nightmare_cloud() : SpellScriptLoader("spell_dreamwalker_nightmare_cloud") { } +public: + spell_dreamwalker_nightmare_cloud() : SpellScriptLoader("spell_dreamwalker_nightmare_cloud") { } - class spell_dreamwalker_nightmare_cloud_AuraScript : public AuraScript + class spell_dreamwalker_nightmare_cloud_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dreamwalker_nightmare_cloud_AuraScript); + + bool Load() { - PrepareAuraScript(spell_dreamwalker_nightmare_cloud_AuraScript); - - bool Load() - { - _instance = GetOwner()->GetInstanceScript(); - return _instance != nullptr; - } - - void PeriodicTick(AuraEffect const* /*aurEff*/) - { - if (_instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) != IN_PROGRESS) - PreventDefaultAction(); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_dreamwalker_nightmare_cloud_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - - InstanceScript* _instance; - }; - - AuraScript* GetAuraScript() const - { - return new spell_dreamwalker_nightmare_cloud_AuraScript(); + _instance = GetOwner()->GetInstanceScript(); + return _instance != nullptr; } + + void PeriodicTick(AuraEffect const* /*aurEff*/) + { + if (_instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) != IN_PROGRESS) + PreventDefaultAction(); + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_dreamwalker_nightmare_cloud_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + + InstanceScript* _instance; + }; + + AuraScript* GetAuraScript() const + { + return new spell_dreamwalker_nightmare_cloud_AuraScript(); + } }; class spell_dreamwalker_mana_void : public SpellScriptLoader { - public: - spell_dreamwalker_mana_void() : SpellScriptLoader("spell_dreamwalker_mana_void") { } +public: + spell_dreamwalker_mana_void() : SpellScriptLoader("spell_dreamwalker_mana_void") { } - class spell_dreamwalker_mana_void_AuraScript : public AuraScript + class spell_dreamwalker_mana_void_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dreamwalker_mana_void_AuraScript); + + void PeriodicTick(AuraEffect const* aurEff) { - PrepareAuraScript(spell_dreamwalker_mana_void_AuraScript); - - void PeriodicTick(AuraEffect const* aurEff) - { - // first 3 ticks have amplitude 1 second - // remaining tick every 500ms - if (aurEff->GetTickNumber() <= 5) - if (!(aurEff->GetTickNumber() & 1)) - PreventDefaultAction(); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_dreamwalker_mana_void_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dreamwalker_mana_void_AuraScript(); + // first 3 ticks have amplitude 1 second + // remaining tick every 500ms + if (aurEff->GetTickNumber() <= 5) + if (!(aurEff->GetTickNumber() & 1)) + PreventDefaultAction(); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_dreamwalker_mana_void_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dreamwalker_mana_void_AuraScript(); + } }; class spell_dreamwalker_decay_periodic_timer : public SpellScriptLoader { - public: - spell_dreamwalker_decay_periodic_timer() : SpellScriptLoader("spell_dreamwalker_decay_periodic_timer") { } +public: + spell_dreamwalker_decay_periodic_timer() : SpellScriptLoader("spell_dreamwalker_decay_periodic_timer") { } - class spell_dreamwalker_decay_periodic_timer_AuraScript : public AuraScript + class spell_dreamwalker_decay_periodic_timer_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dreamwalker_decay_periodic_timer_AuraScript); + + bool Load() { - PrepareAuraScript(spell_dreamwalker_decay_periodic_timer_AuraScript); - - bool Load() - { - _decayRate = GetId() != SPELL_TIMER_BLAZING_SKELETON ? 1000 : 5000; - return true; - } - - void DecayPeriodicTimer(AuraEffect* aurEff) - { - int32 timer = aurEff->GetPeriodicTimer(); - if (timer <= 5000) - return; - - aurEff->SetPeriodicTimer(timer - _decayRate); - } - - void Register() - { - OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_dreamwalker_decay_periodic_timer_AuraScript::DecayPeriodicTimer, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - - int32 _decayRate; - }; - - AuraScript* GetAuraScript() const - { - return new spell_dreamwalker_decay_periodic_timer_AuraScript(); + _decayRate = GetId() != SPELL_TIMER_BLAZING_SKELETON ? 1000 : 5000; + return true; } + + void DecayPeriodicTimer(AuraEffect* aurEff) + { + int32 timer = aurEff->GetPeriodicTimer(); + if (timer <= 5000) + return; + + aurEff->SetPeriodicTimer(timer - _decayRate); + } + + void Register() + { + OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_dreamwalker_decay_periodic_timer_AuraScript::DecayPeriodicTimer, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + + int32 _decayRate; + }; + + AuraScript* GetAuraScript() const + { + return new spell_dreamwalker_decay_periodic_timer_AuraScript(); + } }; class spell_dreamwalker_summoner : public SpellScriptLoader { - public: - spell_dreamwalker_summoner() : SpellScriptLoader("spell_dreamwalker_summoner") { } +public: + spell_dreamwalker_summoner() : SpellScriptLoader("spell_dreamwalker_summoner") { } - class spell_dreamwalker_summoner_SpellScript : public SpellScript + class spell_dreamwalker_summoner_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dreamwalker_summoner_SpellScript); + + bool Load() { - PrepareSpellScript(spell_dreamwalker_summoner_SpellScript); - - bool Load() - { - if (!GetCaster()->GetInstanceScript()) - return false; - return true; - } - - void FilterTargets(std::list& targets) - { - targets.remove_if(acore::AllWorldObjectsInExactRange(GetCaster(), 250.0f, true)); - std::list list_copy = targets; - targets.remove_if(acore::UnitAuraCheck(true, SPELL_RECENTLY_SPAWNED)); - if (targets.empty()) - { - if (list_copy.empty()) - return; - targets = list_copy; - } - - WorldObject* target = acore::Containers::SelectRandomContainerElement(targets); - targets.clear(); - targets.push_back(target); - } - - void HandleForceCast(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (!GetHitUnit()) - return; - - GetHitUnit()->CastSpell(GetCaster(), GetSpellInfo()->Effects[effIndex].TriggerSpell, true, nullptr, nullptr, GetCaster()->GetInstanceScript()->GetData64(DATA_VALITHRIA_LICH_KING)); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dreamwalker_summoner_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); - OnEffectHitTarget += SpellEffectFn(spell_dreamwalker_summoner_SpellScript::HandleForceCast, EFFECT_0, SPELL_EFFECT_FORCE_CAST); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dreamwalker_summoner_SpellScript(); + if (!GetCaster()->GetInstanceScript()) + return false; + return true; } + + void FilterTargets(std::list& targets) + { + targets.remove_if(acore::AllWorldObjectsInExactRange(GetCaster(), 250.0f, true)); + std::list list_copy = targets; + targets.remove_if(acore::UnitAuraCheck(true, SPELL_RECENTLY_SPAWNED)); + if (targets.empty()) + { + if (list_copy.empty()) + return; + targets = list_copy; + } + + WorldObject* target = acore::Containers::SelectRandomContainerElement(targets); + targets.clear(); + targets.push_back(target); + } + + void HandleForceCast(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (!GetHitUnit()) + return; + + GetHitUnit()->CastSpell(GetCaster(), GetSpellInfo()->Effects[effIndex].TriggerSpell, true, nullptr, nullptr, GetCaster()->GetInstanceScript()->GetData64(DATA_VALITHRIA_LICH_KING)); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dreamwalker_summoner_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + OnEffectHitTarget += SpellEffectFn(spell_dreamwalker_summoner_SpellScript::HandleForceCast, EFFECT_0, SPELL_EFFECT_FORCE_CAST); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dreamwalker_summoner_SpellScript(); + } }; class spell_dreamwalker_summon_suppresser : public SpellScriptLoader { - public: - spell_dreamwalker_summon_suppresser() : SpellScriptLoader("spell_dreamwalker_summon_suppresser") { } +public: + spell_dreamwalker_summon_suppresser() : SpellScriptLoader("spell_dreamwalker_summon_suppresser") { } - class spell_dreamwalker_summon_suppresser_AuraScript : public AuraScript + class spell_dreamwalker_summon_suppresser_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dreamwalker_summon_suppresser_AuraScript); + + void PeriodicTick(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_dreamwalker_summon_suppresser_AuraScript); + PreventDefaultAction(); + Unit* caster = GetCaster(); + if (!caster) + return; - void PeriodicTick(AuraEffect const* /*aurEff*/) + std::list summoners; + caster->GetCreaturesWithEntryInRange(summoners, 200.0f, NPC_WORLD_TRIGGER); + std::list list_copy = summoners; + summoners.remove_if(acore::UnitAuraCheck(true, SPELL_RECENTLY_SPAWNED)); + if (summoners.empty()) { - PreventDefaultAction(); - Unit* caster = GetCaster(); - if (!caster) + if (list_copy.empty()) return; - - std::list summoners; - caster->GetCreaturesWithEntryInRange(summoners, 200.0f, NPC_WORLD_TRIGGER); - std::list list_copy = summoners; - summoners.remove_if(acore::UnitAuraCheck(true, SPELL_RECENTLY_SPAWNED)); - if (summoners.empty()) - { - if (list_copy.empty()) - return; - summoners = list_copy; - } - acore::Containers::RandomResizeList(summoners, 2); - - for (uint32 i = 0; i < 3; ++i) - caster->CastSpell(summoners.front(), SPELL_SUMMON_SUPPRESSER, true); - for (uint32 i = 0; i < 3; ++i) - caster->CastSpell(summoners.back(), SPELL_SUMMON_SUPPRESSER, true); + summoners = list_copy; } + acore::Containers::RandomResizeList(summoners, 2); - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_dreamwalker_summon_suppresser_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dreamwalker_summon_suppresser_AuraScript(); + for (uint32 i = 0; i < 3; ++i) + caster->CastSpell(summoners.front(), SPELL_SUMMON_SUPPRESSER, true); + for (uint32 i = 0; i < 3; ++i) + caster->CastSpell(summoners.back(), SPELL_SUMMON_SUPPRESSER, true); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_dreamwalker_summon_suppresser_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dreamwalker_summon_suppresser_AuraScript(); + } }; class spell_dreamwalker_summon_suppresser_effect : public SpellScriptLoader { - public: - spell_dreamwalker_summon_suppresser_effect() : SpellScriptLoader("spell_dreamwalker_summon_suppresser_effect") { } +public: + spell_dreamwalker_summon_suppresser_effect() : SpellScriptLoader("spell_dreamwalker_summon_suppresser_effect") { } - class spell_dreamwalker_summon_suppresser_effect_SpellScript : public SpellScript + class spell_dreamwalker_summon_suppresser_effect_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dreamwalker_summon_suppresser_effect_SpellScript); + + bool Load() { - PrepareSpellScript(spell_dreamwalker_summon_suppresser_effect_SpellScript); - - bool Load() - { - if (!GetCaster()->GetInstanceScript()) - return false; - return true; - } - - void HandleForceCast(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (!GetHitUnit()) - return; - - GetHitUnit()->CastSpell(GetCaster(), GetSpellInfo()->Effects[effIndex].TriggerSpell, true, nullptr, nullptr, GetCaster()->GetInstanceScript()->GetData64(DATA_VALITHRIA_LICH_KING)); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_dreamwalker_summon_suppresser_effect_SpellScript::HandleForceCast, EFFECT_0, SPELL_EFFECT_FORCE_CAST); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dreamwalker_summon_suppresser_effect_SpellScript(); + if (!GetCaster()->GetInstanceScript()) + return false; + return true; } + + void HandleForceCast(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (!GetHitUnit()) + return; + + GetHitUnit()->CastSpell(GetCaster(), GetSpellInfo()->Effects[effIndex].TriggerSpell, true, nullptr, nullptr, GetCaster()->GetInstanceScript()->GetData64(DATA_VALITHRIA_LICH_KING)); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_dreamwalker_summon_suppresser_effect_SpellScript::HandleForceCast, EFFECT_0, SPELL_EFFECT_FORCE_CAST); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dreamwalker_summon_suppresser_effect_SpellScript(); + } }; class spell_valithria_suppression : public SpellScriptLoader { - public: - spell_valithria_suppression() : SpellScriptLoader("spell_valithria_suppression") { } +public: + spell_valithria_suppression() : SpellScriptLoader("spell_valithria_suppression") { } - class spell_valithria_suppression_AuraScript : public AuraScript + class spell_valithria_suppression_AuraScript : public AuraScript + { + PrepareAuraScript(spell_valithria_suppression_AuraScript); + + void OnApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_valithria_suppression_AuraScript); + const_cast(aurEff)->SetAmount(0); - void OnApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - const_cast(aurEff)->SetAmount(0); + Unit* target = GetTarget(); + Unit::AuraApplicationMap& aam = target->GetAppliedAuras(); + Unit::AuraApplicationMapBounds range = aam.equal_range(GetSpellInfo()->Id); + uint32 count = target->GetAuraCount(GetSpellInfo()->Id); - Unit* target = GetTarget(); - Unit::AuraApplicationMap &aam = target->GetAppliedAuras(); - Unit::AuraApplicationMapBounds range = aam.equal_range(GetSpellInfo()->Id); - uint32 count = target->GetAuraCount(GetSpellInfo()->Id); + if (range.first == range.second) + return; - if (range.first == range.second) - return; - - for (Unit::AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr) - if (count == 1 || itr->second->GetBase()->GetEffect(EFFECT_0)->GetAmount()) - { - itr->second->GetBase()->GetEffect(EFFECT_0)->SetAmount(count * GetSpellInfo()->Effects[0].CalcValue()); - break; - } - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - Unit::AuraApplicationMap &aam = target->GetAppliedAuras(); - Unit::AuraApplicationMapBounds range = aam.equal_range(GetSpellInfo()->Id); - uint32 count = target->GetAuraCount(GetSpellInfo()->Id); - - if (range.first == range.second) - return; - - for (Unit::AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr) - if (itr->second->GetBase()->GetEffect(EFFECT_0)->GetAmount()) - itr->second->GetBase()->GetEffect(EFFECT_0)->SetAmount(0); - - range.first->second->GetBase()->GetEffect(EFFECT_0)->SetAmount(count * GetSpellInfo()->Effects[0].CalcValue()); - } - - void Register() - { - AfterEffectApply += AuraEffectApplyFn(spell_valithria_suppression_AuraScript::OnApply, EFFECT_0, SPELL_AURA_MOD_HEALING_PCT, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - AfterEffectRemove += AuraEffectRemoveFn(spell_valithria_suppression_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_MOD_HEALING_PCT, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_valithria_suppression_AuraScript(); + for (Unit::AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr) + if (count == 1 || itr->second->GetBase()->GetEffect(EFFECT_0)->GetAmount()) + { + itr->second->GetBase()->GetEffect(EFFECT_0)->SetAmount(count * GetSpellInfo()->Effects[0].CalcValue()); + break; + } } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + Unit::AuraApplicationMap& aam = target->GetAppliedAuras(); + Unit::AuraApplicationMapBounds range = aam.equal_range(GetSpellInfo()->Id); + uint32 count = target->GetAuraCount(GetSpellInfo()->Id); + + if (range.first == range.second) + return; + + for (Unit::AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr) + if (itr->second->GetBase()->GetEffect(EFFECT_0)->GetAmount()) + itr->second->GetBase()->GetEffect(EFFECT_0)->SetAmount(0); + + range.first->second->GetBase()->GetEffect(EFFECT_0)->SetAmount(count * GetSpellInfo()->Effects[0].CalcValue()); + } + + void Register() + { + AfterEffectApply += AuraEffectApplyFn(spell_valithria_suppression_AuraScript::OnApply, EFFECT_0, SPELL_AURA_MOD_HEALING_PCT, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + AfterEffectRemove += AuraEffectRemoveFn(spell_valithria_suppression_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_MOD_HEALING_PCT, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_valithria_suppression_AuraScript(); + } }; class achievement_portal_jockey : public AchievementCriteriaScript { - public: - achievement_portal_jockey() : AchievementCriteriaScript("achievement_portal_jockey") { } +public: + achievement_portal_jockey() : AchievementCriteriaScript("achievement_portal_jockey") { } - bool OnCheck(Player* /*source*/, Unit* target) - { - return target && target->GetEntry() == NPC_VALITHRIA_DREAMWALKER && !target->GetAI()->GetData(MISSED_PORTALS); - } + bool OnCheck(Player* /*source*/, Unit* target) + { + return target && target->GetEntry() == NPC_VALITHRIA_DREAMWALKER && !target->GetAI()->GetData(MISSED_PORTALS); + } }; void AddSC_boss_valithria_dreamwalker() diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp index 4a3a75f27..f40c1cc30 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp @@ -269,1073 +269,1073 @@ enum MovementPoints class FrostwingVrykulSearcher { - public: - FrostwingVrykulSearcher(Creature const* source, float range) : _source(source), _range(range) {} +public: + FrostwingVrykulSearcher(Creature const* source, float range) : _source(source), _range(range) {} - bool operator()(Unit* unit) + bool operator()(Unit* unit) + { + if (!unit->IsAlive()) + return false; + + switch (unit->GetEntry()) { - if (!unit->IsAlive()) + case NPC_YMIRJAR_BATTLE_MAIDEN: + case NPC_YMIRJAR_DEATHBRINGER: + case NPC_YMIRJAR_FROSTBINDER: + case NPC_YMIRJAR_HUNTRESS: + case NPC_YMIRJAR_WARLORD: + break; + default: return false; - - switch (unit->GetEntry()) - { - case NPC_YMIRJAR_BATTLE_MAIDEN: - case NPC_YMIRJAR_DEATHBRINGER: - case NPC_YMIRJAR_FROSTBINDER: - case NPC_YMIRJAR_HUNTRESS: - case NPC_YMIRJAR_WARLORD: - break; - default: - return false; - } - - if (!unit->IsWithinDist(_source, _range, false)) - return false; - - return true; } - private: - Creature const* _source; - float _range; + if (!unit->IsWithinDist(_source, _range, false)) + return false; + + return true; + } + +private: + Creature const* _source; + float _range; }; class FrostwingGauntletRespawner { - public: - void operator()(Creature* creature) +public: + void operator()(Creature* creature) + { + switch (creature->GetOriginalEntry()) { - switch (creature->GetOriginalEntry()) - { - case NPC_YMIRJAR_BATTLE_MAIDEN: - case NPC_YMIRJAR_DEATHBRINGER: - case NPC_YMIRJAR_FROSTBINDER: - case NPC_YMIRJAR_HUNTRESS: - case NPC_YMIRJAR_WARLORD: - break; - case NPC_CROK_SCOURGEBANE: - case NPC_CAPTAIN_ARNATH: - case NPC_CAPTAIN_BRANDON: - case NPC_CAPTAIN_GRONDEL: - case NPC_CAPTAIN_RUPERT: - creature->AI()->DoAction(ACTION_RESET_EVENT); - break; - case NPC_SISTER_SVALNA: // she never dies or the event is over - creature->AI()->DoAction(ACTION_RESET_EVENT); - creature->AI()->EnterEvadeMode(); - creature->AI()->Reset(); - return; - default: - return; - } - - if (CreatureData const* data = creature->GetCreatureData()) - creature->SetPosition(data->posX, data->posY, data->posZ, data->orientation); - creature->DespawnOrUnsummon(); - - creature->SetRespawnTime(5); + case NPC_YMIRJAR_BATTLE_MAIDEN: + case NPC_YMIRJAR_DEATHBRINGER: + case NPC_YMIRJAR_FROSTBINDER: + case NPC_YMIRJAR_HUNTRESS: + case NPC_YMIRJAR_WARLORD: + break; + case NPC_CROK_SCOURGEBANE: + case NPC_CAPTAIN_ARNATH: + case NPC_CAPTAIN_BRANDON: + case NPC_CAPTAIN_GRONDEL: + case NPC_CAPTAIN_RUPERT: + creature->AI()->DoAction(ACTION_RESET_EVENT); + break; + case NPC_SISTER_SVALNA: // she never dies or the event is over + creature->AI()->DoAction(ACTION_RESET_EVENT); + creature->AI()->EnterEvadeMode(); + creature->AI()->Reset(); + return; + default: + return; } + + if (CreatureData const* data = creature->GetCreatureData()) + creature->SetPosition(data->posX, data->posY, data->posZ, data->orientation); + creature->DespawnOrUnsummon(); + + creature->SetRespawnTime(5); + } }; class CaptainSurviveTalk : public BasicEvent { - public: - explicit CaptainSurviveTalk(Creature const& owner) : _owner(owner) { } +public: + explicit CaptainSurviveTalk(Creature const& owner) : _owner(owner) { } - bool Execute(uint64 /*currTime*/, uint32 /*diff*/) - { - _owner.AI()->Talk(SAY_CAPTAIN_SURVIVE_TALK); - return true; - } + bool Execute(uint64 /*currTime*/, uint32 /*diff*/) + { + _owner.AI()->Talk(SAY_CAPTAIN_SURVIVE_TALK); + return true; + } - private: - Creature const& _owner; +private: + Creature const& _owner; }; // at Light's Hammer class npc_highlord_tirion_fordring_lh : public CreatureScript { - public: - npc_highlord_tirion_fordring_lh() : CreatureScript("npc_highlord_tirion_fordring_lh") { } +public: + npc_highlord_tirion_fordring_lh() : CreatureScript("npc_highlord_tirion_fordring_lh") { } - struct npc_highlord_tirion_fordringAI : public ScriptedAI + struct npc_highlord_tirion_fordringAI : public ScriptedAI + { + npc_highlord_tirion_fordringAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { - npc_highlord_tirion_fordringAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) - { - } - - void Reset() - { - _events.Reset(); - _theLichKing = 0; - _bolvarFordragon = 0; - _factionNPC = 0; - _damnedKills = 0; - } - - // IMPORTANT NOTE: This is triggered from per-GUID scripts - // of The Damned SAI - void SetData(uint32 type, uint32 data) - { - if (type == DATA_DAMNED_KILLS && data == 1) - { - if (++_damnedKills == 2) - { - if (Creature* theLichKing = me->FindNearestCreature(NPC_THE_LICH_KING_LH, 150.0f)) - { - if (Creature* bolvarFordragon = me->FindNearestCreature(NPC_HIGHLORD_BOLVAR_FORDRAGON_LH, 150.0f)) - { - if (Creature* factionNPC = me->FindNearestCreature(_instance->GetData(DATA_TEAMID_IN_INSTANCE) == TEAM_HORDE ? NPC_HIGH_OVERLORD_SAURFANG_DUMMY : NPC_MURADIN_BRONZEBEARD_DUMMY, 50.0f)) - { - me->setActive(true); - _theLichKing = theLichKing->GetGUID(); - theLichKing->setActive(true); - _bolvarFordragon = bolvarFordragon->GetGUID(); - bolvarFordragon->setActive(true); - _factionNPC = factionNPC->GetGUID(); - factionNPC->setActive(true); - } - } - } - - if (!_bolvarFordragon || !_theLichKing || !_factionNPC) - return; - - Talk(SAY_TIRION_INTRO_1); - _events.ScheduleEvent(EVENT_TIRION_INTRO_2, 4000); - _events.ScheduleEvent(EVENT_TIRION_INTRO_3, 14000); - _events.ScheduleEvent(EVENT_TIRION_INTRO_4, 18000); - _events.ScheduleEvent(EVENT_TIRION_INTRO_5, 31000); - _events.ScheduleEvent(EVENT_LK_INTRO_1, 35000); - _events.ScheduleEvent(EVENT_TIRION_INTRO_6, 51000); - _events.ScheduleEvent(EVENT_LK_INTRO_2, 58000); - _events.ScheduleEvent(EVENT_LK_INTRO_3, 74000); - _events.ScheduleEvent(EVENT_LK_INTRO_4, 86000); // sound last 21 seconds (five more) - _events.ScheduleEvent(EVENT_BOLVAR_INTRO_1, 105000); - _events.ScheduleEvent(EVENT_LK_INTRO_5, 113000); - - if (_instance->GetData(DATA_TEAMID_IN_INSTANCE) == TEAM_HORDE) - { - _events.ScheduleEvent(EVENT_SAURFANG_INTRO_1, 125000); - _events.ScheduleEvent(EVENT_TIRION_INTRO_H_7, 134000); - _events.ScheduleEvent(EVENT_SAURFANG_INTRO_2, 144000); - _events.ScheduleEvent(EVENT_SAURFANG_INTRO_3, 155000); - _events.ScheduleEvent(EVENT_SAURFANG_INTRO_4, 167000); - _events.ScheduleEvent(EVENT_SAURFANG_RUN, 175000); - } - else - { - _events.ScheduleEvent(EVENT_MURADIN_INTRO_1, 125000); - _events.ScheduleEvent(EVENT_MURADIN_INTRO_2, 129000); - _events.ScheduleEvent(EVENT_MURADIN_INTRO_3, 132000); - _events.ScheduleEvent(EVENT_TIRION_INTRO_A_7, 141000); - _events.ScheduleEvent(EVENT_MURADIN_INTRO_4, 149000); - _events.ScheduleEvent(EVENT_MURADIN_INTRO_5, 156000); - _events.ScheduleEvent(EVENT_MURADIN_RUN, 162000); - } - } - } - } - - void UpdateAI(uint32 diff) - { - if (_damnedKills != 2) - return; - - _events.Update(diff); - - while (uint32 eventId = _events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_TIRION_INTRO_2: - me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION); - break; - case EVENT_TIRION_INTRO_3: - Talk(SAY_TIRION_INTRO_2); - break; - case EVENT_TIRION_INTRO_4: - me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION); - break; - case EVENT_TIRION_INTRO_5: - Talk(SAY_TIRION_INTRO_3); - break; - case EVENT_LK_INTRO_1: - me->HandleEmoteCommand(EMOTE_ONESHOT_POINT_NO_SHEATHE); - if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _theLichKing)) - theLichKing->AI()->Talk(SAY_LK_INTRO_1); - break; - case EVENT_TIRION_INTRO_6: - Talk(SAY_TIRION_INTRO_4); - break; - case EVENT_LK_INTRO_2: - if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _theLichKing)) - theLichKing->AI()->Talk(SAY_LK_INTRO_2); - break; - case EVENT_LK_INTRO_3: - if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _theLichKing)) - theLichKing->AI()->Talk(SAY_LK_INTRO_3); - break; - case EVENT_LK_INTRO_4: - if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _theLichKing)) - theLichKing->AI()->Talk(SAY_LK_INTRO_4); - break; - case EVENT_BOLVAR_INTRO_1: - if (Creature* bolvarFordragon = ObjectAccessor::GetCreature(*me, _bolvarFordragon)) - { - bolvarFordragon->AI()->Talk(SAY_BOLVAR_INTRO_1); - bolvarFordragon->setActive(false); - } - break; - case EVENT_LK_INTRO_5: - if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _theLichKing)) - { - theLichKing->AI()->Talk(SAY_LK_INTRO_5); - theLichKing->setActive(false); - } - break; - case EVENT_SAURFANG_INTRO_1: - if (Creature* saurfang = ObjectAccessor::GetCreature(*me, _factionNPC)) - saurfang->AI()->Talk(SAY_SAURFANG_INTRO_1); - break; - case EVENT_TIRION_INTRO_H_7: - Talk(SAY_TIRION_INTRO_H_5); - break; - case EVENT_SAURFANG_INTRO_2: - if (Creature* saurfang = ObjectAccessor::GetCreature(*me, _factionNPC)) - saurfang->AI()->Talk(SAY_SAURFANG_INTRO_2); - break; - case EVENT_SAURFANG_INTRO_3: - if (Creature* saurfang = ObjectAccessor::GetCreature(*me, _factionNPC)) - saurfang->AI()->Talk(SAY_SAURFANG_INTRO_3); - break; - case EVENT_SAURFANG_INTRO_4: - if (Creature* saurfang = ObjectAccessor::GetCreature(*me, _factionNPC)) - saurfang->AI()->Talk(SAY_SAURFANG_INTRO_4); - break; - case EVENT_MURADIN_RUN: - case EVENT_SAURFANG_RUN: - if (Creature* factionNPC = ObjectAccessor::GetCreature(*me, _factionNPC)) - { - factionNPC->GetMotionMaster()->MovePath(factionNPC->GetDBTableGUIDLow() * 10, false); - factionNPC->DespawnOrUnsummon(46500); - std::list followers; - factionNPC->GetCreaturesWithEntryInRange(followers, 30, _instance->GetData(DATA_TEAMID_IN_INSTANCE) == TEAM_HORDE ? NPC_KOR_KRON_GENERAL : NPC_ALLIANCE_COMMANDER); - for (Creature* follower : followers) - { - follower->DespawnOrUnsummon(46500); - } - } - me->setActive(false); - _damnedKills = 3; - break; - case EVENT_MURADIN_INTRO_1: - if (Creature* muradin = ObjectAccessor::GetCreature(*me, _factionNPC)) - muradin->AI()->Talk(SAY_MURADIN_INTRO_1); - break; - case EVENT_MURADIN_INTRO_2: - if (Creature* muradin = ObjectAccessor::GetCreature(*me, _factionNPC)) - muradin->HandleEmoteCommand(EMOTE_ONESHOT_TALK); - break; - case EVENT_MURADIN_INTRO_3: - if (Creature* muradin = ObjectAccessor::GetCreature(*me, _factionNPC)) - muradin->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION); - break; - case EVENT_TIRION_INTRO_A_7: - Talk(SAY_TIRION_INTRO_A_5); - break; - case EVENT_MURADIN_INTRO_4: - if (Creature* muradin = ObjectAccessor::GetCreature(*me, _factionNPC)) - muradin->AI()->Talk(SAY_MURADIN_INTRO_2); - break; - case EVENT_MURADIN_INTRO_5: - if (Creature* muradin = ObjectAccessor::GetCreature(*me, _factionNPC)) - muradin->AI()->Talk(SAY_MURADIN_INTRO_3); - break; - default: - break; - } - } - } - - private: - EventMap _events; - InstanceScript* const _instance; - uint64 _theLichKing; - uint64 _bolvarFordragon; - uint64 _factionNPC; - uint16 _damnedKills; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); - } -}; - -class npc_rotting_frost_giant : public CreatureScript -{ - public: - npc_rotting_frost_giant() : CreatureScript("npc_rotting_frost_giant") { } - - struct npc_rotting_frost_giantAI : public ScriptedAI - { - npc_rotting_frost_giantAI(Creature* creature) : ScriptedAI(creature) - { - } - - void Reset() - { - _events.Reset(); - _events.ScheduleEvent(EVENT_DEATH_PLAGUE, 15000); - _events.ScheduleEvent(EVENT_STOMP, urand(5000, 8000)); - _events.ScheduleEvent(EVENT_ARCTIC_BREATH, urand(10000, 15000)); - } - - void JustDied(Unit* /*killer*/) - { - _events.Reset(); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - _events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - if (uint32 eventId = _events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_DEATH_PLAGUE: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, -SPELL_RECENTLY_INFECTED)) - { - Talk(EMOTE_DEATH_PLAGUE_WARNING, target); - DoCast(target, SPELL_DEATH_PLAGUE); - } - _events.ScheduleEvent(EVENT_DEATH_PLAGUE, 15000); - break; - case EVENT_STOMP: - DoCastVictim(SPELL_STOMP); - _events.ScheduleEvent(EVENT_STOMP, urand(15000, 18000)); - break; - case EVENT_ARCTIC_BREATH: - DoCastVictim(SPELL_ARCTIC_BREATH); - _events.ScheduleEvent(EVENT_ARCTIC_BREATH, urand(26000, 33000)); - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); - } - - private: - EventMap _events; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); - } -}; - -class npc_frost_freeze_trap : public CreatureScript -{ - public: - npc_frost_freeze_trap() : CreatureScript("npc_frost_freeze_trap") { } - - struct npc_frost_freeze_trapAI: public NullCreatureAI - { - npc_frost_freeze_trapAI(Creature* creature) : NullCreatureAI(creature) - { - me->SetReactState(REACT_PASSIVE); - } - - void DoAction(int32 action) - { - switch (action) - { - case 1000: - case 11000: - _events.ScheduleEvent(EVENT_ACTIVATE_TRAP, uint32(action)); - break; - default: - break; - } - } - - void UpdateAI(uint32 diff) - { - if (me->IsInCombat()) - me->CombatStop(false); - - _events.Update(diff); - - if (_events.ExecuteEvent() == EVENT_ACTIVATE_TRAP) - if (InstanceScript* instance = me->GetInstanceScript()) - if (instance->GetData(DATA_COLDFLAME_JETS) == IN_PROGRESS) - { - DoCast(me, SPELL_COLDFLAME_JETS); - _events.ScheduleEvent(EVENT_ACTIVATE_TRAP, 22000); - } - } - - private: - EventMap _events; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); - } -}; - -class npc_crok_scourgebane : public CreatureScript -{ - public: - npc_crok_scourgebane() : CreatureScript("npc_crok_scourgebane") { } - - struct npc_crok_scourgebaneAI : public npc_escortAI - { - npc_crok_scourgebaneAI(Creature* creature) : npc_escortAI(creature), _instance(creature->GetInstanceScript()) - { - SetDespawnAtEnd(false); - SetDespawnAtFar(false); - _isEventDone = _instance->GetBossState(DATA_SISTER_SVALNA) == DONE; - } - - void Reset() - { - me->SetReactState(REACT_DEFENSIVE); - _didUnderTenPercentText = false; - _wipeCheckTimer = 3000; - _handledWP4 = false; - - _events.Reset(); - _events.ScheduleEvent(EVENT_SCOURGE_STRIKE, urand(7500, 12500)); - _events.ScheduleEvent(EVENT_DEATH_STRIKE, urand(25000, 30000)); - } - - void DoAction(int32 action) - { - if (action == ACTION_START_GAUNTLET) - { - if (_isEventDone || me->isActiveObject() || !me->IsAlive()) - return; - - me->setActive(true); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_IMMUNE_TO_PC); - // Load Grid with Sister Svalna - me->GetMap()->LoadGrid(4356.71f, 2484.33f); - if (Creature* svalna = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_SISTER_SVALNA))) - svalna->AI()->DoAction(ACTION_START_GAUNTLET); - for (uint32 i = 0; i < 4; ++i) - if (Creature* crusader = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_CAPTAIN_ARNATH + i))) - crusader->AI()->DoAction(ACTION_START_GAUNTLET); - - Talk(SAY_CROK_INTRO_1); - _events.ScheduleEvent(EVENT_ARNATH_INTRO_2, 7000); - _events.ScheduleEvent(EVENT_CROK_INTRO_3, 14000); - _events.ScheduleEvent(EVENT_START_PATHING, 37000); - } - else if (action == ACTION_RESET_EVENT) - { - _isEventDone = _instance->GetBossState(DATA_SISTER_SVALNA) == DONE; - me->setActive(false); - _aliveTrash.clear(); - _currentWPid = 0; - _handledWP4 = false; - - me->CombatStop(); - me->DeleteThreatList(); - } - } - - void SetGUID(uint64 guid, int32 type/* = 0*/) - { - if (type == ACTION_VRYKUL_DEATH) - { - _aliveTrash.erase(guid); - if (_aliveTrash.empty()) - { - SetEscortPaused(false); - if (_currentWPid == 4 && !_handledWP4) - { - _handledWP4 = true; - Talk(SAY_CROK_FINAL_WP); - if (Creature* svalna = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_SISTER_SVALNA))) - svalna->AI()->DoAction(ACTION_RESURRECT_CAPTAINS); - } - } - } - } - - void WaypointReached(uint32 waypointId) - { - switch (waypointId) - { - // pause pathing until trash pack is cleared - case 0: - Talk(SAY_CROK_COMBAT_WP_0); - if (!_aliveTrash.empty()) - SetEscortPaused(true); - break; - case 1: - Talk(SAY_CROK_COMBAT_WP_1); - if (!_aliveTrash.empty()) - SetEscortPaused(true); - break; - case 2: - if (!_aliveTrash.empty()) - SetEscortPaused(true); - break; - case 4: - if (_aliveTrash.empty() && !_handledWP4) - { - _handledWP4 = true; - Talk(SAY_CROK_FINAL_WP); - if (Creature* svalna = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_SISTER_SVALNA))) - svalna->AI()->DoAction(ACTION_RESURRECT_CAPTAINS); - } - break; - default: - break; - } - } - - void WaypointStart(uint32 waypointId) - { - _currentWPid = waypointId; - float minY = 0.0f; - switch (waypointId) - { - case 0: - minY = 2600.0f; - break; - case 1: - minY = 2550.0f; - if (Creature* svalna = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_SISTER_SVALNA))) - svalna->AI()->DoAction(ACTION_KILL_CAPTAIN); - break; - case 2: - minY = 2515.0f; - if (Creature* svalna = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_SISTER_SVALNA))) - svalna->AI()->DoAction(ACTION_KILL_CAPTAIN); - break; - case 4: - minY = 2475.0f; - break; - default: - break; - } - - if (minY) - { - // get all nearby vrykul - std::list temp; - FrostwingVrykulSearcher check(me, 150.0f); - acore::CreatureListSearcher searcher(me, temp, check); - me->VisitNearbyGridObject(150.0f, searcher); - - _aliveTrash.clear(); - for (std::list::iterator itr = temp.begin(); itr != temp.end(); ++itr) - if ((*itr)->GetHomePosition().GetPositionY() > minY) - _aliveTrash.insert((*itr)->GetGUID()); - } - } - - void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) - { - if (HealthBelowPct(10)) - { - if (!_didUnderTenPercentText) - { - _didUnderTenPercentText = true; - if (me->GetVictim() && me->GetVictim()->GetEntry() == NPC_SISTER_SVALNA) - Talk(SAY_CROK_WEAKENING_SVALNA); - else - Talk(SAY_CROK_WEAKENING_GAUNTLET); - } - - damage = 0; - me->CastSpell(me, SPELL_ICEBOUND_ARMOR, true); - _events.ScheduleEvent(EVENT_HEALTH_CHECK, 1000); - } - } - - void UpdateEscortAI(uint32 /*diff*/) {} - - void UpdateAI(uint32 diff) - { - npc_escortAI::UpdateAI(diff); - - //Position pos = me->GetHomePosition(); - if (!me->isActiveObject()/* && me->GetExactDist(&pos) < 5.0f*/) // during event - return; - - if (_wipeCheckTimer <= diff) - { - _wipeCheckTimer = 3000; - - Player* player = nullptr; - acore::AnyPlayerInObjectRangeCheck check(me, 140.0f); - acore::PlayerSearcher searcher(me, player, check); - me->VisitNearbyWorldObject(140.0f, searcher); - // wipe - if (!player || me->GetExactDist(4357.0f, 2606.0f, 350.0f) > 125.0f) - { - //Talk(SAY_CROK_DEATH); - FrostwingGauntletRespawner respawner; - acore::CreatureWorker worker(me, respawner); - me->VisitNearbyGridObject(333.0f, worker); - return; - } - } - else - _wipeCheckTimer -= diff; - - UpdateVictim(); - - _events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (_events.ExecuteEvent()) - { - case EVENT_ARNATH_INTRO_2: - if (Creature* arnath = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_CAPTAIN_ARNATH))) - arnath->AI()->Talk(SAY_ARNATH_INTRO_2); - break; - case EVENT_CROK_INTRO_3: - Talk(SAY_CROK_INTRO_3); - break; - case EVENT_START_PATHING: - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_IMMUNE_TO_PC); - Start(true, true); - break; - case EVENT_SCOURGE_STRIKE: - DoCastVictim(SPELL_SCOURGE_STRIKE); - _events.ScheduleEvent(EVENT_SCOURGE_STRIKE, urand(10000, 14000)); - break; - case EVENT_DEATH_STRIKE: - if (HealthBelowPct(20)) - DoCastVictim(SPELL_DEATH_STRIKE); - _events.ScheduleEvent(EVENT_DEATH_STRIKE, urand(5000, 10000)); - break; - case EVENT_HEALTH_CHECK: - if (HealthAbovePct(25)) - { - me->RemoveAurasDueToSpell(SPELL_ICEBOUND_ARMOR); - _didUnderTenPercentText = false; - } - else - { - Unit::DealHeal(me, me, me->CountPctFromMaxHealth(3)); - _events.ScheduleEvent(EVENT_HEALTH_CHECK, 1000); - } - break; - default: - break; - } - - DoMeleeAttackIfReady(); - } - - bool CanAIAttack(Unit const* target) const - { - // do not see targets inside Frostwing Halls when we are not there - return target->GetTypeId() != TYPEID_PLAYER && (me->GetPositionY() > 2660.0f) == (target->GetPositionY() > 2660.0f) && target->GetEntry() != NPC_SINDRAGOSA; - } - - private: - EventMap _events; - std::set _aliveTrash; - InstanceScript* _instance; - uint32 _currentWPid; - uint32 _wipeCheckTimer; - bool _handledWP4; - bool _isEventDone; - bool _didUnderTenPercentText; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); - } -}; - -class boss_sister_svalna : public CreatureScript -{ - public: - boss_sister_svalna() : CreatureScript("boss_sister_svalna") { } - - struct boss_sister_svalnaAI : public BossAI - { - boss_sister_svalnaAI(Creature* creature) : BossAI(creature, DATA_SISTER_SVALNA) - { - } - - void Reset() - { - _Reset(); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); - me->SetReactState(REACT_PASSIVE); - me->SetCanFly(true); - me->SetDisableGravity(true); - me->SetHover(true); - me->SendMovementFlagUpdate(); - } - - void AttackStart(Unit* victim) - { - if (me->HasReactState(REACT_PASSIVE) || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC)) - return; - BossAI::AttackStart(victim); - } - - void JustDied(Unit* /*killer*/) - { - _JustDied(); - Talk(SAY_SVALNA_DEATH); - - if (Creature* crok = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_CROK_SCOURGEBANE))) // _isEventDone = true, setActive(false) - crok->AI()->DoAction(ACTION_RESET_EVENT); - - uint64 delay = 6000; - for (uint32 i = 0; i < 4; ++i) - if (Creature* crusader = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_CAPTAIN_ARNATH + i))) - if (crusader->IsAlive()) - { - if (crusader->GetEntry() == crusader->GetCreatureData()->id) - { - crusader->m_Events.AddEvent(new CaptainSurviveTalk(*crusader), crusader->m_Events.CalculateTime(delay)); - delay += 6000; - } - else - Unit::Kill(crusader, crusader); - } - } - - void EnterCombat(Unit* /*attacker*/) - { - if (me->HasReactState(REACT_PASSIVE) || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC)) - { - me->CombatStop(false); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); - me->SetReactState(REACT_PASSIVE); - return; - } - _EnterCombat(); - me->LowerPlayerDamageReq(me->GetMaxHealth()); - if (Creature* crok = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_CROK_SCOURGEBANE))) - { - crok->AI()->Talk(SAY_CROK_COMBAT_SVALNA); - crok->AI()->AttackStart(me); - } - events.ScheduleEvent(EVENT_SVALNA_COMBAT, 9000); - events.ScheduleEvent(EVENT_IMPALING_SPEAR, urand(15000, 20000)); - } - - void KilledUnit(Unit* victim) - { - switch (victim->GetTypeId()) - { - case TYPEID_PLAYER: - Talk(SAY_SVALNA_KILL); - break; - /*case TYPEID_UNIT: // captains also say something on death and this causes spam - switch (victim->GetEntry()) - { - case NPC_CAPTAIN_ARNATH: - case NPC_CAPTAIN_BRANDON: - case NPC_CAPTAIN_GRONDEL: - case NPC_CAPTAIN_RUPERT: - Talk(SAY_SVALNA_KILL_CAPTAIN); - break; - default: - break; - } - break;*/ - default: - break; - } - } - - void DoAction(int32 action) - { - switch (action) - { - case ACTION_KILL_CAPTAIN: - if (me->IsAlive()) - me->CastCustomSpell(SPELL_CARESS_OF_DEATH, SPELLVALUE_MAX_TARGETS, 1, me, true); - break; - case ACTION_START_GAUNTLET: - me->setActive(true); - events.ScheduleEvent(EVENT_SVALNA_START, 25000); - break; - case ACTION_RESURRECT_CAPTAINS: - events.RescheduleEvent(EVENT_SVALNA_RESURRECT, 7000); - break; - case ACTION_CAPTAIN_DIES: - Talk(SAY_SVALNA_CAPTAIN_DEATH); - break; - case ACTION_RESET_EVENT: - me->setActive(false); - Reset(); - break; - default: - break; - } - } - - void SpellHit(Unit* caster, SpellInfo const* spell) - { - if (spell->Id == SPELL_HURL_SPEAR && me->HasAura(SPELL_AETHER_SHIELD)) - { - me->RemoveAurasDueToSpell(SPELL_AETHER_SHIELD); - Talk(EMOTE_SVALNA_BROKEN_SHIELD, caster); - } - } - - void MovementInform(uint32 type, uint32 id) - { - if (type != EFFECT_MOTION_TYPE || id != POINT_LAND) - return; - - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); - me->SetCanFly(false); - me->SetDisableGravity(false); - me->SetHover(false); - me->SetReactState(REACT_AGGRESSIVE); - DoZoneInCombat(nullptr, 150.0f); - } - - void SpellHitTarget(Unit* target, SpellInfo const* spell) - { - switch (spell->Id) - { - case SPELL_IMPALING_SPEAR_KILL: - Unit::Kill(me, target); - break; - case SPELL_IMPALING_SPEAR: - if (TempSummon* summon = target->SummonCreature(NPC_IMPALING_SPEAR, *target)) - { - Talk(EMOTE_SVALNA_IMPALE, target); - summon->CastCustomSpell(VEHICLE_SPELL_RIDE_HARDCODED, SPELLVALUE_BASE_POINT0, 1, target, false); - summon->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_UNK1 | UNIT_FLAG2_ALLOW_ENEMY_INTERACT); - } - break; - default: - break; - } - } - - void UpdateAI(uint32 diff) - { - if (!me->isActiveObject()) - return; - - UpdateVictim(); - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SVALNA_START: - Talk(SAY_SVALNA_EVENT_START); - break; - case EVENT_SVALNA_RESURRECT: - Talk(SAY_SVALNA_RESURRECT_CAPTAINS); - me->CastSpell(me, SPELL_REVIVE_CHAMPION, false); - break; - case EVENT_SVALNA_COMBAT: - Talk(SAY_SVALNA_AGGRO); - break; - case EVENT_IMPALING_SPEAR: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, -SPELL_IMPALING_SPEAR)) - { - DoCast(me, SPELL_AETHER_SHIELD); - me->AddAura(70203, me); - DoCast(target, SPELL_IMPALING_SPEAR); - } - events.ScheduleEvent(EVENT_IMPALING_SPEAR, urand(20000, 25000)); - break; - default: - break; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); - } -}; - -struct npc_argent_captainAI : public ScriptedAI -{ - public: - npc_argent_captainAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) - { - FollowAngle = PET_FOLLOW_ANGLE; - FollowDist = PET_FOLLOW_DIST; } void Reset() { - me->SetCorpseDelay(DAY); // leave corpse for a long time so svalna can resurrect - IsUndead = (me->GetCreatureData() && me->GetCreatureData()->id != me->GetEntry()); + _events.Reset(); + _theLichKing = 0; + _bolvarFordragon = 0; + _factionNPC = 0; + _damnedKills = 0; + } + + // IMPORTANT NOTE: This is triggered from per-GUID scripts + // of The Damned SAI + void SetData(uint32 type, uint32 data) + { + if (type == DATA_DAMNED_KILLS && data == 1) + { + if (++_damnedKills == 2) + { + if (Creature* theLichKing = me->FindNearestCreature(NPC_THE_LICH_KING_LH, 150.0f)) + { + if (Creature* bolvarFordragon = me->FindNearestCreature(NPC_HIGHLORD_BOLVAR_FORDRAGON_LH, 150.0f)) + { + if (Creature* factionNPC = me->FindNearestCreature(_instance->GetData(DATA_TEAMID_IN_INSTANCE) == TEAM_HORDE ? NPC_HIGH_OVERLORD_SAURFANG_DUMMY : NPC_MURADIN_BRONZEBEARD_DUMMY, 50.0f)) + { + me->setActive(true); + _theLichKing = theLichKing->GetGUID(); + theLichKing->setActive(true); + _bolvarFordragon = bolvarFordragon->GetGUID(); + bolvarFordragon->setActive(true); + _factionNPC = factionNPC->GetGUID(); + factionNPC->setActive(true); + } + } + } + + if (!_bolvarFordragon || !_theLichKing || !_factionNPC) + return; + + Talk(SAY_TIRION_INTRO_1); + _events.ScheduleEvent(EVENT_TIRION_INTRO_2, 4000); + _events.ScheduleEvent(EVENT_TIRION_INTRO_3, 14000); + _events.ScheduleEvent(EVENT_TIRION_INTRO_4, 18000); + _events.ScheduleEvent(EVENT_TIRION_INTRO_5, 31000); + _events.ScheduleEvent(EVENT_LK_INTRO_1, 35000); + _events.ScheduleEvent(EVENT_TIRION_INTRO_6, 51000); + _events.ScheduleEvent(EVENT_LK_INTRO_2, 58000); + _events.ScheduleEvent(EVENT_LK_INTRO_3, 74000); + _events.ScheduleEvent(EVENT_LK_INTRO_4, 86000); // sound last 21 seconds (five more) + _events.ScheduleEvent(EVENT_BOLVAR_INTRO_1, 105000); + _events.ScheduleEvent(EVENT_LK_INTRO_5, 113000); + + if (_instance->GetData(DATA_TEAMID_IN_INSTANCE) == TEAM_HORDE) + { + _events.ScheduleEvent(EVENT_SAURFANG_INTRO_1, 125000); + _events.ScheduleEvent(EVENT_TIRION_INTRO_H_7, 134000); + _events.ScheduleEvent(EVENT_SAURFANG_INTRO_2, 144000); + _events.ScheduleEvent(EVENT_SAURFANG_INTRO_3, 155000); + _events.ScheduleEvent(EVENT_SAURFANG_INTRO_4, 167000); + _events.ScheduleEvent(EVENT_SAURFANG_RUN, 175000); + } + else + { + _events.ScheduleEvent(EVENT_MURADIN_INTRO_1, 125000); + _events.ScheduleEvent(EVENT_MURADIN_INTRO_2, 129000); + _events.ScheduleEvent(EVENT_MURADIN_INTRO_3, 132000); + _events.ScheduleEvent(EVENT_TIRION_INTRO_A_7, 141000); + _events.ScheduleEvent(EVENT_MURADIN_INTRO_4, 149000); + _events.ScheduleEvent(EVENT_MURADIN_INTRO_5, 156000); + _events.ScheduleEvent(EVENT_MURADIN_RUN, 162000); + } + } + } + } + + void UpdateAI(uint32 diff) + { + if (_damnedKills != 2) + return; + + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_TIRION_INTRO_2: + me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION); + break; + case EVENT_TIRION_INTRO_3: + Talk(SAY_TIRION_INTRO_2); + break; + case EVENT_TIRION_INTRO_4: + me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION); + break; + case EVENT_TIRION_INTRO_5: + Talk(SAY_TIRION_INTRO_3); + break; + case EVENT_LK_INTRO_1: + me->HandleEmoteCommand(EMOTE_ONESHOT_POINT_NO_SHEATHE); + if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _theLichKing)) + theLichKing->AI()->Talk(SAY_LK_INTRO_1); + break; + case EVENT_TIRION_INTRO_6: + Talk(SAY_TIRION_INTRO_4); + break; + case EVENT_LK_INTRO_2: + if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _theLichKing)) + theLichKing->AI()->Talk(SAY_LK_INTRO_2); + break; + case EVENT_LK_INTRO_3: + if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _theLichKing)) + theLichKing->AI()->Talk(SAY_LK_INTRO_3); + break; + case EVENT_LK_INTRO_4: + if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _theLichKing)) + theLichKing->AI()->Talk(SAY_LK_INTRO_4); + break; + case EVENT_BOLVAR_INTRO_1: + if (Creature* bolvarFordragon = ObjectAccessor::GetCreature(*me, _bolvarFordragon)) + { + bolvarFordragon->AI()->Talk(SAY_BOLVAR_INTRO_1); + bolvarFordragon->setActive(false); + } + break; + case EVENT_LK_INTRO_5: + if (Creature* theLichKing = ObjectAccessor::GetCreature(*me, _theLichKing)) + { + theLichKing->AI()->Talk(SAY_LK_INTRO_5); + theLichKing->setActive(false); + } + break; + case EVENT_SAURFANG_INTRO_1: + if (Creature* saurfang = ObjectAccessor::GetCreature(*me, _factionNPC)) + saurfang->AI()->Talk(SAY_SAURFANG_INTRO_1); + break; + case EVENT_TIRION_INTRO_H_7: + Talk(SAY_TIRION_INTRO_H_5); + break; + case EVENT_SAURFANG_INTRO_2: + if (Creature* saurfang = ObjectAccessor::GetCreature(*me, _factionNPC)) + saurfang->AI()->Talk(SAY_SAURFANG_INTRO_2); + break; + case EVENT_SAURFANG_INTRO_3: + if (Creature* saurfang = ObjectAccessor::GetCreature(*me, _factionNPC)) + saurfang->AI()->Talk(SAY_SAURFANG_INTRO_3); + break; + case EVENT_SAURFANG_INTRO_4: + if (Creature* saurfang = ObjectAccessor::GetCreature(*me, _factionNPC)) + saurfang->AI()->Talk(SAY_SAURFANG_INTRO_4); + break; + case EVENT_MURADIN_RUN: + case EVENT_SAURFANG_RUN: + if (Creature* factionNPC = ObjectAccessor::GetCreature(*me, _factionNPC)) + { + factionNPC->GetMotionMaster()->MovePath(factionNPC->GetDBTableGUIDLow() * 10, false); + factionNPC->DespawnOrUnsummon(46500); + std::list followers; + factionNPC->GetCreaturesWithEntryInRange(followers, 30, _instance->GetData(DATA_TEAMID_IN_INSTANCE) == TEAM_HORDE ? NPC_KOR_KRON_GENERAL : NPC_ALLIANCE_COMMANDER); + for (Creature* follower : followers) + { + follower->DespawnOrUnsummon(46500); + } + } + me->setActive(false); + _damnedKills = 3; + break; + case EVENT_MURADIN_INTRO_1: + if (Creature* muradin = ObjectAccessor::GetCreature(*me, _factionNPC)) + muradin->AI()->Talk(SAY_MURADIN_INTRO_1); + break; + case EVENT_MURADIN_INTRO_2: + if (Creature* muradin = ObjectAccessor::GetCreature(*me, _factionNPC)) + muradin->HandleEmoteCommand(EMOTE_ONESHOT_TALK); + break; + case EVENT_MURADIN_INTRO_3: + if (Creature* muradin = ObjectAccessor::GetCreature(*me, _factionNPC)) + muradin->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION); + break; + case EVENT_TIRION_INTRO_A_7: + Talk(SAY_TIRION_INTRO_A_5); + break; + case EVENT_MURADIN_INTRO_4: + if (Creature* muradin = ObjectAccessor::GetCreature(*me, _factionNPC)) + muradin->AI()->Talk(SAY_MURADIN_INTRO_2); + break; + case EVENT_MURADIN_INTRO_5: + if (Creature* muradin = ObjectAccessor::GetCreature(*me, _factionNPC)) + muradin->AI()->Talk(SAY_MURADIN_INTRO_3); + break; + default: + break; + } + } + } + + private: + EventMap _events; + InstanceScript* const _instance; + uint64 _theLichKing; + uint64 _bolvarFordragon; + uint64 _factionNPC; + uint16 _damnedKills; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } +}; + +class npc_rotting_frost_giant : public CreatureScript +{ +public: + npc_rotting_frost_giant() : CreatureScript("npc_rotting_frost_giant") { } + + struct npc_rotting_frost_giantAI : public ScriptedAI + { + npc_rotting_frost_giantAI(Creature* creature) : ScriptedAI(creature) + { + } + + void Reset() + { + _events.Reset(); + _events.ScheduleEvent(EVENT_DEATH_PLAGUE, 15000); + _events.ScheduleEvent(EVENT_STOMP, urand(5000, 8000)); + _events.ScheduleEvent(EVENT_ARCTIC_BREATH, urand(10000, 15000)); } void JustDied(Unit* /*killer*/) { - if (IsUndead) - Talk(SAY_CAPTAIN_DEATH); - else - Talk(SAY_CAPTAIN_SECOND_DEATH); - - IsUndead = false; + _events.Reset(); } - void KilledUnit(Unit* victim) + void UpdateAI(uint32 diff) { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_CAPTAIN_KILL); + if (!UpdateVictim()) + return; + + _events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + if (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_DEATH_PLAGUE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, -SPELL_RECENTLY_INFECTED)) + { + Talk(EMOTE_DEATH_PLAGUE_WARNING, target); + DoCast(target, SPELL_DEATH_PLAGUE); + } + _events.ScheduleEvent(EVENT_DEATH_PLAGUE, 15000); + break; + case EVENT_STOMP: + DoCastVictim(SPELL_STOMP); + _events.ScheduleEvent(EVENT_STOMP, urand(15000, 18000)); + break; + case EVENT_ARCTIC_BREATH: + DoCastVictim(SPELL_ARCTIC_BREATH); + _events.ScheduleEvent(EVENT_ARCTIC_BREATH, urand(26000, 33000)); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + + private: + EventMap _events; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } +}; + +class npc_frost_freeze_trap : public CreatureScript +{ +public: + npc_frost_freeze_trap() : CreatureScript("npc_frost_freeze_trap") { } + + struct npc_frost_freeze_trapAI: public NullCreatureAI + { + npc_frost_freeze_trapAI(Creature* creature) : NullCreatureAI(creature) + { + me->SetReactState(REACT_PASSIVE); + } + + void DoAction(int32 action) + { + switch (action) + { + case 1000: + case 11000: + _events.ScheduleEvent(EVENT_ACTIVATE_TRAP, uint32(action)); + break; + default: + break; + } + } + + void UpdateAI(uint32 diff) + { + if (me->IsInCombat()) + me->CombatStop(false); + + _events.Update(diff); + + if (_events.ExecuteEvent() == EVENT_ACTIVATE_TRAP) + if (InstanceScript* instance = me->GetInstanceScript()) + if (instance->GetData(DATA_COLDFLAME_JETS) == IN_PROGRESS) + { + DoCast(me, SPELL_COLDFLAME_JETS); + _events.ScheduleEvent(EVENT_ACTIVATE_TRAP, 22000); + } + } + + private: + EventMap _events; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } +}; + +class npc_crok_scourgebane : public CreatureScript +{ +public: + npc_crok_scourgebane() : CreatureScript("npc_crok_scourgebane") { } + + struct npc_crok_scourgebaneAI : public npc_escortAI + { + npc_crok_scourgebaneAI(Creature* creature) : npc_escortAI(creature), _instance(creature->GetInstanceScript()) + { + SetDespawnAtEnd(false); + SetDespawnAtFar(false); + _isEventDone = _instance->GetBossState(DATA_SISTER_SVALNA) == DONE; + } + + void Reset() + { + me->SetReactState(REACT_DEFENSIVE); + _didUnderTenPercentText = false; + _wipeCheckTimer = 3000; + _handledWP4 = false; + + _events.Reset(); + _events.ScheduleEvent(EVENT_SCOURGE_STRIKE, urand(7500, 12500)); + _events.ScheduleEvent(EVENT_DEATH_STRIKE, urand(25000, 30000)); } void DoAction(int32 action) { if (action == ACTION_START_GAUNTLET) { - if (Creature* crok = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_CROK_SCOURGEBANE))) + if (_isEventDone || me->isActiveObject() || !me->IsAlive()) + return; + + me->setActive(true); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_IMMUNE_TO_PC); + // Load Grid with Sister Svalna + me->GetMap()->LoadGrid(4356.71f, 2484.33f); + if (Creature* svalna = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_SISTER_SVALNA))) + svalna->AI()->DoAction(ACTION_START_GAUNTLET); + for (uint32 i = 0; i < 4; ++i) + if (Creature* crusader = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_CAPTAIN_ARNATH + i))) + crusader->AI()->DoAction(ACTION_START_GAUNTLET); + + Talk(SAY_CROK_INTRO_1); + _events.ScheduleEvent(EVENT_ARNATH_INTRO_2, 7000); + _events.ScheduleEvent(EVENT_CROK_INTRO_3, 14000); + _events.ScheduleEvent(EVENT_START_PATHING, 37000); + } + else if (action == ACTION_RESET_EVENT) + { + _isEventDone = _instance->GetBossState(DATA_SISTER_SVALNA) == DONE; + me->setActive(false); + _aliveTrash.clear(); + _currentWPid = 0; + _handledWP4 = false; + + me->CombatStop(); + me->DeleteThreatList(); + } + } + + void SetGUID(uint64 guid, int32 type/* = 0*/) + { + if (type == ACTION_VRYKUL_DEATH) + { + _aliveTrash.erase(guid); + if (_aliveTrash.empty()) { - FollowAngle = me->GetAngle(crok) + me->GetOrientation(); - FollowDist = me->GetDistance2d(crok); - me->GetMotionMaster()->MoveFollow(crok, FollowDist, FollowAngle, MOTION_SLOT_IDLE); + SetEscortPaused(false); + if (_currentWPid == 4 && !_handledWP4) + { + _handledWP4 = true; + Talk(SAY_CROK_FINAL_WP); + if (Creature* svalna = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_SISTER_SVALNA))) + svalna->AI()->DoAction(ACTION_RESURRECT_CAPTAINS); + } } } } - void EnterCombat(Unit* /*target*/) + void WaypointReached(uint32 waypointId) { - if (IsUndead) - DoZoneInCombat(); + switch (waypointId) + { + // pause pathing until trash pack is cleared + case 0: + Talk(SAY_CROK_COMBAT_WP_0); + if (!_aliveTrash.empty()) + SetEscortPaused(true); + break; + case 1: + Talk(SAY_CROK_COMBAT_WP_1); + if (!_aliveTrash.empty()) + SetEscortPaused(true); + break; + case 2: + if (!_aliveTrash.empty()) + SetEscortPaused(true); + break; + case 4: + if (_aliveTrash.empty() && !_handledWP4) + { + _handledWP4 = true; + Talk(SAY_CROK_FINAL_WP); + if (Creature* svalna = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_SISTER_SVALNA))) + svalna->AI()->DoAction(ACTION_RESURRECT_CAPTAINS); + } + break; + default: + break; + } + } + + void WaypointStart(uint32 waypointId) + { + _currentWPid = waypointId; + float minY = 0.0f; + switch (waypointId) + { + case 0: + minY = 2600.0f; + break; + case 1: + minY = 2550.0f; + if (Creature* svalna = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_SISTER_SVALNA))) + svalna->AI()->DoAction(ACTION_KILL_CAPTAIN); + break; + case 2: + minY = 2515.0f; + if (Creature* svalna = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_SISTER_SVALNA))) + svalna->AI()->DoAction(ACTION_KILL_CAPTAIN); + break; + case 4: + minY = 2475.0f; + break; + default: + break; + } + + if (minY) + { + // get all nearby vrykul + std::list temp; + FrostwingVrykulSearcher check(me, 150.0f); + acore::CreatureListSearcher searcher(me, temp, check); + me->VisitNearbyGridObject(150.0f, searcher); + + _aliveTrash.clear(); + for (std::list::iterator itr = temp.begin(); itr != temp.end(); ++itr) + if ((*itr)->GetHomePosition().GetPositionY() > minY) + _aliveTrash.insert((*itr)->GetGUID()); + } + } + + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) + { + if (HealthBelowPct(10)) + { + if (!_didUnderTenPercentText) + { + _didUnderTenPercentText = true; + if (me->GetVictim() && me->GetVictim()->GetEntry() == NPC_SISTER_SVALNA) + Talk(SAY_CROK_WEAKENING_SVALNA); + else + Talk(SAY_CROK_WEAKENING_GAUNTLET); + } + + damage = 0; + me->CastSpell(me, SPELL_ICEBOUND_ARMOR, true); + _events.ScheduleEvent(EVENT_HEALTH_CHECK, 1000); + } + } + + void UpdateEscortAI(uint32 /*diff*/) {} + + void UpdateAI(uint32 diff) + { + npc_escortAI::UpdateAI(diff); + + //Position pos = me->GetHomePosition(); + if (!me->isActiveObject()/* && me->GetExactDist(&pos) < 5.0f*/) // during event + return; + + if (_wipeCheckTimer <= diff) + { + _wipeCheckTimer = 3000; + + Player* player = nullptr; + acore::AnyPlayerInObjectRangeCheck check(me, 140.0f); + acore::PlayerSearcher searcher(me, player, check); + me->VisitNearbyWorldObject(140.0f, searcher); + // wipe + if (!player || me->GetExactDist(4357.0f, 2606.0f, 350.0f) > 125.0f) + { + //Talk(SAY_CROK_DEATH); + FrostwingGauntletRespawner respawner; + acore::CreatureWorker worker(me, respawner); + me->VisitNearbyGridObject(333.0f, worker); + return; + } + } + else + _wipeCheckTimer -= diff; + + UpdateVictim(); + + _events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (_events.ExecuteEvent()) + { + case EVENT_ARNATH_INTRO_2: + if (Creature* arnath = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_CAPTAIN_ARNATH))) + arnath->AI()->Talk(SAY_ARNATH_INTRO_2); + break; + case EVENT_CROK_INTRO_3: + Talk(SAY_CROK_INTRO_3); + break; + case EVENT_START_PATHING: + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_IMMUNE_TO_PC); + Start(true, true); + break; + case EVENT_SCOURGE_STRIKE: + DoCastVictim(SPELL_SCOURGE_STRIKE); + _events.ScheduleEvent(EVENT_SCOURGE_STRIKE, urand(10000, 14000)); + break; + case EVENT_DEATH_STRIKE: + if (HealthBelowPct(20)) + DoCastVictim(SPELL_DEATH_STRIKE); + _events.ScheduleEvent(EVENT_DEATH_STRIKE, urand(5000, 10000)); + break; + case EVENT_HEALTH_CHECK: + if (HealthAbovePct(25)) + { + me->RemoveAurasDueToSpell(SPELL_ICEBOUND_ARMOR); + _didUnderTenPercentText = false; + } + else + { + Unit::DealHeal(me, me, me->CountPctFromMaxHealth(3)); + _events.ScheduleEvent(EVENT_HEALTH_CHECK, 1000); + } + break; + default: + break; + } + + DoMeleeAttackIfReady(); } bool CanAIAttack(Unit const* target) const { // do not see targets inside Frostwing Halls when we are not there - return (me->GetPositionY() > 2660.0f) == (target->GetPositionY() > 2660.0f) && (target->GetTypeId() == TYPEID_PLAYER || target->IsInCombat()); + return target->GetTypeId() != TYPEID_PLAYER && (me->GetPositionY() > 2660.0f) == (target->GetPositionY() > 2660.0f) && target->GetEntry() != NPC_SINDRAGOSA; } - void EnterEvadeMode() + private: + EventMap _events; + std::set _aliveTrash; + InstanceScript* _instance; + uint32 _currentWPid; + uint32 _wipeCheckTimer; + bool _handledWP4; + bool _isEventDone; + bool _didUnderTenPercentText; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } +}; + +class boss_sister_svalna : public CreatureScript +{ +public: + boss_sister_svalna() : CreatureScript("boss_sister_svalna") { } + + struct boss_sister_svalnaAI : public BossAI + { + boss_sister_svalnaAI(Creature* creature) : BossAI(creature, DATA_SISTER_SVALNA) { - if (!_EnterEvadeMode()) + } + + void Reset() + { + _Reset(); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + me->SetReactState(REACT_PASSIVE); + me->SetCanFly(true); + me->SetDisableGravity(true); + me->SetHover(true); + me->SendMovementFlagUpdate(); + } + + void AttackStart(Unit* victim) + { + if (me->HasReactState(REACT_PASSIVE) || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC)) return; - - me->GetMotionMaster()->Clear(false); - if (Creature* crok = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_CROK_SCOURGEBANE))) - me->GetMotionMaster()->MoveFollow(crok, FollowDist, FollowAngle, MOTION_SLOT_IDLE); - else - me->GetMotionMaster()->MoveTargetedHome(); - - Reset(); + BossAI::AttackStart(victim); } - void SpellHit(Unit* /*caster*/, SpellInfo const* spell) + void JustDied(Unit* /*killer*/) { - if (spell->Id == SPELL_REVIVE_CHAMPION && !IsUndead) - { - me->setDeathState(JUST_RESPAWNED); - uint32 newEntry = 0; - switch (me->GetEntry()) - { - case NPC_CAPTAIN_ARNATH: - newEntry = NPC_CAPTAIN_ARNATH_UNDEAD; - break; - case NPC_CAPTAIN_BRANDON: - newEntry = NPC_CAPTAIN_BRANDON_UNDEAD; - break; - case NPC_CAPTAIN_GRONDEL: - newEntry = NPC_CAPTAIN_GRONDEL_UNDEAD; - break; - case NPC_CAPTAIN_RUPERT: - newEntry = NPC_CAPTAIN_RUPERT_UNDEAD; - break; - default: - return; - } + _JustDied(); + Talk(SAY_SVALNA_DEATH); - Talk(SAY_CAPTAIN_RESURRECTED); - me->UpdateEntry(newEntry, me->GetCreatureData()); - IsUndead = true; - DoCast(me, SPELL_UNDEATH, true); - if (Player* p = me->SelectNearestPlayer(150.0f)) - AttackStart(p); - me->SetInCombatWithZone(); + if (Creature* crok = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_CROK_SCOURGEBANE))) // _isEventDone = true, setActive(false) + crok->AI()->DoAction(ACTION_RESET_EVENT); + + uint64 delay = 6000; + for (uint32 i = 0; i < 4; ++i) + if (Creature* crusader = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_CAPTAIN_ARNATH + i))) + if (crusader->IsAlive()) + { + if (crusader->GetEntry() == crusader->GetCreatureData()->id) + { + crusader->m_Events.AddEvent(new CaptainSurviveTalk(*crusader), crusader->m_Events.CalculateTime(delay)); + delay += 6000; + } + else + Unit::Kill(crusader, crusader); + } + } + + void EnterCombat(Unit* /*attacker*/) + { + if (me->HasReactState(REACT_PASSIVE) || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC)) + { + me->CombatStop(false); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + me->SetReactState(REACT_PASSIVE); + return; + } + _EnterCombat(); + me->LowerPlayerDamageReq(me->GetMaxHealth()); + if (Creature* crok = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_CROK_SCOURGEBANE))) + { + crok->AI()->Talk(SAY_CROK_COMBAT_SVALNA); + crok->AI()->AttackStart(me); + } + events.ScheduleEvent(EVENT_SVALNA_COMBAT, 9000); + events.ScheduleEvent(EVENT_IMPALING_SPEAR, urand(15000, 20000)); + } + + void KilledUnit(Unit* victim) + { + switch (victim->GetTypeId()) + { + case TYPEID_PLAYER: + Talk(SAY_SVALNA_KILL); + break; + /*case TYPEID_UNIT: // captains also say something on death and this causes spam + switch (victim->GetEntry()) + { + case NPC_CAPTAIN_ARNATH: + case NPC_CAPTAIN_BRANDON: + case NPC_CAPTAIN_GRONDEL: + case NPC_CAPTAIN_RUPERT: + Talk(SAY_SVALNA_KILL_CAPTAIN); + break; + default: + break; + } + break;*/ + default: + break; } } - protected: - EventMap Events; - InstanceScript* instance; - float FollowAngle; - float FollowDist; - bool IsUndead; + void DoAction(int32 action) + { + switch (action) + { + case ACTION_KILL_CAPTAIN: + if (me->IsAlive()) + me->CastCustomSpell(SPELL_CARESS_OF_DEATH, SPELLVALUE_MAX_TARGETS, 1, me, true); + break; + case ACTION_START_GAUNTLET: + me->setActive(true); + events.ScheduleEvent(EVENT_SVALNA_START, 25000); + break; + case ACTION_RESURRECT_CAPTAINS: + events.RescheduleEvent(EVENT_SVALNA_RESURRECT, 7000); + break; + case ACTION_CAPTAIN_DIES: + Talk(SAY_SVALNA_CAPTAIN_DEATH); + break; + case ACTION_RESET_EVENT: + me->setActive(false); + Reset(); + break; + default: + break; + } + } + + void SpellHit(Unit* caster, SpellInfo const* spell) + { + if (spell->Id == SPELL_HURL_SPEAR && me->HasAura(SPELL_AETHER_SHIELD)) + { + me->RemoveAurasDueToSpell(SPELL_AETHER_SHIELD); + Talk(EMOTE_SVALNA_BROKEN_SHIELD, caster); + } + } + + void MovementInform(uint32 type, uint32 id) + { + if (type != EFFECT_MOTION_TYPE || id != POINT_LAND) + return; + + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + me->SetCanFly(false); + me->SetDisableGravity(false); + me->SetHover(false); + me->SetReactState(REACT_AGGRESSIVE); + DoZoneInCombat(nullptr, 150.0f); + } + + void SpellHitTarget(Unit* target, SpellInfo const* spell) + { + switch (spell->Id) + { + case SPELL_IMPALING_SPEAR_KILL: + Unit::Kill(me, target); + break; + case SPELL_IMPALING_SPEAR: + if (TempSummon* summon = target->SummonCreature(NPC_IMPALING_SPEAR, *target)) + { + Talk(EMOTE_SVALNA_IMPALE, target); + summon->CastCustomSpell(VEHICLE_SPELL_RIDE_HARDCODED, SPELLVALUE_BASE_POINT0, 1, target, false); + summon->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_UNK1 | UNIT_FLAG2_ALLOW_ENEMY_INTERACT); + } + break; + default: + break; + } + } + + void UpdateAI(uint32 diff) + { + if (!me->isActiveObject()) + return; + + UpdateVictim(); + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_SVALNA_START: + Talk(SAY_SVALNA_EVENT_START); + break; + case EVENT_SVALNA_RESURRECT: + Talk(SAY_SVALNA_RESURRECT_CAPTAINS); + me->CastSpell(me, SPELL_REVIVE_CHAMPION, false); + break; + case EVENT_SVALNA_COMBAT: + Talk(SAY_SVALNA_AGGRO); + break; + case EVENT_IMPALING_SPEAR: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, -SPELL_IMPALING_SPEAR)) + { + DoCast(me, SPELL_AETHER_SHIELD); + me->AddAura(70203, me); + DoCast(target, SPELL_IMPALING_SPEAR); + } + events.ScheduleEvent(EVENT_IMPALING_SPEAR, urand(20000, 25000)); + break; + default: + break; + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } +}; + +struct npc_argent_captainAI : public ScriptedAI +{ +public: + npc_argent_captainAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) + { + FollowAngle = PET_FOLLOW_ANGLE; + FollowDist = PET_FOLLOW_DIST; + } + + void Reset() + { + me->SetCorpseDelay(DAY); // leave corpse for a long time so svalna can resurrect + IsUndead = (me->GetCreatureData() && me->GetCreatureData()->id != me->GetEntry()); + } + + void JustDied(Unit* /*killer*/) + { + if (IsUndead) + Talk(SAY_CAPTAIN_DEATH); + else + Talk(SAY_CAPTAIN_SECOND_DEATH); + + IsUndead = false; + } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_CAPTAIN_KILL); + } + + void DoAction(int32 action) + { + if (action == ACTION_START_GAUNTLET) + { + if (Creature* crok = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_CROK_SCOURGEBANE))) + { + FollowAngle = me->GetAngle(crok) + me->GetOrientation(); + FollowDist = me->GetDistance2d(crok); + me->GetMotionMaster()->MoveFollow(crok, FollowDist, FollowAngle, MOTION_SLOT_IDLE); + } + } + } + + void EnterCombat(Unit* /*target*/) + { + if (IsUndead) + DoZoneInCombat(); + } + + bool CanAIAttack(Unit const* target) const + { + // do not see targets inside Frostwing Halls when we are not there + return (me->GetPositionY() > 2660.0f) == (target->GetPositionY() > 2660.0f) && (target->GetTypeId() == TYPEID_PLAYER || target->IsInCombat()); + } + + void EnterEvadeMode() + { + if (!_EnterEvadeMode()) + return; + + me->GetMotionMaster()->Clear(false); + if (Creature* crok = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_CROK_SCOURGEBANE))) + me->GetMotionMaster()->MoveFollow(crok, FollowDist, FollowAngle, MOTION_SLOT_IDLE); + else + me->GetMotionMaster()->MoveTargetedHome(); + + Reset(); + } + + void SpellHit(Unit* /*caster*/, SpellInfo const* spell) + { + if (spell->Id == SPELL_REVIVE_CHAMPION && !IsUndead) + { + me->setDeathState(JUST_RESPAWNED); + uint32 newEntry = 0; + switch (me->GetEntry()) + { + case NPC_CAPTAIN_ARNATH: + newEntry = NPC_CAPTAIN_ARNATH_UNDEAD; + break; + case NPC_CAPTAIN_BRANDON: + newEntry = NPC_CAPTAIN_BRANDON_UNDEAD; + break; + case NPC_CAPTAIN_GRONDEL: + newEntry = NPC_CAPTAIN_GRONDEL_UNDEAD; + break; + case NPC_CAPTAIN_RUPERT: + newEntry = NPC_CAPTAIN_RUPERT_UNDEAD; + break; + default: + return; + } + + Talk(SAY_CAPTAIN_RESURRECTED); + me->UpdateEntry(newEntry, me->GetCreatureData()); + IsUndead = true; + DoCast(me, SPELL_UNDEATH, true); + if (Player* p = me->SelectNearestPlayer(150.0f)) + AttackStart(p); + me->SetInCombatWithZone(); + } + } + +protected: + EventMap Events; + InstanceScript* instance; + float FollowAngle; + float FollowDist; + bool IsUndead; }; class npc_captain_arnath : public CreatureScript { - public: - npc_captain_arnath() : CreatureScript("npc_captain_arnath") { } +public: + npc_captain_arnath() : CreatureScript("npc_captain_arnath") { } - struct npc_captain_arnathAI : public npc_argent_captainAI + struct npc_captain_arnathAI : public npc_argent_captainAI + { + npc_captain_arnathAI(Creature* creature) : npc_argent_captainAI(creature) { - npc_captain_arnathAI(Creature* creature) : npc_argent_captainAI(creature) + } + + void Reset() + { + npc_argent_captainAI::Reset(); + Events.Reset(); + Events.ScheduleEvent(EVENT_ARNATH_FLASH_HEAL, urand(4000, 7000)); + Events.ScheduleEvent(EVENT_ARNATH_PW_SHIELD, urand(8000, 14000)); + Events.ScheduleEvent(EVENT_ARNATH_SMITE, urand(3000, 6000)); + if (Is25ManRaid() && IsUndead) + Events.ScheduleEvent(EVENT_ARNATH_DOMINATE_MIND, urand(22000, 27000)); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + Events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (Events.ExecuteEvent()) { - } - - void Reset() - { - npc_argent_captainAI::Reset(); - Events.Reset(); - Events.ScheduleEvent(EVENT_ARNATH_FLASH_HEAL, urand(4000, 7000)); - Events.ScheduleEvent(EVENT_ARNATH_PW_SHIELD, urand(8000, 14000)); - Events.ScheduleEvent(EVENT_ARNATH_SMITE, urand(3000, 6000)); - if (Is25ManRaid() && IsUndead) - Events.ScheduleEvent(EVENT_ARNATH_DOMINATE_MIND, urand(22000, 27000)); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - Events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (Events.ExecuteEvent()) - { - case EVENT_ARNATH_FLASH_HEAL: - if (Creature* target = FindFriendlyCreature()) - DoCast(target, SPELL_FLASH_HEAL); - Events.ScheduleEvent(EVENT_ARNATH_FLASH_HEAL, urand(6000, 9000)); - break; - case EVENT_ARNATH_PW_SHIELD: + case EVENT_ARNATH_FLASH_HEAL: + if (Creature* target = FindFriendlyCreature()) + DoCast(target, SPELL_FLASH_HEAL); + Events.ScheduleEvent(EVENT_ARNATH_FLASH_HEAL, urand(6000, 9000)); + break; + case EVENT_ARNATH_PW_SHIELD: { std::list targets = DoFindFriendlyMissingBuff(40.0f, SPELL_POWER_WORD_SHIELD); if (!targets.empty()) @@ -1343,238 +1343,238 @@ class npc_captain_arnath : public CreatureScript Events.ScheduleEvent(EVENT_ARNATH_PW_SHIELD, urand(15000, 20000)); break; } - case EVENT_ARNATH_SMITE: - DoCastVictim(SPELL_SMITE); - Events.ScheduleEvent(EVENT_ARNATH_SMITE, urand(4000, 7000)); - break; - case EVENT_ARNATH_DOMINATE_MIND: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, -SPELL_DOMINATE_MIND)) - DoCast(target, SPELL_DOMINATE_MIND); - Events.ScheduleEvent(EVENT_ARNATH_DOMINATE_MIND, urand(28000, 37000)); - break; - default: - break; - } - - DoMeleeAttackIfReady(); + case EVENT_ARNATH_SMITE: + DoCastVictim(SPELL_SMITE); + Events.ScheduleEvent(EVENT_ARNATH_SMITE, urand(4000, 7000)); + break; + case EVENT_ARNATH_DOMINATE_MIND: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, -SPELL_DOMINATE_MIND)) + DoCast(target, SPELL_DOMINATE_MIND); + Events.ScheduleEvent(EVENT_ARNATH_DOMINATE_MIND, urand(28000, 37000)); + break; + default: + break; } - private: - Creature* FindFriendlyCreature() const - { - Creature* target = nullptr; - acore::MostHPMissingInRange u_check(me, 60.0f, 0); - acore::CreatureLastSearcher searcher(me, target, u_check); - me->VisitNearbyGridObject(60.0f, searcher); - return target; - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); + DoMeleeAttackIfReady(); } + + private: + Creature* FindFriendlyCreature() const + { + Creature* target = nullptr; + acore::MostHPMissingInRange u_check(me, 60.0f, 0); + acore::CreatureLastSearcher searcher(me, target, u_check); + me->VisitNearbyGridObject(60.0f, searcher); + return target; + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class npc_captain_brandon : public CreatureScript { - public: - npc_captain_brandon() : CreatureScript("npc_captain_brandon") { } +public: + npc_captain_brandon() : CreatureScript("npc_captain_brandon") { } - struct npc_captain_brandonAI : public npc_argent_captainAI + struct npc_captain_brandonAI : public npc_argent_captainAI + { + npc_captain_brandonAI(Creature* creature) : npc_argent_captainAI(creature) { - npc_captain_brandonAI(Creature* creature) : npc_argent_captainAI(creature) - { - } - - void Reset() - { - npc_argent_captainAI::Reset(); - Events.Reset(); - Events.ScheduleEvent(EVENT_BRANDON_CRUSADER_STRIKE, urand(6000, 10000)); - Events.ScheduleEvent(EVENT_BRANDON_DIVINE_SHIELD, 500); - Events.ScheduleEvent(EVENT_BRANDON_JUDGEMENT_OF_COMMAND, urand(8000, 13000)); - if (IsUndead) - Events.ScheduleEvent(EVENT_BRANDON_HAMMER_OF_BETRAYAL, urand(25000, 30000)); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - Events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = Events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_BRANDON_CRUSADER_STRIKE: - DoCastVictim(SPELL_CRUSADER_STRIKE); - Events.ScheduleEvent(EVENT_BRANDON_CRUSADER_STRIKE, urand(6000, 12000)); - break; - case EVENT_BRANDON_DIVINE_SHIELD: - if (HealthBelowPct(20)) - DoCast(me, SPELL_DIVINE_SHIELD); - Events.ScheduleEvent(EVENT_BRANDON_DIVINE_SHIELD, 500); - break; - case EVENT_BRANDON_JUDGEMENT_OF_COMMAND: - DoCastVictim(SPELL_JUDGEMENT_OF_COMMAND); - Events.ScheduleEvent(EVENT_BRANDON_JUDGEMENT_OF_COMMAND, urand(8000, 13000)); - break; - case EVENT_BRANDON_HAMMER_OF_BETRAYAL: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true)) - DoCast(target, SPELL_HAMMER_OF_BETRAYAL); - Events.ScheduleEvent(EVENT_BRANDON_HAMMER_OF_BETRAYAL, urand(45000, 60000)); - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); } + + void Reset() + { + npc_argent_captainAI::Reset(); + Events.Reset(); + Events.ScheduleEvent(EVENT_BRANDON_CRUSADER_STRIKE, urand(6000, 10000)); + Events.ScheduleEvent(EVENT_BRANDON_DIVINE_SHIELD, 500); + Events.ScheduleEvent(EVENT_BRANDON_JUDGEMENT_OF_COMMAND, urand(8000, 13000)); + if (IsUndead) + Events.ScheduleEvent(EVENT_BRANDON_HAMMER_OF_BETRAYAL, urand(25000, 30000)); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + Events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = Events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_BRANDON_CRUSADER_STRIKE: + DoCastVictim(SPELL_CRUSADER_STRIKE); + Events.ScheduleEvent(EVENT_BRANDON_CRUSADER_STRIKE, urand(6000, 12000)); + break; + case EVENT_BRANDON_DIVINE_SHIELD: + if (HealthBelowPct(20)) + DoCast(me, SPELL_DIVINE_SHIELD); + Events.ScheduleEvent(EVENT_BRANDON_DIVINE_SHIELD, 500); + break; + case EVENT_BRANDON_JUDGEMENT_OF_COMMAND: + DoCastVictim(SPELL_JUDGEMENT_OF_COMMAND); + Events.ScheduleEvent(EVENT_BRANDON_JUDGEMENT_OF_COMMAND, urand(8000, 13000)); + break; + case EVENT_BRANDON_HAMMER_OF_BETRAYAL: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true)) + DoCast(target, SPELL_HAMMER_OF_BETRAYAL); + Events.ScheduleEvent(EVENT_BRANDON_HAMMER_OF_BETRAYAL, urand(45000, 60000)); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class npc_captain_grondel : public CreatureScript { - public: - npc_captain_grondel() : CreatureScript("npc_captain_grondel") { } +public: + npc_captain_grondel() : CreatureScript("npc_captain_grondel") { } - struct npc_captain_grondelAI : public npc_argent_captainAI + struct npc_captain_grondelAI : public npc_argent_captainAI + { + npc_captain_grondelAI(Creature* creature) : npc_argent_captainAI(creature) { - npc_captain_grondelAI(Creature* creature) : npc_argent_captainAI(creature) - { - } - - void Reset() - { - npc_argent_captainAI::Reset(); - Events.Reset(); - Events.ScheduleEvent(EVENT_GRONDEL_CHARGE_CHECK, 500); - Events.ScheduleEvent(EVENT_GRONDEL_MORTAL_STRIKE, urand(8000, 14000)); - Events.ScheduleEvent(EVENT_GRONDEL_SUNDER_ARMOR, urand(3000, 12000)); - if (IsUndead) - Events.ScheduleEvent(EVENT_GRONDEL_CONFLAGRATION, urand(12000, 17000)); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - Events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = Events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_GRONDEL_CHARGE_CHECK: - DoCastVictim(SPELL_CHARGE); - Events.ScheduleEvent(EVENT_GRONDEL_CHARGE_CHECK, 500); - break; - case EVENT_GRONDEL_MORTAL_STRIKE: - DoCastVictim(SPELL_MORTAL_STRIKE); - Events.ScheduleEvent(EVENT_GRONDEL_MORTAL_STRIKE, urand(10000, 15000)); - break; - case EVENT_GRONDEL_SUNDER_ARMOR: - DoCastVictim(SPELL_SUNDER_ARMOR); - Events.ScheduleEvent(EVENT_GRONDEL_SUNDER_ARMOR, urand(5000, 17000)); - break; - case EVENT_GRONDEL_CONFLAGRATION: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) - DoCast(target, SPELL_CONFLAGRATION); - Events.ScheduleEvent(EVENT_GRONDEL_CONFLAGRATION, urand(10000, 15000)); - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); } + + void Reset() + { + npc_argent_captainAI::Reset(); + Events.Reset(); + Events.ScheduleEvent(EVENT_GRONDEL_CHARGE_CHECK, 500); + Events.ScheduleEvent(EVENT_GRONDEL_MORTAL_STRIKE, urand(8000, 14000)); + Events.ScheduleEvent(EVENT_GRONDEL_SUNDER_ARMOR, urand(3000, 12000)); + if (IsUndead) + Events.ScheduleEvent(EVENT_GRONDEL_CONFLAGRATION, urand(12000, 17000)); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + Events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = Events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_GRONDEL_CHARGE_CHECK: + DoCastVictim(SPELL_CHARGE); + Events.ScheduleEvent(EVENT_GRONDEL_CHARGE_CHECK, 500); + break; + case EVENT_GRONDEL_MORTAL_STRIKE: + DoCastVictim(SPELL_MORTAL_STRIKE); + Events.ScheduleEvent(EVENT_GRONDEL_MORTAL_STRIKE, urand(10000, 15000)); + break; + case EVENT_GRONDEL_SUNDER_ARMOR: + DoCastVictim(SPELL_SUNDER_ARMOR); + Events.ScheduleEvent(EVENT_GRONDEL_SUNDER_ARMOR, urand(5000, 17000)); + break; + case EVENT_GRONDEL_CONFLAGRATION: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) + DoCast(target, SPELL_CONFLAGRATION); + Events.ScheduleEvent(EVENT_GRONDEL_CONFLAGRATION, urand(10000, 15000)); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; class npc_captain_rupert : public CreatureScript { - public: - npc_captain_rupert() : CreatureScript("npc_captain_rupert") { } +public: + npc_captain_rupert() : CreatureScript("npc_captain_rupert") { } - struct npc_captain_rupertAI : public npc_argent_captainAI + struct npc_captain_rupertAI : public npc_argent_captainAI + { + npc_captain_rupertAI(Creature* creature) : npc_argent_captainAI(creature) { - npc_captain_rupertAI(Creature* creature) : npc_argent_captainAI(creature) - { - } - - void Reset() - { - npc_argent_captainAI::Reset(); - Events.Reset(); - Events.ScheduleEvent(EVENT_RUPERT_FEL_IRON_BOMB, urand(15000, 20000)); - Events.ScheduleEvent(EVENT_RUPERT_MACHINE_GUN, urand(25000, 30000)); - Events.ScheduleEvent(EVENT_RUPERT_ROCKET_LAUNCH, urand(10000, 15000)); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - Events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = Events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_RUPERT_FEL_IRON_BOMB: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(target, SPELL_FEL_IRON_BOMB); - Events.ScheduleEvent(EVENT_RUPERT_FEL_IRON_BOMB, urand(15000, 20000)); - break; - case EVENT_RUPERT_MACHINE_GUN: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1)) - DoCast(target, SPELL_MACHINE_GUN); - Events.ScheduleEvent(EVENT_RUPERT_MACHINE_GUN, urand(25000, 30000)); - break; - case EVENT_RUPERT_ROCKET_LAUNCH: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1)) - DoCast(target, SPELL_ROCKET_LAUNCH); - Events.ScheduleEvent(EVENT_RUPERT_ROCKET_LAUNCH, urand(10000, 15000)); - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetIcecrownCitadelAI(creature); } + + void Reset() + { + npc_argent_captainAI::Reset(); + Events.Reset(); + Events.ScheduleEvent(EVENT_RUPERT_FEL_IRON_BOMB, urand(15000, 20000)); + Events.ScheduleEvent(EVENT_RUPERT_MACHINE_GUN, urand(25000, 30000)); + Events.ScheduleEvent(EVENT_RUPERT_ROCKET_LAUNCH, urand(10000, 15000)); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + Events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = Events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_RUPERT_FEL_IRON_BOMB: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + DoCast(target, SPELL_FEL_IRON_BOMB); + Events.ScheduleEvent(EVENT_RUPERT_FEL_IRON_BOMB, urand(15000, 20000)); + break; + case EVENT_RUPERT_MACHINE_GUN: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1)) + DoCast(target, SPELL_MACHINE_GUN); + Events.ScheduleEvent(EVENT_RUPERT_MACHINE_GUN, urand(25000, 30000)); + break; + case EVENT_RUPERT_ROCKET_LAUNCH: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1)) + DoCast(target, SPELL_ROCKET_LAUNCH); + Events.ScheduleEvent(EVENT_RUPERT_ROCKET_LAUNCH, urand(10000, 15000)); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetIcecrownCitadelAI(creature); + } }; enum FrostwingVrykl @@ -1586,761 +1586,761 @@ enum FrostwingVrykl class npc_frostwing_vrykul : public CreatureScript { - public: - npc_frostwing_vrykul() : CreatureScript("npc_frostwing_vrykul") { } +public: + npc_frostwing_vrykul() : CreatureScript("npc_frostwing_vrykul") { } - struct npc_frostwing_vrykulAI : public ScriptedAI + struct npc_frostwing_vrykulAI : public ScriptedAI + { + npc_frostwing_vrykulAI(Creature* creature) : ScriptedAI(creature), summons(me) { - npc_frostwing_vrykulAI(Creature* creature) : ScriptedAI(creature), summons(me) - { - if (me->GetEntry() == NPC_YMIRJAR_DEATHBRINGER || me->GetEntry() == NPC_YMIRJAR_FROSTBINDER || me->GetEntry() == NPC_YMIRJAR_HUNTRESS) - isRanged = true; - else - isRanged = false; - } - - EventMap events; - EventMap events2; - SummonList summons; - bool isRanged; - - void AttackStart(Unit* victim) - { - if (me->GetEntry() == NPC_YMIRJAR_FROSTBINDER) - ScriptedAI::AttackStartNoMove(victim); - else if (isRanged) - ScriptedAI::AttackStartCaster(victim, 16.0f); - else - ScriptedAI::AttackStart(victim); - } - - void EnterCombat(Unit* /*who*/) - { - me->InterruptNonMeleeSpells(false); - me->CallForHelp(8.5f); - if (me->GetEntry() == NPC_YMIRJAR_FROSTBINDER) - me->SetHover(true); - } - - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - } - - void Reset() - { - summons.DespawnAll(); - events.Reset(); - events2.Reset(); - switch (me->GetEntry()) - { - case NPC_YMIRJAR_HUNTRESS: - events.ScheduleEvent(1, urand(10000, 15000)); // Ice Trap - events.ScheduleEvent(2, urand(8000, 12000)); // Rapid Shot - events.ScheduleEvent(3, urand(6000, 10000)); // Volley - if (me->GetMap()->Is25ManRaid()) - events.ScheduleEvent(4, 5000); // Summon Warhawk - break; - case NPC_YMIRJAR_WARLORD: - events.ScheduleEvent(11, 6000); // Whirlwind - break; - case NPC_YMIRJAR_BATTLE_MAIDEN: - events.ScheduleEvent(21, 3000); // Barbaric Strike - events.ScheduleEvent(22, urand(8000, 12000)); // Adrenaline Rush - break; - case NPC_YMIRJAR_FROSTBINDER: - events.ScheduleEvent(31, 0); // Arctic Chill - events.ScheduleEvent(32, urand(15000, 25000)); // Frozen Orb - events.ScheduleEvent(33, urand(15000, 30000)); // Twisted Winds - events2.ScheduleEvent(100, 0); // Spirit Stream - me->SetHover(false); - break; - case NPC_YMIRJAR_DEATHBRINGER: - events.ScheduleEvent(41, 2500); // Empowered Shadow Bolt - events.ScheduleEvent(42, 5000); // Summon Undead - events2.ScheduleEvent(100, 0); // Spirit Stream - break; - } - } - - void UpdateAI(uint32 diff) - { - if (!me->IsInCombat()) - { - events2.Update(diff); - switch (events2.ExecuteEvent()) - { - case 100: - if (Creature* stalker = me->FindNearestCreature(NPC_INVISIBLE_STALKER_3_0, 50.0f)) - me->CastSpell(stalker, SPELL_SPIRIT_STREAM, false); - events2.ScheduleEvent(100, 33000); - break; - } - } - - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING) || me->isFeared() || me->isFrozen() || me->HasUnitState(UNIT_STATE_STUNNED) || me->HasUnitState(UNIT_STATE_CONFUSED) || ((me->GetEntry() == NPC_YMIRJAR_DEATHBRINGER || me->GetEntry() == NPC_YMIRJAR_FROSTBINDER) && me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SILENCED))) - return; - - switch (events.GetEvent()) - { - case 0: - break; - case 1: // Ice Trap - me->CastSpell((Unit*)NULL, 71249, false); - events.RepeatEvent(urand(35000, 40000)); - break; - case 2: // Rapid Shot - me->CastSpell(me->GetVictim(), 71251, false); - events.RepeatEvent(urand(25000, 30000)); - break; - case 3: // Volley - { - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 35.0f, true); - if (target && me->GetDistance(target) > 10.0f) - { - me->CastSpell(target, 71252, false); - events.RepeatEvent(urand(25000, 35000)); - } - else - events.RepeatEvent(2500); - } - break; - case 4: // Summon Warhawk - me->CastSpell(me, 71705, false); - events.PopEvent(); - break; - case 11: // Whirlwind - me->CastSpell(me->GetVictim(), 41056, false); - events.RepeatEvent(6000); - break; - case 21: // Barbaric Strike - me->CastSpell(me->GetVictim(), 71257, false); - events.RepeatEvent(3000); - break; - case 22: // Adrenaline Rush - me->CastSpell(me, 71258, false); - events.RepeatEvent(urand(15000, 25000)); - break; - case 31: // Arctic Chill - me->CastSpell(me, 71270, true); - events.PopEvent(); - break; - case 32: // Frozen Orb - if (Unit* target = SelectTarget(SELECT_TARGET_FARTHEST, 0, 30.0f, true)) - me->CastSpell(target, 71274, false); - events.RepeatEvent(urand(40000, 50000)); - break; - case 33: // Twisted Winds - me->CastSpell((Unit*)NULL, 71306, false); - events.RepeatEvent(urand(35000, 50000)); - break; - case 41: // Empowered Shadow Bolt - me->CastSpell(me->GetVictim(), 69528, false); - events.RepeatEvent(2500); - break; - case 42: // Summon Undead - me->CastSpell(me->GetVictim(), 69516, false); - events.RepeatEvent(45000); - break; - default: - events.PopEvent(); - break; - } - - if (me->GetEntry() == NPC_YMIRJAR_HUNTRESS && me->GetVictim() && me->GetDistance(me->GetVictim()) > 5.0f) - DoSpellAttackIfReady(71253); // Shoot - else - DoMeleeAttackIfReady(); - } - - void SpellHitTarget(Unit* c, const SpellInfo* spell) - { - if (spell->Id == 71306 && c->GetTypeId() == TYPEID_UNIT) // Twisted Winds - { - Position myPos; - me->GetPosition(&myPos); - me->NearTeleportTo(c->GetPositionX(), c->GetPositionY(), c->GetPositionZ(), c->GetOrientation()); - c->NearTeleportTo(myPos.GetPositionX(), myPos.GetPositionY(), myPos.GetPositionZ(), myPos.GetOrientation()); - const ThreatContainer::StorageType me_tl = me->getThreatManager().getThreatList(); - const ThreatContainer::StorageType target_tl = c->getThreatManager().getThreatList(); - DoResetThreat(); - for (ThreatContainer::StorageType::const_iterator iter = target_tl.begin(); iter != target_tl.end(); ++iter) - me->getThreatManager().addThreat((*iter)->getTarget(), (*iter)->getThreat()); - - c->getThreatManager().resetAllAggro(); - for (ThreatContainer::StorageType::const_iterator iter = me_tl.begin(); iter != me_tl.end(); ++iter) - c->getThreatManager().addThreat((*iter)->getTarget(), (*iter)->getThreat()); - - } - } - - bool CanAIAttack(Unit const* target) const - { - // do not see targets inside Frostwing Halls when we are not there - return (me->GetPositionY() > 2660.0f) == (target->GetPositionY() > 2660.0f); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_frostwing_vrykulAI(creature); + if (me->GetEntry() == NPC_YMIRJAR_DEATHBRINGER || me->GetEntry() == NPC_YMIRJAR_FROSTBINDER || me->GetEntry() == NPC_YMIRJAR_HUNTRESS) + isRanged = true; + else + isRanged = false; } + + EventMap events; + EventMap events2; + SummonList summons; + bool isRanged; + + void AttackStart(Unit* victim) + { + if (me->GetEntry() == NPC_YMIRJAR_FROSTBINDER) + ScriptedAI::AttackStartNoMove(victim); + else if (isRanged) + ScriptedAI::AttackStartCaster(victim, 16.0f); + else + ScriptedAI::AttackStart(victim); + } + + void EnterCombat(Unit* /*who*/) + { + me->InterruptNonMeleeSpells(false); + me->CallForHelp(8.5f); + if (me->GetEntry() == NPC_YMIRJAR_FROSTBINDER) + me->SetHover(true); + } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + } + + void Reset() + { + summons.DespawnAll(); + events.Reset(); + events2.Reset(); + switch (me->GetEntry()) + { + case NPC_YMIRJAR_HUNTRESS: + events.ScheduleEvent(1, urand(10000, 15000)); // Ice Trap + events.ScheduleEvent(2, urand(8000, 12000)); // Rapid Shot + events.ScheduleEvent(3, urand(6000, 10000)); // Volley + if (me->GetMap()->Is25ManRaid()) + events.ScheduleEvent(4, 5000); // Summon Warhawk + break; + case NPC_YMIRJAR_WARLORD: + events.ScheduleEvent(11, 6000); // Whirlwind + break; + case NPC_YMIRJAR_BATTLE_MAIDEN: + events.ScheduleEvent(21, 3000); // Barbaric Strike + events.ScheduleEvent(22, urand(8000, 12000)); // Adrenaline Rush + break; + case NPC_YMIRJAR_FROSTBINDER: + events.ScheduleEvent(31, 0); // Arctic Chill + events.ScheduleEvent(32, urand(15000, 25000)); // Frozen Orb + events.ScheduleEvent(33, urand(15000, 30000)); // Twisted Winds + events2.ScheduleEvent(100, 0); // Spirit Stream + me->SetHover(false); + break; + case NPC_YMIRJAR_DEATHBRINGER: + events.ScheduleEvent(41, 2500); // Empowered Shadow Bolt + events.ScheduleEvent(42, 5000); // Summon Undead + events2.ScheduleEvent(100, 0); // Spirit Stream + break; + } + } + + void UpdateAI(uint32 diff) + { + if (!me->IsInCombat()) + { + events2.Update(diff); + switch (events2.ExecuteEvent()) + { + case 100: + if (Creature* stalker = me->FindNearestCreature(NPC_INVISIBLE_STALKER_3_0, 50.0f)) + me->CastSpell(stalker, SPELL_SPIRIT_STREAM, false); + events2.ScheduleEvent(100, 33000); + break; + } + } + + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING) || me->isFeared() || me->isFrozen() || me->HasUnitState(UNIT_STATE_STUNNED) || me->HasUnitState(UNIT_STATE_CONFUSED) || ((me->GetEntry() == NPC_YMIRJAR_DEATHBRINGER || me->GetEntry() == NPC_YMIRJAR_FROSTBINDER) && me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SILENCED))) + return; + + switch (events.GetEvent()) + { + case 0: + break; + case 1: // Ice Trap + me->CastSpell((Unit*)NULL, 71249, false); + events.RepeatEvent(urand(35000, 40000)); + break; + case 2: // Rapid Shot + me->CastSpell(me->GetVictim(), 71251, false); + events.RepeatEvent(urand(25000, 30000)); + break; + case 3: // Volley + { + Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 35.0f, true); + if (target && me->GetDistance(target) > 10.0f) + { + me->CastSpell(target, 71252, false); + events.RepeatEvent(urand(25000, 35000)); + } + else + events.RepeatEvent(2500); + } + break; + case 4: // Summon Warhawk + me->CastSpell(me, 71705, false); + events.PopEvent(); + break; + case 11: // Whirlwind + me->CastSpell(me->GetVictim(), 41056, false); + events.RepeatEvent(6000); + break; + case 21: // Barbaric Strike + me->CastSpell(me->GetVictim(), 71257, false); + events.RepeatEvent(3000); + break; + case 22: // Adrenaline Rush + me->CastSpell(me, 71258, false); + events.RepeatEvent(urand(15000, 25000)); + break; + case 31: // Arctic Chill + me->CastSpell(me, 71270, true); + events.PopEvent(); + break; + case 32: // Frozen Orb + if (Unit* target = SelectTarget(SELECT_TARGET_FARTHEST, 0, 30.0f, true)) + me->CastSpell(target, 71274, false); + events.RepeatEvent(urand(40000, 50000)); + break; + case 33: // Twisted Winds + me->CastSpell((Unit*)NULL, 71306, false); + events.RepeatEvent(urand(35000, 50000)); + break; + case 41: // Empowered Shadow Bolt + me->CastSpell(me->GetVictim(), 69528, false); + events.RepeatEvent(2500); + break; + case 42: // Summon Undead + me->CastSpell(me->GetVictim(), 69516, false); + events.RepeatEvent(45000); + break; + default: + events.PopEvent(); + break; + } + + if (me->GetEntry() == NPC_YMIRJAR_HUNTRESS && me->GetVictim() && me->GetDistance(me->GetVictim()) > 5.0f) + DoSpellAttackIfReady(71253); // Shoot + else + DoMeleeAttackIfReady(); + } + + void SpellHitTarget(Unit* c, const SpellInfo* spell) + { + if (spell->Id == 71306 && c->GetTypeId() == TYPEID_UNIT) // Twisted Winds + { + Position myPos; + me->GetPosition(&myPos); + me->NearTeleportTo(c->GetPositionX(), c->GetPositionY(), c->GetPositionZ(), c->GetOrientation()); + c->NearTeleportTo(myPos.GetPositionX(), myPos.GetPositionY(), myPos.GetPositionZ(), myPos.GetOrientation()); + const ThreatContainer::StorageType me_tl = me->getThreatManager().getThreatList(); + const ThreatContainer::StorageType target_tl = c->getThreatManager().getThreatList(); + DoResetThreat(); + for (ThreatContainer::StorageType::const_iterator iter = target_tl.begin(); iter != target_tl.end(); ++iter) + me->getThreatManager().addThreat((*iter)->getTarget(), (*iter)->getThreat()); + + c->getThreatManager().resetAllAggro(); + for (ThreatContainer::StorageType::const_iterator iter = me_tl.begin(); iter != me_tl.end(); ++iter) + c->getThreatManager().addThreat((*iter)->getTarget(), (*iter)->getThreat()); + + } + } + + bool CanAIAttack(Unit const* target) const + { + // do not see targets inside Frostwing Halls when we are not there + return (me->GetPositionY() > 2660.0f) == (target->GetPositionY() > 2660.0f); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_frostwing_vrykulAI(creature); + } }; class npc_impaling_spear : public CreatureScript { - public: - npc_impaling_spear() : CreatureScript("npc_impaling_spear") { } +public: + npc_impaling_spear() : CreatureScript("npc_impaling_spear") { } - struct npc_impaling_spearAI : public NullCreatureAI + struct npc_impaling_spearAI : public NullCreatureAI + { + npc_impaling_spearAI(Creature* creature) : NullCreatureAI(creature) { - npc_impaling_spearAI(Creature* creature) : NullCreatureAI(creature) - { - } - - void Reset() - { - me->SetReactState(REACT_PASSIVE); - _vehicleCheckTimer = 500; - } - - void UpdateAI(uint32 diff) - { - if (_vehicleCheckTimer <= diff) - { - _vehicleCheckTimer = 500; - if (!me->GetVehicle()) - me->DespawnOrUnsummon(100); - } - else - _vehicleCheckTimer -= diff; - } - - uint32 _vehicleCheckTimer; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_impaling_spearAI(creature); } + + void Reset() + { + me->SetReactState(REACT_PASSIVE); + _vehicleCheckTimer = 500; + } + + void UpdateAI(uint32 diff) + { + if (_vehicleCheckTimer <= diff) + { + _vehicleCheckTimer = 500; + if (!me->GetVehicle()) + me->DespawnOrUnsummon(100); + } + else + _vehicleCheckTimer -= diff; + } + + uint32 _vehicleCheckTimer; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_impaling_spearAI(creature); + } }; class npc_alchemist_adrianna : public CreatureScript { - public: - npc_alchemist_adrianna() : CreatureScript("npc_alchemist_adrianna") { } +public: + npc_alchemist_adrianna() : CreatureScript("npc_alchemist_adrianna") { } - bool OnGossipHello(Player* player, Creature* creature) override - { - if (InstanceScript* instance = creature->GetInstanceScript()) - if (instance->GetBossState(DATA_ROTFACE) == DONE && instance->GetBossState(DATA_FESTERGUT) == DONE && !creature->FindCurrentSpellBySpellId(SPELL_HARVEST_BLIGHT_SPECIMEN) && !creature->FindCurrentSpellBySpellId(SPELL_HARVEST_BLIGHT_SPECIMEN25)) - if (player->HasAura(SPELL_ORANGE_BLIGHT_RESIDUE) && player->HasAura(SPELL_GREEN_BLIGHT_RESIDUE)) - creature->CastSpell(creature, SPELL_HARVEST_BLIGHT_SPECIMEN, false); - return false; - } + bool OnGossipHello(Player* player, Creature* creature) override + { + if (InstanceScript* instance = creature->GetInstanceScript()) + if (instance->GetBossState(DATA_ROTFACE) == DONE && instance->GetBossState(DATA_FESTERGUT) == DONE && !creature->FindCurrentSpellBySpellId(SPELL_HARVEST_BLIGHT_SPECIMEN) && !creature->FindCurrentSpellBySpellId(SPELL_HARVEST_BLIGHT_SPECIMEN25)) + if (player->HasAura(SPELL_ORANGE_BLIGHT_RESIDUE) && player->HasAura(SPELL_GREEN_BLIGHT_RESIDUE)) + creature->CastSpell(creature, SPELL_HARVEST_BLIGHT_SPECIMEN, false); + return false; + } }; class npc_arthas_teleport_visual : public CreatureScript { - public: - npc_arthas_teleport_visual() : CreatureScript("npc_arthas_teleport_visual") { } +public: + npc_arthas_teleport_visual() : CreatureScript("npc_arthas_teleport_visual") { } - struct npc_arthas_teleport_visualAI : public NullCreatureAI + struct npc_arthas_teleport_visualAI : public NullCreatureAI + { + npc_arthas_teleport_visualAI(Creature* creature) : NullCreatureAI(creature), _instance(creature->GetInstanceScript()) { - npc_arthas_teleport_visualAI(Creature* creature) : NullCreatureAI(creature), _instance(creature->GetInstanceScript()) - { - } + } - void Reset() - { - _events.Reset(); - if (_instance->GetBossState(DATA_PROFESSOR_PUTRICIDE) == DONE && + void Reset() + { + _events.Reset(); + if (_instance->GetBossState(DATA_PROFESSOR_PUTRICIDE) == DONE && _instance->GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) == DONE && _instance->GetBossState(DATA_SINDRAGOSA) == DONE) - _events.ScheduleEvent(EVENT_SOUL_MISSILE, urand(1000, 6000)); - } - - void UpdateAI(uint32 diff) - { - if (_events.Empty()) - return; - - _events.Update(diff); - - if (_events.ExecuteEvent() == EVENT_SOUL_MISSILE) - { - DoCastAOE(SPELL_SOUL_MISSILE); - _events.ScheduleEvent(EVENT_SOUL_MISSILE, urand(5000, 7000)); - } - } - - private: - InstanceScript* _instance; - EventMap _events; - }; - - CreatureAI* GetAI(Creature* creature) const - { - // Distance from the center of the spire - if (creature->GetExactDist2d(4357.052f, 2769.421f) < 100.0f && creature->GetHomePosition().GetPositionZ() < 315.0f) - return GetIcecrownCitadelAI(creature); - - // Default to no script - return nullptr; + _events.ScheduleEvent(EVENT_SOUL_MISSILE, urand(1000, 6000)); } + + void UpdateAI(uint32 diff) + { + if (_events.Empty()) + return; + + _events.Update(diff); + + if (_events.ExecuteEvent() == EVENT_SOUL_MISSILE) + { + DoCastAOE(SPELL_SOUL_MISSILE); + _events.ScheduleEvent(EVENT_SOUL_MISSILE, urand(5000, 7000)); + } + } + + private: + InstanceScript* _instance; + EventMap _events; + }; + + CreatureAI* GetAI(Creature* creature) const + { + // Distance from the center of the spire + if (creature->GetExactDist2d(4357.052f, 2769.421f) < 100.0f && creature->GetHomePosition().GetPositionZ() < 315.0f) + return GetIcecrownCitadelAI(creature); + + // Default to no script + return nullptr; + } }; class spell_icc_stoneform : public SpellScriptLoader { - public: - spell_icc_stoneform() : SpellScriptLoader("spell_icc_stoneform") { } +public: + spell_icc_stoneform() : SpellScriptLoader("spell_icc_stoneform") { } - class spell_icc_stoneform_AuraScript : public AuraScript + class spell_icc_stoneform_AuraScript : public AuraScript + { + PrepareAuraScript(spell_icc_stoneform_AuraScript); + + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_icc_stoneform_AuraScript); - - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + if (Creature* target = GetTarget()->ToCreature()) { - if (Creature* target = GetTarget()->ToCreature()) - { - target->SetReactState(REACT_PASSIVE); - target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_PC); - target->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_CUSTOM_SPELL_02); - } + target->SetReactState(REACT_PASSIVE); + target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_PC); + target->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_CUSTOM_SPELL_02); } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Creature* target = GetTarget()->ToCreature()) - { - target->SetReactState(REACT_AGGRESSIVE); - target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_PC); - target->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); - } - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_icc_stoneform_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_icc_stoneform_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_icc_stoneform_AuraScript(); } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Creature* target = GetTarget()->ToCreature()) + { + target->SetReactState(REACT_AGGRESSIVE); + target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_PC); + target->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); + } + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_icc_stoneform_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_icc_stoneform_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_icc_stoneform_AuraScript(); + } }; class spell_icc_sprit_alarm : public SpellScriptLoader { - public: - spell_icc_sprit_alarm() : SpellScriptLoader("spell_icc_sprit_alarm") { } +public: + spell_icc_sprit_alarm() : SpellScriptLoader("spell_icc_sprit_alarm") { } - class spell_icc_sprit_alarm_SpellScript : public SpellScript + class spell_icc_sprit_alarm_SpellScript : public SpellScript + { + PrepareSpellScript(spell_icc_sprit_alarm_SpellScript); + + void HandleEvent(SpellEffIndex effIndex) { - PrepareSpellScript(spell_icc_sprit_alarm_SpellScript); - - void HandleEvent(SpellEffIndex effIndex) + PreventHitDefaultEffect(effIndex); + float range = 0.0f; + switch (GetSpellInfo()->Effects[effIndex].MiscValue) { - PreventHitDefaultEffect(effIndex); - float range = 0.0f; - switch (GetSpellInfo()->Effects[effIndex].MiscValue) - { - case EVENT_AWAKEN_WARD_1: - case EVENT_AWAKEN_WARD_2: - range = 100.0f; - break; - case EVENT_AWAKEN_WARD_3: - case EVENT_AWAKEN_WARD_4: - range = 50.0f; - break; - default: - return; - } + case EVENT_AWAKEN_WARD_1: + case EVENT_AWAKEN_WARD_2: + range = 100.0f; + break; + case EVENT_AWAKEN_WARD_3: + case EVENT_AWAKEN_WARD_4: + range = 50.0f; + break; + default: + return; + } - std::list wards; - GetCaster()->GetCreatureListWithEntryInGrid(wards, NPC_DEATHBOUND_WARD, range); - wards.sort(acore::ObjectDistanceOrderPred(GetCaster())); - for (std::list::iterator itr = wards.begin(); itr != wards.end(); ++itr) + std::list wards; + GetCaster()->GetCreatureListWithEntryInGrid(wards, NPC_DEATHBOUND_WARD, range); + wards.sort(acore::ObjectDistanceOrderPred(GetCaster())); + for (std::list::iterator itr = wards.begin(); itr != wards.end(); ++itr) + { + if ((*itr)->IsAlive() && (*itr)->HasAura(SPELL_STONEFORM)) { - if ((*itr)->IsAlive() && (*itr)->HasAura(SPELL_STONEFORM)) + if (Player* target = (*itr)->SelectNearestPlayer(150.0f)) { - if (Player* target = (*itr)->SelectNearestPlayer(150.0f)) - { - (*itr)->AI()->Talk(SAY_TRAP_ACTIVATE); - (*itr)->RemoveAurasDueToSpell(SPELL_STONEFORM); - (*itr)->AI()->AttackStart(target); - } - break; + (*itr)->AI()->Talk(SAY_TRAP_ACTIVATE); + (*itr)->RemoveAurasDueToSpell(SPELL_STONEFORM); + (*itr)->AI()->AttackStart(target); } + break; } } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_icc_sprit_alarm_SpellScript::HandleEvent, EFFECT_2, SPELL_EFFECT_SEND_EVENT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_icc_sprit_alarm_SpellScript(); } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_icc_sprit_alarm_SpellScript::HandleEvent, EFFECT_2, SPELL_EFFECT_SEND_EVENT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_icc_sprit_alarm_SpellScript(); + } }; class spell_icc_geist_alarm : public SpellScriptLoader { - public: - spell_icc_geist_alarm() : SpellScriptLoader("spell_icc_geist_alarm") { } +public: + spell_icc_geist_alarm() : SpellScriptLoader("spell_icc_geist_alarm") { } - class spell_icc_geist_alarm_SpellScript : public SpellScript + class spell_icc_geist_alarm_SpellScript : public SpellScript + { + PrepareSpellScript(spell_icc_geist_alarm_SpellScript); + + void HandleEvent(SpellEffIndex effIndex) { - PrepareSpellScript(spell_icc_geist_alarm_SpellScript); - - void HandleEvent(SpellEffIndex effIndex) + PreventHitDefaultEffect(effIndex); + if (InstanceScript* instance = GetCaster()->GetInstanceScript()) { - PreventHitDefaultEffect(effIndex); - if (InstanceScript* instance = GetCaster()->GetInstanceScript()) + Position p = {4356.77f, 2971.90f, 360.52f, M_PI / 2}; + if (Creature* l = instance->instance->SummonCreature(NPC_VENGEFUL_FLESHREAPER, p)) { - Position p = {4356.77f, 2971.90f, 360.52f, M_PI/2}; - if (Creature* l = instance->instance->SummonCreature(NPC_VENGEFUL_FLESHREAPER, p)) + bool hasTarget = false; + Unit* target = nullptr; + if ((target = l->SelectNearestTarget(20.0f))) + hasTarget = true; + else { - bool hasTarget = false; - Unit* target = nullptr; - if ((target = l->SelectNearestTarget(20.0f))) - hasTarget = true; - else + target = l->SelectNearestTarget(120.0f); + l->GetMotionMaster()->MoveJump(l->GetPositionX(), l->GetPositionY() + 55.0f, l->GetPositionZ(), 20.0f, 6.0f); + } + l->AI()->Talk(0); + l->AI()->AttackStart(target); + l->AddThreat(target, 1.0f); + for (uint8 i = 0; i < 5; ++i) + { + float dist = 2.0f + rand_norm() * 4.0f; + float angle = rand_norm() * 2 * M_PI; + Position pos(p); + l->MovePosition(pos, dist, angle); + if (Creature* c = l->SummonCreature(NPC_VENGEFUL_FLESHREAPER, pos, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30 * MINUTE * IN_MILLISECONDS)) { - target = l->SelectNearestTarget(120.0f); - l->GetMotionMaster()->MoveJump(l->GetPositionX(), l->GetPositionY()+55.0f, l->GetPositionZ(), 20.0f, 6.0f); - } - l->AI()->Talk(0); - l->AI()->AttackStart(target); - l->AddThreat(target, 1.0f); - for (uint8 i = 0; i<5; ++i) - { - float dist = 2.0f + rand_norm()*4.0f; - float angle = rand_norm()*2*M_PI; - Position pos(p); - l->MovePosition(pos, dist, angle); - if (Creature* c = l->SummonCreature(NPC_VENGEFUL_FLESHREAPER, pos, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30*MINUTE*IN_MILLISECONDS)) - { - c->AI()->AttackStart(l->GetVictim()); - c->AddThreat(l->GetVictim(), 1.0f); - if (!hasTarget) - c->GetMotionMaster()->MoveJump(c->GetPositionX(), c->GetPositionY()+55.0f, c->GetPositionZ(), 20.0f, 6.0f); - } + c->AI()->AttackStart(l->GetVictim()); + c->AddThreat(l->GetVictim(), 1.0f); + if (!hasTarget) + c->GetMotionMaster()->MoveJump(c->GetPositionX(), c->GetPositionY() + 55.0f, c->GetPositionZ(), 20.0f, 6.0f); } } } } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_icc_geist_alarm_SpellScript::HandleEvent, EFFECT_2, SPELL_EFFECT_SEND_EVENT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_icc_geist_alarm_SpellScript(); } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_icc_geist_alarm_SpellScript::HandleEvent, EFFECT_2, SPELL_EFFECT_SEND_EVENT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_icc_geist_alarm_SpellScript(); + } }; class spell_frost_giant_death_plague : public SpellScriptLoader { - public: - spell_frost_giant_death_plague() : SpellScriptLoader("spell_frost_giant_death_plague") { } +public: + spell_frost_giant_death_plague() : SpellScriptLoader("spell_frost_giant_death_plague") { } - class spell_frost_giant_death_plague_SpellScript : public SpellScript + class spell_frost_giant_death_plague_SpellScript : public SpellScript + { + PrepareSpellScript(spell_frost_giant_death_plague_SpellScript); + + // First effect + void CountTargets(std::list& targets) { - PrepareSpellScript(spell_frost_giant_death_plague_SpellScript); + targets.remove_if(acore::ObjectTypeIdCheck(TYPEID_PLAYER, false)); + targets.remove_if(acore::ObjectGUIDCheck(GetCaster()->GetGUID(), true)); - // First effect - void CountTargets(std::list& targets) - { - targets.remove_if(acore::ObjectTypeIdCheck(TYPEID_PLAYER, false)); - targets.remove_if(acore::ObjectGUIDCheck(GetCaster()->GetGUID(), true)); - - bool kill = true; - for (std::list::const_iterator itr = targets.begin(); itr != targets.end(); ++itr) - if (!(*itr)->ToUnit()->HasAura(SPELL_DEATH_PLAGUE_AURA)) - { - kill = false; - break; - } - if (kill) - GetCaster()->CastSpell(GetCaster(), SPELL_DEATH_PLAGUE_KILL, true); - else + bool kill = true; + for (std::list::const_iterator itr = targets.begin(); itr != targets.end(); ++itr) + if (!(*itr)->ToUnit()->HasAura(SPELL_DEATH_PLAGUE_AURA)) { - GetCaster()->CastSpell(GetCaster(), SPELL_RECENTLY_INFECTED, true); - targets.push_back(GetCaster()); + kill = false; + break; } - } - - void HandleScript(SpellEffIndex /*effIndex*/) + if (kill) + GetCaster()->CastSpell(GetCaster(), SPELL_DEATH_PLAGUE_KILL, true); + else { - if (!GetHitUnit()->HasAura(SPELL_RECENTLY_INFECTED) && !GetHitUnit()->HasAura(SPELL_DEATH_PLAGUE_AURA)) - GetHitUnit()->CastSpell(GetHitUnit(), SPELL_DEATH_PLAGUE_AURA, true); + GetCaster()->CastSpell(GetCaster(), SPELL_RECENTLY_INFECTED, true); + targets.push_back(GetCaster()); } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_frost_giant_death_plague_SpellScript::CountTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); - OnEffectHitTarget += SpellEffectFn(spell_frost_giant_death_plague_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_frost_giant_death_plague_SpellScript(); } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + if (!GetHitUnit()->HasAura(SPELL_RECENTLY_INFECTED) && !GetHitUnit()->HasAura(SPELL_DEATH_PLAGUE_AURA)) + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_DEATH_PLAGUE_AURA, true); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_frost_giant_death_plague_SpellScript::CountTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); + OnEffectHitTarget += SpellEffectFn(spell_frost_giant_death_plague_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_frost_giant_death_plague_SpellScript(); + } }; class spell_icc_harvest_blight_specimen : public SpellScriptLoader { - public: - spell_icc_harvest_blight_specimen() : SpellScriptLoader("spell_icc_harvest_blight_specimen") { } +public: + spell_icc_harvest_blight_specimen() : SpellScriptLoader("spell_icc_harvest_blight_specimen") { } - class spell_icc_harvest_blight_specimen_SpellScript : public SpellScript + class spell_icc_harvest_blight_specimen_SpellScript : public SpellScript + { + PrepareSpellScript(spell_icc_harvest_blight_specimen_SpellScript); + + void HandleScript(SpellEffIndex effIndex) { - PrepareSpellScript(spell_icc_harvest_blight_specimen_SpellScript); - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetHitUnit()->RemoveAurasDueToSpell(uint32(GetEffectValue())); - } - - void HandleQuestComplete(SpellEffIndex /*effIndex*/) - { - GetHitUnit()->RemoveAurasDueToSpell(uint32(GetEffectValue())); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_icc_harvest_blight_specimen_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - OnEffectHitTarget += SpellEffectFn(spell_icc_harvest_blight_specimen_SpellScript::HandleQuestComplete, EFFECT_1, SPELL_EFFECT_QUEST_COMPLETE); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_icc_harvest_blight_specimen_SpellScript(); + PreventHitDefaultEffect(effIndex); + GetHitUnit()->RemoveAurasDueToSpell(uint32(GetEffectValue())); } + + void HandleQuestComplete(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->RemoveAurasDueToSpell(uint32(GetEffectValue())); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_icc_harvest_blight_specimen_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + OnEffectHitTarget += SpellEffectFn(spell_icc_harvest_blight_specimen_SpellScript::HandleQuestComplete, EFFECT_1, SPELL_EFFECT_QUEST_COMPLETE); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_icc_harvest_blight_specimen_SpellScript(); + } }; class AliveCheck { - public: - bool operator()(WorldObject* object) const - { - if (Unit* unit = object->ToUnit()) - return unit->IsAlive(); - return true; - } +public: + bool operator()(WorldObject* object) const + { + if (Unit* unit = object->ToUnit()) + return unit->IsAlive(); + return true; + } }; class spell_svalna_revive_champion : public SpellScriptLoader { - public: - spell_svalna_revive_champion() : SpellScriptLoader("spell_svalna_revive_champion") { } +public: + spell_svalna_revive_champion() : SpellScriptLoader("spell_svalna_revive_champion") { } - class spell_svalna_revive_champion_SpellScript : public SpellScript + class spell_svalna_revive_champion_SpellScript : public SpellScript + { + PrepareSpellScript(spell_svalna_revive_champion_SpellScript); + + void RemoveAliveTarget(std::list& targets) { - PrepareSpellScript(spell_svalna_revive_champion_SpellScript); - - void RemoveAliveTarget(std::list& targets) - { - targets.remove_if(AliveCheck()); - acore::Containers::RandomResizeList(targets, 2); - } - - void Land(SpellEffIndex /*effIndex*/) - { - Creature* caster = GetCaster()->ToCreature(); - if (!caster) - return; - - Position pos; - caster->GetPosition(&pos); - caster->GetNearPosition(pos, 5.0f, 0.0f); - pos.m_positionZ = caster->GetBaseMap()->GetHeight(caster->GetPhaseMask(), pos.GetPositionX(), pos.GetPositionY(), caster->GetPositionZ(), true, 50.0f); - pos.m_positionZ += 0.1f; - caster->SendMeleeAttackStop(caster->GetVictim()); - caster->GetMotionMaster()->MoveLand(POINT_LAND, pos, 7.0f); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_svalna_revive_champion_SpellScript::RemoveAliveTarget, EFFECT_0, TARGET_UNIT_DEST_AREA_ENTRY); - OnEffectHit += SpellEffectFn(spell_svalna_revive_champion_SpellScript::Land, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_svalna_revive_champion_SpellScript(); + targets.remove_if(AliveCheck()); + acore::Containers::RandomResizeList(targets, 2); } + + void Land(SpellEffIndex /*effIndex*/) + { + Creature* caster = GetCaster()->ToCreature(); + if (!caster) + return; + + Position pos; + caster->GetPosition(&pos); + caster->GetNearPosition(pos, 5.0f, 0.0f); + pos.m_positionZ = caster->GetBaseMap()->GetHeight(caster->GetPhaseMask(), pos.GetPositionX(), pos.GetPositionY(), caster->GetPositionZ(), true, 50.0f); + pos.m_positionZ += 0.1f; + caster->SendMeleeAttackStop(caster->GetVictim()); + caster->GetMotionMaster()->MoveLand(POINT_LAND, pos, 7.0f); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_svalna_revive_champion_SpellScript::RemoveAliveTarget, EFFECT_0, TARGET_UNIT_DEST_AREA_ENTRY); + OnEffectHit += SpellEffectFn(spell_svalna_revive_champion_SpellScript::Land, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_svalna_revive_champion_SpellScript(); + } }; class spell_svalna_remove_spear : public SpellScriptLoader { - public: - spell_svalna_remove_spear() : SpellScriptLoader("spell_svalna_remove_spear") { } +public: + spell_svalna_remove_spear() : SpellScriptLoader("spell_svalna_remove_spear") { } - class spell_svalna_remove_spear_SpellScript : public SpellScript + class spell_svalna_remove_spear_SpellScript : public SpellScript + { + PrepareSpellScript(spell_svalna_remove_spear_SpellScript); + + void HandleScript(SpellEffIndex effIndex) { - PrepareSpellScript(spell_svalna_remove_spear_SpellScript); - - void HandleScript(SpellEffIndex effIndex) + PreventHitDefaultEffect(effIndex); + if (Creature* target = GetHitCreature()) { - PreventHitDefaultEffect(effIndex); - if (Creature* target = GetHitCreature()) - { - if (Unit* vehicle = target->GetVehicleBase()) - vehicle->RemoveAurasDueToSpell(SPELL_IMPALING_SPEAR); - target->DespawnOrUnsummon(1); - } + if (Unit* vehicle = target->GetVehicleBase()) + vehicle->RemoveAurasDueToSpell(SPELL_IMPALING_SPEAR); + target->DespawnOrUnsummon(1); } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_svalna_remove_spear_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_svalna_remove_spear_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_svalna_remove_spear_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_svalna_remove_spear_SpellScript(); + } }; class spell_icc_soul_missile : public SpellScriptLoader { - public: - spell_icc_soul_missile() : SpellScriptLoader("spell_icc_soul_missile") { } +public: + spell_icc_soul_missile() : SpellScriptLoader("spell_icc_soul_missile") { } - class spell_icc_soul_missile_SpellScript : public SpellScript + class spell_icc_soul_missile_SpellScript : public SpellScript + { + PrepareSpellScript(spell_icc_soul_missile_SpellScript); + + void RelocateDest() { - PrepareSpellScript(spell_icc_soul_missile_SpellScript); - - void RelocateDest() - { - static Position const offset = {0.0f, 0.0f, 200.0f, 0.0f}; - const_cast(GetExplTargetDest())->RelocateOffset(offset); - } - - void Register() - { - OnCast += SpellCastFn(spell_icc_soul_missile_SpellScript::RelocateDest); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_icc_soul_missile_SpellScript(); + static Position const offset = {0.0f, 0.0f, 200.0f, 0.0f}; + const_cast(GetExplTargetDest())->RelocateOffset(offset); } + + void Register() + { + OnCast += SpellCastFn(spell_icc_soul_missile_SpellScript::RelocateDest); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_icc_soul_missile_SpellScript(); + } }; class at_icc_saurfang_portal : public AreaTriggerScript { - public: - at_icc_saurfang_portal() : AreaTriggerScript("at_icc_saurfang_portal") { } +public: + at_icc_saurfang_portal() : AreaTriggerScript("at_icc_saurfang_portal") { } - bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) + bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) + { + InstanceScript* instance = player->GetInstanceScript(); + if (!instance || instance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != DONE) + return true; + + Position destPos = {4126.35f, 2769.23f, 350.963f, 0.0f}; + + if (instance->GetData(DATA_COLDFLAME_JETS) == NOT_STARTED) { - InstanceScript* instance = player->GetInstanceScript(); - if (!instance || instance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != DONE) - return true; + // save original player position + float x, y, z, o; + player->GetPosition(x, y, z, o); - Position destPos = {4126.35f, 2769.23f, 350.963f, 0.0f}; + // move player to preload grid and be able to select nearby npcs + player->GetMap()->PlayerRelocation(player, destPos.GetPositionX(), destPos.GetPositionY(), destPos.GetPositionZ(), destPos.GetOrientation()); - if (instance->GetData(DATA_COLDFLAME_JETS) == NOT_STARTED) + instance->SetData(DATA_COLDFLAME_JETS, IN_PROGRESS); + std::list traps; + GetCreatureListWithEntryInGrid(traps, player, NPC_FROST_FREEZE_TRAP, 120.0f); + traps.sort(acore::ObjectDistanceOrderPred(player)); + bool instant = false; + for (std::list::iterator itr = traps.begin(); itr != traps.end(); ++itr) { - // save original player position - float x, y, z, o; - player->GetPosition(x, y, z, o); - - // move player to preload grid and be able to select nearby npcs - player->GetMap()->PlayerRelocation(player, destPos.GetPositionX(), destPos.GetPositionY(), destPos.GetPositionZ(), destPos.GetOrientation()); - - instance->SetData(DATA_COLDFLAME_JETS, IN_PROGRESS); - std::list traps; - GetCreatureListWithEntryInGrid(traps, player, NPC_FROST_FREEZE_TRAP, 120.0f); - traps.sort(acore::ObjectDistanceOrderPred(player)); - bool instant = false; - for (std::list::iterator itr = traps.begin(); itr != traps.end(); ++itr) - { - (*itr)->AI()->DoAction(instant ? 1000 : 11000); - instant = !instant; - } - - // restore original position - player->GetMap()->PlayerRelocation(player, x, y, z, o); + (*itr)->AI()->DoAction(instant ? 1000 : 11000); + instant = !instant; } - player->TeleportTo(631, destPos.GetPositionX(), destPos.GetPositionY(), destPos.GetPositionZ(), destPos.GetOrientation()); - - return true; + // restore original position + player->GetMap()->PlayerRelocation(player, x, y, z, o); } + + player->TeleportTo(631, destPos.GetPositionX(), destPos.GetPositionY(), destPos.GetPositionZ(), destPos.GetOrientation()); + + return true; + } }; class at_icc_shutdown_traps : public AreaTriggerScript { - public: - at_icc_shutdown_traps() : AreaTriggerScript("at_icc_shutdown_traps") { } +public: + at_icc_shutdown_traps() : AreaTriggerScript("at_icc_shutdown_traps") { } - bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) - { - if (InstanceScript* instance = player->GetInstanceScript()) - instance->SetData(DATA_COLDFLAME_JETS, DONE); - return true; - } + bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) + { + if (InstanceScript* instance = player->GetInstanceScript()) + instance->SetData(DATA_COLDFLAME_JETS, DONE); + return true; + } }; class at_icc_start_blood_quickening : public AreaTriggerScript { - public: - at_icc_start_blood_quickening() : AreaTriggerScript("at_icc_start_blood_quickening") { } +public: + at_icc_start_blood_quickening() : AreaTriggerScript("at_icc_start_blood_quickening") { } - bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) - { - if (InstanceScript* instance = player->GetInstanceScript()) - instance->SetData(DATA_BLOOD_QUICKENING_STATE, IN_PROGRESS); - return true; - } + bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) + { + if (InstanceScript* instance = player->GetInstanceScript()) + instance->SetData(DATA_BLOOD_QUICKENING_STATE, IN_PROGRESS); + return true; + } }; class at_icc_start_frostwing_gauntlet : public AreaTriggerScript { - public: - at_icc_start_frostwing_gauntlet() : AreaTriggerScript("at_icc_start_frostwing_gauntlet") { } +public: + at_icc_start_frostwing_gauntlet() : AreaTriggerScript("at_icc_start_frostwing_gauntlet") { } - bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) - { - if (InstanceScript* instance = player->GetInstanceScript()) - if (instance->GetBossState(DATA_SISTER_SVALNA) != DONE) - if (Creature* crok = ObjectAccessor::GetCreature(*player, instance->GetData64(DATA_CROK_SCOURGEBANE))) + bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) + { + if (InstanceScript* instance = player->GetInstanceScript()) + if (instance->GetBossState(DATA_SISTER_SVALNA) != DONE) + if (Creature* crok = ObjectAccessor::GetCreature(*player, instance->GetData64(DATA_CROK_SCOURGEBANE))) + { + if (!crok->IsAlive()) { - if (!crok->IsAlive()) - { - FrostwingGauntletRespawner respawner; - acore::CreatureWorker worker(crok, respawner); - crok->VisitNearbyGridObject(333.0f, worker); - return true; - } - else - crok->AI()->DoAction(ACTION_START_GAUNTLET); + FrostwingGauntletRespawner respawner; + acore::CreatureWorker worker(crok, respawner); + crok->VisitNearbyGridObject(333.0f, worker); + return true; } - return true; - } + else + crok->AI()->DoAction(ACTION_START_GAUNTLET); + } + return true; + } }; @@ -2403,32 +2403,32 @@ public: class spell_stinky_precious_decimate : public SpellScriptLoader { - public: - spell_stinky_precious_decimate() : SpellScriptLoader("spell_stinky_precious_decimate") { } +public: + spell_stinky_precious_decimate() : SpellScriptLoader("spell_stinky_precious_decimate") { } - class spell_stinky_precious_decimate_SpellScript : public SpellScript + class spell_stinky_precious_decimate_SpellScript : public SpellScript + { + PrepareSpellScript(spell_stinky_precious_decimate_SpellScript); + + void HandleScript(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_stinky_precious_decimate_SpellScript); - - void HandleScript(SpellEffIndex /*effIndex*/) + if (GetHitUnit()->GetHealthPct() > float(GetEffectValue())) { - if (GetHitUnit()->GetHealthPct() > float(GetEffectValue())) - { - uint32 newHealth = GetHitUnit()->GetMaxHealth() * uint32(GetEffectValue()) / 100; - GetHitUnit()->SetHealth(newHealth); - } + uint32 newHealth = GetHitUnit()->GetMaxHealth() * uint32(GetEffectValue()) / 100; + GetHitUnit()->SetHealth(newHealth); } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_stinky_precious_decimate_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_stinky_precious_decimate_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_stinky_precious_decimate_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_stinky_precious_decimate_SpellScript(); + } }; class spell_icc_yf_frozen_orb : public SpellScriptLoader @@ -2440,7 +2440,7 @@ public: { PrepareAuraScript(spell_icc_yf_frozen_orb_AuraScript) - void HandleEffectPeriodic(AuraEffect const * /*aurEff*/) + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) { PreventDefaultAction(); if (Unit* c = GetCaster()) @@ -2454,7 +2454,7 @@ public: } }; - AuraScript *GetAuraScript() const + AuraScript* GetAuraScript() const { return new spell_icc_yf_frozen_orb_AuraScript(); } @@ -2469,13 +2469,13 @@ public: { PrepareAuraScript(spell_icc_yh_volley_AuraScript) - void HandleEffectPeriodic(AuraEffect const * aurEff) + void HandleEffectPeriodic(AuraEffect const* aurEff) { PreventDefaultAction(); if (Unit* c = GetCaster()) if (Unit* t = GetTarget()) { - if ((aurEff->GetTickNumber()%5) == 0) + if ((aurEff->GetTickNumber() % 5) == 0) c->SetFacingToObject(t); int32 basepoints1 = aurEff->GetAmount(); c->CastCustomSpell(t, 41089, 0, &basepoints1, 0, true); @@ -2488,7 +2488,7 @@ public: } }; - AuraScript *GetAuraScript() const + AuraScript* GetAuraScript() const { return new spell_icc_yh_volley_AuraScript(); } @@ -2496,58 +2496,58 @@ public: class spell_icc_yd_summon_undead : public SpellScriptLoader { - public: - spell_icc_yd_summon_undead() : SpellScriptLoader("spell_icc_yd_summon_undead") { } +public: + spell_icc_yd_summon_undead() : SpellScriptLoader("spell_icc_yd_summon_undead") { } - class spell_icc_yd_summon_undead_SpellScript : public SpellScript + class spell_icc_yd_summon_undead_SpellScript : public SpellScript + { + PrepareSpellScript(spell_icc_yd_summon_undead_SpellScript); + + void HandleDummyLaunch(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_icc_yd_summon_undead_SpellScript); - - void HandleDummyLaunch(SpellEffIndex /*effIndex*/) - { - if (Unit* c = GetCaster()) - if (c->GetMapId() == 631) - for (uint8 i = 0; i < 5; ++i) - c->CastSpell(c, 71302, true); - } - - void Register() - { - OnEffectLaunch += SpellEffectFn(spell_icc_yd_summon_undead_SpellScript::HandleDummyLaunch, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_icc_yd_summon_undead_SpellScript(); + if (Unit* c = GetCaster()) + if (c->GetMapId() == 631) + for (uint8 i = 0; i < 5; ++i) + c->CastSpell(c, 71302, true); } + + void Register() + { + OnEffectLaunch += SpellEffectFn(spell_icc_yd_summon_undead_SpellScript::HandleDummyLaunch, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_icc_yd_summon_undead_SpellScript(); + } }; class spell_icc_shattered_bones : public SpellScriptLoader { - public: - spell_icc_shattered_bones() : SpellScriptLoader("spell_icc_shattered_bones") { } +public: + spell_icc_shattered_bones() : SpellScriptLoader("spell_icc_shattered_bones") { } - class spell_icc_shattered_bones_SpellScript : public SpellScript + class spell_icc_shattered_bones_SpellScript : public SpellScript + { + PrepareSpellScript(spell_icc_shattered_bones_SpellScript); + + void HandleDummy() { - PrepareSpellScript(spell_icc_shattered_bones_SpellScript); - - void HandleDummy() - { - for (uint8 i=0; i<10; ++i) - GetCaster()->CastSpell((Unit*)NULL, 70963, true); - } - - void Register() - { - AfterCast += SpellCastFn(spell_icc_shattered_bones_SpellScript::HandleDummy); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_icc_shattered_bones_SpellScript(); + for (uint8 i = 0; i < 10; ++i) + GetCaster()->CastSpell((Unit*)NULL, 70963, true); } + + void Register() + { + AfterCast += SpellCastFn(spell_icc_shattered_bones_SpellScript::HandleDummy); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_icc_shattered_bones_SpellScript(); + } }; class npc_icc_skybreaker_hierophant : public CreatureScript @@ -2566,10 +2566,10 @@ public: void EnterCombat(Unit* /*who*/) { events.Reset(); - events.ScheduleEvent(1, urand(5000,15000)); - events.ScheduleEvent(2, urand(5000,15000)); - events.ScheduleEvent(3, urand(5000,15000)); - events.ScheduleEvent(4, urand(1000,3000)); + events.ScheduleEvent(1, urand(5000, 15000)); + events.ScheduleEvent(2, urand(5000, 15000)); + events.ScheduleEvent(3, urand(5000, 15000)); + events.ScheduleEvent(4, urand(1000, 3000)); } void UpdateAI(uint32 diff) @@ -2589,21 +2589,21 @@ public: case 1: if (Unit* target = DoSelectLowestHpFriendly(35.0f, 5000)) me->CastSpell(target, 69899, false); - events.RepeatEvent(urand(10000,20000)); + events.RepeatEvent(urand(10000, 20000)); break; case 2: if (Unit* target = DoSelectLowestHpFriendly(35.0f, 5000)) me->CastSpell(target, 69882, false); - events.RepeatEvent(urand(10000,20000)); + events.RepeatEvent(urand(10000, 20000)); break; case 3: if (Unit* target = DoSelectLowestHpFriendly(35.0f, 5000)) me->CastSpell(target, 69898, false); - events.RepeatEvent(urand(10000,20000)); + events.RepeatEvent(urand(10000, 20000)); break; case 4: me->CastSpell(me->GetVictim(), 69968, false); - events.RepeatEvent(urand(2000,3000)); + events.RepeatEvent(urand(2000, 3000)); break; } @@ -2633,8 +2633,8 @@ public: void EnterCombat(Unit* /*who*/) { events.Reset(); - events.ScheduleEvent(1, urand(5000,10000)); - events.ScheduleEvent(2, urand(5000,15000)); + events.ScheduleEvent(1, urand(5000, 10000)); + events.ScheduleEvent(2, urand(5000, 15000)); } void UpdateAI(uint32 diff) @@ -2653,11 +2653,11 @@ public: break; case 1: me->CastSpell(me->GetVictim(), 69989, false); - events.RepeatEvent(urand(5000,10000)); + events.RepeatEvent(urand(5000, 10000)); break; case 2: me->CastSpell(me->GetVictim(), 69975, false); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); break; } @@ -2687,9 +2687,9 @@ public: void EnterCombat(Unit* /*who*/) { events.Reset(); - events.ScheduleEvent(1, urand(5000,15000)); - events.ScheduleEvent(2, urand(5000,15000)); - events.ScheduleEvent(3, urand(1000,3000)); + events.ScheduleEvent(1, urand(5000, 15000)); + events.ScheduleEvent(2, urand(5000, 15000)); + events.ScheduleEvent(3, urand(1000, 3000)); } void UpdateAI(uint32 diff) @@ -2709,16 +2709,16 @@ public: case 1: if (Unit* target = DoSelectLowestHpFriendly(35.0f, 5000)) me->CastSpell(target, 69963, false); - events.RepeatEvent(urand(10000,20000)); + events.RepeatEvent(urand(10000, 20000)); break; case 2: if (Unit* target = DoSelectLowestHpFriendly(35.0f, 5000)) me->CastSpell(target, 69910, false); - events.RepeatEvent(urand(10000,20000)); + events.RepeatEvent(urand(10000, 20000)); break; case 3: me->CastSpell(me->GetVictim(), 69967, false); - events.RepeatEvent(urand(2000,3000)); + events.RepeatEvent(urand(2000, 3000)); break; } @@ -2748,10 +2748,10 @@ public: void EnterCombat(Unit* /*who*/) { events.Reset(); - events.ScheduleEvent(1, urand(5000,15000)); - events.ScheduleEvent(2, urand(5000,15000)); - events.ScheduleEvent(3, urand(5000,15000)); - events.ScheduleEvent(4, urand(1000,3000)); + events.ScheduleEvent(1, urand(5000, 15000)); + events.ScheduleEvent(2, urand(5000, 15000)); + events.ScheduleEvent(3, urand(5000, 15000)); + events.ScheduleEvent(4, urand(1000, 3000)); } void UpdateAI(uint32 diff) @@ -2771,21 +2771,21 @@ public: case 1: if (Unit* target = DoSelectLowestHpFriendly(35.0f, 5000)) me->CastSpell(target, 69923, false); - events.RepeatEvent(urand(10000,20000)); + events.RepeatEvent(urand(10000, 20000)); break; case 2: if (Unit* target = DoSelectLowestHpFriendly(35.0f, 5000)) me->CastSpell(target, 69926, false); - events.RepeatEvent(urand(20000,30000)); + events.RepeatEvent(urand(20000, 30000)); break; case 3: if (Unit* target = DoSelectLowestHpFriendly(35.0f, 5000)) me->CastSpell(target, 69958, false); - events.RepeatEvent(urand(10000,20000)); + events.RepeatEvent(urand(10000, 20000)); break; case 4: me->CastSpell(me->GetVictim(), 69970, false); - events.RepeatEvent(urand(3000,4000)); + events.RepeatEvent(urand(3000, 4000)); break; } @@ -2891,7 +2891,7 @@ public: { uint8 count = me->GetMap()->Is25ManRaid() ? 4 : 2; bool casted = false; - for (uint8 i=0; iGetVictim(); else - target = DoSelectLowestHpFriendly(sesi_spells[e-1].range-3.0f); + target = DoSelectLowestHpFriendly(sesi_spells[e - 1].range - 3.0f); if (target) - me->CastSpell(target, sesi_spells[e-1].id, TRIGGERED_IGNORE_SHAPESHIFT); + me->CastSpell(target, sesi_spells[e - 1].id, TRIGGERED_IGNORE_SHAPESHIFT); - events.RepeatEvent(sesi_spells[e-1].cooldown_ms); + events.RepeatEvent(sesi_spells[e - 1].cooldown_ms); } if (Class == CLASS_HUNTER) @@ -3070,7 +3070,7 @@ public: if (me->GetHomePosition().GetPositionZ() < 225.0f) return; me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), 191.26f, me->GetOrientation()); - me->GetMotionMaster()->MoveLand(1, me->GetPositionX(), me->GetPositionY(), 191.26f, 2.5f*7.0f); + me->GetMotionMaster()->MoveLand(1, me->GetPositionX(), me->GetPositionY(), 191.26f, 2.5f * 7.0f); Talk(0); } @@ -3133,7 +3133,8 @@ public: }; #define VENGEFUL_WP_COUNT 6 -const Position VengefulWP[VENGEFUL_WP_COUNT] = { +const Position VengefulWP[VENGEFUL_WP_COUNT] = +{ {4432.21f, 3041.5f, 372.783f, 0.0f}, {4370.50f, 3042.00f, 372.80f, 0.0f}, {4370.37f, 3059.16f, 371.69f, 0.0f}, @@ -3193,7 +3194,7 @@ public: ScriptedAI::MoveInLineOfSight(who); else { - if (!me->IsInCombat() && who->GetTypeId() == TYPEID_PLAYER && me->GetExactDist2dSq(who) < 25.0f*25.0f && me->CanSeeOrDetect(who) && me->IsValidAttackTarget(who)) + if (!me->IsInCombat() && who->GetTypeId() == TYPEID_PLAYER && me->GetExactDist2dSq(who) < 25.0f * 25.0f && me->CanSeeOrDetect(who) && me->IsValidAttackTarget(who)) AttackStart(who); } } @@ -3208,8 +3209,8 @@ public: who->GetPosition(&pos); float angle = who->GetAngle(me); float dist = 3.0f; - pos.m_positionX += cos(angle)*dist; - pos.m_positionY += sin(angle)*dist; + pos.m_positionX += cos(angle) * dist; + pos.m_positionY += sin(angle) * dist; me->GetMotionMaster()->MoveJump(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), 10.0f, 6.0f, 0); } } @@ -3221,7 +3222,7 @@ public: needMove = false; if (forward) { - if (currPipeWP == VENGEFUL_WP_COUNT-1) + if (currPipeWP == VENGEFUL_WP_COUNT - 1) { forward = false; --currPipeWP; @@ -3337,8 +3338,8 @@ public: if (!_didWebBeam && who->GetTypeId() == TYPEID_PLAYER && me->GetExactDist2d(who) < 70.0f) { _didWebBeam = true; - float nx = me->GetPositionX() + cos(me->GetOrientation())*2.0f; - float ny = me->GetPositionY() + sin(me->GetOrientation())*2.0f; + float nx = me->GetPositionX() + cos(me->GetOrientation()) * 2.0f; + float ny = me->GetPositionY() + sin(me->GetOrientation()) * 2.0f; float nz = me->GetMap()->GetHeight(nx, ny, 50.0f); me->SetHomePosition(nx, ny, nz, me->GetOrientation()); me->CastSpell(me, SPELL_WEB_BEAM, false); @@ -3438,142 +3439,142 @@ enum gauntletEvents class npc_icc_gauntlet_controller : public CreatureScript { - public: - npc_icc_gauntlet_controller() : CreatureScript("npc_icc_gauntlet_controller") { } +public: + npc_icc_gauntlet_controller() : CreatureScript("npc_icc_gauntlet_controller") { } - struct npc_icc_gauntlet_controllerAI : public NullCreatureAI + struct npc_icc_gauntlet_controllerAI : public NullCreatureAI + { + npc_icc_gauntlet_controllerAI(Creature* creature) : NullCreatureAI(creature), summons(me) { - npc_icc_gauntlet_controllerAI(Creature* creature) : NullCreatureAI(creature), summons(me) + instance = creature->GetInstanceScript(); + } + + SummonList summons; + InstanceScript* instance; + EventMap events; + + void ScheduleBroodlings() + { + for (uint8 i = 0; i < 30; ++i) + events.ScheduleEvent(EVENT_SUMMON_BROODLING, 10000 + i * 350); + } + + + void SummonBroodling() + { + float dist = frand(18.0f, 39.0f); + float o = rand_norm() * 2 * M_PI; + if (Creature* broodling = me->SummonCreature(NPC_NERUBAR_BROODLING, me->GetPositionX() + cos(o) * dist, me->GetPositionY() + sin(o) * dist, 250.0f, Position::NormalizeOrientation(o - M_PI))) { - instance = creature->GetInstanceScript(); + broodling->CastSpell(broodling, SPELL_WEB_BEAM2, false); + broodling->GetMotionMaster()->MovePoint(POINT_ENTER_COMBAT, broodling->GetPositionX(), broodling->GetPositionY(), 213.03f, false); } + } - SummonList summons; - InstanceScript* instance; - EventMap events; - - void ScheduleBroodlings() + void SummonFrostwardens() + { + for (uint8 i = 0; i < 3; ++i) { - for (uint8 i = 0; i < 30; ++i) - events.ScheduleEvent(EVENT_SUMMON_BROODLING, 10000+i*350); + me->SummonCreature(i == 1 ? NPC_FROSTWARDEN_SORCERESS : NPC_FROSTWARDEN_WARRIOR, 4173.94f + i * 7.0f, 2409.15f, 211.033f, 1.56f); + me->SummonCreature(i == 1 ? NPC_FROSTWARDEN_SORCERESS : NPC_FROSTWARDEN_WARRIOR, 4173.94f + i * 7.0f, 2556.71f, 211.033f, 4.712f); } + } + void SummonSpiders() + { + me->SummonCreature(NPC_NERUBAR_CHAMPION, 4207.30f, 2532.00f, 256.0, 4.253f); + me->SummonCreature(NPC_NERUBAR_WEBWEAVER, 4228.79f, 2510.36f, 256.0f, 3.577f); + me->SummonCreature(NPC_NERUBAR_CHAMPION, 4228.34f, 2458.20f, 256.0f, 2.642f); + me->SummonCreature(NPC_NERUBAR_WEBWEAVER, 4207.54f, 2437.18f, 256.0f, 2.073f); + me->SummonCreature(NPC_NERUBAR_CHAMPION, 4156.20f, 2436.80f, 256.0f, 1.083f); + me->SummonCreature(NPC_NERUBAR_WEBWEAVER, 4133.50f, 2459.28f, 256.0f, 0.483f); + me->SummonCreature(NPC_NERUBAR_CHAMPION, 4134.28f, 2509.71f, 256.0f, 5.788f); + me->SummonCreature(NPC_NERUBAR_WEBWEAVER, 4156.29f, 2532.19f, 256.0f, 5.187f); + } - void SummonBroodling() - { - float dist = frand(18.0f, 39.0f); - float o = rand_norm()*2*M_PI; - if (Creature* broodling = me->SummonCreature(NPC_NERUBAR_BROODLING, me->GetPositionX()+cos(o)*dist, me->GetPositionY()+sin(o)*dist, 250.0f, Position::NormalizeOrientation(o-M_PI))) - { - broodling->CastSpell(broodling, SPELL_WEB_BEAM2, false); - broodling->GetMotionMaster()->MovePoint(POINT_ENTER_COMBAT, broodling->GetPositionX(), broodling->GetPositionY(), 213.03f, false); - } - } - - void SummonFrostwardens() - { - for (uint8 i = 0; i < 3; ++i) - { - me->SummonCreature(i == 1 ? NPC_FROSTWARDEN_SORCERESS : NPC_FROSTWARDEN_WARRIOR, 4173.94f+i*7.0f, 2409.15f, 211.033f, 1.56f); - me->SummonCreature(i == 1 ? NPC_FROSTWARDEN_SORCERESS : NPC_FROSTWARDEN_WARRIOR, 4173.94f+i*7.0f, 2556.71f, 211.033f, 4.712f); - } - } - - void SummonSpiders() - { - me->SummonCreature(NPC_NERUBAR_CHAMPION, 4207.30f, 2532.00f, 256.0, 4.253f); - me->SummonCreature(NPC_NERUBAR_WEBWEAVER, 4228.79f, 2510.36f, 256.0f, 3.577f); - me->SummonCreature(NPC_NERUBAR_CHAMPION, 4228.34f, 2458.20f, 256.0f, 2.642f); - me->SummonCreature(NPC_NERUBAR_WEBWEAVER, 4207.54f, 2437.18f, 256.0f, 2.073f); - me->SummonCreature(NPC_NERUBAR_CHAMPION, 4156.20f, 2436.80f, 256.0f, 1.083f); - me->SummonCreature(NPC_NERUBAR_WEBWEAVER, 4133.50f, 2459.28f, 256.0f, 0.483f); - me->SummonCreature(NPC_NERUBAR_CHAMPION, 4134.28f, 2509.71f, 256.0f, 5.788f); - me->SummonCreature(NPC_NERUBAR_WEBWEAVER, 4156.29f, 2532.19f, 256.0f, 5.187f); - } - - void SpidersMoveDown() - { - for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) - if (Creature* spider = ObjectAccessor::GetCreature(*me, *itr)) - if (spider->GetPositionZ() > 220.0f) - { - spider->CastSpell(spider, SPELL_WEB_BEAM2, false); - spider->GetMotionMaster()->MovePoint(POINT_ENTER_COMBAT, spider->GetPositionX(), spider->GetPositionY(), 213.03f, false); - } - } - - void DoAction(int32 param) - { - if (param == ACTION_START_GAUNTLET) - { - Talk(SAY_INIT); - me->setActive(true); - events.Reset(); - events.SetPhase(0); - events.ScheduleEvent(EVENT_CHECK_FIGHT, 1000); - events.ScheduleEvent(EVENT_GAUNTLET_PHASE1, 0); - instance->SetBossState(DATA_SINDRAGOSA_GAUNTLET, IN_PROGRESS); - } - } - - void Reset() + void SpidersMoveDown() + { + for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) + if (Creature* spider = ObjectAccessor::GetCreature(*me, *itr)) + if (spider->GetPositionZ() > 220.0f) + { + spider->CastSpell(spider, SPELL_WEB_BEAM2, false); + spider->GetMotionMaster()->MovePoint(POINT_ENTER_COMBAT, spider->GetPositionX(), spider->GetPositionY(), 213.03f, false); + } + } + + void DoAction(int32 param) + { + if (param == ACTION_START_GAUNTLET) { + Talk(SAY_INIT); + me->setActive(true); events.Reset(); - summons.DespawnAll(); - if (instance->GetBossState(DATA_SINDRAGOSA_GAUNTLET) != DONE) + events.SetPhase(0); + events.ScheduleEvent(EVENT_CHECK_FIGHT, 1000); + events.ScheduleEvent(EVENT_GAUNTLET_PHASE1, 0); + instance->SetBossState(DATA_SINDRAGOSA_GAUNTLET, IN_PROGRESS); + } + } + + void Reset() + { + events.Reset(); + summons.DespawnAll(); + if (instance->GetBossState(DATA_SINDRAGOSA_GAUNTLET) != DONE) + { + instance->SetBossState(DATA_SINDRAGOSA_GAUNTLET, NOT_STARTED); + SummonSpiders(); + } + } + + void JustReachedHome() + { + me->setActive(false); + } + + void JustDied(Unit*) + { + instance->SetBossState(DATA_SINDRAGOSA_GAUNTLET, DONE); + } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + if (summon->GetPositionZ() > 220.0f) + { + summon->SetDisableGravity(true); + summon->SetHover(true); + summon->SetWalk(true); + } + } + + void SummonedCreatureDies(Creature* summon, Unit*) + { + summons.Despawn(summon); + if (summon->GetEntry() != NPC_NERUBAR_BROODLING && summons.GetEntryCount(NPC_NERUBAR_BROODLING) == summons.size()) + { + if (events.GetPhaseMask() == 0) { - instance->SetBossState(DATA_SINDRAGOSA_GAUNTLET, NOT_STARTED); - SummonSpiders(); + events.SetPhase(1); + events.ScheduleEvent(EVENT_GAUNTLET_PHASE2, 0); } - } - - void JustReachedHome() - { - me->setActive(false); - } - - void JustDied(Unit*) - { - instance->SetBossState(DATA_SINDRAGOSA_GAUNTLET, DONE); - } - - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - if (summon->GetPositionZ() > 220.0f) + else if (events.GetPhaseMask() == 1) { - summon->SetDisableGravity(true); - summon->SetHover(true); - summon->SetWalk(true); + events.SetPhase(2); + events.ScheduleEvent(EVENT_GAUNTLET_PHASE3, 0); } + else + Unit::Kill(me, me); } + } - void SummonedCreatureDies(Creature* summon, Unit*) + void UpdateAI(uint32 diff) + { + events.Update(diff); + switch (events.ExecuteEvent()) { - summons.Despawn(summon); - if (summon->GetEntry() != NPC_NERUBAR_BROODLING && summons.GetEntryCount(NPC_NERUBAR_BROODLING) == summons.size()) - { - if (events.GetPhaseMask() == 0) - { - events.SetPhase(1); - events.ScheduleEvent(EVENT_GAUNTLET_PHASE2, 0); - } - else if (events.GetPhaseMask() == 1) - { - events.SetPhase(2); - events.ScheduleEvent(EVENT_GAUNTLET_PHASE3, 0); - } - else - Unit::Kill(me, me); - } - } - - void UpdateAI(uint32 diff) - { - events.Update(diff); - switch (events.ExecuteEvent()) - { - case EVENT_CHECK_FIGHT: + case EVENT_CHECK_FIGHT: { Map::PlayerList const& pList = me->GetMap()->GetPlayers(); for (Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr) @@ -3588,94 +3589,94 @@ class npc_icc_gauntlet_controller : public CreatureScript CreatureAI::EnterEvadeMode(); return; } - case EVENT_GAUNTLET_PHASE1: - ScheduleBroodlings(); - SpidersMoveDown(); - break; - case EVENT_GAUNTLET_PHASE2: - ScheduleBroodlings(); - SummonFrostwardens(); - break; - case EVENT_GAUNTLET_PHASE3: - ScheduleBroodlings(); - SummonSpiders(); - SpidersMoveDown(); - break; - case EVENT_SUMMON_BROODLING: - SummonBroodling(); - break; - } + case EVENT_GAUNTLET_PHASE1: + ScheduleBroodlings(); + SpidersMoveDown(); + break; + case EVENT_GAUNTLET_PHASE2: + ScheduleBroodlings(); + SummonFrostwardens(); + break; + case EVENT_GAUNTLET_PHASE3: + ScheduleBroodlings(); + SummonSpiders(); + SpidersMoveDown(); + break; + case EVENT_SUMMON_BROODLING: + SummonBroodling(); + break; } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class npc_icc_putricades_trap : public CreatureScript { - public: - npc_icc_putricades_trap() : CreatureScript("npc_icc_putricades_trap") { } +public: + npc_icc_putricades_trap() : CreatureScript("npc_icc_putricades_trap") { } - struct npc_icc_putricades_trapAI : public NullCreatureAI + struct npc_icc_putricades_trapAI : public NullCreatureAI + { + npc_icc_putricades_trapAI(Creature* creature) : NullCreatureAI(creature), summons(me) { - npc_icc_putricades_trapAI(Creature* creature) : NullCreatureAI(creature), summons(me) - { - instance = creature->GetInstanceScript(); - } - - SummonList summons; - InstanceScript* instance; - EventMap events; - - void DoAction(int32 param) - { - if (param == ACTION_START_GAUNTLET) - { - me->setActive(true); - events.Reset(); - events.ScheduleEvent(EVENT_CHECK_FIGHT, 1000); - instance->SetData(DATA_PUTRICIDE_TRAP_STATE, IN_PROGRESS); - me->CastSpell(me, SPELL_GIANT_INSECT_SWARM, true); - - for (uint8 i = 0; i < 60; ++i) - events.ScheduleEvent(EVENT_GAUNTLET_PHASE1, i*1000); - events.ScheduleEvent(EVENT_GAUNTLET_PHASE2, 60000); - } - } - - void Reset() + instance = creature->GetInstanceScript(); + } + + SummonList summons; + InstanceScript* instance; + EventMap events; + + void DoAction(int32 param) + { + if (param == ACTION_START_GAUNTLET) { + me->setActive(true); events.Reset(); - summons.DespawnAll(); - if (instance->GetData(DATA_PUTRICIDE_TRAP_STATE) != DONE) - instance->SetData(DATA_PUTRICIDE_TRAP_STATE, NOT_STARTED); - } + events.ScheduleEvent(EVENT_CHECK_FIGHT, 1000); + instance->SetData(DATA_PUTRICIDE_TRAP_STATE, IN_PROGRESS); + me->CastSpell(me, SPELL_GIANT_INSECT_SWARM, true); - void JustReachedHome() - { - me->setActive(false); + for (uint8 i = 0; i < 60; ++i) + events.ScheduleEvent(EVENT_GAUNTLET_PHASE1, i * 1000); + events.ScheduleEvent(EVENT_GAUNTLET_PHASE2, 60000); } + } - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - summon->CastSpell(summon, SPELL_LEAP_TO_A_RANDOM_LOCATION, true); - } + void Reset() + { + events.Reset(); + summons.DespawnAll(); + if (instance->GetData(DATA_PUTRICIDE_TRAP_STATE) != DONE) + instance->SetData(DATA_PUTRICIDE_TRAP_STATE, NOT_STARTED); + } - void SummonedCreatureDies(Creature* summon, Unit*) - { - summons.Despawn(summon); - } + void JustReachedHome() + { + me->setActive(false); + } - void UpdateAI(uint32 diff) + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + summon->CastSpell(summon, SPELL_LEAP_TO_A_RANDOM_LOCATION, true); + } + + void SummonedCreatureDies(Creature* summon, Unit*) + { + summons.Despawn(summon); + } + + void UpdateAI(uint32 diff) + { + events.Update(diff); + switch (events.ExecuteEvent()) { - events.Update(diff); - switch (events.ExecuteEvent()) - { - case EVENT_CHECK_FIGHT: + case EVENT_CHECK_FIGHT: { Map::PlayerList const& pList = me->GetMap()->GetPlayers(); for (Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr) @@ -3690,7 +3691,7 @@ class npc_icc_putricades_trap : public CreatureScript CreatureAI::EnterEvadeMode(); return; } - case EVENT_GAUNTLET_PHASE1: + case EVENT_GAUNTLET_PHASE1: { std::list clist; me->GetCreaturesWithEntryInRange(clist, 80.0f, NPC_INVISIBLE_STALKER); @@ -3699,63 +3700,63 @@ class npc_icc_putricades_trap : public CreatureScript me->SummonCreature(NPC_FLASH_EATING_INSECT, **itr, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); break; } - case EVENT_GAUNTLET_PHASE2: - instance->SetData(DATA_PUTRICIDE_TRAP_STATE, DONE); - me->RemoveAllAuras(); - me->RemoveAllDynObjects(); - break; - } + case EVENT_GAUNTLET_PHASE2: + instance->SetData(DATA_PUTRICIDE_TRAP_STATE, DONE); + me->RemoveAllAuras(); + me->RemoveAllDynObjects(); + break; } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class at_icc_gauntlet_event : public AreaTriggerScript { - public: - at_icc_gauntlet_event() : AreaTriggerScript("at_icc_gauntlet_event") { } +public: + at_icc_gauntlet_event() : AreaTriggerScript("at_icc_gauntlet_event") { } - bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) - { - if (InstanceScript* instance = player->GetInstanceScript()) - if (instance->GetBossState(DATA_SINDRAGOSA_GAUNTLET) == NOT_STARTED && !player->IsGameMaster()) - if (Creature* gauntlet = ObjectAccessor::GetCreature(*player, instance->GetData64(NPC_SINDRAGOSA_GAUNTLET))) - gauntlet->AI()->DoAction(ACTION_START_GAUNTLET); - return true; - } + bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) + { + if (InstanceScript* instance = player->GetInstanceScript()) + if (instance->GetBossState(DATA_SINDRAGOSA_GAUNTLET) == NOT_STARTED && !player->IsGameMaster()) + if (Creature* gauntlet = ObjectAccessor::GetCreature(*player, instance->GetData64(NPC_SINDRAGOSA_GAUNTLET))) + gauntlet->AI()->DoAction(ACTION_START_GAUNTLET); + return true; + } }; class at_icc_putricide_trap : public AreaTriggerScript { - public: - at_icc_putricide_trap() : AreaTriggerScript("at_icc_putricide_trap") { } +public: + at_icc_putricide_trap() : AreaTriggerScript("at_icc_putricide_trap") { } - bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) - { - if (InstanceScript* instance = player->GetInstanceScript()) - if (instance->GetData(DATA_PUTRICIDE_TRAP_STATE) == NOT_STARTED && !player->IsGameMaster()) - if (Creature* trap = ObjectAccessor::GetCreature(*player, instance->GetData64(NPC_PUTRICADES_TRAP))) - trap->AI()->DoAction(ACTION_START_GAUNTLET); - return true; - } + bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) + { + if (InstanceScript* instance = player->GetInstanceScript()) + if (instance->GetData(DATA_PUTRICIDE_TRAP_STATE) == NOT_STARTED && !player->IsGameMaster()) + if (Creature* trap = ObjectAccessor::GetCreature(*player, instance->GetData64(NPC_PUTRICADES_TRAP))) + trap->AI()->DoAction(ACTION_START_GAUNTLET); + return true; + } }; class at_icc_spire_frostwyrm : public AreaTriggerScript { - public: - at_icc_spire_frostwyrm() : AreaTriggerScript("at_icc_spire_frostwyrm") { } +public: + at_icc_spire_frostwyrm() : AreaTriggerScript("at_icc_spire_frostwyrm") { } - bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) - { - if (Creature* frostwyrm = player->FindNearestCreature(NPC_SPIRE_FROSTWYRM, 150.0f, true)) - if (frostwyrm->GetPositionZ() > 250.0f && frostwyrm->AI()) - frostwyrm->AI()->DoAction(-1); - return true; - } + bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) + { + if (Creature* frostwyrm = player->FindNearestCreature(NPC_SPIRE_FROSTWYRM, 150.0f, true)) + if (frostwyrm->GetPositionZ() > 250.0f && frostwyrm->AI()) + frostwyrm->AI()->DoAction(-1); + return true; + } }; void AddSC_icecrown_citadel() diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h index 2813e01ba..a6ffaba6c 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h @@ -346,7 +346,7 @@ enum CreaturesIds NPC_SPIRIT_BOMB = 39189, NPC_FROSTMOURNE_TRIGGER = 38584, NPC_TERENAS_MENETHIL_OUTRO = 38579, - + // Generic NPC_INVISIBLE_STALKER = 30298, NPC_SPIRE_FROSTWYRM = 37230, @@ -373,7 +373,7 @@ enum GameObjectsIds // Lady Deathwhisper GO_ORATORY_OF_THE_DAMNED_ENTRANCE = 201563, GO_LADY_DEATHWHISPER_ELEVATOR = 202220, - + // Icecrown Gunship Battle - Horde raid GO_ORGRIMS_HAMMER_H = 201812, GO_THE_SKYBREAKER_H = 201811, @@ -569,43 +569,43 @@ enum ItemIds class spell_trigger_spell_from_caster : public SpellScriptLoader { +public: + spell_trigger_spell_from_caster(char const* scriptName, uint32 triggerId) : SpellScriptLoader(scriptName), _triggerId(triggerId) { } + + class spell_trigger_spell_from_caster_SpellScript : public SpellScript + { + PrepareSpellScript(spell_trigger_spell_from_caster_SpellScript); + public: - spell_trigger_spell_from_caster(char const* scriptName, uint32 triggerId) : SpellScriptLoader(scriptName), _triggerId(triggerId) { } + spell_trigger_spell_from_caster_SpellScript(uint32 triggerId) : SpellScript(), _triggerId(triggerId) { } - class spell_trigger_spell_from_caster_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spell*/) { - PrepareSpellScript(spell_trigger_spell_from_caster_SpellScript); - - public: - spell_trigger_spell_from_caster_SpellScript(uint32 triggerId) : SpellScript(), _triggerId(triggerId) { } - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(_triggerId)) - return false; - return true; - } - - void HandleTrigger() - { - GetCaster()->CastSpell(GetHitUnit(), _triggerId, true); - } - - void Register() - { - AfterHit += SpellHitFn(spell_trigger_spell_from_caster_SpellScript::HandleTrigger); - } - - uint32 _triggerId; - }; - - SpellScript* GetSpellScript() const - { - return new spell_trigger_spell_from_caster_SpellScript(_triggerId); + if (!sSpellMgr->GetSpellInfo(_triggerId)) + return false; + return true; + } + + void HandleTrigger() + { + GetCaster()->CastSpell(GetHitUnit(), _triggerId, true); + } + + void Register() + { + AfterHit += SpellHitFn(spell_trigger_spell_from_caster_SpellScript::HandleTrigger); } - private: uint32 _triggerId; + }; + + SpellScript* GetSpellScript() const + { + return new spell_trigger_spell_from_caster_SpellScript(_triggerId); + } + +private: + uint32 _triggerId; }; template diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp index 03d6293ea..1a1dc24b2 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp @@ -23,96 +23,96 @@ enum ICCTeleportOption class icecrown_citadel_teleport : public GameObjectScript { - public: - icecrown_citadel_teleport() : GameObjectScript("icecrown_citadel_teleport") { } +public: + icecrown_citadel_teleport() : GameObjectScript("icecrown_citadel_teleport") { } - bool OnGossipHello(Player* player, GameObject* go) override + bool OnGossipHello(Player* player, GameObject* go) override + { + uint32 gossipMenuId = go->GetGOInfo()->GetGossipMenuId(); + + if (go->GetEntry() != GO_SCOURGE_TRANSPORTER_FIRST) + AddGossipItemFor( + player, gossipMenuId, ICC_TELEPORT_GOSSIP_OPT_LIGHTS_HAMMER, + GOSSIP_SENDER_ICC_PORT, LIGHT_S_HAMMER_TELEPORT + ); // M_PI + M_PI/6 + + if (InstanceScript* instance = go->GetInstanceScript()) { - uint32 gossipMenuId = go->GetGOInfo()->GetGossipMenuId(); - - if (go->GetEntry() != GO_SCOURGE_TRANSPORTER_FIRST) + if (instance->GetBossState(DATA_LORD_MARROWGAR) == DONE && go->GetEntry() != 202245) AddGossipItemFor( - player, gossipMenuId, ICC_TELEPORT_GOSSIP_OPT_LIGHTS_HAMMER, - GOSSIP_SENDER_ICC_PORT, LIGHT_S_HAMMER_TELEPORT + player, gossipMenuId, ICC_TELEPORT_GOSSIP_OPT_ORATORY_OF_THE_DAMNED, + GOSSIP_SENDER_ICC_PORT, ORATORY_OF_THE_DAMNED_TELEPORT ); // M_PI + M_PI/6 - - if (InstanceScript* instance = go->GetInstanceScript()) - { - if (instance->GetBossState(DATA_LORD_MARROWGAR) == DONE && go->GetEntry() != 202245) - AddGossipItemFor( - player, gossipMenuId, ICC_TELEPORT_GOSSIP_OPT_ORATORY_OF_THE_DAMNED, - GOSSIP_SENDER_ICC_PORT, ORATORY_OF_THE_DAMNED_TELEPORT - ); // M_PI + M_PI/6 - if (instance->GetBossState(DATA_LADY_DEATHWHISPER) == DONE && go->GetEntry() != 202243) - AddGossipItemFor( - player, gossipMenuId, ICC_TELEPORT_GOSSIP_OPT_RAMPART_OF_SKULLS, - GOSSIP_SENDER_ICC_PORT, RAMPART_OF_SKULLS_TELEPORT - ); // M_PI/6 - if (instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) == DONE && go->GetEntry() != 202244) - AddGossipItemFor( - player, gossipMenuId, ICC_TELEPORT_GOSSIP_OPT_DEATHBRINGERS_RISE, - GOSSIP_SENDER_ICC_PORT, DEATHBRINGER_S_RISE_TELEPORT - ); // M_PI/6 - if (instance->GetData(DATA_COLDFLAME_JETS) == DONE && go->GetEntry() != 202235) - AddGossipItemFor( - player, gossipMenuId, ICC_TELEPORT_GOSSIP_OPT_UPPER_SPIRE, - GOSSIP_SENDER_ICC_PORT, UPPER_SPIRE_TELEPORT - ); // M_PI/6 - if (instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) == DONE && instance->GetBossState(DATA_SINDRAGOSA_GAUNTLET) == DONE && go->GetEntry() != 202246) - AddGossipItemFor( - player, gossipMenuId, ICC_TELEPORT_GOSSIP_OPT_SINDRAGOSAS_LAIR, - GOSSIP_SENDER_ICC_PORT, SINDRAGOSA_S_LAIR_TELEPORT - ); // M_PI*3/2 + M_PI/6 - } - - SendGossipMenuFor(player, player->GetGossipTextId(go), go->GetGUID()); - return true; + if (instance->GetBossState(DATA_LADY_DEATHWHISPER) == DONE && go->GetEntry() != 202243) + AddGossipItemFor( + player, gossipMenuId, ICC_TELEPORT_GOSSIP_OPT_RAMPART_OF_SKULLS, + GOSSIP_SENDER_ICC_PORT, RAMPART_OF_SKULLS_TELEPORT + ); // M_PI/6 + if (instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) == DONE && go->GetEntry() != 202244) + AddGossipItemFor( + player, gossipMenuId, ICC_TELEPORT_GOSSIP_OPT_DEATHBRINGERS_RISE, + GOSSIP_SENDER_ICC_PORT, DEATHBRINGER_S_RISE_TELEPORT + ); // M_PI/6 + if (instance->GetData(DATA_COLDFLAME_JETS) == DONE && go->GetEntry() != 202235) + AddGossipItemFor( + player, gossipMenuId, ICC_TELEPORT_GOSSIP_OPT_UPPER_SPIRE, + GOSSIP_SENDER_ICC_PORT, UPPER_SPIRE_TELEPORT + ); // M_PI/6 + if (instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) == DONE && instance->GetBossState(DATA_SINDRAGOSA_GAUNTLET) == DONE && go->GetEntry() != 202246) + AddGossipItemFor( + player, gossipMenuId, ICC_TELEPORT_GOSSIP_OPT_SINDRAGOSAS_LAIR, + GOSSIP_SENDER_ICC_PORT, SINDRAGOSA_S_LAIR_TELEPORT + ); // M_PI*3/2 + M_PI/6 } - bool OnGossipSelect(Player* player, GameObject* /*go*/, uint32 sender, uint32 action) override + SendGossipMenuFor(player, player->GetGossipTextId(go), go->GetGUID()); + return true; + } + + bool OnGossipSelect(Player* player, GameObject* /*go*/, uint32 sender, uint32 action) override + { + ClearGossipMenuFor(player); + CloseGossipMenuFor(player); + SpellInfo const* spell = sSpellMgr->GetSpellInfo(action); + if (!spell) + return false; + + if (player->IsInCombat()) { - ClearGossipMenuFor(player); - CloseGossipMenuFor(player); - SpellInfo const* spell = sSpellMgr->GetSpellInfo(action); - if (!spell) - return false; - - if (player->IsInCombat()) - { - Spell::SendCastResult(player, spell, 0, SPELL_FAILED_AFFECTING_COMBAT); - return true; - } - - if (sender == GOSSIP_SENDER_ICC_PORT) - player->CastSpell(player, spell, false); - + Spell::SendCastResult(player, spell, 0, SPELL_FAILED_AFFECTING_COMBAT); return true; } + + if (sender == GOSSIP_SENDER_ICC_PORT) + player->CastSpell(player, spell, false); + + return true; + } }; class at_frozen_throne_teleport : public AreaTriggerScript { - public: - at_frozen_throne_teleport() : AreaTriggerScript("at_frozen_throne_teleport") { } +public: + at_frozen_throne_teleport() : AreaTriggerScript("at_frozen_throne_teleport") { } - bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) + bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) + { + if (player->IsInCombat()) { - if (player->IsInCombat()) - { - if (SpellInfo const* spell = sSpellMgr->GetSpellInfo(FROZEN_THRONE_TELEPORT)) - Spell::SendCastResult(player, spell, 0, SPELL_FAILED_AFFECTING_COMBAT); - return true; - } + if (SpellInfo const* spell = sSpellMgr->GetSpellInfo(FROZEN_THRONE_TELEPORT)) + Spell::SendCastResult(player, spell, 0, SPELL_FAILED_AFFECTING_COMBAT); + return true; + } - if (InstanceScript* instance = player->GetInstanceScript()) - if (instance->GetBossState(DATA_PROFESSOR_PUTRICIDE) == DONE && + if (InstanceScript* instance = player->GetInstanceScript()) + if (instance->GetBossState(DATA_PROFESSOR_PUTRICIDE) == DONE && instance->GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) == DONE && instance->GetBossState(DATA_SINDRAGOSA) == DONE && instance->GetBossState(DATA_THE_LICH_KING) != IN_PROGRESS) - player->CastSpell(player, FROZEN_THRONE_TELEPORT, false); + player->CastSpell(player, FROZEN_THRONE_TELEPORT, false); - return true; - } + return true; + } }; void AddSC_icecrown_citadel_teleport() diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp index bc5bc7dfa..516f1db4d 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp @@ -111,524 +111,524 @@ Position const SylvanasSpawnPos = { -41.45833f, 2222.891f, 27.98586f, 3.647738f class RespawnEvent : public BasicEvent { - public: - RespawnEvent(Creature& owner) : _owner(owner) { } +public: + RespawnEvent(Creature& owner) : _owner(owner) { } - bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/) - { - _owner.RemoveCorpse(false); - _owner.Respawn(); - return true; - } + bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/) + { + _owner.RemoveCorpse(false); + _owner.Respawn(); + return true; + } - private: - Creature& _owner; +private: + Creature& _owner; }; class DelayedCastMincharEvent : public BasicEvent { - public: - DelayedCastMincharEvent(Creature* trigger, uint32 spellId) : _trigger(trigger), _spellId(spellId) {} +public: + DelayedCastMincharEvent(Creature* trigger, uint32 spellId) : _trigger(trigger), _spellId(spellId) {} - bool Execute(uint64 /*time*/, uint32 /*diff*/) - { - if (Creature* minchar = _trigger->FindNearestCreature(NPC_INFILTRATOR_MINCHAR_BQ, 50.0f, true)) - _trigger->CastSpell(minchar, _spellId, true); - return true; - } + bool Execute(uint64 /*time*/, uint32 /*diff*/) + { + if (Creature* minchar = _trigger->FindNearestCreature(NPC_INFILTRATOR_MINCHAR_BQ, 50.0f, true)) + _trigger->CastSpell(minchar, _spellId, true); + return true; + } - private: - Creature* _trigger; - uint32 _spellId; +private: + Creature* _trigger; + uint32 _spellId; }; class instance_icecrown_citadel : public InstanceMapScript { - public: - instance_icecrown_citadel() : InstanceMapScript(ICCScriptName, 631) { } +public: + instance_icecrown_citadel() : InstanceMapScript(ICCScriptName, 631) { } - struct instance_icecrown_citadel_InstanceMapScript : public InstanceScript + struct instance_icecrown_citadel_InstanceMapScript : public InstanceScript + { + instance_icecrown_citadel_InstanceMapScript(InstanceMap* map) : InstanceScript(map) { - instance_icecrown_citadel_InstanceMapScript(InstanceMap* map) : InstanceScript(map) - { - // pussywizard: - IsBuffAvailable = true; - WeeklyQuestId10 = 0; - PutricideEnteranceDoorGUID = 0; - GasReleaseValveGUID = 0; - OozeReleaseValveGUID = 0; - PutricideEventProgress = 0; - LichKingHeroicAvailable = true; - LichKingRandomWhisperTimer = 120*IN_MILLISECONDS; - DarkwhisperElevatorTimer = 3000; - memset(&WeeklyQuestNpcGUID, 0, sizeof(WeeklyQuestNpcGUID)); - ScourgeTransporterFirstGUID = 0; + // pussywizard: + IsBuffAvailable = true; + WeeklyQuestId10 = 0; + PutricideEnteranceDoorGUID = 0; + GasReleaseValveGUID = 0; + OozeReleaseValveGUID = 0; + PutricideEventProgress = 0; + LichKingHeroicAvailable = true; + LichKingRandomWhisperTimer = 120 * IN_MILLISECONDS; + DarkwhisperElevatorTimer = 3000; + memset(&WeeklyQuestNpcGUID, 0, sizeof(WeeklyQuestNpcGUID)); + ScourgeTransporterFirstGUID = 0; - SetBossNumber(MAX_ENCOUNTERS); - LoadDoorData(doorData); - TeamIdInInstance = TEAM_NEUTRAL; - HeroicAttempts = MaxHeroicAttempts; - LadyDeathwhisperGUID = 0; - LadyDeathwisperElevatorGUID = 0; - GunshipGUID = 0; - EnemyGunshipGUID = 0; - GunshipArmoryGUID = 0; - DeathbringerSaurfangGUID = 0; - DeathbringerSaurfangDoorGUID = 0; - DeathbringerSaurfangEventGUID = 0; - DeathbringersCacheGUID = 0; - SaurfangTeleportGUID = 0; - PlagueSigilGUID = 0; - BloodwingSigilGUID = 0; - FrostwingSigilGUID = 0; - memset(PutricidePipeGUIDs, 0, 2 * sizeof(uint64)); - memset(PutricideGateGUIDs, 0, 2 * sizeof(uint64)); - PutricideCollisionGUID = 0; - FestergutGUID = 0; - RotfaceGUID = 0; - ProfessorPutricideGUID = 0; - PutricideTableGUID = 0; - memset(BloodCouncilGUIDs, 0, 3 * sizeof(uint64)); - BloodCouncilControllerGUID = 0; - BloodQueenLanaThelGUID = 0; - CrokScourgebaneGUID = 0; - memset(CrokCaptainGUIDs, 0, 4 * sizeof(uint64)); - SisterSvalnaGUID = 0; - ValithriaDreamwalkerGUID = 0; - ValithriaLichKingGUID = 0; - ValithriaTriggerGUID = 0; - PutricadeTrapGUID = 0; - SindragosaGauntletGUID = 0; - SindragosaGUID = 0; - SpinestalkerGUID = 0; - RimefangGUID = 0; - TheLichKingTeleportGUID = 0; - TheLichKingGUID = 0; - HighlordTirionFordringGUID = 0; - TerenasMenethilGUID = 0; - ArthasPlatformGUID = 0; - ArthasPrecipiceGUID = 0; - FrozenThroneEdgeGUID = 0; - FrozenThroneWindGUID = 0; - FrozenThroneWarningGUID = 0; - IsBonedEligible = true; - IsOozeDanceEligible = true; - IsNauseaEligible = true; - IsOrbWhispererEligible = true; - ColdflameJetsState = NOT_STARTED; - BloodQuickeningState = NOT_STARTED; - BloodQuickeningMinutes = 0; - BloodPrinceTrashCount = 0; + SetBossNumber(MAX_ENCOUNTERS); + LoadDoorData(doorData); + TeamIdInInstance = TEAM_NEUTRAL; + HeroicAttempts = MaxHeroicAttempts; + LadyDeathwhisperGUID = 0; + LadyDeathwisperElevatorGUID = 0; + GunshipGUID = 0; + EnemyGunshipGUID = 0; + GunshipArmoryGUID = 0; + DeathbringerSaurfangGUID = 0; + DeathbringerSaurfangDoorGUID = 0; + DeathbringerSaurfangEventGUID = 0; + DeathbringersCacheGUID = 0; + SaurfangTeleportGUID = 0; + PlagueSigilGUID = 0; + BloodwingSigilGUID = 0; + FrostwingSigilGUID = 0; + memset(PutricidePipeGUIDs, 0, 2 * sizeof(uint64)); + memset(PutricideGateGUIDs, 0, 2 * sizeof(uint64)); + PutricideCollisionGUID = 0; + FestergutGUID = 0; + RotfaceGUID = 0; + ProfessorPutricideGUID = 0; + PutricideTableGUID = 0; + memset(BloodCouncilGUIDs, 0, 3 * sizeof(uint64)); + BloodCouncilControllerGUID = 0; + BloodQueenLanaThelGUID = 0; + CrokScourgebaneGUID = 0; + memset(CrokCaptainGUIDs, 0, 4 * sizeof(uint64)); + SisterSvalnaGUID = 0; + ValithriaDreamwalkerGUID = 0; + ValithriaLichKingGUID = 0; + ValithriaTriggerGUID = 0; + PutricadeTrapGUID = 0; + SindragosaGauntletGUID = 0; + SindragosaGUID = 0; + SpinestalkerGUID = 0; + RimefangGUID = 0; + TheLichKingTeleportGUID = 0; + TheLichKingGUID = 0; + HighlordTirionFordringGUID = 0; + TerenasMenethilGUID = 0; + ArthasPlatformGUID = 0; + ArthasPrecipiceGUID = 0; + FrozenThroneEdgeGUID = 0; + FrozenThroneWindGUID = 0; + FrozenThroneWarningGUID = 0; + IsBonedEligible = true; + IsOozeDanceEligible = true; + IsNauseaEligible = true; + IsOrbWhispererEligible = true; + ColdflameJetsState = NOT_STARTED; + BloodQuickeningState = NOT_STARTED; + BloodQuickeningMinutes = 0; + BloodPrinceTrashCount = 0; + } + + void FillInitialWorldStates(WorldPacket& data) + { + if (instance->IsHeroic()) + { + data << uint32(WORLDSTATE_SHOW_TIMER) << uint32(BloodQuickeningState == IN_PROGRESS); + data << uint32(WORLDSTATE_EXECUTION_TIME) << uint32(BloodQuickeningMinutes); + data << uint32(WORLDSTATE_SHOW_ATTEMPTS) << uint32(1); + data << uint32(WORLDSTATE_ATTEMPTS_REMAINING) << uint32(HeroicAttempts); + data << uint32(WORLDSTATE_ATTEMPTS_MAX) << uint32(MaxHeroicAttempts); } + } - void FillInitialWorldStates(WorldPacket& data) - { - if (instance->IsHeroic()) - { - data << uint32(WORLDSTATE_SHOW_TIMER) << uint32(BloodQuickeningState == IN_PROGRESS); - data << uint32(WORLDSTATE_EXECUTION_TIME) << uint32(BloodQuickeningMinutes); - data << uint32(WORLDSTATE_SHOW_ATTEMPTS) << uint32(1); - data << uint32(WORLDSTATE_ATTEMPTS_REMAINING) << uint32(HeroicAttempts); - data << uint32(WORLDSTATE_ATTEMPTS_MAX) << uint32(MaxHeroicAttempts); - } - } - - void OnPlayerAreaUpdate(Player* player, uint32 /*oldArea*/, uint32 newArea) - { - if (newArea == 4890 /*Putricide's Laboratory of Alchemical Horrors and Fun*/ || + void OnPlayerAreaUpdate(Player* player, uint32 /*oldArea*/, uint32 newArea) + { + if (newArea == 4890 /*Putricide's Laboratory of Alchemical Horrors and Fun*/ || newArea == 4891 /*The Sanctum of Blood*/ || newArea == 4889 /*The Frost Queen's Lair*/ || newArea == 4859 /*The Frozen Throne*/ || newArea == 4910 /*Frostmourne*/) - { - player->SendInitWorldStates(player->GetZoneId(), player->GetAreaId()); - } - else - { - player->SendUpdateWorldState(WORLDSTATE_SHOW_ATTEMPTS, 0); - } + { + player->SendInitWorldStates(player->GetZoneId(), player->GetAreaId()); + } + else + { + player->SendUpdateWorldState(WORLDSTATE_SHOW_ATTEMPTS, 0); + } + } + + void OnPlayerEnter(Player* player) + { + if (TeamIdInInstance == TEAM_NEUTRAL) + TeamIdInInstance = player->GetTeamId(); + + // for professor putricide hc + DoRemoveAurasDueToSpellOnPlayers(SPELL_GAS_VARIABLE); + DoRemoveAurasDueToSpellOnPlayers(SPELL_OOZE_VARIABLE); + + if (GetBossState(DATA_LADY_DEATHWHISPER) == DONE && GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != DONE) + SpawnGunship(); + } + + void OnCreatureCreate(Creature* creature) + { + if (TeamIdInInstance == TEAM_NEUTRAL) + { + Map::PlayerList const& players = instance->GetPlayers(); + if (!players.isEmpty()) + if (Player* player = players.begin()->GetSource()) + TeamIdInInstance = player->GetTeamId(); } - void OnPlayerEnter(Player* player) + // apply ICC buff to pets/summons + if (GetData(DATA_BUFF_AVAILABLE) && IS_PLAYER_GUID(creature->GetOwnerGUID()) && creature->HasUnitTypeMask(UNIT_MASK_MINION | UNIT_MASK_GUARDIAN | UNIT_MASK_CONTROLABLE_GUARDIAN) && creature->CanHaveThreatList()) + if (Unit* owner = creature->GetOwner()) + if (Player* plr = owner->ToPlayer()) + { + SpellAreaForAreaMapBounds saBounds = sSpellMgr->GetSpellAreaForAreaMapBounds(4812); + for (SpellAreaForAreaMap::const_iterator itr = saBounds.first; itr != saBounds.second; ++itr) + if ((itr->second->raceMask & plr->getRaceMask()) && !creature->HasAura(itr->second->spellId)) + if (const SpellInfo* si = sSpellMgr->GetSpellInfo(itr->second->spellId)) + if (si->HasAura(SPELL_AURA_MOD_INCREASE_HEALTH_PERCENT)) + creature->AddAura(itr->second->spellId, creature); + } + + // fighting npcs in Rampart of Skulls + std::string name1("Skybreaker "); + std::string name2("Kor'kron "); + if (!creature->GetTransport() && creature->GetPositionZ() <= 205.0f && creature->GetExactDist2d(-439.0f, 2210.0f) <= 150.0f && (creature->GetEntry() == 37544 || creature->GetEntry() == 37545 || creature->GetName().compare(0, name1.length(), name1) == 0 || creature->GetName().compare(0, name2.length(), name2) == 0)) + creature->AddToNotify(NOTIFY_AI_RELOCATION); + + // pussywizard: check weekly here, before possible UpdateEntry + // allow creating all of them, because after killing Marrowgar some have to appear, so just hide them + switch (creature->GetEntry()) { - if (TeamIdInInstance == TEAM_NEUTRAL) - TeamIdInInstance = player->GetTeamId(); - - // for professor putricide hc - DoRemoveAurasDueToSpellOnPlayers(SPELL_GAS_VARIABLE); - DoRemoveAurasDueToSpellOnPlayers(SPELL_OOZE_VARIABLE); - - if (GetBossState(DATA_LADY_DEATHWHISPER) == DONE && GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != DONE) - SpawnGunship(); + case NPC_INFILTRATOR_MINCHAR: + case NPC_KOR_KRON_LIEUTENANT: + case NPC_ALCHEMIST_ADRIANNA: + case NPC_ALRIN_THE_AGILE: + case NPC_INFILTRATOR_MINCHAR_BQ: + case NPC_MINCHAR_BEAM_STALKER: + case NPC_VALITHRIA_DREAMWALKER_QUEST: + for (uint8 i = 0; i < WeeklyNPCs; ++i) + if (WeeklyQuestData[i].creatureEntry == creature->GetEntry()) + { + WeeklyQuestNpcGUID[i] = creature->GetGUID(); + if (WeeklyQuestId10 != WeeklyQuestData[i].questId[0]) + creature->SetVisible(false); + else if (WeeklyQuestData[i].creatureEntry == NPC_VALITHRIA_DREAMWALKER_QUEST && GetBossState(DATA_VALITHRIA_DREAMWALKER) != DONE) + creature->SetVisible(false); + } + break; } - void OnCreatureCreate(Creature* creature) + switch (creature->GetEntry()) { - if (TeamIdInInstance == TEAM_NEUTRAL) - { - Map::PlayerList const &players = instance->GetPlayers(); - if (!players.isEmpty()) - if (Player* player = players.begin()->GetSource()) - TeamIdInInstance = player->GetTeamId(); - } + case NPC_KOR_KRON_GENERAL: + if (TeamIdInInstance == TEAM_ALLIANCE) + creature->UpdateEntry(NPC_ALLIANCE_COMMANDER); + break; + case NPC_KOR_KRON_LIEUTENANT: + if (TeamIdInInstance == TEAM_ALLIANCE) + creature->UpdateEntry(NPC_SKYBREAKER_LIEUTENANT); + break; + case NPC_TORTUNOK: + if (TeamIdInInstance == TEAM_ALLIANCE) + creature->UpdateEntry(NPC_ALANA_MOONSTRIKE); + break; + case NPC_GERARDO_THE_SUAVE: + if (TeamIdInInstance == TEAM_ALLIANCE) + creature->UpdateEntry(NPC_TALAN_MOONSTRIKE); + break; + case NPC_UVLUS_BANEFIRE: + if (TeamIdInInstance == TEAM_ALLIANCE) + creature->UpdateEntry(NPC_MALFUS_GRIMFROST); + break; + case NPC_IKFIRUS_THE_VILE: + if (TeamIdInInstance == TEAM_ALLIANCE) + creature->UpdateEntry(NPC_YILI); + break; + case NPC_VOL_GUK: + if (TeamIdInInstance == TEAM_ALLIANCE) + creature->UpdateEntry(NPC_JEDEBIA); + break; + case NPC_HARAGG_THE_UNSEEN: + if (TeamIdInInstance == TEAM_ALLIANCE) + creature->UpdateEntry(NPC_NIBY_THE_ALMIGHTY); + break; + case NPC_GARROSH_HELLSCREAM: + if (TeamIdInInstance == TEAM_ALLIANCE) + creature->UpdateEntry(NPC_KING_VARIAN_WRYNN); - // apply ICC buff to pets/summons - if (GetData(DATA_BUFF_AVAILABLE) && IS_PLAYER_GUID(creature->GetOwnerGUID()) && creature->HasUnitTypeMask(UNIT_MASK_MINION | UNIT_MASK_GUARDIAN | UNIT_MASK_CONTROLABLE_GUARDIAN) && creature->CanHaveThreatList()) - if (Unit* owner = creature->GetOwner()) - if (Player* plr = owner->ToPlayer()) - { - SpellAreaForAreaMapBounds saBounds = sSpellMgr->GetSpellAreaForAreaMapBounds(4812); - for (SpellAreaForAreaMap::const_iterator itr = saBounds.first; itr != saBounds.second; ++itr) - if ((itr->second->raceMask & plr->getRaceMask()) && !creature->HasAura(itr->second->spellId)) - if (const SpellInfo* si = sSpellMgr->GetSpellInfo(itr->second->spellId)) - if (si->HasAura(SPELL_AURA_MOD_INCREASE_HEALTH_PERCENT)) - creature->AddAura(itr->second->spellId, creature); - } - - // fighting npcs in Rampart of Skulls - std::string name1("Skybreaker "); - std::string name2("Kor'kron "); - if (!creature->GetTransport() && creature->GetPositionZ() <= 205.0f && creature->GetExactDist2d(-439.0f, 2210.0f) <= 150.0f && (creature->GetEntry() == 37544 || creature->GetEntry() == 37545 || creature->GetName().compare(0, name1.length(), name1) == 0 || creature->GetName().compare(0, name2.length(), name2) == 0)) - creature->AddToNotify(NOTIFY_AI_RELOCATION); - - // pussywizard: check weekly here, before possible UpdateEntry - // allow creating all of them, because after killing Marrowgar some have to appear, so just hide them - switch (creature->GetEntry()) - { - case NPC_INFILTRATOR_MINCHAR: - case NPC_KOR_KRON_LIEUTENANT: - case NPC_ALCHEMIST_ADRIANNA: - case NPC_ALRIN_THE_AGILE: - case NPC_INFILTRATOR_MINCHAR_BQ: - case NPC_MINCHAR_BEAM_STALKER: - case NPC_VALITHRIA_DREAMWALKER_QUEST: - for (uint8 i = 0; i < WeeklyNPCs; ++i) - if (WeeklyQuestData[i].creatureEntry == creature->GetEntry()) - { - WeeklyQuestNpcGUID[i] = creature->GetGUID(); - if (WeeklyQuestId10 != WeeklyQuestData[i].questId[0]) - creature->SetVisible(false); - else if (WeeklyQuestData[i].creatureEntry == NPC_VALITHRIA_DREAMWALKER_QUEST && GetBossState(DATA_VALITHRIA_DREAMWALKER) != DONE) - creature->SetVisible(false); - } - break; - } - - switch (creature->GetEntry()) - { - case NPC_KOR_KRON_GENERAL: - if (TeamIdInInstance == TEAM_ALLIANCE) - creature->UpdateEntry(NPC_ALLIANCE_COMMANDER); - break; - case NPC_KOR_KRON_LIEUTENANT: - if (TeamIdInInstance == TEAM_ALLIANCE) - creature->UpdateEntry(NPC_SKYBREAKER_LIEUTENANT); - break; - case NPC_TORTUNOK: - if (TeamIdInInstance == TEAM_ALLIANCE) - creature->UpdateEntry(NPC_ALANA_MOONSTRIKE); - break; - case NPC_GERARDO_THE_SUAVE: - if (TeamIdInInstance == TEAM_ALLIANCE) - creature->UpdateEntry(NPC_TALAN_MOONSTRIKE); - break; - case NPC_UVLUS_BANEFIRE: - if (TeamIdInInstance == TEAM_ALLIANCE) - creature->UpdateEntry(NPC_MALFUS_GRIMFROST); - break; - case NPC_IKFIRUS_THE_VILE: - if (TeamIdInInstance == TEAM_ALLIANCE) - creature->UpdateEntry(NPC_YILI); - break; - case NPC_VOL_GUK: - if (TeamIdInInstance == TEAM_ALLIANCE) - creature->UpdateEntry(NPC_JEDEBIA); - break; - case NPC_HARAGG_THE_UNSEEN: - if (TeamIdInInstance == TEAM_ALLIANCE) - creature->UpdateEntry(NPC_NIBY_THE_ALMIGHTY); - break; - case NPC_GARROSH_HELLSCREAM: - if (TeamIdInInstance == TEAM_ALLIANCE) - creature->UpdateEntry(NPC_KING_VARIAN_WRYNN); - - // Xinef: summon in case of instance unload - if (GetBossState(DATA_THE_LICH_KING) == DONE) - { - instance->SummonCreature(NPC_LADY_JAINA_PROUDMOORE_QUEST, JainaSpawnPos); - instance->SummonCreature(NPC_MURADIN_BRONZEBEARD_QUEST, MuradinSpawnPos); - instance->SummonCreature(NPC_UTHER_THE_LIGHTBRINGER_QUEST, UtherSpawnPos); - instance->SummonCreature(NPC_LADY_SYLVANAS_WINDRUNNER_QUEST, SylvanasSpawnPos); - } - break; - case NPC_LADY_DEATHWHISPER: - LadyDeathwhisperGUID = creature->GetGUID(); - break; - case NPC_DEATHBRINGER_SAURFANG: - DeathbringerSaurfangGUID = creature->GetGUID(); - break; - case NPC_SE_HIGH_OVERLORD_SAURFANG: - if (TeamIdInInstance == TEAM_ALLIANCE) - { - creature->UpdateEntry(NPC_SE_MURADIN_BRONZEBEARD, creature->GetCreatureData()); - creature->LoadEquipment(); - } - DeathbringerSaurfangEventGUID = creature->GetGUID(); - creature->LastUsedScriptID = creature->GetScriptId(); - break; - case NPC_SE_MURADIN_BRONZEBEARD: - DeathbringerSaurfangEventGUID = creature->GetGUID(); - break; - case NPC_HIGH_OVERLORD_SAURFANG_DUMMY: - if (TeamIdInInstance == TEAM_ALLIANCE) - { - creature->UpdateEntry(NPC_MURADIN_BRONZEBEARD_DUMMY, creature->GetCreatureData()); - creature->LoadEquipment(); - } - break; - case NPC_SE_KOR_KRON_REAVER: - if (TeamIdInInstance == TEAM_ALLIANCE) - creature->UpdateEntry(NPC_SE_SKYBREAKER_MARINE); - break; - case NPC_FESTERGUT: - FestergutGUID = creature->GetGUID(); - break; - case NPC_ROTFACE: - RotfaceGUID = creature->GetGUID(); - break; - case NPC_PROFESSOR_PUTRICIDE: - ProfessorPutricideGUID = creature->GetGUID(); - if (GetBossState(DATA_ROTFACE) == DONE && GetBossState(DATA_FESTERGUT) == DONE && !HeroicAttempts && GetData(DATA_HAS_LIMITED_ATTEMPTS) && creature->IsAlive()) - creature->SetVisible(false); - break; - case NPC_PRINCE_KELESETH: - BloodCouncilGUIDs[0] = creature->GetGUID(); - break; - case NPC_PRINCE_TALDARAM: - BloodCouncilGUIDs[1] = creature->GetGUID(); - break; - case NPC_PRINCE_VALANAR: - BloodCouncilGUIDs[2] = creature->GetGUID(); - break; - case NPC_BLOOD_ORB_CONTROLLER: - BloodCouncilControllerGUID = creature->GetGUID(); - break; - case NPC_BLOOD_QUEEN_LANA_THEL: - BloodQueenLanaThelGUID = creature->GetGUID(); - if (!HeroicAttempts && GetData(DATA_HAS_LIMITED_ATTEMPTS) && creature->IsAlive()) - creature->SetVisible(false); - break; - case NPC_CROK_SCOURGEBANE: - CrokScourgebaneGUID = creature->GetGUID(); - break; - // we can only do this because there are no gaps in their entries - case NPC_CAPTAIN_ARNATH: - case NPC_CAPTAIN_BRANDON: - case NPC_CAPTAIN_GRONDEL: - case NPC_CAPTAIN_RUPERT: - CrokCaptainGUIDs[creature->GetEntry()-NPC_CAPTAIN_ARNATH] = creature->GetGUID(); - break; - case NPC_SISTER_SVALNA: - SisterSvalnaGUID = creature->GetGUID(); - break; - case NPC_VALITHRIA_DREAMWALKER: - ValithriaDreamwalkerGUID = creature->GetGUID(); - break; - case NPC_THE_LICH_KING_VALITHRIA: - ValithriaLichKingGUID = creature->GetGUID(); - break; - case NPC_GREEN_DRAGON_COMBAT_TRIGGER: - ValithriaTriggerGUID = creature->GetGUID(); - break; - case NPC_PUTRICADES_TRAP: - PutricadeTrapGUID = creature->GetGUID(); - break; - case NPC_SINDRAGOSA_GAUNTLET: - SindragosaGauntletGUID = creature->GetGUID(); - break; - case NPC_SINDRAGOSA: - SindragosaGUID = creature->GetGUID(); - if (!HeroicAttempts && GetData(DATA_HAS_LIMITED_ATTEMPTS) && creature->IsAlive()) - creature->SetVisible(false); - break; - case NPC_SPINESTALKER: - SpinestalkerGUID = creature->GetGUID(); - break; - case NPC_RIMEFANG: - RimefangGUID = creature->GetGUID(); - break; - case NPC_INVISIBLE_STALKER: - // Teleporter visual at center - if (creature->GetExactDist2d(4357.052f, 2769.421f) < 10.0f && GetBossState(DATA_PROFESSOR_PUTRICIDE) == DONE && GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) == DONE && GetBossState(DATA_SINDRAGOSA) == DONE) - creature->CastSpell(creature, SPELL_ARTHAS_TELEPORTER_CEREMONY, false); - break; - case NPC_THE_LICH_KING: - TheLichKingGUID = creature->GetGUID(); - if (!HeroicAttempts && GetData(DATA_HAS_LIMITED_ATTEMPTS) && creature->IsAlive()) - creature->SetVisible(false); - break; - case NPC_HIGHLORD_TIRION_FORDRING_LK: - HighlordTirionFordringGUID = creature->GetGUID(); - break; - case NPC_TERENAS_MENETHIL_FROSTMOURNE: - case NPC_TERENAS_MENETHIL_FROSTMOURNE_H: - TerenasMenethilGUID = creature->GetGUID(); - break; - case NPC_INFILTRATOR_MINCHAR_BQ: - if (BloodQuickeningState == DONE) - creature->DespawnOrUnsummon(1); - break; - case NPC_MINCHAR_BEAM_STALKER: - if (BloodQuickeningState != DONE) - { - uint32 spellId = 0; - if (creature->GetPositionY() > 2790.0f && creature->GetPositionZ() > 420.0f) - spellId = BLOOD_BEAM_VISUAL_RHAND; - else if (creature->GetPositionY() < 2790.0f && creature->GetPositionZ() > 420.0f) - spellId = BLOOD_BEAM_VISUAL_LHAND; - else if (creature->GetPositionY() < 2790.0f && creature->GetPositionZ() < 420.0f) - spellId = BLOOD_BEAM_VISUAL_LLEG; - else - spellId = BLOOD_BEAM_VISUAL_RLEG; - creature->m_Events.AddEvent(new DelayedCastMincharEvent(creature, spellId), creature->m_Events.CalculateTime(1000)); - } - break; - case NPC_SKYBREAKER_DECKHAND: - case NPC_ORGRIMS_HAMMER_CREW: - if (!creature->IsAlive()) - creature->Respawn(); - break; - default: - break; - } - } - - void OnCreatureRemove(Creature* creature) - { - if (creature->GetEntry() == NPC_SINDRAGOSA) - SindragosaGUID = 0; - } - - uint32 GetCreatureEntry(uint32 /*guidLow*/, CreatureData const* data) - { - if (TeamIdInInstance == TEAM_NEUTRAL) - { - Map::PlayerList const &players = instance->GetPlayers(); - if (!players.isEmpty()) - if (Player* player = players.begin()->GetSource()) - TeamIdInInstance = player->GetTeamId(); - } - - uint32 entry = data->id; - switch (entry) - { - case NPC_HORDE_GUNSHIP_CANNON: - case NPC_ORGRIMS_HAMMER_CREW: - case NPC_SKY_REAVER_KORM_BLACKSCAR: - if (TeamIdInInstance == TEAM_ALLIANCE) - return 0; - break; - case NPC_ALLIANCE_GUNSHIP_CANNON: - case NPC_SKYBREAKER_DECKHAND: - case NPC_HIGH_CAPTAIN_JUSTIN_BARTLETT: - if (TeamIdInInstance == TEAM_HORDE) - return 0; - break; - case NPC_ZAFOD_BOOMBOX: - if (GameObjectTemplate const* go = sObjectMgr->GetGameObjectTemplate(GO_THE_SKYBREAKER_A)) - if ((TeamIdInInstance == TEAM_ALLIANCE && data->mapid == go->moTransport.mapID) || - (TeamIdInInstance == TEAM_HORDE && data->mapid != go->moTransport.mapID)) - return entry; - return 0; - case NPC_IGB_MURADIN_BRONZEBEARD: - if ((TeamIdInInstance == TEAM_ALLIANCE && data->posX > 10.0f) || - (TeamIdInInstance == TEAM_HORDE && data->posX < 10.0f)) - return entry; - return 0; - case NPC_SPIRE_FROSTWYRM: - if ((TeamIdInInstance == TEAM_ALLIANCE && data->posY < 2200.0f) || (TeamIdInInstance == TEAM_HORDE && data->posY > 2200.0f)) - return 0; - break; - } - - return entry; - } - - uint32 GetGameObjectEntry(uint32 /*guidLow*/, uint32 entry) - { - if (TeamIdInInstance == TEAM_NEUTRAL) - { - Map::PlayerList const &players = instance->GetPlayers(); - if (!players.isEmpty()) - if (Player* player = players.begin()->GetSource()) - TeamIdInInstance = player->GetTeamId(); - } - - switch (entry) - { - case GO_GUNSHIP_ARMORY_H_10N: - case GO_GUNSHIP_ARMORY_H_25N: - case GO_GUNSHIP_ARMORY_H_10H: - case GO_GUNSHIP_ARMORY_H_25H: - if (TeamIdInInstance == TEAM_ALLIANCE) - return 0; - break; - case GO_GUNSHIP_ARMORY_A_10N: - case GO_GUNSHIP_ARMORY_A_25N: - case GO_GUNSHIP_ARMORY_A_10H: - case GO_GUNSHIP_ARMORY_A_25H: - if (TeamIdInInstance == TEAM_HORDE) - return 0; - break; - } - - return entry; - } - - void OnUnitDeath(Unit* unit) - { - Creature* creature = unit->ToCreature(); - if (!creature) - return; - - // fighting npcs in Rampart of Skulls - std::string name1("Skybreaker "); - std::string name2("Kor'kron "); - if (!creature->GetTransport() && creature->GetPositionZ() <= 205.0f && creature->GetExactDist2d(-439.0f, 2210.0f) <= 150.0f && (creature->GetEntry() == 37544 || creature->GetEntry() == 37545 || creature->GetName().compare(0, name1.length(), name1) == 0 || creature->GetName().compare(0, name2.length(), name2) == 0)) - if (!creature->GetLootRecipient()) - creature->m_Events.AddEvent(new RespawnEvent(*creature), creature->m_Events.CalculateTime(3000)); - - switch (creature->GetEntry()) - { - case NPC_YMIRJAR_BATTLE_MAIDEN: - case NPC_YMIRJAR_DEATHBRINGER: - case NPC_YMIRJAR_FROSTBINDER: - case NPC_YMIRJAR_HUNTRESS: - case NPC_YMIRJAR_WARLORD: - if (Creature* crok = instance->GetCreature(CrokScourgebaneGUID)) - crok->AI()->SetGUID(creature->GetGUID(), ACTION_VRYKUL_DEATH); - break; - case NPC_FROSTWING_WHELP: - if (FrostwyrmGUIDs.empty()) - return; - - if (creature->AI()->GetData(1/*DATA_FROSTWYRM_OWNER*/) == DATA_SPINESTALKER) - { - SpinestalkerTrash.erase(creature->GetDBTableGUIDLow()); - if (SpinestalkerTrash.empty()) - if (Creature* spinestalk = instance->GetCreature(SpinestalkerGUID)) - spinestalk->AI()->DoAction(ACTION_START_FROSTWYRM); - } + // Xinef: summon in case of instance unload + if (GetBossState(DATA_THE_LICH_KING) == DONE) + { + instance->SummonCreature(NPC_LADY_JAINA_PROUDMOORE_QUEST, JainaSpawnPos); + instance->SummonCreature(NPC_MURADIN_BRONZEBEARD_QUEST, MuradinSpawnPos); + instance->SummonCreature(NPC_UTHER_THE_LIGHTBRINGER_QUEST, UtherSpawnPos); + instance->SummonCreature(NPC_LADY_SYLVANAS_WINDRUNNER_QUEST, SylvanasSpawnPos); + } + break; + case NPC_LADY_DEATHWHISPER: + LadyDeathwhisperGUID = creature->GetGUID(); + break; + case NPC_DEATHBRINGER_SAURFANG: + DeathbringerSaurfangGUID = creature->GetGUID(); + break; + case NPC_SE_HIGH_OVERLORD_SAURFANG: + if (TeamIdInInstance == TEAM_ALLIANCE) + { + creature->UpdateEntry(NPC_SE_MURADIN_BRONZEBEARD, creature->GetCreatureData()); + creature->LoadEquipment(); + } + DeathbringerSaurfangEventGUID = creature->GetGUID(); + creature->LastUsedScriptID = creature->GetScriptId(); + break; + case NPC_SE_MURADIN_BRONZEBEARD: + DeathbringerSaurfangEventGUID = creature->GetGUID(); + break; + case NPC_HIGH_OVERLORD_SAURFANG_DUMMY: + if (TeamIdInInstance == TEAM_ALLIANCE) + { + creature->UpdateEntry(NPC_MURADIN_BRONZEBEARD_DUMMY, creature->GetCreatureData()); + creature->LoadEquipment(); + } + break; + case NPC_SE_KOR_KRON_REAVER: + if (TeamIdInInstance == TEAM_ALLIANCE) + creature->UpdateEntry(NPC_SE_SKYBREAKER_MARINE); + break; + case NPC_FESTERGUT: + FestergutGUID = creature->GetGUID(); + break; + case NPC_ROTFACE: + RotfaceGUID = creature->GetGUID(); + break; + case NPC_PROFESSOR_PUTRICIDE: + ProfessorPutricideGUID = creature->GetGUID(); + if (GetBossState(DATA_ROTFACE) == DONE && GetBossState(DATA_FESTERGUT) == DONE && !HeroicAttempts && GetData(DATA_HAS_LIMITED_ATTEMPTS) && creature->IsAlive()) + creature->SetVisible(false); + break; + case NPC_PRINCE_KELESETH: + BloodCouncilGUIDs[0] = creature->GetGUID(); + break; + case NPC_PRINCE_TALDARAM: + BloodCouncilGUIDs[1] = creature->GetGUID(); + break; + case NPC_PRINCE_VALANAR: + BloodCouncilGUIDs[2] = creature->GetGUID(); + break; + case NPC_BLOOD_ORB_CONTROLLER: + BloodCouncilControllerGUID = creature->GetGUID(); + break; + case NPC_BLOOD_QUEEN_LANA_THEL: + BloodQueenLanaThelGUID = creature->GetGUID(); + if (!HeroicAttempts && GetData(DATA_HAS_LIMITED_ATTEMPTS) && creature->IsAlive()) + creature->SetVisible(false); + break; + case NPC_CROK_SCOURGEBANE: + CrokScourgebaneGUID = creature->GetGUID(); + break; + // we can only do this because there are no gaps in their entries + case NPC_CAPTAIN_ARNATH: + case NPC_CAPTAIN_BRANDON: + case NPC_CAPTAIN_GRONDEL: + case NPC_CAPTAIN_RUPERT: + CrokCaptainGUIDs[creature->GetEntry() - NPC_CAPTAIN_ARNATH] = creature->GetGUID(); + break; + case NPC_SISTER_SVALNA: + SisterSvalnaGUID = creature->GetGUID(); + break; + case NPC_VALITHRIA_DREAMWALKER: + ValithriaDreamwalkerGUID = creature->GetGUID(); + break; + case NPC_THE_LICH_KING_VALITHRIA: + ValithriaLichKingGUID = creature->GetGUID(); + break; + case NPC_GREEN_DRAGON_COMBAT_TRIGGER: + ValithriaTriggerGUID = creature->GetGUID(); + break; + case NPC_PUTRICADES_TRAP: + PutricadeTrapGUID = creature->GetGUID(); + break; + case NPC_SINDRAGOSA_GAUNTLET: + SindragosaGauntletGUID = creature->GetGUID(); + break; + case NPC_SINDRAGOSA: + SindragosaGUID = creature->GetGUID(); + if (!HeroicAttempts && GetData(DATA_HAS_LIMITED_ATTEMPTS) && creature->IsAlive()) + creature->SetVisible(false); + break; + case NPC_SPINESTALKER: + SpinestalkerGUID = creature->GetGUID(); + break; + case NPC_RIMEFANG: + RimefangGUID = creature->GetGUID(); + break; + case NPC_INVISIBLE_STALKER: + // Teleporter visual at center + if (creature->GetExactDist2d(4357.052f, 2769.421f) < 10.0f && GetBossState(DATA_PROFESSOR_PUTRICIDE) == DONE && GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) == DONE && GetBossState(DATA_SINDRAGOSA) == DONE) + creature->CastSpell(creature, SPELL_ARTHAS_TELEPORTER_CEREMONY, false); + break; + case NPC_THE_LICH_KING: + TheLichKingGUID = creature->GetGUID(); + if (!HeroicAttempts && GetData(DATA_HAS_LIMITED_ATTEMPTS) && creature->IsAlive()) + creature->SetVisible(false); + break; + case NPC_HIGHLORD_TIRION_FORDRING_LK: + HighlordTirionFordringGUID = creature->GetGUID(); + break; + case NPC_TERENAS_MENETHIL_FROSTMOURNE: + case NPC_TERENAS_MENETHIL_FROSTMOURNE_H: + TerenasMenethilGUID = creature->GetGUID(); + break; + case NPC_INFILTRATOR_MINCHAR_BQ: + if (BloodQuickeningState == DONE) + creature->DespawnOrUnsummon(1); + break; + case NPC_MINCHAR_BEAM_STALKER: + if (BloodQuickeningState != DONE) + { + uint32 spellId = 0; + if (creature->GetPositionY() > 2790.0f && creature->GetPositionZ() > 420.0f) + spellId = BLOOD_BEAM_VISUAL_RHAND; + else if (creature->GetPositionY() < 2790.0f && creature->GetPositionZ() > 420.0f) + spellId = BLOOD_BEAM_VISUAL_LHAND; + else if (creature->GetPositionY() < 2790.0f && creature->GetPositionZ() < 420.0f) + spellId = BLOOD_BEAM_VISUAL_LLEG; else - { - RimefangTrash.erase(creature->GetDBTableGUIDLow()); - if (RimefangTrash.empty()) - if (Creature* spinestalk = instance->GetCreature(RimefangGUID)) - spinestalk->AI()->DoAction(ACTION_START_FROSTWYRM); - } - break; - case NPC_RIMEFANG: - case NPC_SPINESTALKER: + spellId = BLOOD_BEAM_VISUAL_RLEG; + creature->m_Events.AddEvent(new DelayedCastMincharEvent(creature, spellId), creature->m_Events.CalculateTime(1000)); + } + break; + case NPC_SKYBREAKER_DECKHAND: + case NPC_ORGRIMS_HAMMER_CREW: + if (!creature->IsAlive()) + creature->Respawn(); + break; + default: + break; + } + } + + void OnCreatureRemove(Creature* creature) + { + if (creature->GetEntry() == NPC_SINDRAGOSA) + SindragosaGUID = 0; + } + + uint32 GetCreatureEntry(uint32 /*guidLow*/, CreatureData const* data) + { + if (TeamIdInInstance == TEAM_NEUTRAL) + { + Map::PlayerList const& players = instance->GetPlayers(); + if (!players.isEmpty()) + if (Player* player = players.begin()->GetSource()) + TeamIdInInstance = player->GetTeamId(); + } + + uint32 entry = data->id; + switch (entry) + { + case NPC_HORDE_GUNSHIP_CANNON: + case NPC_ORGRIMS_HAMMER_CREW: + case NPC_SKY_REAVER_KORM_BLACKSCAR: + if (TeamIdInInstance == TEAM_ALLIANCE) + return 0; + break; + case NPC_ALLIANCE_GUNSHIP_CANNON: + case NPC_SKYBREAKER_DECKHAND: + case NPC_HIGH_CAPTAIN_JUSTIN_BARTLETT: + if (TeamIdInInstance == TEAM_HORDE) + return 0; + break; + case NPC_ZAFOD_BOOMBOX: + if (GameObjectTemplate const* go = sObjectMgr->GetGameObjectTemplate(GO_THE_SKYBREAKER_A)) + if ((TeamIdInInstance == TEAM_ALLIANCE && data->mapid == go->moTransport.mapID) || + (TeamIdInInstance == TEAM_HORDE && data->mapid != go->moTransport.mapID)) + return entry; + return 0; + case NPC_IGB_MURADIN_BRONZEBEARD: + if ((TeamIdInInstance == TEAM_ALLIANCE && data->posX > 10.0f) || + (TeamIdInInstance == TEAM_HORDE && data->posX < 10.0f)) + return entry; + return 0; + case NPC_SPIRE_FROSTWYRM: + if ((TeamIdInInstance == TEAM_ALLIANCE && data->posY < 2200.0f) || (TeamIdInInstance == TEAM_HORDE && data->posY > 2200.0f)) + return 0; + break; + } + + return entry; + } + + uint32 GetGameObjectEntry(uint32 /*guidLow*/, uint32 entry) + { + if (TeamIdInInstance == TEAM_NEUTRAL) + { + Map::PlayerList const& players = instance->GetPlayers(); + if (!players.isEmpty()) + if (Player* player = players.begin()->GetSource()) + TeamIdInInstance = player->GetTeamId(); + } + + switch (entry) + { + case GO_GUNSHIP_ARMORY_H_10N: + case GO_GUNSHIP_ARMORY_H_25N: + case GO_GUNSHIP_ARMORY_H_10H: + case GO_GUNSHIP_ARMORY_H_25H: + if (TeamIdInInstance == TEAM_ALLIANCE) + return 0; + break; + case GO_GUNSHIP_ARMORY_A_10N: + case GO_GUNSHIP_ARMORY_A_25N: + case GO_GUNSHIP_ARMORY_A_10H: + case GO_GUNSHIP_ARMORY_A_25H: + if (TeamIdInInstance == TEAM_HORDE) + return 0; + break; + } + + return entry; + } + + void OnUnitDeath(Unit* unit) + { + Creature* creature = unit->ToCreature(); + if (!creature) + return; + + // fighting npcs in Rampart of Skulls + std::string name1("Skybreaker "); + std::string name2("Kor'kron "); + if (!creature->GetTransport() && creature->GetPositionZ() <= 205.0f && creature->GetExactDist2d(-439.0f, 2210.0f) <= 150.0f && (creature->GetEntry() == 37544 || creature->GetEntry() == 37545 || creature->GetName().compare(0, name1.length(), name1) == 0 || creature->GetName().compare(0, name2.length(), name2) == 0)) + if (!creature->GetLootRecipient()) + creature->m_Events.AddEvent(new RespawnEvent(*creature), creature->m_Events.CalculateTime(3000)); + + switch (creature->GetEntry()) + { + case NPC_YMIRJAR_BATTLE_MAIDEN: + case NPC_YMIRJAR_DEATHBRINGER: + case NPC_YMIRJAR_FROSTBINDER: + case NPC_YMIRJAR_HUNTRESS: + case NPC_YMIRJAR_WARLORD: + if (Creature* crok = instance->GetCreature(CrokScourgebaneGUID)) + crok->AI()->SetGUID(creature->GetGUID(), ACTION_VRYKUL_DEATH); + break; + case NPC_FROSTWING_WHELP: + if (FrostwyrmGUIDs.empty()) + return; + + if (creature->AI()->GetData(1/*DATA_FROSTWYRM_OWNER*/) == DATA_SPINESTALKER) + { + SpinestalkerTrash.erase(creature->GetDBTableGUIDLow()); + if (SpinestalkerTrash.empty()) + if (Creature* spinestalk = instance->GetCreature(SpinestalkerGUID)) + spinestalk->AI()->DoAction(ACTION_START_FROSTWYRM); + } + else + { + RimefangTrash.erase(creature->GetDBTableGUIDLow()); + if (RimefangTrash.empty()) + if (Creature* spinestalk = instance->GetCreature(RimefangGUID)) + spinestalk->AI()->DoAction(ACTION_START_FROSTWYRM); + } + break; + case NPC_RIMEFANG: + case NPC_SPINESTALKER: { if (GetData(DATA_HAS_LIMITED_ATTEMPTS) && !HeroicAttempts) return; @@ -645,534 +645,535 @@ class instance_icecrown_citadel : public InstanceMapScript } break; } - case NPC_DEATHSPEAKER_SERVANT: - if (Creature* c = unit->SummonCreature(WORLD_TRIGGER, *unit, TEMPSUMMON_TIMED_DESPAWN, 10000)) - { - c->CastSpell(c, VOID_ZONE_VISUAL, true); - unit->SummonCreature(NPC_RISEN_DEATHSPEAKER_SERVANT, *unit, TEMPSUMMON_MANUAL_DESPAWN); - unit->ToCreature()->DespawnOrUnsummon(3000); - } - break; - default: - break; - } + case NPC_DEATHSPEAKER_SERVANT: + if (Creature* c = unit->SummonCreature(WORLD_TRIGGER, *unit, TEMPSUMMON_TIMED_DESPAWN, 10000)) + { + c->CastSpell(c, VOID_ZONE_VISUAL, true); + unit->SummonCreature(NPC_RISEN_DEATHSPEAKER_SERVANT, *unit, TEMPSUMMON_MANUAL_DESPAWN); + unit->ToCreature()->DespawnOrUnsummon(3000); + } + break; + default: + break; + } + } + + void OnGameObjectCreate(GameObject* go) + { + if (TeamIdInInstance == TEAM_NEUTRAL) + { + Map::PlayerList const& players = instance->GetPlayers(); + if (!players.isEmpty()) + if (Player* player = players.begin()->GetSource()) + TeamIdInInstance = player->GetTeamId(); } - void OnGameObjectCreate(GameObject* go) + switch (go->GetEntry()) { - if (TeamIdInInstance == TEAM_NEUTRAL) - { - Map::PlayerList const &players = instance->GetPlayers(); - if (!players.isEmpty()) - if (Player* player = players.begin()->GetSource()) - TeamIdInInstance = player->GetTeamId(); - } - - switch (go->GetEntry()) - { - case GO_SPIRIT_ALARM_1: - case GO_SPIRIT_ALARM_2: - case GO_SPIRIT_ALARM_3: - case GO_SPIRIT_ALARM_4: - { - Position pos[4*3] = {{-160.96f, 2210.46f, 35.24f, 0.0f}, {-176.27f, 2201.93f, 35.24f, 0.0f}, {-207.83f, 2207.38f, 35.24f, 0.0f}, - {-178.41f, 2225.11f, 35.24f, 0.0f}, {-195.23f, 2221.55f, 35.24f, 0.0f}, {-209.94f, 2250.34f, 37.99f, 0.0f}, - {-289.80f, 2216.60f, 42.39f, 0.0f}, {-317.76f, 2216.11f, 42.57f, 0.0f}, {-301.07f, 2216.62f, 42.0f, 0.0f}, - {-276.07f, 2206.76f, 42.57f, 0.0f}, {-304.44f, 2199.11f, 41.99f, 0.0f}, {-292.82f, 2204.61f, 42.02f, 0.0f}}; - go->SetPosition(pos[3*(go->GetEntry()-GO_SPIRIT_ALARM_1)+urand(0,2)]); - } - break; - case GO_GEIST_ALARM_1: - case GO_GEIST_ALARM_2: - go->SetPosition(go->GetPositionX()+urand(0,2)*20.0f*(go->GetEntry()==GO_GEIST_ALARM_1?-1.0f:1.0f), go->GetPositionY(), go->GetPositionZ(), go->GetOrientation()); - break; - case GO_DOODAD_ICECROWN_ICEWALL02: - case GO_ICEWALL: - case GO_LORD_MARROWGAR_S_ENTRANCE: - case GO_ORATORY_OF_THE_DAMNED_ENTRANCE: - case GO_ORANGE_PLAGUE_MONSTER_ENTRANCE: - case GO_GREEN_PLAGUE_MONSTER_ENTRANCE: - case GO_CRIMSON_HALL_DOOR: - case GO_BLOOD_ELF_COUNCIL_DOOR: - case GO_BLOOD_ELF_COUNCIL_DOOR_RIGHT: - case GO_DOODAD_ICECROWN_BLOODPRINCE_DOOR_01: - case GO_DOODAD_ICECROWN_GRATE_01: - case GO_GREEN_DRAGON_BOSS_ENTRANCE: - case GO_GREEN_DRAGON_BOSS_EXIT: - case GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_02: - case GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_03: - case GO_SINDRAGOSA_SHORTCUT_ENTRANCE_DOOR: - case GO_SINDRAGOSA_SHORTCUT_EXIT_DOOR: - case GO_ICE_WALL: - case GO_SINDRAGOSA_ENTRANCE_DOOR: + case GO_SPIRIT_ALARM_1: + case GO_SPIRIT_ALARM_2: + case GO_SPIRIT_ALARM_3: + case GO_SPIRIT_ALARM_4: + { + Position pos[4 * 3] = {{-160.96f, 2210.46f, 35.24f, 0.0f}, {-176.27f, 2201.93f, 35.24f, 0.0f}, {-207.83f, 2207.38f, 35.24f, 0.0f}, + {-178.41f, 2225.11f, 35.24f, 0.0f}, {-195.23f, 2221.55f, 35.24f, 0.0f}, {-209.94f, 2250.34f, 37.99f, 0.0f}, + {-289.80f, 2216.60f, 42.39f, 0.0f}, {-317.76f, 2216.11f, 42.57f, 0.0f}, {-301.07f, 2216.62f, 42.0f, 0.0f}, + {-276.07f, 2206.76f, 42.57f, 0.0f}, {-304.44f, 2199.11f, 41.99f, 0.0f}, {-292.82f, 2204.61f, 42.02f, 0.0f} + }; + go->SetPosition(pos[3 * (go->GetEntry() - GO_SPIRIT_ALARM_1) + urand(0, 2)]); + } + break; + case GO_GEIST_ALARM_1: + case GO_GEIST_ALARM_2: + go->SetPosition(go->GetPositionX() + urand(0, 2) * 20.0f * (go->GetEntry() == GO_GEIST_ALARM_1 ? -1.0f : 1.0f), go->GetPositionY(), go->GetPositionZ(), go->GetOrientation()); + break; + case GO_DOODAD_ICECROWN_ICEWALL02: + case GO_ICEWALL: + case GO_LORD_MARROWGAR_S_ENTRANCE: + case GO_ORATORY_OF_THE_DAMNED_ENTRANCE: + case GO_ORANGE_PLAGUE_MONSTER_ENTRANCE: + case GO_GREEN_PLAGUE_MONSTER_ENTRANCE: + case GO_CRIMSON_HALL_DOOR: + case GO_BLOOD_ELF_COUNCIL_DOOR: + case GO_BLOOD_ELF_COUNCIL_DOOR_RIGHT: + case GO_DOODAD_ICECROWN_BLOODPRINCE_DOOR_01: + case GO_DOODAD_ICECROWN_GRATE_01: + case GO_GREEN_DRAGON_BOSS_ENTRANCE: + case GO_GREEN_DRAGON_BOSS_EXIT: + case GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_02: + case GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_03: + case GO_SINDRAGOSA_SHORTCUT_ENTRANCE_DOOR: + case GO_SINDRAGOSA_SHORTCUT_EXIT_DOOR: + case GO_ICE_WALL: + case GO_SINDRAGOSA_ENTRANCE_DOOR: + AddDoor(go, true); + break; + case GO_SCIENTIST_ENTRANCE: + PutricideEnteranceDoorGUID = go->GetGUID(); + HandleGameObject(PutricideEnteranceDoorGUID, PutricideEventProgress & PUTRICIDE_EVENT_FLAG_TRAP_FINISHED, go); + break; + // these 2 gates are functional only on 25man modes + case GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_01: + case GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_04: + if (instance->Is25ManRaid()) AddDoor(go, true); - break; - case GO_SCIENTIST_ENTRANCE: - PutricideEnteranceDoorGUID = go->GetGUID(); - HandleGameObject(PutricideEnteranceDoorGUID, PutricideEventProgress & PUTRICIDE_EVENT_FLAG_TRAP_FINISHED, go); - break; - // these 2 gates are functional only on 25man modes - case GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_01: - case GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_04: - if (instance->Is25ManRaid()) - AddDoor(go, true); - break; - case GO_LADY_DEATHWHISPER_ELEVATOR: - LadyDeathwisperElevatorGUID = go->GetGUID(); - break; - case GO_THE_SKYBREAKER_H: - case GO_ORGRIMS_HAMMER_A: - EnemyGunshipGUID = go->GetGUID(); - break; - case GO_GUNSHIP_ARMORY_H_10N: - case GO_GUNSHIP_ARMORY_H_25N: - case GO_GUNSHIP_ARMORY_H_10H: - case GO_GUNSHIP_ARMORY_H_25H: - case GO_GUNSHIP_ARMORY_A_10N: - case GO_GUNSHIP_ARMORY_A_25N: - case GO_GUNSHIP_ARMORY_A_10H: - case GO_GUNSHIP_ARMORY_A_25H: - GunshipArmoryGUID = go->GetGUID(); - break; - case GO_SAURFANG_S_DOOR: - DeathbringerSaurfangDoorGUID = go->GetGUID(); - AddDoor(go, true); - break; - case GO_DEATHBRINGER_S_CACHE_10N: - case GO_DEATHBRINGER_S_CACHE_25N: - case GO_DEATHBRINGER_S_CACHE_10H: - case GO_DEATHBRINGER_S_CACHE_25H: - DeathbringersCacheGUID = go->GetGUID(); - break; - case GO_SCOURGE_TRANSPORTER_SAURFANG: - SaurfangTeleportGUID = go->GetGUID(); - break; - case GO_PLAGUE_SIGIL: - PlagueSigilGUID = go->GetGUID(); - if (GetBossState(DATA_PROFESSOR_PUTRICIDE) == DONE) - HandleGameObject(PlagueSigilGUID, false, go); - break; - case GO_BLOODWING_SIGIL: - BloodwingSigilGUID = go->GetGUID(); - if (GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) == DONE) - HandleGameObject(BloodwingSigilGUID, false, go); - break; - case GO_SIGIL_OF_THE_FROSTWING: - FrostwingSigilGUID = go->GetGUID(); - if (GetBossState(DATA_SINDRAGOSA) == DONE) - HandleGameObject(FrostwingSigilGUID, false, go); - break; - case GO_SCIENTIST_AIRLOCK_DOOR_COLLISION: - PutricideCollisionGUID = go->GetGUID(); - HandleGameObject(PutricideCollisionGUID, ((PutricideEventProgress & PUTRICIDE_EVENT_FLAG_FESTERGUT_VALVE) && (PutricideEventProgress & PUTRICIDE_EVENT_FLAG_ROTFACE_VALVE)), go); - break; - case GO_SCIENTIST_AIRLOCK_DOOR_ORANGE: - PutricideGateGUIDs[0] = go->GetGUID(); - if ((PutricideEventProgress & PUTRICIDE_EVENT_FLAG_FESTERGUT_VALVE) && (PutricideEventProgress & PUTRICIDE_EVENT_FLAG_ROTFACE_VALVE)) - go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); - else - HandleGameObject(PutricideGateGUIDs[0], !(PutricideEventProgress & PUTRICIDE_EVENT_FLAG_FESTERGUT_VALVE), go); - break; - case GO_SCIENTIST_AIRLOCK_DOOR_GREEN: - PutricideGateGUIDs[1] = go->GetGUID(); - if ((PutricideEventProgress & PUTRICIDE_EVENT_FLAG_ROTFACE_VALVE) && (PutricideEventProgress & PUTRICIDE_EVENT_FLAG_FESTERGUT_VALVE)) - go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); - else - HandleGameObject(PutricideGateGUIDs[1], !(PutricideEventProgress & PUTRICIDE_EVENT_FLAG_ROTFACE_VALVE), go); - break; - case GO_DOODAD_ICECROWN_ORANGETUBES02: - PutricidePipeGUIDs[0] = go->GetGUID(); - if (PutricideEventProgress & PUTRICIDE_EVENT_FLAG_FESTERGUT_VALVE) - HandleGameObject(PutricidePipeGUIDs[0], true, go); - break; - case GO_DOODAD_ICECROWN_GREENTUBES02: - PutricidePipeGUIDs[1] = go->GetGUID(); - if (PutricideEventProgress & PUTRICIDE_EVENT_FLAG_ROTFACE_VALVE) - HandleGameObject(PutricidePipeGUIDs[1], true, go); - break; - case GO_GAS_RELEASE_VALVE: - GasReleaseValveGUID = go->GetGUID(); - if (GetBossState(DATA_FESTERGUT) != DONE) - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND | GO_FLAG_NOT_SELECTABLE); - break; - case GO_OOZE_RELEASE_VALVE: - OozeReleaseValveGUID = go->GetGUID(); - if (GetBossState(DATA_ROTFACE) != DONE) - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND | GO_FLAG_NOT_SELECTABLE); - break; - case GO_DRINK_ME: - PutricideTableGUID = go->GetGUID(); - break; - case GO_CACHE_OF_THE_DREAMWALKER_10N: - case GO_CACHE_OF_THE_DREAMWALKER_25N: - case GO_CACHE_OF_THE_DREAMWALKER_10H: - case GO_CACHE_OF_THE_DREAMWALKER_25H: - if (Creature* valithria = instance->GetCreature(ValithriaDreamwalkerGUID)) - go->SetLootRecipient(valithria->GetLootRecipient()); - go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED | GO_FLAG_NOT_SELECTABLE | GO_FLAG_NODESPAWN); - break; - case GO_SCOURGE_TRANSPORTER_LK: - TheLichKingTeleportGUID = go->GetGUID(); - if (GetBossState(DATA_PROFESSOR_PUTRICIDE) == DONE && GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) == DONE && GetBossState(DATA_SINDRAGOSA) == DONE) - go->SetGoState(GO_STATE_ACTIVE); - break; - case GO_ARTHAS_PLATFORM: - // this enables movement at The Frozen Throne, when printed this value is 0.000000f - // however, when represented as integer client will accept only this value - go->SetUInt32Value(GAMEOBJECT_PARENTROTATION, 5535469); - ArthasPlatformGUID = go->GetGUID(); - break; - case GO_ARTHAS_PRECIPICE: - go->SetUInt32Value(GAMEOBJECT_PARENTROTATION, 4178312); - ArthasPrecipiceGUID = go->GetGUID(); - break; - case GO_DOODAD_ICECROWN_THRONEFROSTYEDGE01: - FrozenThroneEdgeGUID = go->GetGUID(); - break; - case GO_DOODAD_ICECROWN_THRONEFROSTYWIND01: - FrozenThroneWindGUID = go->GetGUID(); - break; - case GO_DOODAD_ICECROWN_SNOWEDGEWARNING01: - FrozenThroneWarningGUID = go->GetGUID(); - break; - case GO_FROZEN_LAVAMAN: - FrozenBolvarGUID = go->GetGUID(); - if (GetBossState(DATA_THE_LICH_KING) == DONE) - go->SetRespawnTime(7 * DAY); - break; - case GO_LAVAMAN_PILLARS_CHAINED: - PillarsChainedGUID = go->GetGUID(); - if (GetBossState(DATA_THE_LICH_KING) == DONE) - go->SetRespawnTime(7 * DAY); - break; - case GO_LAVAMAN_PILLARS_UNCHAINED: - PillarsUnchainedGUID = go->GetGUID(); - if (GetBossState(DATA_THE_LICH_KING) == DONE) - go->SetRespawnTime(7 * DAY); - break; - case GO_SCOURGE_TRANSPORTER_FIRST: - AddDoor(go, true); - ScourgeTransporterFirstGUID = go->GetGUID(); - if (GetBossState(DATA_LORD_MARROWGAR) == DONE) - go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - break; - default: - break; - } + break; + case GO_LADY_DEATHWHISPER_ELEVATOR: + LadyDeathwisperElevatorGUID = go->GetGUID(); + break; + case GO_THE_SKYBREAKER_H: + case GO_ORGRIMS_HAMMER_A: + EnemyGunshipGUID = go->GetGUID(); + break; + case GO_GUNSHIP_ARMORY_H_10N: + case GO_GUNSHIP_ARMORY_H_25N: + case GO_GUNSHIP_ARMORY_H_10H: + case GO_GUNSHIP_ARMORY_H_25H: + case GO_GUNSHIP_ARMORY_A_10N: + case GO_GUNSHIP_ARMORY_A_25N: + case GO_GUNSHIP_ARMORY_A_10H: + case GO_GUNSHIP_ARMORY_A_25H: + GunshipArmoryGUID = go->GetGUID(); + break; + case GO_SAURFANG_S_DOOR: + DeathbringerSaurfangDoorGUID = go->GetGUID(); + AddDoor(go, true); + break; + case GO_DEATHBRINGER_S_CACHE_10N: + case GO_DEATHBRINGER_S_CACHE_25N: + case GO_DEATHBRINGER_S_CACHE_10H: + case GO_DEATHBRINGER_S_CACHE_25H: + DeathbringersCacheGUID = go->GetGUID(); + break; + case GO_SCOURGE_TRANSPORTER_SAURFANG: + SaurfangTeleportGUID = go->GetGUID(); + break; + case GO_PLAGUE_SIGIL: + PlagueSigilGUID = go->GetGUID(); + if (GetBossState(DATA_PROFESSOR_PUTRICIDE) == DONE) + HandleGameObject(PlagueSigilGUID, false, go); + break; + case GO_BLOODWING_SIGIL: + BloodwingSigilGUID = go->GetGUID(); + if (GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) == DONE) + HandleGameObject(BloodwingSigilGUID, false, go); + break; + case GO_SIGIL_OF_THE_FROSTWING: + FrostwingSigilGUID = go->GetGUID(); + if (GetBossState(DATA_SINDRAGOSA) == DONE) + HandleGameObject(FrostwingSigilGUID, false, go); + break; + case GO_SCIENTIST_AIRLOCK_DOOR_COLLISION: + PutricideCollisionGUID = go->GetGUID(); + HandleGameObject(PutricideCollisionGUID, ((PutricideEventProgress & PUTRICIDE_EVENT_FLAG_FESTERGUT_VALVE) && (PutricideEventProgress & PUTRICIDE_EVENT_FLAG_ROTFACE_VALVE)), go); + break; + case GO_SCIENTIST_AIRLOCK_DOOR_ORANGE: + PutricideGateGUIDs[0] = go->GetGUID(); + if ((PutricideEventProgress & PUTRICIDE_EVENT_FLAG_FESTERGUT_VALVE) && (PutricideEventProgress & PUTRICIDE_EVENT_FLAG_ROTFACE_VALVE)) + go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); + else + HandleGameObject(PutricideGateGUIDs[0], !(PutricideEventProgress & PUTRICIDE_EVENT_FLAG_FESTERGUT_VALVE), go); + break; + case GO_SCIENTIST_AIRLOCK_DOOR_GREEN: + PutricideGateGUIDs[1] = go->GetGUID(); + if ((PutricideEventProgress & PUTRICIDE_EVENT_FLAG_ROTFACE_VALVE) && (PutricideEventProgress & PUTRICIDE_EVENT_FLAG_FESTERGUT_VALVE)) + go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); + else + HandleGameObject(PutricideGateGUIDs[1], !(PutricideEventProgress & PUTRICIDE_EVENT_FLAG_ROTFACE_VALVE), go); + break; + case GO_DOODAD_ICECROWN_ORANGETUBES02: + PutricidePipeGUIDs[0] = go->GetGUID(); + if (PutricideEventProgress & PUTRICIDE_EVENT_FLAG_FESTERGUT_VALVE) + HandleGameObject(PutricidePipeGUIDs[0], true, go); + break; + case GO_DOODAD_ICECROWN_GREENTUBES02: + PutricidePipeGUIDs[1] = go->GetGUID(); + if (PutricideEventProgress & PUTRICIDE_EVENT_FLAG_ROTFACE_VALVE) + HandleGameObject(PutricidePipeGUIDs[1], true, go); + break; + case GO_GAS_RELEASE_VALVE: + GasReleaseValveGUID = go->GetGUID(); + if (GetBossState(DATA_FESTERGUT) != DONE) + go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND | GO_FLAG_NOT_SELECTABLE); + break; + case GO_OOZE_RELEASE_VALVE: + OozeReleaseValveGUID = go->GetGUID(); + if (GetBossState(DATA_ROTFACE) != DONE) + go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND | GO_FLAG_NOT_SELECTABLE); + break; + case GO_DRINK_ME: + PutricideTableGUID = go->GetGUID(); + break; + case GO_CACHE_OF_THE_DREAMWALKER_10N: + case GO_CACHE_OF_THE_DREAMWALKER_25N: + case GO_CACHE_OF_THE_DREAMWALKER_10H: + case GO_CACHE_OF_THE_DREAMWALKER_25H: + if (Creature* valithria = instance->GetCreature(ValithriaDreamwalkerGUID)) + go->SetLootRecipient(valithria->GetLootRecipient()); + go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED | GO_FLAG_NOT_SELECTABLE | GO_FLAG_NODESPAWN); + break; + case GO_SCOURGE_TRANSPORTER_LK: + TheLichKingTeleportGUID = go->GetGUID(); + if (GetBossState(DATA_PROFESSOR_PUTRICIDE) == DONE && GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) == DONE && GetBossState(DATA_SINDRAGOSA) == DONE) + go->SetGoState(GO_STATE_ACTIVE); + break; + case GO_ARTHAS_PLATFORM: + // this enables movement at The Frozen Throne, when printed this value is 0.000000f + // however, when represented as integer client will accept only this value + go->SetUInt32Value(GAMEOBJECT_PARENTROTATION, 5535469); + ArthasPlatformGUID = go->GetGUID(); + break; + case GO_ARTHAS_PRECIPICE: + go->SetUInt32Value(GAMEOBJECT_PARENTROTATION, 4178312); + ArthasPrecipiceGUID = go->GetGUID(); + break; + case GO_DOODAD_ICECROWN_THRONEFROSTYEDGE01: + FrozenThroneEdgeGUID = go->GetGUID(); + break; + case GO_DOODAD_ICECROWN_THRONEFROSTYWIND01: + FrozenThroneWindGUID = go->GetGUID(); + break; + case GO_DOODAD_ICECROWN_SNOWEDGEWARNING01: + FrozenThroneWarningGUID = go->GetGUID(); + break; + case GO_FROZEN_LAVAMAN: + FrozenBolvarGUID = go->GetGUID(); + if (GetBossState(DATA_THE_LICH_KING) == DONE) + go->SetRespawnTime(7 * DAY); + break; + case GO_LAVAMAN_PILLARS_CHAINED: + PillarsChainedGUID = go->GetGUID(); + if (GetBossState(DATA_THE_LICH_KING) == DONE) + go->SetRespawnTime(7 * DAY); + break; + case GO_LAVAMAN_PILLARS_UNCHAINED: + PillarsUnchainedGUID = go->GetGUID(); + if (GetBossState(DATA_THE_LICH_KING) == DONE) + go->SetRespawnTime(7 * DAY); + break; + case GO_SCOURGE_TRANSPORTER_FIRST: + AddDoor(go, true); + ScourgeTransporterFirstGUID = go->GetGUID(); + if (GetBossState(DATA_LORD_MARROWGAR) == DONE) + go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + break; + default: + break; + } + } + + void OnGameObjectRemove(GameObject* go) + { + switch (go->GetEntry()) + { + case GO_DOODAD_ICECROWN_ICEWALL02: + case GO_ICEWALL: + case GO_LORD_MARROWGAR_S_ENTRANCE: + case GO_ORATORY_OF_THE_DAMNED_ENTRANCE: + case GO_SAURFANG_S_DOOR: + case GO_ORANGE_PLAGUE_MONSTER_ENTRANCE: + case GO_GREEN_PLAGUE_MONSTER_ENTRANCE: + case GO_SCIENTIST_ENTRANCE: + case GO_CRIMSON_HALL_DOOR: + case GO_BLOOD_ELF_COUNCIL_DOOR: + case GO_BLOOD_ELF_COUNCIL_DOOR_RIGHT: + case GO_DOODAD_ICECROWN_BLOODPRINCE_DOOR_01: + case GO_DOODAD_ICECROWN_GRATE_01: + case GO_GREEN_DRAGON_BOSS_ENTRANCE: + case GO_GREEN_DRAGON_BOSS_EXIT: + case GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_01: + case GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_02: + case GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_03: + case GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_04: + //case GO_SINDRAGOSA_ENTRANCE_DOOR: + case GO_SINDRAGOSA_SHORTCUT_ENTRANCE_DOOR: + case GO_SINDRAGOSA_SHORTCUT_EXIT_DOOR: + case GO_ICE_WALL: + case GO_SCOURGE_TRANSPORTER_FIRST: + AddDoor(go, false); + break; + case GO_THE_SKYBREAKER_A: + case GO_ORGRIMS_HAMMER_H: + GunshipGUID = 0; + break; + default: + break; + } + } + + uint32 GetData(uint32 type) const + { + switch (type) + { + case DATA_BUFF_AVAILABLE: + return (IsBuffAvailable ? 1 : 0); + case DATA_WEEKLY_QUEST_ID: + return WeeklyQuestId10; + case DATA_PUTRICIDE_TRAP_STATE: + if (!(PutricideEventProgress & PUTRICIDE_EVENT_FLAG_FESTERGUT_VALVE) || !(PutricideEventProgress & PUTRICIDE_EVENT_FLAG_ROTFACE_VALVE)) + return TO_BE_DECIDED; + if (PutricideEventProgress & PUTRICIDE_EVENT_FLAG_TRAP_INPROGRESS) + return IN_PROGRESS; + if (PutricideEventProgress & PUTRICIDE_EVENT_FLAG_TRAP_FINISHED) + return DONE; + return NOT_STARTED; + case DATA_HAS_LIMITED_ATTEMPTS: + return (instance->IsHeroic() ? 1 : 0); + case DATA_LK_HC_AVAILABLE: + return (LichKingHeroicAvailable ? 1 : 0); + case DATA_SINDRAGOSA_FROSTWYRMS: + return FrostwyrmGUIDs.size(); + case DATA_SPINESTALKER: + return SpinestalkerTrash.size(); + case DATA_RIMEFANG: + return RimefangTrash.size(); + case DATA_COLDFLAME_JETS: + return ColdflameJetsState; + case DATA_TEAMID_IN_INSTANCE: + return TeamIdInInstance; + case DATA_BLOOD_QUICKENING_STATE: + return BloodQuickeningState; + case DATA_HEROIC_ATTEMPTS: + return HeroicAttempts; + default: + break; } - void OnGameObjectRemove(GameObject* go) + return 0; + } + + uint64 GetData64(uint32 type) const + { + switch (type) { - switch (go->GetEntry()) - { - case GO_DOODAD_ICECROWN_ICEWALL02: - case GO_ICEWALL: - case GO_LORD_MARROWGAR_S_ENTRANCE: - case GO_ORATORY_OF_THE_DAMNED_ENTRANCE: - case GO_SAURFANG_S_DOOR: - case GO_ORANGE_PLAGUE_MONSTER_ENTRANCE: - case GO_GREEN_PLAGUE_MONSTER_ENTRANCE: - case GO_SCIENTIST_ENTRANCE: - case GO_CRIMSON_HALL_DOOR: - case GO_BLOOD_ELF_COUNCIL_DOOR: - case GO_BLOOD_ELF_COUNCIL_DOOR_RIGHT: - case GO_DOODAD_ICECROWN_BLOODPRINCE_DOOR_01: - case GO_DOODAD_ICECROWN_GRATE_01: - case GO_GREEN_DRAGON_BOSS_ENTRANCE: - case GO_GREEN_DRAGON_BOSS_EXIT: - case GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_01: - case GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_02: - case GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_03: - case GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_04: - //case GO_SINDRAGOSA_ENTRANCE_DOOR: - case GO_SINDRAGOSA_SHORTCUT_ENTRANCE_DOOR: - case GO_SINDRAGOSA_SHORTCUT_EXIT_DOOR: - case GO_ICE_WALL: - case GO_SCOURGE_TRANSPORTER_FIRST: - AddDoor(go, false); - break; - case GO_THE_SKYBREAKER_A: - case GO_ORGRIMS_HAMMER_H: - GunshipGUID = 0; - break; - default: - break; - } + case DATA_LADY_DEATHWHISPER: + return LadyDeathwhisperGUID; + case DATA_ICECROWN_GUNSHIP_BATTLE: + return GunshipGUID; + case DATA_ENEMY_GUNSHIP: + return EnemyGunshipGUID; + case DATA_DEATHBRINGER_SAURFANG: + return DeathbringerSaurfangGUID; + case DATA_SAURFANG_EVENT_NPC: + return DeathbringerSaurfangEventGUID; + case GO_SAURFANG_S_DOOR: + return DeathbringerSaurfangDoorGUID; + case GO_SCOURGE_TRANSPORTER_SAURFANG: + return SaurfangTeleportGUID; + case DATA_FESTERGUT: + return FestergutGUID; + case DATA_ROTFACE: + return RotfaceGUID; + case DATA_PROFESSOR_PUTRICIDE: + return ProfessorPutricideGUID; + case DATA_PUTRICIDE_TABLE: + return PutricideTableGUID; + case DATA_PRINCE_KELESETH_GUID: + return BloodCouncilGUIDs[0]; + case DATA_PRINCE_TALDARAM_GUID: + return BloodCouncilGUIDs[1]; + case DATA_PRINCE_VALANAR_GUID: + return BloodCouncilGUIDs[2]; + case DATA_BLOOD_PRINCES_CONTROL: + return BloodCouncilControllerGUID; + case DATA_BLOOD_QUEEN_LANA_THEL: + return BloodQueenLanaThelGUID; + case DATA_CROK_SCOURGEBANE: + return CrokScourgebaneGUID; + case DATA_CAPTAIN_ARNATH: + case DATA_CAPTAIN_BRANDON: + case DATA_CAPTAIN_GRONDEL: + case DATA_CAPTAIN_RUPERT: + return CrokCaptainGUIDs[type - DATA_CAPTAIN_ARNATH]; + case DATA_SISTER_SVALNA: + return SisterSvalnaGUID; + case DATA_VALITHRIA_DREAMWALKER: + return ValithriaDreamwalkerGUID; + case DATA_VALITHRIA_LICH_KING: + return ValithriaLichKingGUID; + case DATA_VALITHRIA_TRIGGER: + return ValithriaTriggerGUID; + case NPC_SINDRAGOSA_GAUNTLET: + return SindragosaGauntletGUID; + case NPC_PUTRICADES_TRAP: + return PutricadeTrapGUID; + case DATA_SINDRAGOSA: + return SindragosaGUID; + case DATA_SPINESTALKER: + return SpinestalkerGUID; + case DATA_RIMEFANG: + return RimefangGUID; + case DATA_THE_LICH_KING: + return TheLichKingGUID; + case DATA_HIGHLORD_TIRION_FORDRING: + return HighlordTirionFordringGUID; + case DATA_ARTHAS_PLATFORM: + return ArthasPlatformGUID; + case DATA_TERENAS_MENETHIL: + return TerenasMenethilGUID; + default: + break; } - uint32 GetData(uint32 type) const - { - switch (type) - { - case DATA_BUFF_AVAILABLE: - return (IsBuffAvailable ? 1 : 0); - case DATA_WEEKLY_QUEST_ID: - return WeeklyQuestId10; - case DATA_PUTRICIDE_TRAP_STATE: - if (!(PutricideEventProgress & PUTRICIDE_EVENT_FLAG_FESTERGUT_VALVE) || !(PutricideEventProgress & PUTRICIDE_EVENT_FLAG_ROTFACE_VALVE)) - return TO_BE_DECIDED; - if (PutricideEventProgress & PUTRICIDE_EVENT_FLAG_TRAP_INPROGRESS) - return IN_PROGRESS; - if (PutricideEventProgress & PUTRICIDE_EVENT_FLAG_TRAP_FINISHED) - return DONE; - return NOT_STARTED; - case DATA_HAS_LIMITED_ATTEMPTS: - return (instance->IsHeroic() ? 1 : 0); - case DATA_LK_HC_AVAILABLE: - return (LichKingHeroicAvailable ? 1 : 0); - case DATA_SINDRAGOSA_FROSTWYRMS: - return FrostwyrmGUIDs.size(); - case DATA_SPINESTALKER: - return SpinestalkerTrash.size(); - case DATA_RIMEFANG: - return RimefangTrash.size(); - case DATA_COLDFLAME_JETS: - return ColdflameJetsState; - case DATA_TEAMID_IN_INSTANCE: - return TeamIdInInstance; - case DATA_BLOOD_QUICKENING_STATE: - return BloodQuickeningState; - case DATA_HEROIC_ATTEMPTS: - return HeroicAttempts; - default: - break; - } + return 0; + } - return 0; + void HandleDropAttempt(bool drop = true) + { + if (!GetData(DATA_HAS_LIMITED_ATTEMPTS)) + return; + if (drop && HeroicAttempts) + { + --HeroicAttempts; + DoUpdateWorldState(WORLDSTATE_ATTEMPTS_REMAINING, HeroicAttempts); + SaveToDB(); } + if (HeroicAttempts) + return; + if (GetBossState(DATA_ROTFACE) == DONE && GetBossState(DATA_FESTERGUT) == DONE) + if (Creature* professor = instance->GetCreature(ProfessorPutricideGUID)) + if (professor->IsAlive()) + professor->SetVisible(false); + if (Creature* bq = instance->GetCreature(BloodQueenLanaThelGUID)) + if (bq->IsAlive()) + bq->SetVisible(false); + if (Creature* sindra = instance->GetCreature(SindragosaGUID)) + if (sindra->IsAlive()) + sindra->SetVisible(false); + if (Creature* theLichKing = instance->GetCreature(TheLichKingGUID)) + if (theLichKing->IsAlive()) + theLichKing->SetVisible(false); + } - uint64 GetData64(uint32 type) const + void RemoveBackPack() + { + for (auto const& itr : instance->GetPlayers()) + if (Player* _player = itr.GetSource()) + _player->DestroyItemCount(ITEM_GOBLIN_ROCKET_PACK, _player->GetItemCount(ITEM_GOBLIN_ROCKET_PACK), true); + } + + bool SetBossState(uint32 type, EncounterState state) + { + if (!InstanceScript::SetBossState(type, state)) + return false; + + switch (type) { - switch (type) - { - case DATA_LADY_DEATHWHISPER: - return LadyDeathwhisperGUID; - case DATA_ICECROWN_GUNSHIP_BATTLE: - return GunshipGUID; - case DATA_ENEMY_GUNSHIP: - return EnemyGunshipGUID; - case DATA_DEATHBRINGER_SAURFANG: - return DeathbringerSaurfangGUID; - case DATA_SAURFANG_EVENT_NPC: - return DeathbringerSaurfangEventGUID; - case GO_SAURFANG_S_DOOR: - return DeathbringerSaurfangDoorGUID; - case GO_SCOURGE_TRANSPORTER_SAURFANG: - return SaurfangTeleportGUID; - case DATA_FESTERGUT: - return FestergutGUID; - case DATA_ROTFACE: - return RotfaceGUID; - case DATA_PROFESSOR_PUTRICIDE: - return ProfessorPutricideGUID; - case DATA_PUTRICIDE_TABLE: - return PutricideTableGUID; - case DATA_PRINCE_KELESETH_GUID: - return BloodCouncilGUIDs[0]; - case DATA_PRINCE_TALDARAM_GUID: - return BloodCouncilGUIDs[1]; - case DATA_PRINCE_VALANAR_GUID: - return BloodCouncilGUIDs[2]; - case DATA_BLOOD_PRINCES_CONTROL: - return BloodCouncilControllerGUID; - case DATA_BLOOD_QUEEN_LANA_THEL: - return BloodQueenLanaThelGUID; - case DATA_CROK_SCOURGEBANE: - return CrokScourgebaneGUID; - case DATA_CAPTAIN_ARNATH: - case DATA_CAPTAIN_BRANDON: - case DATA_CAPTAIN_GRONDEL: - case DATA_CAPTAIN_RUPERT: - return CrokCaptainGUIDs[type - DATA_CAPTAIN_ARNATH]; - case DATA_SISTER_SVALNA: - return SisterSvalnaGUID; - case DATA_VALITHRIA_DREAMWALKER: - return ValithriaDreamwalkerGUID; - case DATA_VALITHRIA_LICH_KING: - return ValithriaLichKingGUID; - case DATA_VALITHRIA_TRIGGER: - return ValithriaTriggerGUID; - case NPC_SINDRAGOSA_GAUNTLET: - return SindragosaGauntletGUID; - case NPC_PUTRICADES_TRAP: - return PutricadeTrapGUID; - case DATA_SINDRAGOSA: - return SindragosaGUID; - case DATA_SPINESTALKER: - return SpinestalkerGUID; - case DATA_RIMEFANG: - return RimefangGUID; - case DATA_THE_LICH_KING: - return TheLichKingGUID; - case DATA_HIGHLORD_TIRION_FORDRING: - return HighlordTirionFordringGUID; - case DATA_ARTHAS_PLATFORM: - return ArthasPlatformGUID; - case DATA_TERENAS_MENETHIL: - return TerenasMenethilGUID; - default: - break; - } - - return 0; - } - - void HandleDropAttempt(bool drop = true) - { - if (!GetData(DATA_HAS_LIMITED_ATTEMPTS)) - return; - if (drop && HeroicAttempts) - { - --HeroicAttempts; - DoUpdateWorldState(WORLDSTATE_ATTEMPTS_REMAINING, HeroicAttempts); - SaveToDB(); - } - if (HeroicAttempts) - return; - if (GetBossState(DATA_ROTFACE) == DONE && GetBossState(DATA_FESTERGUT) == DONE) - if (Creature* professor = instance->GetCreature(ProfessorPutricideGUID)) - if (professor->IsAlive()) - professor->SetVisible(false); - if (Creature* bq = instance->GetCreature(BloodQueenLanaThelGUID)) - if (bq->IsAlive()) - bq->SetVisible(false); - if (Creature* sindra = instance->GetCreature(SindragosaGUID)) - if (sindra->IsAlive()) - sindra->SetVisible(false); - if (Creature* theLichKing = instance->GetCreature(TheLichKingGUID)) - if (theLichKing->IsAlive()) - theLichKing->SetVisible(false); - } - - void RemoveBackPack() - { - for (auto const& itr : instance->GetPlayers()) - if (Player* _player = itr.GetSource()) - _player->DestroyItemCount(ITEM_GOBLIN_ROCKET_PACK, _player->GetItemCount(ITEM_GOBLIN_ROCKET_PACK), true); - } - - bool SetBossState(uint32 type, EncounterState state) - { - if (!InstanceScript::SetBossState(type, state)) - return false; - - switch (type) - { - case DATA_LORD_MARROWGAR: - if (state == DONE) + case DATA_LORD_MARROWGAR: + if (state == DONE) + { + WeeklyQuestId10 = RAND(QUEST_BLOOD_QUICKENING_10, QUEST_RESIDUE_RENDEZVOUS_10, QUEST_RESPITE_FOR_A_TORMENTED_SOUL_10, QUEST_DEPROGRAMMING_10, QUEST_SECURING_THE_RAMPARTS_10); + SetData(DATA_WEEKLY_QUEST_ID, 0); // show required hidden npcs + if (GameObject* transporter = instance->GetGameObject(ScourgeTransporterFirstGUID)) + transporter->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + SaveToDB(); + } + break; + case DATA_LADY_DEATHWHISPER: + if (state == DONE) + SpawnGunship(); + break; + case DATA_ICECROWN_GUNSHIP_BATTLE: + if (state == DONE) + { + if (GameObject* loot = instance->GetGameObject(GunshipArmoryGUID)) { - WeeklyQuestId10 = RAND(QUEST_BLOOD_QUICKENING_10, QUEST_RESIDUE_RENDEZVOUS_10, QUEST_RESPITE_FOR_A_TORMENTED_SOUL_10, QUEST_DEPROGRAMMING_10, QUEST_SECURING_THE_RAMPARTS_10); - SetData(DATA_WEEKLY_QUEST_ID, 0); // show required hidden npcs - if (GameObject* transporter = instance->GetGameObject(ScourgeTransporterFirstGUID)) - transporter->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - SaveToDB(); + Map::PlayerList const& pl = instance->GetPlayers(); + for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) + if (Player* p = itr->GetSource()) + if (!p->IsGameMaster() && p->GetGroup() && p->GetGroup()->isRaidGroup()) + { + loot->SetLootRecipient(p); + break; + } + loot->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED | GO_FLAG_NOT_SELECTABLE | GO_FLAG_NODESPAWN); } - break; - case DATA_LADY_DEATHWHISPER: - if (state == DONE) - SpawnGunship(); - break; - case DATA_ICECROWN_GUNSHIP_BATTLE: - if (state == DONE) - { - if (GameObject* loot = instance->GetGameObject(GunshipArmoryGUID)) + } + else if (state == FAIL) + Events.ScheduleEvent(EVENT_RESPAWN_GUNSHIP, 30000); + break; + case DATA_DEATHBRINGER_SAURFANG: + switch (state) + { + case DONE: + if (GameObject* loot = instance->GetGameObject(DeathbringersCacheGUID)) { - Map::PlayerList const& pl = instance->GetPlayers(); - for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) - if (Player* p = itr->GetSource()) - if (!p->IsGameMaster() && p->GetGroup() && p->GetGroup()->isRaidGroup()) - { - loot->SetLootRecipient(p); - break; - } + if (Creature* deathbringer = instance->GetCreature(DeathbringerSaurfangGUID)) + loot->SetLootRecipient(deathbringer->GetLootRecipient()); loot->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED | GO_FLAG_NOT_SELECTABLE | GO_FLAG_NODESPAWN); } - } - else if (state == FAIL) - Events.ScheduleEvent(EVENT_RESPAWN_GUNSHIP, 30000); - break; - case DATA_DEATHBRINGER_SAURFANG: - switch (state) - { - case DONE: - if (GameObject* loot = instance->GetGameObject(DeathbringersCacheGUID)) - { - if (Creature* deathbringer = instance->GetCreature(DeathbringerSaurfangGUID)) - loot->SetLootRecipient(deathbringer->GetLootRecipient()); - loot->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED | GO_FLAG_NOT_SELECTABLE | GO_FLAG_NODESPAWN); - } - [[fallthrough]]; - case NOT_STARTED: - if (GameObject* teleporter = instance->GetGameObject(SaurfangTeleportGUID)) - { - HandleGameObject(SaurfangTeleportGUID, true, teleporter); - teleporter->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); - } - break; - default: - break; - } - break; - case DATA_FESTERGUT: - if (state == DONE) - { - if (GameObject* go = instance->GetGameObject(GasReleaseValveGUID)) - go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND | GO_FLAG_NOT_SELECTABLE); - if (GetBossState(DATA_ROTFACE) == DONE) - HandleDropAttempt(false); - } - break; - case DATA_ROTFACE: - if (state == DONE) - { - if (GameObject* go = instance->GetGameObject(OozeReleaseValveGUID)) - go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND | GO_FLAG_NOT_SELECTABLE); - if (GetBossState(DATA_FESTERGUT) == DONE) - HandleDropAttempt(false); - } - break; - case DATA_PROFESSOR_PUTRICIDE: - HandleGameObject(PutricideEnteranceDoorGUID, (PutricideEventProgress & PUTRICIDE_EVENT_FLAG_TRAP_FINISHED) && state != IN_PROGRESS); - HandleGameObject(PlagueSigilGUID, state != DONE); - if (state == DONE) - CheckLichKingAvailability(); - else if (state == FAIL) - HandleDropAttempt(); - if (state == DONE && !instance->IsHeroic() && LichKingHeroicAvailable) - { - LichKingHeroicAvailable = false; - SaveToDB(); - } - break; - case DATA_BLOOD_QUEEN_LANA_THEL: - HandleGameObject(BloodwingSigilGUID, state != DONE); - if (state == DONE) - CheckLichKingAvailability(); - else if (state == FAIL) - HandleDropAttempt(); - if (state == DONE && !instance->IsHeroic() && LichKingHeroicAvailable) - { - LichKingHeroicAvailable = false; - SaveToDB(); - } - break; - case DATA_VALITHRIA_DREAMWALKER: - if (state == DONE) - SetData(DATA_WEEKLY_QUEST_ID, GetData(DATA_WEEKLY_QUEST_ID)); // will show weekly quest npc if necessary - break; - case DATA_SINDRAGOSA: - HandleGameObject(FrostwingSigilGUID, state != DONE); - if (state == DONE) - CheckLichKingAvailability(); - else if (state == FAIL) - HandleDropAttempt(); - if (state == DONE && !instance->IsHeroic() && LichKingHeroicAvailable) - { - LichKingHeroicAvailable = false; - SaveToDB(); - } - break; - case DATA_THE_LICH_KING: + [[fallthrough]]; + case NOT_STARTED: + if (GameObject* teleporter = instance->GetGameObject(SaurfangTeleportGUID)) + { + HandleGameObject(SaurfangTeleportGUID, true, teleporter); + teleporter->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); + } + break; + default: + break; + } + break; + case DATA_FESTERGUT: + if (state == DONE) + { + if (GameObject* go = instance->GetGameObject(GasReleaseValveGUID)) + go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND | GO_FLAG_NOT_SELECTABLE); + if (GetBossState(DATA_ROTFACE) == DONE) + HandleDropAttempt(false); + } + break; + case DATA_ROTFACE: + if (state == DONE) + { + if (GameObject* go = instance->GetGameObject(OozeReleaseValveGUID)) + go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND | GO_FLAG_NOT_SELECTABLE); + if (GetBossState(DATA_FESTERGUT) == DONE) + HandleDropAttempt(false); + } + break; + case DATA_PROFESSOR_PUTRICIDE: + HandleGameObject(PutricideEnteranceDoorGUID, (PutricideEventProgress & PUTRICIDE_EVENT_FLAG_TRAP_FINISHED) && state != IN_PROGRESS); + HandleGameObject(PlagueSigilGUID, state != DONE); + if (state == DONE) + CheckLichKingAvailability(); + else if (state == FAIL) + HandleDropAttempt(); + if (state == DONE && !instance->IsHeroic() && LichKingHeroicAvailable) + { + LichKingHeroicAvailable = false; + SaveToDB(); + } + break; + case DATA_BLOOD_QUEEN_LANA_THEL: + HandleGameObject(BloodwingSigilGUID, state != DONE); + if (state == DONE) + CheckLichKingAvailability(); + else if (state == FAIL) + HandleDropAttempt(); + if (state == DONE && !instance->IsHeroic() && LichKingHeroicAvailable) + { + LichKingHeroicAvailable = false; + SaveToDB(); + } + break; + case DATA_VALITHRIA_DREAMWALKER: + if (state == DONE) + SetData(DATA_WEEKLY_QUEST_ID, GetData(DATA_WEEKLY_QUEST_ID)); // will show weekly quest npc if necessary + break; + case DATA_SINDRAGOSA: + HandleGameObject(FrostwingSigilGUID, state != DONE); + if (state == DONE) + CheckLichKingAvailability(); + else if (state == FAIL) + HandleDropAttempt(); + if (state == DONE && !instance->IsHeroic() && LichKingHeroicAvailable) + { + LichKingHeroicAvailable = false; + SaveToDB(); + } + break; + case DATA_THE_LICH_KING: { // dramatically increase visibility range during fight to seeing frostmourne room instance->SetVisibilityRange(state == IN_PROGRESS ? 500.0f : 200.0f); @@ -1202,140 +1203,150 @@ class instance_icecrown_citadel : public InstanceMapScript } break; } - default: - break; - } - - return true; + default: + break; } - void SpawnGunship() + return true; + } + + void SpawnGunship() + { + if (!GunshipGUID && instance->HavePlayers()) { - if (!GunshipGUID && instance->HavePlayers()) + SetBossState(DATA_ICECROWN_GUNSHIP_BATTLE, NOT_STARTED); + uint32 gunshipEntry = TeamIdInInstance == TEAM_HORDE ? GO_ORGRIMS_HAMMER_H : GO_THE_SKYBREAKER_A; + if (MotionTransport* gunship = sTransportMgr->CreateTransport(gunshipEntry, 0, instance)) { - SetBossState(DATA_ICECROWN_GUNSHIP_BATTLE, NOT_STARTED); - uint32 gunshipEntry = TeamIdInInstance == TEAM_HORDE ? GO_ORGRIMS_HAMMER_H : GO_THE_SKYBREAKER_A; - if (MotionTransport* gunship = sTransportMgr->CreateTransport(gunshipEntry, 0, instance)) - { - GunshipGUID = gunship->GetGUID(); - gunship->setActive(false); - } + GunshipGUID = gunship->GetGUID(); + gunship->setActive(false); } } + } - void SetData(uint32 type, uint32 data) + void SetData(uint32 type, uint32 data) + { + switch (type) { - switch (type) - { - case DATA_BUFF_AVAILABLE: - IsBuffAvailable = !!data; - if (!IsBuffAvailable) - { - Map::PlayerList const& plrList = instance->GetPlayers(); - for (Map::PlayerList::const_iterator itr = plrList.begin(); itr != plrList.end(); ++itr) - if (Player* plr = itr->GetSource()) + case DATA_BUFF_AVAILABLE: + IsBuffAvailable = !!data; + if (!IsBuffAvailable) + { + Map::PlayerList const& plrList = instance->GetPlayers(); + for (Map::PlayerList::const_iterator itr = plrList.begin(); itr != plrList.end(); ++itr) + if (Player* plr = itr->GetSource()) + { + plr->UpdateAreaDependentAuras(plr->GetAreaId()); + for (Unit::ControlSet::const_iterator itr = plr->m_Controlled.begin(); itr != plr->m_Controlled.end(); ++itr) { - plr->UpdateAreaDependentAuras(plr->GetAreaId()); - for (Unit::ControlSet::const_iterator itr = plr->m_Controlled.begin(); itr != plr->m_Controlled.end(); ++itr) - { - Unit::AuraMap& am = (*itr)->GetOwnedAuras(); - for (Unit::AuraMap::iterator itra = am.begin(); itra != am.end();) - switch (itra->second->GetId()) - { - // Hellscream's Warsong - case 73816: case 73818: case 73819: case 73820: case 73821: case 73822: - // Strength of Wrynn - case 73762: case 73824: case 73825: case 73826: case 73827: case 73828: - (*itr)->RemoveOwnedAura(itra); - break; - default: - ++itra; - break; - } - } + Unit::AuraMap& am = (*itr)->GetOwnedAuras(); + for (Unit::AuraMap::iterator itra = am.begin(); itra != am.end();) + switch (itra->second->GetId()) + { + // Hellscream's Warsong + case 73816: + case 73818: + case 73819: + case 73820: + case 73821: + case 73822: + // Strength of Wrynn + case 73762: + case 73824: + case 73825: + case 73826: + case 73827: + case 73828: + (*itr)->RemoveOwnedAura(itra); + break; + default: + ++itra; + break; + } } - } - break; - case DATA_WEEKLY_QUEST_ID: - for (uint8 i=0; iGetCreature(WeeklyQuestNpcGUID[i])) - c->SetVisible(true); - break; - case DATA_PUTRICIDE_TRAP_STATE: - if (data == NOT_STARTED) + } + } + break; + case DATA_WEEKLY_QUEST_ID: + for (uint8 i = 0; i < WeeklyNPCs; ++i) + if (WeeklyQuestData[i].questId[0] == WeeklyQuestId10 && (WeeklyQuestData[i].creatureEntry != NPC_VALITHRIA_DREAMWALKER_QUEST || GetBossState(DATA_VALITHRIA_DREAMWALKER) == DONE) /*appears after killing valithria*/) + if (WeeklyQuestNpcGUID[i]) + if (Creature* c = instance->GetCreature(WeeklyQuestNpcGUID[i])) + c->SetVisible(true); + break; + case DATA_PUTRICIDE_TRAP_STATE: + if (data == NOT_STARTED) + { + PutricideEventProgress &= ~PUTRICIDE_EVENT_FLAG_TRAP_INPROGRESS; + HandleGameObject(PutricideCollisionGUID, ((PutricideEventProgress & PUTRICIDE_EVENT_FLAG_FESTERGUT_VALVE) && (PutricideEventProgress & PUTRICIDE_EVENT_FLAG_ROTFACE_VALVE))); + if ((PutricideEventProgress & PUTRICIDE_EVENT_FLAG_FESTERGUT_VALVE) && (PutricideEventProgress & PUTRICIDE_EVENT_FLAG_ROTFACE_VALVE)) { - PutricideEventProgress &= ~PUTRICIDE_EVENT_FLAG_TRAP_INPROGRESS; - HandleGameObject(PutricideCollisionGUID, ((PutricideEventProgress & PUTRICIDE_EVENT_FLAG_FESTERGUT_VALVE) && (PutricideEventProgress & PUTRICIDE_EVENT_FLAG_ROTFACE_VALVE))); - if ((PutricideEventProgress & PUTRICIDE_EVENT_FLAG_FESTERGUT_VALVE) && (PutricideEventProgress & PUTRICIDE_EVENT_FLAG_ROTFACE_VALVE)) - { - for (uint8 i=0; i<2; ++i) - if (GameObject* go = instance->GetGameObject(PutricideGateGUIDs[i])) - go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); - } - else - { - HandleGameObject(PutricideGateGUIDs[0], !(PutricideEventProgress & PUTRICIDE_EVENT_FLAG_FESTERGUT_VALVE)); - HandleGameObject(PutricideGateGUIDs[1], !(PutricideEventProgress & PUTRICIDE_EVENT_FLAG_ROTFACE_VALVE)); - } - SaveToDB(); + for (uint8 i = 0; i < 2; ++i) + if (GameObject* go = instance->GetGameObject(PutricideGateGUIDs[i])) + go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); } - else if (data == IN_PROGRESS) + else { - PutricideEventProgress |= PUTRICIDE_EVENT_FLAG_TRAP_INPROGRESS; - HandleGameObject(PutricideCollisionGUID, false); - HandleGameObject(PutricideGateGUIDs[0], false); - HandleGameObject(PutricideGateGUIDs[1], false); - SaveToDB(); + HandleGameObject(PutricideGateGUIDs[0], !(PutricideEventProgress & PUTRICIDE_EVENT_FLAG_FESTERGUT_VALVE)); + HandleGameObject(PutricideGateGUIDs[1], !(PutricideEventProgress & PUTRICIDE_EVENT_FLAG_ROTFACE_VALVE)); } - else if (data == DONE) + SaveToDB(); + } + else if (data == IN_PROGRESS) + { + PutricideEventProgress |= PUTRICIDE_EVENT_FLAG_TRAP_INPROGRESS; + HandleGameObject(PutricideCollisionGUID, false); + HandleGameObject(PutricideGateGUIDs[0], false); + HandleGameObject(PutricideGateGUIDs[1], false); + SaveToDB(); + } + else if (data == DONE) + { + PutricideEventProgress &= ~PUTRICIDE_EVENT_FLAG_TRAP_INPROGRESS; + PutricideEventProgress |= PUTRICIDE_EVENT_FLAG_TRAP_FINISHED; + HandleGameObject(PutricideEnteranceDoorGUID, true); + HandleGameObject(PutricideCollisionGUID, ((PutricideEventProgress & PUTRICIDE_EVENT_FLAG_FESTERGUT_VALVE) && (PutricideEventProgress & PUTRICIDE_EVENT_FLAG_ROTFACE_VALVE))); + if ((PutricideEventProgress & PUTRICIDE_EVENT_FLAG_FESTERGUT_VALVE) && (PutricideEventProgress & PUTRICIDE_EVENT_FLAG_ROTFACE_VALVE)) { - PutricideEventProgress &= ~PUTRICIDE_EVENT_FLAG_TRAP_INPROGRESS; - PutricideEventProgress |= PUTRICIDE_EVENT_FLAG_TRAP_FINISHED; - HandleGameObject(PutricideEnteranceDoorGUID, true); - HandleGameObject(PutricideCollisionGUID, ((PutricideEventProgress & PUTRICIDE_EVENT_FLAG_FESTERGUT_VALVE) && (PutricideEventProgress & PUTRICIDE_EVENT_FLAG_ROTFACE_VALVE))); - if ((PutricideEventProgress & PUTRICIDE_EVENT_FLAG_FESTERGUT_VALVE) && (PutricideEventProgress & PUTRICIDE_EVENT_FLAG_ROTFACE_VALVE)) - { - for (uint8 i=0; i<2; ++i) - if (GameObject* go = instance->GetGameObject(PutricideGateGUIDs[i])) - go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); - } - else - { - HandleGameObject(PutricideGateGUIDs[0], !(PutricideEventProgress & PUTRICIDE_EVENT_FLAG_FESTERGUT_VALVE)); - HandleGameObject(PutricideGateGUIDs[1], !(PutricideEventProgress & PUTRICIDE_EVENT_FLAG_ROTFACE_VALVE)); - } - SaveToDB(); + for (uint8 i = 0; i < 2; ++i) + if (GameObject* go = instance->GetGameObject(PutricideGateGUIDs[i])) + go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); } - return; - case DATA_BONED_ACHIEVEMENT: - IsBonedEligible = !!data; - break; - case DATA_OOZE_DANCE_ACHIEVEMENT: - IsOozeDanceEligible = !!data; - break; - case DATA_NAUSEA_ACHIEVEMENT: - IsNauseaEligible = !!data; - break; - case DATA_ORB_WHISPERER_ACHIEVEMENT: - IsOrbWhispererEligible = !!data; - break; - case DATA_SINDRAGOSA_FROSTWYRMS: - FrostwyrmGUIDs.insert(data); - break; - case DATA_SPINESTALKER: - SpinestalkerTrash.insert(data); - break; - case DATA_RIMEFANG: - RimefangTrash.insert(data); - break; - case DATA_COLDFLAME_JETS: - ColdflameJetsState = data; - if (ColdflameJetsState == DONE) - SaveToDB(); - break; - case DATA_BLOOD_QUICKENING_STATE: + else + { + HandleGameObject(PutricideGateGUIDs[0], !(PutricideEventProgress & PUTRICIDE_EVENT_FLAG_FESTERGUT_VALVE)); + HandleGameObject(PutricideGateGUIDs[1], !(PutricideEventProgress & PUTRICIDE_EVENT_FLAG_ROTFACE_VALVE)); + } + SaveToDB(); + } + return; + case DATA_BONED_ACHIEVEMENT: + IsBonedEligible = !!data; + break; + case DATA_OOZE_DANCE_ACHIEVEMENT: + IsOozeDanceEligible = !!data; + break; + case DATA_NAUSEA_ACHIEVEMENT: + IsNauseaEligible = !!data; + break; + case DATA_ORB_WHISPERER_ACHIEVEMENT: + IsOrbWhispererEligible = !!data; + break; + case DATA_SINDRAGOSA_FROSTWYRMS: + FrostwyrmGUIDs.insert(data); + break; + case DATA_SPINESTALKER: + SpinestalkerTrash.insert(data); + break; + case DATA_RIMEFANG: + RimefangTrash.insert(data); + break; + case DATA_COLDFLAME_JETS: + ColdflameJetsState = data; + if (ColdflameJetsState == DONE) + SaveToDB(); + break; + case DATA_BLOOD_QUICKENING_STATE: { if (data == IN_PROGRESS && BloodQuickeningState != NOT_STARTED) break; @@ -1365,7 +1376,7 @@ class instance_icecrown_citadel : public InstanceMapScript SaveToDB(); break; } - case DATA_BPC_TRASH_DIED: + case DATA_BPC_TRASH_DIED: { if (++BloodPrinceTrashCount >= 4) { @@ -1375,336 +1386,337 @@ class instance_icecrown_citadel : public InstanceMapScript SaveToDB(); break; } - default: - break; - } + default: + break; + } + } + + bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* /*source*/, Unit const* /*target*/, uint32 /*miscvalue1*/) + { + switch (criteria_id) + { + case CRITERIA_BONED_10N: + case CRITERIA_BONED_25N: + case CRITERIA_BONED_10H: + case CRITERIA_BONED_25H: + return IsBonedEligible; + case CRITERIA_DANCES_WITH_OOZES_10N: + case CRITERIA_DANCES_WITH_OOZES_25N: + case CRITERIA_DANCES_WITH_OOZES_10H: + case CRITERIA_DANCES_WITH_OOZES_25H: + return IsOozeDanceEligible; + case CRITERIA_NAUSEA_10N: + case CRITERIA_NAUSEA_25N: + case CRITERIA_NAUSEA_10H: + case CRITERIA_NAUSEA_25H: + return IsNauseaEligible; + case CRITERIA_ORB_WHISPERER_10N: + case CRITERIA_ORB_WHISPERER_25N: + case CRITERIA_ORB_WHISPERER_10H: + case CRITERIA_ORB_WHISPERER_25H: + return IsOrbWhispererEligible; + // Only one criteria for both modes, need to do it like this + case CRITERIA_KILL_LANA_THEL_10M: + return instance->ToInstanceMap()->GetMaxPlayers() == 10; + case CRITERIA_KILL_LANA_THEL_25M: + return instance->ToInstanceMap()->GetMaxPlayers() == 25; + default: + break; } - bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* /*source*/, Unit const* /*target*/, uint32 /*miscvalue1*/) - { - switch (criteria_id) - { - case CRITERIA_BONED_10N: - case CRITERIA_BONED_25N: - case CRITERIA_BONED_10H: - case CRITERIA_BONED_25H: - return IsBonedEligible; - case CRITERIA_DANCES_WITH_OOZES_10N: - case CRITERIA_DANCES_WITH_OOZES_25N: - case CRITERIA_DANCES_WITH_OOZES_10H: - case CRITERIA_DANCES_WITH_OOZES_25H: - return IsOozeDanceEligible; - case CRITERIA_NAUSEA_10N: - case CRITERIA_NAUSEA_25N: - case CRITERIA_NAUSEA_10H: - case CRITERIA_NAUSEA_25H: - return IsNauseaEligible; - case CRITERIA_ORB_WHISPERER_10N: - case CRITERIA_ORB_WHISPERER_25N: - case CRITERIA_ORB_WHISPERER_10H: - case CRITERIA_ORB_WHISPERER_25H: - return IsOrbWhispererEligible; - // Only one criteria for both modes, need to do it like this - case CRITERIA_KILL_LANA_THEL_10M: - return instance->ToInstanceMap()->GetMaxPlayers() == 10; - case CRITERIA_KILL_LANA_THEL_25M: - return instance->ToInstanceMap()->GetMaxPlayers() == 25; - default: - break; - } + return false; + } + bool CheckRequiredBosses(uint32 bossId, Player const* /*player*/) const + { + switch (bossId) + { + case DATA_THE_LICH_KING: + if (!CheckPlagueworks(bossId)) + return false; + if (!CheckCrimsonHalls(bossId)) + return false; + if (!CheckFrostwingHalls(bossId)) + return false; + break; + case DATA_SINDRAGOSA: + case DATA_VALITHRIA_DREAMWALKER: + if (!CheckFrostwingHalls(bossId)) + return false; + break; + case DATA_BLOOD_QUEEN_LANA_THEL: + case DATA_BLOOD_PRINCE_COUNCIL: + if (!CheckCrimsonHalls(bossId)) + return false; + break; + case DATA_FESTERGUT: + case DATA_ROTFACE: + case DATA_PROFESSOR_PUTRICIDE: + if (!CheckPlagueworks(bossId)) + return false; + break; + default: + break; + } + + if (!CheckLowerSpire(bossId)) return false; - } - bool CheckRequiredBosses(uint32 bossId, Player const* /*player*/) const + return true; + } + + bool CheckPlagueworks(uint32 bossId) const + { + switch (bossId) { - switch (bossId) - { - case DATA_THE_LICH_KING: - if (!CheckPlagueworks(bossId)) - return false; - if (!CheckCrimsonHalls(bossId)) - return false; - if (!CheckFrostwingHalls(bossId)) - return false; - break; - case DATA_SINDRAGOSA: - case DATA_VALITHRIA_DREAMWALKER: - if (!CheckFrostwingHalls(bossId)) - return false; - break; - case DATA_BLOOD_QUEEN_LANA_THEL: - case DATA_BLOOD_PRINCE_COUNCIL: - if (!CheckCrimsonHalls(bossId)) - return false; - break; - case DATA_FESTERGUT: - case DATA_ROTFACE: - case DATA_PROFESSOR_PUTRICIDE: - if (!CheckPlagueworks(bossId)) - return false; - break; - default: - break; - } - - if (!CheckLowerSpire(bossId)) - return false; - - return true; - } - - bool CheckPlagueworks(uint32 bossId) const - { - switch (bossId) - { - case DATA_THE_LICH_KING: - if (GetBossState(DATA_PROFESSOR_PUTRICIDE) != DONE) - { - return false; - } - [[fallthrough]]; - case DATA_PROFESSOR_PUTRICIDE: - if (GetBossState(DATA_FESTERGUT) != DONE || GetBossState(DATA_ROTFACE) != DONE) - return false; - break; - default: - break; - } - - return true; - } - - bool CheckCrimsonHalls(uint32 bossId) const - { - switch (bossId) - { - case DATA_THE_LICH_KING: - if (GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) != DONE) - { - return false; - } - [[fallthrough]]; - case DATA_BLOOD_QUEEN_LANA_THEL: - if (GetBossState(DATA_BLOOD_PRINCE_COUNCIL) != DONE) - return false; - break; - default: - break; - } - - return true; - } - - bool CheckFrostwingHalls(uint32 bossId) const - { - switch (bossId) - { - case DATA_THE_LICH_KING: - if (GetBossState(DATA_SINDRAGOSA) != DONE) - { - return false; - } - [[fallthrough]]; - case DATA_SINDRAGOSA: - if (GetBossState(DATA_VALITHRIA_DREAMWALKER) != DONE) - { - return false; - } - if (GetBossState(DATA_SINDRAGOSA_GAUNTLET) != DONE) - { - return false; - } - break; - default: - break; - } - - return true; - } - - bool CheckLowerSpire(uint32 bossId) const - { - switch (bossId) - { - case DATA_THE_LICH_KING: - case DATA_SINDRAGOSA: - case DATA_BLOOD_QUEEN_LANA_THEL: - case DATA_PROFESSOR_PUTRICIDE: - case DATA_VALITHRIA_DREAMWALKER: - case DATA_BLOOD_PRINCE_COUNCIL: - case DATA_ROTFACE: - case DATA_FESTERGUT: - if (GetBossState(DATA_DEATHBRINGER_SAURFANG) != DONE) - { - return false; - } - [[fallthrough]]; - case DATA_DEATHBRINGER_SAURFANG: - if (GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != DONE) - { - return false; - } - [[fallthrough]]; - case DATA_ICECROWN_GUNSHIP_BATTLE: - if (GetBossState(DATA_LADY_DEATHWHISPER) != DONE) - { - return false; - } - [[fallthrough]]; - case DATA_LADY_DEATHWHISPER: - if (GetBossState(DATA_LORD_MARROWGAR) != DONE) - { - return false; - } - [[fallthrough]]; - case DATA_LORD_MARROWGAR: - default: - break; - } - - return true; - } - - void CheckLichKingAvailability() - { - if (GetBossState(DATA_PROFESSOR_PUTRICIDE) == DONE && GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) == DONE && GetBossState(DATA_SINDRAGOSA) == DONE) - { - if (GameObject* teleporter = instance->GetGameObject(TheLichKingTeleportGUID)) + case DATA_THE_LICH_KING: + if (GetBossState(DATA_PROFESSOR_PUTRICIDE) != DONE) { - teleporter->SetGoState(GO_STATE_ACTIVE); - - std::list stalkers; - GetCreatureListWithEntryInGrid(stalkers, teleporter, NPC_INVISIBLE_STALKER, 100.0f); - if (stalkers.empty()) - return; - - stalkers.sort(acore::ObjectDistanceOrderPred(teleporter)); - stalkers.front()->CastSpell((Unit*)NULL, SPELL_ARTHAS_TELEPORTER_CEREMONY, false); - stalkers.pop_front(); - for (std::list::iterator itr = stalkers.begin(); itr != stalkers.end(); ++itr) - (*itr)->AI()->Reset(); + return false; } - } + [[fallthrough]]; + case DATA_PROFESSOR_PUTRICIDE: + if (GetBossState(DATA_FESTERGUT) != DONE || GetBossState(DATA_ROTFACE) != DONE) + return false; + break; + default: + break; } - std::string GetSaveData() + return true; + } + + bool CheckCrimsonHalls(uint32 bossId) const + { + switch (bossId) { - OUT_SAVE_INST_DATA; - - std::ostringstream saveStream; - saveStream << "I C " << GetBossSaveData() << HeroicAttempts << ' ' - << ColdflameJetsState << ' ' << BloodQuickeningState << ' ' << BloodQuickeningMinutes << ' ' << WeeklyQuestId10 << ' ' << PutricideEventProgress << ' ' - << uint32(LichKingHeroicAvailable ? 1 : 0) << ' ' << BloodPrinceTrashCount << ' ' << uint32(IsBuffAvailable ? 1 : 0); - - - OUT_SAVE_INST_DATA_COMPLETE; - return saveStream.str(); - } - - void Load(const char* str) - { - 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 == 'I' && dataHead2 == 'C') - { - for (uint32 i = 0; i < MAX_ENCOUNTERS; ++i) + case DATA_THE_LICH_KING: + if (GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) != DONE) { - uint32 tmpState; - loadStream >> tmpState; - if (tmpState == IN_PROGRESS || tmpState == FAIL || tmpState > SPECIAL) - tmpState = NOT_STARTED; - SetBossState(i, EncounterState(tmpState)); + return false; } - - loadStream >> HeroicAttempts; - - uint32 temp = 0; - loadStream >> temp; - ColdflameJetsState = temp ? DONE : NOT_STARTED; - - loadStream >> BloodQuickeningState; - loadStream >> BloodQuickeningMinutes; - if (BloodQuickeningState == IN_PROGRESS) - { - Events.ScheduleEvent(EVENT_UPDATE_EXECUTION_TIME, 60000); - DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 1); - DoUpdateWorldState(WORLDSTATE_EXECUTION_TIME, BloodQuickeningMinutes); - } - - loadStream >> WeeklyQuestId10; - loadStream >> PutricideEventProgress; PutricideEventProgress &= ~PUTRICIDE_EVENT_FLAG_TRAP_INPROGRESS; - loadStream >> temp; - LichKingHeroicAvailable = !!temp; - loadStream >> BloodPrinceTrashCount; - loadStream >> temp; - SetData(DATA_BUFF_AVAILABLE, !!temp); - } - else - OUT_LOAD_INST_DATA_FAIL; - - OUT_LOAD_INST_DATA_COMPLETE; + [[fallthrough]]; + case DATA_BLOOD_QUEEN_LANA_THEL: + if (GetBossState(DATA_BLOOD_PRINCE_COUNCIL) != DONE) + return false; + break; + default: + break; } - void Update(uint32 diff) + return true; + } + + bool CheckFrostwingHalls(uint32 bossId) const + { + switch (bossId) { - // Xinef: A Feast of Souls (24547) whispers - if (LichKingRandomWhisperTimer <= diff) - { - LichKingRandomWhisperTimer = urand(100, 300)*IN_MILLISECONDS; - Map::PlayerList const &players = instance->GetPlayers(); - if (!players.isEmpty()) - if (Player* player = players.begin()->GetSource()) - if (player->GetQuestStatus(QUEST_A_FEAST_OF_SOULS) == QUEST_STATUS_INCOMPLETE) - { - uint8 id = urand(0, 15); - std::string const& text = sCreatureTextMgr->GetLocalizedChatString(NPC_THE_LICH_KING_LH, 0, 20 + id, 0, LOCALE_enUS); - WorldPacket data; - ChatHandler::BuildChatPacket(data, CHAT_MSG_MONSTER_WHISPER, LANG_UNIVERSAL, 0, player->GetGUID(), text, CHAT_TAG_NONE, "The Lich King"); - player->SendPlaySound(17235 + id, true); - player->SendDirectMessage(&data); - } - } - else - LichKingRandomWhisperTimer -= diff; - - if (DarkwhisperElevatorTimer <= diff) - { - DarkwhisperElevatorTimer = 3000; - if (GetBossState(DATA_LADY_DEATHWHISPER) == DONE) - if (GameObject* elevator = instance->GetGameObject(LadyDeathwisperElevatorGUID)) - if (StaticTransport* trans = elevator->ToStaticTransport()) - { - if (trans->GetGoState() == GO_STATE_READY && trans->GetPathProgress() == 0) - trans->SetGoState(GO_STATE_ACTIVE); - else if (trans->GetGoState() == GO_STATE_ACTIVE && trans->GetPathProgress() == trans->GetPauseTime()) - trans->SetGoState(GO_STATE_READY); - } - } - else - DarkwhisperElevatorTimer -= diff; - - if (BloodQuickeningState != IN_PROGRESS && GetBossState(DATA_THE_LICH_KING) != IN_PROGRESS && GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != FAIL) - return; - - Events.Update(diff); - - while (uint32 eventId = Events.ExecuteEvent()) - { - switch (eventId) + case DATA_THE_LICH_KING: + if (GetBossState(DATA_SINDRAGOSA) != DONE) { - case EVENT_UPDATE_EXECUTION_TIME: + return false; + } + [[fallthrough]]; + case DATA_SINDRAGOSA: + if (GetBossState(DATA_VALITHRIA_DREAMWALKER) != DONE) + { + return false; + } + if (GetBossState(DATA_SINDRAGOSA_GAUNTLET) != DONE) + { + return false; + } + break; + default: + break; + } + + return true; + } + + bool CheckLowerSpire(uint32 bossId) const + { + switch (bossId) + { + case DATA_THE_LICH_KING: + case DATA_SINDRAGOSA: + case DATA_BLOOD_QUEEN_LANA_THEL: + case DATA_PROFESSOR_PUTRICIDE: + case DATA_VALITHRIA_DREAMWALKER: + case DATA_BLOOD_PRINCE_COUNCIL: + case DATA_ROTFACE: + case DATA_FESTERGUT: + if (GetBossState(DATA_DEATHBRINGER_SAURFANG) != DONE) + { + return false; + } + [[fallthrough]]; + case DATA_DEATHBRINGER_SAURFANG: + if (GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != DONE) + { + return false; + } + [[fallthrough]]; + case DATA_ICECROWN_GUNSHIP_BATTLE: + if (GetBossState(DATA_LADY_DEATHWHISPER) != DONE) + { + return false; + } + [[fallthrough]]; + case DATA_LADY_DEATHWHISPER: + if (GetBossState(DATA_LORD_MARROWGAR) != DONE) + { + return false; + } + [[fallthrough]]; + case DATA_LORD_MARROWGAR: + default: + break; + } + + return true; + } + + void CheckLichKingAvailability() + { + if (GetBossState(DATA_PROFESSOR_PUTRICIDE) == DONE && GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) == DONE && GetBossState(DATA_SINDRAGOSA) == DONE) + { + if (GameObject* teleporter = instance->GetGameObject(TheLichKingTeleportGUID)) + { + teleporter->SetGoState(GO_STATE_ACTIVE); + + std::list stalkers; + GetCreatureListWithEntryInGrid(stalkers, teleporter, NPC_INVISIBLE_STALKER, 100.0f); + if (stalkers.empty()) + return; + + stalkers.sort(acore::ObjectDistanceOrderPred(teleporter)); + stalkers.front()->CastSpell((Unit*)NULL, SPELL_ARTHAS_TELEPORTER_CEREMONY, false); + stalkers.pop_front(); + for (std::list::iterator itr = stalkers.begin(); itr != stalkers.end(); ++itr) + (*itr)->AI()->Reset(); + } + } + } + + std::string GetSaveData() + { + OUT_SAVE_INST_DATA; + + std::ostringstream saveStream; + saveStream << "I C " << GetBossSaveData() << HeroicAttempts << ' ' + << ColdflameJetsState << ' ' << BloodQuickeningState << ' ' << BloodQuickeningMinutes << ' ' << WeeklyQuestId10 << ' ' << PutricideEventProgress << ' ' + << uint32(LichKingHeroicAvailable ? 1 : 0) << ' ' << BloodPrinceTrashCount << ' ' << uint32(IsBuffAvailable ? 1 : 0); + + + OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); + } + + void Load(const char* str) + { + 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 == 'I' && dataHead2 == 'C') + { + for (uint32 i = 0; i < MAX_ENCOUNTERS; ++i) + { + uint32 tmpState; + loadStream >> tmpState; + if (tmpState == IN_PROGRESS || tmpState == FAIL || tmpState > SPECIAL) + tmpState = NOT_STARTED; + SetBossState(i, EncounterState(tmpState)); + } + + loadStream >> HeroicAttempts; + + uint32 temp = 0; + loadStream >> temp; + ColdflameJetsState = temp ? DONE : NOT_STARTED; + + loadStream >> BloodQuickeningState; + loadStream >> BloodQuickeningMinutes; + if (BloodQuickeningState == IN_PROGRESS) + { + Events.ScheduleEvent(EVENT_UPDATE_EXECUTION_TIME, 60000); + DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 1); + DoUpdateWorldState(WORLDSTATE_EXECUTION_TIME, BloodQuickeningMinutes); + } + + loadStream >> WeeklyQuestId10; + loadStream >> PutricideEventProgress; + PutricideEventProgress &= ~PUTRICIDE_EVENT_FLAG_TRAP_INPROGRESS; + loadStream >> temp; + LichKingHeroicAvailable = !!temp; + loadStream >> BloodPrinceTrashCount; + loadStream >> temp; + SetData(DATA_BUFF_AVAILABLE, !!temp); + } + else + OUT_LOAD_INST_DATA_FAIL; + + OUT_LOAD_INST_DATA_COMPLETE; + } + + void Update(uint32 diff) + { + // Xinef: A Feast of Souls (24547) whispers + if (LichKingRandomWhisperTimer <= diff) + { + LichKingRandomWhisperTimer = urand(100, 300) * IN_MILLISECONDS; + Map::PlayerList const& players = instance->GetPlayers(); + if (!players.isEmpty()) + if (Player* player = players.begin()->GetSource()) + if (player->GetQuestStatus(QUEST_A_FEAST_OF_SOULS) == QUEST_STATUS_INCOMPLETE) + { + uint8 id = urand(0, 15); + std::string const& text = sCreatureTextMgr->GetLocalizedChatString(NPC_THE_LICH_KING_LH, 0, 20 + id, 0, LOCALE_enUS); + WorldPacket data; + ChatHandler::BuildChatPacket(data, CHAT_MSG_MONSTER_WHISPER, LANG_UNIVERSAL, 0, player->GetGUID(), text, CHAT_TAG_NONE, "The Lich King"); + player->SendPlaySound(17235 + id, true); + player->SendDirectMessage(&data); + } + } + else + LichKingRandomWhisperTimer -= diff; + + if (DarkwhisperElevatorTimer <= diff) + { + DarkwhisperElevatorTimer = 3000; + if (GetBossState(DATA_LADY_DEATHWHISPER) == DONE) + if (GameObject* elevator = instance->GetGameObject(LadyDeathwisperElevatorGUID)) + if (StaticTransport* trans = elevator->ToStaticTransport()) + { + if (trans->GetGoState() == GO_STATE_READY && trans->GetPathProgress() == 0) + trans->SetGoState(GO_STATE_ACTIVE); + else if (trans->GetGoState() == GO_STATE_ACTIVE && trans->GetPathProgress() == trans->GetPauseTime()) + trans->SetGoState(GO_STATE_READY); + } + } + else + DarkwhisperElevatorTimer -= diff; + + if (BloodQuickeningState != IN_PROGRESS && GetBossState(DATA_THE_LICH_KING) != IN_PROGRESS && GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != FAIL) + return; + + Events.Update(diff); + + while (uint32 eventId = Events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_UPDATE_EXECUTION_TIME: { --BloodQuickeningMinutes; if (BloodQuickeningMinutes) @@ -1723,7 +1735,7 @@ class instance_icecrown_citadel : public InstanceMapScript SaveToDB(); break; } - case EVENT_QUAKE_SHATTER: + case EVENT_QUAKE_SHATTER: { if (GameObject* platform = instance->GetGameObject(ArthasPlatformGUID)) platform->SetDestructibleState(GO_DESTRUCTIBLE_DAMAGED); @@ -1737,210 +1749,210 @@ class instance_icecrown_citadel : public InstanceMapScript theLichKing->AI()->DoAction(ACTION_RESTORE_LIGHT); break; } - case EVENT_REBUILD_PLATFORM: - if (GameObject* platform = instance->GetGameObject(ArthasPlatformGUID)) - platform->SetDestructibleState(GO_DESTRUCTIBLE_REBUILDING, NULL, true); - if (GameObject* edge = instance->GetGameObject(FrozenThroneEdgeGUID)) - edge->SetGoState(GO_STATE_READY); - if (GameObject* wind = instance->GetGameObject(FrozenThroneWindGUID)) - wind->SetGoState(GO_STATE_ACTIVE); - break; - case EVENT_RESPAWN_GUNSHIP: - SpawnGunship(); - break; - default: - break; - } - } - } - - void ProcessEvent(WorldObject* source, uint32 eventId) - { - switch (eventId) - { - case EVENT_ENEMY_GUNSHIP_DESPAWN: - if (GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) == DONE) - { - if (GameObject* go = source->ToGameObject()) - if (MotionTransport* transport = go->ToMotionTransport()) - transport->UnloadNonStaticPassengers(); - source->AddObjectToRemoveList(); - } - break; - case EVENT_ENEMY_GUNSHIP_COMBAT: - if (Creature* captain = source->FindNearestCreature(TeamIdInInstance == TEAM_HORDE ? NPC_IGB_HIGH_OVERLORD_SAURFANG : NPC_IGB_MURADIN_BRONZEBEARD, 200.0f)) - { - captain->AI()->DoAction(ACTION_ENEMY_GUNSHIP_TALK); - } - [[fallthrough]]; - case EVENT_PLAYERS_GUNSHIP_SPAWN: - case EVENT_PLAYERS_GUNSHIP_COMBAT: - if (GameObject* go = source->ToGameObject()) - if (MotionTransport* transport = go->ToMotionTransport()) - transport->EnableMovement(false); - break; - case EVENT_PLAYERS_GUNSHIP_SAURFANG: - if (GameObject* go = source->ToGameObject()) - if (MotionTransport* transport = go->ToMotionTransport()) - { - transport->setActive(false); - transport->EnableMovement(false); - //After movement is stopped remove the backpack - RemoveBackPack(); - } - if (Creature* captain = source->FindNearestCreature(TeamIdInInstance == TEAM_HORDE ? NPC_IGB_HIGH_OVERLORD_SAURFANG : NPC_IGB_MURADIN_BRONZEBEARD, 200.0f)) - captain->AI()->DoAction(ACTION_EXIT_SHIP); - break; - - case EVENT_QUAKE: - if (GameObject* warning = instance->GetGameObject(FrozenThroneWarningGUID)) - warning->SetGoState(GO_STATE_ACTIVE); - Events.ScheduleEvent(EVENT_QUAKE_SHATTER, 5000); - break; - case EVENT_SECOND_REMORSELESS_WINTER: + case EVENT_REBUILD_PLATFORM: if (GameObject* platform = instance->GetGameObject(ArthasPlatformGUID)) - { - platform->SetDestructibleState(GO_DESTRUCTIBLE_DESTROYED); - Events.ScheduleEvent(EVENT_REBUILD_PLATFORM, 1500); - } + platform->SetDestructibleState(GO_DESTRUCTIBLE_REBUILDING, NULL, true); + if (GameObject* edge = instance->GetGameObject(FrozenThroneEdgeGUID)) + edge->SetGoState(GO_STATE_READY); + if (GameObject* wind = instance->GetGameObject(FrozenThroneWindGUID)) + wind->SetGoState(GO_STATE_ACTIVE); break; - case EVENT_TELEPORT_TO_FROSMOURNE: // Harvest Soul (normal mode) - if (Creature* terenas = instance->SummonCreature(NPC_TERENAS_MENETHIL_FROSTMOURNE, TerenasSpawn, NULL, 65000)) - { - terenas->AI()->DoAction(ACTION_FROSTMOURNE_INTRO); - std::list triggers; - GetCreatureListWithEntryInGrid(triggers, terenas, NPC_WORLD_TRIGGER_INFINITE_AOI, 100.0f); - if (!triggers.empty()) - { - triggers.sort(acore::ObjectDistanceOrderPred(terenas, false)); - Unit* visual = triggers.front(); - visual->CastSpell(visual, SPELL_FROSTMOURNE_TELEPORT_VISUAL, true); - } - - if (Creature* warden = instance->SummonCreature(NPC_SPIRIT_WARDEN, SpiritWardenSpawn, NULL, 65000)) - { - terenas->AI()->AttackStart(warden); - warden->AddThreat(terenas, 300000.0f); - } - } + case EVENT_RESPAWN_GUNSHIP: + SpawnGunship(); break; - case EVENT_FESTERGUT_VALVE_USED: - if (!(PutricideEventProgress & PUTRICIDE_EVENT_FLAG_FESTERGUT_VALVE)) - { - PutricideEventProgress |= PUTRICIDE_EVENT_FLAG_FESTERGUT_VALVE; - if (PutricideEventProgress & PUTRICIDE_EVENT_FLAG_ROTFACE_VALVE) - { - HandleGameObject(PutricideCollisionGUID, true); - for (uint8 i=0; i<2; ++i) - if (GameObject* go = instance->GetGameObject(PutricideGateGUIDs[i])) - go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); - } - else - HandleGameObject(PutricideGateGUIDs[0], false); - HandleGameObject(PutricidePipeGUIDs[0], true); - SaveToDB(); - } - break; - case EVENT_ROTFACE_VALVE_USED: - if (!(PutricideEventProgress & PUTRICIDE_EVENT_FLAG_ROTFACE_VALVE)) - { - PutricideEventProgress |= PUTRICIDE_EVENT_FLAG_ROTFACE_VALVE; - if (PutricideEventProgress & PUTRICIDE_EVENT_FLAG_FESTERGUT_VALVE) - { - HandleGameObject(PutricideCollisionGUID, true); - for (uint8 i=0; i<2; ++i) - if (GameObject* go = instance->GetGameObject(PutricideGateGUIDs[i])) - go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); - } - else - HandleGameObject(PutricideGateGUIDs[1], false); - HandleGameObject(PutricidePipeGUIDs[1], true); - SaveToDB(); - } + default: break; } } - - protected: - // pussywizard: - bool IsBuffAvailable; - uint32 WeeklyQuestId10; // contains id from 10man for any difficulty (for simplicity) - uint64 WeeklyQuestNpcGUID[WeeklyNPCs]; - uint64 PutricideEnteranceDoorGUID; - uint32 PutricideEventProgress; - uint64 GasReleaseValveGUID; - uint64 OozeReleaseValveGUID; - bool LichKingHeroicAvailable; - uint32 LichKingRandomWhisperTimer; - uint32 DarkwhisperElevatorTimer; - uint64 ScourgeTransporterFirstGUID; - - EventMap Events; - uint64 LadyDeathwhisperGUID; - uint64 LadyDeathwisperElevatorGUID; - uint64 GunshipGUID; - uint64 EnemyGunshipGUID; - uint64 GunshipArmoryGUID; - uint64 DeathbringerSaurfangGUID; - uint64 DeathbringerSaurfangDoorGUID; - uint64 DeathbringerSaurfangEventGUID; // Muradin Bronzebeard or High Overlord Saurfang - uint64 DeathbringersCacheGUID; - uint64 SaurfangTeleportGUID; - uint64 PlagueSigilGUID; - uint64 BloodwingSigilGUID; - uint64 FrostwingSigilGUID; - uint64 PutricidePipeGUIDs[2]; - uint64 PutricideGateGUIDs[2]; - uint64 PutricideCollisionGUID; - uint64 FestergutGUID; - uint64 RotfaceGUID; - uint64 ProfessorPutricideGUID; - uint64 PutricideTableGUID; - uint64 BloodCouncilGUIDs[3]; - uint64 BloodCouncilControllerGUID; - uint64 BloodQueenLanaThelGUID; - uint64 CrokScourgebaneGUID; - uint64 CrokCaptainGUIDs[4]; - uint64 SisterSvalnaGUID; - uint64 ValithriaDreamwalkerGUID; - uint64 ValithriaLichKingGUID; - uint64 ValithriaTriggerGUID; - uint64 PutricadeTrapGUID; - uint64 SindragosaGauntletGUID; - uint64 SindragosaGUID; - uint64 SpinestalkerGUID; - uint64 RimefangGUID; - uint64 TheLichKingTeleportGUID; - uint64 TheLichKingGUID; - uint64 HighlordTirionFordringGUID; - uint64 TerenasMenethilGUID; - uint64 ArthasPlatformGUID; - uint64 ArthasPrecipiceGUID; - uint64 FrozenThroneEdgeGUID; - uint64 FrozenThroneWindGUID; - uint64 FrozenThroneWarningGUID; - uint64 FrozenBolvarGUID; - uint64 PillarsChainedGUID; - uint64 PillarsUnchainedGUID; - TeamId TeamIdInInstance; - uint32 ColdflameJetsState; - std::set FrostwyrmGUIDs; - std::set SpinestalkerTrash; - std::set RimefangTrash; - uint32 BloodQuickeningState; - uint32 HeroicAttempts; - uint16 BloodQuickeningMinutes; - uint32 BloodPrinceTrashCount; - bool IsBonedEligible; - bool IsOozeDanceEligible; - bool IsNauseaEligible; - bool IsOrbWhispererEligible; - }; - - InstanceScript* GetInstanceScript(InstanceMap* map) const - { - return new instance_icecrown_citadel_InstanceMapScript(map); } + + void ProcessEvent(WorldObject* source, uint32 eventId) + { + switch (eventId) + { + case EVENT_ENEMY_GUNSHIP_DESPAWN: + if (GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) == DONE) + { + if (GameObject* go = source->ToGameObject()) + if (MotionTransport* transport = go->ToMotionTransport()) + transport->UnloadNonStaticPassengers(); + source->AddObjectToRemoveList(); + } + break; + case EVENT_ENEMY_GUNSHIP_COMBAT: + if (Creature* captain = source->FindNearestCreature(TeamIdInInstance == TEAM_HORDE ? NPC_IGB_HIGH_OVERLORD_SAURFANG : NPC_IGB_MURADIN_BRONZEBEARD, 200.0f)) + { + captain->AI()->DoAction(ACTION_ENEMY_GUNSHIP_TALK); + } + [[fallthrough]]; + case EVENT_PLAYERS_GUNSHIP_SPAWN: + case EVENT_PLAYERS_GUNSHIP_COMBAT: + if (GameObject* go = source->ToGameObject()) + if (MotionTransport* transport = go->ToMotionTransport()) + transport->EnableMovement(false); + break; + case EVENT_PLAYERS_GUNSHIP_SAURFANG: + if (GameObject* go = source->ToGameObject()) + if (MotionTransport* transport = go->ToMotionTransport()) + { + transport->setActive(false); + transport->EnableMovement(false); + //After movement is stopped remove the backpack + RemoveBackPack(); + } + if (Creature* captain = source->FindNearestCreature(TeamIdInInstance == TEAM_HORDE ? NPC_IGB_HIGH_OVERLORD_SAURFANG : NPC_IGB_MURADIN_BRONZEBEARD, 200.0f)) + captain->AI()->DoAction(ACTION_EXIT_SHIP); + break; + + case EVENT_QUAKE: + if (GameObject* warning = instance->GetGameObject(FrozenThroneWarningGUID)) + warning->SetGoState(GO_STATE_ACTIVE); + Events.ScheduleEvent(EVENT_QUAKE_SHATTER, 5000); + break; + case EVENT_SECOND_REMORSELESS_WINTER: + if (GameObject* platform = instance->GetGameObject(ArthasPlatformGUID)) + { + platform->SetDestructibleState(GO_DESTRUCTIBLE_DESTROYED); + Events.ScheduleEvent(EVENT_REBUILD_PLATFORM, 1500); + } + break; + case EVENT_TELEPORT_TO_FROSMOURNE: // Harvest Soul (normal mode) + if (Creature* terenas = instance->SummonCreature(NPC_TERENAS_MENETHIL_FROSTMOURNE, TerenasSpawn, NULL, 65000)) + { + terenas->AI()->DoAction(ACTION_FROSTMOURNE_INTRO); + std::list triggers; + GetCreatureListWithEntryInGrid(triggers, terenas, NPC_WORLD_TRIGGER_INFINITE_AOI, 100.0f); + if (!triggers.empty()) + { + triggers.sort(acore::ObjectDistanceOrderPred(terenas, false)); + Unit* visual = triggers.front(); + visual->CastSpell(visual, SPELL_FROSTMOURNE_TELEPORT_VISUAL, true); + } + + if (Creature* warden = instance->SummonCreature(NPC_SPIRIT_WARDEN, SpiritWardenSpawn, NULL, 65000)) + { + terenas->AI()->AttackStart(warden); + warden->AddThreat(terenas, 300000.0f); + } + } + break; + case EVENT_FESTERGUT_VALVE_USED: + if (!(PutricideEventProgress & PUTRICIDE_EVENT_FLAG_FESTERGUT_VALVE)) + { + PutricideEventProgress |= PUTRICIDE_EVENT_FLAG_FESTERGUT_VALVE; + if (PutricideEventProgress & PUTRICIDE_EVENT_FLAG_ROTFACE_VALVE) + { + HandleGameObject(PutricideCollisionGUID, true); + for (uint8 i = 0; i < 2; ++i) + if (GameObject* go = instance->GetGameObject(PutricideGateGUIDs[i])) + go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); + } + else + HandleGameObject(PutricideGateGUIDs[0], false); + HandleGameObject(PutricidePipeGUIDs[0], true); + SaveToDB(); + } + break; + case EVENT_ROTFACE_VALVE_USED: + if (!(PutricideEventProgress & PUTRICIDE_EVENT_FLAG_ROTFACE_VALVE)) + { + PutricideEventProgress |= PUTRICIDE_EVENT_FLAG_ROTFACE_VALVE; + if (PutricideEventProgress & PUTRICIDE_EVENT_FLAG_FESTERGUT_VALVE) + { + HandleGameObject(PutricideCollisionGUID, true); + for (uint8 i = 0; i < 2; ++i) + if (GameObject* go = instance->GetGameObject(PutricideGateGUIDs[i])) + go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); + } + else + HandleGameObject(PutricideGateGUIDs[1], false); + HandleGameObject(PutricidePipeGUIDs[1], true); + SaveToDB(); + } + break; + } + } + + protected: + // pussywizard: + bool IsBuffAvailable; + uint32 WeeklyQuestId10; // contains id from 10man for any difficulty (for simplicity) + uint64 WeeklyQuestNpcGUID[WeeklyNPCs]; + uint64 PutricideEnteranceDoorGUID; + uint32 PutricideEventProgress; + uint64 GasReleaseValveGUID; + uint64 OozeReleaseValveGUID; + bool LichKingHeroicAvailable; + uint32 LichKingRandomWhisperTimer; + uint32 DarkwhisperElevatorTimer; + uint64 ScourgeTransporterFirstGUID; + + EventMap Events; + uint64 LadyDeathwhisperGUID; + uint64 LadyDeathwisperElevatorGUID; + uint64 GunshipGUID; + uint64 EnemyGunshipGUID; + uint64 GunshipArmoryGUID; + uint64 DeathbringerSaurfangGUID; + uint64 DeathbringerSaurfangDoorGUID; + uint64 DeathbringerSaurfangEventGUID; // Muradin Bronzebeard or High Overlord Saurfang + uint64 DeathbringersCacheGUID; + uint64 SaurfangTeleportGUID; + uint64 PlagueSigilGUID; + uint64 BloodwingSigilGUID; + uint64 FrostwingSigilGUID; + uint64 PutricidePipeGUIDs[2]; + uint64 PutricideGateGUIDs[2]; + uint64 PutricideCollisionGUID; + uint64 FestergutGUID; + uint64 RotfaceGUID; + uint64 ProfessorPutricideGUID; + uint64 PutricideTableGUID; + uint64 BloodCouncilGUIDs[3]; + uint64 BloodCouncilControllerGUID; + uint64 BloodQueenLanaThelGUID; + uint64 CrokScourgebaneGUID; + uint64 CrokCaptainGUIDs[4]; + uint64 SisterSvalnaGUID; + uint64 ValithriaDreamwalkerGUID; + uint64 ValithriaLichKingGUID; + uint64 ValithriaTriggerGUID; + uint64 PutricadeTrapGUID; + uint64 SindragosaGauntletGUID; + uint64 SindragosaGUID; + uint64 SpinestalkerGUID; + uint64 RimefangGUID; + uint64 TheLichKingTeleportGUID; + uint64 TheLichKingGUID; + uint64 HighlordTirionFordringGUID; + uint64 TerenasMenethilGUID; + uint64 ArthasPlatformGUID; + uint64 ArthasPrecipiceGUID; + uint64 FrozenThroneEdgeGUID; + uint64 FrozenThroneWindGUID; + uint64 FrozenThroneWarningGUID; + uint64 FrozenBolvarGUID; + uint64 PillarsChainedGUID; + uint64 PillarsUnchainedGUID; + TeamId TeamIdInInstance; + uint32 ColdflameJetsState; + std::set FrostwyrmGUIDs; + std::set SpinestalkerTrash; + std::set RimefangTrash; + uint32 BloodQuickeningState; + uint32 HeroicAttempts; + uint16 BloodQuickeningMinutes; + uint32 BloodPrinceTrashCount; + bool IsBonedEligible; + bool IsOozeDanceEligible; + bool IsNauseaEligible; + bool IsOrbWhispererEligible; + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_icecrown_citadel_InstanceMapScript(map); + } }; void AddSC_instance_icecrown_citadel() diff --git a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp index cf90f0f8f..1345964c3 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp @@ -52,7 +52,7 @@ public: struct boss_anubrekhanAI : public BossAI { - explicit boss_anubrekhanAI(Creature *c) : BossAI(c, BOSS_ANUB), summons(me) + explicit boss_anubrekhanAI(Creature* c) : BossAI(c, BOSS_ANUB), summons(me) { pInstance = c->GetInstanceScript(); sayGreet = false; @@ -132,7 +132,7 @@ public: pInstance->SetData(DATA_IMMORTAL_FAIL, 0); } - void EnterCombat(Unit * who) override + void EnterCombat(Unit* who) override { BossAI::EnterCombat(who); me->CallForHelp(30.0f); // catch helpers @@ -144,14 +144,14 @@ public: } events.ScheduleEvent(EVENT_SPELL_IMPALE, 15000); - events.ScheduleEvent(EVENT_SPELL_LOCUST_SWARM, 70000+urand(0,50000)); + events.ScheduleEvent(EVENT_SPELL_LOCUST_SWARM, 70000 + urand(0, 50000)); events.ScheduleEvent(EVENT_SPELL_BERSERK, 600000); - + if (!summons.HasEntry(NPC_CRYPT_GUARD)) SummonCryptGuards(); } - void MoveInLineOfSight(Unit *who) override + void MoveInLineOfSight(Unit* who) override { if (!sayGreet && who->GetTypeId() == TYPEID_PLAYER) { @@ -179,15 +179,15 @@ public: events.RepeatEvent(20000); break; case EVENT_SPELL_LOCUST_SWARM: - { - Talk(EMOTE_LOCUST); - me->CastSpell(me, RAID_MODE(SPELL_LOCUST_SWARM_10, SPELL_LOCUST_SWARM_25), false); - Position pos; - me->GetNearPosition(pos, 10.0f, rand_norm() * 2 * M_PI); - me->SummonCreature(NPC_CRYPT_GUARD, pos); - events.RepeatEvent(90000); - break; - } + { + Talk(EMOTE_LOCUST); + me->CastSpell(me, RAID_MODE(SPELL_LOCUST_SWARM_10, SPELL_LOCUST_SWARM_25), false); + Position pos; + me->GetNearPosition(pos, 10.0f, rand_norm() * 2 * M_PI); + me->SummonCreature(NPC_CRYPT_GUARD, pos); + events.RepeatEvent(90000); + break; + } case EVENT_SPELL_BERSERK: me->CastSpell(me, SPELL_BERSERK, true); events.PopEvent(); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp b/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp index 4c5bee27b..fb021ff12 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp @@ -54,7 +54,7 @@ public: struct boss_faerlinaAI : public BossAI { - boss_faerlinaAI(Creature *c) : BossAI(c, BOSS_FAERLINA), summons(me) + boss_faerlinaAI(Creature* c) : BossAI(c, BOSS_FAERLINA), summons(me) { pInstance = me->GetInstanceScript(); sayGreet = false; @@ -90,19 +90,19 @@ public: SummonHelpers(); } - void EnterCombat(Unit * who) override + void EnterCombat(Unit* who) override { BossAI::EnterCombat(who); me->CallForHelp(VISIBLE_RANGE); summons.DoZoneInCombat(); Talk(SAY_AGGRO); - events.ScheduleEvent(EVENT_SPELL_POISON_BOLT, urand(12000,15000)); - events.ScheduleEvent(EVENT_SPELL_RAIN_OF_FIRE, urand(6000,18000)); - events.ScheduleEvent(EVENT_SPELL_FRENZY, urand(60000,80000), 1); + events.ScheduleEvent(EVENT_SPELL_POISON_BOLT, urand(12000, 15000)); + events.ScheduleEvent(EVENT_SPELL_RAIN_OF_FIRE, urand(6000, 18000)); + events.ScheduleEvent(EVENT_SPELL_FRENZY, urand(60000, 80000), 1); events.SetPhase(1); } - void MoveInLineOfSight(Unit *who) override + void MoveInLineOfSight(Unit* who) override { if (!sayGreet && who->GetTypeId() == TYPEID_PLAYER) { @@ -118,7 +118,7 @@ public: if (who->GetTypeId() != TYPEID_PLAYER) return; - if (!urand(0,3)) + if (!urand(0, 3)) Talk(SAY_SLAY); if (pInstance) @@ -167,8 +167,8 @@ public: DoMeleeAttackIfReady(); } - - void SpellHit(Unit* /*caster*/, const SpellInfo *spell) override + + void SpellHit(Unit* /*caster*/, const SpellInfo* spell) override { if (spell->Id == SPELL_WIDOWS_EMBRACE) { diff --git a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp index fb55c13e9..dda7bcac2 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp @@ -123,7 +123,7 @@ public: struct boss_four_horsemenAI : public BossAI { - explicit boss_four_horsemenAI(Creature *c) : BossAI(c, BOSS_HORSEMAN) + explicit boss_four_horsemenAI(Creature* c) : BossAI(c, BOSS_HORSEMAN) { pInstance = me->GetInstanceScript(); switch (me->GetEntry()) @@ -153,10 +153,18 @@ public: { switch(me->GetEntry()) { - case NPC_THANE_KORTHAZZ: currentWaypoint = 0; break; - case NPC_LADY_BLAUMEUX: currentWaypoint = 3; break; - case NPC_BARON_RIVENDARE: currentWaypoint = 6; break; - case NPC_SIR_ZELIEK: currentWaypoint = 9; break; + case NPC_THANE_KORTHAZZ: + currentWaypoint = 0; + break; + case NPC_LADY_BLAUMEUX: + currentWaypoint = 3; + break; + case NPC_BARON_RIVENDARE: + currentWaypoint = 6; + break; + case NPC_SIR_ZELIEK: + currentWaypoint = 9; + break; } me->GetMotionMaster()->MovePoint(currentWaypoint, WaypointPositions[currentWaypoint]); } @@ -183,10 +191,10 @@ public: // Schedule Events events.RescheduleEvent(EVENT_SPELL_MARK_CAST, 24000); - events.RescheduleEvent(EVENT_BERSERK, 100*15000); + events.RescheduleEvent(EVENT_BERSERK, 100 * 15000); if ((me->GetEntry() != NPC_LADY_BLAUMEUX && me->GetEntry() != NPC_SIR_ZELIEK)) - events.RescheduleEvent(EVENT_SPELL_PRIMARY, 10000+rand()%5000); + events.RescheduleEvent(EVENT_SPELL_PRIMARY, 10000 + rand() % 5000); else { events.RescheduleEvent(EVENT_SPELL_PUNISH, 5000); @@ -220,7 +228,7 @@ public: return; } - currentWaypoint = id+1; + currentWaypoint = id + 1; } void AttackStart(Unit* who) override @@ -250,7 +258,8 @@ public: BossAI::JustDied(killer); if (pInstance) { - if (pInstance->GetBossState(BOSS_HORSEMAN) == DONE) { + if (pInstance->GetBossState(BOSS_HORSEMAN) == DONE) + { if (!me->GetMap()->GetPlayers().isEmpty()) if (Player* player = me->GetMap()->GetPlayers().getFirst()->GetSource()) player->SummonGameObject(RAID_MODE(GO_HORSEMEN_CHEST_10, GO_HORSEMEN_CHEST_25), 2514.8f, -2944.9f, 245.55f, 5.51f, 0, 0, 0, 0, 0); @@ -260,7 +269,7 @@ public: Talk(SAY_DEATH); } - void EnterCombat(Unit * who) override + void EnterCombat(Unit* who) override { BossAI::EnterCombat(who); if (movementPhase == MOVE_PHASE_NONE) @@ -287,7 +296,7 @@ public: if (movementPhase < MOVE_PHASE_FINISHED || !UpdateVictim()) return; - + events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; @@ -333,57 +342,57 @@ public: class spell_four_horsemen_mark : public SpellScriptLoader { - public: - spell_four_horsemen_mark() : SpellScriptLoader("spell_four_horsemen_mark") { } +public: + spell_four_horsemen_mark() : SpellScriptLoader("spell_four_horsemen_mark") { } - class spell_four_horsemen_mark_AuraScript : public AuraScript + class spell_four_horsemen_mark_AuraScript : public AuraScript + { + PrepareAuraScript(spell_four_horsemen_mark_AuraScript); + + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_four_horsemen_mark_AuraScript); - - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + if (Unit* caster = GetCaster()) { - if (Unit* caster = GetCaster()) + int32 damage; + switch (GetStackAmount()) { - int32 damage; - switch (GetStackAmount()) - { - case 1: - damage = 0; - break; - case 2: - damage = 500; - break; - case 3: - damage = 1000; - break; - case 4: - damage = 1500; - break; - case 5: - damage = 4000; - break; - case 6: - damage = 12000; - break; - default: - damage = 20000 + 1000 * (GetStackAmount() - 7); - break; - } - if (damage) - caster->CastCustomSpell(SPELL_MARK_DAMAGE, SPELLVALUE_BASE_POINT0, damage, GetTarget()); + case 1: + damage = 0; + break; + case 2: + damage = 500; + break; + case 3: + damage = 1000; + break; + case 4: + damage = 1500; + break; + case 5: + damage = 4000; + break; + case 6: + damage = 12000; + break; + default: + damage = 20000 + 1000 * (GetStackAmount() - 7); + break; } + if (damage) + caster->CastCustomSpell(SPELL_MARK_DAMAGE, SPELLVALUE_BASE_POINT0, damage, GetTarget()); } - - void Register() override - { - AfterEffectApply += AuraEffectApplyFn(spell_four_horsemen_mark_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_four_horsemen_mark_AuraScript(); } + + void Register() override + { + AfterEffectApply += AuraEffectApplyFn(spell_four_horsemen_mark_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_four_horsemen_mark_AuraScript(); + } }; void AddSC_boss_four_horsemen() diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp index 5ad6f4bfb..0b0fb9ce1 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp @@ -63,7 +63,7 @@ public: struct boss_gluthAI : public BossAI { - explicit boss_gluthAI(Creature *c) : BossAI(c, BOSS_GLUTH), summons(me) + explicit boss_gluthAI(Creature* c) : BossAI(c, BOSS_GLUTH), summons(me) { pInstance = me->GetInstanceScript(); } @@ -71,7 +71,7 @@ public: EventMap events; SummonList summons; InstanceScript* pInstance; - + void Reset() override { BossAI::Reset(); @@ -81,7 +81,7 @@ public: me->SetReactState(REACT_AGGRESSIVE); } - void MoveInLineOfSight(Unit *who) override + void MoveInLineOfSight(Unit* who) override { if (!me->GetVictim() || me->GetVictim()->GetEntry() != NPC_ZOMBIE_CHOW) { @@ -95,19 +95,19 @@ public: } } - void EnterCombat(Unit * who) override + void EnterCombat(Unit* who) override { BossAI::EnterCombat(who); me->SetInCombatWithZone(); events.ScheduleEvent(EVENT_SPELL_MORTAL_WOUND, 10000); events.ScheduleEvent(EVENT_SPELL_ENRAGE, 30000); events.ScheduleEvent(EVENT_SPELL_DECIMATE, 105000); - events.ScheduleEvent(EVENT_SPELL_BERSERK, 8*60000); + events.ScheduleEvent(EVENT_SPELL_BERSERK, 8 * 60000); events.ScheduleEvent(EVENT_SUMMON_ZOMBIE, 10000); events.ScheduleEvent(EVENT_CAN_EAT_ZOMBIE, 1000); } - void JustSummoned(Creature *summon) override + void JustSummoned(Creature* summon) override { if (summon->GetEntry() == NPC_ZOMBIE_CHOW) summon->AI()->AttackStart(me); @@ -120,7 +120,7 @@ public: void KilledUnit(Unit* who) override { if (me->IsAlive() && who->GetEntry() == NPC_ZOMBIE_CHOW) - me->ModifyHealth(int32(me->GetMaxHealth()*0.05f)); + me->ModifyHealth(int32(me->GetMaxHealth() * 0.05f)); if (who->GetTypeId() == TYPEID_PLAYER && pInstance) pInstance->SetData(DATA_IMMORTAL_FAIL, 0); @@ -138,7 +138,7 @@ public: return false; Map::PlayerList const& pList = me->GetMap()->GetPlayers(); - for (const auto & itr : pList) + for (const auto& itr : pList) { Player* player = itr.GetSource(); if (!player || !player->IsAlive()) @@ -184,8 +184,8 @@ public: break; case EVENT_SUMMON_ZOMBIE: { - uint8 rand = urand(0,2); - for (int32 i = 0; i < RAID_MODE(1,2); ++i) + uint8 rand = urand(0, 2); + for (int32 i = 0; i < RAID_MODE(1, 2); ++i) { // In 10 man raid, normal mode - should spawn only from mid gate // \1 |0 /2 pos @@ -218,44 +218,44 @@ public: class spell_gluth_decimate : public SpellScriptLoader { - public: - spell_gluth_decimate() : SpellScriptLoader("spell_gluth_decimate") { } +public: + spell_gluth_decimate() : SpellScriptLoader("spell_gluth_decimate") { } - class spell_gluth_decimate_SpellScript : public SpellScript + class spell_gluth_decimate_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gluth_decimate_SpellScript); + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_gluth_decimate_SpellScript); - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) + if (Unit* unitTarget = GetHitUnit()) { - if (Unit* unitTarget = GetHitUnit()) + int32 damage = int32(unitTarget->GetHealth()) - int32(unitTarget->CountPctFromMaxHealth(5)); + if (damage <= 0) + return; + + if (Creature* cTarget = unitTarget->ToCreature()) { - int32 damage = int32(unitTarget->GetHealth()) - int32(unitTarget->CountPctFromMaxHealth(5)); - if (damage <= 0) - return; - - if (Creature* cTarget = unitTarget->ToCreature()) - { - cTarget->SetWalk(true); - cTarget->GetMotionMaster()->MoveFollow(GetCaster(), 0.0f, 0.0f, MOTION_SLOT_CONTROLLED); - cTarget->SetReactState(REACT_PASSIVE); - Unit::DealDamage(GetCaster(), cTarget, damage); - return; - } - - GetCaster()->CastCustomSpell(28375, SPELLVALUE_BASE_POINT0, damage, unitTarget); + cTarget->SetWalk(true); + cTarget->GetMotionMaster()->MoveFollow(GetCaster(), 0.0f, 0.0f, MOTION_SLOT_CONTROLLED); + cTarget->SetReactState(REACT_PASSIVE); + Unit::DealDamage(GetCaster(), cTarget, damage); + return; } - } - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_gluth_decimate_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + GetCaster()->CastCustomSpell(28375, SPELLVALUE_BASE_POINT0, damage, unitTarget); } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_gluth_decimate_SpellScript(); } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_gluth_decimate_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_gluth_decimate_SpellScript(); + } }; void AddSC_boss_gluth() diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp index 5a1def210..8102626e1 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp @@ -166,12 +166,12 @@ const Position PosPlatform = {2640.5f, -3360.6f, 285.26f, 0.0f}; #define IN_LIVE_SIDE(who) (who->GetPositionY() < POS_Y_GATE) // Predicate function to check that the r efzr unit is NOT on the same side as the source. -struct NotOnSameSide : public acore::unary_function +struct NotOnSameSide : public acore::unary_function { bool m_inLiveSide; - explicit NotOnSameSide(Unit *pSource) : m_inLiveSide(IN_LIVE_SIDE(pSource)) {} - - bool operator() (const Unit *pTarget) + explicit NotOnSameSide(Unit* pSource) : m_inLiveSide(IN_LIVE_SIDE(pSource)) {} + + bool operator() (const Unit* pTarget) { return (m_inLiveSide != IN_LIVE_SIDE(pTarget)); } @@ -189,7 +189,7 @@ public: struct boss_gothikAI : public BossAI { - explicit boss_gothikAI(Creature *c) : BossAI(c, BOSS_GOTHIK), summons(me) + explicit boss_gothikAI(Creature* c) : BossAI(c, BOSS_GOTHIK), summons(me) { pInstance = me->GetInstanceScript(); } @@ -217,7 +217,7 @@ public: BossAI::Reset(); events.Reset(); summons.DespawnAll(); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_DISABLE_MOVE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_DISABLE_MOVE); me->SetReactState(REACT_PASSIVE); secondPhase = false; gateOpened = false; @@ -234,7 +234,7 @@ public: } } - void EnterCombat(Unit * who) override + void EnterCombat(Unit* who) override { BossAI::EnterCombat(who); me->SetInCombatWithZone(); @@ -242,12 +242,12 @@ public: events.ScheduleEvent(EVENT_INTRO_2, 4000); events.ScheduleEvent(EVENT_INTRO_3, 9000); events.ScheduleEvent(EVENT_INTRO_4, 14000); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_DISABLE_MOVE); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_DISABLE_MOVE); me->NearTeleportTo(PosPlatform.GetPositionX(), PosPlatform.GetPositionY(), PosPlatform.GetPositionZ(), PosPlatform.GetOrientation()); - + events.ScheduleEvent(EVENT_SUMMON_ADDS, 30000); events.ScheduleEvent(EVENT_CHECK_PLAYERS, 120000); - + if (pInstance) { if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetData64(DATA_GOTHIK_ENTER_GATE))) @@ -257,11 +257,11 @@ public: } } - void JustSummoned(Creature *summon) override + void JustSummoned(Creature* summon) override { if (gateOpened) summon->AI()->DoAction(ACTION_GATE_OPEN); - + summons.Summon(summon); summon->SetInCombatWithZone(); } @@ -319,25 +319,25 @@ public: bool CheckGroupSplitted() { - Map::PlayerList const &PlayerList = me->GetMap()->GetPlayers(); + Map::PlayerList const& PlayerList = me->GetMap()->GetPlayers(); if (!PlayerList.isEmpty()) { bool checklife = false; bool checkdead = false; - for (const auto & i : PlayerList) + for (const auto& i : PlayerList) { Player* player = i.GetSource(); if (player->IsAlive() && - player->GetPositionX() <= POS_X_NORTH && - player->GetPositionX() >= POS_X_SOUTH && - player->GetPositionY() <= POS_Y_GATE && - player->GetPositionY() >= POS_Y_EAST) + player->GetPositionX() <= POS_X_NORTH && + player->GetPositionX() >= POS_X_SOUTH && + player->GetPositionY() <= POS_Y_GATE && + player->GetPositionY() >= POS_Y_EAST) checklife = true; else if (player->IsAlive() && - player->GetPositionX() <= POS_X_NORTH && - player->GetPositionX() >= POS_X_SOUTH && - player->GetPositionY() >= POS_Y_GATE && - player->GetPositionY() <= POS_Y_WEST) + player->GetPositionX() <= POS_X_NORTH && + player->GetPositionX() >= POS_X_SOUTH && + player->GetPositionY() >= POS_Y_GATE && + player->GetPositionY() <= POS_Y_WEST) checkdead = true; if (checklife && checkdead) @@ -347,9 +347,9 @@ public: return false; } - void SpellHit(Unit * /*caster*/, const SpellInfo* spellInfo) override + void SpellHit(Unit* /*caster*/, const SpellInfo* spellInfo) override { - uint8 pos = urand(0,4); + uint8 pos = urand(0, 4); switch (spellInfo->Id) { case SPELL_INFORM_LIVING_TRAINEE: @@ -367,7 +367,7 @@ public: me->HandleEmoteCommand(EMOTE_ONESHOT_SPELL_CAST); } - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask) override + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override { if (!secondPhase) damage = 0; @@ -415,7 +415,7 @@ public: me->NearTeleportTo(PosGroundLivingSide.GetPositionX(), PosGroundLivingSide.GetPositionY(), PosGroundLivingSide.GetPositionZ(), PosGroundLivingSide.GetOrientation()); me->getThreatManager().resetAggro(NotOnSameSide(me)); - if (Unit *pTarget = SelectTarget(SELECT_TARGET_NEAREST, 0)) + if (Unit* pTarget = SelectTarget(SELECT_TARGET_NEAREST, 0)) { me->getThreatManager().addThreat(pTarget, 100.0f); AttackStart(pTarget); @@ -447,12 +447,12 @@ public: Talk(EMOTE_PHASE_TWO); me->NearTeleportTo(PosGroundLivingSide.GetPositionX(), PosGroundLivingSide.GetPositionY(), PosGroundLivingSide.GetPositionZ(), PosGroundLivingSide.GetOrientation()); me->SetReactState(REACT_AGGRESSIVE); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_DISABLE_MOVE); - + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_DISABLE_MOVE); + summons.DoAction(ACTION_GATE_OPEN); summons.DoZoneInCombat(); events.ScheduleEvent(EVENT_SPELL_SHADOW_BOLT, 1000); - events.ScheduleEvent(EVENT_SPELL_HARVEST_SOUL, urand(5000,15000)); + events.ScheduleEvent(EVENT_SPELL_HARVEST_SOUL, urand(5000, 15000)); events.ScheduleEvent(EVENT_TELEPORT, 20000); events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); events.PopEvent(); @@ -492,7 +492,7 @@ public: struct npc_boss_gothik_minionAI : public CombatAI { - explicit npc_boss_gothik_minionAI(Creature *c) : CombatAI(c) + explicit npc_boss_gothik_minionAI(Creature* c) : CombatAI(c) { livingSide = IN_LIVE_SIDE(me); gateOpened = false; @@ -530,7 +530,7 @@ public: events.ScheduleEvent(EVENT_SPELL_HYSTERIA, 10000); events.ScheduleEvent(EVENT_SPELL_HASTE_AURA, 1000); events.ScheduleEvent(EVENT_SPELL_INTIMIDATING_SHOUT, urand(4000, 9000)); - events.ScheduleEvent(EVENT_SPELL_VEIL_OF_DARKNESS, urand(5000,7000)); + events.ScheduleEvent(EVENT_SPELL_VEIL_OF_DARKNESS, urand(5000, 7000)); break; case NPC_DEAD_RIDER: events.ScheduleEvent(EVENT_SPELL_DRAIN_LIFE, urand(2000, 3500)); @@ -542,7 +542,7 @@ public: break; } } - void DamageTaken(Unit* attacker, uint32 &damage, DamageEffectType, SpellSchoolMask) override + void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType, SpellSchoolMask) override { if (!attacker || (!gateOpened && !IsOnSameSide(attacker))) damage = 0; @@ -554,7 +554,7 @@ public: gateOpened = true; } - void JustDied(Unit *) override + void JustDied(Unit*) override { switch (me->GetEntry()) { @@ -587,7 +587,7 @@ public: { case EVENT_SPELL_DEATH_PLAGUE: me->CastSpell(me->GetVictim(), SPELL_DEATH_PLAGUE, false); - events.RepeatEvent(urand(15000,20000)); + events.RepeatEvent(urand(15000, 20000)); break; case EVENT_SPELL_ARCANE_EXPLOSION: if (Unit* victim = me->GetVictim()) @@ -656,7 +656,7 @@ public: break; } - DoMeleeAttackIfReady(); + DoMeleeAttackIfReady(); } }; @@ -664,28 +664,28 @@ public: class spell_gothik_shadow_bolt_volley : public SpellScriptLoader { - public: - spell_gothik_shadow_bolt_volley() : SpellScriptLoader("spell_gothik_shadow_bolt_volley") { } +public: + spell_gothik_shadow_bolt_volley() : SpellScriptLoader("spell_gothik_shadow_bolt_volley") { } - class spell_gothik_shadow_bolt_volley_SpellScript : public SpellScript + class spell_gothik_shadow_bolt_volley_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gothik_shadow_bolt_volley_SpellScript); + + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_gothik_shadow_bolt_volley_SpellScript); - - void FilterTargets(std::list& targets) - { - targets.remove_if(acore::UnitAuraCheck(false, SPELL_SHADOW_MARK)); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_gothik_shadow_bolt_volley_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_gothik_shadow_bolt_volley_SpellScript(); + targets.remove_if(acore::UnitAuraCheck(false, SPELL_SHADOW_MARK)); } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_gothik_shadow_bolt_volley_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_gothik_shadow_bolt_volley_SpellScript(); + } }; void AddSC_boss_gothik() diff --git a/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp b/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp index 9a03798cf..b41c889b6 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp @@ -53,7 +53,7 @@ public: struct boss_grobbulusAI : public BossAI { - explicit boss_grobbulusAI(Creature *c) : BossAI(c, BOSS_GROBBULUS), summons(me) + explicit boss_grobbulusAI(Creature* c) : BossAI(c, BOSS_GROBBULUS), summons(me) { pInstance = me->GetInstanceScript(); } @@ -82,7 +82,7 @@ public: } } - void EnterCombat(Unit * who) override + void EnterCombat(Unit* who) override { BossAI::EnterCombat(who); PullChamberAdds(); @@ -90,10 +90,10 @@ public: events.ScheduleEvent(EVENT_SPELL_POISON_CLOUD, 15000); events.ScheduleEvent(EVENT_SPELL_MUTATING_INJECTION, 20000); events.ScheduleEvent(EVENT_SPELL_SLIME_SPRAY, 10000); - events.ScheduleEvent(EVENT_SPELL_BERSERK, RAID_MODE(12*MINUTE*IN_MILLISECONDS, 9*MINUTE*IN_MILLISECONDS)); + events.ScheduleEvent(EVENT_SPELL_BERSERK, RAID_MODE(12 * MINUTE * IN_MILLISECONDS, 9 * MINUTE * IN_MILLISECONDS)); } - void SpellHitTarget(Unit *target, const SpellInfo* spellInfo) override + void SpellHitTarget(Unit* target, const SpellInfo* spellInfo) override { if (spellInfo->Id == RAID_MODE(SPELL_SLIME_SPRAY_10, SPELL_SLIME_SPRAY_25) && target->GetTypeId() == TYPEID_PLAYER) me->SummonCreature(NPC_FALLOUT_SLIME, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ()); @@ -128,7 +128,7 @@ public: if (!me->IsInCombat() && dropSludgeTimer >= 5000) { if (me->IsWithinDist3d(3178, -3305, 319, 5.0f) && !summons.HasEntry(NPC_SEWAGE_SLIME)) - me->CastSpell(3128.96f+irand(-20, 20), -3312.96f+irand(-20, 20), 293.25f, SPELL_BOMBARD_SLIME, false); + me->CastSpell(3128.96f + irand(-20, 20), -3312.96f + irand(-20, 20), 293.25f, SPELL_BOMBARD_SLIME, false); dropSludgeTimer = 0; } @@ -190,7 +190,7 @@ public: sizeTimer = 0; auraVisualTimer = 1; me->SetFloatValue(UNIT_FIELD_COMBATREACH, 2.0f); - me->setFaction(21); // Grobbulus one + me->setFaction(21); // Grobbulus one } void KilledUnit(Unit* who) override @@ -214,7 +214,7 @@ public: sizeTimer += diff; // increase size to 15yd in 60 seconds, 0.00025 is the growth of size in 1ms - me->SetFloatValue(UNIT_FIELD_COMBATREACH, 2.0f+(0.00025f*sizeTimer)); + me->SetFloatValue(UNIT_FIELD_COMBATREACH, 2.0f + (0.00025f * sizeTimer)); } }; @@ -222,35 +222,35 @@ public: class spell_grobbulus_poison : public SpellScriptLoader { - public: - spell_grobbulus_poison() : SpellScriptLoader("spell_grobbulus_poison") { } +public: + spell_grobbulus_poison() : SpellScriptLoader("spell_grobbulus_poison") { } - class spell_grobbulus_poison_SpellScript : public SpellScript + class spell_grobbulus_poison_SpellScript : public SpellScript + { + PrepareSpellScript(spell_grobbulus_poison_SpellScript); + + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_grobbulus_poison_SpellScript); + std::list tmplist; + for (auto& target : targets) + if (GetCaster()->IsWithinDist3d(target, 0.0f)) + tmplist.push_back(target); - void FilterTargets(std::list& targets) - { - std::list tmplist; - for (auto & target : targets) - if (GetCaster()->IsWithinDist3d(target, 0.0f)) - tmplist.push_back(target); - - targets.clear(); - for (auto & itr : tmplist) - targets.push_back(itr); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_grobbulus_poison_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_grobbulus_poison_SpellScript(); + targets.clear(); + for (auto& itr : tmplist) + targets.push_back(itr); } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_grobbulus_poison_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_grobbulus_poison_SpellScript(); + } }; void AddSC_boss_grobbulus() diff --git a/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp b/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp index 921b17da3..6a4cc5fb4 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp @@ -53,7 +53,7 @@ public: struct boss_heiganAI : public BossAI { - explicit boss_heiganAI(Creature *c) : BossAI(c, BOSS_HEIGAN) + explicit boss_heiganAI(Creature* c) : BossAI(c, BOSS_HEIGAN) { pInstance = me->GetInstanceScript(); } @@ -96,7 +96,7 @@ public: Talk(SAY_DEATH); } - void EnterCombat(Unit * who) override + void EnterCombat(Unit* who) override { BossAI::EnterCombat(who); me->SetInCombatWithZone(); @@ -202,22 +202,22 @@ public: events.RepeatEvent(currentPhase == PHASE_SLOW_DANCE ? 10000 : 4000); break; case EVENT_SAFETY_DANCE: - { - Map::PlayerList const& pList = me->GetMap()->GetPlayers(); - for(const auto & itr : pList) { - if (IsInRoom(itr.GetSource()) && !itr.GetSource()->IsAlive()) + Map::PlayerList const& pList = me->GetMap()->GetPlayers(); + for(const auto& itr : pList) { - events.PopEvent(); - pInstance->SetData(DATA_DANCE_FAIL, 0); - pInstance->SetData(DATA_IMMORTAL_FAIL, 0); - return; - } + if (IsInRoom(itr.GetSource()) && !itr.GetSource()->IsAlive()) + { + events.PopEvent(); + pInstance->SetData(DATA_DANCE_FAIL, 0); + pInstance->SetData(DATA_IMMORTAL_FAIL, 0); + return; + } + } + events.RepeatEvent(5000); + return; } - events.RepeatEvent(5000); - return; - } } DoMeleeAttackIfReady(); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp index fb17e63ff..a79758934 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp @@ -93,11 +93,11 @@ const Position SummonPositions[12] = // Edges //{3754.431396f, -5080.727734f, 142.036316f, 3.736189f}, //LEFT_FAR - // {3724.396484f, -5061.330566f, 142.032700f, 4.564785f}, //LEFT_MIDDLE + // {3724.396484f, -5061.330566f, 142.032700f, 4.564785f}, //LEFT_MIDDLE //{3687.158424f, -5076.834473f, 142.017319f, 5.237086f}, //LEFT_NEAR //{3687.571777f, -5126.831055f, 142.017807f, 0.604023f}, //RIGHT_FAR //{3707.990733f, -5151.450195f, 142.032562f, 1.376855f}, //RIGHT_MIDDLE - // {3739.500000f, -5141.883989f, 142.014113f, 2.121412f} //RIGHT_NEAR + // {3739.500000f, -5141.883989f, 142.014113f, 2.121412f} //RIGHT_NEAR // Middle {3769.34f, -5071.80f, 143.2082f, 3.658f}, @@ -123,7 +123,7 @@ public: explicit boss_kelthuzadAI(Creature* c) : BossAI(c, BOSS_KELTHUZAD), summons(me) { pInstance = me->GetInstanceScript(); - _justSpawned=true; + _justSpawned = true; } EventMap events; @@ -145,21 +145,21 @@ public: for (uint8 i = 6; i < 12; ++i) for (uint8 j = 0; j < 8; ++j) { - float angle = M_PI*2/8*j; - me->SummonCreature(NPC_SOLDIER_OF_THE_FROZEN_WASTES, SummonPositions[i].GetPositionX()+6*cos(angle), SummonPositions[i].GetPositionY()+6*sin(angle), SummonPositions[i].GetPositionZ()+0.5f, SummonPositions[i].GetOrientation(), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000); + float angle = M_PI * 2 / 8 * j; + me->SummonCreature(NPC_SOLDIER_OF_THE_FROZEN_WASTES, SummonPositions[i].GetPositionX() + 6 * cos(angle), SummonPositions[i].GetPositionY() + 6 * sin(angle), SummonPositions[i].GetPositionZ() + 0.5f, SummonPositions[i].GetOrientation(), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000); } for (uint8 i = 6; i < 12; ++i) for (uint8 j = 1; j < 4; ++j) { float dist = j == 2 ? 0.0f : 8.0f; // second in middle - float angle = SummonPositions[i].GetOrientation() + M_PI*2/4*j; - me->SummonCreature(NPC_UNSTOPPABLE_ABOMINATION, SummonPositions[i].GetPositionX()+dist*cos(angle), SummonPositions[i].GetPositionY()+dist*sin(angle), SummonPositions[i].GetPositionZ()+0.5f, SummonPositions[i].GetOrientation(), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000); + float angle = SummonPositions[i].GetOrientation() + M_PI * 2 / 4 * j; + me->SummonCreature(NPC_UNSTOPPABLE_ABOMINATION, SummonPositions[i].GetPositionX() + dist * cos(angle), SummonPositions[i].GetPositionY() + dist * sin(angle), SummonPositions[i].GetPositionZ() + 0.5f, SummonPositions[i].GetOrientation(), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000); } for (uint8 i = 6; i < 12; ++i) for (uint8 j = 0; j < 1; ++j) { float angle = SummonPositions[i].GetOrientation() + M_PI; - me->SummonCreature(NPC_SOUL_WEAVER, SummonPositions[i].GetPositionX()+6*cos(angle), SummonPositions[i].GetPositionY()+6*sin(angle), SummonPositions[i].GetPositionZ()+0.5f, SummonPositions[i].GetOrientation(), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000); + me->SummonCreature(NPC_SOUL_WEAVER, SummonPositions[i].GetPositionX() + 6 * cos(angle), SummonPositions[i].GetPositionY() + 6 * sin(angle), SummonPositions[i].GetPositionZ() + 0.5f, SummonPositions[i].GetOrientation(), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000); } } @@ -182,13 +182,13 @@ public: if(!_justSpawned) /* Don't open the door if we just spawned and are still doing the RP */ go->SetGoState(GO_STATE_ACTIVE); } - _justSpawned=false; + _justSpawned = false; } void EnterEvadeMode() override { - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_DISABLE_MOVE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE); ScriptedAI::EnterEvadeMode(); } @@ -226,7 +226,7 @@ public: AttackStart(who); } - void EnterCombat(Unit * who) override + void EnterCombat(Unit* who) override { BossAI::EnterCombat(who); Talk(SAY_SUMMON_MINIONS); @@ -280,7 +280,7 @@ public: events.PopEvent(); break; case EVENT_SUMMON_SOLDIER: - if (Creature* cr = me->SummonCreature(NPC_SOLDIER_OF_THE_FROZEN_WASTES, SummonPositions[urand(0,5)], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000)) + if (Creature* cr = me->SummonCreature(NPC_SOLDIER_OF_THE_FROZEN_WASTES, SummonPositions[urand(0, 5)], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000)) { if (Unit* target = SelectTargetFromPlayerList(100.0f)) { @@ -292,7 +292,7 @@ public: events.RepeatEvent(3200); break; case EVENT_SUMMON_UNSTOPPABLE_ABOMINATION: - if (Creature* cr = me->SummonCreature(NPC_UNSTOPPABLE_ABOMINATION, SummonPositions[urand(0,5)], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000)) + if (Creature* cr = me->SummonCreature(NPC_UNSTOPPABLE_ABOMINATION, SummonPositions[urand(0, 5)], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000)) { if (Unit* target = SelectTargetFromPlayerList(100.0f)) { @@ -304,7 +304,7 @@ public: events.RepeatEvent(30000); break; case EVENT_SUMMON_SOUL_WEAVER: - if (Creature* cr = me->SummonCreature(NPC_SOUL_WEAVER, SummonPositions[urand(0,5)], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000)) + if (Creature* cr = me->SummonCreature(NPC_SOUL_WEAVER, SummonPositions[urand(0, 5)], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000)) { if (Unit* target = SelectTargetFromPlayerList(100.0f)) { @@ -346,9 +346,9 @@ public: events.RepeatEvent(25000); break; case EVENT_SPELL_FROST_BLAST: - if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, RAID_MODE(1,0), 0, true)) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, RAID_MODE(1, 0), 0, true)) me->CastSpell(target, SPELL_FROST_BLAST, false); - + Talk(SAY_FROST_BLAST); events.RepeatEvent(45000); break; @@ -361,28 +361,28 @@ public: events.RepeatEvent(50000); break; case EVENT_SPELL_DETONATE_MANA: - { - std::vector unitList; - ThreatContainer::StorageType const& threatList = me->getThreatManager().getThreatList(); - for (auto itr : threatList) { - if (itr->getTarget()->GetTypeId() == TYPEID_PLAYER - && itr->getTarget()->getPowerType() == POWER_MANA - && itr->getTarget()->GetPower(POWER_MANA)) - unitList.push_back(itr->getTarget()); - } + std::vector unitList; + ThreatContainer::StorageType const& threatList = me->getThreatManager().getThreatList(); + for (auto itr : threatList) + { + if (itr->getTarget()->GetTypeId() == TYPEID_PLAYER + && itr->getTarget()->getPowerType() == POWER_MANA + && itr->getTarget()->GetPower(POWER_MANA)) + unitList.push_back(itr->getTarget()); + } - if (!unitList.empty()) - { - auto itr = unitList.begin(); - advance(itr, urand(0, unitList.size()-1)); - me->CastSpell(*itr, SPELL_DETONATE_MANA, false); - Talk(SAY_SPECIAL); - } + if (!unitList.empty()) + { + auto itr = unitList.begin(); + advance(itr, urand(0, unitList.size() - 1)); + me->CastSpell(*itr, SPELL_DETONATE_MANA, false); + Talk(SAY_SPECIAL); + } - events.RepeatEvent(30000); - break; - } + events.RepeatEvent(30000); + break; + } case EVENT_SECOND_PHASE_HEALTH_CHECK: if (me->HealthBelowPct(45)) { @@ -399,8 +399,8 @@ public: if (Creature* cr = ObjectAccessor::GetCreature(*me, pInstance->GetData64(DATA_LICH_KING_BOSS))) cr->AI()->Talk(SAY_ANSWER_REQUEST); - for (uint8 i = 0 ; i < RAID_MODE(2,4); ++i) - events.ScheduleEvent(EVENT_SUMMON_GUARDIAN_OF_ICECROWN, 10000+(i*5000)); + for (uint8 i = 0 ; i < RAID_MODE(2, 4); ++i) + events.ScheduleEvent(EVENT_SUMMON_GUARDIAN_OF_ICECROWN, 10000 + (i * 5000)); events.PopEvent(); break; case EVENT_SUMMON_GUARDIAN_OF_ICECROWN: @@ -547,77 +547,77 @@ public: class spell_kelthuzad_frost_blast : public SpellScriptLoader { - public: - spell_kelthuzad_frost_blast() : SpellScriptLoader("spell_kelthuzad_frost_blast") { } +public: + spell_kelthuzad_frost_blast() : SpellScriptLoader("spell_kelthuzad_frost_blast") { } - class spell_kelthuzad_frost_blast_SpellScript : public SpellScript + class spell_kelthuzad_frost_blast_SpellScript : public SpellScript + { + PrepareSpellScript(spell_kelthuzad_frost_blast_SpellScript); + + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_kelthuzad_frost_blast_SpellScript); + Unit* caster = GetCaster(); + if (!caster || !caster->ToCreature()) + return; - void FilterTargets(std::list& targets) - { - Unit* caster = GetCaster(); - if (!caster || !caster->ToCreature()) - return; + std::list tmplist; + for (auto& target : targets) + if (!target->ToUnit()->HasAura(SPELL_FROST_BLAST)) + tmplist.push_back(target); - std::list tmplist; - for (auto & target : targets) - if (!target->ToUnit()->HasAura(SPELL_FROST_BLAST)) - tmplist.push_back(target); - - targets.clear(); - for (auto & itr : tmplist) - targets.push_back(itr); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_kelthuzad_frost_blast_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_DEST_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_kelthuzad_frost_blast_SpellScript(); + targets.clear(); + for (auto& itr : tmplist) + targets.push_back(itr); } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_kelthuzad_frost_blast_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_DEST_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_kelthuzad_frost_blast_SpellScript(); + } }; class spell_kelthuzad_detonate_mana : public SpellScriptLoader { - public: - spell_kelthuzad_detonate_mana() : SpellScriptLoader("spell_kelthuzad_detonate_mana") { } +public: + spell_kelthuzad_detonate_mana() : SpellScriptLoader("spell_kelthuzad_detonate_mana") { } - class spell_kelthuzad_detonate_mana_AuraScript : public AuraScript + class spell_kelthuzad_detonate_mana_AuraScript : public AuraScript + { + PrepareAuraScript(spell_kelthuzad_detonate_mana_AuraScript); + + bool Validate(SpellInfo const* /*spell*/) override { - PrepareAuraScript(spell_kelthuzad_detonate_mana_AuraScript); - - bool Validate(SpellInfo const* /*spell*/) override - { - return sSpellMgr->GetSpellInfo(SPELL_MANA_DETONATION_DAMAGE) != nullptr; - } - - void HandleScript(AuraEffect const* aurEff) - { - PreventDefaultAction(); - - Unit* target = GetTarget(); - if (auto mana = int32(target->GetMaxPower(POWER_MANA) / 10)) - { - mana = target->ModifyPower(POWER_MANA, -mana); - target->CastCustomSpell(SPELL_MANA_DETONATION_DAMAGE, SPELLVALUE_BASE_POINT0, -mana * 10, target, true, nullptr, aurEff); - } - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_kelthuzad_detonate_mana_AuraScript::HandleScript, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_kelthuzad_detonate_mana_AuraScript(); + return sSpellMgr->GetSpellInfo(SPELL_MANA_DETONATION_DAMAGE) != nullptr; } + + void HandleScript(AuraEffect const* aurEff) + { + PreventDefaultAction(); + + Unit* target = GetTarget(); + if (auto mana = int32(target->GetMaxPower(POWER_MANA) / 10)) + { + mana = target->ModifyPower(POWER_MANA, -mana); + target->CastCustomSpell(SPELL_MANA_DETONATION_DAMAGE, SPELLVALUE_BASE_POINT0, -mana * 10, target, true, nullptr, aurEff); + } + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_kelthuzad_detonate_mana_AuraScript::HandleScript, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_kelthuzad_detonate_mana_AuraScript(); + } }; diff --git a/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp b/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp index cfbaac521..7388a5470 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp @@ -45,7 +45,7 @@ public: struct boss_loathebAI : public BossAI { - explicit boss_loathebAI(Creature *c) : BossAI(c, BOSS_LOATHEB), summons(me) + explicit boss_loathebAI(Creature* c) : BossAI(c, BOSS_LOATHEB), summons(me) { pInstance = me->GetInstanceScript(); me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); @@ -86,7 +86,7 @@ public: pInstance->SetData(DATA_IMMORTAL_FAIL, 0); } - void EnterCombat(Unit * who) override + void EnterCombat(Unit* who) override { BossAI::EnterCombat(who); if (pInstance) @@ -136,7 +136,7 @@ public: break; case EVENT_SPELL_INEVITABLE_DOOM: me->CastSpell(me, RAID_MODE(SPELL_INEVITABLE_DOOM_10, SPELL_INEVITABLE_DOOM_25), false); - events.RepeatEvent(events.GetTimer() < 5*MINUTE*IN_MILLISECONDS ? 30000 : 15000); + events.RepeatEvent(events.GetTimer() < 5 * MINUTE * IN_MILLISECONDS ? 30000 : 15000); break; case EVENT_SPELL_BERSERK: me->CastSpell(me, SPELL_BERSERK, true); @@ -151,8 +151,8 @@ public: { // Calculate the distance between his home position to the gate if (me->GetExactDist(me->GetHomePosition().GetPositionX(), - me->GetHomePosition().GetPositionY(), - me->GetHomePosition().GetPositionZ()) > 50.0f) + me->GetHomePosition().GetPositionY(), + me->GetHomePosition().GetPositionZ()) > 50.0f) { EnterEvadeMode(); return false; @@ -164,38 +164,38 @@ public: class spell_loatheb_necrotic_aura_warning : public SpellScriptLoader { - public: - spell_loatheb_necrotic_aura_warning() : SpellScriptLoader("spell_loatheb_necrotic_aura_warning") { } +public: + spell_loatheb_necrotic_aura_warning() : SpellScriptLoader("spell_loatheb_necrotic_aura_warning") { } - class spell_loatheb_necrotic_aura_warning_AuraScript : public AuraScript + class spell_loatheb_necrotic_aura_warning_AuraScript : public AuraScript + { + PrepareAuraScript(spell_loatheb_necrotic_aura_warning_AuraScript); + + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_loatheb_necrotic_aura_warning_AuraScript); - - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Creature* target = GetTarget()->ToCreature(); - if (target->IsAIEnabled) - target->AI()->Talk(SAY_NECROTIC_AURA_APPLIED); - } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Creature* target = GetTarget()->ToCreature(); - if (target->IsAIEnabled) - target->AI()->Talk(SAY_NECROTIC_AURA_REMOVED); - } - - void Register() override - { - AfterEffectApply += AuraEffectApplyFn(spell_loatheb_necrotic_aura_warning_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_loatheb_necrotic_aura_warning_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_loatheb_necrotic_aura_warning_AuraScript(); + Creature* target = GetTarget()->ToCreature(); + if (target->IsAIEnabled) + target->AI()->Talk(SAY_NECROTIC_AURA_APPLIED); } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Creature* target = GetTarget()->ToCreature(); + if (target->IsAIEnabled) + target->AI()->Talk(SAY_NECROTIC_AURA_REMOVED); + } + + void Register() override + { + AfterEffectApply += AuraEffectApplyFn(spell_loatheb_necrotic_aura_warning_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_loatheb_necrotic_aura_warning_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_loatheb_necrotic_aura_warning_AuraScript(); + } }; void AddSC_boss_loatheb() diff --git a/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp b/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp index 9a251c0d2..acb8acb4c 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp @@ -62,7 +62,7 @@ public: struct boss_maexxnaAI : public BossAI { - explicit boss_maexxnaAI(Creature *c) : BossAI(c, BOSS_MAEXXNA), summons(me) + explicit boss_maexxnaAI(Creature* c) : BossAI(c, BOSS_MAEXXNA), summons(me) { pInstance = me->GetInstanceScript(); } @@ -93,10 +93,10 @@ public: if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetData64(DATA_MAEXXNA_GATE))) go->SetGoState(GO_STATE_ACTIVE); } - + } - void EnterCombat(Unit * who) override + void EnterCombat(Unit* who) override { BossAI::EnterCombat(who); me->SetInCombatWithZone(); @@ -177,13 +177,13 @@ public: break; case EVENT_WEB_WRAP: Talk(EMOTE_WEB_WRAP); - for (uint8 i = 0; i < RAID_MODE(1,2); ++i) - if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0, true, -SPELL_WEB_WRAP)) + for (uint8 i = 0; i < RAID_MODE(1, 2); ++i) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0, true, -SPELL_WEB_WRAP)) { target->RemoveAura(RAID_MODE(SPELL_WEB_SPRAY_10, SPELL_WEB_SPRAY_25)); - uint8 pos = urand(0,2); + uint8 pos = urand(0, 2); - if (Creature *wrap = me->SummonCreature(NPC_WEB_WRAP, PosWrap[pos].GetPositionX(), PosWrap[pos].GetPositionY(), PosWrap[pos].GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 60000)) + if (Creature* wrap = me->SummonCreature(NPC_WEB_WRAP, PosWrap[pos].GetPositionX(), PosWrap[pos].GetPositionY(), PosWrap[pos].GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 60000)) { wrap->AI()->SetGUID(target->GetGUID()); target->GetMotionMaster()->MoveJump(PosWrap[pos].GetPositionX(), PosWrap[pos].GetPositionY(), PosWrap[pos].GetPositionZ(), 20, 20); @@ -211,21 +211,21 @@ public: struct boss_maexxna_webwrapAI : public NullCreatureAI { - explicit boss_maexxna_webwrapAI(Creature *c) : NullCreatureAI(c), victimGUID(0) {} + explicit boss_maexxna_webwrapAI(Creature* c) : NullCreatureAI(c), victimGUID(0) {} uint64 victimGUID; void SetGUID(uint64 guid, int32 /*param*/) override { victimGUID = guid; if (me->m_spells[0] && victimGUID) - if (Unit *victim = ObjectAccessor::GetUnit(*me, victimGUID)) + if (Unit* victim = ObjectAccessor::GetUnit(*me, victimGUID)) victim->CastSpell(victim, me->m_spells[0], true, nullptr, nullptr, me->GetGUID()); } - void JustDied(Unit * /*killer*/) override + void JustDied(Unit* /*killer*/) override { if (me->m_spells[0] && victimGUID) - if (Unit *victim = ObjectAccessor::GetUnit(*me, victimGUID)) + if (Unit* victim = ObjectAccessor::GetUnit(*me, victimGUID)) victim->RemoveAurasDueToSpell(me->m_spells[0], me->GetGUID()); } }; diff --git a/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp b/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp index 94d3682be..4cf8852f6 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp @@ -73,7 +73,7 @@ public: struct boss_nothAI : public BossAI { - explicit boss_nothAI(Creature *c) : BossAI(c, BOSS_NOTH), summons(me) + explicit boss_nothAI(Creature* c) : BossAI(c, BOSS_NOTH), summons(me) { pInstance = me->GetInstanceScript(); } @@ -101,7 +101,7 @@ public: { me->SetReactState(REACT_PASSIVE); me->AttackStop(); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE |UNIT_FLAG_DISABLE_MOVE); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_DISABLE_MOVE); me->SetControlled(true, UNIT_STATE_ROOT); events.SetPhase(1); events.Reset(); @@ -112,7 +112,7 @@ public: void SummonHelper(uint32 entry, uint32 count) { for (uint8 i = 0; i < count; ++i) - me->SummonCreature(entry, summoningPosition[urand(0,4)]); + me->SummonCreature(entry, summoningPosition[urand(0, 4)]); } bool IsInRoom() @@ -142,14 +142,14 @@ public: ScriptedAI::EnterEvadeMode(); } - void EnterCombat(Unit * who) override + void EnterCombat(Unit* who) override { BossAI::EnterCombat(who); Talk(SAY_AGGRO); StartGroundPhase(); } - void JustSummoned(Creature *summon) override + void JustSummoned(Creature* summon) override { summons.Summon(summon); summon->SetInCombatWithZone(); @@ -157,7 +157,7 @@ public: void JustDied(Unit* killer) override { - me->NearTeleportTo(nothPosition.GetPositionX(), nothPosition.GetPositionY(), nothPosition.GetPositionZ(), nothPosition.GetOrientation(), true); + me->NearTeleportTo(nothPosition.GetPositionX(), nothPosition.GetPositionY(), nothPosition.GetPositionZ(), nothPosition.GetOrientation(), true); BossAI::JustDied(killer); Talk(SAY_DEATH); } @@ -190,7 +190,7 @@ public: // GROUND case EVENT_SPELL_CURSE: if (events.GetPhaseMask() == 0) - me->CastCustomSpell(RAID_MODE(SPELL_CURSE_OF_THE_PLAGUEBRINGER_10, SPELL_CURSE_OF_THE_PLAGUEBRINGER_25), SPELLVALUE_MAX_TARGETS, RAID_MODE(3, 10), me, false); + me->CastCustomSpell(RAID_MODE(SPELL_CURSE_OF_THE_PLAGUEBRINGER_10, SPELL_CURSE_OF_THE_PLAGUEBRINGER_25), SPELLVALUE_MAX_TARGETS, RAID_MODE(3, 10), me, false); events.RepeatEvent(25000); break; case EVENT_SUMMON_PLAGUED_WARRIOR_ANNOUNCE: @@ -201,7 +201,7 @@ public: break; case EVENT_SUMMON_PLAGUED_WARRIOR_REAL: me->CastSpell(me, SPELL_SUMMON_PLAGUED_WARRIORS, true); - SummonHelper(NPC_PLAGUED_WARRIOR, RAID_MODE(2,3)); + SummonHelper(NPC_PLAGUED_WARRIOR, RAID_MODE(2, 3)); events.PopEvent(); break; case EVENT_MOVE_TO_BALCONY: @@ -226,14 +226,14 @@ public: case EVENT_BALCONY_SUMMON_REAL: me->CastSpell(me, SPELL_SUMMON_PLAGUED_WARRIORS, true); // visual only if (events.GetPhaseMask() == 0) - SummonHelper(NPC_PLAGUED_CHAMPION, RAID_MODE(2,4)); + SummonHelper(NPC_PLAGUED_CHAMPION, RAID_MODE(2, 4)); else if (events.GetPhaseMask() == 1) { - SummonHelper(NPC_PLAGUED_CHAMPION, RAID_MODE(1,2)); - SummonHelper(NPC_PLAGUED_GUARDIAN, RAID_MODE(1,2)); + SummonHelper(NPC_PLAGUED_CHAMPION, RAID_MODE(1, 2)); + SummonHelper(NPC_PLAGUED_GUARDIAN, RAID_MODE(1, 2)); } else - SummonHelper(NPC_PLAGUED_GUARDIAN, RAID_MODE(2,4)); + SummonHelper(NPC_PLAGUED_GUARDIAN, RAID_MODE(2, 4)); events.PopEvent(); break; case EVENT_MOVE_TO_GROUND: @@ -246,7 +246,7 @@ public: if (me->HasReactState(REACT_AGGRESSIVE)) DoMeleeAttackIfReady(); } - }; + }; }; void AddSC_boss_noth() diff --git a/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp b/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp index 4bcb3eaf8..30b88f5a9 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp @@ -49,7 +49,7 @@ public: struct boss_patchwerkAI : public BossAI { - explicit boss_patchwerkAI(Creature *c) : BossAI(c, BOSS_PATCHWERK) + explicit boss_patchwerkAI(Creature* c) : BossAI(c, BOSS_PATCHWERK) { pInstance = me->GetInstanceScript(); } @@ -68,7 +68,7 @@ public: if (who->GetTypeId() != TYPEID_PLAYER) return; - if (!urand(0,3)) + if (!urand(0, 3)) Talk(SAY_SLAY); if (pInstance) @@ -81,11 +81,11 @@ public: Talk(SAY_DEATH); } - void EnterCombat(Unit * who) override + void EnterCombat(Unit* who) override { BossAI::EnterCombat(who); Talk(SAY_AGGRO); - + me->SetInCombatWithZone(); events.ScheduleEvent(EVENT_SPELL_HATEFUL_STRIKE, 1200); events.ScheduleEvent(EVENT_SPELL_BERSERK, 360000); @@ -109,50 +109,50 @@ public: switch (events.GetEvent()) { case EVENT_SPELL_HATEFUL_STRIKE: - { - //Cast Hateful strike on the player with the highest - //amount of HP within melee distance, and second threat amount - std::list meleeRangeTargets; - Unit* finalTarget = nullptr; - uint8 counter = 0; - - auto i = me->getThreatManager().getThreatList().begin(); - for (; i != me->getThreatManager().getThreatList().end(); ++i, ++counter) { - // Gather all units with melee range - Unit *target = (*i)->getTarget(); - if (me->IsWithinMeleeRange(target)) - meleeRangeTargets.push_back(target); + //Cast Hateful strike on the player with the highest + //amount of HP within melee distance, and second threat amount + std::list meleeRangeTargets; + Unit* finalTarget = nullptr; + uint8 counter = 0; - // and add threat to most hated - if (counter < RAID_MODE(2,3)) - me->AddThreat(target, 500.0f); - } - - counter = 0; - list>::iterator itr; - for (itr = meleeRangeTargets.begin(); itr != meleeRangeTargets.end(); ++itr, ++counter) - { - // if there is only one target available - if (meleeRangeTargets.size() == 1) - finalTarget = (*itr); - else if (counter > 0) // skip first target + auto i = me->getThreatManager().getThreatList().begin(); + for (; i != me->getThreatManager().getThreatList().end(); ++i, ++counter) { - if (!finalTarget || (*itr)->GetHealth() > finalTarget->GetHealth()) - finalTarget = (*itr); + // Gather all units with melee range + Unit* target = (*i)->getTarget(); + if (me->IsWithinMeleeRange(target)) + meleeRangeTargets.push_back(target); - // third loop - if (counter >= 2) - break; + // and add threat to most hated + if (counter < RAID_MODE(2, 3)) + me->AddThreat(target, 500.0f); } + + counter = 0; + list>::iterator itr; + for (itr = meleeRangeTargets.begin(); itr != meleeRangeTargets.end(); ++itr, ++counter) + { + // if there is only one target available + if (meleeRangeTargets.size() == 1) + finalTarget = (*itr); + else if (counter > 0) // skip first target + { + if (!finalTarget || (*itr)->GetHealth() > finalTarget->GetHealth()) + finalTarget = (*itr); + + // third loop + if (counter >= 2) + break; + } + } + + if (finalTarget) + me->CastSpell(finalTarget, RAID_MODE(SPELL_HATEFUL_STRIKE_10, SPELL_HATEFUL_STRIKE_25), false); + + events.RepeatEvent(1000); + break; } - - if (finalTarget) - me->CastSpell(finalTarget, RAID_MODE(SPELL_HATEFUL_STRIKE_10, SPELL_HATEFUL_STRIKE_25), false); - - events.RepeatEvent(1000); - break; - } case EVENT_SPELL_BERSERK: Talk(EMOTE_BERSERK); me->CastSpell(me, SPELL_BERSERK, true); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp b/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp index 8d1fc40ec..a5a5ddb76 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp @@ -18,13 +18,13 @@ enum Says enum Spells { SPELL_UNBALANCING_STRIKE = 26613, - SPELL_DISRUPTING_SHOUT_10 = 29107, + SPELL_DISRUPTING_SHOUT_10 = 29107, SPELL_DISRUPTING_SHOUT_25 = 55543, SPELL_JAGGED_KNIFE = 55550, SPELL_HOPELESS = 29125, SPELL_BONE_BARRIER = 29061, - SPELL_BLOOD_STRIKE = 61696, + SPELL_BLOOD_STRIKE = 61696, }; @@ -57,7 +57,7 @@ public: struct boss_razuviousAI : public BossAI { - explicit boss_razuviousAI(Creature *c) : BossAI(c, BOSS_RAZUVIOUS), summons(me) + explicit boss_razuviousAI(Creature* c) : BossAI(c, BOSS_RAZUVIOUS), summons(me) { pInstance = me->GetInstanceScript(); } @@ -109,11 +109,11 @@ public: { BossAI::JustDied(killer); Talk(SAY_DEATH); - + me->CastSpell(me, SPELL_HOPELESS, true); } - void EnterCombat(Unit * who) override + void EnterCombat(Unit* who) override { BossAI::EnterCombat(who); Talk(SAY_AGGRO); @@ -175,7 +175,7 @@ public: struct boss_razuvious_minionAI : public ScriptedAI { - explicit boss_razuvious_minionAI(Creature *c) : ScriptedAI(c) { } + explicit boss_razuvious_minionAI(Creature* c) : ScriptedAI(c) { } EventMap events; @@ -193,7 +193,7 @@ public: me->GetInstanceScript()->SetData(DATA_IMMORTAL_FAIL, 0); } - void EnterCombat(Unit *who) override + void EnterCombat(Unit* who) override { if (Creature* cr = me->FindNearestCreature(NPC_RAZUVIOUS, 100.0f)) { diff --git a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp index 5de56f02a..4abdbd2de 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp @@ -126,10 +126,10 @@ public: void EnterCombatSelfFunction() { - Map::PlayerList const &PlList = me->GetMap()->GetPlayers(); + Map::PlayerList const& PlList = me->GetMap()->GetPlayers(); if (PlList.isEmpty()) return; - for (const auto & i : PlList) + for (const auto& i : PlList) { if (Player* player = i.GetSource()) { @@ -145,13 +145,13 @@ public: } } - void EnterCombat(Unit * who) override + void EnterCombat(Unit* who) override { BossAI::EnterCombat(who); EnterCombatSelfFunction(); me->CastSpell(me, RAID_MODE(SPELL_FROST_AURA_10, SPELL_FROST_AURA_25), true); - events.ScheduleEvent(EVENT_BERSERK, 15*60000); + events.ScheduleEvent(EVENT_BERSERK, 15 * 60000); events.ScheduleEvent(EVENT_SPELL_CLEAVE, 5000); events.ScheduleEvent(EVENT_SPELL_TAIL_SWEEP, 10000); events.ScheduleEvent(EVENT_SPELL_LIFE_DRAIN, 17000); @@ -254,18 +254,18 @@ public: events.RepeatEvent(24000); return; case EVENT_SPELL_BLIZZARD: - { - Creature* cr; - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true)) - cr = me->SummonCreature(NPC_BLIZZARD, *target, TEMPSUMMON_TIMED_DESPAWN, 16000); - else - cr = me->SummonCreature(NPC_BLIZZARD, *me, TEMPSUMMON_TIMED_DESPAWN, 16000); - - if (cr) - cr->GetMotionMaster()->MoveRandom(40); - events.RepeatEvent(RAID_MODE(8000, 6500)); - return; - } + { + Creature* cr; + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true)) + cr = me->SummonCreature(NPC_BLIZZARD, *target, TEMPSUMMON_TIMED_DESPAWN, 16000); + else + cr = me->SummonCreature(NPC_BLIZZARD, *me, TEMPSUMMON_TIMED_DESPAWN, 16000); + + if (cr) + cr->GetMotionMaster()->MoveRandom(40); + events.RepeatEvent(RAID_MODE(8000, 6500)); + return; + } case EVENT_FLIGHT_START: if (me->HealthBelowPct(11)) { @@ -292,44 +292,44 @@ public: iceboltCount = RAID_MODE(2, 3); return; case EVENT_FLIGHT_ICEBOLT: - { - events.PopEvent(); - if (currentTarget) - if (Unit* target = ObjectAccessor::GetUnit(*me, currentTarget)) - me->SummonGameObject(GO_ICE_BLOCK, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), target->GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 0); - - std::vector targets; - auto i = me->getThreatManager().getThreatList().begin(); - for (; i != me->getThreatManager().getThreatList().end(); ++i) - if ((*i)->getTarget()->GetTypeId() == TYPEID_PLAYER) - { - bool inList = false; - if (!blockList.empty()) - for (std::list::const_iterator itr = blockList.begin(); itr != blockList.end(); ++itr) - if ((*i)->getTarget()->GetGUID() == *itr) - { - inList = true; - break; - } - - if (!inList) - targets.push_back((*i)->getTarget()); - } - - if (!targets.empty() && iceboltCount) { - auto itr = targets.begin(); - advance(itr, urand(0, targets.size()-1)); - me->CastSpell(*itr, SPELL_ICEBOLT_CAST, false); - blockList.push_back((*itr)->GetGUID()); - currentTarget = (*itr)->GetGUID(); - --iceboltCount; - events.ScheduleEvent(EVENT_FLIGHT_ICEBOLT, (me->GetExactDist(*itr) / 13.0f)*IN_MILLISECONDS); + events.PopEvent(); + if (currentTarget) + if (Unit* target = ObjectAccessor::GetUnit(*me, currentTarget)) + me->SummonGameObject(GO_ICE_BLOCK, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), target->GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 0); + + std::vector targets; + auto i = me->getThreatManager().getThreatList().begin(); + for (; i != me->getThreatManager().getThreatList().end(); ++i) + if ((*i)->getTarget()->GetTypeId() == TYPEID_PLAYER) + { + bool inList = false; + if (!blockList.empty()) + for (std::list::const_iterator itr = blockList.begin(); itr != blockList.end(); ++itr) + if ((*i)->getTarget()->GetGUID() == *itr) + { + inList = true; + break; + } + + if (!inList) + targets.push_back((*i)->getTarget()); + } + + if (!targets.empty() && iceboltCount) + { + auto itr = targets.begin(); + advance(itr, urand(0, targets.size() - 1)); + me->CastSpell(*itr, SPELL_ICEBOLT_CAST, false); + blockList.push_back((*itr)->GetGUID()); + currentTarget = (*itr)->GetGUID(); + --iceboltCount; + events.ScheduleEvent(EVENT_FLIGHT_ICEBOLT, (me->GetExactDist(*itr) / 13.0f)*IN_MILLISECONDS); + } + else + events.ScheduleEvent(EVENT_FLIGHT_BREATH, 1000); + return; } - else - events.ScheduleEvent(EVENT_FLIGHT_BREATH, 1000); - return; - } case EVENT_FLIGHT_BREATH: currentTarget = 0; Talk(EMOTE_BREATH); @@ -367,21 +367,21 @@ public: events.PopEvent(); return; case EVENT_HUNDRED_CLUB: - { - Map::PlayerList const& pList = me->GetMap()->GetPlayers(); - for (const auto & itr : pList) { - if (itr.GetSource()->GetResistance(SPELL_SCHOOL_FROST) > 100 && pInstance) + Map::PlayerList const& pList = me->GetMap()->GetPlayers(); + for (const auto& itr : pList) { - events.PopEvent(); - pInstance->SetData(DATA_HUNDRED_CLUB, 0); - return; - } + if (itr.GetSource()->GetResistance(SPELL_SCHOOL_FROST) > 100 && pInstance) + { + events.PopEvent(); + pInstance->SetData(DATA_HUNDRED_CLUB, 0); + return; + } + } + events.RepeatEvent(5000); + return; } - events.RepeatEvent(5000); - return; - } } DoMeleeAttackIfReady(); @@ -391,41 +391,41 @@ public: class spell_sapphiron_frost_explosion : public SpellScriptLoader { - public: - spell_sapphiron_frost_explosion() : SpellScriptLoader("spell_sapphiron_frost_explosion") { } +public: + spell_sapphiron_frost_explosion() : SpellScriptLoader("spell_sapphiron_frost_explosion") { } - class spell_sapphiron_frost_explosion_SpellScript : public SpellScript + class spell_sapphiron_frost_explosion_SpellScript : public SpellScript + { + PrepareSpellScript(spell_sapphiron_frost_explosion_SpellScript); + + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_sapphiron_frost_explosion_SpellScript); + Unit* caster = GetCaster(); + if (!caster || !caster->ToCreature()) + return; - void FilterTargets(std::list& targets) + std::list tmplist; + for (auto& target : targets) { - Unit* caster = GetCaster(); - if (!caster || !caster->ToCreature()) - return; - - std::list tmplist; - for (auto & target : targets) - { - if (CAST_AI(boss_sapphiron::boss_sapphironAI, caster->ToCreature()->AI())->IsValidExplosionTarget(target)) - tmplist.push_back(target); - } - - targets.clear(); - for (auto & itr : tmplist) - targets.push_back(itr); + if (CAST_AI(boss_sapphiron::boss_sapphironAI, caster->ToCreature()->AI())->IsValidExplosionTarget(target)) + tmplist.push_back(target); } - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sapphiron_frost_explosion_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_sapphiron_frost_explosion_SpellScript(); + targets.clear(); + for (auto& itr : tmplist) + targets.push_back(itr); } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sapphiron_frost_explosion_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_sapphiron_frost_explosion_SpellScript(); + } }; void AddSC_boss_sapphiron() diff --git a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp index b16f67c8f..56cc6e6d9 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp @@ -78,7 +78,7 @@ enum Events EVENT_MINION_SPELL_STATIC_FIELD = 4, EVENT_THADDIUS_START = 10, - EVENT_THADDIUS_SPELL_CHAIN_LIGHTNING= 11, + EVENT_THADDIUS_SPELL_CHAIN_LIGHTNING = 11, EVENT_THADDIUS_SPELL_BERSERK = 12, EVENT_THADDIUS_POLARITY_SHIFT = 13, EVENT_THADDIUS_START_2 = 14, @@ -105,7 +105,7 @@ public: struct boss_thaddiusAI : public BossAI { - explicit boss_thaddiusAI(Creature *c) : BossAI(c, BOSS_THADDIUS), summons(me), ballLightningEnabled(false) + explicit boss_thaddiusAI(Creature* c) : BossAI(c, BOSS_THADDIUS), summons(me), ballLightningEnabled(false) { pInstance = me->GetInstanceScript(); } @@ -199,7 +199,7 @@ public: void JustSummoned(Creature* cr) override { summons.Summon(cr); } - void EnterCombat(Unit * who) override + void EnterCombat(Unit* who) override { BossAI::EnterCombat(who); me->SetInCombatWithZone(); @@ -239,7 +239,7 @@ public: } if (!UpdateVictim()) - return; + return; events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) @@ -259,9 +259,9 @@ public: switch (events.GetEvent()) { case EVENT_THADDIUS_START: - StartEvent(); - events.PopEvent(); - break; + StartEvent(); + events.PopEvent(); + break; case EVENT_THADDIUS_START_2: events.PopEvent(); Talk(SAY_AGGRO); @@ -269,7 +269,7 @@ public: me->SetControlled(false, UNIT_STATE_STUNNED); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->setAttackTimer(BASE_ATTACK, 4000); - + events.ScheduleEvent(EVENT_THADDIUS_SPELL_CHAIN_LIGHTNING, 14000); events.ScheduleEvent(EVENT_THADDIUS_SPELL_BERSERK, 360000); events.ScheduleEvent(EVENT_THADDIUS_POLARITY_SHIFT, 30000); @@ -295,10 +295,9 @@ public: if (me->IsWithinMeleeRange(me->GetVictim())) DoMeleeAttackIfReady(); - else - if (ballLightningEnabled) - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) - DoCast(target, SPELL_BALL_LIGHTNING); + else if (ballLightningEnabled) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) + DoCast(target, SPELL_BALL_LIGHTNING); } }; }; @@ -315,11 +314,11 @@ public: struct boss_thaddius_summonAI : public ScriptedAI { - explicit boss_thaddius_summonAI(Creature *c) : ScriptedAI(c) + explicit boss_thaddius_summonAI(Creature* c) : ScriptedAI(c) { - pInstance = me->GetInstanceScript(); - overload = false; - myCoil = 0; + pInstance = me->GetInstanceScript(); + overload = false; + myCoil = 0; } InstanceScript* pInstance; @@ -347,8 +346,8 @@ public: void EnterEvadeMode() override { - me->SetControlled(false, UNIT_STATE_STUNNED); - ScriptedAI::EnterEvadeMode(); + me->SetControlled(false, UNIT_STATE_STUNNED); + ScriptedAI::EnterEvadeMode(); } void EnterCombat(Unit* pWho) override @@ -367,7 +366,7 @@ public: events.ScheduleEvent(EVENT_MINION_SPELL_STATIC_FIELD, 5000); Talk(SAY_FEUG_AGGRO); } - + events.ScheduleEvent(EVENT_MINION_CHECK_DISTANCE, 5000); // This event needs synchronisation, called for stalagg only @@ -419,7 +418,7 @@ public: if (pInstance) pInstance->SetData(DATA_IMMORTAL_FAIL, 0); - if (!urand(0,2)) + if (!urand(0, 2)) Talk(me->GetEntry() == NPC_STALAGG ? SAY_STAL_SLAY : SAY_FEUG_SLAY); } @@ -488,7 +487,7 @@ public: me->CastSpell(tankFeugen, SPELL_MAGNETIC_PULL, true); DoAction(ACTION_MAGNETIC_PULL); } - + break; case EVENT_MINION_CHECK_DISTANCE: if (Creature* cr = ObjectAccessor::GetCreature(*me, myCoil)) @@ -528,108 +527,108 @@ public: class spell_thaddius_pos_neg_charge : public SpellScriptLoader { - public: - spell_thaddius_pos_neg_charge() : SpellScriptLoader("spell_thaddius_pos_neg_charge") { } +public: + spell_thaddius_pos_neg_charge() : SpellScriptLoader("spell_thaddius_pos_neg_charge") { } - class spell_thaddius_pos_neg_charge_SpellScript : public SpellScript + class spell_thaddius_pos_neg_charge_SpellScript : public SpellScript + { + PrepareSpellScript(spell_thaddius_pos_neg_charge_SpellScript); + + void HandleTargets(std::list& targets) { - PrepareSpellScript(spell_thaddius_pos_neg_charge_SpellScript); + uint8 count = 0; + for (auto& ihit : targets) + if (ihit->GetGUID() != GetCaster()->GetGUID()) + if (Player* target = ihit->ToPlayer()) + if (target->HasAura(GetTriggeringSpell()->Id)) + ++count; - void HandleTargets(std::list& targets) + if (count) { - uint8 count = 0; - for (auto & ihit : targets) - if (ihit->GetGUID() != GetCaster()->GetGUID()) - if (Player* target = ihit->ToPlayer()) - if (target->HasAura(GetTriggeringSpell()->Id)) - ++count; + uint32 spellId = 0; - if (count) - { - uint32 spellId = 0; + if (GetSpellInfo()->Id == SPELL_POSITIVE_CHARGE) + spellId = SPELL_POSITIVE_CHARGE_STACK; + else // if (GetSpellInfo()->Id == SPELL_NEGATIVE_CHARGE) + spellId = SPELL_NEGATIVE_CHARGE_STACK; - if (GetSpellInfo()->Id == SPELL_POSITIVE_CHARGE) - spellId = SPELL_POSITIVE_CHARGE_STACK; - else // if (GetSpellInfo()->Id == SPELL_NEGATIVE_CHARGE) - spellId = SPELL_NEGATIVE_CHARGE_STACK; - - GetCaster()->SetAuraStack(spellId, GetCaster(), count); - } + GetCaster()->SetAuraStack(spellId, GetCaster(), count); } - - void HandleDamage(SpellEffIndex /*effIndex*/) - { - if (!GetTriggeringSpell()) - return; - - Unit* target = GetHitUnit(); - if (!target) - return; - - if (target->HasAura(GetTriggeringSpell()->Id) || target->GetTypeId() != TYPEID_PLAYER) - SetHitDamage(0); - else if (target->GetInstanceScript()) - target->GetInstanceScript()->SetData(DATA_CHARGES_CROSSED, 0); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_thaddius_pos_neg_charge_SpellScript::HandleDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_thaddius_pos_neg_charge_SpellScript::HandleTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_thaddius_pos_neg_charge_SpellScript(); } + + void HandleDamage(SpellEffIndex /*effIndex*/) + { + if (!GetTriggeringSpell()) + return; + + Unit* target = GetHitUnit(); + if (!target) + return; + + if (target->HasAura(GetTriggeringSpell()->Id) || target->GetTypeId() != TYPEID_PLAYER) + SetHitDamage(0); + else if (target->GetInstanceScript()) + target->GetInstanceScript()->SetData(DATA_CHARGES_CROSSED, 0); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_thaddius_pos_neg_charge_SpellScript::HandleDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_thaddius_pos_neg_charge_SpellScript::HandleTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_thaddius_pos_neg_charge_SpellScript(); + } }; class spell_thaddius_polarity_shift : public SpellScriptLoader { - public: - spell_thaddius_polarity_shift() : SpellScriptLoader("spell_thaddius_polarity_shift") { } +public: + spell_thaddius_polarity_shift() : SpellScriptLoader("spell_thaddius_polarity_shift") { } - class spell_thaddius_polarity_shift_SpellScript : public SpellScript + class spell_thaddius_polarity_shift_SpellScript : public SpellScript + { + PrepareSpellScript(spell_thaddius_polarity_shift_SpellScript); + + bool Validate(SpellInfo const* /*spell*/) override { - PrepareSpellScript(spell_thaddius_polarity_shift_SpellScript); - - bool Validate(SpellInfo const* /*spell*/) override - { - if (!sSpellMgr->GetSpellInfo(SPELL_POSITIVE_POLARITY) || !sSpellMgr->GetSpellInfo(SPELL_NEGATIVE_POLARITY)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /* effIndex */) - { - Unit* caster = GetCaster(); - if (Unit* target = GetHitUnit()) - target->CastSpell(target, roll_chance_i(50) ? SPELL_POSITIVE_POLARITY : SPELL_NEGATIVE_POLARITY, true, nullptr, nullptr, caster->GetGUID()); - } - - void HandleAfterCast() - { - if (GetCaster()) - if (Creature* caster = GetCaster()->ToCreature()) - if (caster->GetEntry() == NPC_THADDIUS) - { - caster->AI()->Talk(SAY_ELECT); - caster->AI()->Talk(EMOTE_POLARITY_SHIFTED); - } - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_thaddius_polarity_shift_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - AfterCast += SpellCastFn(spell_thaddius_polarity_shift_SpellScript::HandleAfterCast); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_thaddius_polarity_shift_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_POSITIVE_POLARITY) || !sSpellMgr->GetSpellInfo(SPELL_NEGATIVE_POLARITY)) + return false; + return true; } + + void HandleDummy(SpellEffIndex /* effIndex */) + { + Unit* caster = GetCaster(); + if (Unit* target = GetHitUnit()) + target->CastSpell(target, roll_chance_i(50) ? SPELL_POSITIVE_POLARITY : SPELL_NEGATIVE_POLARITY, true, nullptr, nullptr, caster->GetGUID()); + } + + void HandleAfterCast() + { + if (GetCaster()) + if (Creature* caster = GetCaster()->ToCreature()) + if (caster->GetEntry() == NPC_THADDIUS) + { + caster->AI()->Talk(SAY_ELECT); + caster->AI()->Talk(EMOTE_POLARITY_SHIFTED); + } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_thaddius_polarity_shift_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + AfterCast += SpellCastFn(spell_thaddius_polarity_shift_SpellScript::HandleAfterCast); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_thaddius_polarity_shift_SpellScript(); + } }; class npc_tesla : public CreatureScript @@ -655,21 +654,21 @@ public: class at_thaddius_entrance : public AreaTriggerScript { - public: - at_thaddius_entrance() : AreaTriggerScript("at_thaddius_entrance") { } - - bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) override - { - InstanceScript* instance = player->GetInstanceScript(); - if (!instance || instance->GetData(DATA_HAD_THADDIUS_GREET) || instance->GetBossState(BOSS_THADDIUS) == DONE) - return true; - - if (Creature* thaddius = ObjectAccessor::GetCreature(*player, instance->GetData64(DATA_THADDIUS_BOSS))) - thaddius->AI()->Talk(SAY_GREET); - instance->SetData(DATA_HAD_THADDIUS_GREET, 1); +public: + at_thaddius_entrance() : AreaTriggerScript("at_thaddius_entrance") { } + bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) override + { + InstanceScript* instance = player->GetInstanceScript(); + if (!instance || instance->GetData(DATA_HAD_THADDIUS_GREET) || instance->GetBossState(BOSS_THADDIUS) == DONE) return true; - } + + if (Creature* thaddius = ObjectAccessor::GetCreature(*player, instance->GetData64(DATA_THADDIUS_BOSS))) + thaddius->AI()->Talk(SAY_GREET); + instance->SetData(DATA_HAD_THADDIUS_GREET, 1); + + return true; + } }; void AddSC_boss_thaddius() diff --git a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp index 1264263c5..1fb3adce9 100644 --- a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp +++ b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp @@ -28,7 +28,7 @@ inline uint8 GetEruptionSection(float x, float y) if (x > -1.0f) return 3; - float slope = y/x; + float slope = y / x; for (uint32 i = 0; i < 3; ++i) if (slope > HeiganEruptionSlope[i]) return i; @@ -50,7 +50,7 @@ public: explicit instance_naxxramas_InstanceMapScript(Map* pMap) : InstanceScript(pMap) { SetBossNumber(MAX_ENCOUNTERS); - for (auto & i : HeiganEruption) + for (auto& i : HeiganEruption) i.clear(); // GOs @@ -77,7 +77,7 @@ public: _plagueEyePortalGUID = 0; _spiderEyePortalGUID = 0; _abomEyePortalGUID = 0; - + // NPCs PatchwerkRoomTrash.clear(); _patchwerkGUID = 0; @@ -141,7 +141,7 @@ public: uint64 _plagueEyePortalGUID; uint64 _spiderEyePortalGUID; uint64 _abomEyePortalGUID; - + // NPCs std::list PatchwerkRoomTrash; uint64 _patchwerkGUID; @@ -346,30 +346,30 @@ public: break; case GO_KELTHUZAD_GATE: _kelthuzadgateGUID = pGo->GetGUID(); - if (GetBossState(BOSS_SAPPHIRON) == DONE && _speakTimer==0) + if (GetBossState(BOSS_SAPPHIRON) == DONE && _speakTimer == 0) pGo->SetGoState(GO_STATE_ACTIVE); - break; + break; case GO_SAPPHIRON_GATE: _sapphironGateGUID = pGo->GetGUID(); if (GetBossState(BOSS_SAPPHIRON) == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; - case GO_DEATHKNIGHT_WING: + case GO_DEATHKNIGHT_WING: _loathebPortalGUID = pGo->GetGUID(); if (GetBossState(BOSS_LOATHEB) == DONE) pGo->SetPhaseMask(1, true); break; - case GO_THADDIUS_PORTAL: + case GO_THADDIUS_PORTAL: _thaddiusPortalGUID = pGo->GetGUID(); if (GetBossState(BOSS_THADDIUS) == DONE) pGo->SetPhaseMask(1, true); break; - case GO_MAEXXNA_PORTAL: + case GO_MAEXXNA_PORTAL: _maexxnaPortalGUID = pGo->GetGUID(); if (GetBossState(BOSS_MAEXXNA) == DONE) pGo->SetPhaseMask(1, true); break; - case GO_HORSEMAN_PORTAL: + case GO_HORSEMAN_PORTAL: _horsemanPortalGUID = pGo->GetGUID(); if (GetBossState(BOSS_HORSEMAN) == DONE) pGo->SetPhaseMask(1, true); @@ -417,7 +417,7 @@ public: { case 7600: // And They Would All Go Down Together (10 player) case 7601: // And They Would All Go Down Together (25 player) - return (_horsemanTimer < 15*IN_MILLISECONDS); + return (_horsemanTimer < 15 * IN_MILLISECONDS); case 7614: // Just Can't Get Enough (10 player) case 7615: // Just Can't Get Enough (25 player) return abominationsKilled >= 18; @@ -435,31 +435,61 @@ public: return heiganAchievement; case 7608: // Subtraction (10 player) // The Dedicated few (10 player) - case 6802: case 7146: case 7147: case 7148: case 7149: - case 7150: case 7151: case 7152: case 7153: case 7154: - case 7155: case 7156: case 7157: case 7158: + case 6802: + case 7146: + case 7147: + case 7148: + case 7149: + case 7150: + case 7151: + case 7152: + case 7153: + case 7154: + case 7155: + case 7156: + case 7157: + case 7158: return (instance->GetPlayersCountExceptGMs() < 9); case 7609: // Subtraction (25 player) // The Dedicated few (25 player) - case 7159: case 7160: case 7161: case 7162: case 7163: - case 7164: case 7165: case 7166: case 7167: case 7168: - case 7169: case 7170: case 7171: case 7172: + case 7159: + case 7160: + case 7161: + case 7162: + case 7163: + case 7164: + case 7165: + case 7166: + case 7167: + case 7168: + case 7169: + case 7170: + case 7171: + case 7172: return (instance->GetPlayersCountExceptGMs() < 21); case 7567: // The Hundred Club (10 player) case 7568: // The Hundred Club (25 player) return sapphironAchievement; // The Undying - case 7617: case 13237: case 13238: case 13239: case 13240: + case 7617: + case 13237: + case 13238: + case 13239: + case 13240: // The Immortal - case 7616: case 13233: case 13234: case 13235: case 13236: - { - uint8 count = 0; - for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) - if (GetBossState(i) == NOT_STARTED) - ++count; + case 7616: + case 13233: + case 13234: + case 13235: + case 13236: + { + uint8 count = 0; + for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) + if (GetBossState(i) == NOT_STARTED) + ++count; - return !count && immortalAchievement; - } + return !count && immortalAchievement; + } default: return false; @@ -517,7 +547,7 @@ public: { if (Creature* patch = instance->GetCreature(_patchwerkGUID)) { - for (auto &itr : PatchwerkRoomTrash) + for (auto& itr : PatchwerkRoomTrash) { Creature* trash = ObjectAccessor::GetCreature(*patch, itr); if (trash && trash->IsAlive() && !trash->IsInCombat()) @@ -533,7 +563,8 @@ public: { _horsemanTimer++; _horsemanKilled++; - if (_horsemanKilled < 4) { + if (_horsemanKilled < 4) + { return false; } @@ -588,11 +619,11 @@ public: if (state == NOT_STARTED) _horsemanTimer = 0; } - - + + if (!InstanceScript::SetBossState(bossId, state)) return false; - + // Bosses data switch(bossId) { @@ -629,7 +660,7 @@ public: default: break; } - + // Save instance and open gates if (state == DONE) { @@ -719,7 +750,7 @@ public: break; } } - + return true; } @@ -879,7 +910,7 @@ public: else OUT_LOAD_INST_DATA_FAIL; } - + }; }; class boss_naxxramas_misc : public CreatureScript @@ -923,7 +954,7 @@ public: if (Creature* cr = me->SummonCreature(NPC_LIVING_POISON, *me, TEMPSUMMON_TIMED_DESPAWN, 9000)) { cr->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); - cr->GetMotionMaster()->MovePoint(0, me->GetPositionX()+50*cos(me->GetOrientation()), me->GetPositionY()+50*sin(me->GetOrientation()), me->GetPositionZ(), false); + cr->GetMotionMaster()->MovePoint(0, me->GetPositionX() + 50 * cos(me->GetOrientation()), me->GetPositionY() + 50 * sin(me->GetOrientation()), me->GetPositionZ(), false); } timer = 0; } diff --git a/src/server/scripts/Northrend/Naxxramas/naxxramas.h b/src/server/scripts/Northrend/Naxxramas/naxxramas.h index 3c0d86794..bc3f50741 100644 --- a/src/server/scripts/Northrend/Naxxramas/naxxramas.h +++ b/src/server/scripts/Northrend/Naxxramas/naxxramas.h @@ -71,7 +71,7 @@ enum NXGOs GO_GOTHIK_EXIT_GATE = 181125, GO_HORSEMAN_GATE = 181119, GO_SAPPHIRON_GATE = 181225, - + GO_HORSEMEN_CHEST_10 = 181366, GO_HORSEMEN_CHEST_25 = 193426, @@ -88,7 +88,7 @@ enum NXGOs GO_PLAGUE_EYE_PORTAL = 181211, GO_SPIDER_EYE_PORTAL = 181212, GO_ABOM_EYE_PORTAL = 181213, - + GO_CONS_NOX_TESLA_STALAGG = 268049, GO_CONS_NOX_TESLA_FEUGEN = 268050 }; diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp index c96f1c0f6..097cad3f0 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp @@ -136,13 +136,13 @@ enum Texts SAY_DEEP_BREATH, SAY_SLAY_P1, SAY_END_P1, - SAY_PHASE_2, + SAY_PHASE_2, SAY_ANTIMAGIC_SHELL, SAY_MAGIC_BLAST, SAY_SLAY_P2, SAY_END_P2, SAY_INTRO_PHASE_3, - SAY_PHASE_3, + SAY_PHASE_3, EMOTE_SURGE_OF_POWER_WARNING_P2, SAY_SURGE_OF_POWER, SAY_BUFFED_BY_SPARK, @@ -194,7 +194,7 @@ public: struct boss_malygosAI : public ScriptedAI { - boss_malygosAI(Creature *c) : ScriptedAI(c), summons(me) + boss_malygosAI(Creature* c) : ScriptedAI(c), summons(me) { pInstance = me->GetInstanceScript(); } @@ -246,9 +246,9 @@ public: { float angle = me->GetOrientation(); float dist = 75.0f; - if (Creature *c = me->SummonCreature(NPC_PORTAL, me->GetPositionX()+cos(angle)*dist, me->GetPositionY()+sin(angle)*dist, me->GetPositionZ(), FourSidesPos[id].GetOrientation(), TEMPSUMMON_TIMED_DESPAWN, 13000)) + if (Creature* c = me->SummonCreature(NPC_PORTAL, me->GetPositionX() + cos(angle) * dist, me->GetPositionY() + sin(angle) * dist, me->GetPositionZ(), FourSidesPos[id].GetOrientation(), TEMPSUMMON_TIMED_DESPAWN, 13000)) me->CastSpell(c, SPELL_PORTAL_BEAM, false); - timer2 = INTRO_MOVEMENT_INTERVAL-10000; + timer2 = INTRO_MOVEMENT_INTERVAL - 10000; } break; @@ -300,7 +300,7 @@ public: } } - void SpellHit(Unit * /*caster*/, const SpellInfo *spell) override + void SpellHit(Unit* /*caster*/, const SpellInfo* spell) override { if (spell->Id == SPELL_POWER_SPARK_MALYGOS_BUFF) { @@ -344,7 +344,7 @@ public: } } - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask) override + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override { if (damage >= me->GetHealth() && !me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE)) // allow dying only in phase 3! { @@ -388,8 +388,8 @@ public: me->InterruptNonMeleeSpells(true); me->RemoveAllAuras(); float angle = CenterPos.GetAngle(me); - float x = CenterPos.GetPositionX() + cos(angle)*35.0f; - float y = CenterPos.GetPositionY() + sin(angle)*35.0f; + float x = CenterPos.GetPositionX() + cos(angle) * 35.0f; + float y = CenterPos.GetPositionY() + sin(angle) * 35.0f; float z = FourSidesPos[0].GetPositionZ(); me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); me->GetMotionMaster()->MovePoint(MI_POINT_INTRO_CENTER_AIR, x, y, z); @@ -419,33 +419,33 @@ public: events.SetPhase(PHASE_ONE); events.RescheduleEvent(EVENT_BERSERK, 600000, 0); - events.RescheduleEvent(EVENT_SPELL_ARCANE_BREATH, urand(9000,12000), 1); - events.RescheduleEvent(EVENT_SPELL_ARCANE_STORM, urand(2000,5000), 1); - events.RescheduleEvent(EVENT_SUMMON_POWER_SPARK, urand(10000,15000), 1); + events.RescheduleEvent(EVENT_SPELL_ARCANE_BREATH, urand(9000, 12000), 1); + events.RescheduleEvent(EVENT_SPELL_ARCANE_STORM, urand(2000, 5000), 1); + events.RescheduleEvent(EVENT_SUMMON_POWER_SPARK, urand(10000, 15000), 1); events.RescheduleEvent(EVENT_START_VORTEX_0, 30000, 1); } break; case EVENT_SPELL_ARCANE_BREATH: me->CastSpell(me->GetVictim(), SPELL_ARCANE_BREATH, false); - events.RepeatEvent(urand(12000,15000)); + events.RepeatEvent(urand(12000, 15000)); break; case EVENT_SPELL_ARCANE_STORM: me->CastCustomSpell(SPELL_ARCANE_STORM, SPELLVALUE_MAX_TARGETS, DUNGEON_MODE(5, 12), me, true); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); break; case EVENT_SUMMON_POWER_SPARK: { uint8 random = urand(0, 3); - if (Creature *c = me->SummonCreature(NPC_PORTAL, FourSidesPos[random], TEMPSUMMON_TIMED_DESPAWN, 6000)) + if (Creature* c = me->SummonCreature(NPC_PORTAL, FourSidesPos[random], TEMPSUMMON_TIMED_DESPAWN, 6000)) c->CastSpell(c, SPELL_PORTAL_BEAM, false); if (Creature* c = me->SummonCreature(NPC_POWER_SPARK, FourSidesPos[random], TEMPSUMMON_MANUAL_DESPAWN, 0)) { c->AI()->DoAction(1); c->AI()->Talk(EMOTE_POWER_SPARK); } - - events.RepeatEvent(urand(20000,30000)); + + events.RepeatEvent(urand(20000, 30000)); } break; case EVENT_START_VORTEX_0: @@ -465,14 +465,14 @@ public: me->SetDisableGravity(true); //me->SetHover(true); me->SendMovementFlagUpdate(); - me->GetMotionMaster()->MoveTakeoff(MI_POINT_VORTEX_TAKEOFF, me->GetPositionX(), me->GetPositionY(), CenterPos.GetPositionZ()+20.0f, 7.0f); + me->GetMotionMaster()->MoveTakeoff(MI_POINT_VORTEX_TAKEOFF, me->GetPositionX(), me->GetPositionY(), CenterPos.GetPositionZ() + 20.0f, 7.0f); events.PopEvent(); events.DelayEvents(25000, 1); // don't delay berserk (group 0) } break; case EVENT_VORTEX_FLY_TO_CENTER: - me->GetMotionMaster()->MovePoint(MI_POINT_VORTEX_CENTER, CenterPos.GetPositionX(), CenterPos.GetPositionY(), CenterPos.GetPositionZ()+20.0f); + me->GetMotionMaster()->MovePoint(MI_POINT_VORTEX_CENTER, CenterPos.GetPositionX(), CenterPos.GetPositionY(), CenterPos.GetPositionZ() + 20.0f); events.PopEvent(); break; case EVENT_START_VORTEX_REAL: @@ -482,10 +482,10 @@ public: { Position pos; - float angle = (me->GetOrientation() >= M_PI/4 ? me->GetOrientation()-M_PI/4 : 7*M_PI/4+me->GetOrientation()); - pos.m_positionX = CenterPos.GetPositionX()+cos(angle)*40.0f; - pos.m_positionY = CenterPos.GetPositionY()+sin(angle)*40.0f; - pos.m_positionZ = CenterPos.GetPositionZ()+20.0f; + float angle = (me->GetOrientation() >= M_PI / 4 ? me->GetOrientation() - M_PI / 4 : 7 * M_PI / 4 + me->GetOrientation()); + pos.m_positionX = CenterPos.GetPositionX() + cos(angle) * 40.0f; + pos.m_positionY = CenterPos.GetPositionY() + sin(angle) * 40.0f; + pos.m_positionZ = CenterPos.GetPositionZ() + 20.0f; pos.m_orientation = pos.GetAngle(&CenterPos); if (Creature* vp = me->SummonCreature(NPC_WORLD_TRIGGER_LAOI, pos, TEMPSUMMON_TIMED_DESPAWN, 14000)) @@ -493,19 +493,19 @@ public: vp->SetCanFly(true); vp->SetDisableGravity(true); - Map::PlayerList const &PlayerList = me->GetMap()->GetPlayers(); + Map::PlayerList const& PlayerList = me->GetMap()->GetPlayers(); if (!PlayerList.isEmpty()) for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) - if (Player *pPlayer = i->GetSource()) + if (Player* pPlayer = i->GetSource()) { if (!pPlayer->IsAlive() || pPlayer->IsGameMaster()) continue; Position plrpos; float angle = CenterPos.GetAngle(pPlayer); - plrpos.m_positionX = CenterPos.GetPositionX()+cos(angle)*5.0f; - plrpos.m_positionY = CenterPos.GetPositionY()+sin(angle)*5.0f; - plrpos.m_positionZ = CenterPos.GetPositionZ()+18.0f; + plrpos.m_positionX = CenterPos.GetPositionX() + cos(angle) * 5.0f; + plrpos.m_positionY = CenterPos.GetPositionY() + sin(angle) * 5.0f; + plrpos.m_positionZ = CenterPos.GetPositionZ() + 18.0f; plrpos.m_orientation = plrpos.GetAngle(&CenterPos); if (Creature* c = me->SummonCreature(NPC_VORTEX, plrpos, TEMPSUMMON_TIMED_DESPAWN, 15000)) @@ -546,20 +546,20 @@ public: events.PopEvent(); break; case EVENT_VORTEX_LAND_1: - { - bLockHealthCheck = false; - EntryCheckPredicate pred(NPC_POWER_SPARK); - summons.DoAction(1, pred); // resume following - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED); - if (Unit* target = me->GetVictim()) { - AttackStart(target); - me->GetMotionMaster()->MoveChase(target); + bLockHealthCheck = false; + EntryCheckPredicate pred(NPC_POWER_SPARK); + summons.DoAction(1, pred); // resume following + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED); + if (Unit* target = me->GetVictim()) + { + AttackStart(target); + me->GetMotionMaster()->MoveChase(target); + } + events.PopEvent(); + events.RescheduleEvent(EVENT_START_VORTEX_0, 60000, 1); + break; } - events.PopEvent(); - events.RescheduleEvent(EVENT_START_VORTEX_0, 60000, 1); - break; - } case EVENT_START_PHASE_2: events.SetPhase(PHASE_TWO); Talk(SAY_END_P1); @@ -572,44 +572,44 @@ public: events.CancelEventGroup(1); // don't cancel berserk (group 0) break; case EVENT_START_PHASE_2_FLY_UP: - { - me->SendMeleeAttackStop(me->GetVictim()); - me->GetMotionMaster()->MoveIdle(); - me->DisableSpline(); - me->SetCanFly(true); - me->SetDisableGravity(true); - //me->SetHover(true); - me->SendMovementFlagUpdate(); - me->GetMotionMaster()->MoveTakeoff(MI_POINT_CENTER_AIR_PH_2, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+32.0f, 7.0f); - events.PopEvent(); - events.RescheduleEvent(EVENT_START_PHASE_2_MOVE_TO_SIDE, 22500, 1); - break; - } + { + me->SendMeleeAttackStop(me->GetVictim()); + me->GetMotionMaster()->MoveIdle(); + me->DisableSpline(); + me->SetCanFly(true); + me->SetDisableGravity(true); + //me->SetHover(true); + me->SendMovementFlagUpdate(); + me->GetMotionMaster()->MoveTakeoff(MI_POINT_CENTER_AIR_PH_2, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 32.0f, 7.0f); + events.PopEvent(); + events.RescheduleEvent(EVENT_START_PHASE_2_MOVE_TO_SIDE, 22500, 1); + break; + } case EVENT_START_PHASE_2_MOVE_TO_SIDE: Talk(SAY_PHASE_2); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_PACIFIED); me->GetMotionMaster()->MovePoint(MI_POINT_CIRCLE_OUTSIDE_PH_2, Phase2NorthPos); - events.RescheduleEvent(EVENT_SPELL_ARCANE_STORM, urand(12000,15000), 1); + events.RescheduleEvent(EVENT_SPELL_ARCANE_STORM, urand(12000, 15000), 1); events.RescheduleEvent(EVENT_SPELL_ARCANE_OVERLOAD, 8000, 1); events.RescheduleEvent(EVENT_MOVE_TO_SURGE_OF_POWER, 55000, 1); events.RescheduleEvent(EVENT_CHECK_TRASH_DEAD, 3000, 1); - for (int i=0; iSummonCreature(NPC_HOVER_DISK, CenterPos.GetPositionX()+cos(angle)*dist, CenterPos.GetPositionY()+sin(angle)*dist, CenterPos.GetPositionZ()+30.0f, 0.0f, TEMPSUMMON_MANUAL_DESPAWN, 0)) + float angle = M_PI / 2 + ((float)i / MAX_NEXUS_LORDS) * 2 * M_PI; + if (Creature* disk = me->SummonCreature(NPC_HOVER_DISK, CenterPos.GetPositionX() + cos(angle) * dist, CenterPos.GetPositionY() + sin(angle) * dist, CenterPos.GetPositionZ() + 30.0f, 0.0f, TEMPSUMMON_MANUAL_DESPAWN, 0)) if (Creature* c = me->SummonCreature(NPC_NEXUS_LORD, *disk, TEMPSUMMON_MANUAL_DESPAWN, 0)) { c->EnterVehicle(disk, 0); disk->AI()->DoAction(1); // start moving } } - for (int i=0; iSummonCreature(NPC_HOVER_DISK, CenterPos.GetPositionX()+cos(angle)*dist, CenterPos.GetPositionY()+sin(angle)*dist, CenterPos.GetPositionZ()+30.0f, 0.0f, TEMPSUMMON_MANUAL_DESPAWN, 0)) + float angle = 0.0f + ((float)i / MAX_SCIONS_OF_ETERNITY) * 2 * M_PI; + if (Creature* disk = me->SummonCreature(NPC_HOVER_DISK, CenterPos.GetPositionX() + cos(angle) * dist, CenterPos.GetPositionY() + sin(angle) * dist, CenterPos.GetPositionZ() + 30.0f, 0.0f, TEMPSUMMON_MANUAL_DESPAWN, 0)) if (Creature* c = me->SummonCreature(NPC_SCION_OF_ETERNITY, *disk, TEMPSUMMON_MANUAL_DESPAWN, 0)) { c->EnterVehicle(disk, 0); @@ -624,11 +624,11 @@ public: me->GetMotionMaster()->MoveIdle(); me->StopMoving(); float dist = urand(5, 30); - float angle = rand_norm()*2*M_PI; - float posx = CenterPos.GetPositionX()+cos(angle)*dist; - float posy = CenterPos.GetPositionY()+sin(angle)*dist; + float angle = rand_norm() * 2 * M_PI; + float posx = CenterPos.GetPositionX() + cos(angle) * dist; + float posy = CenterPos.GetPositionY() + sin(angle) * dist; me->SetFacingTo(me->GetAngle(posx, posy)); - me->CastSpell(posx, posy, CenterPos.GetPositionZ()+1.5f, SPELL_ARCANE_OVERLOAD, true); + me->CastSpell(posx, posy, CenterPos.GetPositionZ() + 1.5f, SPELL_ARCANE_OVERLOAD, true); events.RepeatEvent(15000); events.RescheduleEvent(EVENT_RESUME_FLYING_CIRCLES_PH_2, 3000, 1); } @@ -637,9 +637,9 @@ public: { float angle = CenterPos.GetAngle(me); float dist = Phase2NorthPos.GetExactDist2d(&CenterPos); - float newangle = angle+0.5f; - if (newangle >= 2*M_PI) newangle -= 2*M_PI; - me->GetMotionMaster()->MovePoint(MI_POINT_CIRCLE_OUTSIDE_PH_2, CenterPos.GetPositionX()+cos(newangle)*dist, CenterPos.GetPositionY()+sin(newangle)*dist, Phase2NorthPos.GetPositionZ()); + float newangle = angle + 0.5f; + if (newangle >= 2 * M_PI) newangle -= 2 * M_PI; + me->GetMotionMaster()->MovePoint(MI_POINT_CIRCLE_OUTSIDE_PH_2, CenterPos.GetPositionX() + cos(newangle)*dist, CenterPos.GetPositionY() + sin(newangle)*dist, Phase2NorthPos.GetPositionZ()); events.PopEvent(); } break; @@ -649,7 +649,7 @@ public: float angle = CenterPos.GetAngle(me); me->GetMotionMaster()->MoveIdle(); me->StopMoving(); - me->GetMotionMaster()->MovePoint(MI_POINT_SURGE_OF_POWER_CENTER, CenterPos.GetPositionX()+cos(angle)*10.0f, CenterPos.GetPositionY()+sin(angle)*10.0f, Phase2NorthPos.GetPositionZ()); + me->GetMotionMaster()->MovePoint(MI_POINT_SURGE_OF_POWER_CENTER, CenterPos.GetPositionX() + cos(angle) * 10.0f, CenterPos.GetPositionY() + sin(angle) * 10.0f, Phase2NorthPos.GetPositionZ()); events.CancelEventGroup(1); // everything beside berserk } break; @@ -665,9 +665,9 @@ public: Talk(SAY_SURGE_OF_POWER); events.RescheduleEvent(EVENT_CLEAR_TARGET, 10000, 1); events.RescheduleEvent(EVENT_RESUME_FLYING_CIRCLES_PH_2, 10000, 1); - events.RescheduleEvent(EVENT_SPELL_ARCANE_STORM, urand(17000,25000), 1); + events.RescheduleEvent(EVENT_SPELL_ARCANE_STORM, urand(17000, 25000), 1); events.RescheduleEvent(EVENT_SPELL_ARCANE_OVERLOAD, 16000, 1); - events.RescheduleEvent(EVENT_MOVE_TO_SURGE_OF_POWER, 55000+10000, 1); + events.RescheduleEvent(EVENT_MOVE_TO_SURGE_OF_POWER, 55000 + 10000, 1); events.RescheduleEvent(EVENT_CHECK_TRASH_DEAD, 3000, 1); break; case EVENT_CLEAR_TARGET: @@ -690,7 +690,7 @@ public: me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MoveIdle(); me->StopMoving(); - me->GetMotionMaster()->MovePoint(MI_POINT_START_PH_3, CenterPos.GetPositionX(), CenterPos.GetPositionY(), CenterPos.GetPositionZ()+70.0f); + me->GetMotionMaster()->MovePoint(MI_POINT_START_PH_3, CenterPos.GetPositionX(), CenterPos.GetPositionY(), CenterPos.GetPositionZ() + 70.0f); events.RescheduleEvent(EVENT_LIGHT_DIMENSION_CHANGE, 1000, 1); events.RescheduleEvent(EVENT_DESTROY_PLATFORM_0, 10000, 1); } @@ -714,20 +714,20 @@ public: case EVENT_MOVE_TO_PHASE_3_POSITION: { me->SendMeleeAttackStop(me->GetVictim()); - me->GetMotionMaster()->MoveTakeoff(MI_POINT_PH_3_FIGHT_POSITION, CenterPos.GetPositionX(), CenterPos.GetPositionY(), CenterPos.GetPositionZ()-5.0f, me->GetSpeed(MOVE_RUN)); + me->GetMotionMaster()->MoveTakeoff(MI_POINT_PH_3_FIGHT_POSITION, CenterPos.GetPositionX(), CenterPos.GetPositionY(), CenterPos.GetPositionZ() - 5.0f, me->GetSpeed(MOVE_RUN)); me->DeleteThreatList(); // players on vehicle are unattackable -> leads to EnterEvadeMode() because target is not acceptable! // mount players: - Map::PlayerList const &PlayerList = me->GetMap()->GetPlayers(); + Map::PlayerList const& PlayerList = me->GetMap()->GetPlayers(); if (!PlayerList.isEmpty()) for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) - if (Player *pPlayer = i->GetSource()) + if (Player* pPlayer = i->GetSource()) { if (!pPlayer->IsAlive() || pPlayer->IsGameMaster()) continue; - if (Creature* c = me->SummonCreature(NPC_WYRMREST_SKYTALON, pPlayer->GetPositionX(), pPlayer->GetPositionY(), pPlayer->GetPositionZ()-20.0f, 0.0f, TEMPSUMMON_MANUAL_DESPAWN, 0)) + if (Creature* c = me->SummonCreature(NPC_WYRMREST_SKYTALON, pPlayer->GetPositionX(), pPlayer->GetPositionY(), pPlayer->GetPositionZ() - 20.0f, 0.0f, TEMPSUMMON_MANUAL_DESPAWN, 0)) { c->setFaction(pPlayer->getFaction()); //pPlayer->CastCustomSpell(60683, SPELLVALUE_BASE_POINT0, 1, c, true); @@ -753,9 +753,9 @@ public: if (Unit* target = me->GetVictim()) AttackStart(target); events.RescheduleEvent(EVENT_SPELL_ARCANE_PULSE, 0, 1); - events.RescheduleEvent(EVENT_SPELL_STATIC_FIELD, urand(1000,4000), 1); - events.RescheduleEvent(EVENT_SPELL_PH3_SURGE_OF_POWER, urand(4000,7000), 1); - events.RescheduleEvent(EVENT_SPELL_ARCANE_STORM, urand(12000,15000), 1); + events.RescheduleEvent(EVENT_SPELL_STATIC_FIELD, urand(1000, 4000), 1); + events.RescheduleEvent(EVENT_SPELL_PH3_SURGE_OF_POWER, urand(4000, 7000), 1); + events.RescheduleEvent(EVENT_SPELL_ARCANE_STORM, urand(12000, 15000), 1); break; case EVENT_SPELL_ARCANE_PULSE: me->CastSpell(me, SPELL_ARCANE_PULSE, true); @@ -788,7 +788,7 @@ public: } } - void KilledUnit(Unit *victim) override + void KilledUnit(Unit* victim) override { if (victim && victim->GetGUID() == me->GetGUID()) return; @@ -822,7 +822,7 @@ public: void EnterEvadeMode() override { - me->GetMap()->SetZoneOverrideLight(AREA_EYE_OF_ETERNITY, LIGHT_GET_DEFAULT_FOR_MAP, 1*IN_MILLISECONDS); + me->GetMap()->SetZoneOverrideLight(AREA_EYE_OF_ETERNITY, LIGHT_GET_DEFAULT_FOR_MAP, 1 * IN_MILLISECONDS); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); ScriptedAI::EnterEvadeMode(); } @@ -849,9 +849,9 @@ public: if (timer2 <= diff) { timer2 = 0; - uint32 tmp = urand(0,3); + uint32 tmp = urand(0, 3); me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); - me->GetMotionMaster()->MovePoint(MI_POINT_INTRO_SIDE_0+tmp, FourSidesPos[tmp]); + me->GetMotionMaster()->MovePoint(MI_POINT_INTRO_SIDE_0 + tmp, FourSidesPos[tmp]); } else timer2 -= diff; @@ -879,13 +879,13 @@ public: { npc_vortex_rideAI(Creature* pCreature) : VehicleAI(pCreature) { - VORTEX_RADIUS = urand(22,28); + VORTEX_RADIUS = urand(22, 28); float h = urand(15, 30); float angle = CenterPos.GetAngle(me); Position pos; - pos.m_positionX = CenterPos.GetPositionX()+VORTEX_RADIUS*cos(angle); - pos.m_positionY = CenterPos.GetPositionY()+VORTEX_RADIUS*sin(angle); - pos.m_positionZ = CenterPos.GetPositionZ()+h; + pos.m_positionX = CenterPos.GetPositionX() + VORTEX_RADIUS * cos(angle); + pos.m_positionY = CenterPos.GetPositionY() + VORTEX_RADIUS * sin(angle); + pos.m_positionZ = CenterPos.GetPositionZ() + h; pos.m_orientation = pos.GetAngle(&CenterPos); me->SetPosition(pos); timer = 0; @@ -919,7 +919,7 @@ public: if (despawnTimer <= diff) { despawnTimer = 0; - me->UpdatePosition(CenterPos.GetPositionX(), CenterPos.GetPositionY(), CenterPos.GetPositionZ()+18.0f, 0.0f, true); + me->UpdatePosition(CenterPos.GetPositionX(), CenterPos.GetPositionY(), CenterPos.GetPositionZ() + 18.0f, 0.0f, true); me->StopMovingOnCurrentPos(); if (Vehicle* vehicle = me->GetVehicleKit()) vehicle->RemoveAllPassengers(); @@ -932,26 +932,26 @@ public: if (timer <= diff) { float angle = CenterPos.GetAngle(me); - float newangle = angle+2*M_PI/((float)VORTEX_TRAVEL_TIME/VORTEX_DEFAULT_DIFF); - if (newangle >= 2*M_PI) - newangle -= 2*M_PI; - float newx = CenterPos.GetPositionX()+VORTEX_RADIUS*cos(newangle); - float newy = CenterPos.GetPositionY()+VORTEX_RADIUS*sin(newangle); + float newangle = angle + 2 * M_PI / ((float)VORTEX_TRAVEL_TIME / VORTEX_DEFAULT_DIFF); + if (newangle >= 2 * M_PI) + newangle -= 2 * M_PI; + float newx = CenterPos.GetPositionX() + VORTEX_RADIUS * cos(newangle); + float newy = CenterPos.GetPositionY() + VORTEX_RADIUS * sin(newangle); float arcangle = me->GetAngle(newx, newy); - float dist = 2*me->GetDistance2d(newx, newy); + float dist = 2 * me->GetDistance2d(newx, newy); if (me->GetVehicleKit()) if (Unit* pass = me->GetVehicleKit()->GetPassenger(0)) if (Player* plr = pass->ToPlayer()) - { - if (!bUpdatedFlying && timer) - { - bUpdatedFlying = true; - plr->SetDisableGravity(true, true); - } + { + if (!bUpdatedFlying && timer) + { + bUpdatedFlying = true; + plr->SetDisableGravity(true, true); + } - plr->SendMonsterMove(me->GetPositionX()+dist*cos(arcangle), me->GetPositionY()+dist*sin(arcangle), me->GetPositionZ(), VORTEX_DEFAULT_DIFF*2, SPLINEFLAG_FLYING); - me->Relocate(newx, newy); - } + plr->SendMonsterMove(me->GetPositionX() + dist * cos(arcangle), me->GetPositionY() + dist * sin(arcangle), me->GetPositionZ(), VORTEX_DEFAULT_DIFF * 2, SPLINEFLAG_FLYING); + me->Relocate(newx, newy); + } - timer = (diff-timer <= VORTEX_DEFAULT_DIFF) ? VORTEX_DEFAULT_DIFF - (diff-timer) : 0; + timer = (diff - timer <= VORTEX_DEFAULT_DIFF) ? VORTEX_DEFAULT_DIFF - (diff - timer) : 0; } else timer -= diff; @@ -959,7 +959,7 @@ public: void AttackStart(Unit* /*who*/) override {} void MoveInLineOfSight(Unit* /*who*/) override {} - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask) override { damage = 0; } + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override { damage = 0; } }; }; @@ -999,12 +999,12 @@ public: MoveTimer = 0; me->GetMotionMaster()->MoveIdle(); me->DisableSpline(); - me->MonsterMoveWithSpeed(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+0.05f, 7.0f); + me->MonsterMoveWithSpeed(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 0.05f, 7.0f); break; } } - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask) override + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override { if (damage >= me->GetHealth()) { @@ -1090,8 +1090,8 @@ public: { DoZoneInCombat(); events.Reset(); - events.RescheduleEvent(EVENT_NEXUS_LORD_ARCANE_SHOCK, urand(3000,10000)); - events.RescheduleEvent(EVENT_NEXUS_LORD_HASTE, urand(8000,14000)); + events.RescheduleEvent(EVENT_NEXUS_LORD_ARCANE_SHOCK, urand(3000, 10000)); + events.RescheduleEvent(EVENT_NEXUS_LORD_HASTE, urand(8000, 14000)); } void AttackStart(Unit* victim) override @@ -1109,10 +1109,10 @@ public: { if (!victim->IsWithinMeleeRange(me)) { - float x,y,z; + float x, y, z; victim->GetClosePoint(x, y, z, 0.0f, 1.5f, me->GetAngle(victim)); if (Unit* v = me->GetVehicleBase()) - v->GetMotionMaster()->MovePoint(0, x, y ,z); + v->GetMotionMaster()->MovePoint(0, x, y, z); } timer = 1000; } @@ -1136,11 +1136,11 @@ public: case EVENT_NEXUS_LORD_ARCANE_SHOCK: if (Unit* victim = me->GetVictim()) me->CastSpell(victim, SPELL_ARCANE_SHOCK); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); break; case EVENT_NEXUS_LORD_HASTE: me->CastSpell(me, SPELL_HASTE); - events.RepeatEvent(urand(20000,30000)); + events.RepeatEvent(urand(20000, 30000)); break; } @@ -1174,7 +1174,7 @@ public: pInstance = me->GetInstanceScript(); events.Reset(); events.RescheduleEvent(EVENT_TELEPORT_VISUAL, 0); - events.RescheduleEvent(EVENT_SCION_OF_ETERNITY_ARCANE_BARRAGE, urand(20000,25000)); + events.RescheduleEvent(EVENT_SCION_OF_ETERNITY_ARCANE_BARRAGE, urand(20000, 25000)); } InstanceScript* pInstance; @@ -1198,20 +1198,20 @@ public: case EVENT_SCION_OF_ETERNITY_ARCANE_BARRAGE: { std::vector guids; - Map::PlayerList const &PlayerList = me->GetMap()->GetPlayers(); + Map::PlayerList const& PlayerList = me->GetMap()->GetPlayers(); if (!PlayerList.isEmpty()) for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) - if (Player *pPlayer = i->GetSource()) + if (Player* pPlayer = i->GetSource()) { if (!pPlayer->IsAlive() || pPlayer->IsGameMaster()) continue; guids.push_back(pPlayer->GetGUID()); } if (!guids.empty()) - if (Player* plr = ObjectAccessor::GetPlayer(*me, guids.at(urand(0, guids.size()-1)))) + if (Player* plr = ObjectAccessor::GetPlayer(*me, guids.at(urand(0, guids.size() - 1)))) me->CastSpell(plr, SPELL_SCION_ARCANE_BARRAGE); - events.RepeatEvent(urand(5000,8000)); + events.RepeatEvent(urand(5000, 8000)); } break; } @@ -1253,7 +1253,7 @@ public: InstanceScript* pInstance; EventMap events; - void PassengerBoarded(Unit *who, int8 /*seat*/, bool apply) override + void PassengerBoarded(Unit* who, int8 /*seat*/, bool apply) override { events.Reset(); if (!who) @@ -1307,17 +1307,16 @@ public: events.RescheduleEvent(EVENT_DISK_MOVE_NEXT_POINT, 0); break; case MI_POINT_NEXUS_LORD: - if (me->GetPositionZ() > CenterPos.GetPositionZ()+2.0f) + if (me->GetPositionZ() > CenterPos.GetPositionZ() + 2.0f) events.RescheduleEvent(EVENT_DISK_MOVE_NEXT_POINT, 0); - else - if (Vehicle* v = me->GetVehicleKit()) - if (Unit* pass = v->GetPassenger(0)) - if (Creature* c = pass->ToCreature()) - { - c->SetReactState(REACT_AGGRESSIVE); - if (Player* plr = c->SelectNearestPlayer(100.0f)) - c->AI()->AttackStart(plr); - } + else if (Vehicle* v = me->GetVehicleKit()) + if (Unit* pass = v->GetPassenger(0)) + if (Creature* c = pass->ToCreature()) + { + c->SetReactState(REACT_AGGRESSIVE); + if (Player* plr = c->SelectNearestPlayer(100.0f)) + c->AI()->AttackStart(plr); + } break; } } @@ -1335,20 +1334,20 @@ public: { float angle = CenterPos.GetAngle(me); float newangle = angle - 0.5f; - if (newangle < 0.0f) newangle += 2*M_PI; - float newz = me->GetPositionZ()-4.0f; - if (newzGetMotionMaster()->MovePoint(MI_POINT_NEXUS_LORD, CenterPos.GetPositionX()+cos(newangle)*22.0f, CenterPos.GetPositionY()+sin(newangle)*22.0f, newz); + if (newangle < 0.0f) newangle += 2 * M_PI; + float newz = me->GetPositionZ() - 4.0f; + if (newz < CenterPos.GetPositionZ()) newz = CenterPos.GetPositionZ(); + me->GetMotionMaster()->MovePoint(MI_POINT_NEXUS_LORD, CenterPos.GetPositionX() + cos(newangle) * 22.0f, CenterPos.GetPositionY() + sin(newangle) * 22.0f, newz); } break; case NPC_SCION_OF_ETERNITY: { float angle = CenterPos.GetAngle(me); float newangle = angle - 0.3f; - if (newangle < 0.0f) newangle += 2*M_PI; - float newz = me->GetPositionZ()-2.0f; - if (newzGetMotionMaster()->MovePoint(MI_POINT_SCION, CenterPos.GetPositionX()+cos(newangle)*30.0f, CenterPos.GetPositionY()+sin(newangle)*30.0f, newz); + if (newangle < 0.0f) newangle += 2 * M_PI; + float newz = me->GetPositionZ() - 2.0f; + if (newz < CenterPos.GetPositionZ() + 20.0f) newz = CenterPos.GetPositionZ() + 20.0f; + me->GetMotionMaster()->MovePoint(MI_POINT_SCION, CenterPos.GetPositionX() + cos(newangle) * 30.0f, CenterPos.GetPositionY() + sin(newangle) * 30.0f, newz); } break; } @@ -1496,59 +1495,59 @@ public: class spell_eoe_ph3_surge_of_power : public SpellScriptLoader { - public: - spell_eoe_ph3_surge_of_power() : SpellScriptLoader("spell_eoe_ph3_surge_of_power") { } +public: + spell_eoe_ph3_surge_of_power() : SpellScriptLoader("spell_eoe_ph3_surge_of_power") { } - class spell_eoe_ph3_surge_of_power_SpellScript : public SpellScript + class spell_eoe_ph3_surge_of_power_SpellScript : public SpellScript + { + PrepareSpellScript(spell_eoe_ph3_surge_of_power_SpellScript); + + uint64 DrakeGUID[3]; + + bool Load() override { - PrepareSpellScript(spell_eoe_ph3_surge_of_power_SpellScript); - - uint64 DrakeGUID[3]; - - bool Load() override - { - memset(&DrakeGUID, 0, sizeof(DrakeGUID)); - if (Unit* caster = GetCaster()) - if (Creature* c = caster->ToCreature()) - { - uint8 i=0; - std::list drakes; - c->AI()->SelectTargetList(drakes, (c->GetMap()->GetSpawnMode() == 0 ? 1 : 3), SELECT_TARGET_RANDOM, 0.0f, false, 57403 /*only drakes have this aura*/); - for (std::list::iterator itr = drakes.begin(); itr != drakes.end() && i < 3; ++itr) - { - DrakeGUID[i++] = (*itr)->GetGUID(); - if (Vehicle* v = (*itr)->GetVehicleKit()) - if (Unit* p = v->GetPassenger(0)) - if (Player* plr = p->ToPlayer()) - c->AI()->Talk(EMOTE_SURGE_OF_POWER_WARNING_P3, plr); - } - } - - return true; - } - - void FilterTargets(std::list& targets) - { - if (Unit* caster = GetCaster()) + memset(&DrakeGUID, 0, sizeof(DrakeGUID)); + if (Unit* caster = GetCaster()) + if (Creature* c = caster->ToCreature()) { - targets.clear(); - for (uint8 i=0; i<3; ++i) - if (DrakeGUID[i]) - if (Unit* u = ObjectAccessor::GetUnit(*caster, DrakeGUID[i])) - targets.push_back(u); + uint8 i = 0; + std::list drakes; + c->AI()->SelectTargetList(drakes, (c->GetMap()->GetSpawnMode() == 0 ? 1 : 3), SELECT_TARGET_RANDOM, 0.0f, false, 57403 /*only drakes have this aura*/); + for (std::list::iterator itr = drakes.begin(); itr != drakes.end() && i < 3; ++itr) + { + DrakeGUID[i++] = (*itr)->GetGUID(); + if (Vehicle* v = (*itr)->GetVehicleKit()) + if (Unit* p = v->GetPassenger(0)) + if (Player* plr = p->ToPlayer()) + c->AI()->Talk(EMOTE_SURGE_OF_POWER_WARNING_P3, plr); + } } - } - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_eoe_ph3_surge_of_power_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_eoe_ph3_surge_of_power_SpellScript(); + return true; } + + void FilterTargets(std::list& targets) + { + if (Unit* caster = GetCaster()) + { + targets.clear(); + for (uint8 i = 0; i < 3; ++i) + if (DrakeGUID[i]) + if (Unit* u = ObjectAccessor::GetUnit(*caster, DrakeGUID[i])) + targets.push_back(u); + } + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_eoe_ph3_surge_of_power_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_eoe_ph3_surge_of_power_SpellScript(); + } }; diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/eye_of_eternity.h b/src/server/scripts/Northrend/Nexus/EyeOfEternity/eye_of_eternity.h index fd10e92d8..5d9277f80 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/eye_of_eternity.h +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/eye_of_eternity.h @@ -80,10 +80,10 @@ const Position CenterPos = {754.395f, 1301.27f, 266.10f, 0.0f}; const Position FourSidesPos[] = { - {686.417f, 1235.52f, 288.17f, M_PI/4}, - {828.182f, 1379.05f, 288.17f, 5*M_PI/4}, - {681.278f, 1375.796f, 288.17f, 7*M_PI/4}, - {821.182f, 1235.42f, 288.17f, 3*M_PI/4}, + {686.417f, 1235.52f, 288.17f, M_PI / 4}, + {828.182f, 1379.05f, 288.17f, 5 * M_PI / 4}, + {681.278f, 1375.796f, 288.17f, 7 * M_PI / 4}, + {821.182f, 1235.42f, 288.17f, 3 * M_PI / 4}, }; const Position Phase2NorthPos = {837.22f, 1301.676f, 296.10f, M_PI}; @@ -92,12 +92,12 @@ const uint32 MalygosIntroIntervals[] = {18000, 19000, 21000, 18000, 15000}; class EoEDrakeEnterVehicleEvent : public BasicEvent { - public: - EoEDrakeEnterVehicleEvent(Creature& owner, uint64 playerGUID) : _owner(owner), _playerGUID(playerGUID) { } - bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/) override; - private: - Creature& _owner; - uint64 _playerGUID; +public: + EoEDrakeEnterVehicleEvent(Creature& owner, uint64 playerGUID) : _owner(owner), _playerGUID(playerGUID) { } + bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/) override; +private: + Creature& _owner; + uint64 _playerGUID; }; #endif diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp index c426f3729..98d59db59 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp @@ -53,7 +53,7 @@ public: GO_PlatformGUID = 0; bPokeAchiev = false; } - + bool IsEncounterInProgress() const override { return EncounterStatus == IN_PROGRESS; @@ -75,7 +75,7 @@ public: if (!pPlayer->IsAlive()) return; - if (Creature* c = pPlayer->SummonCreature(NPC_WYRMREST_SKYTALON, pPlayer->GetPositionX(), pPlayer->GetPositionY(), pPlayer->GetPositionZ()-20.0f, 0.0f, TEMPSUMMON_MANUAL_DESPAWN, 0)) + if (Creature* c = pPlayer->SummonCreature(NPC_WYRMREST_SKYTALON, pPlayer->GetPositionX(), pPlayer->GetPositionY(), pPlayer->GetPositionZ() - 20.0f, 0.0f, TEMPSUMMON_MANUAL_DESPAWN, 0)) { c->SetCanFly(true); c->setFaction(pPlayer->getFaction()); @@ -150,8 +150,8 @@ public: if (GameObject* go = instance->GetGameObject(GO_ExitPortalGUID)) go->SetPhaseMask(1, true); if (Creature* c = instance->GetCreature(NPC_MalygosGUID)) - if (c->SummonCreature(NPC_ALEXSTRASZA, 798.0f, 1268.0f, 299.0f, 2.45f ,TEMPSUMMON_TIMED_DESPAWN, 604800000)) - break; + if (c->SummonCreature(NPC_ALEXSTRASZA, 798.0f, 1268.0f, 299.0f, 2.45f, TEMPSUMMON_TIMED_DESPAWN, 604800000)) + break; } if (data == DONE) SaveToDB(); @@ -177,7 +177,8 @@ public: { switch(type) { - case DATA_MALYGOS_GUID: return NPC_MalygosGUID; + case DATA_MALYGOS_GUID: + return NPC_MalygosGUID; } return 0; } diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp index 0a2b2c187..365ab2200 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp @@ -38,171 +38,171 @@ enum Events class ChargeRifts : public BasicEvent { - public: - ChargeRifts(Creature* caster) : _caster(caster) - { - } +public: + ChargeRifts(Creature* caster) : _caster(caster) + { + } - bool Execute(uint64 /*execTime*/, uint32 /*diff*/) - { - _caster->AI()->Talk(EMOTE_SHIELD); - _caster->CastSpell(_caster, SPELL_CHARGE_RIFTS, true); - return true; - } + bool Execute(uint64 /*execTime*/, uint32 /*diff*/) + { + _caster->AI()->Talk(EMOTE_SHIELD); + _caster->CastSpell(_caster, SPELL_CHARGE_RIFTS, true); + return true; + } - private: - Creature* _caster; +private: + Creature* _caster; }; class boss_anomalus : public CreatureScript { - public: - boss_anomalus() : CreatureScript("boss_anomalus") { } +public: + boss_anomalus() : CreatureScript("boss_anomalus") { } - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const + { + return new boss_anomalusAI (creature); + } + + struct boss_anomalusAI : public BossAI + { + boss_anomalusAI(Creature* creature) : BossAI(creature, DATA_ANOMALUS_EVENT) { - return new boss_anomalusAI (creature); } - struct boss_anomalusAI : public BossAI + bool achievement; + uint16 activeRifts; + + void Reset() { - boss_anomalusAI(Creature* creature) : BossAI(creature, DATA_ANOMALUS_EVENT) - { - } + BossAI::Reset(); + achievement = true; + me->CastSpell(me, SPELL_CLOSE_RIFTS, true); + } - bool achievement; - uint16 activeRifts; + uint32 GetData(uint32 data) const + { + if (data == me->GetEntry()) + return achievement; + return 0; + } - void Reset() + void SetData(uint32 type, uint32) + { + if (type == me->GetEntry()) { - BossAI::Reset(); - achievement = true; - me->CastSpell(me, SPELL_CLOSE_RIFTS, true); - } - - uint32 GetData(uint32 data) const - { - if (data == me->GetEntry()) - return achievement; - return 0; - } - - void SetData(uint32 type, uint32) - { - if (type == me->GetEntry()) + if (activeRifts > 0 && --activeRifts == 0 && me->HasAura(SPELL_RIFT_SHIELD)) { - if (activeRifts > 0 && --activeRifts == 0 && me->HasAura(SPELL_RIFT_SHIELD)) + events.DelayEvents(me->GetAura(SPELL_RIFT_SHIELD)->GetDuration() - 46000); + me->RemoveAura(SPELL_RIFT_SHIELD); + me->InterruptNonMeleeSpells(false); + } + achievement = false; + } + } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + activeRifts++; + } + + void EnterCombat(Unit* who) + { + Talk(SAY_AGGRO); + BossAI::EnterCombat(who); + + activeRifts = 0; + events.SetTimer(45000); + events.ScheduleEvent(EVENT_ANOMALUS_SPARK, 5000); + events.ScheduleEvent(EVENT_ANOMALUS_HEALTH, 1000); + events.ScheduleEvent(EVENT_ANOMALUS_SPAWN_RIFT, IsHeroic() ? 15000 : 25000); + if (IsHeroic()) + events.ScheduleEvent(EVENT_ANOMALUS_ARCANE_ATTRACTION, 8000); + } + + void JustDied(Unit* killer) + { + Talk(SAY_DEATH); + BossAI::JustDied(killer); + me->CastSpell(me, SPELL_CLOSE_RIFTS, true); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_ANOMALUS_SPARK: + me->CastSpell(me->GetVictim(), SPELL_SPARK, false); + events.ScheduleEvent(EVENT_ANOMALUS_SPARK, 5000); + break; + case EVENT_ANOMALUS_HEALTH: + if (me->HealthBelowPct(51)) { - events.DelayEvents(me->GetAura(SPELL_RIFT_SHIELD)->GetDuration() - 46000); - me->RemoveAura(SPELL_RIFT_SHIELD); - me->InterruptNonMeleeSpells(false); + //First time we reach 51%, the next rift going to be empowered following timings. + events.CancelEvent(EVENT_ANOMALUS_SPAWN_RIFT); + events.ScheduleEvent(EVENT_ANOMALUS_SPAWN_RIFT_EMPOWERED, 1000); + break; } - achievement = false; - } + events.ScheduleEvent(EVENT_ANOMALUS_HEALTH, 1000); + break; + case EVENT_ANOMALUS_ARCANE_ATTRACTION: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true)) + me->CastSpell(target, SPELL_ARCANE_ATTRACTION, false); + events.ScheduleEvent(EVENT_ANOMALUS_ARCANE_ATTRACTION, 15000); + break; + case EVENT_ANOMALUS_SPAWN_RIFT: + Talk(SAY_RIFT); + Talk(EMOTE_RIFT); + me->CastSpell(me, SPELL_CREATE_RIFT, false); + //Once we hit 51% hp mark, after each rift we spawn an empowered + events.ScheduleEvent(me->HealthBelowPct(51) ? EVENT_ANOMALUS_SPAWN_RIFT_EMPOWERED : EVENT_ANOMALUS_SPAWN_RIFT, IsHeroic() ? 15000 : 25000); + break; + case EVENT_ANOMALUS_SPAWN_RIFT_EMPOWERED: + Talk(SAY_RIFT); + Talk(EMOTE_RIFT); + + me->CastSpell(me, SPELL_CREATE_RIFT, false); + me->CastSpell(me, SPELL_RIFT_SHIELD, true); + me->m_Events.AddEvent(new ChargeRifts(me), me->m_Events.CalculateTime(1000)); + events.DelayEvents(46000); + //As we just spawned an empowered spawn a normal one + events.ScheduleEvent(EVENT_ANOMALUS_SPAWN_RIFT, IsHeroic() ? 15000 : 25000); + break; } - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - activeRifts++; - } + DoMeleeAttackIfReady(); + EnterEvadeIfOutOfCombatArea(); + } - void EnterCombat(Unit* who) - { - Talk(SAY_AGGRO); - BossAI::EnterCombat(who); - - activeRifts = 0; - events.SetTimer(45000); - events.ScheduleEvent(EVENT_ANOMALUS_SPARK, 5000); - events.ScheduleEvent(EVENT_ANOMALUS_HEALTH, 1000); - events.ScheduleEvent(EVENT_ANOMALUS_SPAWN_RIFT, IsHeroic() ? 15000 : 25000); - if (IsHeroic()) - events.ScheduleEvent(EVENT_ANOMALUS_ARCANE_ATTRACTION, 8000); - } - - void JustDied(Unit* killer) - { - Talk(SAY_DEATH); - BossAI::JustDied(killer); - me->CastSpell(me, SPELL_CLOSE_RIFTS, true); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_ANOMALUS_SPARK: - me->CastSpell(me->GetVictim(), SPELL_SPARK, false); - events.ScheduleEvent(EVENT_ANOMALUS_SPARK, 5000); - break; - case EVENT_ANOMALUS_HEALTH: - if (me->HealthBelowPct(51)) - { - //First time we reach 51%, the next rift going to be empowered following timings. - events.CancelEvent(EVENT_ANOMALUS_SPAWN_RIFT); - events.ScheduleEvent(EVENT_ANOMALUS_SPAWN_RIFT_EMPOWERED, 1000); - break; - } - events.ScheduleEvent(EVENT_ANOMALUS_HEALTH, 1000); - break; - case EVENT_ANOMALUS_ARCANE_ATTRACTION: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true)) - me->CastSpell(target, SPELL_ARCANE_ATTRACTION, false); - events.ScheduleEvent(EVENT_ANOMALUS_ARCANE_ATTRACTION, 15000); - break; - case EVENT_ANOMALUS_SPAWN_RIFT: - Talk(SAY_RIFT); - Talk(EMOTE_RIFT); - me->CastSpell(me, SPELL_CREATE_RIFT, false); - //Once we hit 51% hp mark, after each rift we spawn an empowered - events.ScheduleEvent(me->HealthBelowPct(51) ? EVENT_ANOMALUS_SPAWN_RIFT_EMPOWERED : EVENT_ANOMALUS_SPAWN_RIFT, IsHeroic() ? 15000 : 25000); - break; - case EVENT_ANOMALUS_SPAWN_RIFT_EMPOWERED: - Talk(SAY_RIFT); - Talk(EMOTE_RIFT); - - me->CastSpell(me, SPELL_CREATE_RIFT, false); - me->CastSpell(me, SPELL_RIFT_SHIELD, true); - me->m_Events.AddEvent(new ChargeRifts(me), me->m_Events.CalculateTime(1000)); - events.DelayEvents(46000); - //As we just spawned an empowered spawn a normal one - events.ScheduleEvent(EVENT_ANOMALUS_SPAWN_RIFT, IsHeroic() ? 15000 : 25000); - break; - } - - DoMeleeAttackIfReady(); - EnterEvadeIfOutOfCombatArea(); - } - - bool CheckEvadeIfOutOfCombatArea() const - { - return me->GetHomePosition().GetExactDist2d(me) > 60.0f; - } - }; + bool CheckEvadeIfOutOfCombatArea() const + { + return me->GetHomePosition().GetExactDist2d(me) > 60.0f; + } + }; }; class achievement_chaos_theory : public AchievementCriteriaScript { - public: - achievement_chaos_theory() : AchievementCriteriaScript("achievement_chaos_theory") - { - } +public: + achievement_chaos_theory() : AchievementCriteriaScript("achievement_chaos_theory") + { + } - bool OnCheck(Player* /*player*/, Unit* target) - { - if (!target) - return false; + bool OnCheck(Player* /*player*/, Unit* target) + { + if (!target) + return false; - return target->GetAI()->GetData(target->GetEntry()); - } + return target->GetAI()->GetData(target->GetEntry()); + } }; void AddSC_boss_anomalus() diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_commander_stoutbeard_kolurg.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_commander_stoutbeard_kolurg.cpp index 7135ada41..d6b27521b 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_commander_stoutbeard_kolurg.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_commander_stoutbeard_kolurg.cpp @@ -32,85 +32,85 @@ enum Says class boss_commander_stoutbeard : public CreatureScript { - public: - boss_commander_stoutbeard() : CreatureScript("boss_commander_stoutbeard") { } +public: + boss_commander_stoutbeard() : CreatureScript("boss_commander_stoutbeard") { } - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } + + struct boss_commander_stoutbeardAI : public BossAI + { + boss_commander_stoutbeardAI(Creature* creature) : BossAI(creature, DATA_COMMANDER_EVENT) { - return GetInstanceAI(creature); } - struct boss_commander_stoutbeardAI : public BossAI + void Reset() { - boss_commander_stoutbeardAI(Creature* creature) : BossAI(creature, DATA_COMMANDER_EVENT) + BossAI::Reset(); + } + + void EnterCombat(Unit* who) + { + BossAI::EnterCombat(who); + Talk(SAY_AGGRO); + + events.ScheduleEvent(EVENT_BATTLE_SHOUT, 0); + events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, 10000); + events.ScheduleEvent(EVENT_WHIRLWIND, 15000); + events.ScheduleEvent(EVENT_COMMANDER_CHARGE, 1000); + me->RemoveAllAuras(); + } + + void KilledUnit(Unit*) + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) { + Talk(SAY_KILL); + events.ScheduleEvent(EVENT_KILL_TALK, 6000); + } + } + + void JustDied(Unit* killer) + { + BossAI::JustDied(killer); + Talk(SAY_DEATH); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_BATTLE_SHOUT: + me->CastSpell(me, SPELL_BATTLE_SHOUT, true); + events.ScheduleEvent(EVENT_BATTLE_SHOUT, 120000); + break; + case EVENT_FRIGHTENING_SHOUT: + me->CastSpell(me->GetVictim(), SPELL_FRIGHTENING_SHOUT, false); + events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, urand(15000, 20000)); + break; + case EVENT_WHIRLWIND: + me->CastSpell(me, SPELL_WHIRLWIND, false); + events.ScheduleEvent(EVENT_WHIRLWIND, 16000); + break; + case EVENT_COMMANDER_CHARGE: + if (Unit* target = SelectTarget(SELECT_TARGET_FARTHEST, 0, 25.0f)) + me->CastSpell(target, SPELL_CHARGE, false); + events.ScheduleEvent(EVENT_COMMANDER_CHARGE, 20000); + break; } - void Reset() - { - BossAI::Reset(); - } - - void EnterCombat(Unit* who) - { - BossAI::EnterCombat(who); - Talk(SAY_AGGRO); - - events.ScheduleEvent(EVENT_BATTLE_SHOUT, 0); - events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, 10000); - events.ScheduleEvent(EVENT_WHIRLWIND, 15000); - events.ScheduleEvent(EVENT_COMMANDER_CHARGE, 1000); - me->RemoveAllAuras(); - } - - void KilledUnit(Unit*) - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(SAY_KILL); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); - } - } - - void JustDied(Unit* killer) - { - BossAI::JustDied(killer); - Talk(SAY_DEATH); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_BATTLE_SHOUT: - me->CastSpell(me, SPELL_BATTLE_SHOUT, true); - events.ScheduleEvent(EVENT_BATTLE_SHOUT, 120000); - break; - case EVENT_FRIGHTENING_SHOUT: - me->CastSpell(me->GetVictim(), SPELL_FRIGHTENING_SHOUT, false); - events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, urand(15000, 20000)); - break; - case EVENT_WHIRLWIND: - me->CastSpell(me, SPELL_WHIRLWIND, false); - events.ScheduleEvent(EVENT_WHIRLWIND, 16000); - break; - case EVENT_COMMANDER_CHARGE: - if (Unit* target = SelectTarget(SELECT_TARGET_FARTHEST, 0, 25.0f)) - me->CastSpell(target, SPELL_CHARGE, false); - events.ScheduleEvent(EVENT_COMMANDER_CHARGE, 20000); - break; - } - - DoMeleeAttackIfReady(); - } - }; + DoMeleeAttackIfReady(); + } + }; }; void AddSC_boss_commander_stoutbeard() diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp index 199555114..cc9d89a8e 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp @@ -41,158 +41,158 @@ enum Events class boss_keristrasza : public CreatureScript { - public: - boss_keristrasza() : CreatureScript("boss_keristrasza") { } +public: + boss_keristrasza() : CreatureScript("boss_keristrasza") { } - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } + + struct boss_keristraszaAI : public BossAI + { + boss_keristraszaAI(Creature* creature) : BossAI(creature, DATA_KERISTRASZA_EVENT) { - return GetInstanceAI(creature); } - struct boss_keristraszaAI : public BossAI + std::set aGuids; + + void Reset() { - boss_keristraszaAI(Creature* creature) : BossAI(creature, DATA_KERISTRASZA_EVENT) + BossAI::Reset(); + RemovePrison(CanRemovePrison()); + aGuids.clear(); + } + + void EnterCombat(Unit* who) + { + Talk(SAY_AGGRO); + BossAI::EnterCombat(who); + + me->CastSpell(me, SPELL_INTENSE_COLD, true); + events.ScheduleEvent(EVENT_CRYSTALFIRE_BREATH, 14000); + events.ScheduleEvent(EVENT_CRYSTAL_CHAINS, DUNGEON_MODE(20000, 11000)); + events.ScheduleEvent(EVENT_TAIL_SWEEP, 5000); + events.ScheduleEvent(EVENT_HEALTH_CHECK, 1000); + events.ScheduleEvent(EVENT_ACHIEVEMENT_CHECK, 1000); + } + + void JustDied(Unit* killer) + { + Talk(SAY_DEATH); + BossAI::JustDied(killer); + } + + void KilledUnit(Unit*) + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) { + Talk(SAY_SLAY); + events.ScheduleEvent(EVENT_KILL_TALK, 6000); } + } - std::set aGuids; + void SetData(uint32 type, uint32) + { + if (type == me->GetEntry() && CanRemovePrison()) + RemovePrison(true); + } - void Reset() + bool CanRemovePrison() + { + for (uint8 i = DATA_TELESTRA_ORB; i <= DATA_ORMOROK_ORB; ++i) + if (instance->GetBossState(i) != DONE) + return false; + return true; + } + + void RemovePrison(bool remove) + { + if (remove) { - BossAI::Reset(); - RemovePrison(CanRemovePrison()); - aGuids.clear(); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + me->RemoveAurasDueToSpell(SPELL_FROZEN_PRISON); } - - void EnterCombat(Unit* who) + else { - Talk(SAY_AGGRO); - BossAI::EnterCombat(who); - - me->CastSpell(me, SPELL_INTENSE_COLD, true); - events.ScheduleEvent(EVENT_CRYSTALFIRE_BREATH, 14000); - events.ScheduleEvent(EVENT_CRYSTAL_CHAINS, DUNGEON_MODE(20000,11000)); - events.ScheduleEvent(EVENT_TAIL_SWEEP, 5000); - events.ScheduleEvent(EVENT_HEALTH_CHECK, 1000); - events.ScheduleEvent(EVENT_ACHIEVEMENT_CHECK, 1000); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + me->CastSpell(me, SPELL_FROZEN_PRISON, true); } + } - void JustDied(Unit* killer) + uint32 GetData(uint32 guid) const + { + return aGuids.find(guid) == aGuids.end(); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) { - Talk(SAY_DEATH); - BossAI::JustDied(killer); - } - - void KilledUnit(Unit*) - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(SAY_SLAY); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); - } - } - - void SetData(uint32 type, uint32) - { - if (type == me->GetEntry() && CanRemovePrison()) - RemovePrison(true); - } - - bool CanRemovePrison() - { - for (uint8 i = DATA_TELESTRA_ORB; i <= DATA_ORMOROK_ORB; ++i) - if (instance->GetBossState(i) != DONE) - return false; - return true; - } - - void RemovePrison(bool remove) - { - if (remove) - { - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - me->RemoveAurasDueToSpell(SPELL_FROZEN_PRISON); - } - else - { - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - me->CastSpell(me, SPELL_FROZEN_PRISON, true); - } - } - - uint32 GetData(uint32 guid) const - { - return aGuids.find(guid) == aGuids.end(); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_HEALTH_CHECK: - if (me->HealthBelowPct(26)) - { - Talk(SAY_ENRAGE); - Talk(EMOTE_FRENZY); - me->CastSpell(me, SPELL_ENRAGE, true); - break; - } - events.ScheduleEvent(EVENT_HEALTH_CHECK, 1000); + case EVENT_HEALTH_CHECK: + if (me->HealthBelowPct(26)) + { + Talk(SAY_ENRAGE); + Talk(EMOTE_FRENZY); + me->CastSpell(me, SPELL_ENRAGE, true); break; - case EVENT_ACHIEVEMENT_CHECK: + } + events.ScheduleEvent(EVENT_HEALTH_CHECK, 1000); + break; + case EVENT_ACHIEVEMENT_CHECK: { Map::PlayerList const& pList = me->GetMap()->GetPlayers(); for(Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr) - if (Aura *aur = itr->GetSource()->GetAura(SPELL_INTENSE_COLD_TRIGGER)) + if (Aura* aur = itr->GetSource()->GetAura(SPELL_INTENSE_COLD_TRIGGER)) if (aur->GetStackAmount() > 2) aGuids.insert(itr->GetSource()->GetGUIDLow()); events.ScheduleEvent(EVENT_ACHIEVEMENT_CHECK, 500); break; } - case EVENT_CRYSTALFIRE_BREATH: - me->CastSpell(me->GetVictim(), SPELL_CRYSTALFIRE_BREATH, false); - events.ScheduleEvent(EVENT_CRYSTALFIRE_BREATH, 14000); - break; - case EVENT_TAIL_SWEEP: - me->CastSpell(me, SPELL_TAIL_SWEEP, false); - events.ScheduleEvent(EVENT_TAIL_SWEEP, 5000); - break; - case EVENT_CRYSTAL_CHAINS: - Talk(SAY_CRYSTAL_NOVA); - if (IsHeroic()) - me->CastSpell(me, SPELL_CRYSTALIZE, false); - else if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true)) - me->CastSpell(target, SPELL_CRYSTAL_CHAINS, false); - events.ScheduleEvent(EVENT_CRYSTAL_CHAINS, DUNGEON_MODE(20000, 11000)); - break; - } - - DoMeleeAttackIfReady(); + case EVENT_CRYSTALFIRE_BREATH: + me->CastSpell(me->GetVictim(), SPELL_CRYSTALFIRE_BREATH, false); + events.ScheduleEvent(EVENT_CRYSTALFIRE_BREATH, 14000); + break; + case EVENT_TAIL_SWEEP: + me->CastSpell(me, SPELL_TAIL_SWEEP, false); + events.ScheduleEvent(EVENT_TAIL_SWEEP, 5000); + break; + case EVENT_CRYSTAL_CHAINS: + Talk(SAY_CRYSTAL_NOVA); + if (IsHeroic()) + me->CastSpell(me, SPELL_CRYSTALIZE, false); + else if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true)) + me->CastSpell(target, SPELL_CRYSTAL_CHAINS, false); + events.ScheduleEvent(EVENT_CRYSTAL_CHAINS, DUNGEON_MODE(20000, 11000)); + break; } - }; + + DoMeleeAttackIfReady(); + } + }; }; class achievement_intense_cold : public AchievementCriteriaScript { - public: - achievement_intense_cold() : AchievementCriteriaScript("achievement_intense_cold") - { - } +public: + achievement_intense_cold() : AchievementCriteriaScript("achievement_intense_cold") + { + } - bool OnCheck(Player* player, Unit* target) - { - if (!target) - return false; + bool OnCheck(Player* player, Unit* target) + { + if (!target) + return false; - return target->GetAI()->GetData(player->GetGUIDLow()); - } + return target->GetAI()->GetData(player->GetGUIDLow()); + } }; void AddSC_boss_keristrasza() diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp index 9100b210d..a5549182a 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp @@ -11,7 +11,7 @@ enum Spells // Main SPELL_ICE_NOVA = 47772, SPELL_FIREBOMB = 47773, - + SPELL_GRAVITY_WELL = 47756, SPELL_TELESTRA_BACK = 47714, SPELL_BURNING_WINDS = 46308, @@ -62,270 +62,270 @@ enum Events class boss_magus_telestra : public CreatureScript { - public: - boss_magus_telestra() : CreatureScript("boss_magus_telestra") { } +public: + boss_magus_telestra() : CreatureScript("boss_magus_telestra") { } - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } + + struct boss_magus_telestraAI : public BossAI + { + boss_magus_telestraAI(Creature* creature) : BossAI(creature, DATA_MAGUS_TELESTRA_EVENT) { - return GetInstanceAI(creature); } - struct boss_magus_telestraAI : public BossAI + uint8 copiesDied; + bool achievement; + + void Reset() { - boss_magus_telestraAI(Creature* creature) : BossAI(creature, DATA_MAGUS_TELESTRA_EVENT) + BossAI::Reset(); + copiesDied = 0; + achievement = true; + + if (IsHeroic() && sGameEventMgr->IsActiveEvent(GAME_EVENT_WINTER_VEIL) && !me->HasAura(SPELL_WEAR_CHRISTMAS_HAT)) + me->AddAura(SPELL_WEAR_CHRISTMAS_HAT, me); + } + + uint32 GetData(uint32 data) const + { + if (data == me->GetEntry()) + return achievement; + return 0; + } + + void EnterCombat(Unit* who) + { + BossAI::EnterCombat(who); + Talk(SAY_AGGRO); + + events.ScheduleEvent(EVENT_MAGUS_ICE_NOVA, 10000); + events.ScheduleEvent(EVENT_MAGUS_FIREBOMB, 0); + events.ScheduleEvent(EVENT_MAGUS_GRAVITY_WELL, 20000); + events.ScheduleEvent(EVENT_MAGUS_HEALTH1, 1000); + if (IsHeroic()) + events.ScheduleEvent(EVENT_MAGUS_HEALTH2, 1000); + } + + void AttackStart(Unit* who) + { + if (who && me->Attack(who, true)) + me->GetMotionMaster()->MoveChase(who, 20.0f); + } + + void JustDied(Unit* killer) + { + BossAI::JustDied(killer); + Talk(SAY_DEATH); + } + + void KilledUnit(Unit*) + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) { + Talk(SAY_KILL); + events.ScheduleEvent(EVENT_KILL_TALK, 6000); } + } - uint8 copiesDied; - bool achievement; + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + summon->SetInCombatWithZone(); + } - void Reset() + void SpellHit(Unit* caster, const SpellInfo* spellInfo) + { + if (spellInfo->Id >= SPELL_FIRE_MAGUS_DEATH && spellInfo->Id <= SPELL_ARCANE_MAGUS_DEATH && caster->ToCreature()) { - BossAI::Reset(); - copiesDied = 0; - achievement = true; + events.ScheduleEvent(EVENT_MAGUS_FAIL_ACHIEVEMENT, 5000); + caster->ToCreature()->DespawnOrUnsummon(1000); - if (IsHeroic() && sGameEventMgr->IsActiveEvent(GAME_EVENT_WINTER_VEIL) && !me->HasAura(SPELL_WEAR_CHRISTMAS_HAT)) - me->AddAura(SPELL_WEAR_CHRISTMAS_HAT, me); - } - - uint32 GetData(uint32 data) const - { - if (data == me->GetEntry()) - return achievement; - return 0; - } - - void EnterCombat(Unit* who) - { - BossAI::EnterCombat(who); - Talk(SAY_AGGRO); - - events.ScheduleEvent(EVENT_MAGUS_ICE_NOVA, 10000); - events.ScheduleEvent(EVENT_MAGUS_FIREBOMB, 0); - events.ScheduleEvent(EVENT_MAGUS_GRAVITY_WELL, 20000); - events.ScheduleEvent(EVENT_MAGUS_HEALTH1, 1000); - if (IsHeroic()) - events.ScheduleEvent(EVENT_MAGUS_HEALTH2, 1000); - } - - void AttackStart(Unit* who) - { - if (who && me->Attack(who, true)) - me->GetMotionMaster()->MoveChase(who, 20.0f); - } - - void JustDied(Unit* killer) - { - BossAI::JustDied(killer); - Talk(SAY_DEATH); - } - - void KilledUnit(Unit*) - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + if (++copiesDied >= 3) { - Talk(SAY_KILL); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); + copiesDied = 0; + events.CancelEvent(EVENT_MAGUS_FAIL_ACHIEVEMENT); + events.ScheduleEvent(EVENT_MAGUS_MERGED, 5000); + me->CastSpell(me, SPELL_BURNING_WINDS, true); } } + } - void JustSummoned(Creature* summon) + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) { - summons.Summon(summon); - summon->SetInCombatWithZone(); - } - - void SpellHit(Unit* caster, const SpellInfo* spellInfo) - { - if (spellInfo->Id >= SPELL_FIRE_MAGUS_DEATH && spellInfo->Id <= SPELL_ARCANE_MAGUS_DEATH && caster->ToCreature()) - { - events.ScheduleEvent(EVENT_MAGUS_FAIL_ACHIEVEMENT, 5000); - caster->ToCreature()->DespawnOrUnsummon(1000); - - if (++copiesDied >= 3) + case EVENT_MAGUS_HEALTH1: + if (me->HealthBelowPct(51)) { - copiesDied = 0; - events.CancelEvent(EVENT_MAGUS_FAIL_ACHIEVEMENT); - events.ScheduleEvent(EVENT_MAGUS_MERGED, 5000); - me->CastSpell(me, SPELL_BURNING_WINDS, true); + me->CastSpell(me, SPELL_START_SUMMON_CLONES, false); + events.ScheduleEvent(EVENT_MAGUS_RELOCATE, 3500); + Talk(SAY_SPLIT); + break; } - } + events.ScheduleEvent(EVENT_MAGUS_HEALTH1, 1000); + break; + case EVENT_MAGUS_HEALTH2: + if (me->HealthBelowPct(11)) + { + me->CastSpell(me, SPELL_START_SUMMON_CLONES, false); + events.ScheduleEvent(EVENT_MAGUS_RELOCATE, 3500); + Talk(SAY_SPLIT); + break; + } + events.ScheduleEvent(EVENT_MAGUS_HEALTH2, 1000); + break; + case EVENT_MAGUS_FIREBOMB: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + me->CastSpell(target, SPELL_FIREBOMB, false); + events.ScheduleEvent(EVENT_MAGUS_FIREBOMB, 3000); + break; + case EVENT_MAGUS_ICE_NOVA: + me->CastSpell(me, SPELL_ICE_NOVA, false); + events.ScheduleEvent(EVENT_MAGUS_ICE_NOVA, 15000); + break; + case EVENT_MAGUS_GRAVITY_WELL: + me->CastSpell(me, SPELL_GRAVITY_WELL, false); + events.ScheduleEvent(EVENT_MAGUS_GRAVITY_WELL, 15000); + break; + case EVENT_MAGUS_FAIL_ACHIEVEMENT: + achievement = false; + break; + case EVENT_MAGUS_RELOCATE: + me->NearTeleportTo(505.04f, 88.915f, -16.13f, 2.98f); + break; + case EVENT_MAGUS_MERGED: + me->CastSpell(me, SPELL_TELESTRA_BACK, true); + me->RemoveAllAuras(); + Talk(SAY_MERGE); + break; } - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_MAGUS_HEALTH1: - if (me->HealthBelowPct(51)) - { - me->CastSpell(me, SPELL_START_SUMMON_CLONES, false); - events.ScheduleEvent(EVENT_MAGUS_RELOCATE, 3500); - Talk(SAY_SPLIT); - break; - } - events.ScheduleEvent(EVENT_MAGUS_HEALTH1, 1000); - break; - case EVENT_MAGUS_HEALTH2: - if (me->HealthBelowPct(11)) - { - me->CastSpell(me, SPELL_START_SUMMON_CLONES, false); - events.ScheduleEvent(EVENT_MAGUS_RELOCATE, 3500); - Talk(SAY_SPLIT); - break; - } - events.ScheduleEvent(EVENT_MAGUS_HEALTH2, 1000); - break; - case EVENT_MAGUS_FIREBOMB: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - me->CastSpell(target, SPELL_FIREBOMB, false); - events.ScheduleEvent(EVENT_MAGUS_FIREBOMB, 3000); - break; - case EVENT_MAGUS_ICE_NOVA: - me->CastSpell(me, SPELL_ICE_NOVA, false); - events.ScheduleEvent(EVENT_MAGUS_ICE_NOVA, 15000); - break; - case EVENT_MAGUS_GRAVITY_WELL: - me->CastSpell(me, SPELL_GRAVITY_WELL, false); - events.ScheduleEvent(EVENT_MAGUS_GRAVITY_WELL, 15000); - break; - case EVENT_MAGUS_FAIL_ACHIEVEMENT: - achievement = false; - break; - case EVENT_MAGUS_RELOCATE: - me->NearTeleportTo(505.04f, 88.915f, -16.13f, 2.98f); - break; - case EVENT_MAGUS_MERGED: - me->CastSpell(me, SPELL_TELESTRA_BACK, true); - me->RemoveAllAuras(); - Talk(SAY_MERGE); - break; - } - - DoMeleeAttackIfReady(); - } - }; + DoMeleeAttackIfReady(); + } + }; }; class spell_boss_magus_telestra_summon_telestra_clones : public SpellScriptLoader { - public: - spell_boss_magus_telestra_summon_telestra_clones() : SpellScriptLoader("spell_boss_magus_telestra_summon_telestra_clones") { } +public: + spell_boss_magus_telestra_summon_telestra_clones() : SpellScriptLoader("spell_boss_magus_telestra_summon_telestra_clones") { } - class spell_boss_magus_telestra_summon_telestra_clones_AuraScript : public AuraScript + class spell_boss_magus_telestra_summon_telestra_clones_AuraScript : public AuraScript + { + PrepareAuraScript(spell_boss_magus_telestra_summon_telestra_clones_AuraScript); + + bool Load() { - PrepareAuraScript(spell_boss_magus_telestra_summon_telestra_clones_AuraScript); - - bool Load() - { - return GetUnitOwner()->GetTypeId() == TYPEID_UNIT; - } - - void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_FIRE_MAGUS_SUMMON, true); - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_FROST_MAGUS_SUMMON, true); - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_ARCANE_MAGUS_SUMMON, true); - - GetUnitOwner()->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - GetUnitOwner()->SetControlled(true, UNIT_STATE_STUNNED); - GetUnitOwner()->ToCreature()->LoadEquipment(0, true); - - } - - void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetUnitOwner()->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - GetUnitOwner()->SetControlled(false, UNIT_STATE_STUNNED); - GetUnitOwner()->ToCreature()->LoadEquipment(1, true); - } - - void Register() - { - AfterEffectApply += AuraEffectApplyFn(spell_boss_magus_telestra_summon_telestra_clones_AuraScript::HandleApply, EFFECT_1, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_boss_magus_telestra_summon_telestra_clones_AuraScript::HandleRemove, EFFECT_1, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_boss_magus_telestra_summon_telestra_clones_AuraScript(); + return GetUnitOwner()->GetTypeId() == TYPEID_UNIT; } + + void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_FIRE_MAGUS_SUMMON, true); + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_FROST_MAGUS_SUMMON, true); + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_ARCANE_MAGUS_SUMMON, true); + + GetUnitOwner()->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + GetUnitOwner()->SetControlled(true, UNIT_STATE_STUNNED); + GetUnitOwner()->ToCreature()->LoadEquipment(0, true); + + } + + void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetUnitOwner()->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + GetUnitOwner()->SetControlled(false, UNIT_STATE_STUNNED); + GetUnitOwner()->ToCreature()->LoadEquipment(1, true); + } + + void Register() + { + AfterEffectApply += AuraEffectApplyFn(spell_boss_magus_telestra_summon_telestra_clones_AuraScript::HandleApply, EFFECT_1, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_boss_magus_telestra_summon_telestra_clones_AuraScript::HandleRemove, EFFECT_1, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_boss_magus_telestra_summon_telestra_clones_AuraScript(); + } }; class spell_boss_magus_telestra_gravity_well : public SpellScriptLoader { - public: - spell_boss_magus_telestra_gravity_well() : SpellScriptLoader("spell_boss_magus_telestra_gravity_well") { } +public: + spell_boss_magus_telestra_gravity_well() : SpellScriptLoader("spell_boss_magus_telestra_gravity_well") { } - class spell_boss_magus_telestra_gravity_well_SpellScript : public SpellScript + class spell_boss_magus_telestra_gravity_well_SpellScript : public SpellScript + { + PrepareSpellScript(spell_boss_magus_telestra_gravity_well_SpellScript); + + void SelectTarget(std::list& targets) { - PrepareSpellScript(spell_boss_magus_telestra_gravity_well_SpellScript); - - void SelectTarget(std::list& targets) - { - targets.remove_if(acore::RandomCheck(50)); - } - - void HandlePull(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - Unit* target = GetHitUnit(); - if (!target) - return; - - Position pos; - if (target->GetDistance(GetCaster()) < 5.0f) - { - pos.Relocate(GetCaster()->GetPositionX(), GetCaster()->GetPositionY(), GetCaster()->GetPositionZ()+1.0f); - float o = frand(0, 2*M_PI); - target->MovePositionToFirstCollision(pos, 20.0f, o); - pos.m_positionZ += frand(5.0f, 15.0f); - } - else - pos.Relocate(GetCaster()->GetPositionX(), GetCaster()->GetPositionY(), GetCaster()->GetPositionZ()+1.0f); - - float speedXY = float(GetSpellInfo()->Effects[effIndex].MiscValue) * 0.1f; - float speedZ = target->GetDistance(pos) / speedXY * 0.5f * Movement::gravity; - - target->GetMotionMaster()->MoveJump(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), speedXY, speedZ); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_boss_magus_telestra_gravity_well_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - OnEffectHitTarget += SpellEffectFn(spell_boss_magus_telestra_gravity_well_SpellScript::HandlePull, EFFECT_0, SPELL_EFFECT_PULL_TOWARDS_DEST); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_boss_magus_telestra_gravity_well_SpellScript(); + targets.remove_if(acore::RandomCheck(50)); } + + void HandlePull(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + Unit* target = GetHitUnit(); + if (!target) + return; + + Position pos; + if (target->GetDistance(GetCaster()) < 5.0f) + { + pos.Relocate(GetCaster()->GetPositionX(), GetCaster()->GetPositionY(), GetCaster()->GetPositionZ() + 1.0f); + float o = frand(0, 2 * M_PI); + target->MovePositionToFirstCollision(pos, 20.0f, o); + pos.m_positionZ += frand(5.0f, 15.0f); + } + else + pos.Relocate(GetCaster()->GetPositionX(), GetCaster()->GetPositionY(), GetCaster()->GetPositionZ() + 1.0f); + + float speedXY = float(GetSpellInfo()->Effects[effIndex].MiscValue) * 0.1f; + float speedZ = target->GetDistance(pos) / speedXY * 0.5f * Movement::gravity; + + target->GetMotionMaster()->MoveJump(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), speedXY, speedZ); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_boss_magus_telestra_gravity_well_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_boss_magus_telestra_gravity_well_SpellScript::HandlePull, EFFECT_0, SPELL_EFFECT_PULL_TOWARDS_DEST); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_boss_magus_telestra_gravity_well_SpellScript(); + } }; class achievement_split_personality : public AchievementCriteriaScript { - public: - achievement_split_personality() : AchievementCriteriaScript("achievement_split_personality") - { - } +public: + achievement_split_personality() : AchievementCriteriaScript("achievement_split_personality") + { + } - bool OnCheck(Player* /*player*/, Unit* target) - { - if (!target) - return false; + bool OnCheck(Player* /*player*/, Unit* target) + { + if (!target) + return false; - return target->GetAI()->GetData(target->GetEntry()); - } + return target->GetAI()->GetData(target->GetEntry()); + } }; void AddSC_boss_magus_telestra() diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp index ab80993ad..febb52d57 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp @@ -49,167 +49,167 @@ enum Misc class boss_ormorok : public CreatureScript { - public: - boss_ormorok() : CreatureScript("boss_ormorok") { } +public: + boss_ormorok() : CreatureScript("boss_ormorok") { } - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } + + struct boss_ormorokAI : public BossAI + { + boss_ormorokAI(Creature* creature) : BossAI(creature, DATA_ORMOROK_EVENT) { - return GetInstanceAI(creature); } - struct boss_ormorokAI : public BossAI + uint8 _spikesCount; + + void Reset() { - boss_ormorokAI(Creature* creature) : BossAI(creature, DATA_ORMOROK_EVENT) + _spikesCount = 0; + BossAI::Reset(); + } + + void EnterCombat(Unit* who) + { + Talk(SAY_AGGRO); + BossAI::EnterCombat(who); + + events.ScheduleEvent(EVENT_ORMOROK_CRYSTAL_SPIKES, 12000); + events.ScheduleEvent(EVENT_ORMOROK_TRAMPLE, 10000); + events.ScheduleEvent(EVENT_ORMOROK_SPELL_REFLECTION, 30000); + events.ScheduleEvent(EVENT_ORMOROK_HEALTH, 1000); + if (IsHeroic()) + events.ScheduleEvent(EVENT_ORMOROK_SUMMON, 17000); + } + + void JustDied(Unit* killer) + { + Talk(SAY_DEATH); + BossAI::JustDied(killer); + } + + void KilledUnit(Unit* /*victim*/) + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) { + Talk(SAY_KILL); + events.ScheduleEvent(EVENT_KILL_TALK, 6000); } + } - uint8 _spikesCount; + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + } - void Reset() + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) { - _spikesCount = 0; - BossAI::Reset(); - } - - void EnterCombat(Unit* who) - { - Talk(SAY_AGGRO); - BossAI::EnterCombat(who); - - events.ScheduleEvent(EVENT_ORMOROK_CRYSTAL_SPIKES, 12000); - events.ScheduleEvent(EVENT_ORMOROK_TRAMPLE, 10000); - events.ScheduleEvent(EVENT_ORMOROK_SPELL_REFLECTION, 30000); - events.ScheduleEvent(EVENT_ORMOROK_HEALTH, 1000); - if (IsHeroic()) + case EVENT_ORMOROK_HEALTH: + if (me->HealthBelowPct(26)) + { + me->CastSpell(me, SPELL_FRENZY, true); + Talk(EMOTE_FRENZY); + break; + } + events.ScheduleEvent(EVENT_ORMOROK_HEALTH, 1000); + break; + case EVENT_ORMOROK_TRAMPLE: + me->CastSpell(me, SPELL_TRAMPLE, false); + events.ScheduleEvent(EVENT_ORMOROK_TRAMPLE, 10000); + break; + case EVENT_ORMOROK_SPELL_REFLECTION: + Talk(SAY_REFLECT); + me->CastSpell(me, SPELL_SPELL_REFLECTION, false); + events.ScheduleEvent(EVENT_ORMOROK_SPELL_REFLECTION, 30000); + break; + case EVENT_ORMOROK_SUMMON: + if (Unit* target = SelectTarget(SELECT_TARGET_FARTHEST, 0, 50.0f, true)) + me->CastSpell(target, SPELL_SUMMON_CRYSTALLINE_TANGLER, true); events.ScheduleEvent(EVENT_ORMOROK_SUMMON, 17000); + break; + case EVENT_ORMOROK_CRYSTAL_SPIKES: + Talk(SAY_CRYSTAL_SPIKES); + me->CastSpell(me, SPELL_CRYSTAL_SPIKES, false); + _spikesCount = 0; + events.ScheduleEvent(EVENT_ORMOROK_SUMMON_SPIKES, 300); + events.ScheduleEvent(EVENT_ORMOROK_CRYSTAL_SPIKES, 20000); + break; + case EVENT_ORMOROK_SUMMON_SPIKES: + if (++_spikesCount > 9) + break; + for (uint8 i = 0; i < 4; ++i) + { + float o = rand_norm() * 2.0f * M_PI; + float x = me->GetPositionX() + 5.0f * _spikesCount * cos(o); + float y = me->GetPositionY() + 5.0f * _spikesCount * sin(o); + float h = me->GetMap()->GetHeight(x, y, me->GetPositionZ() + 5.0f); + + if (h != INVALID_HEIGHT) + me->SummonCreature(NPC_CRYSTAL_SPIKE, x, y, h, 0, TEMPSUMMON_TIMED_DESPAWN, 7000); + } + events.ScheduleEvent(EVENT_ORMOROK_SUMMON_SPIKES, 200); + break; } - void JustDied(Unit* killer) - { - Talk(SAY_DEATH); - BossAI::JustDied(killer); - } - - void KilledUnit(Unit * /*victim*/) - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(SAY_KILL); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); - } - } - - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_ORMOROK_HEALTH: - if (me->HealthBelowPct(26)) - { - me->CastSpell(me, SPELL_FRENZY, true); - Talk(EMOTE_FRENZY); - break; - } - events.ScheduleEvent(EVENT_ORMOROK_HEALTH, 1000); - break; - case EVENT_ORMOROK_TRAMPLE: - me->CastSpell(me, SPELL_TRAMPLE, false); - events.ScheduleEvent(EVENT_ORMOROK_TRAMPLE, 10000); - break; - case EVENT_ORMOROK_SPELL_REFLECTION: - Talk(SAY_REFLECT); - me->CastSpell(me, SPELL_SPELL_REFLECTION, false); - events.ScheduleEvent(EVENT_ORMOROK_SPELL_REFLECTION, 30000); - break; - case EVENT_ORMOROK_SUMMON: - if (Unit* target = SelectTarget(SELECT_TARGET_FARTHEST, 0, 50.0f, true)) - me->CastSpell(target, SPELL_SUMMON_CRYSTALLINE_TANGLER, true); - events.ScheduleEvent(EVENT_ORMOROK_SUMMON, 17000); - break; - case EVENT_ORMOROK_CRYSTAL_SPIKES: - Talk(SAY_CRYSTAL_SPIKES); - me->CastSpell(me, SPELL_CRYSTAL_SPIKES, false); - _spikesCount = 0; - events.ScheduleEvent(EVENT_ORMOROK_SUMMON_SPIKES, 300); - events.ScheduleEvent(EVENT_ORMOROK_CRYSTAL_SPIKES, 20000); - break; - case EVENT_ORMOROK_SUMMON_SPIKES: - if (++_spikesCount > 9) - break; - for (uint8 i = 0; i < 4; ++i) - { - float o = rand_norm()*2.0f*M_PI; - float x = me->GetPositionX()+5.0f*_spikesCount*cos(o); - float y = me->GetPositionY()+5.0f*_spikesCount*sin(o); - float h = me->GetMap()->GetHeight(x, y, me->GetPositionZ()+5.0f); - - if (h != INVALID_HEIGHT) - me->SummonCreature(NPC_CRYSTAL_SPIKE, x, y, h, 0, TEMPSUMMON_TIMED_DESPAWN, 7000); - } - events.ScheduleEvent(EVENT_ORMOROK_SUMMON_SPIKES, 200); - break; - } - - DoMeleeAttackIfReady(); - } - }; + DoMeleeAttackIfReady(); + } + }; }; class npc_crystal_spike : public CreatureScript { - public: - npc_crystal_spike() : CreatureScript("npc_crystal_spike") { } +public: + npc_crystal_spike() : CreatureScript("npc_crystal_spike") { } - CreatureAI* GetAI(Creature* pCreature) const + CreatureAI* GetAI(Creature* pCreature) const + { + return GetInstanceAI(pCreature); + } + + struct npc_crystal_spikeAI : public NullCreatureAI + { + npc_crystal_spikeAI(Creature* c) : NullCreatureAI(c) { - return GetInstanceAI(pCreature); } - struct npc_crystal_spikeAI : public NullCreatureAI + int32 _damageTimer; + uint64 _gameObjectGUID; + + void Reset() { - npc_crystal_spikeAI(Creature *c) : NullCreatureAI(c) + if (GameObject* gameobject = me->SummonGameObject(GO_CRYSTAL_SPIKE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 3500)) + _gameObjectGUID = gameobject->GetGUID(); + + _damageTimer = 1; + } + + void UpdateAI(uint32 diff) + { + if (_damageTimer) { - } - - int32 _damageTimer; - uint64 _gameObjectGUID; - - void Reset() - { - if (GameObject* gameobject = me->SummonGameObject(GO_CRYSTAL_SPIKE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 3500)) - _gameObjectGUID = gameobject->GetGUID(); - - _damageTimer = 1; - } - - void UpdateAI(uint32 diff) - { - if (_damageTimer) + _damageTimer += diff; + if (_damageTimer >= 2000) { - _damageTimer += diff; - if (_damageTimer >= 2000) - { - if (GameObject* gameobject = ObjectAccessor::GetGameObject(*me, _gameObjectGUID)) - gameobject->SetGoState(GO_STATE_ACTIVE); + if (GameObject* gameobject = ObjectAccessor::GetGameObject(*me, _gameObjectGUID)) + gameobject->SetGoState(GO_STATE_ACTIVE); - me->CastSpell(me, SPELL_CRYSTAL_SPIKE_DAMAGE, false); - _damageTimer = 0; - } + me->CastSpell(me, SPELL_CRYSTAL_SPIKE_DAMAGE, false); + _damageTimer = 0; } } - }; + } + }; }; void AddSC_boss_ormorok() diff --git a/src/server/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp b/src/server/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp index bf5896d71..e32e7d286 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp @@ -16,157 +16,157 @@ DoorData const doorData[] = class instance_nexus : public InstanceMapScript { - public: - instance_nexus() : InstanceMapScript("instance_nexus", 576) { } +public: + instance_nexus() : InstanceMapScript("instance_nexus", 576) { } - InstanceScript* GetInstanceScript(InstanceMap* map) const + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_nexus_InstanceMapScript(map); + } + + struct instance_nexus_InstanceMapScript : public InstanceScript + { + instance_nexus_InstanceMapScript(Map* map) : InstanceScript(map) {} + + void Initialize() { - return new instance_nexus_InstanceMapScript(map); + SetBossNumber(MAX_ENCOUNTERS); + LoadDoorData(doorData); } - struct instance_nexus_InstanceMapScript : public InstanceScript + void OnCreatureCreate(Creature* creature) { - instance_nexus_InstanceMapScript(Map* map) : InstanceScript(map) {} + Map::PlayerList const& players = instance->GetPlayers(); + TeamId TeamIdInInstance = TEAM_NEUTRAL; + if (!players.isEmpty()) + if (Player* pPlayer = players.begin()->GetSource()) + TeamIdInInstance = pPlayer->GetTeamId(); - void Initialize() + switch (creature->GetEntry()) { - SetBossNumber(MAX_ENCOUNTERS); - LoadDoorData(doorData); + case NPC_ALLIANCE_RANGER: + creature->setFaction(16); + if (TeamIdInInstance == TEAM_ALLIANCE) + creature->UpdateEntry(NPC_HORDE_RANGER); + break; + case NPC_ALLIANCE_BERSERKER: + creature->setFaction(16); + if (TeamIdInInstance == TEAM_ALLIANCE) + creature->UpdateEntry(NPC_HORDE_BERSERKER); + break; + case NPC_ALLIANCE_COMMANDER: + creature->setFaction(16); + if (TeamIdInInstance == TEAM_ALLIANCE) + creature->UpdateEntry(NPC_HORDE_COMMANDER); + break; + case NPC_ALLIANCE_CLERIC: + creature->setFaction(16); + if (TeamIdInInstance == TEAM_ALLIANCE) + creature->UpdateEntry(NPC_HORDE_CLERIC); + break; + case NPC_COMMANDER_STOUTBEARD: + creature->setFaction(16); + if (TeamIdInInstance == TEAM_ALLIANCE) + creature->UpdateEntry(NPC_COMMANDER_KOLURG); + break; } + } - void OnCreatureCreate(Creature* creature) + void OnGameObjectCreate(GameObject* gameObject) + { + switch (gameObject->GetEntry()) { - Map::PlayerList const& players = instance->GetPlayers(); - TeamId TeamIdInInstance = TEAM_NEUTRAL; - if (!players.isEmpty()) - if (Player* pPlayer = players.begin()->GetSource()) - TeamIdInInstance = pPlayer->GetTeamId(); - - switch (creature->GetEntry()) - { - case NPC_ALLIANCE_RANGER: - creature->setFaction(16); - if (TeamIdInInstance == TEAM_ALLIANCE) - creature->UpdateEntry(NPC_HORDE_RANGER); - break; - case NPC_ALLIANCE_BERSERKER: - creature->setFaction(16); - if (TeamIdInInstance == TEAM_ALLIANCE) - creature->UpdateEntry(NPC_HORDE_BERSERKER); - break; - case NPC_ALLIANCE_COMMANDER: - creature->setFaction(16); - if (TeamIdInInstance == TEAM_ALLIANCE) - creature->UpdateEntry(NPC_HORDE_COMMANDER); - break; - case NPC_ALLIANCE_CLERIC: - creature->setFaction(16); - if (TeamIdInInstance == TEAM_ALLIANCE) - creature->UpdateEntry(NPC_HORDE_CLERIC); - break; - case NPC_COMMANDER_STOUTBEARD: - creature->setFaction(16); - if (TeamIdInInstance == TEAM_ALLIANCE) - creature->UpdateEntry(NPC_COMMANDER_KOLURG); - break; - } + case GO_TELESTRA_SPHERE: + if (GetBossState(DATA_TELESTRA_ORB) != DONE && GetBossState(DATA_MAGUS_TELESTRA_EVENT) == DONE) + gameObject->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + AddDoor(gameObject, true); + break; + case GO_ANOMALUS_SPHERE: + if (GetBossState(DATA_ANOMALUS_ORB) != DONE && GetBossState(DATA_ANOMALUS_EVENT) == DONE) + gameObject->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + AddDoor(gameObject, true); + break; + case GO_ORMOROK_SPHERE: + if (GetBossState(DATA_ORMOROK_ORB) != DONE && GetBossState(DATA_ORMOROK_EVENT) == DONE) + gameObject->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + AddDoor(gameObject, true); + break; } + } - void OnGameObjectCreate(GameObject* gameObject) + void OnGameObjectRemove(GameObject* gameObject) + { + switch (gameObject->GetEntry()) { - switch (gameObject->GetEntry()) - { - case GO_TELESTRA_SPHERE: - if (GetBossState(DATA_TELESTRA_ORB) != DONE && GetBossState(DATA_MAGUS_TELESTRA_EVENT) == DONE) - gameObject->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - AddDoor(gameObject, true); - break; - case GO_ANOMALUS_SPHERE: - if (GetBossState(DATA_ANOMALUS_ORB) != DONE && GetBossState(DATA_ANOMALUS_EVENT) == DONE) - gameObject->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - AddDoor(gameObject, true); - break; - case GO_ORMOROK_SPHERE: - if (GetBossState(DATA_ORMOROK_ORB) != DONE && GetBossState(DATA_ORMOROK_EVENT) == DONE) - gameObject->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - AddDoor(gameObject, true); - break; - } + case GO_TELESTRA_SPHERE: + case GO_ANOMALUS_SPHERE: + case GO_ORMOROK_SPHERE: + AddDoor(gameObject, false); + break; } + } - void OnGameObjectRemove(GameObject* gameObject) + void SetData(uint32 type, uint32) + { + switch (type) { - switch (gameObject->GetEntry()) - { - case GO_TELESTRA_SPHERE: - case GO_ANOMALUS_SPHERE: - case GO_ORMOROK_SPHERE: - AddDoor(gameObject, false); - break; - } + case GO_TELESTRA_SPHERE: + SetBossState(DATA_TELESTRA_ORB, NOT_STARTED); + SetBossState(DATA_TELESTRA_ORB, DONE); + break; + case GO_ANOMALUS_SPHERE: + SetBossState(DATA_ANOMALUS_ORB, NOT_STARTED); + SetBossState(DATA_ANOMALUS_ORB, DONE); + break; + case GO_ORMOROK_SPHERE: + SetBossState(DATA_ORMOROK_ORB, NOT_STARTED); + SetBossState(DATA_ORMOROK_ORB, DONE); + break; } + } - void SetData(uint32 type, uint32) - { - switch (type) - { - case GO_TELESTRA_SPHERE: - SetBossState(DATA_TELESTRA_ORB, NOT_STARTED); - SetBossState(DATA_TELESTRA_ORB, DONE); - break; - case GO_ANOMALUS_SPHERE: - SetBossState(DATA_ANOMALUS_ORB, NOT_STARTED); - SetBossState(DATA_ANOMALUS_ORB, DONE); - break; - case GO_ORMOROK_SPHERE: - SetBossState(DATA_ORMOROK_ORB, NOT_STARTED); - SetBossState(DATA_ORMOROK_ORB, DONE); - break; - } - } + bool SetBossState(uint32 id, EncounterState state) + { + if (!InstanceScript::SetBossState(id, state)) + return false; - bool SetBossState(uint32 id, EncounterState state) - { - if (!InstanceScript::SetBossState(id, state)) - return false; - - if (state != DONE || id > DATA_ORMOROK_EVENT) - return true; - - BossInfo const* bossInfo = GetBossInfo(id + DATA_TELESTRA_ORB); - for (DoorSet::const_iterator i = bossInfo->door[DOOR_TYPE_PASSAGE].begin(); i != bossInfo->door[DOOR_TYPE_PASSAGE].end(); ++i) - (*i)->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + if (state != DONE || id > DATA_ORMOROK_EVENT) return true; - } - std::string GetSaveData() + BossInfo const* bossInfo = GetBossInfo(id + DATA_TELESTRA_ORB); + for (DoorSet::const_iterator i = bossInfo->door[DOOR_TYPE_PASSAGE].begin(); i != bossInfo->door[DOOR_TYPE_PASSAGE].end(); ++i) + (*i)->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + return true; + } + + std::string GetSaveData() + { + std::ostringstream saveStream; + saveStream << "N E X " << GetBossSaveData(); + return saveStream.str(); + } + + void Load(const char* in) + { + if( !in ) + return; + + char dataHead1, dataHead2, dataHead3; + std::istringstream loadStream(in); + loadStream >> dataHead1 >> dataHead2 >> dataHead3; + if (dataHead1 == 'N' && dataHead2 == 'E' && dataHead3 == 'X') { - std::ostringstream saveStream; - saveStream << "N E X " << GetBossSaveData(); - return saveStream.str(); - } - - void Load(const char* in) - { - if( !in ) - return; - - char dataHead1, dataHead2, dataHead3; - std::istringstream loadStream(in); - loadStream >> dataHead1 >> dataHead2 >> dataHead3; - if (dataHead1 == 'N' && dataHead2 == 'E' && dataHead3 == 'X') + for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) { - for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) - { - uint32 tmpState; - loadStream >> tmpState; - if (tmpState == IN_PROGRESS || tmpState > SPECIAL) - tmpState = NOT_STARTED; - SetBossState(i, EncounterState(tmpState)); - } + uint32 tmpState; + loadStream >> tmpState; + if (tmpState == IN_PROGRESS || tmpState > SPECIAL) + tmpState = NOT_STARTED; + SetBossState(i, EncounterState(tmpState)); } } - }; + } + }; }; enum eFrayer @@ -180,104 +180,104 @@ enum eFrayer class npc_crystalline_frayer : public CreatureScript { - public: - npc_crystalline_frayer() : CreatureScript("npc_crystalline_frayer") { } +public: + npc_crystalline_frayer() : CreatureScript("npc_crystalline_frayer") { } - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } + + struct npc_crystalline_frayerAI : public ScriptedAI + { + npc_crystalline_frayerAI(Creature* creature) : ScriptedAI(creature) { - return GetInstanceAI(creature); } - struct npc_crystalline_frayerAI : public ScriptedAI + bool _allowDeath; + uint32 restoreTimer; + uint32 abilityTimer1; + uint32 abilityTimer2; + + void Reset() { - npc_crystalline_frayerAI(Creature* creature) : ScriptedAI(creature) + restoreTimer = 0; + abilityTimer1 = 0; + abilityTimer2 = 30000; + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + } + + void EnterCombat(Unit*) + { + _allowDeath = me->GetInstanceScript()->GetBossState(DATA_ORMOROK_EVENT) == DONE; + } + + void EnterEvadeMode() + { + if (me->isRegeneratingHealth()) + ScriptedAI::EnterEvadeMode(); + } + + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) + { + if (damage >= me->GetHealth()) { + if (!_allowDeath) + { + me->RemoveAllAuras(); + me->DeleteThreatList(); + me->CombatStop(true); + damage = 0; + + me->SetReactState(REACT_PASSIVE); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + me->SetRegeneratingHealth(false); + me->CastSpell(me, SPELL_SUMMON_SEED_POD, true); + me->CastSpell(me, SPELL_SEED_POD, true); + me->CastSpell(me, SPELL_AURA_OF_REGENERATION, false); + restoreTimer = 1; + } + } + } + + void UpdateAI(uint32 diff) + { + if (restoreTimer) + { + restoreTimer += diff; + if (restoreTimer >= 90 * IN_MILLISECONDS) + { + Talk(0); + me->SetRegeneratingHealth(true); + restoreTimer = 0; + me->SetReactState(REACT_AGGRESSIVE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + } + return; } - bool _allowDeath; - uint32 restoreTimer; - uint32 abilityTimer1; - uint32 abilityTimer2; + if (!UpdateVictim()) + return; - void Reset() + abilityTimer1 += diff; + abilityTimer2 += diff; + + if (abilityTimer1 >= 5000) { - restoreTimer = 0; + me->CastSpell(me->GetVictim(), SPELL_ENSNARE, false); abilityTimer1 = 0; - abilityTimer2 = 30000; - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } - void EnterCombat(Unit*) + if (abilityTimer2 >= 30000) { - _allowDeath = me->GetInstanceScript()->GetBossState(DATA_ORMOROK_EVENT) == DONE; + me->CastSpell(me->GetVictim(), SPELL_CRYSTAL_BLOOM, false); + abilityTimer2 = 0; } - - void EnterEvadeMode() - { - if (me->isRegeneratingHealth()) - ScriptedAI::EnterEvadeMode(); - } - - void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) - { - if (damage >= me->GetHealth()) - { - if (!_allowDeath) - { - me->RemoveAllAuras(); - me->DeleteThreatList(); - me->CombatStop(true); - damage = 0; - - me->SetReactState(REACT_PASSIVE); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - me->SetRegeneratingHealth(false); - me->CastSpell(me, SPELL_SUMMON_SEED_POD, true); - me->CastSpell(me, SPELL_SEED_POD, true); - me->CastSpell(me, SPELL_AURA_OF_REGENERATION, false); - restoreTimer = 1; - } - } - } - - void UpdateAI(uint32 diff) - { - if (restoreTimer) - { - restoreTimer += diff; - if (restoreTimer >= 90*IN_MILLISECONDS) - { - Talk(0); - me->SetRegeneratingHealth(true); - restoreTimer = 0; - me->SetReactState(REACT_AGGRESSIVE); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - } - return; - } - - if (!UpdateVictim()) - return; - - abilityTimer1 += diff; - abilityTimer2 += diff; - - if (abilityTimer1 >= 5000) - { - me->CastSpell(me->GetVictim(), SPELL_ENSNARE, false); - abilityTimer1 = 0; - } - - if (abilityTimer2 >= 30000) - { - me->CastSpell(me->GetVictim(), SPELL_CRYSTAL_BLOOM, false); - abilityTimer2 = 0; - } - } - }; + } + }; }; void AddSC_instance_nexus() diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp index b07ddd299..e081a418a 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp @@ -54,11 +54,11 @@ public: struct boss_drakosAI : public ScriptedAI { - boss_drakosAI(Creature *c) : ScriptedAI(c) + boss_drakosAI(Creature* c) : ScriptedAI(c) { pInstance = c->GetInstanceScript(); } - + InstanceScript* pInstance; EventMap events; @@ -79,7 +79,7 @@ public: me->SetInCombatWithZone(); - events.RescheduleEvent(EVENT_MAGIC_PULL, urand(10000,15000)); + events.RescheduleEvent(EVENT_MAGIC_PULL, urand(10000, 15000)); events.RescheduleEvent(EVENT_THUNDERING_STOMP, urand(3000, 6000)); events.RescheduleEvent(EVENT_SUMMON, 2000); } @@ -91,8 +91,8 @@ public: if (pInstance) { pInstance->SetData(DATA_DRAKOS, DONE); - for( uint8 i=0; i<3; ++i ) - if( uint64 guid = pInstance->GetData64(DATA_DCD_1+i) ) + for( uint8 i = 0; i < 3; ++i ) + if( uint64 guid = pInstance->GetData64(DATA_DCD_1 + i) ) if( GameObject* pGo = ObjectAccessor::GetGameObject(*me, guid) ) if( pGo->GetGoState() != GO_STATE_ACTIVE ) { @@ -103,7 +103,7 @@ public: } - void KilledUnit(Unit * /*victim*/) + void KilledUnit(Unit* /*victim*/) { Talk(SAY_KILL); } @@ -133,7 +133,7 @@ public: //me->MonsterTextEmote(TEXT_MAGIC_PULL, 0, true); me->CastSpell(me, SPELL_MAGIC_PULL, false); - events.RepeatEvent(urand(15000,25000)); + events.RepeatEvent(urand(15000, 25000)); events.ScheduleEvent(EVENT_SUMMON_x4, 1500); } break; @@ -142,24 +142,24 @@ public: Talk(SAY_STOMP); me->CastSpell(me, SPELL_THUNDERING_STOMP, false); - events.RepeatEvent(urand(10000,20000)); + events.RepeatEvent(urand(10000, 20000)); } break; case EVENT_SUMMON: { - for( uint8 i=0; i<2; ++i ) + for( uint8 i = 0; i < 2; ++i ) { - float angle = rand_norm()*2*M_PI; - me->SummonCreature(NPC_UNSTABLE_SPHERE, me->GetPositionX() + 5.0f*cos(angle), me->GetPositionY() + 5.0f*sin(angle), me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 18000); + float angle = rand_norm() * 2 * M_PI; + me->SummonCreature(NPC_UNSTABLE_SPHERE, me->GetPositionX() + 5.0f * cos(angle), me->GetPositionY() + 5.0f * sin(angle), me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 18000); } events.RepeatEvent(2000); } break; case EVENT_SUMMON_x4: - for( uint8 i=0; i<4; ++i ) + for( uint8 i = 0; i < 4; ++i ) { - float angle = rand_norm()*2*M_PI; - me->SummonCreature(NPC_UNSTABLE_SPHERE, me->GetPositionX() + 5.0f*cos(angle), me->GetPositionY() + 5.0f*sin(angle), me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 18000); + float angle = rand_norm() * 2 * M_PI; + me->SummonCreature(NPC_UNSTABLE_SPHERE, me->GetPositionX() + 5.0f * cos(angle), me->GetPositionY() + 5.0f * sin(angle), me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 18000); } events.PopEvent(); break; @@ -180,16 +180,16 @@ public: struct npc_oculus_unstable_sphereAI : public ScriptedAI { - npc_oculus_unstable_sphereAI(Creature *c) : ScriptedAI(c) {} + npc_oculus_unstable_sphereAI(Creature* c) : ScriptedAI(c) {} uint32 timer; bool located, gonext; void PickNewLocation() { - float dist = rand_norm()*40.0f; - float angle = rand_norm()*2*M_PI; - me->GetMotionMaster()->MovePoint(1, 961.29f + dist*cos(angle), 1049.0f + dist*sin(angle), 360.0f); + float dist = rand_norm() * 40.0f; + float angle = rand_norm() * 2 * M_PI; + me->GetMotionMaster()->MovePoint(1, 961.29f + dist * cos(angle), 1049.0f + dist * sin(angle), 360.0f); } void MovementInform(uint32 type, uint32 id) diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp index 05287ca20..1598e8edf 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp @@ -65,7 +65,7 @@ public: struct boss_eregosAI : public ScriptedAI { - boss_eregosAI(Creature *c) : ScriptedAI(c) + boss_eregosAI(Creature* c) : ScriptedAI(c) { pInstance = c->GetInstanceScript(); } @@ -132,19 +132,19 @@ public: me->SummonGameObject(GO_SPOTLIGHT, 1018.06f, 1051.09f, 605.619019f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0); } - void DamageTaken(Unit*, uint32 & /*damage*/, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask) { if( !me->GetMap()->IsHeroic() ) return; - if( shiftNumber <= uint32(1) && uint32(me->GetHealth()*100/me->GetMaxHealth()) <= uint32(60-shiftNumber*40) ) + if( shiftNumber <= uint32(1) && uint32(me->GetHealth() * 100 / me->GetMaxHealth()) <= uint32(60 - shiftNumber * 40) ) { ++shiftNumber; events.RescheduleEvent(EVENT_SPELL_PLANAR_SHIFT, 0); } } - void KilledUnit(Unit * /*victim*/) + void KilledUnit(Unit* /*victim*/) { Talk(SAY_KILL); } @@ -193,16 +193,16 @@ public: events.RepeatEvent(35000); break; case EVENT_SUMMON_WHELPS: - for( uint8 i=0; i<5; ++i ) + for( uint8 i = 0; i < 5; ++i ) events.ScheduleEvent(EVENT_SUMMON_SINGLE_WHELP, urand(0, 8000)); events.RepeatEvent(40000); break; case EVENT_SUMMON_SINGLE_WHELP: { - float x = rand_norm()*50.0f-25.0f; - float y = rand_norm()*50.0f-25.0f; - float z = rand_norm()*50.0f-25.0f; - me->SummonCreature(NPC_LEY_GUARDIAN_WHELP, me->GetPositionX()+x, me->GetPositionY()+y, me->GetPositionZ()+z, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); + float x = rand_norm() * 50.0f - 25.0f; + float y = rand_norm() * 50.0f - 25.0f; + float z = rand_norm() * 50.0f - 25.0f; + me->SummonCreature(NPC_LEY_GUARDIAN_WHELP, me->GetPositionX() + x, me->GetPositionY() + y, me->GetPositionZ() + z, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); events.PopEvent(); } break; @@ -210,7 +210,7 @@ public: //me->MonsterYell(TEXT_PLANAR_SHIFT_SAY, LANG_UNIVERSAL, 0); Talk(SAY_SHIELD); me->CastSpell(me, SPELL_PLANAR_SHIFT, false); - for( uint8 i=0; i<3; ++i ) + for( uint8 i = 0; i < 3; ++i ) if( Unit* t = SelectTarget(SELECT_TARGET_RANDOM, 0, 300.0f, false) ) if( Creature* pa = me->SummonCreature(NPC_PLANAR_ANOMALY, *me, TEMPSUMMON_TIMED_DESPAWN, 17000) ) { diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp index 7fd7e6ab2..aee14e1cd 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp @@ -60,18 +60,20 @@ enum Yells SAY_PLAYER_KILL = 7 }; -float summons[3][4] = { - {NPC_PHANTASMAL_AIR, NPC_PHANTASMAL_AIR, NPC_PHANTASMAL_WATER, NPC_PHANTASMAL_FIRE}, - {NPC_PHANTASMAL_OGRE, NPC_PHANTASMAL_OGRE, NPC_PHANTASMAL_NAGAL, NPC_PHANTASMAL_MURLOC}, - {NPC_PHANTASMAL_CLOUDSCRAPER, NPC_PHANTASMAL_CLOUDSCRAPER, NPC_PHANTASMAL_MAMMOTH, NPC_PHANTASMAL_WOLF} - }; +float summons[3][4] = +{ + {NPC_PHANTASMAL_AIR, NPC_PHANTASMAL_AIR, NPC_PHANTASMAL_WATER, NPC_PHANTASMAL_FIRE}, + {NPC_PHANTASMAL_OGRE, NPC_PHANTASMAL_OGRE, NPC_PHANTASMAL_NAGAL, NPC_PHANTASMAL_MURLOC}, + {NPC_PHANTASMAL_CLOUDSCRAPER, NPC_PHANTASMAL_CLOUDSCRAPER, NPC_PHANTASMAL_MAMMOTH, NPC_PHANTASMAL_WOLF} +}; -float cords[4][4] = { - {1177.47f, 937.722f, 527.405f, 2.21657f}, - {968.66f, 1042.53f, 527.32f, 0.077f}, - {1164.02f, 1170.85f, 527.321f, 3.66f}, - {1118.31f, 1080.377f, 508.361f, 4.25f} - }; +float cords[4][4] = +{ + {1177.47f, 937.722f, 527.405f, 2.21657f}, + {968.66f, 1042.53f, 527.32f, 0.077f}, + {1164.02f, 1170.85f, 527.321f, 3.66f}, + {1118.31f, 1080.377f, 508.361f, 4.25f} +}; class boss_urom : public CreatureScript { @@ -85,20 +87,20 @@ public: struct boss_uromAI : public ScriptedAI { - boss_uromAI(Creature *c) : ScriptedAI(c) + boss_uromAI(Creature* c) : ScriptedAI(c) { pInstance = c->GetInstanceScript(); } - + InstanceScript* pInstance; EventMap events; bool lock; - float x,y,z; + float x, y, z; int32 releaseLockTimer; uint8 GetPhaseByCurrentPosition() { - for (uint8 i=0; i<4; ++i) + for (uint8 i = 0; i < 4; ++i) if (me->GetDistance(cords[i][0], cords[i][1], cords[i][2]) < 20.0f) return i; @@ -218,35 +220,35 @@ public: switch( spell->Id ) { case SPELL_SUMMON_MENAGERIE_1: - { - for( uint8 i=0; i<4; ++i ) - me->SummonCreature(summons[0][i], cords[0][0] + ((i%2) ? 4.0f : -4.0f), cords[0][1] + (i<2 ? 4.0f : -4.0f), cords[0][2], 0.0f, TEMPSUMMON_TIMED_DESPAWN, 300000); + { + for( uint8 i = 0; i < 4; ++i ) + me->SummonCreature(summons[0][i], cords[0][0] + ((i % 2) ? 4.0f : -4.0f), cords[0][1] + (i < 2 ? 4.0f : -4.0f), cords[0][2], 0.0f, TEMPSUMMON_TIMED_DESPAWN, 300000); uint8 phase = GetPhaseByCurrentPosition(); - me->SetHomePosition(cords[phase+1][0], cords[phase+1][1], cords[phase+1][2], cords[phase+1][3]); - me->DestroyForNearbyPlayers(); + me->SetHomePosition(cords[phase + 1][0], cords[phase + 1][1], cords[phase + 1][2], cords[phase + 1][3]); + me->DestroyForNearbyPlayers(); LeaveCombat(); - me->CastSpell(me, SPELL_EVOCATION, true); - releaseLockTimer = 1; - } - break; + me->CastSpell(me, SPELL_EVOCATION, true); + releaseLockTimer = 1; + } + break; case SPELL_SUMMON_MENAGERIE_2: - { - for( uint8 i=0; i<4; ++i ) - me->SummonCreature(summons[1][i], cords[1][0] + ((i%2) ? 4.0f : -4.0f), cords[1][1] + (i<2 ? 4.0f : -4.0f), cords[1][2], 0.0f, TEMPSUMMON_TIMED_DESPAWN, 300000); + { + for( uint8 i = 0; i < 4; ++i ) + me->SummonCreature(summons[1][i], cords[1][0] + ((i % 2) ? 4.0f : -4.0f), cords[1][1] + (i < 2 ? 4.0f : -4.0f), cords[1][2], 0.0f, TEMPSUMMON_TIMED_DESPAWN, 300000); uint8 phase = GetPhaseByCurrentPosition(); - me->SetHomePosition(cords[phase+1][0], cords[phase+1][1], cords[phase+1][2], cords[phase+1][3]); - me->DestroyForNearbyPlayers(); + me->SetHomePosition(cords[phase + 1][0], cords[phase + 1][1], cords[phase + 1][2], cords[phase + 1][3]); + me->DestroyForNearbyPlayers(); LeaveCombat(); - me->CastSpell(me, SPELL_EVOCATION, true); - releaseLockTimer = 1; - } - break; + me->CastSpell(me, SPELL_EVOCATION, true); + releaseLockTimer = 1; + } + break; case SPELL_SUMMON_MENAGERIE_3: { - for( uint8 i=0; i<4; ++i ) - me->SummonCreature(summons[2][i], cords[2][0] + ((i%2) ? 4.0f : -4.0f), cords[2][1] + (i<2 ? 4.0f : -4.0f), cords[2][2], 0.0f, TEMPSUMMON_TIMED_DESPAWN, 300000); + for( uint8 i = 0; i < 4; ++i ) + me->SummonCreature(summons[2][i], cords[2][0] + ((i % 2) ? 4.0f : -4.0f), cords[2][1] + (i < 2 ? 4.0f : -4.0f), cords[2][2], 0.0f, TEMPSUMMON_TIMED_DESPAWN, 300000); uint8 phase = GetPhaseByCurrentPosition(); - me->SetHomePosition(cords[phase+1][0], cords[phase+1][1], cords[phase+1][2], cords[phase+1][3]); + me->SetHomePosition(cords[phase + 1][0], cords[phase + 1][1], cords[phase + 1][2], cords[phase + 1][3]); me->DestroyForNearbyPlayers(); LeaveCombat(); me->CastSpell(me, SPELL_EVOCATION, true); @@ -262,7 +264,7 @@ public: me->SetCanFly(true); me->SetDisableGravity(true); me->NearTeleportTo(1103.69f, 1048.76f, 512.279f, 1.16f); - + Talk(SAY_ARCANE_EXPLOSION); Talk(EMOTE_ARCANE_EXPLOSION); @@ -313,7 +315,7 @@ public: case EVENT_FROSTBOMB: if( Unit* v = me->GetVictim() ) me->CastSpell(v, SPELL_FROSTBOMB, false); - events.RepeatEvent(urand(7000,11000)); + events.RepeatEvent(urand(7000, 11000)); break; case EVENT_TIME_BOMB: if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true) ) @@ -325,7 +327,7 @@ public: y = me->GetPositionY(); z = me->GetPositionZ(); me->CastSpell(me, SPELL_TELEPORT, false); - events.RepeatEvent(urand(25000,30000)); + events.RepeatEvent(urand(25000, 30000)); events.DelayEvents(10000); break; case EVENT_TELE_BACK: diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp index 6be85b6e0..8a9058da6 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp @@ -73,11 +73,11 @@ public: } struct boss_varosAI : public ScriptedAI { - boss_varosAI(Creature *c) : ScriptedAI(c) + boss_varosAI(Creature* c) : ScriptedAI(c) { pInstance = c->GetInstanceScript(); } - + InstanceScript* pInstance; EventMap events; float ZapAngle; @@ -222,9 +222,9 @@ public: me->SetFacingTo(ZapAngle); me->SetControlled(true, UNIT_STATE_ROOT); me->CastSpell((Unit*)NULL, SPELL_ENERGIZE_CORES, false); - ZapAngle += M_PI/2; - if( ZapAngle >= 2*M_PI ) - ZapAngle -= 2*M_PI; + ZapAngle += M_PI / 2; + if( ZapAngle >= 2 * M_PI ) + ZapAngle -= 2 * M_PI; events.PopEvent(); events.ScheduleEvent(EVENT_ENERGIZE_CORES_THIN, 2000); } diff --git a/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp index adef45696..223331906 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp @@ -77,7 +77,7 @@ public: switch( pGo->GetEntry() ) { case GO_DRAGON_CAGE_DOOR: - for( uint8 i=0; i<3; ++i ) + for( uint8 i = 0; i < 3; ++i ) { if( DragonCageDoorGUID[i] ) continue; @@ -104,7 +104,7 @@ public: if (m_auiEncounter[DATA_DRAKOS] == DONE && m_auiEncounter[DATA_VAROS] != DONE) { player->SendUpdateWorldState(WORLD_STATE_CENTRIFUGE_CONSTRUCT_SHOW, 1); - player->SendUpdateWorldState(WORLD_STATE_CENTRIFUGE_CONSTRUCT_AMOUNT, 10-CentrifugeCount); + player->SendUpdateWorldState(WORLD_STATE_CENTRIFUGE_CONSTRUCT_AMOUNT, 10 - CentrifugeCount); } else { @@ -128,7 +128,7 @@ public: if( data == DONE ) { DoUpdateWorldState(WORLD_STATE_CENTRIFUGE_CONSTRUCT_SHOW, 1); - DoUpdateWorldState(WORLD_STATE_CENTRIFUGE_CONSTRUCT_AMOUNT, 10-CentrifugeCount); + DoUpdateWorldState(WORLD_STATE_CENTRIFUGE_CONSTRUCT_AMOUNT, 10 - CentrifugeCount); if (instance->IsHeroic()) DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_MAKE_IT_COUNT_TIMED_EVENT); @@ -153,13 +153,13 @@ public: case DATA_EREGOS: m_auiEncounter[DATA_EREGOS] = data; if (data == DONE) - DoRespawnGameObject(EregosCacheGUID, 7*DAY); + DoRespawnGameObject(EregosCacheGUID, 7 * DAY); break; case DATA_CC_COUNT: if( CentrifugeCount < 10 ) { ++CentrifugeCount; - DoUpdateWorldState(WORLD_STATE_CENTRIFUGE_CONSTRUCT_AMOUNT, 10-CentrifugeCount); + DoUpdateWorldState(WORLD_STATE_CENTRIFUGE_CONSTRUCT_AMOUNT, 10 - CentrifugeCount); } if( CentrifugeCount >= 10 ) if( Creature* varos = instance->GetCreature(uiVarosGUID) ) @@ -215,7 +215,7 @@ public: case DATA_DCD_1: case DATA_DCD_2: case DATA_DCD_3: - return DragonCageDoorGUID[identifier-100]; + return DragonCageDoorGUID[identifier - 100]; } return 0; @@ -251,7 +251,7 @@ public: { loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2] >> m_auiEncounter[3] >> CentrifugeCount; - for( uint8 i=0; iPlayerTalkClass->GetGossipMenu().ClearMenu(); switch(creature->GetEntry()) { - case NPC_VERDISA: - switch(uiAction) - { - case GOSSIP_ACTION_INFO_DEF + 1: - if (!HAS_ESSENCE(player)) + case NPC_VERDISA: + switch(uiAction) { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_VERDISA1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_VERDISA2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - SendGossipMenuFor(player, GOSSIP_TEXTID_VERDISA1, creature->GetGUID()); - } - else - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_VERDISA2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - SendGossipMenuFor(player, GOSSIP_TEXTID_VERDISA2, creature->GetGUID()); + case GOSSIP_ACTION_INFO_DEF + 1: + if (!HAS_ESSENCE(player)) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_VERDISA1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_VERDISA2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + SendGossipMenuFor(player, GOSSIP_TEXTID_VERDISA1, creature->GetGUID()); + } + else + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_VERDISA2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + SendGossipMenuFor(player, GOSSIP_TEXTID_VERDISA2, creature->GetGUID()); + } + break; + case GOSSIP_ACTION_INFO_DEF + 2: + { + ItemPosCountVec dest; + uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, ITEM_EMERALD_ESSENCE, 1); + if (msg == EQUIP_ERR_OK) + player->StoreNewItem(dest, ITEM_EMERALD_ESSENCE, true); + CloseGossipMenuFor(player); + break; + } + case GOSSIP_ACTION_INFO_DEF + 3: + if (!HAS_ESSENCE(player)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_VERDISA1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, GOSSIP_TEXTID_VERDISA3, creature->GetGUID()); + break; } break; - case GOSSIP_ACTION_INFO_DEF + 2: - { - ItemPosCountVec dest; - uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, ITEM_EMERALD_ESSENCE, 1); - if (msg == EQUIP_ERR_OK) - player->StoreNewItem(dest, ITEM_EMERALD_ESSENCE, true); - CloseGossipMenuFor(player); - break; - } - case GOSSIP_ACTION_INFO_DEF + 3: - if (!HAS_ESSENCE(player)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_VERDISA1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - SendGossipMenuFor(player, GOSSIP_TEXTID_VERDISA3, creature->GetGUID()); - break; - } - break; - case NPC_BELGARISTRASZ: - switch(uiAction) - { - case GOSSIP_ACTION_INFO_DEF + 1: - if (!HAS_ESSENCE(player)) + case NPC_BELGARISTRASZ: + switch(uiAction) { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BELGARISTRASZ1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BELGARISTRASZ2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - SendGossipMenuFor(player, GOSSIP_TEXTID_BELGARISTRASZ1, creature->GetGUID()); - } - else - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BELGARISTRASZ2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - SendGossipMenuFor(player, GOSSIP_TEXTID_BELGARISTRASZ2, creature->GetGUID()); + case GOSSIP_ACTION_INFO_DEF + 1: + if (!HAS_ESSENCE(player)) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BELGARISTRASZ1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BELGARISTRASZ2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + SendGossipMenuFor(player, GOSSIP_TEXTID_BELGARISTRASZ1, creature->GetGUID()); + } + else + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BELGARISTRASZ2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + SendGossipMenuFor(player, GOSSIP_TEXTID_BELGARISTRASZ2, creature->GetGUID()); + } + break; + case GOSSIP_ACTION_INFO_DEF + 2: + { + ItemPosCountVec dest; + uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, ITEM_RUBY_ESSENCE, 1); + if (msg == EQUIP_ERR_OK) + player->StoreNewItem(dest, ITEM_RUBY_ESSENCE, true); + CloseGossipMenuFor(player); + break; + } + case GOSSIP_ACTION_INFO_DEF + 3: + if (!HAS_ESSENCE(player)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BELGARISTRASZ1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, GOSSIP_TEXTID_BELGARISTRASZ3, creature->GetGUID()); + break; } break; - case GOSSIP_ACTION_INFO_DEF + 2: - { - ItemPosCountVec dest; - uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, ITEM_RUBY_ESSENCE, 1); - if (msg == EQUIP_ERR_OK) - player->StoreNewItem(dest, ITEM_RUBY_ESSENCE, true); - CloseGossipMenuFor(player); - break; - } - case GOSSIP_ACTION_INFO_DEF + 3: - if (!HAS_ESSENCE(player)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BELGARISTRASZ1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - SendGossipMenuFor(player, GOSSIP_TEXTID_BELGARISTRASZ3, creature->GetGUID()); - break; - } - break; - case NPC_ETERNOS: - switch(uiAction) - { - case GOSSIP_ACTION_INFO_DEF + 1: - if (!HAS_ESSENCE(player)) + case NPC_ETERNOS: + switch(uiAction) { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ETERNOS1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ETERNOS2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - SendGossipMenuFor(player, GOSSIP_TEXTID_ETERNOS1, creature->GetGUID()); - } - else - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ETERNOS2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - SendGossipMenuFor(player, GOSSIP_TEXTID_ETERNOS2, creature->GetGUID()); - } - break; - case GOSSIP_ACTION_INFO_DEF + 2: - { - ItemPosCountVec dest; - uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, ITEM_AMBER_ESSENCE, 1); - if (msg == EQUIP_ERR_OK) - player->StoreNewItem(dest, ITEM_AMBER_ESSENCE, true); + case GOSSIP_ACTION_INFO_DEF + 1: + if (!HAS_ESSENCE(player)) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ETERNOS1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ETERNOS2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + SendGossipMenuFor(player, GOSSIP_TEXTID_ETERNOS1, creature->GetGUID()); + } + else + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ETERNOS2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + SendGossipMenuFor(player, GOSSIP_TEXTID_ETERNOS2, creature->GetGUID()); + } + break; + case GOSSIP_ACTION_INFO_DEF + 2: + { + ItemPosCountVec dest; + uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, ITEM_AMBER_ESSENCE, 1); + if (msg == EQUIP_ERR_OK) + player->StoreNewItem(dest, ITEM_AMBER_ESSENCE, true); - CloseGossipMenuFor(player); - break; - } - case GOSSIP_ACTION_INFO_DEF + 3: - if (!HAS_ESSENCE(player)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ETERNOS1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + CloseGossipMenuFor(player); + break; + } + case GOSSIP_ACTION_INFO_DEF + 3: + if (!HAS_ESSENCE(player)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ETERNOS1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - SendGossipMenuFor(player, GOSSIP_TEXTID_ETERNOS3, creature->GetGUID()); + SendGossipMenuFor(player, GOSSIP_TEXTID_ETERNOS3, creature->GetGUID()); + break; + } break; - } - break; } return true; @@ -207,7 +207,7 @@ public: struct npc_oculus_drakeAI : public VehicleAI { - npc_oculus_drakeAI(Creature *creature) : VehicleAI(creature) + npc_oculus_drakeAI(Creature* creature) : VehicleAI(creature) { m_pInstance = me->GetInstanceScript(); JustSummoned = true; @@ -227,17 +227,17 @@ public: switch (me->GetEntry()) { - case NPC_RUBY_DRAKE: - me->CastSpell(summoner, SPELL_RIDE_RUBY_DRAKE_QUE); - break; - case NPC_EMERALD_DRAKE: - me->CastSpell(summoner, SPELL_RIDE_EMERALD_DRAKE_QUE); - break; - case NPC_AMBER_DRAKE: - me->CastSpell(summoner, SPELL_RIDE_AMBER_DRAKE_QUE); - break; - default: - return; + case NPC_RUBY_DRAKE: + me->CastSpell(summoner, SPELL_RIDE_RUBY_DRAKE_QUE); + break; + case NPC_EMERALD_DRAKE: + me->CastSpell(summoner, SPELL_RIDE_EMERALD_DRAKE_QUE); + break; + case NPC_AMBER_DRAKE: + me->CastSpell(summoner, SPELL_RIDE_AMBER_DRAKE_QUE); + break; + default: + return; } Position pos = summoner->GetPosition(); @@ -294,7 +294,7 @@ public: JustSummoned = false; if( m_pInstance ) { - if( !m_pInstance->IsEncounterInProgress() || m_pInstance->GetData(DATA_EREGOS)==IN_PROGRESS ) + if( !m_pInstance->IsEncounterInProgress() || m_pInstance->GetData(DATA_EREGOS) == IN_PROGRESS ) { if( me->GetVehicleKit() && me->IsSummon() ) if( !me->GetVehicleKit()->GetPassenger(0) ) @@ -358,7 +358,7 @@ public: struct npc_centrifuge_constructAI : public ScriptedAI { - npc_centrifuge_constructAI(Creature *creature) : ScriptedAI(creature) {} + npc_centrifuge_constructAI(Creature* creature) : ScriptedAI(creature) {} void Reset() {} @@ -394,400 +394,400 @@ public: // 49838 - Stop Time class spell_oculus_stop_time : public SpellScriptLoader { - public: - spell_oculus_stop_time() : SpellScriptLoader("spell_oculus_stop_time") { } +public: + spell_oculus_stop_time() : SpellScriptLoader("spell_oculus_stop_time") { } - class spell_oculus_stop_time_AuraScript : public AuraScript + class spell_oculus_stop_time_AuraScript : public AuraScript + { + PrepareAuraScript(spell_oculus_stop_time_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_oculus_stop_time_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_AMBER_SHOCK_CHARGE)) - return false; - return true; - } - - void Apply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* caster = GetCaster(); - if (!caster) - return; - - Unit* target = GetTarget(); - for (uint32 i = 0; i < 5; ++i) - caster->CastSpell(target, SPELL_AMBER_SHOCK_CHARGE, true); - } - - void Register() - { - AfterEffectApply += AuraEffectApplyFn(spell_oculus_stop_time_AuraScript::Apply, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_oculus_stop_time_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_AMBER_SHOCK_CHARGE)) + return false; + return true; } + + void Apply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* caster = GetCaster(); + if (!caster) + return; + + Unit* target = GetTarget(); + for (uint32 i = 0; i < 5; ++i) + caster->CastSpell(target, SPELL_AMBER_SHOCK_CHARGE, true); + } + + void Register() + { + AfterEffectApply += AuraEffectApplyFn(spell_oculus_stop_time_AuraScript::Apply, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_oculus_stop_time_AuraScript(); + } }; // 50240 - Evasive Maneuvers class spell_oculus_evasive_maneuvers : public SpellScriptLoader { - public: - spell_oculus_evasive_maneuvers() : SpellScriptLoader("spell_oculus_evasive_maneuvers") { } +public: + spell_oculus_evasive_maneuvers() : SpellScriptLoader("spell_oculus_evasive_maneuvers") { } - class spell_oculus_evasive_maneuvers_AuraScript : public AuraScript + class spell_oculus_evasive_maneuvers_AuraScript : public AuraScript + { + PrepareAuraScript(spell_oculus_evasive_maneuvers_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_oculus_evasive_maneuvers_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_RUBY_EVASIVE_CHARGES)) - return false; - return true; - } - - void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) - { - PreventDefaultAction(); - GetTarget()->RemoveAuraFromStack(SPELL_RUBY_EVASIVE_CHARGES); - if (!GetTarget()->HasAura(SPELL_RUBY_EVASIVE_CHARGES)) - SetDuration(0); - } - - void Register() - { - OnEffectProc += AuraEffectProcFn(spell_oculus_evasive_maneuvers_AuraScript::HandleProc, EFFECT_2, SPELL_AURA_PROC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_oculus_evasive_maneuvers_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_RUBY_EVASIVE_CHARGES)) + return false; + return true; } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + GetTarget()->RemoveAuraFromStack(SPELL_RUBY_EVASIVE_CHARGES); + if (!GetTarget()->HasAura(SPELL_RUBY_EVASIVE_CHARGES)) + SetDuration(0); + } + + void Register() + { + OnEffectProc += AuraEffectProcFn(spell_oculus_evasive_maneuvers_AuraScript::HandleProc, EFFECT_2, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_oculus_evasive_maneuvers_AuraScript(); + } }; // 49840 - Shock Lance class spell_oculus_shock_lance : public SpellScriptLoader { - public: - spell_oculus_shock_lance() : SpellScriptLoader("spell_oculus_shock_lance") { } +public: + spell_oculus_shock_lance() : SpellScriptLoader("spell_oculus_shock_lance") { } - class spell_oculus_shock_lance_SpellScript : public SpellScript + class spell_oculus_shock_lance_SpellScript : public SpellScript + { + PrepareSpellScript(spell_oculus_shock_lance_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_oculus_shock_lance_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_AMBER_SHOCK_CHARGE)) - return false; - return true; - } - - void CalcDamage() - { - int32 damage = GetHitDamage(); - if (Unit* target = GetHitUnit()) - if (Aura* aura = target->GetAura(SPELL_AMBER_SHOCK_CHARGE, GetCaster()->GetGUID())) // shock charges from same caster - { - damage += aura->GetStackAmount()*6525; - aura->Remove(); - } - - SetHitDamage(damage); - } - - void Register() - { - OnHit += SpellHitFn(spell_oculus_shock_lance_SpellScript::CalcDamage); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_oculus_shock_lance_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_AMBER_SHOCK_CHARGE)) + return false; + return true; } + + void CalcDamage() + { + int32 damage = GetHitDamage(); + if (Unit* target = GetHitUnit()) + if (Aura* aura = target->GetAura(SPELL_AMBER_SHOCK_CHARGE, GetCaster()->GetGUID())) // shock charges from same caster + { + damage += aura->GetStackAmount() * 6525; + aura->Remove(); + } + + SetHitDamage(damage); + } + + void Register() + { + OnHit += SpellHitFn(spell_oculus_shock_lance_SpellScript::CalcDamage); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_oculus_shock_lance_SpellScript(); + } }; // 49592 - Temporal Rift class spell_oculus_temporal_rift : public SpellScriptLoader { - public: - spell_oculus_temporal_rift() : SpellScriptLoader("spell_oculus_temporal_rift") { } +public: + spell_oculus_temporal_rift() : SpellScriptLoader("spell_oculus_temporal_rift") { } - class spell_oculus_temporal_rift_AuraScript : public AuraScript + class spell_oculus_temporal_rift_AuraScript : public AuraScript + { + PrepareAuraScript(spell_oculus_temporal_rift_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_oculus_temporal_rift_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_AMBER_SHOCK_CHARGE)) - return false; - return true; - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - int32 amount = aurEff->GetAmount() + eventInfo.GetDamageInfo()->GetDamage(); - - uint8 num = amount/15000; - if (amount >= 15000) - { - if (Unit* caster = GetCaster()) - for (uint8 i =0; i < num; ++i ) - caster->CastSpell(GetTarget(), SPELL_AMBER_SHOCK_CHARGE, true); - } - - const_cast(aurEff)->SetAmount(amount - 15000*num); - } - - void Register() - { - OnEffectProc += AuraEffectProcFn(spell_oculus_temporal_rift_AuraScript::HandleProc, EFFECT_2, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_oculus_temporal_rift_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_AMBER_SHOCK_CHARGE)) + return false; + return true; } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + int32 amount = aurEff->GetAmount() + eventInfo.GetDamageInfo()->GetDamage(); + + uint8 num = amount / 15000; + if (amount >= 15000) + { + if (Unit* caster = GetCaster()) + for (uint8 i = 0; i < num; ++i ) + caster->CastSpell(GetTarget(), SPELL_AMBER_SHOCK_CHARGE, true); + } + + const_cast(aurEff)->SetAmount(amount - 15000 * num); + } + + void Register() + { + OnEffectProc += AuraEffectProcFn(spell_oculus_temporal_rift_AuraScript::HandleProc, EFFECT_2, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_oculus_temporal_rift_AuraScript(); + } }; // 50341 - Touch the Nightmare class spell_oculus_touch_the_nightmare : public SpellScriptLoader { - public: - spell_oculus_touch_the_nightmare() : SpellScriptLoader("spell_oculus_touch_the_nightmare") { } +public: + spell_oculus_touch_the_nightmare() : SpellScriptLoader("spell_oculus_touch_the_nightmare") { } - class spell_oculus_touch_the_nightmare_SpellScript : public SpellScript + class spell_oculus_touch_the_nightmare_SpellScript : public SpellScript + { + PrepareSpellScript(spell_oculus_touch_the_nightmare_SpellScript); + + void HandleDamageCalc(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_oculus_touch_the_nightmare_SpellScript); - - void HandleDamageCalc(SpellEffIndex /*effIndex*/) - { - SetHitDamage(int32(GetCaster()->CountPctFromMaxHealth(30))); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_oculus_touch_the_nightmare_SpellScript::HandleDamageCalc, EFFECT_2, SPELL_EFFECT_SCHOOL_DAMAGE); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_oculus_touch_the_nightmare_SpellScript(); + SetHitDamage(int32(GetCaster()->CountPctFromMaxHealth(30))); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_oculus_touch_the_nightmare_SpellScript::HandleDamageCalc, EFFECT_2, SPELL_EFFECT_SCHOOL_DAMAGE); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_oculus_touch_the_nightmare_SpellScript(); + } }; // 50344 - Dream Funnel class spell_oculus_dream_funnel : public SpellScriptLoader { - public: - spell_oculus_dream_funnel() : SpellScriptLoader("spell_oculus_dream_funnel") { } +public: + spell_oculus_dream_funnel() : SpellScriptLoader("spell_oculus_dream_funnel") { } - class spell_oculus_dream_funnel_AuraScript : public AuraScript + class spell_oculus_dream_funnel_AuraScript : public AuraScript + { + PrepareAuraScript(spell_oculus_dream_funnel_AuraScript); + + void HandleEffectCalcAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) { - PrepareAuraScript(spell_oculus_dream_funnel_AuraScript); + if (Unit* caster = GetCaster()) + amount = int32(caster->CountPctFromMaxHealth(5)); - void HandleEffectCalcAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) - { - if (Unit* caster = GetCaster()) - amount = int32(caster->CountPctFromMaxHealth(5)); - - canBeRecalculated = false; - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_oculus_dream_funnel_AuraScript::HandleEffectCalcAmount, EFFECT_0, SPELL_AURA_PERIODIC_HEAL); - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_oculus_dream_funnel_AuraScript::HandleEffectCalcAmount, EFFECT_2, SPELL_AURA_PERIODIC_DAMAGE); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_oculus_dream_funnel_AuraScript(); + canBeRecalculated = false; } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_oculus_dream_funnel_AuraScript::HandleEffectCalcAmount, EFFECT_0, SPELL_AURA_PERIODIC_HEAL); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_oculus_dream_funnel_AuraScript::HandleEffectCalcAmount, EFFECT_2, SPELL_AURA_PERIODIC_DAMAGE); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_oculus_dream_funnel_AuraScript(); + } }; class spell_oculus_call_ruby_emerald_amber_drake : public SpellScriptLoader { - public: - spell_oculus_call_ruby_emerald_amber_drake() : SpellScriptLoader("spell_oculus_call_ruby_emerald_amber_drake") { } +public: + spell_oculus_call_ruby_emerald_amber_drake() : SpellScriptLoader("spell_oculus_call_ruby_emerald_amber_drake") { } - class spell_oculus_call_ruby_emerald_amber_drake_SpellScript : public SpellScript + class spell_oculus_call_ruby_emerald_amber_drake_SpellScript : public SpellScript + { + PrepareSpellScript(spell_oculus_call_ruby_emerald_amber_drake_SpellScript); + + void SetDest(SpellDestination& dest) { - PrepareSpellScript(spell_oculus_call_ruby_emerald_amber_drake_SpellScript); - - void SetDest(SpellDestination& dest) - { - // Adjust effect summon position - Position const offset = { 0.0f, 0.0f, 12.0f, 0.0f }; - dest.RelocateOffset(offset); - } - - void Register() - { - OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_oculus_call_ruby_emerald_amber_drake_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER_FRONT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_oculus_call_ruby_emerald_amber_drake_SpellScript(); + // Adjust effect summon position + Position const offset = { 0.0f, 0.0f, 12.0f, 0.0f }; + dest.RelocateOffset(offset); } + + void Register() + { + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_oculus_call_ruby_emerald_amber_drake_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER_FRONT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_oculus_call_ruby_emerald_amber_drake_SpellScript(); + } }; class spell_oculus_ride_ruby_emerald_amber_drake_que : public SpellScriptLoader { - public: - spell_oculus_ride_ruby_emerald_amber_drake_que() : SpellScriptLoader("spell_oculus_ride_ruby_emerald_amber_drake_que") { } +public: + spell_oculus_ride_ruby_emerald_amber_drake_que() : SpellScriptLoader("spell_oculus_ride_ruby_emerald_amber_drake_que") { } - class spell_oculus_ride_ruby_emerald_amber_drake_que_AuraScript : public AuraScript + class spell_oculus_ride_ruby_emerald_amber_drake_que_AuraScript : public AuraScript + { + PrepareAuraScript(spell_oculus_ride_ruby_emerald_amber_drake_que_AuraScript); + + void HandlePeriodic(AuraEffect const* aurEff) { - PrepareAuraScript(spell_oculus_ride_ruby_emerald_amber_drake_que_AuraScript); - - void HandlePeriodic(AuraEffect const* aurEff) - { - // caster of the triggered spell is wrong for an unknown reason, handle it here correctly - PreventDefaultAction(); - if (Unit* caster = GetCaster()) - GetTarget()->CastSpell(caster, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_oculus_ride_ruby_emerald_amber_drake_que_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_oculus_ride_ruby_emerald_amber_drake_que_AuraScript(); + // caster of the triggered spell is wrong for an unknown reason, handle it here correctly + PreventDefaultAction(); + if (Unit* caster = GetCaster()) + GetTarget()->CastSpell(caster, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_oculus_ride_ruby_emerald_amber_drake_que_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_oculus_ride_ruby_emerald_amber_drake_que_AuraScript(); + } }; class spell_oculus_evasive_charges : public SpellScriptLoader { - public: - spell_oculus_evasive_charges() : SpellScriptLoader("spell_oculus_evasive_charges") { } +public: + spell_oculus_evasive_charges() : SpellScriptLoader("spell_oculus_evasive_charges") { } - class spell_oculus_evasive_chargesAuraScript : public AuraScript + class spell_oculus_evasive_chargesAuraScript : public AuraScript + { + PrepareAuraScript(spell_oculus_evasive_chargesAuraScript); + + void HandleOnEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_oculus_evasive_chargesAuraScript); - - void HandleOnEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) - caster->ModifyAuraState(AURA_STATE_UNKNOWN22, true); - } - - void HandleOnEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) - { - caster->RemoveAurasDueToSpell(SPELL_RUBY_EVASIVE_MANEUVERS); - caster->ModifyAuraState(AURA_STATE_UNKNOWN22, false); - } - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_oculus_evasive_chargesAuraScript::HandleOnEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - OnEffectRemove += AuraEffectRemoveFn(spell_oculus_evasive_chargesAuraScript::HandleOnEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_oculus_evasive_chargesAuraScript(); + if (Unit* caster = GetCaster()) + caster->ModifyAuraState(AURA_STATE_UNKNOWN22, true); } + + void HandleOnEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* caster = GetCaster()) + { + caster->RemoveAurasDueToSpell(SPELL_RUBY_EVASIVE_MANEUVERS); + caster->ModifyAuraState(AURA_STATE_UNKNOWN22, false); + } + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_oculus_evasive_chargesAuraScript::HandleOnEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + OnEffectRemove += AuraEffectRemoveFn(spell_oculus_evasive_chargesAuraScript::HandleOnEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_oculus_evasive_chargesAuraScript(); + } }; class spell_oculus_soar : public SpellScriptLoader { - public: - spell_oculus_soar() : SpellScriptLoader("spell_oculus_soar") { } +public: + spell_oculus_soar() : SpellScriptLoader("spell_oculus_soar") { } - class spell_oculus_soarAuraScript : public AuraScript + class spell_oculus_soarAuraScript : public AuraScript + { + PrepareAuraScript(spell_oculus_soarAuraScript); + + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_oculus_soarAuraScript); - - void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) + Unit* caster = GetCaster(); + + if (!caster) + return; + + if (!caster->getAttackers().empty()) { - Unit* caster = GetCaster(); + if (caster->HasAura(SPELL_SOAR_BUFF)) + caster->RemoveAurasDueToSpell(SPELL_SOAR_BUFF); - if (!caster) - return; - - if (!caster->getAttackers().empty()) - { - if (caster->HasAura(SPELL_SOAR_BUFF)) - caster->RemoveAurasDueToSpell(SPELL_SOAR_BUFF); - - PreventDefaultAction(); - return; - } - - if (!caster->HasAura(SPELL_SOAR_BUFF)) - caster->CastSpell(caster, SPELL_SOAR_BUFF, true); - - // We handle the health regen here, normal heal regen isn't working.... - if (caster->GetHealth() < caster->GetMaxHealth()) - caster->SetHealth(caster->GetHealth() + (uint32)((double)caster->GetMaxHealth()*0.2)); + PreventDefaultAction(); + return; } - void HandleOnEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* caster = GetCaster(); + if (!caster->HasAura(SPELL_SOAR_BUFF)) + caster->CastSpell(caster, SPELL_SOAR_BUFF, true); - if (!caster) - return; - - if (!caster->HasAura(SPELL_SOAR_BUFF)) - caster->CastSpell(caster, SPELL_SOAR_BUFF, true); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_oculus_soarAuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - OnEffectApply += AuraEffectApplyFn(spell_oculus_soarAuraScript::HandleOnEffectApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_oculus_soarAuraScript(); + // We handle the health regen here, normal heal regen isn't working.... + if (caster->GetHealth() < caster->GetMaxHealth()) + caster->SetHealth(caster->GetHealth() + (uint32)((double)caster->GetMaxHealth() * 0.2)); } + + void HandleOnEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* caster = GetCaster(); + + if (!caster) + return; + + if (!caster->HasAura(SPELL_SOAR_BUFF)) + caster->CastSpell(caster, SPELL_SOAR_BUFF, true); + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_oculus_soarAuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + OnEffectApply += AuraEffectApplyFn(spell_oculus_soarAuraScript::HandleOnEffectApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_oculus_soarAuraScript(); + } }; class spell_oculus_rider_aura : public SpellScriptLoader { - public: - spell_oculus_rider_aura() : SpellScriptLoader("spell_oculus_rider_aura") { } +public: + spell_oculus_rider_aura() : SpellScriptLoader("spell_oculus_rider_aura") { } - class spell_oculus_rider_auraAuraScript : public AuraScript + class spell_oculus_rider_auraAuraScript : public AuraScript + { + PrepareAuraScript(spell_oculus_rider_auraAuraScript); + + uint64 _drakeGUID; + + void HandleOnEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_oculus_rider_auraAuraScript); + Unit* caster = GetCaster(); + if (!caster) + return; - uint64 _drakeGUID; + Creature* drake = caster->GetVehicleCreatureBase(); - void HandleOnEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + if (!drake) + return; + + switch (aurEff->GetEffIndex()) { - Unit* caster = GetCaster(); - if (!caster) - return; - - Creature* drake = caster->GetVehicleCreatureBase(); - - if (!drake) - return; - - switch (aurEff->GetEffIndex()) - { case EFFECT_1: _drakeGUID = drake->GetGUID(); caster->AddAura(SPELL_DRAKE_FLAG_VISUAL, caster); @@ -801,78 +801,78 @@ class spell_oculus_rider_aura : public SpellScriptLoader caster->AddAura(SPELL_SCALE_STATS, drake); PreventDefaultAction(); break; - } } - - void HandleOnEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* caster = GetCaster(); - - if (!caster) - return; - - Creature* drake = ObjectAccessor::GetCreature(*caster, _drakeGUID); - - if (drake) - { - drake->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PLAYER_CONTROLLED); - drake->RemoveAurasDueToSpell(GetId()); - drake->RemoveAurasDueToSpell(SPELL_SOAR_TRIGGER); - drake->RemoveAurasDueToSpell(SPELL_RUBY_EVASIVE_AURA); - } - caster->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - caster->RemoveAurasDueToSpell(SPELL_DRAKE_FLAG_VISUAL); - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_oculus_rider_auraAuraScript::HandleOnEffectApply, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - OnEffectApply += AuraEffectApplyFn(spell_oculus_rider_auraAuraScript::HandleOnEffectApply, EFFECT_2, SPELL_AURA_LINKED, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - OnEffectRemove += AuraEffectRemoveFn(spell_oculus_rider_auraAuraScript::HandleOnEffectRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_oculus_rider_auraAuraScript(); } + + void HandleOnEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* caster = GetCaster(); + + if (!caster) + return; + + Creature* drake = ObjectAccessor::GetCreature(*caster, _drakeGUID); + + if (drake) + { + drake->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PLAYER_CONTROLLED); + drake->RemoveAurasDueToSpell(GetId()); + drake->RemoveAurasDueToSpell(SPELL_SOAR_TRIGGER); + drake->RemoveAurasDueToSpell(SPELL_RUBY_EVASIVE_AURA); + } + caster->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + caster->RemoveAurasDueToSpell(SPELL_DRAKE_FLAG_VISUAL); + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_oculus_rider_auraAuraScript::HandleOnEffectApply, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + OnEffectApply += AuraEffectApplyFn(spell_oculus_rider_auraAuraScript::HandleOnEffectApply, EFFECT_2, SPELL_AURA_LINKED, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + OnEffectRemove += AuraEffectRemoveFn(spell_oculus_rider_auraAuraScript::HandleOnEffectRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_oculus_rider_auraAuraScript(); + } }; class spell_oculus_drake_flag : public SpellScriptLoader { - public: - spell_oculus_drake_flag() : SpellScriptLoader("spell_oculus_drake_flag") { } +public: + spell_oculus_drake_flag() : SpellScriptLoader("spell_oculus_drake_flag") { } - class spell_oculus_drake_flagAuraScript : public AuraScript + class spell_oculus_drake_flagAuraScript : public AuraScript + { + PrepareAuraScript(spell_oculus_drake_flagAuraScript); + + void HandleOnEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_oculus_drake_flagAuraScript); + Unit* caster = GetCaster(); - void HandleOnEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + if (!caster) + return; + + Creature* drake = caster->GetVehicleCreatureBase(); + + if (!drake) { - Unit* caster = GetCaster(); - - if (!caster) - return; - - Creature* drake = caster->GetVehicleCreatureBase(); - - if (!drake) - { - caster->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - caster->RemoveAurasDueToSpell(SPELL_DRAKE_FLAG_VISUAL); - } + caster->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + caster->RemoveAurasDueToSpell(SPELL_DRAKE_FLAG_VISUAL); } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_oculus_drake_flagAuraScript::HandleOnEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_oculus_drake_flagAuraScript(); } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_oculus_drake_flagAuraScript::HandleOnEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_oculus_drake_flagAuraScript(); + } }; void AddSC_oculus() diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp index f94bf59fa..daa8fbd2b 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp @@ -22,7 +22,7 @@ enum BjarngrimSpells SPELL_BERSERKER_AURA = 41107, SPELL_MORTAL_STRIKE = 16856, SPELL_WHIRLWIND = 52027, - + // BATTLE STANCE SPELL_BATTLE_STANCE = 53792, SPELL_BATTLE_AURA = 41106, @@ -124,7 +124,7 @@ public: AddWaypoint(12, 1311.3f, -26.9f, 40.03f, 0); AddWaypoint(13, 1281.2f, -26.8f, 33.5f, 0); AddWaypoint(14, 1262, -26.9f, 33.5f, 0); - + Start(true, false, 0, NULL, false, true); } @@ -139,9 +139,9 @@ public: summons.DespawnAll(); for (uint8 i = 0; i < 2; ++i) - if (Creature* dwarf = me->SummonCreature(NPC_STORMFORGED_LIEUTENANT, me->GetPositionX()+urand(4,12), me->GetPositionY()+urand(4,12), me->GetPositionZ())) + if (Creature* dwarf = me->SummonCreature(NPC_STORMFORGED_LIEUTENANT, me->GetPositionX() + urand(4, 12), me->GetPositionY() + urand(4, 12), me->GetPositionZ())) { - dwarf->GetMotionMaster()->MoveFollow(me, 3, rand_norm()*2*3.14f); + dwarf->GetMotionMaster()->MoveFollow(me, 3, rand_norm() * 2 * 3.14f); summons.Summon(dwarf); } @@ -167,13 +167,13 @@ public: events.ScheduleEvent(EVENT_BJARNGRIM_IRONFORM, 12000, STANCE_DEFENSIVE); // BERSERKER STANCE - events.ScheduleEvent(EVENT_BJARNGRIM_MORTAL_STRIKE, 20000+4000, STANCE_BERSERKER); - events.ScheduleEvent(EVENT_BJARNGRIM_WHIRLWIND, 20000+6000, STANCE_BERSERKER); + events.ScheduleEvent(EVENT_BJARNGRIM_MORTAL_STRIKE, 20000 + 4000, STANCE_BERSERKER); + events.ScheduleEvent(EVENT_BJARNGRIM_WHIRLWIND, 20000 + 6000, STANCE_BERSERKER); // BATTLE STANCE - events.ScheduleEvent(EVENT_BJARNGRIM_INTERCEPT, 20000+3000, STANCE_BATTLE); - events.ScheduleEvent(EVENT_BJARNGRIM_CLEAVE, 20000+5000, STANCE_BATTLE); - events.ScheduleEvent(EVENT_BJARNGRIM_SLAM, 20000+10000, STANCE_BATTLE); + events.ScheduleEvent(EVENT_BJARNGRIM_INTERCEPT, 20000 + 3000, STANCE_BATTLE); + events.ScheduleEvent(EVENT_BJARNGRIM_CLEAVE, 20000 + 5000, STANCE_BATTLE); + events.ScheduleEvent(EVENT_BJARNGRIM_SLAM, 20000 + 10000, STANCE_BATTLE); if (m_pInstance) { @@ -219,14 +219,14 @@ public: void RollStance(uint8 stance, uint8 force = 0) { - if (urand(0,1)) + if (urand(0, 1)) stance = (++stance == 4 ? 1 : stance); else stance = (--stance == 0 ? 3 : stance); if (force) stance = force; - + switch (stance) { case STANCE_DEFENSIVE: @@ -306,19 +306,19 @@ public: /////////////////////////////////////////////////////// case EVENT_BJARNGRIM_REFLECTION: me->CastSpell(me, SPELL_BJARNGRIM_REFLETION, true); - events.RepeatEvent(8000 + rand()%1000); + events.RepeatEvent(8000 + rand() % 1000); break; case EVENT_BJARNGRIM_PUMMEL: me->CastSpell(me->GetVictim(), SPELL_PUMMEL, false); - events.RepeatEvent(10000 + rand()%1000); + events.RepeatEvent(10000 + rand() % 1000); break; case EVENT_BJARNGRIM_KNOCK: me->CastSpell(me, SPELL_KNOCK_AWAY, false); - events.RepeatEvent(20000 + rand()%1000); + events.RepeatEvent(20000 + rand() % 1000); break; case EVENT_BJARNGRIM_IRONFORM: me->CastSpell(me, SPELL_IRONFORM, true); - events.RepeatEvent(18000 + rand()%5000); + events.RepeatEvent(18000 + rand() % 5000); break; /////////////////////////////////////////////////////// @@ -332,7 +332,7 @@ public: me->CastSpell(me, SPELL_WHIRLWIND, true); events.RepeatEvent(25000); break; - + /////////////////////////////////////////////////////// ///// BATTLE STANCE /////////////////////////////////////////////////////// @@ -348,7 +348,7 @@ public: break; case EVENT_BJARNGRIM_SLAM: me->CastSpell(me->GetVictim(), SPELL_SLAM, false); - events.RepeatEvent(10000 + rand()%2000); + events.RepeatEvent(10000 + rand() % 2000); break; } @@ -385,7 +385,7 @@ public: void EnterCombat(Unit*) { events.ScheduleEvent(EVENT_ARC_WELD, 2000); - events.ScheduleEvent(EVENT_RENEW_STEEL, 10000 + rand()%1000); + events.ScheduleEvent(EVENT_RENEW_STEEL, 10000 + rand() % 1000); } void UpdateAI(uint32 diff) @@ -410,7 +410,7 @@ public: if (bjarngrim->IsAlive()) me->CastSpell(bjarngrim, me->GetMap()->IsHeroic() ? SPELL_RENEW_STEEL_H : SPELL_RENEW_STEEL_N, true); - events.RepeatEvent(10000 + rand()%4000); + events.RepeatEvent(10000 + rand() % 4000); break; } diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp index 9dfe3d80f..642f092ec 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp @@ -146,14 +146,14 @@ public: summons.Summon(spark); spark->CastSpell(spark, me->GetMap()->IsHeroic() ? SPELL_SPARK_VISUAL_TRIGGER_H : SPELL_SPARK_VISUAL_TRIGGER_N, true); spark->CastSpell(spark, SPELL_RANDOM_LIGHTNING, true); - spark->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED|UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_NON_ATTACKABLE); + spark->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); spark->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0); if (Player* tgt = SelectTargetFromPlayerList(100)) spark->GetMotionMaster()->MoveFollow(tgt, 0.0f, 0.0f, MOTION_SLOT_CONTROLLED); } } - + me->SetVisible(false); me->SetControlled(true, UNIT_STATE_STUNNED); @@ -176,14 +176,14 @@ public: case EVENT_BALL_LIGHTNING: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) me->CastSpell(target, me->GetMap()->IsHeroic() ? SPELL_BALL_LIGHTNING_H : SPELL_BALL_LIGHTNING_N, false); - - events.RepeatEvent(10000 + rand()%1000); + + events.RepeatEvent(10000 + rand() % 1000); break; case EVENT_STATIC_OVERLOAD: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) me->CastSpell(target, me->GetMap()->IsHeroic() ? SPELL_STATIC_OVERLOAD_H : SPELL_STATIC_OVERLOAD_N, false); - events.RepeatEvent(5000 + rand()%1000); + events.RepeatEvent(5000 + rand() % 1000); break; case EVENT_CHECK_HEALTH: if (HealthBelowPct(HealthCheck)) @@ -192,13 +192,13 @@ public: events.RepeatEvent(1000); return; case EVENT_CALL_SPARKS: - { - EntryCheckPredicate pred(NPC_SPARK_OF_IONAR); - summons.DoAction(ACTION_CALLBACK, pred); - events.PopEvent(); - events.ScheduleEvent(EVENT_RESTORE, 2000, 0, 2); - return; - } + { + EntryCheckPredicate pred(NPC_SPARK_OF_IONAR); + summons.DoAction(ACTION_CALLBACK, pred); + events.PopEvent(); + events.ScheduleEvent(EVENT_RESTORE, 2000, 0, 2); + return; + } case EVENT_RESTORE: EntryCheckPredicate pred(NPC_SPARK_OF_IONAR); summons.DoAction(ACTION_SPARK_DESPAWN, pred); @@ -237,7 +237,7 @@ public: void Reset() { returning = false; } - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) { damage = 0; } diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp index 565e90ba2..9a605e5a3 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp @@ -131,9 +131,15 @@ public: { switch(HealthCheck) { - case 75: Talk(SAY_75HEALTH); break; - case 50: Talk(SAY_50HEALTH); break; - case 25: Talk(SAY_25HEALTH); break; + case 75: + Talk(SAY_75HEALTH); + break; + case 50: + Talk(SAY_50HEALTH); + break; + case 25: + Talk(SAY_25HEALTH); + break; } } else @@ -177,7 +183,7 @@ public: me->SetControlled(false, UNIT_STATE_STUNNED); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - + if (Player* target = SelectTargetFromPlayerList(80)) AttackStart(target); } @@ -238,33 +244,33 @@ public: class spell_loken_pulsing_shockwave : public SpellScriptLoader { - public: - spell_loken_pulsing_shockwave() : SpellScriptLoader("spell_loken_pulsing_shockwave") { } +public: + spell_loken_pulsing_shockwave() : SpellScriptLoader("spell_loken_pulsing_shockwave") { } - class spell_loken_pulsing_shockwave_SpellScript : public SpellScript + class spell_loken_pulsing_shockwave_SpellScript : public SpellScript + { + PrepareSpellScript(spell_loken_pulsing_shockwave_SpellScript); + + void CalculateDamage(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_loken_pulsing_shockwave_SpellScript); + if (!GetHitUnit()) + return; - void CalculateDamage(SpellEffIndex /*effIndex*/) - { - if (!GetHitUnit()) - return; - - float distance = GetCaster()->GetDistance2d(GetHitUnit()); - if (distance > 1.0f) - SetHitDamage(int32(GetHitDamage() * distance)); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_loken_pulsing_shockwave_SpellScript::CalculateDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_loken_pulsing_shockwave_SpellScript(); + float distance = GetCaster()->GetDistance2d(GetHitUnit()); + if (distance > 1.0f) + SetHitDamage(int32(GetHitDamage() * distance)); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_loken_pulsing_shockwave_SpellScript::CalculateDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_loken_pulsing_shockwave_SpellScript(); + } }; void AddSC_boss_loken() diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp index f414b9bc5..736a95649 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp @@ -96,7 +96,7 @@ public: HealthCheck = 100; events.Reset(); summons.DespawnAll(); - me->SetSpeed(MOVE_RUN, 1.2f,true); + me->SetSpeed(MOVE_RUN, 1.2f, true); me->SetReactState(REACT_AGGRESSIVE); if (m_pInstance) @@ -133,7 +133,7 @@ public: { if (me->GetPositionX() > 1330) x = 1355; - else + else x = 1308; y = -178; @@ -143,7 +143,7 @@ public: { if (me->GetPositionX() > 1330) x = 1355; - else + else x = 1308; y = -137; @@ -153,7 +153,7 @@ public: { if (me->GetPositionX() > 1330) x = 1343; - else + else x = 1320; y = -123; @@ -214,7 +214,7 @@ public: if (id == POINT_ANVIL) { - me->SetSpeed(MOVE_RUN, 1.2f,true); + me->SetSpeed(MOVE_RUN, 1.2f, true); me->SetReactState(REACT_AGGRESSIVE); me->CastSpell(me, SPELL_TEMPER, false); PointID = 0; @@ -233,7 +233,7 @@ public: events.ScheduleEvent(EVENT_MOVE_TO_ANVIL, 0, 0, 2); } - void SpellHitTarget(Unit* /*who*/, const SpellInfo *spellInfo) + void SpellHitTarget(Unit* /*who*/, const SpellInfo* spellInfo) { if (spellInfo->Id == SPELL_TEMPER) { @@ -248,7 +248,7 @@ public: { events.SetPhase(2); HealthCheck -= 20; - me->SetSpeed(MOVE_RUN, 4.0f,true); + me->SetSpeed(MOVE_RUN, 4.0f, true); me->SetReactState(REACT_PASSIVE); Talk(SAY_FORGE); @@ -283,11 +283,11 @@ public: events.RepeatEvent(1000); return; case EVENT_SHATTER: - { - events.RepeatEvent(10000); - summons.DoAction(ACTION_SHATTER); - break; - } + { + events.RepeatEvent(10000); + summons.DoAction(ACTION_SHATTER); + break; + } case EVENT_MOVE_TO_ANVIL: GetNextPos(); me->GetMotionMaster()->MovePoint(PointID, x, y, z); @@ -298,10 +298,10 @@ public: EnterEvadeMode(); else events.RepeatEvent(4000); - + return; } - + DoMeleeAttackIfReady(); } }; @@ -334,7 +334,7 @@ public: events.ScheduleEvent(EVENT_IMMOLATION, 3000); } - void DamageTaken(Unit*, uint32 &uiDamage, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit*, uint32& uiDamage, DamageEffectType, SpellSchoolMask) { if (me->GetEntry() == NPC_BRITTLE_GOLEM) { @@ -446,7 +446,7 @@ public: npc_hol_monumentAI(Creature* creature) : ScriptedAI(creature) { _attackGUID = 0; - _isActive = urand(0,1); + _isActive = urand(0, 1); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->CastSpell(me, SPELL_FREEZE_ANIM, true); } @@ -480,15 +480,15 @@ public: events.Reset(); if (me->GetEntry() == 28961) // NPC_TITANIUM_SIEGEBREAKER { - events.ScheduleEvent(EVENT_PIERCING_HOWL, 10000+rand()%15000); - events.ScheduleEvent(EVENT_PENETRATING_STRIKE, 5000+rand()%5000); - events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, 20000+rand()%8000); + events.ScheduleEvent(EVENT_PIERCING_HOWL, 10000 + rand() % 15000); + events.ScheduleEvent(EVENT_PENETRATING_STRIKE, 5000 + rand() % 5000); + events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, 20000 + rand() % 8000); events.ScheduleEvent(EVENT_BLADE_TURNING, 12000); } else { - events.ScheduleEvent(EVENT_THROW, 10000+rand()%15000); - events.ScheduleEvent(EVENT_DEADLY_THROW, 15000+rand()%15000); + events.ScheduleEvent(EVENT_THROW, 10000 + rand() % 15000); + events.ScheduleEvent(EVENT_DEADLY_THROW, 15000 + rand() % 15000); events.ScheduleEvent(EVENT_DEFLECTION, 15000); } } @@ -531,27 +531,27 @@ public: { case EVENT_PIERCING_HOWL: me->CastSpell(me->GetVictim(), SPELL_PIERCING_HOWL, false); - events.RepeatEvent(10000+rand()%1500); + events.RepeatEvent(10000 + rand() % 1500); break; case EVENT_PENETRATING_STRIKE: me->CastSpell(me->GetVictim(), SPELL_PENETRATING_STRIKE, false); - events.RepeatEvent(5000+rand()%5000); + events.RepeatEvent(5000 + rand() % 5000); break; case EVENT_FRIGHTENING_SHOUT: me->CastSpell(me->GetVictim(), SPELL_FRIGHTENING_SHOUT, false); - events.RepeatEvent(20000+rand()%8000); + events.RepeatEvent(20000 + rand() % 8000); break; case EVENT_BLADE_TURNING: me->CastSpell(me->GetVictim(), me->GetMap()->IsHeroic() ? SPELL_BLADE_TURNING_H : SPELL_BLADE_TURNING_N, false); events.RepeatEvent(12000); break; case EVENT_THROW: - me->CastSpell(SelectTarget(SELECT_TARGET_RANDOM,0,50.0f, true,0), me->GetMap()->IsHeroic() ? SPELL_THROW_H : SPELL_THROW_N, true); - events.RepeatEvent(10000+rand()%15000); + me->CastSpell(SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true, 0), me->GetMap()->IsHeroic() ? SPELL_THROW_H : SPELL_THROW_N, true); + events.RepeatEvent(10000 + rand() % 15000); break; case EVENT_DEADLY_THROW: - me->CastSpell(SelectTarget(SELECT_TARGET_RANDOM,0,50.0f, true,0), me->GetMap()->IsHeroic() ? SPELL_DEADLY_THROW_H : SPELL_DEADLY_THROW_N, true); - events.RepeatEvent(15000+rand()%15000); + me->CastSpell(SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true, 0), me->GetMap()->IsHeroic() ? SPELL_DEADLY_THROW_H : SPELL_DEADLY_THROW_N, true); + events.RepeatEvent(15000 + rand() % 15000); break; case EVENT_DEFLECTION: me->CastSpell(me, me->GetMap()->IsHeroic() ? SPELL_DEFLECTION_H : SPELL_DEFLECTION_N, false); diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp index 0571e2e22..e852d5f59 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp @@ -173,8 +173,8 @@ public: OUT_SAVE_INST_DATA; std::ostringstream saveStream; - saveStream << "H L " << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' ' - << m_auiEncounter[2] << ' ' << m_auiEncounter[3] << ' ' << m_auiEncounter[4]; + saveStream << "H L " << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' ' + << m_auiEncounter[2] << ' ' << m_auiEncounter[3] << ' ' << m_auiEncounter[4]; OUT_SAVE_INST_DATA_COMPLETE; return saveStream.str(); diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp index 081b55844..0816ebee9 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp @@ -52,7 +52,7 @@ public: struct boss_krystallusAI : public ScriptedAI { - boss_krystallusAI(Creature *c) : ScriptedAI(c) + boss_krystallusAI(Creature* c) : ScriptedAI(c) { pInstance = me->GetInstanceScript(); } @@ -60,7 +60,7 @@ public: EventMap events; InstanceScript* pInstance; - void Reset() + void Reset() { events.Reset(); if (pInstance) @@ -87,7 +87,7 @@ public: Map* map = me->GetMap(); if (map->IsDungeon()) { - Map::PlayerList const &players = map->GetPlayers(); + Map::PlayerList const& players = map->GetPlayers(); for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) if (itr->GetSource()->IsAlive()) itr->GetSource()->RemoveAura(GROUND_SLAM_STONED_EFFECT); @@ -107,47 +107,47 @@ public: switch (events.GetEvent()) { case EVENT_BOULDER: - { - if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true, 0)) - me->CastSpell(target, DUNGEON_MODE(BOULDER_TOSS, BOULDER_TOSS_H), false); + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true, 0)) + me->CastSpell(target, DUNGEON_MODE(BOULDER_TOSS, BOULDER_TOSS_H), false); - events.RepeatEvent(5000 + rand()%2000); - break; - } + events.RepeatEvent(5000 + rand() % 2000); + break; + } case EVENT_GROUND_SPIKE: - { - me->CastSpell(me->GetVictim(), GROUND_SPIKE_H, false); // current enemy target - events.RepeatEvent(8000 + rand()%3000); - break; - } + { + me->CastSpell(me->GetVictim(), GROUND_SPIKE_H, false); // current enemy target + events.RepeatEvent(8000 + rand() % 3000); + break; + } case EVENT_STOMP: - { - me->CastSpell(me, DUNGEON_MODE(STOMP, STOMP_H), false); - events.RepeatEvent(13000 + rand()% 5000); - break; - } + { + me->CastSpell(me, DUNGEON_MODE(STOMP, STOMP_H), false); + events.RepeatEvent(13000 + rand() % 5000); + break; + } case EVENT_GROUND_SLAM: - { - events.RepeatEvent(10000 + rand()%3000); - me->CastSpell(me->GetVictim(), GROUND_SLAM, true); - events.DelayEvents(10000); - events.RescheduleEvent(EVENT_SHATTER, 8000); - break; - } + { + events.RepeatEvent(10000 + rand() % 3000); + me->CastSpell(me->GetVictim(), GROUND_SLAM, true); + events.DelayEvents(10000); + events.RescheduleEvent(EVENT_SHATTER, 8000); + break; + } case EVENT_SHATTER: - { - me->CastSpell((Unit*)NULL, DUNGEON_MODE(SHATTER, SHATTER_H), false); - Talk(SAY_SHATTER); - events.RescheduleEvent(EVENT_REMOVE_STONED, 1500); - events.PopEvent(); - break; - } + { + me->CastSpell((Unit*)NULL, DUNGEON_MODE(SHATTER, SHATTER_H), false); + Talk(SAY_SHATTER); + events.RescheduleEvent(EVENT_REMOVE_STONED, 1500); + events.PopEvent(); + break; + } case EVENT_REMOVE_STONED: - { - RemoveStonedEffect(); - events.PopEvent(); - break; - } + { + RemoveStonedEffect(); + events.PopEvent(); + break; + } } DoMeleeAttackIfReady(); @@ -160,7 +160,7 @@ public: pInstance->SetData(BOSS_KRYSTALLUS, DONE); } - void KilledUnit(Unit * /*victim*/) + void KilledUnit(Unit* /*victim*/) { Talk(SAY_KILL); } @@ -170,67 +170,67 @@ public: class spell_krystallus_shatter : public SpellScriptLoader { - public: - spell_krystallus_shatter() : SpellScriptLoader("spell_krystallus_shatter") { } +public: + spell_krystallus_shatter() : SpellScriptLoader("spell_krystallus_shatter") { } - class spell_krystallus_shatter_SpellScript : public SpellScript + class spell_krystallus_shatter_SpellScript : public SpellScript + { + PrepareSpellScript(spell_krystallus_shatter_SpellScript); + + void HandleScript(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_krystallus_shatter_SpellScript); - - void HandleScript(SpellEffIndex /*effIndex*/) + if (Unit* target = GetHitUnit()) { - if (Unit* target = GetHitUnit()) - { - target->RemoveAurasDueToSpell(GROUND_SLAM_STONED_EFFECT); - target->CastSpell((Unit*)NULL, SPELL_SHATTER_EFFECT, true); - } + target->RemoveAurasDueToSpell(GROUND_SLAM_STONED_EFFECT); + target->CastSpell((Unit*)NULL, SPELL_SHATTER_EFFECT, true); } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_krystallus_shatter_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_krystallus_shatter_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_krystallus_shatter_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_krystallus_shatter_SpellScript(); + } }; class spell_krystallus_shatter_effect : public SpellScriptLoader { - public: - spell_krystallus_shatter_effect() : SpellScriptLoader("spell_krystallus_shatter_effect") { } +public: + spell_krystallus_shatter_effect() : SpellScriptLoader("spell_krystallus_shatter_effect") { } - class spell_krystallus_shatter_effect_SpellScript : public SpellScript + class spell_krystallus_shatter_effect_SpellScript : public SpellScript + { + PrepareSpellScript(spell_krystallus_shatter_effect_SpellScript); + + void CalculateDamage() { - PrepareSpellScript(spell_krystallus_shatter_effect_SpellScript); + if (!GetHitUnit()) + return; - void CalculateDamage() - { - if (!GetHitUnit()) - return; + float radius = GetSpellInfo()->Effects[EFFECT_0].CalcRadius(GetCaster()); + if (!radius) + return; - float radius = GetSpellInfo()->Effects[EFFECT_0].CalcRadius(GetCaster()); - if (!radius) - return; - - float distance = GetCaster()->GetDistance2d(GetHitUnit()); - if (distance > 1.0f) - SetHitDamage(int32(GetHitDamage() * ((radius - distance) / radius))); - } - - void Register() - { - OnHit += SpellHitFn(spell_krystallus_shatter_effect_SpellScript::CalculateDamage); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_krystallus_shatter_effect_SpellScript(); + float distance = GetCaster()->GetDistance2d(GetHitUnit()); + if (distance > 1.0f) + SetHitDamage(int32(GetHitDamage() * ((radius - distance) / radius))); } + + void Register() + { + OnHit += SpellHitFn(spell_krystallus_shatter_effect_SpellScript::CalculateDamage); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_krystallus_shatter_effect_SpellScript(); + } }; void AddSC_boss_krystallus() 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 69327f1c9..dbe067007 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 @@ -44,15 +44,15 @@ public: struct boss_maiden_of_griefAI : public ScriptedAI { - boss_maiden_of_griefAI(Creature *c) : ScriptedAI(c) - { + boss_maiden_of_griefAI(Creature* c) : ScriptedAI(c) + { pInstance = me->GetInstanceScript(); } InstanceScript* pInstance; EventMap events; - void Reset() + void Reset() { events.Reset(); if (pInstance) @@ -65,8 +65,8 @@ public: void EnterCombat(Unit* /*who*/) { events.ScheduleEvent(EVENT_STORM, 5000); - events.ScheduleEvent(EVENT_SHOCK, 26000+rand()%6000); - events.ScheduleEvent(EVENT_PILLAR, 12000+rand()%8000); + events.ScheduleEvent(EVENT_SHOCK, 26000 + rand() % 6000); + events.ScheduleEvent(EVENT_PILLAR, 12000 + rand() % 8000); events.ScheduleEvent(EVENT_PARTING, 8000); Talk(SAY_AGGRO); @@ -90,35 +90,35 @@ public: switch( events.GetEvent() ) { case EVENT_STORM: - { - me->CastSpell(me->GetVictim(), DUNGEON_MODE(STORM_OF_GRIEF, STORM_OF_GRIEF_H), true); - events.RepeatEvent(10000); - break; - } + { + me->CastSpell(me->GetVictim(), DUNGEON_MODE(STORM_OF_GRIEF, STORM_OF_GRIEF_H), true); + events.RepeatEvent(10000); + break; + } case EVENT_SHOCK: - { - me->CastSpell(me->GetVictim(), DUNGEON_MODE(SHOCK_OF_SORROW, SHOCK_OF_SORROW_H), false); - Talk(SAY_STUN); + { + me->CastSpell(me->GetVictim(), DUNGEON_MODE(SHOCK_OF_SORROW, SHOCK_OF_SORROW_H), false); + Talk(SAY_STUN); - events.RepeatEvent(16000+rand()%6000); - break; - } + events.RepeatEvent(16000 + rand() % 6000); + break; + } case EVENT_PILLAR: - { - if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true, 0)) - me->CastSpell(target, DUNGEON_MODE(PILLAR_OF_WOE, PILLAR_OF_WOE_H), false); - - events.RepeatEvent(12000+rand()%8000); - break; - } + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true, 0)) + me->CastSpell(target, DUNGEON_MODE(PILLAR_OF_WOE, PILLAR_OF_WOE_H), false); + + events.RepeatEvent(12000 + rand() % 8000); + break; + } case EVENT_PARTING: - { - if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true, 0)) - me->CastSpell(target, PARTING_SORROW, false); - - events.RepeatEvent(6000+rand()%10000); - break; - } + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true, 0)) + me->CastSpell(target, PARTING_SORROW, false); + + events.RepeatEvent(6000 + rand() % 10000); + break; + } } DoMeleeAttackIfReady(); @@ -127,14 +127,14 @@ public: void JustDied(Unit* /*killer*/) { Talk(SAY_DEATH); - + if (pInstance) pInstance->SetData(BOSS_MAIDEN_OF_GRIEF, DONE); } - void KilledUnit(Unit * /*victim*/) + void KilledUnit(Unit* /*victim*/) { - if (urand(0,1)) + if (urand(0, 1)) return; Talk(SAY_SLAY); diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp index ae7d301ef..998721326 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp @@ -17,7 +17,7 @@ enum Spells SPELL_LIGHTNING_SHIELD_H = 59845, SPELL_STATIC_CHARGE = 50834, SPELL_STATIC_CHARGE_H = 59846, - SPELL_LIGHTNING_RING = 50840, + SPELL_LIGHTNING_RING = 50840, SPELL_LIGHTNING_RING_H = 59848, // IRON SLUDGE @@ -103,7 +103,7 @@ public: struct boss_sjonnirAI : public ScriptedAI { - boss_sjonnirAI(Creature *c) : ScriptedAI(c), summons(me) + boss_sjonnirAI(Creature* c) : ScriptedAI(c), summons(me) { pInstance = c->GetInstanceScript(); } @@ -115,7 +115,7 @@ public: uint8 SummonPhase; uint8 SlugeCount; - void Reset() + void Reset() { events.Reset(); summons.DespawnAll(); @@ -123,22 +123,22 @@ public: SlugeCount = 0; SummonPhase = PHASE_SUMMON_UNFRIENDLY_DWARFES; - if (pInstance) + if (pInstance) { pInstance->SetData(BOSS_SJONNIR, NOT_STARTED); pInstance->SetData(DATA_SJONNIR_ACHIEVEMENT, false); - + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); if (pInstance->GetData(BOSS_TRIBUNAL_OF_AGES) == DONE) { me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - if (GameObject *doors = me->GetMap()->GetGameObject(pInstance->GetData64(GO_SJONNIR_DOOR))) + if (GameObject* doors = me->GetMap()->GetGameObject(pInstance->GetData64(GO_SJONNIR_DOOR))) doors->SetGoState(GO_STATE_ACTIVE); - if (GameObject *console = me->GetMap()->GetGameObject( pInstance->GetData64(GO_SJONNIR_CONSOLE))) + if (GameObject* console = me->GetMap()->GetGameObject( pInstance->GetData64(GO_SJONNIR_CONSOLE))) console->SetGoState(GO_STATE_READY); - if (Creature *brann = ObjectAccessor::GetCreature(*me, pInstance->GetData64(NPC_BRANN))) + if (Creature* brann = ObjectAccessor::GetCreature(*me, pInstance->GetData64(NPC_BRANN))) { brann->setDeathState(JUST_DIED); brann->Respawn(); @@ -151,12 +151,12 @@ public: void EnterCombat(Unit* /*who*/) { Talk(SAY_AGGRO); - + events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); - events.ScheduleEvent(EVENT_SHIELD, 14000 + rand()%5000); - events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 6000 + rand()%6000); + events.ScheduleEvent(EVENT_SHIELD, 14000 + rand() % 5000); + events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 6000 + rand() % 6000); events.ScheduleEvent(EVENT_STATIC_CHARGE, 24000); - events.ScheduleEvent(EVENT_LIGHTNING_RING, 25000 + rand()%6000); + events.ScheduleEvent(EVENT_LIGHTNING_RING, 25000 + rand() % 6000); events.ScheduleEvent(EVENT_SUMMON, 20000); events.ScheduleEvent(EVENT_SUMMON, 21500); events.ScheduleEvent(EVENT_SUMMON_SPEACH, 20000); @@ -165,11 +165,11 @@ public: { pInstance->SetData(BOSS_SJONNIR, IN_PROGRESS); - if (GameObject *doors = me->GetMap()->GetGameObject(pInstance->GetData64(GO_SJONNIR_DOOR))) + if (GameObject* doors = me->GetMap()->GetGameObject(pInstance->GetData64(GO_SJONNIR_DOOR))) doors->SetGoState(GO_STATE_READY); - + if (pInstance->GetData(BOSS_TRIBUNAL_OF_AGES) == DONE) - if (Creature *brann = ObjectAccessor::GetCreature(*me, pInstance->GetData64(NPC_BRANN))) + if (Creature* brann = ObjectAccessor::GetCreature(*me, pInstance->GetData64(NPC_BRANN))) brann->AI()->DoAction(3); } } @@ -196,116 +196,116 @@ public: switch (events.GetEvent()) { case EVENT_CHECK_HEALTH: - { - if (SummonPhase == PHASE_SUMMON_UNFRIENDLY_DWARFES && HealthBelowPct(50)) { - SummonPhase = PHASE_SUMMON_OOZE; - events.CancelEvent(EVENT_SUMMON); - events.ScheduleEvent(EVENT_SUMMON, 0); - events.ScheduleEvent(EVENT_SUMMON, 1500); - - if (pInstance) - if (Creature *brann = ObjectAccessor::GetCreature(*me, pInstance->GetData64(NPC_BRANN))) - { - brann->MonsterYell("What in the name o' Madoran did THAT do? Oh! Wait: I just about got it...", LANG_UNIVERSAL, 0); - brann->PlayDirectSound(14276); - } - } - - if (HealthBelowPct(20)) - { - if (Creature *brann = ObjectAccessor::GetCreature(*me, pInstance->GetData64(NPC_BRANN))) + if (SummonPhase == PHASE_SUMMON_UNFRIENDLY_DWARFES && HealthBelowPct(50)) { - brann->MonsterYell("Ha, that did it! Help's a-comin'! Take this, ya glowin' iron brute!", LANG_UNIVERSAL, 0); - brann->PlayDirectSound(14277); - } - SummonPhase = PHASE_SUMMON_FRIENDLY_DWARFES; - me->CastSpell(me, SPELL_FRENZY, false); + SummonPhase = PHASE_SUMMON_OOZE; + events.CancelEvent(EVENT_SUMMON); + events.ScheduleEvent(EVENT_SUMMON, 0); + events.ScheduleEvent(EVENT_SUMMON, 1500); - events.CancelEvent(EVENT_SUMMON); - events.ScheduleEvent(EVENT_SUMMON, 0); - events.PopEvent(); - break; - } - - events.RepeatEvent(1000); - break; - } - case EVENT_SHIELD: - { - me->CastSpell(me, DUNGEON_MODE(SPELL_LIGHTNING_SHIELD, SPELL_LIGHTNING_SHIELD_H), false); - events.RepeatEvent(14000 + rand()%5000); - break; - } - case EVENT_CHAIN_LIGHTNING: - { - if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true, 0)) - me->CastSpell(target, DUNGEON_MODE(SPELL_CHAIN_LIGHTNING, SPELL_CHAIN_LIGHTNING_H), false); - - events.RepeatEvent(6000 + rand()%6000); - break; - } - case EVENT_STATIC_CHARGE: - { - if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true, 0)) - me->CastSpell(target, DUNGEON_MODE(SPELL_STATIC_CHARGE, SPELL_STATIC_CHARGE_H), false); - - events.RepeatEvent(20000); - break; - } - case EVENT_LIGHTNING_RING: - { - me->CastSpell(me, DUNGEON_MODE(SPELL_LIGHTNING_RING, SPELL_LIGHTNING_RING_H), false); - events.RepeatEvent(25000 + rand()%6000); - events.DelayEvents(10000); // Channel duration - break; - } - case EVENT_SUMMON_SPEACH: - { - if (Creature *brann = ObjectAccessor::GetCreature(*me, pInstance->GetData64(NPC_BRANN))) - { - brann->MonsterYell("This is a wee bit trickier that before... Oh, bloody--incomin'!", LANG_UNIVERSAL, 0); - brann->PlayDirectSound(14275); - } - - events.PopEvent(); - break; - } - case EVENT_SUMMON: - { - switch (SummonPhase) - { - case PHASE_SUMMON_UNFRIENDLY_DWARFES: - { - SummonDwarfes(false); - events.RepeatEvent(20000); - break; - } - case PHASE_SUMMON_OOZE: - { - for (uint8 i = POS_GEN_RIGHT; i <= POS_GEN_LEFT; i++) - { - if (Creature* ooze = me->SummonCreature(NPC_OOZE, RoomPosition[i].GetPositionX(), RoomPosition[i].GetPositionY(), RoomPosition[i].GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000)) + if (pInstance) + if (Creature* brann = ObjectAccessor::GetCreature(*me, pInstance->GetData64(NPC_BRANN))) { - ActivatePipe(i); - ooze->GetMotionMaster()->MovePoint(0, RoomPosition[POS_ROOM_CENTER].GetPositionX(), RoomPosition[POS_ROOM_CENTER].GetPositionY(), RoomPosition[POS_ROOM_CENTER].GetPositionZ()); - summons.Summon(ooze); + brann->MonsterYell("What in the name o' Madoran did THAT do? Oh! Wait: I just about got it...", LANG_UNIVERSAL, 0); + brann->PlayDirectSound(14276); } - } - events.RepeatEvent(10000); - break; } - case PHASE_SUMMON_FRIENDLY_DWARFES: + + if (HealthBelowPct(20)) { - SummonDwarfes(true); + if (Creature* brann = ObjectAccessor::GetCreature(*me, pInstance->GetData64(NPC_BRANN))) + { + brann->MonsterYell("Ha, that did it! Help's a-comin'! Take this, ya glowin' iron brute!", LANG_UNIVERSAL, 0); + brann->PlayDirectSound(14277); + } + SummonPhase = PHASE_SUMMON_FRIENDLY_DWARFES; + me->CastSpell(me, SPELL_FRENZY, false); + + events.CancelEvent(EVENT_SUMMON); + events.ScheduleEvent(EVENT_SUMMON, 0); events.PopEvent(); break; } + + events.RepeatEvent(1000); + break; + } + case EVENT_SHIELD: + { + me->CastSpell(me, DUNGEON_MODE(SPELL_LIGHTNING_SHIELD, SPELL_LIGHTNING_SHIELD_H), false); + events.RepeatEvent(14000 + rand() % 5000); + break; + } + case EVENT_CHAIN_LIGHTNING: + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true, 0)) + me->CastSpell(target, DUNGEON_MODE(SPELL_CHAIN_LIGHTNING, SPELL_CHAIN_LIGHTNING_H), false); + + events.RepeatEvent(6000 + rand() % 6000); + break; + } + case EVENT_STATIC_CHARGE: + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true, 0)) + me->CastSpell(target, DUNGEON_MODE(SPELL_STATIC_CHARGE, SPELL_STATIC_CHARGE_H), false); + + events.RepeatEvent(20000); + break; + } + case EVENT_LIGHTNING_RING: + { + me->CastSpell(me, DUNGEON_MODE(SPELL_LIGHTNING_RING, SPELL_LIGHTNING_RING_H), false); + events.RepeatEvent(25000 + rand() % 6000); + events.DelayEvents(10000); // Channel duration + break; + } + case EVENT_SUMMON_SPEACH: + { + if (Creature* brann = ObjectAccessor::GetCreature(*me, pInstance->GetData64(NPC_BRANN))) + { + brann->MonsterYell("This is a wee bit trickier that before... Oh, bloody--incomin'!", LANG_UNIVERSAL, 0); + brann->PlayDirectSound(14275); + } + + events.PopEvent(); + break; + } + case EVENT_SUMMON: + { + switch (SummonPhase) + { + case PHASE_SUMMON_UNFRIENDLY_DWARFES: + { + SummonDwarfes(false); + events.RepeatEvent(20000); + break; + } + case PHASE_SUMMON_OOZE: + { + for (uint8 i = POS_GEN_RIGHT; i <= POS_GEN_LEFT; i++) + { + if (Creature* ooze = me->SummonCreature(NPC_OOZE, RoomPosition[i].GetPositionX(), RoomPosition[i].GetPositionY(), RoomPosition[i].GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000)) + { + ActivatePipe(i); + ooze->GetMotionMaster()->MovePoint(0, RoomPosition[POS_ROOM_CENTER].GetPositionX(), RoomPosition[POS_ROOM_CENTER].GetPositionY(), RoomPosition[POS_ROOM_CENTER].GetPositionZ()); + summons.Summon(ooze); + } + } + events.RepeatEvent(10000); + break; + } + case PHASE_SUMMON_FRIENDLY_DWARFES: + { + SummonDwarfes(true); + events.PopEvent(); + break; + } + } + break; } - break; - } } - + DoMeleeAttackIfReady(); } @@ -317,17 +317,17 @@ public: if (pInstance) { pInstance->SetData(BOSS_SJONNIR, DONE); - if (GameObject *sd = me->GetMap()->GetGameObject(pInstance->GetData64(GO_SJONNIR_DOOR))) + if (GameObject* sd = me->GetMap()->GetGameObject(pInstance->GetData64(GO_SJONNIR_DOOR))) sd->SetGoState(GO_STATE_ACTIVE); - if (Creature *brann = ObjectAccessor::GetCreature(*me, pInstance->GetData64(NPC_BRANN))) + if (Creature* brann = ObjectAccessor::GetCreature(*me, pInstance->GetData64(NPC_BRANN))) brann->AI()->DoAction(4); } } - void KilledUnit(Unit * /*victim*/) + void KilledUnit(Unit* /*victim*/) { - if (urand(0,1)) + if (urand(0, 1)) return; Talk(SAY_SLAY); @@ -336,7 +336,7 @@ public: void ActivatePipe(uint8 side) { if (pInstance) - if (GameObject *pipe = me->GetMap()->GetGameObject(pInstance->GetData64(side == POS_GEN_RIGHT ? GO_RIGHT_PIPE : GO_LEFT_PIPE))) + if (GameObject* pipe = me->GetMap()->GetGameObject(pInstance->GetData64(side == POS_GEN_RIGHT ? GO_RIGHT_PIPE : GO_LEFT_PIPE))) pipe->SendCustomAnim(0); } @@ -347,9 +347,9 @@ public: for (int i = 0; i < 3; i++) { uint8 Pos = urand(POS_GEN_RIGHT, POS_GEN_LEFT); - if (Creature* dwarf = me->SummonCreature(NPC_DWARFES_FRIENDLY, RoomPosition[Pos].GetPositionX(), RoomPosition[Pos].GetPositionY() , RoomPosition[Pos].GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000)) + if (Creature* dwarf = me->SummonCreature(NPC_DWARFES_FRIENDLY, RoomPosition[Pos].GetPositionX(), RoomPosition[Pos].GetPositionY(), RoomPosition[Pos].GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000)) { - if (Player *plr = SelectTargetFromPlayerList(100.0f)) + if (Player* plr = SelectTargetFromPlayerList(100.0f)) dwarf->setFaction(plr->getFaction()); ActivatePipe(Pos); @@ -363,7 +363,7 @@ public: for (int i = 0; i < 2; i++) { uint8 Pos = urand(POS_GEN_RIGHT, POS_GEN_LEFT); - if (Creature* dwarf = me->SummonCreature(urand(0,1) ? NPC_FORGED_IRON_TROGG : NPC_FORGED_IRON_DWARF, RoomPosition[Pos].GetPositionX(), RoomPosition[Pos].GetPositionY() , RoomPosition[Pos].GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000)) + if (Creature* dwarf = me->SummonCreature(urand(0, 1) ? NPC_FORGED_IRON_TROGG : NPC_FORGED_IRON_DWARF, RoomPosition[Pos].GetPositionX(), RoomPosition[Pos].GetPositionY(), RoomPosition[Pos].GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000)) { ActivatePipe(Pos); dwarf->SetInCombatWithZone(); @@ -387,12 +387,12 @@ public: struct boss_sjonnir_dwarfAI : public ScriptedAI { - boss_sjonnir_dwarfAI(Creature *c) : ScriptedAI(c) { } + boss_sjonnir_dwarfAI(Creature* c) : ScriptedAI(c) { } void UpdateAI(uint32 /*diff*/) { if (!UpdateVictim()) - return; + return; DoSpellAttackIfReady((me->GetEntry() == NPC_FORGED_IRON_DWARF) ? DUNGEON_MODE(SPELL_LIGHTNING_TETHER, SPELL_LIGHTNING_TETHER_H) : DUNGEON_MODE(SPELL_LIGHTNING_SHOCK, SPELL_LIGHTNING_SHOCK_H)); } @@ -411,28 +411,28 @@ public: struct boss_sjonnir_iron_sludgeAI : public ScriptedAI { - boss_sjonnir_iron_sludgeAI(Creature *c) : ScriptedAI(c) { } - + boss_sjonnir_iron_sludgeAI(Creature* c) : ScriptedAI(c) { } + EventMap events; - void Reset() + void Reset() { events.Reset(); } - void EnterCombat(Unit *) + void EnterCombat(Unit*) { events.ScheduleEvent(EVENT_TOXIC_VOLLEY, 5000); } void JustDied(Unit* /*killer*/) { - if (InstanceScript *pInstance = me->GetInstanceScript()) - if (Creature *sjonnir = ObjectAccessor::GetCreature(*me, pInstance->GetData64(NPC_SJONNIR))) + if (InstanceScript* pInstance = me->GetInstanceScript()) + if (Creature* sjonnir = ObjectAccessor::GetCreature(*me, pInstance->GetData64(NPC_SJONNIR))) sjonnir->AI()->DoAction(ACTION_SLUG_KILLED); } void UpdateAI(uint32 diff) { if (!UpdateVictim()) - return; + return; events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) @@ -442,11 +442,11 @@ public: { // Every 5 seconds case EVENT_TOXIC_VOLLEY: - { - me->CastSpell(me, DUNGEON_MODE(SPELL_TOXIC_VOLLEY, SPELL_TOXIC_VOLLEY_H), false); - events.RepeatEvent(5000); - break; - } + { + me->CastSpell(me, DUNGEON_MODE(SPELL_TOXIC_VOLLEY, SPELL_TOXIC_VOLLEY_H), false); + events.RepeatEvent(5000); + break; + } } DoMeleeAttackIfReady(); @@ -467,7 +467,7 @@ public: struct boss_sjonnir_malformed_oozeAI : public ScriptedAI { - boss_sjonnir_malformed_oozeAI(Creature *c) : ScriptedAI(c) { } + boss_sjonnir_malformed_oozeAI(Creature* c) : ScriptedAI(c) { } EventMap events; void MovementInform(uint32 type, uint32 point) @@ -476,8 +476,8 @@ public: events.RescheduleEvent(EVENT_MALFORMED_OOZE_CHECK, 1000); } - void EnterCombat(Unit *) { } - void MoveInLineOfSight(Unit *) { } + void EnterCombat(Unit*) { } + void MoveInLineOfSight(Unit*) { } void UpdateAI(uint32 diff) { @@ -485,22 +485,22 @@ public: switch (events.GetEvent()) { case EVENT_MALFORMED_OOZE_CHECK: - { - std::list oozeList; - me->GetCreaturesWithEntryInRange(oozeList, 5.0f, NPC_OOZE); - for (std::list::const_iterator itr = oozeList.begin(); itr != oozeList.end(); ++itr) - if ((*itr)->GetGUID() != me->GetGUID() && (*itr)->IsAlive() && me->IsAlive()) - if (Creature* is = me->SummonCreature(NPC_IRON_SLUDGE, me->GetPositionX(), me->GetPositionY() , me->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 20000)) - { - Unit::Kill(me, me); - Unit::Kill(*itr, *itr); - is->SetInCombatWithZone(); - break; - } + { + std::list oozeList; + me->GetCreaturesWithEntryInRange(oozeList, 5.0f, NPC_OOZE); + for (std::list::const_iterator itr = oozeList.begin(); itr != oozeList.end(); ++itr) + if ((*itr)->GetGUID() != me->GetGUID() && (*itr)->IsAlive() && me->IsAlive()) + if (Creature* is = me->SummonCreature(NPC_IRON_SLUDGE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 20000)) + { + Unit::Kill(me, me); + Unit::Kill(*itr, *itr); + is->SetInCombatWithZone(); + break; + } - events.RepeatEvent(1000); - break; - } + events.RepeatEvent(1000); + break; + } } } }; diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/brann_bronzebeard.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/brann_bronzebeard.cpp index 2acbba7c4..5ab83b892 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/brann_bronzebeard.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/brann_bronzebeard.cpp @@ -101,7 +101,7 @@ struct Yells uint32 creature, timer; }; -static Yells Conversation[]= +static Yells Conversation[] = { {14259, "Time to get some answers! Let's get this show on the road!", NPC_BRANN, 0}, {14247, "Take a moment and relish this with me. Soon... all will be revealed. Okay then, let's do this!", NPC_BRANN, 5000}, @@ -161,22 +161,23 @@ public: uint32 brann = pInstance->GetData(BRANN_BRONZEBEARD); switch (brann) { - case 1: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - break; - case 2: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - break; - case 3: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3); - break; - case 4: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4); - break; - case 5: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); - break; - default: break; + case 1: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + break; + case 2: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + break; + case 3: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + break; + case 4: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); + break; + case 5: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); + break; + default: + break; } } @@ -184,32 +185,32 @@ public: return true; } - bool OnGossipSelect(Player *player, Creature *creature, uint32 /*sender*/, uint32 action) override + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override { if (action) { switch (action) { - case GOSSIP_ACTION_INFO_DEF+1: - creature->AI()->DoAction(ACTION_START_EVENT); - CloseGossipMenuFor(player); - break; - case GOSSIP_ACTION_INFO_DEF+2: - creature->AI()->DoAction(ACTION_START_TRIBUNAL); - CloseGossipMenuFor(player); - break; - case GOSSIP_ACTION_INFO_DEF+3: - creature->AI()->DoAction(ACTION_GO_TO_SJONNIR); - CloseGossipMenuFor(player); - break; - case GOSSIP_ACTION_INFO_DEF+4: - creature->AI()->DoAction(ACTION_WIPE_START); - CloseGossipMenuFor(player); - break; - case GOSSIP_ACTION_INFO_DEF+5: - creature->AI()->DoAction(ACTION_OPEN_DOOR); - CloseGossipMenuFor(player); - break; + case GOSSIP_ACTION_INFO_DEF+1: + creature->AI()->DoAction(ACTION_START_EVENT); + CloseGossipMenuFor(player); + break; + case GOSSIP_ACTION_INFO_DEF+2: + creature->AI()->DoAction(ACTION_START_TRIBUNAL); + CloseGossipMenuFor(player); + break; + case GOSSIP_ACTION_INFO_DEF+3: + creature->AI()->DoAction(ACTION_GO_TO_SJONNIR); + CloseGossipMenuFor(player); + break; + case GOSSIP_ACTION_INFO_DEF+4: + creature->AI()->DoAction(ACTION_WIPE_START); + CloseGossipMenuFor(player); + break; + case GOSSIP_ACTION_INFO_DEF+5: + creature->AI()->DoAction(ACTION_OPEN_DOOR); + CloseGossipMenuFor(player); + break; } } return true; @@ -223,7 +224,7 @@ public: struct brann_bronzebeardAI : public npc_escortAI { - brann_bronzebeardAI(Creature *c) : npc_escortAI(c), summons(me) + brann_bronzebeardAI(Creature* c) : npc_escortAI(c), summons(me) { AbedneumGUID = MarnakGUID = KaddrakGUID = 0; pInstance = c->GetInstanceScript(); @@ -242,7 +243,7 @@ public: void DespawnHeads() { - Creature *cr; + Creature* cr; if ((cr = GetAbedneum())) cr->DespawnOrUnsummon(); if ((cr = GetMarnak())) cr->DespawnOrUnsummon(); if ((cr = GetKaddrak())) cr->DespawnOrUnsummon(); @@ -254,7 +255,7 @@ public: if (!pInstance) return; - GameObject *go = nullptr; + GameObject* go = nullptr; if (headMask & 0x1) // Kaddrak if ((go = me->GetMap()->GetGameObject(pInstance->GetData64(GO_KADDRAK)))) activate ? go->SendCustomAnim(0) : go->SetGoState(GO_STATE_READY); @@ -270,7 +271,7 @@ public: void ResetEvent() { - if (GameObject *tribunal = ObjectAccessor::GetGameObject(*me, pInstance->GetData64(GO_TRIBUNAL_CONSOLE))) + if (GameObject* tribunal = ObjectAccessor::GetGameObject(*me, pInstance->GetData64(GO_TRIBUNAL_CONSOLE))) tribunal->SetGoState(GO_STATE_READY); events.Reset(); @@ -291,7 +292,7 @@ public: Creature* GetKaddrak() { return ObjectAccessor::GetCreature(*me, KaddrakGUID); } void MoveInLineOfSight(Unit* /*pWho*/) override { } - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask) override + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override { if (damage && pInstance) pInstance->SetData(DATA_BRANN_ACHIEVEMENT, false); @@ -326,8 +327,8 @@ public: Start(false, true, 0, 0, true, false); break; case ACTION_START_TRIBUNAL: - { - Map::PlayerList const &PlayerList = me->GetMap()->GetPlayers(); + { + Map::PlayerList const& PlayerList = me->GetMap()->GetPlayers(); if (!PlayerList.isEmpty()) for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) { @@ -335,11 +336,11 @@ public: break; } - SetEscortPaused(false); - InitializeEvent(); - me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); - break; - } + SetEscortPaused(false); + InitializeEvent(); + me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); + break; + } case ACTION_GO_TO_SJONNIR: SetEscortPaused(false); ResetEvent(); @@ -370,7 +371,7 @@ public: me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); break; case ACTION_OPEN_DOOR: - if (GameObject *door = ObjectAccessor::GetGameObject(*me, pInstance->GetData64(GO_SJONNIR_DOOR))) + if (GameObject* door = ObjectAccessor::GetGameObject(*me, pInstance->GetData64(GO_SJONNIR_DOOR))) door->SetGoState(GO_STATE_ACTIVE); SetEscortPaused(false); me->RemoveAura(58506); @@ -392,152 +393,152 @@ public: switch (events.GetEvent()) { case EVENT_KADDRAK_VISUAL: - { - SwitchHeadVisaul(0x1, true); - events.PopEvent(); - break; - } + { + SwitchHeadVisaul(0x1, true); + events.PopEvent(); + break; + } case EVENT_MARNAK_VISUAL: - { - SwitchHeadVisaul(0x2, true); - events.PopEvent(); - break; - } + { + SwitchHeadVisaul(0x2, true); + events.PopEvent(); + break; + } case EVENT_ABEDNEUM_VISUAL: - { - SwitchHeadVisaul(0x4, true); - events.PopEvent(); - break; - } + { + SwitchHeadVisaul(0x4, true); + events.PopEvent(); + break; + } case EVENT_KADDRAK_HEAD: // First - { - if (Creature *kaddrak = GetKaddrak()) { - if (Player *plr = SelectTargetFromPlayerList(100.0f)) - kaddrak->CastSpell(plr, DUNGEON_MODE(SPELL_GLARE_OF_THE_TRIBUNAL, SPELL_GLARE_OF_THE_TRIBUNAL_H), true); - } - - events.RescheduleEvent(EVENT_KADDRAK_SWITCH_EYE, 1500); - events.RepeatEvent(2000+urand(0,2000)); - break; - } - case EVENT_KADDRAK_SWITCH_EYE: - { - if (Creature *kaddrak = GetKaddrak()) - { - if (urand(0,1)) - kaddrak->UpdatePosition(927.9f, 330.9f, 219.4f, 2.4f, true); - else - kaddrak->UpdatePosition(923.7f, 326.9f, 219.5f, 2.1f, true); - - kaddrak->StopMovingOnCurrentPos(); - } - - events.PopEvent(); - break; - } - case EVENT_MARNAK_HEAD: // Second - { - if (Creature *marnak = GetMarnak()) - { - if (Creature *cr = me->SummonCreature(NPC_DARK_MATTER_TRIGGER, marnak->GetPositionX(), marnak->GetPositionY(), marnak->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 7000)) + if (Creature* kaddrak = GetKaddrak()) { - cr->CastSpell(cr, SPELL_DARK_MATTER_VISUAL, true); - if (Player *plr = SelectTargetFromPlayerList(100.0f)) + if (Player* plr = SelectTargetFromPlayerList(100.0f)) + kaddrak->CastSpell(plr, DUNGEON_MODE(SPELL_GLARE_OF_THE_TRIBUNAL, SPELL_GLARE_OF_THE_TRIBUNAL_H), true); + } + + events.RescheduleEvent(EVENT_KADDRAK_SWITCH_EYE, 1500); + events.RepeatEvent(2000 + urand(0, 2000)); + break; + } + case EVENT_KADDRAK_SWITCH_EYE: + { + if (Creature* kaddrak = GetKaddrak()) + { + if (urand(0, 1)) + kaddrak->UpdatePosition(927.9f, 330.9f, 219.4f, 2.4f, true); + else + kaddrak->UpdatePosition(923.7f, 326.9f, 219.5f, 2.1f, true); + + kaddrak->StopMovingOnCurrentPos(); + } + + events.PopEvent(); + break; + } + case EVENT_MARNAK_HEAD: // Second + { + if (Creature* marnak = GetMarnak()) + { + if (Creature* cr = me->SummonCreature(NPC_DARK_MATTER_TRIGGER, marnak->GetPositionX(), marnak->GetPositionY(), marnak->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 7000)) { - float speed = me->GetDistance(plr->GetPositionX(), plr->GetPositionY(), plr->GetPositionZ()) / (4000.0f * 0.001f); - cr->MonsterMoveWithSpeed(plr->GetPositionX(), plr->GetPositionY(), plr->GetPositionZ(), speed); + cr->CastSpell(cr, SPELL_DARK_MATTER_VISUAL, true); + if (Player* plr = SelectTargetFromPlayerList(100.0f)) + { + float speed = me->GetDistance(plr->GetPositionX(), plr->GetPositionY(), plr->GetPositionZ()) / (4000.0f * 0.001f); + cr->MonsterMoveWithSpeed(plr->GetPositionX(), plr->GetPositionY(), plr->GetPositionZ(), speed); + } } } + events.RepeatEvent(20000); + break; } - events.RepeatEvent(20000); - break; - } case EVENT_ABEDNEUM_HEAD: // Third - { - if (GetAbedneum()) { - Player *plr = SelectTargetFromPlayerList(100.0f); - if (!plr) - break; - - if (Creature *cr = me->SummonCreature(NPC_SEARING_GAZE_TRIGGER, plr->GetPositionX(), plr->GetPositionY(), plr->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 10000)) + if (GetAbedneum()) { - // summon another abedneum to create double beam, despawn just after trigger despawn - me->SummonCreature(NPC_ABEDNEUM, 897.0f, 326.9f, 223.5f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 12000); - cr->CastSpell(cr, DUNGEON_MODE(SPELL_SEARING_GAZE, SPELL_SEARING_GAZE_H), true); + Player* plr = SelectTargetFromPlayerList(100.0f); + if (!plr) + break; + + if (Creature* cr = me->SummonCreature(NPC_SEARING_GAZE_TRIGGER, plr->GetPositionX(), plr->GetPositionY(), plr->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 10000)) + { + // summon another abedneum to create double beam, despawn just after trigger despawn + me->SummonCreature(NPC_ABEDNEUM, 897.0f, 326.9f, 223.5f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 12000); + cr->CastSpell(cr, DUNGEON_MODE(SPELL_SEARING_GAZE, SPELL_SEARING_GAZE_H), true); + } } + events.RepeatEvent(30000); + break; } - events.RepeatEvent(30000); - break; - } case EVENT_SUMMON_MONSTERS: - { - uint32 Time = 45000 - (2500*WaveNum); - SummonCreatures(NPC_DARK_RUNE_PROTECTOR, 3); - if (WaveNum > 2) - SummonCreatures(NPC_DARK_RUNE_STORMCALLER, 2); - if (WaveNum > 5) - SummonCreatures(NPC_IRON_GOLEM_CUSTODIAN, 1); - - WaveNum++; - events.RepeatEvent(Time); - break; - } - case EVENT_TRIBUNAL_END: - { - // Has to be here! - events.Reset(); - //DespawnHeads(); - summons.DespawnAll(); - - if (pInstance) { - pInstance->SetData(BOSS_TRIBUNAL_OF_AGES, DONE); - pInstance->SetData(BRANN_BRONZEBEARD, 3); - me->CastSpell(me, 59046, true); // credit + uint32 Time = 45000 - (2500 * WaveNum); + SummonCreatures(NPC_DARK_RUNE_PROTECTOR, 3); + if (WaveNum > 2) + SummonCreatures(NPC_DARK_RUNE_STORMCALLER, 2); + if (WaveNum > 5) + SummonCreatures(NPC_IRON_GOLEM_CUSTODIAN, 1); + + WaveNum++; + events.RepeatEvent(Time); + break; } - - me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); - - - // Spawn Chest and quest credit - if (Player *plr = SelectTargetFromPlayerList(200.0f)) + case EVENT_TRIBUNAL_END: { - if (GameObject* go = plr->SummonGameObject((IsHeroic() ? GO_TRIBUNAL_CHEST_H : GO_TRIBUNAL_CHEST), 880.406f, 345.164f, 203.706f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0)) + // Has to be here! + events.Reset(); + //DespawnHeads(); + summons.DespawnAll(); + + if (pInstance) { - plr->RemoveGameObject(go, false); - go->SetLootMode(1); - go->SetUInt32Value(GAMEOBJECT_FLAGS, 0); + pInstance->SetData(BOSS_TRIBUNAL_OF_AGES, DONE); + pInstance->SetData(BRANN_BRONZEBEARD, 3); + me->CastSpell(me, 59046, true); // credit } - plr->GroupEventHappens(QUEST_HALLS_OF_STONE, me); + me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); + + + // Spawn Chest and quest credit + if (Player* plr = SelectTargetFromPlayerList(200.0f)) + { + if (GameObject* go = plr->SummonGameObject((IsHeroic() ? GO_TRIBUNAL_CHEST_H : GO_TRIBUNAL_CHEST), 880.406f, 345.164f, 203.706f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0)) + { + plr->RemoveGameObject(go, false); + go->SetLootMode(1); + go->SetUInt32Value(GAMEOBJECT_FLAGS, 0); + } + + plr->GroupEventHappens(QUEST_HALLS_OF_STONE, me); + } + + events.ScheduleEvent(EVENT_GO_TO_SJONNIR, 279000); + break; } - - events.ScheduleEvent(EVENT_GO_TO_SJONNIR, 279000); - break; - } case EVENT_GO_TO_SJONNIR: - { + { - if (GameObject *door = ObjectAccessor::GetGameObject(*me, pInstance->GetData64(GO_SJONNIR_DOOR))) - door->SetGoState(GO_STATE_ACTIVE); - SetEscortPaused(false); - ResetEvent(); - me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); - break; - } + if (GameObject* door = ObjectAccessor::GetGameObject(*me, pInstance->GetData64(GO_SJONNIR_DOOR))) + door->SetGoState(GO_STATE_ACTIVE); + SetEscortPaused(false); + ResetEvent(); + me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); + break; + } case EVENT_END: - { - events.Reset(); - if (pInstance) - pInstance->SetData(BRANN_BRONZEBEARD, 6); + { + events.Reset(); + if (pInstance) + pInstance->SetData(BRANN_BRONZEBEARD, 6); - me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); - me->MonsterYell("I'll use the forge to make batches o' earthen to stand guard... But our greatest challenge still remains: find and stop Loken!", LANG_UNIVERSAL, 0); - me->PlayDirectSound(14279); - break; - } + me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); + me->MonsterYell("I'll use the forge to make batches o' earthen to stand guard... But our greatest challenge still remains: find and stop Loken!", LANG_UNIVERSAL, 0); + me->PlayDirectSound(14279); + break; + } } if (TalkEvent) @@ -548,10 +549,18 @@ public: Creature* cs = nullptr; switch (Conversation[SpeechCount].creature) { - case NPC_BRANN: cs = me; break; - case NPC_ABEDNEUM: cs = GetAbedneum(); break; - case NPC_KADDRAK: cs = GetKaddrak(); break; - case NPC_MARNAK: cs = GetMarnak(); break; + case NPC_BRANN: + cs = me; + break; + case NPC_ABEDNEUM: + cs = GetAbedneum(); + break; + case NPC_KADDRAK: + cs = GetKaddrak(); + break; + case NPC_MARNAK: + cs = GetMarnak(); + break; } if (cs) @@ -567,12 +576,12 @@ public: } } } - + void SummonCreatures(uint32 entry, uint8 count) { for (int i = 0; i < count; ++i) { - Creature* cr = me->SummonCreature(entry, 946.5971f+urand(0,6), 383.5330f+urand(0,6), 205.9943f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN,20000); + Creature* cr = me->SummonCreature(entry, 946.5971f + urand(0, 6), 383.5330f + urand(0, 6), 205.9943f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000); if(cr) { cr->AI()->AttackStart(me); @@ -587,7 +596,7 @@ public: ResetEvent(); if(pInstance) { - if (Creature *brann = ObjectAccessor::GetCreature(*me, pInstance->GetData64(NPC_BRANN))) + if (Creature* brann = ObjectAccessor::GetCreature(*me, pInstance->GetData64(NPC_BRANN))) { brann->setDeathState(JUST_DIED); brann->Respawn(); @@ -652,7 +661,7 @@ void brann_bronzebeard::brann_bronzebeardAI::WaypointReached(uint32 id) if(pInstance) { pInstance->SetData(BOSS_TRIBUNAL_OF_AGES, IN_PROGRESS); - if (GameObject *tribunal = ObjectAccessor::GetGameObject(*me, pInstance->GetData64(GO_TRIBUNAL_CONSOLE))) + if (GameObject* tribunal = ObjectAccessor::GetGameObject(*me, pInstance->GetData64(GO_TRIBUNAL_CONSOLE))) tribunal->SetGoState(GO_STATE_ACTIVE); } break; @@ -663,7 +672,7 @@ void brann_bronzebeard::brann_bronzebeardAI::WaypointReached(uint32 id) { pInstance->SetData(BRANN_BRONZEBEARD, 5); me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); - if (Creature *cr = ObjectAccessor::GetCreature(*me, pInstance->GetData64(NPC_SJONNIR))) + if (Creature* cr = ObjectAccessor::GetCreature(*me, pInstance->GetData64(NPC_SJONNIR))) cr->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetOrientation(3.132660f); DoCast(me, 58506, false); @@ -676,7 +685,7 @@ void brann_bronzebeard::brann_bronzebeardAI::WaypointReached(uint32 id) SetEscortPaused(true); me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_USE_STANDING); if (pInstance) - if (GameObject *console = ObjectAccessor::GetGameObject(*me, pInstance->GetData64(GO_SJONNIR_CONSOLE))) + if (GameObject* console = ObjectAccessor::GetGameObject(*me, pInstance->GetData64(GO_SJONNIR_CONSOLE))) console->SetGoState(GO_STATE_ACTIVE); break; @@ -695,7 +704,7 @@ public: struct dark_rune_protectorsAI : public ScriptedAI { - dark_rune_protectorsAI(Creature *c) : ScriptedAI(c) { } + dark_rune_protectorsAI(Creature* c) : ScriptedAI(c) { } EventMap events; void Reset() @@ -703,7 +712,7 @@ public: events.Reset(); } - void EnterCombat(Unit *) + void EnterCombat(Unit*) { events.ScheduleEvent(EVENT_DRP_CHARGE, 10000); events.ScheduleEvent(EVENT_DRP_CLEAVE, 7000); @@ -721,19 +730,19 @@ public: switch (events.GetEvent()) { case EVENT_DRP_CHARGE: - { - if (Unit *tgt = SelectTarget(SELECT_TARGET_RANDOM, 0)) - me->CastSpell(tgt, SPELL_DRP_CHARGE, false); + { + if (Unit* tgt = SelectTarget(SELECT_TARGET_RANDOM, 0)) + me->CastSpell(tgt, SPELL_DRP_CHARGE, false); - events.RepeatEvent(10000); - break; - } + events.RepeatEvent(10000); + break; + } case EVENT_DRP_CLEAVE: - { - me->CastSpell(me->GetVictim(), SPELL_DRP_CLEAVE, false); - events.RepeatEvent(7000); - break; - } + { + me->CastSpell(me->GetVictim(), SPELL_DRP_CLEAVE, false); + events.RepeatEvent(7000); + break; + } } DoMeleeAttackIfReady(); @@ -753,7 +762,7 @@ public: struct dark_rune_stormcallerAI : public ScriptedAI { - dark_rune_stormcallerAI(Creature *c) : ScriptedAI(c) { } + dark_rune_stormcallerAI(Creature* c) : ScriptedAI(c) { } EventMap events; void Reset() @@ -761,7 +770,7 @@ public: events.Reset(); } - void EnterCombat(Unit *) + void EnterCombat(Unit*) { events.ScheduleEvent(EVENT_DRS_LIGHTNING_BOLD, 5000); events.ScheduleEvent(EVENT_DRS_SHADOW_WORD_PAIN, 12000); @@ -779,17 +788,17 @@ public: switch (events.GetEvent()) { case EVENT_DRS_LIGHTNING_BOLD: - { - me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_DRS_LIGHTING_BOLT_H : SPELL_DRS_LIGHTING_BOLT, false); - events.RepeatEvent(5000); - break; - } + { + me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_DRS_LIGHTING_BOLT_H : SPELL_DRS_LIGHTING_BOLT, false); + events.RepeatEvent(5000); + break; + } case EVENT_DRS_SHADOW_WORD_PAIN: - { - me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_DRS_SHADOW_WORD_PAIN_H : SPELL_DRS_SHADOW_WORD_PAIN, false); - events.RepeatEvent(12000); - break; - } + { + me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_DRS_SHADOW_WORD_PAIN_H : SPELL_DRS_SHADOW_WORD_PAIN, false); + events.RepeatEvent(12000); + break; + } } DoMeleeAttackIfReady(); @@ -809,14 +818,14 @@ public: struct iron_golem_custodianAI : public ScriptedAI { - iron_golem_custodianAI(Creature *c) : ScriptedAI(c) { } + iron_golem_custodianAI(Creature* c) : ScriptedAI(c) { } EventMap events; void Reset() { events.Reset(); } - void EnterCombat(Unit *) + void EnterCombat(Unit*) { events.ScheduleEvent(EVENT_IGC_CRUSH, 6000); events.ScheduleEvent(EVENT_IGC_GROUND_SMASH, 4000); @@ -833,17 +842,17 @@ public: switch (events.GetEvent()) { case EVENT_IGC_CRUSH: - { - me->CastSpell(me->GetVictim(), SPELL_IGC_CRUSH_ARMOR, false); - events.RepeatEvent(6000); - break; - } + { + me->CastSpell(me->GetVictim(), SPELL_IGC_CRUSH_ARMOR, false); + events.RepeatEvent(6000); + break; + } case EVENT_IGC_GROUND_SMASH: - { - me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_IGC_GROUND_SMASH_H : SPELL_IGC_GROUND_SMASH, false); - events.RepeatEvent(5000); - break; - } + { + me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_IGC_GROUND_SMASH_H : SPELL_IGC_GROUND_SMASH, false); + events.RepeatEvent(5000); + break; + } } DoMeleeAttackIfReady(); @@ -853,29 +862,29 @@ public: class spell_hos_dark_matter : public SpellScriptLoader { - public: - spell_hos_dark_matter() : SpellScriptLoader("spell_hos_dark_matter") { } +public: + spell_hos_dark_matter() : SpellScriptLoader("spell_hos_dark_matter") { } - class spell_hos_dark_matter_AuraScript : public AuraScript + class spell_hos_dark_matter_AuraScript : public AuraScript + { + PrepareAuraScript(spell_hos_dark_matter_AuraScript); + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_hos_dark_matter_AuraScript); - - void HandleEffectRemove(AuraEffect const * /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit *caster = GetCaster()) - caster->CastSpell(caster, caster->GetMap()->IsHeroic() ? SPELL_DARK_MATTER_H : SPELL_DARK_MATTER, true); - } - - void Register() - { - OnEffectRemove += AuraEffectRemoveFn(spell_hos_dark_matter_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript *GetAuraScript() const - { - return new spell_hos_dark_matter_AuraScript(); + if (Unit* caster = GetCaster()) + caster->CastSpell(caster, caster->GetMap()->IsHeroic() ? SPELL_DARK_MATTER_H : SPELL_DARK_MATTER, true); } + + void Register() + { + OnEffectRemove += AuraEffectRemoveFn(spell_hos_dark_matter_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_hos_dark_matter_AuraScript(); + } }; void AddSC_brann_bronzebeard() diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp index 4fad7dfbf..87b58d717 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp @@ -18,7 +18,7 @@ public: struct instance_halls_of_stone_InstanceMapScript : public InstanceScript { - instance_halls_of_stone_InstanceMapScript(Map* map) : InstanceScript(map){ Initialize(); } + instance_halls_of_stone_InstanceMapScript(Map* map) : InstanceScript(map) { Initialize(); } uint32 Encounter[MAX_ENCOUNTER]; @@ -75,37 +75,37 @@ public: return false; } - void OnGameObjectCreate(GameObject *go) + void OnGameObjectCreate(GameObject* go) { switch(go->GetEntry()) { - case GO_KADDRAK: + case GO_KADDRAK: goKaddrakGUID = go->GetGUID(); break; - case GO_ABEDNEUM: + case GO_ABEDNEUM: goAbedneumGUID = go->GetGUID(); if (Encounter[BOSS_TRIBUNAL_OF_AGES] == DONE) go->SetGoState(GO_STATE_ACTIVE); break; - case GO_MARNAK: - goMarnakGUID = go->GetGUID(); + case GO_MARNAK: + goMarnakGUID = go->GetGUID(); break; - case GO_TRIBUNAL_CONSOLE: - goTribunalConsoleGUID = go->GetGUID(); + case GO_TRIBUNAL_CONSOLE: + goTribunalConsoleGUID = go->GetGUID(); break; case GO_TRIBUNAL_ACCESS_DOOR: goTribunalDoorGUID = go->GetGUID(); go->SetGoState(GO_STATE_READY); break; - case GO_SKY_FLOOR: + case GO_SKY_FLOOR: goSkyRoomFloorGUID = go->GetGUID(); if (Encounter[BOSS_TRIBUNAL_OF_AGES] == DONE) go->SetGoState(GO_STATE_ACTIVE); break; - case GO_SJONNIR_CONSOLE: + case GO_SJONNIR_CONSOLE: goSjonnirConsoleGUID = go->GetGUID(); break; - case GO_SJONNIR_DOOR: + case GO_SJONNIR_DOOR: goSjonnirDoorGUID = go->GetGUID(); if (Encounter[BOSS_TRIBUNAL_OF_AGES] == DONE) go->SetGoState(GO_STATE_ACTIVE); @@ -120,16 +120,16 @@ public: } - void OnCreatureCreate(Creature *creature) + void OnCreatureCreate(Creature* creature) { switch(creature->GetEntry()) { - case NPC_SJONNIR: - SjonnirGUID = creature->GetGUID(); - break; - case NPC_BRANN: - BrannGUID = creature->GetGUID(); - break; + case NPC_SJONNIR: + SjonnirGUID = creature->GetGUID(); + break; + case NPC_BRANN: + BrannGUID = creature->GetGUID(); + break; } } @@ -137,18 +137,29 @@ public: { switch(id) { - case GO_TRIBUNAL_CONSOLE: return goTribunalConsoleGUID; - case GO_TRIBUNAL_ACCESS_DOOR: return goTribunalDoorGUID; - case GO_SJONNIR_CONSOLE: return goSjonnirConsoleGUID; - case GO_SJONNIR_DOOR: return goSjonnirDoorGUID; - case GO_LEFT_PIPE: return goLeftPipeGUID; - case GO_RIGHT_PIPE: return goRightPipeGUID; - case GO_KADDRAK: return goKaddrakGUID; - case GO_MARNAK: return goMarnakGUID; - case GO_ABEDNEUM: return goAbedneumGUID; + case GO_TRIBUNAL_CONSOLE: + return goTribunalConsoleGUID; + case GO_TRIBUNAL_ACCESS_DOOR: + return goTribunalDoorGUID; + case GO_SJONNIR_CONSOLE: + return goSjonnirConsoleGUID; + case GO_SJONNIR_DOOR: + return goSjonnirDoorGUID; + case GO_LEFT_PIPE: + return goLeftPipeGUID; + case GO_RIGHT_PIPE: + return goRightPipeGUID; + case GO_KADDRAK: + return goKaddrakGUID; + case GO_MARNAK: + return goMarnakGUID; + case GO_ABEDNEUM: + return goAbedneumGUID; - case NPC_SJONNIR: return SjonnirGUID; - case NPC_BRANN: return BrannGUID; + case NPC_SJONNIR: + return SjonnirGUID; + case NPC_BRANN: + return BrannGUID; } return 0; } @@ -202,7 +213,7 @@ public: pF->SetGoState(GO_STATE_ACTIVE); // Make sjonnir attackable - if (Creature *cr = instance->GetCreature(SjonnirGUID)) + if (Creature* cr = instance->GetCreature(SjonnirGUID)) cr->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } if (type == BOSS_TRIBUNAL_OF_AGES && data == NOT_STARTED) @@ -223,7 +234,7 @@ public: sjonnirAchievement = (bool)data; return; } - + if (data == DONE) SaveToDB(); } 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 3ea74cff8..a0d7e94c2 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 @@ -146,8 +146,8 @@ enum EncounterPhases PHASE_ROLE_PLAY = 1, PHASE_BIG_BANG = 2, - PHASE_MASK_NO_UPDATE = (1 << (PHASE_ROLE_PLAY-1)) | (1 << (PHASE_BIG_BANG-1)), - PHASE_MASK_NO_CAST_CHECK = 1 << (PHASE_ROLE_PLAY-1), + PHASE_MASK_NO_UPDATE = (1 << (PHASE_ROLE_PLAY - 1)) | (1 << (PHASE_BIG_BANG - 1)), + PHASE_MASK_NO_CAST_CHECK = 1 << (PHASE_ROLE_PLAY - 1), }; enum Texts @@ -231,160 +231,160 @@ Position const BrannOutroPos[3] = class CosmicSmashDamageEvent : public BasicEvent { - public: - CosmicSmashDamageEvent(Unit* caster) : _caster(caster) - { - } +public: + CosmicSmashDamageEvent(Unit* caster) : _caster(caster) + { + } - bool Execute(uint64 /*execTime*/, uint32 /*diff*/) - { - _caster->CastSpell(_caster, SPELL_COSMIC_SMASH_TRIGGERED, true); - return true; - } + bool Execute(uint64 /*execTime*/, uint32 /*diff*/) + { + _caster->CastSpell(_caster, SPELL_COSMIC_SMASH_TRIGGERED, true); + return true; + } - private: - Unit* _caster; +private: + Unit* _caster; }; class boss_algalon_the_observer : public CreatureScript { - public: - boss_algalon_the_observer() : CreatureScript("boss_algalon_the_observer") {} +public: + boss_algalon_the_observer() : CreatureScript("boss_algalon_the_observer") {} - struct boss_algalon_the_observerAI : public ScriptedAI + struct boss_algalon_the_observerAI : public ScriptedAI + { + boss_algalon_the_observerAI(Creature* creature) : ScriptedAI(creature), summons(me) { - boss_algalon_the_observerAI(Creature* creature) : ScriptedAI(creature), summons(me) - { - _fedOnTears = true; - _firstPull = true; - _fightWon = false; - m_pInstance = me->GetInstanceScript(); - } + _fedOnTears = true; + _firstPull = true; + _fightWon = false; + m_pInstance = me->GetInstanceScript(); + } - EventMap events; - SummonList summons; - InstanceScript* m_pInstance; + EventMap events; + SummonList summons; + InstanceScript* m_pInstance; - bool _firstPull; - bool _fightWon; - bool _phaseTwo; - bool _fedOnTears; - bool _heraldOfTheTitans; + bool _firstPull; + bool _fightWon; + bool _phaseTwo; + bool _fedOnTears; + bool _heraldOfTheTitans; - bool IsValidHeraldItem(const ItemTemplate* item) - { - if (!item) // should not happen, but checked in GetAverageItemLevel() - return true; - if (item->ItemLevel <= 226 || (item->ItemLevel <= 232 && ( - item->InventoryType == INVTYPE_SHIELD || - item->Class == ITEM_CLASS_WEAPON || - (item->Class == ITEM_CLASS_ARMOR && (item->InventoryType == INVTYPE_RELIC || item->InventoryType == INVTYPE_HOLDABLE)) - ))) - return true; - return false; - } + bool IsValidHeraldItem(const ItemTemplate* item) + { + if (!item) // should not happen, but checked in GetAverageItemLevel() + return true; + if (item->ItemLevel <= 226 || (item->ItemLevel <= 232 && ( + item->InventoryType == INVTYPE_SHIELD || + item->Class == ITEM_CLASS_WEAPON || + (item->Class == ITEM_CLASS_ARMOR && (item->InventoryType == INVTYPE_RELIC || item->InventoryType == INVTYPE_HOLDABLE)) + ))) + return true; + return false; + } - bool DoCheckHeraldOfTheTitans() - { - if (!_heraldOfTheTitans) - return true; + bool DoCheckHeraldOfTheTitans() + { + if (!_heraldOfTheTitans) + return true; - Map::PlayerList const &pl = me->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) - if (Player* plr = itr->GetSource()) - if (!plr->IsGameMaster() && plr->IsInCombat() /*performance*/) - { - for (uint8 i=EQUIPMENT_SLOT_START; iGetItemByPos(INVENTORY_SLOT_BAG_0, i)) - if (!IsValidHeraldItem(item->GetTemplate())) - { - _heraldOfTheTitans = false; - return true; - } - } - - return false; - } - - void AttackStart(Unit* who) - { - if (_fightWon) - return; - ScriptedAI::AttackStart(who); - } - - uint32 GetData(uint32 param) const - { - if (param == DATA_HAS_FED_ON_TEARS) - return _fedOnTears; - if (param == DATA_HERALD_OF_THE_TITANS) - return _heraldOfTheTitans; - return 0; - } - - void CallConstellations() - { - uint8 _count = 0; - for (SummonList::const_iterator i = summons.begin(); i != summons.end(); ) - { - Creature* summon = ObjectAccessor::GetCreature(*me, *i++); - if (summon && summon->GetEntry() == NPC_LIVING_CONSTELLATION && !summon->AI()->GetData(0)) + Map::PlayerList const& pl = me->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) + if (Player* plr = itr->GetSource()) + if (!plr->IsGameMaster() && plr->IsInCombat() /*performance*/) { - ++_count; - summon->AI()->DoAction(ACTION_ACTIVATE_STAR); - if (_count >= 3) - break; + for (uint8 i = EQUIPMENT_SLOT_START; i < EQUIPMENT_SLOT_END; ++i) // loop through equipped items + if (Item* item = plr->GetItemByPos(INVENTORY_SLOT_BAG_0, i)) + if (!IsValidHeraldItem(item->GetTemplate())) + { + _heraldOfTheTitans = false; + return true; + } } + + return false; + } + + void AttackStart(Unit* who) + { + if (_fightWon) + return; + ScriptedAI::AttackStart(who); + } + + uint32 GetData(uint32 param) const + { + if (param == DATA_HAS_FED_ON_TEARS) + return _fedOnTears; + if (param == DATA_HERALD_OF_THE_TITANS) + return _heraldOfTheTitans; + return 0; + } + + void CallConstellations() + { + uint8 _count = 0; + for (SummonList::const_iterator i = summons.begin(); i != summons.end(); ) + { + Creature* summon = ObjectAccessor::GetCreature(*me, *i++); + if (summon && summon->GetEntry() == NPC_LIVING_CONSTELLATION && !summon->AI()->GetData(0)) + { + ++_count; + summon->AI()->DoAction(ACTION_ACTIVATE_STAR); + if (_count >= 3) + break; } } + } - void EnterEvadeMode() + void EnterEvadeMode() + { + if (_fightWon) + return; + + if (SelectTargetFromPlayerList(120.0f)) { - if (_fightWon) - return; - - if (SelectTargetFromPlayerList(120.0f)) - { - me->SetInCombatWithZone(); - return; - } - - ScriptedAI::EnterEvadeMode(); + me->SetInCombatWithZone(); + return; } - void Reset() + ScriptedAI::EnterEvadeMode(); + } + + void Reset() + { + if (_fightWon) + return; + + events.Reset(); + summons.DespawnAll(); + me->SetReactState(REACT_PASSIVE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + me->SetSheath(SHEATH_STATE_UNARMED); + me->setFaction(190); + me->CastSpell(me, SPELL_DUAL_WIELD, true); + + _phaseTwo = false; + _heraldOfTheTitans = true; + + if (m_pInstance) + m_pInstance->SetData(TYPE_ALGALON, NOT_STARTED); + } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() != TYPEID_PLAYER || urand(0, 2)) + return; + + Talk(SAY_ALGALON_KILL); + } + + void DoAction(int32 action) + { + switch (action) { - if (_fightWon) - return; - - events.Reset(); - summons.DespawnAll(); - me->SetReactState(REACT_PASSIVE); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - me->SetSheath(SHEATH_STATE_UNARMED); - me->setFaction(190); - me->CastSpell(me, SPELL_DUAL_WIELD, true); - - _phaseTwo = false; - _heraldOfTheTitans = true; - - if (m_pInstance) - m_pInstance->SetData(TYPE_ALGALON, NOT_STARTED); - } - - void KilledUnit(Unit* victim) - { - if (victim->GetTypeId() != TYPEID_PLAYER || urand(0,2)) - return; - - Talk(SAY_ALGALON_KILL); - } - - void DoAction(int32 action) - { - switch (action) - { - case ACTION_START_INTRO: + case ACTION_START_INTRO: { me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); me->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_INSTANTLY_APPEAR_MODEL); @@ -405,141 +405,141 @@ class boss_algalon_the_observer : public CreatureScript events.ScheduleEvent(EVENT_INTRO_FINISH, 36000, 0, PHASE_ROLE_PLAY); break; } - case ACTION_DESPAWN_ALGALON: - _fightWon = true; - events.Reset(); - summons.DespawnAll(); - events.SetPhase(PHASE_ROLE_PLAY); - events.ScheduleEvent(EVENT_DESPAWN_ALGALON_1, 5000); - events.ScheduleEvent(EVENT_DESPAWN_ALGALON_2, 17000); - events.ScheduleEvent(EVENT_DESPAWN_ALGALON_3, 26000); - if (me->IsInCombat()) - events.ScheduleEvent(EVENT_DESPAWN_ALGALON_4, 26000); - events.ScheduleEvent(EVENT_DESPAWN_ALGALON_5, 32000); - me->DespawnOrUnsummon(39000); + case ACTION_DESPAWN_ALGALON: + _fightWon = true; + events.Reset(); + summons.DespawnAll(); + events.SetPhase(PHASE_ROLE_PLAY); + events.ScheduleEvent(EVENT_DESPAWN_ALGALON_1, 5000); + events.ScheduleEvent(EVENT_DESPAWN_ALGALON_2, 17000); + events.ScheduleEvent(EVENT_DESPAWN_ALGALON_3, 26000); + if (me->IsInCombat()) + events.ScheduleEvent(EVENT_DESPAWN_ALGALON_4, 26000); + events.ScheduleEvent(EVENT_DESPAWN_ALGALON_5, 32000); + me->DespawnOrUnsummon(39000); - me->SetReactState(REACT_PASSIVE); - me->AttackStop(); - me->setFaction(35); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->InterruptNonMeleeSpells(false); - if (m_pInstance) - m_pInstance->SetData(TYPE_ALGALON, NOT_STARTED); - break; - case ACTION_INIT_ALGALON: - _firstPull = false; - _fedOnTears = false; - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - break; - case ACTION_ASCEND: - summons.DespawnAll(); - events.SetPhase(PHASE_BIG_BANG); - events.ScheduleEvent(EVENT_ASCEND_TO_THE_HEAVENS, 1500); - break; - case ACTION_FEEDS_ON_TEARS_FAILED: - _fedOnTears = false; - } - } - - void JustReachedHome() - { - me->setActive(false); - } - - void EnterCombat(Unit*) - { - if (_fightWon) - return; - - if (!m_pInstance) - { - EnterEvadeMode(); - return; - } - - uint32 introDelay = 0; - me->setActive(true); - me->SetInCombatWithZone(); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_NPC); - events.Reset(); - events.SetPhase(PHASE_ROLE_PLAY); - - if (!_firstPull) - { - events.ScheduleEvent(EVENT_START_COMBAT, 0); - introDelay = 8000; - } - else - { - summons.DespawnEntry(NPC_AZEROTH); + me->SetReactState(REACT_PASSIVE); + me->AttackStop(); + me->setFaction(35); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->InterruptNonMeleeSpells(false); + if (m_pInstance) + m_pInstance->SetData(TYPE_ALGALON, NOT_STARTED); + break; + case ACTION_INIT_ALGALON: _firstPull = false; - Talk(SAY_ALGALON_START_TIMER); - introDelay = 22000; - events.ScheduleEvent(EVENT_START_COMBAT, 14000); - m_pInstance->SetData(DATA_DESPAWN_ALGALON, 0); - } + _fedOnTears = false; + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + break; + case ACTION_ASCEND: + summons.DespawnAll(); + events.SetPhase(PHASE_BIG_BANG); + events.ScheduleEvent(EVENT_ASCEND_TO_THE_HEAVENS, 1500); + break; + case ACTION_FEEDS_ON_TEARS_FAILED: + _fedOnTears = false; + } + } - events.ScheduleEvent(EVENT_REMOVE_UNNATTACKABLE, introDelay-500); - events.ScheduleEvent(EVENT_INTRO_TIMER_DONE, introDelay); - events.ScheduleEvent(EVENT_QUANTUM_STRIKE, 3500 + introDelay); - events.ScheduleEvent(EVENT_PHASE_PUNCH, 15500 + introDelay); - events.ScheduleEvent(EVENT_SUMMON_COLLAPSING_STAR, 16500 + introDelay); - events.ScheduleEvent(EVENT_COSMIC_SMASH, 25000 + introDelay); - events.ScheduleEvent(EVENT_ACTIVATE_LIVING_CONSTELLATION, 50500 + introDelay); - events.ScheduleEvent(EVENT_BIG_BANG, 90000 + introDelay); - events.ScheduleEvent(EVENT_ASCEND_TO_THE_HEAVENS, 360000 + introDelay); + void JustReachedHome() + { + me->setActive(false); + } - events.ScheduleEvent(EVENT_CHECK_HERALD_ITEMS, 5000); - DoCheckHeraldOfTheTitans(); + void EnterCombat(Unit*) + { + if (_fightWon) + return; + + if (!m_pInstance) + { + EnterEvadeMode(); + return; } - void MovementInform(uint32 movementType, uint32 pointId) - { - if (movementType != POINT_MOTION_TYPE) - return; + uint32 introDelay = 0; + me->setActive(true); + me->SetInCombatWithZone(); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_NPC); + events.Reset(); + events.SetPhase(PHASE_ROLE_PLAY); - if (pointId == POINT_ALGALON_LAND) - me->SetDisableGravity(false); - else if (pointId == POINT_ALGALON_OUTRO) - { - me->SetFacingTo(1.605703f); - events.ScheduleEvent(EVENT_OUTRO_3, 1200); - events.ScheduleEvent(EVENT_OUTRO_4, 2400); - events.ScheduleEvent(EVENT_OUTRO_5, 8500); - events.ScheduleEvent(EVENT_OUTRO_6, 15500); - events.ScheduleEvent(EVENT_OUTRO_7, 55500); - events.ScheduleEvent(EVENT_OUTRO_8, 73500); - events.ScheduleEvent(EVENT_OUTRO_9, 85500); - events.ScheduleEvent(EVENT_OUTRO_10, 101500); - events.ScheduleEvent(EVENT_OUTRO_11, 117500); - } + if (!_firstPull) + { + events.ScheduleEvent(EVENT_START_COMBAT, 0); + introDelay = 8000; + } + else + { + summons.DespawnEntry(NPC_AZEROTH); + _firstPull = false; + Talk(SAY_ALGALON_START_TIMER); + introDelay = 22000; + events.ScheduleEvent(EVENT_START_COMBAT, 14000); + m_pInstance->SetData(DATA_DESPAWN_ALGALON, 0); } - void JustSummoned(Creature* summon) + events.ScheduleEvent(EVENT_REMOVE_UNNATTACKABLE, introDelay - 500); + events.ScheduleEvent(EVENT_INTRO_TIMER_DONE, introDelay); + events.ScheduleEvent(EVENT_QUANTUM_STRIKE, 3500 + introDelay); + events.ScheduleEvent(EVENT_PHASE_PUNCH, 15500 + introDelay); + events.ScheduleEvent(EVENT_SUMMON_COLLAPSING_STAR, 16500 + introDelay); + events.ScheduleEvent(EVENT_COSMIC_SMASH, 25000 + introDelay); + events.ScheduleEvent(EVENT_ACTIVATE_LIVING_CONSTELLATION, 50500 + introDelay); + events.ScheduleEvent(EVENT_BIG_BANG, 90000 + introDelay); + events.ScheduleEvent(EVENT_ASCEND_TO_THE_HEAVENS, 360000 + introDelay); + + events.ScheduleEvent(EVENT_CHECK_HERALD_ITEMS, 5000); + DoCheckHeraldOfTheTitans(); + } + + void MovementInform(uint32 movementType, uint32 pointId) + { + if (movementType != POINT_MOTION_TYPE) + return; + + if (pointId == POINT_ALGALON_LAND) + me->SetDisableGravity(false); + else if (pointId == POINT_ALGALON_OUTRO) { - summons.Summon(summon); - switch (summon->GetEntry()) - { - case NPC_AZEROTH: - me->CastSpell(summon, SPELL_REORIGINATION, true); - break; - case NPC_BLACK_HOLE: - summon->CastSpell((Unit*)NULL, SPELL_BLACK_HOLE_TRIGGER, true); - summon->CastSpell(summon, SPELL_CONSTELLATION_PHASE_TRIGGER, true); - summon->CastSpell((Unit*)NULL, SPELL_BLACK_HOLE_EXPLOSION, false); - summon->CastSpell(summon, SPELL_SUMMON_VOID_ZONE_VISUAL, true); - break; - case NPC_ALGALON_VOID_ZONE_VISUAL_STALKER: - summon->CastSpell(summon, SPELL_VOID_ZONE_VISUAL, true); - break; - case NPC_ALGALON_STALKER_ASTEROID_TARGET_01: - summon->CastSpell(summon, SPELL_COSMIC_SMASH_VISUAL_STATE, true); - break; - case NPC_ALGALON_STALKER_ASTEROID_TARGET_02: + me->SetFacingTo(1.605703f); + events.ScheduleEvent(EVENT_OUTRO_3, 1200); + events.ScheduleEvent(EVENT_OUTRO_4, 2400); + events.ScheduleEvent(EVENT_OUTRO_5, 8500); + events.ScheduleEvent(EVENT_OUTRO_6, 15500); + events.ScheduleEvent(EVENT_OUTRO_7, 55500); + events.ScheduleEvent(EVENT_OUTRO_8, 73500); + events.ScheduleEvent(EVENT_OUTRO_9, 85500); + events.ScheduleEvent(EVENT_OUTRO_10, 101500); + events.ScheduleEvent(EVENT_OUTRO_11, 117500); + } + } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + switch (summon->GetEntry()) + { + case NPC_AZEROTH: + me->CastSpell(summon, SPELL_REORIGINATION, true); + break; + case NPC_BLACK_HOLE: + summon->CastSpell((Unit*)NULL, SPELL_BLACK_HOLE_TRIGGER, true); + summon->CastSpell(summon, SPELL_CONSTELLATION_PHASE_TRIGGER, true); + summon->CastSpell((Unit*)NULL, SPELL_BLACK_HOLE_EXPLOSION, false); + summon->CastSpell(summon, SPELL_SUMMON_VOID_ZONE_VISUAL, true); + break; + case NPC_ALGALON_VOID_ZONE_VISUAL_STALKER: + summon->CastSpell(summon, SPELL_VOID_ZONE_VISUAL, true); + break; + case NPC_ALGALON_STALKER_ASTEROID_TARGET_01: + summon->CastSpell(summon, SPELL_COSMIC_SMASH_VISUAL_STATE, true); + break; + case NPC_ALGALON_STALKER_ASTEROID_TARGET_02: { float x = summon->GetPositionX(); float y = summon->GetPositionY(); - float z = summon->GetPositionZ()+35.0f; + float z = summon->GetPositionZ() + 35.0f; float o = summon->GetOrientation(); summon->GetMotionMaster()->Clear(); @@ -549,130 +549,130 @@ class boss_algalon_the_observer : public CreatureScript summon->m_Events.AddEvent(new CosmicSmashDamageEvent(summon), summon->m_Events.CalculateTime(4000)); break; } - case NPC_UNLEASHED_DARK_MATTER: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) - if (summon->Attack(target, true)) - summon->GetMotionMaster()->MoveChase(target); - break; - } + case NPC_UNLEASHED_DARK_MATTER: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) + if (summon->Attack(target, true)) + summon->GetMotionMaster()->MoveChase(target); + break; + } + } + + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) + { + if (_fightWon) + { + damage = 0; + return; } - void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) + if (!_phaseTwo && me->HealthBelowPctDamaged(20, damage)) { - if (_fightWon) - { - damage = 0; - return; - } + _phaseTwo = true; + Talk(SAY_ALGALON_PHASE_TWO); + summons.DespawnEntry(NPC_LIVING_CONSTELLATION); + summons.DespawnEntry(NPC_COLLAPSING_STAR); + summons.DespawnEntry(NPC_BLACK_HOLE); + summons.DespawnEntry(NPC_ALGALON_VOID_ZONE_VISUAL_STALKER); + events.CancelEvent(EVENT_SUMMON_COLLAPSING_STAR); + events.CancelEvent(EVENT_ACTIVATE_LIVING_CONSTELLATION); - if (!_phaseTwo && me->HealthBelowPctDamaged(20, damage)) - { - _phaseTwo = true; - Talk(SAY_ALGALON_PHASE_TWO); - summons.DespawnEntry(NPC_LIVING_CONSTELLATION); - summons.DespawnEntry(NPC_COLLAPSING_STAR); - summons.DespawnEntry(NPC_BLACK_HOLE); - summons.DespawnEntry(NPC_ALGALON_VOID_ZONE_VISUAL_STALKER); - events.CancelEvent(EVENT_SUMMON_COLLAPSING_STAR); - events.CancelEvent(EVENT_ACTIVATE_LIVING_CONSTELLATION); + for (uint32 i = 0; i < COLLAPSING_STAR_COUNT; ++i) + me->SummonCreature(NPC_WORM_HOLE, CollapsingStarPos[i], TEMPSUMMON_MANUAL_DESPAWN); + } + else if (me->HealthBelowPctDamaged(2, damage) && !_fightWon) + { + _fightWon = true; + damage = 0; + me->SetReactState(REACT_PASSIVE); + me->AttackStop(); + me->setFaction(35); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + events.Reset(); + summons.DespawnAll(); + me->InterruptNonMeleeSpells(false); + events.SetPhase(PHASE_ROLE_PLAY); + events.ScheduleEvent(EVENT_OUTRO_START, 1500); + events.ScheduleEvent(EVENT_OUTRO_1, 7200); + events.ScheduleEvent(EVENT_OUTRO_2, 8700); + } + } - for (uint32 i = 0; i < COLLAPSING_STAR_COUNT; ++i) - me->SummonCreature(NPC_WORM_HOLE, CollapsingStarPos[i], TEMPSUMMON_MANUAL_DESPAWN); - } - else if (me->HealthBelowPctDamaged(2, damage) && !_fightWon) - { - _fightWon = true; - damage = 0; - me->SetReactState(REACT_PASSIVE); - me->AttackStop(); - me->setFaction(35); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + void UpdateAI(uint32 diff) + { + if ((!(events.GetPhaseMask() & PHASE_MASK_NO_UPDATE) && !UpdateVictim()) /*ZOMG!|| !CheckInRoom()*/) + return; + + events.Update(diff); + if (!(events.GetPhaseMask() & PHASE_MASK_NO_CAST_CHECK) && me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.GetEvent()) + { + case EVENT_INTRO_1: + me->RemoveAurasDueToSpell(SPELL_RIDE_THE_LIGHTNING); + Talk(SAY_ALGALON_INTRO_1); + events.PopEvent(); + break; + case EVENT_INTRO_2: + me->CastSpell((Unit*)NULL, SPELL_SUMMON_AZEROTH, true); + Talk(SAY_ALGALON_INTRO_2); + events.PopEvent(); + break; + case EVENT_INTRO_3: + Talk(SAY_ALGALON_INTRO_3); + events.PopEvent(); + break; + case EVENT_INTRO_FINISH: events.Reset(); - summons.DespawnAll(); - me->InterruptNonMeleeSpells(false); - events.SetPhase(PHASE_ROLE_PLAY); - events.ScheduleEvent(EVENT_OUTRO_START, 1500); - events.ScheduleEvent(EVENT_OUTRO_1, 7200); - events.ScheduleEvent(EVENT_OUTRO_2, 8700); - } - } + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + if (Creature* brann = ObjectAccessor::GetCreature(*me, m_pInstance->GetData64(NPC_BRANN_BRONZBEARD_ALG))) + brann->AI()->DoAction(ACTION_FINISH_INTRO); + break; + case EVENT_START_COMBAT: + m_pInstance->SetData(TYPE_ALGALON, IN_PROGRESS); + Talk(SAY_ALGALON_AGGRO); + events.PopEvent(); + break; + case EVENT_REMOVE_UNNATTACKABLE: + me->SetSheath(SHEATH_STATE_MELEE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_NPC); + events.PopEvent(); + break; + case EVENT_INTRO_TIMER_DONE: + events.SetPhase(PHASE_NORMAL); + me->CastSpell((Unit*)NULL, SPELL_SUPERMASSIVE_FAIL, true); + // Hack: _IsValidTarget failed earlier due to flags, call AttackStart again + me->SetReactState(REACT_AGGRESSIVE); + me->setFaction(14); + if (Player* target = SelectTargetFromPlayerList(150.0f)) + AttackStart(target); + me->SetInCombatWithZone(); + events.PopEvent(); - void UpdateAI(uint32 diff) - { - if ((!(events.GetPhaseMask() & PHASE_MASK_NO_UPDATE) && !UpdateVictim()) /*ZOMG!|| !CheckInRoom()*/) - return; - - events.Update(diff); - if (!(events.GetPhaseMask() & PHASE_MASK_NO_CAST_CHECK) && me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.GetEvent()) - { - case EVENT_INTRO_1: - me->RemoveAurasDueToSpell(SPELL_RIDE_THE_LIGHTNING); - Talk(SAY_ALGALON_INTRO_1); - events.PopEvent(); - break; - case EVENT_INTRO_2: - me->CastSpell((Unit*)NULL, SPELL_SUMMON_AZEROTH, true); - Talk(SAY_ALGALON_INTRO_2); - events.PopEvent(); - break; - case EVENT_INTRO_3: - Talk(SAY_ALGALON_INTRO_3); - events.PopEvent(); - break; - case EVENT_INTRO_FINISH: - events.Reset(); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - if (Creature* brann = ObjectAccessor::GetCreature(*me, m_pInstance->GetData64(NPC_BRANN_BRONZBEARD_ALG))) - brann->AI()->DoAction(ACTION_FINISH_INTRO); - break; - case EVENT_START_COMBAT: - m_pInstance->SetData(TYPE_ALGALON, IN_PROGRESS); - Talk(SAY_ALGALON_AGGRO); - events.PopEvent(); - break; - case EVENT_REMOVE_UNNATTACKABLE: - me->SetSheath(SHEATH_STATE_MELEE); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_NPC); - events.PopEvent(); - break; - case EVENT_INTRO_TIMER_DONE: - events.SetPhase(PHASE_NORMAL); - me->CastSpell((Unit*)NULL, SPELL_SUPERMASSIVE_FAIL, true); - // Hack: _IsValidTarget failed earlier due to flags, call AttackStart again - me->SetReactState(REACT_AGGRESSIVE); - me->setFaction(14); - if (Player* target = SelectTargetFromPlayerList(150.0f)) - AttackStart(target); - me->SetInCombatWithZone(); - events.PopEvent(); - - for (uint32 i = 0; i < LIVING_CONSTELLATION_COUNT; ++i) - me->SummonCreature(NPC_LIVING_CONSTELLATION, ConstellationPos[i], TEMPSUMMON_DEAD_DESPAWN); - break; - case EVENT_QUANTUM_STRIKE: - me->CastSpell(me->GetVictim(), SPELL_QUANTUM_STRIKE, false); - events.RepeatEvent(urand(3000, 4500)); - break; - case EVENT_PHASE_PUNCH: - me->CastSpell(me->GetVictim(), SPELL_PHASE_PUNCH, false); - events.RepeatEvent(15500); - break; - case EVENT_SUMMON_COLLAPSING_STAR: - Talk(SAY_ALGALON_COLLAPSING_STAR); - Talk(EMOTE_ALGALON_COLLAPSING_STAR); - for (uint8 i = 0; i < COLLAPSING_STAR_COUNT; ++i) - me->SummonCreature(NPC_COLLAPSING_STAR, CollapsingStarPos[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2000); - events.RepeatEvent(60000); - break; - case EVENT_COSMIC_SMASH: - Talk(EMOTE_ALGALON_COSMIC_SMASH); - me->CastCustomSpell(SPELL_COSMIC_SMASH, SPELLVALUE_MAX_TARGETS, RAID_MODE(1,3), (Unit*)NULL); - events.RepeatEvent(25500); - break; - case EVENT_ACTIVATE_LIVING_CONSTELLATION: + for (uint32 i = 0; i < LIVING_CONSTELLATION_COUNT; ++i) + me->SummonCreature(NPC_LIVING_CONSTELLATION, ConstellationPos[i], TEMPSUMMON_DEAD_DESPAWN); + break; + case EVENT_QUANTUM_STRIKE: + me->CastSpell(me->GetVictim(), SPELL_QUANTUM_STRIKE, false); + events.RepeatEvent(urand(3000, 4500)); + break; + case EVENT_PHASE_PUNCH: + me->CastSpell(me->GetVictim(), SPELL_PHASE_PUNCH, false); + events.RepeatEvent(15500); + break; + case EVENT_SUMMON_COLLAPSING_STAR: + Talk(SAY_ALGALON_COLLAPSING_STAR); + Talk(EMOTE_ALGALON_COLLAPSING_STAR); + for (uint8 i = 0; i < COLLAPSING_STAR_COUNT; ++i) + me->SummonCreature(NPC_COLLAPSING_STAR, CollapsingStarPos[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2000); + events.RepeatEvent(60000); + break; + case EVENT_COSMIC_SMASH: + Talk(EMOTE_ALGALON_COSMIC_SMASH); + me->CastCustomSpell(SPELL_COSMIC_SMASH, SPELLVALUE_MAX_TARGETS, RAID_MODE(1, 3), (Unit*)NULL); + events.RepeatEvent(25500); + break; + case EVENT_ACTIVATE_LIVING_CONSTELLATION: { if (events.GetPhaseMask() & PHASE_MASK_NO_UPDATE) { @@ -684,7 +684,7 @@ class boss_algalon_the_observer : public CreatureScript events.RepeatEvent(50000); break; } - case EVENT_BIG_BANG: + case EVENT_BIG_BANG: { Talk(SAY_ALGALON_BIG_BANG); Talk(EMOTE_ALGALON_BIG_BANG); @@ -696,729 +696,729 @@ class boss_algalon_the_observer : public CreatureScript events.RepeatEvent(90500); break; } - case EVENT_ASCEND_TO_THE_HEAVENS: - Talk(SAY_ALGALON_ASCEND); - me->CastSpell((Unit*)NULL, SPELL_ASCEND_TO_THE_HEAVENS, false); - events.ScheduleEvent(EVENT_EVADE, 2500); + case EVENT_ASCEND_TO_THE_HEAVENS: + Talk(SAY_ALGALON_ASCEND); + me->CastSpell((Unit*)NULL, SPELL_ASCEND_TO_THE_HEAVENS, false); + events.ScheduleEvent(EVENT_EVADE, 2500); + events.PopEvent(); + break; + case EVENT_EVADE: + events.Reset(); + ScriptedAI::EnterEvadeMode(); + return; + case EVENT_OUTRO_START: + if (m_pInstance) + { + m_pInstance->SetData(TYPE_ALGALON, DONE); + m_pInstance->SetData(DATA_ALGALON_DEFEATED, 1); + } + events.PopEvent(); + break; + case EVENT_OUTRO_1: + me->RemoveAllAuras(); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_RENAME); + events.PopEvent(); + break; + case EVENT_OUTRO_2: + _EnterEvadeMode(); + me->GetMotionMaster()->MovePoint(POINT_ALGALON_OUTRO, AlgalonOutroPos); + events.PopEvent(); + break; + case EVENT_OUTRO_3: + me->CastSpell((Unit*)NULL, SPELL_KILL_CREDIT); + // Summon Chest + if (GameObject* go = me->SummonGameObject(RAID_MODE(GO_ALGALON_CHEST, GO_ALGALON_CHEST_HERO), 1632.1f, -306.561f, 417.321f, 4.69494f, 0, 0, 0, 1, 0)) + go->SetUInt32Value(GAMEOBJECT_FLAGS, 0); + events.PopEvent(); + break; + case EVENT_OUTRO_4: + me->CastSpell((Unit*)NULL, SPELL_SUPERMASSIVE_FAIL); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + events.PopEvent(); + break; + case EVENT_OUTRO_5: + if (Creature* brann = me->SummonCreature(NPC_BRANN_BRONZBEARD_ALG, BrannOutroPos[0], TEMPSUMMON_TIMED_DESPAWN, 131500)) + brann->AI()->DoAction(ACTION_OUTRO); + events.PopEvent(); + break; + case EVENT_OUTRO_6: + Talk(SAY_ALGALON_OUTRO_1); + me->SetStandState(UNIT_STAND_STATE_KNEEL); + events.PopEvent(); + break; + case EVENT_OUTRO_7: + Talk(SAY_ALGALON_OUTRO_2); + events.PopEvent(); + break; + case EVENT_OUTRO_8: + Talk(SAY_ALGALON_OUTRO_3); + events.PopEvent(); + break; + case EVENT_OUTRO_9: + Talk(SAY_ALGALON_OUTRO_4); + events.PopEvent(); + break; + case EVENT_OUTRO_10: + Talk(SAY_ALGALON_OUTRO_5); + events.PopEvent(); + break; + case EVENT_OUTRO_11: + me->SetStandState(UNIT_STAND_STATE_STAND); + me->CastSpell(me, SPELL_TELEPORT, false); + me->DespawnOrUnsummon(3000); + events.PopEvent(); + break; + case EVENT_DESPAWN_ALGALON_1: + Talk(SAY_ALGALON_DESPAWN_1); + events.PopEvent(); + break; + case EVENT_DESPAWN_ALGALON_2: + Talk(SAY_ALGALON_DESPAWN_2); + events.PopEvent(); + break; + case EVENT_DESPAWN_ALGALON_3: + Talk(SAY_ALGALON_DESPAWN_3); + events.PopEvent(); + break; + case EVENT_DESPAWN_ALGALON_4: + me->CastSpell((Unit*)NULL, SPELL_ASCEND_TO_THE_HEAVENS, false); + events.PopEvent(); + break; + case EVENT_DESPAWN_ALGALON_5: + me->SetStandState(UNIT_STAND_STATE_STAND); + me->CastSpell(me, SPELL_TELEPORT, false); + me->DespawnOrUnsummon(3000); + events.PopEvent(); + break; + case EVENT_CHECK_HERALD_ITEMS: + if (DoCheckHeraldOfTheTitans()) events.PopEvent(); - break; - case EVENT_EVADE: - events.Reset(); - ScriptedAI::EnterEvadeMode(); - return; - case EVENT_OUTRO_START: - if (m_pInstance) - { - m_pInstance->SetData(TYPE_ALGALON, DONE); - m_pInstance->SetData(DATA_ALGALON_DEFEATED, 1); - } - events.PopEvent(); - break; - case EVENT_OUTRO_1: - me->RemoveAllAuras(); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_RENAME); - events.PopEvent(); - break; - case EVENT_OUTRO_2: - _EnterEvadeMode(); - me->GetMotionMaster()->MovePoint(POINT_ALGALON_OUTRO, AlgalonOutroPos); - events.PopEvent(); - break; - case EVENT_OUTRO_3: - me->CastSpell((Unit*)NULL, SPELL_KILL_CREDIT); - // Summon Chest - if (GameObject* go = me->SummonGameObject(RAID_MODE(GO_ALGALON_CHEST, GO_ALGALON_CHEST_HERO), 1632.1f, -306.561f, 417.321f, 4.69494f, 0, 0, 0, 1, 0)) - go->SetUInt32Value(GAMEOBJECT_FLAGS, 0); - events.PopEvent(); - break; - case EVENT_OUTRO_4: - me->CastSpell((Unit*)NULL, SPELL_SUPERMASSIVE_FAIL); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - events.PopEvent(); - break; - case EVENT_OUTRO_5: - if (Creature* brann = me->SummonCreature(NPC_BRANN_BRONZBEARD_ALG, BrannOutroPos[0], TEMPSUMMON_TIMED_DESPAWN, 131500)) - brann->AI()->DoAction(ACTION_OUTRO); - events.PopEvent(); - break; - case EVENT_OUTRO_6: - Talk(SAY_ALGALON_OUTRO_1); - me->SetStandState(UNIT_STAND_STATE_KNEEL); - events.PopEvent(); - break; - case EVENT_OUTRO_7: - Talk(SAY_ALGALON_OUTRO_2); - events.PopEvent(); - break; - case EVENT_OUTRO_8: - Talk(SAY_ALGALON_OUTRO_3); - events.PopEvent(); - break; - case EVENT_OUTRO_9: - Talk(SAY_ALGALON_OUTRO_4); - events.PopEvent(); - break; - case EVENT_OUTRO_10: - Talk(SAY_ALGALON_OUTRO_5); - events.PopEvent(); - break; - case EVENT_OUTRO_11: - me->SetStandState(UNIT_STAND_STATE_STAND); - me->CastSpell(me, SPELL_TELEPORT, false); - me->DespawnOrUnsummon(3000); - events.PopEvent(); - break; - case EVENT_DESPAWN_ALGALON_1: - Talk(SAY_ALGALON_DESPAWN_1); - events.PopEvent(); - break; - case EVENT_DESPAWN_ALGALON_2: - Talk(SAY_ALGALON_DESPAWN_2); - events.PopEvent(); - break; - case EVENT_DESPAWN_ALGALON_3: - Talk(SAY_ALGALON_DESPAWN_3); - events.PopEvent(); - break; - case EVENT_DESPAWN_ALGALON_4: - me->CastSpell((Unit*)NULL, SPELL_ASCEND_TO_THE_HEAVENS, false); - events.PopEvent(); - break; - case EVENT_DESPAWN_ALGALON_5: - me->SetStandState(UNIT_STAND_STATE_STAND); - me->CastSpell(me, SPELL_TELEPORT, false); - me->DespawnOrUnsummon(3000); - events.PopEvent(); - break; - case EVENT_CHECK_HERALD_ITEMS: - if (DoCheckHeraldOfTheTitans()) - events.PopEvent(); - else - events.RepeatEvent(5000); - break; - } - - DoMeleeAttackIfReady(); + else + events.RepeatEvent(5000); + break; } - }; - CreatureAI* GetAI(Creature* creature) const - { - return new boss_algalon_the_observerAI(creature); + DoMeleeAttackIfReady(); } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_algalon_the_observerAI(creature); + } }; class npc_brann_bronzebeard_algalon : public CreatureScript { - public: - npc_brann_bronzebeard_algalon() : CreatureScript("npc_brann_bronzebeard_algalon") { } +public: + npc_brann_bronzebeard_algalon() : CreatureScript("npc_brann_bronzebeard_algalon") { } - struct npc_brann_bronzebeard_algalonAI : public CreatureAI + struct npc_brann_bronzebeard_algalonAI : public CreatureAI + { + npc_brann_bronzebeard_algalonAI(Creature* creature) : CreatureAI(creature) { - npc_brann_bronzebeard_algalonAI(Creature* creature) : CreatureAI(creature) - { - } - - EventMap events; - uint32 _currentPoint; - - void DoAction(int32 action) - { - switch (action) - { - case ACTION_START_INTRO: - me->SetWalk(false); - _currentPoint = 0; - events.Reset(); - events.ScheduleEvent(EVENT_BRANN_MOVE_INTRO, 1); - break; - case ACTION_FINISH_INTRO: - Talk(SAY_BRANN_ALGALON_INTRO_2); - events.ScheduleEvent(EVENT_BRANN_MOVE_INTRO, 1); - break; - case ACTION_OUTRO: - me->GetMotionMaster()->MovePoint(POINT_BRANN_OUTRO, BrannOutroPos[1]); - events.ScheduleEvent(EVENT_BRANN_OUTRO_1, 87500); - events.ScheduleEvent(EVENT_BRANN_OUTRO_2, 116500); - break; - } - } - - void MovementInform(uint32 movementType, uint32 pointId) - { - if (movementType != POINT_MOTION_TYPE) - return; - - uint32 delay = 1; - _currentPoint = pointId + 1; - switch (pointId) - { - case 2: - delay = 8000; - me->SetWalk(true); - break; - case 6: - me->SetFacingTo(4.6156f); - me->SetWalk(false); - Talk(SAY_BRANN_ALGALON_INTRO_1); - events.ScheduleEvent(EVENT_SUMMON_ALGALON, 7500); - return; - case 10: - me->DespawnOrUnsummon(1); - return; - case POINT_BRANN_OUTRO: - case POINT_BRANN_OUTRO_END: - return; - } - - events.ScheduleEvent(EVENT_BRANN_MOVE_INTRO, delay); - } - - void UpdateAI(uint32 diff) - { - UpdateVictim(); - events.Update(diff); - - switch (events.GetEvent()) - { - case EVENT_BRANN_MOVE_INTRO: - events.PopEvent(); - if (_currentPoint < MAX_BRANN_WAYPOINTS_INTRO) - me->GetMotionMaster()->MovePoint(_currentPoint, BrannIntroWaypoint[_currentPoint]); - break; - case EVENT_SUMMON_ALGALON: - if (me->GetInstanceScript() && !me->GetInstanceScript()->GetData64(TYPE_ALGALON)) - if (Creature* algalon = me->GetMap()->SummonCreature(NPC_ALGALON, AlgalonSummonPos)) - algalon->AI()->DoAction(ACTION_START_INTRO); - events.PopEvent(); - break; - case EVENT_BRANN_OUTRO_1: - Talk(SAY_BRANN_ALGALON_OUTRO); - events.PopEvent(); - break; - case EVENT_BRANN_OUTRO_2: - me->GetMotionMaster()->MovePoint(POINT_BRANN_OUTRO_END, BrannOutroPos[2]); - events.PopEvent(); - break; - } - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_brann_bronzebeard_algalonAI(creature); } + + EventMap events; + uint32 _currentPoint; + + void DoAction(int32 action) + { + switch (action) + { + case ACTION_START_INTRO: + me->SetWalk(false); + _currentPoint = 0; + events.Reset(); + events.ScheduleEvent(EVENT_BRANN_MOVE_INTRO, 1); + break; + case ACTION_FINISH_INTRO: + Talk(SAY_BRANN_ALGALON_INTRO_2); + events.ScheduleEvent(EVENT_BRANN_MOVE_INTRO, 1); + break; + case ACTION_OUTRO: + me->GetMotionMaster()->MovePoint(POINT_BRANN_OUTRO, BrannOutroPos[1]); + events.ScheduleEvent(EVENT_BRANN_OUTRO_1, 87500); + events.ScheduleEvent(EVENT_BRANN_OUTRO_2, 116500); + break; + } + } + + void MovementInform(uint32 movementType, uint32 pointId) + { + if (movementType != POINT_MOTION_TYPE) + return; + + uint32 delay = 1; + _currentPoint = pointId + 1; + switch (pointId) + { + case 2: + delay = 8000; + me->SetWalk(true); + break; + case 6: + me->SetFacingTo(4.6156f); + me->SetWalk(false); + Talk(SAY_BRANN_ALGALON_INTRO_1); + events.ScheduleEvent(EVENT_SUMMON_ALGALON, 7500); + return; + case 10: + me->DespawnOrUnsummon(1); + return; + case POINT_BRANN_OUTRO: + case POINT_BRANN_OUTRO_END: + return; + } + + events.ScheduleEvent(EVENT_BRANN_MOVE_INTRO, delay); + } + + void UpdateAI(uint32 diff) + { + UpdateVictim(); + events.Update(diff); + + switch (events.GetEvent()) + { + case EVENT_BRANN_MOVE_INTRO: + events.PopEvent(); + if (_currentPoint < MAX_BRANN_WAYPOINTS_INTRO) + me->GetMotionMaster()->MovePoint(_currentPoint, BrannIntroWaypoint[_currentPoint]); + break; + case EVENT_SUMMON_ALGALON: + if (me->GetInstanceScript() && !me->GetInstanceScript()->GetData64(TYPE_ALGALON)) + if (Creature* algalon = me->GetMap()->SummonCreature(NPC_ALGALON, AlgalonSummonPos)) + algalon->AI()->DoAction(ACTION_START_INTRO); + events.PopEvent(); + break; + case EVENT_BRANN_OUTRO_1: + Talk(SAY_BRANN_ALGALON_OUTRO); + events.PopEvent(); + break; + case EVENT_BRANN_OUTRO_2: + me->GetMotionMaster()->MovePoint(POINT_BRANN_OUTRO_END, BrannOutroPos[2]); + events.PopEvent(); + break; + } + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_brann_bronzebeard_algalonAI(creature); + } }; class npc_collapsing_star : public CreatureScript { - public: - npc_collapsing_star() : CreatureScript("npc_collapsing_star") { } +public: + npc_collapsing_star() : CreatureScript("npc_collapsing_star") { } - struct npc_collapsing_starAI : public NullCreatureAI + struct npc_collapsing_starAI : public NullCreatureAI + { + npc_collapsing_starAI(Creature* creature) : NullCreatureAI(creature) { - npc_collapsing_starAI(Creature* creature) : NullCreatureAI(creature) - { - creature->GetMotionMaster()->MoveRandom(25.0f); - creature->CastSpell(creature, SPELL_COLLAPSE, true); - } - - void JustSummoned(Creature* summon) - { - if (TempSummon* summ = me->ToTempSummon()) - if (Creature* algalon = ObjectAccessor::GetCreature(*me, summ->GetSummonerGUID())) - algalon->AI()->JustSummoned(summon); - } - - void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) - { - if (damage >= me->GetHealth()) - { - me->CastSpell(me, SPELL_BLACK_HOLE_SPAWN_VISUAL, true); - me->CastSpell(me, SPELL_SUMMON_BLACK_HOLE, true); - } - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_collapsing_starAI(creature); + creature->GetMotionMaster()->MoveRandom(25.0f); + creature->CastSpell(creature, SPELL_COLLAPSE, true); } + + void JustSummoned(Creature* summon) + { + if (TempSummon* summ = me->ToTempSummon()) + if (Creature* algalon = ObjectAccessor::GetCreature(*me, summ->GetSummonerGUID())) + algalon->AI()->JustSummoned(summon); + } + + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) + { + if (damage >= me->GetHealth()) + { + me->CastSpell(me, SPELL_BLACK_HOLE_SPAWN_VISUAL, true); + me->CastSpell(me, SPELL_SUMMON_BLACK_HOLE, true); + } + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_collapsing_starAI(creature); + } }; class npc_living_constellation : public CreatureScript { - public: - npc_living_constellation() : CreatureScript("npc_living_constellation") { } +public: + npc_living_constellation() : CreatureScript("npc_living_constellation") { } - struct npc_living_constellationAI : public ScriptedAI + struct npc_living_constellationAI : public ScriptedAI + { + npc_living_constellationAI(Creature* creature) : ScriptedAI(creature) { - npc_living_constellationAI(Creature* creature) : ScriptedAI(creature) - { - me->SetReactState(REACT_PASSIVE); - } - - EventMap events; - bool _isActive; - - void Reset() - { - events.Reset(); - events.ScheduleEvent(EVENT_ARCANE_BARRAGE, 2500); - _isActive = false; - } - - uint32 GetData(uint32 /*param*/) const - { - return _isActive; - } - - void DoAction(int32 action) - { - switch (action) - { - case ACTION_ACTIVATE_STAR: - me->SetReactState(REACT_AGGRESSIVE); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); - _isActive = true; - - if (Player* target = SelectTargetFromPlayerList(250.0f)) - { - AttackStart(target); - me->AddThreat(target, 100.0f); - } - me->SetInCombatWithZone(); - break; - case ACTION_BIG_BANG: - events.SetPhase(PHASE_BIG_BANG); - events.DelayEvents(9500); - events.ScheduleEvent(EVENT_RESUME_UPDATING, 9500); - break; - } - } - - void SpellHit(Unit* caster, SpellInfo const* spell) - { - if (spell->Id != SPELL_CONSTELLATION_PHASE_EFFECT || caster->GetTypeId() != TYPEID_UNIT) - return; - - if (InstanceScript* instance = me->GetInstanceScript()) - instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, EVENT_ID_SUPERMASSIVE_START); - - caster->CastSpell((Unit*)NULL, SPELL_BLACK_HOLE_CREDIT, TRIGGERED_FULL_MASK); - caster->ToCreature()->DespawnOrUnsummon(1); - me->DespawnOrUnsummon(1); - if (Creature* voidZone = caster->FindNearestCreature(NPC_ALGALON_VOID_ZONE_VISUAL_STALKER, 10.0f)) - voidZone->DespawnOrUnsummon(1); - } - - void UpdateAI(uint32 diff) - { - if (!(events.GetPhaseMask() & PHASE_MASK_NO_UPDATE) && !UpdateVictim()) - return; - - events.Update(diff); - switch (events.GetEvent()) - { - case EVENT_ARCANE_BARRAGE: - me->CastCustomSpell(SPELL_ARCANE_BARRAGE, SPELLVALUE_MAX_TARGETS, 1, (Unit*)NULL, true); - events.RepeatEvent(2500); - break; - case EVENT_RESUME_UPDATING: - events.SetPhase(0); - events.PopEvent(); - break; - } - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_living_constellationAI(creature); + me->SetReactState(REACT_PASSIVE); } + + EventMap events; + bool _isActive; + + void Reset() + { + events.Reset(); + events.ScheduleEvent(EVENT_ARCANE_BARRAGE, 2500); + _isActive = false; + } + + uint32 GetData(uint32 /*param*/) const + { + return _isActive; + } + + void DoAction(int32 action) + { + switch (action) + { + case ACTION_ACTIVATE_STAR: + me->SetReactState(REACT_AGGRESSIVE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + _isActive = true; + + if (Player* target = SelectTargetFromPlayerList(250.0f)) + { + AttackStart(target); + me->AddThreat(target, 100.0f); + } + me->SetInCombatWithZone(); + break; + case ACTION_BIG_BANG: + events.SetPhase(PHASE_BIG_BANG); + events.DelayEvents(9500); + events.ScheduleEvent(EVENT_RESUME_UPDATING, 9500); + break; + } + } + + void SpellHit(Unit* caster, SpellInfo const* spell) + { + if (spell->Id != SPELL_CONSTELLATION_PHASE_EFFECT || caster->GetTypeId() != TYPEID_UNIT) + return; + + if (InstanceScript* instance = me->GetInstanceScript()) + instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, EVENT_ID_SUPERMASSIVE_START); + + caster->CastSpell((Unit*)NULL, SPELL_BLACK_HOLE_CREDIT, TRIGGERED_FULL_MASK); + caster->ToCreature()->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1); + if (Creature* voidZone = caster->FindNearestCreature(NPC_ALGALON_VOID_ZONE_VISUAL_STALKER, 10.0f)) + voidZone->DespawnOrUnsummon(1); + } + + void UpdateAI(uint32 diff) + { + if (!(events.GetPhaseMask() & PHASE_MASK_NO_UPDATE) && !UpdateVictim()) + return; + + events.Update(diff); + switch (events.GetEvent()) + { + case EVENT_ARCANE_BARRAGE: + me->CastCustomSpell(SPELL_ARCANE_BARRAGE, SPELLVALUE_MAX_TARGETS, 1, (Unit*)NULL, true); + events.RepeatEvent(2500); + break; + case EVENT_RESUME_UPDATING: + events.SetPhase(0); + events.PopEvent(); + break; + } + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_living_constellationAI(creature); + } }; class npc_algalon_worm_hole : public CreatureScript { - public: - npc_algalon_worm_hole() : CreatureScript("npc_algalon_worm_hole") { } +public: + npc_algalon_worm_hole() : CreatureScript("npc_algalon_worm_hole") { } - struct npc_algalon_worm_holeAI : public NullCreatureAI + struct npc_algalon_worm_holeAI : public NullCreatureAI + { + npc_algalon_worm_holeAI(Creature* creature) : NullCreatureAI(creature) { - npc_algalon_worm_holeAI(Creature* creature) : NullCreatureAI(creature) - { - creature->CastSpell(creature, SPELL_WORM_HOLE_TRIGGER, true); - creature->CastSpell(creature, SPELL_SUMMON_VOID_ZONE_VISUAL, true); - } - - uint32 _summonTimer; - - void Reset() - { - _summonTimer = urand(22000, 24000); - } - - void UpdateAI(uint32 diff) - { - _summonTimer += diff; - if (_summonTimer >= 30000) - { - me->CastSpell((Unit*)NULL, SPELL_SUMMON_UNLEASHED_DARK_MATTER, true); - _summonTimer = 0; - } - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_algalon_worm_holeAI(creature); + creature->CastSpell(creature, SPELL_WORM_HOLE_TRIGGER, true); + creature->CastSpell(creature, SPELL_SUMMON_VOID_ZONE_VISUAL, true); } + + uint32 _summonTimer; + + void Reset() + { + _summonTimer = urand(22000, 24000); + } + + void UpdateAI(uint32 diff) + { + _summonTimer += diff; + if (_summonTimer >= 30000) + { + me->CastSpell((Unit*)NULL, SPELL_SUMMON_UNLEASHED_DARK_MATTER, true); + _summonTimer = 0; + } + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_algalon_worm_holeAI(creature); + } }; class go_celestial_planetarium_access : public GameObjectScript { - public: - go_celestial_planetarium_access() : GameObjectScript("go_celestial_planetarium_access") {} +public: + go_celestial_planetarium_access() : GameObjectScript("go_celestial_planetarium_access") {} - struct go_celestial_planetarium_accessAI : public GameObjectAI + struct go_celestial_planetarium_accessAI : public GameObjectAI + { + go_celestial_planetarium_accessAI(GameObject* go) : GameObjectAI(go) { - go_celestial_planetarium_accessAI(GameObject* go) : GameObjectAI(go) - { - _locked = false; - } + _locked = false; + } - EventMap events; - bool _locked; + EventMap events; + bool _locked; - bool GossipHello(Player* player, bool /*reportUse*/) + bool GossipHello(Player* player, bool /*reportUse*/) + { + bool hasKey = true; + if (LockEntry const* lock = sLockStore.LookupEntry(go->GetGOInfo()->goober.lockId)) { - bool hasKey = true; - if (LockEntry const* lock = sLockStore.LookupEntry(go->GetGOInfo()->goober.lockId)) + hasKey = false; + for (uint32 i = 0; i < MAX_LOCK_CASE; ++i) { - hasKey = false; - for (uint32 i = 0; i < MAX_LOCK_CASE; ++i) - { - if (!lock->Index[i]) - continue; + if (!lock->Index[i]) + continue; - if (player->HasItemCount(lock->Index[i])) - { - hasKey = true; - break; - } + if (player->HasItemCount(lock->Index[i])) + { + hasKey = true; + break; } } + } - if (!hasKey) - return false; - - if (_locked) - return false; - _locked = true; - // Start Algalon event - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); - events.ScheduleEvent(EVENT_DESPAWN_CONSOLE, 5000); - if (Creature* brann = go->SummonCreature(NPC_BRANN_BRONZBEARD_ALG, BrannIntroSpawnPos)) - brann->AI()->DoAction(ACTION_START_INTRO); - - if (InstanceScript* instance = go->GetInstanceScript()) - { - instance->SetData(DATA_ALGALON_SUMMON_STATE, 1); - if (GameObject* sigil = ObjectAccessor::GetGameObject(*go, instance->GetData64(GO_DOODAD_UL_SIGILDOOR_01))) - sigil->SetGoState(GO_STATE_ACTIVE); - - if (GameObject* sigil = ObjectAccessor::GetGameObject(*go, instance->GetData64(GO_DOODAD_UL_SIGILDOOR_02))) - sigil->SetGoState(GO_STATE_ACTIVE); - } - + if (!hasKey) return false; - } - void UpdateAI(uint32 diff) + if (_locked) + return false; + _locked = true; + // Start Algalon event + go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); + events.ScheduleEvent(EVENT_DESPAWN_CONSOLE, 5000); + if (Creature* brann = go->SummonCreature(NPC_BRANN_BRONZBEARD_ALG, BrannIntroSpawnPos)) + brann->AI()->DoAction(ACTION_START_INTRO); + + if (InstanceScript* instance = go->GetInstanceScript()) { - if (events.Empty()) - return; + instance->SetData(DATA_ALGALON_SUMMON_STATE, 1); + if (GameObject* sigil = ObjectAccessor::GetGameObject(*go, instance->GetData64(GO_DOODAD_UL_SIGILDOOR_01))) + sigil->SetGoState(GO_STATE_ACTIVE); - events.Update(diff); - switch (events.GetEvent()) - { - case EVENT_DESPAWN_CONSOLE: - go->Delete(); - events.PopEvent(); - break; - } + if (GameObject* sigil = ObjectAccessor::GetGameObject(*go, instance->GetData64(GO_DOODAD_UL_SIGILDOOR_02))) + sigil->SetGoState(GO_STATE_ACTIVE); } - }; - GameObjectAI* GetAI(GameObject* go) const - { - return new go_celestial_planetarium_accessAI(go); + return false; } + + void UpdateAI(uint32 diff) + { + if (events.Empty()) + return; + + events.Update(diff); + switch (events.GetEvent()) + { + case EVENT_DESPAWN_CONSOLE: + go->Delete(); + events.PopEvent(); + break; + } + } + }; + + GameObjectAI* GetAI(GameObject* go) const + { + return new go_celestial_planetarium_accessAI(go); + } }; class spell_algalon_phase_punch : public SpellScriptLoader { - public: - spell_algalon_phase_punch() : SpellScriptLoader("spell_algalon_phase_punch") { } +public: + spell_algalon_phase_punch() : SpellScriptLoader("spell_algalon_phase_punch") { } - class spell_algalon_phase_punch_AuraScript : public AuraScript + class spell_algalon_phase_punch_AuraScript : public AuraScript + { + PrepareAuraScript(spell_algalon_phase_punch_AuraScript); + + void HandlePeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_algalon_phase_punch_AuraScript); - - void HandlePeriodic(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - if (GetStackAmount() != 1) - GetTarget()->RemoveAurasDueToSpell(PhasePunchAlphaId[GetStackAmount() - 2]); - GetTarget()->CastSpell(GetTarget(), PhasePunchAlphaId[GetStackAmount() - 1], TRIGGERED_FULL_MASK); - if (GetStackAmount() == 5) - Remove(AURA_REMOVE_BY_DEFAULT); - } - - void OnRemove(AuraEffect const*, AuraEffectHandleModes) - { - if (GetStackAmount() != 5) - GetTarget()->RemoveAurasDueToSpell(PhasePunchAlphaId[GetStackAmount() - 1]); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_algalon_phase_punch_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - OnEffectRemove += AuraEffectRemoveFn(spell_algalon_phase_punch_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_algalon_phase_punch_AuraScript(); + PreventDefaultAction(); + if (GetStackAmount() != 1) + GetTarget()->RemoveAurasDueToSpell(PhasePunchAlphaId[GetStackAmount() - 2]); + GetTarget()->CastSpell(GetTarget(), PhasePunchAlphaId[GetStackAmount() - 1], TRIGGERED_FULL_MASK); + if (GetStackAmount() == 5) + Remove(AURA_REMOVE_BY_DEFAULT); } + + void OnRemove(AuraEffect const*, AuraEffectHandleModes) + { + if (GetStackAmount() != 5) + GetTarget()->RemoveAurasDueToSpell(PhasePunchAlphaId[GetStackAmount() - 1]); + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_algalon_phase_punch_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + OnEffectRemove += AuraEffectRemoveFn(spell_algalon_phase_punch_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_algalon_phase_punch_AuraScript(); + } }; class spell_algalon_collapse : public SpellScriptLoader { - public: - spell_algalon_collapse() : SpellScriptLoader("spell_algalon_collapse") { } +public: + spell_algalon_collapse() : SpellScriptLoader("spell_algalon_collapse") { } - class spell_algalon_collapse_AuraScript : public AuraScript + class spell_algalon_collapse_AuraScript : public AuraScript + { + PrepareAuraScript(spell_algalon_collapse_AuraScript); + + void HandlePeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_algalon_collapse_AuraScript); - - void HandlePeriodic(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - Unit::DealDamage(GetTarget(), GetTarget(), GetTarget()->CountPctFromMaxHealth(1), NULL, NODAMAGE); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_algalon_collapse_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_algalon_collapse_AuraScript(); + PreventDefaultAction(); + Unit::DealDamage(GetTarget(), GetTarget(), GetTarget()->CountPctFromMaxHealth(1), NULL, NODAMAGE); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_algalon_collapse_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_algalon_collapse_AuraScript(); + } }; class ActiveConstellationFilter { - public: - bool operator()(WorldObject* object) const - { - return object->ToUnit()->GetAI()->GetData(0); - } +public: + bool operator()(WorldObject* object) const + { + return object->ToUnit()->GetAI()->GetData(0); + } }; class spell_algalon_trigger_3_adds : public SpellScriptLoader { - public: - spell_algalon_trigger_3_adds() : SpellScriptLoader("spell_algalon_trigger_3_adds") { } +public: + spell_algalon_trigger_3_adds() : SpellScriptLoader("spell_algalon_trigger_3_adds") { } - class spell_algalon_trigger_3_adds_SpellScript : public SpellScript + class spell_algalon_trigger_3_adds_SpellScript : public SpellScript + { + PrepareSpellScript(spell_algalon_trigger_3_adds_SpellScript); + + void SelectTarget(std::list& targets) { - PrepareSpellScript(spell_algalon_trigger_3_adds_SpellScript); - - void SelectTarget(std::list& targets) - { - targets.remove_if(ActiveConstellationFilter()); - } - - void HandleDummyEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - Creature* target = GetHitCreature(); - if (!target) - return; - - target->AI()->DoAction(ACTION_ACTIVATE_STAR); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_algalon_trigger_3_adds_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); - OnEffectHitTarget += SpellEffectFn(spell_algalon_trigger_3_adds_SpellScript::HandleDummyEffect, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_algalon_trigger_3_adds_SpellScript(); + targets.remove_if(ActiveConstellationFilter()); } + + void HandleDummyEffect(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + Creature* target = GetHitCreature(); + if (!target) + return; + + target->AI()->DoAction(ACTION_ACTIVATE_STAR); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_algalon_trigger_3_adds_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + OnEffectHitTarget += SpellEffectFn(spell_algalon_trigger_3_adds_SpellScript::HandleDummyEffect, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_algalon_trigger_3_adds_SpellScript(); + } }; class spell_algalon_cosmic_smash_damage : public SpellScriptLoader { - public: - spell_algalon_cosmic_smash_damage() : SpellScriptLoader("spell_algalon_cosmic_smash_damage") { } +public: + spell_algalon_cosmic_smash_damage() : SpellScriptLoader("spell_algalon_cosmic_smash_damage") { } - class spell_algalon_cosmic_smash_damage_SpellScript : public SpellScript + class spell_algalon_cosmic_smash_damage_SpellScript : public SpellScript + { + PrepareSpellScript(spell_algalon_cosmic_smash_damage_SpellScript); + + void RecalculateDamage() { - PrepareSpellScript(spell_algalon_cosmic_smash_damage_SpellScript); + if (!GetExplTargetDest() || !GetHitUnit()) + return; - void RecalculateDamage() - { - if (!GetExplTargetDest() || !GetHitUnit()) - return; - - float distance = GetHitUnit()->GetDistance2d(GetExplTargetDest()->GetPositionX(), GetExplTargetDest()->GetPositionY()); - if (distance >= 10.0f) - SetHitDamage(int32(float(GetHitDamage()) / distance)); - else if (distance > 6.0f) - SetHitDamage(int32(float(GetHitDamage()) / distance) * 2); - } - - void Register() - { - OnHit += SpellHitFn(spell_algalon_cosmic_smash_damage_SpellScript::RecalculateDamage); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_algalon_cosmic_smash_damage_SpellScript(); + float distance = GetHitUnit()->GetDistance2d(GetExplTargetDest()->GetPositionX(), GetExplTargetDest()->GetPositionY()); + if (distance >= 10.0f) + SetHitDamage(int32(float(GetHitDamage()) / distance)); + else if (distance > 6.0f) + SetHitDamage(int32(float(GetHitDamage()) / distance) * 2); } + + void Register() + { + OnHit += SpellHitFn(spell_algalon_cosmic_smash_damage_SpellScript::RecalculateDamage); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_algalon_cosmic_smash_damage_SpellScript(); + } }; class spell_algalon_big_bang : public SpellScriptLoader { - public: - spell_algalon_big_bang() : SpellScriptLoader("spell_algalon_big_bang") { } +public: + spell_algalon_big_bang() : SpellScriptLoader("spell_algalon_big_bang") { } - class spell_algalon_big_bang_SpellScript : public SpellScript + class spell_algalon_big_bang_SpellScript : public SpellScript + { + PrepareSpellScript(spell_algalon_big_bang_SpellScript); + + bool Load() { - PrepareSpellScript(spell_algalon_big_bang_SpellScript); - - bool Load() - { - _targetCount = 0; - return true; - } - - void CountTargets(std::list& targets) - { - _targetCount = targets.size(); - } - - void CheckTargets() - { - Unit *caster = GetCaster(); - if (!_targetCount && caster && caster->GetAI()) - caster->GetAI()->DoAction(ACTION_ASCEND); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_algalon_big_bang_SpellScript::CountTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - AfterCast += SpellCastFn(spell_algalon_big_bang_SpellScript::CheckTargets); - } - - uint32 _targetCount; - }; - - SpellScript* GetSpellScript() const - { - return new spell_algalon_big_bang_SpellScript(); + _targetCount = 0; + return true; } + + void CountTargets(std::list& targets) + { + _targetCount = targets.size(); + } + + void CheckTargets() + { + Unit* caster = GetCaster(); + if (!_targetCount && caster && caster->GetAI()) + caster->GetAI()->DoAction(ACTION_ASCEND); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_algalon_big_bang_SpellScript::CountTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + AfterCast += SpellCastFn(spell_algalon_big_bang_SpellScript::CheckTargets); + } + + uint32 _targetCount; + }; + + SpellScript* GetSpellScript() const + { + return new spell_algalon_big_bang_SpellScript(); + } }; class spell_algalon_remove_phase : public SpellScriptLoader { - public: - spell_algalon_remove_phase() : SpellScriptLoader("spell_algalon_remove_phase") { } +public: + spell_algalon_remove_phase() : SpellScriptLoader("spell_algalon_remove_phase") { } - class spell_algalon_remove_phase_AuraScript : public AuraScript + class spell_algalon_remove_phase_AuraScript : public AuraScript + { + PrepareAuraScript(spell_algalon_remove_phase_AuraScript); + + void HandlePeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_algalon_remove_phase_AuraScript); - - void HandlePeriodic(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - GetTarget()->RemoveAurasByType(SPELL_AURA_PHASE); - GetTarget()->RemoveAurasDueToSpell(SPELL_BLACK_HOLE_DAMAGE); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_algalon_remove_phase_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_algalon_remove_phase_AuraScript(); + PreventDefaultAction(); + GetTarget()->RemoveAurasByType(SPELL_AURA_PHASE); + GetTarget()->RemoveAurasDueToSpell(SPELL_BLACK_HOLE_DAMAGE); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_algalon_remove_phase_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_algalon_remove_phase_AuraScript(); + } }; class spell_algalon_supermassive_fail : public SpellScriptLoader { - public: - spell_algalon_supermassive_fail() : SpellScriptLoader("spell_algalon_supermassive_fail") { } +public: + spell_algalon_supermassive_fail() : SpellScriptLoader("spell_algalon_supermassive_fail") { } - class spell_algalon_supermassive_fail_SpellScript : public SpellScript + class spell_algalon_supermassive_fail_SpellScript : public SpellScript + { + PrepareSpellScript(spell_algalon_supermassive_fail_SpellScript); + + void RecalculateDamage() { - PrepareSpellScript(spell_algalon_supermassive_fail_SpellScript); + if (!GetHitPlayer()) + return; - void RecalculateDamage() - { - if (!GetHitPlayer()) - return; - - GetHitPlayer()->ResetAchievementCriteria(ACHIEVEMENT_CRITERIA_CONDITION_NO_SPELL_HIT, GetSpellInfo()->Id, true); - } - - void Register() - { - OnHit += SpellHitFn(spell_algalon_supermassive_fail_SpellScript::RecalculateDamage); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_algalon_supermassive_fail_SpellScript(); + GetHitPlayer()->ResetAchievementCriteria(ACHIEVEMENT_CRITERIA_CONDITION_NO_SPELL_HIT, GetSpellInfo()->Id, true); } + + void Register() + { + OnHit += SpellHitFn(spell_algalon_supermassive_fail_SpellScript::RecalculateDamage); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_algalon_supermassive_fail_SpellScript(); + } }; class achievement_algalon_he_feeds_on_your_tears : public AchievementCriteriaScript { - public: - achievement_algalon_he_feeds_on_your_tears() : AchievementCriteriaScript("achievement_algalon_he_feeds_on_your_tears") { } +public: + achievement_algalon_he_feeds_on_your_tears() : AchievementCriteriaScript("achievement_algalon_he_feeds_on_your_tears") { } - bool OnCheck(Player*, Unit* target /*Algalon*/) - { - return target && target->GetAI()->GetData(DATA_HAS_FED_ON_TEARS); - } + bool OnCheck(Player*, Unit* target /*Algalon*/) + { + return target && target->GetAI()->GetData(DATA_HAS_FED_ON_TEARS); + } }; class achievement_algalon_herald_of_the_titans : public AchievementCriteriaScript { - public: - achievement_algalon_herald_of_the_titans() : AchievementCriteriaScript("achievement_algalon_herald_of_the_titans") { } +public: + achievement_algalon_herald_of_the_titans() : AchievementCriteriaScript("achievement_algalon_herald_of_the_titans") { } - bool OnCheck(Player*, Unit* target /*Algalon*/) - { - return target && target->GetAI()->GetData(DATA_HERALD_OF_THE_TITANS); - } + bool OnCheck(Player*, Unit* target /*Algalon*/) + { + return target && target->GetAI()->GetData(DATA_HERALD_OF_THE_TITANS); + } }; void AddSC_boss_algalon_the_observer() diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp index 8681ee3fa..fea3e0d80 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp @@ -129,16 +129,16 @@ enum Misc bool IsEncounterComplete(InstanceScript* pInstance, Creature* me) { - if (!pInstance || !me) + if (!pInstance || !me) return false; for (uint8 i = 0; i < 3; ++i) { - uint64 guid = pInstance->GetData64(DATA_STEELBREAKER+i); + uint64 guid = pInstance->GetData64(DATA_STEELBREAKER + i); if (!guid) return false; - if (Creature *boss = (ObjectAccessor::GetCreature(*me, guid))) + if (Creature* boss = (ObjectAccessor::GetCreature(*me, guid))) { if (boss->IsAlive()) return false; @@ -157,18 +157,18 @@ void RespawnAssemblyOfIron(InstanceScript* pInstance, Creature* me) for (uint8 i = 0; i < 3; ++i) { - uint64 guid = pInstance->GetData64(DATA_STEELBREAKER+i); + uint64 guid = pInstance->GetData64(DATA_STEELBREAKER + i); if (!guid) return; - if (Creature *boss = (ObjectAccessor::GetCreature((*me), guid))) + if (Creature* boss = (ObjectAccessor::GetCreature((*me), guid))) if (!boss->IsAlive()) boss->Respawn(); } return; } -void RestoreAssemblyHealth(uint64 guid1, uint64 guid2, Creature *me) +void RestoreAssemblyHealth(uint64 guid1, uint64 guid2, Creature* me) { if(Creature* cr = ObjectAccessor::GetCreature(*me, guid1)) if(cr->IsAlive()) @@ -192,7 +192,7 @@ public: struct boss_steelbreakerAI : public ScriptedAI { - boss_steelbreakerAI(Creature *c) : ScriptedAI(c) + boss_steelbreakerAI(Creature* c) : ScriptedAI(c) { pInstance = c->GetInstanceScript(); } @@ -222,7 +222,7 @@ public: { if (pInstance) pInstance->SetData(TYPE_ASSEMBLY, IN_PROGRESS); - + me->setActive(true); me->SetInCombatWithZone(); me->CastSpell(me, SPELL_HIGH_VOLTAGE, true); @@ -232,24 +232,24 @@ public: if (!pInstance) return; - if (Creature *boss = ObjectAccessor::GetCreature(*me, pInstance->GetData64(DATA_STEELBREAKER+urand(0,2)))) + if (Creature* boss = ObjectAccessor::GetCreature(*me, pInstance->GetData64(DATA_STEELBREAKER + urand(0, 2)))) { switch (boss->GetEntry()) { - case NPC_STEELBREAKER: - boss->AI()->Talk(SAY_STEELBREAKER_AGGRO); - break; - case NPC_MOLGEIM: - boss->AI()->Talk(SAY_MOLGEIM_AGGRO); - break; - case NPC_BRUNDIR: - boss->AI()->Talk(SAY_BRUNDIR_AGGRO); - break; + case NPC_STEELBREAKER: + boss->AI()->Talk(SAY_STEELBREAKER_AGGRO); + break; + case NPC_MOLGEIM: + boss->AI()->Talk(SAY_MOLGEIM_AGGRO); + break; + case NPC_BRUNDIR: + boss->AI()->Talk(SAY_BRUNDIR_AGGRO); + break; } } for (uint8 i = 0; i < 3; ++i) - if (Creature *boss = ObjectAccessor::GetCreature(*me, pInstance->GetData64(DATA_STEELBREAKER+i))) + if (Creature* boss = ObjectAccessor::GetCreature(*me, pInstance->GetData64(DATA_STEELBREAKER + i))) if (!boss->IsInCombat()) boss->AI()->AttackStart(who); } @@ -331,13 +331,13 @@ public: { case EVENT_FUSION_PUNCH: me->CastSpell(me->GetVictim(), SPELL_FUSION_PUNCH, false); - events.RepeatEvent(urand(15000,20000)); + events.RepeatEvent(urand(15000, 20000)); break; case EVENT_STATIC_DISRUPTION: - if (Unit *pTarget = SelectTarget(SELECT_TARGET_FARTHEST, 0, 0, true)) + if (Unit* pTarget = SelectTarget(SELECT_TARGET_FARTHEST, 0, 0, true)) me->CastSpell(pTarget, SPELL_STATIC_DISRUPTION, false); - events.RepeatEvent(urand(20000,40000)); + events.RepeatEvent(urand(20000, 40000)); break; case EVENT_OVERWHELMING_POWER: Talk(SAY_STEELBREAKER_POWER); @@ -358,18 +358,18 @@ public: class CastRunesEvent : public BasicEvent { - public: - CastRunesEvent(Creature& owner) : BasicEvent(), _owner(owner) { } +public: + CastRunesEvent(Creature& owner) : BasicEvent(), _owner(owner) { } - bool Execute(uint64 /*eventTime*/, uint32 /*diff*/) override - { - if (!_owner.IsInCombat()) - _owner.CastSpell(&_owner, SPELL_RUNE_OF_POWER_OOC_CHANNEL, true); - return true; - } + bool Execute(uint64 /*eventTime*/, uint32 /*diff*/) override + { + if (!_owner.IsInCombat()) + _owner.CastSpell(&_owner, SPELL_RUNE_OF_POWER_OOC_CHANNEL, true); + return true; + } - private: - Creature& _owner; +private: + Creature& _owner; }; class boss_runemaster_molgeim : public CreatureScript @@ -384,7 +384,7 @@ public: struct boss_runemaster_molgeimAI : public ScriptedAI { - boss_runemaster_molgeimAI(Creature *c) : ScriptedAI(c), summons(me) + boss_runemaster_molgeimAI(Creature* c) : ScriptedAI(c), summons(me) { pInstance = c->GetInstanceScript(); } @@ -402,7 +402,7 @@ public: _phase = 0; events.Reset(); summons.DespawnAll(); - + if (pInstance) pInstance->SetData(TYPE_ASSEMBLY, NOT_STARTED); @@ -427,7 +427,7 @@ public: return; for (uint8 i = 0; i < 3; ++i) - if (Creature* boss = ObjectAccessor::GetCreature(*me, pInstance->GetData64(DATA_STEELBREAKER+i))) + if (Creature* boss = ObjectAccessor::GetCreature(*me, pInstance->GetData64(DATA_STEELBREAKER + i))) if (!boss->IsInCombat()) boss->AI()->AttackStart(who); } @@ -450,7 +450,7 @@ public: break; case 3: me->ResetLootMode(); - events.RescheduleEvent(EVENT_RUNE_OF_SUMMONING, urand(20000,30000)); + events.RescheduleEvent(EVENT_RUNE_OF_SUMMONING, urand(20000, 30000)); break; } } @@ -500,31 +500,31 @@ public: switch(events.GetEvent()) { case EVENT_RUNE_OF_POWER: - { - Unit* target = DoSelectLowestHpFriendly(60); - if (!target || !target->IsAlive()) - target = me; + { + Unit* target = DoSelectLowestHpFriendly(60); + if (!target || !target->IsAlive()) + target = me; - me->CastSpell(target, SPELL_RUNE_OF_POWER, true); - events.RepeatEvent(60000); - break; - } + me->CastSpell(target, SPELL_RUNE_OF_POWER, true); + events.RepeatEvent(60000); + break; + } case EVENT_SHIELD_OF_RUNES: me->CastSpell(me, SPELL_SHIELD_OF_RUNES, false); - events.RescheduleEvent(EVENT_SHIELD_OF_RUNES, urand(27000,34000)); + events.RescheduleEvent(EVENT_SHIELD_OF_RUNES, urand(27000, 34000)); break; case EVENT_RUNE_OF_DEATH: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) me->CastSpell(target, SPELL_RUNE_OF_DEATH, true); Talk(SAY_MOLGEIM_RUNE_DEATH); - events.RepeatEvent(urand(30000,40000)); + events.RepeatEvent(urand(30000, 40000)); break; case EVENT_RUNE_OF_SUMMONING: Talk(SAY_MOLGEIM_SUMMON); if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - me->CastSpell(target,SPELL_RUNE_OF_SUMMONING); - events.RepeatEvent(urand(30000,45000)); + me->CastSpell(target, SPELL_RUNE_OF_SUMMONING); + events.RepeatEvent(urand(30000, 45000)); break; case EVENT_ENRAGE: me->CastSpell(me, SPELL_BERSERK, true); @@ -550,7 +550,7 @@ public: struct npc_assembly_lightningAI : public ScriptedAI { - npc_assembly_lightningAI(Creature *c) : ScriptedAI(c) + npc_assembly_lightningAI(Creature* c) : ScriptedAI(c) { _boomed = false; } @@ -595,7 +595,7 @@ public: struct boss_stormcaller_brundirAI : public ScriptedAI { - boss_stormcaller_brundirAI(Creature *c) : ScriptedAI(c) + boss_stormcaller_brundirAI(Creature* c) : ScriptedAI(c) { pInstance = c->GetInstanceScript(); } @@ -621,7 +621,7 @@ public: _stunnedAchievement = true; events.Reset(); - + me->SetDisableGravity(false); me->SetRegeneratingHealth(true); me->SetReactState(REACT_AGGRESSIVE); @@ -649,7 +649,7 @@ public: return; for (uint8 i = 0; i < 3; ++i) - if (Creature *boss = ObjectAccessor::GetCreature(*me, pInstance->GetData64(DATA_STEELBREAKER+i))) + if (Creature* boss = ObjectAccessor::GetCreature(*me, pInstance->GetData64(DATA_STEELBREAKER + i))) if (!boss->IsInCombat()) boss->AI()->AttackStart(who); } @@ -664,16 +664,16 @@ public: switch (_phase) { case 1: - events.RescheduleEvent(EVENT_CHAIN_LIGHTNING, urand(9000,17000)); - events.RescheduleEvent(EVENT_OVERLOAD, urand(25000,40000)); + events.RescheduleEvent(EVENT_CHAIN_LIGHTNING, urand(9000, 17000)); + events.RescheduleEvent(EVENT_OVERLOAD, urand(25000, 40000)); break; case 2: - events.RescheduleEvent(EVENT_LIGHTNING_WHIRL, urand(20000,40000)); + events.RescheduleEvent(EVENT_LIGHTNING_WHIRL, urand(20000, 40000)); break; case 3: me->ResetLootMode(); me->CastSpell(me, SPELL_STORMSHIELD, true); - events.RescheduleEvent(EVENT_LIGHTNING_TENDRILS, urand(15000,16000)); + events.RescheduleEvent(EVENT_LIGHTNING_TENDRILS, urand(15000, 16000)); break; } } @@ -699,7 +699,7 @@ public: void KilledUnit(Unit* who) override { - if (who->GetTypeId() != TYPEID_PLAYER || urand(0,2)) + if (who->GetTypeId() != TYPEID_PLAYER || urand(0, 2)) return; Talk(SAY_BRUNDIR_SLAY); @@ -741,19 +741,19 @@ public: _channelTimer = 0; float o = urand(0, 5) * M_PI / 3.0f; me->InterruptNonMeleeSpells(false); - me->GetMotionMaster()->MovePoint(POINT_CHANNEL_STEELBREAKER, 1587.18f + 10.0f*cos(o), 121.02f + 10.0f*sin(o), 427.3f); + me->GetMotionMaster()->MovePoint(POINT_CHANNEL_STEELBREAKER, 1587.18f + 10.0f * cos(o), 121.02f + 10.0f * sin(o), 427.3f); } } if (!UpdateVictim()) return; - + if (_flyPhase) { if (_flyTarget && me->GetDistance2d(_flyTarget) >= 6 ) { //float speed = me->GetDistance(_flyTarget->GetPositionX(), _flyTarget->GetPositionY(), _flyTarget->GetPositionZ()+15) / (1500.0f * 0.001f); - me->SendMonsterMove(_flyTarget->GetPositionX(), _flyTarget->GetPositionY(), _flyTarget->GetPositionZ()+15, 1500, SPLINEFLAG_FLYING); + me->SendMonsterMove(_flyTarget->GetPositionX(), _flyTarget->GetPositionY(), _flyTarget->GetPositionZ() + 15, 1500, SPLINEFLAG_FLYING); me->SetPosition(_flyTarget->GetPositionX(), _flyTarget->GetPositionY(), _flyTarget->GetPositionZ(), _flyTarget->GetOrientation()); } } @@ -768,7 +768,7 @@ public: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) me->CastSpell(target, SPELL_CHAIN_LIGHTNING, false); - events.RepeatEvent(urand(9000,17000)); + events.RepeatEvent(urand(9000, 17000)); break; case EVENT_IMMUNE: me->ApplySpellImmune(1, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, false); @@ -778,49 +778,49 @@ public: me->ApplySpellImmune(1, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, true); Talk(EMOTE_BRUNDIR_OVERLOAD); me->CastSpell(me, SPELL_OVERLOAD, true); - events.RescheduleEvent(EVENT_OVERLOAD, urand(25000,40000)); + events.RescheduleEvent(EVENT_OVERLOAD, urand(25000, 40000)); events.RescheduleEvent(EVENT_IMMUNE, 5999); break; case EVENT_LIGHTNING_WHIRL: Talk(SAY_BRUNDIR_SPECIAL); me->CastSpell(me, SPELL_LIGHTNING_WHIRL, true); - events.RepeatEvent(urand(10000,25000)); + events.RepeatEvent(urand(10000, 25000)); break; case EVENT_LIGHTNING_TENDRILS: - { - // Reschedule old - events.RepeatEvent(35000); - events.DelayEvents(18000); - Talk(SAY_BRUNDIR_FLIGHT); - - _flyPhase = true; - _flyTarget = me->GetVictim(); - me->SetRegeneratingHealth(false); - me->SetDisableGravity(true); + { + // Reschedule old + events.RepeatEvent(35000); + events.DelayEvents(18000); + Talk(SAY_BRUNDIR_FLIGHT); - me->CombatStop(); - me->StopMoving(); - me->SetReactState(REACT_PASSIVE); - me->SetUInt64Value(UNIT_FIELD_TARGET, 0); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED); - me->SendMonsterMove(_flyTarget->GetPositionX(), _flyTarget->GetPositionY(), _flyTarget->GetPositionZ()+15, 1500, SPLINEFLAG_FLYING); - - me->CastSpell(me, SPELL_LIGHTNING_TENDRILS, true); - me->CastSpell(me, 61883, true); - events.ScheduleEvent(EVENT_LIGHTNING_LAND, 16000); - - me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, true); - break; - } + _flyPhase = true; + _flyTarget = me->GetVictim(); + me->SetRegeneratingHealth(false); + me->SetDisableGravity(true); + + me->CombatStop(); + me->StopMoving(); + me->SetReactState(REACT_PASSIVE); + me->SetUInt64Value(UNIT_FIELD_TARGET, 0); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED); + me->SendMonsterMove(_flyTarget->GetPositionX(), _flyTarget->GetPositionY(), _flyTarget->GetPositionZ() + 15, 1500, SPLINEFLAG_FLYING); + + me->CastSpell(me, SPELL_LIGHTNING_TENDRILS, true); + me->CastSpell(me, 61883, true); + events.ScheduleEvent(EVENT_LIGHTNING_LAND, 16000); + + me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, true); + break; + } case EVENT_LIGHTNING_LAND: - { - float speed = me->GetDistance(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()) / (1000.0f * 0.001f); - me->MonsterMoveWithSpeed(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), speed); - _flyPhase = false; - events.ScheduleEvent(EVENT_LAND_LAND, 1000); - events.PopEvent(); - break; - } + { + float speed = me->GetDistance(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()) / (1000.0f * 0.001f); + me->MonsterMoveWithSpeed(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), speed); + _flyPhase = false; + events.ScheduleEvent(EVENT_LAND_LAND, 1000); + events.PopEvent(); + break; + } case EVENT_LAND_LAND: me->SetCanFly(false); me->SetReactState(REACT_AGGRESSIVE); @@ -851,129 +851,129 @@ public: class spell_shield_of_runes : public SpellScriptLoader { - public: - spell_shield_of_runes() : SpellScriptLoader("spell_shield_of_runes") { } +public: + spell_shield_of_runes() : SpellScriptLoader("spell_shield_of_runes") { } - class spell_shield_of_runes_AuraScript : public AuraScript + class spell_shield_of_runes_AuraScript : public AuraScript + { + PrepareAuraScript(spell_shield_of_runes_AuraScript); + + void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_shield_of_runes_AuraScript); - - void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - if (Unit* owner = GetUnitOwner()) - if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_ENEMY_SPELL && aurEff->GetAmount() <= 0) - owner->CastSpell(owner, SPELL_SHIELD_OF_RUNES_BUFF, false); - } - - void Register() override - { - AfterEffectRemove += AuraEffectRemoveFn(spell_shield_of_runes_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_shield_of_runes_AuraScript(); + if (Unit* owner = GetUnitOwner()) + if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_ENEMY_SPELL && aurEff->GetAmount() <= 0) + owner->CastSpell(owner, SPELL_SHIELD_OF_RUNES_BUFF, false); } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_shield_of_runes_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_shield_of_runes_AuraScript(); + } }; class spell_assembly_meltdown : public SpellScriptLoader { - public: - spell_assembly_meltdown() : SpellScriptLoader("spell_assembly_meltdown") { } +public: + spell_assembly_meltdown() : SpellScriptLoader("spell_assembly_meltdown") { } - class spell_assembly_meltdown_SpellScript : public SpellScript + class spell_assembly_meltdown_SpellScript : public SpellScript + { + PrepareSpellScript(spell_assembly_meltdown_SpellScript); + + void HandleInstaKill(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_assembly_meltdown_SpellScript); - - void HandleInstaKill(SpellEffIndex /*effIndex*/) - { - if (InstanceScript* instance = GetCaster()->GetInstanceScript()) - if (Creature* Steelbreaker = ObjectAccessor::GetCreature(*GetCaster(), instance->GetData64(DATA_STEELBREAKER))) - Steelbreaker->AI()->DoAction(ACTION_ADD_CHARGE); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_assembly_meltdown_SpellScript::HandleInstaKill, EFFECT_1, SPELL_EFFECT_INSTAKILL); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_assembly_meltdown_SpellScript(); + if (InstanceScript* instance = GetCaster()->GetInstanceScript()) + if (Creature* Steelbreaker = ObjectAccessor::GetCreature(*GetCaster(), instance->GetData64(DATA_STEELBREAKER))) + Steelbreaker->AI()->DoAction(ACTION_ADD_CHARGE); } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_assembly_meltdown_SpellScript::HandleInstaKill, EFFECT_1, SPELL_EFFECT_INSTAKILL); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_assembly_meltdown_SpellScript(); + } }; class spell_assembly_rune_of_summoning : public SpellScriptLoader { - public: - spell_assembly_rune_of_summoning() : SpellScriptLoader("spell_assembly_rune_of_summoning") { } +public: + spell_assembly_rune_of_summoning() : SpellScriptLoader("spell_assembly_rune_of_summoning") { } - class spell_assembly_rune_of_summoning_AuraScript : public AuraScript + class spell_assembly_rune_of_summoning_AuraScript : public AuraScript + { + PrepareAuraScript(spell_assembly_rune_of_summoning_AuraScript); + + void OnPeriodic(AuraEffect const* aurEff) { - PrepareAuraScript(spell_assembly_rune_of_summoning_AuraScript); - - void OnPeriodic(AuraEffect const* aurEff) - { - PreventDefaultAction(); - if (aurEff->GetTickNumber() % 2 == 0) - GetTarget()->CastSpell(GetTarget(), SPELL_RUNE_OF_SUMMONING_SUMMON, true, nullptr, aurEff, GetTarget()->IsSummon() ? GetTarget()->ToTempSummon()->GetSummonerGUID() : 0); - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (TempSummon* summ = GetTarget()->ToTempSummon()) - summ->DespawnOrUnsummon(1); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_assembly_rune_of_summoning_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - OnEffectRemove += AuraEffectRemoveFn(spell_assembly_rune_of_summoning_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_assembly_rune_of_summoning_AuraScript(); + PreventDefaultAction(); + if (aurEff->GetTickNumber() % 2 == 0) + GetTarget()->CastSpell(GetTarget(), SPELL_RUNE_OF_SUMMONING_SUMMON, true, nullptr, aurEff, GetTarget()->IsSummon() ? GetTarget()->ToTempSummon()->GetSummonerGUID() : 0); } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (TempSummon* summ = GetTarget()->ToTempSummon()) + summ->DespawnOrUnsummon(1); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_assembly_rune_of_summoning_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + OnEffectRemove += AuraEffectRemoveFn(spell_assembly_rune_of_summoning_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_assembly_rune_of_summoning_AuraScript(); + } }; class achievement_assembly_of_iron : public AchievementCriteriaScript { - public: - achievement_assembly_of_iron(char const* name, uint32 entry) : AchievementCriteriaScript(name), - _targetEntry(entry) - { - } +public: + achievement_assembly_of_iron(char const* name, uint32 entry) : AchievementCriteriaScript(name), + _targetEntry(entry) + { + } - bool OnCheck(Player* /*player*/, Unit* target) override - { - return target && target->GetAuraCount(SPELL_SUPERCHARGE) >= 2 && (!_targetEntry || target->GetEntry() == _targetEntry); - } - - private: - uint32 const _targetEntry; + bool OnCheck(Player* /*player*/, Unit* target) override + { + return target && target->GetAuraCount(SPELL_SUPERCHARGE) >= 2 && (!_targetEntry || target->GetEntry() == _targetEntry); + } + +private: + uint32 const _targetEntry; }; class achievement_cant_do_that_while_stunned : public AchievementCriteriaScript { - public: - achievement_cant_do_that_while_stunned() : AchievementCriteriaScript("achievement_cant_do_that_while_stunned") {} +public: + achievement_cant_do_that_while_stunned() : AchievementCriteriaScript("achievement_cant_do_that_while_stunned") {} - bool OnCheck(Player* /*player*/, Unit* target) override - { - bool allow = target && target->GetAuraCount(SPELL_SUPERCHARGE) >= 2; - if (!allow) - return false; - - if (InstanceScript* instance = target->GetInstanceScript()) - if (Creature* cr = ObjectAccessor::GetCreature(*target, instance->GetData64(DATA_BRUNDIR))) - return cr->AI()->GetData(DATA_BRUNDIR); - + bool OnCheck(Player* /*player*/, Unit* target) override + { + bool allow = target && target->GetAuraCount(SPELL_SUPERCHARGE) >= 2; + if (!allow) return false; - } + + if (InstanceScript* instance = target->GetInstanceScript()) + if (Creature* cr = ObjectAccessor::GetCreature(*target, instance->GetData64(DATA_BRUNDIR))) + return cr->AI()->GetData(DATA_BRUNDIR); + + return false; + } }; void AddSC_boss_assembly_of_iron() diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp index 34ffb1552..84943afc1 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp @@ -125,9 +125,9 @@ public: if (m_pInstance) m_pInstance->SetData(TYPE_AURIAYA, NOT_STARTED); - for (uint8 i = 0; i < RAID_MODE(2,4); ++i) - me->SummonCreature(NPC_SANCTUM_SENTRY, me->GetPositionX()+urand(4,12), me->GetPositionY()+urand(4,12), me->GetPositionZ()); - + for (uint8 i = 0; i < RAID_MODE(2, 4); ++i) + me->SummonCreature(NPC_SANCTUM_SENTRY, me->GetPositionX() + urand(4, 12), me->GetPositionY() + urand(4, 12), me->GetPositionZ()); + me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, false); } @@ -144,7 +144,7 @@ public: void JustSummoned(Creature* cr) { if (cr->GetEntry() == NPC_SANCTUM_SENTRY) - cr->GetMotionMaster()->MoveFollow(me, 6, rand_norm()*2*3.14f); + cr->GetMotionMaster()->MoveFollow(me, 6, rand_norm() * 2 * 3.14f); else cr->SetInCombatWithZone(); @@ -180,10 +180,10 @@ public: void KilledUnit(Unit* /*victim*/) { - if (urand(0,2)) + if (urand(0, 2)) return; - if (urand(0,1)) + if (urand(0, 1)) { me->MonsterYell("The secret dies with you!", LANG_UNIVERSAL, 0); me->PlayDirectSound(SOUND_SLAY1); @@ -195,7 +195,7 @@ public: } } - void JustDied(Unit * /*victim*/) + void JustDied(Unit* /*victim*/) { if (m_pInstance) m_pInstance->SetData(TYPE_AURIAYA, DONE); @@ -256,12 +256,12 @@ public: events.DelayEvents(5000, 0); break; case EVENT_RESPAWN_FERAL_DEFENDER: - { - EntryCheckPredicate pred(NPC_FERAL_DEFENDER); - summons.DoAction(ACTION_FERAL_RESPAWN, pred); - events.PopEvent(); - break; - } + { + EntryCheckPredicate pred(NPC_FERAL_DEFENDER); + summons.DoAction(ACTION_FERAL_RESPAWN, pred); + events.PopEvent(); + break; + } case EVENT_ENRAGE: me->MonsterTextEmote("You waste my time!", 0); me->PlayDirectSound(SOUND_BERSERK); @@ -376,7 +376,7 @@ public: if (_feralEssenceStack) { - if (Creature *cr = me->SummonCreature(NPC_SEEPING_FERAL_ESSENCE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0.0f)) + if (Creature* cr = me->SummonCreature(NPC_SEEPING_FERAL_ESSENCE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0.0f)) summons.Summon(cr); --_feralEssenceStack; @@ -435,60 +435,60 @@ public: class spell_auriaya_sentinel_blast : public SpellScriptLoader { - public: - spell_auriaya_sentinel_blast() : SpellScriptLoader("spell_auriaya_sentinel_blast") { } +public: + spell_auriaya_sentinel_blast() : SpellScriptLoader("spell_auriaya_sentinel_blast") { } - class spell_auriaya_sentinel_blast_SpellScript : public SpellScript + class spell_auriaya_sentinel_blast_SpellScript : public SpellScript + { + PrepareSpellScript(spell_auriaya_sentinel_blast_SpellScript); + + void FilterTargets(std::list& unitList) { - PrepareSpellScript(spell_auriaya_sentinel_blast_SpellScript); - - void FilterTargets(std::list& unitList) - { - unitList.remove_if(PlayerOrPetCheck()); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_auriaya_sentinel_blast_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_auriaya_sentinel_blast_SpellScript(); + unitList.remove_if(PlayerOrPetCheck()); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_auriaya_sentinel_blast_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_auriaya_sentinel_blast_SpellScript(); + } }; class achievement_auriaya_crazy_cat_lady : public AchievementCriteriaScript { - public: - achievement_auriaya_crazy_cat_lady() : AchievementCriteriaScript("achievement_auriaya_crazy_cat_lady") {} +public: + achievement_auriaya_crazy_cat_lady() : AchievementCriteriaScript("achievement_auriaya_crazy_cat_lady") {} - bool OnCheck(Player* /*player*/, Unit* target) - { - if (target) - if (InstanceScript* instance = target->GetInstanceScript()) - if (Creature* cr = ObjectAccessor::GetCreature(*target, instance->GetData64(TYPE_AURIAYA))) - return cr->AI()->GetData(DATA_CRAZY_CAT); - - return false; - } + bool OnCheck(Player* /*player*/, Unit* target) + { + if (target) + if (InstanceScript* instance = target->GetInstanceScript()) + if (Creature* cr = ObjectAccessor::GetCreature(*target, instance->GetData64(TYPE_AURIAYA))) + return cr->AI()->GetData(DATA_CRAZY_CAT); + + return false; + } }; class achievement_auriaya_nine_lives : public AchievementCriteriaScript { - public: - achievement_auriaya_nine_lives() : AchievementCriteriaScript("achievement_auriaya_nine_lives") {} +public: + achievement_auriaya_nine_lives() : AchievementCriteriaScript("achievement_auriaya_nine_lives") {} - bool OnCheck(Player* /*player*/, Unit* target) - { - if (target) - if (InstanceScript* instance = target->GetInstanceScript()) - if (Creature* cr = ObjectAccessor::GetCreature(*target, instance->GetData64(TYPE_AURIAYA))) - return cr->AI()->GetData(DATA_NINE_LIVES); - - return false; - } + bool OnCheck(Player* /*player*/, Unit* target) + { + if (target) + if (InstanceScript* instance = target->GetInstanceScript()) + if (Creature* cr = ObjectAccessor::GetCreature(*target, instance->GetData64(TYPE_AURIAYA))) + return cr->AI()->GetData(DATA_NINE_LIVES); + + return false; + } }; void AddSC_boss_auriaya() 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 7c228f71f..9064c1ba1 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp @@ -435,7 +435,7 @@ public: return; case EVENT_THORIMS_HAMMER: SummonTowerHelpers(TOWER_OF_STORMS); - events.RepeatEvent(60000+rand()%60000); + events.RepeatEvent(60000 + rand() % 60000); me->MonsterTextEmote("Flame Leviathan activates Thorim's Hammer.", 0, true); Talk(FLAME_LEVIATHAN_SAY_TOWER_STORM); return; @@ -478,7 +478,7 @@ public: if (_destroyedTurretCount == RAID_MODE(2, 4)) { _destroyedTurretCount = 0; - me->CastSpell(me,SPELL_SYSTEMS_SHUTDOWN,true); + me->CastSpell(me, SPELL_SYSTEMS_SHUTDOWN, true); } } } @@ -492,7 +492,7 @@ void boss_flame_leviathan::boss_flame_leviathanAI::BindPlayers() void boss_flame_leviathan::boss_flame_leviathanAI::RadioSay(const char* text, uint32 soundId) { - if (Creature *r = me->SummonCreature(NPC_BRANN_RADIO, me->GetPositionX()-150, me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN, 5000)) + if (Creature* r = me->SummonCreature(NPC_BRANN_RADIO, me->GetPositionX() - 150, me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN, 5000)) { WorldPacket data; ChatHandler::BuildChatPacket(data, CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, r, nullptr, text); @@ -511,7 +511,7 @@ void boss_flame_leviathan::boss_flame_leviathanAI::ActivateTowers() { ++_towersCount; - me->AddLootMode(1<<_towersCount); + me->AddLootMode(1 << _towersCount); switch (i) { case EVENT_TOWER_OF_LIFE_DESTROYED: @@ -616,7 +616,7 @@ void boss_flame_leviathan::boss_flame_leviathanAI::SpellHit(Unit* /*caster*/, c Talk(FLAME_LEVIATHAN_SAY_OVERLOAD); events.DelayEvents(20 * IN_MILLISECONDS + 1); - events.ScheduleEvent(EVENT_REINSTALL, 20*IN_MILLISECONDS); + events.ScheduleEvent(EVENT_REINSTALL, 20 * IN_MILLISECONDS); } else if (spellInfo->Id == 62522 /*SPELL_ELECTROSHOCK*/) me->InterruptNonMeleeSpells(false); @@ -654,13 +654,13 @@ void boss_flame_leviathan::boss_flame_leviathanAI::SummonTowerHelpers(uint8 towe if (towerId == TOWER_OF_LIFE) { me->SummonCreature(NPC_FREYA_WARD_TARGET, 374, -141, 411, 0, TEMPSUMMON_MANUAL_DESPAWN); - me->SummonCreature(NPC_FREYA_WARD, 374, -141, 411+40, 0, TEMPSUMMON_MANUAL_DESPAWN); + me->SummonCreature(NPC_FREYA_WARD, 374, -141, 411 + 40, 0, TEMPSUMMON_MANUAL_DESPAWN); me->SummonCreature(NPC_FREYA_WARD_TARGET, 382.9f, 74, 411.6f, 0, TEMPSUMMON_MANUAL_DESPAWN); - me->SummonCreature(NPC_FREYA_WARD, 382.9f, 74, 411.6f+40, 0, TEMPSUMMON_MANUAL_DESPAWN); + me->SummonCreature(NPC_FREYA_WARD, 382.9f, 74, 411.6f + 40, 0, TEMPSUMMON_MANUAL_DESPAWN); me->SummonCreature(NPC_FREYA_WARD_TARGET, 159.4f, 64.1f, 409.8f, 0, TEMPSUMMON_MANUAL_DESPAWN); - me->SummonCreature(NPC_FREYA_WARD, 159.4f, 64.1f, 409.8f+40, 0, TEMPSUMMON_MANUAL_DESPAWN); + me->SummonCreature(NPC_FREYA_WARD, 159.4f, 64.1f, 409.8f + 40, 0, TEMPSUMMON_MANUAL_DESPAWN); me->SummonCreature(NPC_FREYA_WARD_TARGET, 157.7f, -140.26f, 409.8f, 0, TEMPSUMMON_MANUAL_DESPAWN); - me->SummonCreature(NPC_FREYA_WARD, 157.7f, -140.26f, 409.8f+40, 0, TEMPSUMMON_MANUAL_DESPAWN); + me->SummonCreature(NPC_FREYA_WARD, 157.7f, -140.26f, 409.8f + 40, 0, TEMPSUMMON_MANUAL_DESPAWN); } else if (towerId == TOWER_OF_FROST) { @@ -675,7 +675,7 @@ void boss_flame_leviathan::boss_flame_leviathanAI::SummonTowerHelpers(uint8 towe else if (towerId == TOWER_OF_STORMS) { for (uint8 i = 0; i < 8; ++i) - me->SummonCreature(NPC_THORIM_HAMMER_TARGET, 157+rand()%200, -140+rand()%200, 409.8f, 0, TEMPSUMMON_TIMED_DESPAWN, 24000); + me->SummonCreature(NPC_THORIM_HAMMER_TARGET, 157 + rand() % 200, -140 + rand() % 200, 409.8f, 0, TEMPSUMMON_TIMED_DESPAWN, 24000); } } @@ -706,7 +706,7 @@ public: struct boss_flame_leviathan_seatAI : public VehicleAI { - boss_flame_leviathan_seatAI(Creature *creature) : VehicleAI(creature), vehicle(creature->GetVehicleKit()) + boss_flame_leviathan_seatAI(Creature* creature) : VehicleAI(creature), vehicle(creature->GetVehicleKit()) { ASSERT(vehicle); me->SetReactState(REACT_PASSIVE); @@ -766,7 +766,7 @@ public: } else { - turret->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); + turret->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); if (turret->GetTypeId() == TYPEID_UNIT) turret->ToCreature()->AI()->EnterEvadeMode(); } @@ -778,108 +778,108 @@ public: class boss_flame_leviathan_defense_turret : public CreatureScript { - public: - boss_flame_leviathan_defense_turret() : CreatureScript("boss_flame_leviathan_defense_turret") { } +public: + boss_flame_leviathan_defense_turret() : CreatureScript("boss_flame_leviathan_defense_turret") { } - struct boss_flame_leviathan_defense_turretAI : public TurretAI + struct boss_flame_leviathan_defense_turretAI : public TurretAI + { + boss_flame_leviathan_defense_turretAI(Creature* creature) : TurretAI(creature) { - boss_flame_leviathan_defense_turretAI(Creature* creature) : TurretAI(creature) - { - _setHealth = false; - _instance = creature->GetInstanceScript(); - } - - InstanceScript* _instance; - - bool _setHealth; - void DamageTaken(Unit* who, uint32 &damage, DamageEffectType, SpellSchoolMask) override - { - if (!CanAIAttack(who)) - { - _setHealth = true; - damage = 0; - } - } - - void JustDied(Unit* who) override - { - if (Player* killer = who->ToPlayer()) - killer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, 1, 0, me); - - if (Vehicle* vehicle = me->GetVehicle()) - if (Unit* device = vehicle->GetPassenger(SEAT_DEVICE)) - device->SetUInt32Value(UNIT_FIELD_FLAGS, 0); // unselectable - - if (Creature* leviathan = ObjectAccessor::GetCreature(*me, _instance->GetData64(TYPE_LEVIATHAN))) - leviathan->AI()->DoAction(ACTION_DESTROYED_TURRET); - } - - bool CanAIAttack(Unit const* who) const override - { - if (!who || who->GetTypeId() != TYPEID_PLAYER || !who->GetVehicle() || who->GetVehicleBase()->GetEntry() != NPC_SEAT) - return false; - return true; - } - - void UpdateAI(uint32 diff) override - { - if (_setHealth) - { - me->SetHealth(std::min(me->GetHealth()+1, me->GetMaxHealth())); - _setHealth = false; - } - - TurretAI::UpdateAI(diff); - } - - void KilledUnit(Unit* who) override - { - if (Player* plr = who->ToPlayer()) // make sure that there's no death player on the seat. - if (plr->GetVehicle()) - plr->ExitVehicle(); - } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new boss_flame_leviathan_defense_turretAI(creature); + _setHealth = false; + _instance = creature->GetInstanceScript(); } + + InstanceScript* _instance; + + bool _setHealth; + void DamageTaken(Unit* who, uint32& damage, DamageEffectType, SpellSchoolMask) override + { + if (!CanAIAttack(who)) + { + _setHealth = true; + damage = 0; + } + } + + void JustDied(Unit* who) override + { + if (Player* killer = who->ToPlayer()) + killer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, 1, 0, me); + + if (Vehicle* vehicle = me->GetVehicle()) + if (Unit* device = vehicle->GetPassenger(SEAT_DEVICE)) + device->SetUInt32Value(UNIT_FIELD_FLAGS, 0); // unselectable + + if (Creature* leviathan = ObjectAccessor::GetCreature(*me, _instance->GetData64(TYPE_LEVIATHAN))) + leviathan->AI()->DoAction(ACTION_DESTROYED_TURRET); + } + + bool CanAIAttack(Unit const* who) const override + { + if (!who || who->GetTypeId() != TYPEID_PLAYER || !who->GetVehicle() || who->GetVehicleBase()->GetEntry() != NPC_SEAT) + return false; + return true; + } + + void UpdateAI(uint32 diff) override + { + if (_setHealth) + { + me->SetHealth(std::min(me->GetHealth() + 1, me->GetMaxHealth())); + _setHealth = false; + } + + TurretAI::UpdateAI(diff); + } + + void KilledUnit(Unit* who) override + { + if (Player* plr = who->ToPlayer()) // make sure that there's no death player on the seat. + if (plr->GetVehicle()) + plr->ExitVehicle(); + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new boss_flame_leviathan_defense_turretAI(creature); + } }; class boss_flame_leviathan_overload_device : public CreatureScript { - public: - boss_flame_leviathan_overload_device() : CreatureScript("boss_flame_leviathan_overload_device") { } +public: + boss_flame_leviathan_overload_device() : CreatureScript("boss_flame_leviathan_overload_device") { } - struct boss_flame_leviathan_overload_deviceAI : public NullCreatureAI + struct boss_flame_leviathan_overload_deviceAI : public NullCreatureAI + { + boss_flame_leviathan_overload_deviceAI(Creature* creature) : NullCreatureAI(creature) { - boss_flame_leviathan_overload_deviceAI(Creature* creature) : NullCreatureAI(creature) - { - } + } - void OnSpellClick(Unit* /*clicker*/, bool& result) override - { - if (!result) - return; + void OnSpellClick(Unit* /*clicker*/, bool& result) override + { + if (!result) + return; - if (me->GetVehicle()) + if (me->GetVehicle()) + { + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + + if (Unit* player = me->GetVehicle()->GetPassenger(SEAT_PLAYER)) { - me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - - if (Unit* player = me->GetVehicle()->GetPassenger(SEAT_PLAYER)) - { - me->GetVehicleBase()->CastSpell(player, SPELL_SMOKE_TRAIL, true); - player->ExitVehicle(); - } + me->GetVehicleBase()->CastSpell(player, SPELL_SMOKE_TRAIL, true); + player->ExitVehicle(); } } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new boss_flame_leviathan_overload_deviceAI(creature); } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new boss_flame_leviathan_overload_deviceAI(creature); + } }; class npc_freya_ward : public CreatureScript @@ -894,7 +894,7 @@ public: struct npc_freya_wardAI : public NullCreatureAI { - npc_freya_wardAI(Creature *c) : NullCreatureAI(c), summons(c) + npc_freya_wardAI(Creature* c) : NullCreatureAI(c), summons(c) { } @@ -942,7 +942,7 @@ public: } _castTimer += diff; - if (_castTimer >= 29*IN_MILLISECONDS) + if (_castTimer >= 29 * IN_MILLISECONDS) { if (Creature* cr = me->FindNearestCreature(NPC_FREYA_WARD_TARGET, 60.0f, true)) { @@ -953,7 +953,7 @@ public: _castTimer = 0; } } - + void DoAction(int32 param) override { if (param == ACTION_DESPAWN_ADDS) @@ -974,7 +974,7 @@ public: struct npc_hodirs_furyAI : public NullCreatureAI { - npc_hodirs_furyAI(Creature *c) : NullCreatureAI(c) + npc_hodirs_furyAI(Creature* c) : NullCreatureAI(c) { } @@ -1011,7 +1011,7 @@ public: _timeToHit += diff; if (_timeToHit >= 5000) { - if (Creature* cr = me->SummonCreature(NPC_HODIRS_FURY, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+40, 0, TEMPSUMMON_TIMED_DESPAWN, 10000)) + if (Creature* cr = me->SummonCreature(NPC_HODIRS_FURY, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 40, 0, TEMPSUMMON_TIMED_DESPAWN, 10000)) cr->CastSpell(me, SPELL_HODIRS_FURY, true); _switchTargetTimer = 25000; // Switch target soon @@ -1094,7 +1094,7 @@ public: _spellTimer += diff; if (_spellTimer >= 2000) { - if (Creature* cr = me->SummonCreature(NPC_MIMIRONS_INFERNO, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+40.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 30000)) + if (Creature* cr = me->SummonCreature(NPC_MIMIRONS_INFERNO, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 40.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 30000)) cr->CastSpell(me, SPELL_MIMIRONS_INFERNO, true); _spellTimer = 0; @@ -1116,7 +1116,7 @@ public: struct npc_thorims_hammerAI : public NullCreatureAI { - npc_thorims_hammerAI(Creature *c) : NullCreatureAI(c) + npc_thorims_hammerAI(Creature* c) : NullCreatureAI(c) { } @@ -1126,7 +1126,7 @@ public: void Reset() override { - _finishTime = 5000+rand()%15000; + _finishTime = 5000 + rand() % 15000; _beamTimer = 1; _removeTimer = 0; me->CastSpell(me, SPELL_FREYA_DUMMY_BLUE, true); @@ -1139,18 +1139,18 @@ public: _beamTimer += diff; if (_beamTimer >= _finishTime) { - if (Creature* cr = me->SummonCreature(NPC_THORIM_HAMMER, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+40, 0, TEMPSUMMON_TIMED_DESPAWN, 5000)) + if (Creature* cr = me->SummonCreature(NPC_THORIM_HAMMER, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 40, 0, TEMPSUMMON_TIMED_DESPAWN, 5000)) cr->CastSpell(me, SPELL_THORIMS_HAMMER, false); _beamTimer = 0; _removeTimer = 1; - me->DespawnOrUnsummon(5*IN_MILLISECONDS); + me->DespawnOrUnsummon(5 * IN_MILLISECONDS); } } if (_removeTimer) { _removeTimer += diff; - if (_removeTimer >= 3*IN_MILLISECONDS) + if (_removeTimer >= 3 * IN_MILLISECONDS) { _removeTimer = 0; me->RemoveAura(SPELL_FREYA_DUMMY_BLUE); @@ -1172,11 +1172,11 @@ public: struct npc_pool_of_tarAI : public NullCreatureAI { - npc_pool_of_tarAI(Creature *c) : NullCreatureAI(c) + npc_pool_of_tarAI(Creature* c) : NullCreatureAI(c) { } - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask) override + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override { damage = 0; } @@ -1216,7 +1216,7 @@ public: bool OnGossipHello(Player* player, Creature* creature) override { if (creature->GetInstanceScript() && creature->GetInstanceScript()->GetData(TYPE_LEVIATHAN) == NOT_STARTED && !creature->AI()->GetData(DATA_EVENT_STARTED)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Activate secondary defensive systems.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Activate secondary defensive systems.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); SendGossipMenuFor(player, DEFAULT_GOSSIP_MESSAGE, creature->GetGUID()); return true; @@ -1229,7 +1229,7 @@ public: case GOSSIP_ACTION_INFO_DEF+1: creature->MonsterSay("Activating secondary defensive systems will result in the extermination of unauthorized life forms via orbital emplacements. You are an unauthorized life form.", LANG_UNIVERSAL, 0); ClearGossipMenuFor(player); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Confirmed.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Confirmed.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); SendGossipMenuFor(player, DEFAULT_GOSSIP_MESSAGE, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+2: @@ -1348,7 +1348,7 @@ public: break; case 12: _dellorah->AI()->Talk(DELLORAH_SAY_7); - + if (Creature* c = me->FindNearestCreature(NPC_START_BRANN_BRONZEBEARD, 110.0f, true) ) c->AI()->DoAction(ACTION_START_NORGANNON_BRANN); @@ -1657,7 +1657,7 @@ public: if (Unit* target = me->SelectNearbyTarget(nullptr, 80.0f)) { ++_amount; - if (Creature* cr = me->SummonCreature(NPC_DEFENDER_GENERATED, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+4, me->GetOrientation(), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 900000)) + if (Creature* cr = me->SummonCreature(NPC_DEFENDER_GENERATED, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 4, me->GetOrientation(), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 900000)) cr->AI()->AttackStart(target); } } @@ -1678,7 +1678,7 @@ public: struct boss_flame_leviathan_safety_containerAI : public NullCreatureAI { - boss_flame_leviathan_safety_containerAI(Creature *c) : NullCreatureAI(c) + boss_flame_leviathan_safety_containerAI(Creature* c) : NullCreatureAI(c) { _allowTimer = 0; } @@ -1726,9 +1726,9 @@ public: struct npc_mechanoliftAI : public NullCreatureAI { - npc_mechanoliftAI(Creature *c) : NullCreatureAI(c) + npc_mechanoliftAI(Creature* c) : NullCreatureAI(c) { - me->SetSpeed(MOVE_RUN, rand_norm()+0.5f); + me->SetSpeed(MOVE_RUN, rand_norm() + 0.5f); } int32 _startTimer; @@ -1736,7 +1736,7 @@ public: void Reset() override { - _startTimer = urand(1,5000); + _startTimer = urand(1, 5000); _evadeTimer = 0; } @@ -1747,7 +1747,7 @@ public: _startTimer -= diff; if (_startTimer <= 0) { - me->GetMotionMaster()->MovePath(3000000+urand(0,11), true); + me->GetMotionMaster()->MovePath(3000000 + urand(0, 11), true); _startTimer = 0; } } @@ -1764,15 +1764,15 @@ public: class go_ulduar_tower : public GameObjectScript { - public: - go_ulduar_tower() : GameObjectScript("go_ulduar_tower") { } +public: + go_ulduar_tower() : GameObjectScript("go_ulduar_tower") { } - void OnDestroyed(GameObject* go, Player* /*player*/) override - { - Creature* trigger = go->FindNearestCreature(NPC_ULDUAR_GAUNTLET_GENERATOR, 15.0f, true); - if (trigger) - trigger->DisappearAndDie(); - } + void OnDestroyed(GameObject* go, Player* /*player*/) override + { + Creature* trigger = go->FindNearestCreature(NPC_ULDUAR_GAUNTLET_GENERATOR, 15.0f, true); + if (trigger) + trigger->DisappearAndDie(); + } }; class spell_load_into_catapult : public SpellScriptLoader @@ -1782,42 +1782,42 @@ class spell_load_into_catapult : public SpellScriptLoader SPELL_PASSENGER_LOADED = 62340, }; - public: - spell_load_into_catapult() : SpellScriptLoader("spell_load_into_catapult") { } +public: + spell_load_into_catapult() : SpellScriptLoader("spell_load_into_catapult") { } - class spell_load_into_catapult_AuraScript : public AuraScript + class spell_load_into_catapult_AuraScript : public AuraScript + { + PrepareAuraScript(spell_load_into_catapult_AuraScript); + + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_load_into_catapult_AuraScript); + Unit* owner = GetOwner()->ToUnit(); + if (!owner) + return; - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* owner = GetOwner()->ToUnit(); - if (!owner) - return; - - owner->CastSpell(owner, SPELL_PASSENGER_LOADED, true); - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* owner = GetOwner()->ToUnit(); - if (!owner) - return; - - owner->RemoveAurasDueToSpell(SPELL_PASSENGER_LOADED); - } - - void Register() override - { - OnEffectApply += AuraEffectApplyFn(spell_load_into_catapult_AuraScript::OnApply, EFFECT_0, SPELL_AURA_CONTROL_VEHICLE, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_load_into_catapult_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_CONTROL_VEHICLE, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_load_into_catapult_AuraScript(); + owner->CastSpell(owner, SPELL_PASSENGER_LOADED, true); } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* owner = GetOwner()->ToUnit(); + if (!owner) + return; + + owner->RemoveAurasDueToSpell(SPELL_PASSENGER_LOADED); + } + + void Register() override + { + OnEffectApply += AuraEffectApplyFn(spell_load_into_catapult_AuraScript::OnApply, EFFECT_0, SPELL_AURA_CONTROL_VEHICLE, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_load_into_catapult_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_CONTROL_VEHICLE, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_load_into_catapult_AuraScript(); + } }; class spell_auto_repair : public SpellScriptLoader @@ -1827,100 +1827,100 @@ class spell_auto_repair : public SpellScriptLoader SPELL_AUTO_REPAIR = 62705, }; - public: - spell_auto_repair() : SpellScriptLoader("spell_auto_repair") {} +public: + spell_auto_repair() : SpellScriptLoader("spell_auto_repair") {} - class spell_auto_repair_SpellScript : public SpellScript + class spell_auto_repair_SpellScript : public SpellScript + { + PrepareSpellScript(spell_auto_repair_SpellScript); + + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_auto_repair_SpellScript); + std::list tmplist; + for (std::list::iterator itr = targets.begin(); itr != targets.end(); ++itr) + if (!(*itr)->ToUnit()->HasAura(SPELL_AUTO_REPAIR)) + tmplist.push_back(*itr); - void FilterTargets(std::list& targets) - { - std::list tmplist; - for (std::list::iterator itr = targets.begin(); itr != targets.end(); ++itr) - if (!(*itr)->ToUnit()->HasAura(SPELL_AUTO_REPAIR)) - tmplist.push_back(*itr); - - targets.clear(); - for (std::list::iterator itr = tmplist.begin(); itr != tmplist.end(); ++itr) - targets.push_back(*itr); - } - - void HandleScript(SpellEffIndex /*eff*/) - { - Vehicle* vehicle = GetHitUnit()->GetVehicleKit(); - if (!vehicle) - return; - - Player* driver = vehicle->GetPassenger(0) ? vehicle->GetPassenger(0)->ToPlayer() : nullptr; - if (!driver) - return; - - driver->MonsterTextEmote("Automatic repair sequence initiated.", driver, true); - - // Actually should/could use basepoints (100) for this spell effect as percentage of health, but oh well. - vehicle->GetBase()->SetFullHealth(); - - // Achievement - if (InstanceScript* instance = vehicle->GetBase()->GetInstanceScript()) - instance->SetData(DATA_UNBROKEN_ACHIEVEMENT, 0); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_auto_repair_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_DEST_AREA_ENTRY); - OnEffectHitTarget += SpellEffectFn(spell_auto_repair_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_auto_repair_SpellScript(); + targets.clear(); + for (std::list::iterator itr = tmplist.begin(); itr != tmplist.end(); ++itr) + targets.push_back(*itr); } + + void HandleScript(SpellEffIndex /*eff*/) + { + Vehicle* vehicle = GetHitUnit()->GetVehicleKit(); + if (!vehicle) + return; + + Player* driver = vehicle->GetPassenger(0) ? vehicle->GetPassenger(0)->ToPlayer() : nullptr; + if (!driver) + return; + + driver->MonsterTextEmote("Automatic repair sequence initiated.", driver, true); + + // Actually should/could use basepoints (100) for this spell effect as percentage of health, but oh well. + vehicle->GetBase()->SetFullHealth(); + + // Achievement + if (InstanceScript* instance = vehicle->GetBase()->GetInstanceScript()) + instance->SetData(DATA_UNBROKEN_ACHIEVEMENT, 0); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_auto_repair_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_DEST_AREA_ENTRY); + OnEffectHitTarget += SpellEffectFn(spell_auto_repair_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_auto_repair_SpellScript(); + } }; class spell_systems_shutdown : public SpellScriptLoader { - public: - spell_systems_shutdown() : SpellScriptLoader("spell_systems_shutdown") { } +public: + spell_systems_shutdown() : SpellScriptLoader("spell_systems_shutdown") { } - class spell_systems_shutdown_AuraScript : public AuraScript + class spell_systems_shutdown_AuraScript : public AuraScript + { + PrepareAuraScript(spell_systems_shutdown_AuraScript); + + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_systems_shutdown_AuraScript); + Creature* owner = GetOwner()->ToCreature(); + if (!owner) + return; - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Creature* owner = GetOwner()->ToCreature(); - if (!owner) - return; - - owner->SetControlled(true, UNIT_STATE_STUNNED); - owner->RemoveAurasDueToSpell(SPELL_GATHERING_SPEED); - if (Vehicle* veh = owner->GetVehicleKit()) - if (Unit* cannon = veh->GetPassenger(SEAT_CANNON)) - cannon->GetAI()->DoAction(ACTION_DELAY_CANNON); - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Creature* owner = GetOwner()->ToCreature(); - if (!owner) - return; - - owner->SetControlled(false, UNIT_STATE_STUNNED); - } - - void Register() override - { - OnEffectApply += AuraEffectApplyFn(spell_systems_shutdown_AuraScript::OnApply, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_systems_shutdown_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_systems_shutdown_AuraScript(); + owner->SetControlled(true, UNIT_STATE_STUNNED); + owner->RemoveAurasDueToSpell(SPELL_GATHERING_SPEED); + if (Vehicle* veh = owner->GetVehicleKit()) + if (Unit* cannon = veh->GetPassenger(SEAT_CANNON)) + cannon->GetAI()->DoAction(ACTION_DELAY_CANNON); } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Creature* owner = GetOwner()->ToCreature(); + if (!owner) + return; + + owner->SetControlled(false, UNIT_STATE_STUNNED); + } + + void Register() override + { + OnEffectApply += AuraEffectApplyFn(spell_systems_shutdown_AuraScript::OnApply, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_systems_shutdown_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_systems_shutdown_AuraScript(); + } }; class FlameLeviathanPursuedTargetSelector @@ -1930,469 +1930,469 @@ class FlameLeviathanPursuedTargetSelector AREA_FORMATION_GROUNDS = 4652, }; - public: - explicit FlameLeviathanPursuedTargetSelector() {}; +public: + explicit FlameLeviathanPursuedTargetSelector() {}; - bool operator()(WorldObject* target) const - { - //! No players, only vehicles (todo: check if blizzlike) - Creature* creatureTarget = target->ToCreature(); - if (!creatureTarget) - return true; + bool operator()(WorldObject* target) const + { + //! No players, only vehicles (todo: check if blizzlike) + Creature* creatureTarget = target->ToCreature(); + if (!creatureTarget) + return true; - //! NPC entries must match - if (creatureTarget->GetEntry() != NPC_SALVAGED_DEMOLISHER && creatureTarget->GetEntry() != NPC_SALVAGED_SIEGE_ENGINE) - return true; + //! NPC entries must match + if (creatureTarget->GetEntry() != NPC_SALVAGED_DEMOLISHER && creatureTarget->GetEntry() != NPC_SALVAGED_SIEGE_ENGINE) + return true; - //! NPC must be a valid vehicle installation - Vehicle* vehicle = creatureTarget->GetVehicleKit(); - if (!vehicle) - return true; + //! NPC must be a valid vehicle installation + Vehicle* vehicle = creatureTarget->GetVehicleKit(); + if (!vehicle) + return true; - //! Entity needs to be in appropriate area - if (target->GetAreaId() != AREA_FORMATION_GROUNDS) - return true; + //! Entity needs to be in appropriate area + if (target->GetAreaId() != AREA_FORMATION_GROUNDS) + return true; - //! Vehicle must be in use by player - bool playerFound = false; - for (SeatMap::const_iterator itr = vehicle->Seats.begin(); itr != vehicle->Seats.end() && !playerFound; ++itr) - if (IS_PLAYER_GUID(itr->second.Passenger.Guid)) - playerFound = true; + //! Vehicle must be in use by player + bool playerFound = false; + for (SeatMap::const_iterator itr = vehicle->Seats.begin(); itr != vehicle->Seats.end() && !playerFound; ++itr) + if (IS_PLAYER_GUID(itr->second.Passenger.Guid)) + playerFound = true; - return !playerFound; - } + return !playerFound; + } }; class spell_pursue : public SpellScriptLoader { - public: - spell_pursue() : SpellScriptLoader("spell_pursue") {} +public: + spell_pursue() : SpellScriptLoader("spell_pursue") {} - class spell_pursue_SpellScript : public SpellScript + class spell_pursue_SpellScript : public SpellScript + { + PrepareSpellScript(spell_pursue_SpellScript); + + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_pursue_SpellScript); - - void FilterTargets(std::list& targets) + targets.remove_if(FlameLeviathanPursuedTargetSelector()); + if (targets.empty()) { - targets.remove_if(FlameLeviathanPursuedTargetSelector()); - if (targets.empty()) - { - if (Creature* caster = GetCaster()->ToCreature()) - caster->AI()->EnterEvadeMode(); - } - else - { - //! In the end, only one target should be selected - WorldObject* _target = acore::Containers::SelectRandomContainerElement(targets); - targets.clear(); - if (_target) - targets.push_back(_target); - } + if (Creature* caster = GetCaster()->ToCreature()) + caster->AI()->EnterEvadeMode(); } - - - void HandleScript(SpellEffIndex /*eff*/) + else { - Creature* target = GetHitCreature(); - Unit* caster = GetCaster(); - if (!target || !caster) - return; - - caster->getThreatManager().resetAllAggro(); - caster->GetAI()->AttackStart(target); // Chase target - caster->AddThreat(target, 10000000.0f); + //! In the end, only one target should be selected + WorldObject* _target = acore::Containers::SelectRandomContainerElement(targets); + targets.clear(); + if (_target) + targets.push_back(_target); } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pursue_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY); - OnEffectHitTarget += SpellEffectFn(spell_pursue_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_APPLY_AURA); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_pursue_SpellScript(); } + + + void HandleScript(SpellEffIndex /*eff*/) + { + Creature* target = GetHitCreature(); + Unit* caster = GetCaster(); + if (!target || !caster) + return; + + caster->getThreatManager().resetAllAggro(); + caster->GetAI()->AttackStart(target); // Chase target + caster->AddThreat(target, 10000000.0f); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pursue_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_pursue_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_APPLY_AURA); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_pursue_SpellScript(); + } }; class spell_vehicle_throw_passenger : public SpellScriptLoader { - public: - spell_vehicle_throw_passenger() : SpellScriptLoader("spell_vehicle_throw_passenger") {} +public: + spell_vehicle_throw_passenger() : SpellScriptLoader("spell_vehicle_throw_passenger") {} - class spell_vehicle_throw_passenger_SpellScript : public SpellScript + class spell_vehicle_throw_passenger_SpellScript : public SpellScript + { + PrepareSpellScript(spell_vehicle_throw_passenger_SpellScript); + void HandleScript() { - PrepareSpellScript(spell_vehicle_throw_passenger_SpellScript); - void HandleScript() - { - Spell* baseSpell = GetSpell(); - SpellCastTargets targets = baseSpell->m_targets; - if (Vehicle* vehicle = GetCaster()->GetVehicleKit()) - if (Unit* passenger = vehicle->GetPassenger(3)) + Spell* baseSpell = GetSpell(); + SpellCastTargets targets = baseSpell->m_targets; + if (Vehicle* vehicle = GetCaster()->GetVehicleKit()) + if (Unit* passenger = vehicle->GetPassenger(3)) + { + // use 99 because it is 3d search + std::list targetList; + acore::WorldObjectSpellAreaTargetCheck check(99, GetExplTargetDest(), GetCaster(), GetCaster(), GetSpellInfo(), TARGET_CHECK_DEFAULT, nullptr); + acore::WorldObjectListSearcher searcher(GetCaster(), targetList, check); + GetCaster()->GetMap()->VisitAll(GetCaster()->m_positionX, GetCaster()->m_positionY, 99, searcher); + float minDist = 99 * 99; + Unit* target = nullptr; + for (std::list::iterator itr = targetList.begin(); itr != targetList.end(); ++itr) { - // use 99 because it is 3d search - std::list targetList; - acore::WorldObjectSpellAreaTargetCheck check(99, GetExplTargetDest(), GetCaster(), GetCaster(), GetSpellInfo(), TARGET_CHECK_DEFAULT, nullptr); - acore::WorldObjectListSearcher searcher(GetCaster(), targetList, check); - GetCaster()->GetMap()->VisitAll(GetCaster()->m_positionX, GetCaster()->m_positionY, 99, searcher); - float minDist = 99 * 99; - Unit* target = nullptr; - for (std::list::iterator itr = targetList.begin(); itr != targetList.end(); ++itr) - { - if (Unit* unit = (*itr)->ToUnit()) - if (unit->GetEntry() == NPC_SEAT) - if (Vehicle* seat = unit->GetVehicleKit()) - if (!seat->GetPassenger(0)) - if (Unit* device = seat->GetPassenger(2)) - if (!device->GetCurrentSpell(CURRENT_CHANNELED_SPELL)) + if (Unit* unit = (*itr)->ToUnit()) + if (unit->GetEntry() == NPC_SEAT) + if (Vehicle* seat = unit->GetVehicleKit()) + if (!seat->GetPassenger(0)) + if (Unit* device = seat->GetPassenger(2)) + if (!device->GetCurrentSpell(CURRENT_CHANNELED_SPELL)) + { + float dist = unit->GetExactDistSq(targets.GetDstPos()); + if (dist < minDist) { - float dist = unit->GetExactDistSq(targets.GetDstPos()); - if (dist < minDist) - { - minDist = dist; - target = unit; - } + minDist = dist; + target = unit; } - } - if (target && target->IsWithinDist2d(targets.GetDstPos(), GetSpellInfo()->Effects[EFFECT_0].CalcRadius() * 2)) // now we use *2 because the location of the seat is not correct - { - passenger->ExitVehicle(); - passenger->EnterVehicle(target, 0); - } - else - { - passenger->ExitVehicle(); - float x, y, z; - targets.GetDstPos()->GetPosition(x, y, z); - passenger->GetMotionMaster()->MoveJump(x, y, z, targets.GetSpeedXY(), targets.GetSpeedZ()); - } + } } - } - - void Register() override - { - AfterCast += SpellCastFn(spell_vehicle_throw_passenger_SpellScript::HandleScript); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_vehicle_throw_passenger_SpellScript(); + if (target && target->IsWithinDist2d(targets.GetDstPos(), GetSpellInfo()->Effects[EFFECT_0].CalcRadius() * 2)) // now we use *2 because the location of the seat is not correct + { + passenger->ExitVehicle(); + passenger->EnterVehicle(target, 0); + } + else + { + passenger->ExitVehicle(); + float x, y, z; + targets.GetDstPos()->GetPosition(x, y, z); + passenger->GetMotionMaster()->MoveJump(x, y, z, targets.GetSpeedXY(), targets.GetSpeedZ()); + } + } } + + void Register() override + { + AfterCast += SpellCastFn(spell_vehicle_throw_passenger_SpellScript::HandleScript); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_vehicle_throw_passenger_SpellScript(); + } }; class spell_tar_blaze : public SpellScriptLoader { - public: - spell_tar_blaze() : SpellScriptLoader("spell_tar_blaze") { } +public: + spell_tar_blaze() : SpellScriptLoader("spell_tar_blaze") { } - class spell_tar_blaze_AuraScript : public AuraScript + class spell_tar_blaze_AuraScript : public AuraScript + { + PrepareAuraScript(spell_tar_blaze_AuraScript); + + void OnPeriodic(AuraEffect const* aurEff) { - PrepareAuraScript(spell_tar_blaze_AuraScript); - - void OnPeriodic(AuraEffect const* aurEff) - { - GetUnitOwner()->CastSpell((Unit*)nullptr, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_tar_blaze_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_tar_blaze_AuraScript(); + GetUnitOwner()->CastSpell((Unit*)nullptr, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true); } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_tar_blaze_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_tar_blaze_AuraScript(); + } }; class spell_vehicle_grab_pyrite : public SpellScriptLoader { - public: - spell_vehicle_grab_pyrite() : SpellScriptLoader("spell_vehicle_grab_pyrite") {} +public: + spell_vehicle_grab_pyrite() : SpellScriptLoader("spell_vehicle_grab_pyrite") {} - class spell_vehicle_grab_pyrite_SpellScript : public SpellScript + class spell_vehicle_grab_pyrite_SpellScript : public SpellScript + { + PrepareSpellScript(spell_vehicle_grab_pyrite_SpellScript); + void HandleScript(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_vehicle_grab_pyrite_SpellScript); - void HandleScript(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - if (Unit* seat = GetCaster()->GetVehicleBase()) + if (Unit* target = GetHitUnit()) + if (Unit* seat = GetCaster()->GetVehicleBase()) + { + if (Vehicle* vSeat = seat->GetVehicleKit()) + if (Unit* pyrite = vSeat->GetPassenger(1)) + pyrite->ExitVehicle(); + + if (Unit* parent = seat->GetVehicleBase()) { - if (Vehicle* vSeat = seat->GetVehicleKit()) - if (Unit* pyrite = vSeat->GetPassenger(1)) - pyrite->ExitVehicle(); + GetCaster()->CastSpell(parent, 62496 /*SPELL_ADD_PYRITE*/, true); + target->CastSpell(seat, GetEffectValue()); - if (Unit* parent = seat->GetVehicleBase()) - { - GetCaster()->CastSpell(parent, 62496 /*SPELL_ADD_PYRITE*/, true); - target->CastSpell(seat, GetEffectValue()); - - if (target->GetTypeId() == TYPEID_UNIT) - target->ToCreature()->DespawnOrUnsummon(1300); - } + if (target->GetTypeId() == TYPEID_UNIT) + target->ToCreature()->DespawnOrUnsummon(1300); } - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_vehicle_grab_pyrite_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_vehicle_grab_pyrite_SpellScript(); + } } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_vehicle_grab_pyrite_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_vehicle_grab_pyrite_SpellScript(); + } }; class spell_vehicle_circuit_overload : public SpellScriptLoader { - public: - spell_vehicle_circuit_overload() : SpellScriptLoader("spell_vehicle_circuit_overload") { } +public: + spell_vehicle_circuit_overload() : SpellScriptLoader("spell_vehicle_circuit_overload") { } - class spell_vehicle_circuit_overload_AuraScript : public AuraScript + class spell_vehicle_circuit_overload_AuraScript : public AuraScript + { + PrepareAuraScript(spell_vehicle_circuit_overload_AuraScript); + + void OnPeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_vehicle_circuit_overload_AuraScript); - - void OnPeriodic(AuraEffect const* /*aurEff*/) - { - if (Unit* target = GetTarget()) - if (int(target->GetAppliedAuras().count(SPELL_OVERLOAD_CIRCUIT)) >= (target->GetMap()->Is25ManRaid() ? 4 : 2)) - { - target->CastSpell(target, SPELL_SYSTEMS_SHUTDOWN, true); - target->RemoveAurasDueToSpell(SPELL_OVERLOAD_CIRCUIT); - } - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_vehicle_circuit_overload_AuraScript::OnPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_vehicle_circuit_overload_AuraScript(); + if (Unit* target = GetTarget()) + if (int(target->GetAppliedAuras().count(SPELL_OVERLOAD_CIRCUIT)) >= (target->GetMap()->Is25ManRaid() ? 4 : 2)) + { + target->CastSpell(target, SPELL_SYSTEMS_SHUTDOWN, true); + target->RemoveAurasDueToSpell(SPELL_OVERLOAD_CIRCUIT); + } } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_vehicle_circuit_overload_AuraScript::OnPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_vehicle_circuit_overload_AuraScript(); + } }; class spell_orbital_supports : public SpellScriptLoader { - public: - spell_orbital_supports() : SpellScriptLoader("spell_orbital_supports") { } +public: + spell_orbital_supports() : SpellScriptLoader("spell_orbital_supports") { } - class spell_orbital_supports_AuraScript : public AuraScript + class spell_orbital_supports_AuraScript : public AuraScript + { + PrepareAuraScript(spell_orbital_supports_AuraScript); + + bool CheckAreaTarget(Unit* target) { - PrepareAuraScript(spell_orbital_supports_AuraScript); - - bool CheckAreaTarget(Unit* target) - { - return target->GetEntry() == NPC_LEVIATHAN; - } - void Register() override - { - DoCheckAreaTarget += AuraCheckAreaTargetFn(spell_orbital_supports_AuraScript::CheckAreaTarget); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_orbital_supports_AuraScript(); + return target->GetEntry() == NPC_LEVIATHAN; } + void Register() override + { + DoCheckAreaTarget += AuraCheckAreaTargetFn(spell_orbital_supports_AuraScript::CheckAreaTarget); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_orbital_supports_AuraScript(); + } }; class spell_thorims_hammer : public SpellScriptLoader { - public: - spell_thorims_hammer() : SpellScriptLoader("spell_thorims_hammer") { } +public: + spell_thorims_hammer() : SpellScriptLoader("spell_thorims_hammer") { } - class spell_thorims_hammer_SpellScript : public SpellScript + class spell_thorims_hammer_SpellScript : public SpellScript + { + PrepareSpellScript(spell_thorims_hammer_SpellScript); + + void RecalculateDamage(SpellEffIndex effIndex) { - PrepareSpellScript(spell_thorims_hammer_SpellScript); - - void RecalculateDamage(SpellEffIndex effIndex) + if (!GetHitUnit() || effIndex == EFFECT_1) { - if (!GetHitUnit() || effIndex == EFFECT_1) - { - PreventHitDefaultEffect(effIndex); - return; - } - - float dist = GetHitUnit()->GetExactDist2d(GetCaster()); - if (dist <= 7.0f) - SetHitDamage(GetSpellInfo()->Effects[EFFECT_1].CalcValue()); - else - { - dist -= 6.0f; - SetHitDamage(int32(GetSpellInfo()->Effects[EFFECT_1].CalcValue() / std::max(dist, 1.0f))); - } + PreventHitDefaultEffect(effIndex); + return; } - void Register() override + float dist = GetHitUnit()->GetExactDist2d(GetCaster()); + if (dist <= 7.0f) + SetHitDamage(GetSpellInfo()->Effects[EFFECT_1].CalcValue()); + else { - OnEffectHitTarget += SpellEffectFn(spell_thorims_hammer_SpellScript::RecalculateDamage, EFFECT_ALL, SPELL_EFFECT_SCHOOL_DAMAGE); + dist -= 6.0f; + SetHitDamage(int32(GetSpellInfo()->Effects[EFFECT_1].CalcValue() / std::max(dist, 1.0f))); } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_thorims_hammer_SpellScript(); } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_thorims_hammer_SpellScript::RecalculateDamage, EFFECT_ALL, SPELL_EFFECT_SCHOOL_DAMAGE); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_thorims_hammer_SpellScript(); + } }; class spell_shield_generator : public SpellScriptLoader { - public: - spell_shield_generator() : SpellScriptLoader("spell_shield_generator") { } +public: + spell_shield_generator() : SpellScriptLoader("spell_shield_generator") { } - class spell_shield_generator_AuraScript : public AuraScript + class spell_shield_generator_AuraScript : public AuraScript + { + PrepareAuraScript(spell_shield_generator_AuraScript); + + uint32 absorbPct; + + bool Load() override { - PrepareAuraScript(spell_shield_generator_AuraScript); - - uint32 absorbPct; - - bool Load() override - { - absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); - return true; - } - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - // Set absorbtion amount to unlimited - amount = -1; - } - - void Absorb(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount) - { - absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct); - } - - void Register() override - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_shield_generator_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); - OnEffectAbsorb += AuraEffectAbsorbFn(spell_shield_generator_AuraScript::Absorb, EFFECT_0); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_shield_generator_AuraScript(); + absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); + return true; } + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + // Set absorbtion amount to unlimited + amount = -1; + } + + void Absorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount) + { + absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct); + } + + void Register() override + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_shield_generator_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); + OnEffectAbsorb += AuraEffectAbsorbFn(spell_shield_generator_AuraScript::Absorb, EFFECT_0); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_shield_generator_AuraScript(); + } }; class spell_demolisher_ride_vehicle : public SpellScriptLoader { - public: - spell_demolisher_ride_vehicle() : SpellScriptLoader("spell_demolisher_ride_vehicle") {} +public: + spell_demolisher_ride_vehicle() : SpellScriptLoader("spell_demolisher_ride_vehicle") {} - class spell_demolisher_ride_vehicle_SpellScript : public SpellScript + class spell_demolisher_ride_vehicle_SpellScript : public SpellScript + { + PrepareSpellScript(spell_demolisher_ride_vehicle_SpellScript); + + SpellCastResult CheckCast() { - PrepareSpellScript(spell_demolisher_ride_vehicle_SpellScript); - - SpellCastResult CheckCast() - { - if (GetCaster()->GetTypeId() != TYPEID_PLAYER) - return SPELL_CAST_OK; - - Unit* target = this->GetExplTargetUnit(); - if (!target || target->GetEntry() != NPC_SALVAGED_DEMOLISHER) - return SPELL_FAILED_DONT_REPORT; - - Vehicle* veh = target->GetVehicleKit(); - if (veh && veh->GetPassenger(0)) - if (Unit* target2 = veh->GetPassenger(1)) - if (Vehicle* veh2 = target2->GetVehicleKit()) - { - if (!veh2->GetPassenger(0)) - target2->HandleSpellClick(GetCaster()); - - return SPELL_FAILED_DONT_REPORT; - } - + if (GetCaster()->GetTypeId() != TYPEID_PLAYER) return SPELL_CAST_OK; - } - void Register() override - { - OnCheckCast += SpellCheckCastFn(spell_demolisher_ride_vehicle_SpellScript::CheckCast); - } - }; + Unit* target = this->GetExplTargetUnit(); + if (!target || target->GetEntry() != NPC_SALVAGED_DEMOLISHER) + return SPELL_FAILED_DONT_REPORT; - SpellScript* GetSpellScript() const override - { - return new spell_demolisher_ride_vehicle_SpellScript(); + Vehicle* veh = target->GetVehicleKit(); + if (veh && veh->GetPassenger(0)) + if (Unit* target2 = veh->GetPassenger(1)) + if (Vehicle* veh2 = target2->GetVehicleKit()) + { + if (!veh2->GetPassenger(0)) + target2->HandleSpellClick(GetCaster()); + + return SPELL_FAILED_DONT_REPORT; + } + + return SPELL_CAST_OK; } + + void Register() override + { + OnCheckCast += SpellCheckCastFn(spell_demolisher_ride_vehicle_SpellScript::CheckCast); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_demolisher_ride_vehicle_SpellScript(); + } }; class achievement_flame_leviathan_towers : public AchievementCriteriaScript { - public: - achievement_flame_leviathan_towers(char const* name, uint32 count) : AchievementCriteriaScript(name), - _towerCount(count) - { - } +public: + achievement_flame_leviathan_towers(char const* name, uint32 count) : AchievementCriteriaScript(name), + _towerCount(count) + { + } - bool OnCheck(Player* /*player*/, Unit* target /*Flame Leviathan*/) override - { - return target && _towerCount <= target->GetAI()->GetData(DATA_GET_TOWER_COUNT); - } + bool OnCheck(Player* /*player*/, Unit* target /*Flame Leviathan*/) override + { + return target && _towerCount <= target->GetAI()->GetData(DATA_GET_TOWER_COUNT); + } - private: - uint32 const _towerCount; +private: + uint32 const _towerCount; }; class achievement_flame_leviathan_shutout : public AchievementCriteriaScript { - public: - achievement_flame_leviathan_shutout() : AchievementCriteriaScript("achievement_flame_leviathan_shutout") {} +public: + achievement_flame_leviathan_shutout() : AchievementCriteriaScript("achievement_flame_leviathan_shutout") {} - bool OnCheck(Player* /*player*/, Unit* target /*Flame Leviathan*/) override - { - if (target) - if (target->GetAI()->GetData(DATA_GET_SHUTDOWN)) - return true; - return false; - } + bool OnCheck(Player* /*player*/, Unit* target /*Flame Leviathan*/) override + { + if (target) + if (target->GetAI()->GetData(DATA_GET_SHUTDOWN)) + return true; + return false; + } }; class achievement_flame_leviathan_garage : public AchievementCriteriaScript { - public: - achievement_flame_leviathan_garage(char const* name, uint32 entry1, uint32 entry2) : AchievementCriteriaScript(name), - _entry1(entry1), _entry2(entry2) - { - } +public: + achievement_flame_leviathan_garage(char const* name, uint32 entry1, uint32 entry2) : AchievementCriteriaScript(name), + _entry1(entry1), _entry2(entry2) + { + } - bool OnCheck(Player* player, Unit*) override - { - if (Vehicle* vehicle = player->GetVehicle()) - if (vehicle->GetCreatureEntry() == _entry1 || vehicle->GetCreatureEntry() == _entry2) - return true; - return false; - } + bool OnCheck(Player* player, Unit*) override + { + if (Vehicle* vehicle = player->GetVehicle()) + if (vehicle->GetCreatureEntry() == _entry1 || vehicle->GetCreatureEntry() == _entry2) + return true; + return false; + } - private: - uint32 const _entry1; - uint32 const _entry2; +private: + uint32 const _entry1; + uint32 const _entry2; }; class achievement_flame_leviathan_unbroken : public AchievementCriteriaScript { - public: - achievement_flame_leviathan_unbroken() : AchievementCriteriaScript("achievement_flame_leviathan_unbroken") {} +public: + achievement_flame_leviathan_unbroken() : AchievementCriteriaScript("achievement_flame_leviathan_unbroken") {} - bool OnCheck(Player* player, Unit*) override - { - if (player->GetInstanceScript()) - if (player->GetInstanceScript()->GetData(DATA_UNBROKEN_ACHIEVEMENT)) - return true; - return false; - } + bool OnCheck(Player* player, Unit*) override + { + if (player->GetInstanceScript()) + if (player->GetInstanceScript()->GetData(DATA_UNBROKEN_ACHIEVEMENT)) + return true; + return false; + } }; void AddSC_boss_flame_leviathan() diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp index c7a796990..61291b35e 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp @@ -48,7 +48,7 @@ enum FreyaSpells SPELL_STONEBARK_ESSENCE = 62483, SPELL_IRONBRANCH_ESSENCE = 62484, SPELL_BRIGHTLEAF_ESSENCE = 62485, - + // BRIGHTLEAF SPELL_BRIGHTLEAF_FLUX = 62239, SPELL_SOLAR_FLARE_10 = 62240, @@ -57,7 +57,7 @@ enum FreyaSpells SPELL_PHOTOSYNTHESIS = 62209, SPELL_UNSTABLE_SUN_DAMAGE_10 = 62217, SPELL_UNSTABLE_SUN_DAMAGE_25 = 62922, - + // IRONBRANCH SPELL_IMPALE_10 = 62310, SPELL_IMPALE_25 = 62928, @@ -67,7 +67,7 @@ enum FreyaSpells SPELL_IRON_ROOTS_DAMAGE_25 = 62930, SPELL_THORN_SWARM_10 = 62285, SPELL_THORN_SWARM_25 = 62931, - + // STONEBARK SPELL_FISTS_OF_STONE = 62344, SPELL_GROUND_TREMOR_10 = 62325, @@ -177,7 +177,7 @@ enum FreyaSounds SOUND_STONEBARK_SLAY1 = 15501, SOUND_STONEBARK_SLAY2 = 15502, SOUND_STONEBARK_DEATH = 15503, - + // IRONBRANCH SOUND_IRONBRANCH_AGGRO = 15493, SOUND_IRONBRANCH_SLAY1 = 15494, @@ -192,7 +192,7 @@ enum FreyaSounds }; enum FreyaNPCs -{ +{ NPC_NATURE_BOMB = 34129, NPC_IRON_ROOT_TRIGGER = 33088, NPC_FREYA_UNSTABLE_SUN_BEAM = 33170, @@ -206,7 +206,7 @@ enum FreyaNPCs // SEC WAVE NPC_ANCIENT_CONSERVATOR = 33203, NPC_HEALTHY_SPORE = 33215, - + // THIRD WAVE NPC_DETONATING_LASHER = 32918, }; @@ -274,7 +274,7 @@ public: bool _respawningTrio; bool _backToNature; uint8 _deforestation; - + uint64 _elderGUID[3]; void Reset() @@ -298,7 +298,7 @@ public: _lumberjacked = 0; _spawnedAmount = 0; _trioKilled = 0; - _waveNumber = urand(1,3); + _waveNumber = urand(1, 3); _respawningTrio = false; _backToNature = true; _deforestation = 0; @@ -306,10 +306,10 @@ public: void KilledUnit(Unit* victim) { - if (victim->GetTypeId() != TYPEID_PLAYER || urand(0,2)) + if (victim->GetTypeId() != TYPEID_PLAYER || urand(0, 2)) return; - if (urand(0,1)) + if (urand(0, 1)) { me->MonsterYell("Forgive me.", LANG_UNIVERSAL, 0); me->PlayDirectSound(SOUND_SLAY1); @@ -328,7 +328,7 @@ public: { me->MonsterYell("His hold on me dissipates. I can see clearly once more. Thank you, heroes.", LANG_UNIVERSAL, 0); me->PlayDirectSound(SOUND_DEATH); - + damage = 0; me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->setFaction(35); @@ -353,7 +353,7 @@ public: } uint32 chestId = RAID_MODE(GO_FREYA_CHEST, GO_FREYA_CHEST_HERO); - chestId -= 2*_elderCount; // offset + chestId -= 2 * _elderCount; // offset me->DespawnOrUnsummon(5000); if (GameObject* go = me->SummonGameObject(chestId, 2345.61f, -71.20f, 425.104f, 3.0f, 0, 0, 0, 0, 0)) @@ -375,23 +375,23 @@ public: void SpawnWave() { - _waveNumber = _waveNumber == 1 ? 3 : _waveNumber-1; + _waveNumber = _waveNumber == 1 ? 3 : _waveNumber - 1; // Wave of three if (_waveNumber == 1) { me->MonsterYell("Children, assist me!", LANG_UNIVERSAL, 0); me->PlayDirectSound(SOUND_TRIO); - me->SummonCreature(NPC_ANCIENT_WATER_SPIRIT, me->GetPositionX()+urand(5,15), me->GetPositionY()+urand(5,15), me->GetMap()->GetHeight(me->GetPositionX(), me->GetPositionY(), MAX_HEIGHT)); - me->SummonCreature(NPC_STORM_LASHER, me->GetPositionX()+urand(5,15), me->GetPositionY()+urand(5,15), me->GetMap()->GetHeight(me->GetPositionX(), me->GetPositionY(), MAX_HEIGHT)); - me->SummonCreature(NPC_SNAPLASHER, me->GetPositionX()+urand(5,15), me->GetPositionY()+urand(5,15), me->GetMap()->GetHeight(me->GetPositionX(), me->GetPositionY(), MAX_HEIGHT)); + me->SummonCreature(NPC_ANCIENT_WATER_SPIRIT, me->GetPositionX() + urand(5, 15), me->GetPositionY() + urand(5, 15), me->GetMap()->GetHeight(me->GetPositionX(), me->GetPositionY(), MAX_HEIGHT)); + me->SummonCreature(NPC_STORM_LASHER, me->GetPositionX() + urand(5, 15), me->GetPositionY() + urand(5, 15), me->GetMap()->GetHeight(me->GetPositionX(), me->GetPositionY(), MAX_HEIGHT)); + me->SummonCreature(NPC_SNAPLASHER, me->GetPositionX() + urand(5, 15), me->GetPositionY() + urand(5, 15), me->GetMap()->GetHeight(me->GetPositionX(), me->GetPositionY(), MAX_HEIGHT)); } // Ancient Conservator else if (_waveNumber == 2) { me->MonsterYell("Eonar, your servant requires aid!", LANG_UNIVERSAL, 0); me->PlayDirectSound(SOUND_CONSERVATOR); - me->SummonCreature(NPC_ANCIENT_CONSERVATOR, me->GetPositionX()+urand(5,15), me->GetPositionY()+urand(5,15), me->GetMap()->GetHeight(me->GetPositionX(), me->GetPositionY(), MAX_HEIGHT), 0, TEMPSUMMON_CORPSE_DESPAWN); + me->SummonCreature(NPC_ANCIENT_CONSERVATOR, me->GetPositionX() + urand(5, 15), me->GetPositionY() + urand(5, 15), me->GetMap()->GetHeight(me->GetPositionX(), me->GetPositionY(), MAX_HEIGHT), 0, TEMPSUMMON_CORPSE_DESPAWN); } // Detonating Lashers else if (_waveNumber == 3) @@ -399,7 +399,7 @@ public: me->MonsterYell("The swarm of the elements shall overtake you!", LANG_UNIVERSAL, 0); me->PlayDirectSound(SOUND_DETONATING); for (uint8 i = 0; i < 10; ++i) - me->SummonCreature(NPC_DETONATING_LASHER, me->GetPositionX()+urand(5,20), me->GetPositionY()+urand(5,20), me->GetMap()->GetHeight(me->GetPositionX(), me->GetPositionY(), MAX_HEIGHT), 0, TEMPSUMMON_CORPSE_DESPAWN); + me->SummonCreature(NPC_DETONATING_LASHER, me->GetPositionX() + urand(5, 20), me->GetPositionY() + urand(5, 20), me->GetMap()->GetHeight(me->GetPositionX(), me->GetPositionY(), MAX_HEIGHT), 0, TEMPSUMMON_CORPSE_DESPAWN); } } @@ -446,7 +446,7 @@ public: _backToNature = false; if (aur->GetStackAmount() > param) - aur->SetStackAmount(aur->GetStackAmount()-param); + aur->SetStackAmount(aur->GetStackAmount() - param); else // Aura out of stack { events.ScheduleEvent(EVENT_FREYA_NATURE_BOMB, 5000); @@ -543,7 +543,7 @@ public: } } - void SpellHitTarget(Unit *target, const SpellInfo *spell) + void SpellHitTarget(Unit* target, const SpellInfo* spell) { if (spell->Id == SPELL_NATURE_BOMB_FLIGHT) me->SummonCreature(NPC_NATURE_BOMB, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ()); @@ -560,92 +560,92 @@ public: switch (events.GetEvent()) { - case EVENT_FREYA_ADDS_SPAM: - if (_spawnedAmount < 6) - SpawnWave(); - else if (me->GetAura(SPELL_ATTUNED_TO_NATURE)) - { - me->RemoveAura(SPELL_ATTUNED_TO_NATURE); - events.ScheduleEvent(EVENT_FREYA_NATURE_BOMB, 5000); - events.SetPhase(EVENT_PHASE_FINAL); - events.PopEvent(); - return; - } - _spawnedAmount++; - events.RepeatEvent(60000); - break; - case EVENT_FREYA_LIFEBINDER: - { - events.RepeatEvent(45000); - float x, y, z; - for (uint8 i = 0; i < 10; ++i) - { - x = me->GetPositionX()+urand(7,25); - y = me->GetPositionY()+urand(7,25); - z = me->GetMap()->GetHeight(x, y, MAX_HEIGHT)+0.5f; - if (me->IsWithinLOS(x, y, z)) + case EVENT_FREYA_ADDS_SPAM: + if (_spawnedAmount < 6) + SpawnWave(); + else if (me->GetAura(SPELL_ATTUNED_TO_NATURE)) { - me->CastSpell(x, y, z, SPELL_SUMMON_LIFEBINDER, true); + me->RemoveAura(SPELL_ATTUNED_TO_NATURE); + events.ScheduleEvent(EVENT_FREYA_NATURE_BOMB, 5000); + events.SetPhase(EVENT_PHASE_FINAL); + events.PopEvent(); return; } - } + _spawnedAmount++; + events.RepeatEvent(60000); + break; + case EVENT_FREYA_LIFEBINDER: + { + events.RepeatEvent(45000); + float x, y, z; + for (uint8 i = 0; i < 10; ++i) + { + x = me->GetPositionX() + urand(7, 25); + y = me->GetPositionY() + urand(7, 25); + z = me->GetMap()->GetHeight(x, y, MAX_HEIGHT) + 0.5f; + if (me->IsWithinLOS(x, y, z)) + { + me->CastSpell(x, y, z, SPELL_SUMMON_LIFEBINDER, true); + return; + } + } - me->CastSpell(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), SPELL_SUMMON_LIFEBINDER, true); - break; - } - case EVENT_FREYA_SUNBEAM: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) - me->CastSpell(target, SPELL_SUNBEAM, false); - events.RepeatEvent(15000+urand(0,5000)); - break; - case EVENT_FREYA_RESPAWN_TRIO: - events.PopEvent(); - _deforestation = 0; - _respawningTrio = false; - if (_trioKilled < 3) - summons.DoAction(ACTION_RESPAWN_TRIO); - - _trioKilled = 0; - break; - case EVENT_FREYA_NATURE_BOMB: - { - uint8 _minCount = me->GetMap()->Is25ManRaid() ? urand(7,10) : urand(3,4); - Map::PlayerList const& pList = me->GetMap()->GetPlayers(); - for(Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr) - { - if (me->GetDistance(itr->GetSource()) > 70 || !itr->GetSource()->IsAlive()) - continue; - - me->CastSpell(itr->GetSource(), SPELL_NATURE_BOMB_FLIGHT, true); - - if (!(--_minCount)) + me->CastSpell(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), SPELL_SUMMON_LIFEBINDER, true); break; - } - events.RepeatEvent(18000); - break; - } - case EVENT_FREYA_BERSERK: - me->MonsterYell("You have strayed too far, wasted too much time!", LANG_UNIVERSAL, 0); - me->PlayDirectSound(SOUND_BERSERK); - me->CastSpell(me, SPELL_BERSERK, true); - events.PopEvent(); - break; - case EVENT_FREYA_GROUND_TREMOR: - me->CastSpell(me, SPELL_GROUND_TREMOR_FREYA, false); - events.RepeatEvent(25000+urand(0,10000)); - break; - case EVENT_FREYA_IRON_ROOT: - me->CastCustomSpell(SPELL_IRON_ROOTS_FREYA, SPELLVALUE_MAX_TARGETS, 1, me, false); - events.RepeatEvent(45000+urand(0,10000)); - break; - case EVENT_FREYA_UNSTABLE_SUN_BEAM: - if (Creature* cr = me->SummonCreature(NPC_FREYA_UNSTABLE_SUN_BEAM, me->GetPositionX()+urand(7,25), me->GetPositionY()+urand(7,25), me->GetMap()->GetHeight(me->GetPositionX(), me->GetPositionY(), MAX_HEIGHT), 0, TEMPSUMMON_TIMED_DESPAWN, 10000)) - { - cr->CastSpell(cr, SPELL_UNSTABLE_SUN_VISUAL, true); - cr->CastSpell(cr, SPELL_UNSTABLE_SUN_FREYA_DAMAGE, true); - } - events.RepeatEvent(38000+urand(0,10000)); - break; + } + case EVENT_FREYA_SUNBEAM: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) + me->CastSpell(target, SPELL_SUNBEAM, false); + events.RepeatEvent(15000 + urand(0, 5000)); + break; + case EVENT_FREYA_RESPAWN_TRIO: + events.PopEvent(); + _deforestation = 0; + _respawningTrio = false; + if (_trioKilled < 3) + summons.DoAction(ACTION_RESPAWN_TRIO); + + _trioKilled = 0; + break; + case EVENT_FREYA_NATURE_BOMB: + { + uint8 _minCount = me->GetMap()->Is25ManRaid() ? urand(7, 10) : urand(3, 4); + Map::PlayerList const& pList = me->GetMap()->GetPlayers(); + for(Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr) + { + if (me->GetDistance(itr->GetSource()) > 70 || !itr->GetSource()->IsAlive()) + continue; + + me->CastSpell(itr->GetSource(), SPELL_NATURE_BOMB_FLIGHT, true); + + if (!(--_minCount)) + break; + } + events.RepeatEvent(18000); + break; + } + case EVENT_FREYA_BERSERK: + me->MonsterYell("You have strayed too far, wasted too much time!", LANG_UNIVERSAL, 0); + me->PlayDirectSound(SOUND_BERSERK); + me->CastSpell(me, SPELL_BERSERK, true); + events.PopEvent(); + break; + case EVENT_FREYA_GROUND_TREMOR: + me->CastSpell(me, SPELL_GROUND_TREMOR_FREYA, false); + events.RepeatEvent(25000 + urand(0, 10000)); + break; + case EVENT_FREYA_IRON_ROOT: + me->CastCustomSpell(SPELL_IRON_ROOTS_FREYA, SPELLVALUE_MAX_TARGETS, 1, me, false); + events.RepeatEvent(45000 + urand(0, 10000)); + break; + case EVENT_FREYA_UNSTABLE_SUN_BEAM: + if (Creature* cr = me->SummonCreature(NPC_FREYA_UNSTABLE_SUN_BEAM, me->GetPositionX() + urand(7, 25), me->GetPositionY() + urand(7, 25), me->GetMap()->GetHeight(me->GetPositionX(), me->GetPositionY(), MAX_HEIGHT), 0, TEMPSUMMON_TIMED_DESPAWN, 10000)) + { + cr->CastSpell(cr, SPELL_UNSTABLE_SUN_VISUAL, true); + cr->CastSpell(cr, SPELL_UNSTABLE_SUN_FREYA_DAMAGE, true); + } + events.RepeatEvent(38000 + urand(0, 10000)); + break; } DoMeleeAttackIfReady(); @@ -686,10 +686,10 @@ public: void KilledUnit(Unit*) { - if (urand(0,1)) + if (urand(0, 1)) return; - if (urand(0,1)) + if (urand(0, 1)) { me->MonsterTextEmote("Angry roar", 0); me->PlayDirectSound(SOUND_STONEBARK_SLAY1); @@ -792,10 +792,10 @@ public: void KilledUnit(Unit*) { - if (urand(0,1)) + if (urand(0, 1)) return; - if (urand(0,1)) + if (urand(0, 1)) { me->MonsterYell("Fertilizer.", LANG_UNIVERSAL, 0); me->PlayDirectSound(SOUND_BRIGHTLEAF_SLAY1); @@ -843,7 +843,7 @@ public: { case EVENT_BRIGHTLEAF_FLUX: if (Aura* aur = me->AddAura(SPELL_BRIGHTLEAF_FLUX, me)) - aur->SetStackAmount(urand(1,10)); + aur->SetStackAmount(urand(1, 10)); events.RepeatEvent(10000); break; case EVENT_BRIGHTLEAF_SOLAR_FLARE: @@ -862,7 +862,7 @@ public: beam->CastSpell(beam, SPELL_PHOTOSYNTHESIS, true); summons.Summon(beam); } - if (Creature* beam = me->SummonCreature(NPC_UNSTABLE_SUN_BRIGHTLEAF, me->GetPositionX()+8, me->GetPositionY()+8, me->GetPositionZ())) + if (Creature* beam = me->SummonCreature(NPC_UNSTABLE_SUN_BRIGHTLEAF, me->GetPositionX() + 8, me->GetPositionY() + 8, me->GetPositionZ())) { beam->CastSpell(beam, SPELL_UNSTABLE_SUN_BEAM_AURA, true); beam->CastSpell(beam, SPELL_PHOTOSYNTHESIS, true); @@ -914,10 +914,10 @@ public: void KilledUnit(Unit*) { - if (urand(0,1)) + if (urand(0, 1)) return; - if (urand(0,1)) + if (urand(0, 1)) { me->MonsterYell("I return you whence you came!", LANG_UNIVERSAL, 0); me->PlayDirectSound(SOUND_IRONBRANCH_SLAY1); @@ -1288,33 +1288,33 @@ public: class achievement_freya_getting_back_to_nature : public AchievementCriteriaScript { - public: - achievement_freya_getting_back_to_nature() : AchievementCriteriaScript("achievement_freya_getting_back_to_nature") {} +public: + achievement_freya_getting_back_to_nature() : AchievementCriteriaScript("achievement_freya_getting_back_to_nature") {} - bool OnCheck(Player* /*player*/, Unit* target /*Freya*/) - { - if (target) - if (target->GetAI()->GetData(DATA_BACK_TO_NATURE)) - return true; - return false; - } + bool OnCheck(Player* /*player*/, Unit* target /*Freya*/) + { + if (target) + if (target->GetAI()->GetData(DATA_BACK_TO_NATURE)) + return true; + return false; + } }; class achievement_freya_knock_on_wood : public AchievementCriteriaScript { - public: - achievement_freya_knock_on_wood(char const* name, uint32 count) : AchievementCriteriaScript(name), - _elderCount(count) - { - } +public: + achievement_freya_knock_on_wood(char const* name, uint32 count) : AchievementCriteriaScript(name), + _elderCount(count) + { + } - bool OnCheck(Player* /*player*/, Unit* target /*Freya*/) - { - return target && _elderCount <= target->GetAI()->GetData(DATA_GET_ELDER_COUNT); - } - - private: - uint32 const _elderCount; + bool OnCheck(Player* /*player*/, Unit* target /*Freya*/) + { + return target && _elderCount <= target->GetAI()->GetData(DATA_GET_ELDER_COUNT); + } + +private: + uint32 const _elderCount; }; void AddSC_boss_freya() diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp index 43e662beb..c62110483 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp @@ -107,7 +107,7 @@ public: struct boss_vezaxAI : public ScriptedAI { - boss_vezaxAI(Creature *pCreature) : ScriptedAI(pCreature), summons(me) + boss_vezaxAI(Creature* pCreature) : ScriptedAI(pCreature), summons(me) { pInstance = pCreature->GetInstanceScript(); } @@ -180,8 +180,10 @@ public: { switch (id) { - case 1: return (me->GetLootMode() == 3 ? 1 : 0); - case 2: return (bAchievShadowdodger == true ? 1 : 0); + case 1: + return (me->GetLootMode() == 3 ? 1 : 0); + case 2: + return (bAchievShadowdodger == true ? 1 : 0); } return 0; } @@ -231,7 +233,7 @@ public: if (!players.empty()) { me->setAttackTimer(BASE_ATTACK, 2000); - Player* target = players.at(urand(0, players.size()-1)); + Player* target = players.at(urand(0, players.size() - 1)); me->SetUInt64Value(UNIT_FIELD_TARGET, target->GetGUID()); me->CastSpell(target, SPELL_VEZAX_SHADOW_CRASH, false); events.ScheduleEvent(EVENT_RESTORE_TARGET, 750); @@ -259,22 +261,22 @@ public: { std::vector outside; std::vector inside; - Map::PlayerList const &pl = me->GetMap()->GetPlayers(); - for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr ) - if( Player* tmp = itr->GetSource() ) - if( tmp->IsAlive() ) - { - if( tmp->GetDistance(me) > 15.0f ) - outside.push_back(tmp); - else - inside.push_back(tmp); - } + Map::PlayerList const& pl = me->GetMap()->GetPlayers(); + for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr ) + if( Player* tmp = itr->GetSource() ) + if( tmp->IsAlive() ) + { + if( tmp->GetDistance(me) > 15.0f ) + outside.push_back(tmp); + else + inside.push_back(tmp); + } Player* t = nullptr; if( outside.size() >= uint8(me->GetMap()->Is25ManRaid() ? 9 : 4) ) - t = outside.at(urand(0, outside.size()-1)); + t = outside.at(urand(0, outside.size() - 1)); else if( !inside.empty() ) - t = inside.at(urand(0, inside.size()-1)); + t = inside.at(urand(0, inside.size() - 1)); if (t) me->CastSpell(t, SPELL_MARK_OF_THE_FACELESS_AURA, false); @@ -367,7 +369,7 @@ public: { if( who->GetTypeId() == TYPEID_PLAYER ) { - if( urand(0,1) ) + if( urand(0, 1) ) { me->MonsterYell(TEXT_VEZAX_SLAIN_1, LANG_UNIVERSAL, 0); me->PlayDirectSound(SOUND_VEZAX_SLAIN_1, 0); @@ -406,7 +408,7 @@ public: struct npc_ulduar_saronite_vaporsAI : public NullCreatureAI { - npc_ulduar_saronite_vaporsAI(Creature *pCreature) : NullCreatureAI(pCreature) + npc_ulduar_saronite_vaporsAI(Creature* pCreature) : NullCreatureAI(pCreature) { pInstance = pCreature->GetInstanceScript(); me->GetMotionMaster()->MoveRandom(4.0f); @@ -438,7 +440,7 @@ public: struct npc_ulduar_saronite_animusAI : public ScriptedAI { - npc_ulduar_saronite_animusAI(Creature *pCreature) : ScriptedAI(pCreature) + npc_ulduar_saronite_animusAI(Creature* pCreature) : ScriptedAI(pCreature) { pInstance = pCreature->GetInstanceScript(); if( pInstance ) @@ -496,7 +498,7 @@ public: target->CastSpell(target, SPELL_AURA_OF_DESPAIR_2, true); if( target->HasSpell(SPELL_SHAMANISTIC_RAGE) ) caster->CastSpell(target, SPELL_CORRUPTED_RAGE, true); - else if( target->HasSpell(SPELL_JUDGEMENTS_OF_THE_WISDOM_RANK_1) || target->HasSpell(SPELL_JUDGEMENTS_OF_THE_WISDOM_RANK_1+1) || target->HasSpell(SPELL_JUDGEMENTS_OF_THE_WISDOM_RANK_1+2) ) + else if( target->HasSpell(SPELL_JUDGEMENTS_OF_THE_WISDOM_RANK_1) || target->HasSpell(SPELL_JUDGEMENTS_OF_THE_WISDOM_RANK_1 + 1) || target->HasSpell(SPELL_JUDGEMENTS_OF_THE_WISDOM_RANK_1 + 2) ) caster->CastSpell(target, SPELL_CORRUPTED_WISDOM, true); } } @@ -518,7 +520,7 @@ public: } }; - AuraScript *GetAuraScript() const + AuraScript* GetAuraScript() const { return new spell_aura_of_despair_AuraScript(); } @@ -533,7 +535,7 @@ public: { PrepareAuraScript(spell_mark_of_the_faceless_periodic_AuraScript) - void HandleEffectPeriodic(AuraEffect const * /*aurEff*/) + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) { if (Unit* caster = GetCaster()) if (Unit* target = GetTarget()) @@ -550,7 +552,7 @@ public: } }; - AuraScript *GetAuraScript() const + AuraScript* GetAuraScript() const { return new spell_mark_of_the_faceless_periodic_AuraScript(); } @@ -578,7 +580,7 @@ public: } }; - SpellScript *GetSpellScript() const + SpellScript* GetSpellScript() const { return new spell_mark_of_the_faceless_drainhealth_SpellScript(); } @@ -597,7 +599,7 @@ public: { if (Unit* caster = GetCaster()) { - int32 damage = 100*pow(2.0f, (float)GetStackAmount()); + int32 damage = 100 * pow(2.0f, (float)GetStackAmount()); caster->CastCustomSpell(GetTarget(), SPELL_SARONITE_VAPORS_DMG, &damage, nullptr, nullptr, true); } } @@ -608,7 +610,7 @@ public: } }; - AuraScript *GetAuraScript() const + AuraScript* GetAuraScript() const { return new spell_saronite_vapors_dummy_AuraScript(); } @@ -628,7 +630,7 @@ public: if (Unit* caster = GetCaster()) if (GetHitDamage() > 2) { - int32 mana = GetHitDamage()/2; + int32 mana = GetHitDamage() / 2; if (Unit* t = GetHitUnit()) caster->CastCustomSpell(t, SPELL_SARONITE_VAPORS_ENERGIZE, &mana, nullptr, nullptr, true); } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp index 133bd2a26..5cb50e152 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp @@ -28,7 +28,7 @@ enum HodirSpellData SPELL_FLASH_FREEZE_VISUAL = 62148, SPELL_SAFE_AREA = 65705, SPELL_SAFE_AREA_TRIGGERED = 62464, - + SPELL_ICICLE_BOSS_AURA = 62227, SPELL_ICICLE_TBBA = 63545, @@ -153,35 +153,36 @@ enum HodirSounds struct HodirHelperData { uint32 id; - float x,y; + float x, y; }; -HodirHelperData hhd[4][4] = { -// Alliance: +HodirHelperData hhd[4][4] = { - {NPC_PAN_FIELD_MEDIC_PENNY, 2020.46f, -236.74f}, - {NPC_DAN_ELLIE_NIGHTFEATHER, 2007.21f, -241.57f}, - {NPC_SAN_ELEMENTALIST_AVUUN, 1999.14f, -230.69f}, - {NPC_MAN_MISSY_FLAMECUFFS, 1984.38f, -242.57f} -}, -{ - {NPC_PAH_FIELD_MEDIC_JESSI, 2012.29f, -233.70f}, - {NPC_DAH_EIVI_NIGHTFEATHER, 1995.75f, -241.32f}, - {NPC_SAH_ELEMENTALIST_MAHFUUN, 1989.31f, -234.26f}, - {NPC_MAH_SISSY_FLAMECUFFS, 1977.87f, -233.99f} -}, -// Horde: -{ - {NPC_PHN_BATTLEPRIEST_ELIZA, 2020.46f, -236.74f}, - {NPC_DHN_TOR_GREYCLOUD, 2007.21f, -241.57f}, - {NPC_SHN_SPIRITWALKER_YONA, 1999.14f, -230.69f}, - {NPC_MHN_VEESHA_BLAZEWEAVER, 1984.38f, -242.57f} -}, -{ - {NPC_PHH_BATTLEPRIEST_GINA, 2012.29f, -233.70f}, - {NPC_DHH_KAR_GREYCLOUD, 1995.75f, -241.32f}, - {NPC_SHH_SPIRITWALKER_TARA, 1989.31f, -234.6f}, - {NPC_MHH_AMIRA_BLAZEWEAVER, 1977.87f, -233.99f} -} + // Alliance: + { + {NPC_PAN_FIELD_MEDIC_PENNY, 2020.46f, -236.74f}, + {NPC_DAN_ELLIE_NIGHTFEATHER, 2007.21f, -241.57f}, + {NPC_SAN_ELEMENTALIST_AVUUN, 1999.14f, -230.69f}, + {NPC_MAN_MISSY_FLAMECUFFS, 1984.38f, -242.57f} + }, + { + {NPC_PAH_FIELD_MEDIC_JESSI, 2012.29f, -233.70f}, + {NPC_DAH_EIVI_NIGHTFEATHER, 1995.75f, -241.32f}, + {NPC_SAH_ELEMENTALIST_MAHFUUN, 1989.31f, -234.26f}, + {NPC_MAH_SISSY_FLAMECUFFS, 1977.87f, -233.99f} + }, + // Horde: + { + {NPC_PHN_BATTLEPRIEST_ELIZA, 2020.46f, -236.74f}, + {NPC_DHN_TOR_GREYCLOUD, 2007.21f, -241.57f}, + {NPC_SHN_SPIRITWALKER_YONA, 1999.14f, -230.69f}, + {NPC_MHN_VEESHA_BLAZEWEAVER, 1984.38f, -242.57f} + }, + { + {NPC_PHH_BATTLEPRIEST_GINA, 2012.29f, -233.70f}, + {NPC_DHH_KAR_GREYCLOUD, 1995.75f, -241.32f}, + {NPC_SHH_SPIRITWALKER_TARA, 1989.31f, -234.6f}, + {NPC_MHH_AMIRA_BLAZEWEAVER, 1977.87f, -233.99f} + } }; class boss_hodir : public CreatureScript @@ -196,7 +197,7 @@ public: struct boss_hodirAI : public ScriptedAI { - boss_hodirAI(Creature *pCreature) : ScriptedAI(pCreature), summons(me) + boss_hodirAI(Creature* pCreature) : ScriptedAI(pCreature), summons(me) { pInstance = pCreature->GetInstanceScript(); if (!me->IsAlive()) @@ -295,7 +296,7 @@ public: } } - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) { if (damage >= me->GetHealth() || me->GetHealth() < 150000) { @@ -337,7 +338,7 @@ public: d->UseDoorOrButton(0, false); } } - + if (GameObject* go = me->FindNearestGameObject(GO_HODIR_FRONTDOOR, 300.0f)) { go->SetGoState(GO_STATE_ACTIVE); @@ -349,13 +350,13 @@ public: // spawn appropriate chests uint32 chestId = me->GetMap()->Is25ManRaid() ? GO_HODIR_CHEST_NORMAL_HERO : GO_HODIR_CHEST_NORMAL; - if( GameObject *go = me->SummonGameObject(chestId, 1969.115f, -212.94f, 432.687f, 3*M_PI/2, 0, 0, 0, 0, 0) ) + if( GameObject* go = me->SummonGameObject(chestId, 1969.115f, -212.94f, 432.687f, 3 * M_PI / 2, 0, 0, 0, 0, 0) ) go->SetUInt32Value(GAMEOBJECT_FLAGS, 0); - + if( hardmode ) { uint32 chestId2 = me->GetMap()->Is25ManRaid() ? GO_HODIR_CHEST_HARD_HERO : GO_HODIR_CHEST_HARD; - if( GameObject *go = me->SummonGameObject(chestId2, 2031.207f, -213.236f, 432.687f, 3*M_PI/2, 0, 0, 0, 0, 0) ) + if( GameObject* go = me->SummonGameObject(chestId2, 2031.207f, -213.236f, 432.687f, 3 * M_PI / 2, 0, 0, 0, 0, 0) ) go->SetUInt32Value(GAMEOBJECT_FLAGS, 0); } } @@ -394,7 +395,7 @@ public: if( me->HasUnitState(UNIT_STATE_CASTING) ) return; - + switch( events.GetEvent() ) { case 0: @@ -437,7 +438,7 @@ public: me->MonsterYell(TEXT_HODIR_FLASH_FREEZE, LANG_UNIVERSAL, 0); me->PlayDirectSound(SOUND_HODIR_FLASH_FREEZE, 0); SmallIcicles(false); - events.RepeatEvent(55000 + urand(0,10000)); + events.RepeatEvent(55000 + urand(0, 10000)); events.ScheduleEvent(EVENT_SMALL_ICICLES_ENABLE, Is25ManRaid() ? 12000 : 24000); events.ScheduleEvent(EVENT_FROZEN_BLOWS, 15000); events.RescheduleEvent(EVENT_FREEZE, 20000); @@ -480,7 +481,7 @@ public: char faction = 'A'; if( hhd[0][0].id ) { - Map::PlayerList const &cl = me->GetMap()->GetPlayers(); + Map::PlayerList const& cl = me->GetMap()->GetPlayers(); for (Map::PlayerList::const_iterator itr = cl.begin(); itr != cl.end(); ++itr) if (!itr->GetSource()->IsGameMaster()) { @@ -491,18 +492,18 @@ public: uint8 cnt = 0; if( faction ) - for( uint8 k=0; k<4; ++k ) + for( uint8 k = 0; k < 4; ++k ) { - if( (faction == 'A' && ( k>1 || (k==1 && RAID_MODE(1,0)) )) || - (faction == 'H' && ( k<2 || (k==3 && RAID_MODE(1,0)) )) ) + if( (faction == 'A' && ( k > 1 || (k == 1 && RAID_MODE(1, 0)) )) || + (faction == 'H' && ( k < 2 || (k == 3 && RAID_MODE(1, 0)) )) ) continue; - for( uint8 i=0; i<4; ++i ) + for( uint8 i = 0; i < 4; ++i ) { if( !hhd[k][i].id ) continue; - if( Creature* h_p = me->SummonCreature(hhd[k][i].id, hhd[k][i].x, hhd[k][i].y, 432.69f, M_PI/2) ) + if( Creature* h_p = me->SummonCreature(hhd[k][i].id, hhd[k][i].x, hhd[k][i].y, 432.69f, M_PI / 2) ) { h_p->setFaction(1665); if( cnt < 8 ) @@ -522,7 +523,7 @@ public: { if( who->GetTypeId() == TYPEID_PLAYER ) { - if( urand(0,1) ) + if( urand(0, 1) ) { me->MonsterYell(TEXT_HODIR_SLAIN_1, LANG_UNIVERSAL, 0); me->PlayDirectSound(SOUND_HODIR_SLAIN_1, 0); @@ -560,9 +561,15 @@ public: if (value) switch (id) { - case 1: bAchievCheese = false; break; - case 2: bAchievGettingCold = false; break; - case 4: bAchievCoolestFriends = false; break; + case 1: + bAchievCheese = false; + break; + case 2: + bAchievGettingCold = false; + break; + case 4: + bAchievCoolestFriends = false; + break; } } @@ -570,10 +577,14 @@ public: { switch (id) { - case 1: return (bAchievCheese ? 1 : 0); - case 2: return (bAchievGettingCold ? 1 : 0); - case 3: return (hardmode ? 1 : 0); - case 4: return (bAchievCoolestFriends ? 1 : 0); + case 1: + return (bAchievCheese ? 1 : 0); + case 2: + return (bAchievGettingCold ? 1 : 0); + case 3: + return (hardmode ? 1 : 0); + case 4: + return (bAchievCoolestFriends ? 1 : 0); } return 0; } @@ -594,7 +605,7 @@ public: struct npc_ulduar_icicleAI : public NullCreatureAI { - npc_ulduar_icicleAI(Creature *pCreature) : NullCreatureAI(pCreature) + npc_ulduar_icicleAI(Creature* pCreature) : NullCreatureAI(pCreature) { timer1 = 2000; timer2 = 5000; @@ -607,7 +618,7 @@ public: { if( timer1 <= diff ) { - me->CastSpell(me, (me->GetEntry()==33169 ? SPELL_ICICLE_FALL_EFFECT_UNPACKED : SPELL_ICICLE_FALL_EFFECT_PACKED), true); + me->CastSpell(me, (me->GetEntry() == 33169 ? SPELL_ICICLE_FALL_EFFECT_UNPACKED : SPELL_ICICLE_FALL_EFFECT_PACKED), true); me->CastSpell(me, SPELL_ICICLE_VISUAL_FALLING, false); timer1 = 60000; } @@ -637,7 +648,7 @@ public: struct npc_ulduar_flash_freezeAI : public NullCreatureAI { - npc_ulduar_flash_freezeAI(Creature *pCreature) : NullCreatureAI(pCreature) + npc_ulduar_flash_freezeAI(Creature* pCreature) : NullCreatureAI(pCreature) { timer = 2500; pInstance = me->GetInstanceScript(); @@ -646,7 +657,7 @@ public: InstanceScript* pInstance; uint16 timer; - void DamageTaken(Unit* doneBy, uint32 & /*damage*/, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit* doneBy, uint32& /*damage*/, DamageEffectType, SpellSchoolMask) { if (pInstance && doneBy) if (pInstance->GetData(TYPE_HODIR) == NOT_STARTED) @@ -659,7 +670,8 @@ public: if (timer <= diff) { timer = 2500; - if (me->IsSummon()) { + if (me->IsSummon()) + { if (Unit* s = me->ToTempSummon()->GetSummoner()) { if ((s->GetTypeId() == TYPEID_PLAYER && !s->HasAura(SPELL_FLASH_FREEZE_TRAPPED_PLAYER)) || (s->GetTypeId() == TYPEID_UNIT && !s->HasAura(SPELL_FLASH_FREEZE_TRAPPED_NPC))) @@ -696,7 +708,7 @@ public: struct npc_ulduar_toasty_fireAI : public NullCreatureAI { - npc_ulduar_toasty_fireAI(Creature *pCreature) : NullCreatureAI(pCreature) + npc_ulduar_toasty_fireAI(Creature* pCreature) : NullCreatureAI(pCreature) { me->CastSpell(me, SPELL_MAGE_TOASTY_FIRE_AURA, true); } @@ -739,7 +751,7 @@ public: struct npc_ulduar_hodir_priestAI : public ScriptedAI { - npc_ulduar_hodir_priestAI(Creature *pCreature) : ScriptedAI(pCreature) + npc_ulduar_hodir_priestAI(Creature* pCreature) : ScriptedAI(pCreature) { pInstance = me->GetInstanceScript(); events.Reset(); @@ -757,7 +769,7 @@ public: void ScheduleAbilities() { events.ScheduleEvent(EVENT_PRIEST_DISPELL_MAGIC, 7000); - events.ScheduleEvent(EVENT_PRIEST_GREAT_HEAL, urand(6000,7000)); + events.ScheduleEvent(EVENT_PRIEST_GREAT_HEAL, urand(6000, 7000)); events.ScheduleEvent(EVENT_PRIEST_SMITE, 2100); } @@ -802,7 +814,7 @@ public: break; case EVENT_PRIEST_GREAT_HEAL: me->CastSpell(me, SPELL_PRIEST_GREAT_HEAL, false); - events.RepeatEvent(urand(6000,7000)); + events.RepeatEvent(urand(6000, 7000)); break; case EVENT_PRIEST_SMITE: if (Unit* victim = me->GetVictim()) @@ -837,7 +849,7 @@ public: struct npc_ulduar_hodir_druidAI : public ScriptedAI { - npc_ulduar_hodir_druidAI(Creature *pCreature) : ScriptedAI(pCreature) + npc_ulduar_hodir_druidAI(Creature* pCreature) : ScriptedAI(pCreature) { pInstance = me->GetInstanceScript(); events.Reset(); @@ -935,7 +947,7 @@ public: struct npc_ulduar_hodir_shamanAI : public ScriptedAI { - npc_ulduar_hodir_shamanAI(Creature *pCreature) : ScriptedAI(pCreature) + npc_ulduar_hodir_shamanAI(Creature* pCreature) : ScriptedAI(pCreature) { pInstance = me->GetInstanceScript(); events.Reset(); @@ -1036,7 +1048,7 @@ public: struct npc_ulduar_hodir_mageAI : public ScriptedAI { - npc_ulduar_hodir_mageAI(Creature *pCreature) : ScriptedAI(pCreature) + npc_ulduar_hodir_mageAI(Creature* pCreature) : ScriptedAI(pCreature) { pInstance = me->GetInstanceScript(); events.Reset(); @@ -1149,9 +1161,9 @@ public: { PrepareAuraScript(spell_hodir_biting_cold_main_aura_AuraScript) - void HandleEffectPeriodic(AuraEffect const * aurEff) + void HandleEffectPeriodic(AuraEffect const* aurEff) { - if ((aurEff->GetTickNumber()%4) == 0) + if ((aurEff->GetTickNumber() % 4) == 0) if (Unit* target = GetTarget()) if (target->GetTypeId() == TYPEID_PLAYER && !target->isMoving() && !target->HasAura(SPELL_BITING_COLD_PLAYER_AURA)) target->CastSpell(target, SPELL_BITING_COLD_PLAYER_AURA, true); @@ -1163,7 +1175,7 @@ public: } }; - AuraScript *GetAuraScript() const + AuraScript* GetAuraScript() const { return new spell_hodir_biting_cold_main_aura_AuraScript(); } @@ -1188,9 +1200,9 @@ public: return true; } - void HandleEffectPeriodic(AuraEffect const * /*aurEff*/) + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) { - + if (Unit* target = GetTarget()) { if (target->GetMapId() == 603) @@ -1207,7 +1219,7 @@ public: else prev = true; - if (counter>=2) + if (counter >= 2) counter -= 2; else if (counter) --counter; @@ -1227,7 +1239,7 @@ public: } } - const int32 dmg = 200*pow(2.0f, GetStackAmount()); + const int32 dmg = 200 * pow(2.0f, GetStackAmount()); target->CastCustomSpell(target, SPELL_BITING_COLD_DAMAGE, &dmg, 0, 0, true); } } @@ -1238,7 +1250,7 @@ public: } }; - AuraScript *GetAuraScript() const + AuraScript* GetAuraScript() const { return new spell_hodir_biting_cold_player_aura_AuraScript(); } @@ -1310,9 +1322,9 @@ public: { PrepareAuraScript(spell_hodir_flash_freeze_AuraScript) - void HandleEffectPeriodic(AuraEffect const * aurEff) + void HandleEffectPeriodic(AuraEffect const* aurEff) { - if (aurEff->GetTotalTicks() > 0 && aurEff->GetTickNumber() == uint32(aurEff->GetTotalTicks())-1) + if (aurEff->GetTotalTicks() > 0 && aurEff->GetTickNumber() == uint32(aurEff->GetTotalTicks()) - 1) { Unit* target = GetTarget(); Unit* caster = GetCaster(); @@ -1330,7 +1342,7 @@ public: if (target->GetTypeId() == TYPEID_PLAYER) { caster->ToCreature()->AI()->SetData(1, 1); - if( Creature* c = target->SummonCreature(NPC_FLASH_FREEZE_PLR, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 5*60*1000) ) + if( Creature* c = target->SummonCreature(NPC_FLASH_FREEZE_PLR, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 5 * 60 * 1000) ) { c->CastSpell(target, SPELL_FLASH_FREEZE_TRAPPED_PLAYER, true); caster->ToCreature()->AI()->JustSummoned(c); @@ -1358,7 +1370,7 @@ public: return new spell_hodir_flash_freeze_SpellScript(); } - AuraScript *GetAuraScript() const + AuraScript* GetAuraScript() const { return new spell_hodir_flash_freeze_AuraScript(); } @@ -1394,7 +1406,7 @@ public: } }; - AuraScript *GetAuraScript() const + AuraScript* GetAuraScript() const { return new spell_hodir_storm_power_AuraScript(); } @@ -1409,7 +1421,7 @@ public: { PrepareAuraScript(spell_hodir_storm_cloud_AuraScript) - void HandleEffectPeriodic(AuraEffect const * /*aurEff*/) + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) { PreventDefaultAction(); if (Unit* target = GetTarget()) @@ -1422,7 +1434,7 @@ public: } }; - AuraScript *GetAuraScript() const + AuraScript* GetAuraScript() const { return new spell_hodir_storm_cloud_AuraScript(); } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp index 91a6aa99c..d2b5c0131 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp @@ -89,7 +89,7 @@ public: struct npc_ulduar_iron_constructAI : public ScriptedAI { - npc_ulduar_iron_constructAI(Creature *pCreature) : ScriptedAI(pCreature) + npc_ulduar_iron_constructAI(Creature* pCreature) : ScriptedAI(pCreature) { me->CastSpell(me, 38757, true); } @@ -126,14 +126,14 @@ public: else if (spell->Id == SPELL_HEAT_BUFF) { if (Aura* a = me->GetAura(SPELL_HEAT_BUFF)) - if( a->GetStackAmount() >= RAID_MODE(10,20) ) - { - if (RAID_MODE(1,0) && a->GetStackAmount() > 10) // prevent going over 10 on 10man version - a->ModStackAmount(-1); + if( a->GetStackAmount() >= RAID_MODE(10, 20) ) + { + if (RAID_MODE(1, 0) && a->GetStackAmount() > 10) // prevent going over 10 on 10man version + a->ModStackAmount(-1); - me->CastSpell(me, SPELL_MOLTEN, true); - me->getThreatManager().resetAllAggro(); - } + me->CastSpell(me, SPELL_MOLTEN, true); + me->getThreatManager().resetAllAggro(); + } } } @@ -194,7 +194,7 @@ public: struct boss_ignisAI : public ScriptedAI { - boss_ignisAI(Creature *pCreature) : ScriptedAI(pCreature) { } + boss_ignisAI(Creature* pCreature) : ScriptedAI(pCreature) { } EventMap events; uint8 counter; @@ -239,7 +239,7 @@ public: bShattered = false; lastShatterMSTime = 0; events.Reset(); - events.ScheduleEvent(EVENT_ACTIVATE_CONSTRUCT, RAID_MODE(40000,30000)); + events.ScheduleEvent(EVENT_ACTIVATE_CONSTRUCT, RAID_MODE(40000, 30000)); events.ScheduleEvent(EVENT_SPELL_SCORCH, 10000); events.ScheduleEvent(EVENT_SPELL_FLAME_JETS, 32000); events.ScheduleEvent(EVENT_GRAB, 25000); @@ -282,7 +282,7 @@ public: void KilledUnit(Unit* /*victim*/) { - if( rand()%2 ) + if( rand() % 2 ) { me->MonsterYell(TEXT_SLAY_1, LANG_UNIVERSAL, 0); me->PlayDirectSound(SOUND_SLAY_1); @@ -294,7 +294,7 @@ public: } } - void JustDied(Unit * /*victim*/) + void JustDied(Unit* /*victim*/) { me->MonsterYell(TEXT_DEATH, LANG_UNIVERSAL, 0); me->PlayDirectSound(SOUND_DEATH); @@ -350,10 +350,10 @@ public: events.PopEvent(); break; } - events.RepeatEvent(RAID_MODE(40000,30000)); + events.RepeatEvent(RAID_MODE(40000, 30000)); break; case EVENT_SPELL_SCORCH: - if( rand()%2 ) + if( rand() % 2 ) { me->MonsterYell(TEXT_SCORCH_1, LANG_UNIVERSAL, 0); me->PlayDirectSound(SOUND_SCORCH_1); @@ -410,8 +410,8 @@ public: if( !playerGUIDs.empty() ) { - int8 pos = urand(0, playerGUIDs.size()-1); - if( Player* pTarget = ObjectAccessor::GetPlayer(*me,playerGUIDs.at(pos)) ) + int8 pos = urand(0, playerGUIDs.size() - 1); + if( Player* pTarget = ObjectAccessor::GetPlayer(*me, playerGUIDs.at(pos)) ) { me->MonsterYell(TEXT_SLAG_POT, LANG_UNIVERSAL, 0); me->PlayDirectSound(SOUND_SLAG_POT); @@ -446,13 +446,13 @@ public: { PrepareAuraScript(spell_ignis_scorch_AuraScript) - void HandleEffectPeriodic(AuraEffect const * aurEff) + void HandleEffectPeriodic(AuraEffect const* aurEff) { if (aurEff->GetTotalTicks() >= 0 && aurEff->GetTickNumber() == uint32(aurEff->GetTotalTicks())) if (Unit* c = GetCaster()) - if (Creature* s = c->SummonCreature(NPC_SCORCHED_GROUND, c->GetPositionX()+20.0f*cos(c->GetOrientation()), c->GetPositionY()+20.0f*sin(c->GetOrientation()), 361.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 30000)) + if (Creature* s = c->SummonCreature(NPC_SCORCHED_GROUND, c->GetPositionX() + 20.0f * cos(c->GetOrientation()), c->GetPositionY() + 20.0f * sin(c->GetOrientation()), 361.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 30000)) { - if (!s->FindNearestCreature(NPC_WATER_TRIGGER, 25.0f,true)) // must be away from the water + if (!s->FindNearestCreature(NPC_WATER_TRIGGER, 25.0f, true)) // must be away from the water s->CastSpell(s, (aurEff->GetId() == 62546 ? SPELL_SCORCHED_GROUND_10 : SPELL_SCORCHED_GROUND_25), true); } } @@ -463,7 +463,7 @@ public: } }; - AuraScript *GetAuraScript() const + AuraScript* GetAuraScript() const { return new spell_ignis_scorch_AuraScript(); } @@ -505,7 +505,7 @@ public: { PrepareAuraScript(spell_ignis_slag_pot_AuraScript) - void HandleEffectPeriodic(AuraEffect const * /*aurEff*/) + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) { if (Unit* c = GetCaster()) if (Unit* t = GetTarget()) @@ -540,7 +540,7 @@ public: } }; - AuraScript *GetAuraScript() const + AuraScript* GetAuraScript() const { return new spell_ignis_slag_pot_AuraScript(); } @@ -548,15 +548,15 @@ public: class achievement_ignis_shattered : public AchievementCriteriaScript { - public: - achievement_ignis_shattered() : AchievementCriteriaScript("achievement_ignis_shattered") {} +public: + achievement_ignis_shattered() : AchievementCriteriaScript("achievement_ignis_shattered") {} - bool OnCheck(Player* /*player*/, Unit* target) - { - if (!target || target->GetTypeId() != TYPEID_UNIT) - return false; - return !!target->ToCreature()->AI()->GetData(1337); - } + bool OnCheck(Player* /*player*/, Unit* target) + { + if (!target || target->GetTypeId() != TYPEID_UNIT) + return false; + return !!target->ToCreature()->AI()->GetData(1337); + } }; void AddSC_boss_ignis() diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp index 3af3a4700..32a85c802 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp @@ -289,7 +289,7 @@ public: bridge->SetGoState(GO_STATE_READY); // Summon Chest - if (GameObject* go = me->SummonGameObject(RAID_MODE(GO_KOLOGARN_CHEST, GO_KOLOGARN_CHEST_HERO), 1839.62f, -35.98f, 448.81f, 3.6f, 0, 0, 0, 0, 7*86400)) + if (GameObject* go = me->SummonGameObject(RAID_MODE(GO_KOLOGARN_CHEST, GO_KOLOGARN_CHEST_HERO), 1839.62f, -35.98f, 448.81f, 3.6f, 0, 0, 0, 0, 7 * 86400)) { me->RemoveGameObject(go, false); go->SetSpellId(1); // hack to make it despawn @@ -303,7 +303,7 @@ public: void KilledUnit(Unit*) override { - if (!urand(0,2)) + if (!urand(0, 2)) return; Talk(SAY_SLAY); @@ -346,7 +346,7 @@ public: { if (who && who->GetEntry() == me->GetEntry() && me->GetHealth()) { - damage = std::min(damage, me->GetHealth()-1); + damage = std::min(damage, me->GetHealth() - 1); me->LowerPlayerDamageReq(damage); } } @@ -362,7 +362,7 @@ public: events.ScheduleEvent(EVENT_FOCUSED_EYEBEAM, 25000); events.ScheduleEvent(EVENT_PREPARE_BREATH, 3000); //events.ScheduleEvent(EVENT_ENRAGE, x); no info - + Talk(SAY_AGGRO); me->setActive(true); @@ -403,7 +403,7 @@ public: me->CastSpell(me->GetVictim(), SPELL_OVERHEAD_SMASH, false); else if (_left || _right) me->CastSpell(me->GetVictim(), SPELL_ONEARMED_OVERHEAD_SMASH, false); - + events.DelayEvents(1000); events.ScheduleEvent(EVENT_SMASH, 14000); return; @@ -413,7 +413,7 @@ public: if (Creature* cr = me->FindNearestCreature(NPC_SWEEP_TRIGGER, 300)) cr->CastSpell(cr, SPELL_ARM_SWEEP, false); - if (urand(0,1)) + if (urand(0, 1)) Talk(SAY_SHOCKWAVE); } @@ -430,37 +430,37 @@ public: Talk(EMOTE_STONE_GRIP); return; case EVENT_FOCUSED_EYEBEAM: - { - events.ScheduleEvent(EVENT_FOCUSED_EYEBEAM, 13000+rand()%5000); - Unit* target = nullptr; - Map::PlayerList const& pList = me->GetMap()->GetPlayers(); - for(auto itr = pList.begin(); itr != pList.end(); ++itr) { - if (itr->GetSource()->GetPositionZ() < 420) - continue; + events.ScheduleEvent(EVENT_FOCUSED_EYEBEAM, 13000 + rand() % 5000); + Unit* target = nullptr; + Map::PlayerList const& pList = me->GetMap()->GetPlayers(); + for(auto itr = pList.begin(); itr != pList.end(); ++itr) + { + if (itr->GetSource()->GetPositionZ() < 420) + continue; - target = itr->GetSource(); - if (urand(0,3) == 3) + target = itr->GetSource(); + if (urand(0, 3) == 3) + break; + } + if (!target) break; - } - if (!target) - break; - if (Creature* eye = me->SummonCreature(NPC_EYE_LEFT, target->GetPositionX(), target->GetPositionY()-6, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 12000)) - { - eye->GetMotionMaster()->MoveFollow(target, 0.01f, M_PI*3/2, MOTION_SLOT_CONTROLLED); - me->CastSpell(eye, SPELL_FOCUSED_EYEBEAM_LEFT, true); - } - if (Creature* eye2 = me->SummonCreature(NPC_EYE_RIGHT, target->GetPositionX(), target->GetPositionY()+6, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 12000)) - { - eye2->GetMotionMaster()->MoveFollow(target, 0.01f, M_PI/2, MOTION_SLOT_CONTROLLED); - eye2->CastSpell(me, SPELL_FOCUSED_EYEBEAM_RIGHT, true); - } + if (Creature* eye = me->SummonCreature(NPC_EYE_LEFT, target->GetPositionX(), target->GetPositionY() - 6, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 12000)) + { + eye->GetMotionMaster()->MoveFollow(target, 0.01f, M_PI * 3 / 2, MOTION_SLOT_CONTROLLED); + me->CastSpell(eye, SPELL_FOCUSED_EYEBEAM_LEFT, true); + } + if (Creature* eye2 = me->SummonCreature(NPC_EYE_RIGHT, target->GetPositionX(), target->GetPositionY() + 6, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 12000)) + { + eye2->GetMotionMaster()->MoveFollow(target, 0.01f, M_PI / 2, MOTION_SLOT_CONTROLLED); + eye2->CastSpell(me, SPELL_FOCUSED_EYEBEAM_RIGHT, true); + } - Talk(EMOTE_EYES); - events.DelayEvents(12000, 0); - return; - } + Talk(EMOTE_EYES); + events.DelayEvents(12000, 0); + return; + } case EVENT_RESTORE_ARM_LEFT: // shouldn't happen events.PopEvent(); @@ -564,24 +564,28 @@ public: // left arm if( me->GetEntry() == NPC_LEFT_ARM ) { - x = 1776.97f; y = -44.8396f; z = 448.888f; + x = 1776.97f; + y = -44.8396f; + z = 448.888f; } else { - x = 1777.82f; y = -3.50803f; z = 448.888f; + x = 1777.82f; + y = -3.50803f; + z = 448.888f; } - if (Creature *cr = me->SummonTrigger(x, y, z, 0, 5000)) + if (Creature* cr = me->SummonTrigger(x, y, z, 0, 5000)) { cr->CastSpell(cr, SPELL_RUBBLE_FALL, true); if (me->GetInstanceScript()) if (Creature* kologarn = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetData64(TYPE_KOLOGARN))) for (uint8 i = 0; i < 5; ++i) - if (Creature* cr2 = kologarn->SummonCreature(NPC_RUBBLE_SUMMON, cr->GetPositionX()+irand(-5,5), cr->GetPositionY()+irand(-5,5), cr->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000)) + if (Creature* cr2 = kologarn->SummonCreature(NPC_RUBBLE_SUMMON, cr->GetPositionX() + irand(-5, 5), cr->GetPositionY() + irand(-5, 5), cr->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000)) { cr2->SetInCombatWithZone(); - if (Unit *target = SelectTargetFromPlayerList(100)) + if (Unit* target = SelectTargetFromPlayerList(100)) cr2->AI()->AttackStart(target); } } @@ -589,7 +593,7 @@ public: if (me->GetInstanceScript()) if (Creature* cr = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetData64(TYPE_KOLOGARN))) cr->AI()->DoAction(DATA_KOLOGARN_RUBBLE_ACHIEV); - + me->ExitVehicle(); } }; @@ -607,7 +611,7 @@ public: struct boss_kologarn_eyebeamAI : public NullCreatureAI { - boss_kologarn_eyebeamAI(Creature *c) : NullCreatureAI(c), _timer(1), _damaged(false) {} + boss_kologarn_eyebeamAI(Creature* c) : NullCreatureAI(c), _timer(1), _damaged(false) {} uint32 _timer; bool _damaged; @@ -641,223 +645,223 @@ public: // predicate function to select non main tank target class StoneGripTargetSelector : public acore::unary_function { - public: - StoneGripTargetSelector(Creature* me, Unit const* victim) : _me(me), _victim(victim) {} +public: + StoneGripTargetSelector(Creature* me, Unit const* victim) : _me(me), _victim(victim) {} - bool operator() (WorldObject* target) const - { - if (target == _victim && _me->getThreatManager().getThreatList().size() > 1) - return true; + bool operator() (WorldObject* target) const + { + if (target == _victim && _me->getThreatManager().getThreatList().size() > 1) + return true; - if (target->GetTypeId() != TYPEID_PLAYER) - return true; + if (target->GetTypeId() != TYPEID_PLAYER) + return true; - return false; - } + return false; + } - Creature* _me; - Unit const* _victim; + Creature* _me; + Unit const* _victim; }; class spell_ulduar_stone_grip_cast_target : public SpellScriptLoader { - public: - spell_ulduar_stone_grip_cast_target() : SpellScriptLoader("spell_ulduar_stone_grip_cast_target") { } +public: + spell_ulduar_stone_grip_cast_target() : SpellScriptLoader("spell_ulduar_stone_grip_cast_target") { } - class spell_ulduar_stone_grip_cast_target_SpellScript : public SpellScript + class spell_ulduar_stone_grip_cast_target_SpellScript : public SpellScript + { + PrepareSpellScript(spell_ulduar_stone_grip_cast_target_SpellScript); + + bool Load() { - PrepareSpellScript(spell_ulduar_stone_grip_cast_target_SpellScript); - - bool Load() - { - if (GetCaster()->GetTypeId() != TYPEID_UNIT) - return false; - return true; - } - - void FilterTargetsInitial(std::list& targets) - { - // Remove "main tank" and non-player targets - targets.remove_if (StoneGripTargetSelector(GetCaster()->ToCreature(), GetCaster()->GetVictim())); - // Maximum affected targets per difficulty mode - uint32 maxTargets = 1; - if (GetSpellInfo()->Id == 63981) - maxTargets = 3; - - // Return a random amount of targets based on maxTargets - while (maxTargets < targets.size()) - { - std::list::iterator itr = targets.begin(); - advance(itr, urand(0, targets.size()-1)); - targets.erase(itr); - } - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_ulduar_stone_grip_cast_target_SpellScript::FilterTargetsInitial, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_ulduar_stone_grip_cast_target_SpellScript(); + if (GetCaster()->GetTypeId() != TYPEID_UNIT) + return false; + return true; } + + void FilterTargetsInitial(std::list& targets) + { + // Remove "main tank" and non-player targets + targets.remove_if (StoneGripTargetSelector(GetCaster()->ToCreature(), GetCaster()->GetVictim())); + // Maximum affected targets per difficulty mode + uint32 maxTargets = 1; + if (GetSpellInfo()->Id == 63981) + maxTargets = 3; + + // Return a random amount of targets based on maxTargets + while (maxTargets < targets.size()) + { + std::list::iterator itr = targets.begin(); + advance(itr, urand(0, targets.size() - 1)); + targets.erase(itr); + } + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_ulduar_stone_grip_cast_target_SpellScript::FilterTargetsInitial, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_ulduar_stone_grip_cast_target_SpellScript(); + } }; class spell_ulduar_stone_grip : public SpellScriptLoader { - public: - spell_ulduar_stone_grip() : SpellScriptLoader("spell_ulduar_stone_grip") { } +public: + spell_ulduar_stone_grip() : SpellScriptLoader("spell_ulduar_stone_grip") { } - class spell_ulduar_stone_grip_AuraScript : public AuraScript + class spell_ulduar_stone_grip_AuraScript : public AuraScript + { + PrepareAuraScript(spell_ulduar_stone_grip_AuraScript); + + void OnRemoveStun(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_ulduar_stone_grip_AuraScript); - - void OnRemoveStun(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - if (Player* owner = GetOwner()->ToPlayer()) - owner->RemoveAurasDueToSpell(aurEff->GetAmount()); - } - - void Register() - { - OnEffectRemove += AuraEffectRemoveFn(spell_ulduar_stone_grip_AuraScript::OnRemoveStun, EFFECT_2, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_ulduar_stone_grip_AuraScript(); + if (Player* owner = GetOwner()->ToPlayer()) + owner->RemoveAurasDueToSpell(aurEff->GetAmount()); } + + void Register() + { + OnEffectRemove += AuraEffectRemoveFn(spell_ulduar_stone_grip_AuraScript::OnRemoveStun, EFFECT_2, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_ulduar_stone_grip_AuraScript(); + } }; class spell_ulduar_squeezed_lifeless : public SpellScriptLoader { - public: - spell_ulduar_squeezed_lifeless() : SpellScriptLoader("spell_ulduar_squeezed_lifeless") { } +public: + spell_ulduar_squeezed_lifeless() : SpellScriptLoader("spell_ulduar_squeezed_lifeless") { } - class spell_ulduar_squeezed_lifeless_SpellScript : public SpellScript + class spell_ulduar_squeezed_lifeless_SpellScript : public SpellScript + { + PrepareSpellScript(spell_ulduar_squeezed_lifeless_SpellScript); + + void HandleInstaKill(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_ulduar_squeezed_lifeless_SpellScript); + if (!GetHitPlayer() || !GetHitPlayer()->GetVehicle()) + return; - void HandleInstaKill(SpellEffIndex /*effIndex*/) - { - if (!GetHitPlayer() || !GetHitPlayer()->GetVehicle()) - return; - - // Hack to set correct position is in _ExitVehicle() - GetHitPlayer()->ExitVehicle(); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_ulduar_squeezed_lifeless_SpellScript::HandleInstaKill, EFFECT_1, SPELL_EFFECT_INSTAKILL); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_ulduar_squeezed_lifeless_SpellScript(); + // Hack to set correct position is in _ExitVehicle() + GetHitPlayer()->ExitVehicle(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_ulduar_squeezed_lifeless_SpellScript::HandleInstaKill, EFFECT_1, SPELL_EFFECT_INSTAKILL); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_ulduar_squeezed_lifeless_SpellScript(); + } }; class spell_kologarn_stone_shout : public SpellScriptLoader { - public: - spell_kologarn_stone_shout() : SpellScriptLoader("spell_kologarn_stone_shout") { } +public: + spell_kologarn_stone_shout() : SpellScriptLoader("spell_kologarn_stone_shout") { } - class spell_kologarn_stone_shout_AuraScript : public AuraScript + class spell_kologarn_stone_shout_AuraScript : public AuraScript + { + PrepareAuraScript(spell_kologarn_stone_shout_AuraScript); + + void OnPeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_kologarn_stone_shout_AuraScript); - - void OnPeriodic(AuraEffect const* /*aurEff*/) - { - uint32 triggerSpellId = GetSpellInfo()->Effects[EFFECT_0].TriggerSpell; - if (Unit* caster = GetCaster()) - caster->CastSpell(caster, triggerSpellId, false); - } - - void Register() - { - if (m_scriptSpellId == SPELL_STONE_SHOUT_10 || m_scriptSpellId == SPELL_STONE_SHOUT_25) - OnEffectPeriodic += AuraEffectPeriodicFn(spell_kologarn_stone_shout_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_kologarn_stone_shout_AuraScript(); + uint32 triggerSpellId = GetSpellInfo()->Effects[EFFECT_0].TriggerSpell; + if (Unit* caster = GetCaster()) + caster->CastSpell(caster, triggerSpellId, false); } - class spell_kologarn_stone_shout_SpellScript : public SpellScript + void Register() { - PrepareSpellScript(spell_kologarn_stone_shout_SpellScript); - - void FilterTargets(std::list& targets) - { - targets.remove_if (PlayerOrPetCheck()); - } - - void Register() - { - if (m_scriptSpellId != SPELL_STONE_SHOUT_10 && m_scriptSpellId != SPELL_STONE_SHOUT_25) - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_kologarn_stone_shout_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_kologarn_stone_shout_SpellScript(); + if (m_scriptSpellId == SPELL_STONE_SHOUT_10 || m_scriptSpellId == SPELL_STONE_SHOUT_25) + OnEffectPeriodic += AuraEffectPeriodicFn(spell_kologarn_stone_shout_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); } + }; + + AuraScript* GetAuraScript() const + { + return new spell_kologarn_stone_shout_AuraScript(); + } + + class spell_kologarn_stone_shout_SpellScript : public SpellScript + { + PrepareSpellScript(spell_kologarn_stone_shout_SpellScript); + + void FilterTargets(std::list& targets) + { + targets.remove_if (PlayerOrPetCheck()); + } + + void Register() + { + if (m_scriptSpellId != SPELL_STONE_SHOUT_10 && m_scriptSpellId != SPELL_STONE_SHOUT_25) + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_kologarn_stone_shout_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_kologarn_stone_shout_SpellScript(); + } }; class achievement_kologarn_looks_could_kill : public AchievementCriteriaScript { - public: - achievement_kologarn_looks_could_kill() : AchievementCriteriaScript("achievement_kologarn_looks_could_kill") {} +public: + achievement_kologarn_looks_could_kill() : AchievementCriteriaScript("achievement_kologarn_looks_could_kill") {} - bool OnCheck(Player* /*player*/, Unit* target) - { - if (target) - if (InstanceScript* instance = target->GetInstanceScript()) - if (Creature* cr = ObjectAccessor::GetCreature(*target, instance->GetData64(TYPE_KOLOGARN))) - return cr->AI()->GetData(DATA_KOLOGARN_LOOKS_ACHIEV); - - return false; - } + bool OnCheck(Player* /*player*/, Unit* target) + { + if (target) + if (InstanceScript* instance = target->GetInstanceScript()) + if (Creature* cr = ObjectAccessor::GetCreature(*target, instance->GetData64(TYPE_KOLOGARN))) + return cr->AI()->GetData(DATA_KOLOGARN_LOOKS_ACHIEV); + + return false; + } }; class achievement_kologarn_rubble_and_roll : public AchievementCriteriaScript { - public: - achievement_kologarn_rubble_and_roll() : AchievementCriteriaScript("achievement_kologarn_rubble_and_roll") {} +public: + achievement_kologarn_rubble_and_roll() : AchievementCriteriaScript("achievement_kologarn_rubble_and_roll") {} - bool OnCheck(Player* /*player*/, Unit* target) - { - if (target) - if (InstanceScript* instance = target->GetInstanceScript()) - if (Creature* cr = ObjectAccessor::GetCreature(*target, instance->GetData64(TYPE_KOLOGARN))) - return cr->AI()->GetData(DATA_KOLOGARN_RUBBLE_ACHIEV); - - return false; - } + bool OnCheck(Player* /*player*/, Unit* target) + { + if (target) + if (InstanceScript* instance = target->GetInstanceScript()) + if (Creature* cr = ObjectAccessor::GetCreature(*target, instance->GetData64(TYPE_KOLOGARN))) + return cr->AI()->GetData(DATA_KOLOGARN_RUBBLE_ACHIEV); + + return false; + } }; class achievement_kologarn_with_open_arms : public AchievementCriteriaScript { - public: - achievement_kologarn_with_open_arms() : AchievementCriteriaScript("achievement_kologarn_with_open_arms") {} +public: + achievement_kologarn_with_open_arms() : AchievementCriteriaScript("achievement_kologarn_with_open_arms") {} - bool OnCheck(Player* /*player*/, Unit* target) - { - if (target) - if (InstanceScript* instance = target->GetInstanceScript()) - if (Creature* cr = ObjectAccessor::GetCreature(*target, instance->GetData64(TYPE_KOLOGARN))) - return cr->AI()->GetData(DATA_KOLOGARN_ARMS_ACHIEV); - - return false; - } + bool OnCheck(Player* /*player*/, Unit* target) + { + if (target) + if (InstanceScript* instance = target->GetInstanceScript()) + if (Creature* cr = ObjectAccessor::GetCreature(*target, instance->GetData64(TYPE_KOLOGARN))) + return cr->AI()->GetData(DATA_KOLOGARN_ARMS_ACHIEV); + + return false; + } }; void AddSC_boss_kologarn() diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp index d6d092a06..d0acacba2 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp @@ -293,7 +293,7 @@ public: struct boss_mimironAI : public ScriptedAI { - boss_mimironAI(Creature *pCreature) : ScriptedAI(pCreature), summons(me) + boss_mimironAI(Creature* pCreature) : ScriptedAI(pCreature), summons(me) { pInstance = me->GetInstanceScript(); if (!me->IsAlive()) @@ -384,14 +384,14 @@ public: else { events.ScheduleEvent(EVENT_MIMIRON_SAY_HARDMODE, 7000); - events.ScheduleEvent(EVENT_BERSERK, Is25ManRaid() ? 10*MINUTE*IN_MILLISECONDS : 8*MINUTE*IN_MILLISECONDS); + events.ScheduleEvent(EVENT_BERSERK, Is25ManRaid() ? 10 * MINUTE* IN_MILLISECONDS : 8 * MINUTE * IN_MILLISECONDS); events.ScheduleEvent(EVENT_COMPUTER_SAY_INITIATED, 0); events.ScheduleEvent(EVENT_COMPUTER_SAY_MINUTES, 3000); minutesTalkNum = Is25ManRaid() ? TALK_COMPUTER_TEN : TALK_COMPUTER_EIGHT; - for (uint32 i=0; i pg; - Map::PlayerList const &pl = me->GetMap()->GetPlayers(); + Map::PlayerList const& pl = me->GetMap()->GetPlayers(); for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr ) if( Player* plr = itr->GetSource() ) if( plr->IsAlive() && plr->GetExactDist2d(me) < 150.0f && !plr->IsGameMaster() ) pg.push_back(plr); - for( uint8 i=0; i<3; ++i ) + for( uint8 i = 0; i < 3; ++i ) if( !pg.empty() ) { - uint8 index = urand(0, pg.size()-1); + uint8 index = urand(0, pg.size() - 1); Player* p = pg[index]; - float angle = rand_norm()*2*M_PI; + float angle = rand_norm() * 2 * M_PI; float z = 364.35f; - if (!p->IsWithinLOS(p->GetPositionX()+cos(angle)*5.0f, p->GetPositionY()+sin(angle)*5.0f, z)) + if (!p->IsWithinLOS(p->GetPositionX() + cos(angle) * 5.0f, p->GetPositionY() + sin(angle) * 5.0f, z)) angle = p->GetAngle(2744.65f, 2569.46f); - me->CastSpell(p->GetPositionX()+cos(angle)*5.0f, p->GetPositionY()+sin(angle)*5.0f, z, SPELL_SUMMON_FLAMES_INITIAL, true); - pg.erase(pg.begin()+index); + me->CastSpell(p->GetPositionX() + cos(angle) * 5.0f, p->GetPositionY() + sin(angle) * 5.0f, z, SPELL_SUMMON_FLAMES_INITIAL, true); + pg.erase(pg.begin() + index); } events.RepeatEvent(30000); @@ -553,7 +553,7 @@ public: case EVENT_ELEVATOR_INTERVAL_1: if(me->SummonCreature(NPC_VX001, 2744.65f, 2569.46f, 364.40f, 3.14f, TEMPSUMMON_MANUAL_DESPAWN)) { - if( GameObject *elevator = me->FindNearestGameObject(GO_MIMIRON_ELEVATOR, 100.0f) ) + if( GameObject* elevator = me->FindNearestGameObject(GO_MIMIRON_ELEVATOR, 100.0f) ) { elevator->SetLootState(GO_READY); elevator->UseDoorOrButton(0, true); @@ -809,12 +809,12 @@ public: summons.DespawnEntry(33576); float angle = VX001->GetOrientation(); - float v_x = me->GetPositionX()+cos(angle)*10.0f; - float v_y = me->GetPositionY()+sin(angle)*10.0f; + float v_x = me->GetPositionX() + cos(angle) * 10.0f; + float v_y = me->GetPositionY() + sin(angle) * 10.0f; me->GetMotionMaster()->MoveJump(v_x, v_y, 364.32f, 7.0f, 7.0f); if( pInstance ) - for( uint16 i=0; i<3; ++i ) + for( uint16 i = 0; i < 3; ++i ) if( uint64 guid = pInstance->GetData64(DATA_GO_MIMIRON_DOOR_1 + i) ) if( GameObject* door = ObjectAccessor::GetGameObject(*me, guid) ) if( door->GetGoState() != GO_STATE_ACTIVE ) @@ -839,7 +839,7 @@ public: me->PlayDirectSound(SOUND_VOLTRON_DEATH); // spawn chest if( uint32 chestId = (hardmode ? RAID_MODE(GO_MIMIRON_CHEST_HARD, GO_MIMIRON_CHEST_HERO_HARD) : RAID_MODE(GO_MIMIRON_CHEST, GO_MIMIRON_CHEST_HERO)) ) - if( GameObject *go = me->SummonGameObject(chestId, 2744.65f, 2569.46f, 364.397f, 0, 0, 0, 0, 0, 0) ) + if( GameObject* go = me->SummonGameObject(chestId, 2744.65f, 2569.46f, 364.397f, 0, 0, 0, 0, 0, 0) ) go->SetUInt32Value(GAMEOBJECT_FLAGS, 0); events.PopEvent(); events.ScheduleEvent(EVENT_DISAPPEAR, 15000); @@ -899,7 +899,7 @@ public: void ResetGameObjects() { if( pInstance ) - for( uint16 i=0; i<3; ++i ) + for( uint16 i = 0; i < 3; ++i ) if( uint64 guid = pInstance->GetData64(DATA_GO_MIMIRON_DOOR_1 + i) ) if( GameObject* door = ObjectAccessor::GetGameObject(*me, guid) ) if( door->GetGoState() != GO_STATE_ACTIVE ) @@ -908,7 +908,7 @@ public: door->UseDoorOrButton(0, false); } - if( GameObject *elevator = me->FindNearestGameObject(GO_MIMIRON_ELEVATOR, 200.0f) ) + if( GameObject* elevator = me->FindNearestGameObject(GO_MIMIRON_ELEVATOR, 200.0f) ) { if( elevator->GetGoState() != GO_STATE_ACTIVE ) { @@ -918,7 +918,7 @@ public: elevator->EnableCollision(false); } - if( GameObject *button = me->FindNearestGameObject(GO_BUTTON, 200.0f) ) + if( GameObject* button = me->FindNearestGameObject(GO_BUTTON, 200.0f) ) if( button->GetGoState() != GO_STATE_READY ) { button->SetLootState(GO_READY); @@ -930,7 +930,7 @@ public: void CloseDoorAndButton() { if( pInstance ) - for( uint16 i=0; i<3; ++i ) + for( uint16 i = 0; i < 3; ++i ) if( uint64 guid = pInstance->GetData64(DATA_GO_MIMIRON_DOOR_1 + i) ) if( GameObject* door = ObjectAccessor::GetGameObject(*me, guid) ) if( door->GetGoState() != GO_STATE_READY ) @@ -939,7 +939,7 @@ public: door->UseDoorOrButton(0, false); } - if( GameObject *button = me->FindNearestGameObject(GO_BUTTON, 200.0f) ) + if( GameObject* button = me->FindNearestGameObject(GO_BUTTON, 200.0f) ) if( button->GetGoState() != GO_STATE_ACTIVE ) { button->SetLootState(GO_READY); @@ -999,12 +999,18 @@ public: { switch (id) { - case 1: return (hardmode ? 1 : 0); - case 2: return (berserk ? 1 : 0); - case 10: return allowedFlameSpreadTime; - case 11: return (bAchievProximityMine ? 1 : 0); - case 12: return (bAchievBombBot ? 1 : 0); - case 13: return (bAchievRocketStrike ? 1 : 0); + case 1: + return (hardmode ? 1 : 0); + case 2: + return (berserk ? 1 : 0); + case 10: + return allowedFlameSpreadTime; + case 11: + return (bAchievProximityMine ? 1 : 0); + case 12: + return (bAchievBombBot ? 1 : 0); + case 13: + return (bAchievRocketStrike ? 1 : 0); } return 0; } @@ -1023,7 +1029,7 @@ public: struct npc_ulduar_leviathan_mkiiAI : public ScriptedAI { - npc_ulduar_leviathan_mkiiAI(Creature *pCreature) : ScriptedAI(pCreature) + npc_ulduar_leviathan_mkiiAI(Creature* pCreature) : ScriptedAI(pCreature) { pInstance = me->GetInstanceScript(); bIsEvading = false; @@ -1091,7 +1097,7 @@ public: } } - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) { if (damage >= me->GetHealth() || me->GetHealth() < 15000) { @@ -1160,14 +1166,14 @@ public: { Player* pTarget = nullptr; std::vector pList; - Map::PlayerList const &pl = me->GetMap()->GetPlayers(); + Map::PlayerList const& pl = me->GetMap()->GetPlayers(); for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr ) if (Player* plr = itr->GetSource()) if( plr->IsAlive() && plr->GetDistance2d(me) > 15.0f ) pList.push_back(plr); if (!pList.empty()) - pTarget = pList[urand(0, pList.size()-1)]; + pTarget = pList[urand(0, pList.size() - 1)]; else pTarget = (Player*)SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true); @@ -1192,17 +1198,17 @@ public: break; case EVENT_PROXIMITY_MINES_1: { - float angle = rand_norm()*2*M_PI; - float x,y,z; - me->GetPosition(x,y,z); - for( uint8 i=0; i<17; ++i ) + float angle = rand_norm() * 2 * M_PI; + float x, y, z; + me->GetPosition(x, y, z); + for( uint8 i = 0; i < 17; ++i ) { if( i == 7 ) continue; - float v_xmin = 0.1f * cos( angle + i*M_PI/9 ); - float v_ymin = 0.1f * sin( angle + i*M_PI/9 ); - if( Creature* pmNPC = me->SummonCreature(NPC_PROXIMITY_MINE, x+v_xmin, y+v_ymin, z, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 40000) ) + float v_xmin = 0.1f * cos( angle + i * M_PI / 9 ); + float v_ymin = 0.1f * sin( angle + i * M_PI / 9 ); + if( Creature* pmNPC = me->SummonCreature(NPC_PROXIMITY_MINE, x + v_xmin, y + v_ymin, z, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 40000) ) pmNPC->KnockbackFrom(x, y, 6.0f, 25.0f); } @@ -1225,7 +1231,7 @@ public: { if( Phase == 1 ) { - if( rand()%2 ) + if( rand() % 2 ) { c->MonsterYell(TEXT_LMK2_SLAIN_1, LANG_UNIVERSAL, 0); c->PlayDirectSound(SOUND_TANK_SLAY_1); @@ -1238,7 +1244,7 @@ public: } else { - if( rand()%2 ) + if( rand() % 2 ) { c->MonsterYell(TEXT_VOLTRON_SLAIN_1, LANG_UNIVERSAL, 0); c->PlayDirectSound(SOUND_VOLTRON_SLAY_1); @@ -1286,7 +1292,7 @@ public: return 0; } - void SpellHit(Unit* /*caster*/, const SpellInfo *spell) + void SpellHit(Unit* /*caster*/, const SpellInfo* spell) { if( spell->Id == SPELL_SELF_REPAIR ) { @@ -1309,7 +1315,7 @@ public: struct npc_ulduar_vx001AI : public ScriptedAI { - npc_ulduar_vx001AI(Creature *pCreature) : ScriptedAI(pCreature) + npc_ulduar_vx001AI(Creature* pCreature) : ScriptedAI(pCreature) { pInstance = me->GetInstanceScript(); bIsEvading = false; @@ -1392,13 +1398,13 @@ public: { if (action == 1337) if( Vehicle* vk = me->GetVehicleKit() ) - for (uint8 i=0; i<2; ++i) - if (Unit* r = vk->GetPassenger(5+i)) + for (uint8 i = 0; i < 2; ++i) + if (Unit* r = vk->GetPassenger(5 + i)) if (r->GetTypeId() == TYPEID_UNIT) r->ToCreature()->DespawnOrUnsummon(1); } - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) { if (damage >= me->GetHealth() || me->GetHealth() < 15000) { @@ -1453,7 +1459,7 @@ public: { if (spinningUpTimer <= diff) { - float angle = (spinningUpOrientation*2*M_PI)/100.0f; + float angle = (spinningUpOrientation * 2 * M_PI) / 100.0f; me->SetOrientation(angle); me->SetFacingTo(angle); spinningUpTimer = 0; @@ -1476,9 +1482,9 @@ public: case EVENT_SPELL_ROCKET_STRIKE: if( Vehicle* vk = me->GetVehicleKit() ) { - for( int i=0; i<(Phase/2); ++i ) + for( int i = 0; i < (Phase / 2); ++i ) { - uint8 index = (Phase == 2 ? rand()%2 : i); + uint8 index = (Phase == 2 ? rand() % 2 : i); if( Unit* r = vk->GetPassenger(5 + index) ) if (Player* temp = SelectTargetFromPlayerList(100.0f)) { @@ -1486,9 +1492,9 @@ public: trigger->CastSpell(trigger, SPELL_ROCKET_STRIKE_AURA, true); Position exitPos; r->GetPosition(&exitPos); - exitPos.m_positionX += cos(me->GetOrientation())*2.35f; - exitPos.m_positionY += sin(me->GetOrientation())*2.35f; - exitPos.m_positionZ += 2.0f*Phase; + exitPos.m_positionX += cos(me->GetOrientation()) * 2.35f; + exitPos.m_positionY += sin(me->GetOrientation()) * 2.35f; + exitPos.m_positionZ += 2.0f * Phase; r->_ExitVehicle(&exitPos); me->RemoveAurasByType(SPELL_AURA_CONTROL_VEHICLE, r->GetGUID()); if (r->GetTypeId() == TYPEID_UNIT) @@ -1502,9 +1508,9 @@ public: case EVENT_REINSTALL_ROCKETS: if (Vehicle* vk = me->GetVehicleKit()) { - for (uint8 i=5; i<=6; ++i) + for (uint8 i = 5; i <= 6; ++i) if (!vk->GetPassenger(i)) - if (TempSummon* accessory = me->SummonCreature(NPC_ROCKET_VISUAL, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+4.0f, me->GetOrientation(), TEMPSUMMON_MANUAL_DESPAWN)) + if (TempSummon* accessory = me->SummonCreature(NPC_ROCKET_VISUAL, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 4.0f, me->GetOrientation(), TEMPSUMMON_MANUAL_DESPAWN)) if (!me->HandleSpellClick(accessory, i)) accessory->UnSummon(); } @@ -1548,7 +1554,7 @@ public: if (Player* p = SelectTargetFromPlayerList(80.0f)) { float angle = me->GetAngle(p); - spinningUpOrientation = (uint32)((angle*100.0f)/(2*M_PI)); + spinningUpOrientation = (uint32)((angle * 100.0f) / (2 * M_PI)); spinningUpTimer = 1500; me->SetOrientation(angle); me->SetFacingTo(angle); @@ -1576,7 +1582,7 @@ public: { if( Phase == 2 ) { - if( rand()%2 ) + if( rand() % 2 ) { c->MonsterYell(TEXT_VX001_SLAIN_1, LANG_UNIVERSAL, 0); c->PlayDirectSound(SOUND_TORSO_SLAY_1); @@ -1589,7 +1595,7 @@ public: } else { - if( rand()%2 ) + if( rand() % 2 ) { c->MonsterYell(TEXT_VOLTRON_SLAIN_1, LANG_UNIVERSAL, 0); c->PlayDirectSound(SOUND_VOLTRON_SLAY_1); @@ -1625,7 +1631,7 @@ public: p->ToCreature()->DespawnOrUnsummon(8000); } - void SpellHit(Unit* /*caster*/, const SpellInfo *spell) + void SpellHit(Unit* /*caster*/, const SpellInfo* spell) { if( spell->Id == SPELL_SELF_REPAIR ) { @@ -1648,7 +1654,7 @@ public: struct npc_ulduar_aerial_command_unitAI : public ScriptedAI { - npc_ulduar_aerial_command_unitAI(Creature *pCreature) : ScriptedAI(pCreature), summons(me) + npc_ulduar_aerial_command_unitAI(Creature* pCreature) : ScriptedAI(pCreature), summons(me) { pInstance = me->GetInstanceScript(); bIsEvading = false; @@ -1728,7 +1734,7 @@ public: summons.DespawnAll(); } - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) { if (damage >= me->GetHealth() || me->GetHealth() < 15000) { @@ -1789,8 +1795,8 @@ public: { float angle = victim->GetAngle(me->GetPositionX(), me->GetPositionY()); me->SetOrientation( me->GetAngle(victim->GetPositionX(), victim->GetPositionY()) ); - float x = victim->GetPositionX() + 15.0f*cos(angle); - float y = victim->GetPositionY() + 15.0f*sin(angle); + float x = victim->GetPositionX() + 15.0f * cos(angle); + float y = victim->GetPositionY() + 15.0f * sin(angle); // check if there's magnetic core in line of movement Creature* mc = nullptr; @@ -1865,7 +1871,7 @@ public: case EVENT_SUMMON_EMERGENCY_FIRE_BOTS: { uint32 ids[3] = {194740, 194743, 194748}; - for( uint8 i=0; i<3; ++i ) + for( uint8 i = 0; i < 3; ++i ) if( GameObject* pad = me->FindNearestGameObject(ids[i], 200.0f) ) if (Creature* trigger = me->SummonCreature(NPC_BOT_SUMMON_TRIGGER, *pad, TEMPSUMMON_MANUAL_DESPAWN)) trigger->AI()->DoAction(3); @@ -1903,7 +1909,7 @@ public: { if( Phase == 3 ) { - if( rand()%2 ) + if( rand() % 2 ) { c->MonsterYell(TEXT_ACU_SLAIN_1, LANG_UNIVERSAL, 0); c->PlayDirectSound(SOUND_HEAD_SLAY_1); @@ -1916,7 +1922,7 @@ public: } else { - if( rand()%2 ) + if( rand() % 2 ) { c->MonsterYell(TEXT_VOLTRON_SLAIN_1, LANG_UNIVERSAL, 0); c->PlayDirectSound(SOUND_VOLTRON_SLAY_1); @@ -1958,7 +1964,7 @@ public: summons.Despawn(s); } - void SpellHit(Unit* /*caster*/, const SpellInfo *spell) + void SpellHit(Unit* /*caster*/, const SpellInfo* spell) { if( spell->Id == SPELL_SELF_REPAIR ) { @@ -1981,7 +1987,7 @@ public: struct npc_ulduar_proximity_mineAI : public ScriptedAI { - npc_ulduar_proximity_mineAI(Creature *pCreature) : ScriptedAI(pCreature) + npc_ulduar_proximity_mineAI(Creature* pCreature) : ScriptedAI(pCreature) { exploded = false; timer = 2500; @@ -2046,7 +2052,7 @@ public: struct npc_ulduar_mimiron_rocketAI : public NullCreatureAI { - npc_ulduar_mimiron_rocketAI(Creature *pCreature) : NullCreatureAI(pCreature) {} + npc_ulduar_mimiron_rocketAI(Creature* pCreature) : NullCreatureAI(pCreature) {} void InitializeAI() { @@ -2063,14 +2069,14 @@ public: void SetData(uint32 /*id*/, uint32 /*value*/) { - me->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+100.0f, false, true); + me->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 100.0f, false, true); } void UpdateAI(uint32 /*diff*/) { if (!me->GetVehicle()) { - me->SetSpeed(MOVE_RUN, me->GetSpeedRate(MOVE_RUN)+0.4f, false); + me->SetSpeed(MOVE_RUN, me->GetSpeedRate(MOVE_RUN) + 0.4f, false); me->SetSpeed(MOVE_FLIGHT, me->GetSpeedRate(MOVE_RUN), false); } } @@ -2089,7 +2095,7 @@ public: struct npc_ulduar_magnetic_coreAI : public NullCreatureAI { - npc_ulduar_magnetic_coreAI(Creature *pCreature) : NullCreatureAI(pCreature) + npc_ulduar_magnetic_coreAI(Creature* pCreature) : NullCreatureAI(pCreature) { pInstance = me->GetInstanceScript(); if (Creature* c = GetACU()) @@ -2138,7 +2144,7 @@ public: struct npc_ulduar_bot_summon_triggerAI : public NullCreatureAI { - npc_ulduar_bot_summon_triggerAI(Creature *pCreature) : NullCreatureAI(pCreature) { } + npc_ulduar_bot_summon_triggerAI(Creature* pCreature) : NullCreatureAI(pCreature) { } uint32 timer; uint8 option; @@ -2175,7 +2181,7 @@ public: uint32 option_npcid[3] = {NPC_JUNK_BOT, NPC_ASSAULT_BOT, NPC_EMERGENCY_FIRE_BOT}; InstanceScript* pInstance = me->GetInstanceScript(); if (Creature* ACU = GetACU()) // ACU summons for easy removing - if( Creature* bot = ACU->SummonCreature( option_npcid[option-1], *me, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 25000 ) ) + if( Creature* bot = ACU->SummonCreature( option_npcid[option - 1], *me, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 25000 ) ) { if( option < 3 ) bot->SetInCombatWithZone(); @@ -2202,11 +2208,11 @@ public: { PrepareAuraScript(spell_mimiron_rapid_burst_AuraScript) - void HandleEffectPeriodic(AuraEffect const * aurEff) + void HandleEffectPeriodic(AuraEffect const* aurEff) { if (Unit* c = GetCaster()) { - uint32 id = ( c->GetMap()->Is25ManRaid() ? ((aurEff->GetTickNumber()%2) ? SPELL_RAPID_BURST_DAMAGE_25_2 : SPELL_RAPID_BURST_DAMAGE_25_1) : ((aurEff->GetTickNumber()%2) ? SPELL_RAPID_BURST_DAMAGE_10_2 : SPELL_RAPID_BURST_DAMAGE_10_1) ); + uint32 id = ( c->GetMap()->Is25ManRaid() ? ((aurEff->GetTickNumber() % 2) ? SPELL_RAPID_BURST_DAMAGE_25_2 : SPELL_RAPID_BURST_DAMAGE_25_1) : ((aurEff->GetTickNumber() % 2) ? SPELL_RAPID_BURST_DAMAGE_10_2 : SPELL_RAPID_BURST_DAMAGE_10_1) ); c->CastSpell((Unit*)NULL, id, true); } } @@ -2217,7 +2223,7 @@ public: } }; - AuraScript *GetAuraScript() const + AuraScript* GetAuraScript() const { return new spell_mimiron_rapid_burst_AuraScript(); } @@ -2242,7 +2248,7 @@ public: return true; } - void HandleEffectPeriodic(AuraEffect const * /*aurEff*/) + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) { if (Unit* c = GetCaster()) { @@ -2251,10 +2257,10 @@ public: uint32 diff = getMSTimeDiff(lastMSTime, World::GetGameTimeMS()); if (lastOrientation == -1.0f) { - lastOrientation = (c->ToCreature()->AI()->GetData(0)*2*M_PI)/100.0f; + lastOrientation = (c->ToCreature()->AI()->GetData(0) * 2 * M_PI) / 100.0f; diff = 0; } - float new_o = Position::NormalizeOrientation(lastOrientation-(M_PI/60)*(diff/250.0f)); + float new_o = Position::NormalizeOrientation(lastOrientation - (M_PI / 60) * (diff / 250.0f)); lastMSTime = World::GetGameTimeMS(); lastOrientation = new_o; c->SetOrientation(new_o); @@ -2270,7 +2276,7 @@ public: } }; - AuraScript *GetAuraScript() const + AuraScript* GetAuraScript() const { return new spell_mimiron_p3wx2_laser_barrage_AuraScript(); } @@ -2314,7 +2320,7 @@ public: struct npc_ulduar_flames_initialAI : public NullCreatureAI { - npc_ulduar_flames_initialAI(Creature *pCreature) : NullCreatureAI(pCreature) + npc_ulduar_flames_initialAI(Creature* pCreature) : NullCreatureAI(pCreature) { CreateTime = time(nullptr); events.Reset(); @@ -2399,7 +2405,7 @@ public: float prevdist = 100.0f; Player* target = nullptr; - Map::PlayerList const &pl = me->GetMap()->GetPlayers(); + Map::PlayerList const& pl = me->GetMap()->GetPlayers(); for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr ) if( Player* plr = itr->GetSource() ) if( plr->IsAlive() && plr->GetExactDist2d(last) < prevdist && !plr->IsGameMaster() ) @@ -2410,8 +2416,8 @@ public: if (target && prevdist >= 4.0f) // no need to spread when player is standing in fire, check distance { - float angle = last->GetAngle(target->GetPositionX(), target->GetPositionY()) -M_PI/8 + rand_norm()*2*M_PI/8; - SpreadFlame(last->GetPositionX() + 7.0f*cos(angle), last->GetPositionY() + 7.0f*sin(angle)); + float angle = last->GetAngle(target->GetPositionX(), target->GetPositionY()) - M_PI / 8 + rand_norm() * 2 * M_PI / 8; + SpreadFlame(last->GetPositionX() + 7.0f * cos(angle), last->GetPositionY() + 7.0f * sin(angle)); } } @@ -2435,7 +2441,7 @@ public: struct npc_ulduar_flames_spreadAI : public NullCreatureAI { - npc_ulduar_flames_spreadAI(Creature *pCreature) : NullCreatureAI(pCreature) {} + npc_ulduar_flames_spreadAI(Creature* pCreature) : NullCreatureAI(pCreature) {} void SpellHit(Unit* /*caster*/, const SpellInfo* spell) { @@ -2477,7 +2483,7 @@ public: struct npc_ulduar_emergency_fire_botAI : public ScriptedAI { - npc_ulduar_emergency_fire_botAI(Creature *pCreature) : ScriptedAI(pCreature) + npc_ulduar_emergency_fire_botAI(Creature* pCreature) : ScriptedAI(pCreature) { events.Reset(); events.ScheduleEvent(EVENT_EMERGENCY_BOT_CHECK, 1000); @@ -2510,7 +2516,7 @@ public: if (dist <= 5.0f) events.ScheduleEvent(EVENT_EMERGENCY_BOT_ATTACK, 0); else - me->GetMotionMaster()->MovePoint(1, me->GetPositionX()+(dist-5.0f)*cos(me->GetOrientation()), me->GetPositionY()+(dist-5.0f)*sin(me->GetOrientation()), 364.32f); + me->GetMotionMaster()->MovePoint(1, me->GetPositionX() + (dist - 5.0f)*cos(me->GetOrientation()), me->GetPositionY() + (dist - 5.0f)*sin(me->GetOrientation()), 364.32f); } break; case EVENT_EMERGENCY_BOT_ATTACK: @@ -2535,7 +2541,7 @@ public: struct npc_ulduar_rocket_strike_triggerAI : public NullCreatureAI { - npc_ulduar_rocket_strike_triggerAI(Creature *pCreature) : NullCreatureAI(pCreature) {} + npc_ulduar_rocket_strike_triggerAI(Creature* pCreature) : NullCreatureAI(pCreature) {} void SpellHitTarget(Unit* target, const SpellInfo* spell) { diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp index 107f44b79..8bd6c06f3 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp @@ -119,7 +119,7 @@ public: struct boss_razorscaleAI : public ScriptedAI { - boss_razorscaleAI(Creature *pCreature) : ScriptedAI(pCreature), summons(me) + boss_razorscaleAI(Creature* pCreature) : ScriptedAI(pCreature), summons(me) { pInstance = me->GetInstanceScript(); startPath = true; @@ -229,7 +229,7 @@ public: count++; if( me->HasAura(SPELL_CHAIN_3) ) count++; - if (RAID_MODE(0,1)) + if (RAID_MODE(0, 1)) { if( me->HasAura(SPELL_CHAIN_2) ) count++; @@ -258,7 +258,7 @@ public: { if (me->GetPositionZ() > 440.0f) // protection, razorscale is attackable (so harpoons can hit him, etc.), but should not receive dmg while in air damage = 0; - else if (!bGroundPhase && ((me->GetHealth()*100)/me->GetMaxHealth() < 50) && me->HasAura(62794)) // already below 50%, but still in chains and stunned + else if (!bGroundPhase && ((me->GetHealth() * 100) / me->GetMaxHealth() < 50) && me->HasAura(62794)) // already below 50%, but still in chains and stunned events.RescheduleEvent(EVENT_WARN_DEEP_BREATH, 0); } @@ -281,8 +281,8 @@ public: { me->SetControlled(true, UNIT_STATE_ROOT); me->DisableRotate(true); - me->SetOrientation((float)(M_PI+0.01)/2); - me->SetFacingTo(M_PI/2); + me->SetOrientation((float)(M_PI + 0.01) / 2); + me->SetFacingTo(M_PI / 2); me->SetCanFly(false); me->SetDisableGravity(false); me->SetHover(false); @@ -338,7 +338,7 @@ public: events.PopEvent(); break; case EVENT_EE_SAY_MOVE_OUT: - for (uint8 i=0; i<3; ++i) + for (uint8 i = 0; i < 3; ++i) if (Creature* c = ObjectAccessor::GetCreature(*me, ExpeditionEngineerGUIDs[i])) { if (!i) @@ -348,25 +348,25 @@ public: events.PopEvent(); break; case EVENT_SPELL_FIREBALL: - if( Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 200.0f, true) ) + if( Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 200.0f, true) ) me->CastSpell(pTarget, SPELL_FIREBALL, false); events.RepeatEvent(4000); break; case EVENT_SPELL_DEVOURING_FLAME: - if( Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 200.0f, true) ) + if( Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 200.0f, true) ) me->CastSpell(pTarget, SPELL_DEVOURINGFLAME, false); events.RepeatEvent(13000); break; case EVENT_SUMMON_MOLE_MACHINES: { memset(cords, '\0', sizeof(cords)); - uint8 num = RAID_MODE( urand(2,3), urand(2,4) ); - for( int i=0; iSummonGameObject(GO_DRILL, cords[i][0], cords[i][1], 391.1f, M_PI/4, 0.0f, 0.0f, 0.0f, 0.0f, 8) ) + cords[i][1] = -230 + rand() % 45; + if( GameObject* drill = me->SummonGameObject(GO_DRILL, cords[i][0], cords[i][1], 391.1f, M_PI / 4, 0.0f, 0.0f, 0.0f, 0.0f, 8) ) { //drill->SetGoAnimProgress(0); //drill->SetLootState(GO_READY); @@ -381,45 +381,57 @@ public: } break; case EVENT_SUMMON_ADDS: - for( int i=0; i<4; ++i ) + for( int i = 0; i < 4; ++i ) { if( !cords[i][0] ) break; uint8 opt; - uint8 r = urand(1,100); + uint8 r = urand(1, 100); if( r <= 30 ) opt = 1; else if( r <= 65 ) opt = 2; else opt = 3; - for( int j=0; j<4; ++j ) + for( int j = 0; j < 4; ++j ) { - float x = cords[i][0] + 4.0f*cos(j*M_PI/2); - float y = cords[i][1] + 4.0f*sin(j*M_PI/2); + float x = cords[i][0] + 4.0f * cos(j * M_PI / 2); + float y = cords[i][1] + 4.0f * sin(j * M_PI / 2); uint32 npc_entry = 0; switch( opt ) { - case 1: if( j == 1 ) npc_entry = NPC_DARK_RUNE_SENTINEL; break; + case 1: + if( j == 1 ) npc_entry = NPC_DARK_RUNE_SENTINEL; + break; case 2: switch( j ) { - case 1: npc_entry = NPC_DARK_RUNE_WATCHER; break; - case 2: npc_entry = NPC_DARK_RUNE_GUARDIAN; break; + case 1: + npc_entry = NPC_DARK_RUNE_WATCHER; + break; + case 2: + npc_entry = NPC_DARK_RUNE_GUARDIAN; + break; } break; default: // case 3: switch( j ) { - case 1: npc_entry = NPC_DARK_RUNE_WATCHER; break; - case 2: npc_entry = NPC_DARK_RUNE_GUARDIAN; break; - case 3: npc_entry = NPC_DARK_RUNE_GUARDIAN; break; + case 1: + npc_entry = NPC_DARK_RUNE_WATCHER; + break; + case 2: + npc_entry = NPC_DARK_RUNE_GUARDIAN; + break; + case 3: + npc_entry = NPC_DARK_RUNE_GUARDIAN; + break; } break; } if( npc_entry ) - if (Creature* c = me->SummonCreature(npc_entry, x, y, 391.1f, j*M_PI/2, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000)) + if (Creature* c = me->SummonCreature(npc_entry, x, y, 391.1f, j * M_PI / 2, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000)) DoZoneInCombat(c); } @@ -440,7 +452,7 @@ public: case EVENT_FLY_UP: me->SetInCombatWithZone(); // just in case if (pInstance) - for( int i=0; i<4; ++i ) + for( int i = 0; i < 4; ++i ) if( uint64 guid = pInstance->GetData64(DATA_HARPOON_FIRE_STATE_1 + i) ) if( Creature* hfs = ObjectAccessor::GetCreature(*me, guid) ) { @@ -451,14 +463,14 @@ public: me->RemoveAura(SPELL_LAUNCH_CHAIN); me->RemoveAura(SPELL_CHAIN_1); me->RemoveAura(SPELL_CHAIN_3); - if (RAID_MODE(0,1)) + if (RAID_MODE(0, 1)) { me->RemoveAura(SPELL_CHAIN_2); me->RemoveAura(SPELL_CHAIN_4); } me->CastSpell(me, SPELL_WINGBUFFET, true); - if( (me->GetHealth()*100) / me->GetMaxHealth() < 50 ) // start phase 3 + if( (me->GetHealth() * 100) / me->GetMaxHealth() < 50 ) // start phase 3 { me->SetControlled(false, UNIT_STATE_ROOT); me->DisableRotate(false); @@ -503,7 +515,7 @@ public: events.PopEvent(); break; case EVENT_RESUME_FIXING: - for (uint8 i=0; i<3; ++i) + for (uint8 i = 0; i < 3; ++i) if (Creature* c = ObjectAccessor::GetCreature(*me, ExpeditionEngineerGUIDs[i])) { if (!i) @@ -580,92 +592,92 @@ public: class npc_ulduar_expedition_commander : public CreatureScript { - public: - npc_ulduar_expedition_commander() : CreatureScript("npc_ulduar_expedition_commander") { } +public: + npc_ulduar_expedition_commander() : CreatureScript("npc_ulduar_expedition_commander") { } - bool OnGossipHello(Player* player, Creature* creature) override + bool OnGossipHello(Player* player, Creature* creature) override + { + if (!player || !creature) + return true; + + InstanceScript* instance = creature->GetInstanceScript(); + if (!instance) + return true; + + if (instance->GetData(TYPE_RAZORSCALE) == DONE) + return true; + + Creature* razorscale = ObjectAccessor::GetCreature(*creature, instance->GetData64(TYPE_RAZORSCALE)); + if (!razorscale || razorscale->IsInCombat()) + return true; + + AddGossipItemFor(player, GOSSIP_ICON_CHAT, TEXT_GOSSIP_ACTION, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, 40100, creature); + return true; + } + + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) override + { + if (!player || !creature) + return true; + + if (uiAction == GOSSIP_ACTION_INFO_DEF + 1) { - if (!player || !creature) - return true; - InstanceScript* instance = creature->GetInstanceScript(); - if (!instance) - return true; - - if (instance->GetData(TYPE_RAZORSCALE) == DONE) + if (!instance || instance->GetData(TYPE_RAZORSCALE) == DONE) return true; Creature* razorscale = ObjectAccessor::GetCreature(*creature, instance->GetData64(TYPE_RAZORSCALE)); - if (!razorscale || razorscale->IsInCombat()) - return true; - - AddGossipItemFor(player, GOSSIP_ICON_CHAT, TEXT_GOSSIP_ACTION, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - SendGossipMenuFor(player, 40100, creature); - return true; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) override - { - if (!player || !creature) - return true; - - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + if (razorscale && !razorscale->IsInCombat()) { - InstanceScript* instance = creature->GetInstanceScript(); - if (!instance || instance->GetData(TYPE_RAZORSCALE) == DONE) - return true; + // reset npcs NPC_HARPOON_FIRE_STATE + for (uint8 i = 0; i < 4; ++i) + if (Creature* hfs = ObjectAccessor::GetCreature(*creature, instance->GetData64(DATA_HARPOON_FIRE_STATE_1 + i))) + hfs->AI()->SetData(1, 0); - Creature* razorscale = ObjectAccessor::GetCreature(*creature, instance->GetData64(TYPE_RAZORSCALE)); - if (razorscale && !razorscale->IsInCombat()) + if (razorscale->AI()) { - // reset npcs NPC_HARPOON_FIRE_STATE - for (uint8 i = 0; i < 4; ++i) - if (Creature* hfs = ObjectAccessor::GetCreature(*creature, instance->GetData64(DATA_HARPOON_FIRE_STATE_1 + i))) - hfs->AI()->SetData(1, 0); - - if (razorscale->AI()) - { - razorscale->AI()->AttackStart(player); - razorscale->GetMotionMaster()->MoveIdle(); - razorscale->GetMotionMaster()->MovePoint(POINT_RAZORSCALE_INIT, 588.0f, -178.0f, 490.0f, false, false); - } + razorscale->AI()->AttackStart(player); + razorscale->GetMotionMaster()->MoveIdle(); + razorscale->GetMotionMaster()->MovePoint(POINT_RAZORSCALE_INIT, 588.0f, -178.0f, 490.0f, false, false); } } - - player->PlayerTalkClass->SendCloseGossip(); - return true; } - CreatureAI* GetAI(Creature* creature) const override + player->PlayerTalkClass->SendCloseGossip(); + return true; + } + + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI(creature); + } + + struct npc_ulduar_expedition_commanderAI : public NullCreatureAI + { + npc_ulduar_expedition_commanderAI(Creature* creature) : NullCreatureAI(creature) { - return GetInstanceAI(creature); + _instance = creature->GetInstanceScript(); + _introSpoken = _instance->GetData(TYPE_RAZORSCALE) == DONE; + me->SetReactState(REACT_AGGRESSIVE); } - struct npc_ulduar_expedition_commanderAI : public NullCreatureAI + void MoveInLineOfSight(Unit* who) override { - npc_ulduar_expedition_commanderAI(Creature* creature) : NullCreatureAI(creature) - { - _instance = creature->GetInstanceScript(); - _introSpoken = _instance->GetData(TYPE_RAZORSCALE) == DONE; - me->SetReactState(REACT_AGGRESSIVE); - } + if (_introSpoken) + return; - void MoveInLineOfSight(Unit* who) override - { - if (_introSpoken) - return; + if (who->GetTypeId() != TYPEID_PLAYER || me->GetExactDist2d(who) > 15.0f) + return; - if (who->GetTypeId() != TYPEID_PLAYER || me->GetExactDist2d(who) > 15.0f) - return; + _introSpoken = true; + Talk(SAY_COMMANDER_INTRO); + } - _introSpoken = true; - Talk(SAY_COMMANDER_INTRO); - } - - private: - InstanceScript* _instance; - bool _introSpoken; - }; + private: + InstanceScript* _instance; + bool _introSpoken; + }; }; class npc_ulduar_harpoonfirestate : public CreatureScript @@ -680,7 +692,7 @@ public: struct npc_ulduar_harpoonfirestateAI : public NullCreatureAI { - npc_ulduar_harpoonfirestateAI(Creature *pCreature) : NullCreatureAI(pCreature) + npc_ulduar_harpoonfirestateAI(Creature* pCreature) : NullCreatureAI(pCreature) { pInstance = me->GetInstanceScript(); } @@ -735,7 +747,7 @@ public: { if( GameObject* bh = me->FindNearestGameObject(GO_BROKEN_HARPOON, 4.0f) ) bh->SetPhaseMask(2, true); - if( GameObject* wh = me->SummonGameObject(GetHarpoonGunIdForThisHFS(), me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 3*M_PI/2, 0.0f, 0.0f, 0.0f, 0.0f, 0) ) + if( GameObject* wh = me->SummonGameObject(GetHarpoonGunIdForThisHFS(), me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 3 * M_PI / 2, 0.0f, 0.0f, 0.0f, 0.0f, 0) ) { me->RemoveGameObject(wh, false); me->MonsterTextEmote(TEXT_TURRET_READY, 0, true); @@ -780,7 +792,7 @@ public: struct npc_ulduar_expedition_engineerAI : public NullCreatureAI { - npc_ulduar_expedition_engineerAI(Creature *pCreature) : NullCreatureAI(pCreature) + npc_ulduar_expedition_engineerAI(Creature* pCreature) : NullCreatureAI(pCreature) { pInstance = me->GetInstanceScript(); } @@ -830,7 +842,7 @@ public: if( me->GetUInt32Value(UNIT_NPC_EMOTESTATE) != EMOTE_STATE_WORK ) me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_WORK); - if (fabs(me->GetOrientation()-me->GetAngle(c)) > M_PI/4) + if (fabs(me->GetOrientation() - me->GetAngle(c)) > M_PI / 4) me->SetFacingToObject(c); c->AI()->SetData(2, 0); @@ -852,16 +864,16 @@ public: return; } - for( int i=0; i<4; ++i ) + for( int i = 0; i < 4; ++i ) if( uint64 fs_GUID = pInstance->GetData64(DATA_HARPOON_FIRE_STATE_1 + i) ) if( Creature* fs = ObjectAccessor::GetCreature(*me, fs_GUID) ) if (!fs->AI()->GetData(2)) - { - float a = rand_norm()*M_PI; - me->GetMotionMaster()->MovePoint(0, fs->GetPositionX()+3.0f*cos(a), fs->GetPositionY()+3.0f*sin(a), fs->GetPositionZ()); - fixingGUID = fs->GetGUID(); - return; - } + { + float a = rand_norm() * M_PI; + me->GetMotionMaster()->MovePoint(0, fs->GetPositionX() + 3.0f * cos(a), fs->GetPositionY() + 3.0f * sin(a), fs->GetPositionZ()); + fixingGUID = fs->GetGUID(); + return; + } Reset(); // all harpoons repaired me->GetMotionMaster()->MoveTargetedHome(); @@ -944,7 +956,7 @@ public: struct npc_ulduar_dark_rune_guardianAI : public ScriptedAI { - npc_ulduar_dark_rune_guardianAI(Creature *pCreature) : ScriptedAI(pCreature) { } + npc_ulduar_dark_rune_guardianAI(Creature* pCreature) : ScriptedAI(pCreature) { } uint32 timer2; @@ -991,7 +1003,7 @@ public: struct npc_ulduar_dark_rune_watcherAI : public ScriptedAI { - npc_ulduar_dark_rune_watcherAI(Creature *pCreature) : ScriptedAI(pCreature) { } + npc_ulduar_dark_rune_watcherAI(Creature* pCreature) : ScriptedAI(pCreature) { } uint32 timer1; uint32 timer2; @@ -1047,14 +1059,14 @@ public: struct npc_ulduar_dark_rune_sentinelAI : public ScriptedAI { - npc_ulduar_dark_rune_sentinelAI(Creature *pCreature) : ScriptedAI(pCreature) { } + npc_ulduar_dark_rune_sentinelAI(Creature* pCreature) : ScriptedAI(pCreature) { } uint32 timer1; uint32 timer2; void Reset() { - timer1 = urand(1000,2000); + timer1 = urand(1000, 2000); timer2 = 6000; } @@ -1091,24 +1103,24 @@ public: class achievement_quick_shave : public AchievementCriteriaScript { - public: - achievement_quick_shave() : AchievementCriteriaScript("achievement_quick_shave") {} +public: + achievement_quick_shave() : AchievementCriteriaScript("achievement_quick_shave") {} - bool OnCheck(Player* /*player*/, Unit* target) - { - return target && target->GetTypeId() == TYPEID_UNIT && target->GetEntry() == NPC_RAZORSCALE && target->ToCreature()->AI()->GetData(1); - } + bool OnCheck(Player* /*player*/, Unit* target) + { + return target && target->GetTypeId() == TYPEID_UNIT && target->GetEntry() == NPC_RAZORSCALE && target->ToCreature()->AI()->GetData(1); + } }; class achievement_iron_dwarf_medium_rare : public AchievementCriteriaScript { - public: - achievement_iron_dwarf_medium_rare() : AchievementCriteriaScript("achievement_iron_dwarf_medium_rare") {} +public: + achievement_iron_dwarf_medium_rare() : AchievementCriteriaScript("achievement_iron_dwarf_medium_rare") {} - bool OnCheck(Player* /*player*/, Unit* target) - { - return target && target->GetEntry() == NPC_RAZORSCALE; - } + bool OnCheck(Player* /*player*/, Unit* target) + { + return target && target->GetEntry() == NPC_RAZORSCALE; + } }; void AddSC_boss_razorscale() diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp index a8278032d..ff023c7a1 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp @@ -297,7 +297,7 @@ enum Misc DATA_LOSE_YOUR_ILLUSION = 2, }; -const Position Middle = {2134.68f, -263.13f, 419.44f, M_PI*1.5f}; +const Position Middle = {2134.68f, -263.13f, 419.44f, M_PI * 1.5f}; const uint32 RollTable[3] = { 32877, 32878, 32876 }; @@ -444,7 +444,7 @@ public: _isArenaEmpty = false; _hitByLightning = false; - if (Player *t = SelectTargetFromPlayerList(1000)) + if (Player* t = SelectTargetFromPlayerList(1000)) if (t->GetTeamId() == TEAM_HORDE) _isAlly = false; @@ -488,10 +488,10 @@ public: void KilledUnit(Unit*) { - if (urand(0,2)) + if (urand(0, 2)) return; - if (urand(0,1)) + if (urand(0, 1)) { me->MonsterYell("Can't you at least put up a fight!?", LANG_UNIVERSAL, 0); me->PlayDirectSound(SOUND_SLAY1); @@ -596,16 +596,16 @@ public: { Creature* cr; uint8 rnd; - if (_spawnCommoners || urand(0,2)) + if (_spawnCommoners || urand(0, 2)) _spawnCommoners = !_spawnCommoners; for (uint8 i = 0; i < (_spawnCommoners ? 7 : 2); ++i) { rnd = urand(0, 13); - if ((cr = me->SummonCreature((_spawnCommoners ? NPC_DARK_RUNE_COMMONER : RollTable[urand(0,2)]), ArenaNPCs[rnd], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000))) + if ((cr = me->SummonCreature((_spawnCommoners ? NPC_DARK_RUNE_COMMONER : RollTable[urand(0, 2)]), ArenaNPCs[rnd], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000))) cr->GetMotionMaster()->MoveJump( - Middle.GetPositionX()+urand(19,24)*cos(Middle.GetAngle(cr)), - Middle.GetPositionY()+urand(19,24)*sin(Middle.GetAngle(cr)), + Middle.GetPositionX() + urand(19, 24) * cos(Middle.GetAngle(cr)), + Middle.GetPositionY() + urand(19, 24) * sin(Middle.GetAngle(cr)), Middle.GetPositionZ(), 20, 20); } } @@ -629,10 +629,10 @@ public: void PlaySpecial() { - if (urand(0,9)) + if (urand(0, 9)) return; - switch (urand(0,2)) + switch (urand(0, 2)) { case 0: me->MonsterYell("Behold the power of the storms and despair!", LANG_UNIVERSAL, 0); @@ -653,7 +653,7 @@ public: { Map::PlayerList const& pList = me->GetMap()->GetPlayers(); for(Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr) - if (Player *p = itr->GetSource()) + if (Player* p = itr->GetSource()) if (p->GetPositionX() > 2085 && p->GetPositionX() < 2185 && p->GetPositionY() < -214 && p->GetPositionY() > -305 && p->IsAlive() && p->GetPositionZ() < 425) return p; return nullptr; @@ -681,28 +681,28 @@ public: break; case EVENT_THORIM_AGGRO2: - { - me->MonsterYell("I remember you... In the mountains... But you... what is this? Where am--", LANG_UNIVERSAL, 0); - me->PlayDirectSound(SOUND_AGGRO2); - events.PopEvent(); + { + me->MonsterYell("I remember you... In the mountains... But you... what is this? Where am--", LANG_UNIVERSAL, 0); + me->PlayDirectSound(SOUND_AGGRO2); + events.PopEvent(); - EntryCheckPredicate pred(NPC_SIF); - summons.DoAction(ACTION_SIF_START_TALK, pred); - break; - } + EntryCheckPredicate pred(NPC_SIF); + summons.DoAction(ACTION_SIF_START_TALK, pred); + break; + } case EVENT_THORIM_START_PHASE1: - { - events.PopEvent(); - events.ScheduleEvent(EVENT_THORIM_STORMHAMMER, 8000, 0, EVENT_PHASE_START); - events.ScheduleEvent(EVENT_THORIM_CHARGE_ORB, 14000, 0, EVENT_PHASE_START); - events.ScheduleEvent(EVENT_THORIM_FILL_ARENA, 0, 0, EVENT_PHASE_START); - events.ScheduleEvent(EVENT_THORIM_LIGHTNING_ORB, 5000, 0, EVENT_PHASE_START); // checked every 5 secs if there are players on arena - events.ScheduleEvent(EVENT_THORIM_NOT_REACH_IN_TIME, 300000, 0, EVENT_PHASE_START); + { + events.PopEvent(); + events.ScheduleEvent(EVENT_THORIM_STORMHAMMER, 8000, 0, EVENT_PHASE_START); + events.ScheduleEvent(EVENT_THORIM_CHARGE_ORB, 14000, 0, EVENT_PHASE_START); + events.ScheduleEvent(EVENT_THORIM_FILL_ARENA, 0, 0, EVENT_PHASE_START); + events.ScheduleEvent(EVENT_THORIM_LIGHTNING_ORB, 5000, 0, EVENT_PHASE_START); // checked every 5 secs if there are players on arena + events.ScheduleEvent(EVENT_THORIM_NOT_REACH_IN_TIME, 300000, 0, EVENT_PHASE_START); - EntryCheckPredicate pred(NPC_SIF); - summons.DoAction(ACTION_SIF_START_DOMINION, pred); - break; - } + EntryCheckPredicate pred(NPC_SIF); + summons.DoAction(ACTION_SIF_START_DOMINION, pred); + break; + } case EVENT_THORIM_STORMHAMMER: me->CastCustomSpell(SPELL_STORMHAMMER, SPELLVALUE_MAX_TARGETS, 1, me->GetVictim(), false); events.RepeatEvent(16000); @@ -714,24 +714,24 @@ public: PlaySpecial(); break; case EVENT_THORIM_LIGHTNING_ORB: - { - if (GetArenaPlayer()) { - // Player found, repeat and return - events.RepeatEvent(5000); - return; + if (GetArenaPlayer()) + { + // Player found, repeat and return + events.RepeatEvent(5000); + return; + } + + // No players found + me->MonsterYell("Failures! Weaklings!", LANG_UNIVERSAL, 0); + me->PlayDirectSound(SOUND_AWIPE); + me->SummonCreature(NPC_LIGHTNING_ORB, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()); + + _isArenaEmpty = true; + events.PopEvent(); + events.CancelEvent(EVENT_THORIM_NOT_REACH_IN_TIME); + break; } - - // No players found - me->MonsterYell("Failures! Weaklings!", LANG_UNIVERSAL, 0); - me->PlayDirectSound(SOUND_AWIPE); - me->SummonCreature(NPC_LIGHTNING_ORB, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()); - - _isArenaEmpty = true; - events.PopEvent(); - events.CancelEvent(EVENT_THORIM_NOT_REACH_IN_TIME); - break; - } case EVENT_THORIM_NOT_REACH_IN_TIME: _isArenaEmpty = true; events.PopEvent(); @@ -913,7 +913,7 @@ public: events.RepeatEvent(30000); return; case EVENT_SIF_FROST_NOVA_START: - me->NearTeleportTo(2108+urand(0, 42), -238-irand(0,46), 420.02f, me->GetAngle(&Middle)); + me->NearTeleportTo(2108 + urand(0, 42), -238 - irand(0, 46), 420.02f, me->GetAngle(&Middle)); events.RepeatEvent(20000); events.DelayEvents(5001); events.ScheduleEvent(EVENT_SIF_FROST_NOVA_CAST, 2500); @@ -1043,9 +1043,9 @@ public: SetDespawnAtEnd(false); } - void MoveInLineOfSight(Unit * /*who*/) {} - void EnterCombat(Unit * /*who*/) {} - void AttackStart(Unit * /*who*/) {} + void MoveInLineOfSight(Unit* /*who*/) {} + void EnterCombat(Unit* /*who*/) {} + void AttackStart(Unit* /*who*/) {} void InitWaypoint() { @@ -1101,7 +1101,7 @@ public: me->CastSpell(me, SPELL_LIGHTNING_PILLAR_P1, true); else if (spellInfo->Id == SPELL_LIGHTNING_PILLAR_P2) { - if (Creature *cr = me->FindNearestCreature(NPC_THUNDER_ORB, 100)) + if (Creature* cr = me->FindNearestCreature(NPC_THUNDER_ORB, 100)) cr->CastSpell(cr, SPELL_LIGHTNING_ORB_VISUAL, true); } } @@ -1220,7 +1220,7 @@ public: events.RepeatEvent(10000); break; case EVENT_DR_ACOLYTE_HS: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM,0)) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) me->CastSpell(target, SPELL_HOLY_SMITE, false); events.RepeatEvent(1600); break; @@ -1263,7 +1263,7 @@ public: break; } - if (!_isCaster || (me->GetPower(POWER_MANA)*100 / me->GetMaxPower(POWER_MANA) < 10)) + if (!_isCaster || (me->GetPower(POWER_MANA) * 100 / me->GetMaxPower(POWER_MANA) < 10)) DoMeleeAttackIfReady(); } }; @@ -1345,7 +1345,7 @@ public: events.RepeatEvent(10000); break; case EVENT_DR_ACOLYTE_HS: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM,0)) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) me->CastSpell(target, SPELL_HOLY_SMITE, false); events.RepeatEvent(1600); break; @@ -1370,7 +1370,7 @@ public: break; } - if (!_isCaster || (me->GetPower(POWER_MANA)*100 / me->GetMaxPower(POWER_MANA) < 10)) + if (!_isCaster || (me->GetPower(POWER_MANA) * 100 / me->GetMaxPower(POWER_MANA) < 10)) DoMeleeAttackIfReady(); } }; @@ -1419,7 +1419,7 @@ public: void JustDied(Unit*) { if (me->GetInstanceScript()) - if (GameObject *go = ObjectAccessor::GetGameObject(*me, me->GetInstanceScript()->GetData64(DATA_THORIM_FIRST_DOORS))) + if (GameObject* go = ObjectAccessor::GetGameObject(*me, me->GetInstanceScript()->GetData64(DATA_THORIM_FIRST_DOORS))) go->SetGoState(GO_STATE_ACTIVE); } @@ -1482,7 +1482,7 @@ public: RunRunicSmash(true); break; case EVENT_RC_RUNIC_SMASH: - if (urand(0,1)) + if (urand(0, 1)) me->CastSpell(me, SPELL_RUNIC_SMASH_LEFT, false); else me->CastSpell(me, SPELL_RUNIC_SMASH_RIGHT, false); @@ -1585,7 +1585,7 @@ public: events.RepeatEvent(8000); break; case EVENT_ARG_SPAWN: - if (Creature *cr = me->SummonCreature(NPC_IRON_HONOR_GUARD, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 20000)) + if (Creature* cr = me->SummonCreature(NPC_IRON_HONOR_GUARD, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 20000)) if (Unit* target = SelectTargetFromPlayerList(150.0f)) cr->AI()->AttackStart(target); events.RepeatEvent(10000); @@ -1656,7 +1656,7 @@ public: { Player* target = nullptr; Map::PlayerList const& pList = me->GetMap()->GetPlayers(); - uint8 num = urand(0, pList.getSize()-1); + uint8 num = urand(0, pList.getSize() - 1); uint8 count = 0; for (Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr, ++count) { @@ -1673,9 +1673,9 @@ public: { AttackStart(target); me->AddThreat(target, 500.0f); - if (me->GetEntry() == NPC_DARK_RUNE_EVOKER && urand(0,1)) + if (me->GetEntry() == NPC_DARK_RUNE_EVOKER && urand(0, 1)) me->CastSpell(me, SPELL_RUNIC_SHIELD, false); - else if (me->GetEntry() == NPC_DARK_RUNE_CHAMPION && !urand(0,2)) + else if (me->GetEntry() == NPC_DARK_RUNE_CHAMPION && !urand(0, 2)) me->CastSpell(target, SPELL_CHARGE, false); return true; } @@ -1737,7 +1737,7 @@ public: break; } - if (!_isCaster || (me->GetPower(POWER_MANA)*100 / me->GetMaxPower(POWER_MANA) < 10)) + if (!_isCaster || (me->GetPower(POWER_MANA) * 100 / me->GetMaxPower(POWER_MANA) < 10)) DoMeleeAttackIfReady(); } }; @@ -1750,7 +1750,7 @@ public: bool OnGossipHello(Player* pPlayer, GameObject* go) override { - if (GameObject *g = pPlayer->FindNearestGameObject(GO_ARENA_LEVER_GATE, 50)) + if (GameObject* g = pPlayer->FindNearestGameObject(GO_ARENA_LEVER_GATE, 50)) g->UseDoorOrButton(); go->UseDoorOrButton(); @@ -1760,88 +1760,88 @@ public: class spell_thorim_lightning_pillar_P2 : public SpellScriptLoader { - public: - spell_thorim_lightning_pillar_P2() : SpellScriptLoader("spell_thorim_lightning_pillar_P2") { } +public: + spell_thorim_lightning_pillar_P2() : SpellScriptLoader("spell_thorim_lightning_pillar_P2") { } - class spell_thorim_lightning_pillar_P2_AuraScript : public AuraScript + class spell_thorim_lightning_pillar_P2_AuraScript : public AuraScript + { + PrepareAuraScript(spell_thorim_lightning_pillar_P2_AuraScript); + + void OnPeriodic(AuraEffect const* aurEff) { - PrepareAuraScript(spell_thorim_lightning_pillar_P2_AuraScript); - - void OnPeriodic(AuraEffect const* aurEff) - { - PreventDefaultAction(); - if (Unit* caster = GetCaster()) - GetUnitOwner()->CastSpell(caster, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_thorim_lightning_pillar_P2_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_thorim_lightning_pillar_P2_AuraScript(); + PreventDefaultAction(); + if (Unit* caster = GetCaster()) + GetUnitOwner()->CastSpell(caster, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_thorim_lightning_pillar_P2_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_thorim_lightning_pillar_P2_AuraScript(); + } }; class spell_thorim_trash_impale : public SpellScriptLoader { - public: - spell_thorim_trash_impale() : SpellScriptLoader("spell_thorim_trash_impale") { } +public: + spell_thorim_trash_impale() : SpellScriptLoader("spell_thorim_trash_impale") { } - class spell_thorim_trash_impale_AuraScript : public AuraScript + class spell_thorim_trash_impale_AuraScript : public AuraScript + { + PrepareAuraScript(spell_thorim_trash_impale_AuraScript); + + void OnPeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_thorim_trash_impale_AuraScript); - - void OnPeriodic(AuraEffect const* /*aurEff*/) - { - // deals damage until target is healed above 90% - if (GetUnitOwner()->HealthAbovePct(90)) - SetDuration(0); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_thorim_trash_impale_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_thorim_trash_impale_AuraScript(); + // deals damage until target is healed above 90% + if (GetUnitOwner()->HealthAbovePct(90)) + SetDuration(0); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_thorim_trash_impale_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_thorim_trash_impale_AuraScript(); + } }; class achievement_thorim_stand_in_the_lightning : public AchievementCriteriaScript { - public: - achievement_thorim_stand_in_the_lightning() : AchievementCriteriaScript("achievement_thorim_stand_in_the_lightning") {} +public: + achievement_thorim_stand_in_the_lightning() : AchievementCriteriaScript("achievement_thorim_stand_in_the_lightning") {} - bool OnCheck(Player* player, Unit*) - { - if (InstanceScript* instance = player->GetInstanceScript()) - if (Creature* cr = ObjectAccessor::GetCreature(*player, instance->GetData64(TYPE_THORIM))) - return cr->AI()->GetData(DATA_HIT_BY_LIGHTNING); + bool OnCheck(Player* player, Unit*) + { + if (InstanceScript* instance = player->GetInstanceScript()) + if (Creature* cr = ObjectAccessor::GetCreature(*player, instance->GetData64(TYPE_THORIM))) + return cr->AI()->GetData(DATA_HIT_BY_LIGHTNING); - return false; - } + return false; + } }; class achievement_thorim_lose_your_illusion : public AchievementCriteriaScript { - public: - achievement_thorim_lose_your_illusion() : AchievementCriteriaScript("achievement_thorim_lose_your_illusion") {} +public: + achievement_thorim_lose_your_illusion() : AchievementCriteriaScript("achievement_thorim_lose_your_illusion") {} - bool OnCheck(Player* player, Unit*) - { - if (InstanceScript* instance = player->GetInstanceScript()) - if (Creature* cr = ObjectAccessor::GetCreature(*player, instance->GetData64(TYPE_THORIM))) - return cr->AI()->GetData(DATA_LOSE_YOUR_ILLUSION); + bool OnCheck(Player* player, Unit*) + { + if (InstanceScript* instance = player->GetInstanceScript()) + if (Creature* cr = ObjectAccessor::GetCreature(*player, instance->GetData64(TYPE_THORIM))) + return cr->AI()->GetData(DATA_LOSE_YOUR_ILLUSION); - return false; - } + return false; + } }; void AddSC_boss_thorim() diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp index 2f6b94011..74202e634 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp @@ -41,7 +41,7 @@ enum XT002Spells SPELL_VOID_ZONE_SUMMON_25 = 64235, //SPELL_VOID_ZONE_SUMMON = RAID_MODE(SPELL_VOID_ZONE_SUMMON_10, SPELL_VOID_ZONE_SUMMON_25, SPELL_VOID_ZONE_SUMMON_10, SPELL_VOID_ZONE_SUMMON_25), SPELL_VOID_ZONE_DAMAGE = 46262, - + // SPARK SPELL_SPARK_SUMMON = 64210, SPELL_SPARK_DAMAGE_10 = 64227, @@ -119,7 +119,7 @@ public: struct boss_xt002AI : public ScriptedAI { - boss_xt002AI(Creature *pCreature) : ScriptedAI(pCreature), summons(me) + boss_xt002AI(Creature* pCreature) : ScriptedAI(pCreature), summons(me) { m_pInstance = pCreature->GetInstanceScript(); } @@ -162,7 +162,7 @@ public: { m_pInstance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_MUST_DECONSTRUCT_FASTER); m_pInstance->SetData(TYPE_XT002, NOT_STARTED); - if (GameObject *pGo = ObjectAccessor::GetGameObject(*me, m_pInstance->GetData64(GO_XT002_DOORS))) + if (GameObject* pGo = ObjectAccessor::GetGameObject(*me, m_pInstance->GetData64(GO_XT002_DOORS))) pGo->SetGoState(GO_STATE_ACTIVE); } } @@ -199,7 +199,7 @@ public: { m_pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_MUST_DECONSTRUCT_FASTER); m_pInstance->SetData(TYPE_XT002, IN_PROGRESS); - if (GameObject *pGo = ObjectAccessor::GetGameObject(*me, m_pInstance->GetData64(GO_XT002_DOORS))) + if (GameObject* pGo = ObjectAccessor::GetGameObject(*me, m_pInstance->GetData64(GO_XT002_DOORS))) pGo->SetGoState(GO_STATE_READY); } @@ -210,9 +210,9 @@ public: void KilledUnit(Unit* victim) { - if (victim->GetTypeId() == TYPEID_PLAYER && !urand(0,2)) + if (victim->GetTypeId() == TYPEID_PLAYER && !urand(0, 2)) { - if (urand(0,1)) + if (urand(0, 1)) { me->MonsterYell("I... I think I broke it.", LANG_UNIVERSAL, 0); me->PlayDirectSound(XT_SOUND_SLAY1); @@ -225,7 +225,7 @@ public: } } - void JustDied(Unit * /*victim*/) + void JustDied(Unit* /*victim*/) { me->MonsterYell("You are bad... Toys... Very... Baaaaad!", LANG_UNIVERSAL, 0); me->PlayDirectSound(XT_SOUND_DEATH); @@ -233,7 +233,7 @@ public: if (m_pInstance) { m_pInstance->SetData(TYPE_XT002, DONE); - if (GameObject *pGo = ObjectAccessor::GetGameObject(*me, m_pInstance->GetData64(GO_XT002_DOORS))) + if (GameObject* pGo = ObjectAccessor::GetGameObject(*me, m_pInstance->GetData64(GO_XT002_DOORS))) pGo->SetGoState(GO_STATE_ACTIVE); } @@ -253,7 +253,7 @@ public: _gravityAchievement = false; return; } - + if (!me->IsAlive() || _hardMode) return; @@ -267,7 +267,7 @@ public: me->SetByteValue(UNIT_FIELD_BYTES_1, 0, UNIT_STAND_STATE_STAND); // emerge me->CastSpell(me, SPELL_HEARTBREAK, true); - + me->MonsterTextEmote("XT-002 Deconstructor's heart is severed from his body.", 0, true); events.ScheduleEvent(EVENT_REMOVE_EMOTE, 4000); return; @@ -277,7 +277,7 @@ public: if (param > 0) { // avoid reducing health under 1 - int32 _final = std::min(param, int32(me->GetHealth()-1)); + int32 _final = std::min(param, int32(me->GetHealth() - 1)); me->ModifyHealth(-_final); me->LowerPlayerDamageReq(_final); @@ -315,7 +315,7 @@ public: if (me->HealthBelowPct(_healthCheck)) { - _healthCheck -= 25; + _healthCheck -= 25; me->SetControlled(true, UNIT_STATE_STUNNED); me->SetByteValue(UNIT_FIELD_BYTES_1, 0, UNIT_STAND_STATE_SUBMERGED); // submerge with animation @@ -366,7 +366,7 @@ public: me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); if (Unit* heart = me->GetVehicleKit() ? me->GetVehicleKit()->GetPassenger(HEART_VEHICLE_SEAT) : nullptr) heart->GetAI()->DoAction(ACTION_AWAKEN_HEART); - + events.ScheduleEvent(EVENT_RESTORE, 30000); events.PopEvent(); return; @@ -380,7 +380,7 @@ public: me->MonsterYell("I'm ready to play!", LANG_UNIVERSAL, 0); me->PlayDirectSound(XT_SOUND_HEART_CLOSED); - + me->SetByteValue(UNIT_FIELD_BYTES_1, 0, UNIT_STAND_STATE_STAND); // emerge // Hide heart if (Unit* heart = me->GetVehicleKit() ? me->GetVehicleKit()->GetPassenger(HEART_VEHICLE_SEAT) : nullptr) @@ -397,7 +397,7 @@ public: events.PopEvent(); return; } - + // Disabled by stunned state DoMeleeAttackIfReady(); } @@ -425,7 +425,7 @@ public: SummonList summons; uint32 _damageDone; uint32 _timerSpawn; - + uint8 _spawnSelection; uint8 _pummelerCount; @@ -438,7 +438,7 @@ public: if (owner->GetTypeId() == TYPEID_UNIT) owner->ToCreature()->AI()->JustSummoned(cr); } - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) { _damageDone += damage; } @@ -482,7 +482,7 @@ public: void SendEnergyToCorner() { Unit* pile = nullptr; - uint8 num = urand(1,4); + uint8 num = urand(1, 4); for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr)) if (summon->GetEntry() == NPC_PILE_TRIGGER) @@ -496,7 +496,7 @@ public: me->CastSpell(pile, SPELL_ENERGY_ORB, true); } - void SpellHitTarget(Unit *target, const SpellInfo *spellInfo) + void SpellHitTarget(Unit* target, const SpellInfo* spellInfo) { // spawn not-so-random robots if (spellInfo->Id == SPELL_ENERGY_ORB_TRIGGER && target->GetEntry() == NPC_PILE_TRIGGER) @@ -504,34 +504,34 @@ public: { case 0: for (uint8 i = 0; i < 5; ++i) - me->SummonCreature(NPC_XS013_SCRAPBOT, target->GetPositionX()+irand(-3, 3), target->GetPositionY()+irand(-3, 3), target->GetPositionZ()+2, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1000); + me->SummonCreature(NPC_XS013_SCRAPBOT, target->GetPositionX() + irand(-3, 3), target->GetPositionY() + irand(-3, 3), target->GetPositionZ() + 2, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1000); _spawnSelection++; break; case 1: - me->SummonCreature(NPC_XE321_BOOMBOT, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ()+2, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000); + me->SummonCreature(NPC_XE321_BOOMBOT, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ() + 2, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000); _spawnSelection++; break; case 2: for (uint8 i = 0; i < 5; ++i) - me->SummonCreature(NPC_XS013_SCRAPBOT, target->GetPositionX()+irand(-3, 3), target->GetPositionY()+irand(-3, 3), target->GetPositionZ()+2, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1000); + me->SummonCreature(NPC_XS013_SCRAPBOT, target->GetPositionX() + irand(-3, 3), target->GetPositionY() + irand(-3, 3), target->GetPositionZ() + 2, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1000); _spawnSelection++; break; case 3: if(_pummelerCount < 2) - me->SummonCreature(NPC_XM024_PUMMELLER, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ()+2, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000); - + me->SummonCreature(NPC_XM024_PUMMELLER, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ() + 2, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000); + _pummelerCount++; _spawnSelection++; break; case 4: for (uint8 i = 0; i < 5; ++i) - me->SummonCreature(NPC_XS013_SCRAPBOT, target->GetPositionX()+irand(-3, 3), target->GetPositionY()+irand(-3, 3), target->GetPositionZ()+2, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1000); + me->SummonCreature(NPC_XS013_SCRAPBOT, target->GetPositionX() + irand(-3, 3), target->GetPositionY() + irand(-3, 3), target->GetPositionZ() + 2, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1000); _spawnSelection = 0; break; } } - void JustDied(Unit * /*victim*/) + void JustDied(Unit* /*victim*/) { me->SetVisible(false); if (me->GetInstanceScript()) @@ -616,9 +616,9 @@ public: pXT002->ModifyHealth(pXT002->GetMaxHealth() * 0.01f); } - if (!urand(0,2)) + if (!urand(0, 2)) me->MonsterTextEmote("XT-002 Deconstructor consumes scrap bot to repair himself.", 0, true); - + me->DespawnOrUnsummon(1); } } @@ -662,7 +662,7 @@ public: _trampleTimer = 0; _uppercutTimer = 0; - if (Unit *target = SelectTargetFromPlayerList(200)) + if (Unit* target = SelectTargetFromPlayerList(200)) AttackStart(target); else me->DespawnOrUnsummon(500); @@ -703,25 +703,25 @@ public: class BoomEvent : public BasicEvent { - public: - BoomEvent(Creature* me) : _me(me) - { - } +public: + BoomEvent(Creature* me) : _me(me) + { + } - bool Execute(uint64 /*time*/, uint32 /*diff*/) - { - // This hack is here because we suspect our implementation of spell effect execution on targets - // is done in the wrong order. We suspect that EFFECT_0 needs to be applied on all targets, - // then EFFECT_1, etc - instead of applying each effect on target1, then target2, etc. - // The above situation causes the visual for this spell to be bugged, so we remove the instakill - // effect and implement a script hack for that. + bool Execute(uint64 /*time*/, uint32 /*diff*/) + { + // This hack is here because we suspect our implementation of spell effect execution on targets + // is done in the wrong order. We suspect that EFFECT_0 needs to be applied on all targets, + // then EFFECT_1, etc - instead of applying each effect on target1, then target2, etc. + // The above situation causes the visual for this spell to be bugged, so we remove the instakill + // effect and implement a script hack for that. - _me->CastSpell(_me, SPELL_BOOM, false); - return true; - } + _me->CastSpell(_me, SPELL_BOOM, false); + return true; + } - private: - Creature* _me; +private: + Creature* _me; }; class npc_xt002_boombot : public CreatureScript @@ -762,9 +762,9 @@ public: if (_boomed) return; - _boomed = true; // Prevent recursive calls + _boomed = true; // Prevent recursive calls - WorldPacket data(SMSG_SPELLINSTAKILLLOG, 8+8+4); + WorldPacket data(SMSG_SPELLINSTAKILLLOG, 8 + 8 + 4); data << uint64(me->GetGUID()); data << uint64(me->GetGUID()); data << uint32(SPELL_BOOM); @@ -777,15 +777,15 @@ public: // so that can't be the issue // See BoomEvent class // Schedule 1s delayed - me->m_Events.AddEvent(new BoomEvent(me), me->m_Events.CalculateTime(1*IN_MILLISECONDS)); + me->m_Events.AddEvent(new BoomEvent(me), me->m_Events.CalculateTime(1 * IN_MILLISECONDS)); } void JustDied(Unit*) { - me->m_Events.AddEvent(new BoomEvent(me), me->m_Events.CalculateTime(1*IN_MILLISECONDS)); + me->m_Events.AddEvent(new BoomEvent(me), me->m_Events.CalculateTime(1 * IN_MILLISECONDS)); } - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) { if (_boomed) damage = 0; @@ -847,7 +847,7 @@ public: uint32 _attackTimer; void Reset() { - if (Unit *target = SelectTargetFromPlayerList(200)) + if (Unit* target = SelectTargetFromPlayerList(200)) AttackStart(target); else me->DespawnOrUnsummon(); @@ -866,219 +866,219 @@ public: class spell_xt002_tympanic_tantrum : public SpellScriptLoader { - public: - spell_xt002_tympanic_tantrum() : SpellScriptLoader("spell_xt002_tympanic_tantrum") { } +public: + spell_xt002_tympanic_tantrum() : SpellScriptLoader("spell_xt002_tympanic_tantrum") { } - class spell_xt002_tympanic_tantrum_SpellScript : public SpellScript + class spell_xt002_tympanic_tantrum_SpellScript : public SpellScript + { + PrepareSpellScript(spell_xt002_tympanic_tantrum_SpellScript); + + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_xt002_tympanic_tantrum_SpellScript); - - void FilterTargets(std::list& targets) - { - targets.remove_if(PlayerOrPetCheck()); - } - - void RecalculateDamage() - { - if (GetHitUnit()) - SetHitDamage(GetHitUnit()->CountPctFromMaxHealth(GetHitDamage())); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_xt002_tympanic_tantrum_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY); - OnHit += SpellHitFn(spell_xt002_tympanic_tantrum_SpellScript::RecalculateDamage); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_xt002_tympanic_tantrum_SpellScript(); + targets.remove_if(PlayerOrPetCheck()); } + + void RecalculateDamage() + { + if (GetHitUnit()) + SetHitDamage(GetHitUnit()->CountPctFromMaxHealth(GetHitDamage())); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_xt002_tympanic_tantrum_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY); + OnHit += SpellHitFn(spell_xt002_tympanic_tantrum_SpellScript::RecalculateDamage); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_xt002_tympanic_tantrum_SpellScript(); + } }; class spell_xt002_gravity_bomb_aura : public SpellScriptLoader { - public: - spell_xt002_gravity_bomb_aura() : SpellScriptLoader("spell_xt002_gravity_bomb_aura") { } +public: + spell_xt002_gravity_bomb_aura() : SpellScriptLoader("spell_xt002_gravity_bomb_aura") { } - class spell_xt002_gravity_bomb_aura_AuraScript : public AuraScript + class spell_xt002_gravity_bomb_aura_AuraScript : public AuraScript + { + PrepareAuraScript(spell_xt002_gravity_bomb_aura_AuraScript); + + void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_xt002_gravity_bomb_aura_AuraScript); - - void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - if (Player* player = GetOwner()->ToPlayer()) - if (Unit* xt002 = GetCaster()) - if (xt002->HasAura(aurEff->GetAmount())) // Heartbreak aura indicating hard mode - if (Creature* cr = xt002->SummonCreature(NPC_VOID_ZONE, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 180000)) - { - int32 damage = GetSpellInfo()->Id == 63025 ? 5000 : 7500; - cr->CastCustomSpell(cr, SPELL_VOID_ZONE_DAMAGE, &damage, 0, 0, true); - } - } - - void OnPeriodic(AuraEffect const* aurEff) - { - Unit* xt002 = GetCaster(); - if (!xt002) - return; - - Unit* owner = GetOwner()->ToUnit(); - if (!owner) - return; - - if (aurEff->GetAmount() >= int32(owner->GetHealth())) - if (xt002->GetAI()) - xt002->GetAI()->DoAction(DATA_XT002_GRAVITY_ACHIEV); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_xt002_gravity_bomb_aura_AuraScript::OnPeriodic, EFFECT_2, SPELL_AURA_PERIODIC_DAMAGE); - AfterEffectRemove += AuraEffectRemoveFn(spell_xt002_gravity_bomb_aura_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_xt002_gravity_bomb_aura_AuraScript(); + if (Player* player = GetOwner()->ToPlayer()) + if (Unit* xt002 = GetCaster()) + if (xt002->HasAura(aurEff->GetAmount())) // Heartbreak aura indicating hard mode + if (Creature* cr = xt002->SummonCreature(NPC_VOID_ZONE, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 180000)) + { + int32 damage = GetSpellInfo()->Id == 63025 ? 5000 : 7500; + cr->CastCustomSpell(cr, SPELL_VOID_ZONE_DAMAGE, &damage, 0, 0, true); + } } - class spell_xt002_gravity_bomb_aura_SpellScript : public SpellScript + void OnPeriodic(AuraEffect const* aurEff) { - PrepareSpellScript(spell_xt002_gravity_bomb_aura_SpellScript); + Unit* xt002 = GetCaster(); + if (!xt002) + return; - void SelectTarget(std::list& targets) - { - if (Unit* victim = GetCaster()->GetVictim()) - targets.remove_if(acore::ObjectGUIDCheck(victim->GetGUID(), true)); - } + Unit* owner = GetOwner()->ToUnit(); + if (!owner) + return; - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_xt002_gravity_bomb_aura_SpellScript::SelectTarget, EFFECT_ALL, TARGET_UNIT_DEST_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_xt002_gravity_bomb_aura_SpellScript(); + if (aurEff->GetAmount() >= int32(owner->GetHealth())) + if (xt002->GetAI()) + xt002->GetAI()->DoAction(DATA_XT002_GRAVITY_ACHIEV); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_xt002_gravity_bomb_aura_AuraScript::OnPeriodic, EFFECT_2, SPELL_AURA_PERIODIC_DAMAGE); + AfterEffectRemove += AuraEffectRemoveFn(spell_xt002_gravity_bomb_aura_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_xt002_gravity_bomb_aura_AuraScript(); + } + + class spell_xt002_gravity_bomb_aura_SpellScript : public SpellScript + { + PrepareSpellScript(spell_xt002_gravity_bomb_aura_SpellScript); + + void SelectTarget(std::list& targets) + { + if (Unit* victim = GetCaster()->GetVictim()) + targets.remove_if(acore::ObjectGUIDCheck(victim->GetGUID(), true)); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_xt002_gravity_bomb_aura_SpellScript::SelectTarget, EFFECT_ALL, TARGET_UNIT_DEST_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_xt002_gravity_bomb_aura_SpellScript(); + } }; class spell_xt002_gravity_bomb_damage : public SpellScriptLoader { - public: - spell_xt002_gravity_bomb_damage() : SpellScriptLoader("spell_xt002_gravity_bomb_damage") { } +public: + spell_xt002_gravity_bomb_damage() : SpellScriptLoader("spell_xt002_gravity_bomb_damage") { } - class spell_xt002_gravity_bomb_damage_SpellScript : public SpellScript + class spell_xt002_gravity_bomb_damage_SpellScript : public SpellScript + { + PrepareSpellScript(spell_xt002_gravity_bomb_damage_SpellScript); + + void HandleScript(SpellEffIndex /*eff*/) { - PrepareSpellScript(spell_xt002_gravity_bomb_damage_SpellScript); + Unit* caster = GetCaster(); + if (!caster) + return; - void HandleScript(SpellEffIndex /*eff*/) - { - Unit* caster = GetCaster(); - if (!caster) - return; - - if (GetHitDamage() >= int32(GetHitUnit()->GetHealth())) - if (caster->GetAI()) - caster->GetAI()->DoAction(DATA_XT002_GRAVITY_ACHIEV); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_xt002_gravity_bomb_damage_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_xt002_gravity_bomb_damage_SpellScript(); + if (GetHitDamage() >= int32(GetHitUnit()->GetHealth())) + if (caster->GetAI()) + caster->GetAI()->DoAction(DATA_XT002_GRAVITY_ACHIEV); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_xt002_gravity_bomb_damage_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_xt002_gravity_bomb_damage_SpellScript(); + } }; class spell_xt002_searing_light_spawn_life_spark : public SpellScriptLoader { - public: - spell_xt002_searing_light_spawn_life_spark() : SpellScriptLoader("spell_xt002_searing_light_spawn_life_spark") { } +public: + spell_xt002_searing_light_spawn_life_spark() : SpellScriptLoader("spell_xt002_searing_light_spawn_life_spark") { } - class spell_xt002_searing_light_spawn_life_spark_AuraScript : public AuraScript + class spell_xt002_searing_light_spawn_life_spark_AuraScript : public AuraScript + { + PrepareAuraScript(spell_xt002_searing_light_spawn_life_spark_AuraScript); + + void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_xt002_searing_light_spawn_life_spark_AuraScript); - - void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - if (Player* player = GetOwner()->ToPlayer()) - if (Unit* xt002 = GetCaster()) - if (xt002->HasAura(aurEff->GetAmount())) // Heartbreak aura indicating hard mode - xt002->SummonCreature(NPC_LIFE_SPARK, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 180000); - } - - void Register() - { - OnEffectRemove += AuraEffectRemoveFn(spell_xt002_searing_light_spawn_life_spark_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_xt002_searing_light_spawn_life_spark_AuraScript(); + if (Player* player = GetOwner()->ToPlayer()) + if (Unit* xt002 = GetCaster()) + if (xt002->HasAura(aurEff->GetAmount())) // Heartbreak aura indicating hard mode + xt002->SummonCreature(NPC_LIFE_SPARK, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 180000); } - class spell_xt002_searing_light_spawn_life_spark_SpellScript : public SpellScript + void Register() { - PrepareSpellScript(spell_xt002_searing_light_spawn_life_spark_SpellScript); - - void SelectTarget(std::list& targets) - { - if (Unit* victim = GetCaster()->GetVictim()) - targets.remove_if(acore::ObjectGUIDCheck(victim->GetGUID(), true)); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_xt002_searing_light_spawn_life_spark_SpellScript::SelectTarget, EFFECT_ALL, TARGET_UNIT_DEST_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_xt002_searing_light_spawn_life_spark_SpellScript(); + OnEffectRemove += AuraEffectRemoveFn(spell_xt002_searing_light_spawn_life_spark_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); } + }; + + AuraScript* GetAuraScript() const + { + return new spell_xt002_searing_light_spawn_life_spark_AuraScript(); + } + + class spell_xt002_searing_light_spawn_life_spark_SpellScript : public SpellScript + { + PrepareSpellScript(spell_xt002_searing_light_spawn_life_spark_SpellScript); + + void SelectTarget(std::list& targets) + { + if (Unit* victim = GetCaster()->GetVictim()) + targets.remove_if(acore::ObjectGUIDCheck(victim->GetGUID(), true)); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_xt002_searing_light_spawn_life_spark_SpellScript::SelectTarget, EFFECT_ALL, TARGET_UNIT_DEST_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_xt002_searing_light_spawn_life_spark_SpellScript(); + } }; class achievement_xt002_nerf_engineering : public AchievementCriteriaScript { - public: - achievement_xt002_nerf_engineering() : AchievementCriteriaScript("achievement_xt002_nerf_engineering") {} +public: + achievement_xt002_nerf_engineering() : AchievementCriteriaScript("achievement_xt002_nerf_engineering") {} - bool OnCheck(Player* /*player*/, Unit* target) - { - if (target) - if (InstanceScript* instance = target->GetInstanceScript()) - if (Creature* cr = ObjectAccessor::GetCreature(*target, instance->GetData64(TYPE_XT002))) - return cr->AI()->GetData(DATA_XT002_NERF_ENGINEERING); - - return false; - } + bool OnCheck(Player* /*player*/, Unit* target) + { + if (target) + if (InstanceScript* instance = target->GetInstanceScript()) + if (Creature* cr = ObjectAccessor::GetCreature(*target, instance->GetData64(TYPE_XT002))) + return cr->AI()->GetData(DATA_XT002_NERF_ENGINEERING); + + return false; + } }; class achievement_xt002_nerf_gravity_bombs : public AchievementCriteriaScript { - public: - achievement_xt002_nerf_gravity_bombs() : AchievementCriteriaScript("achievement_xt002_nerf_gravity_bombs") {} +public: + achievement_xt002_nerf_gravity_bombs() : AchievementCriteriaScript("achievement_xt002_nerf_gravity_bombs") {} - bool OnCheck(Player* /*player*/, Unit* target) - { - if (target) - if (InstanceScript* instance = target->GetInstanceScript()) - if (Creature* cr = ObjectAccessor::GetCreature(*target, instance->GetData64(TYPE_XT002))) - return cr->AI()->GetData(DATA_XT002_GRAVITY_ACHIEV); - - return false; - } + bool OnCheck(Player* /*player*/, Unit* target) + { + if (target) + if (InstanceScript* instance = target->GetInstanceScript()) + if (Creature* cr = ObjectAccessor::GetCreature(*target, instance->GetData64(TYPE_XT002))) + return cr->AI()->GetData(DATA_XT002_GRAVITY_ACHIEV); + + return false; + } }; void AddSC_boss_xt002() diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yoggsaron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yoggsaron.cpp index c919915bb..c23a1d8d2 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yoggsaron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yoggsaron.cpp @@ -296,7 +296,7 @@ enum Misc DATA_GET_DRIVE_ME_CRAZY = 4, }; -const Position Middle = {1980.28f, -25.5868f, 329.397f, M_PI*1.5f}; +const Position Middle = {1980.28f, -25.5868f, 329.397f, M_PI * 1.5f}; class boss_yoggsaron_sara : public CreatureScript @@ -339,7 +339,7 @@ public: { if (cr->GetEntry() == NPC_FREYA_KEEPER) cr->CastSpell(cr, SPELL_CONJURE_SANITY_WELL, false); - _keepersGUID[cr->GetEntry()-NPC_FREYA_KEEPER] = cr->GetGUID(); + _keepersGUID[cr->GetEntry() - NPC_FREYA_KEEPER] = cr->GetGUID(); } else if (cr->GetEntry() == NPC_SANITY_WELL) cr->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_SCALE, true); @@ -349,11 +349,11 @@ public: { for (uint8 i = 0; i < 6; ++i) { - float Zplus = i > 2 ? (i-2)*1.6f : 0; - if (i%2) - me->SummonCreature(NPC_OMINOUS_CLOUD, me->GetPositionX()+8+i*7, me->GetPositionY()+8+i*7, 326+Zplus, 0); + float Zplus = i > 2 ? (i - 2) * 1.6f : 0; + if (i % 2) + me->SummonCreature(NPC_OMINOUS_CLOUD, me->GetPositionX() + 8 + i * 7, me->GetPositionY() + 8 + i * 7, 326 + Zplus, 0); else - me->SummonCreature(NPC_OMINOUS_CLOUD, me->GetPositionX()-8-i*7, me->GetPositionY()-8-i*7, 326+Zplus, 0); + me->SummonCreature(NPC_OMINOUS_CLOUD, me->GetPositionX() - 8 - i * 7, me->GetPositionY() - 8 - i * 7, 326 + Zplus, 0); } } @@ -412,8 +412,8 @@ public: _p2TalkTimer = 0; _secondPhase = false; _summonSpeed = 1.0f; - _currentIllusion = urand(1,3); - _isIllusionReversed = urand(0,1); + _currentIllusion = urand(1, 3); + _isIllusionReversed = urand(0, 1); if (m_pInstance) { @@ -485,7 +485,7 @@ public: if (!summon || summon->GetEntry() != NPC_OMINOUS_CLOUD || me->GetDistance(summon) < 20) continue; - if ((!cloud || (urand(0,1) && !summon->HasAura(SPELL_SUMMON_GUARDIAN_OF_YS)))) + if ((!cloud || (urand(0, 1) && !summon->HasAura(SPELL_SUMMON_GUARDIAN_OF_YS)))) cloud = summon; } @@ -495,10 +495,10 @@ public: void SpawnTentacle(uint32 entry) { - uint32 dist = urand(38,48); - float o = rand_norm()*M_PI*2; - float Zplus = (dist-38)/6.5f; - if (Creature* cr = me->SummonCreature(entry, me->GetPositionX()+dist*cos(o), me->GetPositionY()+dist*sin(o), 327.2+Zplus, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000)) + uint32 dist = urand(38, 48); + float o = rand_norm() * M_PI * 2; + float Zplus = (dist - 38) / 6.5f; + if (Creature* cr = me->SummonCreature(entry, me->GetPositionX() + dist * cos(o), me->GetPositionY() + dist * sin(o), 327.2 + Zplus, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000)) { cr->CastSpell(cr, SPELL_TENTACLE_ERUPT, true); cr->CastSpell(cr, SPELL_VOID_ZONE_SMALL, true); @@ -510,10 +510,10 @@ public: { for (uint8 i = 0; i < 4; ++i) { - uint32 dist = urand(38,48); - float o = rand_norm()*M_PI*2; - float Zplus = (dist-38)/6.5f; - me->SummonCreature(NPC_DEATH_ORB, me->GetPositionX()+dist*cos(o), me->GetPositionY()+dist*sin(o), 327.2+Zplus, 0, TEMPSUMMON_TIMED_DESPAWN, 20000); + uint32 dist = urand(38, 48); + float o = rand_norm() * M_PI * 2; + float Zplus = (dist - 38) / 6.5f; + me->SummonCreature(NPC_DEATH_ORB, me->GetPositionX() + dist * cos(o), me->GetPositionY() + dist * sin(o), 327.2 + Zplus, 0, TEMPSUMMON_TIMED_DESPAWN, 20000); } } @@ -525,8 +525,8 @@ public: // Spawn Portals for (uint8 i = 0; i < RAID_MODE(4, 10); ++i) { - float ang = i ? (M_PI*2.0f/i) : M_PI*2.0f; - if ((cr = me->SummonCreature(NPC_DESCEND_INTO_MADNESS, me->GetPositionX()+25*cos(ang), me->GetPositionY()+25*sin(ang), 326, 0, TEMPSUMMON_TIMED_DESPAWN, 15000))) + float ang = i ? (M_PI * 2.0f / i) : M_PI * 2.0f; + if ((cr = me->SummonCreature(NPC_DESCEND_INTO_MADNESS, me->GetPositionX() + 25 * cos(ang), me->GetPositionY() + 25 * sin(ang), 326, 0, TEMPSUMMON_TIMED_DESPAWN, 15000))) { cr->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NON_ATTACKABLE); cr->SetArmor(_currentIllusion); @@ -537,17 +537,17 @@ public: summons.DoAction(_currentIllusion, pred); if (_isIllusionReversed) - _currentIllusion = _currentIllusion == 3 ? 1 : (_currentIllusion+1); + _currentIllusion = _currentIllusion == 3 ? 1 : (_currentIllusion + 1); else - _currentIllusion = _currentIllusion == 1 ? 3 : (_currentIllusion-1); + _currentIllusion = _currentIllusion == 1 ? 3 : (_currentIllusion - 1); } void SpellSounds() { - if (urand(0,9)) + if (urand(0, 9)) return; - if (urand(0,1)) + if (urand(0, 1)) { me->MonsterYell(_secondPhase ? "Tremble, mortals, before the coming of the end!" : "Yes! YES! Show them no mercy! Give no pause to your attacks!", LANG_UNIVERSAL, 0); me->PlayDirectSound(_secondPhase ? SARA_P2_CAST2 : SARA_P1_CAST1); @@ -564,7 +564,7 @@ public: if (who->GetTypeId() != TYPEID_PLAYER) return; - if (urand(0,1)) + if (urand(0, 1)) { me->MonsterYell("Could they have been saved?", LANG_UNIVERSAL, 0); me->PlayDirectSound(SARA_P1_KILL2); @@ -646,7 +646,7 @@ public: uint32 timer = events.GetNextEventTime(EVENT_SARA_P2_OPEN_PORTALS); uint32 portalTime = (timer > events.GetTimer() ? timer - events.GetTimer() : 0); - events.DelayEvents(param+100); + events.DelayEvents(param + 100); events.RescheduleEvent(EVENT_SARA_P2_OPEN_PORTALS, portalTime, 0, EVENT_PHASE_TWO); events.ScheduleEvent(EVENT_SARA_P2_REMOVE_STUN, param, 0, EVENT_PHASE_TWO); me->CastSpell(me, SPELL_SHATTERED_ILLUSION, true); @@ -667,7 +667,7 @@ public: events.SetPhase(EVENT_PHASE_TWO); me->SetHealth(me->GetMaxHealth()); - if (Creature *cr = me->SummonCreature(NPC_YOGG_SARON, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), M_PI)) + if (Creature* cr = me->SummonCreature(NPC_YOGG_SARON, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), M_PI)) cr->SetVisible(false); _p2TalkTimer++; @@ -759,24 +759,24 @@ public: InformCloud(); break; case EVENT_SARA_P1_SPELLS: - { - uint32 spell = RAND(SPELL_SARAS_ANGER_TARGET_SELECTOR, SPELL_SARAS_BLESSING_TARGET_SELECTOR, SPELL_SARAS_FAVOR_TARGET_SELECTOR); - me->CastSpell(me, spell, false); - SpellSounds(); - events.RepeatEvent(me->GetMap()->Is25ManRaid() ? urand(0,3000) : 4000+urand(0,2000)); - break; - } + { + uint32 spell = RAND(SPELL_SARAS_ANGER_TARGET_SELECTOR, SPELL_SARAS_BLESSING_TARGET_SELECTOR, SPELL_SARAS_FAVOR_TARGET_SELECTOR); + me->CastSpell(me, spell, false); + SpellSounds(); + events.RepeatEvent(me->GetMap()->Is25ManRaid() ? urand(0, 3000) : 4000 + urand(0, 2000)); + break; + } case EVENT_SARA_P2_START: - { - events.PopEvent(); - EntryCheckPredicate pred(NPC_YOGG_SARON); - summons.DoAction(ACTION_YOGG_SARON_APPEAR, pred); - events.RescheduleEvent(EVENT_SARA_P2_SPAWN_START_TENTACLES, 500, 0, EVENT_PHASE_TWO); + { + events.PopEvent(); + EntryCheckPredicate pred(NPC_YOGG_SARON); + summons.DoAction(ACTION_YOGG_SARON_APPEAR, pred); + events.RescheduleEvent(EVENT_SARA_P2_SPAWN_START_TENTACLES, 500, 0, EVENT_PHASE_TWO); - // Spawn Brain! - me->SummonCreature(NPC_BRAIN_OF_YOGG_SARON, 1981.3f, -25.43f, 265); - break; - } + // Spawn Brain! + me->SummonCreature(NPC_BRAIN_OF_YOGG_SARON, 1981.3f, -25.43f, 265); + break; + } case EVENT_SARA_P2_MALADY: me->CastCustomSpell(SPELL_MALADY_OF_THE_MIND, SPELLVALUE_MAX_TARGETS, 1, me, false); events.RepeatEvent(20000); @@ -792,35 +792,35 @@ public: break; case EVENT_SARA_P2_SUMMON_T1: // CRUSHER SpawnTentacle(NPC_CRUSHER_TENTACLE); - events.RepeatEvent((50000+urand(0,10000)) * _summonSpeed); + events.RepeatEvent((50000 + urand(0, 10000)) * _summonSpeed); break; case EVENT_SARA_P2_SUMMON_T2: // CONSTRICTOR SpawnTentacle(NPC_CONSTRICTOR_TENTACLE); - events.RepeatEvent((15000+urand(0,5000)) * _summonSpeed); + events.RepeatEvent((15000 + urand(0, 5000)) * _summonSpeed); break; case EVENT_SARA_P2_SUMMON_T3: // CORRUPTOR SpawnTentacle(NPC_CORRUPTOR_TENTACLE); - events.RepeatEvent((30000+urand(0,10000)) * _summonSpeed); + events.RepeatEvent((30000 + urand(0, 10000)) * _summonSpeed); break; case EVENT_SARA_P2_BRAIN_LINK: me->CastCustomSpell(SPELL_BRAIN_LINK, SPELLVALUE_MAX_TARGETS, 1, me, false); events.RepeatEvent(30000); break; case EVENT_SARA_P2_OPEN_PORTALS: - { - AddPortals(); - EntryCheckPredicate pred(NPC_YOGG_SARON); - summons.DoAction(ACTION_YOGG_SARON_OPEN_PORTAL_YELL, pred); - events.RepeatEvent(80000); - break; - } + { + AddPortals(); + EntryCheckPredicate pred(NPC_YOGG_SARON); + summons.DoAction(ACTION_YOGG_SARON_OPEN_PORTAL_YELL, pred); + events.RepeatEvent(80000); + break; + } case EVENT_SARA_P2_REMOVE_STUN: - { - me->RemoveAura(SPELL_SHATTERED_ILLUSION); - events.PopEvent(); - summons.DoAction(ACTION_REMOVE_STUN); - break; - } + { + me->RemoveAura(SPELL_SHATTERED_ILLUSION); + events.PopEvent(); + summons.DoAction(ACTION_REMOVE_STUN); + break; + } case EVENT_SARA_P2_SPAWN_START_TENTACLES: events.PopEvent(); @@ -838,9 +838,9 @@ public: events.ScheduleEvent(EVENT_SARA_P2_MALADY, 7000, 0, EVENT_PHASE_TWO); events.ScheduleEvent(EVENT_SARA_P2_PSYCHOSIS, 3000, 0, EVENT_PHASE_TWO); events.ScheduleEvent(EVENT_SARA_P2_DEATH_RAY, 15000, 0, EVENT_PHASE_TWO); - events.ScheduleEvent(EVENT_SARA_P2_SUMMON_T1, 50000+urand(0,10000), 0, EVENT_PHASE_TWO); - events.ScheduleEvent(EVENT_SARA_P2_SUMMON_T2, 15000+urand(0,5000) , 0, EVENT_PHASE_TWO); - events.ScheduleEvent(EVENT_SARA_P2_SUMMON_T3, 30000+urand(0,10000), 0, EVENT_PHASE_TWO); + events.ScheduleEvent(EVENT_SARA_P2_SUMMON_T1, 50000 + urand(0, 10000), 0, EVENT_PHASE_TWO); + events.ScheduleEvent(EVENT_SARA_P2_SUMMON_T2, 15000 + urand(0, 5000), 0, EVENT_PHASE_TWO); + events.ScheduleEvent(EVENT_SARA_P2_SUMMON_T3, 30000 + urand(0, 10000), 0, EVENT_PHASE_TWO); events.ScheduleEvent(EVENT_SARA_P2_BRAIN_LINK, 0, 0, EVENT_PHASE_TWO); events.ScheduleEvent(EVENT_SARA_P2_OPEN_PORTALS, 60000, 0, EVENT_PHASE_TWO); break; @@ -875,7 +875,7 @@ public: uint32 _checkTimer; bool _isSummoning; - void JustSummoned(Creature *cr) + void JustSummoned(Creature* cr) { cr->ToTempSummon()->SetTempSummonType(TEMPSUMMON_CORPSE_DESPAWN); @@ -916,16 +916,16 @@ public: { for (uint8 i = 0; i <= dist; ++i) { - float angle = M_PI*2/dist*i; - AddWaypoint(i, Middle.GetPositionX()+dist*cos(angle), Middle.GetPositionY()+dist*sin(angle), me->GetPositionZ(), 0); + float angle = M_PI * 2 / dist * i; + AddWaypoint(i, Middle.GetPositionX() + dist * cos(angle), Middle.GetPositionY() + dist * sin(angle), me->GetPositionZ(), 0); } } else { for (uint8 i = 0; i <= dist; ++i) { - float angle = M_PI*2-(M_PI*2/dist*i); - AddWaypoint(i, Middle.GetPositionX()+dist*cos(angle), Middle.GetPositionY()+dist*sin(angle), me->GetPositionZ(), 0); + float angle = M_PI * 2 - (M_PI * 2 / dist * i); + AddWaypoint(i, Middle.GetPositionX() + dist * cos(angle), Middle.GetPositionY() + dist * sin(angle), me->GetPositionZ(), 0); } } } @@ -1020,7 +1020,7 @@ public: for (uint8 i = 0; i < 4; ++i) if (m_pInstance->GetData(TYPE_WATCHERS) & (1 << i)) { - me->RemoveLootMode(1<<_count); + me->RemoveLootMode(1 << _count); --_count; } } @@ -1038,10 +1038,10 @@ public: void SummonImmortalGuardian() { - uint32 dist = urand(38,48); - float o = rand_norm()*M_PI*2; - float Zplus = (dist-38)/6.5f; - me->SummonCreature(NPC_IMMORTAL_GUARDIAN, me->GetPositionX()+dist*cos(o), me->GetPositionY()+dist*sin(o), 327.2+Zplus, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000); + uint32 dist = urand(38, 48); + float o = rand_norm() * M_PI * 2; + float Zplus = (dist - 38) / 6.5f; + me->SummonCreature(NPC_IMMORTAL_GUARDIAN, me->GetPositionX() + dist * cos(o), me->GetPositionY() + dist * sin(o), 327.2 + Zplus, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000); } void JustDied(Unit* /*who*/) @@ -1095,8 +1095,8 @@ public: } else if (param == ACTION_YOGG_SARON_START_P3) { - me->SetHealth(me->GetMaxHealth()*0.3f); - me->LowerPlayerDamageReq(me->GetMaxHealth()*0.7f); + me->SetHealth(me->GetMaxHealth() * 0.3f); + me->LowerPlayerDamageReq(me->GetMaxHealth() * 0.7f); me->RemoveAura(SPELL_SHADOW_BARRIER); @@ -1239,11 +1239,11 @@ public: me->SummonCreature(NPC_INFLUENCE_TENTACLE, 2136.7f, 2.43262f, 239.72f, 3.90023f); // Laughing Skulls - if (urand(0,1)) + if (urand(0, 1)) me->SummonCreature(NPC_LAUGHING_SKULL, 2139.13f, -59.0848f, 239.728f, 2.2974f); else me->SummonCreature(NPC_LAUGHING_SKULL, 2083, -25.66f, 244, 0); - if (urand(0,1)) + if (urand(0, 1)) me->SummonCreature(NPC_LAUGHING_SKULL, 2066.67f, -59.8984f, 239.72f, 0.718747f); else me->SummonCreature(NPC_LAUGHING_SKULL, 2126.22f, -25.86f, 244, 0); @@ -1262,15 +1262,15 @@ public: { // Laughing Skulls me->SummonCreature(NPC_LAUGHING_SKULL, 1931.12f, -92.702f, 239.991f, 5.2819f); - if (urand(0,1)) + if (urand(0, 1)) me->SummonCreature(NPC_LAUGHING_SKULL, 1969.88f, -147.729f, 239.991f, 2.37593f); else me->SummonCreature(NPC_LAUGHING_SKULL, 1878, -93.3f, 240, 0); - if (urand(0,1)) + if (urand(0, 1)) me->SummonCreature(NPC_LAUGHING_SKULL, 1950.78f, -167.902f, 239.991f, 2.34844f); else me->SummonCreature(NPC_LAUGHING_SKULL, 1938.45f, -116.5f, 240, 0); - if (urand(0,1)) + if (urand(0, 1)) me->SummonCreature(NPC_LAUGHING_SKULL, 1896.45f, -141.469f, 239.991f, 6.12227f); else me->SummonCreature(NPC_LAUGHING_SKULL, 1921, -158, 240, 0); @@ -1292,11 +1292,11 @@ public: void PrepareStormwindIllusion() { // Laughing Skulls - if (urand(0,1)) + if (urand(0, 1)) me->SummonCreature(NPC_LAUGHING_SKULL, 1916.36f, 28.05f, 239.666f, 1.30238f); else me->SummonCreature(NPC_LAUGHING_SKULL, 1966.7f, 57.8f, 239.66f, 0); - if (urand(0,1)) + if (urand(0, 1)) me->SummonCreature(NPC_LAUGHING_SKULL, 1902, 75.1362f, 239.666f, 6.06189f); else me->SummonCreature(NPC_LAUGHING_SKULL, 1933, 91, 240, 0); @@ -1332,11 +1332,11 @@ public: // Stun if (me->GetInstanceScript()) if(Creature* sara = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetData64(NPC_SARA))) - sara->AI()->DoAction(MINUTE*IN_MILLISECONDS-std::min((uint32)MINUTE*IN_MILLISECONDS, _induceTimer)); + sara->AI()->DoAction(MINUTE * IN_MILLISECONDS - std::min((uint32)MINUTE * IN_MILLISECONDS, _induceTimer)); _induceTimer = 0; summons.DespawnEntry(NPC_LAUGHING_SKULL); - if (GameObject* go = me->FindNearestGameObject(GO_CHAMBER_ILLUSION_DOORS+_activeIllusion, 150.0f)) + if (GameObject* go = me->FindNearestGameObject(GO_CHAMBER_ILLUSION_DOORS + _activeIllusion, 150.0f)) go->SetGoState(GO_STATE_ACTIVE); } return; @@ -1347,16 +1347,22 @@ public: summons.DespawnAll(); switch(param) { - case ACTION_ILLUSION_STORMWIND: PrepareStormwindIllusion(); break; - case ACTION_ILLUSION_DRAGONS: PrepareChamberIllusion(); break; - case ACTION_ILLUSION_ICECROWN: PrepareIceCrownIllusion(); break; + case ACTION_ILLUSION_STORMWIND: + PrepareStormwindIllusion(); + break; + case ACTION_ILLUSION_DRAGONS: + PrepareChamberIllusion(); + break; + case ACTION_ILLUSION_ICECROWN: + PrepareIceCrownIllusion(); + break; } for (uint32 i = GO_CHAMBER_ILLUSION_DOORS; i <= GO_STORMWIND_ILLUSION_DOORS; ++i) if (GameObject* go = me->FindNearestGameObject(i, 150.0f)) go->SetGoState(GO_STATE_READY); - _activeIllusion = param-1; + _activeIllusion = param - 1; _tentacleCount = 0; _induceTimer = 1; @@ -1366,7 +1372,7 @@ public: uint32 GetData(uint32 param) const { if (param == DATA_GET_CURRENT_ILLUSION) - return _activeIllusion+1; + return _activeIllusion + 1; return 0; } @@ -1535,7 +1541,7 @@ public: { Player* target = nullptr; Map::PlayerList const& pList = me->GetMap()->GetPlayers(); - uint8 num = urand(0, pList.getSize()-1); + uint8 num = urand(0, pList.getSize() - 1); uint8 count = 0; for (Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr, ++count) { @@ -1589,9 +1595,9 @@ public: Unit* SelectConstrictTarget() { - Player *target = nullptr; + Player* target = nullptr; Map::PlayerList const& pList = me->GetMap()->GetPlayers(); - uint8 num = urand(0, pList.getSize()-1); + uint8 num = urand(0, pList.getSize() - 1); uint8 count = 0; for(Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr, ++count) { @@ -1703,9 +1709,15 @@ public: return true; switch (creature->GetArmor()) { - case ACTION_ILLUSION_DRAGONS: player->CastSpell(player, SPELL_TELEPORT_TO_CHAMBER, true); break; - case ACTION_ILLUSION_ICECROWN: player->CastSpell(player, SPELL_TELEPORT_TO_ICECROWN, true); break; - case ACTION_ILLUSION_STORMWIND: player->CastSpell(player, SPELL_TELEPORT_TO_STORMWIND, true); break; + case ACTION_ILLUSION_DRAGONS: + player->CastSpell(player, SPELL_TELEPORT_TO_CHAMBER, true); + break; + case ACTION_ILLUSION_ICECROWN: + player->CastSpell(player, SPELL_TELEPORT_TO_ICECROWN, true); + break; + case ACTION_ILLUSION_STORMWIND: + player->CastSpell(player, SPELL_TELEPORT_TO_STORMWIND, true); + break; } creature->SetUInt32Value(UNIT_NPC_FLAGS, 0); @@ -1782,7 +1794,7 @@ public: void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) { if (damage >= me->GetHealth()) - damage = me->GetHealth()-1; + damage = me->GetHealth() - 1; } void SpellHit(Unit* caster, const SpellInfo* spellInfo) @@ -1882,7 +1894,7 @@ public: ChatHandler::BuildChatPacket(data, yell ? CHAT_MSG_MONSTER_YELL : CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, creature, NULL, text); creature->SendMessageToSetInRange(&data, 90, true); } - else if (Creature* cr = me->SummonTrigger(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()-5, 0, 5000)) + else if (Creature* cr = me->SummonTrigger(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() - 5, 0, 5000)) { ChatHandler::BuildChatPacket(data, yell ? CHAT_MSG_MONSTER_YELL : CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, creature, NULL, text); cr->SendMessageToSetInRange(&data, 90, true); @@ -1997,7 +2009,7 @@ public: ChatHandler::BuildChatPacket(data, yell ? CHAT_MSG_MONSTER_YELL : CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, creature, NULL, text); creature->SendMessageToSetInRange(&data, 90, true); } - else if (Creature* cr = me->SummonTrigger(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()-5, 0, 5000)) + else if (Creature* cr = me->SummonTrigger(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() - 5, 0, 5000)) { ChatHandler::BuildChatPacket(data, yell ? CHAT_MSG_MONSTER_YELL : CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, creature, NULL, text); cr->SendMessageToSetInRange(&data, 90, true); @@ -2117,7 +2129,7 @@ public: ChatHandler::BuildChatPacket(data, yell ? CHAT_MSG_MONSTER_YELL : CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, creature, NULL, text); creature->SendMessageToSetInRange(&data, 90, true); } - else if (Creature* cr = me->SummonTrigger(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()-5, 0, 5000)) + else if (Creature* cr = me->SummonTrigger(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() - 5, 0, 5000)) { ChatHandler::BuildChatPacket(data, yell ? CHAT_MSG_MONSTER_YELL : CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, creature, NULL, text); cr->SendMessageToSetInRange(&data, 90, true); @@ -2226,18 +2238,18 @@ public: switch (events.GetEvent()) { case 40: - { - events.PopEvent(); - uint64 _guid = _targets.at(_current); - ++_current; - - if (Player* player = ObjectAccessor::GetPlayer(*me, _guid)) { - me->PlayDirectSound(15760, player); - me->MonsterWhisper("Destroy them minion, your master commands it!", player, false); + events.PopEvent(); + uint64 _guid = _targets.at(_current); + ++_current; + + if (Player* player = ObjectAccessor::GetPlayer(*me, _guid)) + { + me->PlayDirectSound(15760, player); + me->MonsterWhisper("Destroy them minion, your master commands it!", player, false); + } + break; } - break; - } } } }; @@ -2245,257 +2257,257 @@ public: class spell_yogg_saron_malady_of_the_mind : public SpellScriptLoader { - public: - spell_yogg_saron_malady_of_the_mind() : SpellScriptLoader("spell_yogg_saron_malady_of_the_mind") { } +public: + spell_yogg_saron_malady_of_the_mind() : SpellScriptLoader("spell_yogg_saron_malady_of_the_mind") { } - class spell_yogg_saron_malady_of_the_mind_AuraScript : public AuraScript + class spell_yogg_saron_malady_of_the_mind_AuraScript : public AuraScript + { + PrepareAuraScript(spell_yogg_saron_malady_of_the_mind_AuraScript); + + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_yogg_saron_malady_of_the_mind_AuraScript); - - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetUnitOwner()->ApplySpellImmune(SPELL_DEATH_RAY_DAMAGE_REAL, IMMUNITY_ID, SPELL_DEATH_RAY_DAMAGE_REAL, true); - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetUnitOwner()->ApplySpellImmune(SPELL_DEATH_RAY_DAMAGE_REAL, IMMUNITY_ID, SPELL_DEATH_RAY_DAMAGE_REAL, false); - GetUnitOwner()->CastCustomSpell(SPELL_MALADY_OF_THE_MIND_TRIGGER, SPELLVALUE_MAX_TARGETS, 1, GetUnitOwner(), true); - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_yogg_saron_malady_of_the_mind_AuraScript::OnApply, EFFECT_1, SPELL_AURA_MOD_FEAR, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_yogg_saron_malady_of_the_mind_AuraScript::OnRemove, EFFECT_1, SPELL_AURA_MOD_FEAR, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_yogg_saron_malady_of_the_mind_AuraScript(); + GetUnitOwner()->ApplySpellImmune(SPELL_DEATH_RAY_DAMAGE_REAL, IMMUNITY_ID, SPELL_DEATH_RAY_DAMAGE_REAL, true); } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetUnitOwner()->ApplySpellImmune(SPELL_DEATH_RAY_DAMAGE_REAL, IMMUNITY_ID, SPELL_DEATH_RAY_DAMAGE_REAL, false); + GetUnitOwner()->CastCustomSpell(SPELL_MALADY_OF_THE_MIND_TRIGGER, SPELLVALUE_MAX_TARGETS, 1, GetUnitOwner(), true); + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_yogg_saron_malady_of_the_mind_AuraScript::OnApply, EFFECT_1, SPELL_AURA_MOD_FEAR, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_yogg_saron_malady_of_the_mind_AuraScript::OnRemove, EFFECT_1, SPELL_AURA_MOD_FEAR, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_yogg_saron_malady_of_the_mind_AuraScript(); + } }; class spell_yogg_saron_brain_link : public SpellScriptLoader { - public: - spell_yogg_saron_brain_link() : SpellScriptLoader("spell_yogg_saron_brain_link") { } +public: + spell_yogg_saron_brain_link() : SpellScriptLoader("spell_yogg_saron_brain_link") { } - class spell_yogg_saron_brain_link_AuraScript : public AuraScript + class spell_yogg_saron_brain_link_AuraScript : public AuraScript + { + PrepareAuraScript(spell_yogg_saron_brain_link_AuraScript); + + void HandleOnEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_yogg_saron_brain_link_AuraScript); - - void HandleOnEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + PreventDefaultAction(); + Player* target = nullptr; + Map::PlayerList const& pList = GetUnitOwner()->GetMap()->GetPlayers(); + uint8 _offset = urand(0, pList.getSize() - 1); + uint8 _counter = 0; + for(Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr, ++_counter) { - PreventDefaultAction(); - Player* target = nullptr; - Map::PlayerList const& pList = GetUnitOwner()->GetMap()->GetPlayers(); - uint8 _offset = urand(0, pList.getSize()-1); - uint8 _counter = 0; - for(Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr, ++_counter) - { - if (itr->GetSource() == GetUnitOwner() || GetUnitOwner()->GetDistance(itr->GetSource()) > 50.0f || !itr->GetSource()->IsAlive() || itr->GetSource()->IsGameMaster()) - continue; + if (itr->GetSource() == GetUnitOwner() || GetUnitOwner()->GetDistance(itr->GetSource()) > 50.0f || !itr->GetSource()->IsAlive() || itr->GetSource()->IsGameMaster()) + continue; - if (_counter <= _offset || !target) - target = itr->GetSource(); - else - break; - } - - if (!target) - SetDuration(0); + if (_counter <= _offset || !target) + target = itr->GetSource(); else - _targetGUID = target->GetGUID(); + break; } - void OnPeriodic(AuraEffect const* /*aurEff*/) - { - Unit* owner = GetUnitOwner(); - if (!owner) - { - SetDuration(0); - return; - } - - Unit* _target = ObjectAccessor::GetUnit(*owner, _targetGUID); - if (!_target || !_target->IsAlive() || fabs(owner->GetPositionZ() - _target->GetPositionZ()) > 10.0f) // Target or owner underground - { - SetDuration(0); - return; - } - - if (owner->GetDistance(_target) > 20.0f) - { - owner->CastSpell(_target, SPELL_BRAIN_LINK_DAMAGE, true); - owner->CastSpell(owner, SPELL_BRAIN_LINK_DAMAGE, true); - } - else - owner->CastSpell(_target, SPELL_BRAIN_LINK_OK, true); - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_yogg_saron_brain_link_AuraScript::HandleOnEffectApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_yogg_saron_brain_link_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - - protected: - uint64 _targetGUID; - }; - - AuraScript* GetAuraScript() const - { - return new spell_yogg_saron_brain_link_AuraScript(); + if (!target) + SetDuration(0); + else + _targetGUID = target->GetGUID(); } - class spell_yogg_saron_brain_link_SpellScript : public SpellScript + void OnPeriodic(AuraEffect const* /*aurEff*/) { - PrepareSpellScript(spell_yogg_saron_brain_link_SpellScript); - - void FilterTargets(std::list& targets) + Unit* owner = GetUnitOwner(); + if (!owner) { - std::list tempList; - for (std::list::iterator itr = targets.begin(); itr != targets.end(); ++itr) - if ((*itr)->GetPositionZ() > 300.0f) - tempList.push_back(*itr); - - targets.clear(); - for (std::list::iterator itr = tempList.begin(); itr != tempList.end(); ++itr) - targets.push_back(*itr); + SetDuration(0); + return; } - void Register() + Unit* _target = ObjectAccessor::GetUnit(*owner, _targetGUID); + if (!_target || !_target->IsAlive() || fabs(owner->GetPositionZ() - _target->GetPositionZ()) > 10.0f) // Target or owner underground { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_yogg_saron_brain_link_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + SetDuration(0); + return; } - }; - SpellScript* GetSpellScript() const - { - return new spell_yogg_saron_brain_link_SpellScript(); + if (owner->GetDistance(_target) > 20.0f) + { + owner->CastSpell(_target, SPELL_BRAIN_LINK_DAMAGE, true); + owner->CastSpell(owner, SPELL_BRAIN_LINK_DAMAGE, true); + } + else + owner->CastSpell(_target, SPELL_BRAIN_LINK_OK, true); } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_yogg_saron_brain_link_AuraScript::HandleOnEffectApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_yogg_saron_brain_link_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + + protected: + uint64 _targetGUID; + }; + + AuraScript* GetAuraScript() const + { + return new spell_yogg_saron_brain_link_AuraScript(); + } + + class spell_yogg_saron_brain_link_SpellScript : public SpellScript + { + PrepareSpellScript(spell_yogg_saron_brain_link_SpellScript); + + void FilterTargets(std::list& targets) + { + std::list tempList; + for (std::list::iterator itr = targets.begin(); itr != targets.end(); ++itr) + if ((*itr)->GetPositionZ() > 300.0f) + tempList.push_back(*itr); + + targets.clear(); + for (std::list::iterator itr = tempList.begin(); itr != tempList.end(); ++itr) + targets.push_back(*itr); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_yogg_saron_brain_link_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_yogg_saron_brain_link_SpellScript(); + } }; class spell_yogg_saron_destabilization_matrix : public SpellScriptLoader { - public: - spell_yogg_saron_destabilization_matrix() : SpellScriptLoader("spell_yogg_saron_destabilization_matrix") { } +public: + spell_yogg_saron_destabilization_matrix() : SpellScriptLoader("spell_yogg_saron_destabilization_matrix") { } - class spell_yogg_saron_destabilization_matrix_SpellScript : public SpellScript + class spell_yogg_saron_destabilization_matrix_SpellScript : public SpellScript + { + PrepareSpellScript(spell_yogg_saron_destabilization_matrix_SpellScript); + + void HandleDummyEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_yogg_saron_destabilization_matrix_SpellScript); - - void HandleDummyEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - GetCaster()->CastSpell(target, SPELL_DESTABILIZATION_MATRIX_ATTACK, false); - } - - void FilterTargets(std::list& targets) - { - WorldObject* target = nullptr; - for (std::list::iterator itr = targets.begin(); itr != targets.end(); ++itr) - if (!(*itr)->ToUnit()->HasAura(SPELL_DESTABILIZATION_MATRIX_ATTACK)) - { - target = *itr; - break; - } - - targets.clear(); - if (target) - targets.push_back(target); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_yogg_saron_destabilization_matrix_SpellScript::HandleDummyEffect, EFFECT_0, SPELL_EFFECT_DUMMY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_yogg_saron_destabilization_matrix_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_yogg_saron_destabilization_matrix_SpellScript(); + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) + GetCaster()->CastSpell(target, SPELL_DESTABILIZATION_MATRIX_ATTACK, false); } + + void FilterTargets(std::list& targets) + { + WorldObject* target = nullptr; + for (std::list::iterator itr = targets.begin(); itr != targets.end(); ++itr) + if (!(*itr)->ToUnit()->HasAura(SPELL_DESTABILIZATION_MATRIX_ATTACK)) + { + target = *itr; + break; + } + + targets.clear(); + if (target) + targets.push_back(target); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_yogg_saron_destabilization_matrix_SpellScript::HandleDummyEffect, EFFECT_0, SPELL_EFFECT_DUMMY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_yogg_saron_destabilization_matrix_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_yogg_saron_destabilization_matrix_SpellScript(); + } }; class spell_yogg_saron_titanic_storm : public SpellScriptLoader { - public: - spell_yogg_saron_titanic_storm() : SpellScriptLoader("spell_yogg_saron_titanic_storm") { } +public: + spell_yogg_saron_titanic_storm() : SpellScriptLoader("spell_yogg_saron_titanic_storm") { } - class spell_yogg_saron_titanic_storm_SpellScript : public SpellScript + class spell_yogg_saron_titanic_storm_SpellScript : public SpellScript + { + PrepareSpellScript(spell_yogg_saron_titanic_storm_SpellScript); + + void HandleDummyEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_yogg_saron_titanic_storm_SpellScript); - - void HandleDummyEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - Unit::Kill(GetCaster(), target); - } - - void FilterTargets(std::list& targets) - { - WorldObject* target = nullptr; - for (std::list::iterator itr = targets.begin(); itr != targets.end(); ++itr) - if ((*itr)->ToUnit()->HasAura(SPELL_WEAKENED)) - { - target = *itr; - break; - } - - targets.clear(); - if (target) - targets.push_back(target); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_yogg_saron_titanic_storm_SpellScript::HandleDummyEffect, EFFECT_0, SPELL_EFFECT_DUMMY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_yogg_saron_titanic_storm_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_yogg_saron_titanic_storm_SpellScript(); + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) + Unit::Kill(GetCaster(), target); } + + void FilterTargets(std::list& targets) + { + WorldObject* target = nullptr; + for (std::list::iterator itr = targets.begin(); itr != targets.end(); ++itr) + if ((*itr)->ToUnit()->HasAura(SPELL_WEAKENED)) + { + target = *itr; + break; + } + + targets.clear(); + if (target) + targets.push_back(target); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_yogg_saron_titanic_storm_SpellScript::HandleDummyEffect, EFFECT_0, SPELL_EFFECT_DUMMY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_yogg_saron_titanic_storm_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_yogg_saron_titanic_storm_SpellScript(); + } }; class spell_yogg_saron_lunatic_gaze : public SpellScriptLoader { - public: - spell_yogg_saron_lunatic_gaze() : SpellScriptLoader("spell_yogg_saron_lunatic_gaze") { } +public: + spell_yogg_saron_lunatic_gaze() : SpellScriptLoader("spell_yogg_saron_lunatic_gaze") { } - class spell_yogg_saron_lunatic_gaze_SpellScript : public SpellScript + class spell_yogg_saron_lunatic_gaze_SpellScript : public SpellScript + { + PrepareSpellScript(spell_yogg_saron_lunatic_gaze_SpellScript); + + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_yogg_saron_lunatic_gaze_SpellScript); + std::list tmplist; + for (std::list::iterator itr = targets.begin(); itr != targets.end(); ++itr) + if ((*itr)->HasInArc(M_PI, GetCaster())) + tmplist.push_back(*itr); - void FilterTargets(std::list& targets) - { - std::list tmplist; - for (std::list::iterator itr = targets.begin(); itr != targets.end(); ++itr) - if ((*itr)->HasInArc(M_PI, GetCaster())) - tmplist.push_back(*itr); - - targets.clear(); - for (std::list::iterator itr = tmplist.begin(); itr != tmplist.end(); ++itr) - targets.push_back(*itr); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_yogg_saron_lunatic_gaze_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_yogg_saron_lunatic_gaze_SpellScript(); + targets.clear(); + for (std::list::iterator itr = tmplist.begin(); itr != tmplist.end(); ++itr) + targets.push_back(*itr); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_yogg_saron_lunatic_gaze_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_yogg_saron_lunatic_gaze_SpellScript(); + } }; // Protective Gaze @@ -2509,13 +2521,13 @@ public: PrepareAuraScript(spell_yogg_saron_protective_gaze_AuraScript); - void CalculateAmount(AuraEffect const * /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) { // Set absorbtion amount to unlimited amount = -1; } - void Absorb(AuraEffect * /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount) + void Absorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount) { Unit* target = GetTarget(); if (dmgInfo.GetDamage() < target->GetHealth() || !GetCaster() || GetCaster()->ToCreature()->HasSpellCooldown(SPELL_HODIR_FLASH_FREEZE)) @@ -2533,7 +2545,7 @@ public: } }; - AuraScript *GetAuraScript() const + AuraScript* GetAuraScript() const { return new spell_yogg_saron_protective_gaze_AuraScript(); } @@ -2541,402 +2553,416 @@ public: class spell_yogg_saron_empowered : public SpellScriptLoader { - public: - spell_yogg_saron_empowered() : SpellScriptLoader("spell_yogg_saron_empowered") { } +public: + spell_yogg_saron_empowered() : SpellScriptLoader("spell_yogg_saron_empowered") { } - class spell_yogg_saron_empowered_AuraScript : public AuraScript + class spell_yogg_saron_empowered_AuraScript : public AuraScript + { + PrepareAuraScript(spell_yogg_saron_empowered_AuraScript); + + void OnPeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_yogg_saron_empowered_AuraScript); + Unit* target = GetUnitOwner(); + uint8 stack = std::min(uint8(target->GetHealthPct() / 10), (uint8)9); - void OnPeriodic(AuraEffect const* /*aurEff*/) + if (!stack) { - Unit* target = GetUnitOwner(); - uint8 stack = std::min(uint8(target->GetHealthPct()/10), (uint8)9); - - if (!stack) - { - target->RemoveAura(SPELL_EMPOWERED); - target->CastSpell(target, SPELL_WEAKENED, true); - } - else if (Aura* aur = target->AddAura(SPELL_EMPOWERED, target)) - { - aur->SetStackAmount(stack); - target->RemoveAurasDueToSpell(SPELL_WEAKENED); - } + target->RemoveAura(SPELL_EMPOWERED); + target->CastSpell(target, SPELL_WEAKENED, true); } - - void Register() + else if (Aura* aur = target->AddAura(SPELL_EMPOWERED, target)) { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_yogg_saron_empowered_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + aur->SetStackAmount(stack); + target->RemoveAurasDueToSpell(SPELL_WEAKENED); } - }; - - AuraScript* GetAuraScript() const - { - return new spell_yogg_saron_empowered_AuraScript(); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_yogg_saron_empowered_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_yogg_saron_empowered_AuraScript(); + } }; class spell_yogg_saron_insane_periodic_trigger : public SpellScriptLoader { - public: - spell_yogg_saron_insane_periodic_trigger() : SpellScriptLoader("spell_yogg_saron_insane_periodic_trigger") { } +public: + spell_yogg_saron_insane_periodic_trigger() : SpellScriptLoader("spell_yogg_saron_insane_periodic_trigger") { } - class spell_yogg_saron_insane_periodic_trigger_SpellScript : public SpellScript + class spell_yogg_saron_insane_periodic_trigger_SpellScript : public SpellScript + { + PrepareSpellScript(spell_yogg_saron_insane_periodic_trigger_SpellScript); + + void HandleDummyEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_yogg_saron_insane_periodic_trigger_SpellScript); + PreventHitDefaultEffect(effIndex); + Player* target = GetHitPlayer(); + if (!target) + return; - void HandleDummyEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - Player* target = GetHitPlayer(); - if (!target) - return; - - Unit* caster = GetCaster(); - caster->PlayDirectSound(VOYS_INSANE1, target); - caster->MonsterWhisper("Your will is no longer you own...", target, false); - caster->CastSpell(target, SPELL_INSANE1, true); - target->CastSpell(target, SPELL_INSANE2, true); - } - - void FilterTargets(std::list& targets) - { - std::list tmplist; - for (std::list::iterator itr = targets.begin(); itr != targets.end(); ++itr) - if ((*itr)->GetTypeId() == TYPEID_PLAYER && !(*itr)->ToPlayer()->HasAuraType(SPELL_AURA_AOE_CHARM) && !(*itr)->ToPlayer()->HasAura(SPELL_SANITY)) - tmplist.push_back(*itr); - - targets.clear(); - for (std::list::iterator itr = tmplist.begin(); itr != tmplist.end(); ++itr) - targets.push_back(*itr); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_yogg_saron_insane_periodic_trigger_SpellScript::HandleDummyEffect, EFFECT_0, SPELL_EFFECT_DUMMY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_yogg_saron_insane_periodic_trigger_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_yogg_saron_insane_periodic_trigger_SpellScript(); + Unit* caster = GetCaster(); + caster->PlayDirectSound(VOYS_INSANE1, target); + caster->MonsterWhisper("Your will is no longer you own...", target, false); + caster->CastSpell(target, SPELL_INSANE1, true); + target->CastSpell(target, SPELL_INSANE2, true); } + + void FilterTargets(std::list& targets) + { + std::list tmplist; + for (std::list::iterator itr = targets.begin(); itr != targets.end(); ++itr) + if ((*itr)->GetTypeId() == TYPEID_PLAYER && !(*itr)->ToPlayer()->HasAuraType(SPELL_AURA_AOE_CHARM) && !(*itr)->ToPlayer()->HasAura(SPELL_SANITY)) + tmplist.push_back(*itr); + + targets.clear(); + for (std::list::iterator itr = tmplist.begin(); itr != tmplist.end(); ++itr) + targets.push_back(*itr); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_yogg_saron_insane_periodic_trigger_SpellScript::HandleDummyEffect, EFFECT_0, SPELL_EFFECT_DUMMY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_yogg_saron_insane_periodic_trigger_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_yogg_saron_insane_periodic_trigger_SpellScript(); + } }; class spell_yogg_saron_insane : public SpellScriptLoader { - public: - spell_yogg_saron_insane() : SpellScriptLoader("spell_yogg_saron_insane") { } +public: + spell_yogg_saron_insane() : SpellScriptLoader("spell_yogg_saron_insane") { } - class spell_yogg_saron_insane_AuraScript : public AuraScript + class spell_yogg_saron_insane_AuraScript : public AuraScript + { + PrepareAuraScript(spell_yogg_saron_insane_AuraScript); + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_yogg_saron_insane_AuraScript); - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit::Kill(GetUnitOwner(), GetUnitOwner()); - } - - void Register() - { - OnEffectRemove += AuraEffectRemoveFn(spell_yogg_saron_insane_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_AOE_CHARM, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_yogg_saron_insane_AuraScript(); + Unit::Kill(GetUnitOwner(), GetUnitOwner()); } + + void Register() + { + OnEffectRemove += AuraEffectRemoveFn(spell_yogg_saron_insane_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_AOE_CHARM, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_yogg_saron_insane_AuraScript(); + } }; class spell_yogg_saron_sanity_well : public SpellScriptLoader { - public: - spell_yogg_saron_sanity_well() : SpellScriptLoader("spell_yogg_saron_sanity_well") { } +public: + spell_yogg_saron_sanity_well() : SpellScriptLoader("spell_yogg_saron_sanity_well") { } - class spell_yogg_saron_sanity_well_AuraScript : public AuraScript + class spell_yogg_saron_sanity_well_AuraScript : public AuraScript + { + PrepareAuraScript(spell_yogg_saron_sanity_well_AuraScript); + + void HandleEffectCalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude) { - PrepareAuraScript(spell_yogg_saron_sanity_well_AuraScript); - - void HandleEffectCalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude) - { - isPeriodic = true; - amplitude = 2*IN_MILLISECONDS; - } - - void HandleEffectPeriodic(AuraEffect const * /*aurEff*/) - { - Unit* target = GetTarget(); - if (!target || target->GetTypeId() != TYPEID_PLAYER) - return; - - if (Aura* aur = target->GetAura(SPELL_SANITY)) - aur->SetStackAmount(std::min(100, aur->GetStackAmount()+20)); - } - - void Register() - { - DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_yogg_saron_sanity_well_AuraScript::HandleEffectCalcPeriodic, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_yogg_saron_sanity_well_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_yogg_saron_sanity_well_AuraScript(); + isPeriodic = true; + amplitude = 2 * IN_MILLISECONDS; } + + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) + { + Unit* target = GetTarget(); + if (!target || target->GetTypeId() != TYPEID_PLAYER) + return; + + if (Aura* aur = target->GetAura(SPELL_SANITY)) + aur->SetStackAmount(std::min(100, aur->GetStackAmount() + 20)); + } + + void Register() + { + DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_yogg_saron_sanity_well_AuraScript::HandleEffectCalcPeriodic, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_yogg_saron_sanity_well_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_yogg_saron_sanity_well_AuraScript(); + } }; class spell_yogg_saron_sanity_reduce : public SpellScriptLoader { - public: - spell_yogg_saron_sanity_reduce() : SpellScriptLoader("spell_yogg_saron_sanity_reduce") { } +public: + spell_yogg_saron_sanity_reduce() : SpellScriptLoader("spell_yogg_saron_sanity_reduce") { } - class spell_yogg_saron_sanity_reduce_SpellScript : public SpellScript + class spell_yogg_saron_sanity_reduce_SpellScript : public SpellScript + { + PrepareSpellScript(spell_yogg_saron_sanity_reduce_SpellScript); + + void HandleScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_yogg_saron_sanity_reduce_SpellScript); + PreventHitDefaultEffect(effIndex); + Player* target = GetHitPlayer(); + if (!target) + return; - void HandleScriptEffect(SpellEffIndex effIndex) + uint8 _reduceAmount = 0; + switch (GetSpellInfo()->Id) { - PreventHitDefaultEffect(effIndex); - Player* target = GetHitPlayer(); - if (!target) - return; - - uint8 _reduceAmount = 0; - switch (GetSpellInfo()->Id) - { - case SPELL_SARA_PSYCHOSIS_10: _reduceAmount = 9; break; - case SPELL_SARA_PSYCHOSIS_25: _reduceAmount = 12; break; - case SPELL_MALADY_OF_THE_MIND: _reduceAmount = 3; break; - case SPELL_MALADY_OF_THE_MIND_TRIGGER: _reduceAmount = 3; break; - case SPELL_BRAIN_LINK_DAMAGE: _reduceAmount = 2; break; - case 64168 /*SPELL_LUNATIC_GAZE*/: _reduceAmount = 2; break; - case 64164 /*SPELL_YS_LUNATIC_GAZE*/: _reduceAmount = 4; break; - case SPELL_INDUCE_MADNESS: - // Teleported out of brain - if (target->GetPositionZ() > 300.0f) - return; - else - target->CastSpell(target, SPELL_CANCEL_ILLUSION_AURA, true); // else we are underground, remove illusion aura and teleport outside - _reduceAmount = 100; - break; - } - - if (Aura* aur = target->GetAura(SPELL_SANITY)) - { - if ((aur->GetStackAmount()-_reduceAmount) <= 20) - target->CastSpell(target, 63752 /*SANITY_SCREEN_EFFECT*/, true); - aur->ModStackAmount(-_reduceAmount); - } + case SPELL_SARA_PSYCHOSIS_10: + _reduceAmount = 9; + break; + case SPELL_SARA_PSYCHOSIS_25: + _reduceAmount = 12; + break; + case SPELL_MALADY_OF_THE_MIND: + _reduceAmount = 3; + break; + case SPELL_MALADY_OF_THE_MIND_TRIGGER: + _reduceAmount = 3; + break; + case SPELL_BRAIN_LINK_DAMAGE: + _reduceAmount = 2; + break; + case 64168 /*SPELL_LUNATIC_GAZE*/: + _reduceAmount = 2; + break; + case 64164 /*SPELL_YS_LUNATIC_GAZE*/: + _reduceAmount = 4; + break; + case SPELL_INDUCE_MADNESS: + // Teleported out of brain + if (target->GetPositionZ() > 300.0f) + return; + else + target->CastSpell(target, SPELL_CANCEL_ILLUSION_AURA, true); // else we are underground, remove illusion aura and teleport outside + _reduceAmount = 100; + break; } - void Register() + if (Aura* aur = target->GetAura(SPELL_SANITY)) { - OnEffectHitTarget += SpellEffectFn(spell_yogg_saron_sanity_reduce_SpellScript::HandleScriptEffect, EFFECT_FIRST_FOUND, SPELL_EFFECT_SCRIPT_EFFECT); + if ((aur->GetStackAmount() - _reduceAmount) <= 20) + target->CastSpell(target, 63752 /*SANITY_SCREEN_EFFECT*/, true); + aur->ModStackAmount(-_reduceAmount); } - }; - - SpellScript* GetSpellScript() const - { - return new spell_yogg_saron_sanity_reduce_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_yogg_saron_sanity_reduce_SpellScript::HandleScriptEffect, EFFECT_FIRST_FOUND, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_yogg_saron_sanity_reduce_SpellScript(); + } }; class spell_yogg_saron_empowering_shadows : public SpellScriptLoader { - public: - spell_yogg_saron_empowering_shadows() : SpellScriptLoader("spell_yogg_saron_empowering_shadows") { } +public: + spell_yogg_saron_empowering_shadows() : SpellScriptLoader("spell_yogg_saron_empowering_shadows") { } - class spell_yogg_saron_empowering_shadows_SpellScript : public SpellScript + class spell_yogg_saron_empowering_shadows_SpellScript : public SpellScript + { + PrepareSpellScript(spell_yogg_saron_empowering_shadows_SpellScript); + + void HandleScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_yogg_saron_empowering_shadows_SpellScript); - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - target->CastSpell(target, target->GetMap()->Is25ManRaid() ? 64486 : 64468, true); // SPELL_EMPOWERING_SHADOWS_HEAL - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_yogg_saron_empowering_shadows_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_yogg_saron_empowering_shadows_SpellScript(); + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) + target->CastSpell(target, target->GetMap()->Is25ManRaid() ? 64486 : 64468, true); // SPELL_EMPOWERING_SHADOWS_HEAL } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_yogg_saron_empowering_shadows_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_yogg_saron_empowering_shadows_SpellScript(); + } }; class spell_yogg_saron_in_the_maws_of_the_old_god : public SpellScriptLoader { - public: - spell_yogg_saron_in_the_maws_of_the_old_god() : SpellScriptLoader("spell_yogg_saron_in_the_maws_of_the_old_god") {} +public: + spell_yogg_saron_in_the_maws_of_the_old_god() : SpellScriptLoader("spell_yogg_saron_in_the_maws_of_the_old_god") {} - class spell_yogg_saron_in_the_maws_of_the_old_god_SpellScript : public SpellScript + class spell_yogg_saron_in_the_maws_of_the_old_god_SpellScript : public SpellScript + { + PrepareSpellScript(spell_yogg_saron_in_the_maws_of_the_old_god_SpellScript); + + SpellCastResult CheckCast() { - PrepareSpellScript(spell_yogg_saron_in_the_maws_of_the_old_god_SpellScript); + if (GetCaster()->GetTypeId() != TYPEID_PLAYER) + return SPELL_FAILED_BAD_TARGETS; - SpellCastResult CheckCast() - { - if (GetCaster()->GetTypeId() != TYPEID_PLAYER) - return SPELL_FAILED_BAD_TARGETS; + Unit* target = GetCaster()->ToPlayer()->GetSelectedUnit(); + if (!target || target->GetEntry() != NPC_YOGG_SARON) + return SPELL_FAILED_BAD_TARGETS; - Unit* target = GetCaster()->ToPlayer()->GetSelectedUnit(); - if (!target || target->GetEntry() != NPC_YOGG_SARON) - return SPELL_FAILED_BAD_TARGETS; + Spell* spell = target->GetCurrentSpell(CURRENT_GENERIC_SPELL); + if (!spell || spell->GetSpellInfo()->Id != SPELL_DEAFENING_ROAR) + return SPELL_FAILED_TARGET_AURASTATE; - Spell* spell = target->GetCurrentSpell(CURRENT_GENERIC_SPELL); - if (!spell || spell->GetSpellInfo()->Id != SPELL_DEAFENING_ROAR) - return SPELL_FAILED_TARGET_AURASTATE; - - return SPELL_CAST_OK; - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_yogg_saron_in_the_maws_of_the_old_god_SpellScript::CheckCast); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_yogg_saron_in_the_maws_of_the_old_god_SpellScript(); + return SPELL_CAST_OK; } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_yogg_saron_in_the_maws_of_the_old_god_SpellScript::CheckCast); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_yogg_saron_in_the_maws_of_the_old_god_SpellScript(); + } }; class spell_yogg_saron_target_selectors : public SpellScriptLoader // 63744, 63745, 63747, 65206 { - public: - spell_yogg_saron_target_selectors() : SpellScriptLoader("spell_yogg_saron_target_selectors") { } +public: + spell_yogg_saron_target_selectors() : SpellScriptLoader("spell_yogg_saron_target_selectors") { } - class spell_yogg_saron_target_selectors_SpellScript : public SpellScript + class spell_yogg_saron_target_selectors_SpellScript : public SpellScript + { + PrepareSpellScript(spell_yogg_saron_target_selectors_SpellScript); + + void HandleScript(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_yogg_saron_target_selectors_SpellScript); - - void HandleScript(SpellEffIndex /*effIndex*/) + if (Unit* target = GetHitUnit()) { - if (Unit* target = GetHitUnit()) - { - GetCaster()->SetFacingToObject(target); - GetCaster()->CastSpell(target, uint32(GetEffectValue())); - } + GetCaster()->SetFacingToObject(target); + GetCaster()->CastSpell(target, uint32(GetEffectValue())); } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_yogg_saron_target_selectors_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_yogg_saron_target_selectors_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_yogg_saron_target_selectors_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_yogg_saron_target_selectors_SpellScript(); + } }; class spell_yogg_saron_grim_reprisal : public SpellScriptLoader // 63305 { - public: - spell_yogg_saron_grim_reprisal() : SpellScriptLoader("spell_yogg_saron_grim_reprisal") { } +public: + spell_yogg_saron_grim_reprisal() : SpellScriptLoader("spell_yogg_saron_grim_reprisal") { } - class spell_yogg_saron_grim_reprisal_AuraScript : public AuraScript + class spell_yogg_saron_grim_reprisal_AuraScript : public AuraScript + { + PrepareAuraScript(spell_yogg_saron_grim_reprisal_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_yogg_saron_grim_reprisal_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_GRIM_REPRISAL_DAMAGE)) - return false; - return true; - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - int32 damage = CalculatePct(int32(eventInfo.GetDamageInfo()->GetDamage()), 60); - GetTarget()->CastCustomSpell(SPELL_GRIM_REPRISAL_DAMAGE, SPELLVALUE_BASE_POINT0, damage, eventInfo.GetDamageInfo()->GetAttacker(), true, NULL, aurEff); - } - - void Register() - { - OnEffectProc += AuraEffectProcFn(spell_yogg_saron_grim_reprisal_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_yogg_saron_grim_reprisal_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_GRIM_REPRISAL_DAMAGE)) + return false; + return true; } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + int32 damage = CalculatePct(int32(eventInfo.GetDamageInfo()->GetDamage()), 60); + GetTarget()->CastCustomSpell(SPELL_GRIM_REPRISAL_DAMAGE, SPELLVALUE_BASE_POINT0, damage, eventInfo.GetDamageInfo()->GetAttacker(), true, NULL, aurEff); + } + + void Register() + { + OnEffectProc += AuraEffectProcFn(spell_yogg_saron_grim_reprisal_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_yogg_saron_grim_reprisal_AuraScript(); + } }; class achievement_yogg_saron_drive_me_crazy : public AchievementCriteriaScript { - public: - achievement_yogg_saron_drive_me_crazy() : AchievementCriteriaScript("achievement_yogg_saron_drive_me_crazy") {} +public: + achievement_yogg_saron_drive_me_crazy() : AchievementCriteriaScript("achievement_yogg_saron_drive_me_crazy") {} - bool OnCheck(Player* /*player*/, Unit* target) - { - return target && target->GetAI()->GetData(DATA_GET_DRIVE_ME_CRAZY); // target = Yogg-Saron - } + bool OnCheck(Player* /*player*/, Unit* target) + { + return target && target->GetAI()->GetData(DATA_GET_DRIVE_ME_CRAZY); // target = Yogg-Saron + } }; class achievement_yogg_saron_darkness : public AchievementCriteriaScript { - public: - achievement_yogg_saron_darkness(char const* name, uint32 count) : AchievementCriteriaScript(name), - _keepersCount(count) - { - } +public: + achievement_yogg_saron_darkness(char const* name, uint32 count) : AchievementCriteriaScript(name), + _keepersCount(count) + { + } - bool OnCheck(Player* player, Unit* /*target*/ /*Yogg-Saron*/) - { - if (player->GetInstanceScript()) - if (Creature* sara = ObjectAccessor::GetCreature(*player, player->GetInstanceScript()->GetData64(NPC_SARA))) - return sara->GetAI()->GetData(DATA_GET_KEEPERS_COUNT) <= _keepersCount; + bool OnCheck(Player* player, Unit* /*target*/ /*Yogg-Saron*/) + { + if (player->GetInstanceScript()) + if (Creature* sara = ObjectAccessor::GetCreature(*player, player->GetInstanceScript()->GetData64(NPC_SARA))) + return sara->GetAI()->GetData(DATA_GET_KEEPERS_COUNT) <= _keepersCount; - return false; - } + return false; + } - private: - uint32 const _keepersCount; +private: + uint32 const _keepersCount; }; class achievement_yogg_saron_he_waits_dreaming : public AchievementCriteriaScript { - public: - achievement_yogg_saron_he_waits_dreaming(char const* name, uint8 illusion) : AchievementCriteriaScript(name), - _requiredIllusion(illusion) - { - } +public: + achievement_yogg_saron_he_waits_dreaming(char const* name, uint8 illusion) : AchievementCriteriaScript(name), + _requiredIllusion(illusion) + { + } - bool OnCheck(Player* player, Unit* /*target*/ /*Yogg-Saron*/) - { - if (player->GetInstanceScript()) - if (Creature* sara = ObjectAccessor::GetCreature(*player, player->GetInstanceScript()->GetData64(NPC_BRAIN_OF_YOGG_SARON))) - return sara->GetAI()->GetData(DATA_GET_CURRENT_ILLUSION) == _requiredIllusion; + bool OnCheck(Player* player, Unit* /*target*/ /*Yogg-Saron*/) + { + if (player->GetInstanceScript()) + if (Creature* sara = ObjectAccessor::GetCreature(*player, player->GetInstanceScript()->GetData64(NPC_BRAIN_OF_YOGG_SARON))) + return sara->GetAI()->GetData(DATA_GET_CURRENT_ILLUSION) == _requiredIllusion; - return false; - } + return false; + } - private: - uint8 const _requiredIllusion; +private: + uint8 const _requiredIllusion; }; class achievement_yogg_saron_kiss_and_make_up : public AchievementCriteriaScript { - public: - achievement_yogg_saron_kiss_and_make_up() : AchievementCriteriaScript("achievement_yogg_saron_kiss_and_make_up") {} +public: + achievement_yogg_saron_kiss_and_make_up() : AchievementCriteriaScript("achievement_yogg_saron_kiss_and_make_up") {} - bool OnCheck(Player* /*player*/, Unit* target /*Sara*/) - { - return target && target->GetEntry() == NPC_SARA && target->GetAI() && target->GetAI()->GetData(DATA_GET_SARA_PHASE); - } + bool OnCheck(Player* /*player*/, Unit* target /*Sara*/) + { + return target && target->GetEntry() == NPC_SARA && target->GetAI() && target->GetAI()->GetData(DATA_GET_SARA_PHASE); + } }; void AddSC_boss_yoggsaron() diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp index b8bf82c54..1cf1b7d18 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp @@ -208,7 +208,7 @@ public: bool IsEncounterInProgress() const { - for (uint8 i = 0; i < (MAX_ENCOUNTER-1); ++i) + for (uint8 i = 0; i < (MAX_ENCOUNTER - 1); ++i) { if (m_auiEncounter[i] == IN_PROGRESS) return true; @@ -311,25 +311,25 @@ public: m_MimironACUguid = creature->GetGUID(); break; case NPC_FREYA_GOSSIP: - m_keepersGossipGUID[TYPE_FREYA-TYPE_FREYA] = creature->GetGUID(); + m_keepersGossipGUID[TYPE_FREYA - TYPE_FREYA] = creature->GetGUID(); ShowKeeperGossip(TYPE_FREYA, creature); break; case NPC_HODIR_GOSSIP: - m_keepersGossipGUID[TYPE_HODIR-TYPE_FREYA] = creature->GetGUID(); + m_keepersGossipGUID[TYPE_HODIR - TYPE_FREYA] = creature->GetGUID(); ShowKeeperGossip(TYPE_HODIR, creature); break; case NPC_THORIM_GOSSIP: - m_keepersGossipGUID[TYPE_THORIM-TYPE_FREYA] = creature->GetGUID(); + m_keepersGossipGUID[TYPE_THORIM - TYPE_FREYA] = creature->GetGUID(); ShowKeeperGossip(TYPE_THORIM, creature); break; case NPC_MIMIRON_GOSSIP: - m_keepersGossipGUID[TYPE_MIMIRON-TYPE_FREYA] = creature->GetGUID(); + m_keepersGossipGUID[TYPE_MIMIRON - TYPE_FREYA] = creature->GetGUID(); ShowKeeperGossip(TYPE_MIMIRON, creature); break; case NPC_ELDER_IRONBRANCH: case NPC_ELDER_STONEBARK: case NPC_ELDER_BRIGHTLEAF: - m_FreyaElder[creature->GetEntry()-NPC_ELDER_IRONBRANCH] = creature->GetGUID(); + m_FreyaElder[creature->GetEntry() - NPC_ELDER_IRONBRANCH] = creature->GetGUID(); break; case NPC_SARA: m_saraGUID = creature->GetGUID(); @@ -364,13 +364,13 @@ public: } } - void OpenIfDone(uint32 encounter, GameObject *go, GOState state) + void OpenIfDone(uint32 encounter, GameObject* go, GOState state) { if (GetData(encounter) == DONE) go->SetGoState(state); } - void ShowKeeperGossip(uint8 type, Creature *cr, uint64 guid = 0) + void ShowKeeperGossip(uint8 type, Creature* cr, uint64 guid = 0) { if (!cr) { @@ -379,7 +379,7 @@ public: return; } - bool on = (GetData(type) == DONE && !(GetData(TYPE_WATCHERS) & (1 << (type-TYPE_FREYA)))); + bool on = (GetData(type) == DONE && !(GetData(TYPE_WATCHERS) & (1 << (type - TYPE_FREYA)))); cr->SetVisible(on); } @@ -459,19 +459,19 @@ public: break; // Thorim case GO_ARENA_LEVER_GATE: - m_thorimGameobjectsGUID[DATA_THORIM_LEVER_GATE-DATA_THORIM_LEVER_GATE] = gameObject->GetGUID(); + m_thorimGameobjectsGUID[DATA_THORIM_LEVER_GATE - DATA_THORIM_LEVER_GATE] = gameObject->GetGUID(); break; case GO_ARENA_LEVER: - m_thorimGameobjectsGUID[DATA_THORIM_LEVER-DATA_THORIM_LEVER_GATE] = gameObject->GetGUID(); + m_thorimGameobjectsGUID[DATA_THORIM_LEVER - DATA_THORIM_LEVER_GATE] = gameObject->GetGUID(); break; case GO_ARENA_FENCE: - m_thorimGameobjectsGUID[DATA_THORIM_FENCE-DATA_THORIM_LEVER_GATE] = gameObject->GetGUID(); + m_thorimGameobjectsGUID[DATA_THORIM_FENCE - DATA_THORIM_LEVER_GATE] = gameObject->GetGUID(); break; case GO_FIRST_COLOSSUS_DOORS: - m_thorimGameobjectsGUID[DATA_THORIM_FIRST_DOORS-DATA_THORIM_LEVER_GATE] = gameObject->GetGUID(); + m_thorimGameobjectsGUID[DATA_THORIM_FIRST_DOORS - DATA_THORIM_LEVER_GATE] = gameObject->GetGUID(); break; case GO_SECOND_COLOSSUS_DOORS: - m_thorimGameobjectsGUID[DATA_THORIM_SECOND_DOORS-DATA_THORIM_LEVER_GATE] = gameObject->GetGUID(); + m_thorimGameobjectsGUID[DATA_THORIM_SECOND_DOORS - DATA_THORIM_LEVER_GATE] = gameObject->GetGUID(); break; // Yogg-Saron case GO_YOGG_SARON_DOORS: @@ -562,7 +562,7 @@ public: case 190170: // Talandra's Rose case 189973: // Goldclover if (GetData(TYPE_FREYA) == DONE) - gameObject->SetRespawnTime(7*DAY); + gameObject->SetRespawnTime(7 * DAY); break; } } @@ -603,7 +603,7 @@ public: case TYPE_THORIM: case TYPE_FREYA: m_auiEncounter[type] = data; - ShowKeeperGossip(type, NULL, m_keepersGossipGUID[type-TYPE_FREYA]); + ShowKeeperGossip(type, NULL, m_keepersGossipGUID[type - TYPE_FREYA]); if (GetData(TYPE_MIMIRON) == DONE && GetData(TYPE_FREYA) == DONE && GetData(TYPE_HODIR) == DONE && GetData(TYPE_THORIM) == DONE) { if (GameObject* go = instance->GetGameObject(m_keepersgateGUID)) @@ -623,11 +623,11 @@ public: case EVENT_TOWER_OF_FLAMES_DESTROYED: { instance->LoadGrid(364.0f, -16.0f); //make sure leviathan is loaded - m_leviathanTowers[type-EVENT_TOWER_OF_LIFE_DESTROYED] = data; + m_leviathanTowers[type - EVENT_TOWER_OF_LIFE_DESTROYED] = data; GameObject* gobj = nullptr; - if ((gobj = instance->GetGameObject(m_leviathanVisualTowers[type-EVENT_TOWER_OF_LIFE_DESTROYED][0]))) + if ((gobj = instance->GetGameObject(m_leviathanVisualTowers[type - EVENT_TOWER_OF_LIFE_DESTROYED][0]))) gobj->SetGoState(GO_STATE_ACTIVE); - if ((gobj = instance->GetGameObject(m_leviathanVisualTowers[type-EVENT_TOWER_OF_LIFE_DESTROYED][1]))) + if ((gobj = instance->GetGameObject(m_leviathanVisualTowers[type - EVENT_TOWER_OF_LIFE_DESTROYED][1]))) gobj->SetGoState(GO_STATE_ACTIVE); return; } @@ -712,7 +712,7 @@ public: freya->GetGameObjectListWithEntryInGrid(goList, 189973 /*Goldclover*/, 333.0f); for (std::list::const_iterator itr = goList.begin(); itr != goList.end(); ++itr) - (*itr)->SetRespawnTime(7*DAY); + (*itr)->SetRespawnTime(7 * DAY); } } @@ -783,7 +783,7 @@ public: case DATA_HARPOON_FIRE_STATE_2: case DATA_HARPOON_FIRE_STATE_3: case DATA_HARPOON_FIRE_STATE_4: - return m_RazorscaleHarpoonFireStateGUID[data-200]; + return m_RazorscaleHarpoonFireStateGUID[data - 200]; // XT-002 case GO_XT002_DOORS: @@ -797,14 +797,14 @@ public: case DATA_THORIM_FENCE: case DATA_THORIM_FIRST_DOORS: case DATA_THORIM_SECOND_DOORS: - return m_thorimGameobjectsGUID[data-DATA_THORIM_LEVER_GATE]; + return m_thorimGameobjectsGUID[data - DATA_THORIM_LEVER_GATE]; break; // Freya Elders case NPC_ELDER_IRONBRANCH: case NPC_ELDER_STONEBARK: case NPC_ELDER_BRIGHTLEAF: - return m_FreyaElder[data-NPC_ELDER_IRONBRANCH]; + return m_FreyaElder[data - NPC_ELDER_IRONBRANCH]; // Mimiron's first vehicle (spawned by default) case DATA_MIMIRON_LEVIATHAN_MKII: @@ -816,7 +816,7 @@ public: case DATA_GO_MIMIRON_DOOR_1: case DATA_GO_MIMIRON_DOOR_2: case DATA_GO_MIMIRON_DOOR_3: - return m_MimironDoor[data-311]; + return m_MimironDoor[data - 311]; // Yogg-Saron case GO_YOGG_SARON_DOORS: @@ -873,7 +873,7 @@ public: case EVENT_TOWER_OF_STORM_DESTROYED: case EVENT_TOWER_OF_FROST_DESTROYED: case EVENT_TOWER_OF_FLAMES_DESTROYED: - return m_leviathanTowers[type-EVENT_TOWER_OF_LIFE_DESTROYED]; + return m_leviathanTowers[type - EVENT_TOWER_OF_LIFE_DESTROYED]; case DATA_UNBROKEN_ACHIEVEMENT: return m_unbrokenAchievement; @@ -918,9 +918,9 @@ public: else go = (m_auiEncounter[i] == IN_PROGRESS); - if (go && (C_of_Ulduar_MASK & (1<Is25ManRaid() ? 5 : 2); ++i) { - if ((veh = instance->SummonCreature(NPC_SALVAGED_SIEGE_ENGINE, vehiclePositions[15*mode+i]))) + if ((veh = instance->SummonCreature(NPC_SALVAGED_SIEGE_ENGINE, vehiclePositions[15 * mode + i]))) _leviathanVehicles.push_back(veh->GetGUID()); - if ((veh = instance->SummonCreature(NPC_VEHICLE_CHOPPER, vehiclePositions[15*mode+i+5]))) + if ((veh = instance->SummonCreature(NPC_VEHICLE_CHOPPER, vehiclePositions[15 * mode + i + 5]))) _leviathanVehicles.push_back(veh->GetGUID()); - if ((veh = instance->SummonCreature(NPC_SALVAGED_DEMOLISHER, vehiclePositions[15*mode+i+10]))) + if ((veh = instance->SummonCreature(NPC_SALVAGED_DEMOLISHER, vehiclePositions[15 * mode + i + 10]))) _leviathanVehicles.push_back(veh->GetGUID()); } } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.cpp index d5e5e3c4d..098833fea 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.cpp @@ -71,31 +71,40 @@ public: { case BASE_CAMP: player->TeleportTo(603, -706.122f, -92.6024f, 429.876f, 0); - CloseGossipMenuFor(player); break; + CloseGossipMenuFor(player); + break; case GROUNDS: player->TeleportTo(603, 131.248f, -35.3802f, 409.804f, 0); - CloseGossipMenuFor(player); break; + CloseGossipMenuFor(player); + break; case FORGE: player->TeleportTo(603, 553.233f, -12.3247f, 409.679f, 0); - CloseGossipMenuFor(player); break; + CloseGossipMenuFor(player); + break; case SCRAPYARD: player->TeleportTo(603, 926.292f, -11.4635f, 418.595f, 0); - CloseGossipMenuFor(player); break; + CloseGossipMenuFor(player); + break; case ANTECHAMBER: player->TeleportTo(603, 1498.09f, -24.246f, 420.967f, 0); - CloseGossipMenuFor(player); break; + CloseGossipMenuFor(player); + break; case WALKWAY: player->TeleportTo(603, 1859.45f, -24.1f, 448.9f, 0); - CloseGossipMenuFor(player); break; + CloseGossipMenuFor(player); + break; case CONSERVATORY: player->TeleportTo(603, 2086.27f, -24.3134f, 421.239f, 0); - CloseGossipMenuFor(player); break; + CloseGossipMenuFor(player); + break; case MADNESS: player->TeleportTo(603, 1854.8f, -11.46f, 334.57f, 4.8f); - CloseGossipMenuFor(player); break; + CloseGossipMenuFor(player); + break; case SPARK: player->TeleportTo(603, 2517.9f, 2568.9f, 412.7f, 0); - CloseGossipMenuFor(player); break; + CloseGossipMenuFor(player); + break; } return true; @@ -109,7 +118,7 @@ public: bool OnGossipHello(Player* player, Creature* creature) override { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Lend us your aid, keeper. Together we shall defeat Yogg-Saron.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Lend us your aid, keeper. Together we shall defeat Yogg-Saron.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); SendGossipMenuFor(player, DEFAULT_GOSSIP_MESSAGE, creature->GetGUID()); return true; } @@ -161,7 +170,7 @@ public: { PrepareAuraScript(spell_ulduar_energy_sap_AuraScript) - void HandleEffectPeriodic(AuraEffect const * aurEff) + void HandleEffectPeriodic(AuraEffect const* aurEff) { if (Unit* target = GetTarget()) target->CastSpell(target, (aurEff->GetId() == 64740) ? 64747 : 64863, true); @@ -173,7 +182,7 @@ public: } }; - AuraScript *GetAuraScript() const + AuraScript* GetAuraScript() const { return new spell_ulduar_energy_sap_AuraScript(); } @@ -202,7 +211,7 @@ public: void MoveInLineOfSight(Unit* who) { if (!activated && who->GetTypeId() == TYPEID_PLAYER) - if (me->GetExactDist2d(who) <= 25.0f && me->GetMap()->isInLineOfSight(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+5.0f, who->GetPositionX(), who->GetPositionY(), who->GetPositionZ()+5.0f, 2, LINEOFSIGHT_ALL_CHECKS)) + if (me->GetExactDist2d(who) <= 25.0f && me->GetMap()->isInLineOfSight(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 5.0f, who->GetPositionX(), who->GetPositionY(), who->GetPositionZ() + 5.0f, 2, LINEOFSIGHT_ALL_CHECKS)) { activated = true; me->RemoveAura(64615); @@ -212,10 +221,11 @@ public: if (me->GetEntry() == 34146) count = 4; else if (me->GetEntry() == 34150) count = 6; else count = 8; - for (uint8 i=0; iSummonCreature(34137, me->GetPositionX()+cos(a)*d, me->GetPositionY()+sin(a)*d, me->GetPositionZ()+1.0f, 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000)) + float a = rand_norm() * 2 * M_PI; + float d = rand_norm() * 4.0f; + if (Creature* c = me->SummonCreature(34137, me->GetPositionX() + cos(a) * d, me->GetPositionY() + sin(a) * d, me->GetPositionZ() + 1.0f, 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000)) c->AI()->AttackStart(who); } } @@ -254,7 +264,7 @@ public: { events.Reset(); events.ScheduleEvent(1, 2000); // checking Separation Anxiety, Charged Sphere - events.ScheduleEvent(2, urand(5000,8000)); // Forked Lightning + events.ScheduleEvent(2, urand(5000, 8000)); // Forked Lightning events.ScheduleEvent(3, (me->GetEntry() == 33722 ? 20000 : 50000)); // Summon Charged Sphere if (Creature* c = me->FindNearestCreature((me->GetEntry() == 33722 ? 33699 : 33722), 30.0f, true)) otherGUID = c->GetGUID(); @@ -300,7 +310,7 @@ public: break; case 2: me->CastSpell(me->GetVictim(), 63541, false); - events.RepeatEvent(urand(10000,14000)); + events.RepeatEvent(urand(10000, 14000)); break; case 3: if (!me->HasAura(63630)) @@ -349,7 +359,7 @@ public: me->SetReactState(REACT_PASSIVE); } - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) { if (!_spawnedMechanic && me->HealthBelowPctDamaged(20, damage)) { @@ -384,7 +394,7 @@ public: { if (me->getFaction() != 16) { - if (me->IsAlive() && (me->GetExactDist2dSq(2058.0f, 42.0f) < 25.0f*25.0f || me->GetExactDist2dSq(2203.0f, 292.0f) < 25.0f*25.0f || me->GetExactDist2dSq(2125.0f, 170.0f) > 160.0f*160.0f)) + if (me->IsAlive() && (me->GetExactDist2dSq(2058.0f, 42.0f) < 25.0f * 25.0f || me->GetExactDist2dSq(2203.0f, 292.0f) < 25.0f * 25.0f || me->GetExactDist2dSq(2125.0f, 170.0f) > 160.0f * 160.0f)) Unit::Kill(me, me, false); } else @@ -438,7 +448,7 @@ public: { PrepareAuraScript(spell_ulduar_arachnopod_damaged_AuraScript) - void HandleEffectPeriodic(AuraEffect const * /*aurEff*/) + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) { if (Unit* c = GetCaster()) Unit::Kill(c, c, false); @@ -450,7 +460,7 @@ public: } }; - AuraScript *GetAuraScript() const + AuraScript* GetAuraScript() const { return new spell_ulduar_arachnopod_damaged_AuraScript(); } @@ -458,21 +468,21 @@ public: class AreaTrigger_at_celestial_planetarium_enterance : public AreaTriggerScript { - public: +public: - AreaTrigger_at_celestial_planetarium_enterance() - : AreaTriggerScript("at_celestial_planetarium_enterance") - { - } + AreaTrigger_at_celestial_planetarium_enterance() + : AreaTriggerScript("at_celestial_planetarium_enterance") + { + } - bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/) - { - if (player->IsAlive()) - if (uint32 questId = (player->GetMap()->Is25ManRaid() ? 13816 : 13607 /*QUEST_CELESTIAL_PLANETARIUM*/)) - if (player->GetQuestStatus(questId) == QUEST_STATUS_INCOMPLETE) - player->AreaExploredOrEventHappens(questId); - return false; - } + bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/) + { + if (player->IsAlive()) + if (uint32 questId = (player->GetMap()->Is25ManRaid() ? 13816 : 13607 /*QUEST_CELESTIAL_PLANETARIUM*/)) + if (player->GetQuestStatus(questId) == QUEST_STATUS_INCOMPLETE) + player->AreaExploredOrEventHappens(questId); + return false; + } }; class go_call_tram : public GameObjectScript diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h index 824422aea..74aa4bc06 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h @@ -133,7 +133,7 @@ enum UlduarNPCs NPC_SALVAGED_DEMOLISHER = 33109, NPC_SALVAGED_DEMOLISHER_TURRET = 33167, - + // Algalon the Observer NPC_BRANN_BRONZBEARD_ALG = 34064, NPC_AZEROTH = 34246, diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp index 8cc6315fa..1058075db 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp @@ -98,7 +98,7 @@ public: struct boss_ingvar_the_plundererAI : public ScriptedAI { - boss_ingvar_the_plundererAI(Creature *c) : ScriptedAI(c), summons(me) + boss_ingvar_the_plundererAI(Creature* c) : ScriptedAI(c), summons(me) { pInstance = c->GetInstanceScript(); } @@ -126,7 +126,7 @@ public: pInstance->SetData(DATA_INGVAR, NOT_STARTED); } - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) { if (me->GetDisplayId() == DISPLAYID_DEFAULT && damage >= me->GetHealth()) { @@ -146,7 +146,7 @@ public: } } - void EnterCombat(Unit * /*who*/) + void EnterCombat(Unit* /*who*/) { events.Reset(); // schedule Phase 1 abilities @@ -171,7 +171,7 @@ public: s->SetCanFly(true); s->SetDisableGravity(true); s->SetHover(true); - s->SetPosition(s->GetPositionX(), s->GetPositionY(), s->GetPositionZ()+35.0f, s->GetOrientation()); + s->SetPosition(s->GetPositionX(), s->GetPositionY(), s->GetPositionZ() + 35.0f, s->GetOrientation()); s->SetFacingTo(s->GetOrientation()); } else if (s->GetEntry() == NPC_THROW) @@ -254,7 +254,7 @@ public: break; case EVENT_VALKYR_MOVE: if( Creature* s = ObjectAccessor::GetCreature(*me, ValkyrGUID) ) - s->GetMotionMaster()->MovePoint(1, s->GetPositionX(), s->GetPositionY(), s->GetPositionZ()-15.0f); + s->GetMotionMaster()->MovePoint(1, s->GetPositionX(), s->GetPositionY(), s->GetPositionZ() - 15.0f); events.PopEvent(); break; case EVENT_ANNHYLDE_YELL: @@ -322,7 +322,7 @@ public: me->CastSpell((Unit*)NULL, SPELL_STAGGERING_ROAR, false); else me->CastSpell((Unit*)NULL, SPELL_DREADFUL_ROAR, false); - events.RepeatEvent(urand(15000,20000)); + events.RepeatEvent(urand(15000, 20000)); break; case EVENT_SPELL_CLEAVE_OR_WOE_STRIKE: if( me->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID) == 0 ) @@ -334,7 +334,7 @@ public: me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false); else me->CastSpell(me->GetVictim(), SPELL_WOE_STRIKE, false); - events.RepeatEvent(urand(0,4000)+3000); + events.RepeatEvent(urand(0, 4000) + 3000); break; case EVENT_SPELL_SMASH: if( me->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID) == 0 ) @@ -349,7 +349,7 @@ public: me->CastSpell((Unit*)NULL, SPELL_SMASH, false); else me->CastSpell((Unit*)NULL, SPELL_DARK_SMASH, false); - events.RepeatEvent(urand(9000,11000)); + events.RepeatEvent(urand(9000, 11000)); events.RescheduleEvent(EVENT_UNROOT, 3750); break; case EVENT_SPELL_ENRAGE_OR_SHADOW_AXE: @@ -368,7 +368,7 @@ public: break; case EVENT_AXE_RETURN: if (Creature* c = ObjectAccessor::GetCreature(*me, ThrowGUID)) - c->GetMotionMaster()->MoveCharge(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+0.5f); + c->GetMotionMaster()->MoveCharge(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 0.5f); events.PopEvent(); events.RescheduleEvent(EVENT_AXE_PICKUP, 1500); break; diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp index d69ed6820..1aa89ac8b 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp @@ -55,7 +55,7 @@ public: struct npc_frost_tombAI : public NullCreatureAI { - npc_frost_tombAI(Creature *c) : NullCreatureAI(c), PrisonerGUID(0) + npc_frost_tombAI(Creature* c) : NullCreatureAI(c), PrisonerGUID(0) { if (TempSummon* t = c->ToTempSummon()) if (Unit* s = t->GetSummoner()) @@ -113,7 +113,7 @@ public: struct boss_kelesethAI : public ScriptedAI { - boss_kelesethAI(Creature *c) : ScriptedAI(c) + boss_kelesethAI(Creature* c) : ScriptedAI(c) { pInstance = c->GetInstanceScript(); } @@ -172,7 +172,7 @@ public: return; events.Update(diff); - + if( me->HasUnitState(UNIT_STATE_CASTING) ) return; @@ -182,7 +182,7 @@ public: break; case EVENT_SPELL_SHADOWBOLT: me->CastSpell(me->GetVictim(), SPELL_SHADOWBOLT, false); - events.RepeatEvent(urand(4000,5000)); + events.RepeatEvent(urand(4000, 5000)); break; case EVENT_FROST_TOMB: if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true) ) @@ -200,9 +200,9 @@ public: Talk(SAY_SUMMON_SKELETONS); for (uint8 i = 0; i < 5; ++i) { - float dist = rand_norm()*4+3.0f; - float angle = rand_norm()*2*M_PI; - if( Creature* c = me->SummonCreature(NPC_SKELETON, 156.2f+cos(angle)*dist, 259.1f+sin(angle)*dist, 42.9f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000) ) + float dist = rand_norm() * 4 + 3.0f; + float angle = rand_norm() * 2 * M_PI; + if( Creature* c = me->SummonCreature(NPC_SKELETON, 156.2f + cos(angle) * dist, 259.1f + sin(angle) * dist, 42.9f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000) ) if( Unit* target = c->SelectNearestTarget(250.0f) ) { c->AddThreat(target, 5.0f); @@ -243,23 +243,23 @@ public: struct npc_vrykul_skeletonAI : public ScriptedAI { - npc_vrykul_skeletonAI(Creature *c) : ScriptedAI(c) + npc_vrykul_skeletonAI(Creature* c) : ScriptedAI(c) { pInstance = c->GetInstanceScript(); } - InstanceScript *pInstance; + InstanceScript* pInstance; EventMap events; void Reset() { events.Reset(); - events.RescheduleEvent(EVENT_SPELL_DECREPIFY, urand(10000,20000)); + events.RescheduleEvent(EVENT_SPELL_DECREPIFY, urand(10000, 20000)); if( IsHeroic() ) - events.RescheduleEvent(EVENT_SPELL_BONE_ARMOR, urand(25000,120000)); + events.RescheduleEvent(EVENT_SPELL_BONE_ARMOR, urand(25000, 120000)); } - void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) { if (damage >= me->GetHealth()) { @@ -303,12 +303,12 @@ public: case EVENT_SPELL_DECREPIFY: if( !me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE) ) me->CastSpell(me->GetVictim(), SPELL_DECREPIFY, false); - events.RepeatEvent(urand(15000,25000)); + events.RepeatEvent(urand(15000, 25000)); break; case EVENT_SPELL_BONE_ARMOR: if( !me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE) ) me->CastSpell((Unit*)NULL, SPELL_BONE_ARMOR, false); - events.RepeatEvent(urand(40000,120000)); + events.RepeatEvent(urand(40000, 120000)); break; case EVENT_RESURRECT: events.PopEvent(); @@ -337,31 +337,31 @@ public: class spell_frost_tomb : public SpellScriptLoader { - public: - spell_frost_tomb() : SpellScriptLoader("spell_frost_tomb") { } +public: + spell_frost_tomb() : SpellScriptLoader("spell_frost_tomb") { } - class spell_frost_tombAuraScript : public AuraScript + class spell_frost_tombAuraScript : public AuraScript + { + PrepareAuraScript(spell_frost_tombAuraScript); + + void HandleEffectPeriodic(AuraEffect const* aurEff) { - PrepareAuraScript(spell_frost_tombAuraScript); - - void HandleEffectPeriodic(AuraEffect const* aurEff) - { - PreventDefaultAction(); - if (aurEff->GetTickNumber()==1) - if( Unit* target = GetTarget() ) - target->CastSpell((Unit*)NULL, SPELL_FROST_TOMB_SUMMON, true); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_frost_tombAuraScript::HandleEffectPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_frost_tombAuraScript(); + PreventDefaultAction(); + if (aurEff->GetTickNumber() == 1) + if( Unit* target = GetTarget() ) + target->CastSpell((Unit*)NULL, SPELL_FROST_TOMB_SUMMON, true); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_frost_tombAuraScript::HandleEffectPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_frost_tombAuraScript(); + } }; void AddSC_boss_keleseth() diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp index 40301e18a..57f6438dc 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp @@ -65,7 +65,7 @@ public: struct boss_skarvald_the_constructorAI : public ScriptedAI { - boss_skarvald_the_constructorAI(Creature *c) : ScriptedAI(c) + boss_skarvald_the_constructorAI(Creature* c) : ScriptedAI(c) { pInstance = c->GetInstanceScript(); } @@ -100,7 +100,7 @@ public: } } - void EnterCombat(Unit * who) + void EnterCombat(Unit* who) { events.Reset(); events.RescheduleEvent(EVENT_SPELL_CHARGE, 5000); @@ -121,7 +121,7 @@ public: } } - void KilledUnit(Unit * /*victim*/) + void KilledUnit(Unit* /*victim*/) { if (me->GetEntry() == NPC_SKARVALD) Talk(YELL_SKARVALD_KILL); @@ -131,8 +131,10 @@ public: { if( me->GetEntry() != NPC_SKARVALD ) return; - if( pInstance ) { - if( Creature* dalronn = pInstance->instance->GetCreature(pInstance->GetData64(DATA_DALRONN)) ) { + if( pInstance ) + { + if( Creature* dalronn = pInstance->instance->GetCreature(pInstance->GetData64(DATA_DALRONN)) ) + { if( dalronn->isDead() ) { Talk(YELL_SKARVALD_SKA_DIEDFIRST); @@ -157,7 +159,7 @@ public: return; events.Update(diff); - + if( me->HasUnitState(UNIT_STATE_CASTING) ) return; @@ -176,13 +178,13 @@ public: me->AddThreat(target, 10000.0f); me->CastSpell(target, SPELL_CHARGE, false); } - events.RepeatEvent(urand(5000,10000)); + events.RepeatEvent(urand(5000, 10000)); break; case EVENT_SPELL_STONE_STRIKE: if( me->GetVictim() && me->IsWithinMeleeRange(me->GetVictim()) ) { me->CastSpell(me->GetVictim(), SPELL_STONE_STRIKE, false); - events.RepeatEvent(urand(5000,10000)); + events.RepeatEvent(urand(5000, 10000)); } else events.RepeatEvent(3000); @@ -206,7 +208,7 @@ public: struct boss_dalronn_the_controllerAI : public ScriptedAI { - boss_dalronn_the_controllerAI(Creature *c) : ScriptedAI(c), summons(me) + boss_dalronn_the_controllerAI(Creature* c) : ScriptedAI(c), summons(me) { pInstance = c->GetInstanceScript(); } @@ -246,7 +248,7 @@ public: } } - void EnterCombat(Unit * who) + void EnterCombat(Unit* who) { events.Reset(); events.RescheduleEvent(EVENT_SPELL_SHADOW_BOLT, 1000); @@ -269,7 +271,7 @@ public: } } - void KilledUnit(Unit * /*victim*/) + void KilledUnit(Unit* /*victim*/) { if (me->GetEntry() == NPC_DALRONN) Talk(YELL_DALRONN_KILL); @@ -284,8 +286,10 @@ public: { if( me->GetEntry() != NPC_DALRONN ) return; - if( pInstance ) { - if( Creature* skarvald = pInstance->instance->GetCreature(pInstance->GetData64(DATA_SKARVALD)) ) { + if( pInstance ) + { + if( Creature* skarvald = pInstance->instance->GetCreature(pInstance->GetData64(DATA_SKARVALD)) ) + { if( skarvald->isDead() ) { Talk(YELL_DALRONN_DAL_DIEDFIRST); @@ -309,7 +313,7 @@ public: return; events.Update(diff); - + if( me->HasUnitState(UNIT_STATE_CASTING) ) return; @@ -328,20 +332,20 @@ public: case EVENT_SPELL_SHADOW_BOLT: if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 42.0f, true) ) me->CastSpell(target, SPELL_SHADOW_BOLT, false); - events.RepeatEvent(2500); + events.RepeatEvent(2500); break; case EVENT_SPELL_DEBILITATE: if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45.0f, true) ) { me->CastSpell(target, SPELL_DEBILITATE, false); - events.RepeatEvent(urand(5000,10000)); + events.RepeatEvent(urand(5000, 10000)); } else events.RepeatEvent(3000); break; case EVENT_SPELL_SUMMON_SKELETONS: me->CastSpell((Unit*)NULL, SPELL_SUMMON_SKELETONS, false); - events.RepeatEvent(urand(20000,30000)); + events.RepeatEvent(urand(20000, 30000)); break; } diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp index 2f58cf5f9..c230dfb16 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp @@ -81,9 +81,8 @@ public: c->SetVisible(true); return; } - else - if(c->IsVisible()) - c->SetVisible(false); + else if(c->IsVisible()) + c->SetVisible(false); } } @@ -91,14 +90,30 @@ public: { switch(creature->GetEntry()) { - case NPC_KELESETH: NPC_KelesethGUID = creature->GetGUID(); break; - case NPC_DALRONN: NPC_DalronnGUID = creature->GetGUID(); break; - case NPC_SKARVALD: NPC_SkarvaldGUID = creature->GetGUID(); break; - case NPC_DALRONN_GHOST: NPC_DalronnGhostGUID = creature->GetGUID(); break; - case NPC_SKARVALD_GHOST: NPC_SkarvaldGhostGUID = creature->GetGUID(); break; - case NPC_INGVAR: NPC_IngvarGUID = creature->GetGUID(); break; - case NPC_DARK_RANGER_MARRAH:NPC_DarkRangerMarrahGUID = creature->GetGUID(); break; - case NPC_ENSLAVED_PROTO_DRAKE: if (creature->GetPositionX() < 250.0f) NPC_SpecialDrakeGUID = creature->GetGUID(); break; + case NPC_KELESETH: + NPC_KelesethGUID = creature->GetGUID(); + break; + case NPC_DALRONN: + NPC_DalronnGUID = creature->GetGUID(); + break; + case NPC_SKARVALD: + NPC_SkarvaldGUID = creature->GetGUID(); + break; + case NPC_DALRONN_GHOST: + NPC_DalronnGhostGUID = creature->GetGUID(); + break; + case NPC_SKARVALD_GHOST: + NPC_SkarvaldGhostGUID = creature->GetGUID(); + break; + case NPC_INGVAR: + NPC_IngvarGUID = creature->GetGUID(); + break; + case NPC_DARK_RANGER_MARRAH: + NPC_DarkRangerMarrahGUID = creature->GetGUID(); + break; + case NPC_ENSLAVED_PROTO_DRAKE: + if (creature->GetPositionX() < 250.0f) NPC_SpecialDrakeGUID = creature->GetGUID(); + break; } } @@ -199,7 +214,7 @@ public: c->DespawnOrUnsummon(); NPC_SkarvaldGhostGUID = 0; } - + m_auiEncounter[1] = data; break; case DATA_UNLOCK_SKARVALD_LOOT: @@ -211,7 +226,7 @@ public: if (uint32 lootid = c->GetCreatureTemplate()->lootid) c->loot.FillLoot(lootid, LootTemplates_Creature, c->GetLootRecipient(), false, false, c->GetLootMode()); if (c->GetLootMode()) - c->loot.generateMoneyLoot(c->GetCreatureTemplate()->mingold,c->GetCreatureTemplate()->maxgold); + c->loot.generateMoneyLoot(c->GetCreatureTemplate()->mingold, c->GetCreatureTemplate()->maxgold); c->DestroyForNearbyPlayers(); c->SetVisible(true); } @@ -226,7 +241,7 @@ public: if (uint32 lootid = c->GetCreatureTemplate()->lootid) c->loot.FillLoot(lootid, LootTemplates_Creature, c->GetLootRecipient(), false, false, c->GetLootMode()); if (c->GetLootMode()) - c->loot.generateMoneyLoot(c->GetCreatureTemplate()->mingold,c->GetCreatureTemplate()->maxgold); + c->loot.generateMoneyLoot(c->GetCreatureTemplate()->mingold, c->GetCreatureTemplate()->maxgold); c->DestroyForNearbyPlayers(); c->SetVisible(true); } @@ -244,17 +259,17 @@ public: case DATA_FORGE_3: if (data == NOT_STARTED) { - HandleGameObject(GO_ForgeBellowGUID[type-100], false); - HandleGameObject(GO_ForgeFireGUID[type-100], false); - HandleGameObject(GO_ForgeAnvilGUID[type-100], false); - ForgeEventMask &= ~((uint32)(1<<(type-100))); + HandleGameObject(GO_ForgeBellowGUID[type - 100], false); + HandleGameObject(GO_ForgeFireGUID[type - 100], false); + HandleGameObject(GO_ForgeAnvilGUID[type - 100], false); + ForgeEventMask &= ~((uint32)(1 << (type - 100))); } else { - HandleGameObject(GO_ForgeBellowGUID[type-100], true); - HandleGameObject(GO_ForgeFireGUID[type-100], true); - HandleGameObject(GO_ForgeAnvilGUID[type-100], true); - ForgeEventMask |= (uint32)(1<<(type-100)); + HandleGameObject(GO_ForgeBellowGUID[type - 100], true); + HandleGameObject(GO_ForgeFireGUID[type - 100], true); + HandleGameObject(GO_ForgeAnvilGUID[type - 100], true); + ForgeEventMask |= (uint32)(1 << (type - 100)); } break; case DATA_SPECIAL_DRAKE: @@ -273,10 +288,14 @@ public: { switch(id) { - case DATA_KELESETH: return NPC_KelesethGUID; - case DATA_DALRONN: return NPC_DalronnGUID; - case DATA_SKARVALD: return NPC_SkarvaldGUID; - case DATA_INGVAR: return NPC_IngvarGUID; + case DATA_KELESETH: + return NPC_KelesethGUID; + case DATA_DALRONN: + return NPC_DalronnGUID; + case DATA_SKARVALD: + return NPC_SkarvaldGUID; + case DATA_INGVAR: + return NPC_IngvarGUID; } return 0; } @@ -292,7 +311,7 @@ public: case DATA_FORGE_1: case DATA_FORGE_2: case DATA_FORGE_3: - return ForgeEventMask & (uint32)(1<<(id-100)); + return ForgeEventMask & (uint32)(1 << (id - 100)); } return 0; } @@ -336,7 +355,8 @@ public: for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) if (m_auiEncounter[i] == IN_PROGRESS) m_auiEncounter[i] = NOT_STARTED; - } else OUT_LOAD_INST_DATA_FAIL; + } + else OUT_LOAD_INST_DATA_FAIL; OUT_LOAD_INST_DATA_COMPLETE; } diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp index 4a7e08a99..42079b5bd 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp @@ -20,18 +20,18 @@ public: struct npc_dragonflayer_forge_masterAI : public ScriptedAI { - npc_dragonflayer_forge_masterAI(Creature *c) : ScriptedAI(c) + npc_dragonflayer_forge_masterAI(Creature* c) : ScriptedAI(c) { pInstance = c->GetInstanceScript(); float x = me->GetHomePosition().GetPositionX(); float y = me->GetHomePosition().GetPositionY(); - if (x>344.0f && x<357.0f && y<-35.0f && y>-44.0f) + if (x > 344.0f && x < 357.0f && y < -35.0f && y > -44.0f) { dataId = DATA_FORGE_1; prevDataId = 0; } - else if (x>380.0f && x<389.0f && y<-12.0f && y>-21.0f) + else if (x > 380.0f && x < 389.0f && y < -12.0f && y > -21.0f) { dataId = DATA_FORGE_2; prevDataId = DATA_FORGE_1; @@ -199,36 +199,36 @@ enum TickingTimeBomb class spell_ticking_time_bomb : public SpellScriptLoader { - public: - spell_ticking_time_bomb() : SpellScriptLoader("spell_ticking_time_bomb") { } +public: + spell_ticking_time_bomb() : SpellScriptLoader("spell_ticking_time_bomb") { } - class spell_ticking_time_bomb_AuraScript : public AuraScript + class spell_ticking_time_bomb_AuraScript : public AuraScript + { + PrepareAuraScript(spell_ticking_time_bomb_AuraScript); + + bool Validate(SpellInfo const* /*spellEntry*/) { - PrepareAuraScript(spell_ticking_time_bomb_AuraScript); - - bool Validate(SpellInfo const* /*spellEntry*/) - { - return (bool) sSpellMgr->GetSpellInfo(SPELL_TICKING_TIME_BOMB_EXPLODE); - } - - void HandleOnEffectRemove(AuraEffect const* /* aurEff */, AuraEffectHandleModes /* mode */) - { - if (GetCaster() == GetTarget()) - { - GetTarget()->CastSpell(GetTarget(), SPELL_TICKING_TIME_BOMB_EXPLODE, true); - } - } - - void Register() - { - OnEffectRemove += AuraEffectRemoveFn(spell_ticking_time_bomb_AuraScript::HandleOnEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_ticking_time_bomb_AuraScript(); + return (bool) sSpellMgr->GetSpellInfo(SPELL_TICKING_TIME_BOMB_EXPLODE); } + + void HandleOnEffectRemove(AuraEffect const* /* aurEff */, AuraEffectHandleModes /* mode */) + { + if (GetCaster() == GetTarget()) + { + GetTarget()->CastSpell(GetTarget(), SPELL_TICKING_TIME_BOMB_EXPLODE, true); + } + } + + void Register() + { + OnEffectRemove += AuraEffectRemoveFn(spell_ticking_time_bomb_AuraScript::HandleOnEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_ticking_time_bomb_AuraScript(); + } }; void AddSC_utgarde_keep() diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp index 8018c59ec..20a0f7a0b 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp @@ -106,12 +106,12 @@ public: struct boss_palehoofAI : public ScriptedAI { - boss_palehoofAI(Creature *pCreature) : ScriptedAI(pCreature), summons(me) + boss_palehoofAI(Creature* pCreature) : ScriptedAI(pCreature), summons(me) { m_pInstance = pCreature->GetInstanceScript(); } - InstanceScript *m_pInstance; + InstanceScript* m_pInstance; EventMap events; SummonList summons; uint64 OrbGUID; @@ -126,7 +126,7 @@ public: do { good = true; - RandomUnfreeze[i] = urand(0,3); + RandomUnfreeze[i] = urand(0, 3); for (uint8 j = 0; j < i; ++j) if (RandomUnfreeze[i] == RandomUnfreeze[j]) @@ -134,8 +134,7 @@ public: good = false; break; } - } - while (!good); + } while (!good); } events.Reset(); @@ -144,7 +143,7 @@ public: OrbGUID = 0; Counter = 0; me->CastSpell(me, SPELL_FREEZE, true); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); me->SetControlled(false, UNIT_STATE_STUNNED); if (m_pInstance) @@ -152,7 +151,7 @@ public: m_pInstance->SetData(DATA_GORTOK_PALEHOOF, NOT_STARTED); // Reset statue - if (GameObject *statisGenerator = m_pInstance->instance->GetGameObject(m_pInstance->GetData64(STATIS_GENERATOR))) + if (GameObject* statisGenerator = m_pInstance->instance->GetGameObject(m_pInstance->GetData64(STATIS_GENERATOR))) { statisGenerator->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); statisGenerator->SetGoState(GO_STATE_READY); @@ -161,7 +160,7 @@ public: // Reset mini bosses for(uint8 i = 0; i < 4; ++i) { - if(Creature *Animal = ObjectAccessor::GetCreature(*me, m_pInstance->GetData64(DATA_NPC_FRENZIED_WORGEN+i))) + if(Creature* Animal = ObjectAccessor::GetCreature(*me, m_pInstance->GetData64(DATA_NPC_FRENZIED_WORGEN + i))) { Animal->SetPosition(Animal->GetHomePosition()); Animal->StopMovingOnCurrentPos(); @@ -178,7 +177,7 @@ public: { if (param == ACTION_START_EVENT) { - if (Creature *cr = me->SummonCreature(NPC_ORB_TRIGGER, 238.608f, -460.71f, 109.567f)) + if (Creature* cr = me->SummonCreature(NPC_ORB_TRIGGER, 238.608f, -460.71f, 109.567f)) { OrbGUID = cr->GetGUID(); cr->AddAura(SPELL_ORB_VISUAL, cr); @@ -204,7 +203,7 @@ public: m_pInstance->SetData(DATA_GORTOK_PALEHOOF, IN_PROGRESS); } - void MoveInLineOfSight(Unit *who) + void MoveInLineOfSight(Unit* who) { if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) return; @@ -226,85 +225,85 @@ public: switch (events.GetEvent()) { case EVENT_UNFREEZE_MONSTER: - { - if (Creature *orb = ObjectAccessor::GetCreature(*me, OrbGUID)) { - if (Creature *miniBoss = ObjectAccessor::GetCreature(*me, m_pInstance->GetData64(DATA_NPC_FRENZIED_WORGEN+RandomUnfreeze[Counter]))) + if (Creature* orb = ObjectAccessor::GetCreature(*me, OrbGUID)) { - Counter++; - miniBoss->AI()->DoAction(ACTION_UNFREEZE); - orb->CastSpell(miniBoss, SPELL_AWAKEN_SUBBOSS, true); - events.ScheduleEvent(EVENT_UNFREEZE_MONSTER2, 6000); + if (Creature* miniBoss = ObjectAccessor::GetCreature(*me, m_pInstance->GetData64(DATA_NPC_FRENZIED_WORGEN + RandomUnfreeze[Counter]))) + { + Counter++; + miniBoss->AI()->DoAction(ACTION_UNFREEZE); + orb->CastSpell(miniBoss, SPELL_AWAKEN_SUBBOSS, true); + events.ScheduleEvent(EVENT_UNFREEZE_MONSTER2, 6000); + } + else + EnterEvadeMode(); } - else - EnterEvadeMode(); + events.PopEvent(); + break; } - events.PopEvent(); - break; - } case EVENT_UNFREEZE_MONSTER2: - { - if (Creature *orb = ObjectAccessor::GetCreature(*me, OrbGUID)) { - if (Creature *miniBoss = ObjectAccessor::GetCreature(*me, m_pInstance->GetData64(DATA_NPC_FRENZIED_WORGEN+RandomUnfreeze[Counter-1]))) + if (Creature* orb = ObjectAccessor::GetCreature(*me, OrbGUID)) { - miniBoss->AI()->DoAction(ACTION_UNFREEZE2); - orb->RemoveAurasDueToSpell(SPELL_AWAKEN_SUBBOSS); + if (Creature* miniBoss = ObjectAccessor::GetCreature(*me, m_pInstance->GetData64(DATA_NPC_FRENZIED_WORGEN + RandomUnfreeze[Counter - 1]))) + { + miniBoss->AI()->DoAction(ACTION_UNFREEZE2); + orb->RemoveAurasDueToSpell(SPELL_AWAKEN_SUBBOSS); + } + else + EnterEvadeMode(); } - else - EnterEvadeMode(); + events.PopEvent(); + break; } - events.PopEvent(); - break; - } case EVENT_PALEHOOF_START: - { - if (Creature *orb = ObjectAccessor::GetCreature(*me, OrbGUID)) { - orb->CastSpell(me, SPELL_AWAKEN_SUBBOSS, true); - events.ScheduleEvent(EVENT_PALEHOOF_START2, 6000); + if (Creature* orb = ObjectAccessor::GetCreature(*me, OrbGUID)) + { + orb->CastSpell(me, SPELL_AWAKEN_SUBBOSS, true); + events.ScheduleEvent(EVENT_PALEHOOF_START2, 6000); + } + events.PopEvent(); + break; } - events.PopEvent(); - break; - } case EVENT_PALEHOOF_START2: - { - Talk(SAY_AGGRO); - if (Creature *orb = ObjectAccessor::GetCreature(*me, OrbGUID)) - orb->RemoveAurasDueToSpell(SPELL_AWAKEN_SUBBOSS); + { + Talk(SAY_AGGRO); + if (Creature* orb = ObjectAccessor::GetCreature(*me, OrbGUID)) + orb->RemoveAurasDueToSpell(SPELL_AWAKEN_SUBBOSS); - me->RemoveAurasDueToSpell(SPELL_FREEZE); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); - me->SetControlled(false, UNIT_STATE_STUNNED); - // SETINCOMBATWITHZONE + me->RemoveAurasDueToSpell(SPELL_FREEZE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); + me->SetControlled(false, UNIT_STATE_STUNNED); + // SETINCOMBATWITHZONE - // schedule combat events - events.ScheduleEvent(EVENT_PALEHOOF_WITHERING_ROAR, 10000); - events.ScheduleEvent(EVENT_PALEHOOF_IMPALE, 12000); - events.ScheduleEvent(EVENT_PALEHOOF_ARCING_SMASH, 15000); - events.PopEvent(); - break; - } + // schedule combat events + events.ScheduleEvent(EVENT_PALEHOOF_WITHERING_ROAR, 10000); + events.ScheduleEvent(EVENT_PALEHOOF_IMPALE, 12000); + events.ScheduleEvent(EVENT_PALEHOOF_ARCING_SMASH, 15000); + events.PopEvent(); + break; + } case EVENT_PALEHOOF_WITHERING_ROAR: - { - me->CastSpell(me, IsHeroic() ? SPELL_WITHERING_ROAR_H : SPELL_WITHERING_ROAR_N, false); - events.RepeatEvent(8000 + rand()%4000); - break; - } + { + me->CastSpell(me, IsHeroic() ? SPELL_WITHERING_ROAR_H : SPELL_WITHERING_ROAR_N, false); + events.RepeatEvent(8000 + rand() % 4000); + break; + } case EVENT_PALEHOOF_IMPALE: - { - if (Unit *tgt = SelectTarget(SELECT_TARGET_RANDOM, 0)) - me->CastSpell(tgt, IsHeroic() ? SPELL_IMPALE_H : SPELL_IMPALE_N, false); + { + if (Unit* tgt = SelectTarget(SELECT_TARGET_RANDOM, 0)) + me->CastSpell(tgt, IsHeroic() ? SPELL_IMPALE_H : SPELL_IMPALE_N, false); - events.RepeatEvent(8000 + rand()%4000); - break; - } + events.RepeatEvent(8000 + rand() % 4000); + break; + } case EVENT_PALEHOOF_ARCING_SMASH: - { - me->CastSpell(me->GetVictim(), SPELL_ARCING_SMASH, false); - events.RepeatEvent(13000 + rand()%4000); - break; - } + { + me->CastSpell(me->GetVictim(), SPELL_ARCING_SMASH, false); + events.RepeatEvent(13000 + rand() % 4000); + break; + } } DoMeleeAttackIfReady(); @@ -348,7 +347,7 @@ public: m_pInstance = pCreature->GetInstanceScript(); } - InstanceScript *m_pInstance; + InstanceScript* m_pInstance; EventMap events; SummonList summons; @@ -356,10 +355,10 @@ public: { summons.DespawnAll(); events.Reset(); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); } - void EnterCombat(Unit *) {} + void EnterCombat(Unit*) {} void DoAction(int32 param) { @@ -381,7 +380,7 @@ public: summons.DespawnAll(); } - void MoveInLineOfSight(Unit *who) + void MoveInLineOfSight(Unit* who) { if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)) return; @@ -406,39 +405,39 @@ public: switch (events.GetEvent()) { case EVENT_JORMUNGAR_ACID_SPIT: - { - if (Unit *tgt = SelectTarget(SELECT_TARGET_RANDOM, 0)) - me->CastSpell(tgt, SPELL_ACID_SPIT, false); - - events.RepeatEvent(2000 + rand()%2000); - break; - } - case EVENT_JORMUNGAR_ACID_SPLATTER: - { - me->CastSpell(me, IsHeroic() ? SPELL_ACID_SPLATTER_H : SPELL_ACID_SPLATTER_N, false); - - // Aura summon wont work because of duration - float x, y, z; - me->GetPosition(x, y, z); - for (uint8 i = 0; i < 6; ++i) { - if (Creature* pJormungarWorm = me->SummonCreature(NPC_JORMUNGAR_WORM, x+rand()%10, y+rand()%10, z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 360000)) - { - summons.Summon(pJormungarWorm); - pJormungarWorm->SetInCombatWithZone(); - } - } - events.RepeatEvent(10000 + rand()%4000); - break; - } - case EVENT_JORMUNGAR_POISON_BREATH: - { - if (Unit *tgt = SelectTarget(SELECT_TARGET_RANDOM, 0)) - me->CastSpell(tgt, IsHeroic() ? SPELL_POISON_BREATH_H : SPELL_POISON_BREATH_N, false); + if (Unit* tgt = SelectTarget(SELECT_TARGET_RANDOM, 0)) + me->CastSpell(tgt, SPELL_ACID_SPIT, false); - events.RepeatEvent(8000 + rand()%4000); - break; - } + events.RepeatEvent(2000 + rand() % 2000); + break; + } + case EVENT_JORMUNGAR_ACID_SPLATTER: + { + me->CastSpell(me, IsHeroic() ? SPELL_ACID_SPLATTER_H : SPELL_ACID_SPLATTER_N, false); + + // Aura summon wont work because of duration + float x, y, z; + me->GetPosition(x, y, z); + for (uint8 i = 0; i < 6; ++i) + { + if (Creature* pJormungarWorm = me->SummonCreature(NPC_JORMUNGAR_WORM, x + rand() % 10, y + rand() % 10, z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 360000)) + { + summons.Summon(pJormungarWorm); + pJormungarWorm->SetInCombatWithZone(); + } + } + events.RepeatEvent(10000 + rand() % 4000); + break; + } + case EVENT_JORMUNGAR_POISON_BREATH: + { + if (Unit* tgt = SelectTarget(SELECT_TARGET_RANDOM, 0)) + me->CastSpell(tgt, IsHeroic() ? SPELL_POISON_BREATH_H : SPELL_POISON_BREATH_N, false); + + events.RepeatEvent(8000 + rand() % 4000); + break; + } } DoMeleeAttackIfReady(); @@ -448,7 +447,7 @@ public: { if (m_pInstance) { - if (Creature *palehoof = ObjectAccessor::GetCreature(*me, m_pInstance->GetData64(DATA_GORTOK_PALEHOOF))) + if (Creature* palehoof = ObjectAccessor::GetCreature(*me, m_pInstance->GetData64(DATA_GORTOK_PALEHOOF))) palehoof->AI()->DoAction(ACTION_MINIBOSS_DIED); } } @@ -476,16 +475,16 @@ public: m_pInstance = pCreature->GetInstanceScript(); } - InstanceScript *m_pInstance; + InstanceScript* m_pInstance; EventMap events; void Reset() { events.Reset(); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); } - void EnterCombat(Unit *) {} + void EnterCombat(Unit*) {} void DoAction(int32 param) { @@ -505,7 +504,7 @@ public: } } - void MoveInLineOfSight(Unit *who) + void MoveInLineOfSight(Unit* who) { if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)) return; @@ -530,25 +529,25 @@ public: switch (events.GetEvent()) { case EVENT_RHINO_STOMP: - { - me->CastSpell(me->GetVictim(), SPELL_STOMP, false); - events.RepeatEvent(8000 + rand()%4000); - break; - } + { + me->CastSpell(me->GetVictim(), SPELL_STOMP, false); + events.RepeatEvent(8000 + rand() % 4000); + break; + } case EVENT_RHINO_GORE: - { - me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_GORE_H : SPELL_GORE_N, false); - events.RepeatEvent(13000 + rand()%4000); - break; - } + { + me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_GORE_H : SPELL_GORE_N, false); + events.RepeatEvent(13000 + rand() % 4000); + break; + } case EVENT_RHINO_WOUND: - { - if (Unit *tgt = SelectTarget(SELECT_TARGET_RANDOM, 0)) - me->CastSpell(tgt, IsHeroic() ? SPELL_GRIEVOUS_WOUND_H : SPELL_GRIEVOUS_WOUND_N, false); + { + if (Unit* tgt = SelectTarget(SELECT_TARGET_RANDOM, 0)) + me->CastSpell(tgt, IsHeroic() ? SPELL_GRIEVOUS_WOUND_H : SPELL_GRIEVOUS_WOUND_N, false); - events.RepeatEvent(18000 + rand()%4000); - break; - } + events.RepeatEvent(18000 + rand() % 4000); + break; + } } DoMeleeAttackIfReady(); @@ -558,7 +557,7 @@ public: { if (m_pInstance) { - if (Creature *palehoof = ObjectAccessor::GetCreature(*me, m_pInstance->GetData64(DATA_GORTOK_PALEHOOF))) + if (Creature* palehoof = ObjectAccessor::GetCreature(*me, m_pInstance->GetData64(DATA_GORTOK_PALEHOOF))) palehoof->AI()->DoAction(ACTION_MINIBOSS_DIED); } } @@ -586,16 +585,16 @@ public: m_pInstance = pCreature->GetInstanceScript(); } - InstanceScript *m_pInstance; + InstanceScript* m_pInstance; EventMap events; void Reset() { events.Reset(); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); } - void EnterCombat(Unit *) {} + void EnterCombat(Unit*) {} void DoAction(int32 param) { @@ -615,7 +614,7 @@ public: } } - void MoveInLineOfSight(Unit *who) + void MoveInLineOfSight(Unit* who) { if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)) return; @@ -640,23 +639,23 @@ public: switch (events.GetEvent()) { case EVENT_FURBOLG_CHAIN: - { - me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_CHAIN_LIGHTING_H : SPELL_CHAIN_LIGHTING_N, false); - events.RepeatEvent(4000 + rand()%3000); - break; - } + { + me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_CHAIN_LIGHTING_H : SPELL_CHAIN_LIGHTING_N, false); + events.RepeatEvent(4000 + rand() % 3000); + break; + } case EVENT_FURBOLG_CRAZED: - { - me->CastSpell(me, SPELL_CRAZED, false); - events.RepeatEvent(8000 + rand()%4000); - break; - } + { + me->CastSpell(me, SPELL_CRAZED, false); + events.RepeatEvent(8000 + rand() % 4000); + break; + } case EVENT_FURBOLG_ROAR: - { - me->CastSpell(me, SPELL_TERRIFYING_ROAR, false); - events.RepeatEvent(10000 + rand()%5000); - break; - } + { + me->CastSpell(me, SPELL_TERRIFYING_ROAR, false); + events.RepeatEvent(10000 + rand() % 5000); + break; + } } DoMeleeAttackIfReady(); @@ -666,7 +665,7 @@ public: { if (m_pInstance) { - if (Creature *palehoof = ObjectAccessor::GetCreature(*me, m_pInstance->GetData64(DATA_GORTOK_PALEHOOF))) + if (Creature* palehoof = ObjectAccessor::GetCreature(*me, m_pInstance->GetData64(DATA_GORTOK_PALEHOOF))) palehoof->AI()->DoAction(ACTION_MINIBOSS_DIED); } } @@ -694,16 +693,16 @@ public: m_pInstance = pCreature->GetInstanceScript(); } - InstanceScript *m_pInstance; + InstanceScript* m_pInstance; EventMap events; void Reset() { events.Reset(); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); } - void EnterCombat(Unit *) {} + void EnterCombat(Unit*) {} void DoAction(int32 param) { @@ -723,7 +722,7 @@ public: } } - void MoveInLineOfSight(Unit *who) + void MoveInLineOfSight(Unit* who) { if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)) return; @@ -748,23 +747,23 @@ public: switch (events.GetEvent()) { case EVENT_WORGEN_MORTAL: - { - me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_MORTAL_WOUND_H : SPELL_MORTAL_WOUND_N, false); - events.RepeatEvent(4000 + rand()%3000); - break; - } + { + me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_MORTAL_WOUND_H : SPELL_MORTAL_WOUND_N, false); + events.RepeatEvent(4000 + rand() % 3000); + break; + } case EVENT_WORGEN_ENRAGE1: - { - me->CastSpell(me, SPELL_ENRAGE_1, false); - events.RepeatEvent(15000); - break; - } + { + me->CastSpell(me, SPELL_ENRAGE_1, false); + events.RepeatEvent(15000); + break; + } case EVENT_WORGEN_ENRAGE2: - { - me->CastSpell(me, SPELL_ENRAGE_2, false); - events.RepeatEvent(10000); - break; - } + { + me->CastSpell(me, SPELL_ENRAGE_2, false); + events.RepeatEvent(10000); + break; + } } DoMeleeAttackIfReady(); @@ -774,7 +773,7 @@ public: { if (m_pInstance) { - if (Creature *palehoof = ObjectAccessor::GetCreature(*me, m_pInstance->GetData64(DATA_GORTOK_PALEHOOF))) + if (Creature* palehoof = ObjectAccessor::GetCreature(*me, m_pInstance->GetData64(DATA_GORTOK_PALEHOOF))) palehoof->AI()->DoAction(ACTION_MINIBOSS_DIED); } } @@ -786,11 +785,11 @@ class go_palehoof_sphere : public GameObjectScript public: go_palehoof_sphere() : GameObjectScript("go_palehoof_sphere") { } - bool OnGossipHello(Player * /*pPlayer*/, GameObject *go) override + bool OnGossipHello(Player* /*pPlayer*/, GameObject* go) override { - InstanceScript *pInstance = go->GetInstanceScript(); + InstanceScript* pInstance = go->GetInstanceScript(); - Creature *pPalehoof = ObjectAccessor::GetCreature(*go, pInstance ? pInstance->GetData64(DATA_GORTOK_PALEHOOF) : 0); + Creature* pPalehoof = ObjectAccessor::GetCreature(*go, pInstance ? pInstance->GetData64(DATA_GORTOK_PALEHOOF) : 0); if (pPalehoof && pPalehoof->IsAlive()) { // maybe these are hacks :( diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp index fec2eb788..2c78308a5 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp @@ -68,7 +68,7 @@ enum Events EVENT_GRAUF_REMOVE_SKADI = 14, }; -static Position TrashPosition[]= +static Position TrashPosition[] = { {441.236f, -512.000f, 104.930f, 0.0f}, {478.436f, -494.475f, 104.730f, 0.0f} @@ -105,12 +105,12 @@ public: struct boss_skadiAI : public ScriptedAI { - boss_skadiAI(Creature *pCreature) : ScriptedAI(pCreature), summons(me) + boss_skadiAI(Creature* pCreature) : ScriptedAI(pCreature), summons(me) { m_pInstance = pCreature->GetInstanceScript(); } - InstanceScript *m_pInstance; + InstanceScript* m_pInstance; EventMap events; SummonList summons; uint64 GraufGUID; @@ -120,7 +120,7 @@ public: { events.Reset(); summons.DespawnAll(); - if (Creature *cr = me->SummonCreature(NPC_GRAUF, 341.741f, -516.955f, 104.669f, 3.12414f)) + if (Creature* cr = me->SummonCreature(NPC_GRAUF, 341.741f, -516.955f, 104.669f, 3.12414f)) { GraufGUID = cr->GetGUID(); summons.Summon(cr); @@ -143,7 +143,7 @@ public: } } - Creature *GetGrauf() { return ObjectAccessor::GetCreature(*me, GraufGUID); } + Creature* GetGrauf() { return ObjectAccessor::GetCreature(*me, GraufGUID); } void EnterCombat(Unit* /*pWho*/) { @@ -194,40 +194,40 @@ public: switch (events.GetEvent()) { case EVENT_SKADI_START: - { - me->SetControlled(false, UNIT_STATE_ROOT); - if (Creature *cr = GetGrauf()) { - me->EnterVehicleUnattackable(cr, 0); - cr->AI()->DoAction(ACTION_START_EVENT); + me->SetControlled(false, UNIT_STATE_ROOT); + if (Creature* cr = GetGrauf()) + { + me->EnterVehicleUnattackable(cr, 0); + cr->AI()->DoAction(ACTION_START_EVENT); + } + else + EnterEvadeMode(); + + events.PopEvent(); + break; } - else - EnterEvadeMode(); - - events.PopEvent(); - break; - } case EVENT_SKADI_CRUSH: - { - me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_CRUSH_H : SPELL_CRUSH_N, false); - events.RepeatEvent(8000); - break; - } + { + me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_CRUSH_H : SPELL_CRUSH_N, false); + events.RepeatEvent(8000); + break; + } case EVENT_SKADI_SPEAR: - { - if (Unit *tgt = SelectTarget(SELECT_TARGET_RANDOM, 0)) - me->CastSpell(tgt, IsHeroic() ? SPELL_POISONED_SPEAR_H : SPELL_POISONED_SPEAR_N, false); + { + if (Unit* tgt = SelectTarget(SELECT_TARGET_RANDOM, 0)) + me->CastSpell(tgt, IsHeroic() ? SPELL_POISONED_SPEAR_H : SPELL_POISONED_SPEAR_N, false); - events.RepeatEvent(10000); - break; - } + events.RepeatEvent(10000); + break; + } case EVENT_SKADI_WHIRLWIND: - { - me->CastSpell(me, IsHeroic() ? SPELL_WHIRLWIND_H : SPELL_WHIRLWIND_N, false); - events.RepeatEvent(15000 + rand()%5000); - events.DelayEvents(10000); - break; - } + { + me->CastSpell(me, IsHeroic() ? SPELL_WHIRLWIND_H : SPELL_WHIRLWIND_N, false); + events.RepeatEvent(15000 + rand() % 5000); + events.DelayEvents(10000); + break; + } } DoMeleeAttackIfReady(); @@ -247,7 +247,7 @@ public: void KilledUnit(Unit* /*pVictim*/) { - if (urand(0,1)) + if (urand(0, 1)) return; Talk(SAY_KILL); @@ -267,12 +267,12 @@ public: struct boss_skadi_graufAI : public VehicleAI { - boss_skadi_graufAI(Creature *pCreature) : VehicleAI(pCreature), summons(me) + boss_skadi_graufAI(Creature* pCreature) : VehicleAI(pCreature), summons(me) { m_pInstance = pCreature->GetInstanceScript(); } - InstanceScript *m_pInstance; + InstanceScript* m_pInstance; EventMap events; SummonList summons; uint8 currentPos; @@ -296,8 +296,8 @@ public: } else if (param == ACTION_REMOVE_SKADI) { - if (Unit *passenger = me->GetVehicleKit()->GetPassenger(0)) - if (Creature *skadi = passenger->ToCreature()) + if (Unit* passenger = me->GetVehicleKit()->GetPassenger(0)) + if (Creature* skadi = passenger->ToCreature()) skadi->AI()->Talk(SAY_DRAKE_DEATH); me->GetMotionMaster()->MovePoint(10, 480.0f, -513.0f, 108.0f); events.ScheduleEvent(EVENT_GRAUF_REMOVE_SKADI, 2000); @@ -311,7 +311,7 @@ public: } } - void SpellHitTarget(Unit *target, const SpellInfo *spellInfo) + void SpellHitTarget(Unit* target, const SpellInfo* spellInfo) { if (spellInfo->Id == 47593) // SPELL_FLAME_VISUAL trigger target->CastSpell(target, me->GetMap()->IsHeroic() ? SPELL_FLAME_BREATH_H : SPELL_FLAME_BREATH_N, true); @@ -322,21 +322,21 @@ public: for(uint8 j = 0; j < 50; ++j) { if (point == 1) - me->SummonCreature(NPC_BREATH_TRIGGER, 480.0f-(j*3), -518.0f+(j/16.0f), 105.0f, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000); + me->SummonCreature(NPC_BREATH_TRIGGER, 480.0f - (j * 3), -518.0f + (j / 16.0f), 105.0f, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000); else - me->SummonCreature(NPC_BREATH_TRIGGER, 480.0f-(j*3), -510.0f+(j/16.0f), 105.0f, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000); + me->SummonCreature(NPC_BREATH_TRIGGER, 480.0f - (j * 3), -510.0f + (j / 16.0f), 105.0f, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000); } // and out of loop, cover the small room if (point == 0) { - Creature *cr; + Creature* cr; if ((cr = me->SummonCreature(NPC_BREATH_TRIGGER, 483, -484.9f, 105, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000))) cr->CastSpell(cr, cr->GetMap()->IsHeroic() ? SPELL_FLAME_BREATH_H : SPELL_FLAME_BREATH_N, true); if ((cr = me->SummonCreature(NPC_BREATH_TRIGGER, 471.0f, -484.7f, 105, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000))) cr->CastSpell(cr, cr->GetMap()->IsHeroic() ? SPELL_FLAME_BREATH_H : SPELL_FLAME_BREATH_N, true); for (uint8 j = 0; j < 7; j++) - if ((cr = me->SummonCreature(NPC_BREATH_TRIGGER, 477.0f, -507.0f+(j*3), 105.0f, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000))) + if ((cr = me->SummonCreature(NPC_BREATH_TRIGGER, 477.0f, -507.0f + (j * 3), 105.0f, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000))) cr->CastSpell(cr, cr->GetMap()->IsHeroic() ? SPELL_FLAME_BREATH_H : SPELL_FLAME_BREATH_N, true); } } @@ -345,19 +345,19 @@ public: { switch(Id) { - case 0: - case 1: - me->RemoveAurasDueToSpell(SPELL_FLAME_VISUAL); - me->SetFacingTo(M_PI*2); - break; - case 2: - case 3: - if (m_pInstance) - m_pInstance->SetData(SKADI_IN_RANGE, 1); + case 0: + case 1: + me->RemoveAurasDueToSpell(SPELL_FLAME_VISUAL); + me->SetFacingTo(M_PI * 2); + break; + case 2: + case 3: + if (m_pInstance) + m_pInstance->SetData(SKADI_IN_RANGE, 1); - me->MonsterTextEmote(EMOTE_IN_RANGE, 0, true); - me->SetFacingTo(M_PI); - break; + me->MonsterTextEmote(EMOTE_IN_RANGE, 0, true); + me->SetFacingTo(M_PI); + break; } } @@ -367,7 +367,7 @@ public: { case 0: case 1: - return 2+urand(0,1); + return 2 + urand(0, 1); default: if (me->GetPositionY() < -515.0f) return 1; @@ -376,14 +376,14 @@ public: } } - void EnterCombat(Unit *) + void EnterCombat(Unit*) { me->SetInCombatWithZone(); } void RemoveSkadi(bool withEvade) { - if (Unit *skadi = me->GetVehicleKit()->GetPassenger(0)) + if (Unit* skadi = me->GetVehicleKit()->GetPassenger(0)) { summons.DespawnAll(); skadi->ExitVehicle(); @@ -415,12 +415,12 @@ public: void SpawnHelpers(uint8 Spot) { - if (Creature *Harpooner = me->SummonCreature(NPC_YMIRJAR_HARPOONER, TrashPosition[Spot].GetPositionX()+rand()%5, TrashPosition[Spot].GetPositionY()+rand()%5, TrashPosition[Spot].GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000)) + if (Creature* Harpooner = me->SummonCreature(NPC_YMIRJAR_HARPOONER, TrashPosition[Spot].GetPositionX() + rand() % 5, TrashPosition[Spot].GetPositionY() + rand() % 5, TrashPosition[Spot].GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000)) { Harpooner->SetInCombatWithZone(); summons.Summon(Harpooner); } - if (Creature *Second = me->SummonCreature((urand(0,1) ? NPC_YMIRJAR_WARRIOR : NPC_YMIRJAR_WITCH_DOCTOR), TrashPosition[Spot].GetPositionX()+rand()%5, TrashPosition[Spot].GetPositionY()+rand()%5, TrashPosition[Spot].GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000)) + if (Creature* Second = me->SummonCreature((urand(0, 1) ? NPC_YMIRJAR_WARRIOR : NPC_YMIRJAR_WITCH_DOCTOR), TrashPosition[Spot].GetPositionX() + rand() % 5, TrashPosition[Spot].GetPositionY() + rand() % 5, TrashPosition[Spot].GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000)) { Second->SetInCombatWithZone(); summons.Summon(Second); @@ -433,54 +433,54 @@ public: switch (events.GetEvent()) { case EVENT_GRAUF_CHECK: - { - CheckPlayers(); - events.RepeatEvent(2000); - break; - } - case EVENT_GRAUF_START: - { - me->GetMotionMaster()->Clear(true); - me->GetMotionMaster()->MoveTakeoff(10, SkadiPosition[0].GetPositionX(), SkadiPosition[0].GetPositionY(), SkadiPosition[0].GetPositionZ(), 3.0f); - - SpawnHelpers(0); - SpawnHelpers(0); - events.ScheduleEvent(EVENT_GRAUF_MOVE, 15000); - events.ScheduleEvent(EVENT_GRAUF_SUMMON_HELPERS, 20000); - events.PopEvent(); - break; - } - case EVENT_GRAUF_MOVE: - { - AchievementHitCount = 0; - uint8 targetPoint = SelectNextPos(currentPos); - me->GetMotionMaster()->MovePoint(targetPoint, SkadiPosition[targetPoint].GetPositionX(), SkadiPosition[targetPoint].GetPositionY(), SkadiPosition[targetPoint].GetPositionZ()); - if (targetPoint <= 1) { - SpawnFlameTriggers(targetPoint); - me->CastSpell(me, SPELL_FLAME_VISUAL, false); + CheckPlayers(); + events.RepeatEvent(2000); + break; } + case EVENT_GRAUF_START: + { + me->GetMotionMaster()->Clear(true); + me->GetMotionMaster()->MoveTakeoff(10, SkadiPosition[0].GetPositionX(), SkadiPosition[0].GetPositionY(), SkadiPosition[0].GetPositionZ(), 3.0f); - if (m_pInstance) - m_pInstance->SetData(SKADI_IN_RANGE, 0); + SpawnHelpers(0); + SpawnHelpers(0); + events.ScheduleEvent(EVENT_GRAUF_MOVE, 15000); + events.ScheduleEvent(EVENT_GRAUF_SUMMON_HELPERS, 20000); + events.PopEvent(); + break; + } + case EVENT_GRAUF_MOVE: + { + AchievementHitCount = 0; + uint8 targetPoint = SelectNextPos(currentPos); + me->GetMotionMaster()->MovePoint(targetPoint, SkadiPosition[targetPoint].GetPositionX(), SkadiPosition[targetPoint].GetPositionY(), SkadiPosition[targetPoint].GetPositionZ()); + if (targetPoint <= 1) + { + SpawnFlameTriggers(targetPoint); + me->CastSpell(me, SPELL_FLAME_VISUAL, false); + } - currentPos = targetPoint; - events.RepeatEvent(25000); - break; - } + if (m_pInstance) + m_pInstance->SetData(SKADI_IN_RANGE, 0); + + currentPos = targetPoint; + events.RepeatEvent(25000); + break; + } case EVENT_GRAUF_SUMMON_HELPERS: - { - SpawnHelpers(1); - events.RepeatEvent(15000); - break; - } + { + SpawnHelpers(1); + events.RepeatEvent(15000); + break; + } case EVENT_GRAUF_REMOVE_SKADI: - { - RemoveSkadi(false); - me->DespawnOrUnsummon(); - events.PopEvent(); - break; - } + { + RemoveSkadi(false); + me->DespawnOrUnsummon(); + events.PopEvent(); + break; + } } } }; @@ -493,14 +493,14 @@ public: bool OnGossipHello(Player* pPlayer, GameObject* go) override { - InstanceScript *m_pInstance = go->GetInstanceScript(); + InstanceScript* m_pInstance = go->GetInstanceScript(); if (m_pInstance && m_pInstance->GetData(DATA_SKADI_THE_RUTHLESS) == IN_PROGRESS) if (m_pInstance->GetData(SKADI_IN_RANGE) == 1) { - uint8 count = m_pInstance->GetData(SKADI_HITS)+1; + uint8 count = m_pInstance->GetData(SKADI_HITS) + 1; m_pInstance->SetData(SKADI_HITS, count); - if (Creature *grauf = ObjectAccessor::GetCreature(*pPlayer, m_pInstance->GetData64(DATA_GRAUF))) + if (Creature* grauf = ObjectAccessor::GetCreature(*pPlayer, m_pInstance->GetData64(DATA_GRAUF))) { if (count >= 3) { diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp index e814668f5..8efc1e718 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp @@ -74,7 +74,7 @@ enum Events EVENT_SORROWGRAVE_FINISH_RITUAL = 15, }; -const Position RitualChannelerLoc[3]= +const Position RitualChannelerLoc[3] = { {296.42f, -355.01f, 90.94f, 0.0f}, {302.36f, -352.01f, 90.54f, 0.0f}, @@ -123,10 +123,10 @@ public: events.Reset(); events2.Reset(); if (!Started) - 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); else { - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); me->SetHover(true); } } @@ -142,7 +142,7 @@ public: if (data != 1 || param != 1 || Started || (instance && instance->GetData(DATA_SVALA_SORROWGRAVE) == DONE)) return; - 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); Started = true; me->setActive(true); events2.ScheduleEvent(EVENT_SVALA_START, 5000); @@ -225,43 +225,43 @@ public: events2.ScheduleEvent(EVENT_SVALA_TALK4, 9000); break; case 30: - { - WorldPacket data(SMSG_SPLINE_MOVE_SET_HOVER, 9); - data.append(me->GetPackGUID()); - me->SendMessageToSet(&data, false); - break; - } + { + WorldPacket data(SMSG_SPLINE_MOVE_SET_HOVER, 9); + data.append(me->GetPackGUID()); + me->SendMessageToSet(&data, false); + break; + } case EVENT_SVALA_TALK4: - { - me->CastSpell(me, SPELL_SVALA_TRANSFORMING1, true); - me->UpdateEntry(NPC_SVALA_SORROWGRAVE); - me->SetCorpseDelay(sWorld->getIntConfig(CONFIG_CORPSE_DECAY_ELITE)); - me->SetFloatValue(UNIT_FIELD_HOVERHEIGHT, 6.0f); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); - if (Creature* Arthas = ObjectAccessor::GetCreature(*me, ArthasGUID)) - Arthas->InterruptNonMeleeSpells(false); - me->RemoveAllAuras(); - me->SetWalk(false); - events2.ScheduleEvent(EVENT_SVALA_TALK5, 2000); + { + me->CastSpell(me, SPELL_SVALA_TRANSFORMING1, true); + me->UpdateEntry(NPC_SVALA_SORROWGRAVE); + me->SetCorpseDelay(sWorld->getIntConfig(CONFIG_CORPSE_DECAY_ELITE)); + me->SetFloatValue(UNIT_FIELD_HOVERHEIGHT, 6.0f); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + if (Creature* Arthas = ObjectAccessor::GetCreature(*me, ArthasGUID)) + Arthas->InterruptNonMeleeSpells(false); + me->RemoveAllAuras(); + me->SetWalk(false); + events2.ScheduleEvent(EVENT_SVALA_TALK5, 2000); - std::list creatureList; - me->GetCreaturesWithEntryInRange(creatureList, 100.0f, NPC_DRAGONFLAYER_SPECTATOR); - for (std::list::const_iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr) - (*itr)->AI()->SetData(1, 2); + std::list creatureList; + me->GetCreaturesWithEntryInRange(creatureList, 100.0f, NPC_DRAGONFLAYER_SPECTATOR); + for (std::list::const_iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr) + (*itr)->AI()->SetData(1, 2); - break; - } + break; + } case EVENT_SVALA_TALK5: Talk(TALK_INTRO_S2); events2.ScheduleEvent(EVENT_SVALA_TALK6, 12000); break; case EVENT_SVALA_TALK6: - if (Creature *Arthas = ObjectAccessor::GetCreature(*me, ArthasGUID)) + if (Creature* Arthas = ObjectAccessor::GetCreature(*me, ArthasGUID)) Arthas->AI()->Talk(TALK_INTRO_A2); events2.ScheduleEvent(EVENT_SVALA_TALK7, 9000); break; case EVENT_SVALA_TALK7: - me->SetFacingTo(M_PI/2.0f); + me->SetFacingTo(M_PI / 2.0f); Talk(TALK_INTRO_S3); if (GameObject* mirror = ObjectAccessor::GetGameObject(*me, instance->GetData64(GO_SVALA_MIRROR))) mirror->SetGoState(GO_STATE_ACTIVE); @@ -273,7 +273,7 @@ public: break; case EVENT_SVALA_TALK9: me->SetFloatValue(UNIT_FIELD_HOVERHEIGHT, 3.0f); - 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->LoadEquipment(1, true); me->setActive(false); if (Player* target = SelectTargetFromPlayerList(100.0f)) @@ -302,16 +302,16 @@ public: events.ScheduleEvent(EVENT_SORROWGRAVE_FLAMES, urand(8000, 12000)); break; case EVENT_SORROWGRAVE_FLAMES2: - { - std::list braziers; - me->GetCreaturesWithEntryInRange(braziers, 100.0f, NPC_FLAME_BRAZIER); - if (!braziers.empty()) { - for (std::list::const_iterator itr = braziers.begin(); itr != braziers.end(); ++itr) - (*itr)->CastCustomSpell(SPELL_BALL_OF_FLAME, SPELLVALUE_MAX_TARGETS, 1, (*itr), true); + std::list braziers; + me->GetCreaturesWithEntryInRange(braziers, 100.0f, NPC_FLAME_BRAZIER); + if (!braziers.empty()) + { + for (std::list::const_iterator itr = braziers.begin(); itr != braziers.end(); ++itr) + (*itr)->CastCustomSpell(SPELL_BALL_OF_FLAME, SPELLVALUE_MAX_TARGETS, 1, (*itr), true); + } + break; } - break; - } case EVENT_SORROWGRAVE_RITUAL: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) { @@ -386,55 +386,55 @@ public: class spell_svala_ritual_strike : public SpellScriptLoader { - public: - spell_svala_ritual_strike() : SpellScriptLoader("spell_svala_ritual_strike") { } +public: + spell_svala_ritual_strike() : SpellScriptLoader("spell_svala_ritual_strike") { } - class spell_svala_ritual_strike_SpellScript : public SpellScript + class spell_svala_ritual_strike_SpellScript : public SpellScript + { + PrepareSpellScript(spell_svala_ritual_strike_SpellScript); + + void HandleDummyEffect(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_svala_ritual_strike_SpellScript); - - void HandleDummyEffect(SpellEffIndex /*effIndex*/) + if (Unit* unitTarget = GetHitUnit()) { - if (Unit* unitTarget = GetHitUnit()) - { - if (unitTarget->GetTypeId() != TYPEID_UNIT) - return; + if (unitTarget->GetTypeId() != TYPEID_UNIT) + return; - Unit::DealDamage(GetCaster(), unitTarget, 7000, NULL, DIRECT_DAMAGE); - } + Unit::DealDamage(GetCaster(), unitTarget, 7000, NULL, DIRECT_DAMAGE); } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_svala_ritual_strike_SpellScript::HandleDummyEffect, EFFECT_2, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript *GetSpellScript() const - { - return new spell_svala_ritual_strike_SpellScript(); } - class spell_svala_ritual_strike_AuraScript : public AuraScript + void Register() { - PrepareAuraScript(spell_svala_ritual_strike_AuraScript); - - void CalculateAmount(AuraEffect const * /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - // Set amount based on difficulty - amount = (GetCaster()->GetMap()->IsHeroic() ? 2000 : 1000); - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_svala_ritual_strike_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE); - } - }; - - AuraScript *GetAuraScript() const - { - return new spell_svala_ritual_strike_AuraScript(); + OnEffectHitTarget += SpellEffectFn(spell_svala_ritual_strike_SpellScript::HandleDummyEffect, EFFECT_2, SPELL_EFFECT_DUMMY); } + }; + + SpellScript* GetSpellScript() const + { + return new spell_svala_ritual_strike_SpellScript(); + } + + class spell_svala_ritual_strike_AuraScript : public AuraScript + { + PrepareAuraScript(spell_svala_ritual_strike_AuraScript); + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + // Set amount based on difficulty + amount = (GetCaster()->GetMap()->IsHeroic() ? 2000 : 1000); + } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_svala_ritual_strike_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_svala_ritual_strike_AuraScript(); + } }; void AddSC_boss_svala() diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp index 5eb754c65..0fc66d4fc 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp @@ -97,12 +97,12 @@ public: struct boss_ymironAI : public ScriptedAI { - boss_ymironAI(Creature *pCreature) : ScriptedAI(pCreature), summons(me), summons2(me) + boss_ymironAI(Creature* pCreature) : ScriptedAI(pCreature), summons(me), summons2(me) { pInstance = pCreature->GetInstanceScript(); } - InstanceScript *pInstance; + InstanceScript* pInstance; EventMap events; SummonList summons; SummonList summons2; @@ -117,7 +117,7 @@ public: do { good = true; - BoatOrder[i] = urand(0,3); + BoatOrder[i] = urand(0, 3); for (uint8 j = 0; j < i; ++j) if (BoatOrder[i] == BoatOrder[j]) @@ -125,8 +125,7 @@ public: good = false; break; } - } - while (!good); + } while (!good); } events.Reset(); @@ -134,8 +133,8 @@ public: summons2.DespawnAll(); BoatNum = 0; - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_DISABLE_MOVE); - + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE); + if(pInstance) { pInstance->SetData(DATA_KING_YMIRON, NOT_STARTED); @@ -176,15 +175,15 @@ public: if (point == 0) { - Talk(BoatStructure[BoatOrder[BoatNum-1]].say); - if (Creature *cr = me->FindNearestCreature(BoatStructure[BoatOrder[BoatNum-1]].trigger, 50.0f)) + Talk(BoatStructure[BoatOrder[BoatNum - 1]].say); + if (Creature* cr = me->FindNearestCreature(BoatStructure[BoatOrder[BoatNum - 1]].trigger, 50.0f)) me->CastSpell(cr, SPELL_CHANNEL_YMIRON_TO_SPIRIT, true); events.ScheduleEvent(EVENT_YMIRON_ACTIVATE_BOAT, 6000); } } - void SpellHitTarget(Unit *, const SpellInfo *spellInfo) + void SpellHitTarget(Unit*, const SpellInfo* spellInfo) { if (spellInfo->Id == 59302 && pInstance) // Bane trigger pInstance->SetData(DATA_YMIRON_ACHIEVEMENT, false); @@ -202,117 +201,125 @@ public: switch (events.GetEvent()) { case EVENT_YMIRON_HEALTH_CHECK: - { - if (me->GetHealth() < std::max(0.0f, float(me->GetMaxHealth()*(1.0f-(IsHeroic() ? 0.2f : 0.334f)*float(BoatNum+1))))) { - events.DelayEvents(12000); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - me->InterruptNonMeleeSpells(true); - me->CastSpell(me, SPELL_SCREAMS_OF_THE_DEAD, true); - me->GetMotionMaster()->Clear(); - me->GetMotionMaster()->MovePoint(0, BoatStructure[BoatOrder[BoatNum]].MoveX, BoatStructure[BoatOrder[BoatNum]].MoveY, BoatStructure[BoatOrder[BoatNum]].MoveZ); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); - summons.DespawnAll(); + if (me->GetHealth() < std::max(0.0f, float(me->GetMaxHealth() * (1.0f - (IsHeroic() ? 0.2f : 0.334f)*float(BoatNum + 1))))) + { + events.DelayEvents(12000); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + me->InterruptNonMeleeSpells(true); + me->CastSpell(me, SPELL_SCREAMS_OF_THE_DEAD, true); + me->GetMotionMaster()->Clear(); + me->GetMotionMaster()->MovePoint(0, BoatStructure[BoatOrder[BoatNum]].MoveX, BoatStructure[BoatOrder[BoatNum]].MoveY, BoatStructure[BoatOrder[BoatNum]].MoveZ); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); + summons.DespawnAll(); - // Spawn flames in previous boat if any - if (BoatNum) // different than 0 - if (Creature *cr = me->SummonTrigger(BoatStructure[BoatOrder[BoatNum-1]].SpawnX, BoatStructure[BoatOrder[BoatNum-1]].SpawnY, BoatStructure[BoatOrder[BoatNum-1]].SpawnZ, 0, 1800000)) - { - cr->AddAura(SPELL_FLAMES, cr); - summons2.Summon(cr); - } + // Spawn flames in previous boat if any + if (BoatNum) // different than 0 + if (Creature* cr = me->SummonTrigger(BoatStructure[BoatOrder[BoatNum - 1]].SpawnX, BoatStructure[BoatOrder[BoatNum - 1]].SpawnY, BoatStructure[BoatOrder[BoatNum - 1]].SpawnZ, 0, 1800000)) + { + cr->AddAura(SPELL_FLAMES, cr); + summons2.Summon(cr); + } - BoatNum++; + BoatNum++; + } + + events.RepeatEvent(1000); + break; } - - events.RepeatEvent(1000); - break; - } case EVENT_YMIRON_BANE: - { - me->CastSpell(me, IsHeroic() ? SPELL_BANE_H : SPELL_BANE_N, false); - events.RepeatEvent(20000+rand()%5000); - break; - } + { + me->CastSpell(me, IsHeroic() ? SPELL_BANE_H : SPELL_BANE_N, false); + events.RepeatEvent(20000 + rand() % 5000); + break; + } case EVENT_YMIRON_FETID_ROT: - { - me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_FETID_ROT_H : SPELL_FETID_ROT_N, false); - events.RepeatEvent(10000+rand()%3000); - break; - } + { + me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_FETID_ROT_H : SPELL_FETID_ROT_N, false); + events.RepeatEvent(10000 + rand() % 3000); + break; + } case EVENT_YMIRON_DARK_SLASH: - { - int32 dmg = me->GetVictim()->GetHealth() / 2; - me->CastCustomSpell(me->GetVictim(), SPELL_DARK_SLASH, &dmg, 0, 0, false); - events.RepeatEvent(30000+rand()%5000); - break; - } + { + int32 dmg = me->GetVictim()->GetHealth() / 2; + me->CastCustomSpell(me->GetVictim(), SPELL_DARK_SLASH, &dmg, 0, 0, false); + events.RepeatEvent(30000 + rand() % 5000); + break; + } case EVENT_YMIRON_ACTIVATE_BOAT: - { - // Spawn it! - if (Creature* king = me->SummonCreature(BoatStructure[BoatOrder[BoatNum-1]].npc, BoatStructure[BoatOrder[BoatNum-1]].SpawnX, BoatStructure[BoatOrder[BoatNum-1]].SpawnY, BoatStructure[BoatOrder[BoatNum-1]].SpawnZ, BoatStructure[BoatOrder[BoatNum-1]].SpawnO, TEMPSUMMON_CORPSE_DESPAWN, 0)) { - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - king->CastSpell(me, SPELL_CHANNEL_SPIRIT_TO_YMIRON, true); - summons.Summon(king); - king->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); - king->SetDisableGravity(true); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); - me->GetMotionMaster()->MoveChase(me->GetVictim()); - switch(BoatOrder[BoatNum-1]) + // Spawn it! + if (Creature* king = me->SummonCreature(BoatStructure[BoatOrder[BoatNum - 1]].npc, BoatStructure[BoatOrder[BoatNum - 1]].SpawnX, BoatStructure[BoatOrder[BoatNum - 1]].SpawnY, BoatStructure[BoatOrder[BoatNum - 1]].SpawnZ, BoatStructure[BoatOrder[BoatNum - 1]].SpawnO, TEMPSUMMON_CORPSE_DESPAWN, 0)) { - case 0: events.ScheduleEvent(EVENT_YMIRON_RANULF_ABILITY, 3000, 1); break; - case 1: events.ScheduleEvent(EVENT_YMIRON_TORGYN_ABILITY, 3000, 1); break; - case 2: events.ScheduleEvent(EVENT_YMIRON_BJORN_ABILITY, 3000, 1); break; - case 3: events.ScheduleEvent(EVENT_YMIRON_HALDOR_ABILITY, 3000, 1); break; + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + king->CastSpell(me, SPELL_CHANNEL_SPIRIT_TO_YMIRON, true); + summons.Summon(king); + king->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); + king->SetDisableGravity(true); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); + me->GetMotionMaster()->MoveChase(me->GetVictim()); + switch(BoatOrder[BoatNum - 1]) + { + case 0: + events.ScheduleEvent(EVENT_YMIRON_RANULF_ABILITY, 3000, 1); + break; + case 1: + events.ScheduleEvent(EVENT_YMIRON_TORGYN_ABILITY, 3000, 1); + break; + case 2: + events.ScheduleEvent(EVENT_YMIRON_BJORN_ABILITY, 3000, 1); + break; + case 3: + events.ScheduleEvent(EVENT_YMIRON_HALDOR_ABILITY, 3000, 1); + break; + } } - } - events.PopEvent(); - break; - } + events.PopEvent(); + break; + } case EVENT_YMIRON_BJORN_ABILITY: - { - if (Creature* sf = me->SummonCreature(NPC_SPIRIT_FOUNT, 385+rand()%10, -330+rand()%10, 104.756f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 180000)) { - summons.Summon(sf); - sf->SetSpeed(MOVE_RUN, 0.4f); - sf->AddAura(IsHeroic() ? SPELL_SPIRIT_FOUNT_H : SPELL_SPIRIT_FOUNT_N, sf); - sf->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - sf->GetMotionMaster()->MoveFollow(me->GetVictim(), 0, rand_norm()*M_PI*2); - } - events.PopEvent(); - break; - } - case EVENT_YMIRON_HALDOR_ABILITY: - { - me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_SPIRIT_STRIKE_H : SPELL_SPIRIT_STRIKE_N, false); - events.RepeatEvent(5000); - break; - } - case EVENT_YMIRON_RANULF_ABILITY: - { - me->CastSpell(me, IsHeroic() ? SPELL_SPIRIT_BURST_H : SPELL_SPIRIT_BURST_N, false); - events.RepeatEvent(10000); - break; - } - case EVENT_YMIRON_TORGYN_ABILITY: - { - for(uint8 i = 0; i < 4; ++i) - { - if (Creature* as = me->SummonCreature(NPC_AVENGING_SPIRIT, me->GetPositionX()+rand()%10, me->GetPositionY()+rand()%10, me->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000)) + if (Creature* sf = me->SummonCreature(NPC_SPIRIT_FOUNT, 385 + rand() % 10, -330 + rand() % 10, 104.756f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 180000)) { - summons.Summon(as); - as->SetInCombatWithZone(); + summons.Summon(sf); + sf->SetSpeed(MOVE_RUN, 0.4f); + sf->AddAura(IsHeroic() ? SPELL_SPIRIT_FOUNT_H : SPELL_SPIRIT_FOUNT_N, sf); + sf->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + sf->GetMotionMaster()->MoveFollow(me->GetVictim(), 0, rand_norm()*M_PI * 2); } + events.PopEvent(); + break; + } + case EVENT_YMIRON_HALDOR_ABILITY: + { + me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_SPIRIT_STRIKE_H : SPELL_SPIRIT_STRIKE_N, false); + events.RepeatEvent(5000); + break; + } + case EVENT_YMIRON_RANULF_ABILITY: + { + me->CastSpell(me, IsHeroic() ? SPELL_SPIRIT_BURST_H : SPELL_SPIRIT_BURST_N, false); + events.RepeatEvent(10000); + break; + } + case EVENT_YMIRON_TORGYN_ABILITY: + { + for(uint8 i = 0; i < 4; ++i) + { + if (Creature* as = me->SummonCreature(NPC_AVENGING_SPIRIT, me->GetPositionX() + rand() % 10, me->GetPositionY() + rand() % 10, me->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000)) + { + summons.Summon(as); + as->SetInCombatWithZone(); + } + } + events.RepeatEvent(15000); + break; } - events.RepeatEvent(15000); - break; - } } - DoMeleeAttackIfReady(); + DoMeleeAttackIfReady(); } void JustDied(Unit* /*pKiller*/) @@ -327,7 +334,7 @@ public: void KilledUnit(Unit* /*pVictim*/) { - if (urand(0,1)) + if (urand(0, 1)) return; Talk(SAY_SLAY); diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp index ff6d2767c..b26a25426 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp @@ -45,36 +45,36 @@ public: void Initialize() { - SvalaSorrowgrave = 0; - GortokPalehoof = 0; - SkadiRuthless = 0; - KingYmiron = 0; - FrenziedWorgen = 0; - RavenousFurbolg = 0; - MassiveJormungar = 0; - FerociousRhino = 0; - Grauf = 0; + SvalaSorrowgrave = 0; + GortokPalehoof = 0; + SkadiRuthless = 0; + KingYmiron = 0; + FrenziedWorgen = 0; + RavenousFurbolg = 0; + MassiveJormungar = 0; + FerociousRhino = 0; + Grauf = 0; - SvalaMirrorGUID = 0; - StatisGenerator = 0; - SkadiHits = 0; - SkadiInRange = 0; - SkadiRuthlessDoor= 0; - YmironDoor = 0; - FightStatus = 0; + SvalaMirrorGUID = 0; + StatisGenerator = 0; + SkadiHits = 0; + SkadiInRange = 0; + SkadiRuthlessDoor = 0; + YmironDoor = 0; + FightStatus = 0; - svalaAchievement = false; - skadiAchievement = false; - ymironAchievement = false; - - for(uint8 i = 0; i < MAX_ENCOUNTERS; ++i) - Encounters[i] = NOT_STARTED; + svalaAchievement = false; + skadiAchievement = false; + ymironAchievement = false; + + for(uint8 i = 0; i < MAX_ENCOUNTERS; ++i) + Encounters[i] = NOT_STARTED; } bool IsEncounterInProgress() const { for(uint8 i = 0; i < MAX_ENCOUNTERS; ++i) - if(Encounters[i] == IN_PROGRESS) + if(Encounters[i] == IN_PROGRESS) return true; return false; @@ -83,15 +83,33 @@ public: { switch(pCreature->GetEntry()) { - case NPC_SVALA_SORROWGRAVE: SvalaSorrowgrave = pCreature->GetGUID(); break; - case NPC_GORTOK_PALEHOOF: GortokPalehoof = pCreature->GetGUID(); break; - case NPC_SKADI_THE_RUTHLESS: SkadiRuthless = pCreature->GetGUID(); break; - case NPC_KING_YMIRON: KingYmiron = pCreature->GetGUID(); break; - case NPC_FRENZIED_WORGEN: FrenziedWorgen = pCreature->GetGUID(); break; - case NPC_RAVENOUS_FURBOLG: RavenousFurbolg = pCreature->GetGUID(); break; - case NPC_MASSIVE_JORMUNGAR: MassiveJormungar = pCreature->GetGUID(); break; - case NPC_FEROCIOUS_RHINO: FerociousRhino = pCreature->GetGUID(); break; - case NPC_GARUF: Grauf = pCreature->GetGUID(); break; + case NPC_SVALA_SORROWGRAVE: + SvalaSorrowgrave = pCreature->GetGUID(); + break; + case NPC_GORTOK_PALEHOOF: + GortokPalehoof = pCreature->GetGUID(); + break; + case NPC_SKADI_THE_RUTHLESS: + SkadiRuthless = pCreature->GetGUID(); + break; + case NPC_KING_YMIRON: + KingYmiron = pCreature->GetGUID(); + break; + case NPC_FRENZIED_WORGEN: + FrenziedWorgen = pCreature->GetGUID(); + break; + case NPC_RAVENOUS_FURBOLG: + RavenousFurbolg = pCreature->GetGUID(); + break; + case NPC_MASSIVE_JORMUNGAR: + MassiveJormungar = pCreature->GetGUID(); + break; + case NPC_FEROCIOUS_RHINO: + FerociousRhino = pCreature->GetGUID(); + break; + case NPC_GARUF: + Grauf = pCreature->GetGUID(); + break; } } @@ -102,14 +120,14 @@ public: case GO_SKADI_THE_RUTHLESS_DOOR: SkadiRuthlessDoor = pGo->GetGUID(); if (Encounters[DATA_SKADI_THE_RUTHLESS] == DONE) - HandleGameObject(0,true,pGo); + HandleGameObject(0, true, pGo); break; case GO_KING_YMIRON_DOOR: YmironDoor = pGo->GetGUID(); - if (Encounters[DATA_KING_YMIRON] == DONE) - HandleGameObject(0,true,pGo); + if (Encounters[DATA_KING_YMIRON] == DONE) + HandleGameObject(0, true, pGo); break; - case GO_GORK_PALEHOOF_SPHERE: + case GO_GORK_PALEHOOF_SPHERE: StatisGenerator = pGo->GetGUID(); break; case GO_SVALA_MIRROR: @@ -143,16 +161,16 @@ public: case DATA_SKADI_THE_RUTHLESS: if (data == DONE) { - HandleGameObject(SkadiRuthlessDoor,true); + HandleGameObject(SkadiRuthlessDoor, true); // Make ymiron attackable - if (Creature *cr = instance->GetCreature(KingYmiron)) + if (Creature* cr = instance->GetCreature(KingYmiron)) cr->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } Encounters[type] = data; break; case DATA_KING_YMIRON: if (data == DONE) - HandleGameObject(YmironDoor,true); + HandleGameObject(YmironDoor, true); Encounters[type] = data; break; case SKADI_HITS: @@ -212,7 +230,8 @@ public: if (Encounters[i] == IN_PROGRESS) Encounters[i] = NOT_STARTED; - } else OUT_LOAD_INST_DATA_FAIL; + } + else OUT_LOAD_INST_DATA_FAIL; OUT_LOAD_INST_DATA_COMPLETE; } @@ -221,12 +240,18 @@ public: { switch(type) { - case DATA_SVALA_SORROWGRAVE: return Encounters[0]; - case DATA_GORTOK_PALEHOOF: return Encounters[1]; - case DATA_SKADI_THE_RUTHLESS: return Encounters[2]; - case DATA_KING_YMIRON: return Encounters[3]; - case SKADI_HITS: return SkadiHits; - case SKADI_IN_RANGE: return SkadiInRange; + case DATA_SVALA_SORROWGRAVE: + return Encounters[0]; + case DATA_GORTOK_PALEHOOF: + return Encounters[1]; + case DATA_SKADI_THE_RUTHLESS: + return Encounters[2]; + case DATA_KING_YMIRON: + return Encounters[3]; + case SKADI_HITS: + return SkadiHits; + case SKADI_IN_RANGE: + return SkadiInRange; } return 0; } @@ -235,19 +260,32 @@ public: { switch(identifier) { - case DATA_SVALA_SORROWGRAVE: return SvalaSorrowgrave; - case DATA_GORTOK_PALEHOOF: return GortokPalehoof; - case DATA_SKADI_THE_RUTHLESS: return SkadiRuthless; - case DATA_KING_YMIRON: return KingYmiron; - case DATA_NPC_FRENZIED_WORGEN: return FrenziedWorgen; - case DATA_NPC_RAVENOUS_FURBOLG: return RavenousFurbolg; - case DATA_NPC_MASSIVE_JORMUNGAR: return MassiveJormungar; - case DATA_NPC_FEROCIOUS_RHINO: return FerociousRhino; - case YMIRON_DOOR: return YmironDoor; - case STATIS_GENERATOR: return StatisGenerator; - case SKADI_DOOR: return SkadiRuthlessDoor; - case DATA_GRAUF: return Grauf; - case GO_SVALA_MIRROR: return SvalaMirrorGUID; + case DATA_SVALA_SORROWGRAVE: + return SvalaSorrowgrave; + case DATA_GORTOK_PALEHOOF: + return GortokPalehoof; + case DATA_SKADI_THE_RUTHLESS: + return SkadiRuthless; + case DATA_KING_YMIRON: + return KingYmiron; + case DATA_NPC_FRENZIED_WORGEN: + return FrenziedWorgen; + case DATA_NPC_RAVENOUS_FURBOLG: + return RavenousFurbolg; + case DATA_NPC_MASSIVE_JORMUNGAR: + return MassiveJormungar; + case DATA_NPC_FEROCIOUS_RHINO: + return FerociousRhino; + case YMIRON_DOOR: + return YmironDoor; + case STATIS_GENERATOR: + return StatisGenerator; + case SKADI_DOOR: + return SkadiRuthlessDoor; + case DATA_GRAUF: + return Grauf; + case GO_SVALA_MIRROR: + return SvalaMirrorGUID; } return 0; diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h index ea0d2aea0..817a796f9 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h @@ -15,7 +15,7 @@ enum Data DATA_NPC_RAVENOUS_FURBOLG = 11, DATA_NPC_MASSIVE_JORMUNGAR = 12, DATA_NPC_FEROCIOUS_RHINO = 13, - + YMIRON_DOOR = 20, STATIS_GENERATOR = 21, diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp index d35ec6acf..e55ec4bb7 100644 --- a/src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp +++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp @@ -37,85 +37,85 @@ enum Events class boss_archavon : public CreatureScript { - public: - boss_archavon() : CreatureScript("boss_archavon") { } +public: + boss_archavon() : CreatureScript("boss_archavon") { } - struct boss_archavonAI : public ScriptedAI + struct boss_archavonAI : public ScriptedAI + { + boss_archavonAI(Creature* creature) : ScriptedAI(creature) { - boss_archavonAI(Creature* creature) : ScriptedAI(creature) - { - pInstance = me->GetInstanceScript(); - } + pInstance = me->GetInstanceScript(); + } - InstanceScript* pInstance; - EventMap events; + InstanceScript* pInstance; + EventMap events; - void Reset() + void Reset() + { + events.Reset(); + if (pInstance) { - events.Reset(); - if (pInstance) + if (pInstance->GetData(DATA_STONED)) { - if (pInstance->GetData(DATA_STONED)) + if (Aura* aur = me->AddAura(SPELL_STONED_AURA, me)) { - if (Aura* aur = me->AddAura(SPELL_STONED_AURA, me)) - { - aur->SetMaxDuration(60 * MINUTE* IN_MILLISECONDS); - aur->SetDuration(60 * MINUTE* IN_MILLISECONDS); - } + aur->SetMaxDuration(60 * MINUTE * IN_MILLISECONDS); + aur->SetDuration(60 * MINUTE * IN_MILLISECONDS); } - pInstance->SetData(EVENT_ARCHAVON, NOT_STARTED); } + pInstance->SetData(EVENT_ARCHAVON, NOT_STARTED); } + } - void AttackStart(Unit* who) + void AttackStart(Unit* who) + { + if (me->HasAura(SPELL_STONED_AURA)) + return; + + ScriptedAI::AttackStart(who); + } + + void EnterCombat(Unit* /*who*/) + { + events.ScheduleEvent(EVENT_ROCK_SHARDS, 15000); + events.ScheduleEvent(EVENT_CHOKING_CLOUD, 30000); + events.ScheduleEvent(EVENT_STOMP, 45000); + events.ScheduleEvent(EVENT_BERSERK, 300000); + if (pInstance) + pInstance->SetData(EVENT_ARCHAVON, IN_PROGRESS); + } + + void JustDied(Unit* ) + { + if (pInstance) + pInstance->SetData(EVENT_ARCHAVON, DONE); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.GetEvent()) { - if (me->HasAura(SPELL_STONED_AURA)) - return; + case EVENT_ROCK_SHARDS: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + me->CastSpell(target, SPELL_ROCK_SHARDS, false); - ScriptedAI::AttackStart(who); - } + events.RepeatEvent(15000); + break; + case EVENT_CHOKING_CLOUD: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1)) + me->CastSpell(target, RAID_MODE(SPELL_CRUSHING_LEAP_10, SPELL_CRUSHING_LEAP_25), true); //10y~80y, ignore range - void EnterCombat(Unit* /*who*/) - { - events.ScheduleEvent(EVENT_ROCK_SHARDS, 15000); - events.ScheduleEvent(EVENT_CHOKING_CLOUD, 30000); - events.ScheduleEvent(EVENT_STOMP, 45000); - events.ScheduleEvent(EVENT_BERSERK, 300000); - if (pInstance) - pInstance->SetData(EVENT_ARCHAVON, IN_PROGRESS); - } - - void JustDied(Unit* ) - { - if (pInstance) - pInstance->SetData(EVENT_ARCHAVON, DONE); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.GetEvent()) - { - case EVENT_ROCK_SHARDS: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - me->CastSpell(target, SPELL_ROCK_SHARDS, false); - - events.RepeatEvent(15000); - break; - case EVENT_CHOKING_CLOUD: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1)) - me->CastSpell(target, RAID_MODE(SPELL_CRUSHING_LEAP_10, SPELL_CRUSHING_LEAP_25), true); //10y~80y, ignore range - - events.RepeatEvent(30000); - break; - case EVENT_STOMP: + events.RepeatEvent(30000); + break; + case EVENT_STOMP: { char buffer[100]; sprintf(buffer, "Archavon the Stone Watcher lunges for %s!", me->GetVictim()->GetName().c_str()); @@ -125,65 +125,65 @@ class boss_archavon : public CreatureScript events.ScheduleEvent(EVENT_IMPALE, 3000); break; } - case EVENT_IMPALE: - me->CastSpell(me->GetVictim(), RAID_MODE(SPELL_IMPALE_10, SPELL_IMPALE_25), false); - events.PopEvent(); - break; - case EVENT_BERSERK: - me->CastSpell(me, SPELL_BERSERK, true); - Talk(EMOTE_BERSERK); - events.PopEvent(); - break; - default: - break; - } - - DoMeleeAttackIfReady(); + case EVENT_IMPALE: + me->CastSpell(me->GetVictim(), RAID_MODE(SPELL_IMPALE_10, SPELL_IMPALE_25), false); + events.PopEvent(); + break; + case EVENT_BERSERK: + me->CastSpell(me, SPELL_BERSERK, true); + Talk(EMOTE_BERSERK); + events.PopEvent(); + break; + default: + break; } - }; - CreatureAI* GetAI(Creature* creature) const - { - return new boss_archavonAI(creature); + DoMeleeAttackIfReady(); } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_archavonAI(creature); + } }; class spell_archavon_rock_shards : public SpellScriptLoader { - public: - spell_archavon_rock_shards() : SpellScriptLoader("spell_archavon_rock_shards") { } +public: + spell_archavon_rock_shards() : SpellScriptLoader("spell_archavon_rock_shards") { } - class spell_archavon_rock_shards_SpellScript : public SpellScript + class spell_archavon_rock_shards_SpellScript : public SpellScript + { + PrepareSpellScript(spell_archavon_rock_shards_SpellScript); + + void HandleScript(SpellEffIndex effIndex) { - PrepareSpellScript(spell_archavon_rock_shards_SpellScript); - - void HandleScript(SpellEffIndex effIndex) + PreventHitDefaultEffect(effIndex); + Unit* target = GetHitUnit(); + Unit* caster = GetOriginalCaster(); + if (target && caster && caster->GetMap()) { - PreventHitDefaultEffect(effIndex); - Unit* target = GetHitUnit(); - Unit* caster = GetOriginalCaster(); - if (target && caster && caster->GetMap()) + for (uint32 i = 0; i < 3; ++i) { - for (uint32 i = 0; i < 3; ++i) - { - caster->CastSpell(target, 58689, true); - caster->CastSpell(target, 58692, true); - } - - caster->CastSpell(target, caster->GetMap()->Is25ManRaid() ? 60883 : 58695, true); + caster->CastSpell(target, 58689, true); + caster->CastSpell(target, 58692, true); } - } - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_archavon_rock_shards_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + caster->CastSpell(target, caster->GetMap()->Is25ManRaid() ? 60883 : 58695, true); } - }; - - SpellScript* GetSpellScript() const - { - return new spell_archavon_rock_shards_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_archavon_rock_shards_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_archavon_rock_shards_SpellScript(); + } }; diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp index 5ebbb7f45..0f1e80eda 100644 --- a/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp +++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp @@ -53,209 +53,209 @@ struct Position TempestMinions[MAX_TEMPEST_MINIONS] = ######*/ class boss_emalon : public CreatureScript { - public: - boss_emalon() : CreatureScript("boss_emalon") { } +public: + boss_emalon() : CreatureScript("boss_emalon") { } - struct boss_emalonAI : public ScriptedAI + struct boss_emalonAI : public ScriptedAI + { + boss_emalonAI(Creature* creature) : ScriptedAI(creature), summons(me) { - boss_emalonAI(Creature* creature) : ScriptedAI(creature), summons(me) + pInstance = me->GetInstanceScript(); + } + + InstanceScript* pInstance; + EventMap events; + SummonList summons; + + void ResetSummons() + { + summons.DespawnAll(); + for (uint8 i = 0; i < MAX_TEMPEST_MINIONS; ++i) + me->SummonCreature(NPC_TEMPEST_MINION, TempestMinions[i], TEMPSUMMON_CORPSE_DESPAWN, 0); + } + + void Reset() + { + events.Reset(); + ResetSummons(); + + if (pInstance) { - pInstance = me->GetInstanceScript(); + if (pInstance->GetData(DATA_STONED)) + { + if (Aura* aur = me->AddAura(SPELL_STONED_AURA, me)) + { + aur->SetMaxDuration(60 * MINUTE * IN_MILLISECONDS); + aur->SetDuration(60 * MINUTE * IN_MILLISECONDS); + } + } + pInstance->SetData(EVENT_EMALON, NOT_STARTED); } + } - InstanceScript* pInstance; - EventMap events; - SummonList summons; + void AttackStart(Unit* who) + { + if (me->HasAura(SPELL_STONED_AURA)) + return; - void ResetSummons() - { - summons.DespawnAll(); - for (uint8 i = 0; i < MAX_TEMPEST_MINIONS; ++i) - me->SummonCreature(NPC_TEMPEST_MINION, TempestMinions[i], TEMPSUMMON_CORPSE_DESPAWN, 0); - } + ScriptedAI::AttackStart(who); + } - void Reset() - { - events.Reset(); + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + } + + void SummonedCreatureDies(Creature* cr, Unit*) + { + summons.Despawn(cr); + events.ScheduleEvent(EVENT_SUMMON_NEXT_MINION, 4000); + } + + void SpellHitTarget(Unit* target, const SpellInfo* spellInfo) + { + // restore minions health + if (spellInfo->Id == SPELL_OVERCHARGE) + target->SetFullHealth(); + } + + void EnterCombat(Unit* /*who*/) + { + events.Reset(); + if (summons.size() < 4) ResetSummons(); - if (pInstance) - { - if (pInstance->GetData(DATA_STONED)) - { - if (Aura* aur = me->AddAura(SPELL_STONED_AURA, me)) - { - aur->SetMaxDuration(60 * MINUTE* IN_MILLISECONDS); - aur->SetDuration(60 * MINUTE* IN_MILLISECONDS); - } - } - pInstance->SetData(EVENT_EMALON, NOT_STARTED); - } - } + summons.DoZoneInCombat(); - void AttackStart(Unit* who) - { - if (me->HasAura(SPELL_STONED_AURA)) - return; + events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 5000); + events.ScheduleEvent(EVENT_LIGHTNING_NOVA, 40000); + events.ScheduleEvent(EVENT_BERSERK, 360000); + events.ScheduleEvent(EVENT_OVERCHARGE, 47000); - ScriptedAI::AttackStart(who); - } - - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - } - - void SummonedCreatureDies(Creature* cr, Unit*) - { - summons.Despawn(cr); - events.ScheduleEvent(EVENT_SUMMON_NEXT_MINION, 4000); - } - - void SpellHitTarget(Unit* target, const SpellInfo* spellInfo) - { - // restore minions health - if (spellInfo->Id == SPELL_OVERCHARGE) - target->SetFullHealth(); - } - - void EnterCombat(Unit* /*who*/) - { - events.Reset(); - if (summons.size() < 4) - ResetSummons(); - - summons.DoZoneInCombat(); - - events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 5000); - events.ScheduleEvent(EVENT_LIGHTNING_NOVA, 40000); - events.ScheduleEvent(EVENT_BERSERK, 360000); - events.ScheduleEvent(EVENT_OVERCHARGE, 47000); - - if (pInstance) - pInstance->SetData(EVENT_EMALON, IN_PROGRESS); - } - - void JustDied(Unit* ) - { - summons.DespawnAll(); - events.Reset(); - if (pInstance) - pInstance->SetData(EVENT_EMALON, DONE); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.GetEvent()) - { - case EVENT_CHAIN_LIGHTNING: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - me->CastSpell(target, RAID_MODE(SPELL_CHAIN_LIGHTNING_10, SPELL_CHAIN_LIGHTNING_25), false); - events.RepeatEvent(25000); - break; - case EVENT_LIGHTNING_NOVA: - me->CastSpell(me, RAID_MODE(SPELL_LIGHTNING_NOVA_10, SPELL_LIGHTNING_NOVA_25), false); - events.RepeatEvent(40000); - break; - case EVENT_OVERCHARGE: - if (!summons.empty()) - me->CastCustomSpell(SPELL_OVERCHARGE, SPELLVALUE_MAX_TARGETS, 1, me, true); - Talk(EMOTE_OVERCHARGE); - events.RepeatEvent(40000); - break; - case EVENT_BERSERK: - me->CastSpell(me, SPELL_BERSERK, true); - Talk(EMOTE_BERSERK); - break; - case EVENT_SUMMON_NEXT_MINION: - me->SummonCreature(NPC_TEMPEST_MINION, TempestMinions[urand(0,3)], TEMPSUMMON_CORPSE_DESPAWN, 0); - events.PopEvent(); - break; - default: - break; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_emalonAI(creature); + if (pInstance) + pInstance->SetData(EVENT_EMALON, IN_PROGRESS); } + + void JustDied(Unit* ) + { + summons.DespawnAll(); + events.Reset(); + if (pInstance) + pInstance->SetData(EVENT_EMALON, DONE); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.GetEvent()) + { + case EVENT_CHAIN_LIGHTNING: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + me->CastSpell(target, RAID_MODE(SPELL_CHAIN_LIGHTNING_10, SPELL_CHAIN_LIGHTNING_25), false); + events.RepeatEvent(25000); + break; + case EVENT_LIGHTNING_NOVA: + me->CastSpell(me, RAID_MODE(SPELL_LIGHTNING_NOVA_10, SPELL_LIGHTNING_NOVA_25), false); + events.RepeatEvent(40000); + break; + case EVENT_OVERCHARGE: + if (!summons.empty()) + me->CastCustomSpell(SPELL_OVERCHARGE, SPELLVALUE_MAX_TARGETS, 1, me, true); + Talk(EMOTE_OVERCHARGE); + events.RepeatEvent(40000); + break; + case EVENT_BERSERK: + me->CastSpell(me, SPELL_BERSERK, true); + Talk(EMOTE_BERSERK); + break; + case EVENT_SUMMON_NEXT_MINION: + me->SummonCreature(NPC_TEMPEST_MINION, TempestMinions[urand(0, 3)], TEMPSUMMON_CORPSE_DESPAWN, 0); + events.PopEvent(); + break; + default: + break; + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_emalonAI(creature); + } }; class spell_voa_overcharge : public SpellScriptLoader { - public: - spell_voa_overcharge() : SpellScriptLoader("spell_voa_overcharge") { } +public: + spell_voa_overcharge() : SpellScriptLoader("spell_voa_overcharge") { } - class spell_voa_overcharge_AuraScript : public AuraScript + class spell_voa_overcharge_AuraScript : public AuraScript + { + PrepareAuraScript(spell_voa_overcharge_AuraScript); + + void HandlePeriodicDummy(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_voa_overcharge_AuraScript); - - void HandlePeriodicDummy(AuraEffect const* /*aurEff*/) + Unit* target = GetTarget(); + if (target->GetTypeId() == TYPEID_UNIT && GetAura()->GetStackAmount() >= 10) { - Unit* target = GetTarget(); - if (target->GetTypeId() == TYPEID_UNIT && GetAura()->GetStackAmount() >= 10) - { - target->CastSpell(target, SPELL_OVERCHARGED_BLAST, true); - target->ToCreature()->DespawnOrUnsummon(500); - } - - PreventDefaultAction(); + target->CastSpell(target, SPELL_OVERCHARGED_BLAST, true); + target->ToCreature()->DespawnOrUnsummon(500); } - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_voa_overcharge_AuraScript::HandlePeriodicDummy, EFFECT_2, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_voa_overcharge_AuraScript(); + PreventDefaultAction(); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_voa_overcharge_AuraScript::HandlePeriodicDummy, EFFECT_2, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_voa_overcharge_AuraScript(); + } }; class spell_voa_lightning_nova : public SpellScriptLoader { - public: - spell_voa_lightning_nova() : SpellScriptLoader("spell_voa_lightning_nova") { } +public: + spell_voa_lightning_nova() : SpellScriptLoader("spell_voa_lightning_nova") { } - class spell_voa_lightning_nova_SpellScript : public SpellScript + class spell_voa_lightning_nova_SpellScript : public SpellScript + { + PrepareSpellScript(spell_voa_lightning_nova_SpellScript); + + void HandleOnHit() { - PrepareSpellScript(spell_voa_lightning_nova_SpellScript); - - void HandleOnHit() + int32 damage = 0; + if (Unit* target = GetHitUnit()) { - int32 damage = 0; - if (Unit* target = GetHitUnit()) - { - float dist = target->GetDistance(GetCaster()); - damage = int32(GetHitDamage() * (70.0f - std::min(70.0f, dist)) / 70.0f); - } - - SetHitDamage(damage); + float dist = target->GetDistance(GetCaster()); + damage = int32(GetHitDamage() * (70.0f - std::min(70.0f, dist)) / 70.0f); } - void Register() - { - OnHit += SpellHitFn(spell_voa_lightning_nova_SpellScript::HandleOnHit); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_voa_lightning_nova_SpellScript(); + SetHitDamage(damage); } + + void Register() + { + OnHit += SpellHitFn(spell_voa_lightning_nova_SpellScript::HandleOnHit); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_voa_lightning_nova_SpellScript(); + } }; void AddSC_boss_emalon() diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp index 27591f675..77aa4922e 100644 --- a/src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp +++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp @@ -20,7 +20,7 @@ enum Spells { SPELL_BURNING_FURY = 68168, SPELL_BURNING_BREATH = 66665, // handled by spell_difficulty - + SPELL_FLAMING_CINDER = 66681, SPELL_FLAMING_CINDER_DUMMY = 66690, SPELL_FLAMING_CINDER_MISSILE = 66682, // trigger of missile handled by spell_difficulty @@ -32,217 +32,217 @@ enum Spells class boss_koralon : public CreatureScript { - public: - boss_koralon() : CreatureScript("boss_koralon") { } +public: + boss_koralon() : CreatureScript("boss_koralon") { } - struct boss_koralonAI : public ScriptedAI + struct boss_koralonAI : public ScriptedAI + { + boss_koralonAI(Creature* creature) : ScriptedAI(creature) { - boss_koralonAI(Creature* creature) : ScriptedAI(creature) - { - pInstance = me->GetInstanceScript(); - } - - InstanceScript* pInstance; - EventMap events; - uint32 rotateTimer; - - void Reset() - { - rotateTimer = 0; - events.Reset(); - if (pInstance) - { - if (pInstance->GetData(DATA_STONED)) - { - if (Aura* aur = me->AddAura(SPELL_STONED_AURA, me)) - { - aur->SetMaxDuration(60 * MINUTE* IN_MILLISECONDS); - aur->SetDuration(60 * MINUTE* IN_MILLISECONDS); - } - } - pInstance->SetData(EVENT_KORALON, NOT_STARTED); - } - } - - void AttackStart(Unit* who) - { - if (me->HasAura(SPELL_STONED_AURA)) - return; - - ScriptedAI::AttackStart(who); - } - - void EnterCombat(Unit* /*who*/) - { - me->CastSpell(me, SPELL_BURNING_FURY, true); - - events.ScheduleEvent(EVENT_BURNING_BREATH, 10000); - events.ScheduleEvent(EVENT_METEOR_FISTS, 30000); - events.ScheduleEvent(EVENT_FLAME_CINDER, 20000); - - if (pInstance) - pInstance->SetData(EVENT_KORALON, IN_PROGRESS); - } - - void JustDied(Unit* ) - { - if (pInstance) - pInstance->SetData(EVENT_KORALON, DONE); - } - - void UpdateAI(uint32 diff) - { - if (rotateTimer) - { - rotateTimer += diff; - if (rotateTimer >= 3000) - { - if (!me->HasUnitMovementFlag(MOVEMENTFLAG_LEFT)) - { - me->SetUnitMovementFlags(MOVEMENTFLAG_LEFT); - me->SendMovementFlagUpdate(); - rotateTimer = 1; - return; - } - else - { - me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEFT); - me->SendMovementFlagUpdate(); - rotateTimer = 0; - return; - } - } - } - - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.GetEvent()) - { - case EVENT_BURNING_BREATH: - rotateTimer = 1500; - me->CastSpell(me, SPELL_BURNING_BREATH, false); - events.RepeatEvent(45000); - break; - case EVENT_METEOR_FISTS: - me->CastSpell(me, SPELL_METEOR_FISTS, true); - events.RepeatEvent(45000); - break; - case EVENT_FLAME_CINDER: - me->CastSpell(me, SPELL_FLAMING_CINDER, true); - events.RepeatEvent(30000); - break; - default: - break; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_koralonAI(creature); + pInstance = me->GetInstanceScript(); } + + InstanceScript* pInstance; + EventMap events; + uint32 rotateTimer; + + void Reset() + { + rotateTimer = 0; + events.Reset(); + if (pInstance) + { + if (pInstance->GetData(DATA_STONED)) + { + if (Aura* aur = me->AddAura(SPELL_STONED_AURA, me)) + { + aur->SetMaxDuration(60 * MINUTE * IN_MILLISECONDS); + aur->SetDuration(60 * MINUTE * IN_MILLISECONDS); + } + } + pInstance->SetData(EVENT_KORALON, NOT_STARTED); + } + } + + void AttackStart(Unit* who) + { + if (me->HasAura(SPELL_STONED_AURA)) + return; + + ScriptedAI::AttackStart(who); + } + + void EnterCombat(Unit* /*who*/) + { + me->CastSpell(me, SPELL_BURNING_FURY, true); + + events.ScheduleEvent(EVENT_BURNING_BREATH, 10000); + events.ScheduleEvent(EVENT_METEOR_FISTS, 30000); + events.ScheduleEvent(EVENT_FLAME_CINDER, 20000); + + if (pInstance) + pInstance->SetData(EVENT_KORALON, IN_PROGRESS); + } + + void JustDied(Unit* ) + { + if (pInstance) + pInstance->SetData(EVENT_KORALON, DONE); + } + + void UpdateAI(uint32 diff) + { + if (rotateTimer) + { + rotateTimer += diff; + if (rotateTimer >= 3000) + { + if (!me->HasUnitMovementFlag(MOVEMENTFLAG_LEFT)) + { + me->SetUnitMovementFlags(MOVEMENTFLAG_LEFT); + me->SendMovementFlagUpdate(); + rotateTimer = 1; + return; + } + else + { + me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEFT); + me->SendMovementFlagUpdate(); + rotateTimer = 0; + return; + } + } + } + + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.GetEvent()) + { + case EVENT_BURNING_BREATH: + rotateTimer = 1500; + me->CastSpell(me, SPELL_BURNING_BREATH, false); + events.RepeatEvent(45000); + break; + case EVENT_METEOR_FISTS: + me->CastSpell(me, SPELL_METEOR_FISTS, true); + events.RepeatEvent(45000); + break; + case EVENT_FLAME_CINDER: + me->CastSpell(me, SPELL_FLAMING_CINDER, true); + events.RepeatEvent(30000); + break; + default: + break; + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_koralonAI(creature); + } }; class spell_voa_flaming_cinder : public SpellScriptLoader { - public: - spell_voa_flaming_cinder() : SpellScriptLoader("spell_voa_flaming_cinder") { } +public: + spell_voa_flaming_cinder() : SpellScriptLoader("spell_voa_flaming_cinder") { } - class spell_voa_flaming_cinder_SpellScript : public SpellScript + class spell_voa_flaming_cinder_SpellScript : public SpellScript + { + PrepareSpellScript(spell_voa_flaming_cinder_SpellScript); + + void HandleDummy(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_voa_flaming_cinder_SpellScript); - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - GetCaster()->CastSpell(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), SPELL_FLAMING_CINDER_MISSILE, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_voa_flaming_cinder_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_voa_flaming_cinder_SpellScript(); + if (Unit* target = GetHitUnit()) + GetCaster()->CastSpell(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), SPELL_FLAMING_CINDER_MISSILE, true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_voa_flaming_cinder_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_voa_flaming_cinder_SpellScript(); + } }; class spell_koralon_meteor_fists : public SpellScriptLoader { - public: - spell_koralon_meteor_fists() : SpellScriptLoader("spell_koralon_meteor_fists") { } +public: + spell_koralon_meteor_fists() : SpellScriptLoader("spell_koralon_meteor_fists") { } - class spell_koralon_meteor_fists_AuraScript : public AuraScript + class spell_koralon_meteor_fists_AuraScript : public AuraScript + { + PrepareAuraScript(spell_koralon_meteor_fists_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_koralon_meteor_fists_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_METEOR_FISTS_DAMAGE)) - return false; - return true; - } - - void TriggerFists(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_METEOR_FISTS_DAMAGE, true, NULL, aurEff); - } - - void Register() - { - OnEffectProc += AuraEffectProcFn(spell_koralon_meteor_fists_AuraScript::TriggerFists, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_koralon_meteor_fists_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_METEOR_FISTS_DAMAGE)) + return false; + return true; } + + void TriggerFists(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_METEOR_FISTS_DAMAGE, true, NULL, aurEff); + } + + void Register() + { + OnEffectProc += AuraEffectProcFn(spell_koralon_meteor_fists_AuraScript::TriggerFists, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_koralon_meteor_fists_AuraScript(); + } }; class spell_flame_warder_meteor_fists : public SpellScriptLoader { - public: - spell_flame_warder_meteor_fists() : SpellScriptLoader("spell_flame_warder_meteor_fists") { } +public: + spell_flame_warder_meteor_fists() : SpellScriptLoader("spell_flame_warder_meteor_fists") { } - class spell_flame_warder_meteor_fists_AuraScript : public AuraScript + class spell_flame_warder_meteor_fists_AuraScript : public AuraScript + { + PrepareAuraScript(spell_flame_warder_meteor_fists_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_flame_warder_meteor_fists_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_FW_METEOR_FISTS_DAMAGE)) - return false; - return true; - } - - void TriggerFists(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_FW_METEOR_FISTS_DAMAGE, true, NULL, aurEff); - } - - void Register() - { - OnEffectProc += AuraEffectProcFn(spell_flame_warder_meteor_fists_AuraScript::TriggerFists, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_flame_warder_meteor_fists_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_FW_METEOR_FISTS_DAMAGE)) + return false; + return true; } + + void TriggerFists(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_FW_METEOR_FISTS_DAMAGE, true, NULL, aurEff); + } + + void Register() + { + OnEffectProc += AuraEffectProcFn(spell_flame_warder_meteor_fists_AuraScript::TriggerFists, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_flame_warder_meteor_fists_AuraScript(); + } }; void AddSC_boss_koralon() diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp index 05d558b7d..8abcbf771 100644 --- a/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp +++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp @@ -59,7 +59,7 @@ public: } InstanceScript* pInstance; - + EventMap events; SummonList summons; @@ -73,8 +73,8 @@ public: { if (Aura* aur = me->AddAura(SPELL_STONED_AURA, me)) { - aur->SetMaxDuration(60 * MINUTE* IN_MILLISECONDS); - aur->SetDuration(60 * MINUTE* IN_MILLISECONDS); + aur->SetMaxDuration(60 * MINUTE * IN_MILLISECONDS); + aur->SetDuration(60 * MINUTE * IN_MILLISECONDS); } } pInstance->SetData(EVENT_TORAVON, NOT_STARTED); @@ -95,7 +95,7 @@ public: events.ScheduleEvent(EVENT_FROZEN_ORB_STALKER, 12000); events.ScheduleEvent(EVENT_FREEZING_GROUND, 7000); events.ScheduleEvent(EVENT_CAST_WHITEOUT, 25000); // schedule FIRST whiteout event in 25 seconds -1 for compesate updateai 2seconds check delay - + if (pInstance) pInstance->SetData(EVENT_TORAVON, IN_PROGRESS); } @@ -127,25 +127,25 @@ public: switch (events.GetEvent()) { - case EVENT_FREEZING_GROUND: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - me->CastSpell(target, SPELL_FREEZING_GROUND, false); - events.RepeatEvent(20000); - break; - case EVENT_FROZEN_ORB_STALKER: - me->CastCustomSpell(SPELL_FROZEN_ORB, SPELLVALUE_MAX_TARGETS, RAID_MODE(1, 3), me, false); - events.RepeatEvent(30000); - break; - case EVENT_CAST_WHITEOUT: - me->CastSpell(me, SPELL_WHITEOUT, false); - events.ScheduleEvent(EVENT_CAST_WHITEOUT_GROUND_EFFECT, 1000); // triggers after 1 sec "plus 1 from trigger to cast visual" - events.RepeatEvent(40000); // next whiteout instead first 25 SEC is now 45 SEC - break; - case EVENT_CAST_WHITEOUT_GROUND_EFFECT: // Whiteout Ground effect trigger - if (Unit* whiteOutGround = me->SummonCreature(NPC_WHITEOUT_GROUND_EFFECT, -43.3316, -288.708, 92.2511, 1.58825, TEMPSUMMON_TIMED_DESPAWN, 4000)) - whiteOutGround->CastSpell(whiteOutGround, SPELL_WHITEOUT_VISUAL, false); // Cast the spell - events.PopEvent(); - break; + case EVENT_FREEZING_GROUND: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + me->CastSpell(target, SPELL_FREEZING_GROUND, false); + events.RepeatEvent(20000); + break; + case EVENT_FROZEN_ORB_STALKER: + me->CastCustomSpell(SPELL_FROZEN_ORB, SPELLVALUE_MAX_TARGETS, RAID_MODE(1, 3), me, false); + events.RepeatEvent(30000); + break; + case EVENT_CAST_WHITEOUT: + me->CastSpell(me, SPELL_WHITEOUT, false); + events.ScheduleEvent(EVENT_CAST_WHITEOUT_GROUND_EFFECT, 1000); // triggers after 1 sec "plus 1 from trigger to cast visual" + events.RepeatEvent(40000); // next whiteout instead first 25 SEC is now 45 SEC + break; + case EVENT_CAST_WHITEOUT_GROUND_EFFECT: // Whiteout Ground effect trigger + if (Unit* whiteOutGround = me->SummonCreature(NPC_WHITEOUT_GROUND_EFFECT, -43.3316, -288.708, 92.2511, 1.58825, TEMPSUMMON_TIMED_DESPAWN, 4000)) + whiteOutGround->CastSpell(whiteOutGround, SPELL_WHITEOUT_VISUAL, false); // Cast the spell + events.PopEvent(); + break; } DoMeleeAttackIfReady(); diff --git a/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp index 7cb7b4738..665647233 100644 --- a/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp +++ b/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp @@ -21,258 +21,258 @@ class instance_vault_of_archavon : public InstanceMapScript { - public: - instance_vault_of_archavon() : InstanceMapScript("instance_vault_of_archavon", 624) { } +public: + instance_vault_of_archavon() : InstanceMapScript("instance_vault_of_archavon", 624) { } - struct instance_vault_of_archavon_InstanceMapScript : public InstanceScript + struct instance_vault_of_archavon_InstanceMapScript : public InstanceScript + { + instance_vault_of_archavon_InstanceMapScript(Map* map) : InstanceScript(map) { - instance_vault_of_archavon_InstanceMapScript(Map* map) : InstanceScript(map) - { - } + } - void Initialize() - { - memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); - memset(&bossGUIDs, 0, sizeof(bossGUIDs)); + void Initialize() + { + memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); + memset(&bossGUIDs, 0, sizeof(bossGUIDs)); - ArchavonDeath = 0; - EmalonDeath = 0; - KoralonDeath = 0; - checkTimer = 0; - stoned = false; - } + ArchavonDeath = 0; + EmalonDeath = 0; + KoralonDeath = 0; + checkTimer = 0; + stoned = false; + } - void OnPlayerEnter(Player* ) - { - if (stoned) - { - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (Creature* cr = instance->GetCreature(bossGUIDs[i])) - if (!cr->IsInCombat()) - cr->RemoveAllAuras(); - - stoned = false; - } - } - - void Update(uint32 diff) - { - checkTimer += diff; - if (checkTimer >= 60000) - { - checkTimer -= 60000; // one minute - if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG)) - { - if (!bf->IsWarTime()) - { - if (bf->GetTimer() <= (16 * MINUTE * IN_MILLISECONDS) && bf->GetTimer() >= (15 * MINUTE * IN_MILLISECONDS)) - { - Map::PlayerList const &PlayerList = instance->GetPlayers(); - if (!PlayerList.isEmpty()) - for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) - if (Player* player = i->GetSource()) - player->MonsterTextEmote("This instance will reset in 15 minutes.", 0, true); - } - else if (bf->GetTimer() <= (10 * MINUTE * IN_MILLISECONDS) && bf->GetTimer() >= (9 * MINUTE * IN_MILLISECONDS)) - { - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (Creature* cr = instance->GetCreature(bossGUIDs[i])) - if (!cr->IsInCombat()) - { - cr->RemoveAllAuras(); - if (Aura* aur = cr->AddAura(SPELL_STONED_AURA, cr)) - { - aur->SetMaxDuration(60 * MINUTE* IN_MILLISECONDS); - aur->SetDuration(60 * MINUTE* IN_MILLISECONDS); - } - } - - stoned = true; - } - else if (bf->GetTimer() <= (2 * MINUTE * IN_MILLISECONDS) && bf->GetTimer() > (MINUTE * IN_MILLISECONDS)) - { - Map::PlayerList const &PlayerList = instance->GetPlayers(); - if (!PlayerList.isEmpty()) - for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) - if (Player* player = i->GetSource()) - player->MonsterTextEmote("This instance is about to reset. Prepare to be removed.", 0, true); - } - else if (bf->GetTimer() <= MINUTE * IN_MILLISECONDS) - { - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (Creature* cr = instance->GetCreature(bossGUIDs[i])) - if (cr->IsInCombat() && cr->AI()) - cr->AI()->EnterEvadeMode(); - - Map::PlayerList const &PlayerList = instance->GetPlayers(); - if (!PlayerList.isEmpty()) - for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) - if (Player* player = i->GetSource()) - player->TeleportTo(player->m_homebindMapId, player->m_homebindX, player->m_homebindY, player->m_homebindZ, player->GetOrientation()); - } - } - } - } - } - - bool IsEncounterInProgress() const + void OnPlayerEnter(Player* ) + { + if (stoned) { for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) - return true; + if (Creature* cr = instance->GetCreature(bossGUIDs[i])) + if (!cr->IsInCombat()) + cr->RemoveAllAuras(); - Battlefield* bf = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); - if (!bf || bf->IsWarTime() || bf->GetTimer() <= 10 * MINUTE * IN_MILLISECONDS) + stoned = false; + } + } + + void Update(uint32 diff) + { + checkTimer += diff; + if (checkTimer >= 60000) + { + checkTimer -= 60000; // one minute + if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG)) + { + if (!bf->IsWarTime()) + { + if (bf->GetTimer() <= (16 * MINUTE * IN_MILLISECONDS) && bf->GetTimer() >= (15 * MINUTE * IN_MILLISECONDS)) + { + Map::PlayerList const& PlayerList = instance->GetPlayers(); + if (!PlayerList.isEmpty()) + for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) + if (Player* player = i->GetSource()) + player->MonsterTextEmote("This instance will reset in 15 minutes.", 0, true); + } + else if (bf->GetTimer() <= (10 * MINUTE * IN_MILLISECONDS) && bf->GetTimer() >= (9 * MINUTE * IN_MILLISECONDS)) + { + for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) + if (Creature* cr = instance->GetCreature(bossGUIDs[i])) + if (!cr->IsInCombat()) + { + cr->RemoveAllAuras(); + if (Aura* aur = cr->AddAura(SPELL_STONED_AURA, cr)) + { + aur->SetMaxDuration(60 * MINUTE * IN_MILLISECONDS); + aur->SetDuration(60 * MINUTE * IN_MILLISECONDS); + } + } + + stoned = true; + } + else if (bf->GetTimer() <= (2 * MINUTE * IN_MILLISECONDS) && bf->GetTimer() > (MINUTE * IN_MILLISECONDS)) + { + Map::PlayerList const& PlayerList = instance->GetPlayers(); + if (!PlayerList.isEmpty()) + for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) + if (Player* player = i->GetSource()) + player->MonsterTextEmote("This instance is about to reset. Prepare to be removed.", 0, true); + } + else if (bf->GetTimer() <= MINUTE * IN_MILLISECONDS) + { + for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) + if (Creature* cr = instance->GetCreature(bossGUIDs[i])) + if (cr->IsInCombat() && cr->AI()) + cr->AI()->EnterEvadeMode(); + + Map::PlayerList const& PlayerList = instance->GetPlayers(); + if (!PlayerList.isEmpty()) + for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) + if (Player* player = i->GetSource()) + player->TeleportTo(player->m_homebindMapId, player->m_homebindX, player->m_homebindY, player->m_homebindZ, player->GetOrientation()); + } + } + } + } + } + + bool IsEncounterInProgress() const + { + for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) + if (m_auiEncounter[i] == IN_PROGRESS) return true; - return false; + Battlefield* bf = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); + if (!bf || bf->IsWarTime() || bf->GetTimer() <= 10 * MINUTE * IN_MILLISECONDS) + return true; + + return false; + } + + void OnCreatureCreate(Creature* creature) + { + switch (creature->GetEntry()) + { + case CREATURE_TORAVON: + bossGUIDs[EVENT_TORAVON] = creature->GetGUID(); + break; + case CREATURE_ARCHAVON: + bossGUIDs[EVENT_ARCHAVON] = creature->GetGUID(); + break; + case CREATURE_KORALON: + bossGUIDs[EVENT_KORALON] = creature->GetGUID(); + break; + case CREATURE_EMALON: + bossGUIDs[EVENT_EMALON] = creature->GetGUID(); + break; + } + } + + uint64 GetData64(uint32 identifier) const + { + if (identifier < MAX_ENCOUNTER) + return bossGUIDs[identifier]; + return 0; + } + + uint32 GetData(uint32 identifier) const + { + if (identifier == DATA_STONED) + return (uint32)stoned; + return 0; + } + + void SetData(uint32 type, uint32 data) + { + switch(type) + { + case EVENT_ARCHAVON: + case EVENT_EMALON: + case EVENT_KORALON: + case EVENT_TORAVON: + m_auiEncounter[type] = data; + break; } - void OnCreatureCreate(Creature* creature) + if (data == DONE) { - switch (creature->GetEntry()) - { - case CREATURE_TORAVON: - bossGUIDs[EVENT_TORAVON] = creature->GetGUID(); - break; - case CREATURE_ARCHAVON: - bossGUIDs[EVENT_ARCHAVON] = creature->GetGUID(); - break; - case CREATURE_KORALON: - bossGUIDs[EVENT_KORALON] = creature->GetGUID(); - break; - case CREATURE_EMALON: - bossGUIDs[EVENT_EMALON] = creature->GetGUID(); - break; - } - } - - uint64 GetData64(uint32 identifier) const - { - if (identifier < MAX_ENCOUNTER) - return bossGUIDs[identifier]; - return 0; - } - - uint32 GetData(uint32 identifier) const - { - if (identifier == DATA_STONED) - return (uint32)stoned; - return 0; - } - - void SetData(uint32 type, uint32 data) - { - switch(type) + SaveToDB(); + switch (type) { case EVENT_ARCHAVON: - case EVENT_EMALON: - case EVENT_KORALON: - case EVENT_TORAVON: - m_auiEncounter[type] = data; + ArchavonDeath = time(nullptr); break; - } - - if (data == DONE) - { - SaveToDB(); - switch (type) - { - case EVENT_ARCHAVON: - ArchavonDeath = time(nullptr); - break; - case EVENT_EMALON: - EmalonDeath = time(nullptr); - break; - case EVENT_KORALON: - KoralonDeath = time(nullptr); - break; - default: - return; - } - - // on every death of Archavon, Emalon and Koralon check our achievement - DoCastSpellOnPlayers(SPELL_EARTH_WIND_FIRE_ACHIEVEMENT_CHECK); - } - } - - bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* /*source*/, Unit const* /*target*/, uint32 /*miscvalue1*/) - { - switch (criteria_id) - { - case CRITERIA_EARTH_WIND_FIRE_10: - case CRITERIA_EARTH_WIND_FIRE_25: - if (ArchavonDeath && EmalonDeath && KoralonDeath) - { - // instance difficulty check is already done in db (achievement_criteria_data) - // int() for Visual Studio, compile errors with abs(time_t) - return (abs(int(ArchavonDeath-EmalonDeath)) < MINUTE && \ - abs(int(EmalonDeath-KoralonDeath)) < MINUTE && \ - abs(int(KoralonDeath-ArchavonDeath)) < MINUTE); - } + case EVENT_EMALON: + EmalonDeath = time(nullptr); + break; + case EVENT_KORALON: + KoralonDeath = time(nullptr); break; default: - break; + return; } - return false; + // on every death of Archavon, Emalon and Koralon check our achievement + DoCastSpellOnPlayers(SPELL_EARTH_WIND_FIRE_ACHIEVEMENT_CHECK); } - - std::string GetSaveData() - { - OUT_SAVE_INST_DATA; - - std::ostringstream saveStream; - saveStream << "V O A " << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' ' << m_auiEncounter[2] << ' ' << m_auiEncounter[3]; - - OUT_SAVE_INST_DATA_COMPLETE; - return saveStream.str(); - } - - void Load(const char* in) - { - if (!in) - { - OUT_LOAD_INST_DATA_FAIL; - return; - } - - OUT_LOAD_INST_DATA(in); - - char dataHead1, dataHead2, dataHead3; - std::istringstream loadStream(in); - loadStream >> dataHead1 >> dataHead2 >> dataHead3; - - if (dataHead1 == 'V' && dataHead2 == 'O' && dataHead3 == 'A') - { - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - { - loadStream >> m_auiEncounter[i]; - if (m_auiEncounter[i] == IN_PROGRESS) - m_auiEncounter[i] = NOT_STARTED; - } - - OUT_LOAD_INST_DATA_COMPLETE; - } - else - OUT_LOAD_INST_DATA_FAIL; - } - - private: - time_t ArchavonDeath; - time_t EmalonDeath; - time_t KoralonDeath; - uint32 checkTimer; - bool stoned; - - uint32 m_auiEncounter[MAX_ENCOUNTER]; - uint64 bossGUIDs[MAX_ENCOUNTER]; - }; - - InstanceScript* GetInstanceScript(InstanceMap* map) const - { - return new instance_vault_of_archavon_InstanceMapScript(map); } + + bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* /*source*/, Unit const* /*target*/, uint32 /*miscvalue1*/) + { + switch (criteria_id) + { + case CRITERIA_EARTH_WIND_FIRE_10: + case CRITERIA_EARTH_WIND_FIRE_25: + if (ArchavonDeath && EmalonDeath && KoralonDeath) + { + // instance difficulty check is already done in db (achievement_criteria_data) + // int() for Visual Studio, compile errors with abs(time_t) + return (abs(int(ArchavonDeath - EmalonDeath)) < MINUTE && \ + abs(int(EmalonDeath - KoralonDeath)) < MINUTE && \ + abs(int(KoralonDeath - ArchavonDeath)) < MINUTE); + } + break; + default: + break; + } + + return false; + } + + std::string GetSaveData() + { + OUT_SAVE_INST_DATA; + + std::ostringstream saveStream; + saveStream << "V O A " << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' ' << m_auiEncounter[2] << ' ' << m_auiEncounter[3]; + + OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); + } + + void Load(const char* in) + { + if (!in) + { + OUT_LOAD_INST_DATA_FAIL; + return; + } + + OUT_LOAD_INST_DATA(in); + + char dataHead1, dataHead2, dataHead3; + std::istringstream loadStream(in); + loadStream >> dataHead1 >> dataHead2 >> dataHead3; + + if (dataHead1 == 'V' && dataHead2 == 'O' && dataHead3 == 'A') + { + for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) + { + loadStream >> m_auiEncounter[i]; + if (m_auiEncounter[i] == IN_PROGRESS) + m_auiEncounter[i] = NOT_STARTED; + } + + OUT_LOAD_INST_DATA_COMPLETE; + } + else + OUT_LOAD_INST_DATA_FAIL; + } + + private: + time_t ArchavonDeath; + time_t EmalonDeath; + time_t KoralonDeath; + uint32 checkTimer; + bool stoned; + + uint32 m_auiEncounter[MAX_ENCOUNTER]; + uint64 bossGUIDs[MAX_ENCOUNTER]; + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_vault_of_archavon_InstanceMapScript(map); + } }; void AddSC_instance_vault_of_archavon() diff --git a/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp b/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp index 3ff5c032c..d7d8ea179 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp @@ -56,7 +56,7 @@ public: struct boss_cyanigosaAI : public ScriptedAI { - boss_cyanigosaAI(Creature *c) : ScriptedAI(c) + boss_cyanigosaAI(Creature* c) : ScriptedAI(c) { pInstance = c->GetInstanceScript(); } @@ -75,9 +75,9 @@ public: Talk(SAY_AGGRO); events.Reset(); events.RescheduleEvent(EVENT_SPELL_ARCANE_VACUUM, 30000); - events.RescheduleEvent(EVENT_SPELL_BLIZZARD, urand(5000,10000)); - events.RescheduleEvent(EVENT_SPELL_TAIL_SWEEP, urand(15000,20000)); - events.RescheduleEvent(EVENT_SPELL_UNCONTROLLABLE_ENERGY, urand(5000,8000)); + events.RescheduleEvent(EVENT_SPELL_BLIZZARD, urand(5000, 10000)); + events.RescheduleEvent(EVENT_SPELL_TAIL_SWEEP, urand(15000, 20000)); + events.RescheduleEvent(EVENT_SPELL_UNCONTROLLABLE_ENERGY, urand(5000, 8000)); if (IsHeroic()) events.RescheduleEvent(EVENT_SPELL_MANA_DESTRUCTION, 20000); } @@ -89,7 +89,7 @@ public: switch(spell->Id) { case SPELL_ARCANE_VACUUM: - target->NearTeleportTo(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+10.0f, target->GetOrientation()); + target->NearTeleportTo(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 10.0f, target->GetOrientation()); break; } } @@ -133,11 +133,11 @@ public: break; case EVENT_SPELL_TAIL_SWEEP: me->CastSpell(me->GetVictim(), SPELL_TAIL_SWEEP, false); - events.RepeatEvent(urand(15000,20000)); + events.RepeatEvent(urand(15000, 20000)); break; case EVENT_SPELL_UNCONTROLLABLE_ENERGY: me->CastSpell(me->GetVictim(), SPELL_UNCONTROLLABLE_ENERGY, false); - events.RepeatEvent(urand(20000,25000)); + events.RepeatEvent(urand(20000, 25000)); break; } @@ -149,8 +149,8 @@ public: Talk(SAY_DEATH); if (pInstance) pInstance->SetData(DATA_BOSS_DIED, 0); - float h = me->GetMap()->GetHeight(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+2.0f); - if (h != INVALID_HEIGHT && me->GetPositionZ()-h > 3.0f) + float h = me->GetMap()->GetHeight(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 2.0f); + if (h != INVALID_HEIGHT && me->GetPositionZ() - h > 3.0f) { me->UpdatePosition(me->GetPositionX(), me->GetPositionY(), h, me->GetOrientation(), true); // move to ground me->StopMovingOnCurrentPos(); diff --git a/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp b/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp index 766ea24db..1ed445fe6 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp @@ -58,7 +58,7 @@ public: struct boss_erekemAI : public ScriptedAI { - boss_erekemAI(Creature *c) : ScriptedAI(c) + boss_erekemAI(Creature* c) : ScriptedAI(c) { pInstance = c->GetInstanceScript(); } @@ -78,11 +78,11 @@ public: DoCast(me, SPELL_EARTH_SHIELD); events.Reset(); events.RescheduleEvent(EVENT_SPELL_BLOODLUST, 15000); - events.RescheduleEvent(EVENT_SPELL_BREAK_BONDS, urand(9000,14000)); + events.RescheduleEvent(EVENT_SPELL_BREAK_BONDS, urand(9000, 14000)); events.RescheduleEvent(EVENT_SPELL_CHAIN_HEAL, 0); events.RescheduleEvent(EVENT_SPELL_EARTH_SHIELD, 20000); - events.RescheduleEvent(EVENT_SPELL_EARTH_SHOCK, urand(2000,8000)); - events.RescheduleEvent(EVENT_SPELL_LIGHTNING_BOLT, urand(5000,10000)); + events.RescheduleEvent(EVENT_SPELL_EARTH_SHOCK, urand(2000, 8000)); + events.RescheduleEvent(EVENT_SPELL_LIGHTNING_BOLT, urand(5000, 10000)); if (IsHeroic()) events.RescheduleEvent(EVENT_SPELL_STORMSTRIKE, 3000); @@ -110,11 +110,11 @@ public: break; case EVENT_SPELL_BLOODLUST: me->CastSpell((Unit*)NULL, SPELL_BLOODLUST, false); - events.RepeatEvent(urand(35000,45000)); + events.RepeatEvent(urand(35000, 45000)); break; case EVENT_SPELL_BREAK_BONDS: me->CastSpell((Unit*)NULL, SPELL_BREAK_BONDS, false); - events.RepeatEvent(urand(16000,22000)); + events.RepeatEvent(urand(16000, 22000)); break; case EVENT_SPELL_CHAIN_HEAL: if (uint64 TargetGUID = GetChainHealTargetGUID()) @@ -123,15 +123,15 @@ public: if (Creature* target = pInstance->instance->GetCreature(TargetGUID)) me->CastSpell(target, SPELL_CHAIN_HEAL, false); - Creature *pGuard1 = pInstance->instance->GetCreature(pInstance->GetData64(DATA_EREKEM_GUARD_1_GUID)); - Creature *pGuard2 = pInstance->instance->GetCreature(pInstance->GetData64(DATA_EREKEM_GUARD_2_GUID)); + Creature* pGuard1 = pInstance->instance->GetCreature(pInstance->GetData64(DATA_EREKEM_GUARD_1_GUID)); + Creature* pGuard2 = pInstance->instance->GetCreature(pInstance->GetData64(DATA_EREKEM_GUARD_2_GUID)); if ((pGuard1 && !pGuard1->IsAlive()) || (pGuard2 && !pGuard2->IsAlive())) { - events.RepeatEvent(urand(3000,6000)); + events.RepeatEvent(urand(3000, 6000)); break; } } - events.RepeatEvent(urand(8000,11000)); + events.RepeatEvent(urand(8000, 11000)); break; case EVENT_SPELL_EARTH_SHIELD: me->CastSpell(me, SPELL_EARTH_SHIELD, false); @@ -139,17 +139,17 @@ public: break; case EVENT_SPELL_EARTH_SHOCK: me->CastSpell(me->GetVictim(), SPELL_EARTH_SHOCK, false); - events.RepeatEvent(urand(8000,13000)); + events.RepeatEvent(urand(8000, 13000)); break; case EVENT_SPELL_LIGHTNING_BOLT: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 35.0f, true)) me->CastSpell(target, SPELL_LIGHTNING_BOLT, false); - events.RepeatEvent(urand(15000,25000)); + events.RepeatEvent(urand(15000, 25000)); break; case EVENT_SPELL_STORMSTRIKE: { - Creature *pGuard1 = pInstance->instance->GetCreature(pInstance->GetData64(DATA_EREKEM_GUARD_1_GUID)); - Creature *pGuard2 = pInstance->instance->GetCreature(pInstance->GetData64(DATA_EREKEM_GUARD_2_GUID)); + Creature* pGuard1 = pInstance->instance->GetCreature(pInstance->GetData64(DATA_EREKEM_GUARD_1_GUID)); + Creature* pGuard2 = pInstance->instance->GetCreature(pInstance->GetData64(DATA_EREKEM_GUARD_2_GUID)); if (pGuard1 && !pGuard1->IsAlive() && pGuard2 && !pGuard2->IsAlive()) // both dead me->CastSpell(me->GetVictim(), SPELL_STORMSTRIKE, false); events.RepeatEvent(3000); @@ -233,7 +233,7 @@ public: struct npc_erekem_guardAI : public ScriptedAI { - npc_erekem_guardAI(Creature *c) : ScriptedAI(c) + npc_erekem_guardAI(Creature* c) : ScriptedAI(c) { pInstance = c->GetInstanceScript(); } @@ -250,7 +250,7 @@ public: { DoZoneInCombat(); events.Reset(); - events.RescheduleEvent(EVENT_SPELL_GUSHING_WOUND, urand(1000,3000)); + events.RescheduleEvent(EVENT_SPELL_GUSHING_WOUND, urand(1000, 3000)); events.RescheduleEvent(EVENT_SPELL_HOWLING_SCREECH, urand(8000, 13000)); events.RescheduleEvent(EVENT_SPELL_STRIKE, urand(4000, 8000)); @@ -275,15 +275,15 @@ public: break; case EVENT_SPELL_GUSHING_WOUND: me->CastSpell(me->GetVictim(), SPELL_GUSHING_WOUND, false); - events.RepeatEvent(urand(7000,12000)); + events.RepeatEvent(urand(7000, 12000)); break; case EVENT_SPELL_HOWLING_SCREECH: me->CastSpell(me->GetVictim(), SPELL_HOWLING_SCREECH, false); - events.RepeatEvent(urand(8000,13000)); + events.RepeatEvent(urand(8000, 13000)); break; case EVENT_SPELL_STRIKE: me->CastSpell(me->GetVictim(), SPELL_STRIKE, false); - events.RepeatEvent(urand(4000,8000)); + events.RepeatEvent(urand(4000, 8000)); break; } diff --git a/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp b/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp index 1966e048e..9170a7353 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp @@ -12,7 +12,7 @@ #define ACTION_WATER_ELEMENT_KILLED 2 #define MAX_SPAWN_LOC 5 -static Position SpawnLoc[MAX_SPAWN_LOC]= +static Position SpawnLoc[MAX_SPAWN_LOC] = { {1840.64f, 795.407f, 44.079f, 1.676f}, {1886.24f, 757.733f, 47.750f, 5.201f}, @@ -74,7 +74,7 @@ public: struct boss_ichoronAI : public ScriptedAI { - boss_ichoronAI(Creature *c) : ScriptedAI(c), globules(me) + boss_ichoronAI(Creature* c) : ScriptedAI(c), globules(me) { pInstance = c->GetInstanceScript(); } @@ -92,7 +92,7 @@ public: bIsExploded = false; bIsFrenzy = false; uiDrainedTimer = 15000; - uiWaterBoltVolleyTimer = urand(7000,12000); + uiWaterBoltVolleyTimer = urand(7000, 12000); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetDisplayId(me->GetNativeDisplayId()); } @@ -113,7 +113,7 @@ public: break; case ACTION_WATER_ELEMENT_KILLED: uint32 damage = me->CountPctFromMaxHealth(3); - damage = std::min(damage, me->GetHealth()-1); + damage = std::min(damage, me->GetHealth() - 1); me->ModifyHealth(-int32(damage)); me->LowerPlayerDamageReq(damage); break; @@ -136,12 +136,12 @@ public: void IchoronDoCastToAllHostilePlayers(uint32 spellId, bool triggered) { - Map::PlayerList const &PlayerList = me->GetMap()->GetPlayers(); + Map::PlayerList const& PlayerList = me->GetMap()->GetPlayers(); if (PlayerList.isEmpty()) return; for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) - if (Player *plr = i->GetSource()) + if (Player* plr = i->GetSource()) me->CastSpell(plr, spellId, triggered); } @@ -150,7 +150,7 @@ public: bIsExploded = false; bIsFrenzy = false; uiDrainedTimer = 15000; - uiWaterBoltVolleyTimer = urand(7000,12000); + uiWaterBoltVolleyTimer = urand(7000, 12000); DoZoneInCombat(); Talk(SAY_AGGRO); me->CastSpell(me, SPELL_PROTECTIVE_BUBBLE, true); @@ -185,14 +185,14 @@ public: uiDrainedTimer = 15000; me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetDisplayId(11686); - for (uint8 i=0; iSetData(DATA_BOSS_DIED, 0); } - void KilledUnit(Unit * victim) + void KilledUnit(Unit* victim) { if (victim && victim->GetGUID() == me->GetGUID()) return; @@ -305,7 +305,7 @@ public: struct npc_ichor_globuleAI : public ScriptedAI { - npc_ichor_globuleAI(Creature *c) : ScriptedAI(c) + npc_ichor_globuleAI(Creature* c) : ScriptedAI(c) { pInstance = c->GetInstanceScript(); uiRangeCheck_Timer = 1000; @@ -326,7 +326,7 @@ public: { if (pInstance) if (Creature* pIchoron = pInstance->instance->GetCreature(pInstance->GetData64(DATA_ICHORON_GUID))) - if (me->IsWithinDist(pIchoron, 2.0f , false)) + if (me->IsWithinDist(pIchoron, 2.0f, false)) { if (pIchoron->AI()) pIchoron->AI()->DoAction(ACTION_WATER_ELEMENT_HIT); diff --git a/src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp b/src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp index e55c84096..1e86f555e 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp @@ -8,13 +8,13 @@ enum eSpells { - SPELL_CAUTERIZING_FLAMES = 59466, - SPELL_FIREBOLT_N = 54235, - SPELL_FIREBOLT_H = 59468, - SPELL_FLAME_BREATH_N = 54282, - SPELL_FLAME_BREATH_H = 59469, - SPELL_LAVA_BURN_N = 54249, - SPELL_LAVA_BURN_H = 59594, + SPELL_CAUTERIZING_FLAMES = 59466, + SPELL_FIREBOLT_N = 54235, + SPELL_FIREBOLT_H = 59468, + SPELL_FLAME_BREATH_N = 54282, + SPELL_FLAME_BREATH_H = 59469, + SPELL_LAVA_BURN_N = 54249, + SPELL_LAVA_BURN_H = 59594, }; #define SPELL_FIREBOLT DUNGEON_MODE(SPELL_FIREBOLT_N, SPELL_FIREBOLT_H) @@ -41,7 +41,7 @@ public: struct boss_lavanthorAI : public ScriptedAI { - boss_lavanthorAI(Creature *c) : ScriptedAI(c) + boss_lavanthorAI(Creature* c) : ScriptedAI(c) { pInstance = c->GetInstanceScript(); } @@ -81,19 +81,19 @@ public: break; case EVENT_SPELL_FIREBOLT: me->CastSpell(me->GetVictim(), SPELL_FIREBOLT, false); - events.RepeatEvent(urand(5000,13000)); + events.RepeatEvent(urand(5000, 13000)); break; case EVENT_SPELL_FLAME_BREATH: me->CastSpell(me->GetVictim(), SPELL_FLAME_BREATH, false); - events.RepeatEvent(urand(10000,15000)); + events.RepeatEvent(urand(10000, 15000)); break; case EVENT_SPELL_LAVA_BURN: me->CastSpell(me->GetVictim(), SPELL_LAVA_BURN, false); - events.RepeatEvent(urand(14000,20000)); + events.RepeatEvent(urand(14000, 20000)); break; case EVENT_SPELL_CAUTERIZING_FLAMES: me->CastSpell((Unit*)NULL, SPELL_FLAME_BREATH, false); - events.RepeatEvent(urand(10000,16000)); + events.RepeatEvent(urand(10000, 16000)); break; } diff --git a/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp b/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp index 29c7e7929..f937f8369 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp @@ -44,7 +44,7 @@ public: struct boss_moraggAI : public ScriptedAI { - boss_moraggAI(Creature *c) : ScriptedAI(c) + boss_moraggAI(Creature* c) : ScriptedAI(c) { pInstance = c->GetInstanceScript(); } @@ -63,8 +63,8 @@ public: me->CastSpell(me, SPELL_RAY_OF_SUFFERING, true); me->CastSpell(me, SPELL_RAY_OF_PAIN, true); events.Reset(); - events.RescheduleEvent(EVENT_SPELL_CORROSIVE_SALIVA, urand(4000,6000)); - events.RescheduleEvent(EVENT_SPELL_OPTIC_LINK, urand(10000,11000)); + events.RescheduleEvent(EVENT_SPELL_CORROSIVE_SALIVA, urand(4000, 6000)); + events.RescheduleEvent(EVENT_SPELL_OPTIC_LINK, urand(10000, 11000)); } void UpdateAI(uint32 diff) @@ -83,13 +83,13 @@ public: break; case EVENT_SPELL_CORROSIVE_SALIVA: me->CastSpell(me->GetVictim(), SPELL_CORROSIVE_SALIVA, false); - events.RepeatEvent(urand(8000,10000)); + events.RepeatEvent(urand(8000, 10000)); break; case EVENT_SPELL_OPTIC_LINK: if (Unit* target = SelectTarget(SELECT_TARGET_FARTHEST, 0, 40.0f, true)) { me->CastSpell(target, SPELL_OPTIC_LINK, false); - events.RepeatEvent(urand(18000,21000)); + events.RepeatEvent(urand(18000, 21000)); } else events.RepeatEvent(5000); @@ -127,12 +127,12 @@ public: { PrepareAuraScript(spell_optic_linkAuraScript) - void HandleEffectPeriodic(AuraEffect const * aurEff) + void HandleEffectPeriodic(AuraEffect const* aurEff) { if (Unit* target = GetTarget()) if (Unit* caster = GetCaster()) if (GetAura() && GetAura()->GetEffect(0)) - GetAura()->GetEffect(0)->SetAmount(aurEff->GetSpellInfo()->Effects[EFFECT_0].BasePoints+(((int32)target->GetExactDist(caster))*25)+(aurEff->GetTickNumber()*100)); + GetAura()->GetEffect(0)->SetAmount(aurEff->GetSpellInfo()->Effects[EFFECT_0].BasePoints + (((int32)target->GetExactDist(caster)) * 25) + (aurEff->GetTickNumber() * 100)); } void Register() @@ -141,7 +141,7 @@ public: } }; - AuraScript *GetAuraScript() const + AuraScript* GetAuraScript() const { return new spell_optic_linkAuraScript(); } diff --git a/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp b/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp index 6485e71f8..fe7e9c6cd 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp @@ -57,7 +57,7 @@ public: struct boss_xevozzAI : public ScriptedAI { - boss_xevozzAI(Creature *c) : ScriptedAI(c), spheres(me) + boss_xevozzAI(Creature* c) : ScriptedAI(c), spheres(me) { pInstance = c->GetInstanceScript(); } @@ -77,7 +77,7 @@ public: Talk(SAY_AGGRO); DoZoneInCombat(); events.Reset(); - events.RescheduleEvent(EVENT_SPELL_ARCANE_BARRAGE_VOLLEY, urand(16000,20000)); + events.RescheduleEvent(EVENT_SPELL_ARCANE_BARRAGE_VOLLEY, urand(16000, 20000)); events.RescheduleEvent(EVENT_SUMMON_SPHERES, 10000); } @@ -112,7 +112,8 @@ public: if (IsHeroic()) { uint32 entry2; - do { entry2 = RAND(SPELL_SUMMON_ETHEREAL_SPHERE_1, SPELL_SUMMON_ETHEREAL_SPHERE_2, SPELL_SUMMON_ETHEREAL_SPHERE_3); } while (entry1 == entry2); + do { entry2 = RAND(SPELL_SUMMON_ETHEREAL_SPHERE_1, SPELL_SUMMON_ETHEREAL_SPHERE_2, SPELL_SUMMON_ETHEREAL_SPHERE_3); } + while (entry1 == entry2); me->CastSpell((Unit*)NULL, entry2, true); } events.RepeatEvent(45000); @@ -159,7 +160,7 @@ public: } } - void SummonedCreatureDespawn(Creature *pSummoned) + void SummonedCreatureDespawn(Creature* pSummoned) { if (pSummoned) { diff --git a/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp b/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp index 037f9f3be..13e760cab 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp @@ -53,7 +53,7 @@ public: struct boss_zuramatAI : public ScriptedAI { - boss_zuramatAI(Creature *c) : ScriptedAI(c), summons(me) + boss_zuramatAI(Creature* c) : ScriptedAI(c), summons(me) { pInstance = c->GetInstanceScript(); } @@ -73,8 +73,8 @@ public: Talk(SAY_AGGRO); DoZoneInCombat(); events.Reset(); - events.RescheduleEvent(EVENT_SPELL_SHROUD_OF_DARKNESS, urand(5000,7000)); - events.RescheduleEvent(EVENT_SPELL_VOID_SHIFT, urand(23000,25000)); + events.RescheduleEvent(EVENT_SPELL_SHROUD_OF_DARKNESS, urand(5000, 7000)); + events.RescheduleEvent(EVENT_SPELL_VOID_SHIFT, urand(23000, 25000)); events.RescheduleEvent(EVENT_SPELL_SUMMON_VOID_SENTRY, 10000); if (pInstance) pInstance->SetData(DATA_ACHIEV, 1); @@ -105,7 +105,7 @@ public: me->CastSpell(target, SPELL_VOID_SHIFT, false); me->MonsterWhisper("Gaze... into the void.", target->ToPlayer(), false); } - events.RepeatEvent(urand(18000,22000)); + events.RepeatEvent(urand(18000, 22000)); break; case EVENT_SPELL_SUMMON_VOID_SENTRY: me->CastSpell((Unit*)NULL, SPELL_SUMMON_VOID_SENTRY, false); @@ -124,7 +124,7 @@ public: pInstance->SetData(DATA_BOSS_DIED, 0); } - void KilledUnit(Unit * victim) + void KilledUnit(Unit* victim) { if (victim && victim->GetGUID() == me->GetGUID()) return; @@ -143,7 +143,7 @@ public: } } - void SummonedCreatureDespawn(Creature *pSummoned) + void SummonedCreatureDespawn(Creature* pSummoned) { if (pSummoned) { @@ -180,7 +180,7 @@ public: struct npc_vh_void_sentryAI : public NullCreatureAI { - npc_vh_void_sentryAI(Creature *c) : NullCreatureAI(c) + npc_vh_void_sentryAI(Creature* c) : NullCreatureAI(c) { pInstance = c->GetInstanceScript(); SummonedGUID = 0; @@ -216,7 +216,7 @@ public: me->DespawnOrUnsummon(5000); } - void SummonedCreatureDespawn(Creature *pSummoned) + void SummonedCreatureDespawn(Creature* pSummoned) { if (pSummoned) pInstance->SetData64(DATA_DELETE_TRASH_MOB, pSummoned->GetGUID()); diff --git a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp index 33b393971..26f2bf76a 100644 --- a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp +++ b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp @@ -123,7 +123,7 @@ public: NPC_SinclariGUID = creature->GetGUID(); break; case NPC_VIOLET_HOLD_GUARD: - for (uint8 i=0; i<4; ++i) + for (uint8 i = 0; i < 4; ++i) if (NPC_GuardGUID[i] == 0) { NPC_GuardGUID[i] = creature->GetGUID(); @@ -238,9 +238,9 @@ public: PortalLocation = data; break; case DATA_DECRASE_DOOR_HEALTH: - if (GateHealth>0) + if (GateHealth > 0) --GateHealth; - if (GateHealth==0) + if (GateHealth == 0) { CLEANED = false; InstanceCleanup(); @@ -418,7 +418,7 @@ public: break; case EVENT_GUARDS_FALL_BACK: { - for (uint8 i=0; i<4; ++i) + for (uint8 i = 0; i < 4; ++i) if (Creature* c = instance->GetCreature(NPC_GuardGUID[i])) { c->SetReactState(REACT_PASSIVE); @@ -432,7 +432,7 @@ public: break; case EVENT_GUARDS_DISAPPEAR: { - for (uint8 i=0; i<4; ++i) + for (uint8 i = 0; i < 4; ++i) if (Creature* c = instance->GetCreature(NPC_GuardGUID[i])) c->SetVisible(false); events.PopEvent(); @@ -474,17 +474,18 @@ public: case EVENT_SUMMON_PORTAL: ++WaveCount; DoUpdateWorldState(WORLD_STATE_VH_WAVE_COUNT, (uint32)WaveCount); - SetData(DATA_PORTAL_LOCATION, (GetData(DATA_PORTAL_LOCATION) + urand(1, 5))%6); + SetData(DATA_PORTAL_LOCATION, (GetData(DATA_PORTAL_LOCATION) + urand(1, 5)) % 6); if (Creature* c = instance->GetCreature(NPC_SinclariGUID)) { - if (WaveCount%6 != 0) + if (WaveCount % 6 != 0) c->SummonCreature(NPC_TELEPORTATION_PORTAL, PortalLocations[GetData(DATA_PORTAL_LOCATION)], TEMPSUMMON_CORPSE_DESPAWN); else if (WaveCount == 6 || WaveCount == 12) // first or second boss { if (!uiFirstBoss || !uiSecondBoss) { - uiFirstBoss = urand(1,6); - do { uiSecondBoss = urand(1,6); } while (uiFirstBoss==uiSecondBoss); + uiFirstBoss = urand(1, 6); + do { uiSecondBoss = urand(1, 6); } + while (uiFirstBoss == uiSecondBoss); SaveToDB(); } c->SummonCreature(NPC_TELEPORTATION_PORTAL, MiddleRoomPortalSaboLocation, TEMPSUMMON_CORPSE_DESPAWN); @@ -539,13 +540,13 @@ public: bool DoNeedCleanup(bool enter) { uint8 aliveCount = 0; - Map::PlayerList const &pl = instance->GetPlayers(); + Map::PlayerList const& pl = instance->GetPlayers(); for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr ) if( Player* plr = itr->GetSource() ) if( plr->IsAlive() && !plr->IsGameMaster() && !plr->HasAura(27827)/*spirit of redemption aura*/ ) ++aliveCount; - bool need = enter ? aliveCount<=1 : aliveCount==0; + bool need = enter ? aliveCount <= 1 : aliveCount == 0; if( !need && CLEANED ) CLEANED = false; return need; @@ -567,12 +568,12 @@ public: // reset positions of Sinclari and Guards if (Creature* c = instance->GetCreature(NPC_SinclariGUID)) { c->DespawnOrUnsummon(); c->SetRespawnTime(3); } - for (uint8 i=0; i<4; ++i) + for (uint8 i = 0; i < 4; ++i) if (Creature* c = instance->GetCreature(NPC_GuardGUID[i])) { c->DespawnOrUnsummon(); c->SetRespawnTime(3); - if (m_auiEncounter[MAX_ENCOUNTER-1] == DONE) + if (m_auiEncounter[MAX_ENCOUNTER - 1] == DONE) c->SetVisible(false); else c->SetVisible(true); @@ -597,7 +598,7 @@ public: // open main gate HandleGameObject(GO_MainGateGUID, true); - if (m_auiEncounter[MAX_ENCOUNTER-1] != DONE) // instance not finished + if (m_auiEncounter[MAX_ENCOUNTER - 1] != DONE) // instance not finished { // close all cells HandleGameObject(GO_MoraggCellGUID, false); @@ -628,7 +629,7 @@ public: GateHealth = 100; WaveCount = 0; bDefensesUsed = false; - if (m_auiEncounter[MAX_ENCOUNTER-1] == DONE) + if (m_auiEncounter[MAX_ENCOUNTER - 1] == DONE) EncounterStatus = DONE; events.Reset(); events.RescheduleEvent(EVENT_CHECK_PLAYERS, CLEANUP_CHECK_INTERVAL); @@ -692,10 +693,10 @@ public: if (m_auiEncounter[i] == IN_PROGRESS) m_auiEncounter[i] = NOT_STARTED; - if (m_auiEncounter[MAX_ENCOUNTER-1] == DONE) + if (m_auiEncounter[MAX_ENCOUNTER - 1] == DONE) EncounterStatus = DONE; } - else OUT_LOAD_INST_DATA_FAIL; + else OUT_LOAD_INST_DATA_FAIL; OUT_LOAD_INST_DATA_COMPLETE; } diff --git a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp index b268866bb..975c6665c 100644 --- a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp +++ b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp @@ -47,12 +47,12 @@ public: switch (pInstance->GetData(DATA_ENCOUNTER_STATUS)) { case NOT_STARTED: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_START_EVENT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_START_EVENT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); SendGossipMenuFor(player, 13853, creature->GetGUID()); break; case IN_PROGRESS: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_I_WANT_IN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_I_WANT_IN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); SendGossipMenuFor(player, 13853, creature->GetGUID()); break; default: // DONE or invalid @@ -69,7 +69,7 @@ public: { case GOSSIP_ACTION_INFO_DEF+1: CloseGossipMenuFor(player); - if (InstanceScript *pInstance = creature->GetInstanceScript()) + if (InstanceScript* pInstance = creature->GetInstanceScript()) pInstance->SetData(DATA_START_INSTANCE, 1); break; case GOSSIP_ACTION_INFO_DEF+2: @@ -102,14 +102,14 @@ class npc_vh_teleportation_portal : public CreatureScript public: npc_vh_teleportation_portal() : CreatureScript("npc_vh_teleportation_portal") { } - CreatureAI* GetAI(Creature *creature) const + CreatureAI* GetAI(Creature* creature) const { return new npc_vh_teleportation_portalAI(creature); } struct npc_vh_teleportation_portalAI : public NullCreatureAI { - npc_vh_teleportation_portalAI(Creature *c) : NullCreatureAI(c), listOfMobs(me) + npc_vh_teleportation_portalAI(Creature* c) : NullCreatureAI(c), listOfMobs(me) { pInstance = c->GetInstanceScript(); events.Reset(); @@ -124,14 +124,14 @@ public: else addValue = 1; - if (wave%6 != 0) - events.RescheduleEvent(RAND(EVENT_SUMMON_KEEPER_OR_GUARDIAN,EVENT_SUMMON_ELITES), 10000); + if (wave % 6 != 0) + events.RescheduleEvent(RAND(EVENT_SUMMON_KEEPER_OR_GUARDIAN, EVENT_SUMMON_ELITES), 10000); else events.RescheduleEvent(EVENT_SUMMON_SABOTEOUR, 3000); } } - InstanceScript *pInstance; + InstanceScript* pInstance; SummonList listOfMobs; EventMap events; uint8 wave; @@ -153,13 +153,13 @@ public: case EVENT_SUMMON_KEEPER_OR_GUARDIAN: bKorG = true; spawned = true; - if (Creature *c = DoSummon(RAND(NPC_PORTAL_GUARDIAN, NPC_PORTAL_KEEPER), me, 2.0f, 0, TEMPSUMMON_DEAD_DESPAWN)) + if (Creature* c = DoSummon(RAND(NPC_PORTAL_GUARDIAN, NPC_PORTAL_KEEPER), me, 2.0f, 0, TEMPSUMMON_DEAD_DESPAWN)) me->CastSpell(c, SPELL_PORTAL_CHANNEL, false); events.PopEvent(); events.RescheduleEvent(EVENT_SUMMON_KEEPER_TRASH, 20000); break; case EVENT_SUMMON_KEEPER_TRASH: - for (uint8 i=0; i<3+addValue; ++i) + for (uint8 i = 0; i < 3 + addValue; ++i) { uint32 entry = RAND(NPC_AZURE_INVADER_1, NPC_AZURE_INVADER_2, NPC_AZURE_SPELLBREAKER_1, NPC_AZURE_SPELLBREAKER_2, NPC_AZURE_MAGE_SLAYER_1, NPC_AZURE_MAGE_SLAYER_2, NPC_AZURE_BINDER_1, NPC_AZURE_BINDER_2); DoSummon(entry, me, 2.0f, 20000, TEMPSUMMON_DEAD_DESPAWN); @@ -168,7 +168,7 @@ public: break; case EVENT_SUMMON_ELITES: spawned = true; - for (uint8 i=0; i<2+addValue; ++i) + for (uint8 i = 0; i < 2 + addValue; ++i) { uint32 entry = RAND(NPC_AZURE_CAPTAIN, NPC_AZURE_RAIDER, NPC_AZURE_STALKER, NPC_AZURE_SORCEROR); DoSummon(entry, me, 2.0f, 20000, TEMPSUMMON_DEAD_DESPAWN); @@ -212,13 +212,13 @@ public: void JustDied(Unit* /*killer*/) { events.Reset(); - if (wave%6 == 0) // just to be sure, shouln't occur + if (wave % 6 == 0) // just to be sure, shouln't occur return; if (pInstance) pInstance->SetData(DATA_PORTAL_DEFEATED, 0); } - void JustSummoned(Creature *pSummoned) + void JustSummoned(Creature* pSummoned) { if (pSummoned) { @@ -227,7 +227,7 @@ public: } } - void SummonedMobDied(Creature *pSummoned) + void SummonedMobDied(Creature* pSummoned) { if (pSummoned) { @@ -244,7 +244,7 @@ public: struct violet_hold_trashAI : public npc_escortAI { - violet_hold_trashAI(Creature *c) : npc_escortAI(c) + violet_hold_trashAI(Creature* c) : npc_escortAI(c) { pInstance = c->GetInstanceScript(); if (pInstance) @@ -287,8 +287,8 @@ struct violet_hold_trashAI : public npc_escortAI void WaypointReached(uint32 id) { - if (PLoc<6) - if (id == uint16(PLocWPCount[PLoc] -1 -(bAlt ? 1 : 0))) + if (PLoc < 6) + if (id == uint16(PLocWPCount[PLoc] - 1 - (bAlt ? 1 : 0))) CreatureStartAttackDoor(); } @@ -305,43 +305,43 @@ struct violet_hold_trashAI : public npc_escortAI switch(PLoc) { case 0: - for(int i=0;i<6;i++) - AddWaypoint(i, FirstPortalTrashWPs[i][0]+irand(-1, 1), FirstPortalTrashWPs[i][1]+irand(-1, 1), FirstPortalTrashWPs[i][2]+irand(-1, 1), 0); + for(int i = 0; i < 6; i++) + AddWaypoint(i, FirstPortalTrashWPs[i][0] + irand(-1, 1), FirstPortalTrashWPs[i][1] + irand(-1, 1), FirstPortalTrashWPs[i][2] + irand(-1, 1), 0); me->SetHomePosition(FirstPortalTrashWPs[5][0], FirstPortalTrashWPs[5][1], FirstPortalTrashWPs[5][2], 3.149439f); break; case 1: bAlt = (bool)urand(0, 1); if (!bAlt) { - for(int i=0;i<9;i++) - AddWaypoint(i, SecondPortalTrashWPs1[i][0]+irand(-1, 1), SecondPortalTrashWPs1[i][1]+irand(-1, 1), SecondPortalTrashWPs1[i][2], 0); - me->SetHomePosition(SecondPortalTrashWPs1[8][0]+irand(-1, 1), SecondPortalTrashWPs1[8][1]+irand(-1, 1), SecondPortalTrashWPs1[8][2]+irand(-1, 1), 3.149439f); + for(int i = 0; i < 9; i++) + AddWaypoint(i, SecondPortalTrashWPs1[i][0] + irand(-1, 1), SecondPortalTrashWPs1[i][1] + irand(-1, 1), SecondPortalTrashWPs1[i][2], 0); + me->SetHomePosition(SecondPortalTrashWPs1[8][0] + irand(-1, 1), SecondPortalTrashWPs1[8][1] + irand(-1, 1), SecondPortalTrashWPs1[8][2] + irand(-1, 1), 3.149439f); } else { - for(int i=0;i<8;i++) - AddWaypoint(i, SecondPortalTrashWPs2[i][0]+irand(-1, 1), SecondPortalTrashWPs2[i][1]+irand(-1, 1), SecondPortalTrashWPs2[i][2], 0); + for(int i = 0; i < 8; i++) + AddWaypoint(i, SecondPortalTrashWPs2[i][0] + irand(-1, 1), SecondPortalTrashWPs2[i][1] + irand(-1, 1), SecondPortalTrashWPs2[i][2], 0); me->SetHomePosition(SecondPortalTrashWPs2[7][0], SecondPortalTrashWPs2[7][1], SecondPortalTrashWPs2[7][2], 3.149439f); } break; case 2: - for(int i=0;i<8;i++) - AddWaypoint(i, ThirdPortalTrashWPs[i][0]+irand(-1, 1), ThirdPortalTrashWPs[i][1]+irand(-1, 1), ThirdPortalTrashWPs[i][2], 0); + for(int i = 0; i < 8; i++) + AddWaypoint(i, ThirdPortalTrashWPs[i][0] + irand(-1, 1), ThirdPortalTrashWPs[i][1] + irand(-1, 1), ThirdPortalTrashWPs[i][2], 0); me->SetHomePosition(ThirdPortalTrashWPs[7][0], ThirdPortalTrashWPs[7][1], ThirdPortalTrashWPs[7][2], 3.149439f); break; case 3: - for(int i=0;i<9;i++) - AddWaypoint(i, FourthPortalTrashWPs[i][0]+irand(-1, 1), FourthPortalTrashWPs[i][1]+irand(-1, 1), FourthPortalTrashWPs[i][2], 0); + for(int i = 0; i < 9; i++) + AddWaypoint(i, FourthPortalTrashWPs[i][0] + irand(-1, 1), FourthPortalTrashWPs[i][1] + irand(-1, 1), FourthPortalTrashWPs[i][2], 0); me->SetHomePosition(FourthPortalTrashWPs[8][0], FourthPortalTrashWPs[8][1], FourthPortalTrashWPs[8][2], 3.149439f); break; case 4: - for(int i=0;i<6;i++) - AddWaypoint(i, FifthPortalTrashWPs[i][0]+irand(-1, 1), FifthPortalTrashWPs[i][1]+irand(-1, 1), FifthPortalTrashWPs[i][2], 0); + for(int i = 0; i < 6; i++) + AddWaypoint(i, FifthPortalTrashWPs[i][0] + irand(-1, 1), FifthPortalTrashWPs[i][1] + irand(-1, 1), FifthPortalTrashWPs[i][2], 0); me->SetHomePosition(FifthPortalTrashWPs[5][0], FifthPortalTrashWPs[5][1], FifthPortalTrashWPs[5][2], 3.149439f); break; case 5: - for(int i=0;i<4;i++) - AddWaypoint(i, SixthPoralTrashWPs[i][0]+irand(-1, 1), SixthPoralTrashWPs[i][1]+irand(-1, 1), SixthPoralTrashWPs[i][2], 0); + for(int i = 0; i < 4; i++) + AddWaypoint(i, SixthPoralTrashWPs[i][0] + irand(-1, 1), SixthPoralTrashWPs[i][1] + irand(-1, 1), SixthPoralTrashWPs[i][2], 0); me->SetHomePosition(SixthPoralTrashWPs[3][0], SixthPoralTrashWPs[3][1], SixthPoralTrashWPs[3][2], 3.149439f); break; } @@ -371,7 +371,7 @@ struct violet_hold_trashAI : public npc_escortAI if (!HasEscortState(STATE_ESCORT_ESCORTING)) { me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC); - me->SetHomePosition(1845.577759f+rand_norm()*5-2.5f, 800.681152f+rand_norm()*5-2.5f, 44.104248f, M_PI); + me->SetHomePosition(1845.577759f + rand_norm() * 5 - 2.5f, 800.681152f + rand_norm() * 5 - 2.5f, 44.104248f, M_PI); } me->DeleteThreatList(); @@ -482,7 +482,7 @@ public: struct npc_azure_invaderAI : public violet_hold_trashAI { - npc_azure_invaderAI(Creature *c) : violet_hold_trashAI(c) {} + npc_azure_invaderAI(Creature* c) : violet_hold_trashAI(c) {} uint32 uiCleaveTimer; uint32 uiImpaleTimer; @@ -510,7 +510,8 @@ public: { DoCast(me->GetVictim(), SPELL_CLEAVE); uiCleaveTimer = 5000; - } else uiCleaveTimer -= diff; + } + else uiCleaveTimer -= diff; if (uiImpaleTimer <= diff) { @@ -518,7 +519,8 @@ public: if (pTarget) DoCast(pTarget, SPELL_IMPALE); uiImpaleTimer = 4000; - } else uiImpaleTimer -= diff; + } + else uiImpaleTimer -= diff; } if (me->GetEntry() == NPC_AZURE_INVADER_2) @@ -527,13 +529,15 @@ public: { DoCast(me->GetVictim(), SPELL_BRUTAL_STRIKE); uiBrutalStrikeTimer = 5000; - } else uiBrutalStrikeTimer -= diff; + } + else uiBrutalStrikeTimer -= diff; if (uiSunderArmorTimer <= diff) { DoCast(me->GetVictim(), SPELL_SUNDER_ARMOR); uiSunderArmorTimer = urand(8000, 10000); - } else uiSunderArmorTimer -= diff; + } + else uiSunderArmorTimer -= diff; } DoMeleeAttackIfReady(); @@ -555,7 +559,7 @@ public: struct npc_azure_binderAI : public violet_hold_trashAI { - npc_azure_binderAI(Creature *c) : violet_hold_trashAI(c) {} + npc_azure_binderAI(Creature* c) : violet_hold_trashAI(c) {} uint32 uiArcaneExplosionTimer; uint32 uiArcainBarrageTimer; @@ -583,7 +587,8 @@ public: { DoCast(SPELL_ARCANE_EXPLOSION); uiArcaneExplosionTimer = 5000; - } else uiArcaneExplosionTimer -= diff; + } + else uiArcaneExplosionTimer -= diff; if (uiArcainBarrageTimer <= diff) { @@ -591,7 +596,8 @@ public: if (pTarget) DoCast(pTarget, SPELL_ARCANE_BARRAGE); uiArcainBarrageTimer = 6000; - } else uiArcainBarrageTimer -= diff; + } + else uiArcainBarrageTimer -= diff; } if (me->GetEntry() == NPC_AZURE_BINDER_2) @@ -600,7 +606,8 @@ public: { DoCast(SPELL_FROST_NOVA); uiFrostNovaTimer = 5000; - } else uiFrostNovaTimer -= diff; + } + else uiFrostNovaTimer -= diff; if (uiFrostboltTimer <= diff) { @@ -608,7 +615,8 @@ public: if (pTarget) DoCast(pTarget, SPELL_FROSTBOLT); uiFrostboltTimer = 6000; - } else uiFrostboltTimer -= diff; + } + else uiFrostboltTimer -= diff; } DoMeleeAttackIfReady(); @@ -628,7 +636,7 @@ public: struct npc_azure_mage_slayerAI : public violet_hold_trashAI { - npc_azure_mage_slayerAI(Creature *c) : violet_hold_trashAI(c) {} + npc_azure_mage_slayerAI(Creature* c) : violet_hold_trashAI(c) {} uint32 uiArcaneEmpowermentTimer; uint32 uiSpellLockTimer; @@ -652,7 +660,8 @@ public: { DoCast(me, SPELL_ARCANE_EMPOWERMENT); uiArcaneEmpowermentTimer = 14000; - } else uiArcaneEmpowermentTimer -= diff; + } + else uiArcaneEmpowermentTimer -= diff; } if (me->GetEntry() == NPC_AZURE_MAGE_SLAYER_2) @@ -663,7 +672,8 @@ public: if (pTarget) DoCast(pTarget, SPELL_SPELL_LOCK); uiSpellLockTimer = 9000; - } else uiSpellLockTimer -= diff; + } + else uiSpellLockTimer -= diff; } DoMeleeAttackIfReady(); @@ -683,7 +693,7 @@ public: struct npc_azure_raiderAI : public violet_hold_trashAI { - npc_azure_raiderAI(Creature *c) : violet_hold_trashAI(c) {} + npc_azure_raiderAI(Creature* c) : violet_hold_trashAI(c) {} uint32 uiConcussionBlowTimer; uint32 uiMagicReflectionTimer; @@ -705,13 +715,15 @@ public: { DoCast(me->GetVictim(), SPELL_CONCUSSION_BLOW); uiConcussionBlowTimer = 5000; - } else uiConcussionBlowTimer -= diff; + } + else uiConcussionBlowTimer -= diff; if (uiMagicReflectionTimer <= diff) { DoCast(SPELL_MAGIC_REFLECTION); uiMagicReflectionTimer = urand(10000, 15000); - } else uiMagicReflectionTimer -= diff; + } + else uiMagicReflectionTimer -= diff; DoMeleeAttackIfReady(); } @@ -730,7 +742,7 @@ public: struct npc_azure_stalkerAI : public violet_hold_trashAI { - npc_azure_stalkerAI(Creature *c) : violet_hold_trashAI(c) {} + npc_azure_stalkerAI(Creature* c) : violet_hold_trashAI(c) {} uint32 uiBackstabTimer; uint32 uiTacticalBlinkTimer; @@ -740,7 +752,7 @@ public: { uiBackstabTimer = 1300; uiTacticalBlinkTimer = 8000; - TacticalBlinkCasted =false; + TacticalBlinkCasted = false; } void UpdateAI(uint32 diff) @@ -771,7 +783,8 @@ public: DoCast(pTarget, SPELL_BACKSTAB); TacticalBlinkCasted = false; uiBackstabTimer = 4000; - } else uiBackstabTimer -= diff; + } + else uiBackstabTimer -= diff; } DoMeleeAttackIfReady(); @@ -821,7 +834,8 @@ public: if (pTarget) DoCast(pTarget, SPELL_ARCANE_BLAST); uiArcaneBlastTimer = 6000; - } else uiArcaneBlastTimer -= diff; + } + else uiArcaneBlastTimer -= diff; if (uiSlowTimer <= diff) { @@ -829,7 +843,8 @@ public: if (pTarget) DoCast(pTarget, SPELL_SLOW); uiSlowTimer = 5000; - } else uiSlowTimer -= diff; + } + else uiSlowTimer -= diff; } if (me->GetEntry() == NPC_AZURE_SPELLBREAKER_2) @@ -840,13 +855,15 @@ public: if (pTarget) DoCast(pTarget, SPELL_CHAINS_OF_ICE); uiChainsOfIceTimer = 7000; - } else uiChainsOfIceTimer -= diff; + } + else uiChainsOfIceTimer -= diff; if (uiConeOfColdTimer <= diff) { - DoCast(SPELL_CONE_OF_COLD); + DoCast(SPELL_CONE_OF_COLD); uiConeOfColdTimer = 5000; - } else uiConeOfColdTimer -= diff; + } + else uiConeOfColdTimer -= diff; } DoMeleeAttackIfReady(); @@ -866,7 +883,7 @@ public: struct npc_azure_captainAI : public violet_hold_trashAI { - npc_azure_captainAI(Creature *c) : violet_hold_trashAI(c) {} + npc_azure_captainAI(Creature* c) : violet_hold_trashAI(c) {} uint32 uiMortalStrikeTimer; uint32 uiWhirlwindTimer; @@ -888,13 +905,15 @@ public: { DoCast(me->GetVictim(), SPELL_MORTAL_STRIKE); uiMortalStrikeTimer = 5000; - } else uiMortalStrikeTimer -= diff; + } + else uiMortalStrikeTimer -= diff; if (uiWhirlwindTimer <= diff) { DoCastAOE(SPELL_WHIRLWIND_OF_STEEL); uiWhirlwindTimer = 8000; - } else uiWhirlwindTimer -= diff; + } + else uiWhirlwindTimer -= diff; DoMeleeAttackIfReady(); } @@ -913,7 +932,7 @@ public: struct npc_azure_sorcerorAI : public violet_hold_trashAI { - npc_azure_sorcerorAI(Creature *c) : violet_hold_trashAI(c) {} + npc_azure_sorcerorAI(Creature* c) : violet_hold_trashAI(c) {} uint32 uiArcaneStreamTimer; uint32 uiArcaneStreamTimerStartingValueHolder; @@ -938,15 +957,17 @@ public: Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 35.0f, true); if (pTarget) DoCast(pTarget, SPELL_ARCANE_STREAM); - uiArcaneStreamTimer = urand(0, 5000)+5000; + uiArcaneStreamTimer = urand(0, 5000) + 5000; uiArcaneStreamTimerStartingValueHolder = uiArcaneStreamTimer; - } else uiArcaneStreamTimer -= diff; + } + else uiArcaneStreamTimer -= diff; - if (uiManaDetonationTimer <= diff && uiArcaneStreamTimer >=1500 && uiArcaneStreamTimer <= uiArcaneStreamTimerStartingValueHolder/2) + if (uiManaDetonationTimer <= diff && uiArcaneStreamTimer >= 1500 && uiArcaneStreamTimer <= uiArcaneStreamTimerStartingValueHolder / 2) { DoCastAOE(SPELL_MANA_DETONATION); uiManaDetonationTimer = urand(2000, 6000); - } else uiManaDetonationTimer -= diff; + } + else uiManaDetonationTimer -= diff; DoMeleeAttackIfReady(); } @@ -976,7 +997,7 @@ public: struct npc_azure_saboteurAI : public npc_escortAI { - npc_azure_saboteurAI(Creature *c) : npc_escortAI(c) + npc_azure_saboteurAI(Creature* c) : npc_escortAI(c) { pInstance = c->GetInstanceScript(); uiBoss = 0; @@ -1037,17 +1058,17 @@ public: switch(uiBoss) { case 1: - for(int i=0;i<3;i++) + for(int i = 0; i < 3; i++) AddWaypoint(i, SaboteurFinalPos1[i][0], SaboteurFinalPos1[i][1], SaboteurFinalPos1[i][2], 0); me->SetHomePosition(SaboteurFinalPos1[2][0], SaboteurFinalPos1[2][1], SaboteurFinalPos1[2][2], 4.762346f); break; case 2: - for(int i=0;i<3;i++) + for(int i = 0; i < 3; i++) AddWaypoint(i, SaboteurFinalPos2[i][0], SaboteurFinalPos2[i][1], SaboteurFinalPos2[i][2], 0); me->SetHomePosition(SaboteurFinalPos2[2][0], SaboteurFinalPos2[2][1], SaboteurFinalPos2[2][2], 1.862674f); break; case 3: - for(int i=0;i<2;i++) + for(int i = 0; i < 2; i++) AddWaypoint(i, SaboteurFinalPos3[i][0], SaboteurFinalPos3[i][1], SaboteurFinalPos3[i][2], 0); me->SetHomePosition(SaboteurFinalPos3[1][0], SaboteurFinalPos3[1][1], SaboteurFinalPos3[1][2], 5.500638f); break; @@ -1060,7 +1081,7 @@ public: me->SetHomePosition(SaboteurFinalPos5[0], SaboteurFinalPos5[1], SaboteurFinalPos5[2], 1.100841f); break; case 6: - for(int i=0;i<5;i++) + for(int i = 0; i < 5; i++) AddWaypoint(i, SaboteurFinalPos6[i][0], SaboteurFinalPos6[i][1], SaboteurFinalPos6[i][2], 0); me->SetHomePosition(SaboteurFinalPos6[4][0], SaboteurFinalPos6[4][1], SaboteurFinalPos6[4][2], 0.983031f); break; @@ -1124,7 +1145,7 @@ public: { PrepareAuraScript(spell_destroy_door_sealAuraScript) - void HandleEffectPeriodic(AuraEffect const * /*aurEff*/) + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) { PreventDefaultAction(); if (Unit* target = GetTarget()) @@ -1138,7 +1159,7 @@ public: } }; - AuraScript *GetAuraScript() const + AuraScript* GetAuraScript() const { return new spell_destroy_door_sealAuraScript(); } diff --git a/src/server/scripts/Northrend/VioletHold/violet_hold.h b/src/server/scripts/Northrend/VioletHold/violet_hold.h index cb05c62c3..38f5a922f 100644 --- a/src/server/scripts/Northrend/VioletHold/violet_hold.h +++ b/src/server/scripts/Northrend/VioletHold/violet_hold.h @@ -1,6 +1,6 @@ /* * Originally written by Pussywizard - Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license: https://github.com/azerothcore/azerothcore-wotlk/blob/master/LICENSE-AGPL3 -*/ +*/ #ifndef DEF_VIOLET_HOLD_H #define DEF_VIOLET_HOLD_H @@ -79,7 +79,7 @@ enum VHWorldStates enum Spells { - SPELL_CONTROL_CRYSTAL_ACTIVATION= 57804, + SPELL_CONTROL_CRYSTAL_ACTIVATION = 57804, SPELL_ARCANE_LIGHTNING = 57912, SPELL_ARCANE_LIGHTNING_VISUAL = 57930, SPELL_PORTAL_CHANNEL = 58012, @@ -153,7 +153,7 @@ const Position BossStartMove6 = {1928.207031f, 852.864441f, 47.200813f, 0.0f}; const Position CyanigosasSpawnLocation = {1930.281250f, 804.407715f, 52.410946f, 3.139621f}; const Position MiddleRoomLocation = {1892.291260f, 805.696838f, 38.438862f, 3.139621f}; -const uint8 PLocWPCount[6] = {6,9,8,9,6,4}; +const uint8 PLocWPCount[6] = {6, 9, 8, 9, 6, 4}; const Position PortalLocations[] = { diff --git a/src/server/scripts/Northrend/isle_of_conquest.cpp b/src/server/scripts/Northrend/isle_of_conquest.cpp index 7699b2c7d..ec6ea9991 100644 --- a/src/server/scripts/Northrend/isle_of_conquest.cpp +++ b/src/server/scripts/Northrend/isle_of_conquest.cpp @@ -20,111 +20,111 @@ enum eIoCTurrent class npc_isle_of_conquest_turret : public CreatureScript { - public: - npc_isle_of_conquest_turret() : CreatureScript("npc_isle_of_conquest_turret") {} +public: + npc_isle_of_conquest_turret() : CreatureScript("npc_isle_of_conquest_turret") {} - struct npc_isle_of_conquest_turretAI : public VehicleAI + struct npc_isle_of_conquest_turretAI : public VehicleAI + { + npc_isle_of_conquest_turretAI(Creature* creature) : VehicleAI(creature), faction(0) { } + + uint32 faction; + EventMap events; + + void JustDied(Unit* ) { - npc_isle_of_conquest_turretAI(Creature* creature) : VehicleAI(creature), faction(0) { } - - uint32 faction; - EventMap events; - - void JustDied(Unit* ) + if (me->GetEntry() == NPC_KEEP_CANNON) { - if (me->GetEntry() == NPC_KEEP_CANNON) - { - faction = me->getFaction(); - me->Respawn(); - me->UpdateEntry(NPC_BROKEN_KEEP_CANNON, NULL, false); - me->RemoveVehicleKit(); - me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); - } + faction = me->getFaction(); + me->Respawn(); + me->UpdateEntry(NPC_BROKEN_KEEP_CANNON, NULL, false); + me->RemoveVehicleKit(); + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); } - - void SpellHit(Unit* /*caster*/, SpellInfo const* spellInfo) - { - if (spellInfo->Id == SPELL_REPAIR_TURRET_DUMMY && me->GetEntry() == NPC_BROKEN_KEEP_CANNON) - { - me->UpdateEntry(NPC_KEEP_CANNON, NULL, false); - if (faction) - me->setFaction(faction); - me->CreateVehicleKit(510, NPC_KEEP_CANNON); - me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); - events.ScheduleEvent(EVENT_RESTORE_FLAG, 4000); - } - } - - void UpdateAI(uint32 diff) - { - events.Update(diff); - switch (events.ExecuteEvent()) - { - case EVENT_RESTORE_FLAG: - me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); - break; - } - - VehicleAI::UpdateAI(diff); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_isle_of_conquest_turretAI(creature); } + + void SpellHit(Unit* /*caster*/, SpellInfo const* spellInfo) + { + if (spellInfo->Id == SPELL_REPAIR_TURRET_DUMMY && me->GetEntry() == NPC_BROKEN_KEEP_CANNON) + { + me->UpdateEntry(NPC_KEEP_CANNON, NULL, false); + if (faction) + me->setFaction(faction); + me->CreateVehicleKit(510, NPC_KEEP_CANNON); + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); + events.ScheduleEvent(EVENT_RESTORE_FLAG, 4000); + } + } + + void UpdateAI(uint32 diff) + { + events.Update(diff); + switch (events.ExecuteEvent()) + { + case EVENT_RESTORE_FLAG: + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); + break; + } + + VehicleAI::UpdateAI(diff); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_isle_of_conquest_turretAI(creature); + } }; class npc_four_car_garage : public CreatureScript { - public: - npc_four_car_garage() : CreatureScript("npc_four_car_garage") {} +public: + npc_four_car_garage() : CreatureScript("npc_four_car_garage") {} - struct npc_four_car_garageAI : public NullCreatureAI + struct npc_four_car_garageAI : public NullCreatureAI + { + npc_four_car_garageAI(Creature* creature) : NullCreatureAI(creature) { } + + void PassengerBoarded(Unit* who, int8 /*seatId*/, bool apply) { - npc_four_car_garageAI(Creature* creature) : NullCreatureAI(creature) { } - - void PassengerBoarded(Unit* who, int8 /*seatId*/, bool apply) + if (apply) { - if (apply) + uint32 spellId = 0; + + switch (me->GetEntry()) { - uint32 spellId = 0; - - switch (me->GetEntry()) - { - case NPC_DEMOLISHER: - spellId = SPELL_DRIVING_CREDIT_DEMOLISHER; - break; - case NPC_GLAIVE_THROWER_A: - case NPC_GLAIVE_THROWER_H: - spellId = SPELL_DRIVING_CREDIT_GLAIVE; - break; - case NPC_SIEGE_ENGINE_H: - case NPC_SIEGE_ENGINE_A: - spellId = SPELL_DRIVING_CREDIT_SIEGE; - break; - case NPC_CATAPULT: - spellId = SPELL_DRIVING_CREDIT_CATAPULT; - break; - default: - return; - } - - me->CastSpell(who, spellId, true); + case NPC_DEMOLISHER: + spellId = SPELL_DRIVING_CREDIT_DEMOLISHER; + break; + case NPC_GLAIVE_THROWER_A: + case NPC_GLAIVE_THROWER_H: + spellId = SPELL_DRIVING_CREDIT_GLAIVE; + break; + case NPC_SIEGE_ENGINE_H: + case NPC_SIEGE_ENGINE_A: + spellId = SPELL_DRIVING_CREDIT_SIEGE; + break; + case NPC_CATAPULT: + spellId = SPELL_DRIVING_CREDIT_CATAPULT; + break; + default: + return; } - } - void JustDied(Unit* killer) - { - if (Player* player = killer->GetCharmerOrOwnerPlayerOrPlayerItself()) - player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, 1, 0, me); + me->CastSpell(who, spellId, true); } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_four_car_garageAI(creature); } + + void JustDied(Unit* killer) + { + if (Player* player = killer->GetCharmerOrOwnerPlayerOrPlayerItself()) + player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, 1, 0, me); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_four_car_garageAI(creature); + } }; enum Events @@ -140,53 +140,53 @@ enum Texts class npc_ioc_gunship_captain : public CreatureScript { - public: - npc_ioc_gunship_captain() : CreatureScript("npc_ioc_gunship_captain") { } +public: + npc_ioc_gunship_captain() : CreatureScript("npc_ioc_gunship_captain") { } - struct npc_ioc_gunship_captainAI : public ScriptedAI + struct npc_ioc_gunship_captainAI : public ScriptedAI + { + npc_ioc_gunship_captainAI(Creature* creature) : ScriptedAI(creature) { } + + void DoAction(int32 action) { - npc_ioc_gunship_captainAI(Creature* creature) : ScriptedAI(creature) { } - - void DoAction(int32 action) + if (action == ACTION_GUNSHIP_READY) { - if (action == ACTION_GUNSHIP_READY) - { - DoCast(me, SPELL_SIMPLE_TELEPORT); - _events.ScheduleEvent(EVENT_TALK, 3000); - } + DoCast(me, SPELL_SIMPLE_TELEPORT); + _events.ScheduleEvent(EVENT_TALK, 3000); } - - void UpdateAI(uint32 diff) - { - _events.Update(diff); - while (uint32 eventId = _events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_TALK: - _events.ScheduleEvent(EVENT_DESPAWN, 1000); - Talk(SAY_ONBOARD); - DoCast(me, SPELL_TELEPORT_VISUAL_ONLY); - break; - case EVENT_DESPAWN: - if (me->GetMap()->ToBattlegroundMap()) - if (Battleground* bgIoC = me->GetMap()->ToBattlegroundMap()->GetBG()) - bgIoC->DelCreature(BG_IC_NPC_GUNSHIP_CAPTAIN_1); - break; - default: - break; - } - } - } - - private: - EventMap _events; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_ioc_gunship_captainAI(creature); } + + void UpdateAI(uint32 diff) + { + _events.Update(diff); + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_TALK: + _events.ScheduleEvent(EVENT_DESPAWN, 1000); + Talk(SAY_ONBOARD); + DoCast(me, SPELL_TELEPORT_VISUAL_ONLY); + break; + case EVENT_DESPAWN: + if (me->GetMap()->ToBattlegroundMap()) + if (Battleground* bgIoC = me->GetMap()->ToBattlegroundMap()->GetBG()) + bgIoC->DelCreature(BG_IC_NPC_GUNSHIP_CAPTAIN_1); + break; + default: + break; + } + } + } + + private: + EventMap _events; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_ioc_gunship_captainAI(creature); + } }; enum BossIoCEvents @@ -207,115 +207,115 @@ enum BossIoCSpells class boss_isle_of_conquest : public CreatureScript { - public: - boss_isle_of_conquest() : CreatureScript("boss_isle_of_conquest") {} +public: + boss_isle_of_conquest() : CreatureScript("boss_isle_of_conquest") {} - struct boss_isle_of_conquestAI : public ScriptedAI + struct boss_isle_of_conquestAI : public ScriptedAI + { + boss_isle_of_conquestAI(Creature* creature) : ScriptedAI(creature) { } + + EventMap events; + bool rage; + void Reset() { - boss_isle_of_conquestAI(Creature* creature) : ScriptedAI(creature) { } - - EventMap events; - bool rage; - void Reset() - { - events.Reset(); - rage = false; - } - - void CheckRageBuff() - { - if (!rage) - { - if (me->GetDistance(me->GetHomePosition()) > 40.0f) - { - rage = true; - me->CastSpell(me, SPELL_IOCBOSS_RAGE, true); - } - } - else - { - if (me->GetDistance(me->GetHomePosition()) < 40.0f && abs(me->GetPositionZ() - me->GetHomePosition().GetPositionZ()) < 5.0f) - { - rage = false; - me->RemoveAurasDueToSpell(SPELL_IOCBOSS_RAGE); - } - } - } - - void EnterCombat(Unit* /*who*/) - { - events.ScheduleEvent(EVENT_CHECK_RAGE, 2000); - events.ScheduleEvent(EVENT_BRUTAL_STRIKE, 6000); - events.ScheduleEvent(EVENT_CRUSHING_LEAP, 22000); - events.ScheduleEvent(EVENT_DAGGER_THROW, 10000); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.GetEvent()) - { - case EVENT_CHECK_RAGE: - CheckRageBuff(); - events.RepeatEvent(2000); - break; - case EVENT_BRUTAL_STRIKE: - me->CastSpell(me->GetVictim(), SPELL_IOCBOSS_BRUTAL_STRIKE, false); - events.RepeatEvent(6000); - break; - case EVENT_CRUSHING_LEAP: - me->CastSpell(me, SPELL_IOCBOSS_CRUSHING_LEAP, false); - events.RepeatEvent(22000); - break; - case EVENT_DAGGER_THROW: - if (Unit* tgt = SelectTarget(SELECT_TARGET_RANDOM)) - me->CastSpell(tgt, SPELL_IOCBOSS_DAGGER_THROW, false); - - events.RepeatEvent(10000); - break; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_isle_of_conquestAI(creature); + events.Reset(); + rage = false; } + + void CheckRageBuff() + { + if (!rage) + { + if (me->GetDistance(me->GetHomePosition()) > 40.0f) + { + rage = true; + me->CastSpell(me, SPELL_IOCBOSS_RAGE, true); + } + } + else + { + if (me->GetDistance(me->GetHomePosition()) < 40.0f && abs(me->GetPositionZ() - me->GetHomePosition().GetPositionZ()) < 5.0f) + { + rage = false; + me->RemoveAurasDueToSpell(SPELL_IOCBOSS_RAGE); + } + } + } + + void EnterCombat(Unit* /*who*/) + { + events.ScheduleEvent(EVENT_CHECK_RAGE, 2000); + events.ScheduleEvent(EVENT_BRUTAL_STRIKE, 6000); + events.ScheduleEvent(EVENT_CRUSHING_LEAP, 22000); + events.ScheduleEvent(EVENT_DAGGER_THROW, 10000); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.GetEvent()) + { + case EVENT_CHECK_RAGE: + CheckRageBuff(); + events.RepeatEvent(2000); + break; + case EVENT_BRUTAL_STRIKE: + me->CastSpell(me->GetVictim(), SPELL_IOCBOSS_BRUTAL_STRIKE, false); + events.RepeatEvent(6000); + break; + case EVENT_CRUSHING_LEAP: + me->CastSpell(me, SPELL_IOCBOSS_CRUSHING_LEAP, false); + events.RepeatEvent(22000); + break; + case EVENT_DAGGER_THROW: + if (Unit* tgt = SelectTarget(SELECT_TARGET_RANDOM)) + me->CastSpell(tgt, SPELL_IOCBOSS_DAGGER_THROW, false); + + events.RepeatEvent(10000); + break; + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_isle_of_conquestAI(creature); + } }; class spell_ioc_repair_turret : public SpellScriptLoader { - public: - spell_ioc_repair_turret() : SpellScriptLoader("spell_ioc_repair_turret") { } +public: + spell_ioc_repair_turret() : SpellScriptLoader("spell_ioc_repair_turret") { } - class spell_ioc_repair_turret_AuraScript : public AuraScript + class spell_ioc_repair_turret_AuraScript : public AuraScript + { + PrepareAuraScript(spell_ioc_repair_turret_AuraScript); + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_ioc_repair_turret_AuraScript); - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE) - GetTarget()->CastSpell(GetTarget(), SPELL_REPAIR_TURRET_DUMMY, true); - } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_ioc_repair_turret_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_ioc_repair_turret_AuraScript(); + if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE) + GetTarget()->CastSpell(GetTarget(), SPELL_REPAIR_TURRET_DUMMY, true); } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_ioc_repair_turret_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_ioc_repair_turret_AuraScript(); + } }; enum blastCriteria @@ -329,161 +329,161 @@ enum blastCriteria class spell_ioc_bomb_blast_criteria : public SpellScriptLoader { - public: - spell_ioc_bomb_blast_criteria() : SpellScriptLoader("spell_ioc_bomb_blast_criteria") { } +public: + spell_ioc_bomb_blast_criteria() : SpellScriptLoader("spell_ioc_bomb_blast_criteria") { } - class spell_ioc_bomb_blast_criteria_SpellScript : public SpellScript + class spell_ioc_bomb_blast_criteria_SpellScript : public SpellScript + { + PrepareSpellScript(spell_ioc_bomb_blast_criteria_SpellScript); + + void HandleGameObjectDamage(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_ioc_bomb_blast_criteria_SpellScript); + Unit* owner = GetCaster()->GetOwner(); + if (!owner) + return; - void HandleGameObjectDamage(SpellEffIndex /*effIndex*/) - { - Unit* owner = GetCaster()->GetOwner(); - if (!owner) - return; - - if (GetSpellInfo()->Id == SPELL_SEAFORIUM_BLAST) - owner->CastSpell(owner, SPELL_BOMB_INABLE_CREDIT, true); - else if (GetSpellInfo()->Id == SPELL_HUGE_SEAFORIUM_BLAST) - owner->CastSpell(owner, SPELL_BOMB_INATION_CREDIT, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_ioc_bomb_blast_criteria_SpellScript::HandleGameObjectDamage, EFFECT_1, SPELL_EFFECT_GAMEOBJECT_DAMAGE); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_ioc_bomb_blast_criteria_SpellScript(); + if (GetSpellInfo()->Id == SPELL_SEAFORIUM_BLAST) + owner->CastSpell(owner, SPELL_BOMB_INABLE_CREDIT, true); + else if (GetSpellInfo()->Id == SPELL_HUGE_SEAFORIUM_BLAST) + owner->CastSpell(owner, SPELL_BOMB_INATION_CREDIT, true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_ioc_bomb_blast_criteria_SpellScript::HandleGameObjectDamage, EFFECT_1, SPELL_EFFECT_GAMEOBJECT_DAMAGE); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_ioc_bomb_blast_criteria_SpellScript(); + } }; class spell_ioc_gunship_portal : public SpellScriptLoader { - public: - spell_ioc_gunship_portal() : SpellScriptLoader("spell_ioc_gunship_portal") { } +public: + spell_ioc_gunship_portal() : SpellScriptLoader("spell_ioc_gunship_portal") { } - class spell_ioc_gunship_portal_SpellScript : public SpellScript + class spell_ioc_gunship_portal_SpellScript : public SpellScript + { + PrepareSpellScript(spell_ioc_gunship_portal_SpellScript); + + bool Load() { - PrepareSpellScript(spell_ioc_gunship_portal_SpellScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - /*Player* caster = GetCaster()->ToPlayer(); - * - * HACK: GetWorldLocation() returns real position and not transportposition. - * ServertoClient: SMSG_MOVE_TELEPORT (0x0B39) - * counter: 45 - * Tranpsort Guid: Full: xxxx Type: MOTransport Low: xxx - * Transport Position X: 0 Y: 0 Z: 0 O: 0 - * Position: X: 7.305609 Y: -0.095246 Z: 34.51022 O: 0 - - caster->TeleportTo(GetHitCreature()->GetWorldLocation(), TELE_TO_NOT_LEAVE_TRANSPORT);*/ - } - - void HandleScript2(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - Player* caster = GetCaster()->ToPlayer(); - if (!caster->IsBeingTeleported()) - if (Battleground* bg = caster->GetBattleground()) - bg->DoAction(2 /**/, caster->GetGUID()); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_ioc_gunship_portal_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - OnEffectHitTarget += SpellEffectFn(spell_ioc_gunship_portal_SpellScript::HandleScript2, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_ioc_gunship_portal_SpellScript(); + return GetCaster()->GetTypeId() == TYPEID_PLAYER; } + + void HandleScript(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + /*Player* caster = GetCaster()->ToPlayer(); + * + * HACK: GetWorldLocation() returns real position and not transportposition. + * ServertoClient: SMSG_MOVE_TELEPORT (0x0B39) + * counter: 45 + * Tranpsort Guid: Full: xxxx Type: MOTransport Low: xxx + * Transport Position X: 0 Y: 0 Z: 0 O: 0 + * Position: X: 7.305609 Y: -0.095246 Z: 34.51022 O: 0 + + caster->TeleportTo(GetHitCreature()->GetWorldLocation(), TELE_TO_NOT_LEAVE_TRANSPORT);*/ + } + + void HandleScript2(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + Player* caster = GetCaster()->ToPlayer(); + if (!caster->IsBeingTeleported()) + if (Battleground* bg = caster->GetBattleground()) + bg->DoAction(2 /**/, caster->GetGUID()); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_ioc_gunship_portal_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + OnEffectHitTarget += SpellEffectFn(spell_ioc_gunship_portal_SpellScript::HandleScript2, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_ioc_gunship_portal_SpellScript(); + } }; class spell_ioc_parachute_ic : public SpellScriptLoader { - public: - spell_ioc_parachute_ic() : SpellScriptLoader("spell_ioc_parachute_ic") { } +public: + spell_ioc_parachute_ic() : SpellScriptLoader("spell_ioc_parachute_ic") { } - class spell_ioc_parachute_ic_AuraScript : public AuraScript + class spell_ioc_parachute_ic_AuraScript : public AuraScript + { + PrepareAuraScript(spell_ioc_parachute_ic_AuraScript) + + void HandleTriggerSpell(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_ioc_parachute_ic_AuraScript) - - void HandleTriggerSpell(AuraEffect const* /*aurEff*/) - { - if (Player* target = GetTarget()->ToPlayer()) - if (target->m_movementInfo.fallTime > 2500 && !target->GetTransport()) - target->CastSpell(target, SPELL_PARACHUTE_IC, true); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_ioc_parachute_ic_AuraScript::HandleTriggerSpell, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_ioc_parachute_ic_AuraScript(); + if (Player* target = GetTarget()->ToPlayer()) + if (target->m_movementInfo.fallTime > 2500 && !target->GetTransport()) + target->CastSpell(target, SPELL_PARACHUTE_IC, true); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_ioc_parachute_ic_AuraScript::HandleTriggerSpell, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_ioc_parachute_ic_AuraScript(); + } }; class spell_ioc_launch : public SpellScriptLoader { - public: - spell_ioc_launch() : SpellScriptLoader("spell_ioc_launch") { } +public: + spell_ioc_launch() : SpellScriptLoader("spell_ioc_launch") { } - class spell_ioc_launch_SpellScript : public SpellScript + class spell_ioc_launch_SpellScript : public SpellScript + { + PrepareSpellScript(spell_ioc_launch_SpellScript); + + void HandleScript(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_ioc_launch_SpellScript); - - void HandleScript(SpellEffIndex /*effIndex*/) - { - if (Player* player = GetHitPlayer()) - player->AddAura(SPELL_LAUNCH_NO_FALLING_DAMAGE, player); // prevents falling damage - } - - void Launch() - { - WorldLocation const* const position = GetExplTargetDest(); - - if (Player* player = GetHitPlayer()) - { - player->ExitVehicle(); - player->DisableSpline(); - player->GetMap()->PlayerRelocation(player, GetCaster()->GetPositionX(), GetCaster()->GetPositionY(), GetCaster()->GetPositionZ(), GetCaster()->GetOrientation()); - - float dist = position->GetExactDist2d(player->GetPositionX(), player->GetPositionY()); - float elevation = GetSpell()->m_targets.GetElevation(); - float speedZ = std::max(10.0f, float(50.0f * sin(elevation))); - float speedXY = dist * 10.0f / speedZ; - - player->GetMotionMaster()->MoveJump(position->GetPositionX(), position->GetPositionY(), position->GetPositionZ(), speedXY, speedZ); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_ioc_launch_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_FORCE_CAST); - AfterHit += SpellHitFn(spell_ioc_launch_SpellScript::Launch); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_ioc_launch_SpellScript(); + if (Player* player = GetHitPlayer()) + player->AddAura(SPELL_LAUNCH_NO_FALLING_DAMAGE, player); // prevents falling damage } + + void Launch() + { + WorldLocation const* const position = GetExplTargetDest(); + + if (Player* player = GetHitPlayer()) + { + player->ExitVehicle(); + player->DisableSpline(); + player->GetMap()->PlayerRelocation(player, GetCaster()->GetPositionX(), GetCaster()->GetPositionY(), GetCaster()->GetPositionZ(), GetCaster()->GetOrientation()); + + float dist = position->GetExactDist2d(player->GetPositionX(), player->GetPositionY()); + float elevation = GetSpell()->m_targets.GetElevation(); + float speedZ = std::max(10.0f, float(50.0f * sin(elevation))); + float speedXY = dist * 10.0f / speedZ; + + player->GetMotionMaster()->MoveJump(position->GetPositionX(), position->GetPositionY(), position->GetPositionZ(), speedXY, speedZ); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_ioc_launch_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_FORCE_CAST); + AfterHit += SpellHitFn(spell_ioc_launch_SpellScript::Launch); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_ioc_launch_SpellScript(); + } }; void AddSC_isle_of_conquest() diff --git a/src/server/scripts/Northrend/zone_borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp index 96585cb50..4f077eac3 100644 --- a/src/server/scripts/Northrend/zone_borean_tundra.cpp +++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp @@ -69,8 +69,8 @@ public: owner->CastSpell(owner, SPELL_SUBDUED, true); GetCaster()->CastSpell(GetCaster(), SPELL_DRAKE_HATCHLING_SUBDUED, true); owner->setFaction(35); - owner->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); - owner->DespawnOrUnsummon(3*MINUTE*IN_MILLISECONDS); + owner->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + owner->DespawnOrUnsummon(3 * MINUTE * IN_MILLISECONDS); } void Register() @@ -109,7 +109,7 @@ public: struct npc_sinkhole_kill_creditAI : public NullCreatureAI { - npc_sinkhole_kill_creditAI(Creature* creature) : NullCreatureAI(creature){ } + npc_sinkhole_kill_creditAI(Creature* creature) : NullCreatureAI(creature) { } uint32 phaseTimer; uint8 phase; @@ -196,7 +196,8 @@ public: CreatureAI::EnterEvadeMode(); break; } - } else phaseTimer -= diff; + } + else phaseTimer -= diff; } @@ -281,7 +282,7 @@ public: player->PrepareQuestMenu(creature->GetGUID()); if (player->GetQuestStatus(QUEST_ACES_HIGH) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(QUEST_ACES_HIGH_DAILY) == QUEST_STATUS_INCOMPLETE) //It's the same dragon for both quests. - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_C_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_C_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); return true; @@ -290,7 +291,7 @@ public: bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) override { ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF + 1) { CloseGossipMenuFor(player); @@ -327,7 +328,7 @@ public: { if (player->GetQuestStatus(QUEST_SPIRITS_WATCH_OVER_US) == QUEST_STATUS_INCOMPLETE) AddGossipItemFor(player, GOSSIP_MENU_ID_NPC_IRUK, GOSSIP_OPTION_SEARCH_CORPSE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - + SendGossipMenuFor(player, NPC_TEXT_THIS_YOUNG_TUSKARR, creature->GetGUID()); return true; @@ -336,13 +337,13 @@ public: bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) override { ClearGossipMenuFor(player); - + if (action == GOSSIP_ACTION_INFO_DEF + 1) { player->CastSpell(player, SPELL_CREATE_TOTEM_OF_ISSLIRUK, true); CloseGossipMenuFor(player); } - + return true; } }; @@ -427,7 +428,7 @@ public: struct npc_lurgglbrAI : public npc_escortAI { - npc_lurgglbrAI(Creature* creature) : npc_escortAI(creature){ } + npc_lurgglbrAI(Creature* creature) : npc_escortAI(creature) { } uint32 IntroTimer; uint32 IntroPhase; @@ -505,7 +506,8 @@ public: IntroTimer = 0; break; } - } else IntroTimer -= diff; + } + else IntroTimer -= diff; } npc_escortAI::UpdateAI(diff); @@ -777,7 +779,7 @@ public: void JustDied(Unit* /*killer*/) { - if (Player* player=GetPlayerForEscort()) + if (Player* player = GetPlayerForEscort()) player->FailQuest(QUEST_ESCAPING_THE_MIST); } @@ -854,7 +856,7 @@ public: void Reset() { - Bonker_agro=0; + Bonker_agro = 0; SetDespawnAtFar(false); } @@ -875,7 +877,7 @@ public: } DoMeleeAttackIfReady(); } - else Bonker_agro=0; + else Bonker_agro = 0; } void WaypointReached(uint32 waypointId) @@ -1000,46 +1002,46 @@ public: switch (me->GetEntry()) { case NPC_WARMAGE_HOLLISTER: - { - if (!orbList.empty()) { - for (std::list::const_iterator itr = orbList.begin(); itr != orbList.end(); ++itr) + if (!orbList.empty()) { - if (Creature* pOrb = *itr) - if (pOrb->GetPositionY() > 6680) - DoCast(pOrb, SPELL_TRANSITUS_SHIELD_BEAM); + for (std::list::const_iterator itr = orbList.begin(); itr != orbList.end(); ++itr) + { + if (Creature* pOrb = *itr) + if (pOrb->GetPositionY() > 6680) + DoCast(pOrb, SPELL_TRANSITUS_SHIELD_BEAM); + } } + m_uiTimer = urand(90000, 120000); } - m_uiTimer = urand(90000, 120000); - } break; case NPC_WARMAGE_CALANDRA: - { - if (!orbList.empty()) { - for (std::list::const_iterator itr = orbList.begin(); itr != orbList.end(); ++itr) + if (!orbList.empty()) { - if (Creature* pOrb = *itr) - if ((pOrb->GetPositionY() < 6680) && (pOrb->GetPositionY() > 6630)) - DoCast(pOrb, SPELL_TRANSITUS_SHIELD_BEAM); + for (std::list::const_iterator itr = orbList.begin(); itr != orbList.end(); ++itr) + { + if (Creature* pOrb = *itr) + if ((pOrb->GetPositionY() < 6680) && (pOrb->GetPositionY() > 6630)) + DoCast(pOrb, SPELL_TRANSITUS_SHIELD_BEAM); + } } + m_uiTimer = urand(90000, 120000); } - m_uiTimer = urand(90000, 120000); - } break; case NPC_WARMAGE_WATKINS: - { - if (!orbList.empty()) { - for (std::list::const_iterator itr = orbList.begin(); itr != orbList.end(); ++itr) + if (!orbList.empty()) { - if (Creature* pOrb = *itr) - if (pOrb->GetPositionY() < 6630) - DoCast(pOrb, SPELL_TRANSITUS_SHIELD_BEAM); + for (std::list::const_iterator itr = orbList.begin(); itr != orbList.end(); ++itr) + { + if (Creature* pOrb = *itr) + if (pOrb->GetPositionY() < 6630) + DoCast(pOrb, SPELL_TRANSITUS_SHIELD_BEAM); + } } + m_uiTimer = urand(90000, 120000); } - m_uiTimer = urand(90000, 120000); - } break; } } @@ -1096,8 +1098,8 @@ public: { npc_hidden_cultistAI(Creature* creature) : ScriptedAI(creature) { - uiEmoteState = creature->GetUInt32Value(UNIT_NPC_EMOTESTATE); - uiNpcFlags = creature->GetUInt32Value(UNIT_NPC_FLAGS); + uiEmoteState = creature->GetUInt32Value(UNIT_NPC_EMOTESTATE); + uiNpcFlags = creature->GetUInt32Value(UNIT_NPC_FLAGS); } uint32 uiEmoteState; @@ -1169,10 +1171,10 @@ public: uiEventPhase = 2; break; case NPC_TOM_HEGGER: - if (Player* player = ObjectAccessor::GetPlayer(*me, uiPlayerGUID)) + if (Player* player = ObjectAccessor::GetPlayer(*me, uiPlayerGUID)) { Talk(SAY_HIDDEN_CULTIST_3, player); - } + } uiEventTimer = 5000; uiEventPhase = 2; break; @@ -1203,7 +1205,8 @@ public: } break; } - }else uiEventTimer -= uiDiff; + } + else uiEventTimer -= uiDiff; if (!UpdateVictim()) return; @@ -1242,7 +1245,7 @@ public: } if (player->HasAura(SPELL_RIGHTEOUS_VISION) && player->GetQuestStatus(QUEST_THE_HUNT_IS_ON) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, charGossipItem, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, charGossipItem, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); if (creature->IsVendor()) AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); @@ -1256,7 +1259,7 @@ public: { ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF + 1) { CloseGossipMenuFor(player); creature->AI()->SetGUID(player->GetGUID()); @@ -1362,9 +1365,9 @@ public: } } - private: - EventMap _events; - uint64 _playerGUID; + private: + EventMap _events; + uint64 _playerGUID; }; CreatureAI* GetAI(Creature* creature) const override diff --git a/src/server/scripts/Northrend/zone_crystalsong_forest.cpp b/src/server/scripts/Northrend/zone_crystalsong_forest.cpp index 55e8e9fe4..5704e569b 100644 --- a/src/server/scripts/Northrend/zone_crystalsong_forest.cpp +++ b/src/server/scripts/Northrend/zone_crystalsong_forest.cpp @@ -30,110 +30,110 @@ enum ePreparationsForWar class npc_preparations_for_war_vehicle : public CreatureScript { - public: - npc_preparations_for_war_vehicle() : CreatureScript("npc_preparations_for_war_vehicle") { } +public: + npc_preparations_for_war_vehicle() : CreatureScript("npc_preparations_for_war_vehicle") { } - struct npc_preparations_for_war_vehicleAI : public NullCreatureAI + struct npc_preparations_for_war_vehicleAI : public NullCreatureAI + { + npc_preparations_for_war_vehicleAI(Creature* creature) : NullCreatureAI(creature) { - npc_preparations_for_war_vehicleAI(Creature* creature) : NullCreatureAI(creature) + } + + uint8 pointId; + uint32 searchForShipTimer; + uint32 transportEntry; + + void InitializeAI() + { + WPPath* path = sSmartWaypointMgr->GetPath(me->GetEntry()); + if (!path || path->empty()) { + me->DespawnOrUnsummon(1); + return; } - uint8 pointId; - uint32 searchForShipTimer; - uint32 transportEntry; + Movement::PointsArray pathPoints; + pathPoints.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ())); - void InitializeAI() + uint32 wpCounter = 1; + WPPath::const_iterator itr; + while ((itr = path->find(wpCounter++)) != path->end()) { - WPPath* path = sSmartWaypointMgr->GetPath(me->GetEntry()); - if (!path || path->empty()) - { - me->DespawnOrUnsummon(1); - return; - } - - Movement::PointsArray pathPoints; - pathPoints.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ())); - - uint32 wpCounter = 1; - WPPath::const_iterator itr; - while ((itr = path->find(wpCounter++)) != path->end()) - { - WayPoint* wp = itr->second; - pathPoints.push_back(G3D::Vector3(wp->x, wp->y, wp->z)); - } - - me->GetMotionMaster()->MoveSplinePath(&pathPoints); - - NullCreatureAI::InitializeAI(); - pointId = 0; - searchForShipTimer = 0; - transportEntry = (me->GetEntry() == NPC_HAMMERHEAD ? TRANSPORT_ORGRIMS_HAMMER : TRANSPORT_THE_SKYBREAKER); + WayPoint* wp = itr->second; + pathPoints.push_back(G3D::Vector3(wp->x, wp->y, wp->z)); } - void MovementInform(uint32 type, uint32 /*id*/) - { - if (type == ESCORT_MOTION_TYPE) - if (++pointId == 17) // path size - searchForShipTimer = 3000; - } + me->GetMotionMaster()->MoveSplinePath(&pathPoints); - void UpdateAI(uint32 diff) - { - // horde 7.55f, -0.09, 34.44, 3.13, +20 - // ally 45.18f, 0.03, 40.09, 3.14 +5 + NullCreatureAI::InitializeAI(); + pointId = 0; + searchForShipTimer = 0; + transportEntry = (me->GetEntry() == NPC_HAMMERHEAD ? TRANSPORT_ORGRIMS_HAMMER : TRANSPORT_THE_SKYBREAKER); + } - if (searchForShipTimer) + void MovementInform(uint32 type, uint32 /*id*/) + { + if (type == ESCORT_MOTION_TYPE) + if (++pointId == 17) // path size + searchForShipTimer = 3000; + } + + void UpdateAI(uint32 diff) + { + // horde 7.55f, -0.09, 34.44, 3.13, +20 + // ally 45.18f, 0.03, 40.09, 3.14 +5 + + if (searchForShipTimer) + { + searchForShipTimer += diff; + if (searchForShipTimer >= 3000) { - searchForShipTimer += diff; - if (searchForShipTimer >= 3000) + searchForShipTimer = 1; + TransportsContainer const& transports = me->GetMap()->GetAllTransports(); + for (TransportsContainer::const_iterator itr = transports.begin(); itr != transports.end(); ++itr) { - searchForShipTimer = 1; - TransportsContainer const& transports = me->GetMap()->GetAllTransports(); - for (TransportsContainer::const_iterator itr = transports.begin(); itr != transports.end(); ++itr) + if ((*itr)->GetEntry() == transportEntry) { - if ((*itr)->GetEntry() == transportEntry) + float x, y, z; + if (transportEntry == TRANSPORT_ORGRIMS_HAMMER) { - float x, y, z; - if (transportEntry == TRANSPORT_ORGRIMS_HAMMER) - { - x = 7.55f; - y = -0.09f; - z = 54.44f; - } - else - { - x = 45.18f; - y = 0.03f; - z = 45.09f; - } - - (*itr)->CalculatePassengerPosition(x, y, z); - - if (me->GetDistance2d(x, y) < 10.0f) - { - me->DespawnOrUnsummon(1000); - if (Vehicle* vehicle = me->GetVehicleKit()) - if (Unit* passenger = vehicle->GetPassenger(0)) - { - passenger->NearTeleportTo(x, y, z-(transportEntry == TRANSPORT_ORGRIMS_HAMMER ? 19.0f : 4.0f), M_PI); - passenger->RemoveAurasDueToSpell(VEHICLE_SPELL_PARACHUTE); // maybe vehicle / seat flag should be responsible for parachute gain? - } - } - else - me->GetMotionMaster()->MovePoint(0, x, y, z, false, false); - break; + x = 7.55f; + y = -0.09f; + z = 54.44f; } + else + { + x = 45.18f; + y = 0.03f; + z = 45.09f; + } + + (*itr)->CalculatePassengerPosition(x, y, z); + + if (me->GetDistance2d(x, y) < 10.0f) + { + me->DespawnOrUnsummon(1000); + if (Vehicle* vehicle = me->GetVehicleKit()) + if (Unit* passenger = vehicle->GetPassenger(0)) + { + passenger->NearTeleportTo(x, y, z - (transportEntry == TRANSPORT_ORGRIMS_HAMMER ? 19.0f : 4.0f), M_PI); + passenger->RemoveAurasDueToSpell(VEHICLE_SPELL_PARACHUTE); // maybe vehicle / seat flag should be responsible for parachute gain? + } + } + else + me->GetMotionMaster()->MovePoint(0, x, y, z, false, false); + break; } } } } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_preparations_for_war_vehicleAI(creature); } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_preparations_for_war_vehicleAI(creature); + } }; /******************************************************* @@ -198,7 +198,8 @@ public: } } } - }else + } + else { if (!targetGUID) if (Creature* pOrb = GetClosestCreatureWithEntry(me, NPC_TRANSITUS_SHIELD_DUMMY, 32.0f)) diff --git a/src/server/scripts/Northrend/zone_dalaran.cpp b/src/server/scripts/Northrend/zone_dalaran.cpp index 8f17bcfb8..5666691b1 100644 --- a/src/server/scripts/Northrend/zone_dalaran.cpp +++ b/src/server/scripts/Northrend/zone_dalaran.cpp @@ -23,50 +23,50 @@ Script Data End */ // Ours class npc_steam_powered_auctioneer : public CreatureScript { - public: - npc_steam_powered_auctioneer() : CreatureScript("npc_steam_powered_auctioneer") { } +public: + npc_steam_powered_auctioneer() : CreatureScript("npc_steam_powered_auctioneer") { } - struct npc_steam_powered_auctioneerAI : public ScriptedAI + struct npc_steam_powered_auctioneerAI : public ScriptedAI + { + npc_steam_powered_auctioneerAI(Creature* creature) : ScriptedAI(creature) {} + + bool CanBeSeen(Player const* player) { - npc_steam_powered_auctioneerAI(Creature* creature) : ScriptedAI(creature) {} - - bool CanBeSeen(Player const* player) - { - if (player->GetTeamId() == TEAM_ALLIANCE) - return me->GetEntry() == 35594; - else - return me->GetEntry() == 35607; - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_steam_powered_auctioneerAI(creature); + if (player->GetTeamId() == TEAM_ALLIANCE) + return me->GetEntry() == 35594; + else + return me->GetEntry() == 35607; } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_steam_powered_auctioneerAI(creature); + } }; class npc_mei_francis_mount : public CreatureScript { - public: - npc_mei_francis_mount() : CreatureScript("npc_mei_francis_mount") { } +public: + npc_mei_francis_mount() : CreatureScript("npc_mei_francis_mount") { } - struct npc_mei_francis_mountAI : public ScriptedAI + struct npc_mei_francis_mountAI : public ScriptedAI + { + npc_mei_francis_mountAI(Creature* creature) : ScriptedAI(creature) {} + + bool CanBeSeen(Player const* player) { - npc_mei_francis_mountAI(Creature* creature) : ScriptedAI(creature) {} - - bool CanBeSeen(Player const* player) - { - if (player->GetTeamId() == TEAM_ALLIANCE) - return me->GetEntry() == 32206 || me->GetEntry() == 32335 || me->GetEntry() == 31851; - else - return me->GetEntry() == 32207 || me->GetEntry() == 32336 || me->GetEntry() == 31852; - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_mei_francis_mountAI(creature); + if (player->GetTeamId() == TEAM_ALLIANCE) + return me->GetEntry() == 32206 || me->GetEntry() == 32335 || me->GetEntry() == 31851; + else + return me->GetEntry() == 32207 || me->GetEntry() == 32336 || me->GetEntry() == 31852; } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_mei_francis_mountAI(creature); + } }; /****************************************** @@ -153,7 +153,7 @@ public: _canWash = false; Talk(SAY_SHANDY1); _events.ScheduleEvent(EVENT_INTRO_DH1, 5000); - _events.ScheduleEvent(EVENT_OUTRO_DH, 10*MINUTE*IN_MILLISECONDS); + _events.ScheduleEvent(EVENT_OUTRO_DH, 10 * MINUTE * IN_MILLISECONDS); break; default: if(_lSource == type && _canWash) @@ -207,7 +207,7 @@ public: _events.PopEvent(); break; case EVENT_INTRO_DH5: - me->SummonGameObject(201384, 5798.74f, 693.19f, 657.94f, 0.91f, 0, 0, 0, 0,90000000); + me->SummonGameObject(201384, 5798.74f, 693.19f, 657.94f, 0.91f, 0, 0, 0, 0, 90000000); _events.ScheduleEvent(EVENT_INTRO_DH6, 1000); _events.PopEvent(); break; @@ -225,13 +225,13 @@ public: } } - private: - EventMap _events; - uint64 _aquanosGUID; - uint8 _lCount; - uint32 _lSource; + private: + EventMap _events; + uint64 _aquanosGUID; + uint8 _lCount; + uint32 _lSource; - bool _canWash; + bool _canWash; }; bool OnGossipHello(Player* player, Creature* creature) override @@ -240,7 +240,7 @@ public: player->PrepareQuestMenu(creature->GetGUID()); if (player->GetQuestStatus(QUEST_SUITABLE_DISGUISE_A) == QUEST_STATUS_INCOMPLETE || - player->GetQuestStatus(QUEST_SUITABLE_DISGUISE_H) == QUEST_STATUS_INCOMPLETE) + player->GetQuestStatus(QUEST_SUITABLE_DISGUISE_H) == QUEST_STATUS_INCOMPLETE) { if(player->GetTeamId() == TEAM_ALLIANCE) AddGossipItemFor(player, 0, "Arcanist Tybalin said you might be able to lend me a certain tabard.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); @@ -304,97 +304,97 @@ enum ArchmageLandalockImages class npc_archmage_landalock : public CreatureScript { - public: - npc_archmage_landalock() : CreatureScript("npc_archmage_landalock") +public: + npc_archmage_landalock() : CreatureScript("npc_archmage_landalock") + { + } + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_archmage_landalockAI(creature); + } + + struct npc_archmage_landalockAI : public ScriptedAI + { + npc_archmage_landalockAI(Creature* creature) : ScriptedAI(creature) { + _switchImageTimer = MINUTE * IN_MILLISECONDS; + _summonGUID = 0; } - CreatureAI* GetAI(Creature* creature) const + uint32 GetImageEntry(uint32 QuestId) { - return new npc_archmage_landalockAI(creature); + switch (QuestId) + { + case QUEST_SARTHARION_MUST_DIE: + return NPC_SARTHARION_IMAGE; + case QUEST_ANUBREKHAN_MUST_DIE: + return NPC_ANUBREKHAN_IMAGE; + case QUEST_NOTH_THE_PLAGUEBINGER_MUST_DIE: + return NPC_NOTH_THE_PLAGUEBINGER_IMAGE; + case QUEST_INSTRUCTOR_RAZUVIOUS_MUST_DIE: + return NPC_INSTRUCTOR_RAZUVIOUS_IMAGE; + case QUEST_PATCHWERK_MUST_DIE: + return NPC_PATCHWERK_IMAGE; + case QUEST_MALYGOS_MUST_DIE: + return NPC_MALYGOS_IMAGE; + case QUEST_FLAME_LEVIATHAN_MUST_DIE: + return NPC_FLAME_LEVIATHAN_IMAGE; + case QUEST_RAZORSCALE_MUST_DIE: + return NPC_RAZORSCALE_IMAGE; + case QUEST_IGNIS_THE_FURNACE_MASTER_MUST_DIE: + return NPC_IGNIS_THE_FURNACE_MASTER_IMAGE; + case QUEST_XT_002_DECONSTRUCTOR_MUST_DIE: + return NPC_XT_002_DECONSTRUCTOR_IMAGE; + case QUEST_LORD_JARAXXUS_MUST_DIE: + return NPC_LORD_JARAXXUS_IMAGE; + default: //case QUEST_LORD_MARROWGAR_MUST_DIE: + return NPC_LORD_MARROWGAR_IMAGE; + } } - struct npc_archmage_landalockAI : public ScriptedAI + void JustSummoned(Creature* image) { - npc_archmage_landalockAI(Creature* creature) : ScriptedAI(creature) - { - _switchImageTimer = MINUTE*IN_MILLISECONDS; - _summonGUID = 0; - } + // xinef: screams like a baby + if (image->GetEntry() != NPC_ANUBREKHAN_IMAGE) + image->SetUnitMovementFlags(MOVEMENTFLAG_RIGHT); + _summonGUID = image->GetGUID(); + } - uint32 GetImageEntry(uint32 QuestId) + void UpdateAI(uint32 diff) + { + ScriptedAI::UpdateAI(diff); + + _switchImageTimer += diff; + if (_switchImageTimer > MINUTE * IN_MILLISECONDS) { - switch (QuestId) + _switchImageTimer = 0; + QuestRelationBounds objectQR = sObjectMgr->GetCreatureQuestRelationBounds(me->GetEntry()); + for (QuestRelations::const_iterator i = objectQR.first; i != objectQR.second; ++i) { - case QUEST_SARTHARION_MUST_DIE: - return NPC_SARTHARION_IMAGE; - case QUEST_ANUBREKHAN_MUST_DIE: - return NPC_ANUBREKHAN_IMAGE; - case QUEST_NOTH_THE_PLAGUEBINGER_MUST_DIE: - return NPC_NOTH_THE_PLAGUEBINGER_IMAGE; - case QUEST_INSTRUCTOR_RAZUVIOUS_MUST_DIE: - return NPC_INSTRUCTOR_RAZUVIOUS_IMAGE; - case QUEST_PATCHWERK_MUST_DIE: - return NPC_PATCHWERK_IMAGE; - case QUEST_MALYGOS_MUST_DIE: - return NPC_MALYGOS_IMAGE; - case QUEST_FLAME_LEVIATHAN_MUST_DIE: - return NPC_FLAME_LEVIATHAN_IMAGE; - case QUEST_RAZORSCALE_MUST_DIE: - return NPC_RAZORSCALE_IMAGE; - case QUEST_IGNIS_THE_FURNACE_MASTER_MUST_DIE: - return NPC_IGNIS_THE_FURNACE_MASTER_IMAGE; - case QUEST_XT_002_DECONSTRUCTOR_MUST_DIE: - return NPC_XT_002_DECONSTRUCTOR_IMAGE; - case QUEST_LORD_JARAXXUS_MUST_DIE: - return NPC_LORD_JARAXXUS_IMAGE; - default: //case QUEST_LORD_MARROWGAR_MUST_DIE: - return NPC_LORD_MARROWGAR_IMAGE; - } - } + uint32 questId = i->second; + Quest const* quest = sObjectMgr->GetQuestTemplate(questId); + if (!quest || !quest->IsWeekly()) + continue; - void JustSummoned(Creature* image) - { - // xinef: screams like a baby - if (image->GetEntry() != NPC_ANUBREKHAN_IMAGE) - image->SetUnitMovementFlags(MOVEMENTFLAG_RIGHT); - _summonGUID = image->GetGUID(); - } - - void UpdateAI(uint32 diff) - { - ScriptedAI::UpdateAI(diff); - - _switchImageTimer += diff; - if (_switchImageTimer > MINUTE*IN_MILLISECONDS) - { - _switchImageTimer = 0; - QuestRelationBounds objectQR = sObjectMgr->GetCreatureQuestRelationBounds(me->GetEntry()); - for (QuestRelations::const_iterator i = objectQR.first; i != objectQR.second; ++i) + uint32 newEntry = GetImageEntry(questId); + if (GUID_ENPART(_summonGUID) != newEntry) { - uint32 questId = i->second; - Quest const* quest = sObjectMgr->GetQuestTemplate(questId); - if (!quest || !quest->IsWeekly()) - continue; + if (Creature* image = ObjectAccessor::GetCreature(*me, _summonGUID)) + image->DespawnOrUnsummon(); - uint32 newEntry = GetImageEntry(questId); - if (GUID_ENPART(_summonGUID) != newEntry) - { - if (Creature* image = ObjectAccessor::GetCreature(*me, _summonGUID)) - image->DespawnOrUnsummon(); - - float z = 653.622f; - if (newEntry == NPC_MALYGOS_IMAGE || newEntry == NPC_RAZORSCALE_IMAGE || newEntry == NPC_SARTHARION_IMAGE) - z += 3.0f; - me->SummonCreature(newEntry, 5703.077f, 583.9757f, z, 3.926991f); - } + float z = 653.622f; + if (newEntry == NPC_MALYGOS_IMAGE || newEntry == NPC_RAZORSCALE_IMAGE || newEntry == NPC_SARTHARION_IMAGE) + z += 3.0f; + me->SummonCreature(newEntry, 5703.077f, 583.9757f, z, 3.926991f); } } } - private: - uint32 _switchImageTimer; - uint64 _summonGUID; - }; + } + private: + uint32 _switchImageTimer; + uint64 _summonGUID; + }; }; // Theirs @@ -435,11 +435,11 @@ public: creature->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, true); } - void Reset(){} + void Reset() {} - void EnterCombat(Unit* /*who*/){} + void EnterCombat(Unit* /*who*/) {} - void AttackStart(Unit* /*who*/){} + void AttackStart(Unit* /*who*/) {} void MoveInLineOfSight(Unit* who) { @@ -452,9 +452,9 @@ public: Player* player = who->GetCharmerOrOwnerPlayerOrPlayerItself(); if (!player || player->IsGameMaster() || player->IsBeingTeleported() || (player->GetPositionZ() > 670 && player->GetVehicle()) || - // If player has Disguise aura for quest A Meeting With The Magister or An Audience With The Arcanist, do not teleport it away but let it pass - player->HasAura(SPELL_SUNREAVER_DISGUISE_FEMALE) || player->HasAura(SPELL_SUNREAVER_DISGUISE_MALE) || - player->HasAura(SPELL_SILVER_COVENANT_DISGUISE_FEMALE) || player->HasAura(SPELL_SILVER_COVENANT_DISGUISE_MALE)) + // If player has Disguise aura for quest A Meeting With The Magister or An Audience With The Arcanist, do not teleport it away but let it pass + player->HasAura(SPELL_SUNREAVER_DISGUISE_FEMALE) || player->HasAura(SPELL_SUNREAVER_DISGUISE_MALE) || + player->HasAura(SPELL_SILVER_COVENANT_DISGUISE_FEMALE) || player->HasAura(SPELL_SILVER_COVENANT_DISGUISE_MALE)) return; switch (me->GetEntry()) @@ -488,7 +488,7 @@ public: return; } - void UpdateAI(uint32 /*diff*/){} + void UpdateAI(uint32 /*diff*/) {} }; CreatureAI* GetAI(Creature* creature) const @@ -511,99 +511,99 @@ enum MinigobData EVENT_DESPAWN = 4, MAIL_MINIGOB_ENTRY = 264, - MAIL_DELIVER_DELAY_MIN = 5*MINUTE, - MAIL_DELIVER_DELAY_MAX = 15*MINUTE + MAIL_DELIVER_DELAY_MIN = 5 * MINUTE, + MAIL_DELIVER_DELAY_MAX = 15 * MINUTE }; class npc_minigob_manabonk : public CreatureScript { - public: - npc_minigob_manabonk() : CreatureScript("npc_minigob_manabonk") {} +public: + npc_minigob_manabonk() : CreatureScript("npc_minigob_manabonk") {} - struct npc_minigob_manabonkAI : public ScriptedAI + struct npc_minigob_manabonkAI : public ScriptedAI + { + npc_minigob_manabonkAI(Creature* creature) : ScriptedAI(creature) { - npc_minigob_manabonkAI(Creature* creature) : ScriptedAI(creature) + me->setActive(true); + } + + void Reset() + { + me->SetVisible(false); + events.ScheduleEvent(EVENT_SELECT_TARGET, IN_MILLISECONDS); + } + + Player* SelectTargetInDalaran() + { + std::list PlayerInDalaranList; + PlayerInDalaranList.clear(); + + Map::PlayerList const& players = me->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + if (Player* player = itr->GetSource()->ToPlayer()) + if (player->GetZoneId() == ZONE_DALARAN && !player->IsFlying() && !player->IsMounted() && !player->IsGameMaster()) + PlayerInDalaranList.push_back(player); + + if (PlayerInDalaranList.empty()) + return nullptr; + return acore::Containers::SelectRandomContainerElement(PlayerInDalaranList); + } + + void SendMailToPlayer(Player* player) + { + SQLTransaction trans = CharacterDatabase.BeginTransaction(); + int16 deliverDelay = irand(MAIL_DELIVER_DELAY_MIN, MAIL_DELIVER_DELAY_MAX); + MailDraft(MAIL_MINIGOB_ENTRY, true).SendMailTo(trans, MailReceiver(player), MailSender(MAIL_CREATURE, me->GetEntry()), MAIL_CHECK_MASK_NONE, deliverDelay); + CharacterDatabase.CommitTransaction(trans); + } + + void UpdateAI(uint32 diff) + { + + if (!sWorld->getBoolConfig(CONFIG_MINIGOB_MANABONK)) + return; + + events.Update(diff); + + while (uint32 eventId = events.ExecuteEvent()) { - me->setActive(true); - } - - void Reset() - { - me->SetVisible(false); - events.ScheduleEvent(EVENT_SELECT_TARGET, IN_MILLISECONDS); - } - - Player* SelectTargetInDalaran() - { - std::list PlayerInDalaranList; - PlayerInDalaranList.clear(); - - Map::PlayerList const &players = me->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) - if (Player* player = itr->GetSource()->ToPlayer()) - if (player->GetZoneId() == ZONE_DALARAN && !player->IsFlying() && !player->IsMounted() && !player->IsGameMaster()) - PlayerInDalaranList.push_back(player); - - if (PlayerInDalaranList.empty()) - return nullptr; - return acore::Containers::SelectRandomContainerElement(PlayerInDalaranList); - } - - void SendMailToPlayer(Player* player) - { - SQLTransaction trans = CharacterDatabase.BeginTransaction(); - int16 deliverDelay = irand(MAIL_DELIVER_DELAY_MIN, MAIL_DELIVER_DELAY_MAX); - MailDraft(MAIL_MINIGOB_ENTRY, true).SendMailTo(trans, MailReceiver(player), MailSender(MAIL_CREATURE, me->GetEntry()), MAIL_CHECK_MASK_NONE, deliverDelay); - CharacterDatabase.CommitTransaction(trans); - } - - void UpdateAI(uint32 diff) - { - - if (!sWorld->getBoolConfig(CONFIG_MINIGOB_MANABONK)) - return; - - events.Update(diff); - - while (uint32 eventId = events.ExecuteEvent()) + switch (eventId) { - switch (eventId) - { - case EVENT_SELECT_TARGET: - me->SetVisible(true); - DoCast(me, SPELL_TELEPORT_VISUAL); - if (Player* player = SelectTargetInDalaran()) - { - me->NearTeleportTo(player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), 0.0f); - DoCast(player, SPELL_MANABONKED); - SendMailToPlayer(player); - } - events.ScheduleEvent(EVENT_BLINK, 3*IN_MILLISECONDS); - break; - case EVENT_BLINK: + case EVENT_SELECT_TARGET: + me->SetVisible(true); + DoCast(me, SPELL_TELEPORT_VISUAL); + if (Player* player = SelectTargetInDalaran()) + { + me->NearTeleportTo(player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), 0.0f); + DoCast(player, SPELL_MANABONKED); + SendMailToPlayer(player); + } + events.ScheduleEvent(EVENT_BLINK, 3 * IN_MILLISECONDS); + break; + case EVENT_BLINK: { DoCast(me, SPELL_IMPROVED_BLINK); Position pos; me->GetRandomNearPosition(pos, (urand(15, 40))); me->GetMotionMaster()->MovePoint(0, pos.m_positionX, pos.m_positionY, pos.m_positionZ); events.ScheduleEvent(EVENT_DESPAWN, 3 * IN_MILLISECONDS); - events.ScheduleEvent(EVENT_DESPAWN_VISUAL, 2.5*IN_MILLISECONDS); + events.ScheduleEvent(EVENT_DESPAWN_VISUAL, 2.5 * IN_MILLISECONDS); break; } - case EVENT_DESPAWN_VISUAL: - DoCast(me, SPELL_TELEPORT_VISUAL); - break; - case EVENT_DESPAWN: - me->DespawnOrUnsummon(); - break; - default: - break; - } + case EVENT_DESPAWN_VISUAL: + DoCast(me, SPELL_TELEPORT_VISUAL); + break; + case EVENT_DESPAWN: + me->DespawnOrUnsummon(); + break; + default: + break; } } + } - private: - EventMap events; + private: + EventMap events; }; CreatureAI* GetAI(Creature* creature) const @@ -718,88 +718,88 @@ public: }; - class npc_dalaran_warrior : public CreatureScript - { - public: - npc_dalaran_warrior() : CreatureScript("npc_dalaran_warrior") {} +class npc_dalaran_warrior : public CreatureScript +{ +public: + npc_dalaran_warrior() : CreatureScript("npc_dalaran_warrior") {} - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const + { + return new npc_dalaran_warriorAI(creature); + } + + struct npc_dalaran_warriorAI : public ScriptedAI + { + npc_dalaran_warriorAI(Creature* creature) : ScriptedAI(creature) { - return new npc_dalaran_warriorAI(creature); + Battleshout_timer = 1000; } - struct npc_dalaran_warriorAI : public ScriptedAI + uint32 Battleshout_timer; + uint32 hamstring_timer; + uint32 disarm_timer; + uint32 shout_timer; + + void Initialize() { - npc_dalaran_warriorAI(Creature* creature) : ScriptedAI(creature) - { - Battleshout_timer = 1000; - } + Battleshout_timer = 120000; + shout_timer = 60000; + hamstring_timer = 30000; + disarm_timer = 50000; + } - uint32 Battleshout_timer; - uint32 hamstring_timer; - uint32 disarm_timer; - uint32 shout_timer; + void Reset() + { + Initialize(); + } - void Initialize() + void EnterCombat(Unit* /*who*/) + { + me->AddAura(1908, me); + Battleshout_timer = 1000; + } + void UpdateAI(uint32 diff) + { + + if (!UpdateVictim()) + return; + + if (Battleshout_timer <= diff) { + DoCast(SPELL_WARRIOR_SHOUT); Battleshout_timer = 120000; + } + else + Battleshout_timer -= diff; + + if (shout_timer <= diff) + { + DoCast(SPELL_WARRIOR_SHOUT); shout_timer = 60000; - hamstring_timer = 30000; - disarm_timer = 50000; } + else + shout_timer -= diff; - void Reset() + if (hamstring_timer <= diff) { - Initialize(); + DoCast(SPELL_WARRIOR_HAMSTRING); + hamstring_timer = urand(20000, 25000); } + else + hamstring_timer -= diff; - void EnterCombat(Unit* /*who*/) + if (disarm_timer <= diff) { - me->AddAura(1908, me); - Battleshout_timer = 1000; + DoCast(SPELL_WARRIOR_DISARM); + disarm_timer = urand(50000, 60000); } - void UpdateAI(uint32 diff) - { + else + disarm_timer -= diff; - if (!UpdateVictim()) - return; - - if (Battleshout_timer <= diff) - { - DoCast(SPELL_WARRIOR_SHOUT); - Battleshout_timer = 120000; - } - else - Battleshout_timer -= diff; - - if (shout_timer <= diff) - { - DoCast(SPELL_WARRIOR_SHOUT); - shout_timer = 60000; - } - else - shout_timer -= diff; - - if (hamstring_timer <= diff) - { - DoCast(SPELL_WARRIOR_HAMSTRING); - hamstring_timer = urand(20000, 25000); - } - else - hamstring_timer -= diff; - - if (disarm_timer <= diff) - { - DoCast(SPELL_WARRIOR_DISARM); - disarm_timer = urand(50000, 60000); - } - else - disarm_timer -= diff; - - DoMeleeAttackIfReady(); - } - }; + DoMeleeAttackIfReady(); + } }; +}; void AddSC_dalaran() { diff --git a/src/server/scripts/Northrend/zone_dragonblight.cpp b/src/server/scripts/Northrend/zone_dragonblight.cpp index 1288be360..fb1008d24 100644 --- a/src/server/scripts/Northrend/zone_dragonblight.cpp +++ b/src/server/scripts/Northrend/zone_dragonblight.cpp @@ -137,68 +137,68 @@ public: NextStep(10000); break; case 1: - { - Creature* c = me->SummonCreature(NPC_OACHANOA, 2406.24f, 1701.98f, 0.1f, 0.3f, TEMPSUMMON_TIMED_DESPAWN, 90000, 0); - if( !c ) { - Reset(); - return; + Creature* c = me->SummonCreature(NPC_OACHANOA, 2406.24f, 1701.98f, 0.1f, 0.3f, TEMPSUMMON_TIMED_DESPAWN, 90000, 0); + if( !c ) + { + Reset(); + return; + } + c->SetCanFly(true); + c->GetMotionMaster()->MovePoint(0, 2406.25f, 1701.98f, 0.1f); + oachanoaGUID = c->GetGUID(); + NextStep(3000); + break; } - c->SetCanFly(true); - c->GetMotionMaster()->MovePoint(0, 2406.25f, 1701.98f, 0.1f); - oachanoaGUID = c->GetGUID(); - NextStep(3000); - break; - } case 2: - { - Player* p = ObjectAccessor::GetPlayer(*me, pGUID); - if( !p ) { - Reset(); - return; + Player* p = ObjectAccessor::GetPlayer(*me, pGUID); + if( !p ) + { + Reset(); + return; + } + std::string text = (OACHANOA_T_1_1 + p->GetName() + OACHANOA_T_1_2); + Say(text, true); + NextStep(6000); + break; } - std::string text = (OACHANOA_T_1_1 + p->GetName() + OACHANOA_T_1_2); - Say(text, true); - NextStep(6000); - break; - } case 3: Say(OACHANOA_T_2, true); NextStep(6000); break; case 4: - { - Say(OACHANOA_T_3, true); - Player* p = ObjectAccessor::GetPlayer(*me, pGUID); - if( !p ) { - Reset(); - return; + Say(OACHANOA_T_3, true); + Player* p = ObjectAccessor::GetPlayer(*me, pGUID); + if( !p ) + { + Reset(); + return; + } + p->CastSpell(p, DEEPDIVING_PEARL_BUFF, true); + NextStep(30000); + break; } - p->CastSpell(p, DEEPDIVING_PEARL_BUFF, true); - NextStep(30000); - break; - } case 5: DespawnOachanoa(); Reset(); break; case 6: - { - Player* p = ObjectAccessor::GetPlayer(*me, pGUID); - if( !p ) { - Reset(); - return; + Player* p = ObjectAccessor::GetPlayer(*me, pGUID); + if( !p ) + { + Reset(); + return; + } + + std::string text = (OACHANOA_T_4_1 + p->GetName() + OACHANOA_T_4_2); + Say(text, true); + + NextStep(6000); + break; } - - std::string text = (OACHANOA_T_4_1 + p->GetName() + OACHANOA_T_4_2); - Say(text, true); - - NextStep(6000); - break; - } case 7: Say(OACHANOA_T_5, false); NextStep(6000); @@ -208,28 +208,28 @@ public: NextStep(6000); break; case 9: - { - Player* p = ObjectAccessor::GetPlayer(*me, pGUID); - if( !p ) { + Player* p = ObjectAccessor::GetPlayer(*me, pGUID); + if( !p ) + { + Reset(); + return; + } + const char* name_races[RACE_DRAENEI] = {"human", "orc", "dwarf", "nightelf", "undead", "tauren", "gnome", "troll", "", "bloodelf", "draenei"}; + if( p->getRace() > 11 ) + { + Reset(); + return; + } + + std::string text = (OACHANOA_T_7_1 + std::string(name_races[p->getRace() - 1])); + Say(text, true); + + p->AreaExploredOrEventHappens(12032); + + DespawnOachanoa(); Reset(); - return; } - const char * name_races[RACE_DRAENEI] = {"human", "orc", "dwarf", "nightelf", "undead", "tauren", "gnome", "troll", "", "bloodelf", "draenei"}; - if( p->getRace() > 11 ) - { - Reset(); - return; - } - - std::string text = (OACHANOA_T_7_1 + std::string(name_races[p->getRace()-1])); - Say(text, true); - - p->AreaExploredOrEventHappens(12032); - - DespawnOachanoa(); - Reset(); - } } } } @@ -315,8 +315,8 @@ public: if (Unit* summoner = me->ToTempSummon()->GetSummoner()) { summonerGUID = summoner->GetGUID(); - float x,y,z; - me->GetNearPoint(summoner, x, y, z, me->GetCombatReach(), 0.0f, rand_norm()*2*M_PI); + float x, y, z; + me->GetNearPoint(summoner, x, y, z, me->GetCombatReach(), 0.0f, rand_norm() * 2 * M_PI); if (Creature* cr = summoner->SummonCreature((IsFuture() ? NPC_FUTURE_YOU : NPC_PAST_YOU), x, y, z, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 210000)) { futureGUID = cr->GetGUID(); @@ -341,7 +341,7 @@ public: uint32 randEntry() { - return NPC_INFINITE_ASSAILANT+urand(0,2); + return NPC_INFINITE_ASSAILANT + urand(0, 2); } void UpdateAI(uint32 diff) @@ -362,69 +362,69 @@ public: events.ScheduleEvent(EVENT_FIGHT_2, 6000); break; case EVENT_FIGHT_2: - { - if (phase) - randomWhisper(); - - Creature* cr = nullptr; - float x, y, z; - if (phase < 3) { - for (uint8 i = 0; i < count[phase]; ++i) + if (phase) + randomWhisper(); + + Creature* cr = nullptr; + float x, y, z; + if (phase < 3) { - me->GetNearPoint(me, x, y, z, me->GetCombatReach(), 10.0f, rand_norm()*2*M_PI); - if ((cr = me->SummonCreature(randEntry(), x, y, z+2.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000))) + for (uint8 i = 0; i < count[phase]; ++i) + { + me->GetNearPoint(me, x, y, z, me->GetCombatReach(), 10.0f, rand_norm() * 2 * M_PI); + if ((cr = me->SummonCreature(randEntry(), x, y, z + 2.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000))) + { + cr->CastSpell(cr, SPELL_TELEPORT_EFFECT, true); + cr->AI()->AttackStart(me); + cr->AddThreat(me, 100.0f); + } + } + } + else if (phase == 3) + { + me->GetNearPoint(me, x, y, z, me->GetCombatReach(), 20.0f, rand_norm() * 2 * M_PI); + if ((cr = me->SummonCreature(NPC_INFINITE_TIMERENDER, x, y, z, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000))) { cr->CastSpell(cr, SPELL_TELEPORT_EFFECT, true); cr->AI()->AttackStart(me); - cr->AddThreat(me, 100.0f); } - } - } - else if (phase == 3) - { - me->GetNearPoint(me, x, y, z, me->GetCombatReach(), 20.0f, rand_norm()*2*M_PI); - if ((cr = me->SummonCreature(NPC_INFINITE_TIMERENDER, x, y, z, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000))) - { - cr->CastSpell(cr, SPELL_TELEPORT_EFFECT, true); - cr->AI()->AttackStart(me); + + events.PopEvent(); + events.ScheduleEvent(EVENT_CHECK_FINISH, 20000); + return; } + phase++; events.PopEvent(); - events.ScheduleEvent(EVENT_CHECK_FINISH, 20000); - return; + events.ScheduleEvent(EVENT_FIGHT_2, 35000); + break; } - - phase++; - events.PopEvent(); - events.ScheduleEvent(EVENT_FIGHT_2, 35000); - break; - } case EVENT_CHECK_FINISH: - { - if (me->FindNearestCreature(NPC_INFINITE_TIMERENDER, 50.0f)) { - events.RepeatEvent(5000); - return; + if (me->FindNearestCreature(NPC_INFINITE_TIMERENDER, 50.0f)) + { + events.RepeatEvent(5000); + return; + } + + if (Player* player = getSummoner()) + player->GroupEventHappens(IsFuture() ? QUEST_MYSTERY_OF_THE_INFINITE : QUEST_MYSTERY_OF_THE_INFINITE_REDUX, me); + + me->MonsterWhisper(IsFuture() ? "Look, $N, the hourglass has revealed Nozdormu!" : "What the heck? Nozdormu is up there!", getSummoner()); + events.PopEvent(); + events.ScheduleEvent(EVENT_FINISH_EVENT, 6000); + break; } - - if (Player* player = getSummoner()) - player->GroupEventHappens(IsFuture() ? QUEST_MYSTERY_OF_THE_INFINITE : QUEST_MYSTERY_OF_THE_INFINITE_REDUX, me); - - me->MonsterWhisper(IsFuture() ? "Look, $N, the hourglass has revealed Nozdormu!" : "What the heck? Nozdormu is up there!", getSummoner()); - events.PopEvent(); - events.ScheduleEvent(EVENT_FINISH_EVENT, 6000); - break; - } case EVENT_FINISH_EVENT: - { - me->MonsterWhisper(IsFuture() ? "Farewell, $N. Keep us alive and get some better equipment!" : "I feel like I'm being pulled away through time. Thanks for the help....", getSummoner()); - events.PopEvent(); - me->DespawnOrUnsummon(500); - if (getFuture()) - getFuture()->DespawnOrUnsummon(500); - break; - } + { + me->MonsterWhisper(IsFuture() ? "Farewell, $N. Keep us alive and get some better equipment!" : "I feel like I'm being pulled away through time. Thanks for the help....", getSummoner()); + events.PopEvent(); + me->DespawnOrUnsummon(500); + if (getFuture()) + getFuture()->DespawnOrUnsummon(500); + break; + } } } @@ -433,14 +433,30 @@ public: std::string text = ""; switch(urand(0, IsFuture() ? 7 : 5)) { - case 0: text = IsFuture() ? "What? Am I here alone. We both have a stake at this, you know!" : "This equipment looks cool and all, but couldn't we have done a little better? Are you even raiding?"; break; - case 1: text = IsFuture() ? "No matter what, you can't die, because would mean that I would cease to exist, right? But, I was here before when I was you. I'm so confused!" : "Chromie said that if I don't do this just right, I might wink out of existence. If I go, then you go!"; break; - case 2: text = IsFuture() ? "Sorry, but Chromie said that I couldn't reveal anything about your future to you. She said that if I did, I would cease to exist." : "I just want you to know that if we get through this alive, I'm making sure that we turn out better than you. No offense."; break; - case 3: text = IsFuture() ? "Look at you fight; no wonder I turned to drinking." : "Looks like I'm an underachiever."; break; - case 4: text = IsFuture() ? "Wow, I'd forgotten how inexperienced I used to be." : "Wait a minute! If you're here, then that means that in the not-so-distant future I'm going to be you helping me? Are we stuck in a time loop?!"; break; - case 5: text = IsFuture() ? "I can't believe that I used to wear that." : "I think I'm going to turn to drinking after this."; break; - case 6: text = "Listen. I'm not supposed to tell you this, but there's going to be this party that you're invited to. Whatever you do, DO NOT DRINK THE PUNCH!"; break; - case 7: text = "Wish I could remember how many of the Infinite Dragonflight were going to try to stop you. This fight was so long ago."; break; + case 0: + text = IsFuture() ? "What? Am I here alone. We both have a stake at this, you know!" : "This equipment looks cool and all, but couldn't we have done a little better? Are you even raiding?"; + break; + case 1: + text = IsFuture() ? "No matter what, you can't die, because would mean that I would cease to exist, right? But, I was here before when I was you. I'm so confused!" : "Chromie said that if I don't do this just right, I might wink out of existence. If I go, then you go!"; + break; + case 2: + text = IsFuture() ? "Sorry, but Chromie said that I couldn't reveal anything about your future to you. She said that if I did, I would cease to exist." : "I just want you to know that if we get through this alive, I'm making sure that we turn out better than you. No offense."; + break; + case 3: + text = IsFuture() ? "Look at you fight; no wonder I turned to drinking." : "Looks like I'm an underachiever."; + break; + case 4: + text = IsFuture() ? "Wow, I'd forgotten how inexperienced I used to be." : "Wait a minute! If you're here, then that means that in the not-so-distant future I'm going to be you helping me? Are we stuck in a time loop?!"; + break; + case 5: + text = IsFuture() ? "I can't believe that I used to wear that." : "I think I'm going to turn to drinking after this."; + break; + case 6: + text = "Listen. I'm not supposed to tell you this, but there's going to be this party that you're invited to. Whatever you do, DO NOT DRINK THE PUNCH!"; + break; + case 7: + text = "Wish I could remember how many of the Infinite Dragonflight were going to try to stop you. This fight was so long ago."; + break; } if (Creature* cr = getFuture()) @@ -544,7 +560,7 @@ public: { me->CastSpell(me, SPELL_FEAR_AURA_WITH_COWER, true); me->SetWalk(false); - uint32 path = me->GetEntry()*10+urand(0,4); + uint32 path = me->GetEntry() * 10 + urand(0, 4); if (me->GetPositionY() > -1150.0f) path += 5; me->GetMotionMaster()->MovePath(path, false); @@ -619,7 +635,7 @@ public: void HandleSendEvent(SpellEffIndex effIndex) { PreventHitDefaultEffect(effIndex); - GetCaster()->SummonCreature(NPC_PRINCE_ARTHAS, 4821.3f ,-580.14f, 163.541f, 4.57f); + GetCaster()->SummonCreature(NPC_PRINCE_ARTHAS, 4821.3f, -580.14f, 163.541f, 4.57f); } void Register() @@ -636,43 +652,43 @@ public: class spell_q12243_fire_upon_the_waters : public SpellScriptLoader { - public: - spell_q12243_fire_upon_the_waters() : SpellScriptLoader("spell_q12243_fire_upon_the_waters") { } +public: + spell_q12243_fire_upon_the_waters() : SpellScriptLoader("spell_q12243_fire_upon_the_waters") { } - class spell_q12243_fire_upon_the_waters_AuraScript : public AuraScript + class spell_q12243_fire_upon_the_waters_AuraScript : public AuraScript + { + PrepareAuraScript(spell_q12243_fire_upon_the_waters_AuraScript); + + void HandleApplyEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_q12243_fire_upon_the_waters_AuraScript); - - void HandleApplyEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + std::list servants; + GetTarget()->GetCreatureListWithEntryInGrid(servants, 27233 /*NPC_ONSLAUGHT_DECKHAND*/, 40.0f); + for (std::list::const_iterator itr = servants.begin(); itr != servants.end(); ++itr) { - std::list servants; - GetTarget()->GetCreatureListWithEntryInGrid(servants, 27233 /*NPC_ONSLAUGHT_DECKHAND*/, 40.0f); - for (std::list::const_iterator itr = servants.begin(); itr != servants.end(); ++itr) - { - (*itr)->SetSpeed(MOVE_RUN, 0.7f, true); - (*itr)->GetMotionMaster()->MoveFleeing(GetTarget(), GetDuration()); - } + (*itr)->SetSpeed(MOVE_RUN, 0.7f, true); + (*itr)->GetMotionMaster()->MoveFleeing(GetTarget(), GetDuration()); } - - void HandleRemoveEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - std::list servants; - GetTarget()->GetCreatureListWithEntryInGrid(servants, 27233 /*NPC_ONSLAUGHT_DECKHAND*/, 100.0f); - for (std::list::const_iterator itr = servants.begin(); itr != servants.end(); ++itr) - (*itr)->SetSpeed(MOVE_RUN, 1.1f, true); - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_q12243_fire_upon_the_waters_AuraScript::HandleApplyEffect, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_q12243_fire_upon_the_waters_AuraScript::HandleRemoveEffect, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_q12243_fire_upon_the_waters_AuraScript(); } + + void HandleRemoveEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + std::list servants; + GetTarget()->GetCreatureListWithEntryInGrid(servants, 27233 /*NPC_ONSLAUGHT_DECKHAND*/, 100.0f); + for (std::list::const_iterator itr = servants.begin(); itr != servants.end(); ++itr) + (*itr)->SetSpeed(MOVE_RUN, 1.1f, true); + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_q12243_fire_upon_the_waters_AuraScript::HandleApplyEffect, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_q12243_fire_upon_the_waters_AuraScript::HandleRemoveEffect, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_q12243_fire_upon_the_waters_AuraScript(); + } }; // The Sacred and the Corrupt (24545) @@ -719,12 +735,12 @@ enum eSandC class WretchedGhoulCleaner { - public: - void operator()(Creature* creature) - { - if (creature->GetEntry() == NPC_SAC_WRETCHED_GHOUL && creature->GetDisplayId() != 11686 && creature->IsAlive()) - Unit::Kill(creature, creature); - } +public: + void operator()(Creature* creature) + { + if (creature->GetEntry() == NPC_SAC_WRETCHED_GHOUL && creature->GetDisplayId() != 11686 && creature->IsAlive()) + Unit::Kill(creature, creature); + } }; class npc_q24545_lich_king : public CreatureScript @@ -858,7 +874,7 @@ public: { bool valid = false; if (Player* p = ObjectAccessor::GetPlayer(*me, playerGUID)) - if (p->IsAlive() && p->GetPhaseMask() & 2 && p->GetExactDistSq(me) < 100.0f*100.0f && !p->IsGameMaster()) + if (p->IsAlive() && p->GetPhaseMask() & 2 && p->GetExactDistSq(me) < 100.0f * 100.0f && !p->IsGameMaster()) valid = true; if (!valid) { @@ -1034,54 +1050,54 @@ public: class at_q24545_frostmourne_cavern : public AreaTriggerScript { - public: - at_q24545_frostmourne_cavern() : AreaTriggerScript("at_q24545_frostmourne_cavern") { } +public: + at_q24545_frostmourne_cavern() : AreaTriggerScript("at_q24545_frostmourne_cavern") { } - bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) - { - if (player->GetPhaseMask() & 2) - if (Creature* c = player->FindNearestCreature(NPC_SAC_LICH_KING, 60.0f, true)) - c->AI()->SetGUID(player->GetGUID()); + bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) + { + if (player->GetPhaseMask() & 2) + if (Creature* c = player->FindNearestCreature(NPC_SAC_LICH_KING, 60.0f, true)) + c->AI()->SetGUID(player->GetGUID()); - return true; - } + return true; + } }; class SACActivateEvent : public BasicEvent { - public: - SACActivateEvent(Creature* owner) : _owner(owner) {} +public: + SACActivateEvent(Creature* owner) : _owner(owner) {} - bool Execute(uint64 /*time*/, uint32 /*diff*/) - { - if (!_owner->IsAlive()) - return true; - _owner->GetMotionMaster()->MoveRandom(5.0f); - _owner->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - _owner->SetReactState(REACT_AGGRESSIVE); - _owner->CastSpell(_owner, SPELL_SAC_GHOUL_AREA_AURA, true); + bool Execute(uint64 /*time*/, uint32 /*diff*/) + { + if (!_owner->IsAlive()) return true; - } + _owner->GetMotionMaster()->MoveRandom(5.0f); + _owner->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + _owner->SetReactState(REACT_AGGRESSIVE); + _owner->CastSpell(_owner, SPELL_SAC_GHOUL_AREA_AURA, true); + return true; + } - private: - Creature* _owner; +private: + Creature* _owner; }; class SACDeactivateEvent : public BasicEvent { - public: - SACDeactivateEvent(Creature* owner) : _owner(owner) {} +public: + SACDeactivateEvent(Creature* owner) : _owner(owner) {} - bool Execute(uint64 /*time*/, uint32 /*diff*/) - { - _owner->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - _owner->SetReactState(REACT_PASSIVE); - _owner->SetDisplayId(11686); - return true; - } + bool Execute(uint64 /*time*/, uint32 /*diff*/) + { + _owner->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + _owner->SetReactState(REACT_PASSIVE); + _owner->SetDisplayId(11686); + return true; + } - private: - Creature* _owner; +private: + Creature* _owner; }; class npc_q24545_wretched_ghoul : public CreatureScript @@ -1131,7 +1147,7 @@ public: if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE) || target->HasUnitState(UNIT_STATE_STUNNED) || me->GetDisplayId() == 11686) return false; Position homePos = me->GetHomePosition(); - return target->GetExactDistSq(&homePos) < 30.0f*30.0f; + return target->GetExactDistSq(&homePos) < 30.0f * 30.0f; } void Activate() @@ -1163,50 +1179,50 @@ public: class GhoulTargetCheck { - public: - explicit GhoulTargetCheck(bool alive) : _alive(alive) {} - bool operator()(WorldObject* object) const - { - return _alive ^ (object->GetTypeId() != TYPEID_UNIT || ((Unit*)object)->GetDisplayId() != 11686); - } - private: - bool _alive; +public: + explicit GhoulTargetCheck(bool alive) : _alive(alive) {} + bool operator()(WorldObject* object) const + { + return _alive ^ (object->GetTypeId() != TYPEID_UNIT || ((Unit*)object)->GetDisplayId() != 11686); + } +private: + bool _alive; }; class spell_q24545_aod_special : public SpellScriptLoader { - public: - spell_q24545_aod_special() : SpellScriptLoader("spell_q24545_aod_special") { } +public: + spell_q24545_aod_special() : SpellScriptLoader("spell_q24545_aod_special") { } - class spell_q24545_aod_special_SpellScript : public SpellScript + class spell_q24545_aod_special_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q24545_aod_special_SpellScript); + + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_q24545_aod_special_SpellScript); - - void FilterTargets(std::list& targets) - { - targets.remove_if(GhoulTargetCheck(GetSpellInfo()->Id == 70790)); - acore::Containers::RandomResizeList(targets, 2); - } - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - if (target->GetTypeId() == TYPEID_UNIT) - target->ToCreature()->AI()->DoAction(GetSpellInfo()->Id == 70790 ? -2 : -1); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_q24545_aod_special_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); - OnEffectHitTarget += SpellEffectFn(spell_q24545_aod_special_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q24545_aod_special_SpellScript(); + targets.remove_if(GhoulTargetCheck(GetSpellInfo()->Id == 70790)); + acore::Containers::RandomResizeList(targets, 2); } + + void HandleScript(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) + if (target->GetTypeId() == TYPEID_UNIT) + target->ToCreature()->AI()->DoAction(GetSpellInfo()->Id == 70790 ? -2 : -1); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_q24545_aod_special_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + OnEffectHitTarget += SpellEffectFn(spell_q24545_aod_special_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q24545_aod_special_SpellScript(); + } }; class npc_q24545_vegard_dummy : public CreatureScript @@ -1371,7 +1387,7 @@ public: if (id == 1) if (Aura* aura = summoner->GetAura(47189)) // Transform Aura - aura->SetDuration(aura->GetDuration()-MINUTE*IN_MILLISECONDS); + aura->SetDuration(aura->GetDuration() - MINUTE * IN_MILLISECONDS); } }; }; @@ -1489,42 +1505,47 @@ Position const PosTalkLocations[6] = class npc_commander_eligor_dawnbringer : public CreatureScript { - public: npc_commander_eligor_dawnbringer() : CreatureScript("npc_commander_eligor_dawnbringer") {} +public: + npc_commander_eligor_dawnbringer() : CreatureScript("npc_commander_eligor_dawnbringer") {} - struct npc_commander_eligor_dawnbringerAI : public ScriptedAI + 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; - } + talkWing = 0; + } - void Reset() - { - talkWing = 0; - memset(audienceList, 0, sizeof(audienceList)); - memset(imageList, 0, sizeof(imageList)); - _events.ScheduleEvent(EVENT_GET_TARGETS, 5000); - _events.ScheduleEvent(EVENT_START_RANDOM, 20000); - } + void Reset() + { + talkWing = 0; + memset(audienceList, 0, sizeof(audienceList)); + memset(imageList, 0, sizeof(imageList)); + _events.ScheduleEvent(EVENT_GET_TARGETS, 5000); + _events.ScheduleEvent(EVENT_START_RANDOM, 20000); + } - void MovementInform(uint32 type, uint32 id) + void MovementInform(uint32 type, uint32 id) + { + if (type == POINT_MOTION_TYPE) { - if (type == POINT_MOTION_TYPE) + if (id == 1) { - if (id == 1) - { - me->SetFacingTo(PosTalkLocations[talkWing].m_orientation); - TurnAudience(); + me->SetFacingTo(PosTalkLocations[talkWing].m_orientation); + TurnAudience(); - switch (talkWing) - { + switch (talkWing) + { case 0: // Pinnacle of Naxxramas { switch (urand (0, 1)) { - case 0: ChangeImage(NPC_IMAGE_OF_KELTHUZAD, MODEL_IMAGE_OF_KELTHUZAD, SAY_KELTHUZAD_1); - _events.ScheduleEvent(EVENT_KELTHUZAD_2, 8000); break; - case 1: ChangeImage(NPC_IMAGE_OF_SAPPHIRON, MODEL_IMAGE_OF_SAPPHIRON, SAY_SAPPHIRON); break; + case 0: + ChangeImage(NPC_IMAGE_OF_KELTHUZAD, MODEL_IMAGE_OF_KELTHUZAD, SAY_KELTHUZAD_1); + _events.ScheduleEvent(EVENT_KELTHUZAD_2, 8000); + break; + case 1: + ChangeImage(NPC_IMAGE_OF_SAPPHIRON, MODEL_IMAGE_OF_SAPPHIRON, SAY_SAPPHIRON); + break; } } break; @@ -1532,10 +1553,16 @@ class npc_commander_eligor_dawnbringer : public CreatureScript { switch (urand (0, 2)) { - case 0: ChangeImage(NPC_IMAGE_OF_RAZUVIOUS, MODEL_IMAGE_OF_RAZUVIOUS, SAY_RAZUVIOUS); break; - case 1: ChangeImage(NPC_IMAGE_OF_GOTHIK, MODEL_IMAGE_OF_GOTHIK, SAY_GOTHIK); break; - case 2: ChangeImage(NPC_IMAGE_OF_THANE, MODEL_IMAGE_OF_THANE, SAY_DEATH_KNIGHTS_1); - _events.ScheduleEvent(EVENT_DEATH_KNIGHTS_2, 10000); break; + case 0: + ChangeImage(NPC_IMAGE_OF_RAZUVIOUS, MODEL_IMAGE_OF_RAZUVIOUS, SAY_RAZUVIOUS); + break; + case 1: + ChangeImage(NPC_IMAGE_OF_GOTHIK, MODEL_IMAGE_OF_GOTHIK, SAY_GOTHIK); + break; + case 2: + ChangeImage(NPC_IMAGE_OF_THANE, MODEL_IMAGE_OF_THANE, SAY_DEATH_KNIGHTS_1); + _events.ScheduleEvent(EVENT_DEATH_KNIGHTS_2, 10000); + break; } } break; @@ -1543,10 +1570,18 @@ class npc_commander_eligor_dawnbringer : public CreatureScript { switch (urand (0, 3)) { - case 0: ChangeImage(NPC_IMAGE_OF_PATCHWERK, MODEL_IMAGE_OF_PATCHWERK, SAY_PATCHWERK); break; - case 1: ChangeImage(NPC_IMAGE_OF_GROBBULUS, MODEL_IMAGE_OF_GROBBULUS, SAY_GROBBULUS); break; - case 2: ChangeImage(NPC_IMAGE_OF_THADDIUS, MODEL_IMAGE_OF_THADDIUS, SAY_THADDIUS); break; - case 3: ChangeImage(NPC_IMAGE_OF_GLUTH, MODEL_IMAGE_OF_GLUTH, SAY_GLUTH); break; + case 0: + ChangeImage(NPC_IMAGE_OF_PATCHWERK, MODEL_IMAGE_OF_PATCHWERK, SAY_PATCHWERK); + break; + case 1: + ChangeImage(NPC_IMAGE_OF_GROBBULUS, MODEL_IMAGE_OF_GROBBULUS, SAY_GROBBULUS); + break; + case 2: + ChangeImage(NPC_IMAGE_OF_THADDIUS, MODEL_IMAGE_OF_THADDIUS, SAY_THADDIUS); + break; + case 3: + ChangeImage(NPC_IMAGE_OF_GLUTH, MODEL_IMAGE_OF_GLUTH, SAY_GLUTH); + break; } } break; @@ -1554,9 +1589,15 @@ class npc_commander_eligor_dawnbringer : public CreatureScript { switch (urand (0, 2)) { - case 0: ChangeImage(NPC_IMAGE_OF_ANUBREKHAN, MODEL_IMAGE_OF_ANUBREKHAN, SAY_ANUBREKHAN); break; - case 1: ChangeImage(NPC_IMAGE_OF_FAERLINA, MODEL_IMAGE_OF_FAERLINA, SAY_FAERLINA); break; - case 2: ChangeImage(NPC_IMAGE_OF_MAEXXNA, MODEL_IMAGE_OF_MAEXXNA, SAY_MAEXXNA); break; + case 0: + ChangeImage(NPC_IMAGE_OF_ANUBREKHAN, MODEL_IMAGE_OF_ANUBREKHAN, SAY_ANUBREKHAN); + break; + case 1: + ChangeImage(NPC_IMAGE_OF_FAERLINA, MODEL_IMAGE_OF_FAERLINA, SAY_FAERLINA); + break; + case 2: + ChangeImage(NPC_IMAGE_OF_MAEXXNA, MODEL_IMAGE_OF_MAEXXNA, SAY_MAEXXNA); + break; } } break; @@ -1564,148 +1605,154 @@ class npc_commander_eligor_dawnbringer : public CreatureScript { switch (urand (0, 2)) { - case 0: ChangeImage(NPC_IMAGE_OF_NOTH, MODEL_IMAGE_OF_NOTH, SAY_NOTH); break; - case 1: ChangeImage(NPC_IMAGE_OF_HEIGAN, MODEL_IMAGE_OF_HEIGAN, SAY_HEIGAN_1); - _events.ScheduleEvent(EVENT_HEIGAN_2, 8000); break; - case 2: ChangeImage(NPC_IMAGE_OF_LOATHEB, MODEL_IMAGE_OF_LOATHEB, SAY_LOATHEB); break; + case 0: + ChangeImage(NPC_IMAGE_OF_NOTH, MODEL_IMAGE_OF_NOTH, SAY_NOTH); + break; + case 1: + ChangeImage(NPC_IMAGE_OF_HEIGAN, MODEL_IMAGE_OF_HEIGAN, SAY_HEIGAN_1); + _events.ScheduleEvent(EVENT_HEIGAN_2, 8000); + break; + case 2: + ChangeImage(NPC_IMAGE_OF_LOATHEB, MODEL_IMAGE_OF_LOATHEB, SAY_LOATHEB); + break; } } break; case 5: // Home _events.ScheduleEvent(EVENT_START_RANDOM, 30000); break; - } } } } - - void StoreTargets() - { - uint8 creaturecount; - - creaturecount = 0; - - for (uint8 ii = 0; ii < 3; ++ii) - { - std::list creatureList; - GetCreatureListWithEntryInGrid(creatureList, me, AudienceMobs[ii], 15.0f); - for (std::list::iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr) - { - if (Creature* creatureList = *itr) - { - audienceList[creaturecount] = creatureList->GetGUID(); - ++creaturecount; - } - } - } - - if (Creature* creature = me->FindNearestCreature(NPC_IMAGE_OF_KELTHUZAD, 20.0f, true)) - imageList[0] = creature->GetGUID(); - if (Creature* creature = me->FindNearestCreature(NPC_IMAGE_OF_RAZUVIOUS, 20.0f, true)) - imageList[1] = creature->GetGUID(); - if (Creature* creature = me->FindNearestCreature(NPC_IMAGE_OF_PATCHWERK, 20.0f, true)) - imageList[2] = creature->GetGUID(); - if (Creature* creature = me->FindNearestCreature(NPC_IMAGE_OF_ANUBREKHAN, 20.0f, true)) - imageList[3] = creature->GetGUID(); - if (Creature* creature = me->FindNearestCreature(NPC_IMAGE_OF_NOTH, 20.0f, true)) - imageList[4] = creature->GetGUID(); - } - - void ChangeImage(uint32 entry, uint32 model, uint8 text) - { - if (Creature* creature = ObjectAccessor::GetCreature(*me, imageList[talkWing])) - { - Talk(text); - creature->SetEntry(entry); - creature->SetDisplayId(model); - creature->CastSpell(creature, SPELL_HEROIC_IMAGE_CHANNEL); - _events.ScheduleEvent(EVENT_TALK_COMPLETE, 40000); - } - } - - void TurnAudience() - { - for (uint8 i = 0; i < 10; ++i) - { - if (Creature* creature = ObjectAccessor::GetCreature(*me, audienceList[i])) - creature->SetFacingToObject(me); - } - } - - void UpdateAI(uint32 diff) - { - _events.Update(diff); - - while (uint32 eventId = _events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_START_RANDOM: - talkWing = urand (0, 4); - Talk(talkWing); - _events.ScheduleEvent(EVENT_MOVE_TO_POINT, 8000); - break; - case EVENT_MOVE_TO_POINT: - me->SetWalk(true); - me->GetMotionMaster()->Clear(); - me->GetMotionMaster()->MovePoint(1, PosTalkLocations[talkWing].m_positionX, PosTalkLocations[talkWing].m_positionY, PosTalkLocations[talkWing].m_positionZ); - break; - case EVENT_TALK_COMPLETE: - talkWing = 5; - Talk(talkWing); - _events.ScheduleEvent(EVENT_MOVE_TO_POINT, 5000); - break; - case EVENT_GET_TARGETS: - StoreTargets(); - break; - case EVENT_KELTHUZAD_2: - Talk(SAY_KELTHUZAD_2); - _events.ScheduleEvent(EVENT_KELTHUZAD_3, 8000); - break; - case EVENT_KELTHUZAD_3: - Talk(SAY_KELTHUZAD_3); - break; - case EVENT_DEATH_KNIGHTS_2: - Talk(SAY_DEATH_KNIGHTS_2); - if (Creature* creature = ObjectAccessor::GetCreature(*me, imageList[talkWing])) - { - creature->SetEntry(NPC_IMAGE_OF_BLAUMEUX); - creature->SetDisplayId(MODEL_IMAGE_OF_BLAUMEUX); - } - _events.ScheduleEvent(EVENT_DEATH_KNIGHTS_3, 10000); - break; - case EVENT_DEATH_KNIGHTS_3: - Talk(SAY_DEATH_KNIGHTS_3); - if (Creature* creature = ObjectAccessor::GetCreature(*me, imageList[talkWing])) - { - creature->SetEntry(NPC_IMAGE_OF_ZELIEK); - creature->SetDisplayId(MODEL_IMAGE_OF_ZELIEK); - } - _events.ScheduleEvent(EVENT_DEATH_KNIGHTS_4, 10000); - break; - case EVENT_DEATH_KNIGHTS_4: - Talk(SAY_DEATH_KNIGHTS_4); - break; - case EVENT_HEIGAN_2: - Talk(SAY_HEIGAN_2); - break; - default: - break; - } - } - DoMeleeAttackIfReady(); - } - private: - EventMap _events; - uint64 audienceList[10]; - uint64 imageList[5]; - uint8 talkWing; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_commander_eligor_dawnbringerAI(creature); } + + void StoreTargets() + { + uint8 creaturecount; + + creaturecount = 0; + + for (uint8 ii = 0; ii < 3; ++ii) + { + std::list creatureList; + GetCreatureListWithEntryInGrid(creatureList, me, AudienceMobs[ii], 15.0f); + for (std::list::iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr) + { + if (Creature* creatureList = *itr) + { + audienceList[creaturecount] = creatureList->GetGUID(); + ++creaturecount; + } + } + } + + if (Creature* creature = me->FindNearestCreature(NPC_IMAGE_OF_KELTHUZAD, 20.0f, true)) + imageList[0] = creature->GetGUID(); + if (Creature* creature = me->FindNearestCreature(NPC_IMAGE_OF_RAZUVIOUS, 20.0f, true)) + imageList[1] = creature->GetGUID(); + if (Creature* creature = me->FindNearestCreature(NPC_IMAGE_OF_PATCHWERK, 20.0f, true)) + imageList[2] = creature->GetGUID(); + if (Creature* creature = me->FindNearestCreature(NPC_IMAGE_OF_ANUBREKHAN, 20.0f, true)) + imageList[3] = creature->GetGUID(); + if (Creature* creature = me->FindNearestCreature(NPC_IMAGE_OF_NOTH, 20.0f, true)) + imageList[4] = creature->GetGUID(); + } + + void ChangeImage(uint32 entry, uint32 model, uint8 text) + { + if (Creature* creature = ObjectAccessor::GetCreature(*me, imageList[talkWing])) + { + Talk(text); + creature->SetEntry(entry); + creature->SetDisplayId(model); + creature->CastSpell(creature, SPELL_HEROIC_IMAGE_CHANNEL); + _events.ScheduleEvent(EVENT_TALK_COMPLETE, 40000); + } + } + + void TurnAudience() + { + for (uint8 i = 0; i < 10; ++i) + { + if (Creature* creature = ObjectAccessor::GetCreature(*me, audienceList[i])) + creature->SetFacingToObject(me); + } + } + + void UpdateAI(uint32 diff) + { + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_START_RANDOM: + talkWing = urand (0, 4); + Talk(talkWing); + _events.ScheduleEvent(EVENT_MOVE_TO_POINT, 8000); + break; + case EVENT_MOVE_TO_POINT: + me->SetWalk(true); + me->GetMotionMaster()->Clear(); + me->GetMotionMaster()->MovePoint(1, PosTalkLocations[talkWing].m_positionX, PosTalkLocations[talkWing].m_positionY, PosTalkLocations[talkWing].m_positionZ); + break; + case EVENT_TALK_COMPLETE: + talkWing = 5; + Talk(talkWing); + _events.ScheduleEvent(EVENT_MOVE_TO_POINT, 5000); + break; + case EVENT_GET_TARGETS: + StoreTargets(); + break; + case EVENT_KELTHUZAD_2: + Talk(SAY_KELTHUZAD_2); + _events.ScheduleEvent(EVENT_KELTHUZAD_3, 8000); + break; + case EVENT_KELTHUZAD_3: + Talk(SAY_KELTHUZAD_3); + break; + case EVENT_DEATH_KNIGHTS_2: + Talk(SAY_DEATH_KNIGHTS_2); + if (Creature* creature = ObjectAccessor::GetCreature(*me, imageList[talkWing])) + { + creature->SetEntry(NPC_IMAGE_OF_BLAUMEUX); + creature->SetDisplayId(MODEL_IMAGE_OF_BLAUMEUX); + } + _events.ScheduleEvent(EVENT_DEATH_KNIGHTS_3, 10000); + break; + case EVENT_DEATH_KNIGHTS_3: + Talk(SAY_DEATH_KNIGHTS_3); + if (Creature* creature = ObjectAccessor::GetCreature(*me, imageList[talkWing])) + { + creature->SetEntry(NPC_IMAGE_OF_ZELIEK); + creature->SetDisplayId(MODEL_IMAGE_OF_ZELIEK); + } + _events.ScheduleEvent(EVENT_DEATH_KNIGHTS_4, 10000); + break; + case EVENT_DEATH_KNIGHTS_4: + Talk(SAY_DEATH_KNIGHTS_4); + break; + case EVENT_HEIGAN_2: + Talk(SAY_HEIGAN_2); + break; + default: + break; + } + } + DoMeleeAttackIfReady(); + } + private: + EventMap _events; + uint64 audienceList[10]; + uint64 imageList[5]; + uint8 talkWing; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_commander_eligor_dawnbringerAI(creature); + } }; /*###### @@ -1822,90 +1869,91 @@ enum TorturerLeCraft class npc_torturer_lecraft : public CreatureScript { - public: npc_torturer_lecraft() : CreatureScript("npc_torturer_lecraft") {} +public: + npc_torturer_lecraft() : CreatureScript("npc_torturer_lecraft") {} - struct npc_torturer_lecraftAI : public ScriptedAI + struct npc_torturer_lecraftAI : public ScriptedAI + { + npc_torturer_lecraftAI(Creature* creature) : ScriptedAI(creature) { - npc_torturer_lecraftAI(Creature* creature) : ScriptedAI(creature) - { - _playerGUID = 0; - } + _playerGUID = 0; + } - void Reset() - { - _textCounter = 1; - _playerGUID = 0; - } + void Reset() + { + _textCounter = 1; + _playerGUID = 0; + } - void EnterCombat(Unit* who) - { - _events.ScheduleEvent(EVENT_HEMORRHAGE, urand(5000, 8000)); - _events.ScheduleEvent(EVENT_KIDNEY_SHOT, urand(12000, 15000)); + void EnterCombat(Unit* who) + { + _events.ScheduleEvent(EVENT_HEMORRHAGE, urand(5000, 8000)); + _events.ScheduleEvent(EVENT_KIDNEY_SHOT, urand(12000, 15000)); - if (Player* player = who->ToPlayer()) - Talk (SAY_AGGRO, player); - } + if (Player* player = who->ToPlayer()) + Talk (SAY_AGGRO, player); + } - void SpellHit(Unit* caster, const SpellInfo* spell) + void SpellHit(Unit* caster, const SpellInfo* spell) + { + if (spell->Id != SPELL_HIGH_EXECUTORS_BRANDING_IRON) + return; + + if (Player* player = caster->ToPlayer()) { - if (spell->Id != SPELL_HIGH_EXECUTORS_BRANDING_IRON) + if (_textCounter == 1) + _playerGUID = player->GetGUID(); + + if (_playerGUID != player->GetGUID()) return; - if (Player* player = caster->ToPlayer()) - { - if (_textCounter == 1) - _playerGUID = player->GetGUID(); + Talk(_textCounter, player); - if (_playerGUID != player->GetGUID()) - return; + if (_textCounter == 5) + player->KilledMonsterCredit(NPC_TORTURER_LECRAFT, 0); - Talk(_textCounter, player); + ++_textCounter; - if (_textCounter == 5) - player->KilledMonsterCredit(NPC_TORTURER_LECRAFT, 0); - - ++_textCounter; - - if (_textCounter == 13) - _textCounter = 6; - } + if (_textCounter == 13) + _textCounter = 6; } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - _events.Update(diff); - - while (uint32 eventId = _events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_HEMORRHAGE: - DoCastVictim(SPELL_HEMORRHAGE); - _events.ScheduleEvent(EVENT_HEMORRHAGE, urand(12000, 168000)); - break; - case EVENT_KIDNEY_SHOT: - DoCastVictim(SPELL_KIDNEY_SHOT); - _events.ScheduleEvent(EVENT_KIDNEY_SHOT, urand(20000, 26000)); - break; - default: - break; - } - } - DoMeleeAttackIfReady(); - } - private: - EventMap _events; - uint8 _textCounter; - uint64 _playerGUID; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_torturer_lecraftAI(creature); } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_HEMORRHAGE: + DoCastVictim(SPELL_HEMORRHAGE); + _events.ScheduleEvent(EVENT_HEMORRHAGE, urand(12000, 168000)); + break; + case EVENT_KIDNEY_SHOT: + DoCastVictim(SPELL_KIDNEY_SHOT); + _events.ScheduleEvent(EVENT_KIDNEY_SHOT, urand(20000, 26000)); + break; + default: + break; + } + } + DoMeleeAttackIfReady(); + } + private: + EventMap _events; + uint8 _textCounter; + uint64 _playerGUID; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_torturer_lecraftAI(creature); + } }; void AddSC_dragonblight() diff --git a/src/server/scripts/Northrend/zone_grizzly_hills.cpp b/src/server/scripts/Northrend/zone_grizzly_hills.cpp index 87ccd6791..c3e120bf4 100644 --- a/src/server/scripts/Northrend/zone_grizzly_hills.cpp +++ b/src/server/scripts/Northrend/zone_grizzly_hills.cpp @@ -156,7 +156,7 @@ public: if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) Mrfloppy->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()); Talk(SAY_WORGRAGGRO3); - if (Creature* RWORG = me->SummonCreature(NPC_RAVENOUS_WORG, me->GetPositionX()+10, me->GetPositionY()+8, me->GetPositionZ()+2, 3.229f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000)) + if (Creature* RWORG = me->SummonCreature(NPC_RAVENOUS_WORG, me->GetPositionX() + 10, me->GetPositionY() + 8, me->GetPositionZ() + 2, 3.229f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000)) { RWORG->SetReactState(REACT_PASSIVE); RWORG->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); @@ -242,9 +242,9 @@ public: _RavenousworgGUID = 0; } - private: - uint64 _RavenousworgGUID; - uint64 _mrfloppyGUID; + private: + uint64 _RavenousworgGUID; + uint64 _mrfloppyGUID; }; bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) @@ -356,9 +356,9 @@ public: CombatAI::UpdateAI(diff); } - private: - bool _pacified; - bool _attack; + private: + bool _pacified; + bool _attack; }; CreatureAI* GetAI(Creature* creature) const @@ -405,8 +405,8 @@ public: void SpellHit(Unit* Caster, const SpellInfo* Spell) { - if (Spell->Id == SPELL_OUTHOUSE_GROANS) - { + if (Spell->Id == SPELL_OUTHOUSE_GROANS) + { ++_counter; if (_counter < 5) DoCast(Caster, SPELL_CAMERA_SHAKE, true); @@ -425,9 +425,9 @@ public: } } } - private: - uint8 _counter; - uint8 _gender; + private: + uint8 _counter; + uint8 _gender; }; CreatureAI* GetAI(Creature* creature) const @@ -472,8 +472,8 @@ public: } DoMeleeAttackIfReady(); } - private: - uint8 _phase; + private: + uint8 _phase; }; CreatureAI* GetAI(Creature* creature) const @@ -537,8 +537,8 @@ public: } UpdateVictim(); } - private: - EventMap _events; + private: + EventMap _events; }; CreatureAI* GetAI(Creature* creature) const @@ -586,12 +586,12 @@ public: void SpellHit(Unit* caster, const SpellInfo* spell) { if (spell->Id == SPELL_RENEW_SKIRMISHER && caster->GetTypeId() == TYPEID_PLAYER - && caster->ToPlayer()->GetQuestStatus(QUEST_OVERWHELMED) == QUEST_STATUS_INCOMPLETE) + && caster->ToPlayer()->GetQuestStatus(QUEST_OVERWHELMED) == QUEST_STATUS_INCOMPLETE) { DoCast(caster, SPELL_KILL_CREDIT); Talk(SAY_RANDOM, caster); if (me->IsStandState()) - me->GetMotionMaster()->MovePoint(1, me->GetPositionX()+7, me->GetPositionY()+7, me->GetPositionZ()); + me->GetMotionMaster()->MovePoint(1, me->GetPositionX() + 7, me->GetPositionY() + 7, me->GetPositionZ()); else { me->SetStandState(UNIT_STAND_STATE_STAND); @@ -607,9 +607,9 @@ public: DoMeleeAttackIfReady(); } - private: - uint64 _playerGUID; - uint32 _despawnTimer; + private: + uint64 _playerGUID; + uint32 _despawnTimer; }; CreatureAI* GetAI(Creature* creature) const @@ -668,17 +668,17 @@ public: { case EVENT_STRAGGLER_1: if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) - DoCast(player, SPELL_VENTURE_STRAGGLER_CREDIT); - me->GetMotionMaster()->MovePoint(0, me->GetPositionX()-7, me->GetPositionY()+7, me->GetPositionZ()); - _events.ScheduleEvent(EVENT_STRAGGLER_2, 2500); - break; + DoCast(player, SPELL_VENTURE_STRAGGLER_CREDIT); + me->GetMotionMaster()->MovePoint(0, me->GetPositionX() - 7, me->GetPositionY() + 7, me->GetPositionZ()); + _events.ScheduleEvent(EVENT_STRAGGLER_2, 2500); + break; case EVENT_STRAGGLER_2: - Talk(SAY_SEO); - me->GetMotionMaster()->MovePoint(0, me->GetPositionX()-7, me->GetPositionY()-5, me->GetPositionZ()); - _events.ScheduleEvent(EVENT_STRAGGLER_3, 2500); - break; + Talk(SAY_SEO); + me->GetMotionMaster()->MovePoint(0, me->GetPositionX() - 7, me->GetPositionY() - 5, me->GetPositionZ()); + _events.ScheduleEvent(EVENT_STRAGGLER_3, 2500); + break; case EVENT_STRAGGLER_3: - me->GetMotionMaster()->MovePoint(0, me->GetPositionX()-5, me->GetPositionY()-5, me->GetPositionZ()); + me->GetMotionMaster()->MovePoint(0, me->GetPositionX() - 5, me->GetPositionY() - 5, me->GetPositionZ()); _events.ScheduleEvent(EVENT_STRAGGLER_4, 2500); break; case EVENT_STRAGGLER_4: @@ -712,15 +712,15 @@ public: } } - private: - EventMap _events; - uint64 _playerGUID; - }; + private: + EventMap _events; + uint64 _playerGUID; + }; - CreatureAI* GetAI(Creature* creature) const - { - return new npc_venture_co_stragglerAI(creature); - } + CreatureAI* GetAI(Creature* creature) const + { + return new npc_venture_co_stragglerAI(creature); + } }; /*###### @@ -761,102 +761,102 @@ class npc_lake_frog : public CreatureScript public: npc_lake_frog() : CreatureScript("npc_lake_frog") { } - struct npc_lake_frogAI : public ScriptedAI + struct npc_lake_frogAI : public ScriptedAI + { + npc_lake_frogAI(Creature* creature) : ScriptedAI(creature) { } + + void Reset() { - npc_lake_frogAI(Creature* creature) : ScriptedAI(creature) { } - - void Reset() - { - _following = false; - _runningScript = false; - if (me->GetEntry() == NPC_LAKE_FROG_QUEST) - me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - } - - void UpdateAI(uint32 diff) - { - if (_following) - if (!me->HasAura(SPELL_FROG_LOVE)) - me->DespawnOrUnsummon(1000); - - _events.Update(diff); - - while (uint32 eventId = _events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_LAKEFROG_1: - DoCast(me, SPELL_MAIDEN_OF_ASHWOOD_LAKE_TRANSFORM); - me->SetEntry(NPC_MAIDEN_OF_ASHWOOD_LAKE); - _events.ScheduleEvent(EVENT_LAKEFROG_2, 2000); - break; - case EVENT_LAKEFROG_2: - Talk(SAY_MAIDEN_0); - _events.ScheduleEvent(EVENT_LAKEFROG_3, 3000); - break; - case EVENT_LAKEFROG_3: - me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - _events.ScheduleEvent(EVENT_LAKEFROG_4, 25000); - break; - case EVENT_LAKEFROG_4: - me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - _events.ScheduleEvent(EVENT_LAKEFROG_5, 2000); - break; - case EVENT_LAKEFROG_5: - Talk(SAY_MAIDEN_1); - me->DespawnOrUnsummon(4000); - break; - default: - break; - } - } - } - - void ReceiveEmote(Player* player, uint32 emote) - { - if (_following || _runningScript) - return; - - if (emote == TEXT_EMOTE_KISS && me->IsWithinDistInMap(player, 30.0f) && player->HasItemCount(ITEM_WARTS_B_GONE_LIP_BALM, 1, false)) - { - if (!player->HasAura(SPELL_WARTSBGONE_LIP_BALM)) - player->AddAura(SPELL_WARTS, player); - else - { - DoCast(player, SPELL_FROG_KISS); // Removes SPELL_WARTSBGONE_LIP_BALM - - if (me->GetEntry() == NPC_LAKE_FROG) - { - me->AddAura(SPELL_FROG_LOVE, me); - me->GetMotionMaster()->MoveFollow(player, 0.3f, frand(M_PI/2, M_PI + (M_PI/2))); - _following = true; - } - else if (me->GetEntry() == NPC_LAKE_FROG_QUEST) - { - me->GetMotionMaster()->MoveIdle(); - me->SetFacingToObject(player); - _runningScript = true; - _events.ScheduleEvent(EVENT_LAKEFROG_1, 2000); - } - } - } - } - - void sGossipSelect(Player* player, uint32 /*sender*/, uint32 /*action*/) - { - DoCast(player, SPELL_SUMMON_ASHWOOD_BRAND); - } - - private: - EventMap _events; - bool _following; - bool _runningScript; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_lake_frogAI(creature); + _following = false; + _runningScript = false; + if (me->GetEntry() == NPC_LAKE_FROG_QUEST) + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); } + + void UpdateAI(uint32 diff) + { + if (_following) + if (!me->HasAura(SPELL_FROG_LOVE)) + me->DespawnOrUnsummon(1000); + + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_LAKEFROG_1: + DoCast(me, SPELL_MAIDEN_OF_ASHWOOD_LAKE_TRANSFORM); + me->SetEntry(NPC_MAIDEN_OF_ASHWOOD_LAKE); + _events.ScheduleEvent(EVENT_LAKEFROG_2, 2000); + break; + case EVENT_LAKEFROG_2: + Talk(SAY_MAIDEN_0); + _events.ScheduleEvent(EVENT_LAKEFROG_3, 3000); + break; + case EVENT_LAKEFROG_3: + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + _events.ScheduleEvent(EVENT_LAKEFROG_4, 25000); + break; + case EVENT_LAKEFROG_4: + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + _events.ScheduleEvent(EVENT_LAKEFROG_5, 2000); + break; + case EVENT_LAKEFROG_5: + Talk(SAY_MAIDEN_1); + me->DespawnOrUnsummon(4000); + break; + default: + break; + } + } + } + + void ReceiveEmote(Player* player, uint32 emote) + { + if (_following || _runningScript) + return; + + if (emote == TEXT_EMOTE_KISS && me->IsWithinDistInMap(player, 30.0f) && player->HasItemCount(ITEM_WARTS_B_GONE_LIP_BALM, 1, false)) + { + if (!player->HasAura(SPELL_WARTSBGONE_LIP_BALM)) + player->AddAura(SPELL_WARTS, player); + else + { + DoCast(player, SPELL_FROG_KISS); // Removes SPELL_WARTSBGONE_LIP_BALM + + if (me->GetEntry() == NPC_LAKE_FROG) + { + me->AddAura(SPELL_FROG_LOVE, me); + me->GetMotionMaster()->MoveFollow(player, 0.3f, frand(M_PI / 2, M_PI + (M_PI / 2))); + _following = true; + } + else if (me->GetEntry() == NPC_LAKE_FROG_QUEST) + { + me->GetMotionMaster()->MoveIdle(); + me->SetFacingToObject(player); + _runningScript = true; + _events.ScheduleEvent(EVENT_LAKEFROG_1, 2000); + } + } + } + } + + void sGossipSelect(Player* player, uint32 /*sender*/, uint32 /*action*/) + { + DoCast(player, SPELL_SUMMON_ASHWOOD_BRAND); + } + + private: + EventMap _events; + bool _following; + bool _runningScript; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_lake_frogAI(creature); + } }; enum ShredderDelivery @@ -866,34 +866,34 @@ enum ShredderDelivery class spell_shredder_delivery : public SpellScriptLoader { - public: - spell_shredder_delivery() : SpellScriptLoader("spell_shredder_delivery") { } +public: + spell_shredder_delivery() : SpellScriptLoader("spell_shredder_delivery") { } - class spell_shredder_delivery_SpellScript : public SpellScript + class spell_shredder_delivery_SpellScript : public SpellScript + { + PrepareSpellScript(spell_shredder_delivery_SpellScript); + + bool Load() { - PrepareSpellScript(spell_shredder_delivery_SpellScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_UNIT; - } - - void HandleScript(SpellEffIndex /*effIndex*/) - { - if (GetCaster()->ToCreature()->GetEntry() == NPC_BROKEN_DOWN_SHREDDER) - GetCaster()->ToCreature()->DespawnOrUnsummon(); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_shredder_delivery_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_shredder_delivery_SpellScript(); + return GetCaster()->GetTypeId() == TYPEID_UNIT; } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + if (GetCaster()->ToCreature()->GetEntry() == NPC_BROKEN_DOWN_SHREDDER) + GetCaster()->ToCreature()->DespawnOrUnsummon(); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_shredder_delivery_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_shredder_delivery_SpellScript(); + } }; enum InfectedWorgenBite @@ -904,34 +904,34 @@ enum InfectedWorgenBite class spell_infected_worgen_bite : public SpellScriptLoader { - public: - spell_infected_worgen_bite() : SpellScriptLoader("spell_infected_worgen_bite") { } - - class spell_infected_worgen_bite_AuraScript : public AuraScript - { - PrepareAuraScript(spell_infected_worgen_bite_AuraScript); - - void HandleAfterEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - if (target->GetTypeId() == TYPEID_PLAYER) - if (GetStackAmount() == GetSpellInfo()->StackAmount) - { - SetDuration(0); - target->CastSpell(target, SPELL_WORGENS_CALL, true); - } - } - - void Register() - { - AfterEffectApply += AuraEffectApplyFn(spell_infected_worgen_bite_AuraScript::HandleAfterEffectApply, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAPPLY); - } - }; +public: + spell_infected_worgen_bite() : SpellScriptLoader("spell_infected_worgen_bite") { } - AuraScript* GetAuraScript() const + class spell_infected_worgen_bite_AuraScript : public AuraScript + { + PrepareAuraScript(spell_infected_worgen_bite_AuraScript); + + void HandleAfterEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - return new spell_infected_worgen_bite_AuraScript(); + Unit* target = GetTarget(); + if (target->GetTypeId() == TYPEID_PLAYER) + if (GetStackAmount() == GetSpellInfo()->StackAmount) + { + SetDuration(0); + target->CastSpell(target, SPELL_WORGENS_CALL, true); + } } + + void Register() + { + AfterEffectApply += AuraEffectApplyFn(spell_infected_worgen_bite_AuraScript::HandleAfterEffectApply, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAPPLY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_infected_worgen_bite_AuraScript(); + } }; void AddSC_grizzly_hills() diff --git a/src/server/scripts/Northrend/zone_howling_fjord.cpp b/src/server/scripts/Northrend/zone_howling_fjord.cpp index 5ec167d64..2d6d2bf48 100644 --- a/src/server/scripts/Northrend/zone_howling_fjord.cpp +++ b/src/server/scripts/Northrend/zone_howling_fjord.cpp @@ -61,7 +61,7 @@ public: } }; - CreatureAI *GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const { return new npc_attracted_reef_bullAI(creature); } @@ -130,7 +130,7 @@ public: } }; - CreatureAI *GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const { return new npc_your_inner_turmoilAI(creature); } @@ -169,7 +169,7 @@ public: struct npc_Apothecary_HanesAI : public npc_escortAI { - npc_Apothecary_HanesAI(Creature* creature) : npc_escortAI(creature){ } + npc_Apothecary_HanesAI(Creature* creature) : npc_escortAI(creature) { } uint32 PotTimer; void Reset() @@ -192,7 +192,8 @@ public: { DoCast(me, SPELL_HEALING_POTION, true); PotTimer = 10000; - } else PotTimer -= diff; + } + else PotTimer -= diff; } if (GetAttack() && UpdateVictim()) DoMeleeAttackIfReady(); @@ -341,7 +342,7 @@ public: SendGossipMenuFor(player, GOSSIP_TEXTID_RAZAEL1, creature->GetGUID()); return true; } - break; + break; case NPC_LYANA: if (!player->GetReqKillOrCastCurrentCount(QUEST_REPORTS_FROM_THE_FIELD, NPC_LYANA)) { @@ -349,7 +350,7 @@ public: SendGossipMenuFor(player, GOSSIP_TEXTID_LYANA1, creature->GetGUID()); return true; } - break; + break; } SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); return true; @@ -383,4 +384,4 @@ void AddSC_howling_fjord() new npc_apothecary_hanes(); new npc_plaguehound_tracker(); new npc_razael_and_lyana(); - } +} diff --git a/src/server/scripts/Northrend/zone_icecrown.cpp b/src/server/scripts/Northrend/zone_icecrown.cpp index ee3298749..a5759e9d5 100644 --- a/src/server/scripts/Northrend/zone_icecrown.cpp +++ b/src/server/scripts/Northrend/zone_icecrown.cpp @@ -105,7 +105,7 @@ public: { npc_battle_at_valhalasAI(Creature* creature) : ScriptedAI(creature), summons(me) { - playerGUID2= 0; + playerGUID2 = 0; } EventMap events; @@ -219,96 +219,96 @@ public: switch (events.GetEvent()) { case EVENT_VALHALAS_FIRST: - { - switch (currentQuest) { - case QUEST_BFV_FALLEN_HEROES: - events.ScheduleEvent(EVENT_VALHALAS_SECOND, 8000); - me->MonsterYell("$N and comrades in arms have chosen to accept honorable combat within the sacred confines of Valhalas.", LANG_UNIVERSAL, ObjectAccessor::GetPlayer(*me, playerGUID)); - break; - case QUEST_BFV_DARK_MASTER: - events.ScheduleEvent(EVENT_VALHALAS_SECOND, 8000); - me->MonsterYell("$N has accepted the challenge of Khit'rix the Dark Master. May the gods show mercy upon him for Khit'rix surely will not.", LANG_UNIVERSAL, ObjectAccessor::GetPlayer(*me, playerGUID)); - break; - case QUEST_BFV_SIGRID: - PrepareSummons(); - me->MonsterTextEmote("Circling Valhalas, Sigrid Iceborn approaches to seek her revenge!", NULL, true); - break; - case QUEST_BFV_CARNAGE: - events.ScheduleEvent(EVENT_VALHALAS_SECOND, 8000); - me->MonsterYell("From the bowels of the Underhalls comes Carnage. Brave and foolish $N has accepted the challenge. $N and his group stand ready to face the monstrosity.", LANG_UNIVERSAL, ObjectAccessor::GetPlayer(*me, playerGUID)); - break; - case QUEST_BFV_THANE: - events.ScheduleEvent(EVENT_VALHALAS_SECOND, 8000); - me->MonsterYell("Thane Banahogg returns to Valhalas for the first time in ages to prove that the vrykul are the only beings worthy to fight within its sacred ring. Will $N prove him wrong?", LANG_UNIVERSAL, ObjectAccessor::GetPlayer(*me, playerGUID)); - break; - case QUEST_BFV_FINAL: - events.ScheduleEvent(EVENT_VALHALAS_SECOND, 8000); - me->MonsterYell("From the depths of Icecrown Citadel, one of the Lich King's chosen comes to put an end to the existence of $N and his friends.", LANG_UNIVERSAL, ObjectAccessor::GetPlayer(*me, playerGUID)); - break; - } - - me->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+20.0f); - me->SetPosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+20.0f, me->GetOrientation()); - events.PopEvent(); - break; - } - case EVENT_VALHALAS_SECOND: - { - switch (currentQuest) - { - case QUEST_BFV_FALLEN_HEROES: - me->MonsterYell("There can only be one outcome to such a battle: death for one side or the other. Let $n prove himself upon the bones of these outsiders who have fallen before!", LANG_UNIVERSAL, ObjectAccessor::GetPlayer(*me, playerGUID)); - me->MonsterTextEmote("The fallen heroes of Valhalas emerge from the ground to do battle once more!", NULL, true); - break; - case QUEST_BFV_DARK_MASTER: - me->MonsterTextEmote("Khit'rix the Dark Master skitters into Valhalas from the southeast!", NULL, true); - break; - case QUEST_BFV_CARNAGE: - me->MonsterTextEmote("Lumbering in from the south, the smell of Carnage precedes him!", NULL, true); - break; - case QUEST_BFV_THANE: - me->MonsterTextEmote("Thane Banahogg appears upon the overlook to the southeast!", NULL, true); - break; - case QUEST_BFV_FINAL: - me->MonsterYell("Warriors of Jotunheim, I present to you, Blood Prince Sandoval!", LANG_UNIVERSAL, nullptr); - me->MonsterTextEmote("Without warning, Prince Sandoval magically appears within Valhalas!", NULL, true); - break; - } - - PrepareSummons(); - events.PopEvent(); - break; - } - case EVENT_VALHALAS_THIRD: - { - events.PopEvent(); - me->MonsterYell("In defeating him, he and his fighting companions have proven themselves worthy of battle in this most sacred place of vrykul honor.", LANG_UNIVERSAL, ObjectAccessor::GetPlayer(*me, playerGUID)); - events.ScheduleEvent(EVENT_VALHALAS_THIRD+2, 7000); - break; - } - case EVENT_VALHALAS_THIRD+2: - { - events.PopEvent(); - me->MonsterYell("ALL HAIL $N, CHAMPION OF VALHALAS! ", LANG_UNIVERSAL, ObjectAccessor::GetPlayer(*me, playerGUID2)); - break; - } - case EVENT_VALHALAS_CHECK_PLAYER: - { - bool fail = true; - if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) - if (me->GetDistance(player) < 100.0f) + switch (currentQuest) { - fail = false; - CheckSummons(); + case QUEST_BFV_FALLEN_HEROES: + events.ScheduleEvent(EVENT_VALHALAS_SECOND, 8000); + me->MonsterYell("$N and comrades in arms have chosen to accept honorable combat within the sacred confines of Valhalas.", LANG_UNIVERSAL, ObjectAccessor::GetPlayer(*me, playerGUID)); + break; + case QUEST_BFV_DARK_MASTER: + events.ScheduleEvent(EVENT_VALHALAS_SECOND, 8000); + me->MonsterYell("$N has accepted the challenge of Khit'rix the Dark Master. May the gods show mercy upon him for Khit'rix surely will not.", LANG_UNIVERSAL, ObjectAccessor::GetPlayer(*me, playerGUID)); + break; + case QUEST_BFV_SIGRID: + PrepareSummons(); + me->MonsterTextEmote("Circling Valhalas, Sigrid Iceborn approaches to seek her revenge!", NULL, true); + break; + case QUEST_BFV_CARNAGE: + events.ScheduleEvent(EVENT_VALHALAS_SECOND, 8000); + me->MonsterYell("From the bowels of the Underhalls comes Carnage. Brave and foolish $N has accepted the challenge. $N and his group stand ready to face the monstrosity.", LANG_UNIVERSAL, ObjectAccessor::GetPlayer(*me, playerGUID)); + break; + case QUEST_BFV_THANE: + events.ScheduleEvent(EVENT_VALHALAS_SECOND, 8000); + me->MonsterYell("Thane Banahogg returns to Valhalas for the first time in ages to prove that the vrykul are the only beings worthy to fight within its sacred ring. Will $N prove him wrong?", LANG_UNIVERSAL, ObjectAccessor::GetPlayer(*me, playerGUID)); + break; + case QUEST_BFV_FINAL: + events.ScheduleEvent(EVENT_VALHALAS_SECOND, 8000); + me->MonsterYell("From the depths of Icecrown Citadel, one of the Lich King's chosen comes to put an end to the existence of $N and his friends.", LANG_UNIVERSAL, ObjectAccessor::GetPlayer(*me, playerGUID)); + break; } - if (fail) - EnterEvadeMode(); + me->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 20.0f); + me->SetPosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 20.0f, me->GetOrientation()); + events.PopEvent(); + break; + } + case EVENT_VALHALAS_SECOND: + { + switch (currentQuest) + { + case QUEST_BFV_FALLEN_HEROES: + me->MonsterYell("There can only be one outcome to such a battle: death for one side or the other. Let $n prove himself upon the bones of these outsiders who have fallen before!", LANG_UNIVERSAL, ObjectAccessor::GetPlayer(*me, playerGUID)); + me->MonsterTextEmote("The fallen heroes of Valhalas emerge from the ground to do battle once more!", NULL, true); + break; + case QUEST_BFV_DARK_MASTER: + me->MonsterTextEmote("Khit'rix the Dark Master skitters into Valhalas from the southeast!", NULL, true); + break; + case QUEST_BFV_CARNAGE: + me->MonsterTextEmote("Lumbering in from the south, the smell of Carnage precedes him!", NULL, true); + break; + case QUEST_BFV_THANE: + me->MonsterTextEmote("Thane Banahogg appears upon the overlook to the southeast!", NULL, true); + break; + case QUEST_BFV_FINAL: + me->MonsterYell("Warriors of Jotunheim, I present to you, Blood Prince Sandoval!", LANG_UNIVERSAL, nullptr); + me->MonsterTextEmote("Without warning, Prince Sandoval magically appears within Valhalas!", NULL, true); + break; + } - events.RepeatEvent(5000); - break; - } + PrepareSummons(); + events.PopEvent(); + break; + } + case EVENT_VALHALAS_THIRD: + { + events.PopEvent(); + me->MonsterYell("In defeating him, he and his fighting companions have proven themselves worthy of battle in this most sacred place of vrykul honor.", LANG_UNIVERSAL, ObjectAccessor::GetPlayer(*me, playerGUID)); + events.ScheduleEvent(EVENT_VALHALAS_THIRD + 2, 7000); + break; + } + case EVENT_VALHALAS_THIRD+2: + { + events.PopEvent(); + me->MonsterYell("ALL HAIL $N, CHAMPION OF VALHALAS! ", LANG_UNIVERSAL, ObjectAccessor::GetPlayer(*me, playerGUID2)); + break; + } + case EVENT_VALHALAS_CHECK_PLAYER: + { + bool fail = true; + if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) + if (me->GetDistance(player) < 100.0f) + { + fail = false; + CheckSummons(); + } + + if (fail) + EnterEvadeMode(); + + events.RepeatEvent(5000); + break; + } } } }; @@ -344,7 +344,7 @@ public: return true; } - CreatureAI *GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const { return new npc_battle_at_valhalasAI(creature); } @@ -385,9 +385,9 @@ public: if (summonTimer >= 8000) { for (uint8 i = 0; i < 3; ++i) - me->SummonCreature(30593, me->GetPositionX()+irand(-5, 5), me->GetPositionY()+irand(-5, 5), me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); + me->SummonCreature(30593, me->GetPositionX() + irand(-5, 5), me->GetPositionY() + irand(-5, 5), me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (roll_chance_i(10)) - me->SummonCreature(30575, me->GetPositionX()+irand(-5, 5), me->GetPositionY()+irand(-5, 5), me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); + me->SummonCreature(30575, me->GetPositionX() + irand(-5, 5), me->GetPositionY() + irand(-5, 5), me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); summonTimer = 0; } } @@ -396,7 +396,7 @@ public: } }; - CreatureAI *GetAI(Creature *creature) const + CreatureAI* GetAI(Creature* creature) const { return new npc_llod_genericAI(creature); } @@ -444,188 +444,188 @@ enum eLordArete class npc_lord_arete : public CreatureScript { - public: - npc_lord_arete(): CreatureScript("npc_lord_arete"){} +public: + npc_lord_arete(): CreatureScript("npc_lord_arete") {} - struct npc_lord_areteAI : ScriptedAI + struct npc_lord_areteAI : ScriptedAI + { + npc_lord_areteAI(Creature* creature) : ScriptedAI(creature) {} + + EventMap events; + uint64 _landgrenGUID; + uint64 _landgrenSoulGUID; + + void InitializeAI() { - npc_lord_areteAI(Creature* creature) : ScriptedAI(creature) {} + _landgrenGUID = 0; + _landgrenSoulGUID = 0; - EventMap events; - uint64 _landgrenGUID; - uint64 _landgrenSoulGUID; - - void InitializeAI() - { - _landgrenGUID = 0; - _landgrenSoulGUID = 0; - - events.Reset(); - events.RescheduleEvent(EVENT_START, 1000); - me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); - me->SetWalk(true); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); - me->setActive(true); - me->SetReactState(REACT_PASSIVE); - } - - void UpdateAI(uint32 diff) - { - events.Update(diff); - switch (events.ExecuteEvent()) - { - case EVENT_START: - Talk(SAY_ARETE_0); - me->CastSpell(me, SPELL_TELEPORT_EFFECT, true); - if (Creature* cr = me->FindNearestCreature(NPC_LANDGREN, 100.0f, false)) - { - _landgrenGUID = cr->GetGUID(); - - float o = cr->GetAngle(me); - me->GetMotionMaster()->MovePoint(1, cr->GetPositionX()+cos(o)*3, cr->GetPositionY()+sin(o)*3, cr->GetPositionZ()); - events.RescheduleEvent(EVENT_SOUL_COAX, 5000); - } - else - me->DespawnOrUnsummon(1); - break; - case EVENT_SOUL_COAX: - Talk(SAY_ARETE_1); - me->CastSpell(me, SPELL_SOUL_COAX, false); - events.ScheduleEvent(EVENT_SUMMON_SOUL, 8000); - break; - case EVENT_SUMMON_SOUL: - if (Creature* cr = ObjectAccessor::GetCreature(*me, _landgrenGUID)) - cr->CastSpell(cr, SPELL_SUMMON_LANDGREN_SOUL, true); - if (Creature* soul = me->FindNearestCreature(NPC_LANDGREN_SOUL, 100.0f)) - { - _landgrenSoulGUID = soul->GetGUID(); - soul->SetVisible(false); - } - events.ScheduleEvent(EVENT_SOUL_FLY, 3000); - break; - case EVENT_SOUL_FLY: - if (Creature* soul = ObjectAccessor::GetCreature(*me, _landgrenSoulGUID)) - { - soul->SetCanFly(true); - soul->SetVisible(true); - Movement::MoveSplineInit init(soul); - init.MoveTo(soul->GetPositionX(), soul->GetPositionY(), soul->GetPositionZ()+5.0f); - init.SetVelocity(1.0f); - init.Launch(); - soul->CastSpell(soul, 64462, true); // Drown - } - events.ScheduleEvent(EVENT_SCENE_1, 6000); - break; - case EVENT_SCENE_1: - if (Creature* soul = ObjectAccessor::GetCreature(*me, _landgrenSoulGUID)) - { - soul->SetPosition(soul->GetPositionX(), soul->GetPositionY(), soul->GetPositionZ()+5.0f, soul->GetOrientation()); - soul->CastSpell(soul, 64462, true); // Drown - soul->AI()->Talk(SAY_SOUL_0); - } - events.ScheduleEvent(EVENT_SCENE_2, 5000); - break; - case EVENT_SCENE_2: - Talk(SAY_ARETE_2); - events.ScheduleEvent(EVENT_SCENE_3, 5000); - break; - case EVENT_SCENE_3: - if (Creature* soul = ObjectAccessor::GetCreature(*me, _landgrenSoulGUID)) - soul->AI()->Talk(SAY_SOUL_1); - events.ScheduleEvent(EVENT_SCENE_4, 3000); - break; - case EVENT_SCENE_4: - if (Creature* soul = ObjectAccessor::GetCreature(*me, _landgrenSoulGUID)) - me->CastSpell(soul, SPELL_SOUL_WRACK, false); - Talk(SAY_ARETE_3); - events.ScheduleEvent(EVENT_SCENE_5, 6000); - break; - case EVENT_SCENE_5: - if (Creature* soul = ObjectAccessor::GetCreature(*me, _landgrenSoulGUID)) - soul->AI()->Talk(SAY_SOUL_2); - me->InterruptNonMeleeSpells(false); - events.ScheduleEvent(EVENT_SCENE_6, 4000); - break; - case EVENT_SCENE_6: - Talk(SAY_ARETE_4); - events.ScheduleEvent(EVENT_SCENE_7, 4000); - break; - case EVENT_SCENE_7: - if (Creature* soul = ObjectAccessor::GetCreature(*me, _landgrenSoulGUID)) - soul->AI()->Talk(SAY_SOUL_3); - events.ScheduleEvent(EVENT_SCENE_8, 8000); - break; - case EVENT_SCENE_8: - if (Creature* soul = ObjectAccessor::GetCreature(*me, _landgrenSoulGUID)) - me->CastSpell(soul, SPELL_SOUL_WRACK, false); - Talk(SAY_ARETE_5); - events.ScheduleEvent(EVENT_SCENE_9, 6000); - break; - case EVENT_SCENE_9: - if (Creature* soul = ObjectAccessor::GetCreature(*me, _landgrenSoulGUID)) - { - soul->AI()->Talk(SAY_SOUL_4); - soul->DespawnOrUnsummon(2000); - } - events.ScheduleEvent(EVENT_SCENE_10, 3000); - break; - case EVENT_SCENE_10: - me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER); - Talk(SAY_ARETE_6); - me->DespawnOrUnsummon(60000); - break; - } - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_lord_areteAI(creature); + events.Reset(); + events.RescheduleEvent(EVENT_START, 1000); + me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); + me->SetWalk(true); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + me->setActive(true); + me->SetReactState(REACT_PASSIVE); } + + void UpdateAI(uint32 diff) + { + events.Update(diff); + switch (events.ExecuteEvent()) + { + case EVENT_START: + Talk(SAY_ARETE_0); + me->CastSpell(me, SPELL_TELEPORT_EFFECT, true); + if (Creature* cr = me->FindNearestCreature(NPC_LANDGREN, 100.0f, false)) + { + _landgrenGUID = cr->GetGUID(); + + float o = cr->GetAngle(me); + me->GetMotionMaster()->MovePoint(1, cr->GetPositionX() + cos(o) * 3, cr->GetPositionY() + sin(o) * 3, cr->GetPositionZ()); + events.RescheduleEvent(EVENT_SOUL_COAX, 5000); + } + else + me->DespawnOrUnsummon(1); + break; + case EVENT_SOUL_COAX: + Talk(SAY_ARETE_1); + me->CastSpell(me, SPELL_SOUL_COAX, false); + events.ScheduleEvent(EVENT_SUMMON_SOUL, 8000); + break; + case EVENT_SUMMON_SOUL: + if (Creature* cr = ObjectAccessor::GetCreature(*me, _landgrenGUID)) + cr->CastSpell(cr, SPELL_SUMMON_LANDGREN_SOUL, true); + if (Creature* soul = me->FindNearestCreature(NPC_LANDGREN_SOUL, 100.0f)) + { + _landgrenSoulGUID = soul->GetGUID(); + soul->SetVisible(false); + } + events.ScheduleEvent(EVENT_SOUL_FLY, 3000); + break; + case EVENT_SOUL_FLY: + if (Creature* soul = ObjectAccessor::GetCreature(*me, _landgrenSoulGUID)) + { + soul->SetCanFly(true); + soul->SetVisible(true); + Movement::MoveSplineInit init(soul); + init.MoveTo(soul->GetPositionX(), soul->GetPositionY(), soul->GetPositionZ() + 5.0f); + init.SetVelocity(1.0f); + init.Launch(); + soul->CastSpell(soul, 64462, true); // Drown + } + events.ScheduleEvent(EVENT_SCENE_1, 6000); + break; + case EVENT_SCENE_1: + if (Creature* soul = ObjectAccessor::GetCreature(*me, _landgrenSoulGUID)) + { + soul->SetPosition(soul->GetPositionX(), soul->GetPositionY(), soul->GetPositionZ() + 5.0f, soul->GetOrientation()); + soul->CastSpell(soul, 64462, true); // Drown + soul->AI()->Talk(SAY_SOUL_0); + } + events.ScheduleEvent(EVENT_SCENE_2, 5000); + break; + case EVENT_SCENE_2: + Talk(SAY_ARETE_2); + events.ScheduleEvent(EVENT_SCENE_3, 5000); + break; + case EVENT_SCENE_3: + if (Creature* soul = ObjectAccessor::GetCreature(*me, _landgrenSoulGUID)) + soul->AI()->Talk(SAY_SOUL_1); + events.ScheduleEvent(EVENT_SCENE_4, 3000); + break; + case EVENT_SCENE_4: + if (Creature* soul = ObjectAccessor::GetCreature(*me, _landgrenSoulGUID)) + me->CastSpell(soul, SPELL_SOUL_WRACK, false); + Talk(SAY_ARETE_3); + events.ScheduleEvent(EVENT_SCENE_5, 6000); + break; + case EVENT_SCENE_5: + if (Creature* soul = ObjectAccessor::GetCreature(*me, _landgrenSoulGUID)) + soul->AI()->Talk(SAY_SOUL_2); + me->InterruptNonMeleeSpells(false); + events.ScheduleEvent(EVENT_SCENE_6, 4000); + break; + case EVENT_SCENE_6: + Talk(SAY_ARETE_4); + events.ScheduleEvent(EVENT_SCENE_7, 4000); + break; + case EVENT_SCENE_7: + if (Creature* soul = ObjectAccessor::GetCreature(*me, _landgrenSoulGUID)) + soul->AI()->Talk(SAY_SOUL_3); + events.ScheduleEvent(EVENT_SCENE_8, 8000); + break; + case EVENT_SCENE_8: + if (Creature* soul = ObjectAccessor::GetCreature(*me, _landgrenSoulGUID)) + me->CastSpell(soul, SPELL_SOUL_WRACK, false); + Talk(SAY_ARETE_5); + events.ScheduleEvent(EVENT_SCENE_9, 6000); + break; + case EVENT_SCENE_9: + if (Creature* soul = ObjectAccessor::GetCreature(*me, _landgrenSoulGUID)) + { + soul->AI()->Talk(SAY_SOUL_4); + soul->DespawnOrUnsummon(2000); + } + events.ScheduleEvent(EVENT_SCENE_10, 3000); + break; + case EVENT_SCENE_10: + me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER); + Talk(SAY_ARETE_6); + me->DespawnOrUnsummon(60000); + break; + } + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_lord_areteAI(creature); + } }; class npc_boneguard_footman : public CreatureScript { - public: - npc_boneguard_footman(): CreatureScript("npc_boneguard_footman"){} +public: + npc_boneguard_footman(): CreatureScript("npc_boneguard_footman") {} - struct npc_boneguard_footmanAI : ScriptedAI + struct npc_boneguard_footmanAI : ScriptedAI + { + npc_boneguard_footmanAI(Creature* creature) : ScriptedAI(creature) { - npc_boneguard_footmanAI(Creature* creature) : ScriptedAI(creature) + checkTimer = 0; + } + + uint32 checkTimer; + + void UpdateAI(uint32 diff) + { + if (!me->IsInCombat()) + return; + + checkTimer += diff; + if (checkTimer >= 500) { checkTimer = 0; - } - - uint32 checkTimer; - - void UpdateAI(uint32 diff) - { - if (!me->IsInCombat()) - return; - - checkTimer += diff; - if (checkTimer >= 500) + if (Unit* victim = me->GetVictim()) { - checkTimer = 0; - if (Unit* victim = me->GetVictim()) + if (victim->GetEntry() == 33531 /*NPC_CAMPAIGN_WARHORSE*/ && me->GetDistance2d(victim) < 3.0f && victim->isMoving()) { - if (victim->GetEntry() == 33531 /*NPC_CAMPAIGN_WARHORSE*/ && me->GetDistance2d(victim) < 3.0f && victim->isMoving()) - { - me->LowerPlayerDamageReq(me->GetMaxHealth()); - Unit::Kill(victim, me); - return; - } + me->LowerPlayerDamageReq(me->GetMaxHealth()); + Unit::Kill(victim, me); + return; } } - - ScriptedAI::UpdateAI(diff); } - }; - CreatureAI* GetAI(Creature* creature) const - { - return new npc_boneguard_footmanAI(creature); + ScriptedAI::UpdateAI(diff); } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_boneguard_footmanAI(creature); + } }; enum tirionsGambit @@ -663,87 +663,87 @@ enum tirionsGambit class npc_tirions_gambit_tirion : public CreatureScript { - public: - npc_tirions_gambit_tirion(): CreatureScript("npc_tirions_gambit_tirion"){} +public: + npc_tirions_gambit_tirion(): CreatureScript("npc_tirions_gambit_tirion") {} - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 /*action*/) override + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 /*action*/) override + { + CloseGossipMenuFor(player); + creature->AI()->DoAction(ACTION_START_EVENT); + return true; + } + + struct npc_tirions_gambit_tirionAI : npc_escortAI + { + npc_tirions_gambit_tirionAI(Creature* creature) : npc_escortAI(creature), summons(me) { - CloseGossipMenuFor(player); - creature->AI()->DoAction(ACTION_START_EVENT); - return true; } - struct npc_tirions_gambit_tirionAI : npc_escortAI + EventMap events; + SummonList summons; + + void Reset() override { - npc_tirions_gambit_tirionAI(Creature* creature) : npc_escortAI(creature), summons(me) - { - } + me->setActive(false); + me->SetStandState(UNIT_STAND_STATE_STAND); + } - EventMap events; - SummonList summons; + void SetData(uint32 type, uint32 data) override + { + if (type == 1 && data == 1) + events.ScheduleEvent(EVENT_SCENE_0 + 30, 10000); + } - void Reset() override + void DoAction(int32 param) override + { + if (param == ACTION_START_EVENT) { - me->setActive(false); - me->SetStandState(UNIT_STAND_STATE_STAND); - } + me->setActive(true); - void SetData(uint32 type, uint32 data) override - { - if (type == 1 && data == 1) - events.ScheduleEvent(EVENT_SCENE_0+30, 10000); - } + Talk(0); + events.Reset(); + summons.DespawnAll(); + Start(false, false); - void DoAction(int32 param) override - { - if (param == ACTION_START_EVENT) + int8 i = -1; + std::list cList; + GetCreatureListWithEntryInGrid(cList, me, NPC_DISGUISED_CRUSADER, 15.0f); + for (std::list::const_iterator itr = cList.begin(); itr != cList.end(); ++itr, ++i) { - me->setActive(true); - - Talk(0); - events.Reset(); - summons.DespawnAll(); - Start(false, false); - - int8 i = -1; - std::list cList; - GetCreatureListWithEntryInGrid(cList, me, NPC_DISGUISED_CRUSADER, 15.0f); - for (std::list::const_iterator itr = cList.begin(); itr != cList.end(); ++itr, ++i) - { - (*itr)->SetWalk(true); - (*itr)->GetMotionMaster()->MoveFollow(me, 1.0f, Position::NormalizeOrientation(M_PI*i/2.0f)); - summons.Summon(*itr); - } + (*itr)->SetWalk(true); + (*itr)->GetMotionMaster()->MoveFollow(me, 1.0f, Position::NormalizeOrientation(M_PI * i / 2.0f)); + summons.Summon(*itr); } } + } - void JustSummoned(Creature* summon) override + void JustSummoned(Creature* summon) override + { + summons.Summon(summon); + if (summon->GetEntry() == NPC_CHOSEN_ZEALOT || summon->GetEntry() == NPC_TIRION_LICH_KING) + summon->SetWalk(true); + else if (summon->GetEntry() != NPC_INVOKER_BASALEPH) { - summons.Summon(summon); - if (summon->GetEntry() == NPC_CHOSEN_ZEALOT || summon->GetEntry() == NPC_TIRION_LICH_KING) - summon->SetWalk(true); - else if (summon->GetEntry() != NPC_INVOKER_BASALEPH) - { - summon->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY2H); - summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); - summon->GetMotionMaster()->MovePoint(4, 6135.97f, 2753.84f, 573.92f); - } + summon->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY2H); + summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + summon->GetMotionMaster()->MovePoint(4, 6135.97f, 2753.84f, 573.92f); } + } - void SummonedCreatureDespawn(Creature* summon) override - { - summons.Despawn(summon); - } + void SummonedCreatureDespawn(Creature* summon) override + { + summons.Despawn(summon); + } - void WaypointReached(uint32 pointId) override + void WaypointReached(uint32 pointId) override + { + switch (pointId) { - switch (pointId) - { - case 6: - me->SummonCreature(NPC_INVOKER_BASALEPH, 6130.26f, 2764.83f, 573.92f, 5.19f, TEMPSUMMON_TIMED_DESPAWN, 10*MINUTE*IN_MILLISECONDS); - Talk(1); - break; - case 15: + case 6: + me->SummonCreature(NPC_INVOKER_BASALEPH, 6130.26f, 2764.83f, 573.92f, 5.19f, TEMPSUMMON_TIMED_DESPAWN, 10 * MINUTE * IN_MILLISECONDS); + Talk(1); + break; + case 15: { uint8 i = 1; for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr, ++i) @@ -751,168 +751,168 @@ class npc_tirions_gambit_tirion : public CreatureScript if (summon->GetEntry() == NPC_DISGUISED_CRUSADER) { summon->GetMotionMaster()->Clear(false); - summon->GetMotionMaster()->MovePoint(1, 6165.3f + 3*i, 2759.85f + 1.5f*i, 573.914f); + summon->GetMotionMaster()->MovePoint(1, 6165.3f + 3 * i, 2759.85f + 1.5f * i, 573.914f); } break; } - case 17: - SetEscortPaused(true); - events.ScheduleEvent(EVENT_START_SCENE, 7000); - break; - case 19: - SetEscortPaused(true); - events.ScheduleEvent(EVENT_SCENE_0+8, 5000); - break; - } + case 17: + SetEscortPaused(true); + events.ScheduleEvent(EVENT_START_SCENE, 7000); + break; + case 19: + SetEscortPaused(true); + events.ScheduleEvent(EVENT_SCENE_0 + 8, 5000); + break; } + } - void DoSummonAction(uint32 entry, uint8 id, int32 param = 0) - { - for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) - if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr)) - if (summon->GetEntry() == entry) + void DoSummonAction(uint32 entry, uint8 id, int32 param = 0) + { + for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) + if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr)) + if (summon->GetEntry() == entry) + { + switch (id) { - switch (id) - { - case ACTION_SUMMON_MOVE_STRAIGHT: - summon->GetMotionMaster()->MovePoint(1, summon->GetPositionX()-param, summon->GetPositionY()+param*2+3, summon->GetPositionZ()); - break; - case ACTION_SUMMON_EMOTE: - summon->SetUInt32Value(UNIT_NPC_EMOTESTATE, param); - break; - case ACTION_SUMMON_DESPAWN: - summon->DespawnOrUnsummon(param); - break; - case ACTION_SUMMON_ORIENTATION: - summon->SetFacingTo(param/100.0f); - break; - case ACTION_SUMMON_TALK: - summon->AI()->Talk(param); - break; - case ACTION_SUMMON_STAND_STATE: - summon->SetStandState(param); - break; - } + case ACTION_SUMMON_MOVE_STRAIGHT: + summon->GetMotionMaster()->MovePoint(1, summon->GetPositionX() - param, summon->GetPositionY() + param * 2 + 3, summon->GetPositionZ()); + break; + case ACTION_SUMMON_EMOTE: + summon->SetUInt32Value(UNIT_NPC_EMOTESTATE, param); + break; + case ACTION_SUMMON_DESPAWN: + summon->DespawnOrUnsummon(param); + break; + case ACTION_SUMMON_ORIENTATION: + summon->SetFacingTo(param / 100.0f); + break; + case ACTION_SUMMON_TALK: + summon->AI()->Talk(param); + break; + case ACTION_SUMMON_STAND_STATE: + summon->SetStandState(param); + break; } - } + } + } - void UpdateEscortAI(uint32 diff) override + void UpdateEscortAI(uint32 diff) override + { + events.Update(diff); + switch (events.ExecuteEvent()) { - events.Update(diff); - switch (events.ExecuteEvent()) - { - case EVENT_START_SCENE: - Talk(2); - DoSummonAction(NPC_DISGUISED_CRUSADER, ACTION_SUMMON_ORIENTATION, 200); + case EVENT_START_SCENE: + Talk(2); + DoSummonAction(NPC_DISGUISED_CRUSADER, ACTION_SUMMON_ORIENTATION, 200); - me->SummonCreature(NPC_CHOSEN_ZEALOT, 6160.74f, 2695.90f, 573.92f, 2.04f, TEMPSUMMON_TIMED_DESPAWN, 5*MINUTE*IN_MILLISECONDS); - me->SummonCreature(NPC_CHOSEN_ZEALOT, 6164.98f, 2697.90f, 573.92f, 2.04f, TEMPSUMMON_TIMED_DESPAWN, 5*MINUTE*IN_MILLISECONDS); - me->SummonCreature(NPC_CHOSEN_ZEALOT, 6161.26f, 2700.05f, 573.92f, 2.04f, TEMPSUMMON_TIMED_DESPAWN, 5*MINUTE*IN_MILLISECONDS); + me->SummonCreature(NPC_CHOSEN_ZEALOT, 6160.74f, 2695.90f, 573.92f, 2.04f, TEMPSUMMON_TIMED_DESPAWN, 5 * MINUTE * IN_MILLISECONDS); + me->SummonCreature(NPC_CHOSEN_ZEALOT, 6164.98f, 2697.90f, 573.92f, 2.04f, TEMPSUMMON_TIMED_DESPAWN, 5 * MINUTE * IN_MILLISECONDS); + me->SummonCreature(NPC_CHOSEN_ZEALOT, 6161.26f, 2700.05f, 573.92f, 2.04f, TEMPSUMMON_TIMED_DESPAWN, 5 * MINUTE * IN_MILLISECONDS); - DoSummonAction(NPC_CHOSEN_ZEALOT, ACTION_SUMMON_MOVE_STRAIGHT, 27); - events.ScheduleEvent(EVENT_SCENE_0, 30000); - break; - case EVENT_SCENE_0: - DoSummonAction(NPC_CHOSEN_ZEALOT, ACTION_SUMMON_STAND_STATE, UNIT_STAND_STATE_KNEEL); - me->SummonGameObject(GO_FROZEN_HEART, 6132.38f, 2760.76f, 574.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 180); - events.ScheduleEvent(EVENT_SCENE_0+1, 10000); - break; - case EVENT_SCENE_0+1: - DoSummonAction(NPC_CHOSEN_ZEALOT, ACTION_SUMMON_STAND_STATE, UNIT_STAND_STATE_STAND); - events.ScheduleEvent(EVENT_SCENE_0+2, 2000); - break; - case EVENT_SCENE_0+2: - DoSummonAction(NPC_CHOSEN_ZEALOT, ACTION_SUMMON_MOVE_STRAIGHT, -27); - DoSummonAction(NPC_CHOSEN_ZEALOT, ACTION_SUMMON_DESPAWN, 20000); - events.ScheduleEvent(EVENT_SCENE_0+3, 2000); - break; - case EVENT_SCENE_0+3: - Talk(3); - if (Creature* cr = me->SummonCreature(NPC_TIRION_LICH_KING, 6161.26f, 2700.05f, 573.92f, 2.04f, TEMPSUMMON_TIMED_DESPAWN, 5*MINUTE*IN_MILLISECONDS)) - cr->GetMotionMaster()->MovePoint(2, 6131.93f, 2756.84f, 573.92f); - events.ScheduleEvent(EVENT_SCENE_0+4, 4000); - break; - case EVENT_SCENE_0+4: - Talk(4); - me->SetFacingTo(4.42f); - events.ScheduleEvent(EVENT_SCENE_0+5, 25000); - break; - case EVENT_SCENE_0+5: - DoSummonAction(NPC_TIRION_LICH_KING, ACTION_SUMMON_ORIENTATION, 11); - events.ScheduleEvent(EVENT_SCENE_0+6, 4000); - break; - case EVENT_SCENE_0+6: - DoSummonAction(NPC_TIRION_LICH_KING, ACTION_SUMMON_TALK, 0); - me->LoadEquipment(2, true); - SetEscortPaused(false); - events.ScheduleEvent(EVENT_SCENE_0+7, 6000); - break; - case EVENT_SCENE_0+7: - DoSummonAction(NPC_TIRION_LICH_KING, ACTION_SUMMON_TALK, 1); - break; - case EVENT_SCENE_0+8: - Talk(5); - events.ScheduleEvent(EVENT_SCENE_0+9, 5000); - break; - case EVENT_SCENE_0+9: - DoSummonAction(NPC_TIRION_LICH_KING, ACTION_SUMMON_TALK, 2); - events.ScheduleEvent(EVENT_SCENE_0+10, 11000); - break; - case EVENT_SCENE_0+10: - Talk(6); - events.ScheduleEvent(EVENT_SCENE_0+11, 6000); - break; - case EVENT_SCENE_0+11: - DoSummonAction(NPC_TIRION_LICH_KING, ACTION_SUMMON_TALK, 3); - events.ScheduleEvent(EVENT_SCENE_0+12, 7000); - break; - case EVENT_SCENE_0+12: - DoSummonAction(NPC_TIRION_LICH_KING, ACTION_SUMMON_TALK, 4); - events.ScheduleEvent(EVENT_SCENE_0+13, 5000); - break; - case EVENT_SCENE_0+13: - Talk(7); - events.ScheduleEvent(EVENT_SCENE_0+14, 14000); - break; - case EVENT_SCENE_0+14: - Talk(8); - events.ScheduleEvent(EVENT_SCENE_0+15, 3000); - break; - case EVENT_SCENE_0+15: + DoSummonAction(NPC_CHOSEN_ZEALOT, ACTION_SUMMON_MOVE_STRAIGHT, 27); + events.ScheduleEvent(EVENT_SCENE_0, 30000); + break; + case EVENT_SCENE_0: + DoSummonAction(NPC_CHOSEN_ZEALOT, ACTION_SUMMON_STAND_STATE, UNIT_STAND_STATE_KNEEL); + me->SummonGameObject(GO_FROZEN_HEART, 6132.38f, 2760.76f, 574.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 180); + events.ScheduleEvent(EVENT_SCENE_0 + 1, 10000); + break; + case EVENT_SCENE_0+1: + DoSummonAction(NPC_CHOSEN_ZEALOT, ACTION_SUMMON_STAND_STATE, UNIT_STAND_STATE_STAND); + events.ScheduleEvent(EVENT_SCENE_0 + 2, 2000); + break; + case EVENT_SCENE_0+2: + DoSummonAction(NPC_CHOSEN_ZEALOT, ACTION_SUMMON_MOVE_STRAIGHT, -27); + DoSummonAction(NPC_CHOSEN_ZEALOT, ACTION_SUMMON_DESPAWN, 20000); + events.ScheduleEvent(EVENT_SCENE_0 + 3, 2000); + break; + case EVENT_SCENE_0+3: + Talk(3); + if (Creature* cr = me->SummonCreature(NPC_TIRION_LICH_KING, 6161.26f, 2700.05f, 573.92f, 2.04f, TEMPSUMMON_TIMED_DESPAWN, 5 * MINUTE * IN_MILLISECONDS)) + cr->GetMotionMaster()->MovePoint(2, 6131.93f, 2756.84f, 573.92f); + events.ScheduleEvent(EVENT_SCENE_0 + 4, 4000); + break; + case EVENT_SCENE_0+4: + Talk(4); + me->SetFacingTo(4.42f); + events.ScheduleEvent(EVENT_SCENE_0 + 5, 25000); + break; + case EVENT_SCENE_0+5: + DoSummonAction(NPC_TIRION_LICH_KING, ACTION_SUMMON_ORIENTATION, 11); + events.ScheduleEvent(EVENT_SCENE_0 + 6, 4000); + break; + case EVENT_SCENE_0+6: + DoSummonAction(NPC_TIRION_LICH_KING, ACTION_SUMMON_TALK, 0); + me->LoadEquipment(2, true); + SetEscortPaused(false); + events.ScheduleEvent(EVENT_SCENE_0 + 7, 6000); + break; + case EVENT_SCENE_0+7: + DoSummonAction(NPC_TIRION_LICH_KING, ACTION_SUMMON_TALK, 1); + break; + case EVENT_SCENE_0+8: + Talk(5); + events.ScheduleEvent(EVENT_SCENE_0 + 9, 5000); + break; + case EVENT_SCENE_0+9: + DoSummonAction(NPC_TIRION_LICH_KING, ACTION_SUMMON_TALK, 2); + events.ScheduleEvent(EVENT_SCENE_0 + 10, 11000); + break; + case EVENT_SCENE_0+10: + Talk(6); + events.ScheduleEvent(EVENT_SCENE_0 + 11, 6000); + break; + case EVENT_SCENE_0+11: + DoSummonAction(NPC_TIRION_LICH_KING, ACTION_SUMMON_TALK, 3); + events.ScheduleEvent(EVENT_SCENE_0 + 12, 7000); + break; + case EVENT_SCENE_0+12: + DoSummonAction(NPC_TIRION_LICH_KING, ACTION_SUMMON_TALK, 4); + events.ScheduleEvent(EVENT_SCENE_0 + 13, 5000); + break; + case EVENT_SCENE_0+13: + Talk(7); + events.ScheduleEvent(EVENT_SCENE_0 + 14, 14000); + break; + case EVENT_SCENE_0+14: + Talk(8); + events.ScheduleEvent(EVENT_SCENE_0 + 15, 3000); + break; + case EVENT_SCENE_0+15: { me->CastSpell(me, SPELL_TIRION_SMASH_HEART, true); - events.ScheduleEvent(EVENT_SCENE_0+16, 1200); + events.ScheduleEvent(EVENT_SCENE_0 + 16, 1200); uint8 i = 0; for (SummonList::iterator itr = summons.begin(); itr != summons.end(); ++itr, ++i) if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr)) if (summon->GetEntry() == NPC_DISGUISED_CRUSADER) { summon->SetWalk(false); - summon->GetMotionMaster()->MovePoint(2, 6132.38f + 4*cos(2*M_PI*(i/3.0)), 2760.76f + 4*sin(2*M_PI*(i/3.0)), me->GetPositionZ()); + summon->GetMotionMaster()->MovePoint(2, 6132.38f + 4 * cos(2 * M_PI * (i / 3.0)), 2760.76f + 4 * sin(2 * M_PI * (i / 3.0)), me->GetPositionZ()); } break; } - case EVENT_SCENE_0+16: - me->CastSpell(me, SPELL_HEART_EXPLOSION, true); - me->CastSpell(me, SPELL_HEART_EXPLOSION_EFF, true); - me->SetStandState(UNIT_STAND_STATE_DEAD); - DoSummonAction(NPC_TIRION_LICH_KING, ACTION_SUMMON_TALK, 5); - if (GameObject* go = me->FindNearestGameObject(GO_FROZEN_HEART, 20.0f)) - go->Delete(); - events.ScheduleEvent(EVENT_SCENE_0+17, 2000); - break; - case EVENT_SCENE_0+17: - DoSummonAction(NPC_TIRION_LICH_KING, ACTION_SUMMON_STAND_STATE, UNIT_STAND_STATE_KNEEL); - events.ScheduleEvent(EVENT_SCENE_0+170, 3000); - break; - case EVENT_SCENE_0+170: - DoSummonAction(NPC_DISGUISED_CRUSADER, ACTION_SUMMON_ORIENTATION, 500); - DoSummonAction(NPC_DISGUISED_CRUSADER, ACTION_SUMMON_EMOTE, EMOTE_STATE_READY2H); - if (Creature* cr = me->FindNearestCreature(NPC_DISGUISED_CRUSADER, 10.0f)) - cr->AI()->Talk(0); - events.ScheduleEvent(EVENT_SCENE_0+18, 1000); - break; - case EVENT_SCENE_0+18: + case EVENT_SCENE_0+16: + me->CastSpell(me, SPELL_HEART_EXPLOSION, true); + me->CastSpell(me, SPELL_HEART_EXPLOSION_EFF, true); + me->SetStandState(UNIT_STAND_STATE_DEAD); + DoSummonAction(NPC_TIRION_LICH_KING, ACTION_SUMMON_TALK, 5); + if (GameObject* go = me->FindNearestGameObject(GO_FROZEN_HEART, 20.0f)) + go->Delete(); + events.ScheduleEvent(EVENT_SCENE_0 + 17, 2000); + break; + case EVENT_SCENE_0+17: + DoSummonAction(NPC_TIRION_LICH_KING, ACTION_SUMMON_STAND_STATE, UNIT_STAND_STATE_KNEEL); + events.ScheduleEvent(EVENT_SCENE_0 + 170, 3000); + break; + case EVENT_SCENE_0+170: + DoSummonAction(NPC_DISGUISED_CRUSADER, ACTION_SUMMON_ORIENTATION, 500); + DoSummonAction(NPC_DISGUISED_CRUSADER, ACTION_SUMMON_EMOTE, EMOTE_STATE_READY2H); + if (Creature* cr = me->FindNearestCreature(NPC_DISGUISED_CRUSADER, 10.0f)) + cr->AI()->Talk(0); + events.ScheduleEvent(EVENT_SCENE_0 + 18, 1000); + break; + case EVENT_SCENE_0+18: { DoSummonAction(NPC_TIRION_LICH_KING, ACTION_SUMMON_TALK, 6); @@ -937,25 +937,25 @@ class npc_tirions_gambit_tirion : public CreatureScript } } - events.ScheduleEvent(EVENT_SCENE_0+19, 3000); + events.ScheduleEvent(EVENT_SCENE_0 + 19, 3000); break; } - case EVENT_SCENE_0+19: - me->SummonCreatureGroup(1); - events.ScheduleEvent(EVENT_SCENE_0+20, 3700); - break; - case EVENT_SCENE_0+20: + case EVENT_SCENE_0+19: + me->SummonCreatureGroup(1); + events.ScheduleEvent(EVENT_SCENE_0 + 20, 3700); + break; + case EVENT_SCENE_0+20: { for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr)) { - summon->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); + summon->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); if (summon->GetEntry() >= NPC_TIRION_EBON_KNIGHT && summon->GetEntry() <= NPC_TIRION_MOGRAINE) { if (summon->GetEntry() == NPC_TIRION_MOGRAINE) summon->SetHomePosition(6135.97f, 2753.84f, 573.92f, 3.70f); else - summon->SetHomePosition(6138.36f+frand(-2.0f, 2.0f), 2749.25f+frand(-2.0f, 2.0f), 573.92f, 2.03f); + summon->SetHomePosition(6138.36f + frand(-2.0f, 2.0f), 2749.25f + frand(-2.0f, 2.0f), 573.92f, 2.03f); } } DoSummonAction(NPC_TIRION_THASSARIAN, ACTION_SUMMON_TALK, 0); @@ -972,53 +972,53 @@ class npc_tirions_gambit_tirion : public CreatureScript break; } - case EVENT_SCENE_0+30: - for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) - if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr)) - if (summon->GetEntry() >= NPC_TIRION_EBON_KNIGHT && summon->GetEntry() <= NPC_TIRION_MOGRAINE) - { - if (summon->GetEntry() == NPC_TIRION_MOGRAINE) - summon->GetMotionMaster()->MovePoint(6, 6135.97f, 2753.84f, 573.92f); - else - summon->GetMotionMaster()->MovePoint(6, 6138.36f+frand(-2.0f, 2.0f), 2749.25f+frand(-2.0f, 2.0f), 573.92f); - } - - events.ScheduleEvent(EVENT_SCENE_0+310, 4000); - break; - case EVENT_SCENE_0+310: - DoSummonAction(NPC_TIRION_MOGRAINE, ACTION_SUMMON_TALK, 0); - DoSummonAction(NPC_TIRION_LICH_KING, ACTION_SUMMON_STAND_STATE, UNIT_STAND_STATE_STAND); - me->SummonGameObject(GO_ESCAPE_PORTAL, 6133.83f, 2757.24f, 573.914f, 1.97f, 0.0f, 0.0f, 0.0f, 0.0f, 60); - me->CastSpell(me, SPELL_TIRIONS_GAMBIT_CREDIT, true); - events.ScheduleEvent(EVENT_SCENE_0+31, 6000); - DoSummonAction(NPC_DISGUISED_CRUSADER, ACTION_SUMMON_EMOTE, EMOTE_ONESHOT_NONE); - break; - case EVENT_SCENE_0+31: - DoSummonAction(NPC_TIRION_THASSARIAN, ACTION_SUMMON_TALK, 1); - events.ScheduleEvent(EVENT_SCENE_0+32, 7000); - break; - case EVENT_SCENE_0+32: - DoSummonAction(NPC_TIRION_MOGRAINE, ACTION_SUMMON_TALK, 1); - events.ScheduleEvent(EVENT_SCENE_0+33, 7000); - break; - case EVENT_SCENE_0+33: - for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) - if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr)) + case EVENT_SCENE_0+30: + for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) + if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr)) + if (summon->GetEntry() >= NPC_TIRION_EBON_KNIGHT && summon->GetEntry() <= NPC_TIRION_MOGRAINE) { - if (summon->GetEntry() == NPC_TIRION_LICH_KING) - summon->CastSpell(summon, SPELL_LICH_KINGS_FURY, false); - summon->DespawnOrUnsummon(summon->GetEntry() == NPC_TIRION_LICH_KING ? 10000 : 4000); + if (summon->GetEntry() == NPC_TIRION_MOGRAINE) + summon->GetMotionMaster()->MovePoint(6, 6135.97f, 2753.84f, 573.92f); + else + summon->GetMotionMaster()->MovePoint(6, 6138.36f + frand(-2.0f, 2.0f), 2749.25f + frand(-2.0f, 2.0f), 573.92f); } - me->DespawnOrUnsummon(10000); - break; - } - } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_tirions_gambit_tirionAI(creature); + events.ScheduleEvent(EVENT_SCENE_0 + 310, 4000); + break; + case EVENT_SCENE_0+310: + DoSummonAction(NPC_TIRION_MOGRAINE, ACTION_SUMMON_TALK, 0); + DoSummonAction(NPC_TIRION_LICH_KING, ACTION_SUMMON_STAND_STATE, UNIT_STAND_STATE_STAND); + me->SummonGameObject(GO_ESCAPE_PORTAL, 6133.83f, 2757.24f, 573.914f, 1.97f, 0.0f, 0.0f, 0.0f, 0.0f, 60); + me->CastSpell(me, SPELL_TIRIONS_GAMBIT_CREDIT, true); + events.ScheduleEvent(EVENT_SCENE_0 + 31, 6000); + DoSummonAction(NPC_DISGUISED_CRUSADER, ACTION_SUMMON_EMOTE, EMOTE_ONESHOT_NONE); + break; + case EVENT_SCENE_0+31: + DoSummonAction(NPC_TIRION_THASSARIAN, ACTION_SUMMON_TALK, 1); + events.ScheduleEvent(EVENT_SCENE_0 + 32, 7000); + break; + case EVENT_SCENE_0+32: + DoSummonAction(NPC_TIRION_MOGRAINE, ACTION_SUMMON_TALK, 1); + events.ScheduleEvent(EVENT_SCENE_0 + 33, 7000); + break; + case EVENT_SCENE_0+33: + for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) + if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr)) + { + if (summon->GetEntry() == NPC_TIRION_LICH_KING) + summon->CastSpell(summon, SPELL_LICH_KINGS_FURY, false); + summon->DespawnOrUnsummon(summon->GetEntry() == NPC_TIRION_LICH_KING ? 10000 : 4000); + } + me->DespawnOrUnsummon(10000); + break; + } } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_tirions_gambit_tirionAI(creature); + } }; enum infraGreenBomberQuests @@ -1051,287 +1051,287 @@ enum infraGreenBomberQuests class spell_switch_infragreen_bomber_station : public SpellScriptLoader { - public: - spell_switch_infragreen_bomber_station() : SpellScriptLoader("spell_switch_infragreen_bomber_station") { } +public: + spell_switch_infragreen_bomber_station() : SpellScriptLoader("spell_switch_infragreen_bomber_station") { } - class spell_switch_infragreen_bomber_station_SpellScript : public SpellScript + class spell_switch_infragreen_bomber_station_SpellScript : public SpellScript + { + PrepareSpellScript(spell_switch_infragreen_bomber_station_SpellScript) + + uint8 GetSeatNumber(uint32 spellId) { - PrepareSpellScript(spell_switch_infragreen_bomber_station_SpellScript) - - uint8 GetSeatNumber(uint32 spellId) - { - if (spellId == SPELL_ENGINEERING) - return 2; - else if (spellId == SPELL_ANTI_AIR_TURRET) - return 1; - else - return 0; - } - - void HandleDummy(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - Vehicle* kit = GetCaster()->GetVehicle(); - Unit* charmer = GetCaster()->GetCharmer(); // Player controlling station - if (!kit || !charmer) - return; - - uint8 seatNumber = GetSeatNumber(GetSpellInfo()->Id); - SeatMap::iterator itr = kit->GetSeatIteratorForPassenger(GetCaster()); - if (itr == kit->Seats.end()) - return; - - // Xinef: Same seat, no change required - if (seatNumber == itr->first) - return; - - if (Unit* station = kit->GetPassenger(seatNumber)) - station->HandleSpellClick(charmer, 0); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_switch_infragreen_bomber_station_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_switch_infragreen_bomber_station_SpellScript(); + if (spellId == SPELL_ENGINEERING) + return 2; + else if (spellId == SPELL_ANTI_AIR_TURRET) + return 1; + else + return 0; } + void HandleDummy(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + Vehicle* kit = GetCaster()->GetVehicle(); + Unit* charmer = GetCaster()->GetCharmer(); // Player controlling station + if (!kit || !charmer) + return; + + uint8 seatNumber = GetSeatNumber(GetSpellInfo()->Id); + SeatMap::iterator itr = kit->GetSeatIteratorForPassenger(GetCaster()); + if (itr == kit->Seats.end()) + return; + + // Xinef: Same seat, no change required + if (seatNumber == itr->first) + return; + + if (Unit* station = kit->GetPassenger(seatNumber)) + station->HandleSpellClick(charmer, 0); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_switch_infragreen_bomber_station_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_switch_infragreen_bomber_station_SpellScript(); + } + }; class spell_charge_shield_bomber : public SpellScriptLoader { - public: - spell_charge_shield_bomber() : SpellScriptLoader("spell_charge_shield_bomber") { } +public: + spell_charge_shield_bomber() : SpellScriptLoader("spell_charge_shield_bomber") { } - class spell_charge_shield_bomber_SpellScript : public SpellScript + class spell_charge_shield_bomber_SpellScript : public SpellScript + { + PrepareSpellScript(spell_charge_shield_bomber_SpellScript) + + void HandleDummy(SpellEffIndex effIndex) { - PrepareSpellScript(spell_charge_shield_bomber_SpellScript) + PreventHitDefaultEffect(effIndex); + Unit* ship = GetCaster()->GetVehicleBase(); + if (!ship) + return; - void HandleDummy(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - Unit* ship = GetCaster()->GetVehicleBase(); - if (!ship) - return; + ship->CastSpell(ship, SPELL_INFRA_GREEN_SHIELD, true); + Aura* aura = ship->GetAura(SPELL_INFRA_GREEN_SHIELD); + if (!aura) + return; - ship->CastSpell(ship, SPELL_INFRA_GREEN_SHIELD, true); - Aura* aura = ship->GetAura(SPELL_INFRA_GREEN_SHIELD); - if (!aura) - return; - - aura->ModStackAmount(GetEffectValue() - 1); - } - - void Register() - { - if (m_scriptSpellId == SPELL_CHARGE_SHIELD) - OnEffectHitTarget += SpellEffectFn(spell_charge_shield_bomber_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_charge_shield_bomber_SpellScript(); + aura->ModStackAmount(GetEffectValue() - 1); } - class spell_charge_shield_bomber_AuraScript : public AuraScript + void Register() { - PrepareAuraScript(spell_charge_shield_bomber_AuraScript); - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - // Set absorbtion amount to unlimited - amount = -1; - } - - void Absorb(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount) - { - uint32 absorbPct = GetStackAmount()/2; - absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct); - ModStackAmount(-1); - } - - void Register() - { - if (m_scriptSpellId == SPELL_INFRA_GREEN_SHIELD) - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_charge_shield_bomber_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); - OnEffectAbsorb += AuraEffectAbsorbFn(spell_charge_shield_bomber_AuraScript::Absorb, EFFECT_0); - } - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_charge_shield_bomber_AuraScript(); + if (m_scriptSpellId == SPELL_CHARGE_SHIELD) + OnEffectHitTarget += SpellEffectFn(spell_charge_shield_bomber_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } + }; + + SpellScript* GetSpellScript() const + { + return new spell_charge_shield_bomber_SpellScript(); + } + + class spell_charge_shield_bomber_AuraScript : public AuraScript + { + PrepareAuraScript(spell_charge_shield_bomber_AuraScript); + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + // Set absorbtion amount to unlimited + amount = -1; + } + + void Absorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount) + { + uint32 absorbPct = GetStackAmount() / 2; + absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct); + ModStackAmount(-1); + } + + void Register() + { + if (m_scriptSpellId == SPELL_INFRA_GREEN_SHIELD) + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_charge_shield_bomber_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); + OnEffectAbsorb += AuraEffectAbsorbFn(spell_charge_shield_bomber_AuraScript::Absorb, EFFECT_0); + } + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_charge_shield_bomber_AuraScript(); + } }; class spell_fight_fire_bomber : public SpellScriptLoader { - public: - spell_fight_fire_bomber() : SpellScriptLoader("spell_fight_fire_bomber") { } +public: + spell_fight_fire_bomber() : SpellScriptLoader("spell_fight_fire_bomber") { } - class spell_fight_fire_bomber_SpellScript : public SpellScript + class spell_fight_fire_bomber_SpellScript : public SpellScript + { + PrepareSpellScript(spell_fight_fire_bomber_SpellScript) + + void HandleDummy(SpellEffIndex effIndex) { - PrepareSpellScript(spell_fight_fire_bomber_SpellScript) + PreventHitDefaultEffect(effIndex); + Vehicle* kit = GetCaster()->GetVehicle(); + if (!kit) + return; - void HandleDummy(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - Vehicle* kit = GetCaster()->GetVehicle(); - if (!kit) - return; - - bool extinguished = false; - uint8 fireCount = 0; - for (uint8 seat = 3; seat <= 5; ++seat) - if (Unit* banner = kit->GetPassenger(seat)) - if (banner->HasAura(SPELL_COSMETIC_FIRE)) + bool extinguished = false; + uint8 fireCount = 0; + for (uint8 seat = 3; seat <= 5; ++seat) + if (Unit* banner = kit->GetPassenger(seat)) + if (banner->HasAura(SPELL_COSMETIC_FIRE)) + { + if (!extinguished) { - if (!extinguished) + GetCaster()->CastSpell(banner, SPELL_EXTINGUISH_FIRE, true); + extinguished = true; + if (urand(0, 2)) { - GetCaster()->CastSpell(banner, SPELL_EXTINGUISH_FIRE, true); - extinguished = true; - if (urand(0,2)) - { - banner->RemoveAurasDueToSpell(SPELL_COSMETIC_FIRE); - continue; - } + banner->RemoveAurasDueToSpell(SPELL_COSMETIC_FIRE); + continue; } - fireCount++; } + fireCount++; + } - if (fireCount == 0) - GetCaster()->RemoveAurasDueToSpell(SPELL_BURNING); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_fight_fire_bomber_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_fight_fire_bomber_SpellScript(); + if (fireCount == 0) + GetCaster()->RemoveAurasDueToSpell(SPELL_BURNING); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_fight_fire_bomber_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_fight_fire_bomber_SpellScript(); + } }; class spell_anti_air_rocket_bomber : public SpellScriptLoader { - public: - spell_anti_air_rocket_bomber() : SpellScriptLoader("spell_anti_air_rocket_bomber") { } +public: + spell_anti_air_rocket_bomber() : SpellScriptLoader("spell_anti_air_rocket_bomber") { } - class spell_anti_air_rocket_bomber_SpellScript : public SpellScript + class spell_anti_air_rocket_bomber_SpellScript : public SpellScript + { + PrepareSpellScript(spell_anti_air_rocket_bomber_SpellScript) + + void HandleDummy(SpellEffIndex effIndex) { - PrepareSpellScript(spell_anti_air_rocket_bomber_SpellScript) - - void HandleDummy(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - const WorldLocation* loc = GetExplTargetDest(); - GetCaster()->CastSpell(loc->GetPositionX(), loc->GetPositionY(), loc->GetPositionZ(), GetSpellInfo()->Effects[effIndex].CalcValue(), true); - } - - void Register() - { - OnEffectLaunch += SpellEffectFn(spell_anti_air_rocket_bomber_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_anti_air_rocket_bomber_SpellScript(); + PreventHitDefaultEffect(effIndex); + const WorldLocation* loc = GetExplTargetDest(); + GetCaster()->CastSpell(loc->GetPositionX(), loc->GetPositionY(), loc->GetPositionZ(), GetSpellInfo()->Effects[effIndex].CalcValue(), true); } + + void Register() + { + OnEffectLaunch += SpellEffectFn(spell_anti_air_rocket_bomber_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_anti_air_rocket_bomber_SpellScript(); + } }; class npc_infra_green_bomber_generic : public CreatureScript { - public: - npc_infra_green_bomber_generic(): CreatureScript("npc_infra_green_bomber_generic"){} +public: + npc_infra_green_bomber_generic(): CreatureScript("npc_infra_green_bomber_generic") {} - struct npc_infra_green_bomber_genericAI : NullCreatureAI + struct npc_infra_green_bomber_genericAI : NullCreatureAI + { + npc_infra_green_bomber_genericAI(Creature* creature) : NullCreatureAI(creature) { - npc_infra_green_bomber_genericAI(Creature* creature) : NullCreatureAI(creature) - { - events.Reset(); - } + events.Reset(); + } - Unit* GetSummoner() - { - if (TempSummon* tempSummon = me->ToTempSummon()) - return tempSummon->GetSummoner(); - return nullptr; - } + Unit* GetSummoner() + { + if (TempSummon* tempSummon = me->ToTempSummon()) + return tempSummon->GetSummoner(); + return nullptr; + } - void IsSummonedBy(Unit* summoner) - { - if (!summoner) - return; + void IsSummonedBy(Unit* summoner) + { + if (!summoner) + return; - summoner->CastSpell(summoner, SPELL_WAITING_FOR_A_BOMBER, true); - summoner->CastSpell(summoner, SPELL_FLIGHT_ORDERS, true); - events.ScheduleEvent(EVENT_START_FLIGHT, 0); - events.ScheduleEvent(EVENT_TAKE_PASSENGER, 3000); - me->SetCanFly(true); - me->AddUnitMovementFlag(MOVEMENTFLAG_FLYING); - me->SetSpeed(MOVE_FLIGHT, 0.1f); - me->setFaction(summoner->getFaction()); - } + summoner->CastSpell(summoner, SPELL_WAITING_FOR_A_BOMBER, true); + summoner->CastSpell(summoner, SPELL_FLIGHT_ORDERS, true); + events.ScheduleEvent(EVENT_START_FLIGHT, 0); + events.ScheduleEvent(EVENT_TAKE_PASSENGER, 3000); + me->SetCanFly(true); + me->AddUnitMovementFlag(MOVEMENTFLAG_FLYING); + me->SetSpeed(MOVE_FLIGHT, 0.1f); + me->setFaction(summoner->getFaction()); + } - void DamageTaken(Unit* who, uint32&, DamageEffectType, SpellSchoolMask) - { - if (who != me) - if (me->HealthBelowPct(80) && urand(0,1)) - SpreadFire(true); - } + void DamageTaken(Unit* who, uint32&, DamageEffectType, SpellSchoolMask) + { + if (who != me) + if (me->HealthBelowPct(80) && urand(0, 1)) + SpreadFire(true); + } - void SpreadFire(bool init) - { - Vehicle* kit = me->GetVehicleKit(); - if (!kit) - return; + void SpreadFire(bool init) + { + Vehicle* kit = me->GetVehicleKit(); + if (!kit) + return; - if (Unit* passenger = kit->GetPassenger(SEAT_ENGINEERING)) - if (init && !passenger->HasAura(SPELL_BURNING)) - { - me->MonsterTextEmote("Your Vehicle is burning!", GetSummoner(), true); - passenger->AddAura(SPELL_BURNING, passenger); - } - - for (uint8 seat = 3; seat <= 5; ++seat) - if (Unit* banner = kit->GetPassenger(seat)) - if (!banner->HasAura(SPELL_COSMETIC_FIRE)) - { - banner->AddAura(SPELL_COSMETIC_FIRE, banner); - break; - } - } - - void UpdateAI(uint32 diff) - { - events.Update(diff); - uint32 eventId = events.ExecuteEvent(); - switch (eventId) + if (Unit* passenger = kit->GetPassenger(SEAT_ENGINEERING)) + if (init && !passenger->HasAura(SPELL_BURNING)) { - case EVENT_TAKE_PASSENGER: - if (Unit* owner = GetSummoner()) - if (Vehicle* kit = me->GetVehicleKit()) - if (Unit* turret = kit->GetPassenger(SEAT_TURRET)) - { - me->SetSpeed(MOVE_FLIGHT, 1.2f); - owner->RemoveAurasDueToSpell(SPELL_WAITING_FOR_A_BOMBER); - turret->HandleSpellClick(owner, 0); - return; - } - me->DespawnOrUnsummon(1); + me->MonsterTextEmote("Your Vehicle is burning!", GetSummoner(), true); + passenger->AddAura(SPELL_BURNING, passenger); + } + + for (uint8 seat = 3; seat <= 5; ++seat) + if (Unit* banner = kit->GetPassenger(seat)) + if (!banner->HasAura(SPELL_COSMETIC_FIRE)) + { + banner->AddAura(SPELL_COSMETIC_FIRE, banner); break; - case EVENT_START_FLIGHT: + } + } + + void UpdateAI(uint32 diff) + { + events.Update(diff); + uint32 eventId = events.ExecuteEvent(); + switch (eventId) + { + case EVENT_TAKE_PASSENGER: + if (Unit* owner = GetSummoner()) + if (Vehicle* kit = me->GetVehicleKit()) + if (Unit* turret = kit->GetPassenger(SEAT_TURRET)) + { + me->SetSpeed(MOVE_FLIGHT, 1.2f); + owner->RemoveAurasDueToSpell(SPELL_WAITING_FOR_A_BOMBER); + turret->HandleSpellClick(owner, 0); + return; + } + me->DespawnOrUnsummon(1); + break; + case EVENT_START_FLIGHT: { WPPath* path = sSmartWaypointMgr->GetPath(me->GetEntry()); if (!path || path->empty()) @@ -1356,7 +1356,7 @@ class npc_infra_green_bomber_generic : public CreatureScript events.ScheduleEvent(EVENT_SYNCHRONIZE_SHIELDS, 5000); break; } - case EVENT_CHECK_PATH_REGEN_HEALTH_BURN_DAMAGE: + case EVENT_CHECK_PATH_REGEN_HEALTH_BURN_DAMAGE: { // Check if path is finished if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() != ESCORT_MOTION_TYPE) @@ -1374,50 +1374,50 @@ class npc_infra_green_bomber_generic : public CreatureScript fireCount++; if (fireCount) - Unit::DealDamage(me, me, 3000*fireCount, NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_FIRE); + Unit::DealDamage(me, me, 3000 * fireCount, NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_FIRE); else // Heal me->ModifyHealth(2000); events.ScheduleEvent(EVENT_CHECK_PATH_REGEN_HEALTH_BURN_DAMAGE, 4000); break; } - case EVENT_SYNCHRONIZE_SHIELDS: - if (Vehicle* kit = me->GetVehicleKit()) - { - // Xinef: check if we have player on any of the stations - bool playerPresent = false; - uint32 stackAmount = me->GetAuraCount(SPELL_INFRA_GREEN_SHIELD); - for (uint8 i = SEAT_BOMBER; i <= SEAT_ENGINEERING; ++i) - if (Unit* station = kit->GetPassenger(i)) - { - if (Vehicle* stationKit = station->GetVehicleKit()) - if (stationKit->GetPassenger(0)) - playerPresent = true; + case EVENT_SYNCHRONIZE_SHIELDS: + if (Vehicle* kit = me->GetVehicleKit()) + { + // Xinef: check if we have player on any of the stations + bool playerPresent = false; + uint32 stackAmount = me->GetAuraCount(SPELL_INFRA_GREEN_SHIELD); + for (uint8 i = SEAT_BOMBER; i <= SEAT_ENGINEERING; ++i) + if (Unit* station = kit->GetPassenger(i)) + { + if (Vehicle* stationKit = station->GetVehicleKit()) + if (stationKit->GetPassenger(0)) + playerPresent = true; - if (stackAmount) - station->SetAuraStack(SPELL_INFRA_GREEN_SHIELD, station, stackAmount); - else - station->RemoveAurasDueToSpell(SPELL_INFRA_GREEN_SHIELD); - } - if (!playerPresent) - me->DespawnOrUnsummon(1); - } - events.ScheduleEvent(EVENT_SYNCHRONIZE_SHIELDS, 1000); - break; - case EVENT_SPREAD_FIRE: - break; - } + if (stackAmount) + station->SetAuraStack(SPELL_INFRA_GREEN_SHIELD, station, stackAmount); + else + station->RemoveAurasDueToSpell(SPELL_INFRA_GREEN_SHIELD); + } + if (!playerPresent) + me->DespawnOrUnsummon(1); + } + events.ScheduleEvent(EVENT_SYNCHRONIZE_SHIELDS, 1000); + break; + case EVENT_SPREAD_FIRE: + break; } - - private: - EventMap events; - - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_infra_green_bomber_genericAI(creature); } + + private: + EventMap events; + + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_infra_green_bomber_genericAI(creature); + } }; @@ -1502,135 +1502,135 @@ enum TournamentDummy class npc_tournament_training_dummy : public CreatureScript { - public: - npc_tournament_training_dummy(): CreatureScript("npc_tournament_training_dummy"){ } +public: + npc_tournament_training_dummy(): CreatureScript("npc_tournament_training_dummy") { } - struct npc_tournament_training_dummyAI : ScriptedAI + struct npc_tournament_training_dummyAI : ScriptedAI + { + npc_tournament_training_dummyAI(Creature* creature) : ScriptedAI(creature) { - npc_tournament_training_dummyAI(Creature* creature) : ScriptedAI(creature) + SetCombatMovement(false); + me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true); + } + + EventMap events; + bool isVulnerable; + + void Reset() + { + me->SetControlled(true, UNIT_STATE_STUNNED); + isVulnerable = false; + + // Cast Defend spells to max stack size + switch (me->GetEntry()) { - SetCombatMovement(false); - me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true); + case NPC_CHARGE_TARGET: + DoCast(SPELL_CHARGE_DEFEND); + break; + case NPC_RANGED_TARGET: + me->CastCustomSpell(SPELL_RANGED_DEFEND, SPELLVALUE_AURA_STACK, 3, me); + break; } - EventMap events; - bool isVulnerable; + events.Reset(); + events.ScheduleEvent(EVENT_DUMMY_RECAST_DEFEND, 5000); + } - void Reset() + void EnterEvadeMode() + { + if (!_EnterEvadeMode()) + return; + + Reset(); + } + + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) + { + damage = 0; + events.RescheduleEvent(EVENT_DUMMY_RESET, 10000); + } + + void SpellHit(Unit* caster, SpellInfo const* spell) + { + switch (me->GetEntry()) { - me->SetControlled(true, UNIT_STATE_STUNNED); - isVulnerable = false; + case NPC_CHARGE_TARGET: + if (spell->Id == SPELL_PLAYER_CHARGE) + if (isVulnerable) + DoCast(caster, SPELL_CHARGE_CREDIT, true); + break; + case NPC_MELEE_TARGET: + if (spell->Id == SPELL_PLAYER_THRUST) + { + DoCast(caster, SPELL_MELEE_CREDIT, true); - // Cast Defend spells to max stack size - switch (me->GetEntry()) - { - case NPC_CHARGE_TARGET: - DoCast(SPELL_CHARGE_DEFEND); - break; - case NPC_RANGED_TARGET: - me->CastCustomSpell(SPELL_RANGED_DEFEND, SPELLVALUE_AURA_STACK, 3, me); - break; - } - - events.Reset(); - events.ScheduleEvent(EVENT_DUMMY_RECAST_DEFEND, 5000); + if (Unit* target = caster->GetVehicleBase()) + DoCast(target, SPELL_COUNTERATTACK, true); + } + break; + case NPC_RANGED_TARGET: + if (spell->Id == SPELL_PLAYER_BREAK_SHIELD) + if (isVulnerable) + DoCast(caster, SPELL_RANGED_CREDIT, true); + break; } - void EnterEvadeMode() + if (spell->Id == SPELL_PLAYER_BREAK_SHIELD) + if (!me->HasAura(SPELL_CHARGE_DEFEND) && !me->HasAura(SPELL_RANGED_DEFEND)) + isVulnerable = true; + } + + void UpdateAI(uint32 diff) + { + events.Update(diff); + + switch (events.ExecuteEvent()) { - if (!_EnterEvadeMode()) - return; - - Reset(); - } - - void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) - { - damage = 0; - events.RescheduleEvent(EVENT_DUMMY_RESET, 10000); - } - - void SpellHit(Unit* caster, SpellInfo const* spell) - { - switch (me->GetEntry()) - { - case NPC_CHARGE_TARGET: - if (spell->Id == SPELL_PLAYER_CHARGE) - if (isVulnerable) - DoCast(caster, SPELL_CHARGE_CREDIT, true); - break; - case NPC_MELEE_TARGET: - if (spell->Id == SPELL_PLAYER_THRUST) - { - DoCast(caster, SPELL_MELEE_CREDIT, true); - - if (Unit* target = caster->GetVehicleBase()) - DoCast(target, SPELL_COUNTERATTACK, true); - } - break; - case NPC_RANGED_TARGET: - if (spell->Id == SPELL_PLAYER_BREAK_SHIELD) - if (isVulnerable) - DoCast(caster, SPELL_RANGED_CREDIT, true); - break; - } - - if (spell->Id == SPELL_PLAYER_BREAK_SHIELD) - if (!me->HasAura(SPELL_CHARGE_DEFEND) && !me->HasAura(SPELL_RANGED_DEFEND)) - isVulnerable = true; - } - - void UpdateAI(uint32 diff) - { - events.Update(diff); - - switch (events.ExecuteEvent()) - { - case EVENT_DUMMY_RECAST_DEFEND: - switch (me->GetEntry()) - { - case NPC_CHARGE_TARGET: + case EVENT_DUMMY_RECAST_DEFEND: + switch (me->GetEntry()) + { + case NPC_CHARGE_TARGET: { if (!me->HasAura(SPELL_CHARGE_DEFEND)) DoCast(SPELL_CHARGE_DEFEND); break; } - case NPC_RANGED_TARGET: + case NPC_RANGED_TARGET: { Aura* defend = me->GetAura(SPELL_RANGED_DEFEND); if (!defend || defend->GetStackAmount() < 3 || defend->GetDuration() <= 8000) DoCast(SPELL_RANGED_DEFEND); break; } - } - isVulnerable = false; - events.ScheduleEvent(EVENT_DUMMY_RECAST_DEFEND, 5000); - break; - case EVENT_DUMMY_RESET: - if (UpdateVictim()) - { - EnterEvadeMode(); - events.ScheduleEvent(EVENT_DUMMY_RESET, 10000); - } - break; - } - - if (!UpdateVictim()) - return; - - if (!me->HasUnitState(UNIT_STATE_STUNNED)) - me->SetControlled(true, UNIT_STATE_STUNNED); + } + isVulnerable = false; + events.ScheduleEvent(EVENT_DUMMY_RECAST_DEFEND, 5000); + break; + case EVENT_DUMMY_RESET: + if (UpdateVictim()) + { + EnterEvadeMode(); + events.ScheduleEvent(EVENT_DUMMY_RESET, 10000); + } + break; } - void MoveInLineOfSight(Unit* /*who*/) { } + if (!UpdateVictim()) + return; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_tournament_training_dummyAI(creature); + if (!me->HasUnitState(UNIT_STATE_STUNNED)) + me->SetControlled(true, UNIT_STATE_STUNNED); } + void MoveInLineOfSight(Unit* /*who*/) { } + + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_tournament_training_dummyAI(creature); + } + }; // Battle for Crusaders' Pinnacle @@ -1831,7 +1831,7 @@ public: Dalfors->SetFacingTo(6.215f); Dalfors->AI()->Talk(DALFORS_SAY_PRE_2); } - events.ScheduleEvent(EVENT_INTRO_3, 5000); + events.ScheduleEvent(EVENT_INTRO_3, 5000); } break; case EVENT_INTRO_3: @@ -1916,10 +1916,10 @@ public: LK->AI()->Talk(LK_TALK_3); } if (Creature* tempsum = DoSummon(NPC_SCOURGE_DRUDGE, Mason3Pos[0])) - { - tempsum->SetHomePosition(DalforsPos[2]); - tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100)); - } + { + tempsum->SetHomePosition(DalforsPos[2]); + tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100)); + } if (urand(0, 1) == 0) { if (Creature* tempsum = DoSummon(NPC_HIDEOUS_PLAGEBRINGER, Mason1Pos[0])) @@ -2031,70 +2031,70 @@ enum BorrowedTechnologyAndVolatility class npc_frostbrood_skytalon : public CreatureScript { - public: - npc_frostbrood_skytalon() : CreatureScript("npc_frostbrood_skytalon") { } +public: + npc_frostbrood_skytalon() : CreatureScript("npc_frostbrood_skytalon") { } - struct npc_frostbrood_skytalonAI : public VehicleAI + struct npc_frostbrood_skytalonAI : public VehicleAI + { + npc_frostbrood_skytalonAI(Creature* creature) : VehicleAI(creature) { } + + EventMap events; + + void IsSummonedBy(Unit* summoner) { - npc_frostbrood_skytalonAI(Creature* creature) : VehicleAI(creature) { } + if (!summoner) + return; - EventMap events; - - void IsSummonedBy(Unit* summoner) - { - if (!summoner) - return; - - me->GetMotionMaster()->MovePoint(POINT_GRAB_DECOY, summoner->GetPositionX(), summoner->GetPositionY(), summoner->GetPositionZ()+3.0f); - } - - void MovementInform(uint32 type, uint32 id) - { - if (type != POINT_MOTION_TYPE) - return; - - if (id == POINT_GRAB_DECOY) - if (TempSummon* summon = me->ToTempSummon()) - if (Unit* summoner = summon->GetSummoner()) - DoCast(summoner, SPELL_GRAB); - } - - void UpdateAI(uint32 diff) - { - VehicleAI::UpdateAI(diff); - events.Update(diff); - - while (uint32 eventId = events.ExecuteEvent()) - { - if (eventId == EVENT_FLY_AWAY) - { - Position randomPosOnRadius; - randomPosOnRadius.m_positionZ = (me->GetPositionZ() + 40.0f); - me->GetNearPoint2D(randomPosOnRadius.m_positionX, randomPosOnRadius.m_positionY, 40.0f, me->GetAngle(me)); - me->GetMotionMaster()->MovePoint(POINT_FLY_AWAY, randomPosOnRadius); - } - } - } - - void SpellHit(Unit* /*caster*/, SpellInfo const* spell) - { - switch (spell->Id) - { - case SPELL_EXPLOSION: - DoCast(me, SPELL_IMMOLATION); - break; - case SPELL_RIDE: - DoCastAOE(SPELL_PING_BUNNY); - events.ScheduleEvent(EVENT_FLY_AWAY, 100); - break; - } - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_frostbrood_skytalonAI(creature); + me->GetMotionMaster()->MovePoint(POINT_GRAB_DECOY, summoner->GetPositionX(), summoner->GetPositionY(), summoner->GetPositionZ() + 3.0f); } + + void MovementInform(uint32 type, uint32 id) + { + if (type != POINT_MOTION_TYPE) + return; + + if (id == POINT_GRAB_DECOY) + if (TempSummon* summon = me->ToTempSummon()) + if (Unit* summoner = summon->GetSummoner()) + DoCast(summoner, SPELL_GRAB); + } + + void UpdateAI(uint32 diff) + { + VehicleAI::UpdateAI(diff); + events.Update(diff); + + while (uint32 eventId = events.ExecuteEvent()) + { + if (eventId == EVENT_FLY_AWAY) + { + Position randomPosOnRadius; + randomPosOnRadius.m_positionZ = (me->GetPositionZ() + 40.0f); + me->GetNearPoint2D(randomPosOnRadius.m_positionX, randomPosOnRadius.m_positionY, 40.0f, me->GetAngle(me)); + me->GetMotionMaster()->MovePoint(POINT_FLY_AWAY, randomPosOnRadius); + } + } + } + + void SpellHit(Unit* /*caster*/, SpellInfo const* spell) + { + switch (spell->Id) + { + case SPELL_EXPLOSION: + DoCast(me, SPELL_IMMOLATION); + break; + case SPELL_RIDE: + DoCastAOE(SPELL_PING_BUNNY); + events.ScheduleEvent(EVENT_FLY_AWAY, 100); + break; + } + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_frostbrood_skytalonAI(creature); + } }; void AddSC_icecrown() diff --git a/src/server/scripts/Northrend/zone_sholazar_basin.cpp b/src/server/scripts/Northrend/zone_sholazar_basin.cpp index e1c6a2ddb..5c75e5f69 100644 --- a/src/server/scripts/Northrend/zone_sholazar_basin.cpp +++ b/src/server/scripts/Northrend/zone_sholazar_basin.cpp @@ -40,41 +40,41 @@ enum songOfWindandWater class spell_q12726_song_of_wind_and_water : public SpellScriptLoader { - public: - spell_q12726_song_of_wind_and_water() : SpellScriptLoader("spell_q12726_song_of_wind_and_water") { } +public: + spell_q12726_song_of_wind_and_water() : SpellScriptLoader("spell_q12726_song_of_wind_and_water") { } - class spell_q12726_song_of_wind_and_water_SpellScript : public SpellScript + class spell_q12726_song_of_wind_and_water_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q12726_song_of_wind_and_water_SpellScript); + + void HandleHealPct(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_q12726_song_of_wind_and_water_SpellScript); - - void HandleHealPct(SpellEffIndex /*effIndex*/) + if (Creature* cr = GetHitCreature()) { - if (Creature* cr = GetHitCreature()) + //cr->UpdateEntry((cr->GetEntry() == NPC_SOWAW_WATER_ELEMENTAL ? NPC_SOWAW_WIND_ELEMENTAL : NPC_SOWAW_WATER_ELEMENTAL)); + cr->SetDisplayId(cr->GetDisplayId() == NPC_SOWAW_WATER_MODEL ? NPC_SOWAW_WIND_MODEL : NPC_SOWAW_WATER_MODEL); + if (Player* player = cr->GetCharmerOrOwnerPlayerOrPlayerItself()) { - //cr->UpdateEntry((cr->GetEntry() == NPC_SOWAW_WATER_ELEMENTAL ? NPC_SOWAW_WIND_ELEMENTAL : NPC_SOWAW_WATER_ELEMENTAL)); - cr->SetDisplayId(cr->GetDisplayId() == NPC_SOWAW_WATER_MODEL ? NPC_SOWAW_WIND_MODEL : NPC_SOWAW_WATER_MODEL); - if (Player* player = cr->GetCharmerOrOwnerPlayerOrPlayerItself()) - { - player->KilledMonsterCredit(cr->GetDisplayId() == NPC_SOWAW_WATER_MODEL ? 29008 : 29009, 0); - CreatureTemplate const* ct = sObjectMgr->GetCreatureTemplate(cr->GetDisplayId() == NPC_SOWAW_WIND_MODEL ? NPC_SOWAW_WIND_ELEMENTAL : NPC_SOWAW_WATER_ELEMENTAL); - for (uint8 i=0; i < CREATURE_MAX_SPELLS; ++i) - cr->m_spells[i] = ct->spells[i]; + player->KilledMonsterCredit(cr->GetDisplayId() == NPC_SOWAW_WATER_MODEL ? 29008 : 29009, 0); + CreatureTemplate const* ct = sObjectMgr->GetCreatureTemplate(cr->GetDisplayId() == NPC_SOWAW_WIND_MODEL ? NPC_SOWAW_WIND_ELEMENTAL : NPC_SOWAW_WATER_ELEMENTAL); + for (uint8 i = 0; i < CREATURE_MAX_SPELLS; ++i) + cr->m_spells[i] = ct->spells[i]; - player->VehicleSpellInitialize(); - } + player->VehicleSpellInitialize(); } } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_q12726_song_of_wind_and_water_SpellScript::HandleHealPct, EFFECT_2, SPELL_EFFECT_HEAL_PCT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q12726_song_of_wind_and_water_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_q12726_song_of_wind_and_water_SpellScript::HandleHealPct, EFFECT_2, SPELL_EFFECT_HEAL_PCT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q12726_song_of_wind_and_water_SpellScript(); + } }; enum AHerosBurden @@ -121,7 +121,7 @@ public: summons.DespawnAll(); me->SetControlled(false, UNIT_STATE_STUNNED); - Creature *cr; + Creature* cr; if ((cr = me->SummonCreature(NPC_JALOOT, 5616.91f, 3772.67f, -94.26f, 1.78f))) { summons.Summon(cr); @@ -179,7 +179,7 @@ public: for (std::list::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) { - Creature *minion = ObjectAccessor::GetCreature(*me, *itr); + Creature* minion = ObjectAccessor::GetCreature(*me, *itr); if (minion && minion->IsAlive()) { if (action == ACTION_BIND_MINIONS) @@ -258,7 +258,7 @@ public: } }; - CreatureAI *GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const { return new npc_artruis_the_hearthlessAI(creature); } @@ -293,7 +293,7 @@ class npc_still_at_it_trigger : public CreatureScript public: npc_still_at_it_trigger() : CreatureScript("npc_still_at_it_trigger") { } - CreatureAI *GetAI(Creature *pCreature) const + CreatureAI* GetAI(Creature* pCreature) const { return new npc_still_at_it_triggerAI(pCreature); } @@ -344,7 +344,7 @@ public: { timer = 5000; running = true; - stepcount = urand(5,10); + stepcount = urand(5, 10); Say(MCM_TEXT_START); } @@ -356,16 +356,22 @@ public: if (a == expectedaction) { currentstep++; - uint8 s = urand(0,2); + uint8 s = urand(0, 2); if (Creature* th = ObjectAccessor::GetCreature(*me, thunderbrewGUID)) th->HandleEmoteCommand(EMOTE_ONESHOT_CHEER_NO_SHEATHE); switch (s) { - case 0: Say(MCM_TEXT_CORRECT1); break; - case 1: Say(MCM_TEXT_CORRECT2); break; - default:Say(MCM_TEXT_CORRECT3); break; + case 0: + Say(MCM_TEXT_CORRECT1); + break; + case 1: + Say(MCM_TEXT_CORRECT2); + break; + default: + Say(MCM_TEXT_CORRECT3); + break; } if (currentstep >= stepcount) @@ -394,9 +400,15 @@ public: uint8 a = 0; switch (spellInfo->Id) { - case 51931: a = 4; break; - case 51932: a = 3; break; - case 51933: a = 5; break; + case 51931: + a = 4; + break; + case 51932: + a = 3; + break; + case 51933: + a = 5; + break; } CheckAction(a, caster->GetGUID()); @@ -426,14 +438,24 @@ public: } else // it's time to rand next move { - expectedaction = urand(1,5); + expectedaction = urand(1, 5); switch (expectedaction) { - case 1: Say(MCM_TEXT_PRESSURE); break; - case 2: Say(MCM_TEXT_HEAT); break; - case 3: Say(MCM_TEXT_BANANA); break; - case 4: Say(MCM_TEXT_ORANGE); break; - case 5: Say(MCM_TEXT_PAPAYA); break; + case 1: + Say(MCM_TEXT_PRESSURE); + break; + case 2: + Say(MCM_TEXT_HEAT); + break; + case 3: + Say(MCM_TEXT_BANANA); + break; + case 4: + Say(MCM_TEXT_ORANGE); + break; + case 5: + Say(MCM_TEXT_PAPAYA); + break; } timer = 10000; } @@ -456,7 +478,7 @@ public: player->PrepareQuestMenu(creature->GetGUID()); if (player->GetQuestStatus(12644) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, "I'm ready to start the distillation, uh, Tipsy.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, "I'm ready to start the distillation, uh, Tipsy.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); return true; @@ -467,7 +489,7 @@ public: if (!player) return true; - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) + if (uiAction == GOSSIP_ACTION_INFO_DEF + 1) { Creature* trigger = creature->FindNearestCreature(NPC_WANTS_BANANAS, 20.0f, true); if (trigger && trigger->AI()) @@ -555,7 +577,7 @@ public: if (player->GetQuestStatus(QUEST_MAKING_PEACE) == QUEST_STATUS_INCOMPLETE) { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_VEKJIK_ITEM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_VEKJIK_ITEM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); SendGossipMenuFor(player, GOSSIP_TEXTID_VEKJIK1, creature->GetGUID()); return true; } @@ -570,7 +592,7 @@ public: switch (action) { case GOSSIP_ACTION_INFO_DEF+1: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_VEKJIK_ITEM2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_VEKJIK_ITEM2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); SendGossipMenuFor(player, GOSSIP_TEXTID_VEKJIK2, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+2: @@ -616,7 +638,7 @@ public: player->PrepareQuestMenu(creature->GetGUID()); if (player->GetQuestStatus(QUEST_FREYA_PACT) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_AOF1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_AOF1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); SendGossipMenuFor(player, GOSSIP_TEXTID_AVATAR1, creature); return true; @@ -627,18 +649,18 @@ public: ClearGossipMenuFor(player); switch (action) { - case GOSSIP_ACTION_INFO_DEF+1: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_AOF2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - SendGossipMenuFor(player, GOSSIP_TEXTID_AVATAR2, creature); - break; - case GOSSIP_ACTION_INFO_DEF+2: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_AOF3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3); - SendGossipMenuFor(player, GOSSIP_TEXTID_AVATAR3, creature); - break; - case GOSSIP_ACTION_INFO_DEF+3: - player->CastSpell(player, SPELL_FREYA_CONVERSATION, true); - CloseGossipMenuFor(player); - break; + case GOSSIP_ACTION_INFO_DEF+1: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_AOF2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, GOSSIP_TEXTID_AVATAR2, creature); + break; + case GOSSIP_ACTION_INFO_DEF+2: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_AOF3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + SendGossipMenuFor(player, GOSSIP_TEXTID_AVATAR3, creature); + break; + case GOSSIP_ACTION_INFO_DEF+3: + player->CastSpell(player, SPELL_FREYA_CONVERSATION, true); + CloseGossipMenuFor(player); + break; } return true; } @@ -957,7 +979,7 @@ public: else if (me->GetEntry() == NPC_HADRIUS) { me->SetSheath(SHEATH_STATE_UNARMED); - me->CastSpell(me,SPELL_KNOCKDOWN,false); + me->CastSpell(me, SPELL_KNOCKDOWN, false); } SetEquipmentSlots(true); } @@ -1005,13 +1027,13 @@ public: } } - private: - uint16 sayTimer; - uint8 sayStep; - uint32 timer; - int8 phase; - uint64 playerGUID; - uint64 orphanGUID; + private: + uint16 sayTimer; + uint8 sayStep; + uint32 timer; + int8 phase; + uint64 playerGUID; + uint64 orphanGUID; }; CreatureAI* GetAI(Creature* creature) const @@ -1258,46 +1280,46 @@ public: switch (ev) { case EVENT_MISS_BIRD: - { - Creature* crunchy = shooter->FindNearestCreature(NPC_CRUNCHY, 30); - Creature* bird = shooter->FindNearestCreature(NPC_THICKBIRD, 30); - - if (!bird || !crunchy) - ; // fall to EVENT_MISS - else { - shooter->CastSpell(bird, SPELL_MISS_BIRD_APPLE); - bird->CastSpell(bird, SPELL_BIRD_FALL); + Creature* crunchy = shooter->FindNearestCreature(NPC_CRUNCHY, 30); + Creature* bird = shooter->FindNearestCreature(NPC_THICKBIRD, 30); + + if (!bird || !crunchy) + ; // fall to EVENT_MISS + else + { + shooter->CastSpell(bird, SPELL_MISS_BIRD_APPLE); + bird->CastSpell(bird, SPELL_BIRD_FALL); + wilhelm->AI()->Talk(SAY_WILHELM_MISS); + drostan->AI()->Talk(SAY_DROSTAN_REPLY_MISS); + + Unit::Kill(bird, bird); + crunchy->GetMotionMaster()->MovePoint(0, bird->GetPositionX(), bird->GetPositionY(), + bird->GetMap()->GetWaterOrGroundLevel(bird->GetPhaseMask(), bird->GetPositionX(), bird->GetPositionY(), bird->GetPositionZ())); + /// @todo Make crunchy perform emote eat when he reaches the bird + + break; + } + [[fallthrough]]; + } + case EVENT_MISS: + { + shooter->CastSpell(wilhelm, SPELL_MISS_APPLE); wilhelm->AI()->Talk(SAY_WILHELM_MISS); drostan->AI()->Talk(SAY_DROSTAN_REPLY_MISS); - - Unit::Kill(bird, bird); - crunchy->GetMotionMaster()->MovePoint(0, bird->GetPositionX(), bird->GetPositionY(), - bird->GetMap()->GetWaterOrGroundLevel(bird->GetPhaseMask(), bird->GetPositionX(), bird->GetPositionY(), bird->GetPositionZ())); - /// @todo Make crunchy perform emote eat when he reaches the bird + break; + } + case EVENT_HIT: + { + shooter->CastSpell(apple, SPELL_HIT_APPLE); + apple->CastSpell(apple, SPELL_APPLE_FALL); + wilhelm->AI()->Talk(SAY_WILHELM_HIT); + if (Player* player = shooter->ToPlayer()) + player->KilledMonsterCredit(NPC_APPLE, 0); + //apple->DespawnOrUnsummon(); zomg! break; } - [[fallthrough]]; - } - case EVENT_MISS: - { - shooter->CastSpell(wilhelm, SPELL_MISS_APPLE); - wilhelm->AI()->Talk(SAY_WILHELM_MISS); - drostan->AI()->Talk(SAY_DROSTAN_REPLY_MISS); - break; - } - case EVENT_HIT: - { - shooter->CastSpell(apple, SPELL_HIT_APPLE); - apple->CastSpell(apple, SPELL_APPLE_FALL); - wilhelm->AI()->Talk(SAY_WILHELM_HIT); - if (Player* player = shooter->ToPlayer()) - player->KilledMonsterCredit(NPC_APPLE, 0); - //apple->DespawnOrUnsummon(); zomg! - - break; - } } } @@ -1376,35 +1398,35 @@ public: if (Vehicle* veh = me->GetVehicleKit()) if (Unit* pilot = veh->GetPassenger(0)) - switch (pointId) - { - case 5: - pilot->ToCreature()->AI()->Talk(VIC_SAY_0); - break; - case 11: - pilot->ToCreature()->AI()->Talk(VIC_SAY_1); - break; - case 12: - pilot->ToCreature()->AI()->Talk(VIC_SAY_2); - break; - case 14: - pilot->ToCreature()->AI()->Talk(VIC_SAY_3); - break; - case 15: - pilot->ToCreature()->ToCreature()->AI()->Talk(VIC_SAY_4); - break; - case 17: - pilot->ToCreature()->AI()->Talk(VIC_SAY_5); - break; - case 21: - pilot->ToCreature()->AI()->Talk(VIC_SAY_6); - break; - case 25: - Talk(PLANE_EMOTE); - DoCast(AURA_ENGINE); - me->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FORCE_MOVEMENT); - break; - } + switch (pointId) + { + case 5: + pilot->ToCreature()->AI()->Talk(VIC_SAY_0); + break; + case 11: + pilot->ToCreature()->AI()->Talk(VIC_SAY_1); + break; + case 12: + pilot->ToCreature()->AI()->Talk(VIC_SAY_2); + break; + case 14: + pilot->ToCreature()->AI()->Talk(VIC_SAY_3); + break; + case 15: + pilot->ToCreature()->ToCreature()->AI()->Talk(VIC_SAY_4); + break; + case 17: + pilot->ToCreature()->AI()->Talk(VIC_SAY_5); + break; + case 21: + pilot->ToCreature()->AI()->Talk(VIC_SAY_6); + break; + case 25: + Talk(PLANE_EMOTE); + DoCast(AURA_ENGINE); + me->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FORCE_MOVEMENT); + break; + } pointId++; } @@ -1442,7 +1464,7 @@ enum ShangoTracks class spell_shango_tracks : public SpellScriptLoader { public: - spell_shango_tracks() : SpellScriptLoader("spell_shango_tracks") { } + spell_shango_tracks() : SpellScriptLoader("spell_shango_tracks") { } class spell_shango_tracks_SpellScript : public SpellScript { diff --git a/src/server/scripts/Northrend/zone_storm_peaks.cpp b/src/server/scripts/Northrend/zone_storm_peaks.cpp index d4bc6c5da..ef3b5e643 100644 --- a/src/server/scripts/Northrend/zone_storm_peaks.cpp +++ b/src/server/scripts/Northrend/zone_storm_peaks.cpp @@ -88,7 +88,7 @@ public: { cr->ToTempSummon()->SetTempSummonType(TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT); cr->ToTempSummon()->InitStats(20000); - if (urand(0,1)) + if (urand(0, 1)) cr->GetMotionMaster()->MoveFollow(me, 0.0f, 0.0f); else if (cr->AI()) cr->AI()->AttackStart(me); @@ -406,7 +406,7 @@ public: { if (!playerGUID && spellInfo->Id == SPELL_SPEAR_OF_HODIR) { - me->GetMotionMaster()->MovePoint(1, caster->GetPositionX(), caster->GetPositionY(), caster->GetPositionZ()+12.0f); + me->GetMotionMaster()->MovePoint(1, caster->GetPositionX(), caster->GetPositionY(), caster->GetPositionZ() + 12.0f); playerGUID = caster->GetGUID(); } else if (spellInfo->Id == SPELL_GRAB_ON) @@ -426,7 +426,7 @@ public: } else if (spellInfo->Id == SPELL_FATAL_STRIKE) { - if (roll_chance_i(me->GetAuraCount(SPELL_PRY_JAWS_OPEN)*10)) + if (roll_chance_i(me->GetAuraCount(SPELL_PRY_JAWS_OPEN) * 10)) { if (Player* player = GetValidPlayer()) { @@ -496,7 +496,8 @@ public: if (checkTimer >= 2000) { checkTimer = 1; - if (me->HealthBelowPct(25)) { + if (me->HealthBelowPct(25)) + { if (Player* player = GetValidPlayer()) { Talk(3); @@ -577,47 +578,47 @@ public: class spell_q13003_thursting_hodirs_spear : public SpellScriptLoader { - public: - spell_q13003_thursting_hodirs_spear() : SpellScriptLoader("spell_q13003_thursting_hodirs_spear") { } +public: + spell_q13003_thursting_hodirs_spear() : SpellScriptLoader("spell_q13003_thursting_hodirs_spear") { } - class spell_q13003_thursting_hodirs_spear_AuraScript : public AuraScript + class spell_q13003_thursting_hodirs_spear_AuraScript : public AuraScript + { + PrepareAuraScript(spell_q13003_thursting_hodirs_spear_AuraScript); + + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_q13003_thursting_hodirs_spear_AuraScript); + ModStackAmount(60); + } - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Creature* creature = GetUnitOwner()->ToCreature()) { - ModStackAmount(60); - } - - void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Creature* creature = GetUnitOwner()->ToCreature()) + if (!creature->IsInEvadeMode()) { - if (!creature->IsInEvadeMode()) - { - creature->RemoveAllAuras(); - creature->AI()->EnterEvadeMode(); - } + creature->RemoveAllAuras(); + creature->AI()->EnterEvadeMode(); } } - - void HandlePeriodic(AuraEffect const* /* aurEff */) - { - ModStackAmount(-1); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_q13003_thursting_hodirs_spear_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - OnEffectApply += AuraEffectApplyFn(spell_q13003_thursting_hodirs_spear_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_q13003_thursting_hodirs_spear_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_q13003_thursting_hodirs_spear_AuraScript(); } + + void HandlePeriodic(AuraEffect const* /* aurEff */) + { + ModStackAmount(-1); + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_q13003_thursting_hodirs_spear_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + OnEffectApply += AuraEffectApplyFn(spell_q13003_thursting_hodirs_spear_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_q13003_thursting_hodirs_spear_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_q13003_thursting_hodirs_spear_AuraScript(); + } }; enum q13007IronColossus @@ -724,12 +725,12 @@ public: ClearGossipMenuFor(player); switch (action) { - case GOSSIP_ACTION_TRAIN: - player->GetSession()->SendTrainerList(creature->GetGUID()); - break; - case GOSSIP_ACTION_TRADE: - player->GetSession()->SendListInventory(creature->GetGUID()); - break; + case GOSSIP_ACTION_TRAIN: + player->GetSession()->SendTrainerList(creature->GetGUID()); + break; + case GOSSIP_ACTION_TRADE: + player->GetSession()->SendListInventory(creature->GetGUID()); + break; } return true; } @@ -950,45 +951,45 @@ class npc_hyldsmeet_protodrake : public CreatureScript NPC_HYLDSMEET_DRAKERIDER = 29694 }; +public: + npc_hyldsmeet_protodrake() : CreatureScript("npc_hyldsmeet_protodrake") { } + + class npc_hyldsmeet_protodrakeAI : public CreatureAI + { public: - npc_hyldsmeet_protodrake() : CreatureScript("npc_hyldsmeet_protodrake") { } + npc_hyldsmeet_protodrakeAI(Creature* creature) : CreatureAI(creature), _accessoryRespawnTimer(0), _vehicleKit(creature->GetVehicleKit()) { } - class npc_hyldsmeet_protodrakeAI : public CreatureAI + void PassengerBoarded(Unit* who, int8 /*seat*/, bool apply) { - public: - npc_hyldsmeet_protodrakeAI(Creature* creature) : CreatureAI(creature), _accessoryRespawnTimer(0), _vehicleKit(creature->GetVehicleKit()) { } + if (apply) + return; - void PassengerBoarded(Unit* who, int8 /*seat*/, bool apply) - { - if (apply) - return; - - if (who->GetEntry() == NPC_HYLDSMEET_DRAKERIDER) - _accessoryRespawnTimer = 5 * MINUTE * IN_MILLISECONDS; - } - - void UpdateAI(uint32 diff) - { - //! We need to manually reinstall accessories because the vehicle itself is friendly to players, - //! so EnterEvadeMode is never triggered. The accessory on the other hand is hostile and killable. - if (_accessoryRespawnTimer && _accessoryRespawnTimer <= diff && _vehicleKit) - { - _vehicleKit->InstallAllAccessories(true); - _accessoryRespawnTimer = 0; - } - else - _accessoryRespawnTimer -= diff; - } - - private: - uint32 _accessoryRespawnTimer; - Vehicle* _vehicleKit; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_hyldsmeet_protodrakeAI(creature); + if (who->GetEntry() == NPC_HYLDSMEET_DRAKERIDER) + _accessoryRespawnTimer = 5 * MINUTE * IN_MILLISECONDS; } + + void UpdateAI(uint32 diff) + { + //! We need to manually reinstall accessories because the vehicle itself is friendly to players, + //! so EnterEvadeMode is never triggered. The accessory on the other hand is hostile and killable. + if (_accessoryRespawnTimer && _accessoryRespawnTimer <= diff && _vehicleKit) + { + _vehicleKit->InstallAllAccessories(true); + _accessoryRespawnTimer = 0; + } + else + _accessoryRespawnTimer -= diff; + } + + private: + uint32 _accessoryRespawnTimer; + Vehicle* _vehicleKit; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_hyldsmeet_protodrakeAI(creature); + } }; enum CloseRift @@ -998,44 +999,44 @@ enum CloseRift class spell_close_rift : public SpellScriptLoader { - public: - spell_close_rift() : SpellScriptLoader("spell_close_rift") { } +public: + spell_close_rift() : SpellScriptLoader("spell_close_rift") { } - class spell_close_rift_AuraScript : public AuraScript + class spell_close_rift_AuraScript : public AuraScript + { + PrepareAuraScript(spell_close_rift_AuraScript); + + bool Load() { - PrepareAuraScript(spell_close_rift_AuraScript); - - bool Load() - { - _counter = 0; - return true; - } - - bool Validate(SpellInfo const* /*spell*/) - { - return sSpellMgr->GetSpellInfo(SPELL_DESPAWN_RIFT); - } - - void HandlePeriodic(AuraEffect const* /* aurEff */) - { - if (++_counter == 5) - GetTarget()->CastSpell((Unit*)NULL, SPELL_DESPAWN_RIFT, true); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_close_rift_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - - private: - uint8 _counter; - - }; - - AuraScript* GetAuraScript() const - { - return new spell_close_rift_AuraScript(); + _counter = 0; + return true; } + + bool Validate(SpellInfo const* /*spell*/) + { + return sSpellMgr->GetSpellInfo(SPELL_DESPAWN_RIFT); + } + + void HandlePeriodic(AuraEffect const* /* aurEff */) + { + if (++_counter == 5) + GetTarget()->CastSpell((Unit*)NULL, SPELL_DESPAWN_RIFT, true); + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_close_rift_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + + private: + uint8 _counter; + + }; + + AuraScript* GetAuraScript() const + { + return new spell_close_rift_AuraScript(); + } }; void AddSC_storm_peaks() diff --git a/src/server/scripts/Northrend/zone_wintergrasp.cpp b/src/server/scripts/Northrend/zone_wintergrasp.cpp index edb936b5e..606708117 100644 --- a/src/server/scripts/Northrend/zone_wintergrasp.cpp +++ b/src/server/scripts/Northrend/zone_wintergrasp.cpp @@ -127,131 +127,131 @@ uint32 const vehiclesList[MAX_WINTERGRASP_VEHICLES] = class npc_wg_demolisher_engineer : public CreatureScript { - public: - npc_wg_demolisher_engineer() : CreatureScript("npc_wg_demolisher_engineer") { } +public: + npc_wg_demolisher_engineer() : CreatureScript("npc_wg_demolisher_engineer") { } - bool OnGossipHello(Player* player, Creature* creature) override + bool OnGossipHello(Player* player, Creature* creature) override + { + if (creature->IsQuestGiver()) + player->PrepareQuestMenu(creature->GetGUID()); + + if (canBuild(creature)) { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (canBuild(creature)) + if (player->HasAura(SPELL_CORPORAL)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + else if (player->HasAura(SPELL_LIEUTENANT)) { - if (player->HasAura(SPELL_CORPORAL)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - else if (player->HasAura(SPELL_LIEUTENANT)) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - } + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); } - else - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9); - - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; } + else + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9); - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender */ , uint32 action) override + SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + return true; + } + + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender */, uint32 action) override + { + CloseGossipMenuFor(player); + + if (canBuild(creature)) { - CloseGossipMenuFor(player); - - if (canBuild(creature)) + switch (action - GOSSIP_ACTION_INFO_DEF) { - switch (action - GOSSIP_ACTION_INFO_DEF) - { - case 0: - creature->CastSpell(player, SPELL_BUILD_CATAPULT_FORCE, true); - break; - case 1: - creature->CastSpell(player, SPELL_BUILD_DEMOLISHER_FORCE, true); - break; - case 2: - creature->CastSpell(player, player->GetTeamId() == TEAM_ALLIANCE ? SPELL_BUILD_SIEGE_VEHICLE_FORCE_ALLIANCE : SPELL_BUILD_SIEGE_VEHICLE_FORCE_HORDE, true); - break; - } - creature->CastSpell(creature, SPELL_ACTIVATE_CONTROL_ARMS, true); + case 0: + creature->CastSpell(player, SPELL_BUILD_CATAPULT_FORCE, true); + break; + case 1: + creature->CastSpell(player, SPELL_BUILD_DEMOLISHER_FORCE, true); + break; + case 2: + creature->CastSpell(player, player->GetTeamId() == TEAM_ALLIANCE ? SPELL_BUILD_SIEGE_VEHICLE_FORCE_ALLIANCE : SPELL_BUILD_SIEGE_VEHICLE_FORCE_HORDE, true); + break; } - return true; + creature->CastSpell(creature, SPELL_ACTIVATE_CONTROL_ARMS, true); } + return true; + } - private: - bool canBuild(Creature* creature) +private: + bool canBuild(Creature* creature) + { + Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); + if (!wintergrasp) + return false; + + switch (creature->GetEntry()) { - Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); - if (!wintergrasp) + case NPC_GOBLIN_MECHANIC: + return (wintergrasp->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_H) > wintergrasp->GetData(BATTLEFIELD_WG_DATA_VEHICLE_H)); + case NPC_GNOMISH_ENGINEER: + return (wintergrasp->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_A) > wintergrasp->GetData(BATTLEFIELD_WG_DATA_VEHICLE_A)); + default: return false; - - switch (creature->GetEntry()) - { - case NPC_GOBLIN_MECHANIC: - return (wintergrasp->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_H) > wintergrasp->GetData(BATTLEFIELD_WG_DATA_VEHICLE_H)); - case NPC_GNOMISH_ENGINEER: - return (wintergrasp->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_A) > wintergrasp->GetData(BATTLEFIELD_WG_DATA_VEHICLE_A)); - default: - return false; - } } + } }; class npc_wg_spirit_guide : public CreatureScript { - public: - npc_wg_spirit_guide() : CreatureScript("npc_wg_spirit_guide") { } +public: + npc_wg_spirit_guide() : CreatureScript("npc_wg_spirit_guide") { } - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + bool OnGossipHello(Player* player, Creature* creature) override + { + if (creature->IsQuestGiver()) + player->PrepareQuestMenu(creature->GetGUID()); - Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); - if (!wintergrasp) - return true; - - GraveyardVect graveyard = wintergrasp->GetGraveyardVector(); - for (uint8 i = 0; i < graveyard.size(); i++) - if (graveyard[i]->GetControlTeamId() == player->GetTeamId()) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, sObjectMgr->GetAcoreStringForDBCLocale(((BfGraveyardWG*)graveyard[i])->GetTextId()), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + i); - - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); + if (!wintergrasp) return true; + + GraveyardVect graveyard = wintergrasp->GetGraveyardVector(); + for (uint8 i = 0; i < graveyard.size(); i++) + if (graveyard[i]->GetControlTeamId() == player->GetTeamId()) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, sObjectMgr->GetAcoreStringForDBCLocale(((BfGraveyardWG*)graveyard[i])->GetTextId()), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + i); + + SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + return true; + } + + bool OnGossipSelect(Player* player, Creature* /*creature */, uint32 /*sender */, uint32 action) override + { + CloseGossipMenuFor(player); + + Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); + if (wintergrasp) + { + GraveyardVect gy = wintergrasp->GetGraveyardVector(); + for (uint8 i = 0; i < gy.size(); i++) + if (action - GOSSIP_ACTION_INFO_DEF == i && gy[i]->GetControlTeamId() == player->GetTeamId()) + if (GraveyardStruct const* safeLoc = sGraveyard->GetGraveyard(gy[i]->GetGraveyardId())) + player->TeleportTo(safeLoc->Map, safeLoc->x, safeLoc->y, safeLoc->z, 0); + } + return true; + } + + struct npc_wg_spirit_guideAI : public ScriptedAI + { + npc_wg_spirit_guideAI(Creature* creature) : ScriptedAI(creature) + { + me->setActive(true); } - bool OnGossipSelect(Player* player, Creature* /*creature */ , uint32 /*sender */ , uint32 action) override + void UpdateAI(uint32 /*diff*/) override { - CloseGossipMenuFor(player); - - Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); - if (wintergrasp) - { - GraveyardVect gy = wintergrasp->GetGraveyardVector(); - for (uint8 i = 0; i < gy.size(); i++) - if (action - GOSSIP_ACTION_INFO_DEF == i && gy[i]->GetControlTeamId() == player->GetTeamId()) - if (GraveyardStruct const* safeLoc = sGraveyard->GetGraveyard(gy[i]->GetGraveyardId())) - player->TeleportTo(safeLoc->Map, safeLoc->x, safeLoc->y, safeLoc->z, 0); - } - return true; + if (!me->HasUnitState(UNIT_STATE_CASTING)) + DoCast(me, SPELL_CHANNEL_SPIRIT_HEAL); } + }; - struct npc_wg_spirit_guideAI : public ScriptedAI - { - npc_wg_spirit_guideAI(Creature* creature) : ScriptedAI(creature) - { - me->setActive(true); - } - - void UpdateAI(uint32 /*diff*/) override - { - if (!me->HasUnitState(UNIT_STATE_CASTING)) - DoCast(me, SPELL_CHANNEL_SPIRIT_HEAL); - } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_wg_spirit_guideAI(creature); - } + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_wg_spirit_guideAI(creature); + } }; enum eWgQueue @@ -271,470 +271,470 @@ enum eWgQueue class npc_wg_queue : public CreatureScript { - public: - npc_wg_queue() : CreatureScript("npc_wg_queue") { } +public: + npc_wg_queue() : CreatureScript("npc_wg_queue") { } - bool OnGossipHello(Player* player, Creature* creature) override + bool OnGossipHello(Player* player, Creature* creature) override + { + if (!sWorld->getBoolConfig(CONFIG_MINIGOB_MANABONK)) + return false; + + if (creature->IsQuestGiver()) + player->PrepareQuestMenu(creature->GetGUID()); + + Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); + if (!wintergrasp) + return true; + + if (wintergrasp->IsWarTime()) { - if (!sWorld->getBoolConfig(CONFIG_MINIGOB_MANABONK)) - return false; - - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); - if (!wintergrasp) - return true; - - if (wintergrasp->IsWarTime()) + AddGossipItemFor(player, GOSSIP_ICON_CHAT_19, "Queue for Wintergrasp.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_WAR : WG_NPCQUEUE_TEXT_A_WAR, creature->GetGUID()); + } + else + { + uint32 timer = wintergrasp->GetTimer() / 1000; + player->SendUpdateWorldState(4354, time(nullptr) + timer); + if (timer < 15 * MINUTE) { - AddGossipItemFor(player, GOSSIP_ICON_CHAT_19, "Queue for Wintergrasp.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, wintergrasp->GetDefenderTeam()? WG_NPCQUEUE_TEXT_H_WAR : WG_NPCQUEUE_TEXT_A_WAR, creature->GetGUID()); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Queue for Wintergrasp.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_QUEUE : WG_NPCQUEUE_TEXT_A_QUEUE, creature->GetGUID()); } else - { - uint32 timer = wintergrasp->GetTimer() / 1000; - player->SendUpdateWorldState(4354, time(nullptr) + timer); - if (timer < 15 * MINUTE) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Queue for Wintergrasp.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_QUEUE : WG_NPCQUEUE_TEXT_A_QUEUE, creature->GetGUID()); - } - else - SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_NOWAR : WG_NPCQUEUE_TEXT_A_NOWAR, creature->GetGUID()); - } + SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_NOWAR : WG_NPCQUEUE_TEXT_A_NOWAR, creature->GetGUID()); + } + return true; + } + + bool OnGossipSelect(Player* player, Creature* /*creature */, uint32 /*sender */, uint32 /*action*/) override + { + CloseGossipMenuFor(player); + + Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); + if (!wintergrasp) return true; + + if (wintergrasp->IsWarTime()) + wintergrasp->InvitePlayerToWar(player); + else + { + uint32 timer = wintergrasp->GetTimer() / 1000; + if (timer < 15 * MINUTE) + wintergrasp->InvitePlayerToQueue(player); + } + return true; + } + + struct npc_wg_queueAI : public ScriptedAI + { + npc_wg_queueAI(Creature* creature) : ScriptedAI(creature) + { + if (creature->GetEntry() == NPC_ARCANIST_BRAEDIN) + events.ScheduleEvent(EVENT_ARCANIST_BRAEDIN_YELL, 0); + else if (creature->GetEntry() == NPC_MAGISTER_SURDIEL) + events.ScheduleEvent(EVENT_MAGISTER_SURDIEL_YELL, 0); + + events.ScheduleEvent(EVENT_SPELL_FROST_ARMOR, 0); } - bool OnGossipSelect(Player* player, Creature* /*creature */ , uint32 /*sender */ , uint32 /*action*/) override + EventMap events; + + void UpdateAI(uint32 diff) override { - CloseGossipMenuFor(player); + if (!sWorld->getBoolConfig(CONFIG_WINTERGRASP_ENABLE)) + return; - Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); - if (!wintergrasp) - return true; + ScriptedAI::UpdateAI(diff); - if (wintergrasp->IsWarTime()) - wintergrasp->InvitePlayerToWar(player); - else + events.Update(diff); + switch (events.ExecuteEvent()) { - uint32 timer = wintergrasp->GetTimer() / 1000; - if (timer < 15 * MINUTE) - wintergrasp->InvitePlayerToQueue(player); - } - return true; - } - - struct npc_wg_queueAI : public ScriptedAI - { - npc_wg_queueAI(Creature* creature) : ScriptedAI(creature) - { - if (creature->GetEntry() == NPC_ARCANIST_BRAEDIN) - events.ScheduleEvent(EVENT_ARCANIST_BRAEDIN_YELL, 0); - else if (creature->GetEntry() == NPC_MAGISTER_SURDIEL) - events.ScheduleEvent(EVENT_MAGISTER_SURDIEL_YELL, 0); - - events.ScheduleEvent(EVENT_SPELL_FROST_ARMOR, 0); - } - - EventMap events; - - void UpdateAI(uint32 diff) override - { - if (!sWorld->getBoolConfig(CONFIG_WINTERGRASP_ENABLE)) - return; - - ScriptedAI::UpdateAI(diff); - - events.Update(diff); - switch (events.ExecuteEvent()) - { - case EVENT_ARCANIST_BRAEDIN_YELL: - if (Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG)) + case EVENT_ARCANIST_BRAEDIN_YELL: + if (Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG)) + { + if (wintergrasp->IsWarTime()) { - if (wintergrasp->IsWarTime()) - { - Talk(SAY_ARCANIST_BRAEDIN); - events.ScheduleEvent(EVENT_ARCANIST_BRAEDIN_YELL, 240000); - break; - } + Talk(SAY_ARCANIST_BRAEDIN); + events.ScheduleEvent(EVENT_ARCANIST_BRAEDIN_YELL, 240000); + break; } - events.ScheduleEvent(EVENT_ARCANIST_BRAEDIN_YELL, 5000); - break; - case EVENT_MAGISTER_SURDIEL_YELL: - if (Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG)) + } + events.ScheduleEvent(EVENT_ARCANIST_BRAEDIN_YELL, 5000); + break; + case EVENT_MAGISTER_SURDIEL_YELL: + if (Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG)) + { + uint32 timer = wintergrasp->GetTimer() / 1000; + if (!wintergrasp->IsWarTime() && timer < 5 * MINUTE && timer > 4 * MINUTE) { - uint32 timer = wintergrasp->GetTimer() / 1000; - if (!wintergrasp->IsWarTime() && timer < 5*MINUTE && timer > 4*MINUTE) - { - Talk(SAY_MAGISTER_SURDIEL); - events.ScheduleEvent(EVENT_MAGISTER_SURDIEL_YELL, 300000); - break; - } + Talk(SAY_MAGISTER_SURDIEL); + events.ScheduleEvent(EVENT_MAGISTER_SURDIEL_YELL, 300000); + break; } - events.ScheduleEvent(EVENT_MAGISTER_SURDIEL_YELL, 5000); - break; - case EVENT_SPELL_FROST_ARMOR: - me->CastSpell(me, SPELL_FROST_ARMOR, true); - events.ScheduleEvent(EVENT_SPELL_FROST_ARMOR, 900000); - break; - } + } + events.ScheduleEvent(EVENT_MAGISTER_SURDIEL_YELL, 5000); + break; + case EVENT_SPELL_FROST_ARMOR: + me->CastSpell(me, SPELL_FROST_ARMOR, true); + events.ScheduleEvent(EVENT_SPELL_FROST_ARMOR, 900000); + break; } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_wg_queueAI(creature); } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_wg_queueAI(creature); + } }; class npc_wg_quest_giver : public CreatureScript { - public: - npc_wg_quest_giver() : CreatureScript("npc_wg_quest_giver") { } +public: + npc_wg_quest_giver() : CreatureScript("npc_wg_quest_giver") { } - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + bool OnGossipHello(Player* player, Creature* creature) override + { + if (creature->IsQuestGiver()) + player->PrepareQuestMenu(creature->GetGUID()); - Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); - if (!wintergrasp) - return true; - - if (creature->IsQuestGiver()) - { - QuestRelationBounds objectQR = sObjectMgr->GetCreatureQuestRelationBounds(creature->GetEntry()); - QuestRelationBounds objectQIR = sObjectMgr->GetCreatureQuestInvolvedRelationBounds(creature->GetEntry()); - - QuestMenu& qm = player->PlayerTalkClass->GetQuestMenu(); - qm.ClearMenu(); - - for (QuestRelations::const_iterator i = objectQIR.first; i != objectQIR.second; ++i) - { - uint32 quest_id = i->second; - QuestStatus status = player->GetQuestStatus(quest_id); - if (status == QUEST_STATUS_COMPLETE) - qm.AddMenuItem(quest_id, 4); - else if (status == QUEST_STATUS_INCOMPLETE) - qm.AddMenuItem(quest_id, 4); - //else if (status == QUEST_STATUS_AVAILABLE) - // qm.AddMenuItem(quest_id, 2); - } - - // xinef: add att/def doubles if this quest is spawned - std::vector questRelationVector; - for (QuestRelations::const_iterator i = objectQR.first; i != objectQR.second; ++i) - { - uint32 questId = i->second; - Quest const* quest = sObjectMgr->GetQuestTemplate(questId); - if (!quest) - continue; - - switch (questId) - { - case QUEST_BONES_AND_ARROWS_ALLIANCE_ATT: - if (!sPoolMgr->IsSpawnedObject(QUEST_BONES_AND_ARROWS_ALLIANCE_DEF)) - continue; - questRelationVector.push_back(QUEST_BONES_AND_ARROWS_ALLIANCE_ATT); - break; - case QUEST_WARDING_THE_WARRIORS_ALLIANCE_ATT: - if (!sPoolMgr->IsSpawnedObject(QUEST_WARDING_THE_WARRIORS_ALLIANCE_DEF)) - continue; - questRelationVector.push_back(QUEST_WARDING_THE_WARRIORS_ALLIANCE_ATT); - break; - case QUEST_A_RARE_HERB_ALLIANCE_ATT: - if (!sPoolMgr->IsSpawnedObject(QUEST_A_RARE_HERB_ALLIANCE_DEF)) - continue; - questRelationVector.push_back(QUEST_A_RARE_HERB_ALLIANCE_ATT); - break; - case QUEST_FUELING_THE_DEMOLISHERS_ALLIANCE_ATT: - if (!sPoolMgr->IsSpawnedObject(QUEST_FUELING_THE_DEMOLISHERS_ALLIANCE_DEF)) - continue; - questRelationVector.push_back(QUEST_FUELING_THE_DEMOLISHERS_ALLIANCE_ATT); - break; - case QUEST_BONES_AND_ARROWS_HORDE_ATT: - if (!sPoolMgr->IsSpawnedObject(QUEST_BONES_AND_ARROWS_HORDE_DEF)) - continue; - questRelationVector.push_back(QUEST_BONES_AND_ARROWS_HORDE_ATT); - break; - case QUEST_JINXING_THE_WALLS_HORDE_ATT: - if (!sPoolMgr->IsSpawnedObject(QUEST_WARDING_THE_WALLS_HORDE_DEF)) - continue; - questRelationVector.push_back(QUEST_JINXING_THE_WALLS_HORDE_ATT); - break; - case QUEST_FUELING_THE_DEMOLISHERS_HORDE_ATT: - if (!sPoolMgr->IsSpawnedObject(QUEST_FUELING_THE_DEMOLISHERS_HORDE_DEF)) - continue; - questRelationVector.push_back(QUEST_FUELING_THE_DEMOLISHERS_HORDE_ATT); - break; - case QUEST_HEALING_WITH_ROSES_HORDE_ATT: - if (!sPoolMgr->IsSpawnedObject(QUEST_HEALING_WITH_ROSES_HORDE_DEF)) - continue; - questRelationVector.push_back(QUEST_HEALING_WITH_ROSES_HORDE_ATT); - break; - default: - questRelationVector.push_back(questId); - break; - } - } - - for (std::vector::const_iterator i = questRelationVector.begin(); i != questRelationVector.end(); ++i) - { - uint32 questId = *i; - Quest const* quest = sObjectMgr->GetQuestTemplate(questId); - switch (questId) - { - // Horde attacker - case QUEST_BONES_AND_ARROWS_HORDE_ATT: - case QUEST_JINXING_THE_WALLS_HORDE_ATT: - case QUEST_SLAY_THEM_ALL_HORDE_ATT: - case QUEST_FUELING_THE_DEMOLISHERS_HORDE_ATT: - case QUEST_HEALING_WITH_ROSES_HORDE_ATT: - case QUEST_DEFEND_THE_SIEGE_HORDE_ATT: - if (wintergrasp->GetAttackerTeam() == TEAM_HORDE) - { - QuestStatus status = player->GetQuestStatus(questId); - - if (quest->IsAutoComplete() && player->CanTakeQuest(quest, false)) - qm.AddMenuItem(questId, 4); - else if (status == QUEST_STATUS_NONE && player->CanTakeQuest(quest, false)) - qm.AddMenuItem(questId, 2); - } - break; - // Horde defender - case QUEST_BONES_AND_ARROWS_HORDE_DEF: - case QUEST_WARDING_THE_WALLS_HORDE_DEF: - case QUEST_SLAY_THEM_ALL_HORDE_DEF: - case QUEST_FUELING_THE_DEMOLISHERS_HORDE_DEF: - case QUEST_HEALING_WITH_ROSES_HORDE_DEF: - case QUEST_TOPPLING_THE_TOWERS_HORDE_DEF: - case QUEST_STOP_THE_SIEGE_HORDE_DEF: - if (wintergrasp->GetDefenderTeam() == TEAM_HORDE) - { - QuestStatus status = player->GetQuestStatus(questId); - - if (quest->IsAutoComplete() && player->CanTakeQuest(quest, false)) - qm.AddMenuItem(questId, 4); - else if (status == QUEST_STATUS_NONE && player->CanTakeQuest(quest, false)) - qm.AddMenuItem(questId, 2); - } - break; - // Alliance attacker - case QUEST_BONES_AND_ARROWS_ALLIANCE_ATT: - case QUEST_WARDING_THE_WARRIORS_ALLIANCE_ATT: - case QUEST_NO_MERCY_FOR_THE_MERCILESS_ALLIANCE_ATT: - case QUEST_DEFEND_THE_SIEGE_ALLIANCE_ATT: - case QUEST_A_RARE_HERB_ALLIANCE_ATT: - case QUEST_FUELING_THE_DEMOLISHERS_ALLIANCE_ATT: - if (wintergrasp->GetAttackerTeam() == TEAM_ALLIANCE) - { - QuestStatus status = player->GetQuestStatus(questId); - - if (quest->IsAutoComplete() && player->CanTakeQuest(quest, false)) - qm.AddMenuItem(questId, 4); - else if (status == QUEST_STATUS_NONE && player->CanTakeQuest(quest, false)) - qm.AddMenuItem(questId, 2); - } - break; - // Alliance defender - case QUEST_BONES_AND_ARROWS_ALLIANCE_DEF: - case QUEST_WARDING_THE_WARRIORS_ALLIANCE_DEF: - case QUEST_NO_MERCY_FOR_THE_MERCILESS_ALLIANCE_DEF: - case QUEST_SHOUTHERN_SABOTAGE_ALLIANCE_DEF: - case QUEST_STOP_THE_SIEGE_ALLIANCE_DEF: - case QUEST_A_RARE_HERB_ALLIANCE_DEF: - case QUEST_FUELING_THE_DEMOLISHERS_ALLIANCE_DEF: - if (wintergrasp->GetDefenderTeam() == TEAM_ALLIANCE) - { - QuestStatus status = player->GetQuestStatus(questId); - - if (quest->IsAutoComplete() && player->CanTakeQuest(quest, false)) - qm.AddMenuItem(questId, 4); - else if (status == QUEST_STATUS_NONE && player->CanTakeQuest(quest, false)) - qm.AddMenuItem(questId, 2); - } - break; - default: - QuestStatus status = player->GetQuestStatus(questId); - - if (quest->IsAutoComplete() && player->CanTakeQuest(quest, false)) - qm.AddMenuItem(questId, 4); - else if (status == QUEST_STATUS_NONE && player->CanTakeQuest(quest, false)) - qm.AddMenuItem(questId, 2); - break; - } - } - } - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); + if (!wintergrasp) return true; - } - uint32 GetDialogStatus(Player* player, Creature* creature) override + if (creature->IsQuestGiver()) { - QuestRelationBounds qr = sObjectMgr->GetCreatureQuestRelationBounds(creature->GetEntry()); - QuestRelationBounds qir = sObjectMgr->GetCreatureQuestInvolvedRelationBounds(creature->GetEntry()); - QuestGiverStatus result = DIALOG_STATUS_NONE; + QuestRelationBounds objectQR = sObjectMgr->GetCreatureQuestRelationBounds(creature->GetEntry()); + QuestRelationBounds objectQIR = sObjectMgr->GetCreatureQuestInvolvedRelationBounds(creature->GetEntry()); - for (QuestRelations::const_iterator i = qir.first; i != qir.second; ++i) + QuestMenu& qm = player->PlayerTalkClass->GetQuestMenu(); + qm.ClearMenu(); + + for (QuestRelations::const_iterator i = objectQIR.first; i != objectQIR.second; ++i) { - QuestGiverStatus result2 = DIALOG_STATUS_NONE; - uint32 questId = i->second; - Quest const* quest = sObjectMgr->GetQuestTemplate(questId); - if (!quest) - continue; - - ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_QUEST_AVAILABLE, quest->GetQuestId()); - if (!sConditionMgr->IsObjectMeetToConditions(player, conditions)) - continue; - - QuestStatus status = player->GetQuestStatus(questId); - if ((status == QUEST_STATUS_COMPLETE && !player->GetQuestRewardStatus(questId)) || - (quest->IsAutoComplete() && player->CanTakeQuest(quest, false))) - { - if (quest->IsAutoComplete() && quest->IsRepeatable() && !quest->IsDailyOrWeekly()) - result2 = DIALOG_STATUS_REWARD_REP; - else - result2 = DIALOG_STATUS_REWARD; - } + uint32 quest_id = i->second; + QuestStatus status = player->GetQuestStatus(quest_id); + if (status == QUEST_STATUS_COMPLETE) + qm.AddMenuItem(quest_id, 4); else if (status == QUEST_STATUS_INCOMPLETE) - result2 = DIALOG_STATUS_INCOMPLETE; - - if (result2 > result) - result = result2; + qm.AddMenuItem(quest_id, 4); + //else if (status == QUEST_STATUS_AVAILABLE) + // qm.AddMenuItem(quest_id, 2); } - for (QuestRelations::const_iterator i = qr.first; i != qr.second; ++i) + // xinef: add att/def doubles if this quest is spawned + std::vector questRelationVector; + for (QuestRelations::const_iterator i = objectQR.first; i != objectQR.second; ++i) { - QuestGiverStatus result2 = DIALOG_STATUS_NONE; uint32 questId = i->second; Quest const* quest = sObjectMgr->GetQuestTemplate(questId); if (!quest) continue; - ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_QUEST_AVAILABLE, quest->GetQuestId()); - if (!sConditionMgr->IsObjectMeetToConditions(player, conditions)) - continue; - switch (questId) { case QUEST_BONES_AND_ARROWS_ALLIANCE_ATT: if (!sPoolMgr->IsSpawnedObject(QUEST_BONES_AND_ARROWS_ALLIANCE_DEF)) continue; + questRelationVector.push_back(QUEST_BONES_AND_ARROWS_ALLIANCE_ATT); break; case QUEST_WARDING_THE_WARRIORS_ALLIANCE_ATT: if (!sPoolMgr->IsSpawnedObject(QUEST_WARDING_THE_WARRIORS_ALLIANCE_DEF)) continue; + questRelationVector.push_back(QUEST_WARDING_THE_WARRIORS_ALLIANCE_ATT); break; case QUEST_A_RARE_HERB_ALLIANCE_ATT: if (!sPoolMgr->IsSpawnedObject(QUEST_A_RARE_HERB_ALLIANCE_DEF)) continue; + questRelationVector.push_back(QUEST_A_RARE_HERB_ALLIANCE_ATT); break; case QUEST_FUELING_THE_DEMOLISHERS_ALLIANCE_ATT: if (!sPoolMgr->IsSpawnedObject(QUEST_FUELING_THE_DEMOLISHERS_ALLIANCE_DEF)) continue; + questRelationVector.push_back(QUEST_FUELING_THE_DEMOLISHERS_ALLIANCE_ATT); break; case QUEST_BONES_AND_ARROWS_HORDE_ATT: if (!sPoolMgr->IsSpawnedObject(QUEST_BONES_AND_ARROWS_HORDE_DEF)) continue; + questRelationVector.push_back(QUEST_BONES_AND_ARROWS_HORDE_ATT); break; case QUEST_JINXING_THE_WALLS_HORDE_ATT: if (!sPoolMgr->IsSpawnedObject(QUEST_WARDING_THE_WALLS_HORDE_DEF)) continue; + questRelationVector.push_back(QUEST_JINXING_THE_WALLS_HORDE_ATT); break; case QUEST_FUELING_THE_DEMOLISHERS_HORDE_ATT: if (!sPoolMgr->IsSpawnedObject(QUEST_FUELING_THE_DEMOLISHERS_HORDE_DEF)) continue; + questRelationVector.push_back(QUEST_FUELING_THE_DEMOLISHERS_HORDE_ATT); break; case QUEST_HEALING_WITH_ROSES_HORDE_ATT: if (!sPoolMgr->IsSpawnedObject(QUEST_HEALING_WITH_ROSES_HORDE_DEF)) continue; + questRelationVector.push_back(QUEST_HEALING_WITH_ROSES_HORDE_ATT); + break; + default: + questRelationVector.push_back(questId); break; } - - QuestStatus status = player->GetQuestStatus(questId); - if (status == QUEST_STATUS_NONE) - { - if (player->CanSeeStartQuest(quest)) - { - if (player->SatisfyQuestLevel(quest, false)) - { - if (quest->IsAutoComplete()) - result2 = DIALOG_STATUS_REWARD_REP; - else if (player->getLevel() <= (player->GetQuestLevel(quest) + sWorld->getIntConfig(CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF))) - { - if (quest->IsDaily()) - result2 = DIALOG_STATUS_AVAILABLE_REP; - else - result2 = DIALOG_STATUS_AVAILABLE; - } - else - result2 = DIALOG_STATUS_LOW_LEVEL_AVAILABLE; - } - else - result2 = DIALOG_STATUS_UNAVAILABLE; - } - } - - if (result2 > result) - result = result2; } - return result; + for (std::vector::const_iterator i = questRelationVector.begin(); i != questRelationVector.end(); ++i) + { + uint32 questId = *i; + Quest const* quest = sObjectMgr->GetQuestTemplate(questId); + switch (questId) + { + // Horde attacker + case QUEST_BONES_AND_ARROWS_HORDE_ATT: + case QUEST_JINXING_THE_WALLS_HORDE_ATT: + case QUEST_SLAY_THEM_ALL_HORDE_ATT: + case QUEST_FUELING_THE_DEMOLISHERS_HORDE_ATT: + case QUEST_HEALING_WITH_ROSES_HORDE_ATT: + case QUEST_DEFEND_THE_SIEGE_HORDE_ATT: + if (wintergrasp->GetAttackerTeam() == TEAM_HORDE) + { + QuestStatus status = player->GetQuestStatus(questId); + + if (quest->IsAutoComplete() && player->CanTakeQuest(quest, false)) + qm.AddMenuItem(questId, 4); + else if (status == QUEST_STATUS_NONE && player->CanTakeQuest(quest, false)) + qm.AddMenuItem(questId, 2); + } + break; + // Horde defender + case QUEST_BONES_AND_ARROWS_HORDE_DEF: + case QUEST_WARDING_THE_WALLS_HORDE_DEF: + case QUEST_SLAY_THEM_ALL_HORDE_DEF: + case QUEST_FUELING_THE_DEMOLISHERS_HORDE_DEF: + case QUEST_HEALING_WITH_ROSES_HORDE_DEF: + case QUEST_TOPPLING_THE_TOWERS_HORDE_DEF: + case QUEST_STOP_THE_SIEGE_HORDE_DEF: + if (wintergrasp->GetDefenderTeam() == TEAM_HORDE) + { + QuestStatus status = player->GetQuestStatus(questId); + + if (quest->IsAutoComplete() && player->CanTakeQuest(quest, false)) + qm.AddMenuItem(questId, 4); + else if (status == QUEST_STATUS_NONE && player->CanTakeQuest(quest, false)) + qm.AddMenuItem(questId, 2); + } + break; + // Alliance attacker + case QUEST_BONES_AND_ARROWS_ALLIANCE_ATT: + case QUEST_WARDING_THE_WARRIORS_ALLIANCE_ATT: + case QUEST_NO_MERCY_FOR_THE_MERCILESS_ALLIANCE_ATT: + case QUEST_DEFEND_THE_SIEGE_ALLIANCE_ATT: + case QUEST_A_RARE_HERB_ALLIANCE_ATT: + case QUEST_FUELING_THE_DEMOLISHERS_ALLIANCE_ATT: + if (wintergrasp->GetAttackerTeam() == TEAM_ALLIANCE) + { + QuestStatus status = player->GetQuestStatus(questId); + + if (quest->IsAutoComplete() && player->CanTakeQuest(quest, false)) + qm.AddMenuItem(questId, 4); + else if (status == QUEST_STATUS_NONE && player->CanTakeQuest(quest, false)) + qm.AddMenuItem(questId, 2); + } + break; + // Alliance defender + case QUEST_BONES_AND_ARROWS_ALLIANCE_DEF: + case QUEST_WARDING_THE_WARRIORS_ALLIANCE_DEF: + case QUEST_NO_MERCY_FOR_THE_MERCILESS_ALLIANCE_DEF: + case QUEST_SHOUTHERN_SABOTAGE_ALLIANCE_DEF: + case QUEST_STOP_THE_SIEGE_ALLIANCE_DEF: + case QUEST_A_RARE_HERB_ALLIANCE_DEF: + case QUEST_FUELING_THE_DEMOLISHERS_ALLIANCE_DEF: + if (wintergrasp->GetDefenderTeam() == TEAM_ALLIANCE) + { + QuestStatus status = player->GetQuestStatus(questId); + + if (quest->IsAutoComplete() && player->CanTakeQuest(quest, false)) + qm.AddMenuItem(questId, 4); + else if (status == QUEST_STATUS_NONE && player->CanTakeQuest(quest, false)) + qm.AddMenuItem(questId, 2); + } + break; + default: + QuestStatus status = player->GetQuestStatus(questId); + + if (quest->IsAutoComplete() && player->CanTakeQuest(quest, false)) + qm.AddMenuItem(questId, 4); + else if (status == QUEST_STATUS_NONE && player->CanTakeQuest(quest, false)) + qm.AddMenuItem(questId, 2); + break; + } + } } + SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + return true; + } + + uint32 GetDialogStatus(Player* player, Creature* creature) override + { + QuestRelationBounds qr = sObjectMgr->GetCreatureQuestRelationBounds(creature->GetEntry()); + QuestRelationBounds qir = sObjectMgr->GetCreatureQuestInvolvedRelationBounds(creature->GetEntry()); + QuestGiverStatus result = DIALOG_STATUS_NONE; + + for (QuestRelations::const_iterator i = qir.first; i != qir.second; ++i) + { + QuestGiverStatus result2 = DIALOG_STATUS_NONE; + uint32 questId = i->second; + Quest const* quest = sObjectMgr->GetQuestTemplate(questId); + if (!quest) + continue; + + ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_QUEST_AVAILABLE, quest->GetQuestId()); + if (!sConditionMgr->IsObjectMeetToConditions(player, conditions)) + continue; + + QuestStatus status = player->GetQuestStatus(questId); + if ((status == QUEST_STATUS_COMPLETE && !player->GetQuestRewardStatus(questId)) || + (quest->IsAutoComplete() && player->CanTakeQuest(quest, false))) + { + if (quest->IsAutoComplete() && quest->IsRepeatable() && !quest->IsDailyOrWeekly()) + result2 = DIALOG_STATUS_REWARD_REP; + else + result2 = DIALOG_STATUS_REWARD; + } + else if (status == QUEST_STATUS_INCOMPLETE) + result2 = DIALOG_STATUS_INCOMPLETE; + + if (result2 > result) + result = result2; + } + + for (QuestRelations::const_iterator i = qr.first; i != qr.second; ++i) + { + QuestGiverStatus result2 = DIALOG_STATUS_NONE; + uint32 questId = i->second; + Quest const* quest = sObjectMgr->GetQuestTemplate(questId); + if (!quest) + continue; + + ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_QUEST_AVAILABLE, quest->GetQuestId()); + if (!sConditionMgr->IsObjectMeetToConditions(player, conditions)) + continue; + + switch (questId) + { + case QUEST_BONES_AND_ARROWS_ALLIANCE_ATT: + if (!sPoolMgr->IsSpawnedObject(QUEST_BONES_AND_ARROWS_ALLIANCE_DEF)) + continue; + break; + case QUEST_WARDING_THE_WARRIORS_ALLIANCE_ATT: + if (!sPoolMgr->IsSpawnedObject(QUEST_WARDING_THE_WARRIORS_ALLIANCE_DEF)) + continue; + break; + case QUEST_A_RARE_HERB_ALLIANCE_ATT: + if (!sPoolMgr->IsSpawnedObject(QUEST_A_RARE_HERB_ALLIANCE_DEF)) + continue; + break; + case QUEST_FUELING_THE_DEMOLISHERS_ALLIANCE_ATT: + if (!sPoolMgr->IsSpawnedObject(QUEST_FUELING_THE_DEMOLISHERS_ALLIANCE_DEF)) + continue; + break; + case QUEST_BONES_AND_ARROWS_HORDE_ATT: + if (!sPoolMgr->IsSpawnedObject(QUEST_BONES_AND_ARROWS_HORDE_DEF)) + continue; + break; + case QUEST_JINXING_THE_WALLS_HORDE_ATT: + if (!sPoolMgr->IsSpawnedObject(QUEST_WARDING_THE_WALLS_HORDE_DEF)) + continue; + break; + case QUEST_FUELING_THE_DEMOLISHERS_HORDE_ATT: + if (!sPoolMgr->IsSpawnedObject(QUEST_FUELING_THE_DEMOLISHERS_HORDE_DEF)) + continue; + break; + case QUEST_HEALING_WITH_ROSES_HORDE_ATT: + if (!sPoolMgr->IsSpawnedObject(QUEST_HEALING_WITH_ROSES_HORDE_DEF)) + continue; + break; + } + + QuestStatus status = player->GetQuestStatus(questId); + if (status == QUEST_STATUS_NONE) + { + if (player->CanSeeStartQuest(quest)) + { + if (player->SatisfyQuestLevel(quest, false)) + { + if (quest->IsAutoComplete()) + result2 = DIALOG_STATUS_REWARD_REP; + else if (player->getLevel() <= (player->GetQuestLevel(quest) + sWorld->getIntConfig(CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF))) + { + if (quest->IsDaily()) + result2 = DIALOG_STATUS_AVAILABLE_REP; + else + result2 = DIALOG_STATUS_AVAILABLE; + } + else + result2 = DIALOG_STATUS_LOW_LEVEL_AVAILABLE; + } + else + result2 = DIALOG_STATUS_UNAVAILABLE; + } + } + + if (result2 > result) + result = result2; + } + + return result; + } }; class npc_wg_siege_machine : public CreatureScript { - public: - npc_wg_siege_machine() : CreatureScript("npc_wg_siege_machine") { } +public: + npc_wg_siege_machine() : CreatureScript("npc_wg_siege_machine") { } - struct npc_wg_siege_machineAI : public VehicleAI + struct npc_wg_siege_machineAI : public VehicleAI + { + npc_wg_siege_machineAI(Creature* creature) : VehicleAI(creature) { - npc_wg_siege_machineAI(Creature* creature) : VehicleAI(creature) + checkTimer = 0; + } + + uint32 checkTimer; + + bool CanControlVehicle(Unit* passenger) + { + if (passenger->HasAura(SPELL_LIEUTENANT)) + return true; + + if (me->GetEntry() == NPC_WINTERGRASP_CATAPULT && passenger->HasAura(SPELL_CORPORAL)) + return true; + + return false; + } + + void UpdateAI(uint32 diff) + { + VehicleAI::UpdateAI(diff); + + checkTimer += diff; + if (checkTimer >= 1000) { checkTimer = 0; + if (me->GetVehicleKit()) + for (SeatMap::iterator itr = me->GetVehicleKit()->Seats.begin(); itr != me->GetVehicleKit()->Seats.end(); ++itr) + if (const VehicleSeatEntry* seatInfo = itr->second.SeatInfo) + if (seatInfo->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL) + if (Unit* passenger = ObjectAccessor::GetUnit(*me, itr->second.Passenger.Guid)) + if (!CanControlVehicle(passenger)) + { + passenger->ExitVehicle(); + return; + } } - - uint32 checkTimer; - - bool CanControlVehicle(Unit* passenger) - { - if (passenger->HasAura(SPELL_LIEUTENANT)) - return true; - - if (me->GetEntry() == NPC_WINTERGRASP_CATAPULT && passenger->HasAura(SPELL_CORPORAL)) - return true; - - return false; - } - - void UpdateAI(uint32 diff) - { - VehicleAI::UpdateAI(diff); - - checkTimer += diff; - if (checkTimer >= 1000) - { - checkTimer = 0; - if (me->GetVehicleKit()) - for (SeatMap::iterator itr = me->GetVehicleKit()->Seats.begin(); itr != me->GetVehicleKit()->Seats.end(); ++itr) - if (const VehicleSeatEntry* seatInfo = itr->second.SeatInfo) - if (seatInfo->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL) - if (Unit* passenger = ObjectAccessor::GetUnit(*me, itr->second.Passenger.Guid)) - if (!CanControlVehicle(passenger)) - { - passenger->ExitVehicle(); - return; - } - } - } - }; - - CreatureAI *GetAI(Creature* creature) const - { - return new npc_wg_siege_machineAI(creature); } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_wg_siege_machineAI(creature); + } }; //////////////////////////////////////////////// @@ -743,56 +743,56 @@ class npc_wg_siege_machine : public CreatureScript class go_wg_vehicle_teleporter : public GameObjectScript { - public: - go_wg_vehicle_teleporter() : GameObjectScript("go_wg_vehicle_teleporter") { } +public: + go_wg_vehicle_teleporter() : GameObjectScript("go_wg_vehicle_teleporter") { } - struct go_wg_vehicle_teleporterAI : public GameObjectAI + struct go_wg_vehicle_teleporterAI : public GameObjectAI + { + go_wg_vehicle_teleporterAI(GameObject* gameObject) : GameObjectAI(gameObject), + _checkTimer(0) { - go_wg_vehicle_teleporterAI(GameObject* gameObject) : GameObjectAI(gameObject), - _checkTimer(0) - { - } - - bool IsFriendly(Unit* passenger) - { - return ((go->GetUInt32Value(GAMEOBJECT_FACTION) == WintergraspFaction[TEAM_HORDE] && passenger->getRaceMask() & RACEMASK_HORDE) || - (go->GetUInt32Value(GAMEOBJECT_FACTION) == WintergraspFaction[TEAM_ALLIANCE] && passenger->getRaceMask() & RACEMASK_ALLIANCE)); - } - - - Creature* IsValidVehicle(Creature* cVeh) - { - if (!cVeh->HasAura(SPELL_VEHICLE_TELEPORT)) - if (Vehicle* vehicle = cVeh->GetVehicleKit()) - if (Unit* passenger = vehicle->GetPassenger(0)) - if (IsFriendly(passenger)) - if (Creature* teleportTrigger = passenger->SummonTrigger(go->GetPositionX()-60.0f, go->GetPositionY(), go->GetPositionZ()+1.0f, cVeh->GetOrientation(), 1000)) - return teleportTrigger; - - return nullptr; - } - - void UpdateAI(uint32 diff) - { - _checkTimer += diff; - if (_checkTimer >= 1000) - { - for (uint8 i = 0; i < MAX_WINTERGRASP_VEHICLES; i++) - if (Creature* vehicleCreature = go->FindNearestCreature(vehiclesList[i], 3.0f, true)) - if (Creature* teleportTrigger = IsValidVehicle(vehicleCreature)) - teleportTrigger->CastSpell(vehicleCreature, SPELL_VEHICLE_TELEPORT, true); - - _checkTimer = 0; - } - } - private: - uint32 _checkTimer; - }; - - GameObjectAI* GetAI(GameObject* go) const - { - return new go_wg_vehicle_teleporterAI(go); } + + bool IsFriendly(Unit* passenger) + { + return ((go->GetUInt32Value(GAMEOBJECT_FACTION) == WintergraspFaction[TEAM_HORDE] && passenger->getRaceMask() & RACEMASK_HORDE) || + (go->GetUInt32Value(GAMEOBJECT_FACTION) == WintergraspFaction[TEAM_ALLIANCE] && passenger->getRaceMask() & RACEMASK_ALLIANCE)); + } + + + Creature* IsValidVehicle(Creature* cVeh) + { + if (!cVeh->HasAura(SPELL_VEHICLE_TELEPORT)) + if (Vehicle* vehicle = cVeh->GetVehicleKit()) + if (Unit* passenger = vehicle->GetPassenger(0)) + if (IsFriendly(passenger)) + if (Creature* teleportTrigger = passenger->SummonTrigger(go->GetPositionX() - 60.0f, go->GetPositionY(), go->GetPositionZ() + 1.0f, cVeh->GetOrientation(), 1000)) + return teleportTrigger; + + return nullptr; + } + + void UpdateAI(uint32 diff) + { + _checkTimer += diff; + if (_checkTimer >= 1000) + { + for (uint8 i = 0; i < MAX_WINTERGRASP_VEHICLES; i++) + if (Creature* vehicleCreature = go->FindNearestCreature(vehiclesList[i], 3.0f, true)) + if (Creature* teleportTrigger = IsValidVehicle(vehicleCreature)) + teleportTrigger->CastSpell(vehicleCreature, SPELL_VEHICLE_TELEPORT, true); + + _checkTimer = 0; + } + } + private: + uint32 _checkTimer; + }; + + GameObjectAI* GetAI(GameObject* go) const + { + return new go_wg_vehicle_teleporterAI(go); + } }; //////////////////////////////////////////////// @@ -801,239 +801,239 @@ class go_wg_vehicle_teleporter : public GameObjectScript class spell_wintergrasp_force_building : public SpellScriptLoader { - public: - spell_wintergrasp_force_building() : SpellScriptLoader("spell_wintergrasp_force_building") { } +public: + spell_wintergrasp_force_building() : SpellScriptLoader("spell_wintergrasp_force_building") { } - class spell_wintergrasp_force_building_SpellScript : public SpellScript + class spell_wintergrasp_force_building_SpellScript : public SpellScript + { + PrepareSpellScript(spell_wintergrasp_force_building_SpellScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareSpellScript(spell_wintergrasp_force_building_SpellScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_BUILD_CATAPULT_FORCE) + if (!sSpellMgr->GetSpellInfo(SPELL_BUILD_CATAPULT_FORCE) || !sSpellMgr->GetSpellInfo(SPELL_BUILD_DEMOLISHER_FORCE) || !sSpellMgr->GetSpellInfo(SPELL_BUILD_SIEGE_VEHICLE_FORCE_HORDE) || !sSpellMgr->GetSpellInfo(SPELL_BUILD_SIEGE_VEHICLE_FORCE_ALLIANCE)) - return false; - return true; - } - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - target->CastSpell(target, GetEffectValue(), false, nullptr, nullptr, target->GetGUID()); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_wintergrasp_force_building_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_wintergrasp_force_building_SpellScript(); + return false; + return true; } + + void HandleScript(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) + target->CastSpell(target, GetEffectValue(), false, nullptr, nullptr, target->GetGUID()); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_wintergrasp_force_building_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_wintergrasp_force_building_SpellScript(); + } }; class spell_wintergrasp_create_vehicle : public SpellScriptLoader { - public: - spell_wintergrasp_create_vehicle() : SpellScriptLoader("spell_wintergrasp_create_vehicle") { } +public: + spell_wintergrasp_create_vehicle() : SpellScriptLoader("spell_wintergrasp_create_vehicle") { } - class spell_wintergrasp_create_vehicle_SpellScript : public SpellScript + class spell_wintergrasp_create_vehicle_SpellScript : public SpellScript + { + PrepareSpellScript(spell_wintergrasp_create_vehicle_SpellScript); + + void HandleSummon(SpellEffIndex effIndex) { - PrepareSpellScript(spell_wintergrasp_create_vehicle_SpellScript); + PreventHitEffect(effIndex); - void HandleSummon(SpellEffIndex effIndex) + uint32 entry = GetSpellInfo()->Effects[effIndex].MiscValue; + SummonPropertiesEntry const* properties = sSummonPropertiesStore.LookupEntry(GetSpellInfo()->Effects[effIndex].MiscValueB); + int32 duration = GetSpellInfo()->GetDuration(); + if (!GetOriginalCaster() || !properties) + return; + + if (TempSummon* summon = GetCaster()->GetMap()->SummonCreature(entry, *GetHitDest(), properties, duration, GetOriginalCaster(), GetSpellInfo()->Id)) { - PreventHitEffect(effIndex); - - uint32 entry = GetSpellInfo()->Effects[effIndex].MiscValue; - SummonPropertiesEntry const* properties = sSummonPropertiesStore.LookupEntry(GetSpellInfo()->Effects[effIndex].MiscValueB); - int32 duration = GetSpellInfo()->GetDuration(); - if (!GetOriginalCaster() || !properties) - return; - - if (TempSummon* summon = GetCaster()->GetMap()->SummonCreature(entry, *GetHitDest(), properties, duration, GetOriginalCaster(), GetSpellInfo()->Id)) - { - summon->SetCreatorGUID(GetOriginalCaster()->GetGUID()); - summon->HandleSpellClick(GetCaster()); - } + summon->SetCreatorGUID(GetOriginalCaster()->GetGUID()); + summon->HandleSpellClick(GetCaster()); } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_wintergrasp_create_vehicle_SpellScript::HandleSummon, EFFECT_1, SPELL_EFFECT_SUMMON); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_wintergrasp_create_vehicle_SpellScript; } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_wintergrasp_create_vehicle_SpellScript::HandleSummon, EFFECT_1, SPELL_EFFECT_SUMMON); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_wintergrasp_create_vehicle_SpellScript; + } }; class spell_wintergrasp_rp_gg : public SpellScriptLoader { - public: - spell_wintergrasp_rp_gg() : SpellScriptLoader("spell_wintergrasp_rp_gg") { } +public: + spell_wintergrasp_rp_gg() : SpellScriptLoader("spell_wintergrasp_rp_gg") { } - class spell_wintergrasp_rp_gg_SpellScript : public SpellScript + class spell_wintergrasp_rp_gg_SpellScript : public SpellScript + { + PrepareSpellScript(spell_wintergrasp_rp_gg_SpellScript); + + bool handled; + bool Load() { - PrepareSpellScript(spell_wintergrasp_rp_gg_SpellScript); - - bool handled; - bool Load() - { - handled = false; - return true; - } - - void HandleFinish() - { - if (!GetExplTargetDest()) - return; - - GetCaster()->CastSpell(GetExplTargetDest()->GetPositionX(), GetExplTargetDest()->GetPositionY(), GetExplTargetDest()->GetPositionZ(), SPELL_RP_GG_TRIGGER_MISSILE, true); - } - - void Register() - { - AfterCast += SpellCastFn(spell_wintergrasp_rp_gg_SpellScript::HandleFinish); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_wintergrasp_rp_gg_SpellScript(); + handled = false; + return true; } + + void HandleFinish() + { + if (!GetExplTargetDest()) + return; + + GetCaster()->CastSpell(GetExplTargetDest()->GetPositionX(), GetExplTargetDest()->GetPositionY(), GetExplTargetDest()->GetPositionZ(), SPELL_RP_GG_TRIGGER_MISSILE, true); + } + + void Register() + { + AfterCast += SpellCastFn(spell_wintergrasp_rp_gg_SpellScript::HandleFinish); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_wintergrasp_rp_gg_SpellScript(); + } }; class spell_wintergrasp_portal : public SpellScriptLoader { - public: - spell_wintergrasp_portal() : SpellScriptLoader("spell_wintergrasp_portal") { } +public: + spell_wintergrasp_portal() : SpellScriptLoader("spell_wintergrasp_portal") { } - class spell_wintergrasp_portal_SpellScript : public SpellScript + class spell_wintergrasp_portal_SpellScript : public SpellScript + { + PrepareSpellScript(spell_wintergrasp_portal_SpellScript); + + void HandleScript(SpellEffIndex effIndex) { - PrepareSpellScript(spell_wintergrasp_portal_SpellScript); + PreventHitDefaultEffect(effIndex); + Player* target = GetHitPlayer(); + Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); + if (!wintergrasp || !target || target->getLevel() < 75 || (wintergrasp->GetDefenderTeam() != target->GetTeamId())) + return; - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - Player* target = GetHitPlayer(); - Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); - if (!wintergrasp || !target || target->getLevel() < 75 || (wintergrasp->GetDefenderTeam() != target->GetTeamId())) - return; - - target->CastSpell(target, SPELL_TELEPORT_TO_FORTRESS, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_wintergrasp_portal_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_wintergrasp_portal_SpellScript(); + target->CastSpell(target, SPELL_TELEPORT_TO_FORTRESS, true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_wintergrasp_portal_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_wintergrasp_portal_SpellScript(); + } }; class spell_wintergrasp_water : public SpellScriptLoader { - public: - spell_wintergrasp_water() : SpellScriptLoader("spell_wintergrasp_water") { } +public: + spell_wintergrasp_water() : SpellScriptLoader("spell_wintergrasp_water") { } - class spell_wintergrasp_water_SpellScript : public SpellScript + class spell_wintergrasp_water_SpellScript : public SpellScript + { + PrepareSpellScript(spell_wintergrasp_water_SpellScript); + + SpellCastResult CheckCast() { - PrepareSpellScript(spell_wintergrasp_water_SpellScript); + Unit* target = GetCaster(); + if (!target || !target->IsVehicle()) + return SPELL_FAILED_DONT_REPORT; - SpellCastResult CheckCast() - { - Unit* target = GetCaster(); - if (!target || !target->IsVehicle()) - return SPELL_FAILED_DONT_REPORT; - - return SPELL_CAST_OK; - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_wintergrasp_water_SpellScript::CheckCast); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_wintergrasp_water_SpellScript(); + return SPELL_CAST_OK; } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_wintergrasp_water_SpellScript::CheckCast); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_wintergrasp_water_SpellScript(); + } }; class spell_wintergrasp_hide_small_elementals : public SpellScriptLoader { - public: - spell_wintergrasp_hide_small_elementals() : SpellScriptLoader("spell_wintergrasp_hide_small_elementals") { } +public: + spell_wintergrasp_hide_small_elementals() : SpellScriptLoader("spell_wintergrasp_hide_small_elementals") { } - class spell_wintergrasp_hide_small_elementals_AuraScript : public AuraScript + class spell_wintergrasp_hide_small_elementals_AuraScript : public AuraScript + { + PrepareAuraScript(spell_wintergrasp_hide_small_elementals_AuraScript); + + void HandlePeriodicDummy(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_wintergrasp_hide_small_elementals_AuraScript); - - void HandlePeriodicDummy(AuraEffect const* /*aurEff*/) - { - Unit* target = GetTarget(); - Battlefield* Bf = sBattlefieldMgr->GetBattlefieldToZoneId(target->GetZoneId()); - bool enable = !Bf || !Bf->IsWarTime(); - target->SetPhaseMask(enable ? 1 : 512, true); - PreventDefaultAction(); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_wintergrasp_hide_small_elementals_AuraScript::HandlePeriodicDummy, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_wintergrasp_hide_small_elementals_AuraScript(); + Unit* target = GetTarget(); + Battlefield* Bf = sBattlefieldMgr->GetBattlefieldToZoneId(target->GetZoneId()); + bool enable = !Bf || !Bf->IsWarTime(); + target->SetPhaseMask(enable ? 1 : 512, true); + PreventDefaultAction(); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_wintergrasp_hide_small_elementals_AuraScript::HandlePeriodicDummy, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_wintergrasp_hide_small_elementals_AuraScript(); + } }; class spell_wg_reduce_damage_by_distance : public SpellScriptLoader { - public: - spell_wg_reduce_damage_by_distance() : SpellScriptLoader("spell_wg_reduce_damage_by_distance") { } +public: + spell_wg_reduce_damage_by_distance() : SpellScriptLoader("spell_wg_reduce_damage_by_distance") { } - class spell_wg_reduce_damage_by_distance_SpellScript : public SpellScript + class spell_wg_reduce_damage_by_distance_SpellScript : public SpellScript + { + PrepareSpellScript(spell_wg_reduce_damage_by_distance_SpellScript); + + void RecalculateDamage() { - PrepareSpellScript(spell_wg_reduce_damage_by_distance_SpellScript); + if (!GetExplTargetDest() || !GetHitUnit()) + return; - void RecalculateDamage() - { - if (!GetExplTargetDest() || !GetHitUnit()) - return; + float maxDistance = GetSpellInfo()->Effects[EFFECT_0].CalcRadius(GetCaster()); // Xinef: always stored in EFFECT_0 + float distance = std::min(GetHitUnit()->GetDistance(*GetExplTargetDest()), maxDistance); - float maxDistance = GetSpellInfo()->Effects[EFFECT_0].CalcRadius(GetCaster()); // Xinef: always stored in EFFECT_0 - float distance = std::min(GetHitUnit()->GetDistance(*GetExplTargetDest()), maxDistance); - - int32 damage = std::max(0, int32(GetHitDamage() - floor(GetHitDamage() * (distance / maxDistance)))); - SetHitDamage(damage); - } - - void Register() - { - OnHit += SpellHitFn(spell_wg_reduce_damage_by_distance_SpellScript::RecalculateDamage); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_wg_reduce_damage_by_distance_SpellScript(); + int32 damage = std::max(0, int32(GetHitDamage() - floor(GetHitDamage() * (distance / maxDistance)))); + SetHitDamage(damage); } + + void Register() + { + OnHit += SpellHitFn(spell_wg_reduce_damage_by_distance_SpellScript::RecalculateDamage); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_wg_reduce_damage_by_distance_SpellScript(); + } }; @@ -1077,8 +1077,8 @@ public: if (Unit* vehicle = source->GetVehicleBase()) if (vehicle->GetEntry() == NPC_WINTERGRASP_SIEGE_ENGINE_ALLIANCE || vehicle->GetEntry() == NPC_WINTERGRASP_SIEGE_ENGINE_HORDE || - vehicle->GetEntry() == NPC_WINTERGRASP_CATAPULT || vehicle->GetEntry() == NPC_WINTERGRASP_DEMOLISHER || - vehicle->GetEntry() == NPC_WINTERGRASP_TOWER_CANNON) + vehicle->GetEntry() == NPC_WINTERGRASP_CATAPULT || vehicle->GetEntry() == NPC_WINTERGRASP_DEMOLISHER || + vehicle->GetEntry() == NPC_WINTERGRASP_TOWER_CANNON) return true; return false; diff --git a/src/server/scripts/Northrend/zone_zuldrak.cpp b/src/server/scripts/Northrend/zone_zuldrak.cpp index 7f5d8af04..8ed3bc04f 100644 --- a/src/server/scripts/Northrend/zone_zuldrak.cpp +++ b/src/server/scripts/Northrend/zone_zuldrak.cpp @@ -25,10 +25,11 @@ enum AlchemistItemRequirements const uint32 AA_ITEM_ENTRY[24] = {38336, 39669, 38342, 38340, 38344, 38369, 38396, 38398, 38338, 38386, 38341, 38384, 38397, 38381, 38337, 38393, 38339, 39668, 39670, 38346, 38379, 38345, 38343, 38370}; const uint32 AA_AURA_ID[24] = {51095, 53153, 51100, 51087, 51091, 51081, 51072, 51079, 51018, 51067, 51055, 51064, 51077, 51062, 51057, 51069, 51059, 53150, 53158, 51093, 51097, 51102, 51083, 51085}; const char* AA_ITEM_NAME[24] = {"Crystallized Hogsnot", "Ghoul Drool", "Trollbane", "Amberseed", "Shrunken Dragon's Claw", -"Wasp's Wings", "Hairy Herring Head", "Icecrown Bottled Water", "Knotroot", "Muddy Mire Maggot", "Pickled Eagle Egg", -"Pulverized Gargoyle Teeth", "Putrid Pirate Perspiration", "Seasoned Slider Cider", "Speckled Guano", "Spiky Spider Egg", -"Withered Batwing", "Abomination Guts", "Blight Crystal", "Chilled Serpent Mucus", "Crushed Basilisk Crystals", -"Frozen Spider Ichor", "Prismatic Mojo", "Raptor Claw"}; + "Wasp's Wings", "Hairy Herring Head", "Icecrown Bottled Water", "Knotroot", "Muddy Mire Maggot", "Pickled Eagle Egg", + "Pulverized Gargoyle Teeth", "Putrid Pirate Perspiration", "Seasoned Slider Cider", "Speckled Guano", "Spiky Spider Egg", + "Withered Batwing", "Abomination Guts", "Blight Crystal", "Chilled Serpent Mucus", "Crushed Basilisk Crystals", + "Frozen Spider Ichor", "Prismatic Mojo", "Raptor Claw" + }; class npc_finklestein : public CreatureScript @@ -36,174 +37,174 @@ class npc_finklestein : public CreatureScript public: npc_finklestein() : CreatureScript("npc_finklestein") { } - struct npc_finklesteinAI : public ScriptedAI + struct npc_finklesteinAI : public ScriptedAI + { + npc_finklesteinAI(Creature* creature) : ScriptedAI(creature) {} + + std::map questList; + + void ClearPlayerOnTask(uint64 guid) { - npc_finklesteinAI(Creature* creature) : ScriptedAI(creature) {} + std::map::iterator itr = questList.find(guid); + if (itr != questList.end()) + questList.erase(itr); + } - std::map questList; + bool IsPlayerOnTask(uint64 guid) + { + std::map::const_iterator itr = questList.find(guid); + return itr != questList.end(); + } - void ClearPlayerOnTask(uint64 guid) + void RightClickCauldron(uint64 guid) + { + if (questList.empty()) + return; + + std::map::iterator itr = questList.find(guid); + if (itr == questList.end()) + return; + + Player* player = ObjectAccessor::GetPlayer(*me, guid); + if (player) { - std::map::iterator itr = questList.find(guid); - if (itr != questList.end()) - questList.erase(itr); - } + uint32 itemCode = itr->second; - bool IsPlayerOnTask(uint64 guid) - { - std::map::const_iterator itr = questList.find(guid); - return itr != questList.end(); - } - - void RightClickCauldron(uint64 guid) - { - if (questList.empty()) - return; - - std::map::iterator itr = questList.find(guid); - if (itr == questList.end()) - return; - - Player* player = ObjectAccessor::GetPlayer(*me, guid); - if (player) + uint32 itemEntry = GetTaskItemEntry(itemCode); + uint32 auraId = GetTaskAura(itemCode); + uint32 counter = GetTaskCounter(itemCode); + if (player->HasAura(auraId)) { - uint32 itemCode = itr->second; + // player still has aura, but no item. Skip + if (!player->HasItemCount(itemEntry)) + return; - uint32 itemEntry = GetTaskItemEntry(itemCode); - uint32 auraId = GetTaskAura(itemCode); - uint32 counter = GetTaskCounter(itemCode); - if (player->HasAura(auraId)) + // if we are here, all is ok (aura and item present) + player->DestroyItemCount(itemEntry, 1, true); + player->RemoveAurasDueToSpell(auraId); + + if (counter < 6) { - // player still has aura, but no item. Skip - if (!player->HasItemCount(itemEntry)) - return; - - // if we are here, all is ok (aura and item present) - player->DestroyItemCount(itemEntry, 1, true); - player->RemoveAurasDueToSpell(auraId); - - if (counter < 6) - { - StartNextTask(player->GetGUID(), counter+1); - return; - } - else - player->KilledMonsterCredit(28248, 0); + StartNextTask(player->GetGUID(), counter + 1); + return; } else - { - // if we are here, it means we failed :( - player->SetQuestStatus(QUEST_ALCHEMIST_APPRENTICE, QUEST_STATUS_FAILED); - } + player->KilledMonsterCredit(28248, 0); } - questList.erase(itr); - } - - // Generate a Task and announce it to the player - void StartNextTask(uint64 playerGUID, uint32 counter) - { - if (counter > 6) - return; - - Player* player = ObjectAccessor::GetPlayer(*me, playerGUID); - if (!player) - return; - - // Generate Item Code - uint32 itemCode = SelectRandomCode(counter); - questList[playerGUID] = itemCode; - - // Decode Item Entry, Get Item Name, Generate Emotes - //uint32 itemEntry = GetTaskItemEntry(itemCode); - uint32 auraId = GetTaskAura(itemCode); - const char* itemName = GetTaskItemName(itemCode); - - switch (counter) + else { - case 1: - me->MonsterTextEmote("Quickly, get me some...", player, true); - me->MonsterTextEmote(itemName, player, true); - me->CastSpell(player, auraId, true); - break; - case 2: - me->MonsterTextEmote("Find me some...", player, true); - me->MonsterTextEmote(itemName, player, true); - me->CastSpell(player, auraId, true); - break; - case 3: - me->MonsterTextEmote("I think it needs...", player, true); - me->MonsterTextEmote(itemName, player, true); - me->CastSpell(player, auraId, true); - break; - case 4: - me->MonsterTextEmote("Alright, now fetch me some...", player, true); - me->MonsterTextEmote(itemName, player, true); - me->CastSpell(player, auraId, true); - break; - case 5: - me->MonsterTextEmote("Before it thickens, we must add...", player, true); - me->MonsterTextEmote(itemName, player, true); - me->CastSpell(player, auraId, true); - break; - case 6: - me->MonsterTextEmote("It's thickening! Quickly get me some...", player, true); - me->MonsterTextEmote(itemName, player, true); - me->CastSpell(player, auraId, true); - break; + // if we are here, it means we failed :( + player->SetQuestStatus(QUEST_ALCHEMIST_APPRENTICE, QUEST_STATUS_FAILED); } } - - uint32 SelectRandomCode(uint32 counter) { return (counter * 100 + urand(0,23)); } - - uint32 GetTaskCounter(uint32 itemcode) { return itemcode / 100; } - uint32 GetTaskAura(uint32 itemcode) { return AA_AURA_ID[itemcode % 100]; } - uint32 GetTaskItemEntry(uint32 itemcode) { return AA_ITEM_ENTRY[itemcode % 100]; } - const char* GetTaskItemName(uint32 itemcode) { return AA_ITEM_NAME[itemcode % 100]; } - - }; - - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_ALCHEMIST_APPRENTICE) - if (creature->AI() && CAST_AI(npc_finklestein::npc_finklesteinAI, creature->AI())) - CAST_AI(npc_finklestein::npc_finklesteinAI, creature->AI())->ClearPlayerOnTask(player->GetGUID()); - - return true; + questList.erase(itr); } - bool OnGossipHello(Player* player, Creature* creature) override + // Generate a Task and announce it to the player + void StartNextTask(uint64 playerGUID, uint32 counter) { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + if (counter > 6) + return; + + Player* player = ObjectAccessor::GetPlayer(*me, playerGUID); + if (!player) + return; + + // Generate Item Code + uint32 itemCode = SelectRandomCode(counter); + questList[playerGUID] = itemCode; + + // Decode Item Entry, Get Item Name, Generate Emotes + //uint32 itemEntry = GetTaskItemEntry(itemCode); + uint32 auraId = GetTaskAura(itemCode); + const char* itemName = GetTaskItemName(itemCode); + + switch (counter) + { + case 1: + me->MonsterTextEmote("Quickly, get me some...", player, true); + me->MonsterTextEmote(itemName, player, true); + me->CastSpell(player, auraId, true); + break; + case 2: + me->MonsterTextEmote("Find me some...", player, true); + me->MonsterTextEmote(itemName, player, true); + me->CastSpell(player, auraId, true); + break; + case 3: + me->MonsterTextEmote("I think it needs...", player, true); + me->MonsterTextEmote(itemName, player, true); + me->CastSpell(player, auraId, true); + break; + case 4: + me->MonsterTextEmote("Alright, now fetch me some...", player, true); + me->MonsterTextEmote(itemName, player, true); + me->CastSpell(player, auraId, true); + break; + case 5: + me->MonsterTextEmote("Before it thickens, we must add...", player, true); + me->MonsterTextEmote(itemName, player, true); + me->CastSpell(player, auraId, true); + break; + case 6: + me->MonsterTextEmote("It's thickening! Quickly get me some...", player, true); + me->MonsterTextEmote(itemName, player, true); + me->CastSpell(player, auraId, true); + break; + } + } + + uint32 SelectRandomCode(uint32 counter) { return (counter * 100 + urand(0, 23)); } + + uint32 GetTaskCounter(uint32 itemcode) { return itemcode / 100; } + uint32 GetTaskAura(uint32 itemcode) { return AA_AURA_ID[itemcode % 100]; } + uint32 GetTaskItemEntry(uint32 itemcode) { return AA_ITEM_ENTRY[itemcode % 100]; } + const char* GetTaskItemName(uint32 itemcode) { return AA_ITEM_NAME[itemcode % 100]; } + + }; + + bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_ALCHEMIST_APPRENTICE) + if (creature->AI() && CAST_AI(npc_finklestein::npc_finklesteinAI, creature->AI())) + CAST_AI(npc_finklestein::npc_finklesteinAI, creature->AI())->ClearPlayerOnTask(player->GetGUID()); + + return true; + } + + bool OnGossipHello(Player* player, Creature* creature) override + { + if (creature->IsQuestGiver()) + player->PrepareQuestMenu(creature->GetGUID()); + + SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + + if (player->GetQuestStatus(QUEST_ALCHEMIST_APPRENTICE) == QUEST_STATUS_INCOMPLETE) + { + if (creature->AI() && CAST_AI(npc_finklestein::npc_finklesteinAI, creature->AI())) + if (!CAST_AI(npc_finklestein::npc_finklesteinAI, creature->AI())->IsPlayerOnTask(player->GetGUID())) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, "I'm ready to begin. What is the first ingredient you require?", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - - if (player->GetQuestStatus(QUEST_ALCHEMIST_APPRENTICE) == QUEST_STATUS_INCOMPLETE) - { - if (creature->AI() && CAST_AI(npc_finklestein::npc_finklesteinAI, creature->AI())) - if (!CAST_AI(npc_finklestein::npc_finklesteinAI, creature->AI())->IsPlayerOnTask(player->GetGUID())) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, "I'm ready to begin. What is the first ingredient you require?", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - } - - return true; } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) override + return true; + } + + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) override + { + CloseGossipMenuFor(player); + if (uiAction == GOSSIP_ACTION_INFO_DEF + 1) { CloseGossipMenuFor(player); - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) - { - CloseGossipMenuFor(player); - if (creature->AI() && CAST_AI(npc_finklestein::npc_finklesteinAI, creature->AI())) - CAST_AI(npc_finklestein::npc_finklesteinAI, creature->AI())->StartNextTask(player->GetGUID(), 1); - } - - return true; + if (creature->AI() && CAST_AI(npc_finklestein::npc_finklesteinAI, creature->AI())) + CAST_AI(npc_finklestein::npc_finklesteinAI, creature->AI())->StartNextTask(player->GetGUID(), 1); } - CreatureAI *GetAI(Creature* creature) const override + return true; + } + + CreatureAI* GetAI(Creature* creature) const override { return new npc_finklesteinAI(creature); } @@ -259,7 +260,7 @@ public: { ghoul->SetReactState(REACT_DEFENSIVE); float o = me->GetAngle(ghoul); - ghoul->GetMotionMaster()->MovePoint(1, me->GetPositionX()+2*cos(o), me->GetPositionY()+2*sin(o), me->GetPositionZ()); + ghoul->GetMotionMaster()->MovePoint(1, me->GetPositionX() + 2 * cos(o), me->GetPositionY() + 2 * sin(o), me->GetPositionZ()); checkTimer = 1; findTimer = 0; } @@ -443,7 +444,7 @@ public: me->SetFacingToObject(cr); lichGUID = cr->GetGUID(); float o = me->GetAngle(cr); - cr->GetMotionMaster()->MovePoint(0, me->GetPositionX()+cos(o)*6.0f, me->GetPositionY()+sin(o)*6.0f, me->GetPositionZ()); + cr->GetMotionMaster()->MovePoint(0, me->GetPositionX() + cos(o) * 6.0f, me->GetPositionY() + sin(o) * 6.0f, me->GetPositionZ()); } } @@ -583,7 +584,7 @@ public: } - if (me->getFaction() == 35 || me->HasUnitState(UNIT_STATE_CASTING|UNIT_STATE_STUNNED)) + if (me->getFaction() == 35 || me->HasUnitState(UNIT_STATE_CASTING | UNIT_STATE_STUNNED)) return; if (!UpdateVictim()) @@ -697,9 +698,9 @@ public: } } - private: - uint64 _rageclawGUID; - uint32 timer; + private: + uint64 _rageclawGUID; + uint32 timer; }; CreatureAI* GetAI(Creature* creature) const @@ -861,7 +862,7 @@ public: me->SetFacingToObject(player); } - private: + private: EventMap _events; float _heading; // Store creature heading }; @@ -943,10 +944,10 @@ public: if (Vehicle* veh = caster->GetVehicleKit()) if (veh->GetAvailableSeatCount() != 0) - { - me->CastSpell(caster, RIDE_VEHICLE, true); - me->CastSpell(caster, HEALING_WINDS, true); - } + { + me->CastSpell(caster, RIDE_VEHICLE, true); + me->CastSpell(caster, HEALING_WINDS, true); + } } }; diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPEP.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPEP.cpp index c6bee17da..16c62a93f 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPEP.cpp +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPEP.cpp @@ -19,7 +19,7 @@ #include "GameGraveyard.h" OPvPCapturePointEP_EWT::OPvPCapturePointEP_EWT(OutdoorPvP* pvp) -: OPvPCapturePoint(pvp), m_TowerState(EP_TS_N), m_UnitsSummonedSideId(TEAM_NEUTRAL) + : OPvPCapturePoint(pvp), m_TowerState(EP_TS_N), m_UnitsSummonedSideId(TEAM_NEUTRAL) { SetCapturePointData(EPCapturePoints[EP_EWT].entry, EPCapturePoints[EP_EWT].map, EPCapturePoints[EP_EWT].x, EPCapturePoints[EP_EWT].y, EPCapturePoints[EP_EWT].z, EPCapturePoints[EP_EWT].o, EPCapturePoints[EP_EWT].rot0, EPCapturePoints[EP_EWT].rot1, EPCapturePoints[EP_EWT].rot2, EPCapturePoints[EP_EWT].rot3); AddObject(EP_EWT_FLAGS, EPTowerFlags[EP_EWT].entry, EPTowerFlags[EP_EWT].map, EPTowerFlags[EP_EWT].x, EPTowerFlags[EP_EWT].y, EPTowerFlags[EP_EWT].z, EPTowerFlags[EP_EWT].o, EPTowerFlags[EP_EWT].rot0, EPTowerFlags[EP_EWT].rot1, EPTowerFlags[EP_EWT].rot2, EPTowerFlags[EP_EWT].rot3); @@ -99,7 +99,7 @@ void OPvPCapturePointEP_EWT::SendChangePhase() SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_neutralValuePct); } -void OPvPCapturePointEP_EWT::FillInitialWorldStates(WorldPacket &data) +void OPvPCapturePointEP_EWT::FillInitialWorldStates(WorldPacket& data) { data << EP_EWT_A << uint32(bool(m_TowerState & EP_TS_A)); data << EP_EWT_H << uint32(bool(m_TowerState & EP_TS_H)); @@ -141,11 +141,11 @@ void OPvPCapturePointEP_EWT::SummonSupportUnitAtNorthpassTower(TeamId teamId) if (m_UnitsSummonedSideId != teamId) { m_UnitsSummonedSideId = teamId; - const creature_type * ct = nullptr; + const creature_type* ct = nullptr; if (teamId == TEAM_ALLIANCE) - ct=EP_EWT_Summons_A; + ct = EP_EWT_Summons_A; else - ct=EP_EWT_Summons_H; + ct = EP_EWT_Summons_H; for (uint8 i = 0; i < EP_EWT_NUM_CREATURES; ++i) { @@ -157,7 +157,7 @@ void OPvPCapturePointEP_EWT::SummonSupportUnitAtNorthpassTower(TeamId teamId) // NPT OPvPCapturePointEP_NPT::OPvPCapturePointEP_NPT(OutdoorPvP* pvp) -: OPvPCapturePoint(pvp), m_TowerState(EP_TS_N), m_SummonedGOSideId(TEAM_NEUTRAL) + : OPvPCapturePoint(pvp), m_TowerState(EP_TS_N), m_SummonedGOSideId(TEAM_NEUTRAL) { SetCapturePointData(EPCapturePoints[EP_NPT].entry, EPCapturePoints[EP_NPT].map, EPCapturePoints[EP_NPT].x, EPCapturePoints[EP_NPT].y, EPCapturePoints[EP_NPT].z, EPCapturePoints[EP_NPT].o, EPCapturePoints[EP_NPT].rot0, EPCapturePoints[EP_NPT].rot1, EPCapturePoints[EP_NPT].rot2, EPCapturePoints[EP_NPT].rot3); AddObject(EP_NPT_FLAGS, EPTowerFlags[EP_NPT].entry, EPTowerFlags[EP_NPT].map, EPTowerFlags[EP_NPT].x, EPTowerFlags[EP_NPT].y, EPTowerFlags[EP_NPT].z, EPTowerFlags[EP_NPT].o, EPTowerFlags[EP_NPT].rot0, EPTowerFlags[EP_NPT].rot1, EPTowerFlags[EP_NPT].rot2, EPTowerFlags[EP_NPT].rot3); @@ -247,7 +247,7 @@ void OPvPCapturePointEP_NPT::SendChangePhase() SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_neutralValuePct); } -void OPvPCapturePointEP_NPT::FillInitialWorldStates(WorldPacket &data) +void OPvPCapturePointEP_NPT::FillInitialWorldStates(WorldPacket& data) { data << EP_NPT_A << uint32(bool(m_TowerState & EP_TS_A)); data << EP_NPT_H << uint32(bool(m_TowerState & EP_TS_H)); @@ -299,7 +299,7 @@ void OPvPCapturePointEP_NPT::SummonGO(TeamId teamId) // CGT OPvPCapturePointEP_CGT::OPvPCapturePointEP_CGT(OutdoorPvP* pvp) -: OPvPCapturePoint(pvp), m_TowerState(EP_TS_N), m_GraveyardSide(TEAM_NEUTRAL) + : OPvPCapturePoint(pvp), m_TowerState(EP_TS_N), m_GraveyardSide(TEAM_NEUTRAL) { SetCapturePointData(EPCapturePoints[EP_CGT].entry, EPCapturePoints[EP_CGT].map, EPCapturePoints[EP_CGT].x, EPCapturePoints[EP_CGT].y, EPCapturePoints[EP_CGT].z, EPCapturePoints[EP_CGT].o, EPCapturePoints[EP_CGT].rot0, EPCapturePoints[EP_CGT].rot1, EPCapturePoints[EP_CGT].rot2, EPCapturePoints[EP_CGT].rot3); AddObject(EP_CGT_FLAGS, EPTowerFlags[EP_CGT].entry, EPTowerFlags[EP_CGT].map, EPTowerFlags[EP_CGT].x, EPTowerFlags[EP_CGT].y, EPTowerFlags[EP_CGT].z, EPTowerFlags[EP_CGT].o, EPTowerFlags[EP_CGT].rot0, EPTowerFlags[EP_CGT].rot1, EPTowerFlags[EP_CGT].rot2, EPTowerFlags[EP_CGT].rot3); @@ -379,7 +379,7 @@ void OPvPCapturePointEP_CGT::SendChangePhase() SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_neutralValuePct); } -void OPvPCapturePointEP_CGT::FillInitialWorldStates(WorldPacket &data) +void OPvPCapturePointEP_CGT::FillInitialWorldStates(WorldPacket& data) { data << EP_CGT_A << uint32(bool(m_TowerState & EP_TS_A)); data << EP_CGT_H << uint32(bool(m_TowerState & EP_TS_H)); @@ -428,7 +428,7 @@ void OPvPCapturePointEP_CGT::LinkGraveyard(TeamId teamId) // PWT OPvPCapturePointEP_PWT::OPvPCapturePointEP_PWT(OutdoorPvP* pvp) -: OPvPCapturePoint(pvp), m_FlightMasterSpawnedId(TEAM_NEUTRAL), m_TowerState(EP_TS_N) + : OPvPCapturePoint(pvp), m_FlightMasterSpawnedId(TEAM_NEUTRAL), m_TowerState(EP_TS_N) { SetCapturePointData(EPCapturePoints[EP_PWT].entry, EPCapturePoints[EP_PWT].map, EPCapturePoints[EP_PWT].x, EPCapturePoints[EP_PWT].y, EPCapturePoints[EP_PWT].z, EPCapturePoints[EP_PWT].o, EPCapturePoints[EP_PWT].rot0, EPCapturePoints[EP_PWT].rot1, EPCapturePoints[EP_PWT].rot2, EPCapturePoints[EP_PWT].rot3); AddObject(EP_PWT_FLAGS, EPTowerFlags[EP_PWT].entry, EPTowerFlags[EP_PWT].map, EPTowerFlags[EP_PWT].x, EPTowerFlags[EP_PWT].y, EPTowerFlags[EP_PWT].z, EPTowerFlags[EP_PWT].o, EPTowerFlags[EP_PWT].rot0, EPTowerFlags[EP_PWT].rot1, EPTowerFlags[EP_PWT].rot2, EPTowerFlags[EP_PWT].rot3); @@ -518,7 +518,7 @@ void OPvPCapturePointEP_PWT::SendChangePhase() SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_neutralValuePct); } -void OPvPCapturePointEP_PWT::FillInitialWorldStates(WorldPacket &data) +void OPvPCapturePointEP_PWT::FillInitialWorldStates(WorldPacket& data) { data << EP_PWT_A << uint32(bool(m_TowerState & EP_TS_A)); data << EP_PWT_H << uint32(bool(m_TowerState & EP_TS_H)); @@ -653,12 +653,12 @@ void OutdoorPvPEP::HandlePlayerEnterZone(Player* player, uint32 zone) if (player->GetTeamId() == TEAM_ALLIANCE) { if (m_AllianceTowersControlled && m_AllianceTowersControlled < 5) - player->CastSpell(player, EP_AllianceBuffs[m_AllianceTowersControlled-1], true); + player->CastSpell(player, EP_AllianceBuffs[m_AllianceTowersControlled - 1], true); } else { if (m_HordeTowersControlled && m_HordeTowersControlled < 5) - player->CastSpell(player, EP_HordeBuffs[m_HordeTowersControlled-1], true); + player->CastSpell(player, EP_HordeBuffs[m_HordeTowersControlled - 1], true); } OutdoorPvP::HandlePlayerEnterZone(player, zone); } @@ -688,7 +688,7 @@ void OutdoorPvPEP::BuffTeams() for (int i = 0; i < 4; ++i) player->RemoveAurasDueToSpell(EP_AllianceBuffs[i]); if (m_AllianceTowersControlled && m_AllianceTowersControlled < 5) - player->CastSpell(player, EP_AllianceBuffs[m_AllianceTowersControlled-1], true); + player->CastSpell(player, EP_AllianceBuffs[m_AllianceTowersControlled - 1], true); } } for (PlayerSet::iterator itr = m_players[1].begin(); itr != m_players[1].end(); ++itr) @@ -698,7 +698,7 @@ void OutdoorPvPEP::BuffTeams() for (int i = 0; i < 4; ++i) player->RemoveAurasDueToSpell(EP_HordeBuffs[i]); if (m_HordeTowersControlled && m_HordeTowersControlled < 5) - player->CastSpell(player, EP_HordeBuffs[m_HordeTowersControlled-1], true); + player->CastSpell(player, EP_HordeBuffs[m_HordeTowersControlled - 1], true); } } } @@ -708,7 +708,7 @@ void OutdoorPvPEP::SetControlledState(uint32 index, TeamId teamId) EP_ControlsId[index] = teamId; } -void OutdoorPvPEP::FillInitialWorldStates(WorldPacket & data) +void OutdoorPvPEP::FillInitialWorldStates(WorldPacket& data) { data << EP_UI_TOWER_COUNT_A << m_AllianceTowersControlled; data << EP_UI_TOWER_COUNT_H << m_HordeTowersControlled; @@ -756,17 +756,17 @@ void OutdoorPvPEP::SendRemoveWorldStates(Player* player) class OutdoorPvP_eastern_plaguelands : public OutdoorPvPScript { - public: +public: - OutdoorPvP_eastern_plaguelands() - : OutdoorPvPScript("outdoorpvp_ep") - { - } + OutdoorPvP_eastern_plaguelands() + : OutdoorPvPScript("outdoorpvp_ep") + { + } - OutdoorPvP* GetOutdoorPvP() const - { - return new OutdoorPvPEP(); - } + OutdoorPvP* GetOutdoorPvP() const + { + return new OutdoorPvPEP(); + } }; void AddSC_outdoorpvp_ep() diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPEP.h b/src/server/scripts/OutdoorPvP/OutdoorPvPEP.h index 1ee8cdbbb..717015907 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPEP.h +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPEP.h @@ -173,148 +173,148 @@ class OutdoorPvPEP; class OPvPCapturePointEP_EWT : public OPvPCapturePoint { - public: +public: - OPvPCapturePointEP_EWT(OutdoorPvP* pvp); + OPvPCapturePointEP_EWT(OutdoorPvP* pvp); - void ChangeState(); + void ChangeState(); - void SendChangePhase(); + void SendChangePhase(); - void FillInitialWorldStates(WorldPacket & data); + void FillInitialWorldStates(WorldPacket& data); - // used when player is activated/inactivated in the area - bool HandlePlayerEnter(Player* player); - void HandlePlayerLeave(Player* player); + // used when player is activated/inactivated in the area + bool HandlePlayerEnter(Player* player); + void HandlePlayerLeave(Player* player); - protected: +protected: - void SummonSupportUnitAtNorthpassTower(TeamId teamId); + void SummonSupportUnitAtNorthpassTower(TeamId teamId); - void UpdateTowerState(); + void UpdateTowerState(); - protected: +protected: - uint32 m_TowerState; + uint32 m_TowerState; - TeamId m_UnitsSummonedSideId; + TeamId m_UnitsSummonedSideId; }; class OPvPCapturePointEP_NPT : public OPvPCapturePoint { - public: +public: - OPvPCapturePointEP_NPT(OutdoorPvP* pvp); + OPvPCapturePointEP_NPT(OutdoorPvP* pvp); - void ChangeState(); + void ChangeState(); - void SendChangePhase(); + void SendChangePhase(); - void FillInitialWorldStates(WorldPacket & data); + void FillInitialWorldStates(WorldPacket& data); - // used when player is activated/inactivated in the area - bool HandlePlayerEnter(Player* player); - void HandlePlayerLeave(Player* player); + // used when player is activated/inactivated in the area + bool HandlePlayerEnter(Player* player); + void HandlePlayerLeave(Player* player); - protected: +protected: - void SummonGO(TeamId teamId); + void SummonGO(TeamId teamId); - void UpdateTowerState(); + void UpdateTowerState(); - protected: +protected: - uint32 m_TowerState; + uint32 m_TowerState; - TeamId m_SummonedGOSideId; + TeamId m_SummonedGOSideId; }; class OPvPCapturePointEP_CGT : public OPvPCapturePoint { - public: +public: - OPvPCapturePointEP_CGT(OutdoorPvP* pvp); + OPvPCapturePointEP_CGT(OutdoorPvP* pvp); - void ChangeState(); + void ChangeState(); - void SendChangePhase(); + void SendChangePhase(); - void FillInitialWorldStates(WorldPacket & data); + void FillInitialWorldStates(WorldPacket& data); - // used when player is activated/inactivated in the area - bool HandlePlayerEnter(Player* player); - void HandlePlayerLeave(Player* player); + // used when player is activated/inactivated in the area + bool HandlePlayerEnter(Player* player); + void HandlePlayerLeave(Player* player); - protected: +protected: - void LinkGraveyard(TeamId teamId); + void LinkGraveyard(TeamId teamId); - void UpdateTowerState(); + void UpdateTowerState(); - protected: +protected: - uint32 m_TowerState; + uint32 m_TowerState; - TeamId m_GraveyardSide; + TeamId m_GraveyardSide; }; class OPvPCapturePointEP_PWT : public OPvPCapturePoint { - public: +public: - OPvPCapturePointEP_PWT(OutdoorPvP* pvp); + OPvPCapturePointEP_PWT(OutdoorPvP* pvp); - void ChangeState(); + void ChangeState(); - void SendChangePhase(); + void SendChangePhase(); - void FillInitialWorldStates(WorldPacket & data); + void FillInitialWorldStates(WorldPacket& data); - // used when player is activated/inactivated in the area - bool HandlePlayerEnter(Player* player); - void HandlePlayerLeave(Player* player); + // used when player is activated/inactivated in the area + bool HandlePlayerEnter(Player* player); + void HandlePlayerLeave(Player* player); - protected: +protected: - void SummonFlightMaster(TeamId teamId); + void SummonFlightMaster(TeamId teamId); - void UpdateTowerState(); + void UpdateTowerState(); - protected: +protected: - TeamId m_FlightMasterSpawnedId; + TeamId m_FlightMasterSpawnedId; - uint32 m_TowerState; + uint32 m_TowerState; }; class OutdoorPvPEP : public OutdoorPvP { - public: +public: - OutdoorPvPEP(); + OutdoorPvPEP(); - bool SetupOutdoorPvP(); + bool SetupOutdoorPvP(); - void HandlePlayerEnterZone(Player* player, uint32 zone); - void HandlePlayerLeaveZone(Player* player, uint32 zone); + void HandlePlayerEnterZone(Player* player, uint32 zone); + void HandlePlayerLeaveZone(Player* player, uint32 zone); - bool Update(uint32 diff); + bool Update(uint32 diff); - void FillInitialWorldStates(WorldPacket &data); + void FillInitialWorldStates(WorldPacket& data); - void SendRemoveWorldStates(Player* player); + void SendRemoveWorldStates(Player* player); - void BuffTeams(); + void BuffTeams(); - void SetControlledState(uint32 index, TeamId teamId); + void SetControlledState(uint32 index, TeamId teamId); - private: +private: - // how many towers are controlled - TeamId EP_ControlsId[EP_TOWER_NUM]; + // how many towers are controlled + TeamId EP_ControlsId[EP_TOWER_NUM]; - uint32 m_AllianceTowersControlled; - uint32 m_HordeTowersControlled; + uint32 m_AllianceTowersControlled; + uint32 m_HordeTowersControlled; }; #endif diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPGH.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPGH.cpp index acae7dd48..23561f855 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPGH.cpp +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPGH.cpp @@ -42,7 +42,7 @@ OPvPCapturePointGH::OPvPCapturePointGH(OutdoorPvP* pvp) : OPvPCapturePoint(pvp) SetCapturePointData(189310, 571, 2483.68f, -1873.6f, 10.6877f, -0.104719f, 0.0f, 0.0f, 0.0f, 1.0f); } -void OPvPCapturePointGH::FillInitialWorldStates(WorldPacket &data) +void OPvPCapturePointGH::FillInitialWorldStates(WorldPacket& data) { data << GH_UI_SLIDER_DISPLAY << uint32(0); data << GH_UI_SLIDER_POS << uint32(50); @@ -105,17 +105,17 @@ void OPvPCapturePointGH::ChangeState() class OutdoorPvP_grizzly_hills : public OutdoorPvPScript { - public: +public: - OutdoorPvP_grizzly_hills() - : OutdoorPvPScript("outdoorpvp_gh") - { - } + OutdoorPvP_grizzly_hills() + : OutdoorPvPScript("outdoorpvp_gh") + { + } - OutdoorPvP* GetOutdoorPvP() const - { - return new OutdoorPvPGH(); - } + OutdoorPvP* GetOutdoorPvP() const + { + return new OutdoorPvPGH(); + } }; void AddSC_outdoorpvp_gh() diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPGH.h b/src/server/scripts/OutdoorPvP/OutdoorPvPGH.h index 34c9aec1c..d84ccc82b 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPGH.h +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPGH.h @@ -27,27 +27,27 @@ class OPvPCapturePointGH; class OutdoorPvPGH : public OutdoorPvP { - public: - OutdoorPvPGH(); - bool SetupOutdoorPvP(); - void SendRemoveWorldStates(Player* player); +public: + OutdoorPvPGH(); + bool SetupOutdoorPvP(); + void SendRemoveWorldStates(Player* player); - private: - OPvPCapturePointGH* m_obj; +private: + OPvPCapturePointGH* m_obj; }; class OPvPCapturePointGH : public OPvPCapturePoint { - public: - OPvPCapturePointGH(OutdoorPvP* pvp); +public: + OPvPCapturePointGH(OutdoorPvP* pvp); - void ChangeState(); - void SendChangePhase(); + void ChangeState(); + void SendChangePhase(); - void FillInitialWorldStates(WorldPacket & data); + void FillInitialWorldStates(WorldPacket& data); - bool HandlePlayerEnter(Player* player); - void HandlePlayerLeave(Player* player); + bool HandlePlayerEnter(Player* player); + void HandlePlayerLeave(Player* player); }; #endif diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPHP.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPHP.cpp index 38e1ddc96..16b90d2ca 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPHP.cpp +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPHP.cpp @@ -23,29 +23,29 @@ const uint32 HP_LANG_CAPTURE_A[HP_TOWER_NUM] = {LANG_OPVP_HP_CAPTURE_BROKENHILL_ const uint32 HP_LANG_CAPTURE_H[HP_TOWER_NUM] = {LANG_OPVP_HP_CAPTURE_BROKENHILL_H, LANG_OPVP_HP_CAPTURE_OVERLOOK_H, LANG_OPVP_HP_CAPTURE_STADIUM_H}; OPvPCapturePointHP::OPvPCapturePointHP(OutdoorPvP* pvp, OutdoorPvPHPTowerType type) -: OPvPCapturePoint(pvp), m_TowerType(type) + : OPvPCapturePoint(pvp), m_TowerType(type) { SetCapturePointData(HPCapturePoints[type].entry, - HPCapturePoints[type].map, - HPCapturePoints[type].x, - HPCapturePoints[type].y, - HPCapturePoints[type].z, - HPCapturePoints[type].o, - HPCapturePoints[type].rot0, - HPCapturePoints[type].rot1, - HPCapturePoints[type].rot2, - HPCapturePoints[type].rot3); + HPCapturePoints[type].map, + HPCapturePoints[type].x, + HPCapturePoints[type].y, + HPCapturePoints[type].z, + HPCapturePoints[type].o, + HPCapturePoints[type].rot0, + HPCapturePoints[type].rot1, + HPCapturePoints[type].rot2, + HPCapturePoints[type].rot3); AddObject(type, - HPTowerFlags[type].entry, - HPTowerFlags[type].map, - HPTowerFlags[type].x, - HPTowerFlags[type].y, - HPTowerFlags[type].z, - HPTowerFlags[type].o, - HPTowerFlags[type].rot0, - HPTowerFlags[type].rot1, - HPTowerFlags[type].rot2, - HPTowerFlags[type].rot3); + HPTowerFlags[type].entry, + HPTowerFlags[type].map, + HPTowerFlags[type].x, + HPTowerFlags[type].y, + HPTowerFlags[type].z, + HPTowerFlags[type].o, + HPTowerFlags[type].rot0, + HPTowerFlags[type].rot1, + HPTowerFlags[type].rot2, + HPTowerFlags[type].rot3); } OutdoorPvPHP::OutdoorPvPHP() @@ -77,12 +77,12 @@ void OutdoorPvPHP::HandlePlayerEnterZone(Player* player, uint32 zone) // add buffs if (player->GetTeamId() == TEAM_ALLIANCE) { - if (m_AllianceTowersControlled >=3) + if (m_AllianceTowersControlled >= 3) player->CastSpell(player, AllianceBuff, true); } else { - if (m_HordeTowersControlled >=3) + if (m_HordeTowersControlled >= 3) player->CastSpell(player, HordeBuff, true); } OutdoorPvP::HandlePlayerEnterZone(player, zone); @@ -139,7 +139,7 @@ void OutdoorPvPHP::SendRemoveWorldStates(Player* player) } } -void OutdoorPvPHP::FillInitialWorldStates(WorldPacket &data) +void OutdoorPvPHP::FillInitialWorldStates(WorldPacket& data) { data << uint32(HP_UI_TOWER_DISPLAY_A) << uint32(1); data << uint32(HP_UI_TOWER_DISPLAY_H) << uint32(1); @@ -159,33 +159,33 @@ void OPvPCapturePointHP::ChangeState() uint32 field = 0; switch (m_OldState) { - case OBJECTIVESTATE_NEUTRAL: - field = HP_MAP_N[m_TowerType]; - break; - case OBJECTIVESTATE_ALLIANCE: - field = HP_MAP_A[m_TowerType]; - if (uint32 alliance_towers = ((OutdoorPvPHP*)m_PvP)->GetAllianceTowersControlled()) - ((OutdoorPvPHP*)m_PvP)->SetAllianceTowersControlled(--alliance_towers); - sWorld->SendZoneText(OutdoorPvPHPBuffZones[0], sObjectMgr->GetAcoreStringForDBCLocale(HP_LANG_LOSE_A[m_TowerType])); - break; - case OBJECTIVESTATE_HORDE: - field = HP_MAP_H[m_TowerType]; - if (uint32 horde_towers = ((OutdoorPvPHP*)m_PvP)->GetHordeTowersControlled()) - ((OutdoorPvPHP*)m_PvP)->SetHordeTowersControlled(--horde_towers); - sWorld->SendZoneText(OutdoorPvPHPBuffZones[0], sObjectMgr->GetAcoreStringForDBCLocale(HP_LANG_LOSE_H[m_TowerType])); - break; - case OBJECTIVESTATE_NEUTRAL_ALLIANCE_CHALLENGE: - field = HP_MAP_N[m_TowerType]; - break; - case OBJECTIVESTATE_NEUTRAL_HORDE_CHALLENGE: - field = HP_MAP_N[m_TowerType]; - break; - case OBJECTIVESTATE_ALLIANCE_HORDE_CHALLENGE: - field = HP_MAP_A[m_TowerType]; - break; - case OBJECTIVESTATE_HORDE_ALLIANCE_CHALLENGE: - field = HP_MAP_H[m_TowerType]; - break; + case OBJECTIVESTATE_NEUTRAL: + field = HP_MAP_N[m_TowerType]; + break; + case OBJECTIVESTATE_ALLIANCE: + field = HP_MAP_A[m_TowerType]; + if (uint32 alliance_towers = ((OutdoorPvPHP*)m_PvP)->GetAllianceTowersControlled()) + ((OutdoorPvPHP*)m_PvP)->SetAllianceTowersControlled(--alliance_towers); + sWorld->SendZoneText(OutdoorPvPHPBuffZones[0], sObjectMgr->GetAcoreStringForDBCLocale(HP_LANG_LOSE_A[m_TowerType])); + break; + case OBJECTIVESTATE_HORDE: + field = HP_MAP_H[m_TowerType]; + if (uint32 horde_towers = ((OutdoorPvPHP*)m_PvP)->GetHordeTowersControlled()) + ((OutdoorPvPHP*)m_PvP)->SetHordeTowersControlled(--horde_towers); + sWorld->SendZoneText(OutdoorPvPHPBuffZones[0], sObjectMgr->GetAcoreStringForDBCLocale(HP_LANG_LOSE_H[m_TowerType])); + break; + case OBJECTIVESTATE_NEUTRAL_ALLIANCE_CHALLENGE: + field = HP_MAP_N[m_TowerType]; + break; + case OBJECTIVESTATE_NEUTRAL_HORDE_CHALLENGE: + field = HP_MAP_N[m_TowerType]; + break; + case OBJECTIVESTATE_ALLIANCE_HORDE_CHALLENGE: + field = HP_MAP_A[m_TowerType]; + break; + case OBJECTIVESTATE_HORDE_ALLIANCE_CHALLENGE: + field = HP_MAP_H[m_TowerType]; + break; } // send world state update @@ -198,47 +198,47 @@ void OPvPCapturePointHP::ChangeState() uint32 artkit2 = HP_TowerArtKit_N[m_TowerType]; switch (m_State) { - case OBJECTIVESTATE_NEUTRAL: - field = HP_MAP_N[m_TowerType]; - break; - case OBJECTIVESTATE_ALLIANCE: - { - field = HP_MAP_A[m_TowerType]; - artkit = 2; - artkit2 = HP_TowerArtKit_A[m_TowerType]; - uint32 alliance_towers = ((OutdoorPvPHP*)m_PvP)->GetAllianceTowersControlled(); - if (alliance_towers < 3) - ((OutdoorPvPHP*)m_PvP)->SetAllianceTowersControlled(++alliance_towers); - sWorld->SendZoneText(OutdoorPvPHPBuffZones[0], sObjectMgr->GetAcoreStringForDBCLocale(HP_LANG_CAPTURE_A[m_TowerType])); - break; - } - case OBJECTIVESTATE_HORDE: - { - field = HP_MAP_H[m_TowerType]; - artkit = 1; - artkit2 = HP_TowerArtKit_H[m_TowerType]; - uint32 horde_towers = ((OutdoorPvPHP*)m_PvP)->GetHordeTowersControlled(); - if (horde_towers < 3) - ((OutdoorPvPHP*)m_PvP)->SetHordeTowersControlled(++horde_towers); - sWorld->SendZoneText(OutdoorPvPHPBuffZones[0], sObjectMgr->GetAcoreStringForDBCLocale(HP_LANG_CAPTURE_H[m_TowerType])); - break; - } - case OBJECTIVESTATE_NEUTRAL_ALLIANCE_CHALLENGE: - field = HP_MAP_N[m_TowerType]; - break; - case OBJECTIVESTATE_NEUTRAL_HORDE_CHALLENGE: - field = HP_MAP_N[m_TowerType]; - break; - case OBJECTIVESTATE_ALLIANCE_HORDE_CHALLENGE: - field = HP_MAP_A[m_TowerType]; - artkit = 2; - artkit2 = HP_TowerArtKit_A[m_TowerType]; - break; - case OBJECTIVESTATE_HORDE_ALLIANCE_CHALLENGE: - field = HP_MAP_H[m_TowerType]; - artkit = 1; - artkit2 = HP_TowerArtKit_H[m_TowerType]; - break; + case OBJECTIVESTATE_NEUTRAL: + field = HP_MAP_N[m_TowerType]; + break; + case OBJECTIVESTATE_ALLIANCE: + { + field = HP_MAP_A[m_TowerType]; + artkit = 2; + artkit2 = HP_TowerArtKit_A[m_TowerType]; + uint32 alliance_towers = ((OutdoorPvPHP*)m_PvP)->GetAllianceTowersControlled(); + if (alliance_towers < 3) + ((OutdoorPvPHP*)m_PvP)->SetAllianceTowersControlled(++alliance_towers); + sWorld->SendZoneText(OutdoorPvPHPBuffZones[0], sObjectMgr->GetAcoreStringForDBCLocale(HP_LANG_CAPTURE_A[m_TowerType])); + break; + } + case OBJECTIVESTATE_HORDE: + { + field = HP_MAP_H[m_TowerType]; + artkit = 1; + artkit2 = HP_TowerArtKit_H[m_TowerType]; + uint32 horde_towers = ((OutdoorPvPHP*)m_PvP)->GetHordeTowersControlled(); + if (horde_towers < 3) + ((OutdoorPvPHP*)m_PvP)->SetHordeTowersControlled(++horde_towers); + sWorld->SendZoneText(OutdoorPvPHPBuffZones[0], sObjectMgr->GetAcoreStringForDBCLocale(HP_LANG_CAPTURE_H[m_TowerType])); + break; + } + case OBJECTIVESTATE_NEUTRAL_ALLIANCE_CHALLENGE: + field = HP_MAP_N[m_TowerType]; + break; + case OBJECTIVESTATE_NEUTRAL_HORDE_CHALLENGE: + field = HP_MAP_N[m_TowerType]; + break; + case OBJECTIVESTATE_ALLIANCE_HORDE_CHALLENGE: + field = HP_MAP_A[m_TowerType]; + artkit = 2; + artkit2 = HP_TowerArtKit_A[m_TowerType]; + break; + case OBJECTIVESTATE_HORDE_ALLIANCE_CHALLENGE: + field = HP_MAP_H[m_TowerType]; + artkit = 1; + artkit2 = HP_TowerArtKit_H[m_TowerType]; + break; } GameObject* flag = HashMapHolder::Find(m_capturePointGUID); @@ -271,7 +271,7 @@ void OPvPCapturePointHP::SendChangePhase() SendUpdateWorldState(HP_UI_TOWER_SLIDER_DISPLAY, 1); } -void OPvPCapturePointHP::FillInitialWorldStates(WorldPacket &data) +void OPvPCapturePointHP::FillInitialWorldStates(WorldPacket& data) { switch (m_State) { @@ -350,17 +350,17 @@ void OutdoorPvPHP::SetHordeTowersControlled(uint32 count) class OutdoorPvP_hellfire_peninsula : public OutdoorPvPScript { - public: +public: - OutdoorPvP_hellfire_peninsula() - : OutdoorPvPScript("outdoorpvp_hp") - { - } + OutdoorPvP_hellfire_peninsula() + : OutdoorPvPScript("outdoorpvp_hp") + { + } - OutdoorPvP* GetOutdoorPvP() const - { - return new OutdoorPvPHP(); - } + OutdoorPvP* GetOutdoorPvP() const + { + return new OutdoorPvPHP(); + } }; void AddSC_outdoorpvp_hp() diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPHP.h b/src/server/scripts/OutdoorPvP/OutdoorPvPHP.h index 1152f24e9..f6f42bd44 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPHP.h +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPHP.h @@ -10,7 +10,7 @@ #include "OutdoorPvP.h" #define OutdoorPvPHPBuffZonesNum 6 - // HP, citadel, ramparts, blood furnace, shattered halls, mag's lair +// HP, citadel, ramparts, blood furnace, shattered halls, mag's lair const uint32 OutdoorPvPHPBuffZones[OutdoorPvPHPBuffZonesNum] = { 3483, 3563, 3562, 3713, 3714, 3836 }; enum OutdoorPvPHPSpells @@ -76,55 +76,55 @@ const go_type HPTowerFlags[HP_TOWER_NUM] = class OPvPCapturePointHP : public OPvPCapturePoint { - public: +public: - OPvPCapturePointHP(OutdoorPvP* pvp, OutdoorPvPHPTowerType type); + OPvPCapturePointHP(OutdoorPvP* pvp, OutdoorPvPHPTowerType type); - void ChangeState(); + void ChangeState(); - void SendChangePhase(); + void SendChangePhase(); - void FillInitialWorldStates(WorldPacket & data); + void FillInitialWorldStates(WorldPacket& data); - // used when player is activated/inactivated in the area - bool HandlePlayerEnter(Player* player); - void HandlePlayerLeave(Player* player); + // used when player is activated/inactivated in the area + bool HandlePlayerEnter(Player* player); + void HandlePlayerLeave(Player* player); - private: +private: - OutdoorPvPHPTowerType m_TowerType; + OutdoorPvPHPTowerType m_TowerType; }; class OutdoorPvPHP : public OutdoorPvP { - public: +public: - OutdoorPvPHP(); + OutdoorPvPHP(); - bool SetupOutdoorPvP(); + bool SetupOutdoorPvP(); - void HandlePlayerEnterZone(Player* player, uint32 zone); - void HandlePlayerLeaveZone(Player* player, uint32 zone); + void HandlePlayerEnterZone(Player* player, uint32 zone); + void HandlePlayerLeaveZone(Player* player, uint32 zone); - bool Update(uint32 diff); + bool Update(uint32 diff); - void FillInitialWorldStates(WorldPacket &data); + void FillInitialWorldStates(WorldPacket& data); - void SendRemoveWorldStates(Player* player); + void SendRemoveWorldStates(Player* player); - void HandleKillImpl(Player* player, Unit* killed); + void HandleKillImpl(Player* player, Unit* killed); - uint32 GetAllianceTowersControlled() const; - void SetAllianceTowersControlled(uint32 count); + uint32 GetAllianceTowersControlled() const; + void SetAllianceTowersControlled(uint32 count); - uint32 GetHordeTowersControlled() const; - void SetHordeTowersControlled(uint32 count); + uint32 GetHordeTowersControlled() const; + void SetHordeTowersControlled(uint32 count); - private: +private: - // how many towers are controlled - uint32 m_AllianceTowersControlled; - uint32 m_HordeTowersControlled; + // how many towers are controlled + uint32 m_AllianceTowersControlled; + uint32 m_HordeTowersControlled; }; #endif diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp index 3775b60d4..fe003530c 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp @@ -36,27 +36,27 @@ uint32 OPvPCapturePointNA::GetAliveGuardsCount() { switch (itr->first) { - case NA_NPC_GUARD_01: - case NA_NPC_GUARD_02: - case NA_NPC_GUARD_03: - case NA_NPC_GUARD_04: - case NA_NPC_GUARD_05: - case NA_NPC_GUARD_06: - case NA_NPC_GUARD_07: - case NA_NPC_GUARD_08: - case NA_NPC_GUARD_09: - case NA_NPC_GUARD_10: - case NA_NPC_GUARD_11: - case NA_NPC_GUARD_12: - case NA_NPC_GUARD_13: - case NA_NPC_GUARD_14: - case NA_NPC_GUARD_15: - if (Creature const* const cr = HashMapHolder::Find(itr->second)) - if (cr->IsAlive()) - ++cnt; - break; - default: - break; + case NA_NPC_GUARD_01: + case NA_NPC_GUARD_02: + case NA_NPC_GUARD_03: + case NA_NPC_GUARD_04: + case NA_NPC_GUARD_05: + case NA_NPC_GUARD_06: + case NA_NPC_GUARD_07: + case NA_NPC_GUARD_08: + case NA_NPC_GUARD_09: + case NA_NPC_GUARD_10: + case NA_NPC_GUARD_11: + case NA_NPC_GUARD_12: + case NA_NPC_GUARD_13: + case NA_NPC_GUARD_14: + case NA_NPC_GUARD_15: + if (Creature const* const cr = HashMapHolder::Find(itr->second)) + if (cr->IsAlive()) + ++cnt; + break; + default: + break; } } return cnt; @@ -69,11 +69,11 @@ TeamId OPvPCapturePointNA::GetControllingFaction() const void OPvPCapturePointNA::SpawnNPCsForTeam(TeamId teamId) { - const creature_type * creatures = nullptr; + const creature_type* creatures = nullptr; if (teamId == TEAM_ALLIANCE) - creatures=AllianceControlNPCs; + creatures = AllianceControlNPCs; else if (teamId == TEAM_HORDE) - creatures=HordeControlNPCs; + creatures = HordeControlNPCs; else return; for (int i = 0; i < NA_CONTROL_NPC_NUM; ++i) @@ -88,23 +88,23 @@ void OPvPCapturePointNA::DeSpawnNPCs() void OPvPCapturePointNA::SpawnGOsForTeam(TeamId teamId) { - const go_type * gos = nullptr; + const go_type* gos = nullptr; if (teamId == TEAM_ALLIANCE) - gos=AllianceControlGOs; + gos = AllianceControlGOs; else if (teamId == TEAM_HORDE) - gos=HordeControlGOs; + gos = HordeControlGOs; else return; for (int i = 0; i < NA_CONTROL_GO_NUM; ++i) { if (i == NA_ROOST_S || - i == NA_ROOST_W || - i == NA_ROOST_N || - i == NA_ROOST_E || - i == NA_BOMB_WAGON_S || - i == NA_BOMB_WAGON_W || - i == NA_BOMB_WAGON_N || - i == NA_BOMB_WAGON_E) + i == NA_ROOST_W || + i == NA_ROOST_N || + i == NA_ROOST_E || + i == NA_BOMB_WAGON_S || + i == NA_BOMB_WAGON_W || + i == NA_BOMB_WAGON_N || + i == NA_BOMB_WAGON_E) continue; // roosts and bomb wagons are spawned when someone uses the matching destroyed roost AddObject(i, gos[i].entry, gos[i].map, gos[i].x, gos[i].y, gos[i].z, gos[i].o, gos[i].rot0, gos[i].rot1, gos[i].rot2, gos[i].rot3); } @@ -187,16 +187,16 @@ void OPvPCapturePointNA::HandlePlayerLeave(Player* player) } OPvPCapturePointNA::OPvPCapturePointNA(OutdoorPvP* pvp) : -OPvPCapturePoint(pvp), m_capturable(true), m_GuardsAlive(0), m_ControllingFaction(TEAM_NEUTRAL), -m_WyvernStateNorth(0), m_WyvernStateSouth(0), m_WyvernStateEast(0), m_WyvernStateWest(0), -m_HalaaState(HALAA_N), m_RespawnTimer(NA_RESPAWN_TIME), m_GuardCheckTimer(NA_GUARD_CHECK_TIME) + OPvPCapturePoint(pvp), m_capturable(true), m_GuardsAlive(0), m_ControllingFaction(TEAM_NEUTRAL), + m_WyvernStateNorth(0), m_WyvernStateSouth(0), m_WyvernStateEast(0), m_WyvernStateWest(0), + m_HalaaState(HALAA_N), m_RespawnTimer(NA_RESPAWN_TIME), m_GuardCheckTimer(NA_GUARD_CHECK_TIME) { SetCapturePointData(182210, 530, -1572.57f, 7945.3f, -22.475f, 2.05949f, 0.0f, 0.0f, 0.857167f, 0.515038f); } bool OutdoorPvPNA::SetupOutdoorPvP() { -// m_TypeId = OUTDOOR_PVP_NA; _MUST_ be set in ctor, because of spawns cleanup + // m_TypeId = OUTDOOR_PVP_NA; _MUST_ be set in ctor, because of spawns cleanup // add the zones affected by the pvp buff RegisterZone(NA_BUFF_ZONE); @@ -224,12 +224,12 @@ void OutdoorPvPNA::HandlePlayerLeaveZone(Player* player, uint32 zone) OutdoorPvP::HandlePlayerLeaveZone(player, zone); } -void OutdoorPvPNA::FillInitialWorldStates(WorldPacket &data) +void OutdoorPvPNA::FillInitialWorldStates(WorldPacket& data) { m_obj->FillInitialWorldStates(data); } -void OPvPCapturePointNA::FillInitialWorldStates(WorldPacket &data) +void OPvPCapturePointNA::FillInitialWorldStates(WorldPacket& data) { if (m_ControllingFaction == TEAM_ALLIANCE) { @@ -325,40 +325,40 @@ bool OPvPCapturePointNA::HandleCustomSpell(Player* player, uint32 spellId, GameO bool retval = false; switch (spellId) { - case NA_SPELL_FLY_NORTH: - nodes[0] = FlightPathStartNodes[NA_ROOST_N]; - nodes[1] = FlightPathEndNodes[NA_ROOST_N]; - player->ActivateTaxiPathTo(nodes); - player->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP); - player->UpdatePvP(true, true); - retval = true; - break; - case NA_SPELL_FLY_SOUTH: - nodes[0] = FlightPathStartNodes[NA_ROOST_S]; - nodes[1] = FlightPathEndNodes[NA_ROOST_S]; - player->ActivateTaxiPathTo(nodes); - player->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP); - player->UpdatePvP(true, true); - retval = true; - break; - case NA_SPELL_FLY_WEST: - nodes[0] = FlightPathStartNodes[NA_ROOST_W]; - nodes[1] = FlightPathEndNodes[NA_ROOST_W]; - player->ActivateTaxiPathTo(nodes); - player->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP); - player->UpdatePvP(true, true); - retval = true; - break; - case NA_SPELL_FLY_EAST: - nodes[0] = FlightPathStartNodes[NA_ROOST_E]; - nodes[1] = FlightPathEndNodes[NA_ROOST_E]; - player->ActivateTaxiPathTo(nodes); - player->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP); - player->UpdatePvP(true, true); - retval = true; - break; - default: - break; + case NA_SPELL_FLY_NORTH: + nodes[0] = FlightPathStartNodes[NA_ROOST_N]; + nodes[1] = FlightPathEndNodes[NA_ROOST_N]; + player->ActivateTaxiPathTo(nodes); + player->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP); + player->UpdatePvP(true, true); + retval = true; + break; + case NA_SPELL_FLY_SOUTH: + nodes[0] = FlightPathStartNodes[NA_ROOST_S]; + nodes[1] = FlightPathEndNodes[NA_ROOST_S]; + player->ActivateTaxiPathTo(nodes); + player->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP); + player->UpdatePvP(true, true); + retval = true; + break; + case NA_SPELL_FLY_WEST: + nodes[0] = FlightPathStartNodes[NA_ROOST_W]; + nodes[1] = FlightPathEndNodes[NA_ROOST_W]; + player->ActivateTaxiPathTo(nodes); + player->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP); + player->UpdatePvP(true, true); + retval = true; + break; + case NA_SPELL_FLY_EAST: + nodes[0] = FlightPathStartNodes[NA_ROOST_E]; + nodes[1] = FlightPathEndNodes[NA_ROOST_E]; + player->ActivateTaxiPathTo(nodes); + player->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP); + player->UpdatePvP(true, true); + retval = true; + break; + default: + break; } if (retval) @@ -371,7 +371,7 @@ bool OPvPCapturePointNA::HandleCustomSpell(Player* player, uint32 spellId, GameO int32 count = 10; uint32 itemid = 24538; - // bomb id count + // bomb id count InventoryResult msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemid, count, &noSpaceForCount); if (msg != EQUIP_ERR_OK) // convert to possible store amount count -= noSpaceForCount; @@ -398,11 +398,11 @@ int32 OPvPCapturePointNA::HandleOpenGo(Player* player, uint64 guid) int32 retval = OPvPCapturePoint::HandleOpenGo(player, guid); if (retval >= 0) { - const go_type * gos = nullptr; + const go_type* gos = nullptr; if (m_ControllingFaction == TEAM_ALLIANCE) - gos=AllianceControlGOs; + gos = AllianceControlGOs; else if (m_ControllingFaction == TEAM_HORDE) - gos=HordeControlGOs; + gos = HordeControlGOs; else return -1; @@ -413,101 +413,101 @@ int32 OPvPCapturePointNA::HandleOpenGo(Player* player, uint64 guid) switch (retval) { - case NA_DESTROYED_ROOST_S: - del = NA_DESTROYED_ROOST_S; - add = NA_ROOST_S; - add2 = NA_BOMB_WAGON_S; - if (m_ControllingFaction == TEAM_HORDE) - m_WyvernStateSouth = WYVERN_ALLIANCE; - else - m_WyvernStateSouth = WYVERN_HORDE; - UpdateWyvernRoostWorldState(NA_ROOST_S); - break; - case NA_DESTROYED_ROOST_N: - del = NA_DESTROYED_ROOST_N; - add = NA_ROOST_N; - add2 = NA_BOMB_WAGON_N; - if (m_ControllingFaction == TEAM_HORDE) - m_WyvernStateNorth = WYVERN_ALLIANCE; - else - m_WyvernStateNorth = WYVERN_HORDE; - UpdateWyvernRoostWorldState(NA_ROOST_N); - break; - case NA_DESTROYED_ROOST_W: - del = NA_DESTROYED_ROOST_W; - add = NA_ROOST_W; - add2 = NA_BOMB_WAGON_W; - if (m_ControllingFaction == TEAM_HORDE) - m_WyvernStateWest = WYVERN_ALLIANCE; - else - m_WyvernStateWest = WYVERN_HORDE; - UpdateWyvernRoostWorldState(NA_ROOST_W); - break; - case NA_DESTROYED_ROOST_E: - del = NA_DESTROYED_ROOST_E; - add = NA_ROOST_E; - add2 = NA_BOMB_WAGON_E; - if (m_ControllingFaction == TEAM_HORDE) - m_WyvernStateEast = WYVERN_ALLIANCE; - else - m_WyvernStateEast = WYVERN_HORDE; - UpdateWyvernRoostWorldState(NA_ROOST_E); - break; - case NA_BOMB_WAGON_S: - del = NA_BOMB_WAGON_S; - del2 = NA_ROOST_S; - add = NA_DESTROYED_ROOST_S; - if (m_ControllingFaction == TEAM_HORDE) - m_WyvernStateSouth = WYVERN_NEU_ALLIANCE; - else - m_WyvernStateSouth = WYVERN_NEU_HORDE; - UpdateWyvernRoostWorldState(NA_ROOST_S); - break; - case NA_BOMB_WAGON_N: - del = NA_BOMB_WAGON_N; - del2 = NA_ROOST_N; - add = NA_DESTROYED_ROOST_N; - if (m_ControllingFaction == TEAM_HORDE) - m_WyvernStateNorth = WYVERN_NEU_ALLIANCE; - else - m_WyvernStateNorth = WYVERN_NEU_HORDE; - UpdateWyvernRoostWorldState(NA_ROOST_N); - break; - case NA_BOMB_WAGON_W: - del = NA_BOMB_WAGON_W; - del2 = NA_ROOST_W; - add = NA_DESTROYED_ROOST_W; - if (m_ControllingFaction == TEAM_HORDE) - m_WyvernStateWest = WYVERN_NEU_ALLIANCE; - else - m_WyvernStateWest = WYVERN_NEU_HORDE; - UpdateWyvernRoostWorldState(NA_ROOST_W); - break; - case NA_BOMB_WAGON_E: - del = NA_BOMB_WAGON_E; - del2 = NA_ROOST_E; - add = NA_DESTROYED_ROOST_E; - if (m_ControllingFaction == TEAM_HORDE) - m_WyvernStateEast = WYVERN_NEU_ALLIANCE; - else - m_WyvernStateEast = WYVERN_NEU_HORDE; - UpdateWyvernRoostWorldState(NA_ROOST_E); - break; - default: - return -1; - break; + case NA_DESTROYED_ROOST_S: + del = NA_DESTROYED_ROOST_S; + add = NA_ROOST_S; + add2 = NA_BOMB_WAGON_S; + if (m_ControllingFaction == TEAM_HORDE) + m_WyvernStateSouth = WYVERN_ALLIANCE; + else + m_WyvernStateSouth = WYVERN_HORDE; + UpdateWyvernRoostWorldState(NA_ROOST_S); + break; + case NA_DESTROYED_ROOST_N: + del = NA_DESTROYED_ROOST_N; + add = NA_ROOST_N; + add2 = NA_BOMB_WAGON_N; + if (m_ControllingFaction == TEAM_HORDE) + m_WyvernStateNorth = WYVERN_ALLIANCE; + else + m_WyvernStateNorth = WYVERN_HORDE; + UpdateWyvernRoostWorldState(NA_ROOST_N); + break; + case NA_DESTROYED_ROOST_W: + del = NA_DESTROYED_ROOST_W; + add = NA_ROOST_W; + add2 = NA_BOMB_WAGON_W; + if (m_ControllingFaction == TEAM_HORDE) + m_WyvernStateWest = WYVERN_ALLIANCE; + else + m_WyvernStateWest = WYVERN_HORDE; + UpdateWyvernRoostWorldState(NA_ROOST_W); + break; + case NA_DESTROYED_ROOST_E: + del = NA_DESTROYED_ROOST_E; + add = NA_ROOST_E; + add2 = NA_BOMB_WAGON_E; + if (m_ControllingFaction == TEAM_HORDE) + m_WyvernStateEast = WYVERN_ALLIANCE; + else + m_WyvernStateEast = WYVERN_HORDE; + UpdateWyvernRoostWorldState(NA_ROOST_E); + break; + case NA_BOMB_WAGON_S: + del = NA_BOMB_WAGON_S; + del2 = NA_ROOST_S; + add = NA_DESTROYED_ROOST_S; + if (m_ControllingFaction == TEAM_HORDE) + m_WyvernStateSouth = WYVERN_NEU_ALLIANCE; + else + m_WyvernStateSouth = WYVERN_NEU_HORDE; + UpdateWyvernRoostWorldState(NA_ROOST_S); + break; + case NA_BOMB_WAGON_N: + del = NA_BOMB_WAGON_N; + del2 = NA_ROOST_N; + add = NA_DESTROYED_ROOST_N; + if (m_ControllingFaction == TEAM_HORDE) + m_WyvernStateNorth = WYVERN_NEU_ALLIANCE; + else + m_WyvernStateNorth = WYVERN_NEU_HORDE; + UpdateWyvernRoostWorldState(NA_ROOST_N); + break; + case NA_BOMB_WAGON_W: + del = NA_BOMB_WAGON_W; + del2 = NA_ROOST_W; + add = NA_DESTROYED_ROOST_W; + if (m_ControllingFaction == TEAM_HORDE) + m_WyvernStateWest = WYVERN_NEU_ALLIANCE; + else + m_WyvernStateWest = WYVERN_NEU_HORDE; + UpdateWyvernRoostWorldState(NA_ROOST_W); + break; + case NA_BOMB_WAGON_E: + del = NA_BOMB_WAGON_E; + del2 = NA_ROOST_E; + add = NA_DESTROYED_ROOST_E; + if (m_ControllingFaction == TEAM_HORDE) + m_WyvernStateEast = WYVERN_NEU_ALLIANCE; + else + m_WyvernStateEast = WYVERN_NEU_HORDE; + UpdateWyvernRoostWorldState(NA_ROOST_E); + break; + default: + return -1; + break; } - if (del>-1) + if (del > -1) DelObject(del); - if (del2>-1) + if (del2 > -1) DelObject(del2); - if (add>-1) + if (add > -1) AddObject(add, gos[add].entry, gos[add].map, gos[add].x, gos[add].y, gos[add].z, gos[add].o, gos[add].rot0, gos[add].rot1, gos[add].rot2, gos[add].rot3); - if (add2>-1) + if (add2 > -1) AddObject(add2, gos[add2].entry, gos[add2].map, gos[add2].x, gos[add2].y, gos[add2].z, gos[add2].o, gos[add2].rot0, gos[add2].rot1, gos[add2].rot2, gos[add2].rot3); return retval; @@ -536,7 +536,8 @@ bool OPvPCapturePointNA::Update(uint32 diff) // update the guard count for the players in zone m_PvP->SendUpdateWorldState(NA_UI_GUARDS_LEFT, m_GuardsAlive); } - } else m_GuardCheckTimer -= diff; + } + else m_GuardCheckTimer -= diff; if (m_capturable || capturable) { @@ -547,7 +548,8 @@ bool OPvPCapturePointNA::Update(uint32 diff) if (m_ControllingFaction) FactionTakeOver(m_ControllingFaction); m_RespawnTimer = NA_RESPAWN_TIME; - } else m_RespawnTimer -= diff; + } + else m_RespawnTimer -= diff; } return OPvPCapturePoint::Update(diff); } @@ -583,7 +585,7 @@ void OPvPCapturePointNA::ChangeState() case OBJECTIVESTATE_HORDE_ALLIANCE_CHALLENGE: m_HalaaState = HALAA_N_H; artkit = 1; - break; + break; } GameObject* flag = HashMapHolder::Find(m_capturePointGUID); @@ -618,46 +620,46 @@ void OPvPCapturePointNA::UpdateWyvernRoostWorldState(uint32 roost) { switch (roost) { - case NA_ROOST_S: - m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_SOUTH_NEU_H, uint32(bool(m_WyvernStateSouth & WYVERN_NEU_HORDE))); - m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_SOUTH_NEU_A, uint32(bool(m_WyvernStateSouth & WYVERN_NEU_ALLIANCE))); - m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_SOUTH_H, uint32(bool(m_WyvernStateSouth & WYVERN_HORDE))); - m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_SOUTH_A, uint32(bool(m_WyvernStateSouth & WYVERN_ALLIANCE))); - break; - case NA_ROOST_N: - m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_NORTH_NEU_H, uint32(bool(m_WyvernStateNorth & WYVERN_NEU_HORDE))); - m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_NORTH_NEU_A, uint32(bool(m_WyvernStateNorth & WYVERN_NEU_ALLIANCE))); - m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_NORTH_H, uint32(bool(m_WyvernStateNorth & WYVERN_HORDE))); - m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_NORTH_A, uint32(bool(m_WyvernStateNorth & WYVERN_ALLIANCE))); - break; - case NA_ROOST_W: - m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_WEST_NEU_H, uint32(bool(m_WyvernStateWest & WYVERN_NEU_HORDE))); - m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_WEST_NEU_A, uint32(bool(m_WyvernStateWest & WYVERN_NEU_ALLIANCE))); - m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_WEST_H, uint32(bool(m_WyvernStateWest & WYVERN_HORDE))); - m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_WEST_A, uint32(bool(m_WyvernStateWest & WYVERN_ALLIANCE))); - break; - case NA_ROOST_E: - m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_EAST_NEU_H, uint32(bool(m_WyvernStateEast & WYVERN_NEU_HORDE))); - m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_EAST_NEU_A, uint32(bool(m_WyvernStateEast & WYVERN_NEU_ALLIANCE))); - m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_EAST_H, uint32(bool(m_WyvernStateEast & WYVERN_HORDE))); - m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_EAST_A, uint32(bool(m_WyvernStateEast & WYVERN_ALLIANCE))); - break; + case NA_ROOST_S: + m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_SOUTH_NEU_H, uint32(bool(m_WyvernStateSouth & WYVERN_NEU_HORDE))); + m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_SOUTH_NEU_A, uint32(bool(m_WyvernStateSouth & WYVERN_NEU_ALLIANCE))); + m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_SOUTH_H, uint32(bool(m_WyvernStateSouth & WYVERN_HORDE))); + m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_SOUTH_A, uint32(bool(m_WyvernStateSouth & WYVERN_ALLIANCE))); + break; + case NA_ROOST_N: + m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_NORTH_NEU_H, uint32(bool(m_WyvernStateNorth & WYVERN_NEU_HORDE))); + m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_NORTH_NEU_A, uint32(bool(m_WyvernStateNorth & WYVERN_NEU_ALLIANCE))); + m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_NORTH_H, uint32(bool(m_WyvernStateNorth & WYVERN_HORDE))); + m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_NORTH_A, uint32(bool(m_WyvernStateNorth & WYVERN_ALLIANCE))); + break; + case NA_ROOST_W: + m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_WEST_NEU_H, uint32(bool(m_WyvernStateWest & WYVERN_NEU_HORDE))); + m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_WEST_NEU_A, uint32(bool(m_WyvernStateWest & WYVERN_NEU_ALLIANCE))); + m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_WEST_H, uint32(bool(m_WyvernStateWest & WYVERN_HORDE))); + m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_WEST_A, uint32(bool(m_WyvernStateWest & WYVERN_ALLIANCE))); + break; + case NA_ROOST_E: + m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_EAST_NEU_H, uint32(bool(m_WyvernStateEast & WYVERN_NEU_HORDE))); + m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_EAST_NEU_A, uint32(bool(m_WyvernStateEast & WYVERN_NEU_ALLIANCE))); + m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_EAST_H, uint32(bool(m_WyvernStateEast & WYVERN_HORDE))); + m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_EAST_A, uint32(bool(m_WyvernStateEast & WYVERN_ALLIANCE))); + break; } } class OutdoorPvP_nagrand : public OutdoorPvPScript { - public: +public: - OutdoorPvP_nagrand() - : OutdoorPvPScript("outdoorpvp_na") - { - } + OutdoorPvP_nagrand() + : OutdoorPvPScript("outdoorpvp_na") + { + } - OutdoorPvP* GetOutdoorPvP() const - { - return new OutdoorPvPNA(); - } + OutdoorPvP* GetOutdoorPvP() const + { + return new OutdoorPvPNA(); + } }; void AddSC_outdoorpvp_na() diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPNA.h b/src/server/scripts/OutdoorPvP/OutdoorPvPNA.h index 1420b681d..584a3338b 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPNA.h +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPNA.h @@ -241,85 +241,85 @@ class OutdoorPvPNA; class OPvPCapturePointNA : public OPvPCapturePoint { - public: +public: - OPvPCapturePointNA(OutdoorPvP* pvp); + OPvPCapturePointNA(OutdoorPvP* pvp); - bool Update(uint32 diff); + bool Update(uint32 diff); - void ChangeState(); + void ChangeState(); - void SendChangePhase(); + void SendChangePhase(); - void FillInitialWorldStates(WorldPacket & data); + void FillInitialWorldStates(WorldPacket& data); - // used when player is activated/inactivated in the area - bool HandlePlayerEnter(Player* player); - void HandlePlayerLeave(Player* player); + // used when player is activated/inactivated in the area + bool HandlePlayerEnter(Player* player); + void HandlePlayerLeave(Player* player); - bool HandleCustomSpell(Player* player, uint32 spellId, GameObject* go); + bool HandleCustomSpell(Player* player, uint32 spellId, GameObject* go); - int32 HandleOpenGo(Player* player, uint64 guid); + int32 HandleOpenGo(Player* player, uint64 guid); - uint32 GetAliveGuardsCount(); - TeamId GetControllingFaction() const; + uint32 GetAliveGuardsCount(); + TeamId GetControllingFaction() const; - protected: +protected: - // called when a faction takes control - void FactionTakeOver(TeamId teamId); + // called when a faction takes control + void FactionTakeOver(TeamId teamId); - void DeSpawnNPCs(); - void DeSpawnGOs(); + void DeSpawnNPCs(); + void DeSpawnGOs(); - void SpawnNPCsForTeam(TeamId teamId); - void SpawnGOsForTeam(TeamId teamId); + void SpawnNPCsForTeam(TeamId teamId); + void SpawnGOsForTeam(TeamId teamId); - void UpdateWyvernRoostWorldState(uint32 roost); - void UpdateHalaaWorldState(); + void UpdateWyvernRoostWorldState(uint32 roost); + void UpdateHalaaWorldState(); - private: +private: - bool m_capturable; + bool m_capturable; - uint32 m_GuardsAlive; + uint32 m_GuardsAlive; - TeamId m_ControllingFaction; + TeamId m_ControllingFaction; - uint32 m_WyvernStateNorth; - uint32 m_WyvernStateSouth; - uint32 m_WyvernStateEast; - uint32 m_WyvernStateWest; + uint32 m_WyvernStateNorth; + uint32 m_WyvernStateSouth; + uint32 m_WyvernStateEast; + uint32 m_WyvernStateWest; - uint32 m_HalaaState; + uint32 m_HalaaState; - uint32 m_RespawnTimer; + uint32 m_RespawnTimer; - uint32 m_GuardCheckTimer; + uint32 m_GuardCheckTimer; }; class OutdoorPvPNA : public OutdoorPvP { - public: +public: - OutdoorPvPNA(); + OutdoorPvPNA(); - bool SetupOutdoorPvP(); + bool SetupOutdoorPvP(); - void HandlePlayerEnterZone(Player* player, uint32 zone); - void HandlePlayerLeaveZone(Player* player, uint32 zone); + void HandlePlayerEnterZone(Player* player, uint32 zone); + void HandlePlayerLeaveZone(Player* player, uint32 zone); - bool Update(uint32 diff); + bool Update(uint32 diff); - void FillInitialWorldStates(WorldPacket &data); + void FillInitialWorldStates(WorldPacket& data); - void SendRemoveWorldStates(Player* player); + void SendRemoveWorldStates(Player* player); - void HandleKillImpl(Player* player, Unit* killed); + void HandleKillImpl(Player* player, Unit* killed); - private: +private: - OPvPCapturePointNA * m_obj; + OPvPCapturePointNA* m_obj; }; #endif diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp index d72d87907..1e9c84aaa 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp @@ -25,7 +25,7 @@ OutdoorPvPSI::OutdoorPvPSI() m_LastController = TEAM_NEUTRAL; } -void OutdoorPvPSI::FillInitialWorldStates(WorldPacket &data) +void OutdoorPvPSI::FillInitialWorldStates(WorldPacket& data) { data << SI_GATHERED_A << m_Gathered_A; data << SI_GATHERED_H << m_Gathered_H; @@ -78,58 +78,58 @@ bool OutdoorPvPSI::HandleAreaTrigger(Player* player, uint32 trigger) switch (trigger) { - case SI_AREATRIGGER_A: - if (player->GetTeamId() == TEAM_ALLIANCE && player->HasAura(SI_SILITHYST_FLAG)) - { - // remove aura - player->RemoveAurasDueToSpell(SI_SILITHYST_FLAG); - ++ m_Gathered_A; - if (m_Gathered_A >= SI_MAX_RESOURCES) + case SI_AREATRIGGER_A: + if (player->GetTeamId() == TEAM_ALLIANCE && player->HasAura(SI_SILITHYST_FLAG)) { - TeamApplyBuff(TEAM_ALLIANCE, SI_CENARION_FAVOR, 0, player); - sWorld->SendZoneText(OutdoorPvPSIBuffZones[0], sObjectMgr->GetAcoreStringForDBCLocale(LANG_OPVP_SI_CAPTURE_A)); - m_LastController = TEAM_ALLIANCE; - m_Gathered_A = 0; - m_Gathered_H = 0; + // remove aura + player->RemoveAurasDueToSpell(SI_SILITHYST_FLAG); + ++ m_Gathered_A; + if (m_Gathered_A >= SI_MAX_RESOURCES) + { + TeamApplyBuff(TEAM_ALLIANCE, SI_CENARION_FAVOR, 0, player); + sWorld->SendZoneText(OutdoorPvPSIBuffZones[0], sObjectMgr->GetAcoreStringForDBCLocale(LANG_OPVP_SI_CAPTURE_A)); + m_LastController = TEAM_ALLIANCE; + m_Gathered_A = 0; + m_Gathered_H = 0; + } + UpdateWorldState(); + // reward player, xinef: has no effect on characters above level 70 + if (player->getLevel() < 70) + player->CastSpell(player, SI_TRACES_OF_SILITHYST, true); + // add 19 honor + player->RewardHonor(nullptr, 1, 19); + // add 20 cenarion circle repu + player->GetReputationMgr().ModifyReputation(sFactionStore.LookupEntry(609), 20); + // complete quest + player->KilledMonsterCredit(SI_TURNIN_QUEST_CM_A, 0); } - UpdateWorldState(); - // reward player, xinef: has no effect on characters above level 70 - if (player->getLevel() < 70) - player->CastSpell(player, SI_TRACES_OF_SILITHYST, true); - // add 19 honor - player->RewardHonor(nullptr, 1, 19); - // add 20 cenarion circle repu - player->GetReputationMgr().ModifyReputation(sFactionStore.LookupEntry(609), 20); - // complete quest - player->KilledMonsterCredit(SI_TURNIN_QUEST_CM_A, 0); - } - return true; - case SI_AREATRIGGER_H: - if (player->GetTeamId() == TEAM_HORDE && player->HasAura(SI_SILITHYST_FLAG)) - { - // remove aura - player->RemoveAurasDueToSpell(SI_SILITHYST_FLAG); - ++ m_Gathered_H; - if (m_Gathered_H >= SI_MAX_RESOURCES) + return true; + case SI_AREATRIGGER_H: + if (player->GetTeamId() == TEAM_HORDE && player->HasAura(SI_SILITHYST_FLAG)) { - TeamApplyBuff(TEAM_HORDE, SI_CENARION_FAVOR, 0, player); - sWorld->SendZoneText(OutdoorPvPSIBuffZones[0], sObjectMgr->GetAcoreStringForDBCLocale(LANG_OPVP_SI_CAPTURE_H)); - m_LastController = TEAM_HORDE; - m_Gathered_A = 0; - m_Gathered_H = 0; + // remove aura + player->RemoveAurasDueToSpell(SI_SILITHYST_FLAG); + ++ m_Gathered_H; + if (m_Gathered_H >= SI_MAX_RESOURCES) + { + TeamApplyBuff(TEAM_HORDE, SI_CENARION_FAVOR, 0, player); + sWorld->SendZoneText(OutdoorPvPSIBuffZones[0], sObjectMgr->GetAcoreStringForDBCLocale(LANG_OPVP_SI_CAPTURE_H)); + m_LastController = TEAM_HORDE; + m_Gathered_A = 0; + m_Gathered_H = 0; + } + UpdateWorldState(); + // reward player, xinef: has no effect on characters above level 70 + if (player->getLevel() < 70) + player->CastSpell(player, SI_TRACES_OF_SILITHYST, true); + // add 19 honor + player->RewardHonor(nullptr, 1, 19); + // add 20 cenarion circle repu + player->GetReputationMgr().ModifyReputation(sFactionStore.LookupEntry(609), 20); + // complete quest + player->KilledMonsterCredit(SI_TURNIN_QUEST_CM_H, 0); } - UpdateWorldState(); - // reward player, xinef: has no effect on characters above level 70 - if (player->getLevel() < 70) - player->CastSpell(player, SI_TRACES_OF_SILITHYST, true); - // add 19 honor - player->RewardHonor(nullptr, 1, 19); - // add 20 cenarion circle repu - player->GetReputationMgr().ModifyReputation(sFactionStore.LookupEntry(609), 20); - // complete quest - player->KilledMonsterCredit(SI_TURNIN_QUEST_CM_H, 0); - } - return true; + return true; } return false; } @@ -141,76 +141,76 @@ bool OutdoorPvPSI::HandleDropFlag(Player* player, uint32 spellId) // if it was dropped away from the player's turn-in point, then create a silithyst mound, if it was dropped near the areatrigger, then it was dispelled by the outdoorpvp, so do nothing switch (player->GetTeamId()) { - case TEAM_ALLIANCE: - { - AreaTrigger const* atEntry = sObjectMgr->GetAreaTrigger(SI_AREATRIGGER_A); - if (atEntry) + case TEAM_ALLIANCE: { - // 5.0f is safe-distance - if (player->GetDistance(atEntry->x, atEntry->y, atEntry->z) > 5.0f + atEntry->radius) + AreaTrigger const* atEntry = sObjectMgr->GetAreaTrigger(SI_AREATRIGGER_A); + if (atEntry) { - // he dropped it further, summon mound - GameObject* go = sObjectMgr->IsGameObjectStaticTransport(SI_SILITHYST_MOUND) ? new StaticTransport() : new GameObject(); - Map* map = player->GetMap(); - if (!map) + // 5.0f is safe-distance + if (player->GetDistance(atEntry->x, atEntry->y, atEntry->z) > 5.0f + atEntry->radius) { - delete go; - return true; - } + // he dropped it further, summon mound + GameObject* go = sObjectMgr->IsGameObjectStaticTransport(SI_SILITHYST_MOUND) ? new StaticTransport() : new GameObject(); + Map* map = player->GetMap(); + if (!map) + { + delete go; + return true; + } - if (!go->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_GAMEOBJECT), SI_SILITHYST_MOUND, map, player->GetPhaseMask(), player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetOrientation(), G3D::Quat(), 100, GO_STATE_READY)) - { - delete go; - return true; - } + if (!go->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_GAMEOBJECT), SI_SILITHYST_MOUND, map, player->GetPhaseMask(), player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetOrientation(), G3D::Quat(), 100, GO_STATE_READY)) + { + delete go; + return true; + } - go->SetRespawnTime(0); + go->SetRespawnTime(0); - if (!map->AddToMap(go)) - { - delete go; - return true; + if (!map->AddToMap(go)) + { + delete go; + return true; + } } } } - } - break; - case TEAM_HORDE: - { - AreaTrigger const* atEntry = sObjectMgr->GetAreaTrigger(SI_AREATRIGGER_H); - if (atEntry) + break; + case TEAM_HORDE: { - // 5.0f is safe-distance - if (player->GetDistance(atEntry->x, atEntry->y, atEntry->z) > 5.0f + atEntry->radius) + AreaTrigger const* atEntry = sObjectMgr->GetAreaTrigger(SI_AREATRIGGER_H); + if (atEntry) { - // he dropped it further, summon mound - GameObject* go = sObjectMgr->IsGameObjectStaticTransport(SI_SILITHYST_MOUND) ? new StaticTransport() : new GameObject(); - Map* map = player->GetMap(); - if (!map) + // 5.0f is safe-distance + if (player->GetDistance(atEntry->x, atEntry->y, atEntry->z) > 5.0f + atEntry->radius) { - delete go; - return true; - } + // he dropped it further, summon mound + GameObject* go = sObjectMgr->IsGameObjectStaticTransport(SI_SILITHYST_MOUND) ? new StaticTransport() : new GameObject(); + Map* map = player->GetMap(); + if (!map) + { + delete go; + return true; + } - if (!go->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_GAMEOBJECT), SI_SILITHYST_MOUND, map, player->GetPhaseMask(), player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetOrientation(), G3D::Quat(), 100, GO_STATE_READY)) - { - delete go; - return true; - } + if (!go->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_GAMEOBJECT), SI_SILITHYST_MOUND, map, player->GetPhaseMask(), player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetOrientation(), G3D::Quat(), 100, GO_STATE_READY)) + { + delete go; + return true; + } - go->SetRespawnTime(0); + go->SetRespawnTime(0); - if (!map->AddToMap(go)) - { - delete go; - return true; + if (!map->AddToMap(go)) + { + delete go; + return true; + } } } } - } - break; - default: - break; + break; + default: + break; } return true; } @@ -233,17 +233,17 @@ bool OutdoorPvPSI::HandleCustomSpell(Player* player, uint32 spellId, GameObject* class OutdoorPvP_silithus : public OutdoorPvPScript { - public: +public: - OutdoorPvP_silithus() - : OutdoorPvPScript("outdoorpvp_si") - { - } + OutdoorPvP_silithus() + : OutdoorPvPScript("outdoorpvp_si") + { + } - OutdoorPvP* GetOutdoorPvP() const - { - return new OutdoorPvPSI(); - } + OutdoorPvP* GetOutdoorPvP() const + { + return new OutdoorPvPSI(); + } }; void AddSC_outdoorpvp_si() diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPSI.h b/src/server/scripts/OutdoorPvP/OutdoorPvPSI.h index bfa8e38d8..4b5531e5e 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPSI.h +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPSI.h @@ -42,35 +42,35 @@ enum SI_WorldStates class OutdoorPvPSI : public OutdoorPvP { - public: +public: - OutdoorPvPSI(); + OutdoorPvPSI(); - bool SetupOutdoorPvP(); + bool SetupOutdoorPvP(); - void HandlePlayerEnterZone(Player* player, uint32 zone); - void HandlePlayerLeaveZone(Player* player, uint32 zone); + void HandlePlayerEnterZone(Player* player, uint32 zone); + void HandlePlayerLeaveZone(Player* player, uint32 zone); - bool Update(uint32 diff); + bool Update(uint32 diff); - void FillInitialWorldStates(WorldPacket &data); + void FillInitialWorldStates(WorldPacket& data); - void SendRemoveWorldStates(Player* player); + void SendRemoveWorldStates(Player* player); - bool HandleAreaTrigger(Player* player, uint32 trigger); + bool HandleAreaTrigger(Player* player, uint32 trigger); - bool HandleDropFlag(Player* player, uint32 spellId); + bool HandleDropFlag(Player* player, uint32 spellId); - bool HandleCustomSpell(Player* player, uint32 spellId, GameObject* go); + bool HandleCustomSpell(Player* player, uint32 spellId, GameObject* go); - void UpdateWorldState(); + void UpdateWorldState(); - private: +private: - uint32 m_Gathered_A; - uint32 m_Gathered_H; + uint32 m_Gathered_A; + uint32 m_Gathered_H; - TeamId m_LastController; + TeamId m_LastController; }; #endif diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPTF.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPTF.cpp index 5e1aa939c..ff70d8098 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPTF.cpp +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPTF.cpp @@ -31,19 +31,19 @@ OutdoorPvPTF::OutdoorPvPTF() } OPvPCapturePointTF::OPvPCapturePointTF(OutdoorPvP* pvp, OutdoorPvPTF_TowerType type) -: OPvPCapturePoint(pvp), m_TowerType(type), m_TowerState(TF_TOWERSTATE_N) + : OPvPCapturePoint(pvp), m_TowerType(type), m_TowerState(TF_TOWERSTATE_N) { SetCapturePointData(TFCapturePoints[type].entry, TFCapturePoints[type].map, TFCapturePoints[type].x, TFCapturePoints[type].y, TFCapturePoints[type].z, TFCapturePoints[type].o, TFCapturePoints[type].rot0, TFCapturePoints[type].rot1, TFCapturePoints[type].rot2, TFCapturePoints[type].rot3); } -void OPvPCapturePointTF::FillInitialWorldStates(WorldPacket &data) +void OPvPCapturePointTF::FillInitialWorldStates(WorldPacket& data) { data << uint32(TFTowerWorldStates[m_TowerType].n) << uint32(bool(m_TowerState & TF_TOWERSTATE_N)); data << uint32(TFTowerWorldStates[m_TowerType].h) << uint32(bool(m_TowerState & TF_TOWERSTATE_H)); data << uint32(TFTowerWorldStates[m_TowerType].a) << uint32(bool(m_TowerState & TF_TOWERSTATE_A)); } -void OutdoorPvPTF::FillInitialWorldStates(WorldPacket &data) +void OutdoorPvPTF::FillInitialWorldStates(WorldPacket& data) { data << TF_UI_TOWER_SLIDER_POS << uint32(50); data << TF_UI_TOWER_SLIDER_N << uint32(100); @@ -179,7 +179,8 @@ bool OutdoorPvPTF::Update(uint32 diff) SendUpdateWorldState(TF_UI_LOCKED_TIME_MINUTES_FIRST_DIGIT, first_digit); SendUpdateWorldState(TF_UI_LOCKED_TIME_MINUTES_SECOND_DIGIT, second_digit); SendUpdateWorldState(TF_UI_LOCKED_TIME_HOURS, hours_left); - } else m_LockTimerUpdate -= diff; + } + else m_LockTimerUpdate -= diff; m_LockTimer -= diff; } } @@ -262,7 +263,7 @@ bool OPvPCapturePointTF::Update(uint32 diff) { // can update even in locked state if gathers the controlling faction bool canupdate = ((((OutdoorPvPTF*)m_PvP)->GetAllianceTowersControlled() > 0) && m_activePlayers[0].size() > m_activePlayers[1].size()) || - ((((OutdoorPvPTF*)m_PvP)->GetHordeTowersControlled() > 0) && m_activePlayers[0].size() < m_activePlayers[1].size()); + ((((OutdoorPvPTF*)m_PvP)->GetHordeTowersControlled() > 0) && m_activePlayers[0].size() < m_activePlayers[1].size()); // if gathers the other faction, then only update if the pvp is unlocked canupdate = canupdate || !((OutdoorPvPTF*)m_PvP)->IsLocked(); return canupdate && OPvPCapturePoint::Update(diff); @@ -289,43 +290,43 @@ void OPvPCapturePointTF::ChangeState() switch (m_State) { - case OBJECTIVESTATE_ALLIANCE: - { - m_TowerState = TF_TOWERSTATE_A; - artkit = 2; - uint32 alliance_towers = ((OutdoorPvPTF*)m_PvP)->GetAllianceTowersControlled(); - if (alliance_towers < TF_TOWER_NUM) - ((OutdoorPvPTF*)m_PvP)->SetAllianceTowersControlled(++alliance_towers); + case OBJECTIVESTATE_ALLIANCE: + { + m_TowerState = TF_TOWERSTATE_A; + artkit = 2; + uint32 alliance_towers = ((OutdoorPvPTF*)m_PvP)->GetAllianceTowersControlled(); + if (alliance_towers < TF_TOWER_NUM) + ((OutdoorPvPTF*)m_PvP)->SetAllianceTowersControlled(++alliance_towers); - sWorld->SendZoneText(OutdoorPvPTFBuffZones[0], sObjectMgr->GetAcoreStringForDBCLocale(LANG_OPVP_TF_CAPTURE_A)); + sWorld->SendZoneText(OutdoorPvPTFBuffZones[0], sObjectMgr->GetAcoreStringForDBCLocale(LANG_OPVP_TF_CAPTURE_A)); - for (PlayerSet::iterator itr = m_activePlayers[0].begin(); itr != m_activePlayers[0].end(); ++itr) - if (Player* player = ObjectAccessor::FindPlayer(*itr)) - player->AreaExploredOrEventHappens(TF_ALLY_QUEST); - break; - } - case OBJECTIVESTATE_HORDE: - { - m_TowerState = TF_TOWERSTATE_H; - artkit = 1; - uint32 horde_towers = ((OutdoorPvPTF*)m_PvP)->GetHordeTowersControlled(); - if (horde_towers < TF_TOWER_NUM) - ((OutdoorPvPTF*)m_PvP)->SetHordeTowersControlled(++horde_towers); + for (PlayerSet::iterator itr = m_activePlayers[0].begin(); itr != m_activePlayers[0].end(); ++itr) + if (Player* player = ObjectAccessor::FindPlayer(*itr)) + player->AreaExploredOrEventHappens(TF_ALLY_QUEST); + break; + } + case OBJECTIVESTATE_HORDE: + { + m_TowerState = TF_TOWERSTATE_H; + artkit = 1; + uint32 horde_towers = ((OutdoorPvPTF*)m_PvP)->GetHordeTowersControlled(); + if (horde_towers < TF_TOWER_NUM) + ((OutdoorPvPTF*)m_PvP)->SetHordeTowersControlled(++horde_towers); - sWorld->SendZoneText(OutdoorPvPTFBuffZones[0], sObjectMgr->GetAcoreStringForDBCLocale(LANG_OPVP_TF_CAPTURE_H)); + sWorld->SendZoneText(OutdoorPvPTFBuffZones[0], sObjectMgr->GetAcoreStringForDBCLocale(LANG_OPVP_TF_CAPTURE_H)); - for (PlayerSet::iterator itr = m_activePlayers[1].begin(); itr != m_activePlayers[1].end(); ++itr) - if (Player* player = ObjectAccessor::FindPlayer(*itr)) - player->AreaExploredOrEventHappens(TF_HORDE_QUEST); - break; - } - case OBJECTIVESTATE_NEUTRAL: - case OBJECTIVESTATE_NEUTRAL_ALLIANCE_CHALLENGE: - case OBJECTIVESTATE_NEUTRAL_HORDE_CHALLENGE: - case OBJECTIVESTATE_ALLIANCE_HORDE_CHALLENGE: - case OBJECTIVESTATE_HORDE_ALLIANCE_CHALLENGE: - m_TowerState = TF_TOWERSTATE_N; - break; + for (PlayerSet::iterator itr = m_activePlayers[1].begin(); itr != m_activePlayers[1].end(); ++itr) + if (Player* player = ObjectAccessor::FindPlayer(*itr)) + player->AreaExploredOrEventHappens(TF_HORDE_QUEST); + break; + } + case OBJECTIVESTATE_NEUTRAL: + case OBJECTIVESTATE_NEUTRAL_ALLIANCE_CHALLENGE: + case OBJECTIVESTATE_NEUTRAL_HORDE_CHALLENGE: + case OBJECTIVESTATE_ALLIANCE_HORDE_CHALLENGE: + case OBJECTIVESTATE_HORDE_ALLIANCE_CHALLENGE: + m_TowerState = TF_TOWERSTATE_N; + break; } GameObject* flag = HashMapHolder::Find(m_capturePointGUID); @@ -348,17 +349,17 @@ void OPvPCapturePointTF::SendChangePhase() class OutdoorPvP_terokkar_forest : public OutdoorPvPScript { - public: +public: - OutdoorPvP_terokkar_forest() - : OutdoorPvPScript("outdoorpvp_tf") - { - } + OutdoorPvP_terokkar_forest() + : OutdoorPvPScript("outdoorpvp_tf") + { + } - OutdoorPvP* GetOutdoorPvP() const - { - return new OutdoorPvPTF(); - } + OutdoorPvP* GetOutdoorPvP() const + { + return new OutdoorPvPTF(); + } }; void AddSC_outdoorpvp_tf() diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPTF.h b/src/server/scripts/OutdoorPvP/OutdoorPvPTF.h index 14014d84a..4e7a0f67a 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPTF.h +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPTF.h @@ -112,66 +112,66 @@ enum TFTowerStates class OPvPCapturePointTF : public OPvPCapturePoint { - public: +public: - OPvPCapturePointTF(OutdoorPvP* pvp, OutdoorPvPTF_TowerType type); + OPvPCapturePointTF(OutdoorPvP* pvp, OutdoorPvPTF_TowerType type); - bool Update(uint32 diff); + bool Update(uint32 diff); - void ChangeState(); + void ChangeState(); - void SendChangePhase(); + void SendChangePhase(); - void FillInitialWorldStates(WorldPacket & data); + void FillInitialWorldStates(WorldPacket& data); - // used when player is activated/inactivated in the area - bool HandlePlayerEnter(Player* player); - void HandlePlayerLeave(Player* player); + // used when player is activated/inactivated in the area + bool HandlePlayerEnter(Player* player); + void HandlePlayerLeave(Player* player); - void UpdateTowerState(); + void UpdateTowerState(); - protected: +protected: - OutdoorPvPTF_TowerType m_TowerType; + OutdoorPvPTF_TowerType m_TowerType; - uint32 m_TowerState; + uint32 m_TowerState; }; class OutdoorPvPTF : public OutdoorPvP { - public: +public: - OutdoorPvPTF(); + OutdoorPvPTF(); - bool SetupOutdoorPvP(); + bool SetupOutdoorPvP(); - void HandlePlayerEnterZone(Player* player, uint32 zone); - void HandlePlayerLeaveZone(Player* player, uint32 zone); + void HandlePlayerEnterZone(Player* player, uint32 zone); + void HandlePlayerLeaveZone(Player* player, uint32 zone); - bool Update(uint32 diff); + bool Update(uint32 diff); - void FillInitialWorldStates(WorldPacket &data); + void FillInitialWorldStates(WorldPacket& data); - void SendRemoveWorldStates(Player* player); + void SendRemoveWorldStates(Player* player); - uint32 GetAllianceTowersControlled() const; - void SetAllianceTowersControlled(uint32 count); + uint32 GetAllianceTowersControlled() const; + void SetAllianceTowersControlled(uint32 count); - uint32 GetHordeTowersControlled() const; - void SetHordeTowersControlled(uint32 count); + uint32 GetHordeTowersControlled() const; + void SetHordeTowersControlled(uint32 count); - bool IsLocked() const; + bool IsLocked() const; - private: +private: - bool m_IsLocked; - uint32 m_LockTimer; - uint32 m_LockTimerUpdate; + bool m_IsLocked; + uint32 m_LockTimer; + uint32 m_LockTimerUpdate; - uint32 m_AllianceTowersControlled; - uint32 m_HordeTowersControlled; + uint32 m_AllianceTowersControlled; + uint32 m_HordeTowersControlled; - uint32 hours_left, second_digit, first_digit; + uint32 hours_left, second_digit, first_digit; }; #endif diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPZM.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPZM.cpp index be6e1036d..ce3c6ff27 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPZM.cpp +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPZM.cpp @@ -17,12 +17,12 @@ #include "GameGraveyard.h" OPvPCapturePointZM_Beacon::OPvPCapturePointZM_Beacon(OutdoorPvP* pvp, ZM_BeaconType type) -: OPvPCapturePoint(pvp), m_TowerType(type), m_TowerState(ZM_TOWERSTATE_N) + : OPvPCapturePoint(pvp), m_TowerType(type), m_TowerState(ZM_TOWERSTATE_N) { SetCapturePointData(ZMCapturePoints[type].entry, ZMCapturePoints[type].map, ZMCapturePoints[type].x, ZMCapturePoints[type].y, ZMCapturePoints[type].z, ZMCapturePoints[type].o, ZMCapturePoints[type].rot0, ZMCapturePoints[type].rot1, ZMCapturePoints[type].rot2, ZMCapturePoints[type].rot3); } -void OPvPCapturePointZM_Beacon::FillInitialWorldStates(WorldPacket &data) +void OPvPCapturePointZM_Beacon::FillInitialWorldStates(WorldPacket& data) { data << uint32(ZMBeaconInfo[m_TowerType].ui_tower_n) << uint32(bool(m_TowerState & ZM_TOWERSTATE_N)); data << uint32(ZMBeaconInfo[m_TowerType].map_tower_n) << uint32(bool(m_TowerState & ZM_TOWERSTATE_N)); @@ -81,23 +81,23 @@ void OPvPCapturePointZM_Beacon::ChangeState() switch (m_State) { case OBJECTIVESTATE_ALLIANCE: - { - m_TowerState = ZM_TOWERSTATE_A; - uint32 alliance_towers = ((OutdoorPvPZM*)m_PvP)->GetAllianceTowersControlled(); - if (alliance_towers < ZM_NUM_BEACONS) - ((OutdoorPvPZM*)m_PvP)->SetAllianceTowersControlled(++alliance_towers); - sWorld->SendZoneText(ZM_GRAVEYARD_ZONE, sObjectMgr->GetAcoreStringForDBCLocale(ZMBeaconCaptureA[m_TowerType])); - break; - } + { + m_TowerState = ZM_TOWERSTATE_A; + uint32 alliance_towers = ((OutdoorPvPZM*)m_PvP)->GetAllianceTowersControlled(); + if (alliance_towers < ZM_NUM_BEACONS) + ((OutdoorPvPZM*)m_PvP)->SetAllianceTowersControlled(++alliance_towers); + sWorld->SendZoneText(ZM_GRAVEYARD_ZONE, sObjectMgr->GetAcoreStringForDBCLocale(ZMBeaconCaptureA[m_TowerType])); + break; + } case OBJECTIVESTATE_HORDE: - { - m_TowerState = ZM_TOWERSTATE_H; - uint32 horde_towers = ((OutdoorPvPZM*)m_PvP)->GetHordeTowersControlled(); - if (horde_towers < ZM_NUM_BEACONS) - ((OutdoorPvPZM*)m_PvP)->SetHordeTowersControlled(++horde_towers); - sWorld->SendZoneText(ZM_GRAVEYARD_ZONE, sObjectMgr->GetAcoreStringForDBCLocale(ZMBeaconCaptureH[m_TowerType])); - break; - } + { + m_TowerState = ZM_TOWERSTATE_H; + uint32 horde_towers = ((OutdoorPvPZM*)m_PvP)->GetHordeTowersControlled(); + if (horde_towers < ZM_NUM_BEACONS) + ((OutdoorPvPZM*)m_PvP)->SetHordeTowersControlled(++horde_towers); + sWorld->SendZoneText(ZM_GRAVEYARD_ZONE, sObjectMgr->GetAcoreStringForDBCLocale(ZMBeaconCaptureH[m_TowerType])); + break; + } case OBJECTIVESTATE_NEUTRAL: case OBJECTIVESTATE_NEUTRAL_ALLIANCE_CHALLENGE: case OBJECTIVESTATE_NEUTRAL_HORDE_CHALLENGE: @@ -240,7 +240,7 @@ int32 OPvPCapturePointZM_GraveYard::HandleOpenGo(Player* player, uint64 guid) } OPvPCapturePointZM_GraveYard::OPvPCapturePointZM_GraveYard(OutdoorPvP* pvp) -: OPvPCapturePoint(pvp) + : OPvPCapturePoint(pvp) { m_BothControllingFactionId = TEAM_NEUTRAL; m_GraveYardState = ZM_GRAVEYARD_N; @@ -264,7 +264,7 @@ void OPvPCapturePointZM_GraveYard::UpdateTowerState() m_PvP->SendUpdateWorldState(ZM_MAP_HORDE_FLAG_NOT_READY, uint32(m_BothControllingFactionId != TEAM_HORDE)); } -void OPvPCapturePointZM_GraveYard::FillInitialWorldStates(WorldPacket &data) +void OPvPCapturePointZM_GraveYard::FillInitialWorldStates(WorldPacket& data) { data << ZM_MAP_GRAVEYARD_N << uint32(bool(m_GraveYardState & ZM_GRAVEYARD_N)); data << ZM_MAP_GRAVEYARD_H << uint32(bool(m_GraveYardState & ZM_GRAVEYARD_H)); @@ -285,37 +285,37 @@ void OPvPCapturePointZM_GraveYard::SetBeaconState(TeamId controlling_factionId) switch (controlling_factionId) { - case TEAM_ALLIANCE: - // if ally already controls the gy and taken back both beacons, return, nothing to do for us - if (m_GraveYardState & ZM_GRAVEYARD_A) - return; - // ally doesn't control the gy, but controls the side beacons -> add gossip option, add neutral banner - break; - case TEAM_HORDE: - // if horde already controls the gy and taken back both beacons, return, nothing to do for us - if (m_GraveYardState & ZM_GRAVEYARD_H) - return; - // horde doesn't control the gy, but controls the side beacons -> add gossip option, add neutral banner - break; - default: - // if the graveyard is not neutral, then leave it that way - // if the graveyard is neutral, then we have to dispel the buff from the flag carrier - if (m_GraveYardState & ZM_GRAVEYARD_N) - { - // gy was neutral, thus neutral banner was spawned, it is possible that someone was taking the flag to the gy - if (m_FlagCarrierGUID) + case TEAM_ALLIANCE: + // if ally already controls the gy and taken back both beacons, return, nothing to do for us + if (m_GraveYardState & ZM_GRAVEYARD_A) + return; + // ally doesn't control the gy, but controls the side beacons -> add gossip option, add neutral banner + break; + case TEAM_HORDE: + // if horde already controls the gy and taken back both beacons, return, nothing to do for us + if (m_GraveYardState & ZM_GRAVEYARD_H) + return; + // horde doesn't control the gy, but controls the side beacons -> add gossip option, add neutral banner + break; + default: + // if the graveyard is not neutral, then leave it that way + // if the graveyard is neutral, then we have to dispel the buff from the flag carrier + if (m_GraveYardState & ZM_GRAVEYARD_N) { - // remove flag from carrier, reset flag carrier guid - Player* p = ObjectAccessor::FindPlayer(m_FlagCarrierGUID); - if (p) + // gy was neutral, thus neutral banner was spawned, it is possible that someone was taking the flag to the gy + if (m_FlagCarrierGUID) { - p->RemoveAurasDueToSpell(ZM_BATTLE_STANDARD_A); - p->RemoveAurasDueToSpell(ZM_BATTLE_STANDARD_H); + // remove flag from carrier, reset flag carrier guid + Player* p = ObjectAccessor::FindPlayer(m_FlagCarrierGUID); + if (p) + { + p->RemoveAurasDueToSpell(ZM_BATTLE_STANDARD_A); + p->RemoveAurasDueToSpell(ZM_BATTLE_STANDARD_H); + } + m_FlagCarrierGUID = 0; } - m_FlagCarrierGUID = 0; } - } - break; + break; } // send worldstateupdate UpdateTowerState(); @@ -367,12 +367,12 @@ bool OPvPCapturePointZM_GraveYard::HandleDropFlag(Player* /*player*/, uint32 spe { switch (spellId) { - case ZM_BATTLE_STANDARD_A: - m_FlagCarrierGUID = 0; - return true; - case ZM_BATTLE_STANDARD_H: - m_FlagCarrierGUID = 0; - return true; + case ZM_BATTLE_STANDARD_A: + m_FlagCarrierGUID = 0; + return true; + case ZM_BATTLE_STANDARD_H: + m_FlagCarrierGUID = 0; + return true; } return false; } @@ -402,7 +402,7 @@ void OutdoorPvPZM::SetHordeTowersControlled(uint32 count) m_HordeTowersControlled = count; } -void OutdoorPvPZM::FillInitialWorldStates(WorldPacket &data) +void OutdoorPvPZM::FillInitialWorldStates(WorldPacket& data) { data << ZM_WORLDSTATE_UNK_1 << uint32(1); for (OPvPCapturePointMap::iterator itr = m_capturePoints.begin(); itr != m_capturePoints.end(); ++itr) @@ -443,17 +443,17 @@ void OutdoorPvPZM::SendRemoveWorldStates(Player* player) class OutdoorPvP_zangarmarsh : public OutdoorPvPScript { - public: +public: - OutdoorPvP_zangarmarsh() - : OutdoorPvPScript("outdoorpvp_zm") - { - } + OutdoorPvP_zangarmarsh() + : OutdoorPvPScript("outdoorpvp_zm") + { + } - OutdoorPvP* GetOutdoorPvP() const - { - return new OutdoorPvPZM(); - } + OutdoorPvP* GetOutdoorPvP() const + { + return new OutdoorPvPZM(); + } }; void AddSC_outdoorpvp_zm() diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPZM.h b/src/server/scripts/OutdoorPvP/OutdoorPvPZM.h index 1e7371063..0242b8584 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPZM.h +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPZM.h @@ -157,26 +157,26 @@ class OutdoorPvPZM; class OPvPCapturePointZM_Beacon : public OPvPCapturePoint { - public: +public: - OPvPCapturePointZM_Beacon(OutdoorPvP* pvp, ZM_BeaconType type); + OPvPCapturePointZM_Beacon(OutdoorPvP* pvp, ZM_BeaconType type); - void ChangeState(); + void ChangeState(); - void SendChangePhase(); + void SendChangePhase(); - void FillInitialWorldStates(WorldPacket & data); + void FillInitialWorldStates(WorldPacket& data); - // used when player is activated/inactivated in the area - bool HandlePlayerEnter(Player* player); - void HandlePlayerLeave(Player* player); + // used when player is activated/inactivated in the area + bool HandlePlayerEnter(Player* player); + void HandlePlayerLeave(Player* player); - void UpdateTowerState(); + void UpdateTowerState(); - protected: +protected: - ZM_BeaconType m_TowerType; - uint32 m_TowerState; + ZM_BeaconType m_TowerType; + uint32 m_TowerState; }; enum ZM_GraveYardState @@ -188,71 +188,71 @@ enum ZM_GraveYardState class OPvPCapturePointZM_GraveYard : public OPvPCapturePoint { - public: +public: - OPvPCapturePointZM_GraveYard(OutdoorPvP* pvp); + OPvPCapturePointZM_GraveYard(OutdoorPvP* pvp); - bool Update(uint32 diff); + bool Update(uint32 diff); - void ChangeState() {} + void ChangeState() {} - void FillInitialWorldStates(WorldPacket & data); + void FillInitialWorldStates(WorldPacket& data); - void UpdateTowerState(); + void UpdateTowerState(); - int32 HandleOpenGo(Player* player, uint64 guid); + int32 HandleOpenGo(Player* player, uint64 guid); - void SetBeaconState(TeamId controlling_teamId); // not good atm + void SetBeaconState(TeamId controlling_teamId); // not good atm - bool HandleGossipOption(Player* player, uint64 guid, uint32 gossipid); + bool HandleGossipOption(Player* player, uint64 guid, uint32 gossipid); - bool HandleDropFlag(Player* player, uint32 spellId); + bool HandleDropFlag(Player* player, uint32 spellId); - bool CanTalkTo(Player* player, Creature* creature, GossipMenuItems const& gso); + bool CanTalkTo(Player* player, Creature* creature, GossipMenuItems const& gso); - uint32 GetGraveYardState() const; + uint32 GetGraveYardState() const; - private: +private: - uint32 m_GraveYardState; + uint32 m_GraveYardState; - protected: +protected: - TeamId m_BothControllingFactionId; - uint64 m_FlagCarrierGUID; + TeamId m_BothControllingFactionId; + uint64 m_FlagCarrierGUID; }; class OutdoorPvPZM : public OutdoorPvP { - public: +public: - OutdoorPvPZM(); + OutdoorPvPZM(); - bool SetupOutdoorPvP(); + bool SetupOutdoorPvP(); - void HandlePlayerEnterZone(Player* player, uint32 zone); - void HandlePlayerLeaveZone(Player* player, uint32 zone); + void HandlePlayerEnterZone(Player* player, uint32 zone); + void HandlePlayerLeaveZone(Player* player, uint32 zone); - bool Update(uint32 diff); + bool Update(uint32 diff); - void FillInitialWorldStates(WorldPacket &data); + void FillInitialWorldStates(WorldPacket& data); - void SendRemoveWorldStates(Player* player); + void SendRemoveWorldStates(Player* player); - void HandleKillImpl(Player* player, Unit* killed); + void HandleKillImpl(Player* player, Unit* killed); - uint32 GetAllianceTowersControlled() const; - void SetAllianceTowersControlled(uint32 count); + uint32 GetAllianceTowersControlled() const; + void SetAllianceTowersControlled(uint32 count); - uint32 GetHordeTowersControlled() const; - void SetHordeTowersControlled(uint32 count); + uint32 GetHordeTowersControlled() const; + void SetHordeTowersControlled(uint32 count); - private: +private: - OPvPCapturePointZM_GraveYard * m_GraveYard; + OPvPCapturePointZM_GraveYard* m_GraveYard; - uint32 m_AllianceTowersControlled; - uint32 m_HordeTowersControlled; + uint32 m_AllianceTowersControlled; + uint32 m_HordeTowersControlled; }; // todo: flag carrier death/leave/mount/activitychange should give back the gossip options diff --git a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp index 312b2852d..7ce029595 100644 --- a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp +++ b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp @@ -76,7 +76,7 @@ public: void KilledUnit(Unit*) { - if (urand(0,1)) + if (urand(0, 1)) Talk(SAY_SLAY); } diff --git a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp index 61eb1dafd..7a55b024d 100644 --- a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp +++ b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp @@ -102,7 +102,7 @@ public: if (eventId == EVENT_SPELL_INHIBIT_MAGIC) { - Map::PlayerList const &PlayerList = me->GetMap()->GetPlayers(); + Map::PlayerList const& PlayerList = me->GetMap()->GetPlayers(); for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) if (Player* player = i->GetSource()) { @@ -172,51 +172,51 @@ public: class spell_auchenai_possess : public SpellScriptLoader { - public: - spell_auchenai_possess() : SpellScriptLoader("spell_auchenai_possess") { } +public: + spell_auchenai_possess() : SpellScriptLoader("spell_auchenai_possess") { } - class spell_auchenai_possess_AuraScript : public AuraScript + class spell_auchenai_possess_AuraScript : public AuraScript + { + PrepareAuraScript(spell_auchenai_possess_AuraScript); + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_auchenai_possess_AuraScript); - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) - if (Unit* target = GetTarget()) - caster->CastSpell(target, 32830 /*POSSESS*/, true); - } - - void CalcPeriodic(AuraEffect const* /*effect*/, bool& isPeriodic, int32& amplitude) - { - isPeriodic = true; - amplitude = 2000; - } - - void Update(AuraEffect* /*effect*/) - { - // Xinef: Charm is removed when target is at or below 50%hp - if (Unit* owner = GetUnitOwner()) - if (owner->GetHealthPct() <= 50) - SetDuration(0); - } - - void Register() - { - // Base channel - if (m_scriptSpellId == 33401) - OnEffectRemove += AuraEffectRemoveFn(spell_auchenai_possess_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); - else - { - DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_auchenai_possess_AuraScript::CalcPeriodic, EFFECT_0, SPELL_AURA_MOD_CHARM); - OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_auchenai_possess_AuraScript::Update, EFFECT_0, SPELL_AURA_MOD_CHARM); - } - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_auchenai_possess_AuraScript(); + if (Unit* caster = GetCaster()) + if (Unit* target = GetTarget()) + caster->CastSpell(target, 32830 /*POSSESS*/, true); } + + void CalcPeriodic(AuraEffect const* /*effect*/, bool& isPeriodic, int32& amplitude) + { + isPeriodic = true; + amplitude = 2000; + } + + void Update(AuraEffect* /*effect*/) + { + // Xinef: Charm is removed when target is at or below 50%hp + if (Unit* owner = GetUnitOwner()) + if (owner->GetHealthPct() <= 50) + SetDuration(0); + } + + void Register() + { + // Base channel + if (m_scriptSpellId == 33401) + OnEffectRemove += AuraEffectRemoveFn(spell_auchenai_possess_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + else + { + DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_auchenai_possess_AuraScript::CalcPeriodic, EFFECT_0, SPELL_AURA_MOD_CHARM); + OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_auchenai_possess_AuraScript::Update, EFFECT_0, SPELL_AURA_MOD_CHARM); + } + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_auchenai_possess_AuraScript(); + } }; void AddSC_boss_shirrak_the_dead_watcher() diff --git a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/instance_auchenai_crypts.cpp b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/instance_auchenai_crypts.cpp index bfcb17643..19e37b63e 100644 --- a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/instance_auchenai_crypts.cpp +++ b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/instance_auchenai_crypts.cpp @@ -22,25 +22,25 @@ class instance_auchenai_crypts : public InstanceMapScript { - public: - instance_auchenai_crypts() : InstanceMapScript(ACScriptName, 558) { } +public: + instance_auchenai_crypts() : InstanceMapScript(ACScriptName, 558) { } - struct instance_auchenai_crypts_InstanceMapScript : public InstanceScript + struct instance_auchenai_crypts_InstanceMapScript : public InstanceScript + { + instance_auchenai_crypts_InstanceMapScript(Map* map) : InstanceScript(map) { - instance_auchenai_crypts_InstanceMapScript(Map* map) : InstanceScript(map) - { - SetBossNumber(EncounterCount); - } - - void Load(char const* data) override { LoadBossState(data); } - - std::string GetSaveData() override { return DataHeader + GetBossSaveData(); } - }; - - InstanceScript* GetInstanceScript(InstanceMap* map) const override - { - return new instance_auchenai_crypts_InstanceMapScript(map); + SetBossNumber(EncounterCount); } + + void Load(char const* data) override { LoadBossState(data); } + + std::string GetSaveData() override { return DataHeader + GetBossSaveData(); } + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const override + { + return new instance_auchenai_crypts_InstanceMapScript(map); + } }; void AddSC_instance_auchenai_crypts() diff --git a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp index 26fbd078f..b8bfae7e8 100644 --- a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp +++ b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp @@ -34,126 +34,126 @@ enum ePrince class boss_nexusprince_shaffar : public CreatureScript { - public: - boss_nexusprince_shaffar() : CreatureScript("boss_nexusprince_shaffar") { } +public: + boss_nexusprince_shaffar() : CreatureScript("boss_nexusprince_shaffar") { } - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const + { + return new boss_nexusprince_shaffarAI (creature); + } + + struct boss_nexusprince_shaffarAI : public ScriptedAI + { + boss_nexusprince_shaffarAI(Creature* creature) : ScriptedAI(creature), summons(me) { - return new boss_nexusprince_shaffarAI (creature); + HasTaunted = false; } - struct boss_nexusprince_shaffarAI : public ScriptedAI + EventMap events; + SummonList summons; + bool HasTaunted; + + void Reset() { - boss_nexusprince_shaffarAI(Creature* creature) : ScriptedAI(creature), summons(me) + float dist = 8.0f; + float posX, posY, posZ, angle; + me->GetHomePosition(posX, posY, posZ, angle); + + summons.DespawnAll(); + events.Reset(); + me->SummonCreature(NPC_BEACON, posX - dist, posY - dist, posZ, angle, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 7200000); + me->SummonCreature(NPC_BEACON, posX - dist, posY + dist, posZ, angle, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 7200000); + me->SummonCreature(NPC_BEACON, posX + dist, posY, posZ, angle, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 7200000); + } + + void MoveInLineOfSight(Unit* who) + { + if (!HasTaunted && who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 100.0f)) { - HasTaunted = false; + Talk(SAY_INTRO); + HasTaunted = true; + } + } + + void EnterCombat(Unit*) + { + Talk(SAY_AGGRO); + + me->SetInCombatWithZone(); + summons.DoZoneInCombat(); + + events.ScheduleEvent(EVENT_SPELL_BEACON, 10000); + events.ScheduleEvent(EVENT_SPELL_FR_FI, 4000); + events.ScheduleEvent(EVENT_SPELL_FROST_NOVA, 15000); + } + + void JustSummoned(Creature* summon) + { + if (me->IsInCombat() && summon->GetEntry() == NPC_BEACON) + { + summon->CastSpell(summon, SPELL_ETHEREAL_BEACON_VISUAL, false); + if (Unit* target = SelectTargetFromPlayerList(50.0f)) + summon->AI()->AttackStart(target); } - EventMap events; - SummonList summons; - bool HasTaunted; + summons.Summon(summon); + } - void Reset() + void SummonedCreatureDespawn(Creature* summon) + { + summons.Despawn(summon); + } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + + void JustDied(Unit* /*killer*/) + { + Talk(SAY_DEAD); + summons.DespawnAll(); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.GetEvent()) { - float dist = 8.0f; - float posX, posY, posZ, angle; - me->GetHomePosition(posX, posY, posZ, angle); + case EVENT_SPELL_FROST_NOVA: + me->CastSpell(me, SPELL_FROSTNOVA, false); + events.RepeatEvent(urand(16000, 23000)); + events.DelayEvents(1500); + events.ScheduleEvent(EVENT_SPELL_BLINK, 1500); + break; + case EVENT_SPELL_FR_FI: + me->CastSpell(me->GetVictim(), RAND(SPELL_FROSTBOLT, SPELL_FIREBALL), false); + events.RepeatEvent(urand(3000, 4000)); + break; + case EVENT_SPELL_BLINK: + me->CastSpell(me, SPELL_BLINK, false); + events.PopEvent(); + events.RescheduleEvent(EVENT_SPELL_FR_FI, 0); + break; + case EVENT_SPELL_BEACON: + if (!urand(0, 3)) + Talk(SAY_SUMMON); - summons.DespawnAll(); - events.Reset(); - me->SummonCreature(NPC_BEACON, posX - dist, posY - dist, posZ, angle, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 7200000); - me->SummonCreature(NPC_BEACON, posX - dist, posY + dist, posZ, angle, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 7200000); - me->SummonCreature(NPC_BEACON, posX + dist, posY, posZ, angle, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 7200000); + me->CastSpell(me, SPELL_ETHEREAL_BEACON, true); + events.RepeatEvent(10000); + break; } - void MoveInLineOfSight(Unit* who) - { - if (!HasTaunted && who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 100.0f)) - { - Talk(SAY_INTRO); - HasTaunted = true; - } - } - - void EnterCombat(Unit*) - { - Talk(SAY_AGGRO); - - me->SetInCombatWithZone(); - summons.DoZoneInCombat(); - - events.ScheduleEvent(EVENT_SPELL_BEACON, 10000); - events.ScheduleEvent(EVENT_SPELL_FR_FI, 4000); - events.ScheduleEvent(EVENT_SPELL_FROST_NOVA, 15000); - } - - void JustSummoned(Creature* summon) - { - if (me->IsInCombat() && summon->GetEntry() == NPC_BEACON) - { - summon->CastSpell(summon, SPELL_ETHEREAL_BEACON_VISUAL, false); - if (Unit* target = SelectTargetFromPlayerList(50.0f)) - summon->AI()->AttackStart(target); - } - - summons.Summon(summon); - } - - void SummonedCreatureDespawn(Creature* summon) - { - summons.Despawn(summon); - } - - void KilledUnit(Unit* victim) - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_SLAY); - } - - void JustDied(Unit* /*killer*/) - { - Talk(SAY_DEAD); - summons.DespawnAll(); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.GetEvent()) - { - case EVENT_SPELL_FROST_NOVA: - me->CastSpell(me, SPELL_FROSTNOVA, false); - events.RepeatEvent(urand(16000, 23000)); - events.DelayEvents(1500); - events.ScheduleEvent(EVENT_SPELL_BLINK, 1500); - break; - case EVENT_SPELL_FR_FI: - me->CastSpell(me->GetVictim(), RAND(SPELL_FROSTBOLT, SPELL_FIREBALL), false); - events.RepeatEvent(urand(3000, 4000)); - break; - case EVENT_SPELL_BLINK: - me->CastSpell(me, SPELL_BLINK, false); - events.PopEvent(); - events.RescheduleEvent(EVENT_SPELL_FR_FI, 0); - break; - case EVENT_SPELL_BEACON: - if (!urand(0, 3)) - Talk(SAY_SUMMON); - - me->CastSpell(me, SPELL_ETHEREAL_BEACON, true); - events.RepeatEvent(10000); - break; - } - - DoMeleeAttackIfReady(); - } - }; + DoMeleeAttackIfReady(); + } + }; }; enum Yor @@ -194,13 +194,13 @@ public: { switch (eventId) { - case EVENT_DOUBLE_BREATH: - if (me->IsWithinDist(me->GetVictim(), ATTACK_DISTANCE)) - DoCastVictim(SPELL_DOUBLE_BREATH); - events.ScheduleEvent(EVENT_DOUBLE_BREATH, urand(6000, 9000)); - break; - default: - break; + case EVENT_DOUBLE_BREATH: + if (me->IsWithinDist(me->GetVictim(), ATTACK_DISTANCE)) + DoCastVictim(SPELL_DOUBLE_BREATH); + events.ScheduleEvent(EVENT_DOUBLE_BREATH, urand(6000, 9000)); + break; + default: + break; } } diff --git a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp index ea7631625..8bdca07e4 100644 --- a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp +++ b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp @@ -42,7 +42,7 @@ public: struct boss_pandemoniusAI : public ScriptedAI { boss_pandemoniusAI(Creature* creature) : ScriptedAI(creature) { } - + EventMap events; void Reset() @@ -83,43 +83,43 @@ public: switch (events.GetEvent()) { - case EVENT_VOID_BLAST: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) - { - DoCast(target, SPELL_VOID_BLAST); - ++VoidBlastCounter; - } + case EVENT_VOID_BLAST: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) + { + DoCast(target, SPELL_VOID_BLAST); + ++VoidBlastCounter; + } - if (VoidBlastCounter == 5) - { - VoidBlastCounter = 0; - events.RescheduleEvent(EVENT_VOID_BLAST, urand(15000, 25000)); - } - else - { - events.RescheduleEvent(EVENT_VOID_BLAST, 500); - events.DelayEvents(EVENT_DARK_SHELL, 500); - } - break; - case EVENT_DARK_SHELL: - if (me->IsNonMeleeSpellCast(false)) - { - me->InterruptNonMeleeSpells(true); - } + if (VoidBlastCounter == 5) + { + VoidBlastCounter = 0; + events.RescheduleEvent(EVENT_VOID_BLAST, urand(15000, 25000)); + } + else + { + events.RescheduleEvent(EVENT_VOID_BLAST, 500); + events.DelayEvents(EVENT_DARK_SHELL, 500); + } + break; + case EVENT_DARK_SHELL: + if (me->IsNonMeleeSpellCast(false)) + { + me->InterruptNonMeleeSpells(true); + } - Talk(EMOTE_DARK_SHELL); - DoCast(me, SPELL_DARK_SHELL); - events.RescheduleEvent(EVENT_DARK_SHELL, 20000); - break; - default: - break; + Talk(EMOTE_DARK_SHELL); + DoCast(me, SPELL_DARK_SHELL); + events.RescheduleEvent(EVENT_DARK_SHELL, 20000); + break; + default: + break; } DoMeleeAttackIfReady(); } - private: - uint32 VoidBlastCounter; + private: + uint32 VoidBlastCounter; }; }; diff --git a/src/server/scripts/Outland/Auchindoun/ManaTombs/instance_mana_tombs.cpp b/src/server/scripts/Outland/Auchindoun/ManaTombs/instance_mana_tombs.cpp index 034df3cd0..168f9c91d 100644 --- a/src/server/scripts/Outland/Auchindoun/ManaTombs/instance_mana_tombs.cpp +++ b/src/server/scripts/Outland/Auchindoun/ManaTombs/instance_mana_tombs.cpp @@ -22,25 +22,25 @@ class instance_mana_tombs : public InstanceMapScript { - public: - instance_mana_tombs() : InstanceMapScript(MTScriptName, 557) { } +public: + instance_mana_tombs() : InstanceMapScript(MTScriptName, 557) { } - struct instance_mana_tombs_InstanceMapScript : public InstanceScript + struct instance_mana_tombs_InstanceMapScript : public InstanceScript + { + instance_mana_tombs_InstanceMapScript(Map* map) : InstanceScript(map) { - instance_mana_tombs_InstanceMapScript(Map* map) : InstanceScript(map) - { - SetBossNumber(EncounterCount); - } - - void Load(char const* data) override { LoadBossState(data); } - - std::string GetSaveData() override { return DataHeader + GetBossSaveData(); } - }; - - InstanceScript* GetInstanceScript(InstanceMap* map) const override - { - return new instance_mana_tombs_InstanceMapScript(map); + SetBossNumber(EncounterCount); } + + void Load(char const* data) override { LoadBossState(data); } + + std::string GetSaveData() override { return DataHeader + GetBossSaveData(); } + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const override + { + return new instance_mana_tombs_InstanceMapScript(map); + } }; void AddSC_instance_mana_tombs() diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_talon_king_ikiss.cpp b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_talon_king_ikiss.cpp index 4ec8ce04b..49620c2d4 100644 --- a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_talon_king_ikiss.cpp +++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_talon_king_ikiss.cpp @@ -92,7 +92,7 @@ public: void KilledUnit(Unit* /*victim*/) { - if (urand(0,1)) + if (urand(0, 1)) Talk(SAY_SLAY); } @@ -242,7 +242,7 @@ public: Talk(SAY_SUMMON); me->CastSpell(me, SPELL_BANISH_SELF, true); for (uint8 i = 0; i < 5; ++i) - me->SummonCreature(23132 /*NPC_BROOD_OF_ANZU*/, me->GetPositionX()+20*cos((float)i), me->GetPositionY()+20*sin((float)i), me->GetPositionZ()+25.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + me->SummonCreature(23132 /*NPC_BROOD_OF_ANZU*/, me->GetPositionX() + 20 * cos((float)i), me->GetPositionY() + 20 * sin((float)i), me->GetPositionZ() + 25.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); } void UpdateAI(uint32 diff) @@ -268,7 +268,7 @@ public: return; events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING|UNIT_STATE_STUNNED)) + if (me->HasUnitState(UNIT_STATE_CASTING | UNIT_STATE_STUNNED)) return; switch (events.GetEvent()) diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp b/src/server/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp index 7707eb47d..a202126d3 100644 --- a/src/server/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp +++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp @@ -58,9 +58,9 @@ public: case DATA_IKISSDOOREVENT: if (data == DONE) { - DoUseDoorOrButton(m_uiIkissDoorGUID, DAY*IN_MILLISECONDS); + DoUseDoorOrButton(m_uiIkissDoorGUID, DAY * IN_MILLISECONDS); if (GameObject* coffer = instance->GetGameObject(_talonKingsCofferGUID)) - coffer->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE|GO_FLAG_INTERACT_COND); + coffer->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE | GO_FLAG_INTERACT_COND); } break; case TYPE_ANZU_ENCOUNTER: diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp index 56272117c..8a2a9f213 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp @@ -108,7 +108,7 @@ public: void KilledUnit(Unit* victim) { - if (victim->GetTypeId() == TYPEID_PLAYER && urand(0,1)) + if (victim->GetTypeId() == TYPEID_PLAYER && urand(0, 1)) Talk(SAY_SLAY); } @@ -148,7 +148,7 @@ public: events.PopEvent(); break; } - + DoMeleeAttackIfReady(); } }; diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp index c7be3998a..f101d382f 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp @@ -58,7 +58,7 @@ public: void KilledUnit(Unit* victim) { - if (victim->GetTypeId() == TYPEID_PLAYER && urand(0,1)) + if (victim->GetTypeId() == TYPEID_PLAYER && urand(0, 1)) Talk(SAY_SLAY); } @@ -101,24 +101,24 @@ public: events.PopEvent(); break; case EVENT_SPELL_INCITE: - { - me->CastSpell(me, SPELL_INCITE_CHAOS, false); - - std::list t_list = me->getThreatManager().getThreatList(); - for (std::list::const_iterator itr = t_list.begin(); itr!= t_list.end(); ++itr) { - Unit* target = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid()); - if (target && target->GetTypeId() == TYPEID_PLAYER) - me->CastSpell(target, SPELL_INCITE_CHAOS_B, true); - } + me->CastSpell(me, SPELL_INCITE_CHAOS, false); - DoResetThreat(); - InciteChaos = true; - events.DelayEvents(15000); - events.RepeatEvent(40000); - events.ScheduleEvent(EVENT_INCITE_WAIT, 15000); - break; - } + std::list t_list = me->getThreatManager().getThreatList(); + for (std::list::const_iterator itr = t_list.begin(); itr != t_list.end(); ++itr) + { + Unit* target = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid()); + if (target && target->GetTypeId() == TYPEID_PLAYER) + me->CastSpell(target, SPELL_INCITE_CHAOS_B, true); + } + + DoResetThreat(); + InciteChaos = true; + events.DelayEvents(15000); + events.RepeatEvent(40000); + events.ScheduleEvent(EVENT_INCITE_WAIT, 15000); + break; + } case EVENT_SPELL_CHARGE: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) me->CastSpell(target, SPELL_CHARGE, false); diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp index 3188a986f..b0b508dc4 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp @@ -168,25 +168,25 @@ public: break; case EVENT_SUMMON_TRAVELER: spawnVoidTraveler(); - events.RepeatEvent(HealthBelowPct(20) ? 5000: 10000); + events.RepeatEvent(HealthBelowPct(20) ? 5000 : 10000); break; case EVENT_SPELL_DRAWSHADOWS: - { - Map* map = me->GetMap(); - Map::PlayerList const &PlayerList = map->GetPlayers(); - for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) - if (Player* player = i->GetSource()) - if (player->IsAlive() && !player->HasAura(SPELL_BANISH)) - player->TeleportTo(me->GetMapId(), VorpilPosition[0], VorpilPosition[1], VorpilPosition[2], 0, TELE_TO_NOT_LEAVE_COMBAT); + { + Map* map = me->GetMap(); + Map::PlayerList const& PlayerList = map->GetPlayers(); + for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) + if (Player* player = i->GetSource()) + if (player->IsAlive() && !player->HasAura(SPELL_BANISH)) + player->TeleportTo(me->GetMapId(), VorpilPosition[0], VorpilPosition[1], VorpilPosition[2], 0, TELE_TO_NOT_LEAVE_COMBAT); - me->NearTeleportTo(VorpilPosition[0], VorpilPosition[1], VorpilPosition[2], 0.0f); - me->CastSpell(me, SPELL_DRAW_SHADOWS, true); - me->CastSpell(me, SPELL_RAIN_OF_FIRE_N); + me->NearTeleportTo(VorpilPosition[0], VorpilPosition[1], VorpilPosition[2], 0.0f); + me->CastSpell(me, SPELL_DRAW_SHADOWS, true); + me->CastSpell(me, SPELL_RAIN_OF_FIRE_N); - events.RepeatEvent(24000); - events.DelayEvents(6000); - break; - } + events.RepeatEvent(24000); + events.DelayEvents(6000); + break; + } } DoMeleeAttackIfReady(); diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp index 1cc0c9a4f..85094b464 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp @@ -15,7 +15,7 @@ enum Murmur SPELL_MAGNETIC_PULL = 33689, SPELL_SONIC_SHOCK = 38797, SPELL_THUNDERING_STORM = 39365, - + SPELL_SONIC_BOOM_CAST_N = 33923, SPELL_SONIC_BOOM_CAST_H = 38796, SPELL_SONIC_BOOM_EFFECT_N = 38795, @@ -155,58 +155,58 @@ public: class spell_murmur_sonic_boom_effect : public SpellScriptLoader { +public: + spell_murmur_sonic_boom_effect() : SpellScriptLoader("spell_murmur_sonic_boom_effect") { } + + class spell_murmur_sonic_boom_effect_SpellScript : public SpellScript + { + PrepareSpellScript(spell_murmur_sonic_boom_effect_SpellScript) + public: - spell_murmur_sonic_boom_effect() : SpellScriptLoader("spell_murmur_sonic_boom_effect") { } + spell_murmur_sonic_boom_effect_SpellScript() : SpellScript() { } - class spell_murmur_sonic_boom_effect_SpellScript : public SpellScript + void RecalculateDamage() { - PrepareSpellScript(spell_murmur_sonic_boom_effect_SpellScript) - - public: - spell_murmur_sonic_boom_effect_SpellScript() : SpellScript() { } - - void RecalculateDamage() - { - SetHitDamage(GetHitUnit()->CountPctFromMaxHealth(90)); - } - - void Register() - { - OnHit += SpellHitFn(spell_murmur_sonic_boom_effect_SpellScript::RecalculateDamage); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_murmur_sonic_boom_effect_SpellScript(); + SetHitDamage(GetHitUnit()->CountPctFromMaxHealth(90)); } + + void Register() + { + OnHit += SpellHitFn(spell_murmur_sonic_boom_effect_SpellScript::RecalculateDamage); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_murmur_sonic_boom_effect_SpellScript(); + } }; class spell_murmur_thundering_storm : public SpellScriptLoader { - public: - spell_murmur_thundering_storm() : SpellScriptLoader("spell_murmur_thundering_storm") { } +public: + spell_murmur_thundering_storm() : SpellScriptLoader("spell_murmur_thundering_storm") { } - class spell_murmur_thundering_storm_SpellScript : public SpellScript + class spell_murmur_thundering_storm_SpellScript : public SpellScript + { + PrepareSpellScript(spell_murmur_thundering_storm_SpellScript); + + void SelectTarget(std::list& targets) { - PrepareSpellScript(spell_murmur_thundering_storm_SpellScript); - - void SelectTarget(std::list& targets) - { - targets.remove_if(acore::AllWorldObjectsInExactRange(GetCaster(), 100.0f, true)); - targets.remove_if(acore::AllWorldObjectsInExactRange(GetCaster(), 25.0f, false)); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_murmur_thundering_storm_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_murmur_thundering_storm_SpellScript(); + targets.remove_if(acore::AllWorldObjectsInExactRange(GetCaster(), 100.0f, true)); + targets.remove_if(acore::AllWorldObjectsInExactRange(GetCaster(), 25.0f, false)); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_murmur_thundering_storm_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_murmur_thundering_storm_SpellScript(); + } }; void AddSC_boss_murmur() diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp index 962c2ca5c..baa7effec 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp @@ -91,7 +91,7 @@ public: cr->AI()->DoAction(1); } break; - + case DATA_BLACKHEARTTHEINCITEREVENT: if (uiData == DONE) DoUseDoorOrButton(m_uiRefectoryDoorGUID); @@ -125,7 +125,7 @@ public: { std::ostringstream saveStream; saveStream << "S L " << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' ' - << m_auiEncounter[2] << ' ' << m_auiEncounter[3] << ' ' << m_auiEncounter[4]; + << m_auiEncounter[2] << ' ' << m_auiEncounter[3] << ' ' << m_auiEncounter[4]; return saveStream.str(); } diff --git a/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp b/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp index 7e74274ad..c570f1538 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp @@ -60,193 +60,193 @@ enum Misc class boss_gurtogg_bloodboil : public CreatureScript { - public: - boss_gurtogg_bloodboil() : CreatureScript("boss_gurtogg_bloodboil") { } +public: + boss_gurtogg_bloodboil() : CreatureScript("boss_gurtogg_bloodboil") { } - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } + + struct boss_gurtogg_bloodboilAI : public BossAI + { + boss_gurtogg_bloodboilAI(Creature* creature) : BossAI(creature, DATA_GURTOGG_BLOODBOIL) { - return GetInstanceAI(creature); } - struct boss_gurtogg_bloodboilAI : public BossAI + void Reset() { - boss_gurtogg_bloodboilAI(Creature* creature) : BossAI(creature, DATA_GURTOGG_BLOODBOIL) + BossAI::Reset(); + } + + void EnterCombat(Unit* who) + { + BossAI::EnterCombat(who); + Talk(SAY_AGGRO); + + me->CastSpell(me, SPELL_ACIDIC_WOUND, true); + events.ScheduleEvent(EVENT_SPELL_BLOOD_BOIL, 10000); + events.ScheduleEvent(EVENT_SPELL_BEWILDERING_STRIKE, 28000, GROUP_DELAY); + events.ScheduleEvent(EVENT_SPELL_FEL_ACID_BREATH, 38000); + events.ScheduleEvent(EVENT_SPELL_EJECT, 14000); + events.ScheduleEvent(EVENT_SPELL_ARCING_SMASH, 5000); + events.ScheduleEvent(EVENT_SPELL_FEL_GEYSER, 60000); + events.ScheduleEvent(EVENT_SPELL_BERSERK, 600000); + } + + void KilledUnit(Unit* /*victim*/) + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) { + Talk(SAY_SLAY); + events.ScheduleEvent(EVENT_KILL_TALK, 6000); + } + } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + summon->CastSpell(summon, SPELL_FEL_GEYSER_DAMAGE, false); + } + + void JustDied(Unit* killer) + { + BossAI::JustDied(killer); + Talk(SAY_DEATH); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_SPELL_BERSERK: + Talk(SAY_ENRAGE); + me->CastSpell(me, SPELL_BERSERK, true); + break; + case EVENT_SPELL_BLOOD_BOIL: + me->CastCustomSpell(SPELL_BLOODBOIL, SPELLVALUE_MAX_TARGETS, 5, me, false); + events.ScheduleEvent(EVENT_SPELL_BLOOD_BOIL, 10000); + break; + case EVENT_SPELL_BEWILDERING_STRIKE: + me->CastSpell(me->GetVictim(), SPELL_BEWILDERING_STRIKE, false); + events.ScheduleEvent(EVENT_SPELL_BEWILDERING_STRIKE, 30000, GROUP_DELAY); + break; + case EVENT_SPELL_FEL_ACID_BREATH: + me->CastSpell(me->GetVictim(), me->HasAura(SPELL_FEL_RAGE_SELF) ? SPELL_FEL_ACID_BREATH2 : SPELL_FEL_ACID_BREATH1, false); + events.ScheduleEvent(EVENT_SPELL_FEL_ACID_BREATH, 30000); + break; + case EVENT_SPELL_EJECT: + me->CastSpell(me->GetVictim(), me->HasAura(SPELL_FEL_RAGE_SELF) ? SPELL_EJECT2 : SPELL_EJECT1, false); + events.ScheduleEvent(EVENT_SPELL_EJECT, 20000); + break; + case EVENT_SPELL_ARCING_SMASH: + me->CastSpell(me->GetVictim(), me->HasAura(SPELL_FEL_RAGE_SELF) ? SPELL_ARCING_SMASH2 : SPELL_ARCING_SMASH1, false); + events.ScheduleEvent(EVENT_SPELL_ARCING_SMASH, 15000); + break; + case EVENT_SPELL_FEL_GEYSER: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 40.0f, true)) + { + me->RemoveAurasByType(SPELL_AURA_MOD_TAUNT); + me->CastSpell(me, SPELL_FEL_RAGE_SELF, true); + me->CastSpell(target, SPELL_FEL_RAGE_TARGET, true); + me->CastSpell(target, SPELL_FEL_RAGE_2, true); + me->CastSpell(target, SPELL_FEL_RAGE_3, true); + me->CastSpell(target, SPELL_FEL_RAGE_SIZE, true); + target->CastSpell(me, SPELL_TAUNT_GURTOGG, true); + + me->CastSpell(target, SPELL_FEL_GEYSER_SUMMON, true); + me->CastSpell(me, SPELL_FEL_GEYSER_STUN, true); + me->CastSpell(me, SPELL_INSIGNIFICANCE, true); + events.ScheduleEvent(EVENT_SPELL_CHARGE, 2000); + events.DelayEvents(30000, GROUP_DELAY); + } + events.ScheduleEvent(EVENT_SPELL_FEL_GEYSER, 90000); + break; + case EVENT_SPELL_CHARGE: + me->CastSpell(me->GetVictim(), SPELL_CHARGE, true); + break; } - void Reset() - { - BossAI::Reset(); - } + DoMeleeAttackIfReady(); + EnterEvadeIfOutOfCombatArea(); + } - void EnterCombat(Unit* who) - { - BossAI::EnterCombat(who); - Talk(SAY_AGGRO); - - me->CastSpell(me, SPELL_ACIDIC_WOUND, true); - events.ScheduleEvent(EVENT_SPELL_BLOOD_BOIL, 10000); - events.ScheduleEvent(EVENT_SPELL_BEWILDERING_STRIKE, 28000, GROUP_DELAY); - events.ScheduleEvent(EVENT_SPELL_FEL_ACID_BREATH, 38000); - events.ScheduleEvent(EVENT_SPELL_EJECT, 14000); - events.ScheduleEvent(EVENT_SPELL_ARCING_SMASH, 5000); - events.ScheduleEvent(EVENT_SPELL_FEL_GEYSER, 60000); - events.ScheduleEvent(EVENT_SPELL_BERSERK, 600000); - } - - void KilledUnit(Unit* /*victim*/) - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(SAY_SLAY); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); - } - } - - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - summon->CastSpell(summon, SPELL_FEL_GEYSER_DAMAGE, false); - } - - void JustDied(Unit* killer) - { - BossAI::JustDied(killer); - Talk(SAY_DEATH); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_BERSERK: - Talk(SAY_ENRAGE); - me->CastSpell(me, SPELL_BERSERK, true); - break; - case EVENT_SPELL_BLOOD_BOIL: - me->CastCustomSpell(SPELL_BLOODBOIL, SPELLVALUE_MAX_TARGETS, 5, me, false); - events.ScheduleEvent(EVENT_SPELL_BLOOD_BOIL, 10000); - break; - case EVENT_SPELL_BEWILDERING_STRIKE: - me->CastSpell(me->GetVictim(), SPELL_BEWILDERING_STRIKE, false); - events.ScheduleEvent(EVENT_SPELL_BEWILDERING_STRIKE, 30000, GROUP_DELAY); - break; - case EVENT_SPELL_FEL_ACID_BREATH: - me->CastSpell(me->GetVictim(), me->HasAura(SPELL_FEL_RAGE_SELF) ? SPELL_FEL_ACID_BREATH2 : SPELL_FEL_ACID_BREATH1, false); - events.ScheduleEvent(EVENT_SPELL_FEL_ACID_BREATH, 30000); - break; - case EVENT_SPELL_EJECT: - me->CastSpell(me->GetVictim(), me->HasAura(SPELL_FEL_RAGE_SELF) ? SPELL_EJECT2 : SPELL_EJECT1, false); - events.ScheduleEvent(EVENT_SPELL_EJECT, 20000); - break; - case EVENT_SPELL_ARCING_SMASH: - me->CastSpell(me->GetVictim(), me->HasAura(SPELL_FEL_RAGE_SELF) ? SPELL_ARCING_SMASH2 : SPELL_ARCING_SMASH1, false); - events.ScheduleEvent(EVENT_SPELL_ARCING_SMASH, 15000); - break; - case EVENT_SPELL_FEL_GEYSER: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 40.0f, true)) - { - me->RemoveAurasByType(SPELL_AURA_MOD_TAUNT); - me->CastSpell(me, SPELL_FEL_RAGE_SELF, true); - me->CastSpell(target, SPELL_FEL_RAGE_TARGET, true); - me->CastSpell(target, SPELL_FEL_RAGE_2, true); - me->CastSpell(target, SPELL_FEL_RAGE_3, true); - me->CastSpell(target, SPELL_FEL_RAGE_SIZE, true); - target->CastSpell(me, SPELL_TAUNT_GURTOGG, true); - - me->CastSpell(target, SPELL_FEL_GEYSER_SUMMON, true); - me->CastSpell(me, SPELL_FEL_GEYSER_STUN, true); - me->CastSpell(me, SPELL_INSIGNIFICANCE, true); - events.ScheduleEvent(EVENT_SPELL_CHARGE, 2000); - events.DelayEvents(30000, GROUP_DELAY); - } - events.ScheduleEvent(EVENT_SPELL_FEL_GEYSER, 90000); - break; - case EVENT_SPELL_CHARGE: - me->CastSpell(me->GetVictim(), SPELL_CHARGE, true); - break; - } - - DoMeleeAttackIfReady(); - EnterEvadeIfOutOfCombatArea(); - } - - bool CheckEvadeIfOutOfCombatArea() const - { - return me->GetHomePosition().GetExactDist2d(me) > 105.0f; - } - }; + bool CheckEvadeIfOutOfCombatArea() const + { + return me->GetHomePosition().GetExactDist2d(me) > 105.0f; + } + }; }; class spell_gurtogg_bloodboil : public SpellScriptLoader { - public: - spell_gurtogg_bloodboil() : SpellScriptLoader("spell_gurtogg_bloodboil") { } +public: + spell_gurtogg_bloodboil() : SpellScriptLoader("spell_gurtogg_bloodboil") { } - class spell_gurtogg_bloodboil_SpellScript : public SpellScript + class spell_gurtogg_bloodboil_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gurtogg_bloodboil_SpellScript); + + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_gurtogg_bloodboil_SpellScript); + if (targets.empty()) + return; - void FilterTargets(std::list& targets) + targets.sort(acore::ObjectDistanceOrderPred(GetCaster(), false)); + if (targets.size() > GetSpellValue()->MaxAffectedTargets) { - if (targets.empty()) - return; - - targets.sort(acore::ObjectDistanceOrderPred(GetCaster(), false)); - if (targets.size() > GetSpellValue()->MaxAffectedTargets) - { - std::list::iterator itr = targets.begin(); - std::advance(itr, GetSpellValue()->MaxAffectedTargets); - targets.erase(itr, targets.end()); - } + std::list::iterator itr = targets.begin(); + std::advance(itr, GetSpellValue()->MaxAffectedTargets); + targets.erase(itr, targets.end()); } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_gurtogg_bloodboil_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gurtogg_bloodboil_SpellScript(); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_gurtogg_bloodboil_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gurtogg_bloodboil_SpellScript(); + } }; class spell_gurtogg_eject : public SpellScriptLoader { - public: - spell_gurtogg_eject() : SpellScriptLoader("spell_gurtogg_eject") { } +public: + spell_gurtogg_eject() : SpellScriptLoader("spell_gurtogg_eject") { } - class spell_gurtogg_eject_SpellScript : public SpellScript + class spell_gurtogg_eject_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gurtogg_eject_SpellScript); + + void HandleScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_gurtogg_eject_SpellScript); - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitEffect(effIndex); - if (Unit* target = GetHitUnit()) - GetCaster()->getThreatManager().modifyThreatPercent(target, -20); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_gurtogg_eject_SpellScript::HandleScriptEffect, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gurtogg_eject_SpellScript(); + PreventHitEffect(effIndex); + if (Unit* target = GetHitUnit()) + GetCaster()->getThreatManager().modifyThreatPercent(target, -20); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_gurtogg_eject_SpellScript::HandleScriptEffect, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gurtogg_eject_SpellScript(); + } }; void AddSC_boss_gurtogg_bloodboil() diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp index 657431cc8..1ad13a0a1 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp @@ -86,9 +86,9 @@ enum Spells SPELL_SUMMON_SHADOW_DEMON = 41117, SPELL_CONSUME_SOUL = 41080, SPELL_FIND_TARGET = 41081, - + // Phase 5 - SPELL_FRENZY = 40683, + SPELL_FRENZY = 40683, SPELL_TELEPORT_MAIEV = 41221, SPELL_SHADOW_STRIKE = 40685, SPELL_THROW_DAGGER = 41152, @@ -173,7 +173,7 @@ enum Events GROUP_PHASE_2_ABILITY = 1 }; -const Position eyeBeamPos[MAX_EYE_BEAM_POS*2] = +const Position eyeBeamPos[MAX_EYE_BEAM_POS * 2] = { {639.97f, 301.63f, 354.0f, 0.0f}, {658.83f, 265.10f, 354.0f, 0.0f}, @@ -186,7 +186,7 @@ const Position eyeBeamPos[MAX_EYE_BEAM_POS*2] = {705.92f, 337.14f, 354.0f, 0.0f} }; -const Position airHoverPos[MAX_EYE_BEAM_POS] = +const Position airHoverPos[MAX_EYE_BEAM_POS] = { {658.83f, 265.10f, 356.0f, 0.0f}, {706.22f, 273.26f, 356.0f, 0.0f}, @@ -196,509 +196,509 @@ const Position airHoverPos[MAX_EYE_BEAM_POS] = class boss_illidan_stormrage : public CreatureScript { - public: - boss_illidan_stormrage() : CreatureScript("boss_illidan_stormrage") { } +public: + boss_illidan_stormrage() : CreatureScript("boss_illidan_stormrage") { } - struct boss_illidan_stormrageAI : public BossAI + struct boss_illidan_stormrageAI : public BossAI + { + boss_illidan_stormrageAI(Creature* creature) : BossAI(creature, DATA_ILLIDAN_STORMRAGE) { - boss_illidan_stormrageAI(Creature* creature) : BossAI(creature, DATA_ILLIDAN_STORMRAGE) + } + + EventMap events2; + uint8 beamPosId; + + void Reset() + { + BossAI::Reset(); + events2.Reset(); + me->SetDisableGravity(false); + me->CastSpell(me, SPELL_DUAL_WIELD, true); + me->LoadEquipment(0, true); + me->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + beamPosId = urand(0, 3); + } + + void EnterEvadeMode() + { + BossAI::EnterEvadeMode(); + + if (Creature* akama = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_AKAMA))) + akama->AI()->EnterEvadeMode(); + } + + bool CanAIAttack(const Unit* target) const + { + return target->GetEntry() != NPC_AKAMA && target->GetEntry() != NPC_MAIEV_SHADOWSONG; + } + + void DoAction(int32 param) + { + if (param == ACTION_ILLIDAN_CAGED) { + me->RemoveAurasDueToSpell(SPELL_FRENZY); + events.Reset(); + events.ScheduleEvent(EVENT_PHASE_4_START, 16000); } + } - EventMap events2; - uint8 beamPosId; - - void Reset() + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + if (summon->GetEntry() == NPC_ILLIDAN_DB_TARGET) + me->CastSpell(summon, SPELL_EYE_BLAST, false); + else if (summon->GetEntry() == NPC_MAIEV_SHADOWSONG) { - BossAI::Reset(); - events2.Reset(); - me->SetDisableGravity(false); - me->CastSpell(me, SPELL_DUAL_WIELD, true); - me->LoadEquipment(0, true); - me->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); - beamPosId = urand(0, 3); + me->SetTarget(summon->GetGUID()); + me->SetFacingToObject(summon); + summon->SetFacingToObject(me); + summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + summon->SetReactState(REACT_PASSIVE); + summon->CastSpell(summon, SPELL_TELEPORT_VISUAL_ONLY, true); } + } - void EnterEvadeMode() + void SummonedCreatureDies(Creature* summon, Unit*) + { + summons.Despawn(summon); + } + + void SummonedCreatureDespawn(Creature* summon) + { + summons.Despawn(summon); + } + + void MovementInform(uint32 type, uint32 id) + { + if (type != POINT_MOTION_TYPE) + return; + + if (id == POINT_ILLIDAN_HOVER) { - BossAI::EnterEvadeMode(); - - if (Creature* akama = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_AKAMA))) - akama->AI()->EnterEvadeMode(); - } - - bool CanAIAttack(const Unit* target) const - { - return target->GetEntry() != NPC_AKAMA && target->GetEntry() != NPC_MAIEV_SHADOWSONG; - } - - void DoAction(int32 param) - { - if (param == ACTION_ILLIDAN_CAGED) + if (events2.GetNextEventTime(EVENT_START_PHASE_2_END) == 0) { - me->RemoveAurasDueToSpell(SPELL_FRENZY); - events.Reset(); - events.ScheduleEvent(EVENT_PHASE_4_START, 16000); + events.ScheduleEvent(EVENT_PHASE_2_SUMMON2, 2000); + events.ScheduleEvent(EVENT_PHASE_2_CHANGE_POS, 6000); + events.ScheduleEvent(EVENT_PHASE_2_EYE_BEAM, 15000, GROUP_PHASE_2_ABILITY); + events2.ScheduleEvent(EVENT_START_PHASE_2_END, 10000); } + me->SetFacingTo(me->GetAngle(676.02f, 305.45f)); } - - void JustSummoned(Creature* summon) + else if (id == POINT_ILLIDAN_MIDDLE) { - summons.Summon(summon); - if (summon->GetEntry() == NPC_ILLIDAN_DB_TARGET) - me->CastSpell(summon, SPELL_EYE_BLAST, false); - else if (summon->GetEntry() == NPC_MAIEV_SHADOWSONG) - { - me->SetTarget(summon->GetGUID()); - me->SetFacingToObject(summon); - summon->SetFacingToObject(me); - summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - summon->SetReactState(REACT_PASSIVE); - summon->CastSpell(summon, SPELL_TELEPORT_VISUAL_ONLY, true); - } + EntryCheckPredicate pred(NPC_BLADE_OF_AZZINOTH); + summons.DoAction(ACTION_RETURN_BLADE, pred); + events.ScheduleEvent(EVENT_START_PHASE_2_WEAPON, 1500); + events.ScheduleEvent(EVENT_START_PHASE_3_LAND, 4000); } + } - void SummonedCreatureDies(Creature* summon, Unit*) + void ScheduleNormalEvents(uint8 phase) + { + events.ScheduleEvent(EVENT_SPELL_FLAME_CRASH, 15000); + events.ScheduleEvent(EVENT_SPELL_DRAW_SOUL, 30000); + events.ScheduleEvent(EVENT_SPELL_PARASITIC_SHADOWFIEND, 20000); + events.ScheduleEvent(EVENT_SAY_TAUNT, 40000); + if (phase >= 3) { - summons.Despawn(summon); + events.ScheduleEvent(EVENT_PHASE_4_START, 60000); + events.ScheduleEvent(EVENT_SPELL_AGONIZING_FLAMES, 10000); } + if (phase >= 5) + events.ScheduleEvent(EVENT_SPELL_FRENZY, 40000); + } - void SummonedCreatureDespawn(Creature* summon) + void EnterCombat(Unit* who) + { + summons.DespawnAll(); + BossAI::EnterCombat(who); + ScheduleNormalEvents(1); + events.ScheduleEvent(EVENT_SPELL_BERSERK, 25 * MINUTE * IN_MILLISECONDS); + events.ScheduleEvent(EVENT_SUMMON_MINIONS, 1000); + events.ScheduleEvent(EVENT_PHASE_2_START, 1000); + } + + void AttackStart(Unit* victim) + { + if (victim && me->Attack(victim, true)) + me->GetMotionMaster()->MoveChase(victim, events.GetNextEventTime(EVENT_REMOVE_DEMON_FORM) != 0 ? 35.0f : 0.0f); + } + + void MoveInLineOfSight(Unit*) { } + + void JustDied(Unit* /*killer*/) + { + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); + summons.DespawnEntry(NPC_PARASITIC_SHADOWFIEND); + instance->SetBossState(DATA_ILLIDAN_STORMRAGE, DONE); + instance->SaveToDB(); + } + + void KilledUnit(Unit* /*victim*/) + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) { - summons.Despawn(summon); + Talk(SAY_ILLIDAN_KILL); + events.ScheduleEvent(EVENT_KILL_TALK, 6000); } + } - void MovementInform(uint32 type, uint32 id) + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) + { + if (damage >= me->GetHealth()) { - if (type != POINT_MOTION_TYPE) + damage = 0; + + // xinef: do not allow to start outro when transforming + if (events.GetNextEventTime(EVENT_FINISH_TRANSFORM)) return; - if (id == POINT_ILLIDAN_HOVER) + if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) { - if (events2.GetNextEventTime(EVENT_START_PHASE_2_END) == 0) + if (Creature* maiev = summons.GetCreatureWithEntry(NPC_MAIEV_SHADOWSONG)) { - events.ScheduleEvent(EVENT_PHASE_2_SUMMON2, 2000); - events.ScheduleEvent(EVENT_PHASE_2_CHANGE_POS, 6000); - events.ScheduleEvent(EVENT_PHASE_2_EYE_BEAM, 15000, GROUP_PHASE_2_ABILITY); - events2.ScheduleEvent(EVENT_START_PHASE_2_END, 10000); + maiev->StopMovingOnCurrentPos(); + maiev->GetMotionMaster()->Clear(); + maiev->SetReactState(REACT_PASSIVE); + maiev->SetFullHealth(); + maiev->RemoveAllAuras(); + maiev->CombatStop(); } - me->SetFacingTo(me->GetAngle(676.02f, 305.45f)); - } - else if (id == POINT_ILLIDAN_MIDDLE) - { - EntryCheckPredicate pred(NPC_BLADE_OF_AZZINOTH); - summons.DoAction(ACTION_RETURN_BLADE, pred); - events.ScheduleEvent(EVENT_START_PHASE_2_WEAPON, 1500); - events.ScheduleEvent(EVENT_START_PHASE_3_LAND, 4000); - } - } - void ScheduleNormalEvents(uint8 phase) - { - events.ScheduleEvent(EVENT_SPELL_FLAME_CRASH, 15000); - events.ScheduleEvent(EVENT_SPELL_DRAW_SOUL, 30000); - events.ScheduleEvent(EVENT_SPELL_PARASITIC_SHADOWFIEND, 20000); - events.ScheduleEvent(EVENT_SAY_TAUNT, 40000); - if (phase >= 3) - { - events.ScheduleEvent(EVENT_PHASE_4_START, 60000); - events.ScheduleEvent(EVENT_SPELL_AGONIZING_FLAMES, 10000); - } - if (phase >= 5) - events.ScheduleEvent(EVENT_SPELL_FRENZY, 40000); - } - - void EnterCombat(Unit* who) - { - summons.DespawnAll(); - BossAI::EnterCombat(who); - ScheduleNormalEvents(1); - events.ScheduleEvent(EVENT_SPELL_BERSERK, 25*MINUTE*IN_MILLISECONDS); - events.ScheduleEvent(EVENT_SUMMON_MINIONS, 1000); - events.ScheduleEvent(EVENT_PHASE_2_START, 1000); - } - - void AttackStart(Unit* victim) - { - if (victim && me->Attack(victim, true)) - me->GetMotionMaster()->MoveChase(victim, events.GetNextEventTime(EVENT_REMOVE_DEMON_FORM) != 0 ? 35.0f : 0.0f); - } - - void MoveInLineOfSight(Unit*) { } - - void JustDied(Unit* /*killer*/) - { - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_NON_ATTACKABLE); - summons.DespawnEntry(NPC_PARASITIC_SHADOWFIEND); - instance->SetBossState(DATA_ILLIDAN_STORMRAGE, DONE); - instance->SaveToDB(); - } - - void KilledUnit(Unit* /*victim*/) - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(SAY_ILLIDAN_KILL); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); - } - } - - void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) - { - if (damage >= me->GetHealth()) - { - damage = 0; - - // xinef: do not allow to start outro when transforming - if (events.GetNextEventTime(EVENT_FINISH_TRANSFORM)) - return; - - if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) + if (events.GetNextEventTime(EVENT_REMOVE_DEMON_FORM) != 0) { - if (Creature* maiev = summons.GetCreatureWithEntry(NPC_MAIEV_SHADOWSONG)) - { - maiev->StopMovingOnCurrentPos(); - maiev->GetMotionMaster()->Clear(); - maiev->SetReactState(REACT_PASSIVE); - maiev->SetFullHealth(); - maiev->RemoveAllAuras(); - maiev->CombatStop(); - } - - if (events.GetNextEventTime(EVENT_REMOVE_DEMON_FORM) != 0) - { - me->CastSpell(me, SPELL_DEMON_TRANSFORM_1, true); - events2.ScheduleEvent(EVENT_OUTRO_DEMON, 12000); - } - else - { - me->CastSpell(me, SPELL_TELEPORT_MAIEV, true); - me->CastSpell(me, SPELL_DEATH, true); - events2.ScheduleEvent(EVENT_OUTRO_1, 1000); - } - - if (Creature* maiev = summons.GetCreatureWithEntry(NPC_MAIEV_SHADOWSONG)) - { - maiev->SetTarget(me->GetGUID()); - maiev->SetFacingToObject(me); - } - - events.Reset(); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + me->CastSpell(me, SPELL_DEMON_TRANSFORM_1, true); + events2.ScheduleEvent(EVENT_OUTRO_DEMON, 12000); } - } - } - - void UpdateAI(uint32 diff) - { - events2.Update(diff); - switch (events2.ExecuteEvent()) - { - case EVENT_SUMMON_MINIONS2: - if (Creature* akama = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_AKAMA))) - akama->AI()->DoAction(ACTION_FIGHT_MINIONS); - break; - case EVENT_PHASE_2_EYE_BEAM_START: - Talk(SAY_ILLIDAN_EYE_BLAST); - if (Creature* trigger = summons.GetCreatureWithEntry(NPC_ILLIDAN_DB_TARGET)) - trigger->GetMotionMaster()->MovePoint(0, eyeBeamPos[beamPosId+MAX_EYE_BEAM_POS], false, true); - break; - case EVENT_PHASE_2_INTERRUPT: - me->InterruptNonMeleeSpells(false); - break; - case EVENT_START_PHASE_2_END: - summons.RemoveNotExisting(); - if (!summons.HasEntry(NPC_FLAME_OF_AZZINOTH)) - { - events.Reset(); - events2.Reset(); - me->InterruptNonMeleeSpells(false); - me->GetMotionMaster()->MovePoint(POINT_ILLIDAN_MIDDLE, 676.02f, 305.45f, 353.6f); - break; - } - events2.ScheduleEvent(EVENT_START_PHASE_2_END, 1000); - break; - case EVENT_OUTRO_DEMON: + else + { me->CastSpell(me, SPELL_TELEPORT_MAIEV, true); me->CastSpell(me, SPELL_DEATH, true); events2.ScheduleEvent(EVENT_OUTRO_1, 1000); - break; - case EVENT_OUTRO_1: - if (Creature* maiev = summons.GetCreatureWithEntry(NPC_MAIEV_SHADOWSONG)) - { - maiev->SetTarget(me->GetGUID()); - maiev->SetFacingToObject(me); - maiev->AI()->DoAction(ACTION_MAIEV_OUTRO); - maiev->AI()->Talk(SAY_MAIEV_SHADOWSONG_ILLIDAN3); - } - - if (Creature* akama = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_AKAMA))) - { - akama->AI()->DoAction(ACTION_ILLIDAN_DEAD); - akama->SetTarget(me->GetGUID()); - akama->GetMotionMaster()->MovePoint(0, 695.63f, 306.63f, 354.26f); - } - events2.ScheduleEvent(EVENT_OUTRO_2, 6000); - break; - case EVENT_OUTRO_2: - Talk(SAY_ILLIDAN_MAIEV3); - events2.ScheduleEvent(EVENT_OUTRO_3, 17000); - break; - case EVENT_OUTRO_3: - Unit::Kill(nullptr, me); - break; + } + + if (Creature* maiev = summons.GetCreatureWithEntry(NPC_MAIEV_SHADOWSONG)) + { + maiev->SetTarget(me->GetGUID()); + maiev->SetFacingToObject(me); + } + + events.Reset(); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); } + } + } - - EnterEvadeIfOutOfCombatArea(); + void UpdateAI(uint32 diff) + { + events2.Update(diff); + switch (events2.ExecuteEvent()) + { + case EVENT_SUMMON_MINIONS2: + if (Creature* akama = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_AKAMA))) + akama->AI()->DoAction(ACTION_FIGHT_MINIONS); + break; + case EVENT_PHASE_2_EYE_BEAM_START: + Talk(SAY_ILLIDAN_EYE_BLAST); + if (Creature* trigger = summons.GetCreatureWithEntry(NPC_ILLIDAN_DB_TARGET)) + trigger->GetMotionMaster()->MovePoint(0, eyeBeamPos[beamPosId + MAX_EYE_BEAM_POS], false, true); + break; + case EVENT_PHASE_2_INTERRUPT: + me->InterruptNonMeleeSpells(false); + break; + case EVENT_START_PHASE_2_END: + summons.RemoveNotExisting(); + if (!summons.HasEntry(NPC_FLAME_OF_AZZINOTH)) + { + events.Reset(); + events2.Reset(); + me->InterruptNonMeleeSpells(false); + me->GetMotionMaster()->MovePoint(POINT_ILLIDAN_MIDDLE, 676.02f, 305.45f, 353.6f); + break; + } + events2.ScheduleEvent(EVENT_START_PHASE_2_END, 1000); + break; + case EVENT_OUTRO_DEMON: + me->CastSpell(me, SPELL_TELEPORT_MAIEV, true); + me->CastSpell(me, SPELL_DEATH, true); + events2.ScheduleEvent(EVENT_OUTRO_1, 1000); + break; + case EVENT_OUTRO_1: + if (Creature* maiev = summons.GetCreatureWithEntry(NPC_MAIEV_SHADOWSONG)) + { + maiev->SetTarget(me->GetGUID()); + maiev->SetFacingToObject(me); + maiev->AI()->DoAction(ACTION_MAIEV_OUTRO); + maiev->AI()->Talk(SAY_MAIEV_SHADOWSONG_ILLIDAN3); + } - if (!UpdateVictim()) - return; + if (Creature* akama = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_AKAMA))) + { + akama->AI()->DoAction(ACTION_ILLIDAN_DEAD); + akama->SetTarget(me->GetGUID()); + akama->GetMotionMaster()->MovePoint(0, 695.63f, 306.63f, 354.26f); + } + events2.ScheduleEvent(EVENT_OUTRO_2, 6000); + break; + case EVENT_OUTRO_2: + Talk(SAY_ILLIDAN_MAIEV3); + events2.ScheduleEvent(EVENT_OUTRO_3, 17000); + break; + case EVENT_OUTRO_3: + Unit::Kill(nullptr, me); + break; + } - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - switch (events.ExecuteEvent()) - { - case EVENT_SUMMON_MINIONS: - if (me->HealthBelowPct(90)) - { - Talk(SAY_ILLIDAN_MINION); - events2.ScheduleEvent(EVENT_SUMMON_MINIONS2, 10000); - break; - } - events.ScheduleEvent(EVENT_SUMMON_MINIONS, 1000); + EnterEvadeIfOutOfCombatArea(); + + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_SUMMON_MINIONS: + if (me->HealthBelowPct(90)) + { + Talk(SAY_ILLIDAN_MINION); + events2.ScheduleEvent(EVENT_SUMMON_MINIONS2, 10000); break; - // /////////////////////////// - // PHASE 1, 3, 5 - // /////////////////////////// - case EVENT_SPELL_BERSERK: - Talk(SAY_ILLIDAN_ENRAGE); - me->CastSpell(me, SPELL_BERSERK, true); + } + events.ScheduleEvent(EVENT_SUMMON_MINIONS, 1000); + break; + // /////////////////////////// + // PHASE 1, 3, 5 + // /////////////////////////// + case EVENT_SPELL_BERSERK: + Talk(SAY_ILLIDAN_ENRAGE); + me->CastSpell(me, SPELL_BERSERK, true); + break; + case EVENT_SPELL_FLAME_CRASH: + me->CastSpell(me->GetVictim(), SPELL_FLAME_CRASH, false); + events.ScheduleEvent(EVENT_SPELL_FLAME_CRASH, 25000); + break; + case EVENT_SPELL_DRAW_SOUL: + me->CastSpell(me->GetVictim(), SPELL_DRAW_SOUL, false); + events.ScheduleEvent(EVENT_SPELL_DRAW_SOUL, 40000); + break; + case EVENT_SPELL_PARASITIC_SHADOWFIEND: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) + me->CastSpell(target, SPELL_PARASITIC_SHADOWFIEND, false); + events.ScheduleEvent(EVENT_SPELL_PARASITIC_SHADOWFIEND, 30000); + break; + case EVENT_SAY_TAUNT: + Talk(SAY_ILLIDAN_TAUNT); + events.ScheduleEvent(EVENT_SAY_TAUNT, urand(30000, 60000)); + break; + case EVENT_SPELL_FRENZY: + Talk(SAY_ILLIDAN_FRENZY); + me->CastSpell(me, SPELL_FRENZY, false); + break; + case EVENT_SPELL_AGONIZING_FLAMES: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) + me->CastSpell(target, SPELL_AGONIZING_FLAMES, false); + break; + case EVENT_PHASE_5_START: + if (me->HealthBelowPct(30)) + { + me->CastSpell(me, SPELL_SHADOW_PRISON, true); + me->SendMeleeAttackStop(me->GetVictim()); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); + Talk(SAY_ILLIDAN_MAIEV1); + events.Reset(); + events.ScheduleEvent(EVENT_PHASE_5_SCENE1, 9000); + events.ScheduleEvent(EVENT_PHASE_5_SCENE2, 18000); + events.ScheduleEvent(EVENT_PHASE_5_SCENE3, 24000); + events.ScheduleEvent(EVENT_PHASE_5_SCENE4, 27000); + events.ScheduleEvent(EVENT_PHASE_5_SCENE5, 30000); break; - case EVENT_SPELL_FLAME_CRASH: - me->CastSpell(me->GetVictim(), SPELL_FLAME_CRASH, false); - events.ScheduleEvent(EVENT_SPELL_FLAME_CRASH, 25000); + } + events.ScheduleEvent(EVENT_PHASE_5_START, 1000); + break; + case EVENT_PHASE_5_SCENE1: + me->CastSpell(me, SPELL_SUMMON_MAIEV, true); + break; + case EVENT_PHASE_5_SCENE2: + Talk(SAY_ILLIDAN_MAIEV2); + break; + case EVENT_PHASE_5_SCENE3: + if (Creature* maiev = summons.GetCreatureWithEntry(NPC_MAIEV_SHADOWSONG)) + maiev->AI()->Talk(SAY_MAIEV_SHADOWSONG_ILLIDAN2); + break; + case EVENT_PHASE_5_SCENE4: + if (Creature* maiev = summons.GetCreatureWithEntry(NPC_MAIEV_SHADOWSONG)) + maiev->HandleEmoteCommand(EMOTE_ONESHOT_ROAR); + break; + case EVENT_PHASE_5_SCENE5: + me->SetTarget(me->GetVictim()->GetGUID()); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); + if (Creature* maiev = summons.GetCreatureWithEntry(NPC_MAIEV_SHADOWSONG)) + { + maiev->SetReactState(REACT_AGGRESSIVE); + maiev->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + maiev->AI()->AttackStart(me); + } + ScheduleNormalEvents(5); + break; + // /////////////////////////// + // PHASE 2 + // /////////////////////////// + case EVENT_PHASE_2_START: + if (me->HealthBelowPct(65)) + { + if (events2.GetNextEventTime(EVENT_SUMMON_MINIONS2) != 0) + events2.RescheduleEvent(EVENT_SUMMON_MINIONS2, 0); + + Talk(SAY_ILLIDAN_TAKEOFF); + me->SendMeleeAttackStop(me->GetVictim()); + me->SetTarget(0); + me->GetMotionMaster()->Clear(); + me->StopMovingOnCurrentPos(); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF); + me->SetDisableGravity(true); + + events.Reset(); + events.ScheduleEvent(EVENT_PHASE_2_SUMMON1, 6000); break; - case EVENT_SPELL_DRAW_SOUL: - me->CastSpell(me->GetVictim(), SPELL_DRAW_SOUL, false); - events.ScheduleEvent(EVENT_SPELL_DRAW_SOUL, 40000); - break; - case EVENT_SPELL_PARASITIC_SHADOWFIEND: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) - me->CastSpell(target, SPELL_PARASITIC_SHADOWFIEND, false); - events.ScheduleEvent(EVENT_SPELL_PARASITIC_SHADOWFIEND, 30000); - break; - case EVENT_SAY_TAUNT: - Talk(SAY_ILLIDAN_TAUNT); - events.ScheduleEvent(EVENT_SAY_TAUNT, urand(30000, 60000)); - break; - case EVENT_SPELL_FRENZY: - Talk(SAY_ILLIDAN_FRENZY); - me->CastSpell(me, SPELL_FRENZY, false); - break; - case EVENT_SPELL_AGONIZING_FLAMES: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) - me->CastSpell(target, SPELL_AGONIZING_FLAMES, false); - break; - case EVENT_PHASE_5_START: - if (me->HealthBelowPct(30)) - { - me->CastSpell(me, SPELL_SHADOW_PRISON, true); - me->SendMeleeAttackStop(me->GetVictim()); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_NON_ATTACKABLE); - Talk(SAY_ILLIDAN_MAIEV1); - events.Reset(); - events.ScheduleEvent(EVENT_PHASE_5_SCENE1, 9000); - events.ScheduleEvent(EVENT_PHASE_5_SCENE2, 18000); - events.ScheduleEvent(EVENT_PHASE_5_SCENE3, 24000); - events.ScheduleEvent(EVENT_PHASE_5_SCENE4, 27000); - events.ScheduleEvent(EVENT_PHASE_5_SCENE5, 30000); - break; - } - events.ScheduleEvent(EVENT_PHASE_5_START, 1000); - break; - case EVENT_PHASE_5_SCENE1: - me->CastSpell(me, SPELL_SUMMON_MAIEV, true); - break; - case EVENT_PHASE_5_SCENE2: - Talk(SAY_ILLIDAN_MAIEV2); - break; - case EVENT_PHASE_5_SCENE3: - if (Creature* maiev = summons.GetCreatureWithEntry(NPC_MAIEV_SHADOWSONG)) - maiev->AI()->Talk(SAY_MAIEV_SHADOWSONG_ILLIDAN2); - break; - case EVENT_PHASE_5_SCENE4: - if (Creature* maiev = summons.GetCreatureWithEntry(NPC_MAIEV_SHADOWSONG)) - maiev->HandleEmoteCommand(EMOTE_ONESHOT_ROAR); - break; - case EVENT_PHASE_5_SCENE5: - me->SetTarget(me->GetVictim()->GetGUID()); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_NON_ATTACKABLE); - if (Creature* maiev = summons.GetCreatureWithEntry(NPC_MAIEV_SHADOWSONG)) - { - maiev->SetReactState(REACT_AGGRESSIVE); - maiev->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - maiev->AI()->AttackStart(me); - } + } + events.ScheduleEvent(EVENT_PHASE_2_START, 1000); + break; + case EVENT_PHASE_2_SUMMON1: + me->LoadEquipment(1, true); + me->GetMotionMaster()->MovePoint(POINT_ILLIDAN_HOVER, 727.875f, 305.365f, 356.0f, false, true); + break; + case EVENT_PHASE_2_SUMMON2: + Talk(SAY_ILLIDAN_SUMMONFLAMES); + me->LoadEquipment(0, true); + me->CastSpell(me, SPELL_THROW_GLAIVE, false); + me->CastSpell(me, SPELL_THROW_GLAIVE2, false); + break; + case EVENT_PHASE_2_CHANGE_POS: + beamPosId = (beamPosId + 1) % MAX_EYE_BEAM_POS; + events.ScheduleEvent(EVENT_SPELL_FIREBALL, 8000, GROUP_PHASE_2_ABILITY); + events.ScheduleEvent(EVENT_SPELL_DARK_BARRAGE, 18000, GROUP_PHASE_2_ABILITY); + events.ScheduleEvent(EVENT_PHASE_2_EYE_BEAM, urand(25000, 50000), GROUP_PHASE_2_ABILITY); + me->GetMotionMaster()->MovePoint(POINT_ILLIDAN_HOVER, airHoverPos[beamPosId], false, true); + break; + case EVENT_PHASE_2_EYE_BEAM: + me->SummonCreature(NPC_ILLIDAN_DB_TARGET, eyeBeamPos[beamPosId], TEMPSUMMON_TIMED_DESPAWN, 15000); + events.CancelEventGroup(GROUP_PHASE_2_ABILITY); + events.ScheduleEvent(EVENT_PHASE_2_CHANGE_POS, 20000); + + events2.ScheduleEvent(EVENT_PHASE_2_EYE_BEAM_START, 2000); + events2.ScheduleEvent(EVENT_PHASE_2_INTERRUPT, 20000); + break; + case EVENT_SPELL_FIREBALL: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) + me->CastSpell(target, SPELL_FIREBALL, false); + events.ScheduleEvent(EVENT_SPELL_FIREBALL, 2200, GROUP_PHASE_2_ABILITY); + break; + case EVENT_SPELL_DARK_BARRAGE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) + me->CastSpell(target, SPELL_DARK_BARRAGE, false); + events.ScheduleEvent(EVENT_SPELL_DARK_BARRAGE, 30000, GROUP_PHASE_2_ABILITY); + break; + case EVENT_START_PHASE_2_WEAPON: + me->LoadEquipment(1, true); + me->HandleEmoteCommand(EMOTE_ONESHOT_LAND); + me->SetDisableGravity(false); + break; + case EVENT_START_PHASE_3_LAND: + me->getThreatManager().resetAllAggro(); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->SetTarget(me->GetVictim()->GetGUID()); + AttackStart(me->GetVictim()); + me->GetMotionMaster()->MoveChase(me->GetVictim()); + ScheduleNormalEvents(3); + events.ScheduleEvent(EVENT_PHASE_5_START, 1000); + break; + // /////////////////////////// + // PHASE 4 + // /////////////////////////// + case EVENT_PHASE_4_START: + me->CastSpell(me, SPELL_DEMON_TRANSFORM_1, true); + me->getThreatManager().resetAllAggro(); + me->GetMotionMaster()->MoveChase(me->GetVictim(), 35.0f); + events.Reset(); + events.ScheduleEvent(EVENT_SPELL_SHADOW_BLAST, 11000); + events.ScheduleEvent(EVENT_MOVE_MAIEV, 5000); + events.ScheduleEvent(EVENT_FINISH_TRANSFORM, 10500); + events.ScheduleEvent(EVENT_SPELL_FLAME_BURST, 21000); + events.ScheduleEvent(EVENT_SPELL_SHADOW_DEMONS, 36000); + events.ScheduleEvent(EVENT_REMOVE_DEMON_FORM, 60000); + break; + case EVENT_SPELL_SHADOW_BLAST: + me->CastSpell(me->GetVictim(), SPELL_SHADOW_BLAST, false); + events.ScheduleEvent(EVENT_SPELL_SHADOW_BLAST, 2200); + break; + case EVENT_SPELL_FLAME_BURST: + me->CastSpell(me, SPELL_FLAME_BURST, false); + events.ScheduleEvent(EVENT_SPELL_FLAME_BURST, 22000); + break; + case EVENT_SPELL_SHADOW_DEMONS: + me->CastSpell(me, SPELL_SUMMON_SHADOW_DEMON, false); + break; + case EVENT_REMOVE_DEMON_FORM: + me->CastSpell(me, SPELL_DEMON_TRANSFORM_1, true); + me->getThreatManager().resetAllAggro(); + events.Reset(); + if (summons.HasEntry(NPC_MAIEV_SHADOWSONG)) + { ScheduleNormalEvents(5); - break; - // /////////////////////////// - // PHASE 2 - // /////////////////////////// - case EVENT_PHASE_2_START: - if (me->HealthBelowPct(65)) - { - if (events2.GetNextEventTime(EVENT_SUMMON_MINIONS2) != 0) - events2.RescheduleEvent(EVENT_SUMMON_MINIONS2, 0); - - Talk(SAY_ILLIDAN_TAKEOFF); - me->SendMeleeAttackStop(me->GetVictim()); - me->SetTarget(0); - me->GetMotionMaster()->Clear(); - me->StopMovingOnCurrentPos(); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF); - me->SetDisableGravity(true); - - events.Reset(); - events.ScheduleEvent(EVENT_PHASE_2_SUMMON1, 6000); - break; - } - events.ScheduleEvent(EVENT_PHASE_2_START, 1000); - break; - case EVENT_PHASE_2_SUMMON1: - me->LoadEquipment(1, true); - me->GetMotionMaster()->MovePoint(POINT_ILLIDAN_HOVER, 727.875f, 305.365f, 356.0f, false, true); - break; - case EVENT_PHASE_2_SUMMON2: - Talk(SAY_ILLIDAN_SUMMONFLAMES); - me->LoadEquipment(0, true); - me->CastSpell(me, SPELL_THROW_GLAIVE, false); - me->CastSpell(me, SPELL_THROW_GLAIVE2, false); - break; - case EVENT_PHASE_2_CHANGE_POS: - beamPosId = (beamPosId+1)%MAX_EYE_BEAM_POS; - events.ScheduleEvent(EVENT_SPELL_FIREBALL, 8000, GROUP_PHASE_2_ABILITY); - events.ScheduleEvent(EVENT_SPELL_DARK_BARRAGE, 18000, GROUP_PHASE_2_ABILITY); - events.ScheduleEvent(EVENT_PHASE_2_EYE_BEAM, urand(25000, 50000), GROUP_PHASE_2_ABILITY); - me->GetMotionMaster()->MovePoint(POINT_ILLIDAN_HOVER, airHoverPos[beamPosId], false, true); - break; - case EVENT_PHASE_2_EYE_BEAM: - me->SummonCreature(NPC_ILLIDAN_DB_TARGET, eyeBeamPos[beamPosId], TEMPSUMMON_TIMED_DESPAWN, 15000); - events.CancelEventGroup(GROUP_PHASE_2_ABILITY); - events.ScheduleEvent(EVENT_PHASE_2_CHANGE_POS, 20000); - - events2.ScheduleEvent(EVENT_PHASE_2_EYE_BEAM_START, 2000); - events2.ScheduleEvent(EVENT_PHASE_2_INTERRUPT, 20000); - break; - case EVENT_SPELL_FIREBALL: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) - me->CastSpell(target, SPELL_FIREBALL, false); - events.ScheduleEvent(EVENT_SPELL_FIREBALL, 2200, GROUP_PHASE_2_ABILITY); - break; - case EVENT_SPELL_DARK_BARRAGE: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) - me->CastSpell(target, SPELL_DARK_BARRAGE, false); - events.ScheduleEvent(EVENT_SPELL_DARK_BARRAGE, 30000, GROUP_PHASE_2_ABILITY); - break; - case EVENT_START_PHASE_2_WEAPON: - me->LoadEquipment(1, true); - me->HandleEmoteCommand(EMOTE_ONESHOT_LAND); - me->SetDisableGravity(false); - break; - case EVENT_START_PHASE_3_LAND: - me->getThreatManager().resetAllAggro(); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->SetTarget(me->GetVictim()->GetGUID()); - AttackStart(me->GetVictim()); - me->GetMotionMaster()->MoveChase(me->GetVictim()); + events.DelayEvents(11000); + events.ScheduleEvent(EVENT_MOVE_MAIEV, 10000); + events.ScheduleEvent(EVENT_FINISH_TRANSFORM, 10500); + } + else + { ScheduleNormalEvents(3); events.ScheduleEvent(EVENT_PHASE_5_START, 1000); - break; - // /////////////////////////// - // PHASE 4 - // /////////////////////////// - case EVENT_PHASE_4_START: - me->CastSpell(me, SPELL_DEMON_TRANSFORM_1, true); - me->getThreatManager().resetAllAggro(); - me->GetMotionMaster()->MoveChase(me->GetVictim(), 35.0f); - events.Reset(); - events.ScheduleEvent(EVENT_SPELL_SHADOW_BLAST, 11000); - events.ScheduleEvent(EVENT_MOVE_MAIEV, 5000); + events.DelayEvents(11000); events.ScheduleEvent(EVENT_FINISH_TRANSFORM, 10500); - events.ScheduleEvent(EVENT_SPELL_FLAME_BURST, 21000); - events.ScheduleEvent(EVENT_SPELL_SHADOW_DEMONS, 36000); - events.ScheduleEvent(EVENT_REMOVE_DEMON_FORM, 60000); - break; - case EVENT_SPELL_SHADOW_BLAST: - me->CastSpell(me->GetVictim(), SPELL_SHADOW_BLAST, false); - events.ScheduleEvent(EVENT_SPELL_SHADOW_BLAST, 2200); - break; - case EVENT_SPELL_FLAME_BURST: - me->CastSpell(me, SPELL_FLAME_BURST, false); - events.ScheduleEvent(EVENT_SPELL_FLAME_BURST, 22000); - break; - case EVENT_SPELL_SHADOW_DEMONS: - me->CastSpell(me, SPELL_SUMMON_SHADOW_DEMON, false); - break; - case EVENT_REMOVE_DEMON_FORM: - me->CastSpell(me, SPELL_DEMON_TRANSFORM_1, true); - me->getThreatManager().resetAllAggro(); - events.Reset(); - if (summons.HasEntry(NPC_MAIEV_SHADOWSONG)) + } + break; + case EVENT_MOVE_MAIEV: + if (Creature* maiev = summons.GetCreatureWithEntry(NPC_MAIEV_SHADOWSONG)) + { + if (events.GetNextEventTime(EVENT_REMOVE_DEMON_FORM) != 0) { - ScheduleNormalEvents(5); - events.DelayEvents(11000); - events.ScheduleEvent(EVENT_MOVE_MAIEV, 10000); - events.ScheduleEvent(EVENT_FINISH_TRANSFORM, 10500); + maiev->AI()->DoAction(ACTION_MAIEV_SET_DIST30); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, -25.0f, true)) + maiev->GetMotionMaster()->MoveCharge(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 7.0f, 0); + else + maiev->GetMotionMaster()->MoveCharge(678.04f, 378.34f, 353.0f, 7.0f, 0); } else { - ScheduleNormalEvents(3); - events.ScheduleEvent(EVENT_PHASE_5_START, 1000); - events.DelayEvents(11000); - events.ScheduleEvent(EVENT_FINISH_TRANSFORM, 10500); + maiev->AI()->DoAction(ACTION_MAIEV_SET_DIST0); + maiev->GetMotionMaster()->MoveChase(me, 0.0f); } - break; - case EVENT_MOVE_MAIEV: - if (Creature* maiev = summons.GetCreatureWithEntry(NPC_MAIEV_SHADOWSONG)) - { - if (events.GetNextEventTime(EVENT_REMOVE_DEMON_FORM) != 0) - { - maiev->AI()->DoAction(ACTION_MAIEV_SET_DIST30); - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, -25.0f, true)) - maiev->GetMotionMaster()->MoveCharge(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 7.0f, 0); - else - maiev->GetMotionMaster()->MoveCharge(678.04f, 378.34f, 353.0f, 7.0f, 0); - } - else - { - maiev->AI()->DoAction(ACTION_MAIEV_SET_DIST0); - maiev->GetMotionMaster()->MoveChase(me, 0.0f); - } - } - break; - case EVENT_FINISH_TRANSFORM: - me->GetMotionMaster()->MoveChase(me->GetVictim(), events.GetNextEventTime(EVENT_REMOVE_DEMON_FORM) != 0 ? 35.0f : 0.0f); - break; - } - - if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)) - DoMeleeAttackIfReady(); + } + break; + case EVENT_FINISH_TRANSFORM: + me->GetMotionMaster()->MoveChase(me->GetVictim(), events.GetNextEventTime(EVENT_REMOVE_DEMON_FORM) != 0 ? 35.0f : 0.0f); + break; } - - bool CheckEvadeIfOutOfCombatArea() const - { - return me->GetHomePosition().GetExactDist(me) > 90.0f || !SelectTargetFromPlayerList(80.0f); - } - }; - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)) + DoMeleeAttackIfReady(); } + + bool CheckEvadeIfOutOfCombatArea() const + { + return me->GetHomePosition().GetExactDist(me) > 90.0f || !SelectTargetFromPlayerList(80.0f); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; enum Akama @@ -746,658 +746,658 @@ enum Akama class npc_akama_illidan : public CreatureScript { - public: - npc_akama_illidan() : CreatureScript("npc_akama_illidan") { } +public: + npc_akama_illidan() : CreatureScript("npc_akama_illidan") { } - struct npc_akama_illidanAI : public npc_escortAI + struct npc_akama_illidanAI : public npc_escortAI + { + npc_akama_illidanAI(Creature* creature) : npc_escortAI(creature), summons(me) { - npc_akama_illidanAI(Creature* creature) : npc_escortAI(creature), summons(me) + instance = creature->GetInstanceScript(); + if (instance->GetBossState(DATA_AKAMA_FINISHED) == DONE) { - instance = creature->GetInstanceScript(); - if (instance->GetBossState(DATA_AKAMA_FINISHED) == DONE) - { - me->GetMap()->LoadGrid(751.664f, 238.933f); - me->SetHomePosition(751.664f, 238.933f, 353.106f, 2.18f); - me->NearTeleportTo(751.664f, 238.933f, 353.106f, 2.18f); - } + me->GetMap()->LoadGrid(751.664f, 238.933f); + me->SetHomePosition(751.664f, 238.933f, 353.106f, 2.18f); + me->NearTeleportTo(751.664f, 238.933f, 353.106f, 2.18f); } + } - void DoAction(int32 param) + void DoAction(int32 param) + { + if (param == ACTION_FIGHT_MINIONS) { - if (param == ACTION_FIGHT_MINIONS) - { - me->CombatStop(true); - events.ScheduleEvent(EVENT_AKAMA_SUMMON_ILLIDARI, 8000); - events.ScheduleEvent(EVENT_AKAMA_SPELL_CHAIN, 7000); - events.ScheduleEvent(EVENT_AKAMA_HEALTH, 1000); - me->GetMotionMaster()->MoveCharge(741.97f, 358.74f, 353.0f, 10.0f, POINT_FIGHT_MINIONS); - Talk(SAY_AKAMA_LEAVE); - } - else if (param == ACTION_ILLIDAN_DEAD) - { - events.Reset(); - summons.DespawnAll(); - me->CombatStop(true); - } + me->CombatStop(true); + events.ScheduleEvent(EVENT_AKAMA_SUMMON_ILLIDARI, 8000); + events.ScheduleEvent(EVENT_AKAMA_SPELL_CHAIN, 7000); + events.ScheduleEvent(EVENT_AKAMA_HEALTH, 1000); + me->GetMotionMaster()->MoveCharge(741.97f, 358.74f, 353.0f, 10.0f, POINT_FIGHT_MINIONS); + Talk(SAY_AKAMA_LEAVE); } - - void Reset() + else if (param == ACTION_ILLIDAN_DEAD) { - me->SetReactState(REACT_AGGRESSIVE); - me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - me->setActive(false); - me->SetVisible(instance->GetBossState(DATA_ILLIDARI_COUNCIL) == DONE && instance->GetBossState(DATA_ILLIDAN_STORMRAGE) != DONE); events.Reset(); summons.DespawnAll(); + me->CombatStop(true); } - - void sGossipSelect(Player* player, uint32 /*sender*/, uint32 /*action*/) - { - CloseGossipMenuFor(player); - me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); - me->setActive(true); - - if (instance->GetBossState(DATA_AKAMA_FINISHED) != DONE) - { - me->SetReactState(REACT_PASSIVE); - Start(false, true); - SetDespawnAtEnd(false); - } - else - { - me->GetMotionMaster()->MovePoint(POINT_ILLIDAN, 744.45f, 304.84f, 353.0f); - events.Reset(); - events.ScheduleEvent(EVENT_AKAMA_SCENE_20, 5000); - events.ScheduleEvent(EVENT_AKAMA_SCENE_21, 8000); - events.ScheduleEvent(EVENT_AKAMA_SCENE_22, 10000); - events.ScheduleEvent(EVENT_AKAMA_SCENE_23, 23000); - events.ScheduleEvent(EVENT_AKAMA_SCENE_24, 34000); - events.ScheduleEvent(EVENT_AKAMA_SCENE_25, 41000); - events.ScheduleEvent(EVENT_AKAMA_SCENE_26, 46000); - events.ScheduleEvent(EVENT_AKAMA_SCENE_27, 49000); - events.ScheduleEvent(EVENT_AKAMA_SCENE_28, 49200); - events.ScheduleEvent(EVENT_AKAMA_SCENE_29, 52000); - } - } - - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - summon->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); - if (summon->GetEntry() == NPC_ILLIDARI_ELITE) - { - me->AddThreat(summon, 1000000.0f); - summon->AddThreat(me, 1000000.0f); - summon->AI()->AttackStart(me); - AttackStart(summon); - } - } - - void WaypointReached(uint32 pointId) - { - if (pointId == POINT_DOORS) - { - SetEscortPaused(true); - events.ScheduleEvent(EVENT_AKAMA_SCENE_1, 0); - events.ScheduleEvent(EVENT_AKAMA_SCENE_2, 4000); - events.ScheduleEvent(EVENT_AKAMA_SCENE_3, 7000); - events.ScheduleEvent(EVENT_AKAMA_SCENE_4, 17000); - events.ScheduleEvent(EVENT_AKAMA_SCENE_5, 23000); - events.ScheduleEvent(EVENT_AKAMA_SCENE_6, 25000); - events.ScheduleEvent(EVENT_AKAMA_SCENE_7, 31000); - events.ScheduleEvent(EVENT_AKAMA_SCENE_8, 40000); - events.ScheduleEvent(EVENT_AKAMA_SCENE_9, 54000); - events.ScheduleEvent(EVENT_AKAMA_SCENE_10, 57000); - events.ScheduleEvent(EVENT_AKAMA_SCENE_11, 62000); - } - else if (pointId == POINT_ILLIDAN) - { - me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - me->setActive(false); - me->SetReactState(REACT_AGGRESSIVE); - } - } - - void MoveInLineOfSight(Unit* /*who*/) { } - - void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) - { - if (damage >= me->GetHealth()) - damage = 0; - } - - void UpdateEscortAI(uint32 diff) - { - events.Update(diff); - switch (events.ExecuteEvent()) - { - case EVENT_AKAMA_SCENE_1: - me->SetFacingTo(0.0f); - break; - case EVENT_AKAMA_SCENE_2: - Talk(SAY_AKAMA_DOORS); - break; - case EVENT_AKAMA_SCENE_3: - me->CastSpell(me, SPELL_AKAMA_DOOR_FAIL, false); - break; - case EVENT_AKAMA_SCENE_4: - Talk(SAY_AKAMA_FAIL); - break; - case EVENT_AKAMA_SCENE_5: - me->SummonCreature(NPC_SPIRIT_OF_UDALO, me->GetPositionX()-5.0f, me->GetPositionY()+8.0f, me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 60000); - me->SummonCreature(NPC_SPIRIT_OF_OLUM, me->GetPositionX()-5.0f, me->GetPositionY()-8.0f, me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 60000); - break; - case EVENT_AKAMA_SCENE_6: - if (Creature* udalo = me->FindNearestCreature(NPC_SPIRIT_OF_UDALO, 15.0f)) - udalo->AI()->Talk(SAY_UDALO); - break; - case EVENT_AKAMA_SCENE_7: - if (Creature* olum = me->FindNearestCreature(NPC_SPIRIT_OF_OLUM, 15.0f)) - olum->AI()->Talk(SAY_OLUM); - break; - case EVENT_AKAMA_SCENE_8: - me->CastSpell(me, SPELL_AKAMA_DOOR_OPEN, false); - if (Creature* olum = me->FindNearestCreature(NPC_SPIRIT_OF_OLUM, 15.0f)) - olum->CastSpell(olum, SPELL_AKAMA_DOOR_OPEN, false); - if (Creature* udalo = me->FindNearestCreature(NPC_SPIRIT_OF_UDALO, 15.0f)) - udalo->CastSpell(udalo, SPELL_AKAMA_DOOR_OPEN, false); - break; - case EVENT_AKAMA_SCENE_9: - instance->SetBossState(DATA_AKAMA_FINISHED, NOT_STARTED); - instance->SetBossState(DATA_AKAMA_FINISHED, DONE); - break; - case EVENT_AKAMA_SCENE_10: - Talk(SAY_AKAMA_BEWARE); - break; - case EVENT_AKAMA_SCENE_11: - SetEscortPaused(false); - break; - case EVENT_AKAMA_SCENE_20: - if (Creature* illidan = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_ILLIDAN_STORMRAGE))) - illidan->SetStandState(UNIT_STAND_STATE_STAND); - break; - case EVENT_AKAMA_SCENE_21: - me->SetFacingTo(M_PI); - break; - case EVENT_AKAMA_SCENE_22: - if (Creature* illidan = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_ILLIDAN_STORMRAGE))) - illidan->AI()->Talk(SAY_ILLIDAN_AKAMA1); - break; - case EVENT_AKAMA_SCENE_23: - Talk(SAY_AKAMA_ILLIDAN1); - break; - case EVENT_AKAMA_SCENE_24: - if (Creature* illidan = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_ILLIDAN_STORMRAGE))) - illidan->AI()->Talk(SAY_ILLIDAN_AKAMA2); - break; - case EVENT_AKAMA_SCENE_25: - Talk(SAY_AKAMA_ILLIDAN2); - break; - case EVENT_AKAMA_SCENE_26: - if (Creature* illidan = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_ILLIDAN_STORMRAGE))) - illidan->AI()->Talk(SAY_ILLIDAN_AKAMA3); - break; - case EVENT_AKAMA_SCENE_27: - if (Creature* illidan = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_ILLIDAN_STORMRAGE))) - illidan->LoadEquipment(1, true); - break; - case EVENT_AKAMA_SCENE_28: - if (Creature* illidan = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_ILLIDAN_STORMRAGE))) - illidan->HandleEmoteCommand(EMOTE_ONESHOT_TALK_NO_SHEATHE); - break; - case EVENT_AKAMA_SCENE_29: - if (Creature* illidan = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_ILLIDAN_STORMRAGE))) - { - illidan->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); - illidan->SetInCombatWithZone(); - AttackStart(illidan); - } - break; - case EVENT_AKAMA_SUMMON_ILLIDARI: - me->SummonCreature(NPC_ILLIDARI_ELITE, 742.55f, 359.12f, 353.0f, 4.35f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); - events.ScheduleEvent(EVENT_AKAMA_SUMMON_ILLIDARI, urand(2000, 6000)); - break; - case EVENT_AKAMA_SPELL_CHAIN: - if (me->GetVictim()) - me->CastSpell(me->GetVictim(), SPELL_CHAIN_LIGHTNING, false); - events.ScheduleEvent(EVENT_AKAMA_SPELL_CHAIN, 20000); - break; - case EVENT_AKAMA_HEALTH: - if (me->HealthBelowPct(20)) - me->CastSpell(me, SPELL_HEALING_POTION, false); - events.ScheduleEvent(EVENT_AKAMA_HEALTH, 1000); - break; - } - - DoMeleeAttackIfReady(); - } - - private: - EventMap events; - SummonList summons; - InstanceScript* instance; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); } + + void Reset() + { + me->SetReactState(REACT_AGGRESSIVE); + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + me->setActive(false); + me->SetVisible(instance->GetBossState(DATA_ILLIDARI_COUNCIL) == DONE && instance->GetBossState(DATA_ILLIDAN_STORMRAGE) != DONE); + events.Reset(); + summons.DespawnAll(); + } + + void sGossipSelect(Player* player, uint32 /*sender*/, uint32 /*action*/) + { + CloseGossipMenuFor(player); + me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); + me->setActive(true); + + if (instance->GetBossState(DATA_AKAMA_FINISHED) != DONE) + { + me->SetReactState(REACT_PASSIVE); + Start(false, true); + SetDespawnAtEnd(false); + } + else + { + me->GetMotionMaster()->MovePoint(POINT_ILLIDAN, 744.45f, 304.84f, 353.0f); + events.Reset(); + events.ScheduleEvent(EVENT_AKAMA_SCENE_20, 5000); + events.ScheduleEvent(EVENT_AKAMA_SCENE_21, 8000); + events.ScheduleEvent(EVENT_AKAMA_SCENE_22, 10000); + events.ScheduleEvent(EVENT_AKAMA_SCENE_23, 23000); + events.ScheduleEvent(EVENT_AKAMA_SCENE_24, 34000); + events.ScheduleEvent(EVENT_AKAMA_SCENE_25, 41000); + events.ScheduleEvent(EVENT_AKAMA_SCENE_26, 46000); + events.ScheduleEvent(EVENT_AKAMA_SCENE_27, 49000); + events.ScheduleEvent(EVENT_AKAMA_SCENE_28, 49200); + events.ScheduleEvent(EVENT_AKAMA_SCENE_29, 52000); + } + } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + summon->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); + if (summon->GetEntry() == NPC_ILLIDARI_ELITE) + { + me->AddThreat(summon, 1000000.0f); + summon->AddThreat(me, 1000000.0f); + summon->AI()->AttackStart(me); + AttackStart(summon); + } + } + + void WaypointReached(uint32 pointId) + { + if (pointId == POINT_DOORS) + { + SetEscortPaused(true); + events.ScheduleEvent(EVENT_AKAMA_SCENE_1, 0); + events.ScheduleEvent(EVENT_AKAMA_SCENE_2, 4000); + events.ScheduleEvent(EVENT_AKAMA_SCENE_3, 7000); + events.ScheduleEvent(EVENT_AKAMA_SCENE_4, 17000); + events.ScheduleEvent(EVENT_AKAMA_SCENE_5, 23000); + events.ScheduleEvent(EVENT_AKAMA_SCENE_6, 25000); + events.ScheduleEvent(EVENT_AKAMA_SCENE_7, 31000); + events.ScheduleEvent(EVENT_AKAMA_SCENE_8, 40000); + events.ScheduleEvent(EVENT_AKAMA_SCENE_9, 54000); + events.ScheduleEvent(EVENT_AKAMA_SCENE_10, 57000); + events.ScheduleEvent(EVENT_AKAMA_SCENE_11, 62000); + } + else if (pointId == POINT_ILLIDAN) + { + me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + me->setActive(false); + me->SetReactState(REACT_AGGRESSIVE); + } + } + + void MoveInLineOfSight(Unit* /*who*/) { } + + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) + { + if (damage >= me->GetHealth()) + damage = 0; + } + + void UpdateEscortAI(uint32 diff) + { + events.Update(diff); + switch (events.ExecuteEvent()) + { + case EVENT_AKAMA_SCENE_1: + me->SetFacingTo(0.0f); + break; + case EVENT_AKAMA_SCENE_2: + Talk(SAY_AKAMA_DOORS); + break; + case EVENT_AKAMA_SCENE_3: + me->CastSpell(me, SPELL_AKAMA_DOOR_FAIL, false); + break; + case EVENT_AKAMA_SCENE_4: + Talk(SAY_AKAMA_FAIL); + break; + case EVENT_AKAMA_SCENE_5: + me->SummonCreature(NPC_SPIRIT_OF_UDALO, me->GetPositionX() - 5.0f, me->GetPositionY() + 8.0f, me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 60000); + me->SummonCreature(NPC_SPIRIT_OF_OLUM, me->GetPositionX() - 5.0f, me->GetPositionY() - 8.0f, me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 60000); + break; + case EVENT_AKAMA_SCENE_6: + if (Creature* udalo = me->FindNearestCreature(NPC_SPIRIT_OF_UDALO, 15.0f)) + udalo->AI()->Talk(SAY_UDALO); + break; + case EVENT_AKAMA_SCENE_7: + if (Creature* olum = me->FindNearestCreature(NPC_SPIRIT_OF_OLUM, 15.0f)) + olum->AI()->Talk(SAY_OLUM); + break; + case EVENT_AKAMA_SCENE_8: + me->CastSpell(me, SPELL_AKAMA_DOOR_OPEN, false); + if (Creature* olum = me->FindNearestCreature(NPC_SPIRIT_OF_OLUM, 15.0f)) + olum->CastSpell(olum, SPELL_AKAMA_DOOR_OPEN, false); + if (Creature* udalo = me->FindNearestCreature(NPC_SPIRIT_OF_UDALO, 15.0f)) + udalo->CastSpell(udalo, SPELL_AKAMA_DOOR_OPEN, false); + break; + case EVENT_AKAMA_SCENE_9: + instance->SetBossState(DATA_AKAMA_FINISHED, NOT_STARTED); + instance->SetBossState(DATA_AKAMA_FINISHED, DONE); + break; + case EVENT_AKAMA_SCENE_10: + Talk(SAY_AKAMA_BEWARE); + break; + case EVENT_AKAMA_SCENE_11: + SetEscortPaused(false); + break; + case EVENT_AKAMA_SCENE_20: + if (Creature* illidan = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_ILLIDAN_STORMRAGE))) + illidan->SetStandState(UNIT_STAND_STATE_STAND); + break; + case EVENT_AKAMA_SCENE_21: + me->SetFacingTo(M_PI); + break; + case EVENT_AKAMA_SCENE_22: + if (Creature* illidan = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_ILLIDAN_STORMRAGE))) + illidan->AI()->Talk(SAY_ILLIDAN_AKAMA1); + break; + case EVENT_AKAMA_SCENE_23: + Talk(SAY_AKAMA_ILLIDAN1); + break; + case EVENT_AKAMA_SCENE_24: + if (Creature* illidan = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_ILLIDAN_STORMRAGE))) + illidan->AI()->Talk(SAY_ILLIDAN_AKAMA2); + break; + case EVENT_AKAMA_SCENE_25: + Talk(SAY_AKAMA_ILLIDAN2); + break; + case EVENT_AKAMA_SCENE_26: + if (Creature* illidan = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_ILLIDAN_STORMRAGE))) + illidan->AI()->Talk(SAY_ILLIDAN_AKAMA3); + break; + case EVENT_AKAMA_SCENE_27: + if (Creature* illidan = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_ILLIDAN_STORMRAGE))) + illidan->LoadEquipment(1, true); + break; + case EVENT_AKAMA_SCENE_28: + if (Creature* illidan = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_ILLIDAN_STORMRAGE))) + illidan->HandleEmoteCommand(EMOTE_ONESHOT_TALK_NO_SHEATHE); + break; + case EVENT_AKAMA_SCENE_29: + if (Creature* illidan = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_ILLIDAN_STORMRAGE))) + { + illidan->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + illidan->SetInCombatWithZone(); + AttackStart(illidan); + } + break; + case EVENT_AKAMA_SUMMON_ILLIDARI: + me->SummonCreature(NPC_ILLIDARI_ELITE, 742.55f, 359.12f, 353.0f, 4.35f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); + events.ScheduleEvent(EVENT_AKAMA_SUMMON_ILLIDARI, urand(2000, 6000)); + break; + case EVENT_AKAMA_SPELL_CHAIN: + if (me->GetVictim()) + me->CastSpell(me->GetVictim(), SPELL_CHAIN_LIGHTNING, false); + events.ScheduleEvent(EVENT_AKAMA_SPELL_CHAIN, 20000); + break; + case EVENT_AKAMA_HEALTH: + if (me->HealthBelowPct(20)) + me->CastSpell(me, SPELL_HEALING_POTION, false); + events.ScheduleEvent(EVENT_AKAMA_HEALTH, 1000); + break; + } + + DoMeleeAttackIfReady(); + } + + private: + EventMap events; + SummonList summons; + InstanceScript* instance; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class spell_illidan_draw_soul : public SpellScriptLoader { - public: - spell_illidan_draw_soul() : SpellScriptLoader("spell_illidan_draw_soul") { } +public: + spell_illidan_draw_soul() : SpellScriptLoader("spell_illidan_draw_soul") { } - class spell_illidan_draw_soul_SpellScript : public SpellScript + class spell_illidan_draw_soul_SpellScript : public SpellScript + { + PrepareSpellScript(spell_illidan_draw_soul_SpellScript); + + void HandleScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_illidan_draw_soul_SpellScript); - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - target->CastSpell(GetCaster(), SPELL_DRAW_SOUL_HEAL, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_illidan_draw_soul_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_illidan_draw_soul_SpellScript(); + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) + target->CastSpell(GetCaster(), SPELL_DRAW_SOUL_HEAL, true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_illidan_draw_soul_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_illidan_draw_soul_SpellScript(); + } }; class spell_illidan_parasitic_shadowfiend : public SpellScriptLoader { - public: - spell_illidan_parasitic_shadowfiend() : SpellScriptLoader("spell_illidan_parasitic_shadowfiend") { } +public: + spell_illidan_parasitic_shadowfiend() : SpellScriptLoader("spell_illidan_parasitic_shadowfiend") { } - class spell_illidan_parasitic_shadowfiend_AuraScript : public AuraScript + class spell_illidan_parasitic_shadowfiend_AuraScript : public AuraScript + { + PrepareAuraScript(spell_illidan_parasitic_shadowfiend_AuraScript) + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_illidan_parasitic_shadowfiend_AuraScript) - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (!GetTarget()->HasAura(SPELL_SHADOW_PRISON) && GetTarget()->GetInstanceScript() && GetTarget()->GetInstanceScript()->IsEncounterInProgress()) - GetTarget()->CastSpell(GetTarget(), SPELL_SUMMON_PARASITIC_SHADOWFIENDS, true); - } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_illidan_parasitic_shadowfiend_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_illidan_parasitic_shadowfiend_AuraScript(); + if (!GetTarget()->HasAura(SPELL_SHADOW_PRISON) && GetTarget()->GetInstanceScript() && GetTarget()->GetInstanceScript()->IsEncounterInProgress()) + GetTarget()->CastSpell(GetTarget(), SPELL_SUMMON_PARASITIC_SHADOWFIENDS, true); } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_illidan_parasitic_shadowfiend_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_illidan_parasitic_shadowfiend_AuraScript(); + } }; class spell_illidan_parasitic_shadowfiend_trigger : public SpellScriptLoader { - public: - spell_illidan_parasitic_shadowfiend_trigger() : SpellScriptLoader("spell_illidan_parasitic_shadowfiend_trigger") { } +public: + spell_illidan_parasitic_shadowfiend_trigger() : SpellScriptLoader("spell_illidan_parasitic_shadowfiend_trigger") { } - class spell_illidan_parasitic_shadowfiend_trigger_AuraScript : public AuraScript + class spell_illidan_parasitic_shadowfiend_trigger_AuraScript : public AuraScript + { + PrepareAuraScript(spell_illidan_parasitic_shadowfiend_trigger_AuraScript) + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_illidan_parasitic_shadowfiend_trigger_AuraScript) - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (!GetTarget()->HasAura(SPELL_SHADOW_PRISON) && GetTarget()->GetInstanceScript() && GetTarget()->GetInstanceScript()->IsEncounterInProgress()) - GetTarget()->CastSpell(GetTarget(), SPELL_SUMMON_PARASITIC_SHADOWFIENDS, true); - } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_illidan_parasitic_shadowfiend_trigger_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_illidan_parasitic_shadowfiend_trigger_AuraScript(); + if (!GetTarget()->HasAura(SPELL_SHADOW_PRISON) && GetTarget()->GetInstanceScript() && GetTarget()->GetInstanceScript()->IsEncounterInProgress()) + GetTarget()->CastSpell(GetTarget(), SPELL_SUMMON_PARASITIC_SHADOWFIENDS, true); } - class spell_illidan_parasitic_shadowfiend_trigger_SpellScript : public SpellScript + void Register() { - PrepareSpellScript(spell_illidan_parasitic_shadowfiend_trigger_SpellScript); - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Creature* target = GetHitCreature()) - target->DespawnOrUnsummon(1); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_illidan_parasitic_shadowfiend_trigger_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_illidan_parasitic_shadowfiend_trigger_SpellScript(); + AfterEffectRemove += AuraEffectRemoveFn(spell_illidan_parasitic_shadowfiend_trigger_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); } + }; + + AuraScript* GetAuraScript() const + { + return new spell_illidan_parasitic_shadowfiend_trigger_AuraScript(); + } + + class spell_illidan_parasitic_shadowfiend_trigger_SpellScript : public SpellScript + { + PrepareSpellScript(spell_illidan_parasitic_shadowfiend_trigger_SpellScript); + + void HandleScriptEffect(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (Creature* target = GetHitCreature()) + target->DespawnOrUnsummon(1); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_illidan_parasitic_shadowfiend_trigger_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_illidan_parasitic_shadowfiend_trigger_SpellScript(); + } }; class spell_illidan_glaive_throw : public SpellScriptLoader { - public: - spell_illidan_glaive_throw() : SpellScriptLoader("spell_illidan_glaive_throw") { } +public: + spell_illidan_glaive_throw() : SpellScriptLoader("spell_illidan_glaive_throw") { } - class spell_illidan_glaive_throw_SpellScript : public SpellScript + class spell_illidan_glaive_throw_SpellScript : public SpellScript + { + PrepareSpellScript(spell_illidan_glaive_throw_SpellScript); + + void HandleDummy(SpellEffIndex effIndex) { - PrepareSpellScript(spell_illidan_glaive_throw_SpellScript); - - void HandleDummy(SpellEffIndex effIndex) - { - PreventHitEffect(effIndex); - if (Unit* target = GetHitUnit()) - target->CastSpell(target, SPELL_SUMMON_GLAIVE, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_illidan_glaive_throw_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_illidan_glaive_throw_SpellScript(); + PreventHitEffect(effIndex); + if (Unit* target = GetHitUnit()) + target->CastSpell(target, SPELL_SUMMON_GLAIVE, true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_illidan_glaive_throw_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_illidan_glaive_throw_SpellScript(); + } }; class spell_illidan_tear_of_azzinoth_summon_channel : public SpellScriptLoader { - public: - spell_illidan_tear_of_azzinoth_summon_channel() : SpellScriptLoader("spell_illidan_tear_of_azzinoth_summon_channel") { } +public: + spell_illidan_tear_of_azzinoth_summon_channel() : SpellScriptLoader("spell_illidan_tear_of_azzinoth_summon_channel") { } - class spell_illidan_tear_of_azzinoth_summon_channel_AuraScript : public AuraScript + class spell_illidan_tear_of_azzinoth_summon_channel_AuraScript : public AuraScript + { + PrepareAuraScript(spell_illidan_tear_of_azzinoth_summon_channel_AuraScript); + + void OnPeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_illidan_tear_of_azzinoth_summon_channel_AuraScript); - - void OnPeriodic(AuraEffect const* /*aurEff*/) + PreventDefaultAction(); + if (Unit* caster = GetCaster()) { - PreventDefaultAction(); - if (Unit* caster = GetCaster()) + if (GetTarget()->GetDistance2d(caster) > 25.0f) { - if (GetTarget()->GetDistance2d(caster) > 25.0f) - { - SetDuration(0); - GetTarget()->CastSpell(GetTarget(), SPELL_UNCAGED_WRATH, true); - } + SetDuration(0); + GetTarget()->CastSpell(GetTarget(), SPELL_UNCAGED_WRATH, true); } - - // xinef: ugly hax, dunno how it really works on blizz - Map::PlayerList const& pl = GetTarget()->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) - if (Player* player = itr->GetSource()) - if (player->GetPositionX() > 693.4f || player->GetPositionY() < 271.8f || player->GetPositionX() < 658.43f || player->GetPositionY() > 338.68f) - { - GetTarget()->CastSpell(player, SPELL_CHARGE, true); - break; - } } - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_illidan_tear_of_azzinoth_summon_channel_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_illidan_tear_of_azzinoth_summon_channel_AuraScript(); + // xinef: ugly hax, dunno how it really works on blizz + Map::PlayerList const& pl = GetTarget()->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) + if (Player* player = itr->GetSource()) + if (player->GetPositionX() > 693.4f || player->GetPositionY() < 271.8f || player->GetPositionX() < 658.43f || player->GetPositionY() > 338.68f) + { + GetTarget()->CastSpell(player, SPELL_CHARGE, true); + break; + } } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_illidan_tear_of_azzinoth_summon_channel_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_illidan_tear_of_azzinoth_summon_channel_AuraScript(); + } }; class spell_illidan_shadow_prison : public SpellScriptLoader { - public: - spell_illidan_shadow_prison() : SpellScriptLoader("spell_illidan_shadow_prison") { } +public: + spell_illidan_shadow_prison() : SpellScriptLoader("spell_illidan_shadow_prison") { } - class spell_illidan_shadow_prison_SpellScript : public SpellScript + class spell_illidan_shadow_prison_SpellScript : public SpellScript + { + PrepareSpellScript(spell_illidan_shadow_prison_SpellScript); + + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_illidan_shadow_prison_SpellScript); - - void FilterTargets(std::list& targets) - { - targets.remove_if(PlayerOrPetCheck()); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_illidan_shadow_prison_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_illidan_shadow_prison_SpellScript(); + targets.remove_if(PlayerOrPetCheck()); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_illidan_shadow_prison_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_illidan_shadow_prison_SpellScript(); + } }; class spell_illidan_demon_transform1 : public SpellScriptLoader { - public: - spell_illidan_demon_transform1() : SpellScriptLoader("spell_illidan_demon_transform1") { } +public: + spell_illidan_demon_transform1() : SpellScriptLoader("spell_illidan_demon_transform1") { } - class spell_illidan_demon_transform1_AuraScript : public AuraScript + class spell_illidan_demon_transform1_AuraScript : public AuraScript + { + PrepareAuraScript(spell_illidan_demon_transform1_AuraScript); + + bool Load() { - PrepareAuraScript(spell_illidan_demon_transform1_AuraScript); - - bool Load() - { - return GetUnitOwner()->GetTypeId() == TYPEID_UNIT; - } - - void OnPeriodic(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - SetDuration(0); - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_DEMON_TRANSFORM_2, true); - GetUnitOwner()->ToCreature()->LoadEquipment(0, true); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_illidan_demon_transform1_AuraScript::OnPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_illidan_demon_transform1_AuraScript(); + return GetUnitOwner()->GetTypeId() == TYPEID_UNIT; } + + void OnPeriodic(AuraEffect const* /*aurEff*/) + { + PreventDefaultAction(); + SetDuration(0); + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_DEMON_TRANSFORM_2, true); + GetUnitOwner()->ToCreature()->LoadEquipment(0, true); + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_illidan_demon_transform1_AuraScript::OnPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_illidan_demon_transform1_AuraScript(); + } }; class spell_illidan_demon_transform2 : public SpellScriptLoader { - public: - spell_illidan_demon_transform2() : SpellScriptLoader("spell_illidan_demon_transform2") { } +public: + spell_illidan_demon_transform2() : SpellScriptLoader("spell_illidan_demon_transform2") { } - class spell_illidan_demon_transform2_AuraScript : public AuraScript + class spell_illidan_demon_transform2_AuraScript : public AuraScript + { + PrepareAuraScript(spell_illidan_demon_transform2_AuraScript); + + bool Load() { - PrepareAuraScript(spell_illidan_demon_transform2_AuraScript); - - bool Load() - { - return GetUnitOwner()->GetTypeId() == TYPEID_UNIT; - } - - void OnPeriodic(AuraEffect const* aurEff) - { - PreventDefaultAction(); - - if (aurEff->GetTickNumber() == 1) - { - if (GetUnitOwner()->GetDisplayId() == GetUnitOwner()->GetNativeDisplayId()) - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_DEMON_FORM, true); - else - GetUnitOwner()->RemoveAurasDueToSpell(SPELL_DEMON_FORM); - } - else if (aurEff->GetTickNumber() == 2) - { - SetDuration(0); - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_DEMON_TRANSFORM_3, true); - if (Aura* aura = GetUnitOwner()->GetAura(SPELL_DEMON_TRANSFORM_3)) - aura->SetDuration(4500); - - if (!GetUnitOwner()->HasAura(SPELL_DEMON_FORM)) - GetUnitOwner()->ToCreature()->LoadEquipment(1, true); - } - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_illidan_demon_transform2_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_illidan_demon_transform2_AuraScript(); + return GetUnitOwner()->GetTypeId() == TYPEID_UNIT; } + + void OnPeriodic(AuraEffect const* aurEff) + { + PreventDefaultAction(); + + if (aurEff->GetTickNumber() == 1) + { + if (GetUnitOwner()->GetDisplayId() == GetUnitOwner()->GetNativeDisplayId()) + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_DEMON_FORM, true); + else + GetUnitOwner()->RemoveAurasDueToSpell(SPELL_DEMON_FORM); + } + else if (aurEff->GetTickNumber() == 2) + { + SetDuration(0); + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_DEMON_TRANSFORM_3, true); + if (Aura* aura = GetUnitOwner()->GetAura(SPELL_DEMON_TRANSFORM_3)) + aura->SetDuration(4500); + + if (!GetUnitOwner()->HasAura(SPELL_DEMON_FORM)) + GetUnitOwner()->ToCreature()->LoadEquipment(1, true); + } + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_illidan_demon_transform2_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_illidan_demon_transform2_AuraScript(); + } }; class spell_illidan_flame_burst : public SpellScriptLoader { - public: - spell_illidan_flame_burst() : SpellScriptLoader("spell_illidan_flame_burst") { } +public: + spell_illidan_flame_burst() : SpellScriptLoader("spell_illidan_flame_burst") { } - class spell_illidan_flame_burst_SpellScript : public SpellScript + class spell_illidan_flame_burst_SpellScript : public SpellScript + { + PrepareSpellScript(spell_illidan_flame_burst_SpellScript); + + void HandleScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_illidan_flame_burst_SpellScript); - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitEffect(effIndex); - if (Unit* target = GetHitUnit()) - target->CastSpell(target, SPELL_FLAME_BURST_EFFECT, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_illidan_flame_burst_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_illidan_flame_burst_SpellScript(); + PreventHitEffect(effIndex); + if (Unit* target = GetHitUnit()) + target->CastSpell(target, SPELL_FLAME_BURST_EFFECT, true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_illidan_flame_burst_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_illidan_flame_burst_SpellScript(); + } }; class spell_illidan_found_target : public SpellScriptLoader { - public: - spell_illidan_found_target() : SpellScriptLoader("spell_illidan_found_target") { } +public: + spell_illidan_found_target() : SpellScriptLoader("spell_illidan_found_target") { } - class spell_illidan_found_target_SpellScript : public SpellScript + class spell_illidan_found_target_SpellScript : public SpellScript + { + PrepareSpellScript(spell_illidan_found_target_SpellScript); + + void HandleDummy(SpellEffIndex effIndex) { - PrepareSpellScript(spell_illidan_found_target_SpellScript); - - void HandleDummy(SpellEffIndex effIndex) - { - PreventHitEffect(effIndex); - if (Unit* target = GetHitUnit()) - if (GetCaster()->GetDistance(target) < 2.0f) - { - GetCaster()->CastSpell(target, SPELL_CONSUME_SOUL, true); - GetCaster()->CastSpell(GetCaster(), SPELL_FIND_TARGET, true); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_illidan_found_target_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_illidan_found_target_SpellScript(); + PreventHitEffect(effIndex); + if (Unit* target = GetHitUnit()) + if (GetCaster()->GetDistance(target) < 2.0f) + { + GetCaster()->CastSpell(target, SPELL_CONSUME_SOUL, true); + GetCaster()->CastSpell(GetCaster(), SPELL_FIND_TARGET, true); + } } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_illidan_found_target_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_illidan_found_target_SpellScript(); + } }; class spell_illidan_cage_trap : public SpellScriptLoader { - public: - spell_illidan_cage_trap() : SpellScriptLoader("spell_illidan_cage_trap") { } +public: + spell_illidan_cage_trap() : SpellScriptLoader("spell_illidan_cage_trap") { } - class spell_illidan_cage_trap_SpellScript : public SpellScript + class spell_illidan_cage_trap_SpellScript : public SpellScript + { + PrepareSpellScript(spell_illidan_cage_trap_SpellScript); + + bool Load() { - PrepareSpellScript(spell_illidan_cage_trap_SpellScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_UNIT; - } - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitEffect(effIndex); - if (Creature* target = GetHitCreature()) - if (GetCaster()->GetExactDist2d(target) < 4.0f) - { - target->AI()->DoAction(ACTION_ILLIDAN_CAGED); - target->CastSpell(target, SPELL_CAGE_TRAP, true); - GetCaster()->ToCreature()->DespawnOrUnsummon(1); - if (GameObject* gobject = GetCaster()->FindNearestGameObject(GO_CAGE_TRAP, 10.0f)) - gobject->SetLootState(GO_JUST_DEACTIVATED); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_illidan_cage_trap_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_illidan_cage_trap_SpellScript(); + return GetCaster()->GetTypeId() == TYPEID_UNIT; } + + void HandleScriptEffect(SpellEffIndex effIndex) + { + PreventHitEffect(effIndex); + if (Creature* target = GetHitCreature()) + if (GetCaster()->GetExactDist2d(target) < 4.0f) + { + target->AI()->DoAction(ACTION_ILLIDAN_CAGED); + target->CastSpell(target, SPELL_CAGE_TRAP, true); + GetCaster()->ToCreature()->DespawnOrUnsummon(1); + if (GameObject* gobject = GetCaster()->FindNearestGameObject(GO_CAGE_TRAP, 10.0f)) + gobject->SetLootState(GO_JUST_DEACTIVATED); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_illidan_cage_trap_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_illidan_cage_trap_SpellScript(); + } }; class spell_illidan_cage_trap_stun : public SpellScriptLoader { - public: - spell_illidan_cage_trap_stun() : SpellScriptLoader("spell_illidan_cage_trap_stun") { } +public: + spell_illidan_cage_trap_stun() : SpellScriptLoader("spell_illidan_cage_trap_stun") { } - class spell_illidan_cage_trap_stun_AuraScript : public AuraScript + class spell_illidan_cage_trap_stun_AuraScript : public AuraScript + { + PrepareAuraScript(spell_illidan_cage_trap_stun_AuraScript); + + void OnPeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_illidan_cage_trap_stun_AuraScript); + PreventDefaultAction(); + SetDuration(0); - void OnPeriodic(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - SetDuration(0); - - for (uint32 i = SPELL_CAGED_SUMMON1; i <= SPELL_CAGED_SUMMON8; ++i) - GetTarget()->CastSpell(GetTarget(), i, true); - GetTarget()->CastSpell(GetTarget(), SPELL_CAGED_DEBUFF, true); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_illidan_cage_trap_stun_AuraScript::OnPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_illidan_cage_trap_stun_AuraScript(); + for (uint32 i = SPELL_CAGED_SUMMON1; i <= SPELL_CAGED_SUMMON8; ++i) + GetTarget()->CastSpell(GetTarget(), i, true); + GetTarget()->CastSpell(GetTarget(), SPELL_CAGED_DEBUFF, true); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_illidan_cage_trap_stun_AuraScript::OnPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_illidan_cage_trap_stun_AuraScript(); + } }; void AddSC_boss_illidan() diff --git a/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp b/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp index 318968d58..af88fdf9d 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp @@ -55,305 +55,305 @@ enum Misc class boss_mother_shahraz : public CreatureScript { - public: - boss_mother_shahraz() : CreatureScript("boss_mother_shahraz") { } +public: + boss_mother_shahraz() : CreatureScript("boss_mother_shahraz") { } - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } + + struct boss_shahrazAI : public BossAI + { + boss_shahrazAI(Creature* creature) : BossAI(creature, DATA_MOTHER_SHAHRAZ) { - return GetInstanceAI(creature); } - struct boss_shahrazAI : public BossAI + void Reset() { - boss_shahrazAI(Creature* creature) : BossAI(creature, DATA_MOTHER_SHAHRAZ) + BossAI::Reset(); + } + + void EnterCombat(Unit* who) + { + BossAI::EnterCombat(who); + Talk(SAY_AGGRO); + + me->CastSpell(me, SPELL_SABER_LASH_AURA, true); + me->CastSpell(me, SPELL_RANDOM_PERIODIC, true); + events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); + events.ScheduleEvent(EVENT_RANDOM_TALK, 60000); + events.ScheduleEvent(EVENT_SPELL_PRISMATIC_AURA, 0); + events.ScheduleEvent(EVENT_SPELL_ENRAGE, 600000); + events.ScheduleEvent(EVENT_SPELL_SILENCING_SHRIEK, 30000); + events.ScheduleEvent(EVENT_SPELL_FATAL_ATTRACTION, 50000); + events.ScheduleEvent(EVENT_SPELL_SABER_LASH, 4000); + } + + void KilledUnit(Unit* /*victim*/) + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) { + Talk(SAY_SLAY); + events.ScheduleEvent(EVENT_KILL_TALK, 6000); + } + } + + void JustDied(Unit* killer) + { + BossAI::JustDied(killer); + Talk(SAY_DEATH); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_CHECK_HEALTH: + if (HealthBelowPct(10)) + { + me->CastSpell(me, SPELL_FRENZY, true); + Talk(SAY_EMOTE_FRENZY); + break; + } + events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); + break; + case EVENT_SPELL_ENRAGE: + me->CastSpell(me, SPELL_ENRAGE, true); + Talk(SAY_ENRAGE); + break; + case EVENT_RANDOM_TALK: + Talk(SAY_TAUNT); + events.ScheduleEvent(EVENT_RANDOM_TALK, urand(60000, 120000)); + break; + case EVENT_SPELL_SABER_LASH: + me->CastSpell(me->GetVictim(), SPELL_SABER_LASH, false); + events.ScheduleEvent(EVENT_SPELL_SABER_LASH, 30000); + break; + case EVENT_SPELL_PRISMATIC_AURA: + me->CastSpell(me, RAND(SPELL_PRISMATIC_AURA_SHADOW, SPELL_PRISMATIC_AURA_FIRE, SPELL_PRISMATIC_AURA_NATURE, SPELL_PRISMATIC_AURA_ARCANE, SPELL_PRISMATIC_AURA_FROST, SPELL_PRISMATIC_AURA_HOLY), false); + events.ScheduleEvent(EVENT_SPELL_PRISMATIC_AURA, 15000); + break; + case EVENT_SPELL_SILENCING_SHRIEK: + me->CastSpell(me, SPELL_SILENCING_SHRIEK, false); + events.ScheduleEvent(EVENT_SPELL_SILENCING_SHRIEK, 30000); + break; + case EVENT_SPELL_FATAL_ATTRACTION: + Talk(SAY_SPELL); + me->CastCustomSpell(SPELL_FATAL_ATTRACTION, SPELLVALUE_MAX_TARGETS, 3, me, false); + events.ScheduleEvent(EVENT_SPELL_FATAL_ATTRACTION, 60000); + break; } - void Reset() - { - BossAI::Reset(); - } - - void EnterCombat(Unit* who) - { - BossAI::EnterCombat(who); - Talk(SAY_AGGRO); - - me->CastSpell(me, SPELL_SABER_LASH_AURA, true); - me->CastSpell(me, SPELL_RANDOM_PERIODIC, true); - events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); - events.ScheduleEvent(EVENT_RANDOM_TALK, 60000); - events.ScheduleEvent(EVENT_SPELL_PRISMATIC_AURA, 0); - events.ScheduleEvent(EVENT_SPELL_ENRAGE, 600000); - events.ScheduleEvent(EVENT_SPELL_SILENCING_SHRIEK, 30000); - events.ScheduleEvent(EVENT_SPELL_FATAL_ATTRACTION, 50000); - events.ScheduleEvent(EVENT_SPELL_SABER_LASH, 4000); - } - - void KilledUnit(Unit* /*victim*/) - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(SAY_SLAY); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); - } - } - - void JustDied(Unit* killer) - { - BossAI::JustDied(killer); - Talk(SAY_DEATH); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_CHECK_HEALTH: - if (HealthBelowPct(10)) - { - me->CastSpell(me, SPELL_FRENZY, true); - Talk(SAY_EMOTE_FRENZY); - break; - } - events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); - break; - case EVENT_SPELL_ENRAGE: - me->CastSpell(me, SPELL_ENRAGE, true); - Talk(SAY_ENRAGE); - break; - case EVENT_RANDOM_TALK: - Talk(SAY_TAUNT); - events.ScheduleEvent(EVENT_RANDOM_TALK, urand(60000, 120000)); - break; - case EVENT_SPELL_SABER_LASH: - me->CastSpell(me->GetVictim(), SPELL_SABER_LASH, false); - events.ScheduleEvent(EVENT_SPELL_SABER_LASH, 30000); - break; - case EVENT_SPELL_PRISMATIC_AURA: - me->CastSpell(me, RAND(SPELL_PRISMATIC_AURA_SHADOW, SPELL_PRISMATIC_AURA_FIRE, SPELL_PRISMATIC_AURA_NATURE, SPELL_PRISMATIC_AURA_ARCANE, SPELL_PRISMATIC_AURA_FROST, SPELL_PRISMATIC_AURA_HOLY), false); - events.ScheduleEvent(EVENT_SPELL_PRISMATIC_AURA, 15000); - break; - case EVENT_SPELL_SILENCING_SHRIEK: - me->CastSpell(me, SPELL_SILENCING_SHRIEK, false); - events.ScheduleEvent(EVENT_SPELL_SILENCING_SHRIEK, 30000); - break; - case EVENT_SPELL_FATAL_ATTRACTION: - Talk(SAY_SPELL); - me->CastCustomSpell(SPELL_FATAL_ATTRACTION, SPELLVALUE_MAX_TARGETS, 3, me, false); - events.ScheduleEvent(EVENT_SPELL_FATAL_ATTRACTION, 60000); - break; - } - - DoMeleeAttackIfReady(); - } - }; + DoMeleeAttackIfReady(); + } + }; }; class spell_mother_shahraz_random_periodic : public SpellScriptLoader { - public: - spell_mother_shahraz_random_periodic() : SpellScriptLoader("spell_mother_shahraz_random_periodic") { } +public: + spell_mother_shahraz_random_periodic() : SpellScriptLoader("spell_mother_shahraz_random_periodic") { } - class spell_mother_shahraz_random_periodic_AuraScript : public AuraScript + class spell_mother_shahraz_random_periodic_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mother_shahraz_random_periodic_AuraScript); + + void Update(AuraEffect const* effect) { - PrepareAuraScript(spell_mother_shahraz_random_periodic_AuraScript); - - void Update(AuraEffect const* effect) - { - PreventDefaultAction(); - if (effect->GetTickNumber()%5 == 1) - GetUnitOwner()->CastSpell(GetUnitOwner(), RAND(SPELL_SINFUL_PERIODIC, SPELL_SINISTER_PERIODIC, SPELL_VILE_PERIODIC, SPELL_WICKED_PERIODIC), true); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_mother_shahraz_random_periodic_AuraScript::Update, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_mother_shahraz_random_periodic_AuraScript(); + PreventDefaultAction(); + if (effect->GetTickNumber() % 5 == 1) + GetUnitOwner()->CastSpell(GetUnitOwner(), RAND(SPELL_SINFUL_PERIODIC, SPELL_SINISTER_PERIODIC, SPELL_VILE_PERIODIC, SPELL_WICKED_PERIODIC), true); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_mother_shahraz_random_periodic_AuraScript::Update, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_mother_shahraz_random_periodic_AuraScript(); + } }; class spell_mother_shahraz_beam_periodic : public SpellScriptLoader { - public: - spell_mother_shahraz_beam_periodic() : SpellScriptLoader("spell_mother_shahraz_beam_periodic") { } +public: + spell_mother_shahraz_beam_periodic() : SpellScriptLoader("spell_mother_shahraz_beam_periodic") { } - class spell_mother_shahraz_beam_periodic_AuraScript : public AuraScript + class spell_mother_shahraz_beam_periodic_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mother_shahraz_beam_periodic_AuraScript); + + void Update(AuraEffect const* effect) { - PrepareAuraScript(spell_mother_shahraz_beam_periodic_AuraScript); - - void Update(AuraEffect const* effect) - { - PreventDefaultAction(); - if (Unit* target = GetUnitOwner()->GetAI()->SelectTarget(SELECT_TARGET_RANDOM, 0)) - GetUnitOwner()->CastSpell(target, GetSpellInfo()->Effects[effect->GetEffIndex()].TriggerSpell, true); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_mother_shahraz_beam_periodic_AuraScript::Update, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_mother_shahraz_beam_periodic_AuraScript(); + PreventDefaultAction(); + if (Unit* target = GetUnitOwner()->GetAI()->SelectTarget(SELECT_TARGET_RANDOM, 0)) + GetUnitOwner()->CastSpell(target, GetSpellInfo()->Effects[effect->GetEffIndex()].TriggerSpell, true); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_mother_shahraz_beam_periodic_AuraScript::Update, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_mother_shahraz_beam_periodic_AuraScript(); + } }; class spell_mother_shahraz_saber_lash : public SpellScriptLoader { - public: - spell_mother_shahraz_saber_lash() : SpellScriptLoader("spell_mother_shahraz_saber_lash") { } +public: + spell_mother_shahraz_saber_lash() : SpellScriptLoader("spell_mother_shahraz_saber_lash") { } - class spell_mother_shahraz_saber_lash_AuraScript : public AuraScript + class spell_mother_shahraz_saber_lash_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mother_shahraz_saber_lash_AuraScript); + + bool CheckProc(ProcEventInfo& /*eventInfo*/) { - PrepareAuraScript(spell_mother_shahraz_saber_lash_AuraScript); - - bool CheckProc(ProcEventInfo& /*eventInfo*/) - { - return false; - } - - void Update(AuraEffect const* effect) - { - PreventDefaultAction(); - if (Unit* target = GetUnitOwner()->GetVictim()) - GetUnitOwner()->CastSpell(target, GetSpellInfo()->Effects[effect->GetEffIndex()].TriggerSpell, true); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_mother_shahraz_saber_lash_AuraScript::CheckProc); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_mother_shahraz_saber_lash_AuraScript::Update, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_mother_shahraz_saber_lash_AuraScript(); + return false; } + + void Update(AuraEffect const* effect) + { + PreventDefaultAction(); + if (Unit* target = GetUnitOwner()->GetVictim()) + GetUnitOwner()->CastSpell(target, GetSpellInfo()->Effects[effect->GetEffIndex()].TriggerSpell, true); + } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_mother_shahraz_saber_lash_AuraScript::CheckProc); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_mother_shahraz_saber_lash_AuraScript::Update, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_mother_shahraz_saber_lash_AuraScript(); + } }; class spell_mother_shahraz_fatal_attraction : public SpellScriptLoader { - public: - spell_mother_shahraz_fatal_attraction() : SpellScriptLoader("spell_mother_shahraz_fatal_attraction") { } +public: + spell_mother_shahraz_fatal_attraction() : SpellScriptLoader("spell_mother_shahraz_fatal_attraction") { } - class spell_mother_shahraz_fatal_attraction_SpellScript : public SpellScript + class spell_mother_shahraz_fatal_attraction_SpellScript : public SpellScript + { + PrepareSpellScript(spell_mother_shahraz_fatal_attraction_SpellScript); + + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_mother_shahraz_fatal_attraction_SpellScript); - - void FilterTargets(std::list& targets) - { - targets.remove_if(acore::UnitAuraCheck(true, SPELL_SABER_LASH_IMMUNITY)); - if (targets.size() <= 1) - FinishCast(SPELL_FAILED_DONT_REPORT); - } - - void SetDest(SpellDestination& dest) - { - std::list const* targetsInfo = GetSpell()->GetUniqueTargetInfo(); - for (std::list::const_iterator ihit = targetsInfo->begin(); ihit != targetsInfo->end(); ++ihit) - if (Unit* target = ObjectAccessor::GetUnit(*GetCaster(), ihit->targetGUID)) - { - dest.Relocate(*target); - if (roll_chance_i(50)) - break; - } - } - - void HandleTeleportUnits(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - GetCaster()->CastSpell(target, SPELL_FATAL_ATTRACTION_AURA, true); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mother_shahraz_fatal_attraction_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY); - OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_mother_shahraz_fatal_attraction_SpellScript::SetDest, EFFECT_1, TARGET_DEST_CASTER_RANDOM); - OnEffectHitTarget += SpellEffectFn(spell_mother_shahraz_fatal_attraction_SpellScript::HandleTeleportUnits, EFFECT_1, SPELL_EFFECT_TELEPORT_UNITS); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_mother_shahraz_fatal_attraction_SpellScript(); + targets.remove_if(acore::UnitAuraCheck(true, SPELL_SABER_LASH_IMMUNITY)); + if (targets.size() <= 1) + FinishCast(SPELL_FAILED_DONT_REPORT); } + + void SetDest(SpellDestination& dest) + { + std::list const* targetsInfo = GetSpell()->GetUniqueTargetInfo(); + for (std::list::const_iterator ihit = targetsInfo->begin(); ihit != targetsInfo->end(); ++ihit) + if (Unit* target = ObjectAccessor::GetUnit(*GetCaster(), ihit->targetGUID)) + { + dest.Relocate(*target); + if (roll_chance_i(50)) + break; + } + } + + void HandleTeleportUnits(SpellEffIndex /*effIndex*/) + { + if (Unit* target = GetHitUnit()) + GetCaster()->CastSpell(target, SPELL_FATAL_ATTRACTION_AURA, true); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mother_shahraz_fatal_attraction_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY); + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_mother_shahraz_fatal_attraction_SpellScript::SetDest, EFFECT_1, TARGET_DEST_CASTER_RANDOM); + OnEffectHitTarget += SpellEffectFn(spell_mother_shahraz_fatal_attraction_SpellScript::HandleTeleportUnits, EFFECT_1, SPELL_EFFECT_TELEPORT_UNITS); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_mother_shahraz_fatal_attraction_SpellScript(); + } }; class spell_mother_shahraz_fatal_attraction_dummy : public SpellScriptLoader { - public: - spell_mother_shahraz_fatal_attraction_dummy() : SpellScriptLoader("spell_mother_shahraz_fatal_attraction_dummy") { } +public: + spell_mother_shahraz_fatal_attraction_dummy() : SpellScriptLoader("spell_mother_shahraz_fatal_attraction_dummy") { } - class spell_mother_shahraz_fatal_attraction_dummy_SpellScript : public SpellScript + class spell_mother_shahraz_fatal_attraction_dummy_SpellScript : public SpellScript + { + PrepareSpellScript(spell_mother_shahraz_fatal_attraction_dummy_SpellScript); + + void HandleDummy(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_mother_shahraz_fatal_attraction_dummy_SpellScript); - - void HandleDummy(SpellEffIndex /*effIndex*/) + if (Unit* target = GetHitUnit()) { - if (Unit* target = GetHitUnit()) - { - target->CastSpell(target, SPELL_FATAL_ATTRACTION_DAMAGE, true); - if (AuraEffect* aurEff = target->GetAuraEffect(SPELL_FATAL_ATTRACTION_AURA, EFFECT_1)) - aurEff->SetAmount(aurEff->GetTickNumber()); - } + target->CastSpell(target, SPELL_FATAL_ATTRACTION_DAMAGE, true); + if (AuraEffect* aurEff = target->GetAuraEffect(SPELL_FATAL_ATTRACTION_AURA, EFFECT_1)) + aurEff->SetAmount(aurEff->GetTickNumber()); } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_mother_shahraz_fatal_attraction_dummy_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_mother_shahraz_fatal_attraction_dummy_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_mother_shahraz_fatal_attraction_dummy_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_mother_shahraz_fatal_attraction_dummy_SpellScript(); + } }; class spell_mother_shahraz_fatal_attraction_aura : public SpellScriptLoader { - public: - spell_mother_shahraz_fatal_attraction_aura() : SpellScriptLoader("spell_mother_shahraz_fatal_attraction_aura") { } +public: + spell_mother_shahraz_fatal_attraction_aura() : SpellScriptLoader("spell_mother_shahraz_fatal_attraction_aura") { } - class spell_mother_shahraz_fatal_attraction_aura_AuraScript : public AuraScript + class spell_mother_shahraz_fatal_attraction_aura_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mother_shahraz_fatal_attraction_aura_AuraScript); + + void Update(AuraEffect const* effect) { - PrepareAuraScript(spell_mother_shahraz_fatal_attraction_aura_AuraScript); - - void Update(AuraEffect const* effect) - { - if (effect->GetTickNumber() > uint32(effect->GetAmount()+1)) - { - PreventDefaultAction(); - SetDuration(0); - } - } - - void Register() + if (effect->GetTickNumber() > uint32(effect->GetAmount() + 1)) { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_mother_shahraz_fatal_attraction_aura_AuraScript::Update, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + PreventDefaultAction(); + SetDuration(0); } - }; - - AuraScript* GetAuraScript() const - { - return new spell_mother_shahraz_fatal_attraction_aura_AuraScript(); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_mother_shahraz_fatal_attraction_aura_AuraScript::Update, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_mother_shahraz_fatal_attraction_aura_AuraScript(); + } }; void AddSC_boss_mother_shahraz() diff --git a/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp b/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp index 0bdddac1d..690348fc6 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp @@ -97,673 +97,673 @@ enum Misc class SuckBackEvent : public BasicEvent { - public: - SuckBackEvent(Creature& owner, uint32 action) : BasicEvent(), _owner(owner), _action(action) { } +public: + SuckBackEvent(Creature& owner, uint32 action) : BasicEvent(), _owner(owner), _action(action) { } - bool Execute(uint64 /*eventTime*/, uint32 /*diff*/) - { - if (_owner.IsSummon()) - if (Unit* summoner = _owner.ToTempSummon()->GetSummoner()) - { - summoner->GetAI()->DoAction(_action); - _owner.SetStandState(UNIT_STAND_STATE_SUBMERGED); - _owner.DespawnOrUnsummon(200); - } - return true; - } + bool Execute(uint64 /*eventTime*/, uint32 /*diff*/) + { + if (_owner.IsSummon()) + if (Unit* summoner = _owner.ToTempSummon()->GetSummoner()) + { + summoner->GetAI()->DoAction(_action); + _owner.SetStandState(UNIT_STAND_STATE_SUBMERGED); + _owner.DespawnOrUnsummon(200); + } + return true; + } - private: - Creature& _owner; - uint32 _action; +private: + Creature& _owner; + uint32 _action; }; class boss_reliquary_of_souls : public CreatureScript { - public: - boss_reliquary_of_souls() : CreatureScript("boss_reliquary_of_souls") { } +public: + boss_reliquary_of_souls() : CreatureScript("boss_reliquary_of_souls") { } - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } + + struct boss_reliquary_of_soulsAI : public BossAI + { + boss_reliquary_of_soulsAI(Creature* creature) : BossAI(creature, DATA_RELIQUARY_OF_SOULS) { - return GetInstanceAI(creature); } - struct boss_reliquary_of_soulsAI : public BossAI + void Reset() { - boss_reliquary_of_soulsAI(Creature* creature) : BossAI(creature, DATA_RELIQUARY_OF_SOULS) - { - } + BossAI::Reset(); + me->SetStandState(UNIT_STAND_STATE_SLEEP); + } - void Reset() - { - BossAI::Reset(); - me->SetStandState(UNIT_STAND_STATE_SLEEP); - } + void MoveInLineOfSight(Unit* who) + { + if (!who || me->getStandState() != UNIT_STAND_STATE_SLEEP || who->GetTypeId() != TYPEID_PLAYER || me->GetDistance2d(who) > 90.0f || who->ToPlayer()->IsGameMaster()) + return; - void MoveInLineOfSight(Unit* who) - { - if (!who || me->getStandState() != UNIT_STAND_STATE_SLEEP || who->GetTypeId() != TYPEID_PLAYER || me->GetDistance2d(who) > 90.0f || who->ToPlayer()->IsGameMaster()) - return; + me->SetInCombatWithZone(); + events.ScheduleEvent(EVENT_ESSENCE_OF_SUFFERING, 5000); // ZOMG! 15000); + me->SetStandState(UNIT_STAND_STATE_STAND); + } - me->SetInCombatWithZone(); - events.ScheduleEvent(EVENT_ESSENCE_OF_SUFFERING, 5000); // ZOMG! 15000); + void DoAction(int32 param) + { + if (param == ACTION_ESSENCE_OF_SUFFERING) + { me->SetStandState(UNIT_STAND_STATE_STAND); + events.ScheduleEvent(EVENT_SUCK_ESSENCE, 1000); + events.ScheduleEvent(EVENT_SPAWN_ENSLAVED_SOULS, 8000); + events.ScheduleEvent(EVENT_ESSENCE_OF_DESIRE, 38000); } - - void DoAction(int32 param) + else if (param == ACTION_ESSENCE_OF_DESIRE) { - if (param == ACTION_ESSENCE_OF_SUFFERING) - { + me->SetStandState(UNIT_STAND_STATE_STAND); + events.ScheduleEvent(EVENT_SUCK_ESSENCE, 1000); + events.ScheduleEvent(EVENT_SPAWN_ENSLAVED_SOULS, 8000); + events.ScheduleEvent(EVENT_ESSENCE_OF_ANGER, 38000); + } + else if (param == ACTION_ESSENCE_OF_ANGER) + { + } + } + + void EnterCombat(Unit* who) + { + BossAI::EnterCombat(who); + } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + if (summon->GetEntry() == NPC_ENSLAVED_SOUL) + return; + + summon->SetReactState(REACT_PASSIVE); + summon->CastSpell(summon, SPELL_EMERGE_VISUAL, true); + events.ScheduleEvent(EVENT_ENGAGE_ESSENCE, 4000); + } + + void SummonedCreatureDies(Creature* summon, Unit*) + { + summons.Despawn(summon); + } + + void AttackStart(Unit*) { } + + + void JustDied(Unit* killer) + { + summons.clear(); + BossAI::JustDied(killer); + } + + void UpdateAI(uint32 diff) + { + if (me->getStandState() == UNIT_STAND_STATE_SLEEP) + return; + + events.Update(diff); + switch (events.ExecuteEvent()) + { + case EVENT_SUCK_ESSENCE: me->SetStandState(UNIT_STAND_STATE_STAND); - events.ScheduleEvent(EVENT_SUCK_ESSENCE, 1000); - events.ScheduleEvent(EVENT_SPAWN_ENSLAVED_SOULS, 8000); - events.ScheduleEvent(EVENT_ESSENCE_OF_DESIRE, 38000); - } - else if (param == ACTION_ESSENCE_OF_DESIRE) - { - me->SetStandState(UNIT_STAND_STATE_STAND); - events.ScheduleEvent(EVENT_SUCK_ESSENCE, 1000); - events.ScheduleEvent(EVENT_SPAWN_ENSLAVED_SOULS, 8000); - events.ScheduleEvent(EVENT_ESSENCE_OF_ANGER, 38000); - } - else if (param == ACTION_ESSENCE_OF_ANGER) - { - } + break; + case EVENT_ENGAGE_ESSENCE: + summons.DoAction(ACTION_ENGAGE_ESSENCE); + break; + case EVENT_ESSENCE_OF_SUFFERING: + me->SetStandState(UNIT_STAND_STATE_SUBMERGED); + me->CastSpell(me, SPELL_SUMMON_ESSENCE_OF_SUFFERING, false); + break; + case EVENT_ESSENCE_OF_DESIRE: + summons.DespawnAll(); + me->SetStandState(UNIT_STAND_STATE_SUBMERGED); + me->CastSpell(me, SPELL_SUMMON_ESSENCE_OF_DESIRE, false); + break; + case EVENT_ESSENCE_OF_ANGER: + summons.DespawnAll(); + me->SetStandState(UNIT_STAND_STATE_SUBMERGED); + me->CastSpell(me, SPELL_SUMMON_ESSENCE_OF_ANGER, false); + break; + case EVENT_SPAWN_ENSLAVED_SOULS: + events.ScheduleEvent(EVENT_SPAWN_SOUL, 0); + events.ScheduleEvent(EVENT_SPAWN_SOUL, 0); + for (uint8 i = 0; i < 16; ++i) + events.ScheduleEvent(EVENT_SPAWN_SOUL, i * 1200); + break; + case EVENT_SPAWN_SOUL: + me->CastCustomSpell(SPELL_SUMMON_ENSLAVED_SOUL, SPELLVALUE_MAX_TARGETS, 1, me, false); + break; } - void EnterCombat(Unit* who) - { - BossAI::EnterCombat(who); - } + EnterEvadeIfOutOfCombatArea(); + } - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - if (summon->GetEntry() == NPC_ENSLAVED_SOUL) - return; - - summon->SetReactState(REACT_PASSIVE); - summon->CastSpell(summon, SPELL_EMERGE_VISUAL, true); - events.ScheduleEvent(EVENT_ENGAGE_ESSENCE, 4000); - } - - void SummonedCreatureDies(Creature* summon, Unit*) - { - summons.Despawn(summon); - } - - void AttackStart(Unit*) { } - - - void JustDied(Unit* killer) - { - summons.clear(); - BossAI::JustDied(killer); - } - - void UpdateAI(uint32 diff) - { - if (me->getStandState() == UNIT_STAND_STATE_SLEEP) - return; - - events.Update(diff); - switch (events.ExecuteEvent()) - { - case EVENT_SUCK_ESSENCE: - me->SetStandState(UNIT_STAND_STATE_STAND); - break; - case EVENT_ENGAGE_ESSENCE: - summons.DoAction(ACTION_ENGAGE_ESSENCE); - break; - case EVENT_ESSENCE_OF_SUFFERING: - me->SetStandState(UNIT_STAND_STATE_SUBMERGED); - me->CastSpell(me, SPELL_SUMMON_ESSENCE_OF_SUFFERING, false); - break; - case EVENT_ESSENCE_OF_DESIRE: - summons.DespawnAll(); - me->SetStandState(UNIT_STAND_STATE_SUBMERGED); - me->CastSpell(me, SPELL_SUMMON_ESSENCE_OF_DESIRE, false); - break; - case EVENT_ESSENCE_OF_ANGER: - summons.DespawnAll(); - me->SetStandState(UNIT_STAND_STATE_SUBMERGED); - me->CastSpell(me, SPELL_SUMMON_ESSENCE_OF_ANGER, false); - break; - case EVENT_SPAWN_ENSLAVED_SOULS: - events.ScheduleEvent(EVENT_SPAWN_SOUL, 0); - events.ScheduleEvent(EVENT_SPAWN_SOUL, 0); - for (uint8 i = 0; i < 16; ++i) - events.ScheduleEvent(EVENT_SPAWN_SOUL, i*1200); - break; - case EVENT_SPAWN_SOUL: - me->CastCustomSpell(SPELL_SUMMON_ENSLAVED_SOUL, SPELLVALUE_MAX_TARGETS, 1, me, false); - break; - } - - EnterEvadeIfOutOfCombatArea(); - } - - bool CheckEvadeIfOutOfCombatArea() const - { - return !SelectTargetFromPlayerList(80.0f); - } - }; + bool CheckEvadeIfOutOfCombatArea() const + { + return !SelectTargetFromPlayerList(80.0f); + } + }; }; class boss_essence_of_suffering : public CreatureScript { - public: - boss_essence_of_suffering() : CreatureScript("boss_essence_of_suffering") { } +public: + boss_essence_of_suffering() : CreatureScript("boss_essence_of_suffering") { } - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const + { + return new boss_essence_of_sufferingAI(creature); + } + + struct boss_essence_of_sufferingAI : public ScriptedAI + { + boss_essence_of_sufferingAI(Creature* creature) : ScriptedAI(creature) { } + + EventMap events; + + void Reset() { - return new boss_essence_of_sufferingAI(creature); + events.Reset(); } - struct boss_essence_of_sufferingAI : public ScriptedAI + void DoAction(int32 param) { - boss_essence_of_sufferingAI(Creature* creature) : ScriptedAI(creature) { } - - EventMap events; - - void Reset() + if (param == ACTION_ENGAGE_ESSENCE) { - events.Reset(); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); + me->SetReactState(REACT_AGGRESSIVE); + me->SetInCombatWithZone(); } + } - void DoAction(int32 param) + void MovementInform(uint32 type, uint32 id) + { + if (type != POINT_MOTION_TYPE || id != POINT_GO_BACK) + return; + + me->m_Events.AddEvent(new SuckBackEvent(*me, ACTION_ESSENCE_OF_SUFFERING), me->m_Events.CalculateTime(1500)); + me->SetTarget(0); + me->SetFacingTo(M_PI / 2.0f); + } + + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) + { + if (damage >= me->GetHealth()) { - if (param == ACTION_ENGAGE_ESSENCE) + damage = 0; + if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) { - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_NON_ATTACKABLE); - me->SetReactState(REACT_AGGRESSIVE); - me->SetInCombatWithZone(); + me->RemoveAurasDueToSpell(SPELL_ESSENCE_OF_SUFFERING_PASSIVE); // prevent fixate from triggering + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + Talk(SUFF_SAY_RECAP); + me->SetReactState(REACT_PASSIVE); + me->GetMotionMaster()->Clear(); + me->GetMotionMaster()->MovePoint(POINT_GO_BACK, me->GetHomePosition(), false); + events.Reset(); } } + } - void MovementInform(uint32 type, uint32 id) + void KilledUnit(Unit* /*victim*/) + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) { - if (type != POINT_MOTION_TYPE || id != POINT_GO_BACK) - return; + Talk(SUFF_SAY_SLAY); + events.ScheduleEvent(EVENT_KILL_TALK, 6000); + } + } - me->m_Events.AddEvent(new SuckBackEvent(*me, ACTION_ESSENCE_OF_SUFFERING), me->m_Events.CalculateTime(1500)); - me->SetTarget(0); - me->SetFacingTo(M_PI/2.0f); + void EnterCombat(Unit* /*who*/) + { + Talk(SUFF_SAY_FREED); + me->CastSpell(me, SPELL_AURA_OF_SUFFERING, true); + me->CastSpell(me, SPELL_ESSENCE_OF_SUFFERING_PASSIVE, true); + me->CastSpell(me, SPELL_ESSENCE_OF_SUFFERING_PASSIVE2, true); + + events.ScheduleEvent(EVENT_SUFF_FRENZY, 45000); + events.ScheduleEvent(EVENT_SUFF_SOUL_DRAIN, 25000); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_SUFF_SOUL_DRAIN: + me->CastCustomSpell(SPELL_SOUL_DRAIN, SPELLVALUE_MAX_TARGETS, 3, me, false); + events.ScheduleEvent(EVENT_SUFF_SOUL_DRAIN, 30000); + break; + case EVENT_SUFF_FRENZY: + Talk(SUFF_SAY_ENRAGE); + Talk(SUFF_EMOTE_ENRAGE); + me->CastSpell(me, SPELL_FRENZY, false); + events.ScheduleEvent(EVENT_SUFF_FRENZY, 45000); + events.ScheduleEvent(EVENT_SUFF_FRENZY_EMOTE, 3000); + break; + case EVENT_SUFF_FRENZY_EMOTE: + Talk(SUFF_EMOTE_ENRAGE); + break; } - void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) - { - if (damage >= me->GetHealth()) - { - damage = 0; - if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) - { - me->RemoveAurasDueToSpell(SPELL_ESSENCE_OF_SUFFERING_PASSIVE); // prevent fixate from triggering - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - Talk(SUFF_SAY_RECAP); - me->SetReactState(REACT_PASSIVE); - me->GetMotionMaster()->Clear(); - me->GetMotionMaster()->MovePoint(POINT_GO_BACK, me->GetHomePosition(), false); - events.Reset(); - } - } - } - - void KilledUnit(Unit* /*victim*/) - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(SUFF_SAY_SLAY); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); - } - } - - void EnterCombat(Unit* /*who*/) - { - Talk(SUFF_SAY_FREED); - me->CastSpell(me, SPELL_AURA_OF_SUFFERING, true); - me->CastSpell(me, SPELL_ESSENCE_OF_SUFFERING_PASSIVE, true); - me->CastSpell(me, SPELL_ESSENCE_OF_SUFFERING_PASSIVE2, true); - - events.ScheduleEvent(EVENT_SUFF_FRENZY, 45000); - events.ScheduleEvent(EVENT_SUFF_SOUL_DRAIN, 25000); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SUFF_SOUL_DRAIN: - me->CastCustomSpell(SPELL_SOUL_DRAIN, SPELLVALUE_MAX_TARGETS, 3, me, false); - events.ScheduleEvent(EVENT_SUFF_SOUL_DRAIN, 30000); - break; - case EVENT_SUFF_FRENZY: - Talk(SUFF_SAY_ENRAGE); - Talk(SUFF_EMOTE_ENRAGE); - me->CastSpell(me, SPELL_FRENZY, false); - events.ScheduleEvent(EVENT_SUFF_FRENZY, 45000); - events.ScheduleEvent(EVENT_SUFF_FRENZY_EMOTE, 3000); - break; - case EVENT_SUFF_FRENZY_EMOTE: - Talk(SUFF_EMOTE_ENRAGE); - break; - } - - DoMeleeAttackIfReady(); - } - }; + DoMeleeAttackIfReady(); + } + }; }; class boss_essence_of_desire : public CreatureScript { - public: - boss_essence_of_desire() : CreatureScript("boss_essence_of_desire") { } +public: + boss_essence_of_desire() : CreatureScript("boss_essence_of_desire") { } - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const + { + return new boss_essence_of_desireAI(creature); + } + + struct boss_essence_of_desireAI : public ScriptedAI + { + boss_essence_of_desireAI(Creature* creature) : ScriptedAI(creature) { } + + EventMap events; + + void Reset() { - return new boss_essence_of_desireAI(creature); + events.Reset(); } - struct boss_essence_of_desireAI : public ScriptedAI + void DoAction(int32 param) { - boss_essence_of_desireAI(Creature* creature) : ScriptedAI(creature) { } - - EventMap events; - - void Reset() + if (param == ACTION_ENGAGE_ESSENCE) { - events.Reset(); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); + me->SetReactState(REACT_AGGRESSIVE); + me->SetInCombatWithZone(); } + } - void DoAction(int32 param) + void MovementInform(uint32 type, uint32 id) + { + if (type != POINT_MOTION_TYPE || id != POINT_GO_BACK) + return; + + me->m_Events.AddEvent(new SuckBackEvent(*me, ACTION_ESSENCE_OF_DESIRE), me->m_Events.CalculateTime(1500)); + me->SetTarget(0); + me->SetFacingTo(M_PI / 2.0f); + } + + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) + { + if (damage >= me->GetHealth()) { - if (param == ACTION_ENGAGE_ESSENCE) + damage = 0; + if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) { - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_NON_ATTACKABLE); - me->SetReactState(REACT_AGGRESSIVE); - me->SetInCombatWithZone(); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + Talk(DESI_SAY_RECAP); + me->SetReactState(REACT_PASSIVE); + me->GetMotionMaster()->Clear(); + me->GetMotionMaster()->MovePoint(POINT_GO_BACK, me->GetHomePosition(), false); + events.Reset(); } } + } - void MovementInform(uint32 type, uint32 id) + void KilledUnit(Unit* /*victim*/) + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) { - if (type != POINT_MOTION_TYPE || id != POINT_GO_BACK) - return; + Talk(DESI_SAY_SLAY); + events.ScheduleEvent(EVENT_KILL_TALK, 6000); + } + } - me->m_Events.AddEvent(new SuckBackEvent(*me, ACTION_ESSENCE_OF_DESIRE), me->m_Events.CalculateTime(1500)); - me->SetTarget(0); - me->SetFacingTo(M_PI/2.0f); + void EnterCombat(Unit* /*who*/) + { + Talk(DESI_SAY_FREED); + me->CastSpell(me, SPELL_AURA_OF_DESIRE, true); + + events.ScheduleEvent(EVENT_DESI_DEADEN, 28000); + events.ScheduleEvent(EVENT_DESI_SPIRIT_SHOCK, 20000); + events.ScheduleEvent(EVENT_DESI_RUNE_SHIELD, 13000); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_DESI_DEADEN: + if (roll_chance_i(50)) + Talk(DESI_SAY_SPEC); + me->CastSpell(me->GetVictim(), SPELL_DEADEN, false); + events.ScheduleEvent(EVENT_DESI_DEADEN, 31000); + break; + case EVENT_DESI_SPIRIT_SHOCK: + me->CastSpell(me->GetVictim(), SPELL_SPIRIT_SHOCK, false); + events.ScheduleEvent(EVENT_DESI_SPIRIT_SHOCK, 12000); + break; + case EVENT_DESI_RUNE_SHIELD: + me->CastSpell(me, SPELL_RUNE_SHIELD, false); + events.ScheduleEvent(EVENT_DESI_RUNE_SHIELD, 15000); + break; } - void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) - { - if (damage >= me->GetHealth()) - { - damage = 0; - if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) - { - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - Talk(DESI_SAY_RECAP); - me->SetReactState(REACT_PASSIVE); - me->GetMotionMaster()->Clear(); - me->GetMotionMaster()->MovePoint(POINT_GO_BACK, me->GetHomePosition(), false); - events.Reset(); - } - } - } - - void KilledUnit(Unit* /*victim*/) - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(DESI_SAY_SLAY); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); - } - } - - void EnterCombat(Unit* /*who*/) - { - Talk(DESI_SAY_FREED); - me->CastSpell(me, SPELL_AURA_OF_DESIRE, true); - - events.ScheduleEvent(EVENT_DESI_DEADEN, 28000); - events.ScheduleEvent(EVENT_DESI_SPIRIT_SHOCK, 20000); - events.ScheduleEvent(EVENT_DESI_RUNE_SHIELD, 13000); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_DESI_DEADEN: - if (roll_chance_i(50)) - Talk(DESI_SAY_SPEC); - me->CastSpell(me->GetVictim(), SPELL_DEADEN, false); - events.ScheduleEvent(EVENT_DESI_DEADEN, 31000); - break; - case EVENT_DESI_SPIRIT_SHOCK: - me->CastSpell(me->GetVictim(), SPELL_SPIRIT_SHOCK, false); - events.ScheduleEvent(EVENT_DESI_SPIRIT_SHOCK, 12000); - break; - case EVENT_DESI_RUNE_SHIELD: - me->CastSpell(me, SPELL_RUNE_SHIELD, false); - events.ScheduleEvent(EVENT_DESI_RUNE_SHIELD, 15000); - break; - } - - DoMeleeAttackIfReady(); - } - }; + DoMeleeAttackIfReady(); + } + }; }; class boss_essence_of_anger : public CreatureScript { - public: - boss_essence_of_anger() : CreatureScript("boss_essence_of_anger") { } +public: + boss_essence_of_anger() : CreatureScript("boss_essence_of_anger") { } - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const + { + return new boss_essence_of_angerAI(creature); + } + + struct boss_essence_of_angerAI : public ScriptedAI + { + boss_essence_of_angerAI(Creature* creature) : ScriptedAI(creature) { } + + EventMap events; + uint64 targetGUID; + + void Reset() { - return new boss_essence_of_angerAI(creature); + targetGUID = 0; + events.Reset(); } - struct boss_essence_of_angerAI : public ScriptedAI + void DoAction(int32 param) { - boss_essence_of_angerAI(Creature* creature) : ScriptedAI(creature) { } - - EventMap events; - uint64 targetGUID; - - void Reset() + if (param == ACTION_ENGAGE_ESSENCE) { - targetGUID = 0; - events.Reset(); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); + me->SetReactState(REACT_AGGRESSIVE); + me->SetInCombatWithZone(); + } + } + + void KilledUnit(Unit* /*victim*/) + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + { + Talk(ANGER_SAY_SLAY); + events.ScheduleEvent(EVENT_KILL_TALK, 6000); + } + } + + void JustDied(Unit* /*killer*/) + { + Talk(ANGER_SAY_DEATH); + if (me->IsSummon()) + if (Unit* summoner = me->ToTempSummon()->GetSummoner()) + Unit::Kill(summoner, summoner); + } + + void EnterCombat(Unit* /*who*/) + { + Talk(ANGER_SAY_FREED); + me->CastSpell(me, SPELL_AURA_OF_ANGER, true); + + events.ScheduleEvent(EVENT_ANGER_SPITE, 15000); + events.ScheduleEvent(EVENT_ANGER_SOUL_SCREAM, 10000); + events.ScheduleEvent(EVENT_ANGER_SEETHE, 1000); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_ANGER_SPITE: + if (roll_chance_i(30)) + Talk(ANGER_SAY_SPEC); + me->CastCustomSpell(SPELL_SPITE, SPELLVALUE_MAX_TARGETS, 3, me, false); + events.ScheduleEvent(EVENT_ANGER_SPITE, 25000); + break; + case EVENT_ANGER_SOUL_SCREAM: + me->CastSpell(me->GetVictim(), SPELL_SOUL_SCREAM, false); + events.ScheduleEvent(EVENT_ANGER_SOUL_SCREAM, 10000); + break; + case EVENT_ANGER_SEETHE: + if (Unit* victim = me->GetVictim()) + { + uint64 victimGUID = victim->GetGUID(); + if (targetGUID && targetGUID != victimGUID) + me->CastSpell(me, SPELL_SEETHE, false); + // victim can be lost + targetGUID = victimGUID; + } + events.ScheduleEvent(EVENT_ANGER_SEETHE, 1000); + break; + } - void DoAction(int32 param) - { - if (param == ACTION_ENGAGE_ESSENCE) - { - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_NON_ATTACKABLE); - me->SetReactState(REACT_AGGRESSIVE); - me->SetInCombatWithZone(); - } - } - - void KilledUnit(Unit* /*victim*/) - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(ANGER_SAY_SLAY); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); - } - } - - void JustDied(Unit* /*killer*/) - { - Talk(ANGER_SAY_DEATH); - if (me->IsSummon()) - if (Unit* summoner = me->ToTempSummon()->GetSummoner()) - Unit::Kill(summoner, summoner); - } - - void EnterCombat(Unit* /*who*/) - { - Talk(ANGER_SAY_FREED); - me->CastSpell(me, SPELL_AURA_OF_ANGER, true); - - events.ScheduleEvent(EVENT_ANGER_SPITE, 15000); - events.ScheduleEvent(EVENT_ANGER_SOUL_SCREAM, 10000); - events.ScheduleEvent(EVENT_ANGER_SEETHE, 1000); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_ANGER_SPITE: - if (roll_chance_i(30)) - Talk(ANGER_SAY_SPEC); - me->CastCustomSpell(SPELL_SPITE, SPELLVALUE_MAX_TARGETS, 3, me, false); - events.ScheduleEvent(EVENT_ANGER_SPITE, 25000); - break; - case EVENT_ANGER_SOUL_SCREAM: - me->CastSpell(me->GetVictim(), SPELL_SOUL_SCREAM, false); - events.ScheduleEvent(EVENT_ANGER_SOUL_SCREAM, 10000); - break; - case EVENT_ANGER_SEETHE: - if (Unit* victim = me->GetVictim()) - { - uint64 victimGUID = victim->GetGUID(); - if (targetGUID && targetGUID != victimGUID) - me->CastSpell(me, SPELL_SEETHE, false); - // victim can be lost - targetGUID = victimGUID; - } - events.ScheduleEvent(EVENT_ANGER_SEETHE, 1000); - break; - - } - - DoMeleeAttackIfReady(); - } - }; + DoMeleeAttackIfReady(); + } + }; }; class spell_reliquary_of_souls_aura_of_suffering : public SpellScriptLoader { - public: - spell_reliquary_of_souls_aura_of_suffering() : SpellScriptLoader("spell_reliquary_of_souls_aura_of_suffering") { } +public: + spell_reliquary_of_souls_aura_of_suffering() : SpellScriptLoader("spell_reliquary_of_souls_aura_of_suffering") { } - class spell_reliquary_of_souls_aura_of_suffering_AuraScript : public AuraScript + class spell_reliquary_of_souls_aura_of_suffering_AuraScript : public AuraScript + { + PrepareAuraScript(spell_reliquary_of_souls_aura_of_suffering_AuraScript) + + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_reliquary_of_souls_aura_of_suffering_AuraScript) - - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetTarget()->CastSpell(GetTarget(), SPELL_AURA_OF_SUFFERING_TRIGGER, true); - } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetTarget()->RemoveAurasDueToSpell(SPELL_AURA_OF_SUFFERING_TRIGGER); - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_reliquary_of_souls_aura_of_suffering_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_MOD_HEALING_PCT, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_reliquary_of_souls_aura_of_suffering_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_MOD_HEALING_PCT, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_reliquary_of_souls_aura_of_suffering_AuraScript(); + GetTarget()->CastSpell(GetTarget(), SPELL_AURA_OF_SUFFERING_TRIGGER, true); } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->RemoveAurasDueToSpell(SPELL_AURA_OF_SUFFERING_TRIGGER); + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_reliquary_of_souls_aura_of_suffering_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_MOD_HEALING_PCT, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_reliquary_of_souls_aura_of_suffering_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_MOD_HEALING_PCT, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_reliquary_of_souls_aura_of_suffering_AuraScript(); + } }; class spell_reliquary_of_souls_fixate : public SpellScriptLoader { - public: - spell_reliquary_of_souls_fixate() : SpellScriptLoader("spell_reliquary_of_souls_fixate") { } +public: + spell_reliquary_of_souls_fixate() : SpellScriptLoader("spell_reliquary_of_souls_fixate") { } - class spell_reliquary_of_souls_fixate_SpellScript : public SpellScript + class spell_reliquary_of_souls_fixate_SpellScript : public SpellScript + { + PrepareSpellScript(spell_reliquary_of_souls_fixate_SpellScript); + + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_reliquary_of_souls_fixate_SpellScript); + if (targets.empty()) + return; - void FilterTargets(std::list& targets) - { - if (targets.empty()) - return; - - targets.sort(acore::ObjectDistanceOrderPred(GetCaster())); - WorldObject* target = targets.front(); - targets.clear(); - targets.push_back(target); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_reliquary_of_souls_fixate_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_reliquary_of_souls_fixate_SpellScript(); + targets.sort(acore::ObjectDistanceOrderPred(GetCaster())); + WorldObject* target = targets.front(); + targets.clear(); + targets.push_back(target); } - class spell_reliquary_of_souls_fixate_AuraScript : public AuraScript + void Register() { - PrepareAuraScript(spell_reliquary_of_souls_fixate_AuraScript) - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) - caster->RemoveAurasDueToSpell(GetSpellInfo()->Effects[EFFECT_1].TriggerSpell, GetTarget()->GetGUID()); - } - - void Register() - { - OnEffectRemove += AuraEffectRemoveFn(spell_reliquary_of_souls_fixate_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_reliquary_of_souls_fixate_AuraScript(); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_reliquary_of_souls_fixate_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY); } + }; + + SpellScript* GetSpellScript() const + { + return new spell_reliquary_of_souls_fixate_SpellScript(); + } + + class spell_reliquary_of_souls_fixate_AuraScript : public AuraScript + { + PrepareAuraScript(spell_reliquary_of_souls_fixate_AuraScript) + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* caster = GetCaster()) + caster->RemoveAurasDueToSpell(GetSpellInfo()->Effects[EFFECT_1].TriggerSpell, GetTarget()->GetGUID()); + } + + void Register() + { + OnEffectRemove += AuraEffectRemoveFn(spell_reliquary_of_souls_fixate_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_reliquary_of_souls_fixate_AuraScript(); + } }; class spell_reliquary_of_souls_aura_of_desire : public SpellScriptLoader { - public: - spell_reliquary_of_souls_aura_of_desire() : SpellScriptLoader("spell_reliquary_of_souls_aura_of_desire") { } +public: + spell_reliquary_of_souls_aura_of_desire() : SpellScriptLoader("spell_reliquary_of_souls_aura_of_desire") { } - class spell_reliquary_of_souls_aura_of_desire_AuraScript : public AuraScript + class spell_reliquary_of_souls_aura_of_desire_AuraScript : public AuraScript + { + PrepareAuraScript(spell_reliquary_of_souls_aura_of_desire_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_reliquary_of_souls_aura_of_desire_AuraScript); - - bool CheckProc(ProcEventInfo& eventInfo) - { - return eventInfo.GetActor() && eventInfo.GetActionTarget(); - } - - void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - eventInfo.GetActionTarget()->CastCustomSpell(SPELL_AURA_OF_DESIRE_DAMAGE, SPELLVALUE_BASE_POINT0, eventInfo.GetDamageInfo()->GetDamage()/2, eventInfo.GetActor(), true); - } - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - if (AuraEffect* effect = GetAura()->GetEffect(EFFECT_2)) - amount = std::max(-100, -5*int32(effect->GetTickNumber())); - } - - void Update(AuraEffect const* /*effect*/) - { - PreventDefaultAction(); - if (AuraEffect* effect = GetAura()->GetEffect(EFFECT_1)) - effect->RecalculateAmount(); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_reliquary_of_souls_aura_of_desire_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_reliquary_of_souls_aura_of_desire_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_MOD_HEALING_PCT); - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_reliquary_of_souls_aura_of_desire_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_INCREASE_ENERGY_PERCENT); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_reliquary_of_souls_aura_of_desire_AuraScript::Update, EFFECT_2, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_reliquary_of_souls_aura_of_desire_AuraScript(); + return eventInfo.GetActor() && eventInfo.GetActionTarget(); } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + eventInfo.GetActionTarget()->CastCustomSpell(SPELL_AURA_OF_DESIRE_DAMAGE, SPELLVALUE_BASE_POINT0, eventInfo.GetDamageInfo()->GetDamage() / 2, eventInfo.GetActor(), true); + } + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + if (AuraEffect* effect = GetAura()->GetEffect(EFFECT_2)) + amount = std::max(-100, -5 * int32(effect->GetTickNumber())); + } + + void Update(AuraEffect const* /*effect*/) + { + PreventDefaultAction(); + if (AuraEffect* effect = GetAura()->GetEffect(EFFECT_1)) + effect->RecalculateAmount(); + } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_reliquary_of_souls_aura_of_desire_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_reliquary_of_souls_aura_of_desire_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_MOD_HEALING_PCT); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_reliquary_of_souls_aura_of_desire_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_INCREASE_ENERGY_PERCENT); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_reliquary_of_souls_aura_of_desire_AuraScript::Update, EFFECT_2, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_reliquary_of_souls_aura_of_desire_AuraScript(); + } }; class spell_reliquary_of_souls_aura_of_anger : public SpellScriptLoader { - public: - spell_reliquary_of_souls_aura_of_anger() : SpellScriptLoader("spell_reliquary_of_souls_aura_of_anger") { } +public: + spell_reliquary_of_souls_aura_of_anger() : SpellScriptLoader("spell_reliquary_of_souls_aura_of_anger") { } - class spell_reliquary_of_souls_aura_of_anger_AuraScript : public AuraScript + class spell_reliquary_of_souls_aura_of_anger_AuraScript : public AuraScript + { + PrepareAuraScript(spell_reliquary_of_souls_aura_of_anger_AuraScript); + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) { - PrepareAuraScript(spell_reliquary_of_souls_aura_of_anger_AuraScript); - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - if (AuraEffect* effect = GetAura()->GetEffect(EFFECT_0)) - amount = amount*effect->GetTickNumber(); - } - - void Update(AuraEffect const* /*effect*/) - { - if (AuraEffect* effect = GetAura()->GetEffect(EFFECT_0)) - effect->RecalculateAmount(); - if (AuraEffect* effect = GetAura()->GetEffect(EFFECT_1)) - effect->RecalculateAmount(); - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_reliquary_of_souls_aura_of_anger_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_reliquary_of_souls_aura_of_anger_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_reliquary_of_souls_aura_of_anger_AuraScript::Update, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_reliquary_of_souls_aura_of_anger_AuraScript(); + if (AuraEffect* effect = GetAura()->GetEffect(EFFECT_0)) + amount = amount * effect->GetTickNumber(); } + + void Update(AuraEffect const* /*effect*/) + { + if (AuraEffect* effect = GetAura()->GetEffect(EFFECT_0)) + effect->RecalculateAmount(); + if (AuraEffect* effect = GetAura()->GetEffect(EFFECT_1)) + effect->RecalculateAmount(); + } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_reliquary_of_souls_aura_of_anger_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_reliquary_of_souls_aura_of_anger_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_reliquary_of_souls_aura_of_anger_AuraScript::Update, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_reliquary_of_souls_aura_of_anger_AuraScript(); + } }; class spell_reliquary_of_souls_spite : public SpellScriptLoader { - public: - spell_reliquary_of_souls_spite() : SpellScriptLoader("spell_reliquary_of_souls_spite") { } +public: + spell_reliquary_of_souls_spite() : SpellScriptLoader("spell_reliquary_of_souls_spite") { } - class spell_reliquary_of_souls_spite_AuraScript : public AuraScript + class spell_reliquary_of_souls_spite_AuraScript : public AuraScript + { + PrepareAuraScript(spell_reliquary_of_souls_spite_AuraScript) + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_reliquary_of_souls_spite_AuraScript) - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) - caster->CastSpell(GetTarget(), SPELL_SPITE_DAMAGE, true); - } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_reliquary_of_souls_spite_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DAMAGE_IMMUNITY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_reliquary_of_souls_spite_AuraScript(); + if (Unit* caster = GetCaster()) + caster->CastSpell(GetTarget(), SPELL_SPITE_DAMAGE, true); } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_reliquary_of_souls_spite_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DAMAGE_IMMUNITY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_reliquary_of_souls_spite_AuraScript(); + } }; void AddSC_boss_reliquary_of_souls() diff --git a/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp index 9caa32f43..cce54f579 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp @@ -79,96 +79,96 @@ enum Misc class boss_shade_of_akama : public CreatureScript { - public: - boss_shade_of_akama() : CreatureScript("boss_shade_of_akama") { } +public: + boss_shade_of_akama() : CreatureScript("boss_shade_of_akama") { } - struct boss_shade_of_akamaAI : public BossAI + struct boss_shade_of_akamaAI : public BossAI + { + boss_shade_of_akamaAI(Creature* creature) : BossAI(creature, DATA_SHADE_OF_AKAMA), summonsChanneler(me), summonsGenerator(me) { - boss_shade_of_akamaAI(Creature* creature) : BossAI(creature, DATA_SHADE_OF_AKAMA), summonsChanneler(me), summonsGenerator(me) - { - events2.ScheduleEvent(EVENT_SHADE_GATHER_NPCS, 1000); - } + events2.ScheduleEvent(EVENT_SHADE_GATHER_NPCS, 1000); + } - SummonList summonsChanneler; - SummonList summonsGenerator; - EventMap events2; + SummonList summonsChanneler; + SummonList summonsGenerator; + EventMap events2; - void ChannelersAction(int32 action) - { - for (SummonList::const_iterator i = summonsChanneler.begin(); i != summonsChanneler.end(); ++i) - if (Creature* summon = ObjectAccessor::GetCreature(*me, *i)) + void ChannelersAction(int32 action) + { + for (SummonList::const_iterator i = summonsChanneler.begin(); i != summonsChanneler.end(); ++i) + if (Creature* summon = ObjectAccessor::GetCreature(*me, *i)) + { + if (action == ACTION_CHANNELERS_START_CHANNEL) { - if (action == ACTION_CHANNELERS_START_CHANNEL) - { - summon->CastSpell(me, SPELL_SHADE_SOUL_CHANNEL, true); - summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - } - else if (action == ACTION_START_ENCOUNTER) - { - summon->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - } - else if (action == ACTION_KILL_CHANNELERS) - { - Unit::Kill(me, summon); - } + summon->CastSpell(me, SPELL_SHADE_SOUL_CHANNEL, true); + summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + } + else if (action == ACTION_START_ENCOUNTER) + { + summon->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + } + else if (action == ACTION_KILL_CHANNELERS) + { + Unit::Kill(me, summon); } - } - - void Reset() - { - BossAI::Reset(); - me->SetReactState(REACT_PASSIVE); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC|UNIT_FLAG_NOT_SELECTABLE); - me->SetWalk(true); - } - - void EnterEvadeMode() - { - BossAI::EnterEvadeMode(); - summonsGenerator.DoAction(ACTION_DESPAWN_ALL); - events2.ScheduleEvent(EVENT_SHADE_RESET_ENCOUNTER, 20000); - me->SetVisible(false); - ChannelersAction(ACTION_KILL_CHANNELERS); - } - - void JustDied(Unit* killer) - { - BossAI::JustDied(killer); - summonsGenerator.DoAction(ACTION_DESPAWN_ALL); - summonsChanneler.DespawnAll(); - me->CastSpell(me, SPELL_SHADE_OF_AKAMA_TRIGGER, true); - if (Creature* akama = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_AKAMA_SHADE))) - { - akama->SetHomePosition(*akama); - akama->AI()->DoAction(ACTION_SHADE_DIED); } - } + } - void EnterCombat(Unit* who) - { - BossAI::EnterCombat(who); - } + void Reset() + { + BossAI::Reset(); + me->SetReactState(REACT_PASSIVE); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NOT_SELECTABLE); + me->SetWalk(true); + } - void DoAction(int32 param) - { - if (param == ACTION_START_ENCOUNTER) - { - summonsGenerator.DoAction(ACTION_START_ENCOUNTER); - ChannelersAction(ACTION_START_ENCOUNTER); - events.ScheduleEvent(EVENT_SHADE_CHECK_DISTANCE, 1000); - } - else if (param == ACTION_AKAMA_DIED) - { - EnterEvadeMode(); - } - } + void EnterEvadeMode() + { + BossAI::EnterEvadeMode(); + summonsGenerator.DoAction(ACTION_DESPAWN_ALL); + events2.ScheduleEvent(EVENT_SHADE_RESET_ENCOUNTER, 20000); + me->SetVisible(false); + ChannelersAction(ACTION_KILL_CHANNELERS); + } - void UpdateAI(uint32 diff) + void JustDied(Unit* killer) + { + BossAI::JustDied(killer); + summonsGenerator.DoAction(ACTION_DESPAWN_ALL); + summonsChanneler.DespawnAll(); + me->CastSpell(me, SPELL_SHADE_OF_AKAMA_TRIGGER, true); + if (Creature* akama = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_AKAMA_SHADE))) { - events2.Update(diff); - switch (events2.ExecuteEvent()) - { - case EVENT_SHADE_GATHER_NPCS: + akama->SetHomePosition(*akama); + akama->AI()->DoAction(ACTION_SHADE_DIED); + } + } + + void EnterCombat(Unit* who) + { + BossAI::EnterCombat(who); + } + + void DoAction(int32 param) + { + if (param == ACTION_START_ENCOUNTER) + { + summonsGenerator.DoAction(ACTION_START_ENCOUNTER); + ChannelersAction(ACTION_START_ENCOUNTER); + events.ScheduleEvent(EVENT_SHADE_CHECK_DISTANCE, 1000); + } + else if (param == ACTION_AKAMA_DIED) + { + EnterEvadeMode(); + } + } + + void UpdateAI(uint32 diff) + { + events2.Update(diff); + switch (events2.ExecuteEvent()) + { + case EVENT_SHADE_GATHER_NPCS: { std::list ChannelerList; me->GetCreaturesWithEntryInRange(ChannelerList, 100.0f, NPC_ASHTONGUE_CHANNELER); @@ -183,245 +183,245 @@ class boss_shade_of_akama : public CreatureScript summonsChanneler.Respawn(); summonsGenerator.Respawn(); ChannelersAction(ACTION_CHANNELERS_START_CHANNEL); - + if (Creature* akama = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_AKAMA_SHADE))) akama->Respawn(true); break; } - case EVENT_SHADE_RESET_ENCOUNTER: - me->SetVisible(true); - summonsGenerator.Respawn(); - summonsChanneler.Respawn(); - ChannelersAction(ACTION_CHANNELERS_START_CHANNEL); + case EVENT_SHADE_RESET_ENCOUNTER: + me->SetVisible(true); + summonsGenerator.Respawn(); + summonsChanneler.Respawn(); + ChannelersAction(ACTION_CHANNELERS_START_CHANNEL); - if (Creature* akama = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_AKAMA_SHADE))) - akama->Respawn(true); - break; - } - - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SHADE_CHECK_DISTANCE: - if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() != POINT_MOTION_TYPE) - { - int32 slow = me->GetMaxNegativeAuraModifier(SPELL_AURA_MOD_DECREASE_SPEED); - if (slow > -100) - { - me->SetWalk(true); - me->GetMotionMaster()->MovePoint(POINT_START, 510.0f, 400.7993f, 112.7837f); - } - } - else - { - int32 slow = me->GetMaxNegativeAuraModifier(SPELL_AURA_MOD_DECREASE_SPEED); - if (slow < -100) - me->GetMotionMaster()->Clear(); - else if (slow == 0) - { - summonsGenerator.DoAction(ACTION_NO_SORCERERS); - me->SetWalk(false); - } - } - - if (me->IsWithinMeleeRange(me->GetVictim())) - { - me->SetReactState(REACT_AGGRESSIVE); - DoResetThreat(); - me->GetVictim()->InterruptNonMeleeSpells(false); - me->AddThreat(me->GetVictim(), 1000000.0f); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC|UNIT_FLAG_NOT_SELECTABLE); - summonsGenerator.DoAction(ACTION_STOP_SPAWNING); - break; - } - events.ScheduleEvent(EVENT_SHADE_CHECK_DISTANCE, 1000); - break; - } - - DoMeleeAttackIfReady(); - EnterEvadeIfOutOfCombatArea(); + if (Creature* akama = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_AKAMA_SHADE))) + akama->Respawn(true); + break; } - - bool CheckEvadeIfOutOfCombatArea() const + + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) { - return !SelectTargetFromPlayerList(120.0f); - } - }; + case EVENT_SHADE_CHECK_DISTANCE: + if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() != POINT_MOTION_TYPE) + { + int32 slow = me->GetMaxNegativeAuraModifier(SPELL_AURA_MOD_DECREASE_SPEED); + if (slow > -100) + { + me->SetWalk(true); + me->GetMotionMaster()->MovePoint(POINT_START, 510.0f, 400.7993f, 112.7837f); + } + } + else + { + int32 slow = me->GetMaxNegativeAuraModifier(SPELL_AURA_MOD_DECREASE_SPEED); + if (slow < -100) + me->GetMotionMaster()->Clear(); + else if (slow == 0) + { + summonsGenerator.DoAction(ACTION_NO_SORCERERS); + me->SetWalk(false); + } + } - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + if (me->IsWithinMeleeRange(me->GetVictim())) + { + me->SetReactState(REACT_AGGRESSIVE); + DoResetThreat(); + me->GetVictim()->InterruptNonMeleeSpells(false); + me->AddThreat(me->GetVictim(), 1000000.0f); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NOT_SELECTABLE); + summonsGenerator.DoAction(ACTION_STOP_SPAWNING); + break; + } + events.ScheduleEvent(EVENT_SHADE_CHECK_DISTANCE, 1000); + break; + } + + DoMeleeAttackIfReady(); + EnterEvadeIfOutOfCombatArea(); } + + bool CheckEvadeIfOutOfCombatArea() const + { + return !SelectTargetFromPlayerList(120.0f); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class npc_akama_shade : public CreatureScript { - public: - npc_akama_shade() : CreatureScript("npc_akama_shade") { } +public: + npc_akama_shade() : CreatureScript("npc_akama_shade") { } - struct npc_akamaAI : public ScriptedAI + struct npc_akamaAI : public ScriptedAI + { + npc_akamaAI(Creature* creature) : ScriptedAI(creature), summons(me) { - npc_akamaAI(Creature* creature) : ScriptedAI(creature), summons(me) - { - instance = creature->GetInstanceScript(); - } - - InstanceScript* instance; - EventMap events; - EventMap events2; - SummonList summons; - - void Reset() - { - if (instance->GetBossState(DATA_SHADE_OF_AKAMA) == DONE) - { - me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - return; - } - - me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - me->CastSpell(me, SPELL_STEALTH, true); - events.Reset(); - events2.Reset(); - } - - void MovementInform(uint32 type, uint32 point) - { - if (type != POINT_MOTION_TYPE || point != POINT_CHANNEL_SOUL) - return; - - me->SetFacingTo(0.0f); - events2.ScheduleEvent(EVENT_AKAMA_SCENE1, 1000); - events2.ScheduleEvent(EVENT_AKAMA_SCENE2, 16500); - events2.ScheduleEvent(EVENT_AKAMA_SCENE3, 17500); - events2.ScheduleEvent(EVENT_AKAMA_SCENE4, 27000); - events2.ScheduleEvent(EVENT_AKAMA_SCENE5, 37000); - events2.ScheduleEvent(EVENT_AKAMA_SCENE6, 51000); - events2.ScheduleEvent(EVENT_AKAMA_SCENE7, 56000); - } - - void DoAction(int32 param) - { - if (param == ACTION_SHADE_DIED) - events2.ScheduleEvent(EVENT_AKAMA_SCENE0, 1000); - } - - void JustDied(Unit* /*killer*/) - { - if (Creature* shade = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_SHADE_OF_AKAMA))) - shade->AI()->DoAction(ACTION_AKAMA_DIED); - } - - void EnterCombat(Unit* /*who*/) - { - events.ScheduleEvent(EVENT_SPELL_CHAIN_LIGHTNING, 2000); - events.ScheduleEvent(EVENT_SPELL_DESTRUCTIVE_POISON, 5000); - } - - void JustSummoned(Creature* summon) - { - float dist = frand(30.0f, 32.0f); - summon->SetWalk(true); - summon->GetMotionMaster()->MovePoint(POINT_START, summon->GetPositionX()+dist*cos(summon->GetOrientation()), summon->GetPositionY()+dist*sin(summon->GetOrientation()), summon->GetPositionZ(), false); - summons.Summon(summon); - } - - void UpdateAI(uint32 diff) - { - events2.Update(diff); - switch (events2.ExecuteEvent()) - { - case EVENT_AKAMA_START_ENCOUNTER: - me->RemoveAura(SPELL_STEALTH); - me->SetWalk(true); - me->GetMotionMaster()->MovePoint(POINT_START, 517.4877f, 400.7993f, 112.7837f, false); - events2.ScheduleEvent(EVENT_AKAMA_START_CHANNEL, 11000); - break; - case EVENT_AKAMA_START_CHANNEL: - me->CastSpell(me, SPELL_AKAMA_SOUL_CHANNEL, false); - if (Creature* shade = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_SHADE_OF_AKAMA))) - { - shade->AI()->AttackStart(me); - shade->GetMotionMaster()->Clear(); - shade->AI()->DoAction(ACTION_START_ENCOUNTER); - } - break; - case EVENT_AKAMA_SCENE0: - me->SetWalk(true); - me->GetMotionMaster()->MovePoint(POINT_CHANNEL_SOUL, 467.0f, 400.7993f, 118.537f); - break; - case EVENT_AKAMA_SCENE1: - me->CastSpell(me, SPELL_AKAMA_SOUL_RETRIEVE, true); - break; - case EVENT_AKAMA_SCENE2: - Talk(SAY_BROKEN_FREE_0); - break; - case EVENT_AKAMA_SCENE3: - me->SummonCreatureGroup(SUMMON_GROUP_BROKENS); - break; - case EVENT_AKAMA_SCENE4: - Talk(SAY_BROKEN_FREE_1); - break; - case EVENT_AKAMA_SCENE5: - for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) - if (Creature* broken = ObjectAccessor::GetCreature(*me, *itr)) - broken->SetStandState(UNIT_STAND_STATE_KNEEL); - Talk(SAY_BROKEN_FREE_2); - break; - case EVENT_AKAMA_SCENE6: - if (Creature* broken = summons.GetCreatureWithEntry(NPC_ASHTONGUE_BROKEN)) - broken->AI()->Talk(SAY_BROKEN_S1); - break; - case EVENT_AKAMA_SCENE7: - for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) - if (Creature* broken = ObjectAccessor::GetCreature(*me, *itr)) - broken->AI()->Talk(SAY_BROKEN_S2); - break; - } - - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_CHAIN_LIGHTNING: - me->CastSpell(me->GetVictim(), SPELL_CHAIN_LIGHTNING, false); - events.ScheduleEvent(EVENT_SPELL_CHAIN_LIGHTNING, urand(10000, 15000)); - break; - case EVENT_SPELL_DESTRUCTIVE_POISON: - me->CastSpell(me, SPELL_DESTRUCTIVE_POISON, false); - events.ScheduleEvent(EVENT_SPELL_DESTRUCTIVE_POISON, urand(4000, 5000)); - break; - } - - DoMeleeAttackIfReady(); - } - - void sGossipSelect(Player* player, uint32 /*sender*/, uint32 action) - { - if (action == 0) - { - CloseGossipMenuFor(player); - me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - events2.ScheduleEvent(EVENT_AKAMA_START_ENCOUNTER, 0); - } - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + instance = creature->GetInstanceScript(); } + + InstanceScript* instance; + EventMap events; + EventMap events2; + SummonList summons; + + void Reset() + { + if (instance->GetBossState(DATA_SHADE_OF_AKAMA) == DONE) + { + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + return; + } + + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + me->CastSpell(me, SPELL_STEALTH, true); + events.Reset(); + events2.Reset(); + } + + void MovementInform(uint32 type, uint32 point) + { + if (type != POINT_MOTION_TYPE || point != POINT_CHANNEL_SOUL) + return; + + me->SetFacingTo(0.0f); + events2.ScheduleEvent(EVENT_AKAMA_SCENE1, 1000); + events2.ScheduleEvent(EVENT_AKAMA_SCENE2, 16500); + events2.ScheduleEvent(EVENT_AKAMA_SCENE3, 17500); + events2.ScheduleEvent(EVENT_AKAMA_SCENE4, 27000); + events2.ScheduleEvent(EVENT_AKAMA_SCENE5, 37000); + events2.ScheduleEvent(EVENT_AKAMA_SCENE6, 51000); + events2.ScheduleEvent(EVENT_AKAMA_SCENE7, 56000); + } + + void DoAction(int32 param) + { + if (param == ACTION_SHADE_DIED) + events2.ScheduleEvent(EVENT_AKAMA_SCENE0, 1000); + } + + void JustDied(Unit* /*killer*/) + { + if (Creature* shade = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_SHADE_OF_AKAMA))) + shade->AI()->DoAction(ACTION_AKAMA_DIED); + } + + void EnterCombat(Unit* /*who*/) + { + events.ScheduleEvent(EVENT_SPELL_CHAIN_LIGHTNING, 2000); + events.ScheduleEvent(EVENT_SPELL_DESTRUCTIVE_POISON, 5000); + } + + void JustSummoned(Creature* summon) + { + float dist = frand(30.0f, 32.0f); + summon->SetWalk(true); + summon->GetMotionMaster()->MovePoint(POINT_START, summon->GetPositionX() + dist * cos(summon->GetOrientation()), summon->GetPositionY() + dist * sin(summon->GetOrientation()), summon->GetPositionZ(), false); + summons.Summon(summon); + } + + void UpdateAI(uint32 diff) + { + events2.Update(diff); + switch (events2.ExecuteEvent()) + { + case EVENT_AKAMA_START_ENCOUNTER: + me->RemoveAura(SPELL_STEALTH); + me->SetWalk(true); + me->GetMotionMaster()->MovePoint(POINT_START, 517.4877f, 400.7993f, 112.7837f, false); + events2.ScheduleEvent(EVENT_AKAMA_START_CHANNEL, 11000); + break; + case EVENT_AKAMA_START_CHANNEL: + me->CastSpell(me, SPELL_AKAMA_SOUL_CHANNEL, false); + if (Creature* shade = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_SHADE_OF_AKAMA))) + { + shade->AI()->AttackStart(me); + shade->GetMotionMaster()->Clear(); + shade->AI()->DoAction(ACTION_START_ENCOUNTER); + } + break; + case EVENT_AKAMA_SCENE0: + me->SetWalk(true); + me->GetMotionMaster()->MovePoint(POINT_CHANNEL_SOUL, 467.0f, 400.7993f, 118.537f); + break; + case EVENT_AKAMA_SCENE1: + me->CastSpell(me, SPELL_AKAMA_SOUL_RETRIEVE, true); + break; + case EVENT_AKAMA_SCENE2: + Talk(SAY_BROKEN_FREE_0); + break; + case EVENT_AKAMA_SCENE3: + me->SummonCreatureGroup(SUMMON_GROUP_BROKENS); + break; + case EVENT_AKAMA_SCENE4: + Talk(SAY_BROKEN_FREE_1); + break; + case EVENT_AKAMA_SCENE5: + for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) + if (Creature* broken = ObjectAccessor::GetCreature(*me, *itr)) + broken->SetStandState(UNIT_STAND_STATE_KNEEL); + Talk(SAY_BROKEN_FREE_2); + break; + case EVENT_AKAMA_SCENE6: + if (Creature* broken = summons.GetCreatureWithEntry(NPC_ASHTONGUE_BROKEN)) + broken->AI()->Talk(SAY_BROKEN_S1); + break; + case EVENT_AKAMA_SCENE7: + for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) + if (Creature* broken = ObjectAccessor::GetCreature(*me, *itr)) + broken->AI()->Talk(SAY_BROKEN_S2); + break; + } + + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_SPELL_CHAIN_LIGHTNING: + me->CastSpell(me->GetVictim(), SPELL_CHAIN_LIGHTNING, false); + events.ScheduleEvent(EVENT_SPELL_CHAIN_LIGHTNING, urand(10000, 15000)); + break; + case EVENT_SPELL_DESTRUCTIVE_POISON: + me->CastSpell(me, SPELL_DESTRUCTIVE_POISON, false); + events.ScheduleEvent(EVENT_SPELL_DESTRUCTIVE_POISON, urand(4000, 5000)); + break; + } + + DoMeleeAttackIfReady(); + } + + void sGossipSelect(Player* player, uint32 /*sender*/, uint32 action) + { + if (action == 0) + { + CloseGossipMenuFor(player); + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + events2.ScheduleEvent(EVENT_AKAMA_START_ENCOUNTER, 0); + } + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; // ######################################################## @@ -430,180 +430,180 @@ class npc_akama_shade : public CreatureScript class npc_creature_generator_akama : public CreatureScript { - public: - npc_creature_generator_akama() : CreatureScript("npc_creature_generator_akama") { } +public: + npc_creature_generator_akama() : CreatureScript("npc_creature_generator_akama") { } - struct npc_creature_generator_akamaAI : public NullCreatureAI + struct npc_creature_generator_akamaAI : public NullCreatureAI + { + npc_creature_generator_akamaAI(Creature* creature) : NullCreatureAI(creature), summons(me) { - npc_creature_generator_akamaAI(Creature* creature) : NullCreatureAI(creature), summons(me) + instance = creature->GetInstanceScript(); + } + + void Reset() + { + events.Reset(); + summons.DespawnAll(); + } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + if (summon->GetEntry() == NPC_ASHTONGUE_SORCERER) { - instance = creature->GetInstanceScript(); + std::list channelerList; + me->GetCreaturesWithEntryInRange(channelerList, 120.0f, NPC_ASHTONGUE_CHANNELER); + for (std::list::const_iterator itr = channelerList.begin(); itr != channelerList.end(); ++itr) + { + if ((*itr)->IsAlive() || (*itr)->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)) + continue; + + summon->SetInCombatWithZone(); + summon->SetReactState(REACT_PASSIVE); + summon->GetMotionMaster()->MovePoint(POINT_START, **itr); + (*itr)->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + return; + } } - void Reset() + summon->SetInCombatWithZone(); + if (Unit* akama = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_AKAMA_SHADE))) + { + summon->AddThreat(akama, 500.0f); + summon->AI()->AttackStart(akama); + } + } + + void SummonedCreatureDies(Creature* summon, Unit*) + { + summon->DespawnOrUnsummon(10000); + summons.Despawn(summon); + } + + void DoAction(int32 param) + { + if (param == ACTION_STOP_SPAWNING || param == ACTION_DESPAWN_ALL) { events.Reset(); - summons.DespawnAll(); - } - - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - if (summon->GetEntry() == NPC_ASHTONGUE_SORCERER) + for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) { - std::list channelerList; - me->GetCreaturesWithEntryInRange(channelerList, 120.0f, NPC_ASHTONGUE_CHANNELER); - for (std::list::const_iterator itr = channelerList.begin(); itr != channelerList.end(); ++itr) + if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr)) { - if ((*itr)->IsAlive() || (*itr)->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)) + if (summon->GetEntry() != NPC_ASHTONGUE_SORCERER) continue; - + summon->InterruptNonMeleeSpells(false); + summon->GetMotionMaster()->Clear(); summon->SetInCombatWithZone(); - summon->SetReactState(REACT_PASSIVE); - summon->GetMotionMaster()->MovePoint(POINT_START, **itr); - (*itr)->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - return; } } - - summon->SetInCombatWithZone(); - if (Unit* akama = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_AKAMA_SHADE))) - { - summon->AddThreat(akama, 500.0f); - summon->AI()->AttackStart(akama); - } } - - void SummonedCreatureDies(Creature* summon, Unit*) + if (param == ACTION_DESPAWN_ALL) + summons.DespawnAll(); + else if (param == ACTION_NO_SORCERERS) + events.CancelEvent(EVENT_SUMMON_ASHTONGUE_SORCERER); + else if (param == ACTION_START_ENCOUNTER) { - summon->DespawnOrUnsummon(10000); - summons.Despawn(summon); + events.ScheduleEvent(EVENT_SUMMON_WAVE_B, 5000); + events.ScheduleEvent(EVENT_SUMMON_ASHTONGUE_DEFENDER, 20000); + events.ScheduleEvent(EVENT_SUMMON_ASHTONGUE_SORCERER, 35000); } - - void DoAction(int32 param) - { - if (param == ACTION_STOP_SPAWNING || param == ACTION_DESPAWN_ALL) - { - events.Reset(); - for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) - { - if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr)) - { - if (summon->GetEntry() != NPC_ASHTONGUE_SORCERER) - continue; - summon->InterruptNonMeleeSpells(false); - summon->GetMotionMaster()->Clear(); - summon->SetInCombatWithZone(); - } - } - } - if (param == ACTION_DESPAWN_ALL) - summons.DespawnAll(); - else if (param == ACTION_NO_SORCERERS) - events.CancelEvent(EVENT_SUMMON_ASHTONGUE_SORCERER); - else if (param == ACTION_START_ENCOUNTER) - { - events.ScheduleEvent(EVENT_SUMMON_WAVE_B, 5000); - events.ScheduleEvent(EVENT_SUMMON_ASHTONGUE_DEFENDER, 20000); - events.ScheduleEvent(EVENT_SUMMON_ASHTONGUE_SORCERER, 35000); - } - } - - void UpdateAI(uint32 diff) - { - events.Update(diff); - - switch (events.ExecuteEvent()) - { - case EVENT_SUMMON_WAVE_B: - me->CastSpell(me, SPELL_ASHTONGUE_WAVE_B, true); - events.ScheduleEvent(EVENT_SUMMON_WAVE_B, 45000); - break; - case EVENT_SUMMON_ASHTONGUE_SORCERER: // left - me->CastSpell(me, SPELL_SUMMON_ASHTONGUE_SORCERER, true); - events.ScheduleEvent(EVENT_SUMMON_ASHTONGUE_SORCERER, 45000); - break; - case EVENT_SUMMON_ASHTONGUE_DEFENDER: // right - me->CastSpell(me, SPELL_SUMMON_ASHTONGUE_DEFENDER, true); - events.ScheduleEvent(EVENT_SUMMON_ASHTONGUE_DEFENDER, 45000); - break; - default: - break; - } - } - - private: - EventMap events; - SummonList summons; - InstanceScript* instance; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); } + + void UpdateAI(uint32 diff) + { + events.Update(diff); + + switch (events.ExecuteEvent()) + { + case EVENT_SUMMON_WAVE_B: + me->CastSpell(me, SPELL_ASHTONGUE_WAVE_B, true); + events.ScheduleEvent(EVENT_SUMMON_WAVE_B, 45000); + break; + case EVENT_SUMMON_ASHTONGUE_SORCERER: // left + me->CastSpell(me, SPELL_SUMMON_ASHTONGUE_SORCERER, true); + events.ScheduleEvent(EVENT_SUMMON_ASHTONGUE_SORCERER, 45000); + break; + case EVENT_SUMMON_ASHTONGUE_DEFENDER: // right + me->CastSpell(me, SPELL_SUMMON_ASHTONGUE_DEFENDER, true); + events.ScheduleEvent(EVENT_SUMMON_ASHTONGUE_DEFENDER, 45000); + break; + default: + break; + } + } + + private: + EventMap events; + SummonList summons; + InstanceScript* instance; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class spell_shade_of_akama_shade_soul_channel : public SpellScriptLoader { - public: - spell_shade_of_akama_shade_soul_channel() : SpellScriptLoader("spell_shade_of_akama_shade_soul_channel") { } +public: + spell_shade_of_akama_shade_soul_channel() : SpellScriptLoader("spell_shade_of_akama_shade_soul_channel") { } - class spell_shade_of_akama_shade_soul_channel_AuraScript : public AuraScript + class spell_shade_of_akama_shade_soul_channel_AuraScript : public AuraScript + { + PrepareAuraScript(spell_shade_of_akama_shade_soul_channel_AuraScript) + + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_shade_of_akama_shade_soul_channel_AuraScript) - - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) - caster->SetFacingToObject(GetTarget()); - } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Aura* aura = GetTarget()->GetAura(GetSpellInfo()->Effects[EFFECT_1].TriggerSpell)) - aura->ModStackAmount(-1); - } - - void Register() - { - AfterEffectApply += AuraEffectApplyFn(spell_shade_of_akama_shade_soul_channel_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_shade_of_akama_shade_soul_channel_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_shade_of_akama_shade_soul_channel_AuraScript(); + if (Unit* caster = GetCaster()) + caster->SetFacingToObject(GetTarget()); } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Aura* aura = GetTarget()->GetAura(GetSpellInfo()->Effects[EFFECT_1].TriggerSpell)) + aura->ModStackAmount(-1); + } + + void Register() + { + AfterEffectApply += AuraEffectApplyFn(spell_shade_of_akama_shade_soul_channel_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_shade_of_akama_shade_soul_channel_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_shade_of_akama_shade_soul_channel_AuraScript(); + } }; class spell_shade_of_akama_akama_soul_expel : public SpellScriptLoader { - public: - spell_shade_of_akama_akama_soul_expel() : SpellScriptLoader("spell_shade_of_akama_akama_soul_expel") { } +public: + spell_shade_of_akama_akama_soul_expel() : SpellScriptLoader("spell_shade_of_akama_akama_soul_expel") { } - class spell_shade_of_akama_akama_soul_expel_SpellScript : public SpellScript + class spell_shade_of_akama_akama_soul_expel_SpellScript : public SpellScript + { + PrepareSpellScript(spell_shade_of_akama_akama_soul_expel_SpellScript); + + void SetDest(SpellDestination& dest) { - PrepareSpellScript(spell_shade_of_akama_akama_soul_expel_SpellScript); - - void SetDest(SpellDestination& dest) - { - // Adjust effect summon position - Position const offset = { 0.0f, 0.0f, 25.0f, 0.0f }; - dest.RelocateOffset(offset); - } - - void Register() - { - OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_shade_of_akama_akama_soul_expel_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER_RADIUS); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_shade_of_akama_akama_soul_expel_SpellScript(); + // Adjust effect summon position + Position const offset = { 0.0f, 0.0f, 25.0f, 0.0f }; + dest.RelocateOffset(offset); } + + void Register() + { + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_shade_of_akama_akama_soul_expel_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER_RADIUS); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_shade_of_akama_akama_soul_expel_SpellScript(); + } }; void AddSC_boss_shade_of_akama() diff --git a/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp b/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp index 0631a0b97..7bdf44e4f 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp @@ -35,160 +35,160 @@ enum Supremus class boss_supremus : public CreatureScript { - public: - boss_supremus() : CreatureScript("boss_supremus") { } +public: + boss_supremus() : CreatureScript("boss_supremus") { } - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } + + struct boss_supremusAI : public BossAI + { + boss_supremusAI(Creature* creature) : BossAI(creature, DATA_SUPREMUS) { - return GetInstanceAI(creature); } - struct boss_supremusAI : public BossAI + void Reset() { - boss_supremusAI(Creature* creature) : BossAI(creature, DATA_SUPREMUS) + BossAI::Reset(); + } + + void EnterCombat(Unit* who) + { + BossAI::EnterCombat(who); + + SchedulePhase(false); + events.ScheduleEvent(EVENT_SPELL_BERSERK, 900000); + events.ScheduleEvent(EVENT_SPELL_MOLTEN_FLAMES, 4000); + } + + void SchedulePhase(bool run) + { + events.CancelEventGroup(EVENT_GROUP_ABILITIES); + events.ScheduleEvent(EVENT_SWITCH_PHASE, 60000); + DoResetThreat(); + + if (!run) { + events.ScheduleEvent(EVENT_SPELL_HATEFUL_STRIKE, 5000, EVENT_GROUP_ABILITIES); + me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false); + me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, false); + me->RemoveAurasDueToSpell(SPELL_SNARE_SELF); + } + else + { + events.ScheduleEvent(EVENT_SPELL_VOLCANIC_ERUPTION, 5000, EVENT_GROUP_ABILITIES); + events.ScheduleEvent(EVENT_SWITCH_TARGET, 0, EVENT_GROUP_ABILITIES); + events.ScheduleEvent(EVENT_CHECK_DIST, 0, EVENT_GROUP_ABILITIES); + me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true); + me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, true); + me->CastSpell(me, SPELL_SNARE_SELF, true); + } + } + + void JustDied(Unit* killer) + { + BossAI::JustDied(killer); + } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + if (summon->GetEntry() == NPC_SUPREMUS_PUNCH_STALKER) + { + summon->ToTempSummon()->InitStats(20000); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) + summon->GetMotionMaster()->MoveFollow(target, 0.0f, 0.0f, MOTION_SLOT_CONTROLLED); + } + else + summon->CastSpell(summon, SPELL_VOLCANIC_ERUPTION_TRIGGER, true); + } + + void SummonedCreatureDespawn(Creature* summon) + { + summons.Despawn(summon); + } + + Unit* FindHatefulStrikeTarget() + { + Unit* target = nullptr; + ThreatContainer::StorageType const& threatlist = me->getThreatManager().getThreatList(); + for (ThreatContainer::StorageType::const_iterator i = threatlist.begin(); i != threatlist.end(); ++i) + { + Unit* unit = ObjectAccessor::GetUnit(*me, (*i)->getUnitGuid()); + if (unit && me->IsWithinMeleeRange(unit)) + if (!target || unit->GetHealth() > target->GetHealth()) + target = unit; } - void Reset() + return target; + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) { - BossAI::Reset(); - } - - void EnterCombat(Unit* who) - { - BossAI::EnterCombat(who); - - SchedulePhase(false); - events.ScheduleEvent(EVENT_SPELL_BERSERK, 900000); - events.ScheduleEvent(EVENT_SPELL_MOLTEN_FLAMES, 4000); - } - - void SchedulePhase(bool run) - { - events.CancelEventGroup(EVENT_GROUP_ABILITIES); - events.ScheduleEvent(EVENT_SWITCH_PHASE, 60000); - DoResetThreat(); - - if (!run) - { - events.ScheduleEvent(EVENT_SPELL_HATEFUL_STRIKE, 5000, EVENT_GROUP_ABILITIES); - me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false); - me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, false); - me->RemoveAurasDueToSpell(SPELL_SNARE_SELF); - } - else - { - events.ScheduleEvent(EVENT_SPELL_VOLCANIC_ERUPTION, 5000, EVENT_GROUP_ABILITIES); - events.ScheduleEvent(EVENT_SWITCH_TARGET, 0, EVENT_GROUP_ABILITIES); - events.ScheduleEvent(EVENT_CHECK_DIST, 0, EVENT_GROUP_ABILITIES); - me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true); - me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, true); - me->CastSpell(me, SPELL_SNARE_SELF, true); - } - } - - void JustDied(Unit* killer) - { - BossAI::JustDied(killer); - } - - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - if (summon->GetEntry() == NPC_SUPREMUS_PUNCH_STALKER) - { - summon->ToTempSummon()->InitStats(20000); - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) - summon->GetMotionMaster()->MoveFollow(target, 0.0f, 0.0f, MOTION_SLOT_CONTROLLED); - } - else - summon->CastSpell(summon, SPELL_VOLCANIC_ERUPTION_TRIGGER, true); - } - - void SummonedCreatureDespawn(Creature* summon) - { - summons.Despawn(summon); - } - - Unit* FindHatefulStrikeTarget() - { - Unit* target = nullptr; - ThreatContainer::StorageType const &threatlist = me->getThreatManager().getThreatList(); - for (ThreatContainer::StorageType::const_iterator i = threatlist.begin(); i != threatlist.end(); ++i) - { - Unit* unit = ObjectAccessor::GetUnit(*me, (*i)->getUnitGuid()); - if (unit && me->IsWithinMeleeRange(unit)) - if (!target || unit->GetHealth() > target->GetHealth()) - target = unit; - } - - return target; - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_BERSERK: - me->CastSpell(me, SPELL_BERSERK, true); + case EVENT_SPELL_BERSERK: + me->CastSpell(me, SPELL_BERSERK, true); + break; + case EVENT_SPELL_HATEFUL_STRIKE: + if (Unit* target = FindHatefulStrikeTarget()) + me->CastSpell(target, SPELL_HATEFUL_STRIKE, false); + events.ScheduleEvent(EVENT_SPELL_HATEFUL_STRIKE, urand(1500, 3000), EVENT_GROUP_ABILITIES); + break; + case EVENT_SPELL_MOLTEN_FLAMES: + me->CastSpell(me, SPELL_MOLTEN_PUNCH, false); + events.ScheduleEvent(EVENT_SPELL_MOLTEN_FLAMES, 20000, EVENT_GROUP_ABILITIES); + break; + case EVENT_SWITCH_PHASE: + SchedulePhase(!me->HasAura(SPELL_SNARE_SELF)); + break; + case EVENT_SWITCH_TARGET: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) + { + DoResetThreat(); + me->AddThreat(target, 5000000.0f); + Talk(EMOTE_NEW_TARGET); + } + events.ScheduleEvent(EVENT_SWITCH_TARGET, 10000, EVENT_GROUP_ABILITIES); + break; + case EVENT_CHECK_DIST: + if (me->GetDistance(me->GetVictim()) > 40.0f) + { + Talk(EMOTE_PUNCH_GROUND); + me->CastSpell(me->GetVictim(), SPELL_CHARGE, true); + events.ScheduleEvent(EVENT_CHECK_DIST, 5000, EVENT_GROUP_ABILITIES); break; - case EVENT_SPELL_HATEFUL_STRIKE: - if (Unit* target = FindHatefulStrikeTarget()) - me->CastSpell(target, SPELL_HATEFUL_STRIKE, false); - events.ScheduleEvent(EVENT_SPELL_HATEFUL_STRIKE, urand(1500, 3000), EVENT_GROUP_ABILITIES); - break; - case EVENT_SPELL_MOLTEN_FLAMES: - me->CastSpell(me, SPELL_MOLTEN_PUNCH, false); - events.ScheduleEvent(EVENT_SPELL_MOLTEN_FLAMES, 20000, EVENT_GROUP_ABILITIES); - break; - case EVENT_SWITCH_PHASE: - SchedulePhase(!me->HasAura(SPELL_SNARE_SELF)); - break; - case EVENT_SWITCH_TARGET: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - { - DoResetThreat(); - me->AddThreat(target, 5000000.0f); - Talk(EMOTE_NEW_TARGET); - } - events.ScheduleEvent(EVENT_SWITCH_TARGET, 10000, EVENT_GROUP_ABILITIES); - break; - case EVENT_CHECK_DIST: - if (me->GetDistance(me->GetVictim()) > 40.0f) - { - Talk(EMOTE_PUNCH_GROUND); - me->CastSpell(me->GetVictim(), SPELL_CHARGE, true); - events.ScheduleEvent(EVENT_CHECK_DIST, 5000, EVENT_GROUP_ABILITIES); - break; - } - events.ScheduleEvent(EVENT_CHECK_DIST, 1, EVENT_GROUP_ABILITIES); - break; - case EVENT_SPELL_VOLCANIC_ERUPTION: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - { - me->CastSpell(target, SPELL_VOLCANIC_ERUPTION, true); - Talk(EMOTE_GROUND_CRACK); - } - events.ScheduleEvent(EVENT_SPELL_VOLCANIC_ERUPTION, urand(10000, 18000), EVENT_GROUP_ABILITIES); - break; - } + } + events.ScheduleEvent(EVENT_CHECK_DIST, 1, EVENT_GROUP_ABILITIES); + break; + case EVENT_SPELL_VOLCANIC_ERUPTION: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) + { + me->CastSpell(target, SPELL_VOLCANIC_ERUPTION, true); + Talk(EMOTE_GROUND_CRACK); + } + events.ScheduleEvent(EVENT_SPELL_VOLCANIC_ERUPTION, urand(10000, 18000), EVENT_GROUP_ABILITIES); + break; + } - DoMeleeAttackIfReady(); - EnterEvadeIfOutOfCombatArea(); - } - - bool CheckEvadeIfOutOfCombatArea() const - { - return me->GetPositionX() < 565 || me->GetPositionX() > 865 || me->GetPositionY() < 545 || me->GetPositionY() > 1000; - } - }; + DoMeleeAttackIfReady(); + EnterEvadeIfOutOfCombatArea(); + } + + bool CheckEvadeIfOutOfCombatArea() const + { + return me->GetPositionX() < 565 || me->GetPositionX() > 865 || me->GetPositionY() < 545 || me->GetPositionY() > 1000; + } + }; }; void AddSC_boss_supremus() diff --git a/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp b/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp index 0ff126549..481b87fcc 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp @@ -59,268 +59,268 @@ struct ShadowOfDeathSelector : public acore::unary_function class boss_teron_gorefiend : public CreatureScript { - public: - boss_teron_gorefiend() : CreatureScript("boss_teron_gorefiend") { } +public: + boss_teron_gorefiend() : CreatureScript("boss_teron_gorefiend") { } - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } + + struct boss_teron_gorefiendAI : public BossAI + { + boss_teron_gorefiendAI(Creature* creature) : BossAI(creature, DATA_TERON_GOREFIEND) { - return GetInstanceAI(creature); + intro = false; } - struct boss_teron_gorefiendAI : public BossAI + bool intro; + + void Reset() { - boss_teron_gorefiendAI(Creature* creature) : BossAI(creature, DATA_TERON_GOREFIEND) + BossAI::Reset(); + me->CastSpell(me, SPELL_SHADOW_OF_DEATH_REMOVE, true); + } + + void SetData(uint32 type, uint32 id) + { + if (type || !me->IsAlive()) + return; + + if (id == SET_DATA_INTRO && !intro) { - intro = false; + intro = true; + Talk(SAY_INTRO); } + } - bool intro; + void EnterCombat(Unit* who) + { + BossAI::EnterCombat(who); + events.ScheduleEvent(EVENT_SPELL_INCINERATE, 24000); + events.ScheduleEvent(EVENT_SPELL_DOOM_BLOSSOM, 10000); + events.ScheduleEvent(EVENT_SPELL_CRUSHING_SHADOWS, 17000); + events.ScheduleEvent(EVENT_SPELL_SHADOW_OF_DEATH, 20000); + } - void Reset() + void KilledUnit(Unit* /*victim*/) + { + if (events.GetNextEventTime(EVENT_TALK_KILL) == 0) { - BossAI::Reset(); - me->CastSpell(me, SPELL_SHADOW_OF_DEATH_REMOVE, true); + Talk(SAY_SLAY); + events.ScheduleEvent(EVENT_TALK_KILL, 6000); } + } - void SetData(uint32 type, uint32 id) + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + } + + void JustDied(Unit* killer) + { + BossAI::JustDied(killer); + Talk(SAY_DEATH); + me->CastSpell(me, SPELL_SHADOW_OF_DEATH_REMOVE, true); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim() ) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) { - if (type || !me->IsAlive()) - return; - - if (id == SET_DATA_INTRO && !intro) - { - intro = true; - Talk(SAY_INTRO); - } - } - - void EnterCombat(Unit* who) - { - BossAI::EnterCombat(who); - events.ScheduleEvent(EVENT_SPELL_INCINERATE, 24000); - events.ScheduleEvent(EVENT_SPELL_DOOM_BLOSSOM, 10000); - events.ScheduleEvent(EVENT_SPELL_CRUSHING_SHADOWS, 17000); - events.ScheduleEvent(EVENT_SPELL_SHADOW_OF_DEATH, 20000); - } - - void KilledUnit(Unit* /*victim*/) - { - if (events.GetNextEventTime(EVENT_TALK_KILL) == 0) - { - Talk(SAY_SLAY); - events.ScheduleEvent(EVENT_TALK_KILL, 6000); - } - } - - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - } - - void JustDied(Unit* killer) - { - BossAI::JustDied(killer); - Talk(SAY_DEATH); - me->CastSpell(me, SPELL_SHADOW_OF_DEATH_REMOVE, true); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim() ) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_INCINERATE: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - { - if (roll_chance_i(50)) - Talk(SAY_INCINERATE); - me->CastSpell(target, SPELL_INCINERATE, false); - } - events.ScheduleEvent(EVENT_SPELL_INCINERATE, 25000); - break; - case EVENT_SPELL_DOOM_BLOSSOM: + case EVENT_SPELL_INCINERATE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + { if (roll_chance_i(50)) - Talk(SAY_BLOSSOM); + Talk(SAY_INCINERATE); + me->CastSpell(target, SPELL_INCINERATE, false); + } + events.ScheduleEvent(EVENT_SPELL_INCINERATE, 25000); + break; + case EVENT_SPELL_DOOM_BLOSSOM: + if (roll_chance_i(50)) + Talk(SAY_BLOSSOM); - me->CastSpell(me, SPELL_SUMMON_DOOM_BLOSSOM, false); - events.ScheduleEvent(EVENT_SPELL_DOOM_BLOSSOM, 40000); - break; - case EVENT_SPELL_CRUSHING_SHADOWS: - if (roll_chance_i(20)) - Talk(SAY_CRUSHING); - me->CastCustomSpell(SPELL_CRUSHING_SHADOWS, SPELLVALUE_MAX_TARGETS, 5, me, false); - events.ScheduleEvent(EVENT_SPELL_CRUSHING_SHADOWS, 15000); - break; - case EVENT_SPELL_SHADOW_OF_DEATH: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, ShadowOfDeathSelector())) - me->CastSpell(target, SPELL_SHADOW_OF_DEATH, false); - events.ScheduleEvent(EVENT_SPELL_SHADOW_OF_DEATH, 30000); - break; - } + me->CastSpell(me, SPELL_SUMMON_DOOM_BLOSSOM, false); + events.ScheduleEvent(EVENT_SPELL_DOOM_BLOSSOM, 40000); + break; + case EVENT_SPELL_CRUSHING_SHADOWS: + if (roll_chance_i(20)) + Talk(SAY_CRUSHING); + me->CastCustomSpell(SPELL_CRUSHING_SHADOWS, SPELLVALUE_MAX_TARGETS, 5, me, false); + events.ScheduleEvent(EVENT_SPELL_CRUSHING_SHADOWS, 15000); + break; + case EVENT_SPELL_SHADOW_OF_DEATH: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, ShadowOfDeathSelector())) + me->CastSpell(target, SPELL_SHADOW_OF_DEATH, false); + events.ScheduleEvent(EVENT_SPELL_SHADOW_OF_DEATH, 30000); + break; + } - DoMeleeAttackIfReady(); - EnterEvadeIfOutOfCombatArea(); - } - - bool CheckEvadeIfOutOfCombatArea() const - { - return me->GetDistance(me->GetHomePosition()) > 100.0f; - } - }; + DoMeleeAttackIfReady(); + EnterEvadeIfOutOfCombatArea(); + } + + bool CheckEvadeIfOutOfCombatArea() const + { + return me->GetDistance(me->GetHomePosition()) > 100.0f; + } + }; }; class spell_teron_gorefiend_shadow_of_death : public SpellScriptLoader { - public: - spell_teron_gorefiend_shadow_of_death() : SpellScriptLoader("spell_teron_gorefiend_shadow_of_death") { } +public: + spell_teron_gorefiend_shadow_of_death() : SpellScriptLoader("spell_teron_gorefiend_shadow_of_death") { } - class spell_teron_gorefiend_shadow_of_death_AuraScript : public AuraScript + class spell_teron_gorefiend_shadow_of_death_AuraScript : public AuraScript + { + PrepareAuraScript(spell_teron_gorefiend_shadow_of_death_AuraScript) + + void Absorb(AuraEffect* /*aurEff*/, DamageInfo& /*dmgInfo*/, uint32& /*absorbAmount*/) { - PrepareAuraScript(spell_teron_gorefiend_shadow_of_death_AuraScript) - - void Absorb(AuraEffect* /*aurEff*/, DamageInfo & /*dmgInfo*/, uint32 & /*absorbAmount*/) - { - PreventDefaultAction(); - } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - InstanceScript* instance = GetTarget()->GetInstanceScript(); - if (!GetCaster() || !instance || !instance->IsEncounterInProgress()) - return; - - GetTarget()->CastSpell(GetTarget(), SPELL_SUMMON_SPIRIT, true); - GetTarget()->CastSpell(GetTarget(), SPELL_POSSESS_SPIRIT_IMMUNE, true); - GetTarget()->CastSpell(GetTarget(), SPELL_SPIRITUAL_VENGEANCE, true); - GetTarget()->CastSpell(GetTarget(), SPELL_SUMMON_SKELETON1, true); - GetTarget()->CastSpell(GetTarget(), SPELL_SUMMON_SKELETON2, true); - GetTarget()->CastSpell(GetTarget(), SPELL_SUMMON_SKELETON3, true); - GetTarget()->CastSpell(GetTarget(), SPELL_SUMMON_SKELETON4, true); - } - - void Register() - { - OnEffectAbsorb += AuraEffectAbsorbFn(spell_teron_gorefiend_shadow_of_death_AuraScript::Absorb, EFFECT_0); - AfterEffectRemove += AuraEffectRemoveFn(spell_teron_gorefiend_shadow_of_death_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_teron_gorefiend_shadow_of_death_AuraScript(); + PreventDefaultAction(); } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + InstanceScript* instance = GetTarget()->GetInstanceScript(); + if (!GetCaster() || !instance || !instance->IsEncounterInProgress()) + return; + + GetTarget()->CastSpell(GetTarget(), SPELL_SUMMON_SPIRIT, true); + GetTarget()->CastSpell(GetTarget(), SPELL_POSSESS_SPIRIT_IMMUNE, true); + GetTarget()->CastSpell(GetTarget(), SPELL_SPIRITUAL_VENGEANCE, true); + GetTarget()->CastSpell(GetTarget(), SPELL_SUMMON_SKELETON1, true); + GetTarget()->CastSpell(GetTarget(), SPELL_SUMMON_SKELETON2, true); + GetTarget()->CastSpell(GetTarget(), SPELL_SUMMON_SKELETON3, true); + GetTarget()->CastSpell(GetTarget(), SPELL_SUMMON_SKELETON4, true); + } + + void Register() + { + OnEffectAbsorb += AuraEffectAbsorbFn(spell_teron_gorefiend_shadow_of_death_AuraScript::Absorb, EFFECT_0); + AfterEffectRemove += AuraEffectRemoveFn(spell_teron_gorefiend_shadow_of_death_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_teron_gorefiend_shadow_of_death_AuraScript(); + } }; class spell_teron_gorefiend_spirit_lance : public SpellScriptLoader { - public: - spell_teron_gorefiend_spirit_lance() : SpellScriptLoader("spell_teron_gorefiend_spirit_lance") { } +public: + spell_teron_gorefiend_spirit_lance() : SpellScriptLoader("spell_teron_gorefiend_spirit_lance") { } - class spell_teron_gorefiend_spirit_lance_AuraScript : public AuraScript + class spell_teron_gorefiend_spirit_lance_AuraScript : public AuraScript + { + PrepareAuraScript(spell_teron_gorefiend_spirit_lance_AuraScript); + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) { - PrepareAuraScript(spell_teron_gorefiend_spirit_lance_AuraScript); - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - if (AuraEffect* effect = GetAura()->GetEffect(EFFECT_2)) - amount -= (amount / effect->GetTotalTicks()) * effect->GetTickNumber(); - } - - void Update(AuraEffect const* /*effect*/) - { - PreventDefaultAction(); - if (AuraEffect* effect = GetAura()->GetEffect(EFFECT_1)) - effect->RecalculateAmount(); - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_teron_gorefiend_spirit_lance_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_DECREASE_SPEED); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_teron_gorefiend_spirit_lance_AuraScript::Update, EFFECT_2, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_teron_gorefiend_spirit_lance_AuraScript(); + if (AuraEffect* effect = GetAura()->GetEffect(EFFECT_2)) + amount -= (amount / effect->GetTotalTicks()) * effect->GetTickNumber(); } + + void Update(AuraEffect const* /*effect*/) + { + PreventDefaultAction(); + if (AuraEffect* effect = GetAura()->GetEffect(EFFECT_1)) + effect->RecalculateAmount(); + } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_teron_gorefiend_spirit_lance_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_DECREASE_SPEED); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_teron_gorefiend_spirit_lance_AuraScript::Update, EFFECT_2, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_teron_gorefiend_spirit_lance_AuraScript(); + } }; class spell_teron_gorefiend_spiritual_vengeance : public SpellScriptLoader { - public: - spell_teron_gorefiend_spiritual_vengeance() : SpellScriptLoader("spell_teron_gorefiend_spiritual_vengeance") { } +public: + spell_teron_gorefiend_spiritual_vengeance() : SpellScriptLoader("spell_teron_gorefiend_spiritual_vengeance") { } - class spell_teron_gorefiend_spiritual_vengeance_AuraScript : public AuraScript + class spell_teron_gorefiend_spiritual_vengeance_AuraScript : public AuraScript + { + PrepareAuraScript(spell_teron_gorefiend_spiritual_vengeance_AuraScript) + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_teron_gorefiend_spiritual_vengeance_AuraScript) - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit::Kill(nullptr, GetTarget()); - } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_teron_gorefiend_spiritual_vengeance_AuraScript::HandleEffectRemove, EFFECT_2, SPELL_AURA_MOD_PACIFY_SILENCE, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_teron_gorefiend_spiritual_vengeance_AuraScript(); + Unit::Kill(nullptr, GetTarget()); } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_teron_gorefiend_spiritual_vengeance_AuraScript::HandleEffectRemove, EFFECT_2, SPELL_AURA_MOD_PACIFY_SILENCE, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_teron_gorefiend_spiritual_vengeance_AuraScript(); + } }; class spell_teron_gorefiend_shadowy_construct : public SpellScriptLoader { - public: - spell_teron_gorefiend_shadowy_construct() : SpellScriptLoader("spell_teron_gorefiend_shadowy_construct") { } +public: + spell_teron_gorefiend_shadowy_construct() : SpellScriptLoader("spell_teron_gorefiend_shadowy_construct") { } - class spell_teron_gorefiend_shadowy_construct_AuraScript : public AuraScript + class spell_teron_gorefiend_shadowy_construct_AuraScript : public AuraScript + { + PrepareAuraScript(spell_teron_gorefiend_shadowy_construct_AuraScript) + + bool Load() { - PrepareAuraScript(spell_teron_gorefiend_shadowy_construct_AuraScript) - - bool Load() - { - return GetUnitOwner()->GetTypeId() == TYPEID_UNIT; - } - - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NORMAL, true); - GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_ALLOW_ID, SPELL_SPIRIT_LANCE, true); - GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_ALLOW_ID, SPELL_SPIRIT_CHAINS, true); - GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_ALLOW_ID, SPELL_SPIRIT_VOLLEY, true); - - GetUnitOwner()->ToCreature()->SetInCombatWithZone(); - Map::PlayerList const& playerList = GetUnitOwner()->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator i = playerList.begin(); i != playerList.end(); ++i) - if (Player* player = i->GetSource()) - { - if (GetUnitOwner()->IsValidAttackTarget(player)) - GetUnitOwner()->AddThreat(player, 1000000.0f); - } - - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_BRIEF_STUN, true); - } - - void Register() - { - AfterEffectApply += AuraEffectApplyFn(spell_teron_gorefiend_shadowy_construct_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_teron_gorefiend_shadowy_construct_AuraScript(); + return GetUnitOwner()->GetTypeId() == TYPEID_UNIT; } + + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NORMAL, true); + GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_ALLOW_ID, SPELL_SPIRIT_LANCE, true); + GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_ALLOW_ID, SPELL_SPIRIT_CHAINS, true); + GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_ALLOW_ID, SPELL_SPIRIT_VOLLEY, true); + + GetUnitOwner()->ToCreature()->SetInCombatWithZone(); + Map::PlayerList const& playerList = GetUnitOwner()->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator i = playerList.begin(); i != playerList.end(); ++i) + if (Player* player = i->GetSource()) + { + if (GetUnitOwner()->IsValidAttackTarget(player)) + GetUnitOwner()->AddThreat(player, 1000000.0f); + } + + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_BRIEF_STUN, true); + } + + void Register() + { + AfterEffectApply += AuraEffectApplyFn(spell_teron_gorefiend_shadowy_construct_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_teron_gorefiend_shadowy_construct_AuraScript(); + } }; void AddSC_boss_teron_gorefiend() diff --git a/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp b/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp index 66078f4c1..63200750e 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp @@ -130,60 +130,60 @@ public: class spell_najentus_needle_spine : public SpellScriptLoader { - public: - spell_najentus_needle_spine() : SpellScriptLoader("spell_najentus_needle_spine") { } +public: + spell_najentus_needle_spine() : SpellScriptLoader("spell_najentus_needle_spine") { } - class spell_najentus_needle_spine_SpellScript : public SpellScript + class spell_najentus_needle_spine_SpellScript : public SpellScript + { + PrepareSpellScript(spell_najentus_needle_spine_SpellScript); + + void HandleDummy(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_najentus_needle_spine_SpellScript); - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - GetCaster()->CastSpell(target, SPELL_NEEDLE_SPINE_DAMAGE, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_najentus_needle_spine_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_najentus_needle_spine_SpellScript(); + if (Unit* target = GetHitUnit()) + GetCaster()->CastSpell(target, SPELL_NEEDLE_SPINE_DAMAGE, true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_najentus_needle_spine_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_najentus_needle_spine_SpellScript(); + } }; class spell_najentus_hurl_spine : public SpellScriptLoader { - public: - spell_najentus_hurl_spine() : SpellScriptLoader("spell_najentus_hurl_spine") { } +public: + spell_najentus_hurl_spine() : SpellScriptLoader("spell_najentus_hurl_spine") { } - class spell_najentus_hurl_spine_SpellScript : public SpellScript + class spell_najentus_hurl_spine_SpellScript : public SpellScript + { + PrepareSpellScript(spell_najentus_hurl_spine_SpellScript); + + void HandleSchoolDamage(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_najentus_hurl_spine_SpellScript); - - void HandleSchoolDamage(SpellEffIndex /*effIndex*/) + Unit* target = GetHitUnit(); + if (target && target->HasAura(SPELL_TIDAL_SHIELD)) { - Unit* target = GetHitUnit(); - if (target && target->HasAura(SPELL_TIDAL_SHIELD)) - { - target->RemoveAurasDueToSpell(SPELL_TIDAL_SHIELD); - target->CastSpell(target, SPELL_TIDAL_BURST, true); - } + target->RemoveAurasDueToSpell(SPELL_TIDAL_SHIELD); + target->CastSpell(target, SPELL_TIDAL_BURST, true); } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_najentus_hurl_spine_SpellScript::HandleSchoolDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_najentus_hurl_spine_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_najentus_hurl_spine_SpellScript::HandleSchoolDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_najentus_hurl_spine_SpellScript(); + } }; void AddSC_boss_najentus() diff --git a/src/server/scripts/Outland/BlackTemple/illidari_council.cpp b/src/server/scripts/Outland/BlackTemple/illidari_council.cpp index c225f670d..0c9e291e9 100644 --- a/src/server/scripts/Outland/BlackTemple/illidari_council.cpp +++ b/src/server/scripts/Outland/BlackTemple/illidari_council.cpp @@ -99,24 +99,24 @@ struct HammerOfJusticeSelector : public acore::unary_function class VerasEnvenom : public BasicEvent { - public: - VerasEnvenom(Unit& owner, uint64 targetGUID) : _owner(owner), _targetGUID(targetGUID) { } +public: + VerasEnvenom(Unit& owner, uint64 targetGUID) : _owner(owner), _targetGUID(targetGUID) { } - bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/) + bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/) + { + if (Player* target = ObjectAccessor::GetPlayer(_owner, _targetGUID)) { - if (Player* target = ObjectAccessor::GetPlayer(_owner, _targetGUID)) - { - target->m_clientGUIDs.insert(_owner.GetGUID()); - _owner.CastSpell(target, SPELL_ENVENOM, true); - target->RemoveAurasDueToSpell(SPELL_DEADLY_POISON); - target->m_clientGUIDs.erase(_owner.GetGUID()); - } - return true; + target->m_clientGUIDs.insert(_owner.GetGUID()); + _owner.CastSpell(target, SPELL_ENVENOM, true); + target->RemoveAurasDueToSpell(SPELL_DEADLY_POISON); + target->m_clientGUIDs.erase(_owner.GetGUID()); } + return true; + } - private: - Unit& _owner; - uint64 _targetGUID; +private: + Unit& _owner; + uint64 _targetGUID; }; class boss_illidari_council : public CreatureScript @@ -265,477 +265,477 @@ struct boss_illidari_council_memberAI : public ScriptedAI class boss_gathios_the_shatterer : public CreatureScript { - public: - boss_gathios_the_shatterer() : CreatureScript("boss_gathios_the_shatterer") { } +public: + boss_gathios_the_shatterer() : CreatureScript("boss_gathios_the_shatterer") { } - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } + + struct boss_gathios_the_shattererAI : public boss_illidari_council_memberAI + { + boss_gathios_the_shattererAI(Creature* creature) : boss_illidari_council_memberAI(creature) { } + + Creature* SelectCouncilMember() { - return GetInstanceAI(creature); + if (roll_chance_i(50)) + return ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_LADY_MALANDE)); + + if (roll_chance_i(20)) + if (Creature* veras = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_VERAS_DARKSHADOW))) + if (!veras->HasAura(SPELL_VANISH)) + return veras; + + return ObjectAccessor::GetCreature(*me, instance->GetData64(RAND(NPC_GATHIOS_THE_SHATTERER, NPC_HIGH_NETHERMANCER_ZEREVOR))); } - struct boss_gathios_the_shattererAI : public boss_illidari_council_memberAI + void EnterCombat(Unit* who) { - boss_gathios_the_shattererAI(Creature* creature) : boss_illidari_council_memberAI(creature) { } + boss_illidari_council_memberAI::EnterCombat(who); + events.ScheduleEvent(EVENT_SPELL_BLESSING, 10000); + events.ScheduleEvent(EVENT_SPELL_AURA, 0); + events.ScheduleEvent(EVENT_SPELL_SEAL, 2000); + events.ScheduleEvent(EVENT_SPELL_HAMMER_OF_JUSTICE, 6000); + events.ScheduleEvent(EVENT_SPELL_JUDGEMENT, 8000); + events.ScheduleEvent(EVENT_SPELL_CONSECRATION, 4000); + } - Creature* SelectCouncilMember() + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) { - if (roll_chance_i(50)) - return ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_LADY_MALANDE)); - - if (roll_chance_i(20)) - if (Creature* veras = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_VERAS_DARKSHADOW))) - if (!veras->HasAura(SPELL_VANISH)) - return veras; - - return ObjectAccessor::GetCreature(*me, instance->GetData64(RAND(NPC_GATHIOS_THE_SHATTERER, NPC_HIGH_NETHERMANCER_ZEREVOR))); + case EVENT_SPELL_BLESSING: + if (Unit* member = SelectCouncilMember()) + me->CastSpell(member, RAND(SPELL_BLESSING_OF_SPELL_WARDING, SPELL_BLESSING_OF_PROTECTION), false); + events.ScheduleEvent(EVENT_SPELL_BLESSING, 15000); + break; + case EVENT_SPELL_AURA: + me->CastSpell(me, RAND(SPELL_DEVOTION_AURA, SPELL_CHROMATIC_RESISTANCE_AURA), false); + events.ScheduleEvent(EVENT_SPELL_AURA, 60000); + break; + case EVENT_SPELL_CONSECRATION: + if (roll_chance_i(50)) + Talk(SAY_COUNCIL_SPECIAL); + me->CastSpell(me, SPELL_CONSECRATION, false); + events.ScheduleEvent(EVENT_SPELL_AURA, 30000); + break; + case EVENT_SPELL_HAMMER_OF_JUSTICE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, HammerOfJusticeSelector(me))) + { + me->CastSpell(target, SPELL_HAMMER_OF_JUSTICE, false); + events.ScheduleEvent(EVENT_SPELL_HAMMER_OF_JUSTICE, 20000); + break; + } + events.ScheduleEvent(EVENT_SPELL_HAMMER_OF_JUSTICE, 0); + break; + case EVENT_SPELL_SEAL: + me->CastSpell(me, RAND(SPELL_SEAL_OF_COMMAND, SPELL_SEAL_OF_BLOOD), false); + events.ScheduleEvent(EVENT_SPELL_SEAL, 20000); + break; + case EVENT_SPELL_JUDGEMENT: + me->CastSpell(me->GetVictim(), SPELL_JUDGEMENT, false); + events.ScheduleEvent(EVENT_SPELL_JUDGEMENT, 20000); + break; } - void EnterCombat(Unit* who) - { - boss_illidari_council_memberAI::EnterCombat(who); - events.ScheduleEvent(EVENT_SPELL_BLESSING, 10000); - events.ScheduleEvent(EVENT_SPELL_AURA, 0); - events.ScheduleEvent(EVENT_SPELL_SEAL, 2000); - events.ScheduleEvent(EVENT_SPELL_HAMMER_OF_JUSTICE, 6000); - events.ScheduleEvent(EVENT_SPELL_JUDGEMENT, 8000); - events.ScheduleEvent(EVENT_SPELL_CONSECRATION, 4000); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_BLESSING: - if (Unit* member = SelectCouncilMember()) - me->CastSpell(member, RAND(SPELL_BLESSING_OF_SPELL_WARDING, SPELL_BLESSING_OF_PROTECTION), false); - events.ScheduleEvent(EVENT_SPELL_BLESSING, 15000); - break; - case EVENT_SPELL_AURA: - me->CastSpell(me, RAND(SPELL_DEVOTION_AURA, SPELL_CHROMATIC_RESISTANCE_AURA), false); - events.ScheduleEvent(EVENT_SPELL_AURA, 60000); - break; - case EVENT_SPELL_CONSECRATION: - if (roll_chance_i(50)) - Talk(SAY_COUNCIL_SPECIAL); - me->CastSpell(me, SPELL_CONSECRATION, false); - events.ScheduleEvent(EVENT_SPELL_AURA, 30000); - break; - case EVENT_SPELL_HAMMER_OF_JUSTICE: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, HammerOfJusticeSelector(me))) - { - me->CastSpell(target, SPELL_HAMMER_OF_JUSTICE, false); - events.ScheduleEvent(EVENT_SPELL_HAMMER_OF_JUSTICE, 20000); - break; - } - events.ScheduleEvent(EVENT_SPELL_HAMMER_OF_JUSTICE, 0); - break; - case EVENT_SPELL_SEAL: - me->CastSpell(me, RAND(SPELL_SEAL_OF_COMMAND, SPELL_SEAL_OF_BLOOD), false); - events.ScheduleEvent(EVENT_SPELL_SEAL, 20000); - break; - case EVENT_SPELL_JUDGEMENT: - me->CastSpell(me->GetVictim(), SPELL_JUDGEMENT, false); - events.ScheduleEvent(EVENT_SPELL_JUDGEMENT, 20000); - break; - } - - DoMeleeAttackIfReady(); - } - }; + DoMeleeAttackIfReady(); + } + }; }; class boss_high_nethermancer_zerevor : public CreatureScript { - public: - boss_high_nethermancer_zerevor() : CreatureScript("boss_high_nethermancer_zerevor") { } +public: + boss_high_nethermancer_zerevor() : CreatureScript("boss_high_nethermancer_zerevor") { } - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } + + struct boss_high_nethermancer_zerevorAI : public boss_illidari_council_memberAI + { + boss_high_nethermancer_zerevorAI(Creature* creature) : boss_illidari_council_memberAI(creature) { } + + void AttackStart(Unit* who) { - return GetInstanceAI(creature); + if (who && me->Attack(who, true)) + me->GetMotionMaster()->MoveChase(who, 20.0f); } - struct boss_high_nethermancer_zerevorAI : public boss_illidari_council_memberAI + void EnterCombat(Unit* who) { - boss_high_nethermancer_zerevorAI(Creature* creature) : boss_illidari_council_memberAI(creature) { } + boss_illidari_council_memberAI::EnterCombat(who); + events.ScheduleEvent(EVENT_SPELL_FLAMESTRIKE, 25000); + events.ScheduleEvent(EVENT_SPELL_BLIZZARD, 5000); + events.ScheduleEvent(EVENT_SPELL_ARCANE_BOLT, 15000); + events.ScheduleEvent(EVENT_SPELL_DAMPEN_MAGIC, 0); + events.ScheduleEvent(EVENT_SPELL_ARCANE_EXPLOSION, 10000); + } - void AttackStart(Unit* who) + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) { - if (who && me->Attack(who, true)) - me->GetMotionMaster()->MoveChase(who, 20.0f); + case EVENT_SPELL_DAMPEN_MAGIC: + me->CastSpell(me, SPELL_DAMPEN_MAGIC, false); + events.ScheduleEvent(EVENT_SPELL_DAMPEN_MAGIC, 120000); + break; + case EVENT_SPELL_ARCANE_BOLT: + me->CastSpell(me->GetVictim(), SPELL_ARCANE_BOLT, false); + events.ScheduleEvent(EVENT_SPELL_ARCANE_BOLT, 3000); + break; + case EVENT_SPELL_FLAMESTRIKE: + if (roll_chance_i(50)) + Talk(SAY_COUNCIL_SPECIAL); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f)) + me->CastSpell(target, SPELL_FLAMESTRIKE, false); + events.ScheduleEvent(EVENT_SPELL_FLAMESTRIKE, 40000); + break; + case EVENT_SPELL_BLIZZARD: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f)) + me->CastSpell(target, SPELL_BLIZZARD, false); + events.ScheduleEvent(EVENT_SPELL_BLIZZARD, 40000); + break; + case EVENT_SPELL_ARCANE_EXPLOSION: + if (SelectTarget(SELECT_TARGET_RANDOM, 0, 10.0f)) + me->CastSpell(me, SPELL_ARCANE_EXPLOSION, false); + events.ScheduleEvent(EVENT_SPELL_ARCANE_EXPLOSION, 10000); + break; } - void EnterCombat(Unit* who) - { - boss_illidari_council_memberAI::EnterCombat(who); - events.ScheduleEvent(EVENT_SPELL_FLAMESTRIKE, 25000); - events.ScheduleEvent(EVENT_SPELL_BLIZZARD, 5000); - events.ScheduleEvent(EVENT_SPELL_ARCANE_BOLT, 15000); - events.ScheduleEvent(EVENT_SPELL_DAMPEN_MAGIC, 0); - events.ScheduleEvent(EVENT_SPELL_ARCANE_EXPLOSION, 10000); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_DAMPEN_MAGIC: - me->CastSpell(me, SPELL_DAMPEN_MAGIC, false); - events.ScheduleEvent(EVENT_SPELL_DAMPEN_MAGIC, 120000); - break; - case EVENT_SPELL_ARCANE_BOLT: - me->CastSpell(me->GetVictim(), SPELL_ARCANE_BOLT, false); - events.ScheduleEvent(EVENT_SPELL_ARCANE_BOLT, 3000); - break; - case EVENT_SPELL_FLAMESTRIKE: - if (roll_chance_i(50)) - Talk(SAY_COUNCIL_SPECIAL); - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f)) - me->CastSpell(target, SPELL_FLAMESTRIKE, false); - events.ScheduleEvent(EVENT_SPELL_FLAMESTRIKE, 40000); - break; - case EVENT_SPELL_BLIZZARD: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f)) - me->CastSpell(target, SPELL_BLIZZARD, false); - events.ScheduleEvent(EVENT_SPELL_BLIZZARD, 40000); - break; - case EVENT_SPELL_ARCANE_EXPLOSION: - if (SelectTarget(SELECT_TARGET_RANDOM, 0, 10.0f)) - me->CastSpell(me, SPELL_ARCANE_EXPLOSION, false); - events.ScheduleEvent(EVENT_SPELL_ARCANE_EXPLOSION, 10000); - break; - } - - DoMeleeAttackIfReady(); - } - }; + DoMeleeAttackIfReady(); + } + }; }; class boss_lady_malande : public CreatureScript { - public: - boss_lady_malande() : CreatureScript("boss_lady_malande") { } +public: + boss_lady_malande() : CreatureScript("boss_lady_malande") { } - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } + + struct boss_lady_malandeAI : public boss_illidari_council_memberAI + { + boss_lady_malandeAI(Creature* creature) : boss_illidari_council_memberAI(creature) { } + + void AttackStart(Unit* who) { - return GetInstanceAI(creature); + if (who && me->Attack(who, true)) + me->GetMotionMaster()->MoveChase(who, 20.0f); } - struct boss_lady_malandeAI : public boss_illidari_council_memberAI + void EnterCombat(Unit* who) { - boss_lady_malandeAI(Creature* creature) : boss_illidari_council_memberAI(creature) { } + boss_illidari_council_memberAI::EnterCombat(who); + events.ScheduleEvent(EVENT_SPELL_REFLECTIVE_SHIELD, 10000); + events.ScheduleEvent(EVENT_SPELL_CIRCLE_OF_HEALING, 20000); + events.ScheduleEvent(EVENT_SPELL_DIVINE_WRATH, 5000); + events.ScheduleEvent(EVENT_SPELL_EMPOWERED_SMITE, 15000); + } - void AttackStart(Unit* who) + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) { - if (who && me->Attack(who, true)) - me->GetMotionMaster()->MoveChase(who, 20.0f); + case EVENT_SPELL_CIRCLE_OF_HEALING: + me->CastSpell(me, SPELL_CIRCLE_OF_HEALING, false); + events.ScheduleEvent(EVENT_SPELL_CIRCLE_OF_HEALING, 20000); + break; + case EVENT_SPELL_REFLECTIVE_SHIELD: + if (roll_chance_i(50)) + Talk(SAY_COUNCIL_SPECIAL); + me->CastSpell(me, SPELL_REFLECTIVE_SHIELD, false); + events.ScheduleEvent(EVENT_SPELL_REFLECTIVE_SHIELD, 40000); + break; + case EVENT_SPELL_DIVINE_WRATH: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f)) + me->CastSpell(target, SPELL_DIVINE_WRATH, false); + events.ScheduleEvent(EVENT_SPELL_DIVINE_WRATH, 20000); + break; + case EVENT_SPELL_EMPOWERED_SMITE: + me->CastSpell(me->GetVictim(), SPELL_EMPOWERED_SMITE, false); + events.ScheduleEvent(EVENT_SPELL_EMPOWERED_SMITE, 3000); + break; } - - void EnterCombat(Unit* who) - { - boss_illidari_council_memberAI::EnterCombat(who); - events.ScheduleEvent(EVENT_SPELL_REFLECTIVE_SHIELD, 10000); - events.ScheduleEvent(EVENT_SPELL_CIRCLE_OF_HEALING, 20000); - events.ScheduleEvent(EVENT_SPELL_DIVINE_WRATH, 5000); - events.ScheduleEvent(EVENT_SPELL_EMPOWERED_SMITE, 15000); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_CIRCLE_OF_HEALING: - me->CastSpell(me, SPELL_CIRCLE_OF_HEALING, false); - events.ScheduleEvent(EVENT_SPELL_CIRCLE_OF_HEALING, 20000); - break; - case EVENT_SPELL_REFLECTIVE_SHIELD: - if (roll_chance_i(50)) - Talk(SAY_COUNCIL_SPECIAL); - me->CastSpell(me, SPELL_REFLECTIVE_SHIELD, false); - events.ScheduleEvent(EVENT_SPELL_REFLECTIVE_SHIELD, 40000); - break; - case EVENT_SPELL_DIVINE_WRATH: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f)) - me->CastSpell(target, SPELL_DIVINE_WRATH, false); - events.ScheduleEvent(EVENT_SPELL_DIVINE_WRATH, 20000); - break; - case EVENT_SPELL_EMPOWERED_SMITE: - me->CastSpell(me->GetVictim(), SPELL_EMPOWERED_SMITE, false); - events.ScheduleEvent(EVENT_SPELL_EMPOWERED_SMITE, 3000); - break; - } - } - }; + } + }; }; class boss_veras_darkshadow : public CreatureScript { - public: - boss_veras_darkshadow() : CreatureScript("boss_veras_darkshadow") { } +public: + boss_veras_darkshadow() : CreatureScript("boss_veras_darkshadow") { } - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } + + struct boss_veras_darkshadowAI : public boss_illidari_council_memberAI + { + boss_veras_darkshadowAI(Creature* creature) : boss_illidari_council_memberAI(creature) { } + + void EnterCombat(Unit* who) { - return GetInstanceAI(creature); + me->SetCanDualWield(true); + boss_illidari_council_memberAI::EnterCombat(who); + events.ScheduleEvent(EVENT_SPELL_VANISH, 10000); + events.ScheduleEvent(EVENT_SPELL_ENRAGE, 900000); } - struct boss_veras_darkshadowAI : public boss_illidari_council_memberAI + void JustSummoned(Creature* summon) { - boss_veras_darkshadowAI(Creature* creature) : boss_illidari_council_memberAI(creature) { } + summon->CastSpell(summon, SPELL_VANISH_VISUAL, true); + } - void EnterCombat(Unit* who) + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) { - me->SetCanDualWield(true); - boss_illidari_council_memberAI::EnterCombat(who); - events.ScheduleEvent(EVENT_SPELL_VANISH, 10000); - events.ScheduleEvent(EVENT_SPELL_ENRAGE, 900000); + case EVENT_SPELL_VANISH: + if (roll_chance_i(50)) + Talk(SAY_COUNCIL_SPECIAL); + me->CastSpell(me, SPELL_DEADLY_STRIKE, false); + me->CastSpell(me, SPELL_VANISH, false); + events.ScheduleEvent(EVENT_SPELL_VANISH, 60000); + events.ScheduleEvent(EVENT_SPELL_VANISH_OUT, 29000); + break; + case EVENT_SPELL_VANISH_OUT: + me->CastSpell(me, SPELL_VANISH_OUT, false); + break; + case EVENT_SPELL_ENRAGE: + DoResetThreat(); + if (Creature* council = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_ILLIDARI_COUNCIL))) + council->GetAI()->DoAction(ACTION_ENRAGE); + break; } - void JustSummoned(Creature* summon) - { - summon->CastSpell(summon, SPELL_VANISH_VISUAL, true); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_VANISH: - if (roll_chance_i(50)) - Talk(SAY_COUNCIL_SPECIAL); - me->CastSpell(me, SPELL_DEADLY_STRIKE, false); - me->CastSpell(me, SPELL_VANISH, false); - events.ScheduleEvent(EVENT_SPELL_VANISH, 60000); - events.ScheduleEvent(EVENT_SPELL_VANISH_OUT, 29000); - break; - case EVENT_SPELL_VANISH_OUT: - me->CastSpell(me, SPELL_VANISH_OUT, false); - break; - case EVENT_SPELL_ENRAGE: - DoResetThreat(); - if (Creature* council = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_ILLIDARI_COUNCIL))) - council->GetAI()->DoAction(ACTION_ENRAGE); - break; - } - - if (events.GetNextEventTime(EVENT_SPELL_VANISH_OUT) == 0) - DoMeleeAttackIfReady(); - } - }; + if (events.GetNextEventTime(EVENT_SPELL_VANISH_OUT) == 0) + DoMeleeAttackIfReady(); + } + }; }; class spell_illidari_council_balance_of_power : public SpellScriptLoader { - public: - spell_illidari_council_balance_of_power() : SpellScriptLoader("spell_illidari_council_balance_of_power") { } +public: + spell_illidari_council_balance_of_power() : SpellScriptLoader("spell_illidari_council_balance_of_power") { } - class spell_illidari_council_balance_of_power_AuraScript : public AuraScript + class spell_illidari_council_balance_of_power_AuraScript : public AuraScript + { + PrepareAuraScript(spell_illidari_council_balance_of_power_AuraScript); + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) { - PrepareAuraScript(spell_illidari_council_balance_of_power_AuraScript); - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - // Set absorbtion amount to unlimited (no absorb) - amount = -1; - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_illidari_council_balance_of_power_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_illidari_council_balance_of_power_AuraScript(); + // Set absorbtion amount to unlimited (no absorb) + amount = -1; } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_illidari_council_balance_of_power_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_illidari_council_balance_of_power_AuraScript(); + } }; class spell_illidari_council_empyreal_balance : public SpellScriptLoader { - public: - spell_illidari_council_empyreal_balance() : SpellScriptLoader("spell_illidari_council_empyreal_balance") { } +public: + spell_illidari_council_empyreal_balance() : SpellScriptLoader("spell_illidari_council_empyreal_balance") { } - class spell_illidari_council_empyreal_balance_SpellScript : public SpellScript + class spell_illidari_council_empyreal_balance_SpellScript : public SpellScript + { + PrepareSpellScript(spell_illidari_council_empyreal_balance_SpellScript); + + bool Load() { - PrepareSpellScript(spell_illidari_council_empyreal_balance_SpellScript); - - bool Load() - { - _sharedHealth = 0; - _sharedHealthMax = 0; - _targetCount = 0; - return GetCaster()->GetTypeId() == TYPEID_UNIT; - } - - void HandleDummy(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - { - _targetCount++; - _sharedHealth += target->GetHealth(); - _sharedHealthMax += target->GetMaxHealth(); - } - } - - void HandleAfterCast() - { - if (_targetCount != 4) - { - GetCaster()->ToCreature()->AI()->EnterEvadeMode(); - return; - } - - float pct = (_sharedHealth / _sharedHealthMax) * 100.0f; - std::list const* targetsInfo = GetSpell()->GetUniqueTargetInfo(); - for (std::list::const_iterator ihit = targetsInfo->begin(); ihit != targetsInfo->end(); ++ihit) - if (Creature* target = ObjectAccessor::GetCreature(*GetCaster(), ihit->targetGUID)) - { - target->LowerPlayerDamageReq(target->GetMaxHealth()); - target->SetHealth(CalculatePct(target->GetMaxHealth(), pct)); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_illidari_council_empyreal_balance_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - AfterCast += SpellCastFn(spell_illidari_council_empyreal_balance_SpellScript::HandleAfterCast); - } - - private: - float _sharedHealth; - float _sharedHealthMax; - uint8 _targetCount; - }; - - SpellScript* GetSpellScript() const - { - return new spell_illidari_council_empyreal_balance_SpellScript(); + _sharedHealth = 0; + _sharedHealthMax = 0; + _targetCount = 0; + return GetCaster()->GetTypeId() == TYPEID_UNIT; } + + void HandleDummy(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) + { + _targetCount++; + _sharedHealth += target->GetHealth(); + _sharedHealthMax += target->GetMaxHealth(); + } + } + + void HandleAfterCast() + { + if (_targetCount != 4) + { + GetCaster()->ToCreature()->AI()->EnterEvadeMode(); + return; + } + + float pct = (_sharedHealth / _sharedHealthMax) * 100.0f; + std::list const* targetsInfo = GetSpell()->GetUniqueTargetInfo(); + for (std::list::const_iterator ihit = targetsInfo->begin(); ihit != targetsInfo->end(); ++ihit) + if (Creature* target = ObjectAccessor::GetCreature(*GetCaster(), ihit->targetGUID)) + { + target->LowerPlayerDamageReq(target->GetMaxHealth()); + target->SetHealth(CalculatePct(target->GetMaxHealth(), pct)); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_illidari_council_empyreal_balance_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + AfterCast += SpellCastFn(spell_illidari_council_empyreal_balance_SpellScript::HandleAfterCast); + } + + private: + float _sharedHealth; + float _sharedHealthMax; + uint8 _targetCount; + }; + + SpellScript* GetSpellScript() const + { + return new spell_illidari_council_empyreal_balance_SpellScript(); + } }; class spell_illidari_council_reflective_shield : public SpellScriptLoader { - public: - spell_illidari_council_reflective_shield() : SpellScriptLoader("spell_illidari_council_reflective_shield") { } +public: + spell_illidari_council_reflective_shield() : SpellScriptLoader("spell_illidari_council_reflective_shield") { } - class spell_illidari_council_reflective_shield_AuraScript : public AuraScript + class spell_illidari_council_reflective_shield_AuraScript : public AuraScript + { + PrepareAuraScript(spell_illidari_council_reflective_shield_AuraScript); + + void ReflectDamage(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount) { - PrepareAuraScript(spell_illidari_council_reflective_shield_AuraScript); + Unit* target = GetTarget(); + if (dmgInfo.GetAttacker() == target) + return; - void ReflectDamage(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount) - { - Unit* target = GetTarget(); - if (dmgInfo.GetAttacker() == target) - return; - - int32 bp = absorbAmount / 2; - target->CastCustomSpell(dmgInfo.GetAttacker(), SPELL_REFLECTIVE_SHIELD_T, &bp, nullptr, nullptr, true, NULL, aurEff); - } - - void Register() - { - AfterEffectAbsorb += AuraEffectAbsorbFn(spell_illidari_council_reflective_shield_AuraScript::ReflectDamage, EFFECT_0); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_illidari_council_reflective_shield_AuraScript(); + int32 bp = absorbAmount / 2; + target->CastCustomSpell(dmgInfo.GetAttacker(), SPELL_REFLECTIVE_SHIELD_T, &bp, nullptr, nullptr, true, NULL, aurEff); } + + void Register() + { + AfterEffectAbsorb += AuraEffectAbsorbFn(spell_illidari_council_reflective_shield_AuraScript::ReflectDamage, EFFECT_0); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_illidari_council_reflective_shield_AuraScript(); + } }; class spell_illidari_council_judgement : public SpellScriptLoader { - public: - spell_illidari_council_judgement() : SpellScriptLoader("spell_illidari_council_judgement") { } +public: + spell_illidari_council_judgement() : SpellScriptLoader("spell_illidari_council_judgement") { } - class spell_illidari_council_judgement_SpellScript : public SpellScript + class spell_illidari_council_judgement_SpellScript : public SpellScript + { + PrepareSpellScript(spell_illidari_council_judgement_SpellScript); + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_illidari_council_judgement_SpellScript); - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) + Unit::AuraEffectList const& auras = GetCaster()->GetAuraEffectsByType(SPELL_AURA_DUMMY); + for (Unit::AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i) { - Unit::AuraEffectList const& auras = GetCaster()->GetAuraEffectsByType(SPELL_AURA_DUMMY); - for (Unit::AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i) - { - if ((*i)->GetSpellInfo()->GetSpellSpecific() == SPELL_SPECIFIC_SEAL && (*i)->GetEffIndex() == EFFECT_2) - if (sSpellMgr->GetSpellInfo((*i)->GetAmount())) - { - GetCaster()->CastSpell(GetHitUnit(), (*i)->GetAmount(), true); - break; - } - } + if ((*i)->GetSpellInfo()->GetSpellSpecific() == SPELL_SPECIFIC_SEAL && (*i)->GetEffIndex() == EFFECT_2) + if (sSpellMgr->GetSpellInfo((*i)->GetAmount())) + { + GetCaster()->CastSpell(GetHitUnit(), (*i)->GetAmount(), true); + break; + } } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_illidari_council_judgement_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_illidari_council_judgement_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_illidari_council_judgement_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_illidari_council_judgement_SpellScript(); + } }; class spell_illidari_council_deadly_strike : public SpellScriptLoader { - public: - spell_illidari_council_deadly_strike() : SpellScriptLoader("spell_illidari_council_deadly_strike") { } +public: + spell_illidari_council_deadly_strike() : SpellScriptLoader("spell_illidari_council_deadly_strike") { } - class spell_illidari_council_deadly_strike_AuraScript : public AuraScript + class spell_illidari_council_deadly_strike_AuraScript : public AuraScript + { + PrepareAuraScript(spell_illidari_council_deadly_strike_AuraScript); + + void Update(AuraEffect const* effect) { - PrepareAuraScript(spell_illidari_council_deadly_strike_AuraScript); - - void Update(AuraEffect const* effect) - { - PreventDefaultAction(); - if (Unit* target = GetUnitOwner()->GetAI()->SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) - { - GetUnitOwner()->CastSpell(target, GetSpellInfo()->Effects[effect->GetEffIndex()].TriggerSpell, true); - GetUnitOwner()->m_Events.AddEvent(new VerasEnvenom(*GetUnitOwner(), target->GetGUID()), GetUnitOwner()->m_Events.CalculateTime(urand(1500, 3500))); - } - } - - void Register() + PreventDefaultAction(); + if (Unit* target = GetUnitOwner()->GetAI()->SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_illidari_council_deadly_strike_AuraScript::Update, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + GetUnitOwner()->CastSpell(target, GetSpellInfo()->Effects[effect->GetEffIndex()].TriggerSpell, true); + GetUnitOwner()->m_Events.AddEvent(new VerasEnvenom(*GetUnitOwner(), target->GetGUID()), GetUnitOwner()->m_Events.CalculateTime(urand(1500, 3500))); } - }; - - AuraScript* GetAuraScript() const - { - return new spell_illidari_council_deadly_strike_AuraScript(); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_illidari_council_deadly_strike_AuraScript::Update, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_illidari_council_deadly_strike_AuraScript(); + } }; void AddSC_boss_illidari_council() diff --git a/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp b/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp index c2e899104..7b802ccff 100644 --- a/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp +++ b/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp @@ -29,640 +29,640 @@ DoorData const doorData[] = class instance_black_temple : public InstanceMapScript { - public: - instance_black_temple() : InstanceMapScript("instance_black_temple", 564) { } +public: + instance_black_temple() : InstanceMapScript("instance_black_temple", 564) { } - struct instance_black_temple_InstanceMapScript : public InstanceScript + struct instance_black_temple_InstanceMapScript : public InstanceScript + { + instance_black_temple_InstanceMapScript(Map* map) : InstanceScript(map) { - instance_black_temple_InstanceMapScript(Map* map) : InstanceScript(map) - { - SetBossNumber(MAX_ENCOUNTERS); - LoadDoorData(doorData); + SetBossNumber(MAX_ENCOUNTERS); + LoadDoorData(doorData); - ShadeOfAkamaGUID = 0; - AkamaShadeGUID = 0; - TeronGorefiendGUID = 0; - ReliquaryGUID = 0; - ashtongueGUIDs.clear(); - GathiosTheShattererGUID = 0; - HighNethermancerZerevorGUID = 0; - LadyMalandeGUID = 0; - VerasDarkshadowGUID = 0; - IllidariCouncilGUID = 0; - AkamaGUID = 0; - IllidanStormrageGUID = 0; - } - - void OnCreatureCreate(Creature* creature) - { - switch (creature->GetEntry()) - { - case NPC_SHADE_OF_AKAMA: - ShadeOfAkamaGUID = creature->GetGUID(); - break; - case NPC_AKAMA_SHADE: - AkamaShadeGUID = creature->GetGUID(); - break; - case NPC_TERON_GOREFIEND: - TeronGorefiendGUID = creature->GetGUID(); - break; - case NPC_RELIQUARY_OF_THE_LOST: - ReliquaryGUID = creature->GetGUID(); - break; - case NPC_GATHIOS_THE_SHATTERER: - GathiosTheShattererGUID = creature->GetGUID(); - break; - case NPC_HIGH_NETHERMANCER_ZEREVOR: - HighNethermancerZerevorGUID = creature->GetGUID(); - break; - case NPC_LADY_MALANDE: - LadyMalandeGUID = creature->GetGUID(); - break; - case NPC_VERAS_DARKSHADOW: - VerasDarkshadowGUID = creature->GetGUID(); - break; - case NPC_ILLIDARI_COUNCIL: - IllidariCouncilGUID = creature->GetGUID(); - break; - case NPC_AKAMA: - AkamaGUID = creature->GetGUID(); - break; - case NPC_ILLIDAN_STORMRAGE: - IllidanStormrageGUID = creature->GetGUID(); - break; - case NPC_VENGEFUL_SPIRIT: - case NPC_SHADOWY_CONSTRUCT: - if (Creature* teron = instance->GetCreature(TeronGorefiendGUID)) - teron->AI()->JustSummoned(creature); - break; - case NPC_ENSLAVED_SOUL: - if (Creature* reliquary = instance->GetCreature(ReliquaryGUID)) - reliquary->AI()->JustSummoned(creature); - break; - case NPC_PARASITIC_SHADOWFIEND: - case NPC_BLADE_OF_AZZINOTH: - case NPC_FLAME_OF_AZZINOTH: - if (Creature* illidan = instance->GetCreature(IllidanStormrageGUID)) - illidan->AI()->JustSummoned(creature); - break; - case NPC_ANGERED_SOUL_FRAGMENT: - case NPC_HUNGERING_SOUL_FRAGMENT: - case NPC_SUFFERING_SOUL_FRAGMENT: - creature->SetCorpseDelay(5); - break; - } - - if (creature->GetName().find("Ashtongue") != std::string::npos || creature->GetEntry() == NPC_STORM_FURY) - { - ashtongueGUIDs.push_back(creature->GetGUID()); - if (GetBossState(DATA_SHADE_OF_AKAMA) == DONE) - creature->setFaction(FACTION_ASHTONGUE); - } - } - - void OnGameObjectCreate(GameObject* go) - { - switch (go->GetEntry()) - { - case GO_NAJENTUS_GATE: - case GO_SUPREMUS_GATE: - case GO_SHADE_OF_AKAMA_DOOR: - case GO_TERON_DOOR_1: - case GO_TERON_DOOR_2: - case GO_GURTOGG_DOOR: - case GO_TEMPLE_DOOR: - case GO_MOTHER_SHAHRAZ_DOOR: - case GO_COUNCIL_DOOR_1: - case GO_COUNCIL_DOOR_2: - case GO_ILLIDAN_GATE: - case GO_ILLIDAN_DOOR_R: - case GO_ILLIDAN_DOOR_L: - AddDoor(go, true); - break; - } - } - - void OnGameObjectRemove(GameObject* go) - { - switch (go->GetEntry()) - { - case GO_NAJENTUS_GATE: - case GO_SUPREMUS_GATE: - case GO_SHADE_OF_AKAMA_DOOR: - case GO_TERON_DOOR_1: - case GO_TERON_DOOR_2: - case GO_GURTOGG_DOOR: - case GO_TEMPLE_DOOR: - case GO_MOTHER_SHAHRAZ_DOOR: - case GO_COUNCIL_DOOR_1: - case GO_COUNCIL_DOOR_2: - case GO_ILLIDAN_GATE: - case GO_ILLIDAN_DOOR_R: - case GO_ILLIDAN_DOOR_L: - AddDoor(go, false); - break; - } - } - - uint64 GetData64(uint32 type) const - { - switch (type) - { - case NPC_SHADE_OF_AKAMA: - return ShadeOfAkamaGUID; - case NPC_AKAMA_SHADE: - return AkamaShadeGUID; - case NPC_GATHIOS_THE_SHATTERER: - return GathiosTheShattererGUID; - case NPC_HIGH_NETHERMANCER_ZEREVOR: - return HighNethermancerZerevorGUID; - case NPC_LADY_MALANDE: - return LadyMalandeGUID; - case NPC_VERAS_DARKSHADOW: - return VerasDarkshadowGUID; - case NPC_ILLIDARI_COUNCIL: - return IllidariCouncilGUID; - case NPC_AKAMA: - return AkamaGUID; - case NPC_ILLIDAN_STORMRAGE: - return IllidanStormrageGUID; - } - - return 0; - } - - bool SetBossState(uint32 type, EncounterState state) - { - if (!InstanceScript::SetBossState(type, state)) - return false; - - if (type == DATA_SHADE_OF_AKAMA && state == DONE) - { - for (std::list::const_iterator itr = ashtongueGUIDs.begin(); itr != ashtongueGUIDs.end(); ++itr) - if (Creature* ashtongue = instance->GetCreature(*itr)) - ashtongue->setFaction(FACTION_ASHTONGUE); - } - else if (type == DATA_ILLIDARI_COUNCIL && state == DONE) - { - if (Creature* akama = instance->GetCreature(AkamaGUID)) - akama->SetVisible(true); - } - - return true; - } - - std::string GetSaveData() - { - OUT_SAVE_INST_DATA; - - std::ostringstream saveStream; - saveStream << "B T " << GetBossSaveData(); - - OUT_SAVE_INST_DATA_COMPLETE; - return saveStream.str(); - } - - void Load(char const* str) - { - 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 == 'T') - { - for (uint8 i = 0; i < MAX_ENCOUNTERS; ++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 ShadeOfAkamaGUID; - uint64 AkamaShadeGUID; - uint64 TeronGorefiendGUID; - uint64 ReliquaryGUID; - std::list ashtongueGUIDs; - uint64 GathiosTheShattererGUID; - uint64 HighNethermancerZerevorGUID; - uint64 LadyMalandeGUID; - uint64 VerasDarkshadowGUID; - uint64 IllidariCouncilGUID; - uint64 AkamaGUID; - uint64 IllidanStormrageGUID; - }; - - InstanceScript* GetInstanceScript(InstanceMap* map) const - { - return new instance_black_temple_InstanceMapScript(map); + ShadeOfAkamaGUID = 0; + AkamaShadeGUID = 0; + TeronGorefiendGUID = 0; + ReliquaryGUID = 0; + ashtongueGUIDs.clear(); + GathiosTheShattererGUID = 0; + HighNethermancerZerevorGUID = 0; + LadyMalandeGUID = 0; + VerasDarkshadowGUID = 0; + IllidariCouncilGUID = 0; + AkamaGUID = 0; + IllidanStormrageGUID = 0; } + + void OnCreatureCreate(Creature* creature) + { + switch (creature->GetEntry()) + { + case NPC_SHADE_OF_AKAMA: + ShadeOfAkamaGUID = creature->GetGUID(); + break; + case NPC_AKAMA_SHADE: + AkamaShadeGUID = creature->GetGUID(); + break; + case NPC_TERON_GOREFIEND: + TeronGorefiendGUID = creature->GetGUID(); + break; + case NPC_RELIQUARY_OF_THE_LOST: + ReliquaryGUID = creature->GetGUID(); + break; + case NPC_GATHIOS_THE_SHATTERER: + GathiosTheShattererGUID = creature->GetGUID(); + break; + case NPC_HIGH_NETHERMANCER_ZEREVOR: + HighNethermancerZerevorGUID = creature->GetGUID(); + break; + case NPC_LADY_MALANDE: + LadyMalandeGUID = creature->GetGUID(); + break; + case NPC_VERAS_DARKSHADOW: + VerasDarkshadowGUID = creature->GetGUID(); + break; + case NPC_ILLIDARI_COUNCIL: + IllidariCouncilGUID = creature->GetGUID(); + break; + case NPC_AKAMA: + AkamaGUID = creature->GetGUID(); + break; + case NPC_ILLIDAN_STORMRAGE: + IllidanStormrageGUID = creature->GetGUID(); + break; + case NPC_VENGEFUL_SPIRIT: + case NPC_SHADOWY_CONSTRUCT: + if (Creature* teron = instance->GetCreature(TeronGorefiendGUID)) + teron->AI()->JustSummoned(creature); + break; + case NPC_ENSLAVED_SOUL: + if (Creature* reliquary = instance->GetCreature(ReliquaryGUID)) + reliquary->AI()->JustSummoned(creature); + break; + case NPC_PARASITIC_SHADOWFIEND: + case NPC_BLADE_OF_AZZINOTH: + case NPC_FLAME_OF_AZZINOTH: + if (Creature* illidan = instance->GetCreature(IllidanStormrageGUID)) + illidan->AI()->JustSummoned(creature); + break; + case NPC_ANGERED_SOUL_FRAGMENT: + case NPC_HUNGERING_SOUL_FRAGMENT: + case NPC_SUFFERING_SOUL_FRAGMENT: + creature->SetCorpseDelay(5); + break; + } + + if (creature->GetName().find("Ashtongue") != std::string::npos || creature->GetEntry() == NPC_STORM_FURY) + { + ashtongueGUIDs.push_back(creature->GetGUID()); + if (GetBossState(DATA_SHADE_OF_AKAMA) == DONE) + creature->setFaction(FACTION_ASHTONGUE); + } + } + + void OnGameObjectCreate(GameObject* go) + { + switch (go->GetEntry()) + { + case GO_NAJENTUS_GATE: + case GO_SUPREMUS_GATE: + case GO_SHADE_OF_AKAMA_DOOR: + case GO_TERON_DOOR_1: + case GO_TERON_DOOR_2: + case GO_GURTOGG_DOOR: + case GO_TEMPLE_DOOR: + case GO_MOTHER_SHAHRAZ_DOOR: + case GO_COUNCIL_DOOR_1: + case GO_COUNCIL_DOOR_2: + case GO_ILLIDAN_GATE: + case GO_ILLIDAN_DOOR_R: + case GO_ILLIDAN_DOOR_L: + AddDoor(go, true); + break; + } + } + + void OnGameObjectRemove(GameObject* go) + { + switch (go->GetEntry()) + { + case GO_NAJENTUS_GATE: + case GO_SUPREMUS_GATE: + case GO_SHADE_OF_AKAMA_DOOR: + case GO_TERON_DOOR_1: + case GO_TERON_DOOR_2: + case GO_GURTOGG_DOOR: + case GO_TEMPLE_DOOR: + case GO_MOTHER_SHAHRAZ_DOOR: + case GO_COUNCIL_DOOR_1: + case GO_COUNCIL_DOOR_2: + case GO_ILLIDAN_GATE: + case GO_ILLIDAN_DOOR_R: + case GO_ILLIDAN_DOOR_L: + AddDoor(go, false); + break; + } + } + + uint64 GetData64(uint32 type) const + { + switch (type) + { + case NPC_SHADE_OF_AKAMA: + return ShadeOfAkamaGUID; + case NPC_AKAMA_SHADE: + return AkamaShadeGUID; + case NPC_GATHIOS_THE_SHATTERER: + return GathiosTheShattererGUID; + case NPC_HIGH_NETHERMANCER_ZEREVOR: + return HighNethermancerZerevorGUID; + case NPC_LADY_MALANDE: + return LadyMalandeGUID; + case NPC_VERAS_DARKSHADOW: + return VerasDarkshadowGUID; + case NPC_ILLIDARI_COUNCIL: + return IllidariCouncilGUID; + case NPC_AKAMA: + return AkamaGUID; + case NPC_ILLIDAN_STORMRAGE: + return IllidanStormrageGUID; + } + + return 0; + } + + bool SetBossState(uint32 type, EncounterState state) + { + if (!InstanceScript::SetBossState(type, state)) + return false; + + if (type == DATA_SHADE_OF_AKAMA && state == DONE) + { + for (std::list::const_iterator itr = ashtongueGUIDs.begin(); itr != ashtongueGUIDs.end(); ++itr) + if (Creature* ashtongue = instance->GetCreature(*itr)) + ashtongue->setFaction(FACTION_ASHTONGUE); + } + else if (type == DATA_ILLIDARI_COUNCIL && state == DONE) + { + if (Creature* akama = instance->GetCreature(AkamaGUID)) + akama->SetVisible(true); + } + + return true; + } + + std::string GetSaveData() + { + OUT_SAVE_INST_DATA; + + std::ostringstream saveStream; + saveStream << "B T " << GetBossSaveData(); + + OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); + } + + void Load(char const* str) + { + 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 == 'T') + { + for (uint8 i = 0; i < MAX_ENCOUNTERS; ++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 ShadeOfAkamaGUID; + uint64 AkamaShadeGUID; + uint64 TeronGorefiendGUID; + uint64 ReliquaryGUID; + std::list ashtongueGUIDs; + uint64 GathiosTheShattererGUID; + uint64 HighNethermancerZerevorGUID; + uint64 LadyMalandeGUID; + uint64 VerasDarkshadowGUID; + uint64 IllidariCouncilGUID; + uint64 AkamaGUID; + uint64 IllidanStormrageGUID; + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_black_temple_InstanceMapScript(map); + } }; class spell_black_template_harpooners_mark : public SpellScriptLoader { - public: - spell_black_template_harpooners_mark() : SpellScriptLoader("spell_black_template_harpooners_mark") { } +public: + spell_black_template_harpooners_mark() : SpellScriptLoader("spell_black_template_harpooners_mark") { } - class spell_black_template_harpooners_mark_AuraScript : public AuraScript + class spell_black_template_harpooners_mark_AuraScript : public AuraScript + { + PrepareAuraScript(spell_black_template_harpooners_mark_AuraScript) + + bool Load() { - PrepareAuraScript(spell_black_template_harpooners_mark_AuraScript) - - bool Load() - { - _turtleSet.clear(); - return true; - } - - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - std::list creatureList; - GetUnitOwner()->GetCreaturesWithEntryInRange(creatureList, 80.0f, NPC_DRAGON_TURTLE); - for (std::list::const_iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr) - { - (*itr)->TauntApply(GetUnitOwner()); - (*itr)->AddThreat(GetUnitOwner(), 10000000.0f); - _turtleSet.insert((*itr)->GetGUID()); - } - } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - for (std::set::const_iterator itr = _turtleSet.begin(); itr != _turtleSet.end(); ++itr) - if (Creature* turtle = ObjectAccessor::GetCreature(*GetUnitOwner(), *itr)) - { - turtle->TauntFadeOut(GetUnitOwner()); - turtle->AddThreat(GetUnitOwner(), -10000000.0f); - } - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_black_template_harpooners_mark_AuraScript::HandleEffectApply, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_black_template_harpooners_mark_AuraScript::HandleEffectRemove, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - - private: - std::set _turtleSet; - }; - - AuraScript* GetAuraScript() const - { - return new spell_black_template_harpooners_mark_AuraScript(); + _turtleSet.clear(); + return true; } + + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + std::list creatureList; + GetUnitOwner()->GetCreaturesWithEntryInRange(creatureList, 80.0f, NPC_DRAGON_TURTLE); + for (std::list::const_iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr) + { + (*itr)->TauntApply(GetUnitOwner()); + (*itr)->AddThreat(GetUnitOwner(), 10000000.0f); + _turtleSet.insert((*itr)->GetGUID()); + } + } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + for (std::set::const_iterator itr = _turtleSet.begin(); itr != _turtleSet.end(); ++itr) + if (Creature* turtle = ObjectAccessor::GetCreature(*GetUnitOwner(), *itr)) + { + turtle->TauntFadeOut(GetUnitOwner()); + turtle->AddThreat(GetUnitOwner(), -10000000.0f); + } + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_black_template_harpooners_mark_AuraScript::HandleEffectApply, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_black_template_harpooners_mark_AuraScript::HandleEffectRemove, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + + private: + std::set _turtleSet; + }; + + AuraScript* GetAuraScript() const + { + return new spell_black_template_harpooners_mark_AuraScript(); + } }; class spell_black_template_free_friend : public SpellScriptLoader { - public: - spell_black_template_free_friend() : SpellScriptLoader("spell_black_template_free_friend") { } +public: + spell_black_template_free_friend() : SpellScriptLoader("spell_black_template_free_friend") { } - class spell_black_template_free_friend_SpellScript : public SpellScript + class spell_black_template_free_friend_SpellScript : public SpellScript + { + PrepareSpellScript(spell_black_template_free_friend_SpellScript); + + void HandleScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_black_template_free_friend_SpellScript); + PreventHitDefaultEffect(effIndex); + Unit* target = GetHitUnit(); + if (!target) + return; - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - Unit* target = GetHitUnit(); - if (!target) - return; - - target->RemoveAurasDueToSpell(SPELL_AURA_MOD_CHARM); - target->RemoveAurasDueToSpell(SPELL_AURA_MOD_STUN); - target->RemoveAurasDueToSpell(SPELL_AURA_MOD_DECREASE_SPEED); - target->RemoveAurasDueToSpell(SPELL_AURA_MOD_ROOT); - target->RemoveAurasDueToSpell(SPELL_AURA_MOD_CONFUSE); - target->RemoveAurasDueToSpell(SPELL_AURA_MOD_FEAR); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_black_template_free_friend_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_black_template_free_friend_SpellScript(); + target->RemoveAurasDueToSpell(SPELL_AURA_MOD_CHARM); + target->RemoveAurasDueToSpell(SPELL_AURA_MOD_STUN); + target->RemoveAurasDueToSpell(SPELL_AURA_MOD_DECREASE_SPEED); + target->RemoveAurasDueToSpell(SPELL_AURA_MOD_ROOT); + target->RemoveAurasDueToSpell(SPELL_AURA_MOD_CONFUSE); + target->RemoveAurasDueToSpell(SPELL_AURA_MOD_FEAR); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_black_template_free_friend_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_black_template_free_friend_SpellScript(); + } }; class spell_black_temple_curse_of_the_bleakheart : public SpellScriptLoader { - public: - spell_black_temple_curse_of_the_bleakheart() : SpellScriptLoader("spell_black_temple_curse_of_the_bleakheart") { } +public: + spell_black_temple_curse_of_the_bleakheart() : SpellScriptLoader("spell_black_temple_curse_of_the_bleakheart") { } - class spell_black_temple_curse_of_the_bleakheart_AuraScript : public AuraScript + class spell_black_temple_curse_of_the_bleakheart_AuraScript : public AuraScript + { + PrepareAuraScript(spell_black_temple_curse_of_the_bleakheart_AuraScript); + + void CalcPeriodic(AuraEffect const* /*effect*/, bool& isPeriodic, int32& amplitude) { - PrepareAuraScript(spell_black_temple_curse_of_the_bleakheart_AuraScript); - - void CalcPeriodic(AuraEffect const* /*effect*/, bool& isPeriodic, int32& amplitude) - { - isPeriodic = true; - amplitude = 5000; - } - - void Update(AuraEffect const* /*effect*/) - { - PreventDefaultAction(); - if (roll_chance_i(20)) - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_CHEST_PAINS, true); - } - - void Register() - { - DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_black_temple_curse_of_the_bleakheart_AuraScript::CalcPeriodic, EFFECT_0, SPELL_AURA_DUMMY); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_black_temple_curse_of_the_bleakheart_AuraScript::Update, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_black_temple_curse_of_the_bleakheart_AuraScript(); + isPeriodic = true; + amplitude = 5000; } + + void Update(AuraEffect const* /*effect*/) + { + PreventDefaultAction(); + if (roll_chance_i(20)) + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_CHEST_PAINS, true); + } + + void Register() + { + DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_black_temple_curse_of_the_bleakheart_AuraScript::CalcPeriodic, EFFECT_0, SPELL_AURA_DUMMY); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_black_temple_curse_of_the_bleakheart_AuraScript::Update, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_black_temple_curse_of_the_bleakheart_AuraScript(); + } }; class spell_black_temple_skeleton_shot : public SpellScriptLoader { - public: - spell_black_temple_skeleton_shot() : SpellScriptLoader("spell_black_temple_skeleton_shot") { } +public: + spell_black_temple_skeleton_shot() : SpellScriptLoader("spell_black_temple_skeleton_shot") { } - class spell_black_temple_skeleton_shot_AuraScript : public AuraScript + class spell_black_temple_skeleton_shot_AuraScript : public AuraScript + { + PrepareAuraScript(spell_black_temple_skeleton_shot_AuraScript) + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_black_temple_skeleton_shot_AuraScript) - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_DEATH) - GetTarget()->CastSpell(GetTarget(), GetSpellInfo()->Effects[EFFECT_2].CalcValue(), true); - } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_black_temple_skeleton_shot_AuraScript::HandleEffectRemove, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_black_temple_skeleton_shot_AuraScript(); + if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_DEATH) + GetTarget()->CastSpell(GetTarget(), GetSpellInfo()->Effects[EFFECT_2].CalcValue(), true); } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_black_temple_skeleton_shot_AuraScript::HandleEffectRemove, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_black_temple_skeleton_shot_AuraScript(); + } }; class spell_black_temple_wyvern_sting : public SpellScriptLoader { - public: - spell_black_temple_wyvern_sting() : SpellScriptLoader("spell_black_temple_wyvern_sting") { } +public: + spell_black_temple_wyvern_sting() : SpellScriptLoader("spell_black_temple_wyvern_sting") { } - class spell_black_temple_wyvern_sting_AuraScript : public AuraScript + class spell_black_temple_wyvern_sting_AuraScript : public AuraScript + { + PrepareAuraScript(spell_black_temple_wyvern_sting_AuraScript) + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_black_temple_wyvern_sting_AuraScript) - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) - caster->CastSpell(GetTarget(), SPELL_WYVERN_STING, true); - } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_black_temple_wyvern_sting_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_black_temple_wyvern_sting_AuraScript(); + if (Unit* caster = GetCaster()) + caster->CastSpell(GetTarget(), SPELL_WYVERN_STING, true); } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_black_temple_wyvern_sting_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_black_temple_wyvern_sting_AuraScript(); + } }; class spell_black_temple_charge_rage : public SpellScriptLoader { - public: - spell_black_temple_charge_rage() : SpellScriptLoader("spell_black_temple_charge_rage") { } +public: + spell_black_temple_charge_rage() : SpellScriptLoader("spell_black_temple_charge_rage") { } - class spell_black_temple_charge_rage_AuraScript : public AuraScript + class spell_black_temple_charge_rage_AuraScript : public AuraScript + { + PrepareAuraScript(spell_black_temple_charge_rage_AuraScript); + + void Update(AuraEffect const* effect) { - PrepareAuraScript(spell_black_temple_charge_rage_AuraScript); - - void Update(AuraEffect const* effect) - { - PreventDefaultAction(); - if (Unit* target = GetUnitOwner()->SelectNearbyNoTotemTarget((Unit*)NULL, 50.0f)) - GetUnitOwner()->CastSpell(target, GetSpellInfo()->Effects[effect->GetEffIndex()].TriggerSpell, true); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_black_temple_charge_rage_AuraScript::Update, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_black_temple_charge_rage_AuraScript(); + PreventDefaultAction(); + if (Unit* target = GetUnitOwner()->SelectNearbyNoTotemTarget((Unit*)NULL, 50.0f)) + GetUnitOwner()->CastSpell(target, GetSpellInfo()->Effects[effect->GetEffIndex()].TriggerSpell, true); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_black_temple_charge_rage_AuraScript::Update, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_black_temple_charge_rage_AuraScript(); + } }; class spell_black_temple_shadow_inferno : public SpellScriptLoader { - public: - spell_black_temple_shadow_inferno() : SpellScriptLoader("spell_black_temple_shadow_inferno") { } +public: + spell_black_temple_shadow_inferno() : SpellScriptLoader("spell_black_temple_shadow_inferno") { } - class spell_black_temple_shadow_inferno_AuraScript : public AuraScript + class spell_black_temple_shadow_inferno_AuraScript : public AuraScript + { + PrepareAuraScript(spell_black_temple_shadow_inferno_AuraScript); + + void Update(AuraEffect const* effect) { - PrepareAuraScript(spell_black_temple_shadow_inferno_AuraScript); - - void Update(AuraEffect const* effect) - { - PreventDefaultAction(); - GetUnitOwner()->CastCustomSpell(SPELL_SHADOW_INFERNO_DAMAGE, SPELLVALUE_BASE_POINT0, effect->GetAmount(), GetUnitOwner(), TRIGGERED_FULL_MASK); - GetAura()->GetEffect(effect->GetEffIndex())->SetAmount(effect->GetAmount()+500); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_black_temple_shadow_inferno_AuraScript::Update, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_black_temple_shadow_inferno_AuraScript(); + PreventDefaultAction(); + GetUnitOwner()->CastCustomSpell(SPELL_SHADOW_INFERNO_DAMAGE, SPELLVALUE_BASE_POINT0, effect->GetAmount(), GetUnitOwner(), TRIGGERED_FULL_MASK); + GetAura()->GetEffect(effect->GetEffIndex())->SetAmount(effect->GetAmount() + 500); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_black_temple_shadow_inferno_AuraScript::Update, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_black_temple_shadow_inferno_AuraScript(); + } }; class spell_black_temple_spell_absorption : public SpellScriptLoader { - public: - spell_black_temple_spell_absorption() : SpellScriptLoader("spell_black_temple_spell_absorption") { } +public: + spell_black_temple_spell_absorption() : SpellScriptLoader("spell_black_temple_spell_absorption") { } - class spell_black_temple_spell_absorption_AuraScript : public AuraScript + class spell_black_temple_spell_absorption_AuraScript : public AuraScript + { + PrepareAuraScript(spell_black_temple_spell_absorption_AuraScript); + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) { - PrepareAuraScript(spell_black_temple_spell_absorption_AuraScript); - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - // Set absorbtion amount to unlimited - amount = -1; - } - - void Absorb(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount) - { - absorbAmount = dmgInfo.GetDamage(); - } - - void Update(AuraEffect const* effect) - { - PreventDefaultAction(); - uint32 count = GetUnitOwner()->GetAuraCount(SPELL_CHAOTIC_CHARGE); - if (count == 0) - return; - - GetUnitOwner()->CastCustomSpell(GetSpellInfo()->Effects[effect->GetEffIndex()].TriggerSpell, SPELLVALUE_BASE_POINT0, effect->GetAmount()*count, GetUnitOwner(), TRIGGERED_FULL_MASK); - GetUnitOwner()->RemoveAurasDueToSpell(SPELL_CHAOTIC_CHARGE); - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_black_temple_spell_absorption_AuraScript::CalculateAmount, EFFECT_2, SPELL_AURA_SCHOOL_ABSORB); - OnEffectAbsorb += AuraEffectAbsorbFn(spell_black_temple_spell_absorption_AuraScript::Absorb, EFFECT_2); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_black_temple_spell_absorption_AuraScript::Update, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL_WITH_VALUE); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_black_temple_spell_absorption_AuraScript(); + // Set absorbtion amount to unlimited + amount = -1; } + + void Absorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount) + { + absorbAmount = dmgInfo.GetDamage(); + } + + void Update(AuraEffect const* effect) + { + PreventDefaultAction(); + uint32 count = GetUnitOwner()->GetAuraCount(SPELL_CHAOTIC_CHARGE); + if (count == 0) + return; + + GetUnitOwner()->CastCustomSpell(GetSpellInfo()->Effects[effect->GetEffIndex()].TriggerSpell, SPELLVALUE_BASE_POINT0, effect->GetAmount()*count, GetUnitOwner(), TRIGGERED_FULL_MASK); + GetUnitOwner()->RemoveAurasDueToSpell(SPELL_CHAOTIC_CHARGE); + } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_black_temple_spell_absorption_AuraScript::CalculateAmount, EFFECT_2, SPELL_AURA_SCHOOL_ABSORB); + OnEffectAbsorb += AuraEffectAbsorbFn(spell_black_temple_spell_absorption_AuraScript::Absorb, EFFECT_2); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_black_temple_spell_absorption_AuraScript::Update, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL_WITH_VALUE); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_black_temple_spell_absorption_AuraScript(); + } }; class spell_black_temple_bloodbolt : public SpellScriptLoader { - public: - spell_black_temple_bloodbolt() : SpellScriptLoader("spell_black_temple_bloodbolt") { } +public: + spell_black_temple_bloodbolt() : SpellScriptLoader("spell_black_temple_bloodbolt") { } - class spell_black_temple_bloodbolt_SpellScript : public SpellScript + class spell_black_temple_bloodbolt_SpellScript : public SpellScript + { + PrepareSpellScript(spell_black_temple_bloodbolt_SpellScript); + + void HandleScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_black_temple_bloodbolt_SpellScript); - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitEffect(effIndex); - if (Unit* target = GetHitUnit()) - GetCaster()->CastSpell(target, GetEffectValue(), true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_black_temple_bloodbolt_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_black_temple_bloodbolt_SpellScript(); + PreventHitEffect(effIndex); + if (Unit* target = GetHitUnit()) + GetCaster()->CastSpell(target, GetEffectValue(), true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_black_temple_bloodbolt_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_black_temple_bloodbolt_SpellScript(); + } }; class spell_black_temple_consuming_strikes : public SpellScriptLoader { - public: - spell_black_temple_consuming_strikes() : SpellScriptLoader("spell_black_temple_consuming_strikes") { } +public: + spell_black_temple_consuming_strikes() : SpellScriptLoader("spell_black_temple_consuming_strikes") { } - class spell_black_temple_consuming_strikes_AuraScript : public AuraScript + class spell_black_temple_consuming_strikes_AuraScript : public AuraScript + { + PrepareAuraScript(spell_black_temple_consuming_strikes_AuraScript); + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_black_temple_consuming_strikes_AuraScript); - - void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - GetTarget()->CastCustomSpell(GetSpellInfo()->Effects[EFFECT_1].CalcValue(), SPELLVALUE_BASE_POINT0, eventInfo.GetDamageInfo()->GetDamage(), GetTarget(), true); - } - - void Register() - { - OnEffectProc += AuraEffectProcFn(spell_black_temple_consuming_strikes_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_black_temple_consuming_strikes_AuraScript(); + PreventDefaultAction(); + GetTarget()->CastCustomSpell(GetSpellInfo()->Effects[EFFECT_1].CalcValue(), SPELLVALUE_BASE_POINT0, eventInfo.GetDamageInfo()->GetDamage(), GetTarget(), true); } + + void Register() + { + OnEffectProc += AuraEffectProcFn(spell_black_temple_consuming_strikes_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_black_temple_consuming_strikes_AuraScript(); + } }; class spell_black_temple_curse_of_vitality : public SpellScriptLoader { - public: - spell_black_temple_curse_of_vitality() : SpellScriptLoader("spell_black_temple_curse_of_vitality") { } +public: + spell_black_temple_curse_of_vitality() : SpellScriptLoader("spell_black_temple_curse_of_vitality") { } - class spell_black_temple_curse_of_vitality_AuraScript : public AuraScript + class spell_black_temple_curse_of_vitality_AuraScript : public AuraScript + { + PrepareAuraScript(spell_black_temple_curse_of_vitality_AuraScript); + + void OnPeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_black_temple_curse_of_vitality_AuraScript); - - void OnPeriodic(AuraEffect const* /*aurEff*/) - { - if (GetUnitOwner()->HealthBelowPct(50)) - SetDuration(0); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_black_temple_curse_of_vitality_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_black_temple_curse_of_vitality_AuraScript(); + if (GetUnitOwner()->HealthBelowPct(50)) + SetDuration(0); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_black_temple_curse_of_vitality_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_black_temple_curse_of_vitality_AuraScript(); + } }; class spell_black_temple_dementia : public SpellScriptLoader { - public: - spell_black_temple_dementia() : SpellScriptLoader("spell_black_temple_dementia") { } +public: + spell_black_temple_dementia() : SpellScriptLoader("spell_black_temple_dementia") { } - class spell_black_temple_dementia_AuraScript : public AuraScript + class spell_black_temple_dementia_AuraScript : public AuraScript + { + PrepareAuraScript(spell_black_temple_dementia_AuraScript); + + void OnPeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_black_temple_dementia_AuraScript); - - void OnPeriodic(AuraEffect const* /*aurEff*/) - { - if (roll_chance_i(50)) - GetTarget()->CastSpell(GetTarget(), SPELL_DEMENTIA1, true); - else - GetTarget()->CastSpell(GetTarget(), SPELL_DEMENTIA2, true); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_black_temple_dementia_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_black_temple_dementia_AuraScript(); + if (roll_chance_i(50)) + GetTarget()->CastSpell(GetTarget(), SPELL_DEMENTIA1, true); + else + GetTarget()->CastSpell(GetTarget(), SPELL_DEMENTIA2, true); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_black_temple_dementia_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_black_temple_dementia_AuraScript(); + } }; void AddSC_instance_black_temple() 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 26881e669..5b7c5b7f5 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp @@ -41,7 +41,7 @@ enum Misc EVENT_KILL_TALK = 5 }; -const Position advisorsPosition[MAX_ADVISORS+2] = +const Position advisorsPosition[MAX_ADVISORS + 2] = { {459.61f, -534.81f, -7.54f, 3.82f}, {463.83f, -540.23f, -7.54f, 3.15f}, @@ -52,150 +52,150 @@ const Position advisorsPosition[MAX_ADVISORS+2] = class boss_fathomlord_karathress : public CreatureScript { - public: - boss_fathomlord_karathress() : CreatureScript("boss_fathomlord_karathress") { } +public: + boss_fathomlord_karathress() : CreatureScript("boss_fathomlord_karathress") { } - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } + + struct boss_fathomlord_karathressAI : public BossAI + { + boss_fathomlord_karathressAI(Creature* creature) : BossAI(creature, DATA_FATHOM_LORD_KARATHRESS) { - return GetInstanceAI(creature); } - struct boss_fathomlord_karathressAI : public BossAI + void Reset() { - boss_fathomlord_karathressAI(Creature* creature) : BossAI(creature, DATA_FATHOM_LORD_KARATHRESS) + BossAI::Reset(); + + me->SummonCreature(NPC_FATHOM_GUARD_TIDALVESS, advisorsPosition[0], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 600000); + me->SummonCreature(NPC_FATHOM_GUARD_SHARKKIS, advisorsPosition[1], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 600000); + me->SummonCreature(NPC_FATHOM_GUARD_CARIBDIS, advisorsPosition[2], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 600000); + } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + if (summon->GetEntry() == NPC_SEER_OLUM) { + summon->SetWalk(true); + summon->GetMotionMaster()->MovePoint(0, advisorsPosition[MAX_ADVISORS + 1], false); } + } - void Reset() + void SummonedCreatureDies(Creature* summon, Unit*) + { + summons.Despawn(summon); + if (summon->GetEntry() == NPC_FATHOM_GUARD_TIDALVESS) + Talk(SAY_GAIN_ABILITY1); + if (summon->GetEntry() == NPC_FATHOM_GUARD_SHARKKIS) + Talk(SAY_GAIN_ABILITY2); + if (summon->GetEntry() == NPC_FATHOM_GUARD_CARIBDIS) + Talk(SAY_GAIN_ABILITY3); + } + + void KilledUnit(Unit* /*victim*/) + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) { - BossAI::Reset(); - - me->SummonCreature(NPC_FATHOM_GUARD_TIDALVESS, advisorsPosition[0], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 600000); - me->SummonCreature(NPC_FATHOM_GUARD_SHARKKIS, advisorsPosition[1], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 600000); - me->SummonCreature(NPC_FATHOM_GUARD_CARIBDIS, advisorsPosition[2], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 600000); + Talk(SAY_SLAY); + events.ScheduleEvent(EVENT_KILL_TALK, 6000); } + } - void JustSummoned(Creature* summon) + void JustDied(Unit* killer) + { + Talk(SAY_DEATH); + BossAI::JustDied(killer); + me->SummonCreature(NPC_SEER_OLUM, advisorsPosition[MAX_ADVISORS], TEMPSUMMON_TIMED_DESPAWN, 3600000); + if (GameObject* gobject = me->FindNearestGameObject(GO_CAGE, 100.0f)) + gobject->SetGoState(GO_STATE_ACTIVE); + } + + void EnterCombat(Unit* who) + { + BossAI::EnterCombat(who); + Talk(SAY_AGGRO); + me->CallForHelp(10.0f); + + events.ScheduleEvent(EVENT_SPELL_CATACLYSMIC_BOLT, 10000); + events.ScheduleEvent(EVENT_SPELL_ENRAGE, 600000); + events.ScheduleEvent(EVENT_SPELL_SEAR_NOVA, 25000); + events.ScheduleEvent(EVENT_HEALTH_CHECK, 1000); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) { - summons.Summon(summon); - if (summon->GetEntry() == NPC_SEER_OLUM) - { - summon->SetWalk(true); - summon->GetMotionMaster()->MovePoint(0, advisorsPosition[MAX_ADVISORS+1], false); - } - } + case EVENT_SPELL_ENRAGE: + me->CastSpell(me, SPELL_ENRAGE, true); + break; + case EVENT_SPELL_CATACLYSMIC_BOLT: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, PowerUsersSelector(me, POWER_MANA, 50.0f, true))) + me->CastSpell(target, SPELL_CATACLYSMIC_BOLT, false); + events.ScheduleEvent(EVENT_SPELL_CATACLYSMIC_BOLT, 6000); + break; + case EVENT_SPELL_SEAR_NOVA: + me->CastSpell(me, SPELL_SEAR_NOVA, false); + events.ScheduleEvent(EVENT_SPELL_SEAR_NOVA, 20000 + urand(0, 20000)); + break; + case EVENT_HEALTH_CHECK: + if (me->HealthBelowPct(76)) + { + for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) + if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr)) + if (summon->GetMaxHealth() > 500000) + summon->CastSpell(me, SPELL_BLESSING_OF_THE_TIDES, true); - void SummonedCreatureDies(Creature* summon, Unit*) - { - summons.Despawn(summon); - if (summon->GetEntry() == NPC_FATHOM_GUARD_TIDALVESS) - Talk(SAY_GAIN_ABILITY1); - if (summon->GetEntry() == NPC_FATHOM_GUARD_SHARKKIS) - Talk(SAY_GAIN_ABILITY2); - if (summon->GetEntry() == NPC_FATHOM_GUARD_CARIBDIS) - Talk(SAY_GAIN_ABILITY3); - } - - void KilledUnit(Unit* /*victim*/) - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(SAY_SLAY); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); - } - } - - void JustDied(Unit* killer) - { - Talk(SAY_DEATH); - BossAI::JustDied(killer); - me->SummonCreature(NPC_SEER_OLUM, advisorsPosition[MAX_ADVISORS], TEMPSUMMON_TIMED_DESPAWN, 3600000); - if (GameObject* gobject = me->FindNearestGameObject(GO_CAGE, 100.0f)) - gobject->SetGoState(GO_STATE_ACTIVE); - } - - void EnterCombat(Unit* who) - { - BossAI::EnterCombat(who); - Talk(SAY_AGGRO); - me->CallForHelp(10.0f); - - events.ScheduleEvent(EVENT_SPELL_CATACLYSMIC_BOLT, 10000); - events.ScheduleEvent(EVENT_SPELL_ENRAGE, 600000); - events.ScheduleEvent(EVENT_SPELL_SEAR_NOVA, 25000); - events.ScheduleEvent(EVENT_HEALTH_CHECK, 1000); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_ENRAGE: - me->CastSpell(me, SPELL_ENRAGE, true); + if (me->HasAura(SPELL_BLESSING_OF_THE_TIDES)) + Talk(SAY_GAIN_BLESSING); break; - case EVENT_SPELL_CATACLYSMIC_BOLT: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, PowerUsersSelector(me, POWER_MANA, 50.0f, true))) - me->CastSpell(target, SPELL_CATACLYSMIC_BOLT, false); - events.ScheduleEvent(EVENT_SPELL_CATACLYSMIC_BOLT, 6000); - break; - case EVENT_SPELL_SEAR_NOVA: - me->CastSpell(me, SPELL_SEAR_NOVA, false); - events.ScheduleEvent(EVENT_SPELL_SEAR_NOVA, 20000+urand(0, 20000)); - break; - case EVENT_HEALTH_CHECK: - if (me->HealthBelowPct(76)) - { - for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) - if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr)) - if (summon->GetMaxHealth() > 500000) - summon->CastSpell(me, SPELL_BLESSING_OF_THE_TIDES, true); - - if (me->HasAura(SPELL_BLESSING_OF_THE_TIDES)) - Talk(SAY_GAIN_BLESSING); - break; - } - events.ScheduleEvent(EVENT_HEALTH_CHECK, 1000); - break; - } - - DoMeleeAttackIfReady(); + } + events.ScheduleEvent(EVENT_HEALTH_CHECK, 1000); + break; } - }; + + DoMeleeAttackIfReady(); + } + }; }; class spell_karathress_power_of_caribdis : public SpellScriptLoader { - public: - spell_karathress_power_of_caribdis() : SpellScriptLoader("spell_karathress_power_of_caribdis") { } +public: + spell_karathress_power_of_caribdis() : SpellScriptLoader("spell_karathress_power_of_caribdis") { } - class spell_karathress_power_of_caribdis_AuraScript : public AuraScript + class spell_karathress_power_of_caribdis_AuraScript : public AuraScript + { + PrepareAuraScript(spell_karathress_power_of_caribdis_AuraScript); + + void OnPeriodic(AuraEffect const* aurEff) { - PrepareAuraScript(spell_karathress_power_of_caribdis_AuraScript); - - void OnPeriodic(AuraEffect const* aurEff) - { - PreventDefaultAction(); - if (Unit* victim = GetUnitOwner()->GetVictim()) - GetUnitOwner()->CastSpell(victim, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_karathress_power_of_caribdis_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_karathress_power_of_caribdis_AuraScript(); + PreventDefaultAction(); + if (Unit* victim = GetUnitOwner()->GetVictim()) + GetUnitOwner()->CastSpell(victim, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_karathress_power_of_caribdis_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_karathress_power_of_caribdis_AuraScript(); + } }; void AddSC_boss_fathomlord_karathress() diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp index bfac9ed22..83b078239 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp @@ -78,289 +78,289 @@ enum Misc class boss_hydross_the_unstable : public CreatureScript { - public: - boss_hydross_the_unstable() : CreatureScript("boss_hydross_the_unstable") { } +public: + boss_hydross_the_unstable() : CreatureScript("boss_hydross_the_unstable") { } - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } + + struct boss_hydross_the_unstableAI : public BossAI + { + boss_hydross_the_unstableAI(Creature* creature) : BossAI(creature, DATA_HYDROSS_THE_UNSTABLE) { - return GetInstanceAI(creature); } - struct boss_hydross_the_unstableAI : public BossAI + void Reset() { - boss_hydross_the_unstableAI(Creature* creature) : BossAI(creature, DATA_HYDROSS_THE_UNSTABLE) + BossAI::Reset(); + } + + void JustReachedHome() + { + BossAI::JustReachedHome(); + if (!me->HasAura(SPELL_BLUE_BEAM)) + me->RemoveAurasDueToSpell(SPELL_CLEANSING_FIELD_AURA); + } + + void SetForm(bool corrupt, bool initial) + { + events.CancelEventGroup(GROUP_ABILITIES); + DoResetThreat(); + + if (corrupt) { + me->SetMeleeDamageSchool(SPELL_SCHOOL_NATURE); + me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, false); + me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, true); + me->CastSpell(me, SPELL_CORRUPTION, true); + events.ScheduleEvent(EVENT_SPELL_MARK_OF_CORRUPTION1, 0, GROUP_ABILITIES); + events.ScheduleEvent(EVENT_SPELL_MARK_OF_CORRUPTION2, 15000, GROUP_ABILITIES); + events.ScheduleEvent(EVENT_SPELL_MARK_OF_CORRUPTION3, 30000, GROUP_ABILITIES); + events.ScheduleEvent(EVENT_SPELL_MARK_OF_CORRUPTION4, 45000, GROUP_ABILITIES); + events.ScheduleEvent(EVENT_SPELL_MARK_OF_CORRUPTION5, 60000, GROUP_ABILITIES); + events.ScheduleEvent(EVENT_SPELL_MARK_OF_CORRUPTION6, 75000, GROUP_ABILITIES); + events.ScheduleEvent(EVENT_SPELL_VILE_SLUDGE, 7000, GROUP_ABILITIES); + } + else + { + me->SetMeleeDamageSchool(SPELL_SCHOOL_FROST); + me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true); + me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, false); + me->RemoveAurasDueToSpell(SPELL_CORRUPTION); + events.ScheduleEvent(EVENT_SPELL_MARK_OF_HYDROSS1, 0, GROUP_ABILITIES); + events.ScheduleEvent(EVENT_SPELL_MARK_OF_HYDROSS2, 15000, GROUP_ABILITIES); + events.ScheduleEvent(EVENT_SPELL_MARK_OF_HYDROSS3, 30000, GROUP_ABILITIES); + events.ScheduleEvent(EVENT_SPELL_MARK_OF_HYDROSS4, 45000, GROUP_ABILITIES); + events.ScheduleEvent(EVENT_SPELL_MARK_OF_HYDROSS5, 60000, GROUP_ABILITIES); + events.ScheduleEvent(EVENT_SPELL_MARK_OF_HYDROSS6, 75000, GROUP_ABILITIES); + events.ScheduleEvent(EVENT_SPELL_WATER_TOMB, 7000, GROUP_ABILITIES); } - void Reset() - { - BossAI::Reset(); - } + if (initial) + return; - void JustReachedHome() + if (corrupt) { - BossAI::JustReachedHome(); - if (!me->HasAura(SPELL_BLUE_BEAM)) - me->RemoveAurasDueToSpell(SPELL_CLEANSING_FIELD_AURA); + Talk(SAY_SWITCH_TO_CORRUPT); + for (uint32 i = SPELL_SUMMON_CORRUPTED1; i <= SPELL_SUMMON_CORRUPTED4; ++i) + me->CastSpell(me, i, true); } - - void SetForm(bool corrupt, bool initial) + else { - events.CancelEventGroup(GROUP_ABILITIES); - DoResetThreat(); - - if (corrupt) - { - me->SetMeleeDamageSchool(SPELL_SCHOOL_NATURE); - me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, false); - me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, true); - me->CastSpell(me, SPELL_CORRUPTION, true); - events.ScheduleEvent(EVENT_SPELL_MARK_OF_CORRUPTION1, 0, GROUP_ABILITIES); - events.ScheduleEvent(EVENT_SPELL_MARK_OF_CORRUPTION2, 15000, GROUP_ABILITIES); - events.ScheduleEvent(EVENT_SPELL_MARK_OF_CORRUPTION3, 30000, GROUP_ABILITIES); - events.ScheduleEvent(EVENT_SPELL_MARK_OF_CORRUPTION4, 45000, GROUP_ABILITIES); - events.ScheduleEvent(EVENT_SPELL_MARK_OF_CORRUPTION5, 60000, GROUP_ABILITIES); - events.ScheduleEvent(EVENT_SPELL_MARK_OF_CORRUPTION6, 75000, GROUP_ABILITIES); - events.ScheduleEvent(EVENT_SPELL_VILE_SLUDGE, 7000, GROUP_ABILITIES); - } - else - { - me->SetMeleeDamageSchool(SPELL_SCHOOL_FROST); - me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true); - me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, false); - me->RemoveAurasDueToSpell(SPELL_CORRUPTION); - events.ScheduleEvent(EVENT_SPELL_MARK_OF_HYDROSS1, 0, GROUP_ABILITIES); - events.ScheduleEvent(EVENT_SPELL_MARK_OF_HYDROSS2, 15000, GROUP_ABILITIES); - events.ScheduleEvent(EVENT_SPELL_MARK_OF_HYDROSS3, 30000, GROUP_ABILITIES); - events.ScheduleEvent(EVENT_SPELL_MARK_OF_HYDROSS4, 45000, GROUP_ABILITIES); - events.ScheduleEvent(EVENT_SPELL_MARK_OF_HYDROSS5, 60000, GROUP_ABILITIES); - events.ScheduleEvent(EVENT_SPELL_MARK_OF_HYDROSS6, 75000, GROUP_ABILITIES); + Talk(SAY_SWITCH_TO_CLEAN); + for (uint32 i = SPELL_SUMMON_PURIFIED1; i <= SPELL_SUMMON_PURIFIED4; ++i) + me->CastSpell(me, i, true); + } + } + + void EnterCombat(Unit* who) + { + BossAI::EnterCombat(who); + Talk(SAY_AGGRO); + + events.ScheduleEvent(EVENT_SPELL_ENRAGE, 600000); + events.ScheduleEvent(EVENT_CHECK_AURA, 1000); + SetForm(false, true); + } + + void KilledUnit(Unit* /*victim*/) + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + { + Talk(me->HasAura(SPELL_CORRUPTION) ? SAY_CORRUPT_SLAY : SAY_CLEAN_SLAY); + events.ScheduleEvent(EVENT_KILL_TALK, 6000); + } + } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + summon->CastSpell(summon, SPELL_ELEMENTAL_SPAWNIN, true); + summon->SetInCombatWithZone(); + + if (summon->GetEntry() == NPC_PURE_SPAWN_OF_HYDROSS) + summon->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true); + else + summon->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, true); + } + + void SummonedCreatureDespawn(Creature* summon) + { + summons.Despawn(summon); + } + + void JustDied(Unit* killer) + { + Talk(me->HasAura(SPELL_CORRUPTION) ? SAY_CORRUPT_DEATH : SAY_CLEAN_DEATH); + BossAI::JustDied(killer); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_CHECK_AURA: + if (me->HasAura(SPELL_BLUE_BEAM) == me->HasAura(SPELL_CORRUPTION)) + SetForm(!me->HasAura(SPELL_BLUE_BEAM), false); + events.ScheduleEvent(EVENT_CHECK_AURA, 1000); + break; + case EVENT_SPELL_ENRAGE: + me->CastSpell(me, SPELL_ENRAGE, true); + break; + case EVENT_SPELL_MARK_OF_HYDROSS1: + me->CastSpell(me, SPELL_MARK_OF_HYDROSS1, false); + break; + case EVENT_SPELL_MARK_OF_HYDROSS2: + me->CastSpell(me, SPELL_MARK_OF_HYDROSS2, false); + break; + case EVENT_SPELL_MARK_OF_HYDROSS3: + me->CastSpell(me, SPELL_MARK_OF_HYDROSS3, false); + break; + case EVENT_SPELL_MARK_OF_HYDROSS4: + me->CastSpell(me, SPELL_MARK_OF_HYDROSS4, false); + break; + case EVENT_SPELL_MARK_OF_HYDROSS5: + me->CastSpell(me, SPELL_MARK_OF_HYDROSS5, false); + break; + case EVENT_SPELL_MARK_OF_HYDROSS6: + me->CastSpell(me, SPELL_MARK_OF_HYDROSS6, false); + events.ScheduleEvent(EVENT_SPELL_MARK_OF_HYDROSS6, 15000, GROUP_ABILITIES); + break; + case EVENT_SPELL_MARK_OF_CORRUPTION1: + me->CastSpell(me, SPELL_MARK_OF_CORRUPTION1, false); + break; + case EVENT_SPELL_MARK_OF_CORRUPTION2: + me->CastSpell(me, SPELL_MARK_OF_CORRUPTION2, false); + break; + case EVENT_SPELL_MARK_OF_CORRUPTION3: + me->CastSpell(me, SPELL_MARK_OF_CORRUPTION3, false); + break; + case EVENT_SPELL_MARK_OF_CORRUPTION4: + me->CastSpell(me, SPELL_MARK_OF_CORRUPTION4, false); + break; + case EVENT_SPELL_MARK_OF_CORRUPTION5: + me->CastSpell(me, SPELL_MARK_OF_CORRUPTION5, false); + break; + case EVENT_SPELL_MARK_OF_CORRUPTION6: + me->CastSpell(me, SPELL_MARK_OF_CORRUPTION6, false); + events.ScheduleEvent(EVENT_SPELL_MARK_OF_CORRUPTION6, 15000, GROUP_ABILITIES); + break; + case EVENT_SPELL_WATER_TOMB: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 60.0f, true)) + me->CastSpell(target, SPELL_WATER_TOMB, false); events.ScheduleEvent(EVENT_SPELL_WATER_TOMB, 7000, GROUP_ABILITIES); - } + break; + case EVENT_SPELL_VILE_SLUDGE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 60.0f, true)) + me->CastSpell(target, SPELL_VILE_SLUDGE, false); + events.ScheduleEvent(EVENT_SPELL_VILE_SLUDGE, 15000, GROUP_ABILITIES); + break; - if (initial) - return; - - if (corrupt) - { - Talk(SAY_SWITCH_TO_CORRUPT); - for (uint32 i = SPELL_SUMMON_CORRUPTED1; i <= SPELL_SUMMON_CORRUPTED4; ++i) - me->CastSpell(me, i, true); - } - else - { - Talk(SAY_SWITCH_TO_CLEAN); - for (uint32 i = SPELL_SUMMON_PURIFIED1; i <= SPELL_SUMMON_PURIFIED4; ++i) - me->CastSpell(me, i, true); - } } - void EnterCombat(Unit* who) - { - BossAI::EnterCombat(who); - Talk(SAY_AGGRO); - - events.ScheduleEvent(EVENT_SPELL_ENRAGE, 600000); - events.ScheduleEvent(EVENT_CHECK_AURA, 1000); - SetForm(false, true); - } - - void KilledUnit(Unit* /*victim*/) - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(me->HasAura(SPELL_CORRUPTION) ? SAY_CORRUPT_SLAY : SAY_CLEAN_SLAY); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); - } - } - - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - summon->CastSpell(summon, SPELL_ELEMENTAL_SPAWNIN, true); - summon->SetInCombatWithZone(); - - if (summon->GetEntry() == NPC_PURE_SPAWN_OF_HYDROSS) - summon->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true); - else - summon->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, true); - } - - void SummonedCreatureDespawn(Creature* summon) - { - summons.Despawn(summon); - } - - void JustDied(Unit* killer) - { - Talk(me->HasAura(SPELL_CORRUPTION) ? SAY_CORRUPT_DEATH : SAY_CLEAN_DEATH); - BossAI::JustDied(killer); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_CHECK_AURA: - if (me->HasAura(SPELL_BLUE_BEAM) == me->HasAura(SPELL_CORRUPTION)) - SetForm(!me->HasAura(SPELL_BLUE_BEAM), false); - events.ScheduleEvent(EVENT_CHECK_AURA, 1000); - break; - case EVENT_SPELL_ENRAGE: - me->CastSpell(me, SPELL_ENRAGE, true); - break; - case EVENT_SPELL_MARK_OF_HYDROSS1: - me->CastSpell(me, SPELL_MARK_OF_HYDROSS1, false); - break; - case EVENT_SPELL_MARK_OF_HYDROSS2: - me->CastSpell(me, SPELL_MARK_OF_HYDROSS2, false); - break; - case EVENT_SPELL_MARK_OF_HYDROSS3: - me->CastSpell(me, SPELL_MARK_OF_HYDROSS3, false); - break; - case EVENT_SPELL_MARK_OF_HYDROSS4: - me->CastSpell(me, SPELL_MARK_OF_HYDROSS4, false); - break; - case EVENT_SPELL_MARK_OF_HYDROSS5: - me->CastSpell(me, SPELL_MARK_OF_HYDROSS5, false); - break; - case EVENT_SPELL_MARK_OF_HYDROSS6: - me->CastSpell(me, SPELL_MARK_OF_HYDROSS6, false); - events.ScheduleEvent(EVENT_SPELL_MARK_OF_HYDROSS6, 15000, GROUP_ABILITIES); - break; - case EVENT_SPELL_MARK_OF_CORRUPTION1: - me->CastSpell(me, SPELL_MARK_OF_CORRUPTION1, false); - break; - case EVENT_SPELL_MARK_OF_CORRUPTION2: - me->CastSpell(me, SPELL_MARK_OF_CORRUPTION2, false); - break; - case EVENT_SPELL_MARK_OF_CORRUPTION3: - me->CastSpell(me, SPELL_MARK_OF_CORRUPTION3, false); - break; - case EVENT_SPELL_MARK_OF_CORRUPTION4: - me->CastSpell(me, SPELL_MARK_OF_CORRUPTION4, false); - break; - case EVENT_SPELL_MARK_OF_CORRUPTION5: - me->CastSpell(me, SPELL_MARK_OF_CORRUPTION5, false); - break; - case EVENT_SPELL_MARK_OF_CORRUPTION6: - me->CastSpell(me, SPELL_MARK_OF_CORRUPTION6, false); - events.ScheduleEvent(EVENT_SPELL_MARK_OF_CORRUPTION6, 15000, GROUP_ABILITIES); - break; - case EVENT_SPELL_WATER_TOMB: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 60.0f, true)) - me->CastSpell(target, SPELL_WATER_TOMB, false); - events.ScheduleEvent(EVENT_SPELL_WATER_TOMB, 7000, GROUP_ABILITIES); - break; - case EVENT_SPELL_VILE_SLUDGE: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 60.0f, true)) - me->CastSpell(target, SPELL_VILE_SLUDGE, false); - events.ScheduleEvent(EVENT_SPELL_VILE_SLUDGE, 15000, GROUP_ABILITIES); - break; - - } - - DoMeleeAttackIfReady(); - } - }; + DoMeleeAttackIfReady(); + } + }; }; class spell_hydross_cleansing_field_aura : public SpellScriptLoader { - public: - spell_hydross_cleansing_field_aura() : SpellScriptLoader("spell_hydross_cleansing_field_aura") { } +public: + spell_hydross_cleansing_field_aura() : SpellScriptLoader("spell_hydross_cleansing_field_aura") { } - class spell_hydross_cleansing_field_aura_AuraScript : public AuraScript + class spell_hydross_cleansing_field_aura_AuraScript : public AuraScript + { + PrepareAuraScript(spell_hydross_cleansing_field_aura_AuraScript) + + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_hydross_cleansing_field_aura_AuraScript) - - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (GetTarget()->GetEntry() == NPC_HYDROSS_THE_UNSTABLE) - if (Unit* caster = GetCaster()) - caster->CastSpell(caster, SPELL_CLEANSING_FIELD, true); - } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (GetTarget()->GetEntry() == NPC_HYDROSS_THE_UNSTABLE) - if (Unit* caster = GetCaster()) - caster->CastSpell(caster, SPELL_CLEANSING_FIELD, true); - } - - void Register() - { - AfterEffectApply += AuraEffectApplyFn(spell_hydross_cleansing_field_aura_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_hydross_cleansing_field_aura_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_hydross_cleansing_field_aura_AuraScript(); + if (GetTarget()->GetEntry() == NPC_HYDROSS_THE_UNSTABLE) + if (Unit* caster = GetCaster()) + caster->CastSpell(caster, SPELL_CLEANSING_FIELD, true); } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (GetTarget()->GetEntry() == NPC_HYDROSS_THE_UNSTABLE) + if (Unit* caster = GetCaster()) + caster->CastSpell(caster, SPELL_CLEANSING_FIELD, true); + } + + void Register() + { + AfterEffectApply += AuraEffectApplyFn(spell_hydross_cleansing_field_aura_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_hydross_cleansing_field_aura_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_hydross_cleansing_field_aura_AuraScript(); + } }; class spell_hydross_cleansing_field_command : public SpellScriptLoader { - public: - spell_hydross_cleansing_field_command() : SpellScriptLoader("spell_hydross_cleansing_field_command") { } +public: + spell_hydross_cleansing_field_command() : SpellScriptLoader("spell_hydross_cleansing_field_command") { } - class spell_hydross_cleansing_field_command_AuraScript : public AuraScript + class spell_hydross_cleansing_field_command_AuraScript : public AuraScript + { + PrepareAuraScript(spell_hydross_cleansing_field_command_AuraScript) + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_hydross_cleansing_field_command_AuraScript) - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (GetTarget()->HasUnitState(UNIT_STATE_CASTING)) - GetTarget()->InterruptNonMeleeSpells(false); - else - GetTarget()->CastSpell(GetTarget(), SPELL_BLUE_BEAM, true); - } - - void Register() - { - AfterEffectRemove += AuraEffectApplyFn(spell_hydross_cleansing_field_command_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_hydross_cleansing_field_command_AuraScript(); + if (GetTarget()->HasUnitState(UNIT_STATE_CASTING)) + GetTarget()->InterruptNonMeleeSpells(false); + else + GetTarget()->CastSpell(GetTarget(), SPELL_BLUE_BEAM, true); } + + void Register() + { + AfterEffectRemove += AuraEffectApplyFn(spell_hydross_cleansing_field_command_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_hydross_cleansing_field_command_AuraScript(); + } }; class spell_hydross_mark_of_hydross : public SpellScriptLoader { - public: - spell_hydross_mark_of_hydross() : SpellScriptLoader("spell_hydross_mark_of_hydross") { } +public: + spell_hydross_mark_of_hydross() : SpellScriptLoader("spell_hydross_mark_of_hydross") { } - class spell_hydross_mark_of_hydross_AuraScript : public AuraScript + class spell_hydross_mark_of_hydross_AuraScript : public AuraScript + { + PrepareAuraScript(spell_hydross_mark_of_hydross_AuraScript) + + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_hydross_mark_of_hydross_AuraScript) - - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetTarget()->RemoveAurasByType(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, GetCasterGUID(), GetAura()); - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_hydross_mark_of_hydross_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_hydross_mark_of_hydross_AuraScript(); + GetTarget()->RemoveAurasByType(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, GetCasterGUID(), GetAura()); } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_hydross_mark_of_hydross_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_hydross_mark_of_hydross_AuraScript(); + } }; void AddSC_boss_hydross_the_unstable() 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 9b6aae37d..a08938bee 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp @@ -31,7 +31,7 @@ enum Spells SPELL_MAGIC_BARRIER = 38112, SPELL_FORKED_LIGHTNING = 38145, - SPELL_SUMMON_ENCHANTED_ELEMENTAL= 38017, + SPELL_SUMMON_ENCHANTED_ELEMENTAL = 38017, SPELL_SUMMON_COILFANG_ELITE = 38248, SPELL_SUMMON_COILFANG_STRIDER = 38241, SPELL_SUMMON_TAINTED_ELEMENTAL = 38140, @@ -69,217 +69,217 @@ enum Misc class startFollow : public BasicEvent { - public: - startFollow(Unit* owner) : _owner(owner) { } +public: + startFollow(Unit* owner) : _owner(owner) { } - bool Execute(uint64 /*execTime*/, uint32 /*diff*/) - { - if (InstanceScript* instance = _owner->GetInstanceScript()) - if (Creature* vashj = ObjectAccessor::GetCreature(*_owner, instance->GetData64(NPC_LADY_VASHJ))) - _owner->GetMotionMaster()->MoveFollow(vashj, 3.0f, vashj->GetAngle(_owner), MOTION_SLOT_CONTROLLED); - return true; - } + bool Execute(uint64 /*execTime*/, uint32 /*diff*/) + { + if (InstanceScript* instance = _owner->GetInstanceScript()) + if (Creature* vashj = ObjectAccessor::GetCreature(*_owner, instance->GetData64(NPC_LADY_VASHJ))) + _owner->GetMotionMaster()->MoveFollow(vashj, 3.0f, vashj->GetAngle(_owner), MOTION_SLOT_CONTROLLED); + return true; + } - private: - Unit* _owner; +private: + Unit* _owner; }; class boss_lady_vashj : public CreatureScript { - public: - boss_lady_vashj() : CreatureScript("boss_lady_vashj") { } +public: + boss_lady_vashj() : CreatureScript("boss_lady_vashj") { } - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } + + struct boss_lady_vashjAI : public BossAI + { + boss_lady_vashjAI(Creature* creature) : BossAI(creature, DATA_LADY_VASHJ) { - return GetInstanceAI(creature); + intro = false; } - struct boss_lady_vashjAI : public BossAI + bool intro; + int32 count; + + void Reset() { - boss_lady_vashjAI(Creature* creature) : BossAI(creature, DATA_LADY_VASHJ) + count = 0; + BossAI::Reset(); + } + + void KilledUnit(Unit* /*victim*/) + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) { - intro = false; + Talk(SAY_SLAY); + events.ScheduleEvent(EVENT_KILL_TALK, 6000); + } + } + + void JustDied(Unit* killer) + { + Talk(SAY_DEATH); + BossAI::JustDied(killer); + } + + void EnterCombat(Unit* who) + { + BossAI::EnterCombat(who); + Talk(SAY_AGGRO); + + me->CastSpell(me, SPELL_REMOVE_TAINTED_CORES, true); + events.ScheduleEvent(EVENT_SPELL_SHOCK_BLAST, 10000); + events.ScheduleEvent(EVENT_SPELL_STATIC_CHARGE, 15000); + events.ScheduleEvent(EVENT_SPELL_ENTANGLE, 20000); + events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); + } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + if (summon->GetEntry() == WORLD_TRIGGER) + summon->CastSpell(summon, SPELL_MAGIC_BARRIER, false); + else if (summon->GetEntry() == NPC_ENCHANTED_ELEMENTAL) + { + summon->SetWalk(true); + summon->m_Events.AddEvent(new startFollow(summon), summon->m_Events.CalculateTime(0)); + } + else if (summon->GetEntry() == NPC_TOXIC_SPOREBAT) + summon->GetMotionMaster()->MoveRandom(30.0f); + else if (summon->GetEntry() != NPC_TAINTED_ELEMENTAL) + summon->GetMotionMaster()->MovePoint(POINT_HOME, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), true, true); + } + + void MoveInLineOfSight(Unit* who) + { + if (!intro && who->GetTypeId() == TYPEID_PLAYER) + { + intro = true; + Talk(SAY_INTRO); } - bool intro; - int32 count; + BossAI::MoveInLineOfSight(who); + } - void Reset() + void MovementInform(uint32 type, uint32 id) + { + if (type != POINT_MOTION_TYPE || id != POINT_HOME) + return; + + me->SetFacingTo(me->GetHomePosition().GetOrientation()); + instance->SetData(DATA_ACTIVATE_SHIELD, 0); + events.Reset(); + events.ScheduleEvent(EVENT_SPELL_FORKED_LIGHTNING, 3000); + events.ScheduleEvent(EVENT_SUMMON_A, 0); + events.ScheduleEvent(EVENT_SUMMON_B, 45000); + events.ScheduleEvent(EVENT_SUMMON_C, 60000); + events.ScheduleEvent(EVENT_SUMMON_D, 50000); + events.ScheduleEvent(EVENT_CHECK_HEALTH2, 1000); + } + + void UpdateAI(uint32 diff) + { + EnterEvadeIfOutOfCombatArea(); + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) { - count = 0; - BossAI::Reset(); + case EVENT_SPELL_SHOCK_BLAST: + me->CastSpell(me->GetVictim(), SPELL_SHOCK_BLAST, false); + events.ScheduleEvent(EVENT_SPELL_SHOCK_BLAST, urand(10000, 20000)); + break; + case EVENT_SPELL_STATIC_CHARGE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f)) + me->CastSpell(target, SPELL_STATIC_CHARGE, false); + events.ScheduleEvent(EVENT_SPELL_STATIC_CHARGE, 20000); + break; + case EVENT_SPELL_ENTANGLE: + me->CastSpell(me, SPELL_ENTANGLE, false); + events.ScheduleEvent(EVENT_SPELL_ENTANGLE, 30000); + break; + case EVENT_CHECK_HEALTH: + if (me->HealthBelowPct(71)) + { + Talk(SAY_PHASE2); + me->SetReactState(REACT_PASSIVE); + me->GetMotionMaster()->MovePoint(POINT_HOME, me->GetHomePosition().GetPositionX(), me->GetHomePosition().GetPositionY(), me->GetHomePosition().GetPositionZ(), true, true); + break; + } + events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); + break; + case EVENT_SPELL_FORKED_LIGHTNING: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 60.0f)) + me->CastSpell(target, SPELL_FORKED_LIGHTNING, false); + events.ScheduleEvent(EVENT_SPELL_FORKED_LIGHTNING, urand(2500, 5000)); + break; + case EVENT_SUMMON_A: + me->CastSpell(me, SPELL_SUMMON_ENCHANTED_ELEMENTAL, true); + events.ScheduleEvent(EVENT_SUMMON_A, 2500); + break; + case EVENT_SUMMON_B: + me->CastSpell(me, SPELL_SUMMON_COILFANG_ELITE, true); + events.ScheduleEvent(EVENT_SUMMON_B, 45000); + break; + case EVENT_SUMMON_C: + me->CastSpell(me, SPELL_SUMMON_COILFANG_STRIDER, true); + events.ScheduleEvent(EVENT_SUMMON_C, 60000); + break; + case EVENT_SUMMON_D: + me->CastSpell(me, SPELL_SUMMON_TAINTED_ELEMENTAL, true); + events.ScheduleEvent(EVENT_SUMMON_D, 50000); + break; + case EVENT_CHECK_HEALTH2: + if (!me->HasAura(SPELL_MAGIC_BARRIER)) + { + Talk(SAY_PHASE3); + me->SetReactState(REACT_AGGRESSIVE); + me->GetMotionMaster()->MoveChase(me->GetVictim()); + events.Reset(); + events.ScheduleEvent(EVENT_SPELL_SHOCK_BLAST, 10000); + events.ScheduleEvent(EVENT_SPELL_STATIC_CHARGE, 15000); + events.ScheduleEvent(EVENT_SPELL_ENTANGLE, 20000); + events.ScheduleEvent(EVENT_SUMMON_SPOREBAT, 5000); + break; + } + events.ScheduleEvent(EVENT_CHECK_HEALTH2, 1000); + break; + case EVENT_SUMMON_SPOREBAT: + me->CastSpell(me, SPELL_SUMMON_TOXIC_SPOREBAT, true); + events.ScheduleEvent(EVENT_SUMMON_SPOREBAT, 20000 - 1000 * std::min(count++, 16)); + break; } - void KilledUnit(Unit* /*victim*/) + if (me->GetReactState() != REACT_AGGRESSIVE || !me->isAttackReady()) + return; + + if (!me->IsWithinMeleeRange(me->GetVictim())) { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(SAY_SLAY); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); - } + me->resetAttackTimer(); + me->SetSheath(SHEATH_STATE_RANGED); + me->CastSpell(me->GetVictim(), roll_chance_i(33) ? SPELL_MULTI_SHOT : SPELL_SHOOT, false); + if (roll_chance_i(15)) + Talk(SAY_BOWSHOT); } - - void JustDied(Unit* killer) + else { - Talk(SAY_DEATH); - BossAI::JustDied(killer); + me->SetSheath(SHEATH_STATE_MELEE); + DoMeleeAttackIfReady(); } + } - void EnterCombat(Unit* who) - { - BossAI::EnterCombat(who); - Talk(SAY_AGGRO); - - me->CastSpell(me, SPELL_REMOVE_TAINTED_CORES, true); - events.ScheduleEvent(EVENT_SPELL_SHOCK_BLAST, 10000); - events.ScheduleEvent(EVENT_SPELL_STATIC_CHARGE, 15000); - events.ScheduleEvent(EVENT_SPELL_ENTANGLE, 20000); - events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); - } - - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - if (summon->GetEntry() == WORLD_TRIGGER) - summon->CastSpell(summon, SPELL_MAGIC_BARRIER, false); - else if (summon->GetEntry() == NPC_ENCHANTED_ELEMENTAL) - { - summon->SetWalk(true); - summon->m_Events.AddEvent(new startFollow(summon), summon->m_Events.CalculateTime(0)); - } - else if (summon->GetEntry() == NPC_TOXIC_SPOREBAT) - summon->GetMotionMaster()->MoveRandom(30.0f); - else if (summon->GetEntry() != NPC_TAINTED_ELEMENTAL) - summon->GetMotionMaster()->MovePoint(POINT_HOME, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), true, true); - } - - void MoveInLineOfSight(Unit* who) - { - if (!intro && who->GetTypeId() == TYPEID_PLAYER) - { - intro = true; - Talk(SAY_INTRO); - } - - BossAI::MoveInLineOfSight(who); - } - - void MovementInform(uint32 type, uint32 id) - { - if (type != POINT_MOTION_TYPE || id != POINT_HOME) - return; - - me->SetFacingTo(me->GetHomePosition().GetOrientation()); - instance->SetData(DATA_ACTIVATE_SHIELD, 0); - events.Reset(); - events.ScheduleEvent(EVENT_SPELL_FORKED_LIGHTNING, 3000); - events.ScheduleEvent(EVENT_SUMMON_A, 0); - events.ScheduleEvent(EVENT_SUMMON_B, 45000); - events.ScheduleEvent(EVENT_SUMMON_C, 60000); - events.ScheduleEvent(EVENT_SUMMON_D, 50000); - events.ScheduleEvent(EVENT_CHECK_HEALTH2, 1000); - } - - void UpdateAI(uint32 diff) - { - EnterEvadeIfOutOfCombatArea(); - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_SHOCK_BLAST: - me->CastSpell(me->GetVictim(), SPELL_SHOCK_BLAST, false); - events.ScheduleEvent(EVENT_SPELL_SHOCK_BLAST, urand(10000, 20000)); - break; - case EVENT_SPELL_STATIC_CHARGE: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f)) - me->CastSpell(target, SPELL_STATIC_CHARGE, false); - events.ScheduleEvent(EVENT_SPELL_STATIC_CHARGE, 20000); - break; - case EVENT_SPELL_ENTANGLE: - me->CastSpell(me, SPELL_ENTANGLE, false); - events.ScheduleEvent(EVENT_SPELL_ENTANGLE, 30000); - break; - case EVENT_CHECK_HEALTH: - if (me->HealthBelowPct(71)) - { - Talk(SAY_PHASE2); - me->SetReactState(REACT_PASSIVE); - me->GetMotionMaster()->MovePoint(POINT_HOME, me->GetHomePosition().GetPositionX(), me->GetHomePosition().GetPositionY(), me->GetHomePosition().GetPositionZ(), true, true); - break; - } - events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); - break; - case EVENT_SPELL_FORKED_LIGHTNING: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 60.0f)) - me->CastSpell(target, SPELL_FORKED_LIGHTNING, false); - events.ScheduleEvent(EVENT_SPELL_FORKED_LIGHTNING, urand(2500, 5000)); - break; - case EVENT_SUMMON_A: - me->CastSpell(me, SPELL_SUMMON_ENCHANTED_ELEMENTAL, true); - events.ScheduleEvent(EVENT_SUMMON_A, 2500); - break; - case EVENT_SUMMON_B: - me->CastSpell(me, SPELL_SUMMON_COILFANG_ELITE, true); - events.ScheduleEvent(EVENT_SUMMON_B, 45000); - break; - case EVENT_SUMMON_C: - me->CastSpell(me, SPELL_SUMMON_COILFANG_STRIDER, true); - events.ScheduleEvent(EVENT_SUMMON_C, 60000); - break; - case EVENT_SUMMON_D: - me->CastSpell(me, SPELL_SUMMON_TAINTED_ELEMENTAL, true); - events.ScheduleEvent(EVENT_SUMMON_D, 50000); - break; - case EVENT_CHECK_HEALTH2: - if (!me->HasAura(SPELL_MAGIC_BARRIER)) - { - Talk(SAY_PHASE3); - me->SetReactState(REACT_AGGRESSIVE); - me->GetMotionMaster()->MoveChase(me->GetVictim()); - events.Reset(); - events.ScheduleEvent(EVENT_SPELL_SHOCK_BLAST, 10000); - events.ScheduleEvent(EVENT_SPELL_STATIC_CHARGE, 15000); - events.ScheduleEvent(EVENT_SPELL_ENTANGLE, 20000); - events.ScheduleEvent(EVENT_SUMMON_SPOREBAT, 5000); - break; - } - events.ScheduleEvent(EVENT_CHECK_HEALTH2, 1000); - break; - case EVENT_SUMMON_SPOREBAT: - me->CastSpell(me, SPELL_SUMMON_TOXIC_SPOREBAT, true); - events.ScheduleEvent(EVENT_SUMMON_SPOREBAT, 20000 - 1000*std::min(count++, 16)); - break; - } - - if (me->GetReactState() != REACT_AGGRESSIVE || !me->isAttackReady()) - return; - - if (!me->IsWithinMeleeRange(me->GetVictim())) - { - me->resetAttackTimer(); - me->SetSheath(SHEATH_STATE_RANGED); - me->CastSpell(me->GetVictim(), roll_chance_i(33) ? SPELL_MULTI_SHOT : SPELL_SHOOT, false); - if (roll_chance_i(15)) - Talk(SAY_BOWSHOT); - } - else - { - me->SetSheath(SHEATH_STATE_MELEE); - DoMeleeAttackIfReady(); - } - } - - bool CheckEvadeIfOutOfCombatArea() const - { - return me->GetHomePosition().GetExactDist2d(me) > 80.0f || !SelectTargetFromPlayerList(100.0f); - } - }; + bool CheckEvadeIfOutOfCombatArea() const + { + return me->GetHomePosition().GetExactDist2d(me) > 80.0f || !SelectTargetFromPlayerList(100.0f); + } + }; }; /* @@ -384,111 +384,111 @@ public: class spell_lady_vashj_magic_barrier : public SpellScriptLoader { - public: - spell_lady_vashj_magic_barrier() : SpellScriptLoader("spell_lady_vashj_magic_barrier") { } +public: + spell_lady_vashj_magic_barrier() : SpellScriptLoader("spell_lady_vashj_magic_barrier") { } - class spell_lady_vashj_magic_barrier_AuraScript : public AuraScript + class spell_lady_vashj_magic_barrier_AuraScript : public AuraScript + { + PrepareAuraScript(spell_lady_vashj_magic_barrier_AuraScript) + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_lady_vashj_magic_barrier_AuraScript) - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit::DealDamage(GetTarget(), GetTarget(), GetTarget()->CountPctFromMaxHealth(5)); - } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_lady_vashj_magic_barrier_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_SCHOOL_IMMUNITY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_lady_vashj_magic_barrier_AuraScript(); + Unit::DealDamage(GetTarget(), GetTarget(), GetTarget()->CountPctFromMaxHealth(5)); } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_lady_vashj_magic_barrier_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_SCHOOL_IMMUNITY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_lady_vashj_magic_barrier_AuraScript(); + } }; class spell_lady_vashj_remove_tainted_cores : public SpellScriptLoader { - public: - spell_lady_vashj_remove_tainted_cores() : SpellScriptLoader("spell_lady_vashj_remove_tainted_cores") { } +public: + spell_lady_vashj_remove_tainted_cores() : SpellScriptLoader("spell_lady_vashj_remove_tainted_cores") { } - class spell_lady_vashj_remove_tainted_cores_SpellScript : public SpellScript + class spell_lady_vashj_remove_tainted_cores_SpellScript : public SpellScript + { + PrepareSpellScript(spell_lady_vashj_remove_tainted_cores_SpellScript); + + void HandleScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_lady_vashj_remove_tainted_cores_SpellScript); - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Player* target = GetHitPlayer()) - target->DestroyItemCount(ITEM_TAINTED_CORE, -1, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_lady_vashj_remove_tainted_cores_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_lady_vashj_remove_tainted_cores_SpellScript(); + PreventHitDefaultEffect(effIndex); + if (Player* target = GetHitPlayer()) + target->DestroyItemCount(ITEM_TAINTED_CORE, -1, true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_lady_vashj_remove_tainted_cores_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_lady_vashj_remove_tainted_cores_SpellScript(); + } }; class spell_lady_vashj_summon_sporebat : public SpellScriptLoader { - public: - spell_lady_vashj_summon_sporebat() : SpellScriptLoader("spell_lady_vashj_summon_sporebat") { } +public: + spell_lady_vashj_summon_sporebat() : SpellScriptLoader("spell_lady_vashj_summon_sporebat") { } - class spell_lady_vashj_summon_sporebat_SpellScript : public SpellScript + class spell_lady_vashj_summon_sporebat_SpellScript : public SpellScript + { + PrepareSpellScript(spell_lady_vashj_summon_sporebat_SpellScript); + + void HandleScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_lady_vashj_summon_sporebat_SpellScript); - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetCaster()->CastSpell(GetCaster(), RAND(SPELL_SUMMON_SPOREBAT1, SPELL_SUMMON_SPOREBAT2, SPELL_SUMMON_SPOREBAT3, SPELL_SUMMON_SPOREBAT4), true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_lady_vashj_summon_sporebat_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_lady_vashj_summon_sporebat_SpellScript(); + PreventHitDefaultEffect(effIndex); + GetCaster()->CastSpell(GetCaster(), RAND(SPELL_SUMMON_SPOREBAT1, SPELL_SUMMON_SPOREBAT2, SPELL_SUMMON_SPOREBAT3, SPELL_SUMMON_SPOREBAT4), true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_lady_vashj_summon_sporebat_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_lady_vashj_summon_sporebat_SpellScript(); + } }; class spell_lady_vashj_spore_drop_effect : public SpellScriptLoader { - public: - spell_lady_vashj_spore_drop_effect() : SpellScriptLoader("spell_lady_vashj_spore_drop_effect") { } +public: + spell_lady_vashj_spore_drop_effect() : SpellScriptLoader("spell_lady_vashj_spore_drop_effect") { } - class spell_lady_vashj_spore_drop_effect_SpellScript : public SpellScript + class spell_lady_vashj_spore_drop_effect_SpellScript : public SpellScript + { + PrepareSpellScript(spell_lady_vashj_spore_drop_effect_SpellScript); + + void HandleScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_lady_vashj_spore_drop_effect_SpellScript); - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - target->CastSpell(target, SPELL_TOXIC_SPORES, true, nullptr, nullptr, GetCaster()->GetGUID()); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_lady_vashj_spore_drop_effect_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_lady_vashj_spore_drop_effect_SpellScript(); + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) + target->CastSpell(target, SPELL_TOXIC_SPORES, true, nullptr, nullptr, GetCaster()->GetGUID()); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_lady_vashj_spore_drop_effect_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_lady_vashj_spore_drop_effect_SpellScript(); + } }; void AddSC_boss_lady_vashj() 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 c69605e46..2365a82e9 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 @@ -60,7 +60,7 @@ enum Misc EVENT_SPELL_SHADOW_BOLT = 20 }; -const Position channelersPos[MAX_CHANNELERS] = +const Position channelersPos[MAX_CHANNELERS] = { {367.11f, -421.48f, 29.52f, 5.0f}, {380.11f, -435.48f, 29.52f, 2.5f}, @@ -69,437 +69,437 @@ const Position channelersPos[MAX_CHANNELERS] = class boss_leotheras_the_blind : public CreatureScript { - public: - boss_leotheras_the_blind() : CreatureScript("boss_leotheras_the_blind") { } +public: + boss_leotheras_the_blind() : CreatureScript("boss_leotheras_the_blind") { } - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } + + struct boss_leotheras_the_blindAI : public BossAI + { + boss_leotheras_the_blindAI(Creature* creature) : BossAI(creature, DATA_LEOTHERAS_THE_BLIND) { - return GetInstanceAI(creature); } - struct boss_leotheras_the_blindAI : public BossAI + void Reset() { - boss_leotheras_the_blindAI(Creature* creature) : BossAI(creature, DATA_LEOTHERAS_THE_BLIND) + BossAI::Reset(); + me->CastSpell(me, SPELL_CLEAR_CONSUMING_MADNESS, true); + me->CastSpell(me, SPELL_DUAL_WIELD, true); + me->SetStandState(UNIT_STAND_STATE_KNEEL); + me->LoadEquipment(0, true); + me->SetReactState(REACT_PASSIVE); + } + + void InitializeAI() + { + BossAI::InitializeAI(); + SummonChannelers(); + } + + void JustReachedHome() + { + BossAI::JustReachedHome(); + SummonChannelers(); + } + + void SummonChannelers() + { + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_BANISH, false); + me->CastSpell(me, SPELL_BANISH, true); + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_BANISH, true); + + summons.DespawnAll(); + for (uint8 i = 0; i < MAX_CHANNELERS; ++i) + me->SummonCreature(NPC_GREYHEART_SPELLBINDER, channelersPos[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000); + } + + void MoveInLineOfSight(Unit* /*who*/) { } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + } + + void SummonedCreatureDies(Creature* summon, Unit*) + { + me->SetInCombatWithZone(); + summons.Despawn(summon); + if (summon->GetEntry() == NPC_GREYHEART_SPELLBINDER) + if (!summons.HasEntry(NPC_GREYHEART_SPELLBINDER)) + { + me->RemoveAllAuras(); + me->LoadEquipment(); + me->SetReactState(REACT_AGGRESSIVE); + me->SetStandState(UNIT_STAND_STATE_STAND); + Talk(SAY_AGGRO); + + events.ScheduleEvent(EVENT_SPELL_BERSERK, 600000); + events.ScheduleEvent(EVENT_HEALTH_CHECK, 1000); + events.ScheduleEvent(EVENT_SWITCH_TO_DEMON, 55000); + events.ScheduleEvent(EVENT_SPELL_WHIRLWIND, 10000); + } + } + + void KilledUnit(Unit* /*victim*/) + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) { + Talk(me->GetDisplayId() != me->GetNativeDisplayId() ? SAY_DEMON_SLAY : SAY_NIGHTELF_SLAY); + events.ScheduleEvent(EVENT_KILL_TALK, 6000); } + } - void Reset() + void JustDied(Unit* killer) + { + me->CastSpell(me, SPELL_CLEAR_CONSUMING_MADNESS, true); + Talk(SAY_DEATH); + BossAI::JustDied(killer); + } + + void EnterCombat(Unit* who) + { + BossAI::EnterCombat(who); + me->SetStandState(UNIT_STAND_STATE_KNEEL); + } + + void AttackStart(Unit* who) + { + if (who && me->Attack(who, true)) + me->GetMotionMaster()->MoveChase(who, me->GetDisplayId() == me->GetNativeDisplayId() ? 0.0f : 25.0f); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) { - BossAI::Reset(); - me->CastSpell(me, SPELL_CLEAR_CONSUMING_MADNESS, true); - me->CastSpell(me, SPELL_DUAL_WIELD, true); - me->SetStandState(UNIT_STAND_STATE_KNEEL); - me->LoadEquipment(0, true); - me->SetReactState(REACT_PASSIVE); - } - - void InitializeAI() - { - BossAI::InitializeAI(); - SummonChannelers(); - } - - void JustReachedHome() - { - BossAI::JustReachedHome(); - SummonChannelers(); - } - - void SummonChannelers() - { - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_BANISH, false); - me->CastSpell(me, SPELL_BANISH, true); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_BANISH, true); - - summons.DespawnAll(); - for (uint8 i = 0; i < MAX_CHANNELERS; ++i) - me->SummonCreature(NPC_GREYHEART_SPELLBINDER, channelersPos[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000); - } - - void MoveInLineOfSight(Unit* /*who*/) { } - - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - } - - void SummonedCreatureDies(Creature* summon, Unit*) - { - me->SetInCombatWithZone(); - summons.Despawn(summon); - if (summon->GetEntry() == NPC_GREYHEART_SPELLBINDER) - if (!summons.HasEntry(NPC_GREYHEART_SPELLBINDER)) + case EVENT_SPELL_BERSERK: + me->CastSpell(me, SPELL_BERSERK, true); + break; + case EVENT_HEALTH_CHECK: + if (me->HealthBelowPct(15)) { - me->RemoveAllAuras(); - me->LoadEquipment(); - me->SetReactState(REACT_AGGRESSIVE); - me->SetStandState(UNIT_STAND_STATE_STAND); - Talk(SAY_AGGRO); - - events.ScheduleEvent(EVENT_SPELL_BERSERK, 600000); - events.ScheduleEvent(EVENT_HEALTH_CHECK, 1000); - events.ScheduleEvent(EVENT_SWITCH_TO_DEMON, 55000); - events.ScheduleEvent(EVENT_SPELL_WHIRLWIND, 10000); - } - } - - void KilledUnit(Unit* /*victim*/) - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(me->GetDisplayId() != me->GetNativeDisplayId() ? SAY_DEMON_SLAY : SAY_NIGHTELF_SLAY); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); - } - } - - void JustDied(Unit* killer) - { - me->CastSpell(me, SPELL_CLEAR_CONSUMING_MADNESS, true); - Talk(SAY_DEATH); - BossAI::JustDied(killer); - } - - void EnterCombat(Unit* who) - { - BossAI::EnterCombat(who); - me->SetStandState(UNIT_STAND_STATE_KNEEL); - } - - void AttackStart(Unit* who) - { - if (who && me->Attack(who, true)) - me->GetMotionMaster()->MoveChase(who, me->GetDisplayId() == me->GetNativeDisplayId() ? 0.0f : 25.0f); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_BERSERK: - me->CastSpell(me, SPELL_BERSERK, true); - break; - case EVENT_HEALTH_CHECK: - if (me->HealthBelowPct(15)) + if (me->GetDisplayId() != me->GetNativeDisplayId()) { - if (me->GetDisplayId() != me->GetNativeDisplayId()) - { - DoResetThreat(); - me->LoadEquipment(); - me->RemoveAurasDueToSpell(SPELL_METAMORPHOSIS); - events.ScheduleEvent(EVENT_SPELL_WHIRLWIND, 10000); - } - events.CancelEvent(EVENT_SWITCH_TO_DEMON); - events.CancelEvent(EVENT_SPELL_INSIDIOUS_WHISPER); - events.DelayEvents(10000); - events.ScheduleEvent(EVENT_SUMMON_DEMON, 4000); - events.ScheduleEvent(EVENT_RESTORE_FIGHT, 6000); - me->SetStandState(UNIT_STAND_STATE_KNEEL); - me->SetReactState(REACT_PASSIVE); - me->GetMotionMaster()->Clear(); - me->StopMoving(); - Talk(SAY_FINAL_FORM); - break; + DoResetThreat(); + me->LoadEquipment(); + me->RemoveAurasDueToSpell(SPELL_METAMORPHOSIS); + events.ScheduleEvent(EVENT_SPELL_WHIRLWIND, 10000); } - events.ScheduleEvent(EVENT_HEALTH_CHECK, 1000); + events.CancelEvent(EVENT_SWITCH_TO_DEMON); + events.CancelEvent(EVENT_SPELL_INSIDIOUS_WHISPER); + events.DelayEvents(10000); + events.ScheduleEvent(EVENT_SUMMON_DEMON, 4000); + events.ScheduleEvent(EVENT_RESTORE_FIGHT, 6000); + me->SetStandState(UNIT_STAND_STATE_KNEEL); + me->SetReactState(REACT_PASSIVE); + me->GetMotionMaster()->Clear(); + me->StopMoving(); + Talk(SAY_FINAL_FORM); break; - case EVENT_SWITCH_TO_DEMON: - DoResetThreat(); - Talk(SAY_SWITCH_TO_DEMON); - me->LoadEquipment(0, true); - me->GetMotionMaster()->MoveChase(me->GetVictim(), 25.0f); - me->CastSpell(me, SPELL_METAMORPHOSIS, true); + } + events.ScheduleEvent(EVENT_HEALTH_CHECK, 1000); + break; + case EVENT_SWITCH_TO_DEMON: + DoResetThreat(); + Talk(SAY_SWITCH_TO_DEMON); + me->LoadEquipment(0, true); + me->GetMotionMaster()->MoveChase(me->GetVictim(), 25.0f); + me->CastSpell(me, SPELL_METAMORPHOSIS, true); - events.CancelEvent(EVENT_SPELL_WHIRLWIND); - events.ScheduleEvent(EVENT_SPELL_INSIDIOUS_WHISPER, 25000); - events.ScheduleEvent(EVENT_SWITCH_TO_ELF, 60000); - break; - case EVENT_SWITCH_TO_ELF: - DoResetThreat(); - me->LoadEquipment(); - me->GetMotionMaster()->MoveChase(me->GetVictim(), 0.0f); - me->RemoveAurasDueToSpell(SPELL_METAMORPHOSIS); - events.ScheduleEvent(EVENT_SWITCH_TO_DEMON, 55000); - events.ScheduleEvent(EVENT_SPELL_WHIRLWIND, 10000); - break; - case EVENT_SPELL_WHIRLWIND: - me->CastSpell(me, SPELL_WHIRLWIND, false); - events.ScheduleEvent(EVENT_SPELL_WHIRLWIND, 27000); - break; - case EVENT_SPELL_INSIDIOUS_WHISPER: - Talk(SAY_INNER_DEMONS); - me->CastCustomSpell(SPELL_INSIDIOUS_WHISPER, SPELLVALUE_MAX_TARGETS, 5, me, false); - break; - case EVENT_SUMMON_DEMON: - me->CastSpell(me, SPELL_SUMMON_SHADOW_OF_LEOTHERAS, true); - break; - case EVENT_RESTORE_FIGHT: - me->SetStandState(UNIT_STAND_STATE_STAND); - me->SetReactState(REACT_AGGRESSIVE); - me->GetMotionMaster()->MoveChase(me->GetVictim()); - break; - } - - if (me->GetDisplayId() == me->GetNativeDisplayId()) - DoMeleeAttackIfReady(); - else if (me->isAttackReady(BASE_ATTACK)) - { - me->CastSpell(me->GetVictim(), SPELL_CHAOS_BLAST, false); - me->setAttackTimer(BASE_ATTACK, 2000); - } + events.CancelEvent(EVENT_SPELL_WHIRLWIND); + events.ScheduleEvent(EVENT_SPELL_INSIDIOUS_WHISPER, 25000); + events.ScheduleEvent(EVENT_SWITCH_TO_ELF, 60000); + break; + case EVENT_SWITCH_TO_ELF: + DoResetThreat(); + me->LoadEquipment(); + me->GetMotionMaster()->MoveChase(me->GetVictim(), 0.0f); + me->RemoveAurasDueToSpell(SPELL_METAMORPHOSIS); + events.ScheduleEvent(EVENT_SWITCH_TO_DEMON, 55000); + events.ScheduleEvent(EVENT_SPELL_WHIRLWIND, 10000); + break; + case EVENT_SPELL_WHIRLWIND: + me->CastSpell(me, SPELL_WHIRLWIND, false); + events.ScheduleEvent(EVENT_SPELL_WHIRLWIND, 27000); + break; + case EVENT_SPELL_INSIDIOUS_WHISPER: + Talk(SAY_INNER_DEMONS); + me->CastCustomSpell(SPELL_INSIDIOUS_WHISPER, SPELLVALUE_MAX_TARGETS, 5, me, false); + break; + case EVENT_SUMMON_DEMON: + me->CastSpell(me, SPELL_SUMMON_SHADOW_OF_LEOTHERAS, true); + break; + case EVENT_RESTORE_FIGHT: + me->SetStandState(UNIT_STAND_STATE_STAND); + me->SetReactState(REACT_AGGRESSIVE); + me->GetMotionMaster()->MoveChase(me->GetVictim()); + break; } - }; + + if (me->GetDisplayId() == me->GetNativeDisplayId()) + DoMeleeAttackIfReady(); + else if (me->isAttackReady(BASE_ATTACK)) + { + me->CastSpell(me->GetVictim(), SPELL_CHAOS_BLAST, false); + me->setAttackTimer(BASE_ATTACK, 2000); + } + } + }; }; class npc_inner_demon : public CreatureScript { - public: - npc_inner_demon() : CreatureScript("npc_inner_demon") { } +public: + npc_inner_demon() : CreatureScript("npc_inner_demon") { } - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const + { + return new npc_inner_demonAI(creature); + } + + struct npc_inner_demonAI : public ScriptedAI + { + npc_inner_demonAI(Creature* creature) : ScriptedAI(creature) { - return new npc_inner_demonAI(creature); } - struct npc_inner_demonAI : public ScriptedAI + uint64 ownerGUID; + EventMap events; + + void EnterEvadeMode() { - npc_inner_demonAI(Creature* creature) : ScriptedAI(creature) + me->DespawnOrUnsummon(1); + } + + void IsSummonedBy(Unit* summoner) + { + if (!summoner) + return; + + ownerGUID = summoner->GetGUID(); + events.Reset(); + events.ScheduleEvent(EVENT_SPELL_SHADOW_BOLT, 4000); + } + + void JustDied(Unit* /*killer*/) + { + if (Unit* unit = ObjectAccessor::GetUnit(*me, ownerGUID)) + unit->RemoveAurasDueToSpell(SPELL_INSIDIOUS_WHISPER); + } + + void DamageTaken(Unit* who, uint32& damage, DamageEffectType, SpellSchoolMask) + { + if (!who || who->GetGUID() != ownerGUID) + damage = 0; + } + + bool CanAIAttack(const Unit* who) const + { + return who->GetGUID() == ownerGUID; + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) { + case EVENT_SPELL_SHADOW_BOLT: + me->CastSpell(me->GetVictim(), SPELL_SHADOW_BOLT, false); + events.ScheduleEvent(EVENT_SPELL_SHADOW_BOLT, 6000); + break; } - uint64 ownerGUID; - EventMap events; - - void EnterEvadeMode() - { - me->DespawnOrUnsummon(1); - } - - void IsSummonedBy(Unit* summoner) - { - if (!summoner) - return; - - ownerGUID = summoner->GetGUID(); - events.Reset(); - events.ScheduleEvent(EVENT_SPELL_SHADOW_BOLT, 4000); - } - - void JustDied(Unit* /*killer*/) - { - if (Unit* unit = ObjectAccessor::GetUnit(*me, ownerGUID)) - unit->RemoveAurasDueToSpell(SPELL_INSIDIOUS_WHISPER); - } - - void DamageTaken(Unit* who, uint32& damage, DamageEffectType, SpellSchoolMask) - { - if (!who || who->GetGUID() != ownerGUID) - damage = 0; - } - - bool CanAIAttack(const Unit* who) const - { - return who->GetGUID() == ownerGUID; - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_SHADOW_BOLT: - me->CastSpell(me->GetVictim(), SPELL_SHADOW_BOLT, false); - events.ScheduleEvent(EVENT_SPELL_SHADOW_BOLT, 6000); - break; - } - - DoMeleeAttackIfReady(); - } - }; + DoMeleeAttackIfReady(); + } + }; }; class spell_leotheras_whirlwind : public SpellScriptLoader { - public: - spell_leotheras_whirlwind() : SpellScriptLoader("spell_leotheras_whirlwind") { } +public: + spell_leotheras_whirlwind() : SpellScriptLoader("spell_leotheras_whirlwind") { } - class spell_leotheras_whirlwind_SpellScript : public SpellScript + class spell_leotheras_whirlwind_SpellScript : public SpellScript + { + PrepareSpellScript(spell_leotheras_whirlwind_SpellScript); + + void HandleScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_leotheras_whirlwind_SpellScript); + PreventHitDefaultEffect(effIndex); + GetCaster()->getThreatManager().resetAllAggro(); - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetCaster()->getThreatManager().resetAllAggro(); + if (roll_chance_i(33)) + if (Unit* target = GetCaster()->GetAI()->SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true)) + target->CastSpell(GetCaster(), SPELL_TAUNT, true); - if (roll_chance_i(33)) - if (Unit* target = GetCaster()->GetAI()->SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true)) - target->CastSpell(GetCaster(), SPELL_TAUNT, true); - - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_leotheras_whirlwind_SpellScript::HandleScriptEffect, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_leotheras_whirlwind_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_leotheras_whirlwind_SpellScript::HandleScriptEffect, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_leotheras_whirlwind_SpellScript(); + } }; class spell_leotheras_chaos_blast : public SpellScriptLoader { - public: - spell_leotheras_chaos_blast() : SpellScriptLoader("spell_leotheras_chaos_blast") { } +public: + spell_leotheras_chaos_blast() : SpellScriptLoader("spell_leotheras_chaos_blast") { } - class spell_leotheras_chaos_blast_SpellScript : public SpellScript + class spell_leotheras_chaos_blast_SpellScript : public SpellScript + { + PrepareSpellScript(spell_leotheras_chaos_blast_SpellScript); + + void HandleDummy(SpellEffIndex effIndex) { - PrepareSpellScript(spell_leotheras_chaos_blast_SpellScript); - - void HandleDummy(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - GetCaster()->CastSpell(target, SPELL_CHAOS_BLAST_TRIGGER, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_leotheras_chaos_blast_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_leotheras_chaos_blast_SpellScript(); + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) + GetCaster()->CastSpell(target, SPELL_CHAOS_BLAST_TRIGGER, true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_leotheras_chaos_blast_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_leotheras_chaos_blast_SpellScript(); + } }; class spell_leotheras_insidious_whisper : public SpellScriptLoader { - public: - spell_leotheras_insidious_whisper() : SpellScriptLoader("spell_leotheras_insidious_whisper") { } +public: + spell_leotheras_insidious_whisper() : SpellScriptLoader("spell_leotheras_insidious_whisper") { } - class spell_leotheras_insidious_whisper_SpellScript : public SpellScript + class spell_leotheras_insidious_whisper_SpellScript : public SpellScript + { + PrepareSpellScript(spell_leotheras_insidious_whisper_SpellScript); + + void FilterTargets(std::list& unitList) { - PrepareSpellScript(spell_leotheras_insidious_whisper_SpellScript); - - void FilterTargets(std::list& unitList) - { - if (Unit* victim = GetCaster()->GetVictim()) - unitList.remove_if(acore::ObjectGUIDCheck(victim->GetGUID(), true)); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_leotheras_insidious_whisper_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_leotheras_insidious_whisper_SpellScript(); + if (Unit* victim = GetCaster()->GetVictim()) + unitList.remove_if(acore::ObjectGUIDCheck(victim->GetGUID(), true)); } - class spell_leotheras_insidious_whisper_AuraScript : public AuraScript + void Register() { - PrepareAuraScript(spell_leotheras_insidious_whisper_AuraScript) - - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_INNER_DEMON, true); - } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEFAULT) - if (InstanceScript* instance = GetUnitOwner()->GetInstanceScript()) - if (Creature* leotheras = ObjectAccessor::GetCreature(*GetUnitOwner(), instance->GetData64(NPC_LEOTHERAS_THE_BLIND))) - leotheras->CastSpell(GetUnitOwner(), SPELL_CONSUMING_MADNESS, true); - } - - void Register() - { - AfterEffectApply += AuraEffectApplyFn(spell_leotheras_insidious_whisper_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_leotheras_insidious_whisper_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_leotheras_insidious_whisper_AuraScript(); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_leotheras_insidious_whisper_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); } + }; + + SpellScript* GetSpellScript() const + { + return new spell_leotheras_insidious_whisper_SpellScript(); + } + + class spell_leotheras_insidious_whisper_AuraScript : public AuraScript + { + PrepareAuraScript(spell_leotheras_insidious_whisper_AuraScript) + + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_INNER_DEMON, true); + } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEFAULT) + if (InstanceScript* instance = GetUnitOwner()->GetInstanceScript()) + if (Creature* leotheras = ObjectAccessor::GetCreature(*GetUnitOwner(), instance->GetData64(NPC_LEOTHERAS_THE_BLIND))) + leotheras->CastSpell(GetUnitOwner(), SPELL_CONSUMING_MADNESS, true); + } + + void Register() + { + AfterEffectApply += AuraEffectApplyFn(spell_leotheras_insidious_whisper_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_leotheras_insidious_whisper_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_leotheras_insidious_whisper_AuraScript(); + } }; class spell_leotheras_demon_link : public SpellScriptLoader { - public: - spell_leotheras_demon_link() : SpellScriptLoader("spell_leotheras_demon_link") { } +public: + spell_leotheras_demon_link() : SpellScriptLoader("spell_leotheras_demon_link") { } - class spell_leotheras_demon_link_AuraScript : public AuraScript + class spell_leotheras_demon_link_AuraScript : public AuraScript + { + PrepareAuraScript(spell_leotheras_demon_link_AuraScript); + + void OnPeriodic(AuraEffect const* aurEff) { - PrepareAuraScript(spell_leotheras_demon_link_AuraScript); - - void OnPeriodic(AuraEffect const* aurEff) - { - PreventDefaultAction(); - if (Unit* victim = GetUnitOwner()->GetVictim()) - GetUnitOwner()->CastSpell(victim, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_leotheras_demon_link_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_leotheras_demon_link_AuraScript(); + PreventDefaultAction(); + if (Unit* victim = GetUnitOwner()->GetVictim()) + GetUnitOwner()->CastSpell(victim, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_leotheras_demon_link_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_leotheras_demon_link_AuraScript(); + } }; class spell_leotheras_clear_consuming_madness : public SpellScriptLoader { - public: - spell_leotheras_clear_consuming_madness() : SpellScriptLoader("spell_leotheras_clear_consuming_madness") { } +public: + spell_leotheras_clear_consuming_madness() : SpellScriptLoader("spell_leotheras_clear_consuming_madness") { } - class spell_leotheras_clear_consuming_madness_SpellScript : public SpellScript + class spell_leotheras_clear_consuming_madness_SpellScript : public SpellScript + { + PrepareSpellScript(spell_leotheras_clear_consuming_madness_SpellScript); + + void HandleScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_leotheras_clear_consuming_madness_SpellScript); - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - Unit::Kill(GetCaster(), target); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_leotheras_clear_consuming_madness_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_leotheras_clear_consuming_madness_SpellScript(); + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) + Unit::Kill(GetCaster(), target); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_leotheras_clear_consuming_madness_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_leotheras_clear_consuming_madness_SpellScript(); + } }; void AddSC_boss_leotheras_the_blind() 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 f7a4e716c..388268f0c 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp @@ -48,257 +48,257 @@ const Position positions[MAX_SUMMONS] = class boss_the_lurker_below : public CreatureScript { - public: - boss_the_lurker_below() : CreatureScript("boss_the_lurker_below") { } +public: + boss_the_lurker_below() : CreatureScript("boss_the_lurker_below") { } - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } + + struct boss_the_lurker_belowAI : public BossAI + { + boss_the_lurker_belowAI(Creature* creature) : BossAI(creature, DATA_THE_LURKER_BELOW) { } + + void Reset() override { - return GetInstanceAI(creature); + BossAI::Reset(); + me->SetReactState(REACT_PASSIVE); + me->SetStandState(UNIT_STAND_STATE_SUBMERGED); + me->SetVisible(false); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + + // Reset summons + summons.DespawnAll(); } - struct boss_the_lurker_belowAI : public BossAI + void JustSummoned(Creature* summon) override { - boss_the_lurker_belowAI(Creature* creature) : BossAI(creature, DATA_THE_LURKER_BELOW) { } + summon->SetInCombatWithZone(); + summons.Summon(summon); + } - void Reset() override + void DoAction(int32 param) override + { + if (param == ACTION_START_EVENT) { - BossAI::Reset(); - me->SetReactState(REACT_PASSIVE); - me->SetStandState(UNIT_STAND_STATE_SUBMERGED); - me->SetVisible(false); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - - // Reset summons - summons.DespawnAll(); + me->SetReactState(REACT_AGGRESSIVE); + me->setAttackTimer(BASE_ATTACK, 6000); + me->SetVisible(true); + me->UpdateObjectVisibility(true); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->SetStandState(UNIT_STAND_STATE_STAND); + me->SetInCombatWithZone(); } + } - void JustSummoned(Creature* summon) override - { - summon->SetInCombatWithZone(); - summons.Summon(summon); - } + void JustDied(Unit* killer) override + { + BossAI::JustDied(killer); + } - void DoAction(int32 param) override + void AttackStart(Unit* who) override + { + if (who && me->GetReactState() == REACT_AGGRESSIVE) + me->Attack(who, true); + } + + void EnterCombat(Unit* /*who*/) override + { + events.ScheduleEvent(EVENT_SPELL_WHIRL, 18000); + events.ScheduleEvent(EVENT_SPELL_SPOUT, 45000); + events.ScheduleEvent(EVENT_SPELL_GEYSER, 10000); + events.ScheduleEvent(EVENT_PHASE_2, 125000); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + events.Update(diff); + + switch (events.ExecuteEvent()) { - if (param == ACTION_START_EVENT) - { - me->SetReactState(REACT_AGGRESSIVE); + case EVENT_SPELL_WHIRL: + me->CastSpell(me, SPELL_WHIRL, false); + events.ScheduleEvent(EVENT_SPELL_WHIRL, 18000); + break; + case EVENT_SPELL_GEYSER: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + me->CastSpell(target, SPELL_GEYSER, false); + events.ScheduleEvent(EVENT_SPELL_GEYSER, 10000); + break; + case EVENT_SPELL_SPOUT: + Talk(EMOTE_TAKE_BREATH); + me->CastSpell(me, SPELL_SPOUT_VISUAL, TRIGGERED_IGNORE_SET_FACING); + me->SetReactState(REACT_PASSIVE); + me->SetFacingToObject(me->GetVictim()); + me->SetTarget(0); + events.ScheduleEvent(EVENT_SPELL_SPOUT, 60000); + events.RescheduleEvent(EVENT_SPELL_WHIRL, 18000); + events.RescheduleEvent(EVENT_SPELL_GEYSER, 25000); + events.ScheduleEvent(EVENT_SPELL_SPOUT_PERIODIC, 3000); + break; + case EVENT_SPELL_SPOUT_PERIODIC: + me->InterruptNonMeleeSpells(false); + me->CastSpell(me, SPELL_SPOUT_PERIODIC, true); + break; + case EVENT_PHASE_2: + events.Reset(); + events.ScheduleEvent(EVENT_PHASE_1, 60000); + me->SetStandState(UNIT_STAND_STATE_SUBMERGED); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + for (uint8 i = 0; i < MAX_SUMMONS; ++i) + me->SummonCreature(i < 6 ? NPC_COILFANG_AMBUSHER : NPC_COILFANG_GUARDIAN, positions[i].GetPositionX(), positions[i].GetPositionY(), positions[i].GetPositionZ(), positions[i].GetAngle(me), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); + break; + case EVENT_PHASE_1: me->setAttackTimer(BASE_ATTACK, 6000); - me->SetVisible(true); - me->UpdateObjectVisibility(true); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetStandState(UNIT_STAND_STATE_STAND); - me->SetInCombatWithZone(); - } + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + + events.Reset(); + events.ScheduleEvent(EVENT_SPELL_SPOUT, 10000); + events.ScheduleEvent(EVENT_PHASE_2, 120000); + break; } - void JustDied(Unit* killer) override + if (me->getStandState() != UNIT_STAND_STATE_STAND || !me->isAttackReady() || me->GetReactState() != REACT_AGGRESSIVE) + return; + + Unit* target = nullptr; + if (me->IsWithinMeleeRange(me->GetVictim())) + target = me->GetVictim(); + else { - BossAI::JustDied(killer); + ThreatContainer::StorageType const& t_list = me->getThreatManager().getThreatList(); + for (ThreatContainer::StorageType::const_iterator itr = t_list.begin(); itr != t_list.end(); ++itr) + if (Unit* threatTarget = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid())) + if (me->IsWithinMeleeRange(threatTarget)) + { + target = threatTarget; + break; + } } - void AttackStart(Unit* who) override - { - if (who && me->GetReactState() == REACT_AGGRESSIVE) - me->Attack(who, true); - } + if (target) + me->AttackerStateUpdate(target); + else if ((target = SelectTarget(SELECT_TARGET_RANDOM, 0))) + me->CastSpell(target, SPELL_WATER_BOLT, false); - void EnterCombat(Unit* /*who*/) override - { - events.ScheduleEvent(EVENT_SPELL_WHIRL, 18000); - events.ScheduleEvent(EVENT_SPELL_SPOUT, 45000); - events.ScheduleEvent(EVENT_SPELL_GEYSER, 10000); - events.ScheduleEvent(EVENT_PHASE_2, 125000); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - events.Update(diff); - - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_WHIRL: - me->CastSpell(me, SPELL_WHIRL, false); - events.ScheduleEvent(EVENT_SPELL_WHIRL, 18000); - break; - case EVENT_SPELL_GEYSER: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - me->CastSpell(target, SPELL_GEYSER, false); - events.ScheduleEvent(EVENT_SPELL_GEYSER, 10000); - break; - case EVENT_SPELL_SPOUT: - Talk(EMOTE_TAKE_BREATH); - me->CastSpell(me, SPELL_SPOUT_VISUAL, TRIGGERED_IGNORE_SET_FACING); - me->SetReactState(REACT_PASSIVE); - me->SetFacingToObject(me->GetVictim()); - me->SetTarget(0); - events.ScheduleEvent(EVENT_SPELL_SPOUT, 60000); - events.RescheduleEvent(EVENT_SPELL_WHIRL, 18000); - events.RescheduleEvent(EVENT_SPELL_GEYSER, 25000); - events.ScheduleEvent(EVENT_SPELL_SPOUT_PERIODIC, 3000); - break; - case EVENT_SPELL_SPOUT_PERIODIC: - me->InterruptNonMeleeSpells(false); - me->CastSpell(me, SPELL_SPOUT_PERIODIC, true); - break; - case EVENT_PHASE_2: - events.Reset(); - events.ScheduleEvent(EVENT_PHASE_1, 60000); - me->SetStandState(UNIT_STAND_STATE_SUBMERGED); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - for (uint8 i = 0; i < MAX_SUMMONS; ++i) - me->SummonCreature(i < 6 ? NPC_COILFANG_AMBUSHER : NPC_COILFANG_GUARDIAN, positions[i].GetPositionX(), positions[i].GetPositionY(), positions[i].GetPositionZ(), positions[i].GetAngle(me), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); - break; - case EVENT_PHASE_1: - me->setAttackTimer(BASE_ATTACK, 6000); - me->SetStandState(UNIT_STAND_STATE_STAND); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - - events.Reset(); - events.ScheduleEvent(EVENT_SPELL_SPOUT, 10000); - events.ScheduleEvent(EVENT_PHASE_2, 120000); - break; - } - - if (me->getStandState() != UNIT_STAND_STATE_STAND || !me->isAttackReady() || me->GetReactState() != REACT_AGGRESSIVE) - return; - - Unit* target = nullptr; - if (me->IsWithinMeleeRange(me->GetVictim())) - target = me->GetVictim(); - else - { - ThreatContainer::StorageType const &t_list = me->getThreatManager().getThreatList(); - for (ThreatContainer::StorageType::const_iterator itr = t_list.begin(); itr!= t_list.end(); ++itr) - if (Unit* threatTarget = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid())) - if (me->IsWithinMeleeRange(threatTarget)) - { - target = threatTarget; - break; - } - } - - if (target) - me->AttackerStateUpdate(target); - else if ((target = SelectTarget(SELECT_TARGET_RANDOM, 0))) - me->CastSpell(target, SPELL_WATER_BOLT, false); - - me->resetAttackTimer(); - } - }; + me->resetAttackTimer(); + } + }; }; class go_strange_pool : public GameObjectScript { - public: - go_strange_pool() : GameObjectScript("go_strange_pool") { } +public: + go_strange_pool() : GameObjectScript("go_strange_pool") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - if (InstanceScript* instance = go->GetInstanceScript()) - if (roll_chance_i(instance->GetBossState(DATA_THE_LURKER_BELOW) != DONE ? 25 : 0) && !instance->IsEncounterInProgress()) - { - player->CastSpell(player, SPELL_LURKER_SPAWN_TRIGGER, true); - if (Creature* lurker = ObjectAccessor::GetCreature(*go, instance->GetData64(NPC_THE_LURKER_BELOW))) - lurker->AI()->DoAction(ACTION_START_EVENT); - return true; - } + bool OnGossipHello(Player* player, GameObject* go) override + { + if (InstanceScript* instance = go->GetInstanceScript()) + if (roll_chance_i(instance->GetBossState(DATA_THE_LURKER_BELOW) != DONE ? 25 : 0) && !instance->IsEncounterInProgress()) + { + player->CastSpell(player, SPELL_LURKER_SPAWN_TRIGGER, true); + if (Creature* lurker = ObjectAccessor::GetCreature(*go, instance->GetData64(NPC_THE_LURKER_BELOW))) + lurker->AI()->DoAction(ACTION_START_EVENT); + return true; + } - return false; - } + return false; + } }; class spell_lurker_below_spout : public SpellScriptLoader { - public: - spell_lurker_below_spout() : SpellScriptLoader("spell_lurker_below_spout") { } +public: + spell_lurker_below_spout() : SpellScriptLoader("spell_lurker_below_spout") { } - class spell_lurker_below_spout_AuraScript : public AuraScript + class spell_lurker_below_spout_AuraScript : public AuraScript + { + PrepareAuraScript(spell_lurker_below_spout_AuraScript); + + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_lurker_below_spout_AuraScript); - - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - SetDuration(13000); - } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Creature* creature = GetUnitOwner()->ToCreature()) - { - creature->resetAttackTimer(); - creature->SetReactState(REACT_AGGRESSIVE); - if (Unit* target = creature->GetVictim()) - creature->SetTarget(target->GetGUID()); - } - } - - void OnPeriodic(AuraEffect const* aurEff) - { - PreventDefaultAction(); - GetUnitOwner()->SetFacingTo(Position::NormalizeOrientation(GetUnitOwner()->GetOrientation()+0.1f)); - GetUnitOwner()->CastSpell(GetUnitOwner(), aurEff->GetAmount(), true); - - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_lurker_below_spout_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_lurker_below_spout_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_lurker_below_spout_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_lurker_below_spout_AuraScript(); + SetDuration(13000); } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Creature* creature = GetUnitOwner()->ToCreature()) + { + creature->resetAttackTimer(); + creature->SetReactState(REACT_AGGRESSIVE); + if (Unit* target = creature->GetVictim()) + creature->SetTarget(target->GetGUID()); + } + } + + void OnPeriodic(AuraEffect const* aurEff) + { + PreventDefaultAction(); + GetUnitOwner()->SetFacingTo(Position::NormalizeOrientation(GetUnitOwner()->GetOrientation() + 0.1f)); + GetUnitOwner()->CastSpell(GetUnitOwner(), aurEff->GetAmount(), true); + + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_lurker_below_spout_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_lurker_below_spout_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_lurker_below_spout_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_lurker_below_spout_AuraScript(); + } }; class HasInLineCheck { - public: - HasInLineCheck(Unit* caster) : _caster(caster) { } +public: + HasInLineCheck(Unit* caster) : _caster(caster) { } - bool operator()(WorldObject* unit) - { - return !_caster->HasInLine(unit, 5.0f) || (unit->GetTypeId() == TYPEID_UNIT && unit->ToUnit()->IsUnderWater()); - } + bool operator()(WorldObject* unit) + { + return !_caster->HasInLine(unit, 5.0f) || (unit->GetTypeId() == TYPEID_UNIT && unit->ToUnit()->IsUnderWater()); + } - private: - Unit* _caster; +private: + Unit* _caster; }; class spell_lurker_below_spout_cone : public SpellScriptLoader { - public: - spell_lurker_below_spout_cone() : SpellScriptLoader("spell_lurker_below_spout_cone") { } +public: + spell_lurker_below_spout_cone() : SpellScriptLoader("spell_lurker_below_spout_cone") { } - class spell_lurker_below_spout_cone_SpellScript : public SpellScript + class spell_lurker_below_spout_cone_SpellScript : public SpellScript + { + PrepareSpellScript(spell_lurker_below_spout_cone_SpellScript); + + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_lurker_below_spout_cone_SpellScript); - - void FilterTargets(std::list& targets) - { - targets.remove_if(HasInLineCheck(GetCaster())); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_lurker_below_spout_cone_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_CONE_ENEMY_24); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_lurker_below_spout_cone_SpellScript(); + targets.remove_if(HasInLineCheck(GetCaster())); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_lurker_below_spout_cone_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_CONE_ENEMY_24); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_lurker_below_spout_cone_SpellScript(); + } }; void AddSC_boss_the_lurker_below() diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp index 2af6529e1..40771c451 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp @@ -53,181 +53,181 @@ const uint32 waterGlobuleId[4] = {SPELL_SUMMON_WATER_GLOBULE_1, SPELL_SUMMON_WAT class boss_morogrim_tidewalker : public CreatureScript { - public: - boss_morogrim_tidewalker() : CreatureScript("boss_morogrim_tidewalker") { } +public: + boss_morogrim_tidewalker() : CreatureScript("boss_morogrim_tidewalker") { } - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } + + struct boss_morogrim_tidewalkerAI : public BossAI + { + boss_morogrim_tidewalkerAI(Creature* creature) : BossAI(creature, DATA_MOROGRIM_TIDEWALKER) { - return GetInstanceAI(creature); } - struct boss_morogrim_tidewalkerAI : public BossAI + void Reset() { - boss_morogrim_tidewalkerAI(Creature* creature) : BossAI(creature, DATA_MOROGRIM_TIDEWALKER) + BossAI::Reset(); + } + + void KilledUnit(Unit*) + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) { + Talk(SAY_SLAY); + events.ScheduleEvent(EVENT_KILL_TALK, 6000); + } + } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + summon->SetInCombatWithZone(); + } + + void JustDied(Unit* killer) + { + Talk(SAY_DEATH); + BossAI::JustDied(killer); + } + + void EnterCombat(Unit* who) + { + BossAI::EnterCombat(who); + Talk(SAY_AGGRO); + + events.ScheduleEvent(EVENT_SPELL_TIDAL_WAVE, 10000); + events.ScheduleEvent(EVENT_SPELL_WATERY_GRAVE, 28000); + events.ScheduleEvent(EVENT_SPELL_EARTHQUAKE, 40000); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_SPELL_TIDAL_WAVE: + me->CastSpell(me->GetVictim(), SPELL_TIDAL_WAVE, false); + events.ScheduleEvent(EVENT_SPELL_TIDAL_WAVE, 20000); + break; + case EVENT_SPELL_WATERY_GRAVE: + Talk(SAY_SUMMON_BUBLE); + if (me->HealthAbovePct(25)) + { + Talk(EMOTE_WATERY_GRAVE); + me->CastCustomSpell(SPELL_WATERY_GRAVE, SPELLVALUE_MAX_TARGETS, 4, me, false); + } + else + { + Talk(EMOTE_WATERY_GLOBULES); + for (uint8 i = 0; i < 4; ++i) + me->CastSpell(me, waterGlobuleId[i], true); + } + events.ScheduleEvent(EVENT_SPELL_WATERY_GRAVE, 25000); + break; + case EVENT_SPELL_EARTHQUAKE: + Talk(EMOTE_EARTHQUAKE); + me->CastSpell(me, SPELL_EARTHQUAKE, false); + events.ScheduleEvent(EVENT_SPELL_EARTHQUAKE, urand(45000, 60000)); + events.ScheduleEvent(EVENT_SUMMON_MURLOCS, 8000); + break; + case EVENT_SUMMON_MURLOCS: + Talk(SAY_SUMMON); + for (uint32 i = SPELL_SUMMON_MURLOC1; i < SPELL_SUMMON_MURLOC1 + 11; ++i) + me->CastSpell(me, i, true); + break; } - void Reset() - { - BossAI::Reset(); - } - - void KilledUnit(Unit*) - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(SAY_SLAY); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); - } - } - - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - summon->SetInCombatWithZone(); - } - - void JustDied(Unit* killer) - { - Talk(SAY_DEATH); - BossAI::JustDied(killer); - } - - void EnterCombat(Unit* who) - { - BossAI::EnterCombat(who); - Talk(SAY_AGGRO); - - events.ScheduleEvent(EVENT_SPELL_TIDAL_WAVE, 10000); - events.ScheduleEvent(EVENT_SPELL_WATERY_GRAVE, 28000); - events.ScheduleEvent(EVENT_SPELL_EARTHQUAKE, 40000); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_TIDAL_WAVE: - me->CastSpell(me->GetVictim(), SPELL_TIDAL_WAVE, false); - events.ScheduleEvent(EVENT_SPELL_TIDAL_WAVE, 20000); - break; - case EVENT_SPELL_WATERY_GRAVE: - Talk(SAY_SUMMON_BUBLE); - if (me->HealthAbovePct(25)) - { - Talk(EMOTE_WATERY_GRAVE); - me->CastCustomSpell(SPELL_WATERY_GRAVE, SPELLVALUE_MAX_TARGETS, 4, me, false); - } - else - { - Talk(EMOTE_WATERY_GLOBULES); - for (uint8 i = 0; i < 4; ++i) - me->CastSpell(me, waterGlobuleId[i], true); - } - events.ScheduleEvent(EVENT_SPELL_WATERY_GRAVE, 25000); - break; - case EVENT_SPELL_EARTHQUAKE: - Talk(EMOTE_EARTHQUAKE); - me->CastSpell(me, SPELL_EARTHQUAKE, false); - events.ScheduleEvent(EVENT_SPELL_EARTHQUAKE, urand(45000, 60000)); - events.ScheduleEvent(EVENT_SUMMON_MURLOCS, 8000); - break; - case EVENT_SUMMON_MURLOCS: - Talk(SAY_SUMMON); - for (uint32 i = SPELL_SUMMON_MURLOC1; i < SPELL_SUMMON_MURLOC1+11; ++i) - me->CastSpell(me, i, true); - break; - } - - DoMeleeAttackIfReady(); - } - }; + DoMeleeAttackIfReady(); + } + }; }; class spell_morogrim_tidewalker_watery_grave : public SpellScriptLoader { - public: - spell_morogrim_tidewalker_watery_grave() : SpellScriptLoader("spell_morogrim_tidewalker_watery_grave") { } +public: + spell_morogrim_tidewalker_watery_grave() : SpellScriptLoader("spell_morogrim_tidewalker_watery_grave") { } - class spell_morogrim_tidewalker_watery_grave_SpellScript : public SpellScript + class spell_morogrim_tidewalker_watery_grave_SpellScript : public SpellScript + { + PrepareSpellScript(spell_morogrim_tidewalker_watery_grave_SpellScript); + + bool Load() { - PrepareSpellScript(spell_morogrim_tidewalker_watery_grave_SpellScript); - - bool Load() - { - targetNumber = 0; - return true; - } - - void HandleDummy(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - if (targetNumber < 4) - GetCaster()->CastSpell(target, wateryGraveId[targetNumber++], true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_morogrim_tidewalker_watery_grave_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - - private: - uint8 targetNumber; - }; - - SpellScript* GetSpellScript() const - { - return new spell_morogrim_tidewalker_watery_grave_SpellScript(); + targetNumber = 0; + return true; } + + void HandleDummy(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) + if (targetNumber < 4) + GetCaster()->CastSpell(target, wateryGraveId[targetNumber++], true); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_morogrim_tidewalker_watery_grave_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + + private: + uint8 targetNumber; + }; + + SpellScript* GetSpellScript() const + { + return new spell_morogrim_tidewalker_watery_grave_SpellScript(); + } }; class spell_morogrim_tidewalker_water_globule_new_target : public SpellScriptLoader { - public: - spell_morogrim_tidewalker_water_globule_new_target() : SpellScriptLoader("spell_morogrim_tidewalker_water_globule_new_target") { } +public: + spell_morogrim_tidewalker_water_globule_new_target() : SpellScriptLoader("spell_morogrim_tidewalker_water_globule_new_target") { } - class spell_morogrim_tidewalker_water_globule_new_target_SpellScript : public SpellScript + class spell_morogrim_tidewalker_water_globule_new_target_SpellScript : public SpellScript + { + PrepareSpellScript(spell_morogrim_tidewalker_water_globule_new_target_SpellScript); + + void FilterTargets(std::list& unitList) { - PrepareSpellScript(spell_morogrim_tidewalker_water_globule_new_target_SpellScript); - - void FilterTargets(std::list& unitList) - { - acore::Containers::RandomResizeList(unitList, 1); - } - - void HandleDummy(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - - // Xinef: if we have target we currently follow, return - if (Unit* target = GetCaster()->GetVictim()) - if (GetCaster()->getThreatManager().getThreat(target) >= 100000.0f) - return; - - // Xinef: acquire new target - if (Unit* target = GetHitUnit()) - GetCaster()->AddThreat(target, 1000000.0f); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_morogrim_tidewalker_water_globule_new_target_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - OnEffectHitTarget += SpellEffectFn(spell_morogrim_tidewalker_water_globule_new_target_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_morogrim_tidewalker_water_globule_new_target_SpellScript(); + acore::Containers::RandomResizeList(unitList, 1); } + + void HandleDummy(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + + // Xinef: if we have target we currently follow, return + if (Unit* target = GetCaster()->GetVictim()) + if (GetCaster()->getThreatManager().getThreat(target) >= 100000.0f) + return; + + // Xinef: acquire new target + if (Unit* target = GetHitUnit()) + GetCaster()->AddThreat(target, 1000000.0f); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_morogrim_tidewalker_water_globule_new_target_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_morogrim_tidewalker_water_globule_new_target_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_morogrim_tidewalker_water_globule_new_target_SpellScript(); + } }; void AddSC_boss_morogrim_tidewalker() diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp index c32192265..1131b8bb8 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp @@ -18,381 +18,381 @@ DoorData const doorData[] = class instance_serpent_shrine : public InstanceMapScript { - public: - instance_serpent_shrine() : InstanceMapScript("instance_serpent_shrine", 548) { } +public: + instance_serpent_shrine() : InstanceMapScript("instance_serpent_shrine", 548) { } - struct instance_serpentshrine_cavern_InstanceMapScript : public InstanceScript + struct instance_serpentshrine_cavern_InstanceMapScript : public InstanceScript + { + instance_serpentshrine_cavern_InstanceMapScript(Map* map) : InstanceScript(map) { - instance_serpentshrine_cavern_InstanceMapScript(Map* map) : InstanceScript(map) - { - } - - void Initialize() - { - SetBossNumber(MAX_ENCOUNTERS); - LoadDoorData(doorData); - - LadyVashjGUID = 0; - memset(&ShieldGeneratorGUID, 0, sizeof(ShieldGeneratorGUID)); - AliveKeepersCount = 0; - LeotherasTheBlindGUID = 0; - LurkerBelowGUID = 0; - } - - bool SetBossState(uint32 type, EncounterState state) - { - if (!InstanceScript::SetBossState(type, state)) - return false; - - if (type == DATA_LADY_VASHJ) - for (uint8 i = 0; i < 4; ++i) - if (GameObject* gobject = instance->GetGameObject(ShieldGeneratorGUID[i])) - gobject->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - - return true; - } - - void OnGameObjectCreate(GameObject* go) - { - switch (go->GetEntry()) - { - case GO_LADY_VASHJ_BRIDGE_CONSOLE: - case GO_COILFANG_BRIDGE1: - case GO_COILFANG_BRIDGE2: - case GO_COILFANG_BRIDGE3: - AddDoor(go, true); - break; - case GO_SHIELD_GENERATOR1: - case GO_SHIELD_GENERATOR2: - case GO_SHIELD_GENERATOR3: - case GO_SHIELD_GENERATOR4: - ShieldGeneratorGUID[go->GetEntry()-GO_SHIELD_GENERATOR1] = go->GetGUID(); - break; - } - } - - void OnGameObjectRemove(GameObject* go) - { - switch (go->GetEntry()) - { - case GO_LADY_VASHJ_BRIDGE_CONSOLE: - case GO_COILFANG_BRIDGE1: - case GO_COILFANG_BRIDGE2: - case GO_COILFANG_BRIDGE3: - AddDoor(go, false); - break; - } - } - - void OnCreatureCreate(Creature* creature) - { - switch (creature->GetEntry()) - { - case NPC_COILFANG_SHATTERER: - case NPC_COILFANG_PRIESTESS: - if (creature->GetPositionX() > -110.0f && creature->GetPositionX() < 155.0f && creature->GetPositionY() > -610.0f && creature->GetPositionY() < -280.0f) - AliveKeepersCount += creature->IsAlive() ? 0 : -1; // retarded SmartAI calls JUST_RESPAWNED in AIInit... - break; - case NPC_THE_LURKER_BELOW: - LurkerBelowGUID = creature->GetGUID(); - break; - case NPC_LEOTHERAS_THE_BLIND: - LeotherasTheBlindGUID = creature->GetGUID(); - break; - case NPC_CYCLONE_KARATHRESS: - creature->GetMotionMaster()->MoveRandom(50.0f); - break; - case NPC_LADY_VASHJ: - LadyVashjGUID = creature->GetGUID(); - break; - case NPC_ENCHANTED_ELEMENTAL: - case NPC_COILFANG_ELITE: - case NPC_COILFANG_STRIDER: - case NPC_TAINTED_ELEMENTAL: - if (Creature* vashj = instance->GetCreature(LadyVashjGUID)) - vashj->AI()->JustSummoned(creature); - break; - } - } - - uint64 GetData64(uint32 identifier) const - { - switch (identifier) - { - case NPC_THE_LURKER_BELOW: - return LurkerBelowGUID; - case NPC_LEOTHERAS_THE_BLIND: - return LeotherasTheBlindGUID; - case NPC_LADY_VASHJ: - return LadyVashjGUID; - } - return 0; - } - - void SetData(uint32 type, uint32 /*data*/) - { - switch (type) - { - case DATA_PLATFORM_KEEPER_RESPAWNED: - ++AliveKeepersCount; - break; - case DATA_PLATFORM_KEEPER_DIED: - --AliveKeepersCount; - break; - case DATA_BRIDGE_ACTIVATED: - SetBossState(DATA_BRIDGE_EMERGED, NOT_STARTED); - SetBossState(DATA_BRIDGE_EMERGED, DONE); - break; - case DATA_ACTIVATE_SHIELD: - if (Creature* vashj = instance->GetCreature(LadyVashjGUID)) - for (uint8 i = 0; i < 4; ++i) - if (GameObject* gobject = instance->GetGameObject(ShieldGeneratorGUID[i])) - { - gobject->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - vashj->SummonTrigger(gobject->GetPositionX(), gobject->GetPositionY(), gobject->GetPositionZ(), 0.0f, 0); - } - break; - } - } - - uint32 GetData(uint32 type) const - { - if (type == DATA_ALIVE_KEEPERS) - return AliveKeepersCount; - - return 0; - } - - std::string GetSaveData() - { - OUT_SAVE_INST_DATA; - - std::ostringstream saveStream; - saveStream << "S C " << GetBossSaveData(); - - OUT_SAVE_INST_DATA_COMPLETE; - return saveStream.str(); - } - - void Load(char const* str) - { - 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 == 'S' && dataHead2 == 'C') - { - for (uint8 i = 0; i < MAX_ENCOUNTERS; ++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; - } - - private: - uint64 LadyVashjGUID; - uint64 ShieldGeneratorGUID[4]; - uint64 LurkerBelowGUID; - uint64 LeotherasTheBlindGUID; - int32 AliveKeepersCount; - }; - - InstanceScript* GetInstanceScript(InstanceMap* map) const - { - return new instance_serpentshrine_cavern_InstanceMapScript(map); } + + void Initialize() + { + SetBossNumber(MAX_ENCOUNTERS); + LoadDoorData(doorData); + + LadyVashjGUID = 0; + memset(&ShieldGeneratorGUID, 0, sizeof(ShieldGeneratorGUID)); + AliveKeepersCount = 0; + LeotherasTheBlindGUID = 0; + LurkerBelowGUID = 0; + } + + bool SetBossState(uint32 type, EncounterState state) + { + if (!InstanceScript::SetBossState(type, state)) + return false; + + if (type == DATA_LADY_VASHJ) + for (uint8 i = 0; i < 4; ++i) + if (GameObject* gobject = instance->GetGameObject(ShieldGeneratorGUID[i])) + gobject->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + + return true; + } + + void OnGameObjectCreate(GameObject* go) + { + switch (go->GetEntry()) + { + case GO_LADY_VASHJ_BRIDGE_CONSOLE: + case GO_COILFANG_BRIDGE1: + case GO_COILFANG_BRIDGE2: + case GO_COILFANG_BRIDGE3: + AddDoor(go, true); + break; + case GO_SHIELD_GENERATOR1: + case GO_SHIELD_GENERATOR2: + case GO_SHIELD_GENERATOR3: + case GO_SHIELD_GENERATOR4: + ShieldGeneratorGUID[go->GetEntry() - GO_SHIELD_GENERATOR1] = go->GetGUID(); + break; + } + } + + void OnGameObjectRemove(GameObject* go) + { + switch (go->GetEntry()) + { + case GO_LADY_VASHJ_BRIDGE_CONSOLE: + case GO_COILFANG_BRIDGE1: + case GO_COILFANG_BRIDGE2: + case GO_COILFANG_BRIDGE3: + AddDoor(go, false); + break; + } + } + + void OnCreatureCreate(Creature* creature) + { + switch (creature->GetEntry()) + { + case NPC_COILFANG_SHATTERER: + case NPC_COILFANG_PRIESTESS: + if (creature->GetPositionX() > -110.0f && creature->GetPositionX() < 155.0f && creature->GetPositionY() > -610.0f && creature->GetPositionY() < -280.0f) + AliveKeepersCount += creature->IsAlive() ? 0 : -1; // retarded SmartAI calls JUST_RESPAWNED in AIInit... + break; + case NPC_THE_LURKER_BELOW: + LurkerBelowGUID = creature->GetGUID(); + break; + case NPC_LEOTHERAS_THE_BLIND: + LeotherasTheBlindGUID = creature->GetGUID(); + break; + case NPC_CYCLONE_KARATHRESS: + creature->GetMotionMaster()->MoveRandom(50.0f); + break; + case NPC_LADY_VASHJ: + LadyVashjGUID = creature->GetGUID(); + break; + case NPC_ENCHANTED_ELEMENTAL: + case NPC_COILFANG_ELITE: + case NPC_COILFANG_STRIDER: + case NPC_TAINTED_ELEMENTAL: + if (Creature* vashj = instance->GetCreature(LadyVashjGUID)) + vashj->AI()->JustSummoned(creature); + break; + } + } + + uint64 GetData64(uint32 identifier) const + { + switch (identifier) + { + case NPC_THE_LURKER_BELOW: + return LurkerBelowGUID; + case NPC_LEOTHERAS_THE_BLIND: + return LeotherasTheBlindGUID; + case NPC_LADY_VASHJ: + return LadyVashjGUID; + } + return 0; + } + + void SetData(uint32 type, uint32 /*data*/) + { + switch (type) + { + case DATA_PLATFORM_KEEPER_RESPAWNED: + ++AliveKeepersCount; + break; + case DATA_PLATFORM_KEEPER_DIED: + --AliveKeepersCount; + break; + case DATA_BRIDGE_ACTIVATED: + SetBossState(DATA_BRIDGE_EMERGED, NOT_STARTED); + SetBossState(DATA_BRIDGE_EMERGED, DONE); + break; + case DATA_ACTIVATE_SHIELD: + if (Creature* vashj = instance->GetCreature(LadyVashjGUID)) + for (uint8 i = 0; i < 4; ++i) + if (GameObject* gobject = instance->GetGameObject(ShieldGeneratorGUID[i])) + { + gobject->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + vashj->SummonTrigger(gobject->GetPositionX(), gobject->GetPositionY(), gobject->GetPositionZ(), 0.0f, 0); + } + break; + } + } + + uint32 GetData(uint32 type) const + { + if (type == DATA_ALIVE_KEEPERS) + return AliveKeepersCount; + + return 0; + } + + std::string GetSaveData() + { + OUT_SAVE_INST_DATA; + + std::ostringstream saveStream; + saveStream << "S C " << GetBossSaveData(); + + OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); + } + + void Load(char const* str) + { + 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 == 'S' && dataHead2 == 'C') + { + for (uint8 i = 0; i < MAX_ENCOUNTERS; ++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; + } + + private: + uint64 LadyVashjGUID; + uint64 ShieldGeneratorGUID[4]; + uint64 LurkerBelowGUID; + uint64 LeotherasTheBlindGUID; + int32 AliveKeepersCount; + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_serpentshrine_cavern_InstanceMapScript(map); + } }; class spell_serpentshrine_cavern_serpentshrine_parasite : public SpellScriptLoader { - public: - spell_serpentshrine_cavern_serpentshrine_parasite() : SpellScriptLoader("spell_serpentshrine_cavern_serpentshrine_parasite") { } +public: + spell_serpentshrine_cavern_serpentshrine_parasite() : SpellScriptLoader("spell_serpentshrine_cavern_serpentshrine_parasite") { } - class spell_serpentshrine_cavern_serpentshrine_parasite_AuraScript : public AuraScript + class spell_serpentshrine_cavern_serpentshrine_parasite_AuraScript : public AuraScript + { + PrepareAuraScript(spell_serpentshrine_cavern_serpentshrine_parasite_AuraScript) + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_serpentshrine_cavern_serpentshrine_parasite_AuraScript) - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (GetTarget()->GetInstanceScript() && GetTarget()->GetInstanceScript()->IsEncounterInProgress()) - GetTarget()->CastSpell(GetTarget(), SPELL_SUMMON_SERPENTSHRINE_PARASITE, true); - } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_serpentshrine_cavern_serpentshrine_parasite_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_serpentshrine_cavern_serpentshrine_parasite_AuraScript(); + if (GetTarget()->GetInstanceScript() && GetTarget()->GetInstanceScript()->IsEncounterInProgress()) + GetTarget()->CastSpell(GetTarget(), SPELL_SUMMON_SERPENTSHRINE_PARASITE, true); } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_serpentshrine_cavern_serpentshrine_parasite_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_serpentshrine_cavern_serpentshrine_parasite_AuraScript(); + } }; class spell_serpentshrine_cavern_serpentshrine_parasite_trigger : public SpellScriptLoader { - public: - spell_serpentshrine_cavern_serpentshrine_parasite_trigger() : SpellScriptLoader("spell_serpentshrine_cavern_serpentshrine_parasite_trigger") { } +public: + spell_serpentshrine_cavern_serpentshrine_parasite_trigger() : SpellScriptLoader("spell_serpentshrine_cavern_serpentshrine_parasite_trigger") { } - class spell_serpentshrine_cavern_serpentshrine_parasite_trigger_AuraScript : public AuraScript + class spell_serpentshrine_cavern_serpentshrine_parasite_trigger_AuraScript : public AuraScript + { + PrepareAuraScript(spell_serpentshrine_cavern_serpentshrine_parasite_trigger_AuraScript) + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_serpentshrine_cavern_serpentshrine_parasite_trigger_AuraScript) - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (GetTarget()->GetInstanceScript() && GetTarget()->GetInstanceScript()->IsEncounterInProgress()) - GetTarget()->CastSpell(GetTarget(), SPELL_SUMMON_SERPENTSHRINE_PARASITE, true); - } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_serpentshrine_cavern_serpentshrine_parasite_trigger_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_serpentshrine_cavern_serpentshrine_parasite_trigger_AuraScript(); + if (GetTarget()->GetInstanceScript() && GetTarget()->GetInstanceScript()->IsEncounterInProgress()) + GetTarget()->CastSpell(GetTarget(), SPELL_SUMMON_SERPENTSHRINE_PARASITE, true); } - class spell_serpentshrine_cavern_serpentshrine_parasite_trigger_SpellScript : public SpellScript + void Register() { - PrepareSpellScript(spell_serpentshrine_cavern_serpentshrine_parasite_trigger_SpellScript); - - void HandleApplyAura(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Creature* target = GetHitCreature()) - target->DespawnOrUnsummon(1); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_serpentshrine_cavern_serpentshrine_parasite_trigger_SpellScript::HandleApplyAura, EFFECT_0, SPELL_EFFECT_APPLY_AURA); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_serpentshrine_cavern_serpentshrine_parasite_trigger_SpellScript(); + AfterEffectRemove += AuraEffectRemoveFn(spell_serpentshrine_cavern_serpentshrine_parasite_trigger_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); } + }; + + AuraScript* GetAuraScript() const + { + return new spell_serpentshrine_cavern_serpentshrine_parasite_trigger_AuraScript(); + } + + class spell_serpentshrine_cavern_serpentshrine_parasite_trigger_SpellScript : public SpellScript + { + PrepareSpellScript(spell_serpentshrine_cavern_serpentshrine_parasite_trigger_SpellScript); + + void HandleApplyAura(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (Creature* target = GetHitCreature()) + target->DespawnOrUnsummon(1); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_serpentshrine_cavern_serpentshrine_parasite_trigger_SpellScript::HandleApplyAura, EFFECT_0, SPELL_EFFECT_APPLY_AURA); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_serpentshrine_cavern_serpentshrine_parasite_trigger_SpellScript(); + } }; class spell_serpentshrine_cavern_infection : public SpellScriptLoader { - public: - spell_serpentshrine_cavern_infection() : SpellScriptLoader("spell_serpentshrine_cavern_infection") { } +public: + spell_serpentshrine_cavern_infection() : SpellScriptLoader("spell_serpentshrine_cavern_infection") { } - class spell_serpentshrine_cavern_infection_AuraScript : public AuraScript + class spell_serpentshrine_cavern_infection_AuraScript : public AuraScript + { + PrepareAuraScript(spell_serpentshrine_cavern_infection_AuraScript) + + void HandleEffectRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_serpentshrine_cavern_infection_AuraScript) - - void HandleEffectRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE && GetTarget()->GetInstanceScript()) { - if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE && GetTarget()->GetInstanceScript()) - { - CustomSpellValues values; - values.AddSpellMod(SPELLVALUE_MAX_TARGETS, 1); - values.AddSpellMod(SPELLVALUE_BASE_POINT0, aurEff->GetAmount()+500); - values.AddSpellMod(SPELLVALUE_BASE_POINT1, aurEff->GetAmount()+500); - GetTarget()->CastCustomSpell(SPELL_RAMPART_INFECTION, values, GetTarget(), TRIGGERED_FULL_MASK, nullptr); - } + CustomSpellValues values; + values.AddSpellMod(SPELLVALUE_MAX_TARGETS, 1); + values.AddSpellMod(SPELLVALUE_BASE_POINT0, aurEff->GetAmount() + 500); + values.AddSpellMod(SPELLVALUE_BASE_POINT1, aurEff->GetAmount() + 500); + GetTarget()->CastCustomSpell(SPELL_RAMPART_INFECTION, values, GetTarget(), TRIGGERED_FULL_MASK, nullptr); } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_serpentshrine_cavern_infection_AuraScript::HandleEffectRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_serpentshrine_cavern_infection_AuraScript(); } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_serpentshrine_cavern_infection_AuraScript::HandleEffectRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_serpentshrine_cavern_infection_AuraScript(); + } }; class spell_serpentshrine_cavern_coilfang_water : public SpellScriptLoader { - public: - spell_serpentshrine_cavern_coilfang_water() : SpellScriptLoader("spell_serpentshrine_cavern_coilfang_water") { } +public: + spell_serpentshrine_cavern_coilfang_water() : SpellScriptLoader("spell_serpentshrine_cavern_coilfang_water") { } - class spell_serpentshrine_cavern_coilfang_water_AuraScript : public AuraScript + class spell_serpentshrine_cavern_coilfang_water_AuraScript : public AuraScript + { + PrepareAuraScript(spell_serpentshrine_cavern_coilfang_water_AuraScript) + + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_serpentshrine_cavern_coilfang_water_AuraScript) - - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (InstanceScript* instance = GetUnitOwner()->GetInstanceScript()) - if (instance->GetBossState(DATA_THE_LURKER_BELOW) != DONE) - if (instance->GetData(DATA_ALIVE_KEEPERS) == 0) - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SCALDING_WATER, true); - } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetUnitOwner()->RemoveAurasDueToSpell(SPELL_SCALDING_WATER); - } - - void CalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude) - { - InstanceScript* instance = GetUnitOwner()->GetInstanceScript(); - if (!instance || instance->GetBossState(DATA_THE_LURKER_BELOW) == DONE) - return; - - isPeriodic = true; - amplitude = 8*IN_MILLISECONDS; - } - - - void HandlePeriodic(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - InstanceScript* instance = GetUnitOwner()->GetInstanceScript(); - if (!instance || GetUnitOwner()->GetMapId() != 548) - { - SetDuration(0); - return; - } - - if (instance->GetBossState(DATA_THE_LURKER_BELOW) == DONE || instance->GetData(DATA_ALIVE_KEEPERS) == 0 || GetUnitOwner()->GetPositionZ() > -20.5f || !GetUnitOwner()->IsInWater()) - return; - - for (uint8 i = 0; i < 3; ++i) - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_FRENZY_WATER, true); - } - - void Register() - { - AfterEffectApply += AuraEffectApplyFn(spell_serpentshrine_cavern_coilfang_water_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_serpentshrine_cavern_coilfang_water_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - - DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_serpentshrine_cavern_coilfang_water_AuraScript::CalcPeriodic, EFFECT_0, SPELL_AURA_DUMMY); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_serpentshrine_cavern_coilfang_water_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_serpentshrine_cavern_coilfang_water_AuraScript(); + if (InstanceScript* instance = GetUnitOwner()->GetInstanceScript()) + if (instance->GetBossState(DATA_THE_LURKER_BELOW) != DONE) + if (instance->GetData(DATA_ALIVE_KEEPERS) == 0) + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SCALDING_WATER, true); } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetUnitOwner()->RemoveAurasDueToSpell(SPELL_SCALDING_WATER); + } + + void CalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude) + { + InstanceScript* instance = GetUnitOwner()->GetInstanceScript(); + if (!instance || instance->GetBossState(DATA_THE_LURKER_BELOW) == DONE) + return; + + isPeriodic = true; + amplitude = 8 * IN_MILLISECONDS; + } + + + void HandlePeriodic(AuraEffect const* /*aurEff*/) + { + PreventDefaultAction(); + InstanceScript* instance = GetUnitOwner()->GetInstanceScript(); + if (!instance || GetUnitOwner()->GetMapId() != 548) + { + SetDuration(0); + return; + } + + if (instance->GetBossState(DATA_THE_LURKER_BELOW) == DONE || instance->GetData(DATA_ALIVE_KEEPERS) == 0 || GetUnitOwner()->GetPositionZ() > -20.5f || !GetUnitOwner()->IsInWater()) + return; + + for (uint8 i = 0; i < 3; ++i) + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_FRENZY_WATER, true); + } + + void Register() + { + AfterEffectApply += AuraEffectApplyFn(spell_serpentshrine_cavern_coilfang_water_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_serpentshrine_cavern_coilfang_water_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + + DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_serpentshrine_cavern_coilfang_water_AuraScript::CalcPeriodic, EFFECT_0, SPELL_AURA_DUMMY); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_serpentshrine_cavern_coilfang_water_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_serpentshrine_cavern_coilfang_water_AuraScript(); + } }; void AddSC_instance_serpentshrine_cavern() diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/serpent_shrine.h b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/serpent_shrine.h index b502279a4..3a7e103ce 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/serpent_shrine.h +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/serpent_shrine.h @@ -41,7 +41,7 @@ enum SSNPCs NPC_COILFANG_SHATTERER = 21301, NPC_COILFANG_PRIESTESS = 21220, - + NPC_ENCHANTED_ELEMENTAL = 21958, NPC_COILFANG_ELITE = 22055, NPC_COILFANG_STRIDER = 22056, diff --git a/src/server/scripts/Outland/CoilfangReservoir/SlavePens/boss_ahune.cpp b/src/server/scripts/Outland/CoilfangReservoir/SlavePens/boss_ahune.cpp index 19340d6d9..69c0fb13d 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SlavePens/boss_ahune.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SlavePens/boss_ahune.cpp @@ -17,9 +17,9 @@ #define TEXT_RETREAT "Ahune Retreats. His defenses diminish." #define TEXT_RESURFACE "Ahune will soon resurface." -const Position AhuneSummonPos = {-97.3473f, -233.139f, -1.27587f, M_PI/2}; +const Position AhuneSummonPos = {-97.3473f, -233.139f, -1.27587f, M_PI / 2}; const Position TotemPos[3] = { {-115.141f, -143.317f, -2.09467f, 4.92772f}, {-120.178f, -144.398f, -2.23786f, 4.92379f}, {-125.277f, -145.463f, -1.95209f, 4.97877f} }; -const Position MinionSummonPos = {-97.154404f, -204.382675f, -1.19f, M_PI/2}; +const Position MinionSummonPos = {-97.154404f, -204.382675f, -1.19f, M_PI / 2}; enum NPCs { @@ -86,7 +86,7 @@ public: struct boss_ahuneAI : public ScriptedAI { - boss_ahuneAI(Creature *c) : ScriptedAI(c), summons(me) + boss_ahuneAI(Creature* c) : ScriptedAI(c), summons(me) { SetCombatMovement(false); SetEquipmentSlots(false, 54806, EQUIP_UNEQUIP, EQUIP_UNEQUIP); @@ -139,8 +139,8 @@ public: events.RescheduleEvent(EVENT_ATTACK, 2000); break; case EVENT_SUMMON_TOTEMS: - for (uint8 i=0; i<3; ++i) - DoSummon(NPC_TOTEM, TotemPos[i], 10*60*1000, TEMPSUMMON_TIMED_DESPAWN); + for (uint8 i = 0; i < 3; ++i) + DoSummon(NPC_TOTEM, TotemPos[i], 10 * 60 * 1000, TEMPSUMMON_TIMED_DESPAWN); events.PopEvent(); break; case EVENT_INVOKER_SAY_1: @@ -177,8 +177,8 @@ public: me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); break; case EVENT_TOTEMS_ATTACK: - for (uint8 i=0; i<3; ++i) - if (Creature* bunny = me->FindNearestCreature(NPC_TOTEM_BUNNY_1+i, 150.0f, true)) + for (uint8 i = 0; i < 3; ++i) + if (Creature* bunny = me->FindNearestCreature(NPC_TOTEM_BUNNY_1 + i, 150.0f, true)) bunny->CastSpell(me, SPELL_TOTEM_BEAM, false); events.PopEvent(); events.RescheduleEvent(EVENT_SUBMERGE, 10000); @@ -212,35 +212,35 @@ public: case EVENT_SPELL_COLD_SLAP: if (Unit* target = SelectTarget(SELECT_TARGET_NEAREST, 0, 5.0f, true)) - if (target->GetPositionZ() < me->GetPositionZ()+6.0f) + if (target->GetPositionZ() < me->GetPositionZ() + 6.0f) { - int32 dmg = urand(5500,6000); + int32 dmg = urand(5500, 6000); me->CastCustomSpell(target, SPELL_COLD_SLAP, &dmg, nullptr, nullptr, false); float x, y, z; target->GetNearPoint(target, x, y, z, target->GetObjectSize(), 30.0f, target->GetAngle(me->GetPositionX(), me->GetPositionY()) + M_PI); - target->GetMotionMaster()->MoveJump(x, y, z+20.0f, 10.0f, 20.0f); + target->GetMotionMaster()->MoveJump(x, y, z + 20.0f, 10.0f, 20.0f); } events.RepeatEvent(1500); break; case EVENT_SPELL_SUMMON_HAILSTONE: { - float dist = (float)urand(3,10); - float angle = rand_norm()*2*M_PI; - me->CastSpell(MinionSummonPos.GetPositionX()+cos(angle)*dist, MinionSummonPos.GetPositionY()+sin(angle)*dist, MinionSummonPos.GetPositionZ(), SPELL_SUMMON_HAILSTONE, false); + float dist = (float)urand(3, 10); + float angle = rand_norm() * 2 * M_PI; + me->CastSpell(MinionSummonPos.GetPositionX() + cos(angle)*dist, MinionSummonPos.GetPositionY() + sin(angle)*dist, MinionSummonPos.GetPositionZ(), SPELL_SUMMON_HAILSTONE, false); events.RepeatEvent(30000); } break; case EVENT_SPELL_SUMMON_COLDWAVE: - for (uint8 i=0; i<2; ++i) + for (uint8 i = 0; i < 2; ++i) { - float dist = (float)urand(3,10); - float angle = rand_norm()*2*M_PI; - me->CastSpell(MinionSummonPos.GetPositionX()+cos(angle)*dist, MinionSummonPos.GetPositionY()+sin(angle)*dist, MinionSummonPos.GetPositionZ(), SPELL_SUMMON_COLDWAVE, false); + float dist = (float)urand(3, 10); + float angle = rand_norm() * 2 * M_PI; + me->CastSpell(MinionSummonPos.GetPositionX() + cos(angle)*dist, MinionSummonPos.GetPositionY() + sin(angle)*dist, MinionSummonPos.GetPositionZ(), SPELL_SUMMON_COLDWAVE, false); } { - float dist = (float)urand(3,10); - float angle = rand_norm()*2*M_PI; - me->CastSpell(MinionSummonPos.GetPositionX()+cos(angle)*dist, MinionSummonPos.GetPositionY()+sin(angle)*dist, MinionSummonPos.GetPositionZ(), SPELL_SUMMON_FROSTWIND, false); + float dist = (float)urand(3, 10); + float angle = rand_norm() * 2 * M_PI; + me->CastSpell(MinionSummonPos.GetPositionX() + cos(angle)*dist, MinionSummonPos.GetPositionY() + sin(angle)*dist, MinionSummonPos.GetPositionZ(), SPELL_SUMMON_FROSTWIND, false); } events.RepeatEvent(6000); break; @@ -292,7 +292,7 @@ public: { summons.DespawnAll(); me->DespawnOrUnsummon(15000); - if (GameObject* chest = me->SummonGameObject(187892, MinionSummonPos.GetPositionX(), MinionSummonPos.GetPositionY(), MinionSummonPos.GetPositionZ(), M_PI/2, 0.0f, 0.0f, 0.0f, 0.0f, 900000000)) // loot + if (GameObject* chest = me->SummonGameObject(187892, MinionSummonPos.GetPositionX(), MinionSummonPos.GetPositionY(), MinionSummonPos.GetPositionZ(), M_PI / 2, 0.0f, 0.0f, 0.0f, 0.0f, 900000000)) // loot me->RemoveGameObject(chest, false); bool finished = false; @@ -302,7 +302,7 @@ public: if (Player* player = i->GetSource()) { player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, 25740, 1, me); - + if (player->GetGroup() && !finished) { finished = true; @@ -314,9 +314,9 @@ public: }; class go_ahune_ice_stone : public GameObjectScript -{ -public: - go_ahune_ice_stone() : GameObjectScript("go_ahune_ice_stone") { } +{ +public: + go_ahune_ice_stone() : GameObjectScript("go_ahune_ice_stone") { } bool OnGossipHello(Player* player, GameObject* go) override { @@ -327,7 +327,7 @@ public: if (go->FindNearestCreature(NPC_AHUNE, 200.0f, true)) return true; - AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Disturb the stone and summon Lord Ahune.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1337); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Disturb the stone and summon Lord Ahune.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1337); SendGossipMenuFor(player, GOSSIP_TEXT_ID, go->GetGUID()); return true; } @@ -336,7 +336,7 @@ public: { if (!player || !go) return true; - if (action != GOSSIP_ACTION_INFO_DEF+1337) + if (action != GOSSIP_ACTION_INFO_DEF + 1337) return true; if (!player->HasItemCount(ITEM_MAGMA_TOTEM)) return true; @@ -374,7 +374,7 @@ public: struct npc_ahune_frozen_coreAI : public NullCreatureAI { - npc_ahune_frozen_coreAI(Creature *c) : NullCreatureAI(c) {} + npc_ahune_frozen_coreAI(Creature* c) : NullCreatureAI(c) {} void JustDied(Unit* /*killer*/) { diff --git a/src/server/scripts/Outland/CoilfangReservoir/SlavePens/instance_the_slave_pens.cpp b/src/server/scripts/Outland/CoilfangReservoir/SlavePens/instance_the_slave_pens.cpp index c2064e2e4..fbf4b6c87 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SlavePens/instance_the_slave_pens.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SlavePens/instance_the_slave_pens.cpp @@ -39,7 +39,7 @@ public: { counter = DATA_FLAMECALLER_000; } - + void Load(char const* /*data*/) override { LoadBossState(DataHeader); } void OnCreatureCreate(Creature* creature) override diff --git a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_hydromancer_thespia.cpp b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_hydromancer_thespia.cpp index 51d90dae0..c622c97eb 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_hydromancer_thespia.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_hydromancer_thespia.cpp @@ -89,7 +89,7 @@ public: break; case EVENT_SPELL_LUNG: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(target, SPELL_LUNG_BURST); + DoCast(target, SPELL_LUNG_BURST); events.RepeatEvent(urand(7000, 12000)); break; case EVENT_SPELL_ENVELOPING: 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 c336ad558..9fb60186e 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_mekgineer_steamrigger.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_mekgineer_steamrigger.cpp @@ -27,7 +27,7 @@ enum MekgineerSteamrigger EVENT_SPELL_SHRINK = 4, EVENT_SPELL_SAW = 5, EVENT_SPELL_NET = 6 - + }; class boss_mekgineer_steamrigger : public CreatureScript @@ -88,11 +88,11 @@ public: { Talk(SAY_MECHANICS); - me->SummonCreature(NPC_STREAMRIGGER_MECHANIC, me->GetPositionX()+15.0f, me->GetPositionY()+15.0f, me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - me->SummonCreature(NPC_STREAMRIGGER_MECHANIC, me->GetPositionX()-15.0f, me->GetPositionY()+15.0f, me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - me->SummonCreature(NPC_STREAMRIGGER_MECHANIC, me->GetPositionX()-15.0f, me->GetPositionY()-15.0f, me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - if (urand(0,1)) - me->SummonCreature(NPC_STREAMRIGGER_MECHANIC, me->GetPositionX()+15.0f, me->GetPositionY()-15.0f, me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + me->SummonCreature(NPC_STREAMRIGGER_MECHANIC, me->GetPositionX() + 15.0f, me->GetPositionY() + 15.0f, me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + me->SummonCreature(NPC_STREAMRIGGER_MECHANIC, me->GetPositionX() - 15.0f, me->GetPositionY() + 15.0f, me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + me->SummonCreature(NPC_STREAMRIGGER_MECHANIC, me->GetPositionX() - 15.0f, me->GetPositionY() - 15.0f, me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + if (urand(0, 1)) + me->SummonCreature(NPC_STREAMRIGGER_MECHANIC, me->GetPositionX() + 15.0f, me->GetPositionY() - 15.0f, me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); } void JustSummoned(Creature* cr) @@ -127,7 +127,7 @@ public: case EVENT_CHECK_HP25: case EVENT_CHECK_HP50: case EVENT_CHECK_HP75: - if (me->HealthBelowPct(eventId*25)) + if (me->HealthBelowPct(eventId * 25)) { SummonMechanics(); events.PopEvent(); diff --git a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp index 60c9086f4..c1fe5f287 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp @@ -38,172 +38,174 @@ public: class instance_steam_vault : public InstanceMapScript { - public: - instance_steam_vault() : InstanceMapScript("instance_steam_vault", 545) { } +public: + instance_steam_vault() : InstanceMapScript("instance_steam_vault", 545) { } - InstanceScript* GetInstanceScript(InstanceMap* map) const + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_steam_vault_InstanceMapScript(map); + } + + struct instance_steam_vault_InstanceMapScript : public InstanceScript + { + instance_steam_vault_InstanceMapScript(Map* map) : InstanceScript(map) {} + + uint32 m_auiEncounter[MAX_ENCOUNTER]; + + uint64 MekgineerGUID; + uint64 MainChambersDoor; + uint64 AccessPanelHydro; + uint64 AccessPanelMek; + + void Initialize() { - return new instance_steam_vault_InstanceMapScript(map); + memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); + + MekgineerGUID = 0; + MainChambersDoor = 0; + AccessPanelHydro = 0; + AccessPanelMek = 0; } - struct instance_steam_vault_InstanceMapScript : public InstanceScript + bool IsEncounterInProgress() const { - instance_steam_vault_InstanceMapScript(Map* map) : InstanceScript(map) {} + for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) + if (m_auiEncounter[i] == IN_PROGRESS) + return true; - uint32 m_auiEncounter[MAX_ENCOUNTER]; + return false; + } - uint64 MekgineerGUID; - uint64 MainChambersDoor; - uint64 AccessPanelHydro; - uint64 AccessPanelMek; - - void Initialize() + void OnCreatureCreate(Creature* creature) + { + switch (creature->GetEntry()) { - memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); - - MekgineerGUID = 0; - MainChambersDoor = 0; - AccessPanelHydro = 0; - AccessPanelMek = 0; + case NPC_MEKGINEER_STEAMRIGGER: + MekgineerGUID = creature->GetGUID(); + break; } + } - bool IsEncounterInProgress() const + void OnGameObjectCreate(GameObject* go) + { + switch (go->GetEntry()) { - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) - return true; - - return false; + case GO_MAIN_CHAMBERS_DOOR: + MainChambersDoor = go->GetGUID(); + if (GetData(TYPE_HYDROMANCER_THESPIA) == SPECIAL && GetData(TYPE_MEKGINEER_STEAMRIGGER) == SPECIAL) + HandleGameObject(0, true, go); + break; + case GO_ACCESS_PANEL_HYDRO: + AccessPanelHydro = go->GetGUID(); + if (GetData(TYPE_HYDROMANCER_THESPIA) == DONE) + go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + else if (GetData(TYPE_HYDROMANCER_THESPIA) == SPECIAL) + HandleGameObject(0, true, go); + break; + case GO_ACCESS_PANEL_MEK: + AccessPanelMek = go->GetGUID(); + if (GetData(TYPE_MEKGINEER_STEAMRIGGER) == DONE) + go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + else if (GetData(TYPE_MEKGINEER_STEAMRIGGER) == SPECIAL) + HandleGameObject(0, true, go); + break; } + } - void OnCreatureCreate(Creature* creature) + void SetData(uint32 type, uint32 data) + { + switch (type) { - switch (creature->GetEntry()) - { - case NPC_MEKGINEER_STEAMRIGGER: MekgineerGUID = creature->GetGUID(); break; - } - } - - void OnGameObjectCreate(GameObject* go) - { - switch (go->GetEntry()) - { - case GO_MAIN_CHAMBERS_DOOR: - MainChambersDoor = go->GetGUID(); - if (GetData(TYPE_HYDROMANCER_THESPIA) == SPECIAL && GetData(TYPE_MEKGINEER_STEAMRIGGER) == SPECIAL) - HandleGameObject(0, true, go); - break; - case GO_ACCESS_PANEL_HYDRO: - AccessPanelHydro = go->GetGUID(); - if (GetData(TYPE_HYDROMANCER_THESPIA) == DONE) - go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - else if (GetData(TYPE_HYDROMANCER_THESPIA) == SPECIAL) - HandleGameObject(0, true, go); - break; - case GO_ACCESS_PANEL_MEK: - AccessPanelMek = go->GetGUID(); - if (GetData(TYPE_MEKGINEER_STEAMRIGGER) == DONE) - go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - else if (GetData(TYPE_MEKGINEER_STEAMRIGGER) == SPECIAL) - HandleGameObject(0, true, go); - break; - } - } - - void SetData(uint32 type, uint32 data) - { - switch (type) - { - case TYPE_HYDROMANCER_THESPIA: - if (data == SPECIAL) - { - if (GetData(TYPE_MEKGINEER_STEAMRIGGER) == SPECIAL) - HandleGameObject(MainChambersDoor, true); - } - else if (data == DONE) - { - if (GameObject* panel = instance->GetGameObject(AccessPanelHydro)) - panel->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - } - - m_auiEncounter[type] = data; - break; - case TYPE_MEKGINEER_STEAMRIGGER: - if (data == SPECIAL) - { - if (GetData(TYPE_HYDROMANCER_THESPIA) == SPECIAL) - HandleGameObject(MainChambersDoor, true); - } - else if (data == DONE) - { - if (GameObject* panel = instance->GetGameObject(AccessPanelMek)) - panel->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - } - - m_auiEncounter[type] = data; - break; - case TYPE_WARLORD_KALITHRESH: - m_auiEncounter[type] = data; - break; - } - - if (data == DONE || data == SPECIAL) - SaveToDB(); - } - - uint32 GetData(uint32 type) const - { - switch (type) - { - case TYPE_HYDROMANCER_THESPIA: - case TYPE_MEKGINEER_STEAMRIGGER: - case TYPE_WARLORD_KALITHRESH: - return m_auiEncounter[type]; - } - return 0; - } - - uint64 GetData64(uint32 data) const - { - if (data == TYPE_MEKGINEER_STEAMRIGGER) - return MekgineerGUID; - return 0; - } - - std::string GetSaveData() - { - OUT_SAVE_INST_DATA; - - std::ostringstream stream; - stream << "S V " << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' ' << m_auiEncounter[2]; - - OUT_SAVE_INST_DATA_COMPLETE; - return stream.str(); - } - - void Load(const char* strIn) - { - if (!strIn) - { - OUT_LOAD_INST_DATA_FAIL; - return; - } - - char dataHead1, dataHead2; - std::istringstream loadStream(strIn); - loadStream >> dataHead1 >> dataHead2; - - if (dataHead1 == 'S' && dataHead2 == 'V') - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) + case TYPE_HYDROMANCER_THESPIA: + if (data == SPECIAL) { - loadStream >> m_auiEncounter[i]; - if (m_auiEncounter[i] == IN_PROGRESS) - m_auiEncounter[i] = NOT_STARTED; + if (GetData(TYPE_MEKGINEER_STEAMRIGGER) == SPECIAL) + HandleGameObject(MainChambersDoor, true); + } + else if (data == DONE) + { + if (GameObject* panel = instance->GetGameObject(AccessPanelHydro)) + panel->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); } - OUT_LOAD_INST_DATA_COMPLETE; + m_auiEncounter[type] = data; + break; + case TYPE_MEKGINEER_STEAMRIGGER: + if (data == SPECIAL) + { + if (GetData(TYPE_HYDROMANCER_THESPIA) == SPECIAL) + HandleGameObject(MainChambersDoor, true); + } + else if (data == DONE) + { + if (GameObject* panel = instance->GetGameObject(AccessPanelMek)) + panel->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + } + + m_auiEncounter[type] = data; + break; + case TYPE_WARLORD_KALITHRESH: + m_auiEncounter[type] = data; + break; } - }; + + if (data == DONE || data == SPECIAL) + SaveToDB(); + } + + uint32 GetData(uint32 type) const + { + switch (type) + { + case TYPE_HYDROMANCER_THESPIA: + case TYPE_MEKGINEER_STEAMRIGGER: + case TYPE_WARLORD_KALITHRESH: + return m_auiEncounter[type]; + } + return 0; + } + + uint64 GetData64(uint32 data) const + { + if (data == TYPE_MEKGINEER_STEAMRIGGER) + return MekgineerGUID; + return 0; + } + + std::string GetSaveData() + { + OUT_SAVE_INST_DATA; + + std::ostringstream stream; + stream << "S V " << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' ' << m_auiEncounter[2]; + + OUT_SAVE_INST_DATA_COMPLETE; + return stream.str(); + } + + void Load(const char* strIn) + { + if (!strIn) + { + OUT_LOAD_INST_DATA_FAIL; + return; + } + + char dataHead1, dataHead2; + std::istringstream loadStream(strIn); + loadStream >> dataHead1 >> dataHead2; + + if (dataHead1 == 'S' && dataHead2 == 'V') + for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) + { + loadStream >> m_auiEncounter[i]; + if (m_auiEncounter[i] == IN_PROGRESS) + m_auiEncounter[i] = NOT_STARTED; + } + + OUT_LOAD_INST_DATA_COMPLETE; + } + }; }; void AddSC_instance_steam_vault() diff --git a/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_the_black_stalker.cpp b/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_the_black_stalker.cpp index 2842fe8e8..55bc3c97c 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_the_black_stalker.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_the_black_stalker.cpp @@ -183,7 +183,7 @@ public: void CalcPeriodic(AuraEffect const* /*effect*/, bool& isPeriodic, int32& amplitude) { isPeriodic = true; - amplitude = urand(10*IN_MILLISECONDS, 200*IN_MILLISECONDS); + amplitude = urand(10 * IN_MILLISECONDS, 200 * IN_MILLISECONDS); } void Update(AuraEffect* /*effect*/) diff --git a/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp b/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp index f869aa1d0..8e3310805 100644 --- a/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp +++ b/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp @@ -44,221 +44,221 @@ enum Events class boss_gruul : public CreatureScript { - public: - boss_gruul() : CreatureScript("boss_gruul") { } +public: + boss_gruul() : CreatureScript("boss_gruul") { } - struct boss_gruulAI : public BossAI + struct boss_gruulAI : public BossAI + { + boss_gruulAI(Creature* creature) : BossAI(creature, DATA_GRUUL) { } + + void Reset() { - boss_gruulAI(Creature* creature) : BossAI(creature, DATA_GRUUL) { } - - void Reset() - { - _Reset(); - _caveInTimer = 29000; - } - - void EnterCombat(Unit* /*who*/) - { - _EnterCombat(); - Talk(SAY_AGGRO); - - events.ScheduleEvent(EVENT_GROWTH, 30000); - events.ScheduleEvent(EVENT_CAVE_IN, _caveInTimer); - events.ScheduleEvent(EVENT_REVERBERATION, 20000); - events.ScheduleEvent(EVENT_HURTFUL_STRIKE, 10000); - events.ScheduleEvent(EVENT_GROUND_SLAM, 35000); - } - - void KilledUnit(Unit* /*who*/) - { - if (events.GetNextEventTime(EVENT_RECENTLY_SPOKEN) == 0) - { - events.ScheduleEvent(EVENT_RECENTLY_SPOKEN, 5000); - Talk(SAY_SLAY); - } - } - - void JustDied(Unit* /*killer*/) - { - _JustDied(); - Talk(SAY_DEATH); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_GROWTH: - Talk(EMOTE_GROW); - DoCast(me, SPELL_GROWTH); - events.ScheduleEvent(EVENT_GROWTH, 30000); - break; - case EVENT_CAVE_IN: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - me->CastSpell(target, SPELL_CAVE_IN, false); - if (_caveInTimer >= 4000) - _caveInTimer -= 1500; - events.ScheduleEvent(EVENT_CAVE_IN, _caveInTimer); - break; - case EVENT_REVERBERATION: - me->CastSpell(me, SPELL_REVERBERATION, false); - events.ScheduleEvent(EVENT_REVERBERATION, 22000); - break; - case EVENT_HURTFUL_STRIKE: - if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1, 5.0f)) - me->CastSpell(target, SPELL_HURTFUL_STRIKE, false); - events.ScheduleEvent(EVENT_HURTFUL_STRIKE, 15000); - break; - case EVENT_GROUND_SLAM: - Talk(SAY_SLAM); - me->CastSpell(me, SPELL_GROUND_SLAM, false); - events.DelayEvents(8001); - events.ScheduleEvent(EVENT_GROUND_SLAM, 60000); - events.ScheduleEvent(EVENT_SHATTER, 8000); - break; - case EVENT_SHATTER: - Talk(SAY_SHATTER); - me->CastSpell(me, SPELL_SHATTER, false); - break; - } - - DoMeleeAttackIfReady(); - } - - private: - uint32 _caveInTimer; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + _Reset(); + _caveInTimer = 29000; } + + void EnterCombat(Unit* /*who*/) + { + _EnterCombat(); + Talk(SAY_AGGRO); + + events.ScheduleEvent(EVENT_GROWTH, 30000); + events.ScheduleEvent(EVENT_CAVE_IN, _caveInTimer); + events.ScheduleEvent(EVENT_REVERBERATION, 20000); + events.ScheduleEvent(EVENT_HURTFUL_STRIKE, 10000); + events.ScheduleEvent(EVENT_GROUND_SLAM, 35000); + } + + void KilledUnit(Unit* /*who*/) + { + if (events.GetNextEventTime(EVENT_RECENTLY_SPOKEN) == 0) + { + events.ScheduleEvent(EVENT_RECENTLY_SPOKEN, 5000); + Talk(SAY_SLAY); + } + } + + void JustDied(Unit* /*killer*/) + { + _JustDied(); + Talk(SAY_DEATH); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_GROWTH: + Talk(EMOTE_GROW); + DoCast(me, SPELL_GROWTH); + events.ScheduleEvent(EVENT_GROWTH, 30000); + break; + case EVENT_CAVE_IN: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + me->CastSpell(target, SPELL_CAVE_IN, false); + if (_caveInTimer >= 4000) + _caveInTimer -= 1500; + events.ScheduleEvent(EVENT_CAVE_IN, _caveInTimer); + break; + case EVENT_REVERBERATION: + me->CastSpell(me, SPELL_REVERBERATION, false); + events.ScheduleEvent(EVENT_REVERBERATION, 22000); + break; + case EVENT_HURTFUL_STRIKE: + if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1, 5.0f)) + me->CastSpell(target, SPELL_HURTFUL_STRIKE, false); + events.ScheduleEvent(EVENT_HURTFUL_STRIKE, 15000); + break; + case EVENT_GROUND_SLAM: + Talk(SAY_SLAM); + me->CastSpell(me, SPELL_GROUND_SLAM, false); + events.DelayEvents(8001); + events.ScheduleEvent(EVENT_GROUND_SLAM, 60000); + events.ScheduleEvent(EVENT_SHATTER, 8000); + break; + case EVENT_SHATTER: + Talk(SAY_SHATTER); + me->CastSpell(me, SPELL_SHATTER, false); + break; + } + + DoMeleeAttackIfReady(); + } + + private: + uint32 _caveInTimer; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class spell_gruul_ground_slam : public SpellScriptLoader { - public: - spell_gruul_ground_slam() : SpellScriptLoader("spell_gruul_ground_slam") { } +public: + spell_gruul_ground_slam() : SpellScriptLoader("spell_gruul_ground_slam") { } - class spell_gruul_ground_slam_SpellScript : public SpellScript + class spell_gruul_ground_slam_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gruul_ground_slam_SpellScript); + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_gruul_ground_slam_SpellScript); - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - target->KnockbackFrom(GetCaster()->GetPositionX(), GetCaster()->GetPositionY(), 15.0f, 15.0f); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_gruul_ground_slam_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gruul_ground_slam_SpellScript(); + if (Unit* target = GetHitUnit()) + target->KnockbackFrom(GetCaster()->GetPositionX(), GetCaster()->GetPositionY(), 15.0f, 15.0f); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_gruul_ground_slam_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gruul_ground_slam_SpellScript(); + } }; class spell_gruul_ground_slam_trigger : public SpellScriptLoader { - public: - spell_gruul_ground_slam_trigger() : SpellScriptLoader("spell_gruul_ground_slam_trigger") { } +public: + spell_gruul_ground_slam_trigger() : SpellScriptLoader("spell_gruul_ground_slam_trigger") { } - class spell_gruul_ground_slam_trigger_AuraScript : public AuraScript + class spell_gruul_ground_slam_trigger_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gruul_ground_slam_trigger_AuraScript); + + void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_gruul_ground_slam_trigger_AuraScript); - - void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - if (GetUnitOwner()->GetAuraCount(GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell) == 5) - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_STONED, true); - } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_gruul_ground_slam_trigger_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_gruul_ground_slam_trigger_AuraScript(); + if (GetUnitOwner()->GetAuraCount(GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell) == 5) + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_STONED, true); } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_gruul_ground_slam_trigger_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gruul_ground_slam_trigger_AuraScript(); + } }; class spell_gruul_shatter : public SpellScriptLoader { - public: - spell_gruul_shatter() : SpellScriptLoader("spell_gruul_shatter") { } +public: + spell_gruul_shatter() : SpellScriptLoader("spell_gruul_shatter") { } - class spell_gruul_shatter_SpellScript : public SpellScript + class spell_gruul_shatter_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gruul_shatter_SpellScript); + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_gruul_shatter_SpellScript); - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) + if (Unit* target = GetHitUnit()) { - if (Unit* target = GetHitUnit()) - { - target->RemoveAurasDueToSpell(SPELL_STONED); - target->CastSpell((Unit*)NULL, SPELL_SHATTER_EFFECT, true); - } + target->RemoveAurasDueToSpell(SPELL_STONED); + target->CastSpell((Unit*)NULL, SPELL_SHATTER_EFFECT, true); } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_gruul_shatter_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gruul_shatter_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_gruul_shatter_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gruul_shatter_SpellScript(); + } }; class spell_gruul_shatter_effect : public SpellScriptLoader { - public: - spell_gruul_shatter_effect() : SpellScriptLoader("spell_gruul_shatter_effect") { } +public: + spell_gruul_shatter_effect() : SpellScriptLoader("spell_gruul_shatter_effect") { } - class spell_gruul_shatter_effect_SpellScript : public SpellScript + class spell_gruul_shatter_effect_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gruul_shatter_effect_SpellScript); + + void CalculateDamage() { - PrepareSpellScript(spell_gruul_shatter_effect_SpellScript); + if (!GetHitUnit()) + return; - void CalculateDamage() - { - if (!GetHitUnit()) - return; + float radius = GetSpellInfo()->Effects[EFFECT_0].CalcRadius(GetCaster()); + if (!radius) + return; - float radius = GetSpellInfo()->Effects[EFFECT_0].CalcRadius(GetCaster()); - if (!radius) - return; - - float distance = GetCaster()->GetDistance2d(GetHitUnit()); - if (distance > 1.0f) - SetHitDamage(int32(GetHitDamage() * ((radius - distance) / radius))); - } - - void Register() - { - OnHit += SpellHitFn(spell_gruul_shatter_effect_SpellScript::CalculateDamage); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gruul_shatter_effect_SpellScript(); + float distance = GetCaster()->GetDistance2d(GetHitUnit()); + if (distance > 1.0f) + SetHitDamage(int32(GetHitDamage() * ((radius - distance) / radius))); } + + void Register() + { + OnHit += SpellHitFn(spell_gruul_shatter_effect_SpellScript::CalculateDamage); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gruul_shatter_effect_SpellScript(); + } }; void AddSC_boss_gruul() diff --git a/src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp b/src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp index 587be47a2..d2d0af3f5 100644 --- a/src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp +++ b/src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp @@ -24,149 +24,149 @@ MinionData const minionData[] = class instance_gruuls_lair : public InstanceMapScript { - public: - instance_gruuls_lair() : InstanceMapScript("instance_gruuls_lair", 565) { } +public: + instance_gruuls_lair() : InstanceMapScript("instance_gruuls_lair", 565) { } - struct instance_gruuls_lair_InstanceMapScript : public InstanceScript + struct instance_gruuls_lair_InstanceMapScript : public InstanceScript + { + instance_gruuls_lair_InstanceMapScript(Map* map) : InstanceScript(map) { - instance_gruuls_lair_InstanceMapScript(Map* map) : InstanceScript(map) - { - SetBossNumber(MAX_ENCOUNTER); - LoadDoorData(doorData); - LoadMinionData(minionData); + SetBossNumber(MAX_ENCOUNTER); + LoadDoorData(doorData); + LoadMinionData(minionData); - _maulgarGUID = 0; - _addsKilled = 0; - } - - void OnCreatureCreate(Creature* creature) - { - switch (creature->GetEntry()) - { - case NPC_MAULGAR: - _maulgarGUID = creature->GetGUID(); - [[fallthrough]]; - case NPC_KROSH_FIREHAND: - case NPC_OLM_THE_SUMMONER: - case NPC_KIGGLER_THE_CRAZED: - case NPC_BLINDEYE_THE_SEER: - AddMinion(creature, true); - break; - } - } - - void OnCreatureRemove(Creature* creature) - { - switch (creature->GetEntry()) - { - case NPC_MAULGAR: - case NPC_KROSH_FIREHAND: - case NPC_OLM_THE_SUMMONER: - case NPC_KIGGLER_THE_CRAZED: - case NPC_BLINDEYE_THE_SEER: - AddMinion(creature, false); - break; - } - } - - void OnGameObjectCreate(GameObject* go) - { - switch (go->GetEntry()) - { - case GO_MAULGAR_DOOR: - case GO_GRUUL_DOOR: - AddDoor(go, true); - break; - } - } - - void OnGameObjectRemove(GameObject* go) - { - switch (go->GetEntry()) - { - case GO_MAULGAR_DOOR: - case GO_GRUUL_DOOR: - AddDoor(go, false); - break; - } - } - - bool SetBossState(uint32 id, EncounterState state) - { - if (!InstanceScript::SetBossState(id, state)) - return false; - - if (id == DATA_MAULGAR && state == NOT_STARTED) - _addsKilled = 0; - return true; - } - - void SetData(uint32 type, uint32 /*id*/) - { - if (type == DATA_ADDS_KILLED) - if (Creature* maulgar = instance->GetCreature(_maulgarGUID)) - maulgar->AI()->DoAction(++_addsKilled); - } - - uint32 GetData(uint32 type) const - { - if (type == DATA_ADDS_KILLED) - return _addsKilled; - return 0; - } - - std::string GetSaveData() - { - OUT_SAVE_INST_DATA; - - std::ostringstream saveStream; - saveStream << "G L " << GetBossSaveData(); - - OUT_SAVE_INST_DATA_COMPLETE; - return saveStream.str(); - } - - void Load(char const* str) - { - 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 == 'G' && dataHead2 == 'L') - { - for (uint32 i = 0; i < MAX_ENCOUNTER; ++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: - uint32 _addsKilled; - uint64 _maulgarGUID; - }; - - InstanceScript* GetInstanceScript(InstanceMap* map) const - { - return new instance_gruuls_lair_InstanceMapScript(map); + _maulgarGUID = 0; + _addsKilled = 0; } + + void OnCreatureCreate(Creature* creature) + { + switch (creature->GetEntry()) + { + case NPC_MAULGAR: + _maulgarGUID = creature->GetGUID(); + [[fallthrough]]; + case NPC_KROSH_FIREHAND: + case NPC_OLM_THE_SUMMONER: + case NPC_KIGGLER_THE_CRAZED: + case NPC_BLINDEYE_THE_SEER: + AddMinion(creature, true); + break; + } + } + + void OnCreatureRemove(Creature* creature) + { + switch (creature->GetEntry()) + { + case NPC_MAULGAR: + case NPC_KROSH_FIREHAND: + case NPC_OLM_THE_SUMMONER: + case NPC_KIGGLER_THE_CRAZED: + case NPC_BLINDEYE_THE_SEER: + AddMinion(creature, false); + break; + } + } + + void OnGameObjectCreate(GameObject* go) + { + switch (go->GetEntry()) + { + case GO_MAULGAR_DOOR: + case GO_GRUUL_DOOR: + AddDoor(go, true); + break; + } + } + + void OnGameObjectRemove(GameObject* go) + { + switch (go->GetEntry()) + { + case GO_MAULGAR_DOOR: + case GO_GRUUL_DOOR: + AddDoor(go, false); + break; + } + } + + bool SetBossState(uint32 id, EncounterState state) + { + if (!InstanceScript::SetBossState(id, state)) + return false; + + if (id == DATA_MAULGAR && state == NOT_STARTED) + _addsKilled = 0; + return true; + } + + void SetData(uint32 type, uint32 /*id*/) + { + if (type == DATA_ADDS_KILLED) + if (Creature* maulgar = instance->GetCreature(_maulgarGUID)) + maulgar->AI()->DoAction(++_addsKilled); + } + + uint32 GetData(uint32 type) const + { + if (type == DATA_ADDS_KILLED) + return _addsKilled; + return 0; + } + + std::string GetSaveData() + { + OUT_SAVE_INST_DATA; + + std::ostringstream saveStream; + saveStream << "G L " << GetBossSaveData(); + + OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); + } + + void Load(char const* str) + { + 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 == 'G' && dataHead2 == 'L') + { + for (uint32 i = 0; i < MAX_ENCOUNTER; ++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: + uint32 _addsKilled; + uint64 _maulgarGUID; + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_gruuls_lair_InstanceMapScript(map); + } }; void AddSC_instance_gruuls_lair() diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp index bb8cd3aa5..371cf8416 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp @@ -24,171 +24,171 @@ enum eEnums class boss_broggok : public CreatureScript { - public: +public: - boss_broggok() : CreatureScript("boss_broggok") + boss_broggok() : CreatureScript("boss_broggok") + { + } + + struct boss_broggokAI : public ScriptedAI + { + boss_broggokAI(Creature* creature) : ScriptedAI(creature) { + instance = creature->GetInstanceScript(); } - struct boss_broggokAI : public ScriptedAI + InstanceScript* instance; + EventMap events; + bool canAttack; + + void Reset() { - boss_broggokAI(Creature* creature) : ScriptedAI(creature) - { - instance = creature->GetInstanceScript(); - } + events.Reset(); - InstanceScript* instance; - EventMap events; - bool canAttack; + me->SetReactState(REACT_PASSIVE); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NON_ATTACKABLE); + canAttack = false; - void Reset() - { - events.Reset(); - - me->SetReactState(REACT_PASSIVE); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NON_ATTACKABLE); - canAttack = false; - - if (instance) - instance->SetData(DATA_BROGGOK, NOT_STARTED); - } - - void EnterCombat(Unit* /*who*/) - { - Talk(SAY_AGGRO); - } - - void JustSummoned(Creature* summoned) - { - 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) - { - if (!UpdateVictim() || !canAttack) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.GetEvent()) - { - case EVENT_SPELL_SLIME: - me->CastSpell(me->GetVictim(), SPELL_SLIME_SPRAY, false); - events.RepeatEvent(urand(7000, 12000)); - break; - case EVENT_SPELL_BOLT: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - me->CastSpell(target, SPELL_POISON_BOLT, false); - events.RepeatEvent(urand(6000, 11000)); - break; - case EVENT_SPELL_POISON: - me->CastSpell(me, SPELL_POISON_CLOUD, false); - events.RepeatEvent(20000); - break; - - } - - DoMeleeAttackIfReady(); - } - - void JustDied(Unit* /*killer*/) - { - if (instance) - { - instance->HandleGameObject(instance->GetData64(DATA_DOOR4), true); - instance->HandleGameObject(instance->GetData64(DATA_DOOR5), true); - instance->SetData(DATA_BROGGOK, DONE); - } - } - - void DoAction(int32 action) - { - switch (action) - { - case ACTION_PREPARE_BROGGOK: - me->SetInCombatWithZone(); - break; - case ACTION_ACTIVATE_BROGGOK: - events.ScheduleEvent(EVENT_SPELL_SLIME, 10000); - events.ScheduleEvent(EVENT_SPELL_POISON, 5000); - events.ScheduleEvent(EVENT_SPELL_BOLT, 7000); - - me->SetReactState(REACT_AGGRESSIVE); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NON_ATTACKABLE); - canAttack = true; - break; - } - } - - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_broggokAI(creature); + if (instance) + instance->SetData(DATA_BROGGOK, NOT_STARTED); } + + void EnterCombat(Unit* /*who*/) + { + Talk(SAY_AGGRO); + } + + void JustSummoned(Creature* summoned) + { + 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) + { + if (!UpdateVictim() || !canAttack) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.GetEvent()) + { + case EVENT_SPELL_SLIME: + me->CastSpell(me->GetVictim(), SPELL_SLIME_SPRAY, false); + events.RepeatEvent(urand(7000, 12000)); + break; + case EVENT_SPELL_BOLT: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + me->CastSpell(target, SPELL_POISON_BOLT, false); + events.RepeatEvent(urand(6000, 11000)); + break; + case EVENT_SPELL_POISON: + me->CastSpell(me, SPELL_POISON_CLOUD, false); + events.RepeatEvent(20000); + break; + + } + + DoMeleeAttackIfReady(); + } + + void JustDied(Unit* /*killer*/) + { + if (instance) + { + instance->HandleGameObject(instance->GetData64(DATA_DOOR4), true); + instance->HandleGameObject(instance->GetData64(DATA_DOOR5), true); + instance->SetData(DATA_BROGGOK, DONE); + } + } + + void DoAction(int32 action) + { + switch (action) + { + case ACTION_PREPARE_BROGGOK: + me->SetInCombatWithZone(); + break; + case ACTION_ACTIVATE_BROGGOK: + events.ScheduleEvent(EVENT_SPELL_SLIME, 10000); + events.ScheduleEvent(EVENT_SPELL_POISON, 5000); + events.ScheduleEvent(EVENT_SPELL_BOLT, 7000); + + me->SetReactState(REACT_AGGRESSIVE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NON_ATTACKABLE); + canAttack = true; + break; + } + } + + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_broggokAI(creature); + } }; class go_broggok_lever : public GameObjectScript { - public: - go_broggok_lever() : GameObjectScript("go_broggok_lever") {} +public: + go_broggok_lever() : GameObjectScript("go_broggok_lever") {} - bool OnGossipHello(Player* /*player*/, GameObject* go) override - { - if (InstanceScript* instance = go->GetInstanceScript()) - if (instance->GetData(DATA_BROGGOK) != DONE && instance->GetData(DATA_BROGGOK) != IN_PROGRESS) - if (Creature* broggok = ObjectAccessor::GetCreature(*go, instance->GetData64(DATA_BROGGOK))) - { - instance->SetData(DATA_BROGGOK, IN_PROGRESS); - broggok->AI()->DoAction(ACTION_PREPARE_BROGGOK); - } + bool OnGossipHello(Player* /*player*/, GameObject* go) override + { + if (InstanceScript* instance = go->GetInstanceScript()) + if (instance->GetData(DATA_BROGGOK) != DONE && instance->GetData(DATA_BROGGOK) != IN_PROGRESS) + if (Creature* broggok = ObjectAccessor::GetCreature(*go, instance->GetData64(DATA_BROGGOK))) + { + instance->SetData(DATA_BROGGOK, IN_PROGRESS); + broggok->AI()->DoAction(ACTION_PREPARE_BROGGOK); + } - go->UseDoorOrButton(); - return false; - } + 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") { } +public: + spell_broggok_poison_cloud() : SpellScriptLoader("spell_broggok_poison_cloud") { } - class spell_broggok_poison_cloud_AuraScript : public AuraScript + class spell_broggok_poison_cloud_AuraScript : public AuraScript + { + PrepareAuraScript(spell_broggok_poison_cloud_AuraScript); + + bool Validate(SpellInfo const* spellInfo) { - PrepareAuraScript(spell_broggok_poison_cloud_AuraScript); - - bool Validate(SpellInfo const* spellInfo) - { - 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() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_broggok_poison_cloud_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_broggok_poison_cloud_AuraScript(); + 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() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_broggok_poison_cloud_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_broggok_poison_cloud_AuraScript(); + } }; void AddSC_boss_broggok() 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 5cc693539..53cb95239 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 @@ -53,295 +53,295 @@ const float ShadowmoonChannelers[5][4] = class boss_kelidan_the_breaker : public CreatureScript { - public: +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 + { + boss_kelidan_the_breakerAI(Creature* creature) : ScriptedAI(creature) { + instance = creature->GetInstanceScript(); + memset(&channelers, 0, sizeof(channelers)); } - struct boss_kelidan_the_breakerAI : public ScriptedAI + InstanceScript* instance; + EventMap events; + uint64 channelers[5]; + uint32 checkTimer; + bool addYell; + + void Reset() { - boss_kelidan_the_breakerAI(Creature* creature) : ScriptedAI(creature) + addYell = false; + checkTimer = 5000; + + events.Reset(); + ApplyImmunities(true); + SummonChannelers(); + me->SetReactState(REACT_PASSIVE); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NON_ATTACKABLE); + if (instance) + instance->SetData(DATA_KELIDAN, NOT_STARTED); + } + + void EnterCombat(Unit* /*who*/) + { + events.ScheduleEvent(EVENT_SPELL_VOLLEY, 1000); + events.ScheduleEvent(EVENT_SPELL_CORRUPTION, 5000); + events.ScheduleEvent(EVENT_SPELL_BURNING_NOVA, 15000); + + me->InterruptNonMeleeSpells(false); + Talk(SAY_WAKE); + + if (instance) + instance->SetData(DATA_KELIDAN, IN_PROGRESS); + } + + void KilledUnit(Unit* /*victim*/) + { + if (urand(0, 1)) + Talk(SAY_KILL); + } + + void DoAction(int32 param) + { + if (param == ACTION_CHANNELER_ENGAGED) { - instance = creature->GetInstanceScript(); - memset(&channelers, 0, sizeof(channelers)); - } - - InstanceScript* instance; - EventMap events; - uint64 channelers[5]; - uint32 checkTimer; - bool addYell; - - void Reset() - { - addYell = false; - checkTimer = 5000; - - events.Reset(); - ApplyImmunities(true); - SummonChannelers(); - me->SetReactState(REACT_PASSIVE); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NON_ATTACKABLE); - if (instance) - instance->SetData(DATA_KELIDAN, NOT_STARTED); - } - - void EnterCombat(Unit* /*who*/) - { - events.ScheduleEvent(EVENT_SPELL_VOLLEY, 1000); - events.ScheduleEvent(EVENT_SPELL_CORRUPTION, 5000); - events.ScheduleEvent(EVENT_SPELL_BURNING_NOVA, 15000); - - me->InterruptNonMeleeSpells(false); - Talk(SAY_WAKE); - - if (instance) - instance->SetData(DATA_KELIDAN, IN_PROGRESS); - } - - void KilledUnit(Unit* /*victim*/) - { - if (urand(0,1)) - Talk(SAY_KILL); - } - - void DoAction(int32 param) - { - if (param == ACTION_CHANNELER_ENGAGED) - { - if (!addYell) - { - addYell = true; - Talk(SAY_ADD_AGGRO); - - for (uint8 i = 0; i < 5; ++i) - { - Creature* channeler = ObjectAccessor::GetCreature(*me, channelers[i]); - if (channeler && !channeler->IsInCombat()) - channeler->SetInCombatWithZone(); - } - } - } - else if (param == ACTION_CHANNELER_DIED) + if (!addYell) { + addYell = true; + Talk(SAY_ADD_AGGRO); + for (uint8 i = 0; i < 5; ++i) { Creature* channeler = ObjectAccessor::GetCreature(*me, channelers[i]); - if (channeler && channeler->IsAlive()) - return; - } - me->SetReactState(REACT_AGGRESSIVE); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NON_ATTACKABLE); - if (Unit* target = me->SelectNearestPlayer(100.0f)) - AttackStart(target); - } - } - - void CheckChannelers() - { - if (addYell) - { - if (!SelectTargetFromPlayerList(100.0f)) - EnterEvadeMode(); - return; - } - - SummonChannelers(); - for (uint8 i = 0; i < 5; ++i) - { - Creature* channeler = ObjectAccessor::GetCreature(*me, channelers[i]); - if (channeler && !channeler->HasUnitState(UNIT_STATE_CASTING) && !channeler->IsInCombat()) - { - Creature* target = ObjectAccessor::GetCreature(*me, channelers[(i+2)%5]); - if (target) - channeler->CastSpell(target, SPELL_CHANNELING, false); + if (channeler && !channeler->IsInCombat()) + channeler->SetInCombatWithZone(); } } } - - void SummonChannelers() + else if (param == ACTION_CHANNELER_DIED) { for (uint8 i = 0; i < 5; ++i) { Creature* channeler = ObjectAccessor::GetCreature(*me, channelers[i]); - if (channeler && channeler->isDead()) - { - channeler->DespawnOrUnsummon(1); - channeler = nullptr; - } - if (!channeler) - channeler = me->SummonCreature(NPC_CHANNELER, ShadowmoonChannelers[i][0], ShadowmoonChannelers[i][1], ShadowmoonChannelers[i][2], ShadowmoonChannelers[i][3], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000); - - channelers[i] = channeler ? channeler->GetGUID() : 0; + if (channeler && channeler->IsAlive()) + return; } + me->SetReactState(REACT_AGGRESSIVE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NON_ATTACKABLE); + if (Unit* target = me->SelectNearestPlayer(100.0f)) + AttackStart(target); } - - void JustDied(Unit* /*killer*/) - { - Talk(SAY_DIE); - if (instance) - { - // Xinef: load grid with start doors - me->GetMap()->LoadGrid(0, -111.0f); - instance->SetData(DATA_KELIDAN, DONE); - instance->HandleGameObject(instance->GetData64(DATA_DOOR1), true); - instance->HandleGameObject(instance->GetData64(DATA_DOOR6), true); - } - } - - void ApplyImmunities(bool apply) - { - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_CHARM, apply); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DISORIENTED, apply); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DISTRACT, apply); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FEAR, apply); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_ROOT, apply); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SILENCE, apply); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SLEEP, apply); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SNARE, apply); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_STUN, apply); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FREEZE, apply); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_KNOCKOUT, apply); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, apply); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_BANISH, apply); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SHACKLE, apply); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_TURN, apply); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_HORROR, apply); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DAZE, apply); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SAPPED, apply); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - { - checkTimer += diff; - if (checkTimer >= 5000) - { - checkTimer = 0; - CheckChannelers(); - if (!me->HasUnitState(UNIT_STATE_CASTING)) - me->CastSpell(me, SPELL_EVOCATION, false); - - } - return; - } - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.GetEvent()) - { - case EVENT_SPELL_VOLLEY: - me->CastSpell(me, SPELL_SHADOW_BOLT_VOLLEY, false); - events.RepeatEvent(urand(8000, 13000)); - break; - case EVENT_SPELL_CORRUPTION: - me->CastSpell(me, SPELL_CORRUPTION, false); - events.RepeatEvent(urand(30000, 50000)); - break; - case EVENT_SPELL_BURNING_NOVA: - Talk(SAY_NOVA); - - ApplyImmunities(false); - me->AddAura(SPELL_BURNING_NOVA, me); - ApplyImmunities(true); - - if (IsHeroic()) - DoTeleportAll(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); - - events.DelayEvents(6000, 0); - events.RepeatEvent(urand(25000, 32000)); - events.ScheduleEvent(EVENT_SPELL_FIRE_NOVA, 5000); - break; - case EVENT_SPELL_FIRE_NOVA: - me->CastSpell(me, SPELL_FIRE_NOVA, true); - events.PopEvent(); - break; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_kelidan_the_breakerAI(creature); } + + void CheckChannelers() + { + if (addYell) + { + if (!SelectTargetFromPlayerList(100.0f)) + EnterEvadeMode(); + return; + } + + SummonChannelers(); + for (uint8 i = 0; i < 5; ++i) + { + Creature* channeler = ObjectAccessor::GetCreature(*me, channelers[i]); + if (channeler && !channeler->HasUnitState(UNIT_STATE_CASTING) && !channeler->IsInCombat()) + { + Creature* target = ObjectAccessor::GetCreature(*me, channelers[(i + 2) % 5]); + if (target) + channeler->CastSpell(target, SPELL_CHANNELING, false); + } + } + } + + void SummonChannelers() + { + for (uint8 i = 0; i < 5; ++i) + { + Creature* channeler = ObjectAccessor::GetCreature(*me, channelers[i]); + if (channeler && channeler->isDead()) + { + channeler->DespawnOrUnsummon(1); + channeler = nullptr; + } + if (!channeler) + channeler = me->SummonCreature(NPC_CHANNELER, ShadowmoonChannelers[i][0], ShadowmoonChannelers[i][1], ShadowmoonChannelers[i][2], ShadowmoonChannelers[i][3], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000); + + channelers[i] = channeler ? channeler->GetGUID() : 0; + } + } + + void JustDied(Unit* /*killer*/) + { + Talk(SAY_DIE); + if (instance) + { + // Xinef: load grid with start doors + me->GetMap()->LoadGrid(0, -111.0f); + instance->SetData(DATA_KELIDAN, DONE); + instance->HandleGameObject(instance->GetData64(DATA_DOOR1), true); + instance->HandleGameObject(instance->GetData64(DATA_DOOR6), true); + } + } + + void ApplyImmunities(bool apply) + { + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_CHARM, apply); + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DISORIENTED, apply); + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DISTRACT, apply); + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FEAR, apply); + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_ROOT, apply); + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SILENCE, apply); + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SLEEP, apply); + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SNARE, apply); + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_STUN, apply); + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FREEZE, apply); + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_KNOCKOUT, apply); + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, apply); + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_BANISH, apply); + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SHACKLE, apply); + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_TURN, apply); + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_HORROR, apply); + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DAZE, apply); + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SAPPED, apply); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + { + checkTimer += diff; + if (checkTimer >= 5000) + { + checkTimer = 0; + CheckChannelers(); + if (!me->HasUnitState(UNIT_STATE_CASTING)) + me->CastSpell(me, SPELL_EVOCATION, false); + + } + return; + } + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.GetEvent()) + { + case EVENT_SPELL_VOLLEY: + me->CastSpell(me, SPELL_SHADOW_BOLT_VOLLEY, false); + events.RepeatEvent(urand(8000, 13000)); + break; + case EVENT_SPELL_CORRUPTION: + me->CastSpell(me, SPELL_CORRUPTION, false); + events.RepeatEvent(urand(30000, 50000)); + break; + case EVENT_SPELL_BURNING_NOVA: + Talk(SAY_NOVA); + + ApplyImmunities(false); + me->AddAura(SPELL_BURNING_NOVA, me); + ApplyImmunities(true); + + if (IsHeroic()) + DoTeleportAll(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); + + events.DelayEvents(6000, 0); + events.RepeatEvent(urand(25000, 32000)); + events.ScheduleEvent(EVENT_SPELL_FIRE_NOVA, 5000); + break; + case EVENT_SPELL_FIRE_NOVA: + me->CastSpell(me, SPELL_FIRE_NOVA, true); + events.PopEvent(); + break; + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_kelidan_the_breakerAI(creature); + } }; class npc_shadowmoon_channeler : public CreatureScript { - public: +public: - npc_shadowmoon_channeler() : CreatureScript("npc_shadowmoon_channeler") {} + npc_shadowmoon_channeler() : CreatureScript("npc_shadowmoon_channeler") {} - struct npc_shadowmoon_channelerAI : public ScriptedAI + struct npc_shadowmoon_channelerAI : public ScriptedAI + { + npc_shadowmoon_channelerAI(Creature* creature) : ScriptedAI(creature) {} + + EventMap events; + + void Reset() { - npc_shadowmoon_channelerAI(Creature* creature) : ScriptedAI(creature){} - - EventMap events; - - void Reset() - { - events.Reset(); - } - - Creature* GetKelidan() - { - if (me->GetInstanceScript()) - return ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetData64(DATA_KELIDAN)); - return nullptr; - } - - void EnterCombat(Unit* /*who*/) - { - if (Creature* kelidan = GetKelidan()) - kelidan->AI()->DoAction(ACTION_CHANNELER_ENGAGED); - - me->InterruptNonMeleeSpells(false); - events.ScheduleEvent(EVENT_SPELL_SHADOW_BOLT, urand(1500, 3500)); - events.ScheduleEvent(EVENT_SPELL_MARK, urand(5000, 6500)); - } - - void JustDied(Unit* /*killer*/) - { - if (Creature* kelidan = GetKelidan()) - kelidan->AI()->DoAction(ACTION_CHANNELER_DIED); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.GetEvent()) - { - case EVENT_SPELL_SHADOW_BOLT: - me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_SHADOW_BOLT_H : SPELL_SHADOW_BOLT, false); - events.RepeatEvent(urand(6000, 7500)); - break; - case EVENT_SPELL_MARK: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - me->CastSpell(target, SPELL_MARK_OF_SHADOW, false); - events.RepeatEvent(urand(16000, 17500)); - break; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_shadowmoon_channelerAI(creature); + events.Reset(); } + + Creature* GetKelidan() + { + if (me->GetInstanceScript()) + return ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetData64(DATA_KELIDAN)); + return nullptr; + } + + void EnterCombat(Unit* /*who*/) + { + if (Creature* kelidan = GetKelidan()) + kelidan->AI()->DoAction(ACTION_CHANNELER_ENGAGED); + + me->InterruptNonMeleeSpells(false); + events.ScheduleEvent(EVENT_SPELL_SHADOW_BOLT, urand(1500, 3500)); + events.ScheduleEvent(EVENT_SPELL_MARK, urand(5000, 6500)); + } + + void JustDied(Unit* /*killer*/) + { + if (Creature* kelidan = GetKelidan()) + kelidan->AI()->DoAction(ACTION_CHANNELER_DIED); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.GetEvent()) + { + case EVENT_SPELL_SHADOW_BOLT: + me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_SHADOW_BOLT_H : SPELL_SHADOW_BOLT, false); + events.RepeatEvent(urand(6000, 7500)); + break; + case EVENT_SPELL_MARK: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + me->CastSpell(target, SPELL_MARK_OF_SHADOW, false); + events.RepeatEvent(urand(16000, 17500)); + break; + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_shadowmoon_channelerAI(creature); + } }; void AddSC_boss_kelidan_the_breaker() 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 659b1f36b..b1444272e 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp @@ -25,105 +25,105 @@ enum eEnums class boss_the_maker : public CreatureScript { - public: +public: - boss_the_maker() : CreatureScript("boss_the_maker") + boss_the_maker() : CreatureScript("boss_the_maker") + { + } + + struct boss_the_makerAI : public ScriptedAI + { + boss_the_makerAI(Creature* creature) : ScriptedAI(creature) { + instance = creature->GetInstanceScript(); } - struct boss_the_makerAI : public ScriptedAI + InstanceScript* instance; + EventMap events; + + void Reset() { - boss_the_makerAI(Creature* creature) : ScriptedAI(creature) - { - instance = creature->GetInstanceScript(); - } + events.Reset(); + if (!instance) + return; - InstanceScript* instance; - EventMap events; - - void Reset() - { - events.Reset(); - if (!instance) - return; - - instance->SetData(DATA_THE_MAKER, NOT_STARTED); - instance->HandleGameObject(instance->GetData64(DATA_DOOR2), true); - } - - void EnterCombat(Unit* /*who*/) - { - Talk(SAY_AGGRO); - events.ScheduleEvent(EVENT_SPELL_ACID, 15000); - events.ScheduleEvent(EVENT_SPELL_EXPLODING, 6000); - events.ScheduleEvent(EVENT_SPELL_DOMINATION, 120000); - events.ScheduleEvent(EVENT_SPELL_KNOCKDOWN, 10000); - - if (!instance) - return; - - instance->SetData(DATA_THE_MAKER, IN_PROGRESS); - instance->HandleGameObject(instance->GetData64(DATA_DOOR2), false); - } - - void KilledUnit(Unit* victim) - { - if (victim->GetTypeId() == TYPEID_PLAYER && urand(0,1)) - Talk(SAY_KILL); - } - - void JustDied(Unit* /*killer*/) - { - Talk(SAY_DIE); - - if (!instance) - return; - - instance->SetData(DATA_THE_MAKER, DONE); - instance->HandleGameObject(instance->GetData64(DATA_DOOR2), true); - instance->HandleGameObject(instance->GetData64(DATA_DOOR3), true); - - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.GetEvent()) - { - case EVENT_SPELL_ACID: - me->CastSpell(me->GetVictim(), SPELL_ACID_SPRAY, false); - events.RepeatEvent(urand(15000, 23000)); - break; - case EVENT_SPELL_EXPLODING: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - me->CastSpell(target, SPELL_EXPLODING_BREAKER, false); - events.RepeatEvent(urand(7000, 11000)); - break; - case EVENT_SPELL_DOMINATION: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - me->CastSpell(target, SPELL_DOMINATION, false); - events.RepeatEvent(120000); - break; - case EVENT_SPELL_KNOCKDOWN: - me->CastSpell(me->GetVictim(), SPELL_KNOCKDOWN, false); - events.RepeatEvent(urand(4000, 12000)); - break; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_the_makerAI(creature); + instance->SetData(DATA_THE_MAKER, NOT_STARTED); + instance->HandleGameObject(instance->GetData64(DATA_DOOR2), true); } + + void EnterCombat(Unit* /*who*/) + { + Talk(SAY_AGGRO); + events.ScheduleEvent(EVENT_SPELL_ACID, 15000); + events.ScheduleEvent(EVENT_SPELL_EXPLODING, 6000); + events.ScheduleEvent(EVENT_SPELL_DOMINATION, 120000); + events.ScheduleEvent(EVENT_SPELL_KNOCKDOWN, 10000); + + if (!instance) + return; + + instance->SetData(DATA_THE_MAKER, IN_PROGRESS); + instance->HandleGameObject(instance->GetData64(DATA_DOOR2), false); + } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER && urand(0, 1)) + Talk(SAY_KILL); + } + + void JustDied(Unit* /*killer*/) + { + Talk(SAY_DIE); + + if (!instance) + return; + + instance->SetData(DATA_THE_MAKER, DONE); + instance->HandleGameObject(instance->GetData64(DATA_DOOR2), true); + instance->HandleGameObject(instance->GetData64(DATA_DOOR3), true); + + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.GetEvent()) + { + case EVENT_SPELL_ACID: + me->CastSpell(me->GetVictim(), SPELL_ACID_SPRAY, false); + events.RepeatEvent(urand(15000, 23000)); + break; + case EVENT_SPELL_EXPLODING: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + me->CastSpell(target, SPELL_EXPLODING_BREAKER, false); + events.RepeatEvent(urand(7000, 11000)); + break; + case EVENT_SPELL_DOMINATION: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + me->CastSpell(target, SPELL_DOMINATION, false); + events.RepeatEvent(120000); + break; + case EVENT_SPELL_KNOCKDOWN: + me->CastSpell(me->GetVictim(), SPELL_KNOCKDOWN, false); + events.RepeatEvent(urand(4000, 12000)); + break; + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_the_makerAI(creature); + } }; void AddSC_boss_the_maker() 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 9bdbdaf8f..c73123cc6 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp @@ -9,317 +9,317 @@ class instance_blood_furnace : public InstanceMapScript { - public: - instance_blood_furnace() : InstanceMapScript("instance_blood_furnace", 542) {} +public: + instance_blood_furnace() : InstanceMapScript("instance_blood_furnace", 542) {} - struct instance_blood_furnace_InstanceMapScript : public InstanceScript + struct instance_blood_furnace_InstanceMapScript : public InstanceScript + { + instance_blood_furnace_InstanceMapScript(Map* map) : InstanceScript(map) {} + + uint32 _auiEncounter[MAX_ENCOUNTER]; + uint64 _bossGUIDs[3]; + uint64 _doorGUIDs[6]; + uint64 _prisonGUIDs[4]; + + std::set _prisonersCell[4]; + + uint8 _prisonerCounter[4]; + + uint64 _broggokLeverGUID; + + void Initialize() { - instance_blood_furnace_InstanceMapScript(Map* map) : InstanceScript(map) {} + memset(&_auiEncounter, 0, sizeof(_auiEncounter)); + memset(&_bossGUIDs, 0, sizeof(_bossGUIDs)); + memset(&_doorGUIDs, 0, sizeof(_doorGUIDs)); + memset(&_prisonGUIDs, 0, sizeof(_prisonGUIDs)); + memset(&_prisonerCounter, 0, sizeof(_prisonerCounter)); - uint32 _auiEncounter[MAX_ENCOUNTER]; - uint64 _bossGUIDs[3]; - uint64 _doorGUIDs[6]; - uint64 _prisonGUIDs[4]; + for (uint8 i = 0; i < 4; ++i) + _prisonersCell[i].clear(); - std::set _prisonersCell[4]; - - uint8 _prisonerCounter[4]; - - uint64 _broggokLeverGUID; - - void Initialize() - { - memset(&_auiEncounter, 0, sizeof(_auiEncounter)); - memset(&_bossGUIDs, 0, sizeof(_bossGUIDs)); - memset(&_doorGUIDs, 0, sizeof(_doorGUIDs)); - memset(&_prisonGUIDs, 0, sizeof(_prisonGUIDs)); - memset(&_prisonerCounter, 0, sizeof(_prisonerCounter)); - - for (uint8 i = 0; i < 4; ++i) - _prisonersCell[i].clear(); - - _broggokLeverGUID = 0; - } - - void OnCreatureCreate(Creature* creature) - { - switch (creature->GetEntry()) - { - case NPC_THE_MAKER: - _bossGUIDs[DATA_THE_MAKER] = creature->GetGUID(); - break; - case NPC_BROGGOK: - _bossGUIDs[DATA_BROGGOK] = creature->GetGUID(); - break; - case NPC_KELIDAN: - _bossGUIDs[DATA_KELIDAN] = creature->GetGUID(); - break; - case NPC_NASCENT_FEL_ORC: - StorePrisoner(creature); - break; - } - } - - void OnUnitDeath(Unit* unit) - { - if (unit && unit->GetTypeId() == TYPEID_UNIT && unit->GetEntry() == NPC_NASCENT_FEL_ORC) - PrisonerDied(unit->GetGUID()); - } - - void OnGameObjectCreate(GameObject* go) - { - if (go->GetEntry() == 181766) //Final exit door - _doorGUIDs[0] = go->GetGUID(); - if (go->GetEntry() == 181811) //The Maker Front door - _doorGUIDs[1] = go->GetGUID(); - if (go->GetEntry() == 181812) //The Maker Rear door - { - _doorGUIDs[2] = go->GetGUID(); - if (GetData(DATA_THE_MAKER) == DONE) - HandleGameObject(go->GetGUID(), true); - } - if (go->GetEntry() == 181822) //Broggok Front door - _doorGUIDs[3] = go->GetGUID(); - if (go->GetEntry() == 181819) //Broggok Rear door - { - _doorGUIDs[4] = go->GetGUID(); - if (GetData(DATA_BROGGOK) == DONE) - HandleGameObject(go->GetGUID(), true); - } - if (go->GetEntry() == 181823) //Kelidan exit door - _doorGUIDs[5] = go->GetGUID(); - - if (go->GetEntry() == 181821) //Broggok prison cell front right - _prisonGUIDs[0] = go->GetGUID(); - if (go->GetEntry() == 181818) //Broggok prison cell back right - _prisonGUIDs[1] = go->GetGUID(); - if (go->GetEntry() == 181820) //Broggok prison cell front left - _prisonGUIDs[2] = go->GetGUID(); - if (go->GetEntry() == 181817) //Broggok prison cell back left - _prisonGUIDs[3] = go->GetGUID(); - - if (go->GetEntry() == 181982) - _broggokLeverGUID = go->GetGUID(); //Broggok lever - } - - uint64 GetData64(uint32 data) const - { - switch (data) - { - case DATA_THE_MAKER: - case DATA_BROGGOK: - case DATA_KELIDAN: - return _bossGUIDs[data]; - - case DATA_DOOR1: - case DATA_DOOR2: - case DATA_DOOR3: - case DATA_DOOR4: - case DATA_DOOR5: - case DATA_DOOR6: - return _doorGUIDs[data-DATA_DOOR1]; - - case DATA_PRISON_CELL1: - case DATA_PRISON_CELL2: - case DATA_PRISON_CELL3: - case DATA_PRISON_CELL4: - return _prisonGUIDs[data-DATA_PRISON_CELL1]; - } - return 0; - } - - void SetData(uint32 type, uint32 data) - { - switch (type) - { - case DATA_THE_MAKER: - case DATA_BROGGOK: - case DATA_KELIDAN: - _auiEncounter[type] = data; - if (type == DATA_BROGGOK) - UpdateBroggokEvent(data); - break; - } - - if (data == DONE) - SaveToDB(); - } - - std::string GetSaveData() - { - OUT_SAVE_INST_DATA; - - std::ostringstream saveStream; - saveStream << "B F " << _auiEncounter[0] << ' ' << _auiEncounter[1] << ' ' << _auiEncounter[2]; - - OUT_SAVE_INST_DATA_COMPLETE; - return saveStream.str(); - } - - uint32 GetData(uint32 type) const - { - switch (type) - { - case DATA_THE_MAKER: - case DATA_BROGGOK: - case DATA_KELIDAN: - return _auiEncounter[type]; - } - return 0; - } - - void Load(const char* strIn) - { - if (!strIn) - { - OUT_LOAD_INST_DATA_FAIL; - return; - } - - OUT_LOAD_INST_DATA(strIn); - - char dataHead1, dataHead2; - - std::istringstream loadStream(strIn); - loadStream >> dataHead1 >> dataHead2; - - if (dataHead1 == 'B' && dataHead2 == 'F') - { - loadStream >> _auiEncounter[0] >> _auiEncounter[1] >> _auiEncounter[2]; - - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (_auiEncounter[i] == IN_PROGRESS || _auiEncounter[i] == FAIL) - _auiEncounter[i] = NOT_STARTED; - } - - OUT_LOAD_INST_DATA_COMPLETE; - } - - void UpdateBroggokEvent(uint32 data) - { - switch (data) - { - case IN_PROGRESS: - ActivateCell(DATA_PRISON_CELL1); - HandleGameObject(_doorGUIDs[3], false); - break; - case NOT_STARTED: - ResetPrisons(); - HandleGameObject(_doorGUIDs[4], false); - HandleGameObject(_doorGUIDs[3], true); - if (GameObject* lever = instance->GetGameObject(_broggokLeverGUID)) - lever->Respawn(); - break; - } - } - - void ResetPrisons() - { - for (uint8 i = 0; i < 4; ++i) - { - _prisonerCounter[i] = _prisonersCell[i].size(); - ResetPrisoners(_prisonersCell[i]); - HandleGameObject(_prisonGUIDs[i], false); - } - } - - void ResetPrisoners(std::set prisoners) - { - for (std::set::iterator i = prisoners.begin(); i != prisoners.end(); ++i) - if (Creature* prisoner = instance->GetCreature(*i)) - ResetPrisoner(prisoner); - } - - void ResetPrisoner(Creature* prisoner) - { - if (!prisoner->IsAlive()) - prisoner->Respawn(true); - prisoner->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NON_ATTACKABLE); - } - - void StorePrisoner(Creature* creature) - { - float posX = creature->GetPositionX(); - float posY = creature->GetPositionY(); - - if (posX >= 405.0f && posX <= 423.0f) - { - if (posY >= 106.0f && posY <= 123.0f) - { - _prisonersCell[0].insert(creature->GetGUID()); - ++_prisonerCounter[0]; - ResetPrisoner(creature); - } - else if (posY >= 76.0f && posY <= 91.0f) - { - _prisonersCell[1].insert(creature->GetGUID()); - ++_prisonerCounter[1]; - ResetPrisoner(creature); - } - } - else if (posX >= 490.0f && posX <= 506.0f) - { - if (posY >= 106.0f && posY <= 123.0f) - { - _prisonersCell[2].insert(creature->GetGUID()); - ++_prisonerCounter[2]; - ResetPrisoner(creature); - } - else if (posY >= 76.0f && posY <= 91.0f) - { - _prisonersCell[3].insert(creature->GetGUID()); - ++_prisonerCounter[3]; - ResetPrisoner(creature); - } - } - } - - void PrisonerDied(uint64 guid) - { - if (_prisonersCell[0].find(guid) != _prisonersCell[0].end() && --_prisonerCounter[0] <= 0) - ActivateCell(DATA_PRISON_CELL2); - else if (_prisonersCell[1].find(guid) != _prisonersCell[1].end() && --_prisonerCounter[1] <= 0) - ActivateCell(DATA_PRISON_CELL3); - else if (_prisonersCell[2].find(guid) != _prisonersCell[2].end() && --_prisonerCounter[2] <= 0) - ActivateCell(DATA_PRISON_CELL4); - else if (_prisonersCell[3].find(guid) != _prisonersCell[3].end() && --_prisonerCounter[3] <= 0) - ActivateCell(DATA_DOOR5); - } - - void ActivateCell(uint8 id) - { - switch (id) - { - case DATA_PRISON_CELL1: - case DATA_PRISON_CELL2: - case DATA_PRISON_CELL3: - case DATA_PRISON_CELL4: - HandleGameObject(_prisonGUIDs[id-DATA_PRISON_CELL1], true); - ActivatePrisoners(_prisonersCell[id-DATA_PRISON_CELL1]); - break; - case DATA_DOOR5: - HandleGameObject(_doorGUIDs[4], true); - if (Creature* broggok = instance->GetCreature(GetData64(DATA_BROGGOK))) - broggok->AI()->DoAction(ACTION_ACTIVATE_BROGGOK); - break; - } - } - - void ActivatePrisoners(std::set prisoners) - { - for (std::set::iterator i = prisoners.begin(); i != prisoners.end(); ++i) - if (Creature* prisoner = instance->GetCreature(*i)) - { - prisoner->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NON_ATTACKABLE); - prisoner->SetInCombatWithZone(); - } - } - }; - - InstanceScript* GetInstanceScript(InstanceMap* map) const - { - return new instance_blood_furnace_InstanceMapScript(map); + _broggokLeverGUID = 0; } + + void OnCreatureCreate(Creature* creature) + { + switch (creature->GetEntry()) + { + case NPC_THE_MAKER: + _bossGUIDs[DATA_THE_MAKER] = creature->GetGUID(); + break; + case NPC_BROGGOK: + _bossGUIDs[DATA_BROGGOK] = creature->GetGUID(); + break; + case NPC_KELIDAN: + _bossGUIDs[DATA_KELIDAN] = creature->GetGUID(); + break; + case NPC_NASCENT_FEL_ORC: + StorePrisoner(creature); + break; + } + } + + void OnUnitDeath(Unit* unit) + { + if (unit && unit->GetTypeId() == TYPEID_UNIT && unit->GetEntry() == NPC_NASCENT_FEL_ORC) + PrisonerDied(unit->GetGUID()); + } + + void OnGameObjectCreate(GameObject* go) + { + if (go->GetEntry() == 181766) //Final exit door + _doorGUIDs[0] = go->GetGUID(); + if (go->GetEntry() == 181811) //The Maker Front door + _doorGUIDs[1] = go->GetGUID(); + if (go->GetEntry() == 181812) //The Maker Rear door + { + _doorGUIDs[2] = go->GetGUID(); + if (GetData(DATA_THE_MAKER) == DONE) + HandleGameObject(go->GetGUID(), true); + } + if (go->GetEntry() == 181822) //Broggok Front door + _doorGUIDs[3] = go->GetGUID(); + if (go->GetEntry() == 181819) //Broggok Rear door + { + _doorGUIDs[4] = go->GetGUID(); + if (GetData(DATA_BROGGOK) == DONE) + HandleGameObject(go->GetGUID(), true); + } + if (go->GetEntry() == 181823) //Kelidan exit door + _doorGUIDs[5] = go->GetGUID(); + + if (go->GetEntry() == 181821) //Broggok prison cell front right + _prisonGUIDs[0] = go->GetGUID(); + if (go->GetEntry() == 181818) //Broggok prison cell back right + _prisonGUIDs[1] = go->GetGUID(); + if (go->GetEntry() == 181820) //Broggok prison cell front left + _prisonGUIDs[2] = go->GetGUID(); + if (go->GetEntry() == 181817) //Broggok prison cell back left + _prisonGUIDs[3] = go->GetGUID(); + + if (go->GetEntry() == 181982) + _broggokLeverGUID = go->GetGUID(); //Broggok lever + } + + uint64 GetData64(uint32 data) const + { + switch (data) + { + case DATA_THE_MAKER: + case DATA_BROGGOK: + case DATA_KELIDAN: + return _bossGUIDs[data]; + + case DATA_DOOR1: + case DATA_DOOR2: + case DATA_DOOR3: + case DATA_DOOR4: + case DATA_DOOR5: + case DATA_DOOR6: + return _doorGUIDs[data - DATA_DOOR1]; + + case DATA_PRISON_CELL1: + case DATA_PRISON_CELL2: + case DATA_PRISON_CELL3: + case DATA_PRISON_CELL4: + return _prisonGUIDs[data - DATA_PRISON_CELL1]; + } + return 0; + } + + void SetData(uint32 type, uint32 data) + { + switch (type) + { + case DATA_THE_MAKER: + case DATA_BROGGOK: + case DATA_KELIDAN: + _auiEncounter[type] = data; + if (type == DATA_BROGGOK) + UpdateBroggokEvent(data); + break; + } + + if (data == DONE) + SaveToDB(); + } + + std::string GetSaveData() + { + OUT_SAVE_INST_DATA; + + std::ostringstream saveStream; + saveStream << "B F " << _auiEncounter[0] << ' ' << _auiEncounter[1] << ' ' << _auiEncounter[2]; + + OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); + } + + uint32 GetData(uint32 type) const + { + switch (type) + { + case DATA_THE_MAKER: + case DATA_BROGGOK: + case DATA_KELIDAN: + return _auiEncounter[type]; + } + return 0; + } + + void Load(const char* strIn) + { + if (!strIn) + { + OUT_LOAD_INST_DATA_FAIL; + return; + } + + OUT_LOAD_INST_DATA(strIn); + + char dataHead1, dataHead2; + + std::istringstream loadStream(strIn); + loadStream >> dataHead1 >> dataHead2; + + if (dataHead1 == 'B' && dataHead2 == 'F') + { + loadStream >> _auiEncounter[0] >> _auiEncounter[1] >> _auiEncounter[2]; + + for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) + if (_auiEncounter[i] == IN_PROGRESS || _auiEncounter[i] == FAIL) + _auiEncounter[i] = NOT_STARTED; + } + + OUT_LOAD_INST_DATA_COMPLETE; + } + + void UpdateBroggokEvent(uint32 data) + { + switch (data) + { + case IN_PROGRESS: + ActivateCell(DATA_PRISON_CELL1); + HandleGameObject(_doorGUIDs[3], false); + break; + case NOT_STARTED: + ResetPrisons(); + HandleGameObject(_doorGUIDs[4], false); + HandleGameObject(_doorGUIDs[3], true); + if (GameObject* lever = instance->GetGameObject(_broggokLeverGUID)) + lever->Respawn(); + break; + } + } + + void ResetPrisons() + { + for (uint8 i = 0; i < 4; ++i) + { + _prisonerCounter[i] = _prisonersCell[i].size(); + ResetPrisoners(_prisonersCell[i]); + HandleGameObject(_prisonGUIDs[i], false); + } + } + + void ResetPrisoners(std::set prisoners) + { + for (std::set::iterator i = prisoners.begin(); i != prisoners.end(); ++i) + if (Creature* prisoner = instance->GetCreature(*i)) + ResetPrisoner(prisoner); + } + + void ResetPrisoner(Creature* prisoner) + { + if (!prisoner->IsAlive()) + prisoner->Respawn(true); + prisoner->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NON_ATTACKABLE); + } + + void StorePrisoner(Creature* creature) + { + float posX = creature->GetPositionX(); + float posY = creature->GetPositionY(); + + if (posX >= 405.0f && posX <= 423.0f) + { + if (posY >= 106.0f && posY <= 123.0f) + { + _prisonersCell[0].insert(creature->GetGUID()); + ++_prisonerCounter[0]; + ResetPrisoner(creature); + } + else if (posY >= 76.0f && posY <= 91.0f) + { + _prisonersCell[1].insert(creature->GetGUID()); + ++_prisonerCounter[1]; + ResetPrisoner(creature); + } + } + else if (posX >= 490.0f && posX <= 506.0f) + { + if (posY >= 106.0f && posY <= 123.0f) + { + _prisonersCell[2].insert(creature->GetGUID()); + ++_prisonerCounter[2]; + ResetPrisoner(creature); + } + else if (posY >= 76.0f && posY <= 91.0f) + { + _prisonersCell[3].insert(creature->GetGUID()); + ++_prisonerCounter[3]; + ResetPrisoner(creature); + } + } + } + + void PrisonerDied(uint64 guid) + { + if (_prisonersCell[0].find(guid) != _prisonersCell[0].end() && --_prisonerCounter[0] <= 0) + ActivateCell(DATA_PRISON_CELL2); + else if (_prisonersCell[1].find(guid) != _prisonersCell[1].end() && --_prisonerCounter[1] <= 0) + ActivateCell(DATA_PRISON_CELL3); + else if (_prisonersCell[2].find(guid) != _prisonersCell[2].end() && --_prisonerCounter[2] <= 0) + ActivateCell(DATA_PRISON_CELL4); + else if (_prisonersCell[3].find(guid) != _prisonersCell[3].end() && --_prisonerCounter[3] <= 0) + ActivateCell(DATA_DOOR5); + } + + void ActivateCell(uint8 id) + { + switch (id) + { + case DATA_PRISON_CELL1: + case DATA_PRISON_CELL2: + case DATA_PRISON_CELL3: + case DATA_PRISON_CELL4: + HandleGameObject(_prisonGUIDs[id - DATA_PRISON_CELL1], true); + ActivatePrisoners(_prisonersCell[id - DATA_PRISON_CELL1]); + break; + case DATA_DOOR5: + HandleGameObject(_doorGUIDs[4], true); + if (Creature* broggok = instance->GetCreature(GetData64(DATA_BROGGOK))) + broggok->AI()->DoAction(ACTION_ACTIVATE_BROGGOK); + break; + } + } + + void ActivatePrisoners(std::set prisoners) + { + for (std::set::iterator i = prisoners.begin(); i != prisoners.end(); ++i) + if (Creature* prisoner = instance->GetCreature(*i)) + { + prisoner->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NON_ATTACKABLE); + prisoner->SetInCombatWithZone(); + } + } + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_blood_furnace_InstanceMapScript(map); + } }; void AddSC_instance_blood_furnace() diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp index 28fad1537..0da3ae586 100644 --- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp @@ -39,134 +39,134 @@ enum Misc class boss_omor_the_unscarred : public CreatureScript { - public: - boss_omor_the_unscarred() : CreatureScript("boss_omor_the_unscarred") { } +public: + boss_omor_the_unscarred() : CreatureScript("boss_omor_the_unscarred") { } - struct boss_omor_the_unscarredAI : public BossAI + struct boss_omor_the_unscarredAI : public BossAI + { + boss_omor_the_unscarredAI(Creature* creature) : BossAI(creature, DATA_OMOR_THE_UNSCARRED) { - boss_omor_the_unscarredAI(Creature* creature) : BossAI(creature, DATA_OMOR_THE_UNSCARRED) - { - } - - void Reset() - { - Talk(SAY_WIPE); - BossAI::Reset(); - _targetGUID = 0; - } - - void EnterCombat(Unit* who) - { - Talk(SAY_AGGRO); - BossAI::EnterCombat(who); - - events.ScheduleEvent(EVENT_SUMMON1, 10000); - events.ScheduleEvent(EVENT_SUMMON2, 25000); - events.ScheduleEvent(EVENT_TREACHEROUS_AURA, 6000); - events.ScheduleEvent(EVENT_DEMONIC_SHIELD, 1000); - events.ScheduleEvent(EVENT_ORBITAL_STRIKE, 20000); - } - - void KilledUnit(Unit*) - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(SAY_KILL); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); - } - } - - void JustSummoned(Creature* summon) - { - Talk(SAY_SUMMON); - summons.Summon(summon); - summon->SetInCombatWithZone(); - } - - void JustDied(Unit* killer) - { - Talk(SAY_DIE); - BossAI::JustDied(killer); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SUMMON1: - Talk(SAY_SUMMON); - me->CastSpell(me, SPELL_SUMMON_FIENDISH_HOUND, false); - break; - case EVENT_SUMMON2: - me->CastSpell(me, SPELL_SUMMON_FIENDISH_HOUND, false); - events.ScheduleEvent(EVENT_SUMMON2, 15000); - break; - case EVENT_TREACHEROUS_AURA: - if (roll_chance_i(33)) - Talk(SAY_CURSE); - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - me->CastSpell(target, SPELL_TREACHEROUS_AURA, false); - events.ScheduleEvent(EVENT_TREACHEROUS_AURA, urand(12000, 18000)); - break; - case EVENT_DEMONIC_SHIELD: - if (me->HealthBelowPct(21)) - { - me->CastSpell(me, SPELL_DEMONIC_SHIELD, false); - events.ScheduleEvent(EVENT_DEMONIC_SHIELD, 15000); - } - else - events.ScheduleEvent(EVENT_DEMONIC_SHIELD, 1000); - break; - case EVENT_ORBITAL_STRIKE: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 15.0f, true)) - { - _targetGUID = target->GetGUID(); - me->CastSpell(target, SPELL_ORBITAL_STRIKE, false); - events.DelayEvents(5000); - events.ScheduleEvent(EVENT_SHADOW_WHIP, 4000); - me->GetMotionMaster()->Clear(); - } - events.ScheduleEvent(EVENT_ORBITAL_STRIKE, 20000); - break; - case EVENT_SHADOW_WHIP: - me->GetMotionMaster()->MoveChase(me->GetVictim()); - if (Unit* target = ObjectAccessor::GetUnit(*me, _targetGUID)) - me->CastSpell(target, SPELL_SHADOW_WHIP, false); - _targetGUID = 0; - break; - } - - if (!me->GetVictim() || !me->isAttackReady()) - return; - - if (me->IsWithinMeleeRange(me->GetVictim())) - { - me->GetMotionMaster()->MoveChase(me->GetVictim()); - DoMeleeAttackIfReady(); - } - else - { - me->GetMotionMaster()->Clear(); - me->CastSpell(me->GetVictim(), SPELL_SHADOW_BOLT, false); - me->resetAttackTimer(); - } - } - - private: - uint64 _targetGUID; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); } + + void Reset() + { + Talk(SAY_WIPE); + BossAI::Reset(); + _targetGUID = 0; + } + + void EnterCombat(Unit* who) + { + Talk(SAY_AGGRO); + BossAI::EnterCombat(who); + + events.ScheduleEvent(EVENT_SUMMON1, 10000); + events.ScheduleEvent(EVENT_SUMMON2, 25000); + events.ScheduleEvent(EVENT_TREACHEROUS_AURA, 6000); + events.ScheduleEvent(EVENT_DEMONIC_SHIELD, 1000); + events.ScheduleEvent(EVENT_ORBITAL_STRIKE, 20000); + } + + void KilledUnit(Unit*) + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + { + Talk(SAY_KILL); + events.ScheduleEvent(EVENT_KILL_TALK, 6000); + } + } + + void JustSummoned(Creature* summon) + { + Talk(SAY_SUMMON); + summons.Summon(summon); + summon->SetInCombatWithZone(); + } + + void JustDied(Unit* killer) + { + Talk(SAY_DIE); + BossAI::JustDied(killer); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_SUMMON1: + Talk(SAY_SUMMON); + me->CastSpell(me, SPELL_SUMMON_FIENDISH_HOUND, false); + break; + case EVENT_SUMMON2: + me->CastSpell(me, SPELL_SUMMON_FIENDISH_HOUND, false); + events.ScheduleEvent(EVENT_SUMMON2, 15000); + break; + case EVENT_TREACHEROUS_AURA: + if (roll_chance_i(33)) + Talk(SAY_CURSE); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + me->CastSpell(target, SPELL_TREACHEROUS_AURA, false); + events.ScheduleEvent(EVENT_TREACHEROUS_AURA, urand(12000, 18000)); + break; + case EVENT_DEMONIC_SHIELD: + if (me->HealthBelowPct(21)) + { + me->CastSpell(me, SPELL_DEMONIC_SHIELD, false); + events.ScheduleEvent(EVENT_DEMONIC_SHIELD, 15000); + } + else + events.ScheduleEvent(EVENT_DEMONIC_SHIELD, 1000); + break; + case EVENT_ORBITAL_STRIKE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 15.0f, true)) + { + _targetGUID = target->GetGUID(); + me->CastSpell(target, SPELL_ORBITAL_STRIKE, false); + events.DelayEvents(5000); + events.ScheduleEvent(EVENT_SHADOW_WHIP, 4000); + me->GetMotionMaster()->Clear(); + } + events.ScheduleEvent(EVENT_ORBITAL_STRIKE, 20000); + break; + case EVENT_SHADOW_WHIP: + me->GetMotionMaster()->MoveChase(me->GetVictim()); + if (Unit* target = ObjectAccessor::GetUnit(*me, _targetGUID)) + me->CastSpell(target, SPELL_SHADOW_WHIP, false); + _targetGUID = 0; + break; + } + + if (!me->GetVictim() || !me->isAttackReady()) + return; + + if (me->IsWithinMeleeRange(me->GetVictim())) + { + me->GetMotionMaster()->MoveChase(me->GetVictim()); + DoMeleeAttackIfReady(); + } + else + { + me->GetMotionMaster()->Clear(); + me->CastSpell(me->GetVictim(), SPELL_SHADOW_BOLT, false); + me->resetAttackTimer(); + } + } + + private: + uint64 _targetGUID; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; void AddSC_boss_omor_the_unscarred() diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp index d2d58caff..05c95a9e0 100644 --- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp @@ -53,316 +53,316 @@ const Position NazanPos[3] = class boss_vazruden_the_herald : public CreatureScript { - public: - boss_vazruden_the_herald() : CreatureScript("boss_vazruden_the_herald") { } +public: + boss_vazruden_the_herald() : CreatureScript("boss_vazruden_the_herald") { } - struct boss_vazruden_the_heraldAI : public BossAI + struct boss_vazruden_the_heraldAI : public BossAI + { + boss_vazruden_the_heraldAI(Creature* creature) : BossAI(creature, DATA_VAZRUDEN) { - boss_vazruden_the_heraldAI(Creature* creature) : BossAI(creature, DATA_VAZRUDEN) - { - } - - void Reset() - { - BossAI::Reset(); - me->SetVisible(true); - me->SetReactState(REACT_PASSIVE); - me->SummonCreature(NPC_HELLFIRE_SENTRY, -1372.56f, 1724.31f, 82.967f, 5.3058f); - me->SummonCreature(NPC_HELLFIRE_SENTRY, -1383.39f, 1711.82f, 82.7961f, 5.67232f); - } - - void AttackStart(Unit*) - { - } - - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - if (summon->GetEntry() != NPC_HELLFIRE_SENTRY) - summon->SetInCombatWithZone(); - } - - void JustDied(Unit*) - { - instance->SetBossState(DATA_VAZRUDEN, DONE); - } - - void MovementInform(uint32 type, uint32 id) - { - if (type == POINT_MOTION_TYPE && id == POINT_MIDDLE) - { - me->SetVisible(false); - me->SummonCreature(NPC_VAZRUDEN, me->GetPositionX(), me->GetPositionY(), 81.2f, 5.46f); - me->SummonCreature(NPC_NAZAN, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 5.46f); - } - } - - void SummonedCreatureDies(Creature* summon, Unit*) - { - summons.Despawn(summon); - if (summon->GetEntry() == NPC_HELLFIRE_SENTRY && summons.size() == 0) - { - Talk(SAY_INTRO); - me->GetMotionMaster()->MovePoint(POINT_MIDDLE, -1406.5f, 1746.5f, 85.0f, false); - me->setActive(true); - } - else if (summons.size() == 0) - { - Unit::Kill(me, me); - } - } - - void SummonedCreatureDespawn(Creature* summon) - { - summons.Despawn(summon); - if (summon->GetEntry() != NPC_HELLFIRE_SENTRY) - BossAI::EnterEvadeMode(); - } - - void UpdateAI(uint32 /*diff*/) - { - if (!me->IsVisible() && summons.size() == 0) - BossAI::EnterEvadeMode(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_vazruden_the_heraldAI(creature); } + + void Reset() + { + BossAI::Reset(); + me->SetVisible(true); + me->SetReactState(REACT_PASSIVE); + me->SummonCreature(NPC_HELLFIRE_SENTRY, -1372.56f, 1724.31f, 82.967f, 5.3058f); + me->SummonCreature(NPC_HELLFIRE_SENTRY, -1383.39f, 1711.82f, 82.7961f, 5.67232f); + } + + void AttackStart(Unit*) + { + } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + if (summon->GetEntry() != NPC_HELLFIRE_SENTRY) + summon->SetInCombatWithZone(); + } + + void JustDied(Unit*) + { + instance->SetBossState(DATA_VAZRUDEN, DONE); + } + + void MovementInform(uint32 type, uint32 id) + { + if (type == POINT_MOTION_TYPE && id == POINT_MIDDLE) + { + me->SetVisible(false); + me->SummonCreature(NPC_VAZRUDEN, me->GetPositionX(), me->GetPositionY(), 81.2f, 5.46f); + me->SummonCreature(NPC_NAZAN, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 5.46f); + } + } + + void SummonedCreatureDies(Creature* summon, Unit*) + { + summons.Despawn(summon); + if (summon->GetEntry() == NPC_HELLFIRE_SENTRY && summons.size() == 0) + { + Talk(SAY_INTRO); + me->GetMotionMaster()->MovePoint(POINT_MIDDLE, -1406.5f, 1746.5f, 85.0f, false); + me->setActive(true); + } + else if (summons.size() == 0) + { + Unit::Kill(me, me); + } + } + + void SummonedCreatureDespawn(Creature* summon) + { + summons.Despawn(summon); + if (summon->GetEntry() != NPC_HELLFIRE_SENTRY) + BossAI::EnterEvadeMode(); + } + + void UpdateAI(uint32 /*diff*/) + { + if (!me->IsVisible() && summons.size() == 0) + BossAI::EnterEvadeMode(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_vazruden_the_heraldAI(creature); + } }; class boss_nazan : public CreatureScript { - public: - boss_nazan() : CreatureScript("boss_nazan") { } +public: + boss_nazan() : CreatureScript("boss_nazan") { } - struct boss_nazanAI : public ScriptedAI + struct boss_nazanAI : public ScriptedAI + { + boss_nazanAI(Creature* creature) : ScriptedAI(creature) { - boss_nazanAI(Creature* creature) : ScriptedAI(creature) - { - } - - void Reset() - { - me->SetCanFly(true); - me->SetDisableGravity(true); - events.Reset(); - } - - void EnterEvadeMode() - { - me->DespawnOrUnsummon(1); - } - - void EnterCombat(Unit*) - { - events.ScheduleEvent(EVENT_CHANGE_POS, 0); - events.ScheduleEvent(EVENT_SPELL_FIREBALL, 5000); - } - - void AttackStart(Unit* who) - { - if (me->IsLevitating()) - me->Attack(who, true); - else - ScriptedAI::AttackStart(who); - } - - void DoAction(int32 param) - { - if (param == ACTION_FLY_DOWN) - { - Talk(EMOTE_NAZAN); - events.Reset(); - me->GetMotionMaster()->MovePoint(POINT_MIDDLE, -1406.5f, 1746.5f, 81.2f, false); - } - } - - void MovementInform(uint32 type, uint32 id) - { - if (type == POINT_MOTION_TYPE && id == POINT_MIDDLE) - { - me->SetDisableGravity(false); - me->SetCanFly(false); - events.ScheduleEvent(EVENT_RESTORE_COMBAT, 0); - events.ScheduleEvent(EVENT_SPELL_CONE_OF_FIRE, 5000); - if (IsHeroic()) - events.ScheduleEvent(EVENT_SPELL_BELLOWING_ROAR, 10000); - } - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_FIREBALL: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - me->CastSpell(target, SPELL_FIREBALL, false); - events.ScheduleEvent(EVENT_SPELL_FIREBALL, urand(4000, 6000)); - break; - case EVENT_CHANGE_POS: - me->GetMotionMaster()->MovePoint(POINT_FLIGHT, NazanPos[urand(0,2)], false); - events.DelayEvents(7000); - events.ScheduleEvent(EVENT_CHANGE_POS, 30000); - break; - case EVENT_RESTORE_COMBAT: - me->GetMotionMaster()->MoveChase(me->GetVictim()); - break; - case EVENT_SPELL_CONE_OF_FIRE: - me->CastSpell(me->GetVictim(), SPELL_CONE_OF_FIRE, false); - events.ScheduleEvent(EVENT_SPELL_CONE_OF_FIRE, 12000); - break; - case EVENT_SPELL_BELLOWING_ROAR: - me->CastSpell(me, SPELL_BELLOWING_ROAR, false); - events.ScheduleEvent(EVENT_SPELL_BELLOWING_ROAR, 30000); - break; - } - - if (!me->IsLevitating()) - DoMeleeAttackIfReady(); - } - - private: - EventMap events; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_nazanAI(creature); } + + void Reset() + { + me->SetCanFly(true); + me->SetDisableGravity(true); + events.Reset(); + } + + void EnterEvadeMode() + { + me->DespawnOrUnsummon(1); + } + + void EnterCombat(Unit*) + { + events.ScheduleEvent(EVENT_CHANGE_POS, 0); + events.ScheduleEvent(EVENT_SPELL_FIREBALL, 5000); + } + + void AttackStart(Unit* who) + { + if (me->IsLevitating()) + me->Attack(who, true); + else + ScriptedAI::AttackStart(who); + } + + void DoAction(int32 param) + { + if (param == ACTION_FLY_DOWN) + { + Talk(EMOTE_NAZAN); + events.Reset(); + me->GetMotionMaster()->MovePoint(POINT_MIDDLE, -1406.5f, 1746.5f, 81.2f, false); + } + } + + void MovementInform(uint32 type, uint32 id) + { + if (type == POINT_MOTION_TYPE && id == POINT_MIDDLE) + { + me->SetDisableGravity(false); + me->SetCanFly(false); + events.ScheduleEvent(EVENT_RESTORE_COMBAT, 0); + events.ScheduleEvent(EVENT_SPELL_CONE_OF_FIRE, 5000); + if (IsHeroic()) + events.ScheduleEvent(EVENT_SPELL_BELLOWING_ROAR, 10000); + } + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_SPELL_FIREBALL: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + me->CastSpell(target, SPELL_FIREBALL, false); + events.ScheduleEvent(EVENT_SPELL_FIREBALL, urand(4000, 6000)); + break; + case EVENT_CHANGE_POS: + me->GetMotionMaster()->MovePoint(POINT_FLIGHT, NazanPos[urand(0, 2)], false); + events.DelayEvents(7000); + events.ScheduleEvent(EVENT_CHANGE_POS, 30000); + break; + case EVENT_RESTORE_COMBAT: + me->GetMotionMaster()->MoveChase(me->GetVictim()); + break; + case EVENT_SPELL_CONE_OF_FIRE: + me->CastSpell(me->GetVictim(), SPELL_CONE_OF_FIRE, false); + events.ScheduleEvent(EVENT_SPELL_CONE_OF_FIRE, 12000); + break; + case EVENT_SPELL_BELLOWING_ROAR: + me->CastSpell(me, SPELL_BELLOWING_ROAR, false); + events.ScheduleEvent(EVENT_SPELL_BELLOWING_ROAR, 30000); + break; + } + + if (!me->IsLevitating()) + DoMeleeAttackIfReady(); + } + + private: + EventMap events; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_nazanAI(creature); + } }; class boss_vazruden : public CreatureScript { - public: - boss_vazruden() : CreatureScript("boss_vazruden") { } +public: + boss_vazruden() : CreatureScript("boss_vazruden") { } - struct boss_vazrudenAI : public ScriptedAI + struct boss_vazrudenAI : public ScriptedAI + { + boss_vazrudenAI(Creature* creature) : ScriptedAI(creature) { } + + void Reset() { - boss_vazrudenAI(Creature* creature) : ScriptedAI(creature) { } - - void Reset() - { - events.Reset(); - } - - void EnterEvadeMode() - { - Talk(SAY_WIPE); - me->DespawnOrUnsummon(1); - } - - void EnterCombat(Unit*) - { - events.ScheduleEvent(EVENT_AGGRO_TALK, 5000); - events.ScheduleEvent(EVENT_SPELL_REVENGE, 4000); - } - - void KilledUnit(Unit*) - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(SAY_KILL); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); - } - } - - void JustDied(Unit*) - { - me->CastSpell(me, SPELL_CALL_NAZAN, true); - Talk(SAY_DIE); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - switch (events.ExecuteEvent()) - { - case EVENT_AGGRO_TALK: - Talk(SAY_AGGRO); - break; - case EVENT_SPELL_REVENGE: - me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_REVENGE, SPELL_REVENGE_H), false); - events.ScheduleEvent(EVENT_SPELL_REVENGE, 6000); - break; - } - - DoMeleeAttackIfReady(); - } - - private: - EventMap events; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_vazrudenAI(creature); + events.Reset(); } + + void EnterEvadeMode() + { + Talk(SAY_WIPE); + me->DespawnOrUnsummon(1); + } + + void EnterCombat(Unit*) + { + events.ScheduleEvent(EVENT_AGGRO_TALK, 5000); + events.ScheduleEvent(EVENT_SPELL_REVENGE, 4000); + } + + void KilledUnit(Unit*) + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + { + Talk(SAY_KILL); + events.ScheduleEvent(EVENT_KILL_TALK, 6000); + } + } + + void JustDied(Unit*) + { + me->CastSpell(me, SPELL_CALL_NAZAN, true); + Talk(SAY_DIE); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + switch (events.ExecuteEvent()) + { + case EVENT_AGGRO_TALK: + Talk(SAY_AGGRO); + break; + case EVENT_SPELL_REVENGE: + me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_REVENGE, SPELL_REVENGE_H), false); + events.ScheduleEvent(EVENT_SPELL_REVENGE, 6000); + break; + } + + DoMeleeAttackIfReady(); + } + + private: + EventMap events; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_vazrudenAI(creature); + } }; class spell_vazruden_fireball : public SpellScriptLoader { - public: - spell_vazruden_fireball() : SpellScriptLoader("spell_vazruden_fireball") { } +public: + spell_vazruden_fireball() : SpellScriptLoader("spell_vazruden_fireball") { } - class spell_vazruden_fireball_SpellScript : public SpellScript + class spell_vazruden_fireball_SpellScript : public SpellScript + { + PrepareSpellScript(spell_vazruden_fireball_SpellScript); + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_vazruden_fireball_SpellScript); - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - target->CastSpell(target, SPELL_SUMMON_LIQUID_FIRE, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_vazruden_fireball_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_vazruden_fireball_SpellScript(); + if (Unit* target = GetHitUnit()) + target->CastSpell(target, SPELL_SUMMON_LIQUID_FIRE, true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_vazruden_fireball_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_vazruden_fireball_SpellScript(); + } }; class spell_vazruden_call_nazan : public SpellScriptLoader { - public: - spell_vazruden_call_nazan() : SpellScriptLoader("spell_vazruden_call_nazan") { } +public: + spell_vazruden_call_nazan() : SpellScriptLoader("spell_vazruden_call_nazan") { } - class spell_vazruden_call_nazan_SpellScript : public SpellScript + class spell_vazruden_call_nazan_SpellScript : public SpellScript + { + PrepareSpellScript(spell_vazruden_call_nazan_SpellScript); + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_vazruden_call_nazan_SpellScript); - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - target->GetAI()->DoAction(ACTION_FLY_DOWN); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_vazruden_call_nazan_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_vazruden_call_nazan_SpellScript(); + if (Unit* target = GetHitUnit()) + target->GetAI()->DoAction(ACTION_FLY_DOWN); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_vazruden_call_nazan_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_vazruden_call_nazan_SpellScript(); + } }; void AddSC_boss_vazruden_the_herald() diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp index c7c76848d..0e9459225 100644 --- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp @@ -36,115 +36,115 @@ enum Misc class boss_watchkeeper_gargolmar : public CreatureScript { - public: - boss_watchkeeper_gargolmar() : CreatureScript("boss_watchkeeper_gargolmar") { } +public: + boss_watchkeeper_gargolmar() : CreatureScript("boss_watchkeeper_gargolmar") { } - struct boss_watchkeeper_gargolmarAI : public BossAI + struct boss_watchkeeper_gargolmarAI : public BossAI + { + boss_watchkeeper_gargolmarAI(Creature* creature) : BossAI(creature, DATA_WATCHKEEPER_GARGOLMAR) { - boss_watchkeeper_gargolmarAI(Creature* creature) : BossAI(creature, DATA_WATCHKEEPER_GARGOLMAR) - { - _taunted = false; - } - - void Reset() - { - BossAI::Reset(); - } - - void EnterCombat(Unit* who) - { - Talk(SAY_AGGRO); - BossAI::EnterCombat(who); - events.ScheduleEvent(EVENT_MORTAL_WOUND, 5000); - events.ScheduleEvent(EVENT_SURGE, 3000); - events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); - events.ScheduleEvent(EVENT_RETALIATION, 1000); - } - - void MoveInLineOfSight(Unit* who) - { - if (!_taunted) - { - if (who->GetTypeId() == TYPEID_PLAYER) - { - _taunted = true; - Talk(SAY_TAUNT); - } - } - - BossAI::MoveInLineOfSight(who); - } - - void KilledUnit(Unit*) - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(SAY_KILL); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); - } - } - - void JustDied(Unit* killer) - { - Talk(SAY_DIE); - BossAI::JustDied(killer); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_MORTAL_WOUND: - me->CastSpell(me->GetVictim(), SPELL_MORTAL_WOUND, false); - events.ScheduleEvent(EVENT_MORTAL_WOUND, 8000); - break; - case EVENT_SURGE: - Talk(SAY_SURGE); - if (Unit* target = SelectTarget(SELECT_TARGET_FARTHEST, 0)) - me->CastSpell(target, SPELL_SURGE, false); - events.ScheduleEvent(EVENT_SURGE, 11000); - break; - case EVENT_RETALIATION: - if (me->HealthBelowPct(20)) - { - me->CastSpell(me, SPELL_RETALIATION, false); - events.ScheduleEvent(EVENT_RETALIATION, 30000); - } - else - events.ScheduleEvent(EVENT_RETALIATION, 500); - break; - case EVENT_CHECK_HEALTH: - if (me->HealthBelowPct(50)) - { - Talk(SAY_HEAL); - std::list clist; - me->GetCreaturesWithEntryInRange(clist, 100.0f, NPC_HELLFIRE_WATCHER); - for (std::list::const_iterator itr = clist.begin(); itr != clist.end(); ++itr) - (*itr)->AI()->SetData(NPC_HELLFIRE_WATCHER, 0); - break; - } - events.ScheduleEvent(EVENT_CHECK_HEALTH, 500); - break; - } - - DoMeleeAttackIfReady(); - } - - private: - bool _taunted; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_watchkeeper_gargolmarAI(creature); + _taunted = false; } + + void Reset() + { + BossAI::Reset(); + } + + void EnterCombat(Unit* who) + { + Talk(SAY_AGGRO); + BossAI::EnterCombat(who); + events.ScheduleEvent(EVENT_MORTAL_WOUND, 5000); + events.ScheduleEvent(EVENT_SURGE, 3000); + events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); + events.ScheduleEvent(EVENT_RETALIATION, 1000); + } + + void MoveInLineOfSight(Unit* who) + { + if (!_taunted) + { + if (who->GetTypeId() == TYPEID_PLAYER) + { + _taunted = true; + Talk(SAY_TAUNT); + } + } + + BossAI::MoveInLineOfSight(who); + } + + void KilledUnit(Unit*) + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + { + Talk(SAY_KILL); + events.ScheduleEvent(EVENT_KILL_TALK, 6000); + } + } + + void JustDied(Unit* killer) + { + Talk(SAY_DIE); + BossAI::JustDied(killer); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_MORTAL_WOUND: + me->CastSpell(me->GetVictim(), SPELL_MORTAL_WOUND, false); + events.ScheduleEvent(EVENT_MORTAL_WOUND, 8000); + break; + case EVENT_SURGE: + Talk(SAY_SURGE); + if (Unit* target = SelectTarget(SELECT_TARGET_FARTHEST, 0)) + me->CastSpell(target, SPELL_SURGE, false); + events.ScheduleEvent(EVENT_SURGE, 11000); + break; + case EVENT_RETALIATION: + if (me->HealthBelowPct(20)) + { + me->CastSpell(me, SPELL_RETALIATION, false); + events.ScheduleEvent(EVENT_RETALIATION, 30000); + } + else + events.ScheduleEvent(EVENT_RETALIATION, 500); + break; + case EVENT_CHECK_HEALTH: + if (me->HealthBelowPct(50)) + { + Talk(SAY_HEAL); + std::list clist; + me->GetCreaturesWithEntryInRange(clist, 100.0f, NPC_HELLFIRE_WATCHER); + for (std::list::const_iterator itr = clist.begin(); itr != clist.end(); ++itr) + (*itr)->AI()->SetData(NPC_HELLFIRE_WATCHER, 0); + break; + } + events.ScheduleEvent(EVENT_CHECK_HEALTH, 500); + break; + } + + DoMeleeAttackIfReady(); + } + + private: + bool _taunted; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_watchkeeper_gargolmarAI(creature); + } }; void AddSC_boss_watchkeeper_gargolmar() diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/instance_hellfire_ramparts.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/instance_hellfire_ramparts.cpp index 855b0becb..aba5c7adc 100644 --- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/instance_hellfire_ramparts.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/instance_hellfire_ramparts.cpp @@ -8,79 +8,79 @@ class instance_ramparts : public InstanceMapScript { - public: - instance_ramparts() : InstanceMapScript("instance_ramparts", 543) { } +public: + instance_ramparts() : InstanceMapScript("instance_ramparts", 543) { } - struct instance_ramparts_InstanceMapScript : public InstanceScript + struct instance_ramparts_InstanceMapScript : public InstanceScript + { + instance_ramparts_InstanceMapScript(Map* map) : InstanceScript(map) { } + + void Initialize() { - instance_ramparts_InstanceMapScript(Map* map) : InstanceScript(map) { } - - void Initialize() - { - SetBossNumber(MAX_ENCOUNTERS); - felIronChestGUID = 0; - } - - void OnGameObjectCreate(GameObject* go) - { - switch (go->GetEntry()) - { - case GO_FEL_IRON_CHEST_NORMAL: - case GO_FEL_IRON_CHECT_HEROIC: - felIronChestGUID = go->GetGUID(); - break; - } - } - - bool SetBossState(uint32 type, EncounterState state) - { - if (!InstanceScript::SetBossState(type, state)) - return false; - - if (type == DATA_VAZRUDEN && state == DONE) - if (GameObject* chest = instance->GetGameObject(felIronChestGUID)) - chest->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - return true; - } - - std::string GetSaveData() - { - std::ostringstream saveStream; - saveStream << "H R " << GetBossSaveData(); - return saveStream.str(); - } - - void Load(const char* strIn) - { - if (!strIn) - return; - - char dataHead1, dataHead2; - std::istringstream loadStream(strIn); - loadStream >> dataHead1 >> dataHead2; - - if (dataHead1 == 'H' && dataHead2 == 'R') - { - for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) - { - uint32 tmpState; - loadStream >> tmpState; - if (tmpState == IN_PROGRESS || tmpState > SPECIAL) - tmpState = NOT_STARTED; - - SetBossState(i, EncounterState(tmpState)); - } - } - } - - protected: - uint64 felIronChestGUID; - }; - - InstanceScript* GetInstanceScript(InstanceMap* map) const - { - return new instance_ramparts_InstanceMapScript(map); + SetBossNumber(MAX_ENCOUNTERS); + felIronChestGUID = 0; } + + void OnGameObjectCreate(GameObject* go) + { + switch (go->GetEntry()) + { + case GO_FEL_IRON_CHEST_NORMAL: + case GO_FEL_IRON_CHECT_HEROIC: + felIronChestGUID = go->GetGUID(); + break; + } + } + + bool SetBossState(uint32 type, EncounterState state) + { + if (!InstanceScript::SetBossState(type, state)) + return false; + + if (type == DATA_VAZRUDEN && state == DONE) + if (GameObject* chest = instance->GetGameObject(felIronChestGUID)) + chest->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + return true; + } + + std::string GetSaveData() + { + std::ostringstream saveStream; + saveStream << "H R " << GetBossSaveData(); + return saveStream.str(); + } + + void Load(const char* strIn) + { + if (!strIn) + return; + + char dataHead1, dataHead2; + std::istringstream loadStream(strIn); + loadStream >> dataHead1 >> dataHead2; + + if (dataHead1 == 'H' && dataHead2 == 'R') + { + for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) + { + uint32 tmpState; + loadStream >> tmpState; + if (tmpState == IN_PROGRESS || tmpState > SPECIAL) + tmpState = NOT_STARTED; + + SetBossState(i, EncounterState(tmpState)); + } + } + } + + protected: + uint64 felIronChestGUID; + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_ramparts_InstanceMapScript(map); + } }; void AddSC_instance_ramparts() diff --git a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp index eb2816ea1..8da723d52 100644 --- a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp @@ -85,200 +85,200 @@ private: class boss_magtheridon : public CreatureScript { - public: +public: - boss_magtheridon() : CreatureScript("boss_magtheridon") { } + boss_magtheridon() : CreatureScript("boss_magtheridon") { } - struct boss_magtheridonAI : public BossAI + struct boss_magtheridonAI : public BossAI + { + boss_magtheridonAI(Creature* creature) : BossAI(creature, TYPE_MAGTHERIDON) { } + + EventMap events2; + + + void Reset() { - boss_magtheridonAI(Creature* creature) : BossAI(creature, TYPE_MAGTHERIDON) { } - - EventMap events2; - - - void Reset() - { - events2.Reset(); - events2.ScheduleEvent(EVENT_RANDOM_TAUNT, 90000); - _Reset(); - me->CastSpell(me, SPELL_SHADOW_CAGE, true); - me->SetReactState(REACT_PASSIVE); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_IMMUNE_TO_PC); - } - - void KilledUnit(Unit* /*victim*/) - { - if (events.GetNextEventTime(EVENT_RECENTLY_SPOKEN) == 0) - { - events.ScheduleEvent(EVENT_RECENTLY_SPOKEN, 5000); - Talk(SAY_SLAY); - } - } - - void JustDied(Unit* /*killer*/) - { - _JustDied(); - Talk(SAY_DEATH); - } - - void MoveInLineOfSight(Unit* /*who*/) { } - - void EnterCombat(Unit* /*who*/) - { - events2.Reset(); - _EnterCombat(); - events.ScheduleEvent(EVENT_EMOTE1, 0); - events.ScheduleEvent(EVENT_EMOTE2, 60000); - events.ScheduleEvent(EVENT_EMOTE3, 120000); - events.ScheduleEvent(EVENT_ENTER_COMBAT, 123000); - - } - - void UpdateAI(uint32 diff) - { - events2.Update(diff); - switch (events2.ExecuteEvent()) - { - case EVENT_RANDOM_TAUNT: - Talk(SAY_TAUNT); - events2.ScheduleEvent(EVENT_RANDOM_TAUNT, 90000); - break; - case EVENT_CHECK_GRASP: - if (me->GetAuraCount(SPELL_SHADOW_GRASP_VISUAL) == 5) - { - Talk(SAY_BANISH); - me->InterruptNonMeleeSpells(true); - break; - } - events2.ScheduleEvent(EVENT_CHECK_GRASP, 0); - break; - } - - - if (!UpdateVictim() || !CheckInRoom()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_EMOTE1: - Talk(SAY_EMOTE_BEGIN); - break; - case EVENT_EMOTE2: - Talk(SAY_EMOTE_NEARLY); - break; - case EVENT_EMOTE3: - Talk(SAY_EMOTE_FREE); - Talk(SAY_FREE); - break; - case EVENT_ENTER_COMBAT: - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_IMMUNE_TO_PC); - me->SetReactState(REACT_AGGRESSIVE); - events.ScheduleEvent(EVENT_CLEAVE, 9000); - events.ScheduleEvent(EVENT_BLAST_NOVA, 60000); - events.ScheduleEvent(EVENT_BLAZE, 10000); - events.ScheduleEvent(EVENT_QUAKE, 40000); - events.ScheduleEvent(EVENT_CHECK_HEALTH, 500); - events.ScheduleEvent(EVENT_ENRAGE, 22*MINUTE*IN_MILLISECONDS); - - instance->SetData(DATA_ACTIVATE_CUBES, 1); - me->RemoveAurasDueToSpell(SPELL_SHADOW_CAGE); - break; - case EVENT_CLEAVE: - me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false); - events.ScheduleEvent(EVENT_CLEAVE, 10000); - break; - case EVENT_BLAST_NOVA: - me->CastSpell(me, SPELL_BLAST_NOVA, false); - events.ScheduleEvent(EVENT_BLAST_NOVA, 60000); - events.ScheduleEvent(EVENT_CANCEL_GRASP_CHECK, 12000); - events2.ScheduleEvent(EVENT_CHECK_GRASP, 0); - break; - case EVENT_BLAZE: - me->CastCustomSpell(SPELL_BLAZE, SPELLVALUE_MAX_TARGETS, 1); - events.ScheduleEvent(EVENT_BLAZE, 30000); - break; - case EVENT_ENRAGE: - me->CastSpell(me, SPELL_BERSERK, true); - break; - case EVENT_CANCEL_GRASP_CHECK: - events2.Reset(); - break; - case EVENT_QUAKE: - me->CastSpell(me, SPELL_QUAKE, false); - events.ScheduleEvent(EVENT_QUAKE, 50000); - break; - case EVENT_CHECK_HEALTH: - if (me->HealthBelowPct(30)) - { - Talk(SAY_PHASE3); - events.SetPhase(1); - events.DelayEvents(18000); - events.ScheduleEvent(EVENT_COLLAPSE_CEIL, 8000); - events.ScheduleEvent(EVENT_COLLAPSE_DAMAGE, 15000); - break; - } - events.ScheduleEvent(EVENT_CHECK_HEALTH, 500); - break; - case EVENT_COLLAPSE_CEIL: - me->CastSpell(me, SPELL_CAMERA_SHAKE, true); - instance->SetData(DATA_COLLAPSE, GO_STATE_ACTIVE); - break; - case EVENT_COLLAPSE_DAMAGE: - me->CastSpell(me, SPELL_COLLAPSE_DAMAGE, true); - me->resetAttackTimer(); - events.SetPhase(0); - events.ScheduleEvent(EVENT_DEBRIS, 20000); - break; - case EVENT_DEBRIS: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) - { - target->CastSpell(target, SPELL_DEBRIS_VISUAL, true, nullptr, nullptr, me->GetGUID()); - me->m_Events.AddEvent(new DealDebrisDamage(*me, target->GetGUID()), me->m_Events.CalculateTime(5000)); - } - events.ScheduleEvent(EVENT_DEBRIS, 20000); - break; - } - - if (!events.IsInPhase(1)) - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + events2.Reset(); + events2.ScheduleEvent(EVENT_RANDOM_TAUNT, 90000); + _Reset(); + me->CastSpell(me, SPELL_SHADOW_CAGE, true); + me->SetReactState(REACT_PASSIVE); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_PC); } + + void KilledUnit(Unit* /*victim*/) + { + if (events.GetNextEventTime(EVENT_RECENTLY_SPOKEN) == 0) + { + events.ScheduleEvent(EVENT_RECENTLY_SPOKEN, 5000); + Talk(SAY_SLAY); + } + } + + void JustDied(Unit* /*killer*/) + { + _JustDied(); + Talk(SAY_DEATH); + } + + void MoveInLineOfSight(Unit* /*who*/) { } + + void EnterCombat(Unit* /*who*/) + { + events2.Reset(); + _EnterCombat(); + events.ScheduleEvent(EVENT_EMOTE1, 0); + events.ScheduleEvent(EVENT_EMOTE2, 60000); + events.ScheduleEvent(EVENT_EMOTE3, 120000); + events.ScheduleEvent(EVENT_ENTER_COMBAT, 123000); + + } + + void UpdateAI(uint32 diff) + { + events2.Update(diff); + switch (events2.ExecuteEvent()) + { + case EVENT_RANDOM_TAUNT: + Talk(SAY_TAUNT); + events2.ScheduleEvent(EVENT_RANDOM_TAUNT, 90000); + break; + case EVENT_CHECK_GRASP: + if (me->GetAuraCount(SPELL_SHADOW_GRASP_VISUAL) == 5) + { + Talk(SAY_BANISH); + me->InterruptNonMeleeSpells(true); + break; + } + events2.ScheduleEvent(EVENT_CHECK_GRASP, 0); + break; + } + + + if (!UpdateVictim() || !CheckInRoom()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_EMOTE1: + Talk(SAY_EMOTE_BEGIN); + break; + case EVENT_EMOTE2: + Talk(SAY_EMOTE_NEARLY); + break; + case EVENT_EMOTE3: + Talk(SAY_EMOTE_FREE); + Talk(SAY_FREE); + break; + case EVENT_ENTER_COMBAT: + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_PC); + me->SetReactState(REACT_AGGRESSIVE); + events.ScheduleEvent(EVENT_CLEAVE, 9000); + events.ScheduleEvent(EVENT_BLAST_NOVA, 60000); + events.ScheduleEvent(EVENT_BLAZE, 10000); + events.ScheduleEvent(EVENT_QUAKE, 40000); + events.ScheduleEvent(EVENT_CHECK_HEALTH, 500); + events.ScheduleEvent(EVENT_ENRAGE, 22 * MINUTE * IN_MILLISECONDS); + + instance->SetData(DATA_ACTIVATE_CUBES, 1); + me->RemoveAurasDueToSpell(SPELL_SHADOW_CAGE); + break; + case EVENT_CLEAVE: + me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false); + events.ScheduleEvent(EVENT_CLEAVE, 10000); + break; + case EVENT_BLAST_NOVA: + me->CastSpell(me, SPELL_BLAST_NOVA, false); + events.ScheduleEvent(EVENT_BLAST_NOVA, 60000); + events.ScheduleEvent(EVENT_CANCEL_GRASP_CHECK, 12000); + events2.ScheduleEvent(EVENT_CHECK_GRASP, 0); + break; + case EVENT_BLAZE: + me->CastCustomSpell(SPELL_BLAZE, SPELLVALUE_MAX_TARGETS, 1); + events.ScheduleEvent(EVENT_BLAZE, 30000); + break; + case EVENT_ENRAGE: + me->CastSpell(me, SPELL_BERSERK, true); + break; + case EVENT_CANCEL_GRASP_CHECK: + events2.Reset(); + break; + case EVENT_QUAKE: + me->CastSpell(me, SPELL_QUAKE, false); + events.ScheduleEvent(EVENT_QUAKE, 50000); + break; + case EVENT_CHECK_HEALTH: + if (me->HealthBelowPct(30)) + { + Talk(SAY_PHASE3); + events.SetPhase(1); + events.DelayEvents(18000); + events.ScheduleEvent(EVENT_COLLAPSE_CEIL, 8000); + events.ScheduleEvent(EVENT_COLLAPSE_DAMAGE, 15000); + break; + } + events.ScheduleEvent(EVENT_CHECK_HEALTH, 500); + break; + case EVENT_COLLAPSE_CEIL: + me->CastSpell(me, SPELL_CAMERA_SHAKE, true); + instance->SetData(DATA_COLLAPSE, GO_STATE_ACTIVE); + break; + case EVENT_COLLAPSE_DAMAGE: + me->CastSpell(me, SPELL_COLLAPSE_DAMAGE, true); + me->resetAttackTimer(); + events.SetPhase(0); + events.ScheduleEvent(EVENT_DEBRIS, 20000); + break; + case EVENT_DEBRIS: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) + { + target->CastSpell(target, SPELL_DEBRIS_VISUAL, true, nullptr, nullptr, me->GetGUID()); + me->m_Events.AddEvent(new DealDebrisDamage(*me, target->GetGUID()), me->m_Events.CalculateTime(5000)); + } + events.ScheduleEvent(EVENT_DEBRIS, 20000); + break; + } + + if (!events.IsInPhase(1)) + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class spell_magtheridon_blaze : public SpellScriptLoader { - public: - spell_magtheridon_blaze() : SpellScriptLoader("spell_magtheridon_blaze") { } +public: + spell_magtheridon_blaze() : SpellScriptLoader("spell_magtheridon_blaze") { } - class spell_magtheridon_blaze_SpellScript : public SpellScript + class spell_magtheridon_blaze_SpellScript : public SpellScript + { + PrepareSpellScript(spell_magtheridon_blaze_SpellScript); + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_magtheridon_blaze_SpellScript); - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - target->CastSpell(target, SPELL_BLAZE_SUMMON, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_magtheridon_blaze_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_magtheridon_blaze_SpellScript(); + if (Unit* target = GetHitUnit()) + target->CastSpell(target, SPELL_BLAZE_SUMMON, true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_magtheridon_blaze_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_magtheridon_blaze_SpellScript(); + } }; class spell_magtheridon_shadow_grasp : public SpellScriptLoader @@ -289,12 +289,12 @@ public: class spell_magtheridon_shadow_grasp_AuraScript : public AuraScript { PrepareAuraScript(spell_magtheridon_shadow_grasp_AuraScript) - + void HandleDummyApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { GetUnitOwner()->CastSpell((Unit*)NULL, SPELL_SHADOW_GRASP_VISUAL, false); } - + void HandleDummyRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { GetUnitOwner()->InterruptNonMeleeSpells(true); diff --git a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp index b8516c667..c1b940f3d 100644 --- a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp @@ -21,203 +21,203 @@ MinionData const minionData[] = class instance_magtheridons_lair : public InstanceMapScript { - public: - instance_magtheridons_lair() : InstanceMapScript("instance_magtheridons_lair", 544) { } +public: + instance_magtheridons_lair() : InstanceMapScript("instance_magtheridons_lair", 544) { } - struct instance_magtheridons_lair_InstanceMapScript : public InstanceScript + struct instance_magtheridons_lair_InstanceMapScript : public InstanceScript + { + instance_magtheridons_lair_InstanceMapScript(Map* map) : InstanceScript(map) { - instance_magtheridons_lair_InstanceMapScript(Map* map) : InstanceScript(map) - { - SetBossNumber(MAX_ENCOUNTER); - LoadDoorData(doorData); - LoadMinionData(minionData); - } + SetBossNumber(MAX_ENCOUNTER); + LoadDoorData(doorData); + LoadMinionData(minionData); + } - void Initialize() - { - _wardersSet.clear(); - _cubesSet.clear(); - _columnSet.clear(); - _magtheridonGUID = 0; - } + void Initialize() + { + _wardersSet.clear(); + _cubesSet.clear(); + _columnSet.clear(); + _magtheridonGUID = 0; + } - void OnCreatureCreate(Creature* creature) + void OnCreatureCreate(Creature* creature) + { + switch (creature->GetEntry()) { - switch (creature->GetEntry()) + case NPC_MAGTHERIDON: + _magtheridonGUID = creature->GetGUID(); + break; + case NPC_HELLFIRE_CHANNELER: + AddMinion(creature, true); + break; + case NPC_HELLFIRE_WARDER: + _wardersSet.insert(creature->GetGUID()); + break; + } + } + + void OnCreatureRemove(Creature* creature) + { + switch (creature->GetEntry()) + { + case NPC_HELLFIRE_CHANNELER: + AddMinion(creature, false); + break; + } + } + + void OnGameObjectCreate(GameObject* go) + { + switch (go->GetEntry()) + { + case GO_MAGTHERIDON_DOORS: + AddDoor(go, true); + break; + case GO_MANTICRON_CUBE: + _cubesSet.insert(go->GetGUID()); + break; + case GO_MAGTHERIDON_HALL: + case GO_MAGTHERIDON_COLUMN0: + case GO_MAGTHERIDON_COLUMN1: + case GO_MAGTHERIDON_COLUMN2: + case GO_MAGTHERIDON_COLUMN3: + case GO_MAGTHERIDON_COLUMN4: + case GO_MAGTHERIDON_COLUMN5: + _columnSet.insert(go->GetGUID()); + break; + } + } + + void OnGameObjectRemove(GameObject* go) + { + switch (go->GetEntry()) + { + case GO_MAGTHERIDON_DOORS: + AddDoor(go, false); + break; + case GO_MANTICRON_CUBE: + _cubesSet.erase(go->GetGUID()); + break; + case GO_MAGTHERIDON_HALL: + case GO_MAGTHERIDON_COLUMN0: + case GO_MAGTHERIDON_COLUMN1: + case GO_MAGTHERIDON_COLUMN2: + case GO_MAGTHERIDON_COLUMN3: + case GO_MAGTHERIDON_COLUMN4: + case GO_MAGTHERIDON_COLUMN5: + _columnSet.erase(go->GetGUID()); + break; + } + } + + bool SetBossState(uint32 id, EncounterState state) + { + if (!InstanceScript::SetBossState(id, state)) + return false; + + if (id == TYPE_MAGTHERIDON) + { + if (state == IN_PROGRESS) { - case NPC_MAGTHERIDON: - _magtheridonGUID = creature->GetGUID(); - break; - case NPC_HELLFIRE_CHANNELER: - AddMinion(creature, true); - break; - case NPC_HELLFIRE_WARDER: - _wardersSet.insert(creature->GetGUID()); - break; - } - } - - void OnCreatureRemove(Creature* creature) - { - switch (creature->GetEntry()) - { - case NPC_HELLFIRE_CHANNELER: - AddMinion(creature, false); - break; - } - } - - void OnGameObjectCreate(GameObject* go) - { - switch (go->GetEntry()) - { - case GO_MAGTHERIDON_DOORS: - AddDoor(go, true); - break; - case GO_MANTICRON_CUBE: - _cubesSet.insert(go->GetGUID()); - break; - case GO_MAGTHERIDON_HALL: - case GO_MAGTHERIDON_COLUMN0: - case GO_MAGTHERIDON_COLUMN1: - case GO_MAGTHERIDON_COLUMN2: - case GO_MAGTHERIDON_COLUMN3: - case GO_MAGTHERIDON_COLUMN4: - case GO_MAGTHERIDON_COLUMN5: - _columnSet.insert(go->GetGUID()); - break; - } - } - - void OnGameObjectRemove(GameObject* go) - { - switch (go->GetEntry()) - { - case GO_MAGTHERIDON_DOORS: - AddDoor(go, false); - break; - case GO_MANTICRON_CUBE: - _cubesSet.erase(go->GetGUID()); - break; - case GO_MAGTHERIDON_HALL: - case GO_MAGTHERIDON_COLUMN0: - case GO_MAGTHERIDON_COLUMN1: - case GO_MAGTHERIDON_COLUMN2: - case GO_MAGTHERIDON_COLUMN3: - case GO_MAGTHERIDON_COLUMN4: - case GO_MAGTHERIDON_COLUMN5: - _columnSet.erase(go->GetGUID()); - break; - } - } - - bool SetBossState(uint32 id, EncounterState state) - { - if (!InstanceScript::SetBossState(id, state)) - return false; - - if (id == TYPE_MAGTHERIDON) - { - if (state == IN_PROGRESS) - { - for (std::set::const_iterator itr = _wardersSet.begin(); itr != _wardersSet.end(); ++itr) - if (Creature* warder = instance->GetCreature(*itr)) - if (warder->IsAlive()) - { - warder->InterruptNonMeleeSpells(true); - warder->SetInCombatWithZone(); - } - } - else - { - for (std::set::const_iterator itr = _cubesSet.begin(); itr != _cubesSet.end(); ++itr) - if (GameObject* cube = instance->GetGameObject(*itr)) - cube->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - - if (state == NOT_STARTED) - SetData(DATA_COLLAPSE, GO_READY); - } - } - return true; - } - - void SetData(uint32 type, uint32 data) - { - switch (type) - { - case DATA_CHANNELER_COMBAT: - if (GetBossState(TYPE_MAGTHERIDON) != IN_PROGRESS) - if (Creature* magtheridon = instance->GetCreature(_magtheridonGUID)) - magtheridon->SetInCombatWithZone(); - break; - case DATA_ACTIVATE_CUBES: - for (std::set::const_iterator itr = _cubesSet.begin(); itr != _cubesSet.end(); ++itr) - if (GameObject* cube = instance->GetGameObject(*itr)) - cube->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - break; - case DATA_COLLAPSE: - for (std::set::const_iterator itr = _columnSet.begin(); itr != _columnSet.end(); ++itr) - if (GameObject* column = instance->GetGameObject(*itr)) - column->SetGoState(GOState(data)); - break; - } - } - - std::string GetSaveData() - { - OUT_SAVE_INST_DATA; - - std::ostringstream saveStream; - saveStream << "M L " << GetBossSaveData(); - - OUT_SAVE_INST_DATA_COMPLETE; - return saveStream.str(); - } - - void Load(char const* str) - { - 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 == 'M' && dataHead2 == 'L') - { - for (uint32 i = 0; i < MAX_ENCOUNTER; ++i) - { - uint32 tmpState; - loadStream >> tmpState; - if (tmpState == IN_PROGRESS || tmpState > SPECIAL) - tmpState = NOT_STARTED; - SetBossState(i, EncounterState(tmpState)); - } + for (std::set::const_iterator itr = _wardersSet.begin(); itr != _wardersSet.end(); ++itr) + if (Creature* warder = instance->GetCreature(*itr)) + if (warder->IsAlive()) + { + warder->InterruptNonMeleeSpells(true); + warder->SetInCombatWithZone(); + } } else - OUT_LOAD_INST_DATA_FAIL; + { + for (std::set::const_iterator itr = _cubesSet.begin(); itr != _cubesSet.end(); ++itr) + if (GameObject* cube = instance->GetGameObject(*itr)) + cube->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - OUT_LOAD_INST_DATA_COMPLETE; + if (state == NOT_STARTED) + SetData(DATA_COLLAPSE, GO_READY); + } + } + return true; + } + + void SetData(uint32 type, uint32 data) + { + switch (type) + { + case DATA_CHANNELER_COMBAT: + if (GetBossState(TYPE_MAGTHERIDON) != IN_PROGRESS) + if (Creature* magtheridon = instance->GetCreature(_magtheridonGUID)) + magtheridon->SetInCombatWithZone(); + break; + case DATA_ACTIVATE_CUBES: + for (std::set::const_iterator itr = _cubesSet.begin(); itr != _cubesSet.end(); ++itr) + if (GameObject* cube = instance->GetGameObject(*itr)) + cube->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + break; + case DATA_COLLAPSE: + for (std::set::const_iterator itr = _columnSet.begin(); itr != _columnSet.end(); ++itr) + if (GameObject* column = instance->GetGameObject(*itr)) + column->SetGoState(GOState(data)); + break; + } + } + + std::string GetSaveData() + { + OUT_SAVE_INST_DATA; + + std::ostringstream saveStream; + saveStream << "M L " << GetBossSaveData(); + + OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); + } + + void Load(char const* str) + { + if (!str) + { + OUT_LOAD_INST_DATA_FAIL; + return; } - private: - uint64 _magtheridonGUID; - std::set _wardersSet; - std::set _cubesSet; - std::set _columnSet; + OUT_LOAD_INST_DATA(str); - }; + char dataHead1, dataHead2; - InstanceScript* GetInstanceScript(InstanceMap* map) const - { - return new instance_magtheridons_lair_InstanceMapScript(map); + std::istringstream loadStream(str); + loadStream >> dataHead1 >> dataHead2; + + if (dataHead1 == 'M' && dataHead2 == 'L') + { + for (uint32 i = 0; i < MAX_ENCOUNTER; ++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; } + + private: + uint64 _magtheridonGUID; + std::set _wardersSet; + std::set _cubesSet; + std::set _columnSet; + + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_magtheridons_lair_InstanceMapScript(map); + } }; void AddSC_instance_magtheridons_lair() diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp index d55ba7335..4091ecec2 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp @@ -48,263 +48,263 @@ enum eGrandWarlockNethekurse class boss_grand_warlock_nethekurse : public CreatureScript { - public: - boss_grand_warlock_nethekurse() : CreatureScript("boss_grand_warlock_nethekurse") { } +public: + boss_grand_warlock_nethekurse() : CreatureScript("boss_grand_warlock_nethekurse") { } - struct boss_grand_warlock_nethekurseAI : public BossAI + struct boss_grand_warlock_nethekurseAI : public BossAI + { + boss_grand_warlock_nethekurseAI(Creature* creature) : BossAI(creature, DATA_NETHEKURSE) { } + + EventMap events2; + void Reset() { - boss_grand_warlock_nethekurseAI(Creature* creature) : BossAI(creature, DATA_NETHEKURSE) { } - - EventMap events2; - void Reset() - { - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - EventStage = EVENT_STAGE_NONE; - PeonEngagedCount = 0; - PeonKilledCount = 0; - _Reset(); - SummonMinions(); - events2.Reset(); - } - - void SummonMinions() - { - me->SummonCreature(NPC_FEL_ORC_CONVERT, 172.556f, 258.227f, -13.191f, 1.41189f); - me->SummonCreature(NPC_FEL_ORC_CONVERT, 165.181f, 261.511f, -13.1926f, 0.942743f); - me->SummonCreature(NPC_FEL_ORC_CONVERT, 182.482f, 258.635f, -13.1788f, 1.70929f); - me->SummonCreature(NPC_FEL_ORC_CONVERT, 189.616f, 259.866f, -13.1966f, 1.95748f); - } - - void JustDied(Unit* /*killer*/) - { - Talk(SAY_DIE); - _JustDied(); - } - - void SetData(uint32 data, uint32 value) - { - if (data != SETDATA_DATA) - return; - - switch (value) - { - case SETDATA_PEON_AGGRO: - if (PeonEngagedCount >= 4) - return; - - if (EventStage < EVENT_STAGE_TAUNT) - Talk(SAY_PEON_ATTACKED); - break; - case SETDATA_PEON_DEATH: - if (PeonKilledCount >= 4) - return; - - if (EventStage < EVENT_STAGE_TAUNT) - Talk(SAY_PEON_DIES); - - if (++PeonKilledCount == 4) - events2.ScheduleEvent(EVENT_START_ATTACK, 5000); - break; - } - } - - void AttackStart(Unit* who) - { - if (EventStage < EVENT_STAGE_MAIN) - return; - - if (me->Attack(who, true)) - { - DoStartMovement(who); - } - } - - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - summon->SetReactState(REACT_DEFENSIVE); - summon->SetRegeneratingHealth(false); - } - - void MoveInLineOfSight(Unit* who) - { - if (me->IsWithinDistInMap(who, 30.0f)) - { - if (who->GetTypeId() != TYPEID_PLAYER) - return; - - if (EventStage == EVENT_STAGE_NONE && PeonKilledCount < 4) - { - events2.ScheduleEvent(EVENT_INTRO, 90000); - Talk(SAY_INTRO); - EventStage = EVENT_STAGE_INTRO; - instance->SetBossState(DATA_NETHEKURSE, IN_PROGRESS); - me->SetInCombatWithZone(); - } - else if (PeonKilledCount >= 4) - { - events2.ScheduleEvent(EVENT_START_ATTACK, 1000); - instance->SetBossState(DATA_NETHEKURSE, IN_PROGRESS); - me->SetInCombatWithZone(); - } - } - - if (EventStage < EVENT_STAGE_MAIN) - return; - - ScriptedAI::MoveInLineOfSight(who); - } - - void EnterCombat(Unit* /*who*/) - { - } - - void KilledUnit(Unit* /*victim*/) - { - Talk(SAY_SLAY); - } - - void UpdateAI(uint32 diff) - { - events2.Update(diff); - uint32 eventId = events2.ExecuteEvent(); - - if (EventStage < EVENT_STAGE_MAIN && instance->GetBossState(DATA_NETHEKURSE) == IN_PROGRESS) - { - if (eventId == EVENT_INTRO) - { - Talk(SAY_TAUNT); - EventStage = EVENT_STAGE_TAUNT; - me->CastSpell(me, SPELL_SHADOW_SEAR, false); - } - else if (eventId == EVENT_START_ATTACK) - { - Talk(SAY_AGGRO); - EventStage = EVENT_STAGE_MAIN; - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - if (Unit* target = me->SelectNearestPlayer(50.0f)) - AttackStart(target); - - events.ScheduleEvent(EVENT_SPELL_DEATH_COIL, 20000); - events.ScheduleEvent(EVENT_SPELL_SHADOW_FISSURE, 8000); - events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); - return; - } - } - - if (!UpdateVictim()) - return; - - events.Update(diff); - if (EventStage < EVENT_STAGE_MAIN || me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_SHADOW_FISSURE: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - me->CastSpell(target, SPELL_SHADOW_FISSURE, false); - events.RescheduleEvent(EVENT_SPELL_SHADOW_FISSURE, urand(7500, 10000)); - break; - case EVENT_SPELL_DEATH_COIL: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - me->CastSpell(target, DUNGEON_MODE(SPELL_DEATH_COIL_N, SPELL_DEATH_COIL_H), false); - events.RescheduleEvent(EVENT_SPELL_DEATH_COIL, urand(15000, 20000)); - break; - case EVENT_SPELL_CLEAVE: - me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_SHADOW_CLEAVE_N, SPELL_SHADOW_SLAM_H), false); - events.RescheduleEvent(EVENT_SPELL_CLEAVE, urand(6000, 8000)); - break; - case EVENT_CHECK_HEALTH: - if (me->HealthBelowPct(21)) - { - events.Reset(); - me->CastSpell(me, SPELL_DARK_SPIN, false); - } - else - { - events.RescheduleEvent(EVENT_CHECK_HEALTH, 1000); - } - break; - } - - if (!me->HealthBelowPct(21)) - DoMeleeAttackIfReady(); - } - - private: - uint32 PeonEngagedCount; - uint32 PeonKilledCount; - uint32 EventStage; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + EventStage = EVENT_STAGE_NONE; + PeonEngagedCount = 0; + PeonKilledCount = 0; + _Reset(); + SummonMinions(); + events2.Reset(); } + + void SummonMinions() + { + me->SummonCreature(NPC_FEL_ORC_CONVERT, 172.556f, 258.227f, -13.191f, 1.41189f); + me->SummonCreature(NPC_FEL_ORC_CONVERT, 165.181f, 261.511f, -13.1926f, 0.942743f); + me->SummonCreature(NPC_FEL_ORC_CONVERT, 182.482f, 258.635f, -13.1788f, 1.70929f); + me->SummonCreature(NPC_FEL_ORC_CONVERT, 189.616f, 259.866f, -13.1966f, 1.95748f); + } + + void JustDied(Unit* /*killer*/) + { + Talk(SAY_DIE); + _JustDied(); + } + + void SetData(uint32 data, uint32 value) + { + if (data != SETDATA_DATA) + return; + + switch (value) + { + case SETDATA_PEON_AGGRO: + if (PeonEngagedCount >= 4) + return; + + if (EventStage < EVENT_STAGE_TAUNT) + Talk(SAY_PEON_ATTACKED); + break; + case SETDATA_PEON_DEATH: + if (PeonKilledCount >= 4) + return; + + if (EventStage < EVENT_STAGE_TAUNT) + Talk(SAY_PEON_DIES); + + if (++PeonKilledCount == 4) + events2.ScheduleEvent(EVENT_START_ATTACK, 5000); + break; + } + } + + void AttackStart(Unit* who) + { + if (EventStage < EVENT_STAGE_MAIN) + return; + + if (me->Attack(who, true)) + { + DoStartMovement(who); + } + } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + summon->SetReactState(REACT_DEFENSIVE); + summon->SetRegeneratingHealth(false); + } + + void MoveInLineOfSight(Unit* who) + { + if (me->IsWithinDistInMap(who, 30.0f)) + { + if (who->GetTypeId() != TYPEID_PLAYER) + return; + + if (EventStage == EVENT_STAGE_NONE && PeonKilledCount < 4) + { + events2.ScheduleEvent(EVENT_INTRO, 90000); + Talk(SAY_INTRO); + EventStage = EVENT_STAGE_INTRO; + instance->SetBossState(DATA_NETHEKURSE, IN_PROGRESS); + me->SetInCombatWithZone(); + } + else if (PeonKilledCount >= 4) + { + events2.ScheduleEvent(EVENT_START_ATTACK, 1000); + instance->SetBossState(DATA_NETHEKURSE, IN_PROGRESS); + me->SetInCombatWithZone(); + } + } + + if (EventStage < EVENT_STAGE_MAIN) + return; + + ScriptedAI::MoveInLineOfSight(who); + } + + void EnterCombat(Unit* /*who*/) + { + } + + void KilledUnit(Unit* /*victim*/) + { + Talk(SAY_SLAY); + } + + void UpdateAI(uint32 diff) + { + events2.Update(diff); + uint32 eventId = events2.ExecuteEvent(); + + if (EventStage < EVENT_STAGE_MAIN && instance->GetBossState(DATA_NETHEKURSE) == IN_PROGRESS) + { + if (eventId == EVENT_INTRO) + { + Talk(SAY_TAUNT); + EventStage = EVENT_STAGE_TAUNT; + me->CastSpell(me, SPELL_SHADOW_SEAR, false); + } + else if (eventId == EVENT_START_ATTACK) + { + Talk(SAY_AGGRO); + EventStage = EVENT_STAGE_MAIN; + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + if (Unit* target = me->SelectNearestPlayer(50.0f)) + AttackStart(target); + + events.ScheduleEvent(EVENT_SPELL_DEATH_COIL, 20000); + events.ScheduleEvent(EVENT_SPELL_SHADOW_FISSURE, 8000); + events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); + return; + } + } + + if (!UpdateVictim()) + return; + + events.Update(diff); + if (EventStage < EVENT_STAGE_MAIN || me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_SPELL_SHADOW_FISSURE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + me->CastSpell(target, SPELL_SHADOW_FISSURE, false); + events.RescheduleEvent(EVENT_SPELL_SHADOW_FISSURE, urand(7500, 10000)); + break; + case EVENT_SPELL_DEATH_COIL: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + me->CastSpell(target, DUNGEON_MODE(SPELL_DEATH_COIL_N, SPELL_DEATH_COIL_H), false); + events.RescheduleEvent(EVENT_SPELL_DEATH_COIL, urand(15000, 20000)); + break; + case EVENT_SPELL_CLEAVE: + me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_SHADOW_CLEAVE_N, SPELL_SHADOW_SLAM_H), false); + events.RescheduleEvent(EVENT_SPELL_CLEAVE, urand(6000, 8000)); + break; + case EVENT_CHECK_HEALTH: + if (me->HealthBelowPct(21)) + { + events.Reset(); + me->CastSpell(me, SPELL_DARK_SPIN, false); + } + else + { + events.RescheduleEvent(EVENT_CHECK_HEALTH, 1000); + } + break; + } + + if (!me->HealthBelowPct(21)) + DoMeleeAttackIfReady(); + } + + private: + uint32 PeonEngagedCount; + uint32 PeonKilledCount; + uint32 EventStage; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class spell_tsh_shadow_sear : public SpellScriptLoader { - public: - spell_tsh_shadow_sear() : SpellScriptLoader("spell_tsh_shadow_sear") { } +public: + spell_tsh_shadow_sear() : SpellScriptLoader("spell_tsh_shadow_sear") { } - class spell_tsh_shadow_sear_AuraScript : public AuraScript + class spell_tsh_shadow_sear_AuraScript : public AuraScript + { + PrepareAuraScript(spell_tsh_shadow_sear_AuraScript); + + void CalculateDamageAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) { - PrepareAuraScript(spell_tsh_shadow_sear_AuraScript); - - void CalculateDamageAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - amount = 1000; - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_tsh_shadow_sear_AuraScript::CalculateDamageAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_tsh_shadow_sear_AuraScript(); + amount = 1000; } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_tsh_shadow_sear_AuraScript::CalculateDamageAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_tsh_shadow_sear_AuraScript(); + } }; class spell_tsh_shadow_bolt : public SpellScriptLoader { - public: - spell_tsh_shadow_bolt() : SpellScriptLoader("spell_tsh_shadow_bolt") { } +public: + spell_tsh_shadow_bolt() : SpellScriptLoader("spell_tsh_shadow_bolt") { } - class spell_tsh_shadow_bolt_SpellScript : public SpellScript + class spell_tsh_shadow_bolt_SpellScript : public SpellScript + { + PrepareSpellScript(spell_tsh_shadow_bolt_SpellScript); + + void SelectRandomPlayer(WorldObject*& target) { - PrepareSpellScript(spell_tsh_shadow_bolt_SpellScript); - - void SelectRandomPlayer(WorldObject*& target) + if (Creature* caster = GetCaster()->ToCreature()) { - if (Creature* caster = GetCaster()->ToCreature()) - { - std::list playerList; - Map::PlayerList const &players = caster->GetMap()->GetPlayers(); - for (auto itr = players.begin(); itr != players.end(); ++itr) - if (Player* player = itr->GetSource()->ToPlayer()) - if (player->IsWithinDist(caster, 100.0f) && player->IsAlive()) - playerList.push_back(player); + std::list playerList; + Map::PlayerList const& players = caster->GetMap()->GetPlayers(); + for (auto itr = players.begin(); itr != players.end(); ++itr) + if (Player* player = itr->GetSource()->ToPlayer()) + if (player->IsWithinDist(caster, 100.0f) && player->IsAlive()) + playerList.push_back(player); - if (!playerList.empty()) - target = acore::Containers::SelectRandomContainerElement(playerList); - } + if (!playerList.empty()) + target = acore::Containers::SelectRandomContainerElement(playerList); } - - void Register() - { - OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_tsh_shadow_bolt_SpellScript::SelectRandomPlayer, EFFECT_0, TARGET_UNIT_TARGET_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_tsh_shadow_bolt_SpellScript(); } + + void Register() + { + OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_tsh_shadow_bolt_SpellScript::SelectRandomPlayer, EFFECT_0, TARGET_UNIT_TARGET_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_tsh_shadow_bolt_SpellScript(); + } }; void AddSC_boss_grand_warlock_nethekurse() diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp index edf3f01cc..95700b503 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp @@ -40,7 +40,7 @@ enum Events EVENT_THREAT_YELL_L_3 = 6, EVENT_THREAT_YELL_R_1 = 7, - + EVENT_KILL_YELL_LEFT = 8, EVENT_KILL_YELL_RIGHT = 9, EVENT_DEATH_YELL = 10, @@ -58,198 +58,198 @@ enum Events class boss_warbringer_omrogg : public CreatureScript { - public: - boss_warbringer_omrogg() : CreatureScript("boss_warbringer_omrogg") { } +public: + boss_warbringer_omrogg() : CreatureScript("boss_warbringer_omrogg") { } - struct boss_warbringer_omroggAI : public BossAI + struct boss_warbringer_omroggAI : public BossAI + { + boss_warbringer_omroggAI(Creature* creature) : BossAI(creature, DATA_OMROGG) { - boss_warbringer_omroggAI(Creature* creature) : BossAI(creature, DATA_OMROGG) - { - } - - EventMap events2; - - Creature* GetLeftHead() - { - return summons.GetCreatureWithEntry(NPC_LEFT_HEAD); - } - - Creature* GetRightHead() - { - return summons.GetCreatureWithEntry(NPC_RIGHT_HEAD); - } - - void EnterCombat(Unit* /*who*/) - { - me->SummonCreature(NPC_LEFT_HEAD, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_DEAD_DESPAWN, 0); - me->SummonCreature(NPC_RIGHT_HEAD, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_DEAD_DESPAWN, 0); - - if (Creature* LeftHead = GetLeftHead()) - { - uint8 aggroYell = urand(EVENT_AGGRO_YELL_1, EVENT_AGGRO_YELL_3); - LeftHead->AI()->Talk(aggroYell-1); - events2.ScheduleEvent(aggroYell, 3000); - } - - _EnterCombat(); - - events.ScheduleEvent(EVENT_SPELL_FEAR, 8000); - events.ScheduleEvent(EVENT_SPELL_BURNING_MAUL, 25000); - events.ScheduleEvent(EVENT_SPELL_THUNDER_CLAP, 15000); - events.ScheduleEvent(EVENT_RESET_THREAT, 30000); - } - - void JustSummoned(Creature* summoned) - { - summons.Summon(summoned); - } - - void KilledUnit(Unit* /*victim*/) - { - Creature* head = nullptr; - uint32 eventId = EVENT_KILL_YELL_LEFT; - if (urand(0, 1)) - { - head = GetLeftHead(); - eventId = EVENT_KILL_YELL_LEFT; - } - else - { - head = GetRightHead(); - eventId = EVENT_KILL_YELL_RIGHT; - } - - if (head) - head->AI()->Talk(eventId-1); - - events2.ScheduleEvent(eventId, 3000); - } - - void JustDied(Unit* /*killer*/) - { - Creature* LeftHead = GetLeftHead(); - Creature* RightHead = GetRightHead(); - if (!LeftHead || !RightHead) - return; - - LeftHead->DespawnOrUnsummon(5000); - RightHead->DespawnOrUnsummon(5000); - - LeftHead->AI()->Talk(EVENT_DEATH_YELL-1); - RightHead->AI()->SetData(SETDATA_DATA, SETDATA_YELL); - - instance->SetBossState(DATA_OMROGG, DONE); - } - - void UpdateAI(uint32 diff) - { - events2.Update(diff); - switch (uint32 eventId = events2.ExecuteEvent()) - { - case EVENT_AGGRO_YELL_1: - case EVENT_AGGRO_YELL_2: - case EVENT_AGGRO_YELL_3: - case EVENT_KILL_YELL_LEFT: - case EVENT_THREAT_YELL_L_1: - case EVENT_THREAT_YELL_L_2: - case EVENT_THREAT_YELL_L_3: - if (Creature* RightHead = GetRightHead()) - RightHead->AI()->Talk(eventId-1); - break; - case EVENT_KILL_YELL_RIGHT: - case EVENT_THREAT_YELL_R_1: - if (Creature* LeftHead = GetLeftHead()) - LeftHead->AI()->Talk(eventId-1); - break; - } - - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_FEAR: - me->CastSpell(me, SPELL_FEAR, false); - events.ScheduleEvent(EVENT_SPELL_FEAR, 22000); - break; - case EVENT_SPELL_THUNDER_CLAP: - me->CastSpell(me, SPELL_THUNDERCLAP, false); - events.ScheduleEvent(EVENT_SPELL_THUNDER_CLAP, 25000); - break; - case EVENT_RESET_THREAT: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - { - uint8 threatYell = urand(EVENT_THREAT_YELL_L_1, EVENT_THREAT_YELL_R_1); - if (Creature* head = threatYell == EVENT_THREAT_YELL_R_1 ? GetRightHead() : GetLeftHead()) - head->AI()->Talk(threatYell-1); - events.ScheduleEvent(threatYell, 3000); - - DoResetThreat(); - me->AddThreat(target, 10.0f); - } - events.ScheduleEvent(EVENT_RESET_THREAT, 30000); - break; - case EVENT_SPELL_BURNING_MAUL: - Talk(EMOTE_ENRAGE); - me->CastSpell(me, DUNGEON_MODE(SPELL_BURNING_MAUL_N, SPELL_BURNING_MAUL_H), false); - events.ScheduleEvent(EVENT_SPELL_BURNING_MAUL, 40000); - events.ScheduleEvent(EVENT_SPELL_BLAST_WAVE, 15000); - events.ScheduleEvent(EVENT_SPELL_BLAST_WAVE, 20000); - break; - case EVENT_SPELL_BLAST_WAVE: - me->CastSpell(me, SPELL_BLAST_WAVE, false); - break; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); } + + EventMap events2; + + Creature* GetLeftHead() + { + return summons.GetCreatureWithEntry(NPC_LEFT_HEAD); + } + + Creature* GetRightHead() + { + return summons.GetCreatureWithEntry(NPC_RIGHT_HEAD); + } + + void EnterCombat(Unit* /*who*/) + { + me->SummonCreature(NPC_LEFT_HEAD, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_DEAD_DESPAWN, 0); + me->SummonCreature(NPC_RIGHT_HEAD, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_DEAD_DESPAWN, 0); + + if (Creature* LeftHead = GetLeftHead()) + { + uint8 aggroYell = urand(EVENT_AGGRO_YELL_1, EVENT_AGGRO_YELL_3); + LeftHead->AI()->Talk(aggroYell - 1); + events2.ScheduleEvent(aggroYell, 3000); + } + + _EnterCombat(); + + events.ScheduleEvent(EVENT_SPELL_FEAR, 8000); + events.ScheduleEvent(EVENT_SPELL_BURNING_MAUL, 25000); + events.ScheduleEvent(EVENT_SPELL_THUNDER_CLAP, 15000); + events.ScheduleEvent(EVENT_RESET_THREAT, 30000); + } + + void JustSummoned(Creature* summoned) + { + summons.Summon(summoned); + } + + void KilledUnit(Unit* /*victim*/) + { + Creature* head = nullptr; + uint32 eventId = EVENT_KILL_YELL_LEFT; + if (urand(0, 1)) + { + head = GetLeftHead(); + eventId = EVENT_KILL_YELL_LEFT; + } + else + { + head = GetRightHead(); + eventId = EVENT_KILL_YELL_RIGHT; + } + + if (head) + head->AI()->Talk(eventId - 1); + + events2.ScheduleEvent(eventId, 3000); + } + + void JustDied(Unit* /*killer*/) + { + Creature* LeftHead = GetLeftHead(); + Creature* RightHead = GetRightHead(); + if (!LeftHead || !RightHead) + return; + + LeftHead->DespawnOrUnsummon(5000); + RightHead->DespawnOrUnsummon(5000); + + LeftHead->AI()->Talk(EVENT_DEATH_YELL - 1); + RightHead->AI()->SetData(SETDATA_DATA, SETDATA_YELL); + + instance->SetBossState(DATA_OMROGG, DONE); + } + + void UpdateAI(uint32 diff) + { + events2.Update(diff); + switch (uint32 eventId = events2.ExecuteEvent()) + { + case EVENT_AGGRO_YELL_1: + case EVENT_AGGRO_YELL_2: + case EVENT_AGGRO_YELL_3: + case EVENT_KILL_YELL_LEFT: + case EVENT_THREAT_YELL_L_1: + case EVENT_THREAT_YELL_L_2: + case EVENT_THREAT_YELL_L_3: + if (Creature* RightHead = GetRightHead()) + RightHead->AI()->Talk(eventId - 1); + break; + case EVENT_KILL_YELL_RIGHT: + case EVENT_THREAT_YELL_R_1: + if (Creature* LeftHead = GetLeftHead()) + LeftHead->AI()->Talk(eventId - 1); + break; + } + + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_SPELL_FEAR: + me->CastSpell(me, SPELL_FEAR, false); + events.ScheduleEvent(EVENT_SPELL_FEAR, 22000); + break; + case EVENT_SPELL_THUNDER_CLAP: + me->CastSpell(me, SPELL_THUNDERCLAP, false); + events.ScheduleEvent(EVENT_SPELL_THUNDER_CLAP, 25000); + break; + case EVENT_RESET_THREAT: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + { + uint8 threatYell = urand(EVENT_THREAT_YELL_L_1, EVENT_THREAT_YELL_R_1); + if (Creature* head = threatYell == EVENT_THREAT_YELL_R_1 ? GetRightHead() : GetLeftHead()) + head->AI()->Talk(threatYell - 1); + events.ScheduleEvent(threatYell, 3000); + + DoResetThreat(); + me->AddThreat(target, 10.0f); + } + events.ScheduleEvent(EVENT_RESET_THREAT, 30000); + break; + case EVENT_SPELL_BURNING_MAUL: + Talk(EMOTE_ENRAGE); + me->CastSpell(me, DUNGEON_MODE(SPELL_BURNING_MAUL_N, SPELL_BURNING_MAUL_H), false); + events.ScheduleEvent(EVENT_SPELL_BURNING_MAUL, 40000); + events.ScheduleEvent(EVENT_SPELL_BLAST_WAVE, 15000); + events.ScheduleEvent(EVENT_SPELL_BLAST_WAVE, 20000); + break; + case EVENT_SPELL_BLAST_WAVE: + me->CastSpell(me, SPELL_BLAST_WAVE, false); + break; + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class npc_omrogg_heads : public CreatureScript { - public: - npc_omrogg_heads() : CreatureScript("npc_omrogg_heads") { } +public: + npc_omrogg_heads() : CreatureScript("npc_omrogg_heads") { } - struct npc_omrogg_headsAI : public NullCreatureAI + struct npc_omrogg_headsAI : public NullCreatureAI + { + npc_omrogg_headsAI(Creature* creature) : NullCreatureAI(creature) { timer = 0; } + + void SetData(uint32 data, uint32 value) { - npc_omrogg_headsAI(Creature* creature) : NullCreatureAI(creature) { timer = 0; } + if (data == SETDATA_DATA && value == SETDATA_YELL) + timer = 1; + } - void SetData(uint32 data, uint32 value) + void UpdateAI(uint32 diff) + { + if (timer) { - if (data == SETDATA_DATA && value == SETDATA_YELL) - timer = 1; - } - - void UpdateAI(uint32 diff) - { - if (timer) + timer += diff; + if (timer >= 3000) { - timer += diff; - if (timer >= 3000) - { - timer = 0; - Talk(EVENT_DEATH_YELL-1); - } + timer = 0; + Talk(EVENT_DEATH_YELL - 1); } } - - uint32 timer; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); } + + uint32 timer; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; void AddSC_boss_warbringer_omrogg() diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp index 5565b8606..65571ab68 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp @@ -15,9 +15,9 @@ enum Says enum Spells { - SPELL_BLADE_DANCE = 30739, - SPELL_CHARGE = 25821, - SPELL_SPRINT = 32720, + SPELL_BLADE_DANCE = 30739, + SPELL_CHARGE = 25821, + SPELL_SPRINT = 32720, }; enum Creatures @@ -45,130 +45,130 @@ enum Misc class boss_warchief_kargath_bladefist : public CreatureScript { - public: - boss_warchief_kargath_bladefist() : CreatureScript("boss_warchief_kargath_bladefist") { } +public: + boss_warchief_kargath_bladefist() : CreatureScript("boss_warchief_kargath_bladefist") { } - struct boss_warchief_kargath_bladefistAI : public BossAI + struct boss_warchief_kargath_bladefistAI : public BossAI + { + boss_warchief_kargath_bladefistAI(Creature* creature) : BossAI(creature, DATA_KARGATH) { } + + void InitializeAI() { - boss_warchief_kargath_bladefistAI(Creature* creature) : BossAI(creature, DATA_KARGATH) { } + BossAI::InitializeAI(); + if (instance) + if (Creature* executioner = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_EXECUTIONER))) + executioner->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + } - void InitializeAI() + void JustDied(Unit* /*killer*/) + { + Talk(SAY_DEATH); + _JustDied(); + + if (instance) + if (Creature* executioner = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_EXECUTIONER))) + executioner->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + } + + void EnterCombat(Unit* /*who*/) + { + Talk(SAY_AGGRO); + _EnterCombat(); + + events.ScheduleEvent(EVENT_CHECK_ROOM, 5000); + events.ScheduleEvent(EVENT_SUMMON_ADDS, 30000); + events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 5000); + events.ScheduleEvent(EVENT_BLADE_DANCE, 30000); + events.ScheduleEvent(EVENT_SPELL_CHARGE, 0); + } + + void JustSummoned(Creature* summon) + { + if (summon->GetEntry() != NPC_SHATTERED_ASSASSIN) + summon->AI()->AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0)); + + summons.Summon(summon); + } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + + void MovementInform(uint32 type, uint32 id) + { + if (type != POINT_MOTION_TYPE || id != 1) + return; + + me->CastSpell(me, SPELL_BLADE_DANCE, true); + events.ScheduleEvent(EVENT_MOVE_TO_NEXT_POINT, 0); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + switch (events.ExecuteEvent()) { - BossAI::InitializeAI(); - if (instance) - if (Creature* executioner = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_EXECUTIONER))) - executioner->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - } + case EVENT_CHECK_ROOM: + if (me->GetPositionX() > 255 || me->GetPositionX() < 205) + { + EnterEvadeMode(); + return; + } + events.ScheduleEvent(EVENT_CHECK_ROOM, 5000); + break; + case EVENT_SUMMON_ASSASSINS: + me->SummonCreature(NPC_SHATTERED_ASSASSIN, AssassEntrance[0], AssassEntrance[1] + 8, AssassEntrance[2], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + me->SummonCreature(NPC_SHATTERED_ASSASSIN, AssassEntrance[0], AssassEntrance[1] - 8, AssassEntrance[2], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + me->SummonCreature(NPC_SHATTERED_ASSASSIN, AssassExit[0], AssassExit[1] + 8, AssassExit[2], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + me->SummonCreature(NPC_SHATTERED_ASSASSIN, AssassExit[0], AssassExit[1] - 8, AssassExit[2], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + break; + case EVENT_SUMMON_ADDS: + for (uint8 i = 0; i < 2; ++i) + me->SummonCreature(NPC_HEARTHEN_GUARD + urand(0, 2), AddsEntrance[0], AddsEntrance[1], AddsEntrance[2], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - void JustDied(Unit* /*killer*/) - { - Talk(SAY_DEATH); - _JustDied(); - - if (instance) - if (Creature* executioner = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_EXECUTIONER))) - executioner->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - } - - void EnterCombat(Unit* /*who*/) - { - Talk(SAY_AGGRO); - _EnterCombat(); - - events.ScheduleEvent(EVENT_CHECK_ROOM, 5000); - events.ScheduleEvent(EVENT_SUMMON_ADDS, 30000); - events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 5000); - events.ScheduleEvent(EVENT_BLADE_DANCE, 30000); - events.ScheduleEvent(EVENT_SPELL_CHARGE, 0); - } - - void JustSummoned(Creature* summon) - { - if (summon->GetEntry() != NPC_SHATTERED_ASSASSIN) - summon->AI()->AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0)); - - summons.Summon(summon); - } - - void KilledUnit(Unit* victim) - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_SLAY); - } - - void MovementInform(uint32 type, uint32 id) - { - if (type != POINT_MOTION_TYPE || id != 1) - return; - - me->CastSpell(me, SPELL_BLADE_DANCE, true); - events.ScheduleEvent(EVENT_MOVE_TO_NEXT_POINT, 0); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - switch (events.ExecuteEvent()) - { - case EVENT_CHECK_ROOM: - if (me->GetPositionX() > 255 || me->GetPositionX() < 205) - { - EnterEvadeMode(); - return; - } - events.ScheduleEvent(EVENT_CHECK_ROOM, 5000); - break; - case EVENT_SUMMON_ASSASSINS: - me->SummonCreature(NPC_SHATTERED_ASSASSIN, AssassEntrance[0], AssassEntrance[1]+8, AssassEntrance[2], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - me->SummonCreature(NPC_SHATTERED_ASSASSIN, AssassEntrance[0], AssassEntrance[1]-8, AssassEntrance[2], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - me->SummonCreature(NPC_SHATTERED_ASSASSIN, AssassExit[0], AssassExit[1]+8, AssassExit[2], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - me->SummonCreature(NPC_SHATTERED_ASSASSIN, AssassExit[0], AssassExit[1]-8, AssassExit[2], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - break; - case EVENT_SUMMON_ADDS: - for (uint8 i = 0; i < 2; ++i) - me->SummonCreature(NPC_HEARTHEN_GUARD+urand(0,2), AddsEntrance[0], AddsEntrance[1], AddsEntrance[2], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - - events.ScheduleEvent(EVENT_SUMMON_ADDS, 30000); - break; - case EVENT_BLADE_DANCE: - events.DelayEvents(10001); - events.ScheduleEvent(EVENT_BLADE_DANCE, 40000); - events.ScheduleEvent(EVENT_MOVE_TO_NEXT_POINT, 0); - events.ScheduleEvent(EVENT_FINISH_BLADE_DANCE, 10000); - events.SetPhase(1); - me->CastSpell(me, SPELL_SPRINT, true); - break; - case EVENT_MOVE_TO_NEXT_POINT: + events.ScheduleEvent(EVENT_SUMMON_ADDS, 30000); + break; + case EVENT_BLADE_DANCE: + events.DelayEvents(10001); + events.ScheduleEvent(EVENT_BLADE_DANCE, 40000); + events.ScheduleEvent(EVENT_MOVE_TO_NEXT_POINT, 0); + events.ScheduleEvent(EVENT_FINISH_BLADE_DANCE, 10000); + events.SetPhase(1); + me->CastSpell(me, SPELL_SPRINT, true); + break; + case EVENT_MOVE_TO_NEXT_POINT: { float x = 210 + frand(0.0f, 35.0f); float y = -65.0f - frand(0.0f, 35.0f); me->GetMotionMaster()->MovePoint(1, x, y, me->GetPositionZ()); break; } - case EVENT_FINISH_BLADE_DANCE: - events.SetPhase(0); - me->GetMotionMaster()->Clear(); - me->GetMotionMaster()->MoveChase(me->GetVictim()); - if (IsHeroic()) - events.ScheduleEvent(EVENT_SPELL_CHARGE, 3000); - break; - case EVENT_SPELL_CHARGE: - me->CastSpell(me->GetVictim(), SPELL_CHARGE, false); - break; - } - - if (!events.IsInPhase(1)) - DoMeleeAttackIfReady(); + case EVENT_FINISH_BLADE_DANCE: + events.SetPhase(0); + me->GetMotionMaster()->Clear(); + me->GetMotionMaster()->MoveChase(me->GetVictim()); + if (IsHeroic()) + events.ScheduleEvent(EVENT_SPELL_CHARGE, 3000); + break; + case EVENT_SPELL_CHARGE: + me->CastSpell(me->GetVictim(), SPELL_CHARGE, false); + break; } - }; - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + if (!events.IsInPhase(1)) + DoMeleeAttackIfReady(); } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; void AddSC_boss_warchief_kargath_bladefist() diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp index b9c0aca5e..c2577478a 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp @@ -9,277 +9,277 @@ class instance_shattered_halls : public InstanceMapScript { - public: - instance_shattered_halls() : InstanceMapScript("instance_shattered_halls", 540) { } +public: + instance_shattered_halls() : InstanceMapScript("instance_shattered_halls", 540) { } - InstanceScript* GetInstanceScript(InstanceMap* map) const + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_shattered_halls_InstanceMapScript(map); + } + + struct instance_shattered_halls_InstanceMapScript : public InstanceScript + { + instance_shattered_halls_InstanceMapScript(Map* map) : InstanceScript(map) { } + + void Initialize() { - return new instance_shattered_halls_InstanceMapScript(map); + SetBossNumber(ENCOUNTER_COUNT); + nethekurseDoor1GUID = 0; + nethekurseDoor2GUID = 0; + warchiefKargathGUID = 0; + + executionerGUID = 0; + memset(&prisonerGUID, 0, sizeof(prisonerGUID)); + TeamIdInInstance = TEAM_NEUTRAL; + RescueTimer = 100 * MINUTE * IN_MILLISECONDS; } - struct instance_shattered_halls_InstanceMapScript : public InstanceScript + void OnPlayerEnter(Player* player) { - instance_shattered_halls_InstanceMapScript(Map* map) : InstanceScript(map) { } + if (TeamIdInInstance == TEAM_NEUTRAL) + TeamIdInInstance = player->GetTeamId(); + } - void Initialize() + void OnGameObjectCreate(GameObject* go) + { + switch (go->GetEntry()) { - SetBossNumber(ENCOUNTER_COUNT); - nethekurseDoor1GUID = 0; - nethekurseDoor2GUID = 0; - warchiefKargathGUID = 0; + case GO_GRAND_WARLOCK_CHAMBER_DOOR_1: + nethekurseDoor1GUID = go->GetGUID(); + if (GetBossState(DATA_NETHEKURSE) == DONE) + HandleGameObject(0, true, go); + break; + case GO_GRAND_WARLOCK_CHAMBER_DOOR_2: + nethekurseDoor2GUID = go->GetGUID(); + if (GetBossState(DATA_NETHEKURSE) == DONE) + HandleGameObject(0, true, go); + break; + } + } - executionerGUID = 0; - memset(&prisonerGUID, 0, sizeof(prisonerGUID)); - TeamIdInInstance = TEAM_NEUTRAL; - RescueTimer = 100*MINUTE*IN_MILLISECONDS; + void OnCreatureCreate(Creature* creature) + { + if (TeamIdInInstance == TEAM_NEUTRAL) + { + Map::PlayerList const& players = instance->GetPlayers(); + if (!players.isEmpty()) + if (Player* player = players.begin()->GetSource()) + TeamIdInInstance = player->GetTeamId(); } - void OnPlayerEnter(Player* player) + switch (creature->GetEntry()) { - if (TeamIdInInstance == TEAM_NEUTRAL) - TeamIdInInstance = player->GetTeamId(); + case NPC_WARCHIEF_KARGATH: + warchiefKargathGUID = creature->GetGUID(); + break; + case NPC_SHATTERED_EXECUTIONER: + if (RescueTimer > 25 * MINUTE * IN_MILLISECONDS) + creature->AddLootMode(2); + executionerGUID = creature->GetGUID(); + break; + case NPC_RIFLEMAN_BROWNBEARD: + if (TeamIdInInstance == TEAM_HORDE) + creature->UpdateEntry(NPC_KORAG_PROUDMANE); + prisonerGUID[0] = creature->GetGUID(); + break; + case NPC_CAPTAIN_ALINA: + if (TeamIdInInstance == TEAM_HORDE) + creature->UpdateEntry(NPC_CAPTAIN_BONESHATTER); + prisonerGUID[1] = creature->GetGUID(); + break; + case NPC_PRIVATE_JACINT: + if (TeamIdInInstance == TEAM_HORDE) + creature->UpdateEntry(NPC_SCOUT_ORGARR); + prisonerGUID[2] = creature->GetGUID(); + break; } + } - void OnGameObjectCreate(GameObject* go) + bool SetBossState(uint32 type, EncounterState state) + { + if (!InstanceScript::SetBossState(type, state)) + return false; + + switch (type) { - switch (go->GetEntry()) - { - case GO_GRAND_WARLOCK_CHAMBER_DOOR_1: - nethekurseDoor1GUID = go->GetGUID(); - if (GetBossState(DATA_NETHEKURSE) == DONE) - HandleGameObject(0, true, go); - break; - case GO_GRAND_WARLOCK_CHAMBER_DOOR_2: - nethekurseDoor2GUID = go->GetGUID(); - if (GetBossState(DATA_NETHEKURSE) == DONE) - HandleGameObject(0, true, go); - break; - } - } - - void OnCreatureCreate(Creature* creature) - { - if (TeamIdInInstance == TEAM_NEUTRAL) - { - Map::PlayerList const &players = instance->GetPlayers(); - if (!players.isEmpty()) - if (Player* player = players.begin()->GetSource()) - TeamIdInInstance = player->GetTeamId(); - } - - switch (creature->GetEntry()) - { - case NPC_WARCHIEF_KARGATH: - warchiefKargathGUID = creature->GetGUID(); - break; - case NPC_SHATTERED_EXECUTIONER: - if (RescueTimer > 25*MINUTE*IN_MILLISECONDS) - creature->AddLootMode(2); - executionerGUID = creature->GetGUID(); - break; - case NPC_RIFLEMAN_BROWNBEARD: - if (TeamIdInInstance == TEAM_HORDE) - creature->UpdateEntry(NPC_KORAG_PROUDMANE); - prisonerGUID[0] = creature->GetGUID(); - break; - case NPC_CAPTAIN_ALINA: - if (TeamIdInInstance == TEAM_HORDE) - creature->UpdateEntry(NPC_CAPTAIN_BONESHATTER); - prisonerGUID[1] = creature->GetGUID(); - break; - case NPC_PRIVATE_JACINT: - if (TeamIdInInstance == TEAM_HORDE) - creature->UpdateEntry(NPC_SCOUT_ORGARR); - prisonerGUID[2] = creature->GetGUID(); - break; - } - } - - bool SetBossState(uint32 type, EncounterState state) - { - if (!InstanceScript::SetBossState(type, state)) - return false; - - switch (type) - { - case DATA_NETHEKURSE: - if (state == IN_PROGRESS) - { - HandleGameObject(nethekurseDoor1GUID, false); - HandleGameObject(nethekurseDoor2GUID, false); - } - else - { - HandleGameObject(nethekurseDoor1GUID, true); - HandleGameObject(nethekurseDoor2GUID, true); - } - break; - } - return true; - } - - void SetData(uint32 type, uint32 data) - { - if (type == DATA_ENTERED_ROOM && data == DATA_ENTERED_ROOM && RescueTimer == 100*MINUTE*IN_MILLISECONDS) - { - DoCastSpellOnPlayers(SPELL_KARGATHS_EXECUTIONER_1); - instance->LoadGrid(230, -80); - - if (Creature* kargath = instance->GetCreature(warchiefKargathGUID)) - sCreatureTextMgr->SendChat(kargath, TeamIdInInstance == TEAM_ALLIANCE ? 3 : 4, NULL, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_MAP); - - RescueTimer = 80*MINUTE*IN_MILLISECONDS; - } - } - - uint64 GetData64(uint32 data) const - { - switch (data) - { - case DATA_PRISONER_1: - case DATA_PRISONER_2: - case DATA_PRISONER_3: - return prisonerGUID[data-DATA_PRISONER_1]; - case DATA_EXECUTIONER: - return executionerGUID; - } - return 0; - } - - void Update(uint32 diff) - { - if (RescueTimer && RescueTimer < 100*MINUTE*IN_MILLISECONDS) - { - RescueTimer -= std::min(RescueTimer, diff); - - if ((RescueTimer / IN_MILLISECONDS) == 25*MINUTE) + case DATA_NETHEKURSE: + if (state == IN_PROGRESS) { - DoRemoveAurasDueToSpellOnPlayers(SPELL_KARGATHS_EXECUTIONER_1); - DoCastSpellOnPlayers(SPELL_KARGATHS_EXECUTIONER_2); - if (Creature* prisoner = instance->GetCreature(prisonerGUID[0])) - Unit::Kill(prisoner, prisoner); - if (Creature* executioner = instance->GetCreature(executionerGUID)) - executioner->RemoveLootMode(2); + HandleGameObject(nethekurseDoor1GUID, false); + HandleGameObject(nethekurseDoor2GUID, false); } - else if ((RescueTimer / IN_MILLISECONDS) == 15*MINUTE) + else { - DoRemoveAurasDueToSpellOnPlayers(SPELL_KARGATHS_EXECUTIONER_2); - DoCastSpellOnPlayers(SPELL_KARGATHS_EXECUTIONER_3); - if (Creature* prisoner = instance->GetCreature(prisonerGUID[1])) - Unit::Kill(prisoner, prisoner); + HandleGameObject(nethekurseDoor1GUID, true); + HandleGameObject(nethekurseDoor2GUID, true); } - else if ((RescueTimer / IN_MILLISECONDS) == 0) - { - DoRemoveAurasDueToSpellOnPlayers(SPELL_KARGATHS_EXECUTIONER_3); - if (Creature* prisoner = instance->GetCreature(prisonerGUID[2])) - Unit::Kill(prisoner, prisoner); - } - } + break; } + return true; + } - std::string GetSaveData() + void SetData(uint32 type, uint32 data) + { + if (type == DATA_ENTERED_ROOM && data == DATA_ENTERED_ROOM && RescueTimer == 100 * MINUTE * IN_MILLISECONDS) { - OUT_SAVE_INST_DATA; + DoCastSpellOnPlayers(SPELL_KARGATHS_EXECUTIONER_1); + instance->LoadGrid(230, -80); - std::ostringstream saveStream; - saveStream << "S H " << GetBossSaveData() << ' ' << RescueTimer; + if (Creature* kargath = instance->GetCreature(warchiefKargathGUID)) + sCreatureTextMgr->SendChat(kargath, TeamIdInInstance == TEAM_ALLIANCE ? 3 : 4, NULL, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_MAP); - OUT_SAVE_INST_DATA_COMPLETE; - return saveStream.str(); + RescueTimer = 80 * MINUTE * IN_MILLISECONDS; } + } - void Load(const char* strIn) + uint64 GetData64(uint32 data) const + { + switch (data) { - if (!strIn) + case DATA_PRISONER_1: + case DATA_PRISONER_2: + case DATA_PRISONER_3: + return prisonerGUID[data - DATA_PRISONER_1]; + case DATA_EXECUTIONER: + return executionerGUID; + } + return 0; + } + + void Update(uint32 diff) + { + if (RescueTimer && RescueTimer < 100 * MINUTE * IN_MILLISECONDS) + { + RescueTimer -= std::min(RescueTimer, diff); + + if ((RescueTimer / IN_MILLISECONDS) == 25 * MINUTE) { - OUT_LOAD_INST_DATA_FAIL; - return; + DoRemoveAurasDueToSpellOnPlayers(SPELL_KARGATHS_EXECUTIONER_1); + DoCastSpellOnPlayers(SPELL_KARGATHS_EXECUTIONER_2); + if (Creature* prisoner = instance->GetCreature(prisonerGUID[0])) + Unit::Kill(prisoner, prisoner); + if (Creature* executioner = instance->GetCreature(executionerGUID)) + executioner->RemoveLootMode(2); } - - OUT_LOAD_INST_DATA(strIn); - - char dataHead1, dataHead2; - - std::istringstream loadStream(strIn); - loadStream >> dataHead1 >> dataHead2; - - if (dataHead1 == 'S' && dataHead2 == 'H') + else if ((RescueTimer / IN_MILLISECONDS) == 15 * MINUTE) { - for (uint8 i = 0; i < ENCOUNTER_COUNT; ++i) - { - uint32 tmpState; - loadStream >> tmpState; - if (tmpState == IN_PROGRESS || tmpState > SPECIAL) - tmpState = NOT_STARTED; - SetBossState(i, EncounterState(tmpState)); - } - - loadStream >> RescueTimer; + DoRemoveAurasDueToSpellOnPlayers(SPELL_KARGATHS_EXECUTIONER_2); + DoCastSpellOnPlayers(SPELL_KARGATHS_EXECUTIONER_3); + if (Creature* prisoner = instance->GetCreature(prisonerGUID[1])) + Unit::Kill(prisoner, prisoner); } - else - OUT_LOAD_INST_DATA_FAIL; + else if ((RescueTimer / IN_MILLISECONDS) == 0) + { + DoRemoveAurasDueToSpellOnPlayers(SPELL_KARGATHS_EXECUTIONER_3); + if (Creature* prisoner = instance->GetCreature(prisonerGUID[2])) + Unit::Kill(prisoner, prisoner); + } + } + } - OUT_LOAD_INST_DATA_COMPLETE; + std::string GetSaveData() + { + OUT_SAVE_INST_DATA; + + std::ostringstream saveStream; + saveStream << "S H " << GetBossSaveData() << ' ' << RescueTimer; + + OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); + } + + void Load(const char* strIn) + { + if (!strIn) + { + OUT_LOAD_INST_DATA_FAIL; + return; } - protected: - uint64 warchiefKargathGUID; - uint64 nethekurseDoor1GUID; - uint64 nethekurseDoor2GUID; + OUT_LOAD_INST_DATA(strIn); - uint64 executionerGUID; - uint64 prisonerGUID[3]; - uint32 RescueTimer; - TeamId TeamIdInInstance; - }; + char dataHead1, dataHead2; + + std::istringstream loadStream(strIn); + loadStream >> dataHead1 >> dataHead2; + + if (dataHead1 == 'S' && dataHead2 == 'H') + { + for (uint8 i = 0; i < ENCOUNTER_COUNT; ++i) + { + uint32 tmpState; + loadStream >> tmpState; + if (tmpState == IN_PROGRESS || tmpState > SPECIAL) + tmpState = NOT_STARTED; + SetBossState(i, EncounterState(tmpState)); + } + + loadStream >> RescueTimer; + } + else + OUT_LOAD_INST_DATA_FAIL; + + OUT_LOAD_INST_DATA_COMPLETE; + } + + protected: + uint64 warchiefKargathGUID; + uint64 nethekurseDoor1GUID; + uint64 nethekurseDoor2GUID; + + uint64 executionerGUID; + uint64 prisonerGUID[3]; + uint32 RescueTimer; + TeamId TeamIdInInstance; + }; }; class spell_tsh_shoot_flame_arrow : public SpellScriptLoader { - public: - spell_tsh_shoot_flame_arrow() : SpellScriptLoader("spell_tsh_shoot_flame_arrow") { } +public: + spell_tsh_shoot_flame_arrow() : SpellScriptLoader("spell_tsh_shoot_flame_arrow") { } - class spell_tsh_shoot_flame_arrow_SpellScript : public SpellScript + class spell_tsh_shoot_flame_arrow_SpellScript : public SpellScript + { + PrepareSpellScript(spell_tsh_shoot_flame_arrow_SpellScript); + + void FilterTargets(std::list& unitList) { - PrepareSpellScript(spell_tsh_shoot_flame_arrow_SpellScript); - - void FilterTargets(std::list& unitList) - { - acore::Containers::RandomResizeList(unitList, 1); - } - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - target->CastSpell(target, 30953, true); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_tsh_shoot_flame_arrow_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); - OnEffectHitTarget += SpellEffectFn(spell_tsh_shoot_flame_arrow_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_tsh_shoot_flame_arrow_SpellScript(); + acore::Containers::RandomResizeList(unitList, 1); } + + void HandleScriptEffect(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) + target->CastSpell(target, 30953, true); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_tsh_shoot_flame_arrow_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + OnEffectHitTarget += SpellEffectFn(spell_tsh_shoot_flame_arrow_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_tsh_shoot_flame_arrow_SpellScript(); + } }; class at_shattered_halls_execution : public AreaTriggerScript { - public: - at_shattered_halls_execution() : AreaTriggerScript("at_shattered_halls_execution") { } +public: + at_shattered_halls_execution() : AreaTriggerScript("at_shattered_halls_execution") { } - bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) - { - if (InstanceScript* instanceScript = player->GetInstanceScript()) - instanceScript->SetData(DATA_ENTERED_ROOM, DATA_ENTERED_ROOM); + bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) + { + if (InstanceScript* instanceScript = player->GetInstanceScript()) + instanceScript->SetData(DATA_ENTERED_ROOM, DATA_ENTERED_ROOM); - return true; - } + return true; + } }; void AddSC_instance_shattered_halls() diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp index 99b293fb6..ac5d1864a 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp @@ -40,7 +40,7 @@ enum Misc DISPLAYID_INVISIBLE = 23377, NPC_EMBER_OF_ALAR = 19551, NPC_FLAME_PATCH = 20602, - + POINT_PLATFORM = 0, POINT_QUILL = 4, POINT_MIDDLE = 5, @@ -74,411 +74,411 @@ enum qruseoftheAshtongue class boss_alar : public CreatureScript { - public: - boss_alar() : CreatureScript("boss_alar") { } +public: + boss_alar() : CreatureScript("boss_alar") { } - struct boss_alarAI : public BossAI + struct boss_alarAI : public BossAI + { + boss_alarAI(Creature* creature) : BossAI(creature, DATA_ALAR) { - boss_alarAI(Creature* creature) : BossAI(creature, DATA_ALAR) + startPath = true; + SetCombatMovement(false); + } + + uint8 platform; + uint8 noQuillTimes; + bool startPath; + + void JustReachedHome() + { + BossAI::JustReachedHome(); + startPath = true; + } + + void Reset() + { + BossAI::Reset(); + platform = 0; + noQuillTimes = 0; + me->SetModelVisible(true); + me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_FIRE, true); + me->SetReactState(REACT_AGGRESSIVE); + } + + void EnterCombat(Unit* who) + { + BossAI::EnterCombat(who); + events.ScheduleEvent(EVENT_SWITCH_PLATFORM, 0); + } + + void JustDied(Unit* killer) + { + me->SetModelVisible(true); + BossAI::JustDied(killer); + + // Xinef: Ruse of the Ashtongue (10946) + Map::PlayerList const& pl = me->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) { - startPath = true; - SetCombatMovement(false); + Player* player = itr->GetSource(); + if (player->GetQuestStatus(QUEST_RUSE_OF_THE_ASHTONGUE) == QUEST_STATUS_INCOMPLETE) + if (player->HasAura(SPELL_ASHTONGUE_RUSE)) + player->AreaExploredOrEventHappens(QUEST_RUSE_OF_THE_ASHTONGUE); } + } - uint8 platform; - uint8 noQuillTimes; - bool startPath; + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + if (summon->GetEntry() == NPC_EMBER_OF_ALAR) + summon->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_FIRE, true); + } - void JustReachedHome() + void MoveInLineOfSight(Unit* /*who*/) { } + + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) + { + if (damage >= me->GetHealth() && platform < POINT_MIDDLE) { - BossAI::JustReachedHome(); - startPath = true; - } - - void Reset() - { - BossAI::Reset(); - platform = 0; - noQuillTimes = 0; - me->SetModelVisible(true); - me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_FIRE, true); - me->SetReactState(REACT_AGGRESSIVE); - } - - void EnterCombat(Unit* who) - { - BossAI::EnterCombat(who); - events.ScheduleEvent(EVENT_SWITCH_PLATFORM, 0); - } - - void JustDied(Unit* killer) - { - me->SetModelVisible(true); - BossAI::JustDied(killer); - - // Xinef: Ruse of the Ashtongue (10946) - Map::PlayerList const& pl = me->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) + damage = 0; + if (events.GetNextEventTime(EVENT_REBIRTH) == 0) { - Player* player = itr->GetSource(); - if (player->GetQuestStatus(QUEST_RUSE_OF_THE_ASHTONGUE) == QUEST_STATUS_INCOMPLETE) - if (player->HasAura(SPELL_ASHTONGUE_RUSE)) - player->AreaExploredOrEventHappens(QUEST_RUSE_OF_THE_ASHTONGUE); + me->InterruptNonMeleeSpells(false); + me->SetHealth(me->GetMaxHealth()); + me->SetReactState(REACT_PASSIVE); + me->CastSpell(me, SPELL_EMBER_BLAST, true); + + me->setAttackTimer(BASE_ATTACK, 16000); + events.Reset(); + events.ScheduleEvent(EVENT_RELOCATE_MIDDLE, 8000); + events.ScheduleEvent(EVENT_MOVE_TO_PHASE_2, 12000); + events.ScheduleEvent(EVENT_REBIRTH, 16001); } } + } - void JustSummoned(Creature* summon) + void MovementInform(uint32 type, uint32 id) + { + if (type != POINT_MOTION_TYPE) { - summons.Summon(summon); - if (summon->GetEntry() == NPC_EMBER_OF_ALAR) - summon->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_FIRE, true); + if (type == ESCORT_MOTION_TYPE && me->movespline->Finalized() && !me->IsInCombat()) + startPath = true; + return; } - void MoveInLineOfSight(Unit* /*who*/) { } - - void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) + if (id == POINT_PLATFORM) + me->setAttackTimer(BASE_ATTACK, 1000); + else if (id == POINT_QUILL) + events.ScheduleEvent(EVENT_START_QUILLS, 1000); + else if (id == POINT_DIVE) { - if (damage >= me->GetHealth() && platform < POINT_MIDDLE) + events.ScheduleEvent(EVENT_START_DIVE, 1000); + events.ScheduleEvent(EVENT_CAST_DIVE_BOMB, 5000); + } + } + + void UpdateAI(uint32 diff) + { + if (startPath) + { + me->StopMoving(); + startPath = false; + if (WaypointPath const* i_path = sWaypointMgr->GetPath(me->GetWaypointPath())) { - damage = 0; - if (events.GetNextEventTime(EVENT_REBIRTH) == 0) + Movement::PointsArray pathPoints; + pathPoints.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ())); + for (uint8 i = 0; i < i_path->size(); ++i) { - me->InterruptNonMeleeSpells(false); - me->SetHealth(me->GetMaxHealth()); - me->SetReactState(REACT_PASSIVE); - me->CastSpell(me, SPELL_EMBER_BLAST, true); - - me->setAttackTimer(BASE_ATTACK, 16000); - events.Reset(); - events.ScheduleEvent(EVENT_RELOCATE_MIDDLE, 8000); - events.ScheduleEvent(EVENT_MOVE_TO_PHASE_2, 12000); - events.ScheduleEvent(EVENT_REBIRTH, 16001); + WaypointData const* node = i_path->at(i); + pathPoints.push_back(G3D::Vector3(node->x, node->y, node->z)); } + me->GetMotionMaster()->MoveSplinePath(&pathPoints); } } - void MovementInform(uint32 type, uint32 id) - { - if (type != POINT_MOTION_TYPE) - { - if (type == ESCORT_MOTION_TYPE && me->movespline->Finalized() && !me->IsInCombat()) - startPath = true; - return; - } + if (!UpdateVictim()) + return; - if (id == POINT_PLATFORM) - me->setAttackTimer(BASE_ATTACK, 1000); - else if (id == POINT_QUILL) - events.ScheduleEvent(EVENT_START_QUILLS, 1000); - else if (id == POINT_DIVE) - { - events.ScheduleEvent(EVENT_START_DIVE, 1000); - events.ScheduleEvent(EVENT_CAST_DIVE_BOMB, 5000); - } - } + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - void UpdateAI(uint32 diff) + switch (events.ExecuteEvent()) { - if (startPath) - { - me->StopMoving(); - startPath = false; - if (WaypointPath const* i_path = sWaypointMgr->GetPath(me->GetWaypointPath())) + case EVENT_SWITCH_PLATFORM: + if (roll_chance_i(20 * noQuillTimes)) { - Movement::PointsArray pathPoints; - pathPoints.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ())); - for (uint8 i = 0; i < i_path->size(); ++i) - { - WaypointData const* node = i_path->at(i); - pathPoints.push_back(G3D::Vector3(node->x, node->y, node->z)); - } - me->GetMotionMaster()->MoveSplinePath(&pathPoints); + noQuillTimes = 0; + platform = RAND(0, 3); + me->GetMotionMaster()->MovePoint(POINT_QUILL, alarPoints[POINT_QUILL], false, true); + events.ScheduleEvent(EVENT_SWITCH_PLATFORM, 16000); } - } - - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SWITCH_PLATFORM: - if (roll_chance_i(20*noQuillTimes)) + else + { + if (noQuillTimes++ > 0) { - noQuillTimes = 0; - platform = RAND(0, 3); - me->GetMotionMaster()->MovePoint(POINT_QUILL, alarPoints[POINT_QUILL], false, true); - events.ScheduleEvent(EVENT_SWITCH_PLATFORM, 16000); + me->SetOrientation(alarPoints[platform].GetOrientation()); + me->SummonCreature(NPC_EMBER_OF_ALAR, *me, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 6000); } - else - { - if (noQuillTimes++ > 0) - { - me->SetOrientation(alarPoints[platform].GetOrientation()); - me->SummonCreature(NPC_EMBER_OF_ALAR, *me, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 6000); - } - me->GetMotionMaster()->MovePoint(POINT_PLATFORM, alarPoints[platform], false, true); - platform = (platform+1)%4; - events.ScheduleEvent(EVENT_SWITCH_PLATFORM, 30000); - } - me->setAttackTimer(BASE_ATTACK, 20000); - break; - case EVENT_START_QUILLS: - me->CastSpell(me, SPELL_FLAME_QUILLS, false); - break; - case EVENT_RELOCATE_MIDDLE: - me->SetPosition(alarPoints[POINT_MIDDLE]); - break; - case EVENT_MOVE_TO_PHASE_2: - me->RemoveAurasDueToSpell(SPELL_EMBER_BLAST); - me->CastSpell(me, SPELL_REBIRTH_PHASE2, false); - break; - case EVENT_REBIRTH: - me->SetReactState(REACT_AGGRESSIVE); - platform = POINT_MIDDLE; - me->GetMotionMaster()->MoveChase(me->GetVictim()); + me->GetMotionMaster()->MovePoint(POINT_PLATFORM, alarPoints[platform], false, true); + platform = (platform + 1) % 4; + events.ScheduleEvent(EVENT_SWITCH_PLATFORM, 30000); + } + me->setAttackTimer(BASE_ATTACK, 20000); + break; + case EVENT_START_QUILLS: + me->CastSpell(me, SPELL_FLAME_QUILLS, false); + break; + case EVENT_RELOCATE_MIDDLE: + me->SetPosition(alarPoints[POINT_MIDDLE]); + break; + case EVENT_MOVE_TO_PHASE_2: + me->RemoveAurasDueToSpell(SPELL_EMBER_BLAST); + me->CastSpell(me, SPELL_REBIRTH_PHASE2, false); + break; + case EVENT_REBIRTH: + me->SetReactState(REACT_AGGRESSIVE); + platform = POINT_MIDDLE; + me->GetMotionMaster()->MoveChase(me->GetVictim()); - events.ScheduleEvent(EVENT_SPELL_MELT_ARMOR, 67000); - events.ScheduleEvent(EVENT_SPELL_CHARGE, 10000); - events.ScheduleEvent(EVENT_SPELL_FLAME_PATCH, 20000); - events.ScheduleEvent(EVENT_SPELL_DIVE_BOMB, 30000); - break; - case EVENT_SPELL_MELT_ARMOR: - me->CastSpell(me->GetVictim(), SPELL_MELT_ARMOR, false); - events.ScheduleEvent(EVENT_SPELL_MELT_ARMOR, 60000); - break; - case EVENT_SPELL_CHARGE: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true)) - me->CastSpell(target, SPELL_CHARGE, false); - events.ScheduleEvent(EVENT_SPELL_CHARGE, 30000); - break; - case EVENT_SPELL_FLAME_PATCH: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true)) - me->SummonCreature(NPC_FLAME_PATCH, *target, TEMPSUMMON_TIMED_DESPAWN, 2*MINUTE*IN_MILLISECONDS); - events.ScheduleEvent(EVENT_SPELL_FLAME_PATCH, 30000); - break; - case EVENT_SPELL_DIVE_BOMB: - me->GetMotionMaster()->MovePoint(POINT_DIVE, alarPoints[POINT_DIVE], false, true); - events.ScheduleEvent(EVENT_SPELL_DIVE_BOMB, 30000); - events.DelayEvents(15000); - me->setAttackTimer(BASE_ATTACK, 20000); - break; - case EVENT_START_DIVE: - me->CastSpell(me, SPELL_DIVE_BOMB_VISUAL, false); - break; - case EVENT_CAST_DIVE_BOMB: - events.ScheduleEvent(EVENT_SUMMON_DIVE_PHOENIX, 2000); - events.ScheduleEvent(EVENT_REBIRTH_DIVE, 6000); - events.ScheduleEvent(EVENT_FINISH_DIVE, 10000); - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 90.0f, true)) - { - me->CastSpell(target, SPELL_DIVE_BOMB, false); - me->SetPosition(*target); - me->StopMovingOnCurrentPos(); - } + events.ScheduleEvent(EVENT_SPELL_MELT_ARMOR, 67000); + events.ScheduleEvent(EVENT_SPELL_CHARGE, 10000); + events.ScheduleEvent(EVENT_SPELL_FLAME_PATCH, 20000); + events.ScheduleEvent(EVENT_SPELL_DIVE_BOMB, 30000); + break; + case EVENT_SPELL_MELT_ARMOR: + me->CastSpell(me->GetVictim(), SPELL_MELT_ARMOR, false); + events.ScheduleEvent(EVENT_SPELL_MELT_ARMOR, 60000); + break; + case EVENT_SPELL_CHARGE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true)) + me->CastSpell(target, SPELL_CHARGE, false); + events.ScheduleEvent(EVENT_SPELL_CHARGE, 30000); + break; + case EVENT_SPELL_FLAME_PATCH: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true)) + me->SummonCreature(NPC_FLAME_PATCH, *target, TEMPSUMMON_TIMED_DESPAWN, 2 * MINUTE * IN_MILLISECONDS); + events.ScheduleEvent(EVENT_SPELL_FLAME_PATCH, 30000); + break; + case EVENT_SPELL_DIVE_BOMB: + me->GetMotionMaster()->MovePoint(POINT_DIVE, alarPoints[POINT_DIVE], false, true); + events.ScheduleEvent(EVENT_SPELL_DIVE_BOMB, 30000); + events.DelayEvents(15000); + me->setAttackTimer(BASE_ATTACK, 20000); + break; + case EVENT_START_DIVE: + me->CastSpell(me, SPELL_DIVE_BOMB_VISUAL, false); + break; + case EVENT_CAST_DIVE_BOMB: + events.ScheduleEvent(EVENT_SUMMON_DIVE_PHOENIX, 2000); + events.ScheduleEvent(EVENT_REBIRTH_DIVE, 6000); + events.ScheduleEvent(EVENT_FINISH_DIVE, 10000); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 90.0f, true)) + { + me->CastSpell(target, SPELL_DIVE_BOMB, false); + me->SetPosition(*target); + me->StopMovingOnCurrentPos(); + } - me->RemoveAurasDueToSpell(SPELL_DIVE_BOMB_VISUAL); - break; - case EVENT_SUMMON_DIVE_PHOENIX: + me->RemoveAurasDueToSpell(SPELL_DIVE_BOMB_VISUAL); + break; + case EVENT_SUMMON_DIVE_PHOENIX: { Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 10.0f, true); me->SummonCreature(NPC_EMBER_OF_ALAR, target ? *target : *me, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 6000); me->SummonCreature(NPC_EMBER_OF_ALAR, target ? *target : *me, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 6000); break; } - case EVENT_REBIRTH_DIVE: - me->SetModelVisible(true); - me->CastSpell(me, SPELL_REBIRTH_DIVE, false); - break; - case EVENT_FINISH_DIVE: - me->GetMotionMaster()->MoveChase(me->GetVictim()); - break; - case EVENT_SPELL_BERSERK: - me->CastSpell(me, SPELL_BERSERK, true); - break; - } + case EVENT_REBIRTH_DIVE: + me->SetModelVisible(true); + me->CastSpell(me, SPELL_REBIRTH_DIVE, false); + break; + case EVENT_FINISH_DIVE: + me->GetMotionMaster()->MoveChase(me->GetVictim()); + break; + case EVENT_SPELL_BERSERK: + me->CastSpell(me, SPELL_BERSERK, true); + break; + } - if (me->isAttackReady()) + if (me->isAttackReady()) + { + if (me->IsWithinMeleeRange(me->GetVictim())) { - if (me->IsWithinMeleeRange(me->GetVictim())) - { - me->AttackerStateUpdate(me->GetVictim()); - me->resetAttackTimer(); - } - else - { - me->resetAttackTimer(); - ThreatContainer::StorageType const &threatList = me->getThreatManager().getThreatList(); - for (ThreatContainer::StorageType::const_iterator itr = threatList.begin(); itr != threatList.end(); ++itr) - if (Unit* unit = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid())) - if (me->IsWithinMeleeRange(unit)) - { - me->AttackerStateUpdate(unit); - return; - } + me->AttackerStateUpdate(me->GetVictim()); + me->resetAttackTimer(); + } + else + { + me->resetAttackTimer(); + ThreatContainer::StorageType const& threatList = me->getThreatManager().getThreatList(); + for (ThreatContainer::StorageType::const_iterator itr = threatList.begin(); itr != threatList.end(); ++itr) + if (Unit* unit = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid())) + if (me->IsWithinMeleeRange(unit)) + { + me->AttackerStateUpdate(unit); + return; + } - me->CastSpell(me, SPELL_FLAME_BUFFET, false); - } + me->CastSpell(me, SPELL_FLAME_BUFFET, false); } } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class CastQuill : public BasicEvent { - public: - CastQuill(Unit* caster, uint32 spellId) : _caster(caster), _spellId(spellId) - { - } +public: + CastQuill(Unit* caster, uint32 spellId) : _caster(caster), _spellId(spellId) + { + } - bool Execute(uint64 /*execTime*/, uint32 /*diff*/) - { - _caster->CastSpell(_caster, _spellId, true); - return true; - } + bool Execute(uint64 /*execTime*/, uint32 /*diff*/) + { + _caster->CastSpell(_caster, _spellId, true); + return true; + } - private: - Unit* _caster; - uint32 _spellId; +private: + Unit* _caster; + uint32 _spellId; }; class spell_alar_flame_quills : public SpellScriptLoader { - public: - spell_alar_flame_quills() : SpellScriptLoader("spell_alar_flame_quills") { } +public: + spell_alar_flame_quills() : SpellScriptLoader("spell_alar_flame_quills") { } - class spell_alar_flame_quills_AuraScript : public AuraScript + class spell_alar_flame_quills_AuraScript : public AuraScript + { + PrepareAuraScript(spell_alar_flame_quills_AuraScript); + + void HandlePeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_alar_flame_quills_AuraScript); + PreventDefaultAction(); - void HandlePeriodic(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - - // 24 spells in total - for (uint8 i = 0; i < 21; ++i) - GetUnitOwner()->m_Events.AddEvent(new CastQuill(GetUnitOwner(), SPELL_QUILL_MISSILE_1+i), GetUnitOwner()->m_Events.CalculateTime(i*40)); - GetUnitOwner()->m_Events.AddEvent(new CastQuill(GetUnitOwner(), SPELL_QUILL_MISSILE_2+0), GetUnitOwner()->m_Events.CalculateTime(22*40)); - GetUnitOwner()->m_Events.AddEvent(new CastQuill(GetUnitOwner(), SPELL_QUILL_MISSILE_2+1), GetUnitOwner()->m_Events.CalculateTime(23*40)); - GetUnitOwner()->m_Events.AddEvent(new CastQuill(GetUnitOwner(), SPELL_QUILL_MISSILE_2+2), GetUnitOwner()->m_Events.CalculateTime(24*40)); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_alar_flame_quills_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_alar_flame_quills_AuraScript(); + // 24 spells in total + for (uint8 i = 0; i < 21; ++i) + GetUnitOwner()->m_Events.AddEvent(new CastQuill(GetUnitOwner(), SPELL_QUILL_MISSILE_1 + i), GetUnitOwner()->m_Events.CalculateTime(i * 40)); + GetUnitOwner()->m_Events.AddEvent(new CastQuill(GetUnitOwner(), SPELL_QUILL_MISSILE_2 + 0), GetUnitOwner()->m_Events.CalculateTime(22 * 40)); + GetUnitOwner()->m_Events.AddEvent(new CastQuill(GetUnitOwner(), SPELL_QUILL_MISSILE_2 + 1), GetUnitOwner()->m_Events.CalculateTime(23 * 40)); + GetUnitOwner()->m_Events.AddEvent(new CastQuill(GetUnitOwner(), SPELL_QUILL_MISSILE_2 + 2), GetUnitOwner()->m_Events.CalculateTime(24 * 40)); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_alar_flame_quills_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_alar_flame_quills_AuraScript(); + } }; class spell_alar_ember_blast : public SpellScriptLoader { - public: - spell_alar_ember_blast() : SpellScriptLoader("spell_alar_ember_blast") { } +public: + spell_alar_ember_blast() : SpellScriptLoader("spell_alar_ember_blast") { } - class spell_alar_ember_blast_SpellScript : public SpellScript + class spell_alar_ember_blast_SpellScript : public SpellScript + { + PrepareSpellScript(spell_alar_ember_blast_SpellScript); + + void HandleForceCast(SpellEffIndex effIndex) { - PrepareSpellScript(spell_alar_ember_blast_SpellScript); - - void HandleForceCast(SpellEffIndex effIndex) - { - PreventHitEffect(effIndex); - if (InstanceScript* instance = GetCaster()->GetInstanceScript()) - if (Creature* alar = ObjectAccessor::GetCreature(*GetCaster(), instance->GetData64(NPC_ALAR))) - Unit::DealDamage(GetCaster(), alar, alar->CountPctFromMaxHealth(2)); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_alar_ember_blast_SpellScript::HandleForceCast, EFFECT_2, SPELL_EFFECT_FORCE_CAST); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_alar_ember_blast_SpellScript(); + PreventHitEffect(effIndex); + if (InstanceScript* instance = GetCaster()->GetInstanceScript()) + if (Creature* alar = ObjectAccessor::GetCreature(*GetCaster(), instance->GetData64(NPC_ALAR))) + Unit::DealDamage(GetCaster(), alar, alar->CountPctFromMaxHealth(2)); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_alar_ember_blast_SpellScript::HandleForceCast, EFFECT_2, SPELL_EFFECT_FORCE_CAST); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_alar_ember_blast_SpellScript(); + } }; class spell_alar_ember_blast_death : public SpellScriptLoader { - public: - spell_alar_ember_blast_death() : SpellScriptLoader("spell_alar_ember_blast_death") { } +public: + spell_alar_ember_blast_death() : SpellScriptLoader("spell_alar_ember_blast_death") { } - class spell_alar_ember_blast_death_AuraScript : public AuraScript + class spell_alar_ember_blast_death_AuraScript : public AuraScript + { + PrepareAuraScript(spell_alar_ember_blast_death_AuraScript); + + void OnApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_alar_ember_blast_death_AuraScript); + PreventDefaultAction(); // xinef: prevent default action after change that invisibility in instances is executed instantly even for creatures + Unit* target = GetTarget(); + InvisibilityType type = InvisibilityType(aurEff->GetMiscValue()); + target->m_invisibility.AddFlag(type); + target->m_invisibility.AddValue(type, aurEff->GetAmount()); - void OnApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - PreventDefaultAction(); // xinef: prevent default action after change that invisibility in instances is executed instantly even for creatures - Unit* target = GetTarget(); - InvisibilityType type = InvisibilityType(aurEff->GetMiscValue()); - target->m_invisibility.AddFlag(type); - target->m_invisibility.AddValue(type, aurEff->GetAmount()); - - GetUnitOwner()->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - GetUnitOwner()->SetStandState(UNIT_STAND_STATE_DEAD); - GetUnitOwner()->m_last_notify_position.Relocate(0.0f, 0.0f, 0.0f); - GetUnitOwner()->m_delayed_unit_relocation_timer = 1000; - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetUnitOwner()->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - GetUnitOwner()->SetStandState(UNIT_STAND_STATE_STAND); - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_alar_ember_blast_death_AuraScript::OnApply, EFFECT_2, SPELL_AURA_MOD_INVISIBILITY, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_alar_ember_blast_death_AuraScript::OnRemove, EFFECT_2, SPELL_AURA_MOD_INVISIBILITY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_alar_ember_blast_death_AuraScript(); + GetUnitOwner()->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + GetUnitOwner()->SetStandState(UNIT_STAND_STATE_DEAD); + GetUnitOwner()->m_last_notify_position.Relocate(0.0f, 0.0f, 0.0f); + GetUnitOwner()->m_delayed_unit_relocation_timer = 1000; } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetUnitOwner()->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + GetUnitOwner()->SetStandState(UNIT_STAND_STATE_STAND); + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_alar_ember_blast_death_AuraScript::OnApply, EFFECT_2, SPELL_AURA_MOD_INVISIBILITY, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_alar_ember_blast_death_AuraScript::OnRemove, EFFECT_2, SPELL_AURA_MOD_INVISIBILITY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_alar_ember_blast_death_AuraScript(); + } }; class spell_alar_dive_bomb : public SpellScriptLoader { - public: - spell_alar_dive_bomb() : SpellScriptLoader("spell_alar_dive_bomb") { } +public: + spell_alar_dive_bomb() : SpellScriptLoader("spell_alar_dive_bomb") { } - class spell_alar_dive_bomb_AuraScript : public AuraScript + class spell_alar_dive_bomb_AuraScript : public AuraScript + { + PrepareAuraScript(spell_alar_dive_bomb_AuraScript); + + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_alar_dive_bomb_AuraScript); - - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetUnitOwner()->SetModelVisible(false); - GetUnitOwner()->SetDisplayId(DISPLAYID_INVISIBLE); - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_alar_dive_bomb_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_alar_dive_bomb_AuraScript(); + GetUnitOwner()->SetModelVisible(false); + GetUnitOwner()->SetDisplayId(DISPLAYID_INVISIBLE); } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_alar_dive_bomb_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_alar_dive_bomb_AuraScript(); + } }; void AddSC_boss_alar() diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp index becb0e861..28ee740a5 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp @@ -57,242 +57,242 @@ enum Misc class boss_high_astromancer_solarian : public CreatureScript { - public: +public: - boss_high_astromancer_solarian() : CreatureScript("boss_high_astromancer_solarian") { } + boss_high_astromancer_solarian() : CreatureScript("boss_high_astromancer_solarian") { } - struct boss_high_astromancer_solarianAI : public BossAI + struct boss_high_astromancer_solarianAI : public BossAI + { + boss_high_astromancer_solarianAI(Creature* creature) : BossAI(creature, DATA_ASTROMANCER) { - boss_high_astromancer_solarianAI(Creature* creature) : BossAI(creature, DATA_ASTROMANCER) + } + + void Reset() + { + BossAI::Reset(); + me->SetModelVisible(true); + } + + void AttackStart(Unit* who) + { + if (who && me->Attack(who, true)) + me->GetMotionMaster()->MoveChase(who, (events.GetNextEventTime(EVENT_SPELL_VOID_BOLT) == 0 ? 30.0f : 0.0f)); + } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER && roll_chance_i(50)) + Talk(SAY_KILL); + } + + void JustDied(Unit* killer) + { + me->SetModelVisible(true); + Talk(SAY_DEATH); + BossAI::JustDied(killer); + } + + void EnterCombat(Unit* who) + { + Talk(SAY_AGGRO); + BossAI::EnterCombat(who); + me->CallForHelp(105.0f); + + events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); + events.ScheduleEvent(EVENT_SPELL_ARCANE_MISSILES, 3000); + events.ScheduleEvent(EVENT_SPELL_WRATH_OF_ASTROMANCER, 1000); + events.ScheduleEvent(EVENT_SPELL_BLINDING_LIGHT, 40000); + events.ScheduleEvent(EVENT_SPAWN_PORTALS, 50000); + } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + if (!summon->IsTrigger()) + summon->SetInCombatWithZone(); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) { - } - - void Reset() - { - BossAI::Reset(); - me->SetModelVisible(true); - } - - void AttackStart(Unit* who) - { - if (who && me->Attack(who, true)) - me->GetMotionMaster()->MoveChase(who, (events.GetNextEventTime(EVENT_SPELL_VOID_BOLT) == 0 ? 30.0f : 0.0f)); - } - - void KilledUnit(Unit* victim) - { - if (victim->GetTypeId() == TYPEID_PLAYER && roll_chance_i(50)) - Talk(SAY_KILL); - } - - void JustDied(Unit* killer) - { - me->SetModelVisible(true); - Talk(SAY_DEATH); - BossAI::JustDied(killer); - } - - void EnterCombat(Unit* who) - { - Talk(SAY_AGGRO); - BossAI::EnterCombat(who); - me->CallForHelp(105.0f); - - events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); - events.ScheduleEvent(EVENT_SPELL_ARCANE_MISSILES, 3000); - events.ScheduleEvent(EVENT_SPELL_WRATH_OF_ASTROMANCER, 1000); - events.ScheduleEvent(EVENT_SPELL_BLINDING_LIGHT, 40000); - events.ScheduleEvent(EVENT_SPAWN_PORTALS, 50000); - } - - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - if (!summon->IsTrigger()) - summon->SetInCombatWithZone(); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_CHECK_HEALTH: - if (me->HealthBelowPct(21)) - { - events.Reset(); - events.ScheduleEvent(EVENT_SPELL_VOID_BOLT, 3000); - events.ScheduleEvent(EVENT_SPELL_PSYCHIC_SCREAM, 7000); - me->CastSpell(me, SPELL_SOLARIAN_TRANSFORM, true); - me->GetMotionMaster()->MoveChase(me->GetVictim()); - break; - } - events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); + case EVENT_CHECK_HEALTH: + if (me->HealthBelowPct(21)) + { + events.Reset(); + events.ScheduleEvent(EVENT_SPELL_VOID_BOLT, 3000); + events.ScheduleEvent(EVENT_SPELL_PSYCHIC_SCREAM, 7000); + me->CastSpell(me, SPELL_SOLARIAN_TRANSFORM, true); + me->GetMotionMaster()->MoveChase(me->GetVictim()); break; - case EVENT_SPELL_ARCANE_MISSILES: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true)) - me->CastSpell(target, SPELL_ARCANE_MISSILES, false); - events.ScheduleEvent(EVENT_SPELL_ARCANE_MISSILES, 3000); - break; - case EVENT_SPELL_WRATH_OF_ASTROMANCER: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) - me->CastSpell(target, SPELL_WRATH_OF_THE_ASTROMANCER, false); - events.ScheduleEvent(EVENT_SPELL_WRATH_OF_ASTROMANCER, 22000); - break; - case EVENT_SPELL_BLINDING_LIGHT: - me->CastSpell(me, SPELL_BLINDING_LIGHT, false); - events.ScheduleEvent(EVENT_SPELL_BLINDING_LIGHT, 40000); - break; - case EVENT_SPAWN_PORTALS: - me->setAttackTimer(BASE_ATTACK, 21000); - me->SetModelVisible(false); - events.ScheduleEvent(EVENT_SPAWN_PORTALS, 50000); - events.DelayEvents(21000); - events.ScheduleEvent(EVENT_SUMMON_ADDS, 6000); - events.ScheduleEvent(EVENT_REAPPEAR, 20000); - for (uint8 i = 0; i < 3; ++i) - { - float o = rand_norm()*2*M_PI; - if (i == 0) - me->SummonCreature(NPC_ASTROMANCER_SOLARIAN_SPOTLIGHT, CENTER_X + cos(o)*INNER_PORTAL_RADIUS, CENTER_Y + sin(o)*INNER_PORTAL_RADIUS, CENTER_Z, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 26000); - else - me->SummonCreature(NPC_ASTROMANCER_SOLARIAN_SPOTLIGHT, CENTER_X + cos(o)*OUTER_PORTAL_RADIUS, CENTER_Y + sin(o)*OUTER_PORTAL_RADIUS, PORTAL_Z, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 26000); - } - break; - case EVENT_SUMMON_ADDS: - Talk(SAY_SUMMON1); - for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) - { - if (Creature* light = ObjectAccessor::GetCreature(*me, *itr)) - if (light->GetEntry() == NPC_ASTROMANCER_SOLARIAN_SPOTLIGHT) - { - if (light->GetDistance2d(CENTER_X, CENTER_Y) < 20.0f) - { - me->SetPosition(*light); - me->StopMovingOnCurrentPos(); - } - for (uint8 j = 0; j < 4; ++j) - me->SummonCreature(NPC_SOLARIUM_AGENT, light->GetPositionX()+frand(-3.0f, 3.0f), light->GetPositionY()+frand(-3.0f, 3.0f), light->GetPositionZ(), 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); - } - } - break; - case EVENT_REAPPEAR: - Talk(SAY_SUMMON2); - for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) - { - if (Creature* light = ObjectAccessor::GetCreature(*me, *itr)) + } + events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); + break; + case EVENT_SPELL_ARCANE_MISSILES: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true)) + me->CastSpell(target, SPELL_ARCANE_MISSILES, false); + events.ScheduleEvent(EVENT_SPELL_ARCANE_MISSILES, 3000); + break; + case EVENT_SPELL_WRATH_OF_ASTROMANCER: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) + me->CastSpell(target, SPELL_WRATH_OF_THE_ASTROMANCER, false); + events.ScheduleEvent(EVENT_SPELL_WRATH_OF_ASTROMANCER, 22000); + break; + case EVENT_SPELL_BLINDING_LIGHT: + me->CastSpell(me, SPELL_BLINDING_LIGHT, false); + events.ScheduleEvent(EVENT_SPELL_BLINDING_LIGHT, 40000); + break; + case EVENT_SPAWN_PORTALS: + me->setAttackTimer(BASE_ATTACK, 21000); + me->SetModelVisible(false); + events.ScheduleEvent(EVENT_SPAWN_PORTALS, 50000); + events.DelayEvents(21000); + events.ScheduleEvent(EVENT_SUMMON_ADDS, 6000); + events.ScheduleEvent(EVENT_REAPPEAR, 20000); + for (uint8 i = 0; i < 3; ++i) + { + float o = rand_norm() * 2 * M_PI; + if (i == 0) + me->SummonCreature(NPC_ASTROMANCER_SOLARIAN_SPOTLIGHT, CENTER_X + cos(o)*INNER_PORTAL_RADIUS, CENTER_Y + sin(o)*INNER_PORTAL_RADIUS, CENTER_Z, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 26000); + else + me->SummonCreature(NPC_ASTROMANCER_SOLARIAN_SPOTLIGHT, CENTER_X + cos(o)*OUTER_PORTAL_RADIUS, CENTER_Y + sin(o)*OUTER_PORTAL_RADIUS, PORTAL_Z, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 26000); + } + break; + case EVENT_SUMMON_ADDS: + Talk(SAY_SUMMON1); + for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) + { + if (Creature* light = ObjectAccessor::GetCreature(*me, *itr)) + if (light->GetEntry() == NPC_ASTROMANCER_SOLARIAN_SPOTLIGHT) { - if (light->GetEntry() == NPC_ASTROMANCER_SOLARIAN_SPOTLIGHT) + if (light->GetDistance2d(CENTER_X, CENTER_Y) < 20.0f) { - light->RemoveAllAuras(); - if (light->GetDistance2d(CENTER_X, CENTER_Y) < 20.0f) - me->SetModelVisible(true); - else - me->SummonCreature(NPC_SOLARIUM_PRIEST, light->GetPositionX()+frand(-3.0f, 3.0f), light->GetPositionY()+frand(-3.0f, 3.0f), light->GetPositionZ(), 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); + me->SetPosition(*light); + me->StopMovingOnCurrentPos(); } + for (uint8 j = 0; j < 4; ++j) + me->SummonCreature(NPC_SOLARIUM_AGENT, light->GetPositionX() + frand(-3.0f, 3.0f), light->GetPositionY() + frand(-3.0f, 3.0f), light->GetPositionZ(), 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); + } + } + break; + case EVENT_REAPPEAR: + Talk(SAY_SUMMON2); + for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) + { + if (Creature* light = ObjectAccessor::GetCreature(*me, *itr)) + { + if (light->GetEntry() == NPC_ASTROMANCER_SOLARIAN_SPOTLIGHT) + { + light->RemoveAllAuras(); + if (light->GetDistance2d(CENTER_X, CENTER_Y) < 20.0f) + me->SetModelVisible(true); + else + me->SummonCreature(NPC_SOLARIUM_PRIEST, light->GetPositionX() + frand(-3.0f, 3.0f), light->GetPositionY() + frand(-3.0f, 3.0f), light->GetPositionZ(), 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); } } - // protection - if (me->GetDisplayId() != me->GetNativeDisplayId()) - { - me->SetModelVisible(true); - me->SummonCreature(NPC_SOLARIUM_PRIEST, me->GetPositionX()+frand(-3.0f, 3.0f), me->GetPositionY()+frand(-3.0f, 3.0f), me->GetPositionZ(), 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); - me->SummonCreature(NPC_SOLARIUM_PRIEST, me->GetPositionX()+frand(-3.0f, 3.0f), me->GetPositionY()+frand(-3.0f, 3.0f), me->GetPositionZ(), 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); - } - break; - case EVENT_SPELL_VOID_BOLT: - me->CastSpell(me->GetVictim(), SPELL_VOID_BOLT, false); - events.ScheduleEvent(EVENT_SPELL_VOID_BOLT, 7000); - break; - case EVENT_SPELL_PSYCHIC_SCREAM: - me->CastSpell(me, SPELL_PSYCHIC_SCREAM, false); - events.ScheduleEvent(EVENT_SPELL_PSYCHIC_SCREAM, 12000); - break; + } + // protection + if (me->GetDisplayId() != me->GetNativeDisplayId()) + { + me->SetModelVisible(true); + me->SummonCreature(NPC_SOLARIUM_PRIEST, me->GetPositionX() + frand(-3.0f, 3.0f), me->GetPositionY() + frand(-3.0f, 3.0f), me->GetPositionZ(), 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); + me->SummonCreature(NPC_SOLARIUM_PRIEST, me->GetPositionX() + frand(-3.0f, 3.0f), me->GetPositionY() + frand(-3.0f, 3.0f), me->GetPositionZ(), 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); + } + break; + case EVENT_SPELL_VOID_BOLT: + me->CastSpell(me->GetVictim(), SPELL_VOID_BOLT, false); + events.ScheduleEvent(EVENT_SPELL_VOID_BOLT, 7000); + break; + case EVENT_SPELL_PSYCHIC_SCREAM: + me->CastSpell(me, SPELL_PSYCHIC_SCREAM, false); + events.ScheduleEvent(EVENT_SPELL_PSYCHIC_SCREAM, 12000); + break; - } - - DoMeleeAttackIfReady(); - EnterEvadeIfOutOfCombatArea(); } - - bool CheckEvadeIfOutOfCombatArea() const - { - return me->GetDistance2d(432.59f, -371.93f) > 105.0f; - } - }; - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + DoMeleeAttackIfReady(); + EnterEvadeIfOutOfCombatArea(); } + + bool CheckEvadeIfOutOfCombatArea() const + { + return me->GetDistance2d(432.59f, -371.93f) > 105.0f; + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class spell_astromancer_wrath_of_the_astromancer : public SpellScriptLoader { - public: - spell_astromancer_wrath_of_the_astromancer() : SpellScriptLoader("spell_astromancer_wrath_of_the_astromancer") { } +public: + spell_astromancer_wrath_of_the_astromancer() : SpellScriptLoader("spell_astromancer_wrath_of_the_astromancer") { } - class spell_astromancer_wrath_of_the_astromancer_AuraScript : public AuraScript + class spell_astromancer_wrath_of_the_astromancer_AuraScript : public AuraScript + { + PrepareAuraScript(spell_astromancer_wrath_of_the_astromancer_AuraScript); + + void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_astromancer_wrath_of_the_astromancer_AuraScript); + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) + return; - void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) - return; - - Unit* target = GetUnitOwner(); - target->CastSpell(target, GetSpellInfo()->Effects[EFFECT_1].CalcValue(), false); - } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_astromancer_wrath_of_the_astromancer_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_astromancer_wrath_of_the_astromancer_AuraScript(); + Unit* target = GetUnitOwner(); + target->CastSpell(target, GetSpellInfo()->Effects[EFFECT_1].CalcValue(), false); } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_astromancer_wrath_of_the_astromancer_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_astromancer_wrath_of_the_astromancer_AuraScript(); + } }; class spell_astromancer_solarian_transform : public SpellScriptLoader { - public: - spell_astromancer_solarian_transform() : SpellScriptLoader("spell_astromancer_solarian_transform") { } +public: + spell_astromancer_solarian_transform() : SpellScriptLoader("spell_astromancer_solarian_transform") { } - class spell_astromancer_solarian_transform_AuraScript : public AuraScript + class spell_astromancer_solarian_transform_AuraScript : public AuraScript + { + PrepareAuraScript(spell_astromancer_solarian_transform_AuraScript); + + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_astromancer_solarian_transform_AuraScript); - - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetUnitOwner()->HandleStatModifier(UnitMods(UNIT_MOD_ARMOR), TOTAL_PCT, 400.0f, true); - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetUnitOwner()->HandleStatModifier(UnitMods(UNIT_MOD_ARMOR), TOTAL_PCT, 400.0f, false); - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_astromancer_solarian_transform_AuraScript::OnApply, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_astromancer_solarian_transform_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_astromancer_solarian_transform_AuraScript(); + GetUnitOwner()->HandleStatModifier(UnitMods(UNIT_MOD_ARMOR), TOTAL_PCT, 400.0f, true); } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetUnitOwner()->HandleStatModifier(UnitMods(UNIT_MOD_ARMOR), TOTAL_PCT, 400.0f, false); + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_astromancer_solarian_transform_AuraScript::OnApply, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_astromancer_solarian_transform_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_astromancer_solarian_transform_AuraScript(); + } }; void AddSC_boss_high_astromancer_solarian() diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp index 413557582..ae17a6c81 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp @@ -170,874 +170,874 @@ const Position triggersPos[6] = class boss_kaelthas : public CreatureScript { - public: - boss_kaelthas() : CreatureScript("boss_kaelthas") { } +public: + boss_kaelthas() : CreatureScript("boss_kaelthas") { } - struct boss_kaelthasAI : public BossAI + struct boss_kaelthasAI : public BossAI + { + boss_kaelthasAI(Creature* creature) : BossAI(creature, DATA_KAELTHAS) { } + + uint8 phase; + EventMap events2; + + void PrepareAdvisors() { - boss_kaelthasAI(Creature* creature) : BossAI(creature, DATA_KAELTHAS) { } + for (uint8 i = DATA_KAEL_ADVISOR1; i <= DATA_KAEL_ADVISOR4; ++i) + if (Creature* advisor = ObjectAccessor::GetCreature(*me, instance->GetData64(i))) + { + advisor->Respawn(true); + advisor->StopMovingOnCurrentPos(); + advisor->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + advisor->SetReactState(REACT_PASSIVE); + summons.Summon(advisor); + } + } - uint8 phase; - EventMap events2; - - void PrepareAdvisors() + void SetData(uint32 type, uint32 data) + { + if (type == DATA_RESURRECT_CAST && data == DATA_RESURRECT_CAST) { - for (uint8 i = DATA_KAEL_ADVISOR1; i <= DATA_KAEL_ADVISOR4; ++i) - if (Creature* advisor = ObjectAccessor::GetCreature(*me, instance->GetData64(i))) - { - advisor->Respawn(true); - advisor->StopMovingOnCurrentPos(); - advisor->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - advisor->SetReactState(REACT_PASSIVE); - summons.Summon(advisor); - } + for (SummonList::const_iterator i = summons.begin(); i != summons.end(); ++i) + if (Creature* summon = ObjectAccessor::GetCreature(*me, *i)) + if (summon->GetDBTableGUIDLow()) + { + summon->SetReactState(REACT_PASSIVE); + summon->setDeathState(JUST_RESPAWNED); + summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + } + } + } + + void SetRoomState(GOState state) + { + if (GameObject* window = ObjectAccessor::GetGameObject(*me, instance->GetData64(GO_BRIDGE_WINDOW))) + window->SetGoState(state); + if (GameObject* window = ObjectAccessor::GetGameObject(*me, instance->GetData64(GO_KAEL_STATUE_RIGHT))) + window->SetGoState(state); + if (GameObject* window = ObjectAccessor::GetGameObject(*me, instance->GetData64(GO_KAEL_STATUE_LEFT))) + window->SetGoState(state); + } + + void Reset() + { + BossAI::Reset(); + events2.Reset(); + events2.ScheduleEvent(EVENT_GATHER_ADVISORS, 1000); + phase = PHASE_NONE; + + me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_HOVER, true); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE); + SetRoomState(GO_STATE_READY); + me->SetDisableGravity(false); + me->SetWalk(false); + } + + void AttackStart(Unit* who) + { + if (phase == PHASE_FINAL && events.GetNextEventTime(EVENT_GRAVITY_LAPSE_END) == 0) + BossAI::AttackStart(who); + } + + void MoveInLineOfSight(Unit* who) + { + if (phase == PHASE_NONE && who->GetTypeId() == TYPEID_PLAYER && me->IsValidAttackTarget(who)) + { + phase = PHASE_SINGLE_ADVISOR; + me->SetInCombatWithZone(); + Talk(SAY_INTRO); + events2.ScheduleEvent(EVENT_PREFIGHT_PHASE11, 23000); + events2.ScheduleEvent(EVENT_PREFIGHT_PHASE12, 30000); + } + } + + void EnterCombat(Unit* who) + { + BossAI::EnterCombat(who); + } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + if (summon->GetEntry() == NPC_NETHER_VAPOR) + summon->GetMotionMaster()->MoveRandom(20.0f); + } + + void SummonedCreatureDies(Creature* summon, Unit*) + { + if (phase == PHASE_FINAL) + return; + + if (summon->GetDBTableGUIDLow() && phase == PHASE_ALL_ADVISORS) + { + for (SummonList::const_iterator i = summons.begin(); i != summons.end(); ++i) + if (Creature* summon = ObjectAccessor::GetCreature(*me, *i)) + if (summon->GetDBTableGUIDLow() && summon->IsAlive()) + return; + + events2.ScheduleEvent(EVENT_PREFIGHT_PHASE71, 2000); + return; } - void SetData(uint32 type, uint32 data) + if (summon->GetEntry() == NPC_THALADRED) { - if (type == DATA_RESURRECT_CAST && data == DATA_RESURRECT_CAST) + events2.ScheduleEvent(EVENT_PREFIGHT_PHASE21, 2000); + events2.ScheduleEvent(EVENT_PREFIGHT_PHASE22, 14500); + } + else if (summon->GetEntry() == NPC_LORD_SANGUINAR) + { + events2.ScheduleEvent(EVENT_PREFIGHT_PHASE31, 2000); + events2.ScheduleEvent(EVENT_PREFIGHT_PHASE32, 9000); + } + else if (summon->GetEntry() == NPC_CAPERNIAN) + { + events2.ScheduleEvent(EVENT_PREFIGHT_PHASE41, 2000); + events2.ScheduleEvent(EVENT_PREFIGHT_PHASE42, 10400); + } + else if (summon->GetEntry() == NPC_TELONICUS) + { + events2.ScheduleEvent(EVENT_PREFIGHT_PHASE51, 3000); + events2.ScheduleEvent(EVENT_PREFIGHT_PHASE52, 9000); + } + } + + void JustDied(Unit* killer) + { + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); + + Talk(SAY_DEATH); + BossAI::JustDied(killer); + } + + void MovementInform(uint32 type, uint32 point) + { + if (type != POINT_MOTION_TYPE) + return; + + if (point == POINT_MIDDLE) + { + events2.ScheduleEvent(EVENT_SCENE_1, 0); + events2.ScheduleEvent(EVENT_SCENE_2, 2500); + events2.ScheduleEvent(EVENT_SCENE_3, 4000); + events2.ScheduleEvent(EVENT_SCENE_4, 7000); + events2.ScheduleEvent(EVENT_SCENE_5, 10000); + events2.ScheduleEvent(EVENT_SCENE_6, 14000); + events2.ScheduleEvent(EVENT_SCENE_7, 17500); + events2.ScheduleEvent(EVENT_SCENE_8, 19000); + events2.ScheduleEvent(EVENT_SCENE_9, 22000); // two first lightnings + aura + events2.ScheduleEvent(EVENT_SCENE_10, 22800); // two + events2.ScheduleEvent(EVENT_SCENE_11, 23600); // two + events2.ScheduleEvent(EVENT_SCENE_12, 24500); // two + events2.ScheduleEvent(EVENT_SCENE_13, 24800); // two + events2.ScheduleEvent(EVENT_SCENE_14, 25300); // two + events2.ScheduleEvent(EVENT_SCENE_15, 32000); // full power + events2.ScheduleEvent(EVENT_SCENE_16, 36000); // remove lightnings + aura, move down + } + else if (point == POINT_START_LAST_PHASE) + { + me->SetDisableGravity(false); + me->SetWalk(false); + me->RemoveAurasDueToSpell(SPELL_KAEL_FULL_POWER); + me->SetReactState(REACT_AGGRESSIVE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); + events.SetTimer(60000); + events.ScheduleEvent(EVENT_SPELL_FIREBALL, 0); + events.ScheduleEvent(EVENT_SPELL_FLAMESTRIKE, 10000); + events.ScheduleEvent(EVENT_SPELL_SUMMON_PHOENIX, 20000); + events.ScheduleEvent(EVENT_SPELL_GRAVITY_LAPSE, 5000); + if (me->GetVictim()) { + me->SetTarget(me->GetVictim()->GetGUID()); + AttackStart(me->GetVictim()); + } + } + } + + void UpdateAI(uint32 diff) + { + if (EnterEvadeIfOutOfCombatArea()) + return; + + events2.Update(diff); + switch (events2.ExecuteEvent()) + { + case EVENT_GATHER_ADVISORS: + PrepareAdvisors(); + break; + case EVENT_PREFIGHT_PHASE11: + Talk(SAY_INTRO_THALADRED); + break; + case EVENT_PREFIGHT_PHASE12: + if (Creature* advisor = summons.GetCreatureWithEntry(NPC_THALADRED)) + { + advisor->SetReactState(REACT_AGGRESSIVE); + advisor->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + advisor->AI()->AttackStart(target); + advisor->SetInCombatWithZone(); + advisor->AI()->Talk(SAY_THALADRED_AGGRO); + } + break; + case EVENT_PREFIGHT_PHASE21: + Talk(SAY_INTRO_SANGUINAR); + break; + case EVENT_PREFIGHT_PHASE22: + if (Creature* advisor = summons.GetCreatureWithEntry(NPC_LORD_SANGUINAR)) + { + advisor->SetReactState(REACT_AGGRESSIVE); + advisor->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + advisor->AI()->AttackStart(target); + advisor->SetInCombatWithZone(); + advisor->AI()->Talk(SAY_SANGUINAR_AGGRO); + } + break; + case EVENT_PREFIGHT_PHASE31: + Talk(SAY_INTRO_CAPERNIAN); + break; + case EVENT_PREFIGHT_PHASE32: + if (Creature* advisor = summons.GetCreatureWithEntry(NPC_CAPERNIAN)) + { + advisor->SetReactState(REACT_AGGRESSIVE); + advisor->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + advisor->AI()->AttackStart(target); + advisor->SetInCombatWithZone(); + advisor->AI()->Talk(SAY_CAPERNIAN_AGGRO); + } + break; + case EVENT_PREFIGHT_PHASE41: + Talk(SAY_INTRO_TELONICUS); + break; + case EVENT_PREFIGHT_PHASE42: + if (Creature* advisor = summons.GetCreatureWithEntry(NPC_TELONICUS)) + { + advisor->SetReactState(REACT_AGGRESSIVE); + advisor->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + advisor->AI()->AttackStart(target); + advisor->SetInCombatWithZone(); + advisor->AI()->Talk(SAY_TELONICUS_AGGRO); + } + break; + case EVENT_PREFIGHT_PHASE51: + Talk(SAY_PHASE2_WEAPON); + me->CastSpell(me, SPELL_SUMMON_WEAPONS, false); + phase = PHASE_WEAPONS; + break; + case EVENT_PREFIGHT_PHASE52: + for (SummonList::const_iterator i = summons.begin(); i != summons.end(); ++i) + { + if (Creature* summon = ObjectAccessor::GetCreature(*me, *i)) + if (!summon->GetDBTableGUIDLow()) + { + summon->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); + summon->SetInCombatWithZone(); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + summon->AI()->AttackStart(target); + } + } + events2.ScheduleEvent(EVENT_PREFIGHT_PHASE61, 2 * MINUTE * IN_MILLISECONDS); + events2.ScheduleEvent(EVENT_PREFIGHT_PHASE62, 2 * MINUTE * IN_MILLISECONDS + 6000); + events2.ScheduleEvent(EVENT_PREFIGHT_PHASE63, 2 * MINUTE * IN_MILLISECONDS + 12000); + break; + case EVENT_PREFIGHT_PHASE61: + phase = PHASE_ALL_ADVISORS; + Talk(SAY_PHASE3_ADVANCE); + break; + case EVENT_PREFIGHT_PHASE62: + me->CastSpell(me, SPELL_RESURRECTION, false); + break; + case EVENT_PREFIGHT_PHASE63: for (SummonList::const_iterator i = summons.begin(); i != summons.end(); ++i) if (Creature* summon = ObjectAccessor::GetCreature(*me, *i)) if (summon->GetDBTableGUIDLow()) { - summon->SetReactState(REACT_PASSIVE); - summon->setDeathState(JUST_RESPAWNED); - summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + summon->SetReactState(REACT_AGGRESSIVE); + summon->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + summon->SetInCombatWithZone(); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + summon->AI()->AttackStart(target); } - } + events2.ScheduleEvent(EVENT_PREFIGHT_PHASE71, 3 * MINUTE * IN_MILLISECONDS); + break; + case EVENT_PREFIGHT_PHASE71: + events2.CancelEvent(EVENT_PREFIGHT_PHASE71); + Talk(SAY_PHASE4_INTRO2); + phase = PHASE_FINAL; + DoResetThreat(); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + AttackStart(target); + + events2.Reset(); + events.Reset(); + events.ScheduleEvent(EVENT_SPELL_FIREBALL, 1000); + events.ScheduleEvent(EVENT_SPELL_FLAMESTRIKE, 15000); + events.ScheduleEvent(EVENT_SPELL_SUMMON_PHOENIX, 30000); + events.ScheduleEvent(EVENT_SPELL_SEQ_1, 20000); + events.ScheduleEvent(EVENT_SPELL_SEQ_2, 40000); + events.ScheduleEvent(EVENT_SPELL_SEQ_3, 60000); + events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); + break; + case EVENT_SCENE_1: + me->SetTarget(0); + me->SetFacingTo(M_PI); + me->SetWalk(true); + Talk(SAY_PHASE5_NUTS); + break; + case EVENT_SCENE_2: + me->SetTarget(0); + me->CastSpell(me, SPELL_KAEL_EXPLODES1, true); + me->CastSpell(me, SPELL_KAEL_GAINING_POWER, false); + me->SetDisableGravity(true); + break; + case EVENT_SCENE_3: + me->SetTarget(0); + for (uint8 i = 0; i < 2; ++i) + if (Creature* trigger = me->SummonCreature(WORLD_TRIGGER, triggersPos[i], TEMPSUMMON_TIMED_DESPAWN, 60000)) + trigger->CastSpell(me, SPELL_NETHERBEAM1 + i, false); + me->GetMotionMaster()->MovePoint(POINT_AIR, me->GetPositionX(), me->GetPositionY(), 76.0f, false, true); + me->CastSpell(me, SPELL_GROW, true); + break; + case EVENT_SCENE_4: + me->SetTarget(0); + me->CastSpell(me, SPELL_GROW, true); + me->CastSpell(me, SPELL_KAEL_EXPLODES2, true); + me->CastSpell(me, SPELL_NETHERBEAM_AURA1, true); + for (uint8 i = 0; i < 2; ++i) + if (Creature* trigger = me->SummonCreature(WORLD_TRIGGER, triggersPos[i + 2], TEMPSUMMON_TIMED_DESPAWN, 60000)) + trigger->CastSpell(me, SPELL_NETHERBEAM1 + i, false); + break; + case EVENT_SCENE_5: + me->SetTarget(0); + me->CastSpell(me, SPELL_GROW, true); + me->CastSpell(me, SPELL_KAEL_EXPLODES3, true); + me->CastSpell(me, SPELL_NETHERBEAM_AURA2, true); + for (uint8 i = 0; i < 2; ++i) + if (Creature* trigger = me->SummonCreature(WORLD_TRIGGER, triggersPos[i + 4], TEMPSUMMON_TIMED_DESPAWN, 60000)) + trigger->CastSpell(me, SPELL_NETHERBEAM1 + i, false); + break; + case EVENT_SCENE_6: + me->CastSpell(me, SPELL_GROW, true); + me->CastSpell(me, SPELL_KAEL_EXPLODES4, true); + me->CastSpell(me, SPELL_NETHERBEAM_AURA3, true); + break; + case EVENT_SCENE_7: + SetRoomState(GO_STATE_ACTIVE); + me->SetUnitMovementFlags(MOVEMENTFLAG_HOVER | MOVEMENTFLAG_WALKING | MOVEMENTFLAG_DISABLE_GRAVITY); + me->SendMovementFlagUpdate(); + break; + case EVENT_SCENE_8: + summons.DespawnEntry(WORLD_TRIGGER); + me->RemoveAurasDueToSpell(SPELL_NETHERBEAM_AURA1); + me->RemoveAurasDueToSpell(SPELL_NETHERBEAM_AURA2); + me->RemoveAurasDueToSpell(SPELL_NETHERBEAM_AURA3); + me->CastSpell(me, SPELL_KAEL_EXPLODES5, true); + me->CastSpell(me, SPELL_FLOATING_DROWNED, false); + //me->CastSpell(me, SPELL_KEAL_STUNNED, true); + break; + case EVENT_SCENE_9: + me->CastSpell(me, 52241, true); // WRONG VISUAL, ZOMG! + me->CastSpell(me, 34807, true); + me->SummonCreature(NPC_WORLD_TRIGGER, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 15.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 60000); + if (Creature* trigger = me->SummonCreature(WORLD_TRIGGER, me->GetPositionX() + 5, me->GetPositionY(), me->GetPositionZ() + 15.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 60000)) + trigger->CastSpell(me, SPELL_PURE_NETHER_BEAM1, true); + if (Creature* trigger = me->SummonCreature(WORLD_TRIGGER, me->GetPositionX() - 5, me->GetPositionY(), me->GetPositionZ() + 15.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 60000)) + trigger->CastSpell(me, SPELL_PURE_NETHER_BEAM2, true); + break; + case EVENT_SCENE_10: + if (Creature* trigger = me->SummonCreature(WORLD_TRIGGER, me->GetPositionX() - 5, me->GetPositionY() - 5, me->GetPositionZ() + 15.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 60000)) + trigger->CastSpell(me, SPELL_PURE_NETHER_BEAM3, true); + if (Creature* trigger = me->SummonCreature(WORLD_TRIGGER, me->GetPositionX() + 5, me->GetPositionY() + 5, me->GetPositionZ() + 15.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 60000)) + trigger->CastSpell(me, SPELL_PURE_NETHER_BEAM1, true); + break; + case EVENT_SCENE_11: + if (Creature* trigger = me->SummonCreature(WORLD_TRIGGER, me->GetPositionX(), me->GetPositionY() + 5, me->GetPositionZ() + 15.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 60000)) + trigger->CastSpell(me, SPELL_PURE_NETHER_BEAM2, true); + break; + case EVENT_SCENE_12: + if (Creature* trigger = me->SummonCreature(WORLD_TRIGGER, me->GetPositionX(), me->GetPositionY() - 5, me->GetPositionZ() + 15.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 60000)) + trigger->CastSpell(me, SPELL_PURE_NETHER_BEAM3, true); + if (Creature* trigger = me->SummonCreature(WORLD_TRIGGER, me->GetPositionX() + 5, me->GetPositionY() - 5, me->GetPositionZ() + 15.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 60000)) + trigger->CastSpell(me, SPELL_PURE_NETHER_BEAM1, true); + break; + case EVENT_SCENE_13: + if (Creature* trigger = me->SummonCreature(WORLD_TRIGGER, me->GetPositionX() - 5, me->GetPositionY() + 5, me->GetPositionZ() + 15.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 60000)) + trigger->CastSpell(me, SPELL_PURE_NETHER_BEAM2, true); + break; + case EVENT_SCENE_14: + //if (Creature* trigger = me->SummonCreature(WORLD_TRIGGER, me->GetPositionX()-5, me->GetPositionY()+5, me->GetPositionZ()+15.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 60000)) + // trigger->CastSpell(me, SPELL_PURE_NETHER_BEAM3, true); + break; + case EVENT_SCENE_15: + me->RemoveAurasDueToSpell(SPELL_FLOATING_DROWNED); + me->RemoveAurasDueToSpell(SPELL_KEAL_STUNNED); + me->CastSpell(me, SPELL_KAEL_FULL_POWER, false); + me->CastSpell(me, 36709, true); + me->CastSpell(me, 36201, true); + me->CastSpell(me, 36290, true); + me->CastSpell(me, 36291, true); + me->SetUnitMovementFlags(MOVEMENTFLAG_DISABLE_GRAVITY | MOVEMENTFLAG_WALKING); + me->SendMovementFlagUpdate(); + break; + case EVENT_SCENE_16: + summons.DespawnEntry(WORLD_TRIGGER); + me->RemoveAurasDueToSpell(52241); // WRONG VISUAL, ZOMG! + me->GetMotionMaster()->MovePoint(POINT_START_LAST_PHASE, me->GetHomePosition(), false, true); + break; } - void SetRoomState(GOState state) + if (!events2.Empty()) + return; + + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) { - if (GameObject* window = ObjectAccessor::GetGameObject(*me, instance->GetData64(GO_BRIDGE_WINDOW))) - window->SetGoState(state); - if (GameObject* window = ObjectAccessor::GetGameObject(*me, instance->GetData64(GO_KAEL_STATUE_RIGHT))) - window->SetGoState(state); - if (GameObject* window = ObjectAccessor::GetGameObject(*me, instance->GetData64(GO_KAEL_STATUE_LEFT))) - window->SetGoState(state); - } - - void Reset() - { - BossAI::Reset(); - events2.Reset(); - events2.ScheduleEvent(EVENT_GATHER_ADVISORS, 1000); - phase = PHASE_NONE; - - me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_HOVER, true); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_DISABLE_MOVE); - SetRoomState(GO_STATE_READY); - me->SetDisableGravity(false); - me->SetWalk(false); - } - - void AttackStart(Unit* who) - { - if (phase == PHASE_FINAL && events.GetNextEventTime(EVENT_GRAVITY_LAPSE_END) == 0) - BossAI::AttackStart(who); - } - - void MoveInLineOfSight(Unit* who) - { - if (phase == PHASE_NONE && who->GetTypeId() == TYPEID_PLAYER && me->IsValidAttackTarget(who)) - { - phase = PHASE_SINGLE_ADVISOR; - me->SetInCombatWithZone(); - Talk(SAY_INTRO); - events2.ScheduleEvent(EVENT_PREFIGHT_PHASE11, 23000); - events2.ScheduleEvent(EVENT_PREFIGHT_PHASE12, 30000); - } - } - - void EnterCombat(Unit* who) - { - BossAI::EnterCombat(who); - } - - void KilledUnit(Unit* victim) - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_SLAY); - } - - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - if (summon->GetEntry() == NPC_NETHER_VAPOR) - summon->GetMotionMaster()->MoveRandom(20.0f); - } - - void SummonedCreatureDies(Creature* summon, Unit*) - { - if (phase == PHASE_FINAL) - return; - - if (summon->GetDBTableGUIDLow() && phase == PHASE_ALL_ADVISORS) - { - for (SummonList::const_iterator i = summons.begin(); i != summons.end(); ++i) - if (Creature* summon = ObjectAccessor::GetCreature(*me, *i)) - if (summon->GetDBTableGUIDLow() && summon->IsAlive()) - return; - - events2.ScheduleEvent(EVENT_PREFIGHT_PHASE71, 2000); - return; - } - - if (summon->GetEntry() == NPC_THALADRED) - { - events2.ScheduleEvent(EVENT_PREFIGHT_PHASE21, 2000); - events2.ScheduleEvent(EVENT_PREFIGHT_PHASE22, 14500); - } - else if (summon->GetEntry() == NPC_LORD_SANGUINAR) - { - events2.ScheduleEvent(EVENT_PREFIGHT_PHASE31, 2000); - events2.ScheduleEvent(EVENT_PREFIGHT_PHASE32, 9000); - } - else if (summon->GetEntry() == NPC_CAPERNIAN) - { - events2.ScheduleEvent(EVENT_PREFIGHT_PHASE41, 2000); - events2.ScheduleEvent(EVENT_PREFIGHT_PHASE42, 10400); - } - else if (summon->GetEntry() == NPC_TELONICUS) - { - events2.ScheduleEvent(EVENT_PREFIGHT_PHASE51, 3000); - events2.ScheduleEvent(EVENT_PREFIGHT_PHASE52, 9000); - } - } - - void JustDied(Unit* killer) - { - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); - - Talk(SAY_DEATH); - BossAI::JustDied(killer); - } - - void MovementInform(uint32 type, uint32 point) - { - if (type != POINT_MOTION_TYPE) - return; - - if (point == POINT_MIDDLE) - { - events2.ScheduleEvent(EVENT_SCENE_1, 0); - events2.ScheduleEvent(EVENT_SCENE_2, 2500); - events2.ScheduleEvent(EVENT_SCENE_3, 4000); - events2.ScheduleEvent(EVENT_SCENE_4, 7000); - events2.ScheduleEvent(EVENT_SCENE_5, 10000); - events2.ScheduleEvent(EVENT_SCENE_6, 14000); - events2.ScheduleEvent(EVENT_SCENE_7, 17500); - events2.ScheduleEvent(EVENT_SCENE_8, 19000); - events2.ScheduleEvent(EVENT_SCENE_9, 22000); // two first lightnings + aura - events2.ScheduleEvent(EVENT_SCENE_10, 22800); // two - events2.ScheduleEvent(EVENT_SCENE_11, 23600); // two - events2.ScheduleEvent(EVENT_SCENE_12, 24500); // two - events2.ScheduleEvent(EVENT_SCENE_13, 24800); // two - events2.ScheduleEvent(EVENT_SCENE_14, 25300); // two - events2.ScheduleEvent(EVENT_SCENE_15, 32000); // full power - events2.ScheduleEvent(EVENT_SCENE_16, 36000); // remove lightnings + aura, move down - } - else if (point == POINT_START_LAST_PHASE) - { - me->SetDisableGravity(false); - me->SetWalk(false); - me->RemoveAurasDueToSpell(SPELL_KAEL_FULL_POWER); - me->SetReactState(REACT_AGGRESSIVE); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_NON_ATTACKABLE); - events.SetTimer(60000); - events.ScheduleEvent(EVENT_SPELL_FIREBALL, 0); - events.ScheduleEvent(EVENT_SPELL_FLAMESTRIKE, 10000); - events.ScheduleEvent(EVENT_SPELL_SUMMON_PHOENIX, 20000); - events.ScheduleEvent(EVENT_SPELL_GRAVITY_LAPSE, 5000); - if (me->GetVictim()) + case EVENT_SPELL_SEQ_1: + events.ScheduleEvent(EVENT_SPELL_MIND_CONTROL, 0); + events.ScheduleEvent(EVENT_SPELL_ARCANE_DISRUPTION, 3000); + events.ScheduleEvent(EVENT_SPELL_SEQ_1, 50000); + break; + case EVENT_SPELL_SEQ_2: + events.ScheduleEvent(EVENT_SPELL_MIND_CONTROL, 3000); + events.ScheduleEvent(EVENT_SPELL_ARCANE_DISRUPTION, 6000); + events.ScheduleEvent(EVENT_SPELL_SEQ_2, 50000); + break; + case EVENT_SPELL_SEQ_3: + Talk(SAY_PYROBLAST); + me->CastSpell(me, SPELL_SHOCK_BARRIER, false); + events.ScheduleEvent(EVENT_SPELL_SEQ_3, 50000); + events.DelayEvents(10000); + events.ScheduleEvent(EVENT_SPELL_PYROBLAST, 0); + events.ScheduleEvent(EVENT_SPELL_PYROBLAST, 4000); + events.ScheduleEvent(EVENT_SPELL_PYROBLAST, 8000); + break; + case EVENT_SPELL_SHOCK_BARRIER: + me->CastSpell(me, SPELL_SHOCK_BARRIER, false); + break; + case EVENT_SPELL_FIREBALL: + me->CastSpell(me->GetVictim(), SPELL_FIREBALL, false); + events.ScheduleEvent(EVENT_SPELL_FIREBALL, roll_chance_i(70) ? 2000 : 4000); + break; + case EVENT_SPELL_PYROBLAST: + me->CastSpell(me->GetVictim(), SPELL_PYROBLAST, false); + break; + case EVENT_SPELL_FLAMESTRIKE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) + me->CastSpell(target, SPELL_FLAME_STRIKE, false); + events.ScheduleEvent(EVENT_SPELL_FLAMESTRIKE, 20000); + break; + case EVENT_SPELL_ARCANE_DISRUPTION: + me->CastSpell(me, SPELL_ARCANE_DISRUPTION, false); + break; + case EVENT_SPELL_MIND_CONTROL: + if (roll_chance_i(50)) + Talk(SAY_MINDCONTROL); + me->CastCustomSpell(SPELL_MIND_CONTROL, SPELLVALUE_MAX_TARGETS, 3, me, false); + break; + case EVENT_SPELL_SUMMON_PHOENIX: + Talk(SAY_SUMMON_PHOENIX); + me->CastSpell(me, SPELL_PHOENIX, false); + events.ScheduleEvent(EVENT_SPELL_SUMMON_PHOENIX, 40000); + break; + case EVENT_CHECK_HEALTH: + if (me->HealthBelowPct(51)) { - me->SetTarget(me->GetVictim()->GetGUID()); - AttackStart(me->GetVictim()); - } - } - } - - void UpdateAI(uint32 diff) - { - if (EnterEvadeIfOutOfCombatArea()) - return; - - events2.Update(diff); - switch (events2.ExecuteEvent()) - { - case EVENT_GATHER_ADVISORS: - PrepareAdvisors(); - break; - case EVENT_PREFIGHT_PHASE11: - Talk(SAY_INTRO_THALADRED); - break; - case EVENT_PREFIGHT_PHASE12: - if (Creature* advisor = summons.GetCreatureWithEntry(NPC_THALADRED)) - { - advisor->SetReactState(REACT_AGGRESSIVE); - advisor->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - advisor->AI()->AttackStart(target); - advisor->SetInCombatWithZone(); - advisor->AI()->Talk(SAY_THALADRED_AGGRO); - } - break; - case EVENT_PREFIGHT_PHASE21: - Talk(SAY_INTRO_SANGUINAR); - break; - case EVENT_PREFIGHT_PHASE22: - if (Creature* advisor = summons.GetCreatureWithEntry(NPC_LORD_SANGUINAR)) - { - advisor->SetReactState(REACT_AGGRESSIVE); - advisor->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - advisor->AI()->AttackStart(target); - advisor->SetInCombatWithZone(); - advisor->AI()->Talk(SAY_SANGUINAR_AGGRO); - } - break; - case EVENT_PREFIGHT_PHASE31: - Talk(SAY_INTRO_CAPERNIAN); - break; - case EVENT_PREFIGHT_PHASE32: - if (Creature* advisor = summons.GetCreatureWithEntry(NPC_CAPERNIAN)) - { - advisor->SetReactState(REACT_AGGRESSIVE); - advisor->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - advisor->AI()->AttackStart(target); - advisor->SetInCombatWithZone(); - advisor->AI()->Talk(SAY_CAPERNIAN_AGGRO); - } - break; - case EVENT_PREFIGHT_PHASE41: - Talk(SAY_INTRO_TELONICUS); - break; - case EVENT_PREFIGHT_PHASE42: - if (Creature* advisor = summons.GetCreatureWithEntry(NPC_TELONICUS)) - { - advisor->SetReactState(REACT_AGGRESSIVE); - advisor->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - advisor->AI()->AttackStart(target); - advisor->SetInCombatWithZone(); - advisor->AI()->Talk(SAY_TELONICUS_AGGRO); - } - break; - case EVENT_PREFIGHT_PHASE51: - Talk(SAY_PHASE2_WEAPON); - me->CastSpell(me, SPELL_SUMMON_WEAPONS, false); - phase = PHASE_WEAPONS; - break; - case EVENT_PREFIGHT_PHASE52: - for (SummonList::const_iterator i = summons.begin(); i != summons.end(); ++i) - { - if (Creature* summon = ObjectAccessor::GetCreature(*me, *i)) - if (!summon->GetDBTableGUIDLow()) - { - summon->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_NON_ATTACKABLE); - summon->SetInCombatWithZone(); - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - summon->AI()->AttackStart(target); - } - } - events2.ScheduleEvent(EVENT_PREFIGHT_PHASE61, 2*MINUTE*IN_MILLISECONDS); - events2.ScheduleEvent(EVENT_PREFIGHT_PHASE62, 2*MINUTE*IN_MILLISECONDS+6000); - events2.ScheduleEvent(EVENT_PREFIGHT_PHASE63, 2*MINUTE*IN_MILLISECONDS+12000); - break; - case EVENT_PREFIGHT_PHASE61: - phase = PHASE_ALL_ADVISORS; - Talk(SAY_PHASE3_ADVANCE); - break; - case EVENT_PREFIGHT_PHASE62: - me->CastSpell(me, SPELL_RESURRECTION, false); - break; - case EVENT_PREFIGHT_PHASE63: - for (SummonList::const_iterator i = summons.begin(); i != summons.end(); ++i) - if (Creature* summon = ObjectAccessor::GetCreature(*me, *i)) - if (summon->GetDBTableGUIDLow()) - { - summon->SetReactState(REACT_AGGRESSIVE); - summon->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - summon->SetInCombatWithZone(); - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - summon->AI()->AttackStart(target); - } - events2.ScheduleEvent(EVENT_PREFIGHT_PHASE71, 3*MINUTE*IN_MILLISECONDS); - break; - case EVENT_PREFIGHT_PHASE71: - events2.CancelEvent(EVENT_PREFIGHT_PHASE71); - Talk(SAY_PHASE4_INTRO2); - phase = PHASE_FINAL; - DoResetThreat(); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_DISABLE_MOVE); - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - AttackStart(target); - - events2.Reset(); events.Reset(); - events.ScheduleEvent(EVENT_SPELL_FIREBALL, 1000); - events.ScheduleEvent(EVENT_SPELL_FLAMESTRIKE, 15000); - events.ScheduleEvent(EVENT_SPELL_SUMMON_PHOENIX, 30000); - events.ScheduleEvent(EVENT_SPELL_SEQ_1, 20000); - events.ScheduleEvent(EVENT_SPELL_SEQ_2, 40000); - events.ScheduleEvent(EVENT_SPELL_SEQ_3, 60000); - events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + me->SetReactState(REACT_PASSIVE); + me->GetMotionMaster()->MovePoint(POINT_MIDDLE, me->GetHomePosition(), true, true); + me->ClearUnitState(UNIT_STATE_MELEE_ATTACKING); + me->SendMeleeAttackStop(); break; - case EVENT_SCENE_1: - me->SetTarget(0); - me->SetFacingTo(M_PI); - me->SetWalk(true); - Talk(SAY_PHASE5_NUTS); - break; - case EVENT_SCENE_2: - me->SetTarget(0); - me->CastSpell(me, SPELL_KAEL_EXPLODES1, true); - me->CastSpell(me, SPELL_KAEL_GAINING_POWER, false); - me->SetDisableGravity(true); - break; - case EVENT_SCENE_3: - me->SetTarget(0); - for (uint8 i = 0; i < 2; ++i) - if (Creature* trigger = me->SummonCreature(WORLD_TRIGGER, triggersPos[i], TEMPSUMMON_TIMED_DESPAWN, 60000)) - trigger->CastSpell(me, SPELL_NETHERBEAM1+i, false); - me->GetMotionMaster()->MovePoint(POINT_AIR, me->GetPositionX(), me->GetPositionY(), 76.0f, false, true); - me->CastSpell(me, SPELL_GROW, true); - break; - case EVENT_SCENE_4: - me->SetTarget(0); - me->CastSpell(me, SPELL_GROW, true); - me->CastSpell(me, SPELL_KAEL_EXPLODES2, true); - me->CastSpell(me, SPELL_NETHERBEAM_AURA1, true); - for (uint8 i = 0; i < 2; ++i) - if (Creature* trigger = me->SummonCreature(WORLD_TRIGGER, triggersPos[i+2], TEMPSUMMON_TIMED_DESPAWN, 60000)) - trigger->CastSpell(me, SPELL_NETHERBEAM1+i, false); - break; - case EVENT_SCENE_5: - me->SetTarget(0); - me->CastSpell(me, SPELL_GROW, true); - me->CastSpell(me, SPELL_KAEL_EXPLODES3, true); - me->CastSpell(me, SPELL_NETHERBEAM_AURA2, true); - for (uint8 i = 0; i < 2; ++i) - if (Creature* trigger = me->SummonCreature(WORLD_TRIGGER, triggersPos[i+4], TEMPSUMMON_TIMED_DESPAWN, 60000)) - trigger->CastSpell(me, SPELL_NETHERBEAM1+i, false); - break; - case EVENT_SCENE_6: - me->CastSpell(me, SPELL_GROW, true); - me->CastSpell(me, SPELL_KAEL_EXPLODES4, true); - me->CastSpell(me, SPELL_NETHERBEAM_AURA3, true); - break; - case EVENT_SCENE_7: - SetRoomState(GO_STATE_ACTIVE); - me->SetUnitMovementFlags(MOVEMENTFLAG_HOVER|MOVEMENTFLAG_WALKING|MOVEMENTFLAG_DISABLE_GRAVITY); - me->SendMovementFlagUpdate(); - break; - case EVENT_SCENE_8: - summons.DespawnEntry(WORLD_TRIGGER); - me->RemoveAurasDueToSpell(SPELL_NETHERBEAM_AURA1); - me->RemoveAurasDueToSpell(SPELL_NETHERBEAM_AURA2); - me->RemoveAurasDueToSpell(SPELL_NETHERBEAM_AURA3); - me->CastSpell(me, SPELL_KAEL_EXPLODES5, true); - me->CastSpell(me, SPELL_FLOATING_DROWNED, false); - //me->CastSpell(me, SPELL_KEAL_STUNNED, true); - break; - case EVENT_SCENE_9: - me->CastSpell(me, 52241, true); // WRONG VISUAL, ZOMG! - me->CastSpell(me, 34807, true); - me->SummonCreature(NPC_WORLD_TRIGGER, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+15.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 60000); - if (Creature* trigger = me->SummonCreature(WORLD_TRIGGER, me->GetPositionX()+5, me->GetPositionY(), me->GetPositionZ()+15.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 60000)) - trigger->CastSpell(me, SPELL_PURE_NETHER_BEAM1, true); - if (Creature* trigger = me->SummonCreature(WORLD_TRIGGER, me->GetPositionX()-5, me->GetPositionY(), me->GetPositionZ()+15.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 60000)) - trigger->CastSpell(me, SPELL_PURE_NETHER_BEAM2, true); - break; - case EVENT_SCENE_10: - if (Creature* trigger = me->SummonCreature(WORLD_TRIGGER, me->GetPositionX()-5, me->GetPositionY()-5, me->GetPositionZ()+15.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 60000)) - trigger->CastSpell(me, SPELL_PURE_NETHER_BEAM3, true); - if (Creature* trigger = me->SummonCreature(WORLD_TRIGGER, me->GetPositionX()+5, me->GetPositionY()+5, me->GetPositionZ()+15.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 60000)) - trigger->CastSpell(me, SPELL_PURE_NETHER_BEAM1, true); - break; - case EVENT_SCENE_11: - if (Creature* trigger = me->SummonCreature(WORLD_TRIGGER, me->GetPositionX(), me->GetPositionY()+5, me->GetPositionZ()+15.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 60000)) - trigger->CastSpell(me, SPELL_PURE_NETHER_BEAM2, true); - break; - case EVENT_SCENE_12: - if (Creature* trigger = me->SummonCreature(WORLD_TRIGGER, me->GetPositionX(), me->GetPositionY()-5, me->GetPositionZ()+15.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 60000)) - trigger->CastSpell(me, SPELL_PURE_NETHER_BEAM3, true); - if (Creature* trigger = me->SummonCreature(WORLD_TRIGGER, me->GetPositionX()+5, me->GetPositionY()-5, me->GetPositionZ()+15.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 60000)) - trigger->CastSpell(me, SPELL_PURE_NETHER_BEAM1, true); - break; - case EVENT_SCENE_13: - if (Creature* trigger = me->SummonCreature(WORLD_TRIGGER, me->GetPositionX()-5, me->GetPositionY()+5, me->GetPositionZ()+15.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 60000)) - trigger->CastSpell(me, SPELL_PURE_NETHER_BEAM2, true); - break; - case EVENT_SCENE_14: - //if (Creature* trigger = me->SummonCreature(WORLD_TRIGGER, me->GetPositionX()-5, me->GetPositionY()+5, me->GetPositionZ()+15.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 60000)) - // trigger->CastSpell(me, SPELL_PURE_NETHER_BEAM3, true); - break; - case EVENT_SCENE_15: - me->RemoveAurasDueToSpell(SPELL_FLOATING_DROWNED); - me->RemoveAurasDueToSpell(SPELL_KEAL_STUNNED); - me->CastSpell(me, SPELL_KAEL_FULL_POWER, false); - me->CastSpell(me, 36709, true); - me->CastSpell(me, 36201, true); - me->CastSpell(me, 36290, true); - me->CastSpell(me, 36291, true); - me->SetUnitMovementFlags(MOVEMENTFLAG_DISABLE_GRAVITY|MOVEMENTFLAG_WALKING); - me->SendMovementFlagUpdate(); - break; - case EVENT_SCENE_16: - summons.DespawnEntry(WORLD_TRIGGER); - me->RemoveAurasDueToSpell(52241); // WRONG VISUAL, ZOMG! - me->GetMotionMaster()->MovePoint(POINT_START_LAST_PHASE, me->GetHomePosition(), false, true); - break; - } - - if (!events2.Empty()) - return; - - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_SEQ_1: - events.ScheduleEvent(EVENT_SPELL_MIND_CONTROL, 0); - events.ScheduleEvent(EVENT_SPELL_ARCANE_DISRUPTION, 3000); - events.ScheduleEvent(EVENT_SPELL_SEQ_1, 50000); - break; - case EVENT_SPELL_SEQ_2: - events.ScheduleEvent(EVENT_SPELL_MIND_CONTROL, 3000); - events.ScheduleEvent(EVENT_SPELL_ARCANE_DISRUPTION, 6000); - events.ScheduleEvent(EVENT_SPELL_SEQ_2, 50000); - break; - case EVENT_SPELL_SEQ_3: - Talk(SAY_PYROBLAST); - me->CastSpell(me, SPELL_SHOCK_BARRIER, false); - events.ScheduleEvent(EVENT_SPELL_SEQ_3, 50000); - events.DelayEvents(10000); - events.ScheduleEvent(EVENT_SPELL_PYROBLAST, 0); - events.ScheduleEvent(EVENT_SPELL_PYROBLAST, 4000); - events.ScheduleEvent(EVENT_SPELL_PYROBLAST, 8000); - break; - case EVENT_SPELL_SHOCK_BARRIER: - me->CastSpell(me, SPELL_SHOCK_BARRIER, false); - break; - case EVENT_SPELL_FIREBALL: - me->CastSpell(me->GetVictim(), SPELL_FIREBALL, false); - events.ScheduleEvent(EVENT_SPELL_FIREBALL, roll_chance_i(70) ? 2000: 4000); - break; - case EVENT_SPELL_PYROBLAST: - me->CastSpell(me->GetVictim(), SPELL_PYROBLAST, false); - break; - case EVENT_SPELL_FLAMESTRIKE: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) - me->CastSpell(target, SPELL_FLAME_STRIKE, false); - events.ScheduleEvent(EVENT_SPELL_FLAMESTRIKE, 20000); - break; - case EVENT_SPELL_ARCANE_DISRUPTION: - me->CastSpell(me, SPELL_ARCANE_DISRUPTION, false); - break; - case EVENT_SPELL_MIND_CONTROL: - if (roll_chance_i(50)) - Talk(SAY_MINDCONTROL); - me->CastCustomSpell(SPELL_MIND_CONTROL, SPELLVALUE_MAX_TARGETS, 3, me, false); - break; - case EVENT_SPELL_SUMMON_PHOENIX: - Talk(SAY_SUMMON_PHOENIX); - me->CastSpell(me, SPELL_PHOENIX, false); - events.ScheduleEvent(EVENT_SPELL_SUMMON_PHOENIX, 40000); - break; - case EVENT_CHECK_HEALTH: - if (me->HealthBelowPct(51)) - { - events.Reset(); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - me->SetReactState(REACT_PASSIVE); - me->GetMotionMaster()->MovePoint(POINT_MIDDLE, me->GetHomePosition(), true, true); - me->ClearUnitState(UNIT_STATE_MELEE_ATTACKING); - me->SendMeleeAttackStop(); - break; - } - events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); - break; - case EVENT_SPELL_GRAVITY_LAPSE: - events.DelayEvents(30000); - me->setAttackTimer(BASE_ATTACK, 30000); - events.ScheduleEvent(EVENT_SPELL_GRAVITY_LAPSE, 90000); - events.ScheduleEvent(EVENT_GRAVITY_LAPSE_END, 32000); - events.ScheduleEvent(EVENT_SPELL_SHOCK_BARRIER, 20000); - events.ScheduleEvent(EVENT_SPELL_SHOCK_BARRIER, 10000); - events.ScheduleEvent(EVENT_SPELL_NETHER_BEAM, 4000); - events.ScheduleEvent(EVENT_SPELL_NETHER_VAPOR, 0); - me->CastSpell(me, SPELL_SHOCK_BARRIER, false); - me->CastSpell(me, SPELL_GRAVITY_LAPSE, false); - me->SetTarget(0); - me->GetMotionMaster()->Clear(); - me->StopMoving(); - Talk(SAY_GRAVITYLAPSE); - break; - case EVENT_SPELL_NETHER_VAPOR: - me->CastSpell(me, SPELL_SUMMON_NETHER_VAPOR, false); - break; - case EVENT_SPELL_NETHER_BEAM: - me->CastSpell(me, SPELL_NETHER_BEAM, false); - events.ScheduleEvent(EVENT_SPELL_NETHER_BEAM, 4000); - break; - case EVENT_GRAVITY_LAPSE_END: - summons.DespawnEntry(NPC_NETHER_VAPOR); - events.CancelEvent(EVENT_SPELL_NETHER_BEAM); - me->SetTarget(me->GetVictim()->GetGUID()); - me->GetMotionMaster()->MoveChase(me->GetVictim()); - break; - } - - DoMeleeAttackIfReady(); + } + events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); + break; + case EVENT_SPELL_GRAVITY_LAPSE: + events.DelayEvents(30000); + me->setAttackTimer(BASE_ATTACK, 30000); + events.ScheduleEvent(EVENT_SPELL_GRAVITY_LAPSE, 90000); + events.ScheduleEvent(EVENT_GRAVITY_LAPSE_END, 32000); + events.ScheduleEvent(EVENT_SPELL_SHOCK_BARRIER, 20000); + events.ScheduleEvent(EVENT_SPELL_SHOCK_BARRIER, 10000); + events.ScheduleEvent(EVENT_SPELL_NETHER_BEAM, 4000); + events.ScheduleEvent(EVENT_SPELL_NETHER_VAPOR, 0); + me->CastSpell(me, SPELL_SHOCK_BARRIER, false); + me->CastSpell(me, SPELL_GRAVITY_LAPSE, false); + me->SetTarget(0); + me->GetMotionMaster()->Clear(); + me->StopMoving(); + Talk(SAY_GRAVITYLAPSE); + break; + case EVENT_SPELL_NETHER_VAPOR: + me->CastSpell(me, SPELL_SUMMON_NETHER_VAPOR, false); + break; + case EVENT_SPELL_NETHER_BEAM: + me->CastSpell(me, SPELL_NETHER_BEAM, false); + events.ScheduleEvent(EVENT_SPELL_NETHER_BEAM, 4000); + break; + case EVENT_GRAVITY_LAPSE_END: + summons.DespawnEntry(NPC_NETHER_VAPOR); + events.CancelEvent(EVENT_SPELL_NETHER_BEAM); + me->SetTarget(me->GetVictim()->GetGUID()); + me->GetMotionMaster()->MoveChase(me->GetVictim()); + break; } - bool CheckEvadeIfOutOfCombatArea() const - { - return me->GetHomePosition().GetExactDist2d(me) > 165.0f || !SelectTargetFromPlayerList(165.0f); - } - - }; - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + DoMeleeAttackIfReady(); } + + bool CheckEvadeIfOutOfCombatArea() const + { + return me->GetHomePosition().GetExactDist2d(me) > 165.0f || !SelectTargetFromPlayerList(165.0f); + } + + }; + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; class spell_kaelthas_kael_phase_two : public SpellScriptLoader { - public: - spell_kaelthas_kael_phase_two() : SpellScriptLoader("spell_kaelthas_kael_phase_two") { } +public: + spell_kaelthas_kael_phase_two() : SpellScriptLoader("spell_kaelthas_kael_phase_two") { } - class spell_kaelthas_kael_phase_two_SpellScript : public SpellScript + class spell_kaelthas_kael_phase_two_SpellScript : public SpellScript + { + PrepareSpellScript(spell_kaelthas_kael_phase_two_SpellScript); + + bool Load() { - PrepareSpellScript(spell_kaelthas_kael_phase_two_SpellScript); - - bool Load() - { - if (GetCaster()->GetTypeId() == TYPEID_UNIT) - if (InstanceScript* instance = GetCaster()->GetInstanceScript()) - if (Creature* kael = ObjectAccessor::GetCreature(*GetCaster(), instance->GetData64(NPC_KAELTHAS))) - kael->AI()->SummonedCreatureDies(GetCaster()->ToCreature(), nullptr); - return true; - } - - void Register() - { - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_kaelthas_kael_phase_two_SpellScript(); + if (GetCaster()->GetTypeId() == TYPEID_UNIT) + if (InstanceScript* instance = GetCaster()->GetInstanceScript()) + if (Creature* kael = ObjectAccessor::GetCreature(*GetCaster(), instance->GetData64(NPC_KAELTHAS))) + kael->AI()->SummonedCreatureDies(GetCaster()->ToCreature(), nullptr); + return true; } + + void Register() + { + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_kaelthas_kael_phase_two_SpellScript(); + } }; class spell_kaelthas_remote_toy : public SpellScriptLoader { - public: - spell_kaelthas_remote_toy() : SpellScriptLoader("spell_kaelthas_remote_toy") { } +public: + spell_kaelthas_remote_toy() : SpellScriptLoader("spell_kaelthas_remote_toy") { } - class spell_kaelthas_remote_toy_AuraScript : public AuraScript + class spell_kaelthas_remote_toy_AuraScript : public AuraScript + { + PrepareAuraScript(spell_kaelthas_remote_toy_AuraScript); + + void HandlePeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_kaelthas_remote_toy_AuraScript); - - void HandlePeriodic(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - if (roll_chance_i(66)) - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_REMOTE_TOY_STUN, true); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_kaelthas_remote_toy_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_kaelthas_remote_toy_AuraScript(); + PreventDefaultAction(); + if (roll_chance_i(66)) + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_REMOTE_TOY_STUN, true); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_kaelthas_remote_toy_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_kaelthas_remote_toy_AuraScript(); + } }; class spell_kaelthas_summon_weapons : public SpellScriptLoader { - public: - spell_kaelthas_summon_weapons() : SpellScriptLoader("spell_kaelthas_summon_weapons") { } +public: + spell_kaelthas_summon_weapons() : SpellScriptLoader("spell_kaelthas_summon_weapons") { } - class spell_kaelthas_summon_weapons_SpellScript : public SpellScript + class spell_kaelthas_summon_weapons_SpellScript : public SpellScript + { + PrepareSpellScript(spell_kaelthas_summon_weapons_SpellScript); + + void HandleScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_kaelthas_summon_weapons_SpellScript); - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitEffect(effIndex); - for (uint32 i = SPELL_SUMMON_WEAPONA; i <= SPELL_SUMMON_WEAPONG; ++i) - GetCaster()->CastSpell(GetCaster(), i, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_kaelthas_summon_weapons_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_kaelthas_summon_weapons_SpellScript(); + PreventHitEffect(effIndex); + for (uint32 i = SPELL_SUMMON_WEAPONA; i <= SPELL_SUMMON_WEAPONG; ++i) + GetCaster()->CastSpell(GetCaster(), i, true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_kaelthas_summon_weapons_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_kaelthas_summon_weapons_SpellScript(); + } }; class spell_kaelthas_resurrection : public SpellScriptLoader { - public: - spell_kaelthas_resurrection() : SpellScriptLoader("spell_kaelthas_resurrection") { } +public: + spell_kaelthas_resurrection() : SpellScriptLoader("spell_kaelthas_resurrection") { } - class spell_kaelthas_resurrection_SpellScript : public SpellScript + class spell_kaelthas_resurrection_SpellScript : public SpellScript + { + PrepareSpellScript(spell_kaelthas_resurrection_SpellScript); + + void HandleBeforeCast() { - PrepareSpellScript(spell_kaelthas_resurrection_SpellScript); - - void HandleBeforeCast() - { - GetCaster()->GetAI()->SetData(DATA_RESURRECT_CAST, DATA_RESURRECT_CAST); - } - - void Register() - { - BeforeCast += SpellCastFn(spell_kaelthas_resurrection_SpellScript::HandleBeforeCast); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_kaelthas_resurrection_SpellScript(); + GetCaster()->GetAI()->SetData(DATA_RESURRECT_CAST, DATA_RESURRECT_CAST); } + + void Register() + { + BeforeCast += SpellCastFn(spell_kaelthas_resurrection_SpellScript::HandleBeforeCast); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_kaelthas_resurrection_SpellScript(); + } }; class spell_kaelthas_mind_control : public SpellScriptLoader { - public: - spell_kaelthas_mind_control() : SpellScriptLoader("spell_kaelthas_mind_control") { } +public: + spell_kaelthas_mind_control() : SpellScriptLoader("spell_kaelthas_mind_control") { } - class spell_kaelthas_mind_control_SpellScript : public SpellScript + class spell_kaelthas_mind_control_SpellScript : public SpellScript + { + PrepareSpellScript(spell_kaelthas_mind_control_SpellScript); + + void SelectTarget(std::list& targets) { - PrepareSpellScript(spell_kaelthas_mind_control_SpellScript); - - void SelectTarget(std::list& targets) - { - if (Unit* victim = GetCaster()->GetVictim()) - targets.remove_if(acore::ObjectGUIDCheck(victim->GetGUID(), true)); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_kaelthas_mind_control_SpellScript::SelectTarget, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_kaelthas_mind_control_SpellScript(); + if (Unit* victim = GetCaster()->GetVictim()) + targets.remove_if(acore::ObjectGUIDCheck(victim->GetGUID(), true)); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_kaelthas_mind_control_SpellScript::SelectTarget, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_kaelthas_mind_control_SpellScript(); + } }; class spell_kaelthas_burn : public SpellScriptLoader { - public: - spell_kaelthas_burn() : SpellScriptLoader("spell_kaelthas_burn") { } +public: + spell_kaelthas_burn() : SpellScriptLoader("spell_kaelthas_burn") { } - class spell_kaelthas_burn_AuraScript : public AuraScript + class spell_kaelthas_burn_AuraScript : public AuraScript + { + PrepareAuraScript(spell_kaelthas_burn_AuraScript); + + void HandlePeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_kaelthas_burn_AuraScript); - - void HandlePeriodic(AuraEffect const* /*aurEff*/) - { - Unit::DealDamage(GetUnitOwner(), GetUnitOwner(), GetUnitOwner()->CountPctFromMaxHealth(5)+1); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_kaelthas_burn_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_kaelthas_burn_AuraScript(); + Unit::DealDamage(GetUnitOwner(), GetUnitOwner(), GetUnitOwner()->CountPctFromMaxHealth(5) + 1); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_kaelthas_burn_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_kaelthas_burn_AuraScript(); + } }; class spell_kaelthas_flame_strike : public SpellScriptLoader { - public: - spell_kaelthas_flame_strike() : SpellScriptLoader("spell_kaelthas_flame_strike") { } +public: + spell_kaelthas_flame_strike() : SpellScriptLoader("spell_kaelthas_flame_strike") { } - class spell_kaelthas_flame_strike_AuraScript : public AuraScript + class spell_kaelthas_flame_strike_AuraScript : public AuraScript + { + PrepareAuraScript(spell_kaelthas_flame_strike_AuraScript); + + bool Load() { - PrepareAuraScript(spell_kaelthas_flame_strike_AuraScript); - - bool Load() - { - return GetUnitOwner()->GetTypeId() == TYPEID_UNIT; - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetUnitOwner()->RemoveAllAuras(); - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_FLAME_STRIKE_DAMAGE, true); - GetUnitOwner()->ToCreature()->DespawnOrUnsummon(2000); - } - - void Register() - { - OnEffectRemove += AuraEffectRemoveFn(spell_kaelthas_flame_strike_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_kaelthas_flame_strike_AuraScript(); + return GetUnitOwner()->GetTypeId() == TYPEID_UNIT; } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetUnitOwner()->RemoveAllAuras(); + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_FLAME_STRIKE_DAMAGE, true); + GetUnitOwner()->ToCreature()->DespawnOrUnsummon(2000); + } + + void Register() + { + OnEffectRemove += AuraEffectRemoveFn(spell_kaelthas_flame_strike_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_kaelthas_flame_strike_AuraScript(); + } }; class lapseTeleport : public BasicEvent { - public: - lapseTeleport(Player* owner) : _owner(owner) - { - } +public: + lapseTeleport(Player* owner) : _owner(owner) + { + } - bool Execute(uint64 /*execTime*/, uint32 /*diff*/) + bool Execute(uint64 /*execTime*/, uint32 /*diff*/) + { + if (_owner->IsBeingTeleportedNear()) + _owner->m_Events.AddEvent(new lapseTeleport(_owner), _owner->m_Events.CalculateTime(1)); + else if (!_owner->IsBeingTeleported()) { - if (_owner->IsBeingTeleportedNear()) - _owner->m_Events.AddEvent(new lapseTeleport(_owner), _owner->m_Events.CalculateTime(1)); - else if (!_owner->IsBeingTeleported()) - { - _owner->CastSpell(_owner, SPELL_GRAVITY_LAPSE_KNOCKBACK, true); - _owner->CastSpell(_owner, SPELL_GRAVITY_LAPSE_AURA, true); - } - return true; + _owner->CastSpell(_owner, SPELL_GRAVITY_LAPSE_KNOCKBACK, true); + _owner->CastSpell(_owner, SPELL_GRAVITY_LAPSE_AURA, true); } + return true; + } - private: - Player* _owner; +private: + Player* _owner; }; class spell_kaelthas_gravity_lapse : public SpellScriptLoader { - public: - spell_kaelthas_gravity_lapse() : SpellScriptLoader("spell_kaelthas_gravity_lapse") { } +public: + spell_kaelthas_gravity_lapse() : SpellScriptLoader("spell_kaelthas_gravity_lapse") { } - class spell_kaelthas_gravity_lapse_SpellScript : public SpellScript + class spell_kaelthas_gravity_lapse_SpellScript : public SpellScript + { + PrepareSpellScript(spell_kaelthas_gravity_lapse_SpellScript); + + bool Load() { - PrepareSpellScript(spell_kaelthas_gravity_lapse_SpellScript); - - bool Load() - { - _currentSpellId = SPELL_GRAVITY_LAPSE_TELEPORT1; - return true; - } - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitEffect(effIndex); - if (_currentSpellId < SPELL_GRAVITY_LAPSE_TELEPORT1+25) - if (Player* target = GetHitPlayer()) - { - GetCaster()->CastSpell(target, _currentSpellId++, true); - target->m_Events.AddEvent(new lapseTeleport(target), target->m_Events.CalculateTime(1)); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_kaelthas_gravity_lapse_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - - private: - uint32 _currentSpellId; - }; - - SpellScript* GetSpellScript() const - { - return new spell_kaelthas_gravity_lapse_SpellScript(); + _currentSpellId = SPELL_GRAVITY_LAPSE_TELEPORT1; + return true; } + + void HandleScriptEffect(SpellEffIndex effIndex) + { + PreventHitEffect(effIndex); + if (_currentSpellId < SPELL_GRAVITY_LAPSE_TELEPORT1 + 25) + if (Player* target = GetHitPlayer()) + { + GetCaster()->CastSpell(target, _currentSpellId++, true); + target->m_Events.AddEvent(new lapseTeleport(target), target->m_Events.CalculateTime(1)); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_kaelthas_gravity_lapse_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + + private: + uint32 _currentSpellId; + }; + + SpellScript* GetSpellScript() const + { + return new spell_kaelthas_gravity_lapse_SpellScript(); + } }; class spell_kaelthas_nether_beam : public SpellScriptLoader { - public: - spell_kaelthas_nether_beam() : SpellScriptLoader("spell_kaelthas_nether_beam") { } +public: + spell_kaelthas_nether_beam() : SpellScriptLoader("spell_kaelthas_nether_beam") { } - class spell_kaelthas_nether_beam_SpellScript : public SpellScript + class spell_kaelthas_nether_beam_SpellScript : public SpellScript + { + PrepareSpellScript(spell_kaelthas_nether_beam_SpellScript); + + void HandleScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_kaelthas_nether_beam_SpellScript); + PreventHitEffect(effIndex); - void HandleScriptEffect(SpellEffIndex effIndex) + ThreatContainer::StorageType const& ThreatList = GetCaster()-> getThreatManager().getThreatList(); + std::list targetList; + for (ThreatContainer::StorageType::const_iterator itr = ThreatList.begin(); itr != ThreatList.end(); ++itr) { - PreventHitEffect(effIndex); - - ThreatContainer::StorageType const & ThreatList = GetCaster()-> getThreatManager().getThreatList(); - std::list targetList; - for (ThreatContainer::StorageType::const_iterator itr = ThreatList.begin(); itr != ThreatList.end(); ++itr) - { - Unit* target = ObjectAccessor::GetUnit(*GetCaster(), (*itr)->getUnitGuid()); - if (target && target->GetTypeId() == TYPEID_PLAYER) - targetList.push_back(target); - } - - acore::Containers::RandomResizeList(targetList, 5); - for (std::list::const_iterator itr = targetList.begin(); itr != targetList.end(); ++itr) - GetCaster()->CastSpell(*itr, SPELL_NETHER_BEAM_DAMAGE, true); + Unit* target = ObjectAccessor::GetUnit(*GetCaster(), (*itr)->getUnitGuid()); + if (target && target->GetTypeId() == TYPEID_PLAYER) + targetList.push_back(target); } - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_kaelthas_nether_beam_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_kaelthas_nether_beam_SpellScript(); + acore::Containers::RandomResizeList(targetList, 5); + for (std::list::const_iterator itr = targetList.begin(); itr != targetList.end(); ++itr) + GetCaster()->CastSpell(*itr, SPELL_NETHER_BEAM_DAMAGE, true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_kaelthas_nether_beam_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_kaelthas_nether_beam_SpellScript(); + } }; class spell_kaelthas_summon_nether_vapor : public SpellScriptLoader { - public: - spell_kaelthas_summon_nether_vapor() : SpellScriptLoader("spell_kaelthas_summon_nether_vapor") { } +public: + spell_kaelthas_summon_nether_vapor() : SpellScriptLoader("spell_kaelthas_summon_nether_vapor") { } - class spell_kaelthas_summon_nether_vapor_SpellScript : public SpellScript + class spell_kaelthas_summon_nether_vapor_SpellScript : public SpellScript + { + PrepareSpellScript(spell_kaelthas_summon_nether_vapor_SpellScript); + + void HandleScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_kaelthas_summon_nether_vapor_SpellScript); - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitEffect(effIndex); - for (uint32 i = 0; i < 5; ++i) - GetCaster()->SummonCreature(NPC_NETHER_VAPOR, GetCaster()->GetPositionX()+6*cos(i/5.0f*2*M_PI), GetCaster()->GetPositionY()+6*sin(i/5.0f*2*M_PI), GetCaster()->GetPositionZ()+7.0f+i, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 30000); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_kaelthas_summon_nether_vapor_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_kaelthas_summon_nether_vapor_SpellScript(); + PreventHitEffect(effIndex); + for (uint32 i = 0; i < 5; ++i) + GetCaster()->SummonCreature(NPC_NETHER_VAPOR, GetCaster()->GetPositionX() + 6 * cos(i / 5.0f * 2 * M_PI), GetCaster()->GetPositionY() + 6 * sin(i / 5.0f * 2 * M_PI), GetCaster()->GetPositionZ() + 7.0f + i, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 30000); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_kaelthas_summon_nether_vapor_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_kaelthas_summon_nether_vapor_SpellScript(); + } }; void AddSC_boss_kaelthas() 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 43e806e3d..4d015c156 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp @@ -26,96 +26,96 @@ enum voidReaver class boss_void_reaver : public CreatureScript { - public: +public: - boss_void_reaver() : CreatureScript("boss_void_reaver") { } + boss_void_reaver() : CreatureScript("boss_void_reaver") { } - struct boss_void_reaverAI : public BossAI + struct boss_void_reaverAI : public BossAI + { + boss_void_reaverAI(Creature* creature) : BossAI(creature, DATA_REAVER) { - boss_void_reaverAI(Creature* creature) : BossAI(creature, DATA_REAVER) - { - me->ApplySpellImmune(0, IMMUNITY_DISPEL, DISPEL_POISON, true); - me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_HEALTH_LEECH, true); - me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_POWER_DRAIN, true); - me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_PERIODIC_LEECH, true); - me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_PERIODIC_MANA_LEECH, true); - } - - void Reset() - { - BossAI::Reset(); - } - - void KilledUnit(Unit* victim) - { - if (victim->GetTypeId() == TYPEID_PLAYER && roll_chance_i(50)) - Talk(SAY_SLAY); - } - - void JustDied(Unit* killer) - { - Talk(SAY_DEATH); - BossAI::JustDied(killer); - } - - void EnterCombat(Unit* who) - { - Talk(SAY_AGGRO); - BossAI::EnterCombat(who); - - events.ScheduleEvent(EVENT_SPELL_POUNDING, 15000); - events.ScheduleEvent(EVENT_SPELL_ARCANEORB, 3000); - events.ScheduleEvent(EVENT_SPELL_KNOCK_AWAY, 30000); - events.ScheduleEvent(EVENT_SPELL_BERSERK, 600000); - me->CallForHelp(105.0f); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_BERSERK: - me->CastSpell(me, SPELL_BERSERK, true); - break; - case EVENT_SPELL_POUNDING: - Talk(SAY_POUNDING); - me->CastSpell(me, SPELL_POUNDING, false); - events.ScheduleEvent(EVENT_SPELL_POUNDING, 15000); - break; - case EVENT_SPELL_ARCANEORB: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, -18.0f, true)) - me->CastSpell(target, SPELL_ARCANE_ORB, false); - else if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 20.0f, true)) - me->CastSpell(target, SPELL_ARCANE_ORB, false); - events.ScheduleEvent(EVENT_SPELL_ARCANEORB, 4000); - break; - case EVENT_SPELL_KNOCK_AWAY: - me->CastSpell(me->GetVictim(), SPELL_KNOCK_AWAY, false); - events.ScheduleEvent(EVENT_SPELL_POUNDING, 25000); - break; - } - - DoMeleeAttackIfReady(); - EnterEvadeIfOutOfCombatArea(); - } - - bool CheckEvadeIfOutOfCombatArea() const - { - return me->GetDistance2d(432.59f, 371.93f) > 105.0f; - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return GetInstanceAI(creature); + me->ApplySpellImmune(0, IMMUNITY_DISPEL, DISPEL_POISON, true); + me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_HEALTH_LEECH, true); + me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_POWER_DRAIN, true); + me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_PERIODIC_LEECH, true); + me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_PERIODIC_MANA_LEECH, true); } + + void Reset() + { + BossAI::Reset(); + } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER && roll_chance_i(50)) + Talk(SAY_SLAY); + } + + void JustDied(Unit* killer) + { + Talk(SAY_DEATH); + BossAI::JustDied(killer); + } + + void EnterCombat(Unit* who) + { + Talk(SAY_AGGRO); + BossAI::EnterCombat(who); + + events.ScheduleEvent(EVENT_SPELL_POUNDING, 15000); + events.ScheduleEvent(EVENT_SPELL_ARCANEORB, 3000); + events.ScheduleEvent(EVENT_SPELL_KNOCK_AWAY, 30000); + events.ScheduleEvent(EVENT_SPELL_BERSERK, 600000); + me->CallForHelp(105.0f); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_SPELL_BERSERK: + me->CastSpell(me, SPELL_BERSERK, true); + break; + case EVENT_SPELL_POUNDING: + Talk(SAY_POUNDING); + me->CastSpell(me, SPELL_POUNDING, false); + events.ScheduleEvent(EVENT_SPELL_POUNDING, 15000); + break; + case EVENT_SPELL_ARCANEORB: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, -18.0f, true)) + me->CastSpell(target, SPELL_ARCANE_ORB, false); + else if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 20.0f, true)) + me->CastSpell(target, SPELL_ARCANE_ORB, false); + events.ScheduleEvent(EVENT_SPELL_ARCANEORB, 4000); + break; + case EVENT_SPELL_KNOCK_AWAY: + me->CastSpell(me->GetVictim(), SPELL_KNOCK_AWAY, false); + events.ScheduleEvent(EVENT_SPELL_POUNDING, 25000); + break; + } + + DoMeleeAttackIfReady(); + EnterEvadeIfOutOfCombatArea(); + } + + bool CheckEvadeIfOutOfCombatArea() const + { + return me->GetDistance2d(432.59f, 371.93f) > 105.0f; + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetInstanceAI(creature); + } }; void AddSC_boss_void_reaver() diff --git a/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp b/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp index cbfc256d5..440cda0f1 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp @@ -8,171 +8,180 @@ class instance_the_eye : public InstanceMapScript { - public: - instance_the_eye() : InstanceMapScript("instance_the_eye", 550) { } +public: + instance_the_eye() : InstanceMapScript("instance_the_eye", 550) { } - struct instance_the_eye_InstanceMapScript : public InstanceScript + struct instance_the_eye_InstanceMapScript : public InstanceScript + { + instance_the_eye_InstanceMapScript(Map* map) : InstanceScript(map) {} + + uint64 ThaladredTheDarkenerGUID; + uint64 LordSanguinarGUID; + uint64 GrandAstromancerCapernianGUID; + uint64 MasterEngineerTelonicusGUID; + uint64 AlarGUID; + uint64 KaelthasGUID; + uint64 BridgeWindowGUID; + uint64 KaelStateRightGUID; + uint64 KaelStateLeftGUID; + + void Initialize() { - instance_the_eye_InstanceMapScript(Map* map) : InstanceScript(map) {} - - uint64 ThaladredTheDarkenerGUID; - uint64 LordSanguinarGUID; - uint64 GrandAstromancerCapernianGUID; - uint64 MasterEngineerTelonicusGUID; - uint64 AlarGUID; - uint64 KaelthasGUID; - uint64 BridgeWindowGUID; - uint64 KaelStateRightGUID; - uint64 KaelStateLeftGUID; - - void Initialize() - { - SetBossNumber(MAX_ENCOUNTER); - AlarGUID = 0; - KaelthasGUID = 0; - ThaladredTheDarkenerGUID = 0; - LordSanguinarGUID = 0; - GrandAstromancerCapernianGUID = 0; - MasterEngineerTelonicusGUID = 0; - BridgeWindowGUID = 0; - KaelStateRightGUID = 0; - KaelStateLeftGUID = 0; - } - - void OnCreatureCreate(Creature* creature) - { - switch (creature->GetEntry()) - { - case NPC_ALAR: - AlarGUID = creature->GetGUID(); - break; - case NPC_KAELTHAS: - KaelthasGUID = creature->GetGUID(); - break; - case NPC_THALADRED: - ThaladredTheDarkenerGUID = creature->GetGUID(); - break; - case NPC_TELONICUS: - MasterEngineerTelonicusGUID = creature->GetGUID(); - break; - case NPC_CAPERNIAN: - GrandAstromancerCapernianGUID = creature->GetGUID(); - break; - case NPC_LORD_SANGUINAR: - LordSanguinarGUID = creature->GetGUID(); - break; - } - } - - void OnGameObjectCreate(GameObject* gobject) - { - switch (gobject->GetEntry()) - { - case GO_BRIDGE_WINDOW: - BridgeWindowGUID = gobject->GetGUID(); - break; - case GO_KAEL_STATUE_RIGHT: - KaelStateRightGUID = gobject->GetGUID(); - break; - case GO_KAEL_STATUE_LEFT: - KaelStateLeftGUID = gobject->GetGUID(); - break; - } - } - - uint64 GetData64(uint32 identifier) const - { - switch (identifier) - { - case GO_BRIDGE_WINDOW: return BridgeWindowGUID; - case GO_KAEL_STATUE_RIGHT: return KaelStateRightGUID; - case GO_KAEL_STATUE_LEFT: return KaelStateLeftGUID; - case NPC_ALAR: return AlarGUID; - case NPC_KAELTHAS: return KaelthasGUID; - case DATA_KAEL_ADVISOR1: return ThaladredTheDarkenerGUID; - case DATA_KAEL_ADVISOR2: return LordSanguinarGUID; - case DATA_KAEL_ADVISOR3: return GrandAstromancerCapernianGUID; - case DATA_KAEL_ADVISOR4: return MasterEngineerTelonicusGUID; - } - return 0; - } - - std::string GetSaveData() - { - OUT_SAVE_INST_DATA; - - std::ostringstream saveStream; - saveStream << "E Y " << GetBossSaveData(); - - OUT_SAVE_INST_DATA_COMPLETE; - return saveStream.str(); - } - - void Load(char const* str) - { - 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 == 'E' && dataHead2 == 'Y') - { - for (uint32 i = 0; i < MAX_ENCOUNTER; ++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; - } - }; - - InstanceScript* GetInstanceScript(InstanceMap* map) const - { - return new instance_the_eye_InstanceMapScript(map); + SetBossNumber(MAX_ENCOUNTER); + AlarGUID = 0; + KaelthasGUID = 0; + ThaladredTheDarkenerGUID = 0; + LordSanguinarGUID = 0; + GrandAstromancerCapernianGUID = 0; + MasterEngineerTelonicusGUID = 0; + BridgeWindowGUID = 0; + KaelStateRightGUID = 0; + KaelStateLeftGUID = 0; } + + void OnCreatureCreate(Creature* creature) + { + switch (creature->GetEntry()) + { + case NPC_ALAR: + AlarGUID = creature->GetGUID(); + break; + case NPC_KAELTHAS: + KaelthasGUID = creature->GetGUID(); + break; + case NPC_THALADRED: + ThaladredTheDarkenerGUID = creature->GetGUID(); + break; + case NPC_TELONICUS: + MasterEngineerTelonicusGUID = creature->GetGUID(); + break; + case NPC_CAPERNIAN: + GrandAstromancerCapernianGUID = creature->GetGUID(); + break; + case NPC_LORD_SANGUINAR: + LordSanguinarGUID = creature->GetGUID(); + break; + } + } + + void OnGameObjectCreate(GameObject* gobject) + { + switch (gobject->GetEntry()) + { + case GO_BRIDGE_WINDOW: + BridgeWindowGUID = gobject->GetGUID(); + break; + case GO_KAEL_STATUE_RIGHT: + KaelStateRightGUID = gobject->GetGUID(); + break; + case GO_KAEL_STATUE_LEFT: + KaelStateLeftGUID = gobject->GetGUID(); + break; + } + } + + uint64 GetData64(uint32 identifier) const + { + switch (identifier) + { + case GO_BRIDGE_WINDOW: + return BridgeWindowGUID; + case GO_KAEL_STATUE_RIGHT: + return KaelStateRightGUID; + case GO_KAEL_STATUE_LEFT: + return KaelStateLeftGUID; + case NPC_ALAR: + return AlarGUID; + case NPC_KAELTHAS: + return KaelthasGUID; + case DATA_KAEL_ADVISOR1: + return ThaladredTheDarkenerGUID; + case DATA_KAEL_ADVISOR2: + return LordSanguinarGUID; + case DATA_KAEL_ADVISOR3: + return GrandAstromancerCapernianGUID; + case DATA_KAEL_ADVISOR4: + return MasterEngineerTelonicusGUID; + } + return 0; + } + + std::string GetSaveData() + { + OUT_SAVE_INST_DATA; + + std::ostringstream saveStream; + saveStream << "E Y " << GetBossSaveData(); + + OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); + } + + void Load(char const* str) + { + 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 == 'E' && dataHead2 == 'Y') + { + for (uint32 i = 0; i < MAX_ENCOUNTER; ++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; + } + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_the_eye_InstanceMapScript(map); + } }; class spell_the_eye_countercharge : public SpellScriptLoader { - public: - spell_the_eye_countercharge() : SpellScriptLoader("spell_the_eye_countercharge") { } +public: + spell_the_eye_countercharge() : SpellScriptLoader("spell_the_eye_countercharge") { } - class spell_the_eye_counterchargeScript : public AuraScript + class spell_the_eye_counterchargeScript : public AuraScript + { + PrepareAuraScript(spell_the_eye_counterchargeScript); + + bool PrepareProc(ProcEventInfo& /*eventInfo*/) { - PrepareAuraScript(spell_the_eye_counterchargeScript); - - bool PrepareProc(ProcEventInfo& /*eventInfo*/) - { - // xinef: prevent charge drop - PreventDefaultAction(); - return true; - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_the_eye_counterchargeScript::PrepareProc); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_the_eye_counterchargeScript(); + // xinef: prevent charge drop + PreventDefaultAction(); + return true; } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_the_eye_counterchargeScript::PrepareProc); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_the_eye_counterchargeScript(); + } }; void AddSC_instance_the_eye() diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_gyrokill.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_gyrokill.cpp index 0d7d779d2..28a76a47f 100644 --- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_gyrokill.cpp +++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_gyrokill.cpp @@ -30,69 +30,69 @@ enum Events class boss_gatewatcher_gyrokill : public CreatureScript { - public: - boss_gatewatcher_gyrokill() : CreatureScript("boss_gatewatcher_gyrokill") { } +public: + boss_gatewatcher_gyrokill() : CreatureScript("boss_gatewatcher_gyrokill") { } - struct boss_gatewatcher_gyrokillAI : public BossAI + struct boss_gatewatcher_gyrokillAI : public BossAI + { + boss_gatewatcher_gyrokillAI(Creature* creature) : BossAI(creature, DATA_GATEWATCHER_GYROKILL) { } + + void JustDied(Unit* /*killer*/) { - boss_gatewatcher_gyrokillAI(Creature* creature) : BossAI(creature, DATA_GATEWATCHER_GYROKILL) { } - - void JustDied(Unit* /*killer*/) - { - _JustDied(); - Talk(SAY_DEATH); - } - - void EnterCombat(Unit* /*who*/) - { - _EnterCombat(); - events.ScheduleEvent(EVENT_STREAM_OF_MACHINE_FLUID, 10000); - events.ScheduleEvent(EVENT_SAW_BLADE, 20000); - events.ScheduleEvent(EVENT_SHADOW_POWER, 30000); - Talk(SAY_AGGRO); - } - - void KilledUnit(Unit* victim) - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_SLAY); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_STREAM_OF_MACHINE_FLUID: - me->CastSpell(me->GetVictim(), SPELL_STREAM_OF_MACHINE_FLUID, false); - events.ScheduleEvent(EVENT_STREAM_OF_MACHINE_FLUID, urand(12000, 14000)); - break; - case EVENT_SAW_BLADE: - if (Unit* target= SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f)) - me->CastSpell(target, SPELL_SAW_BLADE, false); - Talk(SAY_SAW_BLADE); - events.ScheduleEvent(EVENT_SAW_BLADE, 25000); - break; - case EVENT_SHADOW_POWER: - me->CastSpell(me, SPELL_SHADOW_POWER, false); - events.ScheduleEvent(EVENT_SAW_BLADE, 25000); - break; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_gatewatcher_gyrokillAI(creature); + _JustDied(); + Talk(SAY_DEATH); } + + void EnterCombat(Unit* /*who*/) + { + _EnterCombat(); + events.ScheduleEvent(EVENT_STREAM_OF_MACHINE_FLUID, 10000); + events.ScheduleEvent(EVENT_SAW_BLADE, 20000); + events.ScheduleEvent(EVENT_SHADOW_POWER, 30000); + Talk(SAY_AGGRO); + } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_STREAM_OF_MACHINE_FLUID: + me->CastSpell(me->GetVictim(), SPELL_STREAM_OF_MACHINE_FLUID, false); + events.ScheduleEvent(EVENT_STREAM_OF_MACHINE_FLUID, urand(12000, 14000)); + break; + case EVENT_SAW_BLADE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f)) + me->CastSpell(target, SPELL_SAW_BLADE, false); + Talk(SAY_SAW_BLADE); + events.ScheduleEvent(EVENT_SAW_BLADE, 25000); + break; + case EVENT_SHADOW_POWER: + me->CastSpell(me, SPELL_SHADOW_POWER, false); + events.ScheduleEvent(EVENT_SAW_BLADE, 25000); + break; + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_gatewatcher_gyrokillAI(creature); + } }; void AddSC_boss_gatewatcher_gyrokill() diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp index 98f67045b..8baac431b 100644 --- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp +++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp @@ -31,71 +31,71 @@ enum Events class boss_gatewatcher_iron_hand : public CreatureScript { - public: - boss_gatewatcher_iron_hand(): CreatureScript("boss_gatewatcher_iron_hand") { } +public: + boss_gatewatcher_iron_hand(): CreatureScript("boss_gatewatcher_iron_hand") { } - struct boss_gatewatcher_iron_handAI : public BossAI + struct boss_gatewatcher_iron_handAI : public BossAI + { + boss_gatewatcher_iron_handAI(Creature* creature) : BossAI(creature, DATA_GATEWATCHER_IRON_HAND) { } + + void EnterCombat(Unit* /*who*/) { - boss_gatewatcher_iron_handAI(Creature* creature) : BossAI(creature, DATA_GATEWATCHER_IRON_HAND) { } - - void EnterCombat(Unit* /*who*/) - { - _EnterCombat(); - events.ScheduleEvent(EVENT_STREAM_OF_MACHINE_FLUID, 15000); - events.ScheduleEvent(EVENT_JACKHAMMER, 35000); - events.ScheduleEvent(EVENT_SHADOW_POWER, 25000); - Talk(SAY_AGGRO); - } - - void KilledUnit(Unit* victim) - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_SLAY); - } - - void JustDied(Unit* /*killer*/) - { - _JustDied(); - Talk(SAY_DEATH); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_STREAM_OF_MACHINE_FLUID: - me->CastSpell(me->GetVictim(), SPELL_STREAM_OF_MACHINE_FLUID, false); - events.ScheduleEvent(EVENT_STREAM_OF_MACHINE_FLUID, 20000); - break; - case EVENT_JACKHAMMER: - Talk(EMOTE_HAMMER); - Talk(SAY_HAMMER); - me->CastSpell(me, SPELL_JACKHAMMER, false); - events.ScheduleEvent(EVENT_JACKHAMMER, 40000); - break; - case EVENT_SHADOW_POWER: - me->CastSpell(me, SPELL_SHADOW_POWER, false); - events.ScheduleEvent(EVENT_SHADOW_POWER, 25000); - break; - default: - break; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_gatewatcher_iron_handAI(creature); + _EnterCombat(); + events.ScheduleEvent(EVENT_STREAM_OF_MACHINE_FLUID, 15000); + events.ScheduleEvent(EVENT_JACKHAMMER, 35000); + events.ScheduleEvent(EVENT_SHADOW_POWER, 25000); + Talk(SAY_AGGRO); } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + + void JustDied(Unit* /*killer*/) + { + _JustDied(); + Talk(SAY_DEATH); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_STREAM_OF_MACHINE_FLUID: + me->CastSpell(me->GetVictim(), SPELL_STREAM_OF_MACHINE_FLUID, false); + events.ScheduleEvent(EVENT_STREAM_OF_MACHINE_FLUID, 20000); + break; + case EVENT_JACKHAMMER: + Talk(EMOTE_HAMMER); + Talk(SAY_HAMMER); + me->CastSpell(me, SPELL_JACKHAMMER, false); + events.ScheduleEvent(EVENT_JACKHAMMER, 40000); + break; + case EVENT_SHADOW_POWER: + me->CastSpell(me, SPELL_SHADOW_POWER, false); + events.ScheduleEvent(EVENT_SHADOW_POWER, 25000); + break; + default: + break; + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_gatewatcher_iron_handAI(creature); + } }; void AddSC_boss_gatewatcher_iron_hand() diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp index a3353ea6a..70dbc7f5a 100644 --- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp +++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp @@ -43,67 +43,67 @@ enum Events class boss_mechano_lord_capacitus : public CreatureScript { - public: - boss_mechano_lord_capacitus() : CreatureScript("boss_mechano_lord_capacitus") { } +public: + boss_mechano_lord_capacitus() : CreatureScript("boss_mechano_lord_capacitus") { } - struct boss_mechano_lord_capacitusAI : public BossAI + struct boss_mechano_lord_capacitusAI : public BossAI + { + boss_mechano_lord_capacitusAI(Creature* creature) : BossAI(creature, DATA_MECHANOLORD_CAPACITUS) { } + + void EnterCombat(Unit* /*who*/) { - boss_mechano_lord_capacitusAI(Creature* creature) : BossAI(creature, DATA_MECHANOLORD_CAPACITUS) { } + _EnterCombat(); + Talk(YELL_AGGRO); + events.ScheduleEvent(EVENT_HEADCRACK, 6000); + events.ScheduleEvent(EVENT_SUMMON_NETHER_CHARGE, 10000); + events.ScheduleEvent(EVENT_BERSERK, 180000); + events.ScheduleEvent(IsHeroic() ? EVENT_POSITIVE_SHIFT : EVENT_REFLECTIVE_DAMAGE_SHIELD, 15000); + } - void EnterCombat(Unit* /*who*/) + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(YELL_KILL); + } + + void JustDied(Unit* /*victim*/) + { + _JustDied(); + Talk(YELL_DEATH); + } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + summon->GetMotionMaster()->MoveRandom(30.0f); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) { - _EnterCombat(); - Talk(YELL_AGGRO); - events.ScheduleEvent(EVENT_HEADCRACK, 6000); - events.ScheduleEvent(EVENT_SUMMON_NETHER_CHARGE, 10000); - events.ScheduleEvent(EVENT_BERSERK, 180000); - events.ScheduleEvent(IsHeroic() ? EVENT_POSITIVE_SHIFT : EVENT_REFLECTIVE_DAMAGE_SHIELD, 15000); - } - - void KilledUnit(Unit* victim) - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(YELL_KILL); - } - - void JustDied(Unit* /*victim*/) - { - _JustDied(); - Talk(YELL_DEATH); - } - - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - summon->GetMotionMaster()->MoveRandom(30.0f); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_HEADCRACK: - me->CastSpell(me->GetVictim(), SPELL_HEADCRACK, false); - events.ScheduleEvent(EVENT_HEADCRACK, 20000); - break; - case EVENT_REFLECTIVE_DAMAGE_SHIELD: - Talk(YELL_REFLECTIVE_DAMAGE_SHIELD); - me->CastSpell(me, SPELL_REFLECTIVE_DAMAGE_SHIELD, false); - events.ScheduleEvent(EVENT_REFLECTIVE_MAGIE_SHIELD, 20000); - break; - case EVENT_REFLECTIVE_MAGIE_SHIELD: - Talk(YELL_REFLECTIVE_MAGIC_SHIELD); - me->CastSpell(me, SPELL_REFLECTIVE_MAGIC_SHIELD, false); - events.ScheduleEvent(EVENT_REFLECTIVE_DAMAGE_SHIELD, 20000); - break; - case EVENT_SUMMON_NETHER_CHARGE: + case EVENT_HEADCRACK: + me->CastSpell(me->GetVictim(), SPELL_HEADCRACK, false); + events.ScheduleEvent(EVENT_HEADCRACK, 20000); + break; + case EVENT_REFLECTIVE_DAMAGE_SHIELD: + Talk(YELL_REFLECTIVE_DAMAGE_SHIELD); + me->CastSpell(me, SPELL_REFLECTIVE_DAMAGE_SHIELD, false); + events.ScheduleEvent(EVENT_REFLECTIVE_MAGIE_SHIELD, 20000); + break; + case EVENT_REFLECTIVE_MAGIE_SHIELD: + Talk(YELL_REFLECTIVE_MAGIC_SHIELD); + me->CastSpell(me, SPELL_REFLECTIVE_MAGIC_SHIELD, false); + events.ScheduleEvent(EVENT_REFLECTIVE_DAMAGE_SHIELD, 20000); + break; + case EVENT_SUMMON_NETHER_CHARGE: { Position pos; me->GetRandomNearPosition(pos, 8.0f); @@ -111,23 +111,23 @@ class boss_mechano_lord_capacitus : public CreatureScript events.ScheduleEvent(EVENT_SUMMON_NETHER_CHARGE, 5000); break; } - case EVENT_POSITIVE_SHIFT: - me->CastSpell(me, SPELL_POLARITY_SHIFT, true); - events.ScheduleEvent(EVENT_POSITIVE_SHIFT, 30000); - break; - case EVENT_BERSERK: - me->CastSpell(me, SPELL_BERSERK, true); - break; - } - - DoMeleeAttackIfReady(); + case EVENT_POSITIVE_SHIFT: + me->CastSpell(me, SPELL_POLARITY_SHIFT, true); + events.ScheduleEvent(EVENT_POSITIVE_SHIFT, 30000); + break; + case EVENT_BERSERK: + me->CastSpell(me, SPELL_BERSERK, true); + break; } - }; - CreatureAI* GetAI(Creature* creature) const - { - return new boss_mechano_lord_capacitusAI(creature); + DoMeleeAttackIfReady(); } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_mechano_lord_capacitusAI(creature); + } }; enum polarityShift @@ -143,77 +143,77 @@ enum polarityShift class spell_capacitus_polarity_charge : public SpellScriptLoader { - public: - spell_capacitus_polarity_charge() : SpellScriptLoader("spell_capacitus_polarity_charge") { } +public: + spell_capacitus_polarity_charge() : SpellScriptLoader("spell_capacitus_polarity_charge") { } - class spell_capacitus_polarity_charge_SpellScript : public SpellScript + class spell_capacitus_polarity_charge_SpellScript : public SpellScript + { + PrepareSpellScript(spell_capacitus_polarity_charge_SpellScript); + + void HandleTargets(std::list& targetList) { - PrepareSpellScript(spell_capacitus_polarity_charge_SpellScript); + uint8 count = 0; + for (std::list::iterator ihit = targetList.begin(); ihit != targetList.end(); ++ihit) + if ((*ihit)->GetGUID() != GetCaster()->GetGUID()) + if (Player* target = (*ihit)->ToPlayer()) + if (target->HasAura(GetTriggeringSpell()->Id)) + ++count; - void HandleTargets(std::list& targetList) + if (count) { - uint8 count = 0; - for (std::list::iterator ihit = targetList.begin(); ihit != targetList.end(); ++ihit) - if ((*ihit)->GetGUID() != GetCaster()->GetGUID()) - if (Player* target = (*ihit)->ToPlayer()) - if (target->HasAura(GetTriggeringSpell()->Id)) - ++count; - - if (count) - { - uint32 spellId = GetSpellInfo()->Id == SPELL_POSITIVE_CHARGE ? SPELL_POSITIVE_CHARGE_STACK : SPELL_NEGATIVE_CHARGE_STACK; - GetCaster()->SetAuraStack(spellId, GetCaster(), count); - } + uint32 spellId = GetSpellInfo()->Id == SPELL_POSITIVE_CHARGE ? SPELL_POSITIVE_CHARGE_STACK : SPELL_NEGATIVE_CHARGE_STACK; + GetCaster()->SetAuraStack(spellId, GetCaster(), count); } - - void HandleDamage(SpellEffIndex /*effIndex*/) - { - if (!GetTriggeringSpell()) - return; - - Unit* target = GetHitUnit(); - if (target->HasAura(GetTriggeringSpell()->Id)) - SetHitDamage(0); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_capacitus_polarity_charge_SpellScript::HandleDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_capacitus_polarity_charge_SpellScript::HandleTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_capacitus_polarity_charge_SpellScript(); } + + void HandleDamage(SpellEffIndex /*effIndex*/) + { + if (!GetTriggeringSpell()) + return; + + Unit* target = GetHitUnit(); + if (target->HasAura(GetTriggeringSpell()->Id)) + SetHitDamage(0); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_capacitus_polarity_charge_SpellScript::HandleDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_capacitus_polarity_charge_SpellScript::HandleTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_capacitus_polarity_charge_SpellScript(); + } }; class spell_capacitus_polarity_shift : public SpellScriptLoader { - public: - spell_capacitus_polarity_shift() : SpellScriptLoader("spell_capacitus_polarity_shift") { } +public: + spell_capacitus_polarity_shift() : SpellScriptLoader("spell_capacitus_polarity_shift") { } - class spell_capacitus_polarity_shift_SpellScript : public SpellScript + class spell_capacitus_polarity_shift_SpellScript : public SpellScript + { + PrepareSpellScript(spell_capacitus_polarity_shift_SpellScript); + + void HandleDummy(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_capacitus_polarity_shift_SpellScript); - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - target->CastSpell(target, roll_chance_i(50) ? SPELL_POSITIVE_POLARITY : SPELL_NEGATIVE_POLARITY, true, nullptr, nullptr, GetCaster()->GetGUID()); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_capacitus_polarity_shift_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_capacitus_polarity_shift_SpellScript(); + if (Unit* target = GetHitUnit()) + target->CastSpell(target, roll_chance_i(50) ? SPELL_POSITIVE_POLARITY : SPELL_NEGATIVE_POLARITY, true, nullptr, nullptr, GetCaster()->GetGUID()); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_capacitus_polarity_shift_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_capacitus_polarity_shift_SpellScript(); + } }; void AddSC_boss_mechano_lord_capacitus() diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp index 9f6f5a760..62cc6b968 100644 --- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp +++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp @@ -32,90 +32,91 @@ enum Events class boss_nethermancer_sepethrea : public CreatureScript { - public: boss_nethermancer_sepethrea(): CreatureScript("boss_nethermancer_sepethrea") { } +public: + boss_nethermancer_sepethrea(): CreatureScript("boss_nethermancer_sepethrea") { } - struct boss_nethermancer_sepethreaAI : public BossAI + struct boss_nethermancer_sepethreaAI : public BossAI + { + boss_nethermancer_sepethreaAI(Creature* creature) : BossAI(creature, DATA_NETHERMANCER_SEPRETHREA) { } + + void EnterCombat(Unit* /*who*/) { - boss_nethermancer_sepethreaAI(Creature* creature) : BossAI(creature, DATA_NETHERMANCER_SEPRETHREA) { } + _EnterCombat(); + events.ScheduleEvent(EVENT_FROST_ATTACK, 6000); + events.ScheduleEvent(EVENT_ARCANE_BLAST, 14000); + events.ScheduleEvent(EVENT_DRAGONS_BREATH, 18000); - void EnterCombat(Unit* /*who*/) - { - _EnterCombat(); - events.ScheduleEvent(EVENT_FROST_ATTACK, 6000); - events.ScheduleEvent(EVENT_ARCANE_BLAST, 14000); - events.ScheduleEvent(EVENT_DRAGONS_BREATH, 18000); - - Talk(SAY_AGGRO); - me->CastSpell(me, SPELL_SUMMON_RAGIN_FLAMES, true); - } - - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - if (Unit* victim = me->GetVictim()) - { - summon->AI()->AttackStart(victim); - summon->AddThreat(victim, 1000.0f); - summon->SetInCombatWithZone(); - } - } - - void KilledUnit(Unit* victim) - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_SLAY); - } - - void JustDied(Unit* /*killer*/) - { - events.Reset(); - if (instance) - { - instance->SetBossState(DATA_NETHERMANCER_SEPRETHREA, DONE); - instance->SaveToDB(); - } - Talk(SAY_DEATH); - - for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) - if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr)) - Unit::Kill(summon, summon); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_FROST_ATTACK: - me->CastSpell(me->GetVictim(), SPELL_FROST_ATTACK, false); - events.ScheduleEvent(EVENT_FROST_ATTACK, 8000); - break; - case EVENT_ARCANE_BLAST: - me->CastSpell(me->GetVictim(), SPELL_ARCANE_BLAST, false); - events.ScheduleEvent(EVENT_ARCANE_BLAST, 12000); - break; - case EVENT_DRAGONS_BREATH: - me->CastSpell(me->GetVictim(), SPELL_DRAGONS_BREATH, true); - events.ScheduleEvent(EVENT_DRAGONS_BREATH, 16000); - if (roll_chance_i(50)) - Talk(SAY_DRAGONS_BREATH); - break; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_nethermancer_sepethreaAI(creature); + Talk(SAY_AGGRO); + me->CastSpell(me, SPELL_SUMMON_RAGIN_FLAMES, true); } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + if (Unit* victim = me->GetVictim()) + { + summon->AI()->AttackStart(victim); + summon->AddThreat(victim, 1000.0f); + summon->SetInCombatWithZone(); + } + } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + + void JustDied(Unit* /*killer*/) + { + events.Reset(); + if (instance) + { + instance->SetBossState(DATA_NETHERMANCER_SEPRETHREA, DONE); + instance->SaveToDB(); + } + Talk(SAY_DEATH); + + for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) + if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr)) + Unit::Kill(summon, summon); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_FROST_ATTACK: + me->CastSpell(me->GetVictim(), SPELL_FROST_ATTACK, false); + events.ScheduleEvent(EVENT_FROST_ATTACK, 8000); + break; + case EVENT_ARCANE_BLAST: + me->CastSpell(me->GetVictim(), SPELL_ARCANE_BLAST, false); + events.ScheduleEvent(EVENT_ARCANE_BLAST, 12000); + break; + case EVENT_DRAGONS_BREATH: + me->CastSpell(me->GetVictim(), SPELL_DRAGONS_BREATH, true); + events.ScheduleEvent(EVENT_DRAGONS_BREATH, 16000); + if (roll_chance_i(50)) + Talk(SAY_DRAGONS_BREATH); + break; + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_nethermancer_sepethreaAI(creature); + } }; enum raginFlames @@ -130,83 +131,83 @@ enum raginFlames class npc_ragin_flames : public CreatureScript { - public: - npc_ragin_flames() : CreatureScript("npc_ragin_flames") { } +public: + npc_ragin_flames() : CreatureScript("npc_ragin_flames") { } - struct npc_ragin_flamesAI : public ScriptedAI + struct npc_ragin_flamesAI : public ScriptedAI + { + npc_ragin_flamesAI(Creature* creature) : ScriptedAI(creature) { } + + EventMap events; + + void Reset() + { + me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_ALL, true); + } + + void EnterCombat(Unit*) + { + events.ScheduleEvent(EVENT_SPELL_FIRE_TAIL, 500); + events.ScheduleEvent(EVENT_SPELL_INFERNO, urand(10000, 20000)); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + switch (events.ExecuteEvent()) { - npc_ragin_flamesAI(Creature* creature) : ScriptedAI(creature) { } - - EventMap events; - - void Reset() - { - me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_ALL, true); - } - - void EnterCombat(Unit*) - { - events.ScheduleEvent(EVENT_SPELL_FIRE_TAIL, 500); - events.ScheduleEvent(EVENT_SPELL_INFERNO, urand(10000, 20000)); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - switch (events.ExecuteEvent()) + case EVENT_SPELL_INFERNO: + if (me->IsWithinCombatRange(me->GetVictim(), 5.0f)) { - case EVENT_SPELL_INFERNO: - if (me->IsWithinCombatRange(me->GetVictim(), 5.0f)) - { - me->CastSpell(me, SPELL_INFERNO, true); - events.ScheduleEvent(EVENT_SPELL_INFERNO, 20000); - } - else - events.ScheduleEvent(EVENT_SPELL_INFERNO, 1000); - break; - case EVENT_SPELL_FIRE_TAIL: - me->CastSpell(me, SPELL_FIRE_TAIL, true); - events.ScheduleEvent(EVENT_SPELL_FIRE_TAIL, 500); - break; + me->CastSpell(me, SPELL_INFERNO, true); + events.ScheduleEvent(EVENT_SPELL_INFERNO, 20000); } - - DoMeleeAttackIfReady(); - } - - }; - CreatureAI* GetAI(Creature* creature) const - { - return new npc_ragin_flamesAI(creature); + else + events.ScheduleEvent(EVENT_SPELL_INFERNO, 1000); + break; + case EVENT_SPELL_FIRE_TAIL: + me->CastSpell(me, SPELL_FIRE_TAIL, true); + events.ScheduleEvent(EVENT_SPELL_FIRE_TAIL, 500); + break; } + + DoMeleeAttackIfReady(); + } + + }; + CreatureAI* GetAI(Creature* creature) const + { + return new npc_ragin_flamesAI(creature); + } }; class spell_ragin_flames_inferno : public SpellScriptLoader { - public: - spell_ragin_flames_inferno() : SpellScriptLoader("spell_ragin_flames_inferno") { } +public: + spell_ragin_flames_inferno() : SpellScriptLoader("spell_ragin_flames_inferno") { } - class spell_ragin_flames_inferno_AuraScript : public AuraScript + class spell_ragin_flames_inferno_AuraScript : public AuraScript + { + PrepareAuraScript(spell_ragin_flames_inferno_AuraScript); + + void HandlePeriodic(AuraEffect const* aurEff) { - PrepareAuraScript(spell_ragin_flames_inferno_AuraScript); - - void HandlePeriodic(AuraEffect const* aurEff) - { - GetUnitOwner()->CastCustomSpell(SPELL_INFERNO_DAMAGE, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetUnitOwner(), TRIGGERED_FULL_MASK); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_ragin_flames_inferno_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_ragin_flames_inferno_AuraScript(); + GetUnitOwner()->CastCustomSpell(SPELL_INFERNO_DAMAGE, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetUnitOwner(), TRIGGERED_FULL_MASK); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_ragin_flames_inferno_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_ragin_flames_inferno_AuraScript(); + } }; void AddSC_boss_nethermancer_sepethrea() diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp index eb98d5994..fbd7ee9dd 100644 --- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp +++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp @@ -42,112 +42,112 @@ enum Events class boss_pathaleon_the_calculator : public CreatureScript { - public: - boss_pathaleon_the_calculator(): CreatureScript("boss_pathaleon_the_calculator") { } +public: + boss_pathaleon_the_calculator(): CreatureScript("boss_pathaleon_the_calculator") { } - struct boss_pathaleon_the_calculatorAI : public BossAI + struct boss_pathaleon_the_calculatorAI : public BossAI + { + boss_pathaleon_the_calculatorAI(Creature* creature) : BossAI(creature, DATA_PATHALEON_THE_CALCULATOR) { } + + void InitializeAI() { - boss_pathaleon_the_calculatorAI(Creature* creature) : BossAI(creature, DATA_PATHALEON_THE_CALCULATOR) { } - - void InitializeAI() - { - BossAI::InitializeAI(); - me->SetVisible(false); - me->SetReactState(REACT_PASSIVE); - } - - void DoAction(int32 /*param*/) - { - me->SetVisible(true); - me->CastSpell(me, SPELL_TELEPORT_VISUAL, true); - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY1H); - me->SetReactState(REACT_AGGRESSIVE); - Talk(SAY_APPEAR); - } - - void EnterCombat(Unit* /*who*/) - { - _EnterCombat(); - events.ScheduleEvent(EVENT_SUMMON, 30000); - events.ScheduleEvent(EVENT_MANA_TAP, 12000); - events.ScheduleEvent(EVENT_ARCANE_TORRENT, 16000); - events.ScheduleEvent(EVENT_DOMINATION, 25000); - events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, 8000); - events.ScheduleEvent(EVENT_FRENZY, 1000); - Talk(SAY_AGGRO); - } - - void KilledUnit(Unit* victim) - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_SLAY); - } - - void JustDied(Unit* /*killer*/) - { - _JustDied(); - Talk(SAY_DEATH); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_ARCANE_EXPLOSION: - me->CastSpell(me, SPELL_ARCANE_EXPLOSION, false); - events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, 12000); - break; - case EVENT_ARCANE_TORRENT: - me->RemoveAurasDueToSpell(SPELL_MANA_TAP); - me->ModifyPower(POWER_MANA, 5000); - me->CastSpell(me, SPELL_ARCANE_TORRENT, false); - events.ScheduleEvent(EVENT_ARCANE_TORRENT, 15000); - break; - case EVENT_MANA_TAP: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, PowerUsersSelector(me, POWER_MANA, 40.0f, false))) - me->CastSpell(target, SPELL_MANA_TAP, false); - events.ScheduleEvent(EVENT_MANA_TAP, 18000); - break; - case EVENT_DOMINATION: - Talk(SAY_DOMINATION); - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 50.0f)) - me->CastSpell(target, SPELL_DOMINATION, false); - events.ScheduleEvent(EVENT_DOMINATION, 30000); - break; - case EVENT_FRENZY: - if (me->HealthBelowPct(20)) - { - summons.DespawnAll(); - me->CastSpell(me, SPELL_DISGRUNTLED_ANGER, true); - Talk(SAY_ENRAGE); - break; - } - events.ScheduleEvent(EVENT_FRENZY, 1000); - break; - case EVENT_SUMMON: - for (uint8 i = 0; i < DUNGEON_MODE(3, 4); ++i) - me->CastSpell(me, SPELL_SUMMON_NETHER_WRAITH_1+i, true); - - Talk(SAY_SUMMON); - events.ScheduleEvent(EVENT_SUMMON, urand(30000, 45000)); - break; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_pathaleon_the_calculatorAI(creature); + BossAI::InitializeAI(); + me->SetVisible(false); + me->SetReactState(REACT_PASSIVE); } + + void DoAction(int32 /*param*/) + { + me->SetVisible(true); + me->CastSpell(me, SPELL_TELEPORT_VISUAL, true); + me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY1H); + me->SetReactState(REACT_AGGRESSIVE); + Talk(SAY_APPEAR); + } + + void EnterCombat(Unit* /*who*/) + { + _EnterCombat(); + events.ScheduleEvent(EVENT_SUMMON, 30000); + events.ScheduleEvent(EVENT_MANA_TAP, 12000); + events.ScheduleEvent(EVENT_ARCANE_TORRENT, 16000); + events.ScheduleEvent(EVENT_DOMINATION, 25000); + events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, 8000); + events.ScheduleEvent(EVENT_FRENZY, 1000); + Talk(SAY_AGGRO); + } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + + void JustDied(Unit* /*killer*/) + { + _JustDied(); + Talk(SAY_DEATH); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_ARCANE_EXPLOSION: + me->CastSpell(me, SPELL_ARCANE_EXPLOSION, false); + events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, 12000); + break; + case EVENT_ARCANE_TORRENT: + me->RemoveAurasDueToSpell(SPELL_MANA_TAP); + me->ModifyPower(POWER_MANA, 5000); + me->CastSpell(me, SPELL_ARCANE_TORRENT, false); + events.ScheduleEvent(EVENT_ARCANE_TORRENT, 15000); + break; + case EVENT_MANA_TAP: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, PowerUsersSelector(me, POWER_MANA, 40.0f, false))) + me->CastSpell(target, SPELL_MANA_TAP, false); + events.ScheduleEvent(EVENT_MANA_TAP, 18000); + break; + case EVENT_DOMINATION: + Talk(SAY_DOMINATION); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 50.0f)) + me->CastSpell(target, SPELL_DOMINATION, false); + events.ScheduleEvent(EVENT_DOMINATION, 30000); + break; + case EVENT_FRENZY: + if (me->HealthBelowPct(20)) + { + summons.DespawnAll(); + me->CastSpell(me, SPELL_DISGRUNTLED_ANGER, true); + Talk(SAY_ENRAGE); + break; + } + events.ScheduleEvent(EVENT_FRENZY, 1000); + break; + case EVENT_SUMMON: + for (uint8 i = 0; i < DUNGEON_MODE(3, 4); ++i) + me->CastSpell(me, SPELL_SUMMON_NETHER_WRAITH_1 + i, true); + + Talk(SAY_SUMMON); + events.ScheduleEvent(EVENT_SUMMON, urand(30000, 45000)); + break; + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_pathaleon_the_calculatorAI(creature); + } }; void AddSC_boss_pathaleon_the_calculator() diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp index e2f84b19e..0e0d7fb00 100644 --- a/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp +++ b/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp @@ -16,237 +16,237 @@ static DoorData const doorData[] = class instance_mechanar : public InstanceMapScript { - public: - instance_mechanar(): InstanceMapScript("instance_mechanar", 554) { } +public: + instance_mechanar(): InstanceMapScript("instance_mechanar", 554) { } - struct instance_mechanar_InstanceMapScript : public InstanceScript + struct instance_mechanar_InstanceMapScript : public InstanceScript + { + instance_mechanar_InstanceMapScript(Map* map) : InstanceScript(map) { - instance_mechanar_InstanceMapScript(Map* map) : InstanceScript(map) - { - SetBossNumber(MAX_ENCOUNTER); - LoadDoorData(doorData); + SetBossNumber(MAX_ENCOUNTER); + LoadDoorData(doorData); - _pathaleonGUID = 0; - _passageEncounter = 0; + _pathaleonGUID = 0; + _passageEncounter = 0; + _passageTimer = 0; + _passageGUIDs.clear(); + } + + void OnGameObjectCreate(GameObject* gameObject) + { + switch (gameObject->GetEntry()) + { + case GO_DOOR_MOARG_1: + case GO_DOOR_MOARG_2: + case GO_DOOR_NETHERMANCER: + AddDoor(gameObject, true); + break; + default: + break; + } + } + + void OnGameObjectRemove(GameObject* gameObject) + { + switch (gameObject->GetEntry()) + { + case GO_DOOR_MOARG_1: + case GO_DOOR_MOARG_2: + case GO_DOOR_NETHERMANCER: + AddDoor(gameObject, false); + break; + default: + break; + } + } + + void OnCreatureCreate(Creature* creature) + { + if (creature->GetEntry() == NPC_PATHALEON_THE_CALCULATOR) + _pathaleonGUID = creature->GetGUID(); + } + + void OnUnitDeath(Unit* unit) + { + if (unit->GetTypeId() == TYPEID_UNIT) + if (_passageEncounter > ENCOUNTER_PASSAGE_NOT_STARTED && _passageEncounter < ENCOUNTER_PASSAGE_DONE) + if (_passageGUIDs.find(unit->GetGUID()) != _passageGUIDs.end()) + _passageGUIDs.erase(unit->GetGUID()); + } + + Player* GetPassagePlayer(float x) + { + Map::PlayerList const& pl = instance->GetPlayers(); + for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) + if (Player* player = itr->GetSource()) + if (player->GetPositionX() < x && player->GetPositionZ() > 24.0f && player->GetPositionY() > -30.0f) + return player; + return nullptr; + } + + void DoSummonAction(Creature* summon, Player* player) + { + summon->CastSpell(summon, SPELL_TELEPORT_VISUAL, true); + summon->AI()->AttackStart(player); + _passageGUIDs.insert(summon->GetGUID()); + } + + void Update(uint32 diff) + { + if (_passageEncounter == ENCOUNTER_PASSAGE_DONE) + return; + + _passageTimer += diff; + if (_passageTimer >= 1000) + { _passageTimer = 0; - _passageGUIDs.clear(); - } - - void OnGameObjectCreate(GameObject* gameObject) - { - switch (gameObject->GetEntry()) + if (_passageEncounter == ENCOUNTER_PASSAGE_NOT_STARTED) { - case GO_DOOR_MOARG_1: - case GO_DOOR_MOARG_2: - case GO_DOOR_NETHERMANCER: - AddDoor(gameObject, true); - break; - default: - break; + if (Player* player = GetPassagePlayer(250.0f)) + { + _passageEncounter++; + for (uint8 i = 0; i < 4; ++i) + { + Position pos = {238.0f, -27.0f + 3.0f * i, 26.328f, 0.0f}; + if (Creature* creature = instance->SummonCreature(i == 1 || i == 2 ? NPC_SUNSEEKER_ASTROMAGE : NPC_BLOODWARDER_CENTURION, pos)) + DoSummonAction(creature, player); + } + } } - } - void OnGameObjectRemove(GameObject* gameObject) - { - switch (gameObject->GetEntry()) - { - case GO_DOOR_MOARG_1: - case GO_DOOR_MOARG_2: - case GO_DOOR_NETHERMANCER: - AddDoor(gameObject, false); - break; - default: - break; - } - } - - void OnCreatureCreate(Creature* creature) - { - if (creature->GetEntry() == NPC_PATHALEON_THE_CALCULATOR) - _pathaleonGUID = creature->GetGUID(); - } - - void OnUnitDeath(Unit* unit) - { - if (unit->GetTypeId() == TYPEID_UNIT) - if (_passageEncounter > ENCOUNTER_PASSAGE_NOT_STARTED && _passageEncounter < ENCOUNTER_PASSAGE_DONE) - if (_passageGUIDs.find(unit->GetGUID()) != _passageGUIDs.end()) - _passageGUIDs.erase(unit->GetGUID()); - } - - Player* GetPassagePlayer(float x) - { - Map::PlayerList const& pl = instance->GetPlayers(); - for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) - if (Player* player = itr->GetSource()) - if (player->GetPositionX() < x && player->GetPositionZ() > 24.0f && player->GetPositionY() > -30.0f) - return player; - return nullptr; - } - - void DoSummonAction(Creature* summon, Player* player) - { - summon->CastSpell(summon, SPELL_TELEPORT_VISUAL, true); - summon->AI()->AttackStart(player); - _passageGUIDs.insert(summon->GetGUID()); - } - - void Update(uint32 diff) - { - if (_passageEncounter == ENCOUNTER_PASSAGE_DONE) + if (!_passageGUIDs.empty()) return; - _passageTimer += diff; - if (_passageTimer >= 1000) + if (_passageEncounter < ENCOUNTER_PASSAGE_PHASE3) { - _passageTimer = 0; - if (_passageEncounter == ENCOUNTER_PASSAGE_NOT_STARTED) + if (Player* player = GetPassagePlayer(250.0f)) { - if (Player* player = GetPassagePlayer(250.0f)) + if (_passageEncounter == ENCOUNTER_PASSAGE_PHASE1) { - _passageEncounter++; - for (uint8 i = 0; i < 4; ++i) + Position pos = {214.37f, -23.5f, 24.88f, 0.0f}; + if (Creature* creature = instance->SummonCreature(NPC_TEMPEST_KEEPER_DESTROYER, pos)) + DoSummonAction(creature, player); + } + else if (_passageEncounter == ENCOUNTER_PASSAGE_PHASE2) + { + for (uint8 i = 0; i < 3; ++i) { - Position pos = {238.0f, -27.0f + 3.0f*i, 26.328f, 0.0f}; - if (Creature* creature = instance->SummonCreature(i==1 || i==2 ? NPC_SUNSEEKER_ASTROMAGE : NPC_BLOODWARDER_CENTURION, pos)) + Position pos = {199.76f, -26.0f + 2.5f * i, 24.88f, 0.0f}; + if (Creature* creature = instance->SummonCreature(i == 1 ? NPC_SUNSEEKER_ENGINEER : NPC_BLOODWARDER_PHYSICIAN, pos)) DoSummonAction(creature, player); } } + _passageEncounter++; + SaveToDB(); } - - if (!_passageGUIDs.empty()) - return; - - if (_passageEncounter < ENCOUNTER_PASSAGE_PHASE3) - { - if (Player* player = GetPassagePlayer(250.0f)) - { - if (_passageEncounter == ENCOUNTER_PASSAGE_PHASE1) - { - Position pos = {214.37f, -23.5f, 24.88f, 0.0f}; - if (Creature* creature = instance->SummonCreature(NPC_TEMPEST_KEEPER_DESTROYER, pos)) - DoSummonAction(creature, player); - } - else if (_passageEncounter == ENCOUNTER_PASSAGE_PHASE2) - { - for (uint8 i = 0; i < 3; ++i) - { - Position pos = {199.76f, -26.0f + 2.5f*i, 24.88f, 0.0f}; - if (Creature* creature = instance->SummonCreature(i==1 ? NPC_SUNSEEKER_ENGINEER : NPC_BLOODWARDER_PHYSICIAN, pos)) - DoSummonAction(creature, player); - } - } - _passageEncounter++; - SaveToDB(); - } - } - else - { - if (Player* player = GetPassagePlayer(148.0f)) - { - if (_passageEncounter == ENCOUNTER_PASSAGE_PHASE3) - { - for (uint8 i = 0; i < 3; ++i) - { - Position pos = {135.0f + 2.5f*i, 36.76f, 24.88f, M_PI*1.5f}; - if (Creature* creature = instance->SummonCreature(i==1 ? NPC_SUNSEEKER_ASTROMAGE : NPC_BLOODWARDER_PHYSICIAN, pos)) - DoSummonAction(creature, player); - } - } - else if (_passageEncounter == ENCOUNTER_PASSAGE_PHASE4) - { - Position pos = {137.62f, 62.23f, 24.88f, M_PI*1.5f}; - if (Creature* creature = instance->SummonCreature(NPC_TEMPEST_KEEPER_DESTROYER, pos)) - DoSummonAction(creature, player); - } - else if (_passageEncounter == ENCOUNTER_PASSAGE_PHASE5) - { - for (uint8 i = 0; i < 4; ++i) - { - Position pos = {133.0f + 3.5f*i, 92.88f, 26.38f, M_PI*1.5f}; - if (Creature* creature = instance->SummonCreature(i==1||i==2 ? NPC_SUNSEEKER_ASTROMAGE : NPC_SUNSEEKER_ENGINEER, pos)) - DoSummonAction(creature, player); - } - } - else if (_passageEncounter == ENCOUNTER_PASSAGE_PHASE6) - { - if (Creature* creature = instance->GetCreature(_pathaleonGUID)) - creature->AI()->DoAction(1); - } - _passageEncounter++; - SaveToDB(); - } - } - } - } - - bool SetBossState(uint32 type, EncounterState state) - { - if (!InstanceScript::SetBossState(type, state)) - return false; - - return true; - } - - std::string GetSaveData() - { - OUT_SAVE_INST_DATA; - - std::ostringstream saveStream; - // Xinef: no space needed - saveStream << "M E " << GetBossSaveData() << _passageEncounter; - - OUT_SAVE_INST_DATA_COMPLETE; - return saveStream.str(); - } - - void Load(const char* str) - { - 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 == 'M' && dataHead2 == 'E') - { - for (uint32 i = 0; i < MAX_ENCOUNTER; ++i) - { - uint32 tmpState; - loadStream >> tmpState; - if (tmpState == IN_PROGRESS || tmpState > SPECIAL) - tmpState = NOT_STARTED; - SetBossState(i, EncounterState(tmpState)); - } - - loadStream >> _passageEncounter; - if (_passageEncounter == ENCOUNTER_PASSAGE_DONE) - _passageEncounter = ENCOUNTER_PASSAGE_PHASE6; } else - OUT_LOAD_INST_DATA_FAIL; + { + if (Player* player = GetPassagePlayer(148.0f)) + { + if (_passageEncounter == ENCOUNTER_PASSAGE_PHASE3) + { + for (uint8 i = 0; i < 3; ++i) + { + Position pos = {135.0f + 2.5f * i, 36.76f, 24.88f, M_PI * 1.5f}; + if (Creature* creature = instance->SummonCreature(i == 1 ? NPC_SUNSEEKER_ASTROMAGE : NPC_BLOODWARDER_PHYSICIAN, pos)) + DoSummonAction(creature, player); + } + } + else if (_passageEncounter == ENCOUNTER_PASSAGE_PHASE4) + { + Position pos = {137.62f, 62.23f, 24.88f, M_PI * 1.5f}; + if (Creature* creature = instance->SummonCreature(NPC_TEMPEST_KEEPER_DESTROYER, pos)) + DoSummonAction(creature, player); + } + else if (_passageEncounter == ENCOUNTER_PASSAGE_PHASE5) + { + for (uint8 i = 0; i < 4; ++i) + { + Position pos = {133.0f + 3.5f * i, 92.88f, 26.38f, M_PI * 1.5f}; + if (Creature* creature = instance->SummonCreature(i == 1 || i == 2 ? NPC_SUNSEEKER_ASTROMAGE : NPC_SUNSEEKER_ENGINEER, pos)) + DoSummonAction(creature, player); + } + } + else if (_passageEncounter == ENCOUNTER_PASSAGE_PHASE6) + { + if (Creature* creature = instance->GetCreature(_pathaleonGUID)) + creature->AI()->DoAction(1); + } + _passageEncounter++; + SaveToDB(); + } + } + } + } - OUT_LOAD_INST_DATA_COMPLETE; + bool SetBossState(uint32 type, EncounterState state) + { + if (!InstanceScript::SetBossState(type, state)) + return false; + + return true; + } + + std::string GetSaveData() + { + OUT_SAVE_INST_DATA; + + std::ostringstream saveStream; + // Xinef: no space needed + saveStream << "M E " << GetBossSaveData() << _passageEncounter; + + OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); + } + + void Load(const char* str) + { + if (!str) + { + OUT_LOAD_INST_DATA_FAIL; + return; } - private: - uint64 _pathaleonGUID; - uint32 _passageTimer; - uint32 _passageEncounter; - std::set _passageGUIDs; - }; + OUT_LOAD_INST_DATA(str); - InstanceScript* GetInstanceScript(InstanceMap* map) const - { - return new instance_mechanar_InstanceMapScript(map); + char dataHead1, dataHead2; + + std::istringstream loadStream(str); + loadStream >> dataHead1 >> dataHead2; + + if (dataHead1 == 'M' && dataHead2 == 'E') + { + for (uint32 i = 0; i < MAX_ENCOUNTER; ++i) + { + uint32 tmpState; + loadStream >> tmpState; + if (tmpState == IN_PROGRESS || tmpState > SPECIAL) + tmpState = NOT_STARTED; + SetBossState(i, EncounterState(tmpState)); + } + + loadStream >> _passageEncounter; + if (_passageEncounter == ENCOUNTER_PASSAGE_DONE) + _passageEncounter = ENCOUNTER_PASSAGE_PHASE6; + } + else + OUT_LOAD_INST_DATA_FAIL; + + OUT_LOAD_INST_DATA_COMPLETE; } + + private: + uint64 _pathaleonGUID; + uint32 _passageTimer; + uint32 _passageEncounter; + std::set _passageGUIDs; + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_mechanar_InstanceMapScript(map); + } }; void AddSC_instance_mechanar() diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp index 206524559..5eb0d8e0c 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp @@ -61,181 +61,181 @@ enum MillhouseEvents class npc_millhouse_manastorm : public CreatureScript { - public: - npc_millhouse_manastorm() : CreatureScript("npc_millhouse_manastorm") { } +public: + npc_millhouse_manastorm() : CreatureScript("npc_millhouse_manastorm") { } - struct npc_millhouse_manastormAI : public ScriptedAI + struct npc_millhouse_manastormAI : public ScriptedAI + { + npc_millhouse_manastormAI(Creature* creature) : ScriptedAI(creature) { - npc_millhouse_manastormAI(Creature* creature) : ScriptedAI(creature) - { - instance = creature->GetInstanceScript(); - } - - InstanceScript* instance; - EventMap events; - EventMap events2; - - void InitializeAI() - { - ScriptedAI::InitializeAI(); - - me->SetReactState(REACT_PASSIVE); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); - events2.Reset(); - events2.ScheduleEvent(EVENT_TELEPORT_VISUAL, 0); - events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO1, 3000); - } - - void Reset() - { - events.Reset(); - } - - void AttackStart(Unit* who) - { - if (who && me->Attack(who, true)) - me->GetMotionMaster()->MoveChase(who, 20.0f); - } - - void KilledUnit(Unit* /*who*/) - { - Talk(SAY_KILL); - } - - void JustDied(Unit* /*killer*/) - { - Talk(SAY_DEATH); - } - - void EnterCombat(Unit*) - { - events.ScheduleEvent(EVENT_MILL_CHECK_HEALTH, 1000); - events.ScheduleEvent(EVENT_MILL_PYROBLAST, 30000); - events.ScheduleEvent(EVENT_MILL_BASE_SPELL, 2000); - events.ScheduleEvent(EVENT_MILL_ICEBLOCK, 1000); - } - - void UpdateAI(uint32 diff) - { - events2.Update(diff); - switch (events2.ExecuteEvent()) - { - case EVENT_TELEPORT_VISUAL: - me->CastSpell(me, SPELL_TELEPORT_VISUAL, true); - break; - case EVENT_MILLHOUSE_INTRO1: - Talk(SAY_INTRO_1); - events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO2, 18000); - break; - case EVENT_MILLHOUSE_INTRO2: - Talk(SAY_INTRO_2); - events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO3, 8000); - break; - case EVENT_MILLHOUSE_INTRO3: - Talk(SAY_INTRO_3); - events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO4, 6000); - break; - case EVENT_MILLHOUSE_INTRO4: - Talk(SAY_INTRO_4); - events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO5, 8000); - break; - case EVENT_MILLHOUSE_INTRO5: - Talk(SAY_WATER); - me->CastSpell(me, SPELL_CONJURE_WATER, false); - events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO6, 7000); - break; - case EVENT_MILLHOUSE_INTRO6: - Talk(SAY_BUFFS); - me->CastSpell(me, SPELL_ICE_ARMOR, false); - events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO7, 7000); - break; - case EVENT_MILLHOUSE_INTRO7: - Talk(SAY_DRINK); - me->CastSpell(me, SPELL_ARCANE_INTELLECT, false); - events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO8, 7000); - break; - case EVENT_MILLHOUSE_INTRO8: - Talk(SAY_READY); - me->GetMotionMaster()->MovePoint(1, 445.82f, -158.38f, 43.067f); - events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO9, 5000); - break; - case EVENT_MILLHOUSE_INTRO9: - me->SetFacingTo(M_PI*1.5f); - me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), M_PI*1.5f); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); - me->SetReactState(REACT_AGGRESSIVE); - events2.ScheduleEvent(EVENT_SEARCH_FIGHT, 1000); - break; - case EVENT_SEARCH_FIGHT: - if (!me->IsInCombat() && !me->IsInEvadeMode()) - if (Unit* target = me->SelectNearbyTarget(nullptr, 30.0f)) - AttackStart(target); - events2.ScheduleEvent(EVENT_SEARCH_FIGHT, 1000); - break; - - } - - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_MILL_CHECK_HEALTH: - if (HealthBelowPct(20)) - { - Talk(SAY_LOWHP); - break; - } - events.ScheduleEvent(EVENT_MILL_CHECK_HEALTH, 1000); - break; - case EVENT_MILL_PYROBLAST: - Talk(SAY_PYRO); - me->CastSpell(me->GetVictim(), SPELL_PYROBLAST, false); - events.ScheduleEvent(EVENT_MILL_PYROBLAST, 30000); - break; - case EVENT_MILL_ICEBLOCK: - if (me->GetDistance(me->GetVictim()) < 5.0f) - { - Talk(SAY_ICEBLOCK); - me->CastSpell(me, SPELL_ICEBLOCK, true); - break; - } - events.ScheduleEvent(EVENT_MILL_ICEBLOCK, 1000); - break; - case EVENT_MILL_BASE_SPELL: - switch (RAND(SPELL_FIREBALL, SPELL_ARCANE_MISSILES, SPELL_FROSTBOLT)) - { - case SPELL_FIREBALL: - me->CastSpell(me->GetVictim(), SPELL_FIREBALL, false); - events.ScheduleEvent(EVENT_MILL_BASE_SPELL, 4000); - break; - case SPELL_ARCANE_MISSILES: - me->CastSpell(me->GetVictim(), SPELL_ARCANE_MISSILES, false); - events.ScheduleEvent(EVENT_MILL_BASE_SPELL, 9000); - break; - case SPELL_FROSTBOLT: - me->CastSpell(me->GetVictim(), SPELL_FROSTBOLT, false); - events.ScheduleEvent(EVENT_MILL_BASE_SPELL, 4000); - break; - default: - break; - } - break; - - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_millhouse_manastormAI(creature); + instance = creature->GetInstanceScript(); } + + InstanceScript* instance; + EventMap events; + EventMap events2; + + void InitializeAI() + { + ScriptedAI::InitializeAI(); + + me->SetReactState(REACT_PASSIVE); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + events2.Reset(); + events2.ScheduleEvent(EVENT_TELEPORT_VISUAL, 0); + events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO1, 3000); + } + + void Reset() + { + events.Reset(); + } + + void AttackStart(Unit* who) + { + if (who && me->Attack(who, true)) + me->GetMotionMaster()->MoveChase(who, 20.0f); + } + + void KilledUnit(Unit* /*who*/) + { + Talk(SAY_KILL); + } + + void JustDied(Unit* /*killer*/) + { + Talk(SAY_DEATH); + } + + void EnterCombat(Unit*) + { + events.ScheduleEvent(EVENT_MILL_CHECK_HEALTH, 1000); + events.ScheduleEvent(EVENT_MILL_PYROBLAST, 30000); + events.ScheduleEvent(EVENT_MILL_BASE_SPELL, 2000); + events.ScheduleEvent(EVENT_MILL_ICEBLOCK, 1000); + } + + void UpdateAI(uint32 diff) + { + events2.Update(diff); + switch (events2.ExecuteEvent()) + { + case EVENT_TELEPORT_VISUAL: + me->CastSpell(me, SPELL_TELEPORT_VISUAL, true); + break; + case EVENT_MILLHOUSE_INTRO1: + Talk(SAY_INTRO_1); + events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO2, 18000); + break; + case EVENT_MILLHOUSE_INTRO2: + Talk(SAY_INTRO_2); + events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO3, 8000); + break; + case EVENT_MILLHOUSE_INTRO3: + Talk(SAY_INTRO_3); + events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO4, 6000); + break; + case EVENT_MILLHOUSE_INTRO4: + Talk(SAY_INTRO_4); + events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO5, 8000); + break; + case EVENT_MILLHOUSE_INTRO5: + Talk(SAY_WATER); + me->CastSpell(me, SPELL_CONJURE_WATER, false); + events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO6, 7000); + break; + case EVENT_MILLHOUSE_INTRO6: + Talk(SAY_BUFFS); + me->CastSpell(me, SPELL_ICE_ARMOR, false); + events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO7, 7000); + break; + case EVENT_MILLHOUSE_INTRO7: + Talk(SAY_DRINK); + me->CastSpell(me, SPELL_ARCANE_INTELLECT, false); + events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO8, 7000); + break; + case EVENT_MILLHOUSE_INTRO8: + Talk(SAY_READY); + me->GetMotionMaster()->MovePoint(1, 445.82f, -158.38f, 43.067f); + events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO9, 5000); + break; + case EVENT_MILLHOUSE_INTRO9: + me->SetFacingTo(M_PI * 1.5f); + me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), M_PI * 1.5f); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + me->SetReactState(REACT_AGGRESSIVE); + events2.ScheduleEvent(EVENT_SEARCH_FIGHT, 1000); + break; + case EVENT_SEARCH_FIGHT: + if (!me->IsInCombat() && !me->IsInEvadeMode()) + if (Unit* target = me->SelectNearbyTarget(nullptr, 30.0f)) + AttackStart(target); + events2.ScheduleEvent(EVENT_SEARCH_FIGHT, 1000); + break; + + } + + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_MILL_CHECK_HEALTH: + if (HealthBelowPct(20)) + { + Talk(SAY_LOWHP); + break; + } + events.ScheduleEvent(EVENT_MILL_CHECK_HEALTH, 1000); + break; + case EVENT_MILL_PYROBLAST: + Talk(SAY_PYRO); + me->CastSpell(me->GetVictim(), SPELL_PYROBLAST, false); + events.ScheduleEvent(EVENT_MILL_PYROBLAST, 30000); + break; + case EVENT_MILL_ICEBLOCK: + if (me->GetDistance(me->GetVictim()) < 5.0f) + { + Talk(SAY_ICEBLOCK); + me->CastSpell(me, SPELL_ICEBLOCK, true); + break; + } + events.ScheduleEvent(EVENT_MILL_ICEBLOCK, 1000); + break; + case EVENT_MILL_BASE_SPELL: + switch (RAND(SPELL_FIREBALL, SPELL_ARCANE_MISSILES, SPELL_FROSTBOLT)) + { + case SPELL_FIREBALL: + me->CastSpell(me->GetVictim(), SPELL_FIREBALL, false); + events.ScheduleEvent(EVENT_MILL_BASE_SPELL, 4000); + break; + case SPELL_ARCANE_MISSILES: + me->CastSpell(me->GetVictim(), SPELL_ARCANE_MISSILES, false); + events.ScheduleEvent(EVENT_MILL_BASE_SPELL, 9000); + break; + case SPELL_FROSTBOLT: + me->CastSpell(me->GetVictim(), SPELL_FROSTBOLT, false); + events.ScheduleEvent(EVENT_MILL_BASE_SPELL, 4000); + break; + default: + break; + } + break; + + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_millhouse_manastormAI(creature); + } }; enum WardenSays @@ -312,260 +312,260 @@ enum WardenEvents class npc_warden_mellichar : public CreatureScript { - public: - npc_warden_mellichar() : CreatureScript("npc_warden_mellichar") { } +public: + npc_warden_mellichar() : CreatureScript("npc_warden_mellichar") { } - struct npc_warden_mellicharAI : public BossAI + struct npc_warden_mellicharAI : public BossAI + { + npc_warden_mellicharAI(Creature* creature) : BossAI(creature, DATA_WARDEN_MELLICHAR) { - npc_warden_mellicharAI(Creature* creature) : BossAI(creature, DATA_WARDEN_MELLICHAR) - { - } - - void JustSummoned(Creature* summon) - { - summons.Summon(summon); - } - - void SummonedCreatureDies(Creature* summon, Unit*) - { - if (summon->GetEntry() == NPC_HARBINGER_SKYRISS) - { - Unit::Kill(me, me); - me->setActive(false); - instance->SetBossState(DATA_WARDEN_MELLICHAR, DONE); - if (Creature* creature = summons.GetCreatureWithEntry(NPC_MILLHOUSE)) - { - instance->DoCastSpellOnPlayers(SPELL_QID10886); - creature->AI()->Talk(SAY_COMPLETE); - creature->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - } - } - } - - void MoveInLineOfSight(Unit*) { } - void AttackStart(Unit*) { } - void EnterCombat(Unit*) { } - - void JustDied(Unit*) - { - me->setActive(false); - } - - void Reset() - { - _Reset(); - me->setActive(false); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); - me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); - me->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); - me->CastSpell((Unit*)NULL, SPELL_TARGET_OMEGA, false); - instance->HandleGameObject(instance->GetData64(DATA_WARDENS_SHIELD), true); - instance->SetBossState(DATA_WARDEN_MELLICHAR, NOT_STARTED); - - } - - void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType, SpellSchoolMask) - { - if (attacker && IS_PLAYER_GUID(attacker->GetCharmerOrOwnerOrOwnGUID()) && damage > 0 && !me->isActiveObject()) - { - me->setActive(true); - me->InterruptNonMeleeSpells(false); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); - events.ScheduleEvent(EVENT_WARDEN_INTRO1, 1500); - events.ScheduleEvent(EVENT_WARDEN_CHECK_PLAYERS, 1000); - instance->SetBossState(DATA_WARDEN_MELLICHAR, IN_PROGRESS); - } - damage = 0; - } - - void SetData(uint32 type, uint32 data) - { - if (data == FAIL) - { - CreatureAI::EnterEvadeMode(); - return; - } - if (data != DONE) - return; - - switch (type) - { - case DATA_WARDEN_1: - events.ScheduleEvent(EVENT_WARDEN_INTRO8, 2000); - break; - case DATA_WARDEN_3: - events.ScheduleEvent(EVENT_WARDEN_INTRO19, 2000); - break; - case DATA_WARDEN_4: - events.ScheduleEvent(EVENT_WARDEN_INTRO24, 2000); - break; - } - } - - void UpdateAI(uint32 diff) - { - events.Update(diff); - switch (events.ExecuteEvent()) - { - case EVENT_WARDEN_CHECK_PLAYERS: - if (!SelectTargetFromPlayerList(100.0f)) - { - CreatureAI::EnterEvadeMode(); - return; - } - events.ScheduleEvent(EVENT_WARDEN_CHECK_PLAYERS, 1000); - break; - case EVENT_WARDEN_INTRO1: - Talk(YELL_INTRO1); - me->SetFacingTo(M_PI/2.0f); - me->CastSpell(me, SPELL_BUBBLE_VISUAL, false); - events.ScheduleEvent(EVENT_WARDEN_INTRO2, 1400); - break; - case EVENT_WARDEN_INTRO2: - instance->HandleGameObject(instance->GetData64(DATA_WARDENS_SHIELD), false); - events.ScheduleEvent(EVENT_WARDEN_INTRO3, 20000); - break; - case EVENT_WARDEN_INTRO3: - Talk(YELL_INTRO2); - events.ScheduleEvent(EVENT_WARDEN_INTRO4, 5000); - break; - case EVENT_WARDEN_INTRO4: - me->SetFacingTo(0.5f); - me->CastSpell((Unit*)NULL, SPELL_TARGET_ALPHA, false); - events.ScheduleEvent(EVENT_WARDEN_INTRO5, 2000); - break; - case EVENT_WARDEN_INTRO5: - instance->SetData(DATA_WARDEN_1, IN_PROGRESS); - events.ScheduleEvent(EVENT_WARDEN_INTRO6, 3000); - break; - case EVENT_WARDEN_INTRO6: - me->SetFacingTo(M_PI*1.5f); - me->CastSpell((Unit*)NULL, SPELL_TARGET_OMEGA, false); - events.ScheduleEvent(EVENT_WARDEN_INTRO7, 5000); - break; - case EVENT_WARDEN_INTRO7: - me->SummonCreature(RAND(NPC_TRICKSTER, NPC_PH_HUNTER), 478.326f, -148.505f, 42.56f, 3.19f, TEMPSUMMON_MANUAL_DESPAWN); - // Wait for kill - break; - case EVENT_WARDEN_INTRO8: - Talk(YELL_RELEASE1); - me->InterruptNonMeleeSpells(false); - me->SetFacingTo(2.6f); - events.ScheduleEvent(EVENT_WARDEN_INTRO10, 4000); - break; - case EVENT_WARDEN_INTRO10: - me->CastSpell((Unit*)NULL, SPELL_TARGET_BETA, false); - events.ScheduleEvent(EVENT_WARDEN_INTRO11, 2000); - break; - case EVENT_WARDEN_INTRO11: - Talk(YELL_RELEASE2A); - instance->SetData(DATA_WARDEN_2, IN_PROGRESS); - events.ScheduleEvent(EVENT_WARDEN_INTRO12, 2000); - break; - case EVENT_WARDEN_INTRO12: - me->SetFacingTo(M_PI*1.5f); - me->CastSpell((Unit*)NULL, SPELL_TARGET_OMEGA, false); - events.ScheduleEvent(EVENT_WARDEN_INTRO13, 6000); - break; - case EVENT_WARDEN_INTRO13: - me->SummonCreature(NPC_MILLHOUSE, 413.292f, -148.378f, 42.56f, 6.27f, TEMPSUMMON_MANUAL_DESPAWN); - events.ScheduleEvent(EVENT_WARDEN_INTRO14, 14000); - break; - case EVENT_WARDEN_INTRO14: - Talk(YELL_RELEASE2B); - me->InterruptNonMeleeSpells(false); - me->SetFacingTo(3.3f); - events.ScheduleEvent(EVENT_WARDEN_INTRO15, 5000); - break; - case EVENT_WARDEN_INTRO15: - me->CastSpell((Unit*)NULL, SPELL_TARGET_DELTA, false); - events.ScheduleEvent(EVENT_WARDEN_INTRO16, 2000); - break; - case EVENT_WARDEN_INTRO16: - instance->SetData(DATA_WARDEN_3, IN_PROGRESS); - events.ScheduleEvent(EVENT_WARDEN_INTRO17, 2000); - break; - case EVENT_WARDEN_INTRO17: - me->SetFacingTo(M_PI*1.5f); - me->CastSpell((Unit*)NULL, SPELL_TARGET_OMEGA, false); - events.ScheduleEvent(EVENT_WARDEN_INTRO18, 6000); - break; - case EVENT_WARDEN_INTRO18: - me->SummonCreature(RAND(NPC_AKKIRIS, NPC_SULFURON), 420.179f, -174.396f, 42.58f, 0.02f, TEMPSUMMON_MANUAL_DESPAWN); - // Wait for kill - break; - case EVENT_WARDEN_INTRO19: - Talk(YELL_RELEASE3); - me->InterruptNonMeleeSpells(false); - me->SetFacingTo(6.05f); - events.ScheduleEvent(EVENT_WARDEN_INTRO20, 4000); - break; - case EVENT_WARDEN_INTRO20: - me->CastSpell((Unit*)NULL, SPELL_TARGET_GAMMA, false); - events.ScheduleEvent(EVENT_WARDEN_INTRO21, 2000); - break; - case EVENT_WARDEN_INTRO21: - instance->SetData(DATA_WARDEN_4, IN_PROGRESS); - events.ScheduleEvent(EVENT_WARDEN_INTRO22, 2000); - break; - case EVENT_WARDEN_INTRO22: - me->SetFacingTo(M_PI*1.5f); - me->CastSpell((Unit*)NULL, SPELL_TARGET_OMEGA, false); - events.ScheduleEvent(EVENT_WARDEN_INTRO23, 6000); - break; - case EVENT_WARDEN_INTRO23: - me->SummonCreature(RAND(NPC_TW_DRAK, NPC_BL_DRAK), 471.795f, -174.58f, 42.58f, 3.06f, TEMPSUMMON_MANUAL_DESPAWN); - // Wait for kill - break; - case EVENT_WARDEN_INTRO24: - instance->SetData(DATA_WARDEN_5, IN_PROGRESS); - Talk(YELL_RELEASE4); - me->InterruptNonMeleeSpells(false); - events.ScheduleEvent(EVENT_WARDEN_INTRO25, 8000); - break; - case EVENT_WARDEN_INTRO25: - if (Creature* cr = me->SummonCreature(NPC_HARBINGER_SKYRISS, 445.763f, -191.639f, 44.64f, 1.60f, TEMPSUMMON_MANUAL_DESPAWN)) - { - cr->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); - cr->CastSpell(cr, SPELL_TELEPORT_VISUAL, true); - } - events.ScheduleEvent(EVENT_WARDEN_INTRO26, 1000); - break; - case EVENT_WARDEN_INTRO26: - if (Creature* creature = summons.GetCreatureWithEntry(NPC_HARBINGER_SKYRISS)) - creature->AI()->Talk(SAY_HARBINGER_INTRO); - events.ScheduleEvent(EVENT_WARDEN_INTRO27, 23000); - break; - case EVENT_WARDEN_INTRO27: - Talk(YELL_WELCOME); - events.ScheduleEvent(EVENT_WARDEN_INTRO28, 5000); - break; - case EVENT_WARDEN_INTRO28: - instance->HandleGameObject(instance->GetData64(DATA_WARDENS_SHIELD), true); - if (Creature* creature = summons.GetCreatureWithEntry(NPC_HARBINGER_SKYRISS)) - creature->CastSpell((Unit*)NULL, SPELL_MIND_REND, false); - events.ScheduleEvent(EVENT_WARDEN_INTRO29, 4000); - break; - - case EVENT_WARDEN_INTRO29: - events.Reset(); - me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); - me->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); - if (Creature* creature = summons.GetCreatureWithEntry(NPC_HARBINGER_SKYRISS)) - { - creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); - if (Player* player = SelectTargetFromPlayerList(50.0f)) - AttackStart(player); - } - break; - } - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_warden_mellicharAI(creature); } + + void JustSummoned(Creature* summon) + { + summons.Summon(summon); + } + + void SummonedCreatureDies(Creature* summon, Unit*) + { + if (summon->GetEntry() == NPC_HARBINGER_SKYRISS) + { + Unit::Kill(me, me); + me->setActive(false); + instance->SetBossState(DATA_WARDEN_MELLICHAR, DONE); + if (Creature* creature = summons.GetCreatureWithEntry(NPC_MILLHOUSE)) + { + instance->DoCastSpellOnPlayers(SPELL_QID10886); + creature->AI()->Talk(SAY_COMPLETE); + creature->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + } + } + } + + void MoveInLineOfSight(Unit*) { } + void AttackStart(Unit*) { } + void EnterCombat(Unit*) { } + + void JustDied(Unit*) + { + me->setActive(false); + } + + void Reset() + { + _Reset(); + me->setActive(false); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); + me->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); + me->CastSpell((Unit*)NULL, SPELL_TARGET_OMEGA, false); + instance->HandleGameObject(instance->GetData64(DATA_WARDENS_SHIELD), true); + instance->SetBossState(DATA_WARDEN_MELLICHAR, NOT_STARTED); + + } + + void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType, SpellSchoolMask) + { + if (attacker && IS_PLAYER_GUID(attacker->GetCharmerOrOwnerOrOwnGUID()) && damage > 0 && !me->isActiveObject()) + { + me->setActive(true); + me->InterruptNonMeleeSpells(false); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + events.ScheduleEvent(EVENT_WARDEN_INTRO1, 1500); + events.ScheduleEvent(EVENT_WARDEN_CHECK_PLAYERS, 1000); + instance->SetBossState(DATA_WARDEN_MELLICHAR, IN_PROGRESS); + } + damage = 0; + } + + void SetData(uint32 type, uint32 data) + { + if (data == FAIL) + { + CreatureAI::EnterEvadeMode(); + return; + } + if (data != DONE) + return; + + switch (type) + { + case DATA_WARDEN_1: + events.ScheduleEvent(EVENT_WARDEN_INTRO8, 2000); + break; + case DATA_WARDEN_3: + events.ScheduleEvent(EVENT_WARDEN_INTRO19, 2000); + break; + case DATA_WARDEN_4: + events.ScheduleEvent(EVENT_WARDEN_INTRO24, 2000); + break; + } + } + + void UpdateAI(uint32 diff) + { + events.Update(diff); + switch (events.ExecuteEvent()) + { + case EVENT_WARDEN_CHECK_PLAYERS: + if (!SelectTargetFromPlayerList(100.0f)) + { + CreatureAI::EnterEvadeMode(); + return; + } + events.ScheduleEvent(EVENT_WARDEN_CHECK_PLAYERS, 1000); + break; + case EVENT_WARDEN_INTRO1: + Talk(YELL_INTRO1); + me->SetFacingTo(M_PI / 2.0f); + me->CastSpell(me, SPELL_BUBBLE_VISUAL, false); + events.ScheduleEvent(EVENT_WARDEN_INTRO2, 1400); + break; + case EVENT_WARDEN_INTRO2: + instance->HandleGameObject(instance->GetData64(DATA_WARDENS_SHIELD), false); + events.ScheduleEvent(EVENT_WARDEN_INTRO3, 20000); + break; + case EVENT_WARDEN_INTRO3: + Talk(YELL_INTRO2); + events.ScheduleEvent(EVENT_WARDEN_INTRO4, 5000); + break; + case EVENT_WARDEN_INTRO4: + me->SetFacingTo(0.5f); + me->CastSpell((Unit*)NULL, SPELL_TARGET_ALPHA, false); + events.ScheduleEvent(EVENT_WARDEN_INTRO5, 2000); + break; + case EVENT_WARDEN_INTRO5: + instance->SetData(DATA_WARDEN_1, IN_PROGRESS); + events.ScheduleEvent(EVENT_WARDEN_INTRO6, 3000); + break; + case EVENT_WARDEN_INTRO6: + me->SetFacingTo(M_PI * 1.5f); + me->CastSpell((Unit*)NULL, SPELL_TARGET_OMEGA, false); + events.ScheduleEvent(EVENT_WARDEN_INTRO7, 5000); + break; + case EVENT_WARDEN_INTRO7: + me->SummonCreature(RAND(NPC_TRICKSTER, NPC_PH_HUNTER), 478.326f, -148.505f, 42.56f, 3.19f, TEMPSUMMON_MANUAL_DESPAWN); + // Wait for kill + break; + case EVENT_WARDEN_INTRO8: + Talk(YELL_RELEASE1); + me->InterruptNonMeleeSpells(false); + me->SetFacingTo(2.6f); + events.ScheduleEvent(EVENT_WARDEN_INTRO10, 4000); + break; + case EVENT_WARDEN_INTRO10: + me->CastSpell((Unit*)NULL, SPELL_TARGET_BETA, false); + events.ScheduleEvent(EVENT_WARDEN_INTRO11, 2000); + break; + case EVENT_WARDEN_INTRO11: + Talk(YELL_RELEASE2A); + instance->SetData(DATA_WARDEN_2, IN_PROGRESS); + events.ScheduleEvent(EVENT_WARDEN_INTRO12, 2000); + break; + case EVENT_WARDEN_INTRO12: + me->SetFacingTo(M_PI * 1.5f); + me->CastSpell((Unit*)NULL, SPELL_TARGET_OMEGA, false); + events.ScheduleEvent(EVENT_WARDEN_INTRO13, 6000); + break; + case EVENT_WARDEN_INTRO13: + me->SummonCreature(NPC_MILLHOUSE, 413.292f, -148.378f, 42.56f, 6.27f, TEMPSUMMON_MANUAL_DESPAWN); + events.ScheduleEvent(EVENT_WARDEN_INTRO14, 14000); + break; + case EVENT_WARDEN_INTRO14: + Talk(YELL_RELEASE2B); + me->InterruptNonMeleeSpells(false); + me->SetFacingTo(3.3f); + events.ScheduleEvent(EVENT_WARDEN_INTRO15, 5000); + break; + case EVENT_WARDEN_INTRO15: + me->CastSpell((Unit*)NULL, SPELL_TARGET_DELTA, false); + events.ScheduleEvent(EVENT_WARDEN_INTRO16, 2000); + break; + case EVENT_WARDEN_INTRO16: + instance->SetData(DATA_WARDEN_3, IN_PROGRESS); + events.ScheduleEvent(EVENT_WARDEN_INTRO17, 2000); + break; + case EVENT_WARDEN_INTRO17: + me->SetFacingTo(M_PI * 1.5f); + me->CastSpell((Unit*)NULL, SPELL_TARGET_OMEGA, false); + events.ScheduleEvent(EVENT_WARDEN_INTRO18, 6000); + break; + case EVENT_WARDEN_INTRO18: + me->SummonCreature(RAND(NPC_AKKIRIS, NPC_SULFURON), 420.179f, -174.396f, 42.58f, 0.02f, TEMPSUMMON_MANUAL_DESPAWN); + // Wait for kill + break; + case EVENT_WARDEN_INTRO19: + Talk(YELL_RELEASE3); + me->InterruptNonMeleeSpells(false); + me->SetFacingTo(6.05f); + events.ScheduleEvent(EVENT_WARDEN_INTRO20, 4000); + break; + case EVENT_WARDEN_INTRO20: + me->CastSpell((Unit*)NULL, SPELL_TARGET_GAMMA, false); + events.ScheduleEvent(EVENT_WARDEN_INTRO21, 2000); + break; + case EVENT_WARDEN_INTRO21: + instance->SetData(DATA_WARDEN_4, IN_PROGRESS); + events.ScheduleEvent(EVENT_WARDEN_INTRO22, 2000); + break; + case EVENT_WARDEN_INTRO22: + me->SetFacingTo(M_PI * 1.5f); + me->CastSpell((Unit*)NULL, SPELL_TARGET_OMEGA, false); + events.ScheduleEvent(EVENT_WARDEN_INTRO23, 6000); + break; + case EVENT_WARDEN_INTRO23: + me->SummonCreature(RAND(NPC_TW_DRAK, NPC_BL_DRAK), 471.795f, -174.58f, 42.58f, 3.06f, TEMPSUMMON_MANUAL_DESPAWN); + // Wait for kill + break; + case EVENT_WARDEN_INTRO24: + instance->SetData(DATA_WARDEN_5, IN_PROGRESS); + Talk(YELL_RELEASE4); + me->InterruptNonMeleeSpells(false); + events.ScheduleEvent(EVENT_WARDEN_INTRO25, 8000); + break; + case EVENT_WARDEN_INTRO25: + if (Creature* cr = me->SummonCreature(NPC_HARBINGER_SKYRISS, 445.763f, -191.639f, 44.64f, 1.60f, TEMPSUMMON_MANUAL_DESPAWN)) + { + cr->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + cr->CastSpell(cr, SPELL_TELEPORT_VISUAL, true); + } + events.ScheduleEvent(EVENT_WARDEN_INTRO26, 1000); + break; + case EVENT_WARDEN_INTRO26: + if (Creature* creature = summons.GetCreatureWithEntry(NPC_HARBINGER_SKYRISS)) + creature->AI()->Talk(SAY_HARBINGER_INTRO); + events.ScheduleEvent(EVENT_WARDEN_INTRO27, 23000); + break; + case EVENT_WARDEN_INTRO27: + Talk(YELL_WELCOME); + events.ScheduleEvent(EVENT_WARDEN_INTRO28, 5000); + break; + case EVENT_WARDEN_INTRO28: + instance->HandleGameObject(instance->GetData64(DATA_WARDENS_SHIELD), true); + if (Creature* creature = summons.GetCreatureWithEntry(NPC_HARBINGER_SKYRISS)) + creature->CastSpell((Unit*)NULL, SPELL_MIND_REND, false); + events.ScheduleEvent(EVENT_WARDEN_INTRO29, 4000); + break; + + case EVENT_WARDEN_INTRO29: + events.Reset(); + me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); + me->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); + if (Creature* creature = summons.GetCreatureWithEntry(NPC_HARBINGER_SKYRISS)) + { + creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + if (Player* player = SelectTargetFromPlayerList(50.0f)) + AttackStart(player); + } + break; + } + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_warden_mellicharAI(creature); + } }; class spell_arcatraz_soul_steal : public SpellScriptLoader @@ -576,7 +576,7 @@ public: class spell_arcatraz_soul_steal_AuraScript : public AuraScript { PrepareAuraScript(spell_arcatraz_soul_steal_AuraScript) - + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { if (Unit* caster = GetCaster()) diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp index 8be221d4f..940d0aacc 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp @@ -42,127 +42,127 @@ enum Events class boss_dalliah_the_doomsayer : public CreatureScript { - public: - boss_dalliah_the_doomsayer() : CreatureScript("boss_dalliah_the_doomsayer") { } +public: + boss_dalliah_the_doomsayer() : CreatureScript("boss_dalliah_the_doomsayer") { } - struct boss_dalliah_the_doomsayerAI : public BossAI + struct boss_dalliah_the_doomsayerAI : public BossAI + { + boss_dalliah_the_doomsayerAI(Creature* creature) : BossAI(creature, DATA_DALLIAH) { } + + void Reset() { - boss_dalliah_the_doomsayerAI(Creature* creature) : BossAI(creature, DATA_DALLIAH) { } - - void Reset() - { - _Reset(); - events2.Reset(); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); - } - - void InitializeAI() - { - BossAI::InitializeAI(); - if (instance->GetBossState(DATA_SOCCOTHRATES) != DONE) - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); - } - - void JustDied(Unit* /*killer*/) - { - _JustDied(); - Talk(SAY_DEATH); - - if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SOCCOTHRATES))) - if (soccothrates->IsAlive() && !soccothrates->IsInCombat()) - soccothrates->AI()->SetData(1, 1); - } - - void EnterCombat(Unit* /*who*/) - { - _EnterCombat(); - Talk(SAY_AGGRO); - - events.ScheduleEvent(EVENT_GIFT_OF_THE_DOOMSAYER, urand(1000, 4000)); - events.ScheduleEvent(EVENT_WHIRLWIND, urand(7000, 9000)); - events.ScheduleEvent(EVENT_ME_FIRST, 6000); - events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); - - if (IsHeroic()) - events.ScheduleEvent(EVENT_SHADOW_WAVE, urand(11000, 16000)); - } - - void KilledUnit(Unit* victim) - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_SLAY); - } - - void SetData(uint32 /*type*/, uint32 data) - { - if (data == 1) - events2.ScheduleEvent(EVENT_SOCCOTHRATES_DEATH, 6000); - } - - void UpdateAI(uint32 diff) - { - events2.Update(diff); - switch (events2.ExecuteEvent()) - { - case EVENT_SOCCOTHRATES_DEATH: - Talk(SAY_SOCCOTHRATES_DEATH); - break; - } - - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_GIFT_OF_THE_DOOMSAYER: - me->CastSpell(me->GetVictim(), SPELL_GIFT_OF_THE_DOOMSAYER, false); - events.ScheduleEvent(EVENT_GIFT_OF_THE_DOOMSAYER, urand(16000, 21000)); - break; - case EVENT_WHIRLWIND: - me->CastSpell(me, SPELL_WHIRLWIND, false); - Talk(SAY_WHIRLWIND); - events.ScheduleEvent(EVENT_WHIRLWIND, urand(19000, 21000)); - events.ScheduleEvent(EVENT_HEAL, 6000); - break; - case EVENT_HEAL: - me->CastSpell(me, SPELL_HEAL, false); - Talk(SAY_HEAL); - break; - case EVENT_SHADOW_WAVE: - me->CastSpell(me->GetVictim(), SPELL_SHADOW_WAVE, false); - events.ScheduleEvent(EVENT_SHADOW_WAVE, urand(11000, 16000)); - break; - case EVENT_ME_FIRST: - if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SOCCOTHRATES))) - if (soccothrates->IsAlive() && !soccothrates->IsInCombat()) - soccothrates->AI()->Talk(SAY_AGGRO_DALLIAH_FIRST); - break; - case EVENT_CHECK_HEALTH: - if (HealthBelowPct(25)) - { - if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SOCCOTHRATES))) - soccothrates->AI()->Talk(SAY_DALLIAH_25_PERCENT); - break; - } - events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); - break; - } - - DoMeleeAttackIfReady(); - } - - private: - EventMap events2; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_dalliah_the_doomsayerAI(creature); + _Reset(); + events2.Reset(); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); } + + void InitializeAI() + { + BossAI::InitializeAI(); + if (instance->GetBossState(DATA_SOCCOTHRATES) != DONE) + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + } + + void JustDied(Unit* /*killer*/) + { + _JustDied(); + Talk(SAY_DEATH); + + if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SOCCOTHRATES))) + if (soccothrates->IsAlive() && !soccothrates->IsInCombat()) + soccothrates->AI()->SetData(1, 1); + } + + void EnterCombat(Unit* /*who*/) + { + _EnterCombat(); + Talk(SAY_AGGRO); + + events.ScheduleEvent(EVENT_GIFT_OF_THE_DOOMSAYER, urand(1000, 4000)); + events.ScheduleEvent(EVENT_WHIRLWIND, urand(7000, 9000)); + events.ScheduleEvent(EVENT_ME_FIRST, 6000); + events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); + + if (IsHeroic()) + events.ScheduleEvent(EVENT_SHADOW_WAVE, urand(11000, 16000)); + } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + + void SetData(uint32 /*type*/, uint32 data) + { + if (data == 1) + events2.ScheduleEvent(EVENT_SOCCOTHRATES_DEATH, 6000); + } + + void UpdateAI(uint32 diff) + { + events2.Update(diff); + switch (events2.ExecuteEvent()) + { + case EVENT_SOCCOTHRATES_DEATH: + Talk(SAY_SOCCOTHRATES_DEATH); + break; + } + + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_GIFT_OF_THE_DOOMSAYER: + me->CastSpell(me->GetVictim(), SPELL_GIFT_OF_THE_DOOMSAYER, false); + events.ScheduleEvent(EVENT_GIFT_OF_THE_DOOMSAYER, urand(16000, 21000)); + break; + case EVENT_WHIRLWIND: + me->CastSpell(me, SPELL_WHIRLWIND, false); + Talk(SAY_WHIRLWIND); + events.ScheduleEvent(EVENT_WHIRLWIND, urand(19000, 21000)); + events.ScheduleEvent(EVENT_HEAL, 6000); + break; + case EVENT_HEAL: + me->CastSpell(me, SPELL_HEAL, false); + Talk(SAY_HEAL); + break; + case EVENT_SHADOW_WAVE: + me->CastSpell(me->GetVictim(), SPELL_SHADOW_WAVE, false); + events.ScheduleEvent(EVENT_SHADOW_WAVE, urand(11000, 16000)); + break; + case EVENT_ME_FIRST: + if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SOCCOTHRATES))) + if (soccothrates->IsAlive() && !soccothrates->IsInCombat()) + soccothrates->AI()->Talk(SAY_AGGRO_DALLIAH_FIRST); + break; + case EVENT_CHECK_HEALTH: + if (HealthBelowPct(25)) + { + if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SOCCOTHRATES))) + soccothrates->AI()->Talk(SAY_DALLIAH_25_PERCENT); + break; + } + events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); + break; + } + + DoMeleeAttackIfReady(); + } + + private: + EventMap events2; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_dalliah_the_doomsayerAI(creature); + } }; void AddSC_boss_dalliah_the_doomsayer() diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp index 13f515831..12c245f0a 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp @@ -44,127 +44,127 @@ enum Misc class boss_harbinger_skyriss : public CreatureScript { - public: - boss_harbinger_skyriss() : CreatureScript("boss_harbinger_skyriss") { } +public: + boss_harbinger_skyriss() : CreatureScript("boss_harbinger_skyriss") { } - struct boss_harbinger_skyrissAI : public ScriptedAI + struct boss_harbinger_skyrissAI : public ScriptedAI + { + boss_harbinger_skyrissAI(Creature* creature) : ScriptedAI(creature), summons(me) { - boss_harbinger_skyrissAI(Creature* creature) : ScriptedAI(creature), summons(me) - { - instance = creature->GetInstanceScript(); - } - - InstanceScript* instance; - SummonList summons; - EventMap events; - - void Reset() - { - events.Reset(); - summons.DespawnAll(); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); - } - - void EnterCombat(Unit* /*who*/) - { - Talk(SAY_AGGRO); - me->SetInCombatWithZone(); - - events.ScheduleEvent(EVENT_SUMMON_IMAGE1, 1000); - events.ScheduleEvent(EVENT_SUMMON_IMAGE2, 1000); - events.ScheduleEvent(EVENT_SPELL_MIND_REND, 10000); - events.ScheduleEvent(EVENT_SPELL_FEAR, 15000); - events.ScheduleEvent(EVENT_SPELL_DOMINATION, 30000); - if (IsHeroic()) - events.ScheduleEvent(EVENT_SPELL_MANA_BURN, 25000); - } - - void JustDied(Unit* /*killer*/) - { - Talk(SAY_DEATH); - summons.DespawnAll(); - } - - void JustSummoned(Creature* summon) - { - summon->SetHealth(summon->CountPctFromMaxHealth(summon->GetEntry() == NPC_HARBINGER_SKYRISS_66 ? 66 : 33)); - summons.Summon(summon); - summon->SetInCombatWithZone(); - me->UpdatePosition(*summon, true); - me->SendMovementFlagUpdate(); - } - - void KilledUnit(Unit* victim) - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_KILL); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SUMMON_IMAGE1: - if (HealthBelowPct(67)) - { - Talk(SAY_IMAGE); - me->CastSpell(me, SPELL_66_ILLUSION, false); - break; - } - events.ScheduleEvent(EVENT_SUMMON_IMAGE1, 1000); - break; - case EVENT_SUMMON_IMAGE2: - if (HealthBelowPct(34)) - { - Talk(SAY_IMAGE); - me->CastSpell(me, SPELL_33_ILLUSION, false); - break; - } - events.ScheduleEvent(EVENT_SUMMON_IMAGE2, 1000); - break; - case EVENT_SPELL_MIND_REND: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f)) - me->CastSpell(target, SPELL_MIND_REND, false); - events.ScheduleEvent(EVENT_SPELL_MIND_REND, 10000); - break; - case EVENT_SPELL_FEAR: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 20.0f)) - { - Talk(SAY_FEAR); - me->CastSpell(target, SPELL_FEAR, false); - } - events.ScheduleEvent(EVENT_SPELL_FEAR, 25000); - break; - case EVENT_SPELL_DOMINATION: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 30.0f)) - { - Talk(SAY_MIND); - me->CastSpell(target, SPELL_DOMINATION, false); - } - events.ScheduleEvent(EVENT_SPELL_DOMINATION, 30000); - break; - case EVENT_SPELL_MANA_BURN: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, PowerUsersSelector(me, POWER_MANA, 40.0f, false))) - me->CastSpell(target, SPELL_MANA_BURN, false); - events.ScheduleEvent(EVENT_SPELL_MANA_BURN, 30000); - break; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_harbinger_skyrissAI(creature); + instance = creature->GetInstanceScript(); } + + InstanceScript* instance; + SummonList summons; + EventMap events; + + void Reset() + { + events.Reset(); + summons.DespawnAll(); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + } + + void EnterCombat(Unit* /*who*/) + { + Talk(SAY_AGGRO); + me->SetInCombatWithZone(); + + events.ScheduleEvent(EVENT_SUMMON_IMAGE1, 1000); + events.ScheduleEvent(EVENT_SUMMON_IMAGE2, 1000); + events.ScheduleEvent(EVENT_SPELL_MIND_REND, 10000); + events.ScheduleEvent(EVENT_SPELL_FEAR, 15000); + events.ScheduleEvent(EVENT_SPELL_DOMINATION, 30000); + if (IsHeroic()) + events.ScheduleEvent(EVENT_SPELL_MANA_BURN, 25000); + } + + void JustDied(Unit* /*killer*/) + { + Talk(SAY_DEATH); + summons.DespawnAll(); + } + + void JustSummoned(Creature* summon) + { + summon->SetHealth(summon->CountPctFromMaxHealth(summon->GetEntry() == NPC_HARBINGER_SKYRISS_66 ? 66 : 33)); + summons.Summon(summon); + summon->SetInCombatWithZone(); + me->UpdatePosition(*summon, true); + me->SendMovementFlagUpdate(); + } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_KILL); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_SUMMON_IMAGE1: + if (HealthBelowPct(67)) + { + Talk(SAY_IMAGE); + me->CastSpell(me, SPELL_66_ILLUSION, false); + break; + } + events.ScheduleEvent(EVENT_SUMMON_IMAGE1, 1000); + break; + case EVENT_SUMMON_IMAGE2: + if (HealthBelowPct(34)) + { + Talk(SAY_IMAGE); + me->CastSpell(me, SPELL_33_ILLUSION, false); + break; + } + events.ScheduleEvent(EVENT_SUMMON_IMAGE2, 1000); + break; + case EVENT_SPELL_MIND_REND: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f)) + me->CastSpell(target, SPELL_MIND_REND, false); + events.ScheduleEvent(EVENT_SPELL_MIND_REND, 10000); + break; + case EVENT_SPELL_FEAR: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 20.0f)) + { + Talk(SAY_FEAR); + me->CastSpell(target, SPELL_FEAR, false); + } + events.ScheduleEvent(EVENT_SPELL_FEAR, 25000); + break; + case EVENT_SPELL_DOMINATION: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 30.0f)) + { + Talk(SAY_MIND); + me->CastSpell(target, SPELL_DOMINATION, false); + } + events.ScheduleEvent(EVENT_SPELL_DOMINATION, 30000); + break; + case EVENT_SPELL_MANA_BURN: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, PowerUsersSelector(me, POWER_MANA, 40.0f, false))) + me->CastSpell(target, SPELL_MANA_BURN, false); + events.ScheduleEvent(EVENT_SPELL_MANA_BURN, 30000); + break; + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_harbinger_skyrissAI(creature); + } }; void AddSC_boss_harbinger_skyriss() diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp index b0532bd72..443113e58 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp @@ -59,191 +59,191 @@ enum Events class boss_wrath_scryer_soccothrates : public CreatureScript { - public: - boss_wrath_scryer_soccothrates() : CreatureScript("boss_wrath_scryer_soccothrates") { } +public: + boss_wrath_scryer_soccothrates() : CreatureScript("boss_wrath_scryer_soccothrates") { } - struct boss_wrath_scryer_soccothratesAI : public BossAI + struct boss_wrath_scryer_soccothratesAI : public BossAI + { + boss_wrath_scryer_soccothratesAI(Creature* creature) : BossAI(creature, DATA_SOCCOTHRATES) { - boss_wrath_scryer_soccothratesAI(Creature* creature) : BossAI(creature, DATA_SOCCOTHRATES) - { - preFight = instance->GetBossState(DATA_DALLIAH) == DONE; - } - - void Reset() - { - _Reset(); - events2.Reset(); - me->CastSpell(me, SPELL_FEL_IMMOLATION, true); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); - } - - void InitializeAI() - { - BossAI::InitializeAI(); - if (!preFight) - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); - } - - void JustDied(Unit* /*killer*/) - { - _JustDied(); - Talk(SAY_DEATH); - - if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH))) - if (dalliah->IsAlive() && !dalliah->IsInCombat()) - dalliah->AI()->SetData(1, 1); - } - - void EnterCombat(Unit* /*who*/) - { - _EnterCombat(); - events2.Reset(); - events.ScheduleEvent(EVENT_FELFIRE_SHOCK, urand(12000, 14000)); - events.ScheduleEvent(EVENT_KNOCK_AWAY, urand(11000, 12000)); - events.ScheduleEvent(EVENT_ME_FIRST, 6000); - events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); - Talk(SAY_AGGRO); - } - - void KilledUnit(Unit* victim) - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_SLAY); - } - - void MoveInLineOfSight(Unit* who) - { - if (!preFight && who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 70.0f)) - { - Talk(SAY_SOCCOTHRATES_CONVO_1); - events2.ScheduleEvent(EVENT_PREFIGHT_1, 2000); - preFight = true; - } - } - - void SetData(uint32 /*type*/, uint32 data) - { - if (data == 1) - events2.RescheduleEvent(EVENT_DALLIAH_DEATH, 6000); - } - - void UpdateAI(uint32 diff) - { - events2.Update(diff); - switch (events2.ExecuteEvent()) - { - case EVENT_PREFIGHT_1: - if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH))) - dalliah->AI()->Talk(SAY_DALLIAH_CONVO_1); - events2.ScheduleEvent(EVENT_PREFIGHT_2, 3000); - break; - case EVENT_PREFIGHT_2: - Talk(SAY_SOCCOTHRATES_CONVO_2); - events2.ScheduleEvent(EVENT_PREFIGHT_3, 3000); - break; - case EVENT_PREFIGHT_3: - if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH))) - dalliah->AI()->Talk(SAY_DALLIAH_CONVO_2); - events2.ScheduleEvent(EVENT_PREFIGHT_4, 6000); - break; - case EVENT_PREFIGHT_4: - Talk(SAY_SOCCOTHRATES_CONVO_3); - events2.ScheduleEvent(EVENT_PREFIGHT_5, 2000); - break; - case EVENT_PREFIGHT_5: - if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH))) - dalliah->AI()->Talk(SAY_DALLIAH_CONVO_3); - events2.ScheduleEvent(EVENT_PREFIGHT_6, 3000); - break; - case EVENT_PREFIGHT_6: - Talk(SAY_SOCCOTHRATES_CONVO_4); - events2.ScheduleEvent(EVENT_PREFIGHT_7, 2000); - break; - case EVENT_PREFIGHT_7: - if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH))) - dalliah->GetMotionMaster()->MovePoint(0, 118.6048f, 96.84852f, 22.44115f); - events2.ScheduleEvent(EVENT_PREFIGHT_8, 4000); - break; - case EVENT_PREFIGHT_8: - me->GetMotionMaster()->MovePoint(0, 122.1035f, 192.7203f, 22.44115f); - events2.ScheduleEvent(EVENT_PREFIGHT_9, 4000); - break; - case EVENT_PREFIGHT_9: - if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH))) - { - dalliah->SetFacingToObject(me); - dalliah->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); - me->SetFacingToObject(dalliah); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); - dalliah->SetHomePosition(dalliah->GetPositionX(), dalliah->GetPositionY(), dalliah->GetPositionZ(), 1.51737f); - me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 4.725722f); - } - break; - case EVENT_DALLIAH_DEATH: - Talk(SAY_DALLIAH_DEATH); - break; - } - - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_FELFIRE_SHOCK: - me->CastSpell(me->GetVictim(), SPELL_FELFIRE_SHOCK, false); - events.ScheduleEvent(EVENT_FELFIRE_SHOCK, urand(12000, 14000)); - break; - case EVENT_KNOCK_AWAY: - me->CastSpell(me, SPELL_KNOCK_AWAY, false); - Talk(SAY_KNOCK_AWAY); - events.ScheduleEvent(EVENT_KNOCK_AWAY, urand(11000, 12000)); - events.ScheduleEvent(EVENT_SPELL_CHARGE, 4600); - break; - case EVENT_SPELL_CHARGE: - me->CastSpell(me, SPELL_CHARGE, true); - me->CastSpell(me, SPELL_FELFIRE, true); - events.ScheduleEvent(EVENT_FELFIRE, 300); - events.ScheduleEvent(EVENT_FELFIRE, 600); - events.ScheduleEvent(EVENT_FELFIRE, 900); - events.ScheduleEvent(EVENT_FELFIRE, 1200); - events.ScheduleEvent(EVENT_FELFIRE, 1500); - events.ScheduleEvent(EVENT_FELFIRE, 1800); - break; - case EVENT_FELFIRE: - me->CastSpell(me, SPELL_FELFIRE, true); - break; - case EVENT_ME_FIRST: - if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH))) - if (dalliah->IsAlive() && !dalliah->IsInCombat()) - dalliah->AI()->Talk(SAY_AGGRO_SOCCOTHRATES_FIRST); - break; - case EVENT_CHECK_HEALTH: - if (HealthBelowPct(25)) - { - if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH))) - dalliah->AI()->Talk(SAY_SOCCOTHRATES_25_PERCENT); - break; - } - events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); - break; - } - - DoMeleeAttackIfReady(); - } - - private: - bool preFight; - EventMap events2; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_wrath_scryer_soccothratesAI(creature); + preFight = instance->GetBossState(DATA_DALLIAH) == DONE; } + + void Reset() + { + _Reset(); + events2.Reset(); + me->CastSpell(me, SPELL_FEL_IMMOLATION, true); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + } + + void InitializeAI() + { + BossAI::InitializeAI(); + if (!preFight) + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + } + + void JustDied(Unit* /*killer*/) + { + _JustDied(); + Talk(SAY_DEATH); + + if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH))) + if (dalliah->IsAlive() && !dalliah->IsInCombat()) + dalliah->AI()->SetData(1, 1); + } + + void EnterCombat(Unit* /*who*/) + { + _EnterCombat(); + events2.Reset(); + events.ScheduleEvent(EVENT_FELFIRE_SHOCK, urand(12000, 14000)); + events.ScheduleEvent(EVENT_KNOCK_AWAY, urand(11000, 12000)); + events.ScheduleEvent(EVENT_ME_FIRST, 6000); + events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); + Talk(SAY_AGGRO); + } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + + void MoveInLineOfSight(Unit* who) + { + if (!preFight && who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 70.0f)) + { + Talk(SAY_SOCCOTHRATES_CONVO_1); + events2.ScheduleEvent(EVENT_PREFIGHT_1, 2000); + preFight = true; + } + } + + void SetData(uint32 /*type*/, uint32 data) + { + if (data == 1) + events2.RescheduleEvent(EVENT_DALLIAH_DEATH, 6000); + } + + void UpdateAI(uint32 diff) + { + events2.Update(diff); + switch (events2.ExecuteEvent()) + { + case EVENT_PREFIGHT_1: + if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH))) + dalliah->AI()->Talk(SAY_DALLIAH_CONVO_1); + events2.ScheduleEvent(EVENT_PREFIGHT_2, 3000); + break; + case EVENT_PREFIGHT_2: + Talk(SAY_SOCCOTHRATES_CONVO_2); + events2.ScheduleEvent(EVENT_PREFIGHT_3, 3000); + break; + case EVENT_PREFIGHT_3: + if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH))) + dalliah->AI()->Talk(SAY_DALLIAH_CONVO_2); + events2.ScheduleEvent(EVENT_PREFIGHT_4, 6000); + break; + case EVENT_PREFIGHT_4: + Talk(SAY_SOCCOTHRATES_CONVO_3); + events2.ScheduleEvent(EVENT_PREFIGHT_5, 2000); + break; + case EVENT_PREFIGHT_5: + if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH))) + dalliah->AI()->Talk(SAY_DALLIAH_CONVO_3); + events2.ScheduleEvent(EVENT_PREFIGHT_6, 3000); + break; + case EVENT_PREFIGHT_6: + Talk(SAY_SOCCOTHRATES_CONVO_4); + events2.ScheduleEvent(EVENT_PREFIGHT_7, 2000); + break; + case EVENT_PREFIGHT_7: + if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH))) + dalliah->GetMotionMaster()->MovePoint(0, 118.6048f, 96.84852f, 22.44115f); + events2.ScheduleEvent(EVENT_PREFIGHT_8, 4000); + break; + case EVENT_PREFIGHT_8: + me->GetMotionMaster()->MovePoint(0, 122.1035f, 192.7203f, 22.44115f); + events2.ScheduleEvent(EVENT_PREFIGHT_9, 4000); + break; + case EVENT_PREFIGHT_9: + if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH))) + { + dalliah->SetFacingToObject(me); + dalliah->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + me->SetFacingToObject(dalliah); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + dalliah->SetHomePosition(dalliah->GetPositionX(), dalliah->GetPositionY(), dalliah->GetPositionZ(), 1.51737f); + me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 4.725722f); + } + break; + case EVENT_DALLIAH_DEATH: + Talk(SAY_DALLIAH_DEATH); + break; + } + + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_FELFIRE_SHOCK: + me->CastSpell(me->GetVictim(), SPELL_FELFIRE_SHOCK, false); + events.ScheduleEvent(EVENT_FELFIRE_SHOCK, urand(12000, 14000)); + break; + case EVENT_KNOCK_AWAY: + me->CastSpell(me, SPELL_KNOCK_AWAY, false); + Talk(SAY_KNOCK_AWAY); + events.ScheduleEvent(EVENT_KNOCK_AWAY, urand(11000, 12000)); + events.ScheduleEvent(EVENT_SPELL_CHARGE, 4600); + break; + case EVENT_SPELL_CHARGE: + me->CastSpell(me, SPELL_CHARGE, true); + me->CastSpell(me, SPELL_FELFIRE, true); + events.ScheduleEvent(EVENT_FELFIRE, 300); + events.ScheduleEvent(EVENT_FELFIRE, 600); + events.ScheduleEvent(EVENT_FELFIRE, 900); + events.ScheduleEvent(EVENT_FELFIRE, 1200); + events.ScheduleEvent(EVENT_FELFIRE, 1500); + events.ScheduleEvent(EVENT_FELFIRE, 1800); + break; + case EVENT_FELFIRE: + me->CastSpell(me, SPELL_FELFIRE, true); + break; + case EVENT_ME_FIRST: + if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH))) + if (dalliah->IsAlive() && !dalliah->IsInCombat()) + dalliah->AI()->Talk(SAY_AGGRO_SOCCOTHRATES_FIRST); + break; + case EVENT_CHECK_HEALTH: + if (HealthBelowPct(25)) + { + if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH))) + dalliah->AI()->Talk(SAY_SOCCOTHRATES_25_PERCENT); + break; + } + events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); + break; + } + + DoMeleeAttackIfReady(); + } + + private: + bool preFight; + EventMap events2; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_wrath_scryer_soccothratesAI(creature); + } }; void AddSC_boss_wrath_scryer_soccothrates() diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp index d7aeb09cf..39615f9a6 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp @@ -30,72 +30,72 @@ enum Events class boss_zereketh_the_unbound : public CreatureScript { - public: - boss_zereketh_the_unbound() : CreatureScript("boss_zereketh_the_unbound") { } +public: + boss_zereketh_the_unbound() : CreatureScript("boss_zereketh_the_unbound") { } - struct boss_zereketh_the_unboundAI : public BossAI + struct boss_zereketh_the_unboundAI : public BossAI + { + boss_zereketh_the_unboundAI(Creature* creature) : BossAI(creature, DATA_ZEREKETH) { } + + + void JustDied(Unit* /*killer*/) { - boss_zereketh_the_unboundAI(Creature* creature) : BossAI(creature, DATA_ZEREKETH) { } - - - void JustDied(Unit* /*killer*/) - { - _JustDied(); - Talk(SAY_DEATH); - } - - void EnterCombat(Unit* /*who*/) - { - _EnterCombat(); - events.ScheduleEvent(EVENT_VOID_ZONE, 6000); - events.ScheduleEvent(EVENT_SHADOW_NOVA, 10000); - events.ScheduleEvent(EVENT_SEED_OF_CORRUPTION, 16000); - Talk(SAY_AGGRO); - } - - void KilledUnit(Unit* victim) - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_SLAY); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_VOID_ZONE: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 60.0f, true)) - me->CastSpell(target, SPELL_VOID_ZONE, false); - events.ScheduleEvent(EVENT_VOID_ZONE, 15000); - break; - case EVENT_SHADOW_NOVA: - me->CastSpell(me, SPELL_SHADOW_NOVA, false); - if (roll_chance_i(50)) - Talk(SAY_SHADOW_NOVA); - events.ScheduleEvent(EVENT_SHADOW_NOVA, 12000); - break; - case EVENT_SEED_OF_CORRUPTION: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true)) - me->CastSpell(target, SPELL_SEED_OF_CORRUPTION, false); - events.ScheduleEvent(EVENT_SEED_OF_CORRUPTION, 16000); - break; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_zereketh_the_unboundAI(creature); + _JustDied(); + Talk(SAY_DEATH); } + + void EnterCombat(Unit* /*who*/) + { + _EnterCombat(); + events.ScheduleEvent(EVENT_VOID_ZONE, 6000); + events.ScheduleEvent(EVENT_SHADOW_NOVA, 10000); + events.ScheduleEvent(EVENT_SEED_OF_CORRUPTION, 16000); + Talk(SAY_AGGRO); + } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_VOID_ZONE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 60.0f, true)) + me->CastSpell(target, SPELL_VOID_ZONE, false); + events.ScheduleEvent(EVENT_VOID_ZONE, 15000); + break; + case EVENT_SHADOW_NOVA: + me->CastSpell(me, SPELL_SHADOW_NOVA, false); + if (roll_chance_i(50)) + Talk(SAY_SHADOW_NOVA); + events.ScheduleEvent(EVENT_SHADOW_NOVA, 12000); + break; + case EVENT_SEED_OF_CORRUPTION: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true)) + me->CastSpell(target, SPELL_SEED_OF_CORRUPTION, false); + events.ScheduleEvent(EVENT_SEED_OF_CORRUPTION, 16000); + break; + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_zereketh_the_unboundAI(creature); + } }; void AddSC_boss_zereketh_the_unbound() diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp index ddd44eb7f..0340943c5 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp @@ -15,193 +15,193 @@ DoorData const doorData[] = class instance_arcatraz : public InstanceMapScript { - public: - instance_arcatraz() : InstanceMapScript("instance_arcatraz", 552) { } +public: + instance_arcatraz() : InstanceMapScript("instance_arcatraz", 552) { } - struct instance_arcatraz_InstanceMapScript : public InstanceScript + struct instance_arcatraz_InstanceMapScript : public InstanceScript + { + instance_arcatraz_InstanceMapScript(Map* map) : InstanceScript(map) { - instance_arcatraz_InstanceMapScript(Map* map) : InstanceScript(map) - { - SetBossNumber(MAX_ENCOUTER); - LoadDoorData(doorData); + SetBossNumber(MAX_ENCOUTER); + LoadDoorData(doorData); - DalliahGUID = 0; - SoccothratesGUID = 0; - MellicharGUID = 0; - WardensShieldGUID = 0; + DalliahGUID = 0; + SoccothratesGUID = 0; + MellicharGUID = 0; + WardensShieldGUID = 0; - memset(StasisPodGUIDs, 0, 5 * sizeof(uint64)); - } - - void OnCreatureCreate(Creature* creature) - { - switch (creature->GetEntry()) - { - case NPC_DALLIAH: - DalliahGUID = creature->GetGUID(); - break; - case NPC_SOCCOTHRATES: - SoccothratesGUID = creature->GetGUID(); - break; - case NPC_MELLICHAR: - MellicharGUID = creature->GetGUID(); - break; - } - } - - void OnGameObjectCreate(GameObject* go) - { - switch (go->GetEntry()) - { - case GO_CONTAINMENT_CORE_SECURITY_FIELD_ALPHA: - case GO_CONTAINMENT_CORE_SECURITY_FIELD_BETA: - AddDoor(go, true); - break; - case GO_STASIS_POD_ALPHA: - StasisPodGUIDs[0] = go->GetGUID(); - break; - case GO_STASIS_POD_BETA: - StasisPodGUIDs[1] = go->GetGUID(); - break; - case GO_STASIS_POD_DELTA: - StasisPodGUIDs[2] = go->GetGUID(); - break; - case GO_STASIS_POD_GAMMA: - StasisPodGUIDs[3] = go->GetGUID(); - break; - case GO_STASIS_POD_OMEGA: - StasisPodGUIDs[4] = go->GetGUID(); - break; - case GO_WARDENS_SHIELD: - WardensShieldGUID = go->GetGUID(); - break; - default: - break; - } - } - - void OnGameObjectRemove(GameObject* go) - { - switch (go->GetEntry()) - { - case GO_CONTAINMENT_CORE_SECURITY_FIELD_ALPHA: - case GO_CONTAINMENT_CORE_SECURITY_FIELD_BETA: - AddDoor(go, false); - break; - default: - break; - } - } - - void SetData(uint32 type, uint32 data) - { - switch (type) - { - case DATA_WARDEN_1: - case DATA_WARDEN_2: - case DATA_WARDEN_3: - case DATA_WARDEN_4: - case DATA_WARDEN_5: - if (data < FAIL) - HandleGameObject(StasisPodGUIDs[type - DATA_WARDEN_1], data == IN_PROGRESS); - if (Creature* warden = instance->GetCreature(MellicharGUID)) - warden->AI()->SetData(type, data); - break; - } - } - - uint32 GetData(uint32 /*type*/) const - { - return 0; - } - - uint64 GetData64(uint32 data) const - { - switch (data) - { - case DATA_DALLIAH: - return DalliahGUID; - case DATA_SOCCOTHRATES: - return SoccothratesGUID; - case DATA_WARDENS_SHIELD: - return WardensShieldGUID; - } - return 0; - } - - bool SetBossState(uint32 type, EncounterState state) - { - if (!InstanceScript::SetBossState(type, state)) - return false; - - if (type == DATA_WARDEN_MELLICHAR && state == NOT_STARTED) - { - SetData(DATA_WARDEN_1, NOT_STARTED); - SetData(DATA_WARDEN_2, NOT_STARTED); - SetData(DATA_WARDEN_3, NOT_STARTED); - SetData(DATA_WARDEN_4, NOT_STARTED); - SetData(DATA_WARDEN_5, NOT_STARTED); - HandleGameObject(WardensShieldGUID, true); - } - - return true; - } - - std::string GetSaveData() - { - OUT_SAVE_INST_DATA; - - std::ostringstream saveStream; - saveStream << "A Z " << GetBossSaveData(); - - OUT_SAVE_INST_DATA_COMPLETE; - return saveStream.str(); - } - - void Load(char const* str) - { - 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 == 'A' && dataHead2 == 'Z') - { - for (uint32 i = 0; i < MAX_ENCOUTER; ++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 DalliahGUID; - uint64 SoccothratesGUID; - uint64 StasisPodGUIDs[5]; - uint64 MellicharGUID; - uint64 WardensShieldGUID; - }; - - InstanceScript* GetInstanceScript(InstanceMap* map) const - { - return new instance_arcatraz_InstanceMapScript(map); + memset(StasisPodGUIDs, 0, 5 * sizeof(uint64)); } + + void OnCreatureCreate(Creature* creature) + { + switch (creature->GetEntry()) + { + case NPC_DALLIAH: + DalliahGUID = creature->GetGUID(); + break; + case NPC_SOCCOTHRATES: + SoccothratesGUID = creature->GetGUID(); + break; + case NPC_MELLICHAR: + MellicharGUID = creature->GetGUID(); + break; + } + } + + void OnGameObjectCreate(GameObject* go) + { + switch (go->GetEntry()) + { + case GO_CONTAINMENT_CORE_SECURITY_FIELD_ALPHA: + case GO_CONTAINMENT_CORE_SECURITY_FIELD_BETA: + AddDoor(go, true); + break; + case GO_STASIS_POD_ALPHA: + StasisPodGUIDs[0] = go->GetGUID(); + break; + case GO_STASIS_POD_BETA: + StasisPodGUIDs[1] = go->GetGUID(); + break; + case GO_STASIS_POD_DELTA: + StasisPodGUIDs[2] = go->GetGUID(); + break; + case GO_STASIS_POD_GAMMA: + StasisPodGUIDs[3] = go->GetGUID(); + break; + case GO_STASIS_POD_OMEGA: + StasisPodGUIDs[4] = go->GetGUID(); + break; + case GO_WARDENS_SHIELD: + WardensShieldGUID = go->GetGUID(); + break; + default: + break; + } + } + + void OnGameObjectRemove(GameObject* go) + { + switch (go->GetEntry()) + { + case GO_CONTAINMENT_CORE_SECURITY_FIELD_ALPHA: + case GO_CONTAINMENT_CORE_SECURITY_FIELD_BETA: + AddDoor(go, false); + break; + default: + break; + } + } + + void SetData(uint32 type, uint32 data) + { + switch (type) + { + case DATA_WARDEN_1: + case DATA_WARDEN_2: + case DATA_WARDEN_3: + case DATA_WARDEN_4: + case DATA_WARDEN_5: + if (data < FAIL) + HandleGameObject(StasisPodGUIDs[type - DATA_WARDEN_1], data == IN_PROGRESS); + if (Creature* warden = instance->GetCreature(MellicharGUID)) + warden->AI()->SetData(type, data); + break; + } + } + + uint32 GetData(uint32 /*type*/) const + { + return 0; + } + + uint64 GetData64(uint32 data) const + { + switch (data) + { + case DATA_DALLIAH: + return DalliahGUID; + case DATA_SOCCOTHRATES: + return SoccothratesGUID; + case DATA_WARDENS_SHIELD: + return WardensShieldGUID; + } + return 0; + } + + bool SetBossState(uint32 type, EncounterState state) + { + if (!InstanceScript::SetBossState(type, state)) + return false; + + if (type == DATA_WARDEN_MELLICHAR && state == NOT_STARTED) + { + SetData(DATA_WARDEN_1, NOT_STARTED); + SetData(DATA_WARDEN_2, NOT_STARTED); + SetData(DATA_WARDEN_3, NOT_STARTED); + SetData(DATA_WARDEN_4, NOT_STARTED); + SetData(DATA_WARDEN_5, NOT_STARTED); + HandleGameObject(WardensShieldGUID, true); + } + + return true; + } + + std::string GetSaveData() + { + OUT_SAVE_INST_DATA; + + std::ostringstream saveStream; + saveStream << "A Z " << GetBossSaveData(); + + OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); + } + + void Load(char const* str) + { + 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 == 'A' && dataHead2 == 'Z') + { + for (uint32 i = 0; i < MAX_ENCOUTER; ++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 DalliahGUID; + uint64 SoccothratesGUID; + uint64 StasisPodGUIDs[5]; + uint64 MellicharGUID; + uint64 WardensShieldGUID; + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_arcatraz_InstanceMapScript(map); + } }; void AddSC_instance_arcatraz() diff --git a/src/server/scripts/Outland/TempestKeep/botanica/boss_commander_sarannis.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_commander_sarannis.cpp index f75441643..4be192263 100644 --- a/src/server/scripts/Outland/TempestKeep/botanica/boss_commander_sarannis.cpp +++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_commander_sarannis.cpp @@ -34,81 +34,82 @@ enum Events class boss_commander_sarannis : public CreatureScript { - public: boss_commander_sarannis() : CreatureScript("boss_commander_sarannis") { } +public: + boss_commander_sarannis() : CreatureScript("boss_commander_sarannis") { } - struct boss_commander_sarannisAI : public BossAI + struct boss_commander_sarannisAI : public BossAI + { + boss_commander_sarannisAI(Creature* creature) : BossAI(creature, DATA_COMMANDER_SARANNIS) { } + + void Reset() { - boss_commander_sarannisAI(Creature* creature) : BossAI(creature, DATA_COMMANDER_SARANNIS) { } - - void Reset() - { - _Reset(); - } - - void EnterCombat(Unit* /*who*/) - { - _EnterCombat(); - Talk(SAY_AGGRO); - events.ScheduleEvent(EVENT_ARCANE_RESONANCE, 20000); - events.ScheduleEvent(EVENT_ARCANE_DEVASTATION, 10000); - events.ScheduleEvent(EVENT_HEALTH_CHECK, 500); - } - - void KilledUnit(Unit* victim) - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_KILL); - } - - void JustDied(Unit* /*killer*/) - { - _JustDied(); - Talk(SAY_DEATH); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_ARCANE_RESONANCE: - if (roll_chance_i(50)) - Talk(SAY_ARCANE_RESONANCE); - me->CastSpell(me->GetVictim(), SPELL_ARCANE_RESONANCE, false); - events.ScheduleEvent(EVENT_ARCANE_RESONANCE, 27000); - break; - case EVENT_ARCANE_DEVASTATION: - if (roll_chance_i(50)) - Talk(SAY_ARCANE_DEVASTATION); - me->CastSpell(me->GetVictim(), SPELL_ARCANE_DEVASTATION, false); - events.ScheduleEvent(EVENT_ARCANE_DEVASTATION, 17000); - break; - case EVENT_HEALTH_CHECK: - if (me->HealthBelowPct(50)) - { - Talk(EMOTE_SUMMON); - Talk(SAY_SUMMON); - me->CastSpell(me, SPELL_SUMMON_REINFORCEMENTS, true); - break; - } - events.ScheduleEvent(EVENT_HEALTH_CHECK, 500); - break; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_commander_sarannisAI(creature); + _Reset(); } + + void EnterCombat(Unit* /*who*/) + { + _EnterCombat(); + Talk(SAY_AGGRO); + events.ScheduleEvent(EVENT_ARCANE_RESONANCE, 20000); + events.ScheduleEvent(EVENT_ARCANE_DEVASTATION, 10000); + events.ScheduleEvent(EVENT_HEALTH_CHECK, 500); + } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_KILL); + } + + void JustDied(Unit* /*killer*/) + { + _JustDied(); + Talk(SAY_DEATH); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_ARCANE_RESONANCE: + if (roll_chance_i(50)) + Talk(SAY_ARCANE_RESONANCE); + me->CastSpell(me->GetVictim(), SPELL_ARCANE_RESONANCE, false); + events.ScheduleEvent(EVENT_ARCANE_RESONANCE, 27000); + break; + case EVENT_ARCANE_DEVASTATION: + if (roll_chance_i(50)) + Talk(SAY_ARCANE_DEVASTATION); + me->CastSpell(me->GetVictim(), SPELL_ARCANE_DEVASTATION, false); + events.ScheduleEvent(EVENT_ARCANE_DEVASTATION, 17000); + break; + case EVENT_HEALTH_CHECK: + if (me->HealthBelowPct(50)) + { + Talk(EMOTE_SUMMON); + Talk(SAY_SUMMON); + me->CastSpell(me, SPELL_SUMMON_REINFORCEMENTS, true); + break; + } + events.ScheduleEvent(EVENT_HEALTH_CHECK, 500); + break; + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_commander_sarannisAI(creature); + } }; Position const PosSummonReinforcements[4] = @@ -127,32 +128,32 @@ enum Creatures class spell_commander_sarannis_summon_reinforcements : public SpellScriptLoader { - public: - spell_commander_sarannis_summon_reinforcements() : SpellScriptLoader("spell_commander_sarannis_summon_reinforcements") { } +public: + spell_commander_sarannis_summon_reinforcements() : SpellScriptLoader("spell_commander_sarannis_summon_reinforcements") { } - class spell_commander_sarannis_summon_reinforcements_SpellScript : public SpellScript + class spell_commander_sarannis_summon_reinforcements_SpellScript : public SpellScript + { + PrepareSpellScript(spell_commander_sarannis_summon_reinforcements_SpellScript); + + void HandleCast(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_commander_sarannis_summon_reinforcements_SpellScript); - - void HandleCast(SpellEffIndex /*effIndex*/) - { - GetCaster()->SummonCreature(NPC_SUMMONED_BLOODWARDER_MENDER, PosSummonReinforcements[0], TEMPSUMMON_CORPSE_DESPAWN); - GetCaster()->SummonCreature(NPC_SUMMONED_BLOODWARDER_RESERVIST, PosSummonReinforcements[1], TEMPSUMMON_CORPSE_DESPAWN); - GetCaster()->SummonCreature(NPC_SUMMONED_BLOODWARDER_RESERVIST, PosSummonReinforcements[2], TEMPSUMMON_CORPSE_DESPAWN); - if (GetCaster()->GetMap()->IsHeroic()) - GetCaster()->SummonCreature(NPC_SUMMONED_BLOODWARDER_RESERVIST, PosSummonReinforcements[3], TEMPSUMMON_CORPSE_DESPAWN); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_commander_sarannis_summon_reinforcements_SpellScript::HandleCast, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_commander_sarannis_summon_reinforcements_SpellScript(); + GetCaster()->SummonCreature(NPC_SUMMONED_BLOODWARDER_MENDER, PosSummonReinforcements[0], TEMPSUMMON_CORPSE_DESPAWN); + GetCaster()->SummonCreature(NPC_SUMMONED_BLOODWARDER_RESERVIST, PosSummonReinforcements[1], TEMPSUMMON_CORPSE_DESPAWN); + GetCaster()->SummonCreature(NPC_SUMMONED_BLOODWARDER_RESERVIST, PosSummonReinforcements[2], TEMPSUMMON_CORPSE_DESPAWN); + if (GetCaster()->GetMap()->IsHeroic()) + GetCaster()->SummonCreature(NPC_SUMMONED_BLOODWARDER_RESERVIST, PosSummonReinforcements[3], TEMPSUMMON_CORPSE_DESPAWN); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_commander_sarannis_summon_reinforcements_SpellScript::HandleCast, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_commander_sarannis_summon_reinforcements_SpellScript(); + } }; void AddSC_boss_commander_sarannis() diff --git a/src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp index d0092438f..822d8635f 100644 --- a/src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp +++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp @@ -39,107 +39,107 @@ enum Misc class boss_high_botanist_freywinn : public CreatureScript { - public: +public: - boss_high_botanist_freywinn() : CreatureScript("boss_high_botanist_freywinn") + boss_high_botanist_freywinn() : CreatureScript("boss_high_botanist_freywinn") + { + } + + struct boss_high_botanist_freywinnAI : public BossAI + { + boss_high_botanist_freywinnAI(Creature* creature) : BossAI(creature, DATA_HIGH_BOTANIST_FREYWINN) { } + + void Reset() { + _Reset(); } - struct boss_high_botanist_freywinnAI : public BossAI + void EnterCombat(Unit* /*who*/) { - boss_high_botanist_freywinnAI(Creature* creature) : BossAI(creature, DATA_HIGH_BOTANIST_FREYWINN) { } + _EnterCombat(); + Talk(SAY_AGGRO); - void Reset() + events.ScheduleEvent(EVENT_SUMMON_SEEDLING, 6000); + events.ScheduleEvent(EVENT_TREE_FORM, 30000); + } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_KILL); + } + + void JustDied(Unit* /*killer*/) + { + Talk(SAY_DEATH); + _JustDied(); + } + + void SummonedCreatureDies(Creature* summon, Unit*) + { + summons.Despawn(summon); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (!events.IsInPhase(1) && me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) { - _Reset(); - } + case EVENT_SUMMON_SEEDLING: + if (roll_chance_i(20)) + Talk(SAY_OOC_RANDOM); + me->CastSpell(me, RAND(SPELL_PLANT_WHITE, SPELL_PLANT_GREEN, SPELL_PLANT_BLUE, SPELL_PLANT_RED), false); + events.ScheduleEvent(EVENT_SUMMON_SEEDLING, 6000); + break; + case EVENT_TREE_FORM: + events.Reset(); + events.SetPhase(1); + events.ScheduleEvent(EVENT_CHECK_FRAYERS, 1000); + events.ScheduleEvent(EVENT_TREE_FORM, 75000); + events.ScheduleEvent(EVENT_RESTORE_COMBAT, 46000); - void EnterCombat(Unit* /*who*/) - { - _EnterCombat(); - Talk(SAY_AGGRO); + Talk(SAY_TREE); + me->RemoveAllAuras(); + me->GetMotionMaster()->MoveIdle(); + me->GetMotionMaster()->Clear(false); - events.ScheduleEvent(EVENT_SUMMON_SEEDLING, 6000); - events.ScheduleEvent(EVENT_TREE_FORM, 30000); - } - - void KilledUnit(Unit* victim) - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_KILL); - } - - void JustDied(Unit* /*killer*/) - { - Talk(SAY_DEATH); - _JustDied(); - } - - void SummonedCreatureDies(Creature* summon, Unit*) - { - summons.Despawn(summon); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (!events.IsInPhase(1) && me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SUMMON_SEEDLING: - if (roll_chance_i(20)) - Talk(SAY_OOC_RANDOM); - me->CastSpell(me, RAND(SPELL_PLANT_WHITE, SPELL_PLANT_GREEN, SPELL_PLANT_BLUE, SPELL_PLANT_RED), false); - events.ScheduleEvent(EVENT_SUMMON_SEEDLING, 6000); - break; - case EVENT_TREE_FORM: - events.Reset(); - events.SetPhase(1); - events.ScheduleEvent(EVENT_CHECK_FRAYERS, 1000); - events.ScheduleEvent(EVENT_TREE_FORM, 75000); - events.ScheduleEvent(EVENT_RESTORE_COMBAT, 46000); - - Talk(SAY_TREE); + me->CastSpell(me, SPELL_SUMMON_FRAYER, true); + me->CastSpell(me, SPELL_TRANQUILITY, true); + me->CastSpell(me, SPELL_TREE_FORM, true); + break; + case EVENT_RESTORE_COMBAT: + events.SetPhase(0); + events.ScheduleEvent(EVENT_SUMMON_SEEDLING, 6000); + me->GetMotionMaster()->MoveChase(me->GetVictim()); + break; + case EVENT_CHECK_FRAYERS: + if (!summons.HasEntry(NPC_FRAYER)) + { + me->InterruptNonMeleeSpells(true); me->RemoveAllAuras(); - me->GetMotionMaster()->MoveIdle(); - me->GetMotionMaster()->Clear(false); - - me->CastSpell(me, SPELL_SUMMON_FRAYER, true); - me->CastSpell(me, SPELL_TRANQUILITY, true); - me->CastSpell(me, SPELL_TREE_FORM, true); + events.RescheduleEvent(EVENT_RESTORE_COMBAT, 0); + events.RescheduleEvent(EVENT_TREE_FORM, 30000); break; - case EVENT_RESTORE_COMBAT: - events.SetPhase(0); - events.ScheduleEvent(EVENT_SUMMON_SEEDLING, 6000); - me->GetMotionMaster()->MoveChase(me->GetVictim()); - break; - case EVENT_CHECK_FRAYERS: - if (!summons.HasEntry(NPC_FRAYER)) - { - me->InterruptNonMeleeSpells(true); - me->RemoveAllAuras(); - events.RescheduleEvent(EVENT_RESTORE_COMBAT, 0); - events.RescheduleEvent(EVENT_TREE_FORM, 30000); - break; - } - events.ScheduleEvent(EVENT_CHECK_FRAYERS, 500); - break; - } - - if (!events.IsInPhase(1)) - DoMeleeAttackIfReady(); + } + events.ScheduleEvent(EVENT_CHECK_FRAYERS, 500); + break; } - }; - CreatureAI* GetAI(Creature* creature) const - { - return new boss_high_botanist_freywinnAI(creature); + if (!events.IsInPhase(1)) + DoMeleeAttackIfReady(); } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_high_botanist_freywinnAI(creature); + } }; void AddSC_boss_high_botanist_freywinn() diff --git a/src/server/scripts/Outland/TempestKeep/botanica/boss_laj.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_laj.cpp index 3102299e4..22d72f33e 100644 --- a/src/server/scripts/Outland/TempestKeep/botanica/boss_laj.cpp +++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_laj.cpp @@ -44,88 +44,98 @@ enum Misc class boss_laj : public CreatureScript { - public: +public: - boss_laj() : CreatureScript("boss_laj") { } + boss_laj() : CreatureScript("boss_laj") { } - struct boss_lajAI : public BossAI + struct boss_lajAI : public BossAI + { + boss_lajAI(Creature* creature) : BossAI(creature, DATA_LAJ) { } + + void Reset() { - boss_lajAI(Creature* creature) : BossAI(creature, DATA_LAJ) { } - - void Reset() - { - _Reset(); - me->SetDisplayId(MODEL_DEFAULT); - _lastTransform = SPELL_DAMAGE_IMMUNE_SHADOW; - me->CastSpell(me, SPELL_DAMAGE_IMMUNE_SHADOW, true); - } - - void DoTransform() - { - me->RemoveAurasDueToSpell(_lastTransform); - - switch (_lastTransform = RAND(SPELL_DAMAGE_IMMUNE_SHADOW, SPELL_DAMAGE_IMMUNE_FIRE, SPELL_DAMAGE_IMMUNE_FROST, SPELL_DAMAGE_IMMUNE_NATURE, SPELL_DAMAGE_IMMUNE_ARCANE)) - { - case SPELL_DAMAGE_IMMUNE_SHADOW: me->SetDisplayId(MODEL_DEFAULT); break; - case SPELL_DAMAGE_IMMUNE_ARCANE: me->SetDisplayId(MODEL_ARCANE); break; - case SPELL_DAMAGE_IMMUNE_FIRE: me->SetDisplayId(MODEL_FIRE); break; - case SPELL_DAMAGE_IMMUNE_FROST: me->SetDisplayId(MODEL_FROST); break; - case SPELL_DAMAGE_IMMUNE_NATURE: me->SetDisplayId(MODEL_NATURE); break; - } - - me->CastSpell(me, _lastTransform, true); - } - - void EnterCombat(Unit* /*who*/) - { - _EnterCombat(); - - events.ScheduleEvent(EVENT_ALERGIC_REACTION, 5000); - events.ScheduleEvent(EVENT_TRANSFORM, 30000); - events.ScheduleEvent(EVENT_TELEPORT, 20000); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_ALERGIC_REACTION: - me->CastSpell(me->GetVictim(), SPELL_ALLERGIC_REACTION, false); - events.ScheduleEvent(EVENT_ALERGIC_REACTION, 25000); - break; - case EVENT_TELEPORT: - me->CastSpell(me, SPELL_TELEPORT_SELF, false); - events.ScheduleEvent(EVENT_SUMMON, 2500); - events.ScheduleEvent(EVENT_TELEPORT, 30000); - break; - case EVENT_SUMMON: - Talk(EMOTE_SUMMON); - me->CastSpell(me, SPELL_SUMMON_LASHER_1, true); - me->CastSpell(me, SPELL_SUMMON_FLAYER_1, true); - break; - case EVENT_TRANSFORM: - DoTransform(); - events.ScheduleEvent(EVENT_TRANSFORM, 35000); - break; - } - - DoMeleeAttackIfReady(); - } - private: - uint32 _lastTransform; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_lajAI(creature); + _Reset(); + me->SetDisplayId(MODEL_DEFAULT); + _lastTransform = SPELL_DAMAGE_IMMUNE_SHADOW; + me->CastSpell(me, SPELL_DAMAGE_IMMUNE_SHADOW, true); } + + void DoTransform() + { + me->RemoveAurasDueToSpell(_lastTransform); + + switch (_lastTransform = RAND(SPELL_DAMAGE_IMMUNE_SHADOW, SPELL_DAMAGE_IMMUNE_FIRE, SPELL_DAMAGE_IMMUNE_FROST, SPELL_DAMAGE_IMMUNE_NATURE, SPELL_DAMAGE_IMMUNE_ARCANE)) + { + case SPELL_DAMAGE_IMMUNE_SHADOW: + me->SetDisplayId(MODEL_DEFAULT); + break; + case SPELL_DAMAGE_IMMUNE_ARCANE: + me->SetDisplayId(MODEL_ARCANE); + break; + case SPELL_DAMAGE_IMMUNE_FIRE: + me->SetDisplayId(MODEL_FIRE); + break; + case SPELL_DAMAGE_IMMUNE_FROST: + me->SetDisplayId(MODEL_FROST); + break; + case SPELL_DAMAGE_IMMUNE_NATURE: + me->SetDisplayId(MODEL_NATURE); + break; + } + + me->CastSpell(me, _lastTransform, true); + } + + void EnterCombat(Unit* /*who*/) + { + _EnterCombat(); + + events.ScheduleEvent(EVENT_ALERGIC_REACTION, 5000); + events.ScheduleEvent(EVENT_TRANSFORM, 30000); + events.ScheduleEvent(EVENT_TELEPORT, 20000); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_ALERGIC_REACTION: + me->CastSpell(me->GetVictim(), SPELL_ALLERGIC_REACTION, false); + events.ScheduleEvent(EVENT_ALERGIC_REACTION, 25000); + break; + case EVENT_TELEPORT: + me->CastSpell(me, SPELL_TELEPORT_SELF, false); + events.ScheduleEvent(EVENT_SUMMON, 2500); + events.ScheduleEvent(EVENT_TELEPORT, 30000); + break; + case EVENT_SUMMON: + Talk(EMOTE_SUMMON); + me->CastSpell(me, SPELL_SUMMON_LASHER_1, true); + me->CastSpell(me, SPELL_SUMMON_FLAYER_1, true); + break; + case EVENT_TRANSFORM: + DoTransform(); + events.ScheduleEvent(EVENT_TRANSFORM, 35000); + break; + } + + DoMeleeAttackIfReady(); + } + private: + uint32 _lastTransform; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_lajAI(creature); + } }; void AddSC_boss_laj() diff --git a/src/server/scripts/Outland/TempestKeep/botanica/boss_thorngrin_the_tender.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_thorngrin_the_tender.cpp index 405814af1..e4c4d12bd 100644 --- a/src/server/scripts/Outland/TempestKeep/botanica/boss_thorngrin_the_tender.cpp +++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_thorngrin_the_tender.cpp @@ -37,114 +37,115 @@ enum Events class boss_thorngrin_the_tender : public CreatureScript { - public: boss_thorngrin_the_tender() : CreatureScript("thorngrin_the_tender") { } +public: + boss_thorngrin_the_tender() : CreatureScript("thorngrin_the_tender") { } - struct boss_thorngrin_the_tenderAI : public BossAI + struct boss_thorngrin_the_tenderAI : public BossAI + { + boss_thorngrin_the_tenderAI(Creature* creature) : BossAI(creature, DATA_THORNGRIN_THE_TENDER) { - boss_thorngrin_the_tenderAI(Creature* creature) : BossAI(creature, DATA_THORNGRIN_THE_TENDER) - { - me->m_SightDistance = 100.0f; - _intro = false; - } - - void Reset() - { - _Reset(); - } - - void MoveInLineOfSight(Unit* who) - { - if (!_intro && who->GetTypeId() == TYPEID_PLAYER) - { - _intro = true; - Talk(SAY_INTRO); - } - BossAI::MoveInLineOfSight(who); - } - - - void EnterCombat(Unit* /*who*/) - { - _EnterCombat(); - Talk(SAY_AGGRO); - events.ScheduleEvent(EVENT_SACRIFICE, 6000); - events.ScheduleEvent(EVENT_HELLFIRE, 18000); - events.ScheduleEvent(EVENT_ENRAGE, 15000); - events.ScheduleEvent(EVENT_HEALTH_CHECK_50, 500); - events.ScheduleEvent(EVENT_HEALTH_CHECK_20, 500); - } - - void KilledUnit(Unit* victim) - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_KILL); - } - - void JustDied(Unit* /*killer*/) - { - _JustDied(); - Talk(SAY_DEATH); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SACRIFICE: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true)) - { - Talk(SAY_CAST_SACRIFICE); - me->CastSpell(target, SPELL_SACRIFICE, false); - } - events.ScheduleEvent(EVENT_SACRIFICE, 30000); - break; - case EVENT_HELLFIRE: - if (roll_chance_i(50)) - Talk(SAY_CAST_HELLFIRE); - me->CastSpell(me, SPELL_HELLFIRE, false); - events.ScheduleEvent(EVENT_HELLFIRE, 22000); - break; - case EVENT_ENRAGE: - Talk(EMOTE_ENRAGE); - me->CastSpell(me, SPELL_ENRAGE, false); - events.ScheduleEvent(EVENT_ENRAGE, 30000); - break; - case EVENT_HEALTH_CHECK_50: - if (me->HealthBelowPct(50)) - { - Talk(SAY_50_PERCENT_HP); - break; - } - events.ScheduleEvent(EVENT_HEALTH_CHECK_50, 500); - break; - case EVENT_HEALTH_CHECK_20: - if (me->HealthBelowPct(20)) - { - Talk(SAY_20_PERCENT_HP); - break; - } - events.ScheduleEvent(EVENT_HEALTH_CHECK_20, 500); - break; - } - - DoMeleeAttackIfReady(); - } - - private: - bool _intro; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_thorngrin_the_tenderAI(creature); + me->m_SightDistance = 100.0f; + _intro = false; } + + void Reset() + { + _Reset(); + } + + void MoveInLineOfSight(Unit* who) + { + if (!_intro && who->GetTypeId() == TYPEID_PLAYER) + { + _intro = true; + Talk(SAY_INTRO); + } + BossAI::MoveInLineOfSight(who); + } + + + void EnterCombat(Unit* /*who*/) + { + _EnterCombat(); + Talk(SAY_AGGRO); + events.ScheduleEvent(EVENT_SACRIFICE, 6000); + events.ScheduleEvent(EVENT_HELLFIRE, 18000); + events.ScheduleEvent(EVENT_ENRAGE, 15000); + events.ScheduleEvent(EVENT_HEALTH_CHECK_50, 500); + events.ScheduleEvent(EVENT_HEALTH_CHECK_20, 500); + } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_KILL); + } + + void JustDied(Unit* /*killer*/) + { + _JustDied(); + Talk(SAY_DEATH); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_SACRIFICE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true)) + { + Talk(SAY_CAST_SACRIFICE); + me->CastSpell(target, SPELL_SACRIFICE, false); + } + events.ScheduleEvent(EVENT_SACRIFICE, 30000); + break; + case EVENT_HELLFIRE: + if (roll_chance_i(50)) + Talk(SAY_CAST_HELLFIRE); + me->CastSpell(me, SPELL_HELLFIRE, false); + events.ScheduleEvent(EVENT_HELLFIRE, 22000); + break; + case EVENT_ENRAGE: + Talk(EMOTE_ENRAGE); + me->CastSpell(me, SPELL_ENRAGE, false); + events.ScheduleEvent(EVENT_ENRAGE, 30000); + break; + case EVENT_HEALTH_CHECK_50: + if (me->HealthBelowPct(50)) + { + Talk(SAY_50_PERCENT_HP); + break; + } + events.ScheduleEvent(EVENT_HEALTH_CHECK_50, 500); + break; + case EVENT_HEALTH_CHECK_20: + if (me->HealthBelowPct(20)) + { + Talk(SAY_20_PERCENT_HP); + break; + } + events.ScheduleEvent(EVENT_HEALTH_CHECK_20, 500); + break; + } + + DoMeleeAttackIfReady(); + } + + private: + bool _intro; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_thorngrin_the_tenderAI(creature); + } }; void AddSC_boss_thorngrin_the_tender() diff --git a/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp index 74333c340..bfb8a55a9 100644 --- a/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp +++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp @@ -33,76 +33,76 @@ enum Misc class boss_warp_splinter : public CreatureScript { - public: +public: - boss_warp_splinter() : CreatureScript("boss_warp_splinter") { } - struct boss_warp_splinterAI : public BossAI + boss_warp_splinter() : CreatureScript("boss_warp_splinter") { } + struct boss_warp_splinterAI : public BossAI + { + boss_warp_splinterAI(Creature* creature) : BossAI(creature, DATA_WARP_SPLINTER) { } + + void Reset() { - boss_warp_splinterAI(Creature* creature) : BossAI(creature, DATA_WARP_SPLINTER) { } - - void Reset() - { - _Reset(); - } - - void EnterCombat(Unit* /*who*/) - { - _EnterCombat(); - Talk(SAY_AGGRO); - - events.ScheduleEvent(EVENT_ARCANE_VOLLEY, 8000); - events.ScheduleEvent(EVENT_WAR_STOMP, 15000); - events.ScheduleEvent(EVENT_SUMMON_TREANT, 20000); - } - - void KilledUnit(Unit* victim) - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_SLAY); - } - - void JustDied(Unit* /*killer*/) - { - _JustDied(); - Talk(SAY_DEATH); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_ARCANE_VOLLEY: - me->CastSpell(me, SPELL_ARCANE_VOLLEY, false); - events.ScheduleEvent(EVENT_ARCANE_VOLLEY, 20000); - break; - case EVENT_WAR_STOMP: - me->CastSpell(me, SPELL_WAR_STOMP, false); - events.ScheduleEvent(EVENT_WAR_STOMP, 30000); - break; - case EVENT_SUMMON_TREANT: - Talk(SAY_SUMMON); - me->CastSpell(me, SPELL_SUMMON_SAPLINGS_PERIODIC, true); - for (uint8 i = 0; i < 6; ++i) - me->CastSpell(me, SPELL_SUMMON_SAPLINGS_SUMMON+i, true); - events.ScheduleEvent(EVENT_SUMMON_TREANT, 40000); - break; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_warp_splinterAI(creature); + _Reset(); } + + void EnterCombat(Unit* /*who*/) + { + _EnterCombat(); + Talk(SAY_AGGRO); + + events.ScheduleEvent(EVENT_ARCANE_VOLLEY, 8000); + events.ScheduleEvent(EVENT_WAR_STOMP, 15000); + events.ScheduleEvent(EVENT_SUMMON_TREANT, 20000); + } + + void KilledUnit(Unit* victim) + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + + void JustDied(Unit* /*killer*/) + { + _JustDied(); + Talk(SAY_DEATH); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_ARCANE_VOLLEY: + me->CastSpell(me, SPELL_ARCANE_VOLLEY, false); + events.ScheduleEvent(EVENT_ARCANE_VOLLEY, 20000); + break; + case EVENT_WAR_STOMP: + me->CastSpell(me, SPELL_WAR_STOMP, false); + events.ScheduleEvent(EVENT_WAR_STOMP, 30000); + break; + case EVENT_SUMMON_TREANT: + Talk(SAY_SUMMON); + me->CastSpell(me, SPELL_SUMMON_SAPLINGS_PERIODIC, true); + for (uint8 i = 0; i < 6; ++i) + me->CastSpell(me, SPELL_SUMMON_SAPLINGS_SUMMON + i, true); + events.ScheduleEvent(EVENT_SUMMON_TREANT, 40000); + break; + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_warp_splinterAI(creature); + } }; void AddSC_boss_warp_splinter() diff --git a/src/server/scripts/Outland/TempestKeep/botanica/instance_the_botanica.cpp b/src/server/scripts/Outland/TempestKeep/botanica/instance_the_botanica.cpp index bfda3068b..28497915a 100644 --- a/src/server/scripts/Outland/TempestKeep/botanica/instance_the_botanica.cpp +++ b/src/server/scripts/Outland/TempestKeep/botanica/instance_the_botanica.cpp @@ -8,72 +8,72 @@ class instance_the_botanica : public InstanceMapScript { - public: - instance_the_botanica() : InstanceMapScript("instance_the_botanica", 553) { } +public: + instance_the_botanica() : InstanceMapScript("instance_the_botanica", 553) { } - struct instance_the_botanica_InstanceMapScript : public InstanceScript + struct instance_the_botanica_InstanceMapScript : public InstanceScript + { + instance_the_botanica_InstanceMapScript(Map* map) : InstanceScript(map) { - instance_the_botanica_InstanceMapScript(Map* map) : InstanceScript(map) - { - SetBossNumber(MAX_ENCOUNTER); - } - - bool SetBossState(uint32 type, EncounterState state) - { - if (!InstanceScript::SetBossState(type, state)) - return false; - - return true; - } - - std::string GetSaveData() - { - OUT_SAVE_INST_DATA; - - std::ostringstream saveStream; - saveStream << "B O " << GetBossSaveData(); - - OUT_SAVE_INST_DATA_COMPLETE; - return saveStream.str(); - } - - void Load(char const* str) - { - 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 == 'O') - { - for (uint32 i = 0; i < MAX_ENCOUNTER; ++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; - } - }; - - InstanceScript* GetInstanceScript(InstanceMap* map) const - { - return new instance_the_botanica_InstanceMapScript(map); + SetBossNumber(MAX_ENCOUNTER); } + + bool SetBossState(uint32 type, EncounterState state) + { + if (!InstanceScript::SetBossState(type, state)) + return false; + + return true; + } + + std::string GetSaveData() + { + OUT_SAVE_INST_DATA; + + std::ostringstream saveStream; + saveStream << "B O " << GetBossSaveData(); + + OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); + } + + void Load(char const* str) + { + 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 == 'O') + { + for (uint32 i = 0; i < MAX_ENCOUNTER; ++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; + } + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_the_botanica_InstanceMapScript(map); + } }; class spell_botanica_call_of_the_falcon : public SpellScriptLoader @@ -90,7 +90,7 @@ public: _falconSet.clear(); return true; } - + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { std::list creatureList; @@ -119,8 +119,8 @@ public: OnEffectRemove += AuraEffectRemoveFn(spell_botanica_call_of_the_falcon_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); } - private: - std::set _falconSet; + private: + std::set _falconSet; }; AuraScript* GetAuraScript() const @@ -131,67 +131,75 @@ public: class spell_botanica_shift_form : public SpellScriptLoader { - public: - spell_botanica_shift_form() : SpellScriptLoader("spell_botanica_shift_form") { } +public: + spell_botanica_shift_form() : SpellScriptLoader("spell_botanica_shift_form") { } - class spell_botanica_shift_form_AuraScript : public AuraScript + class spell_botanica_shift_form_AuraScript : public AuraScript + { + PrepareAuraScript(spell_botanica_shift_form_AuraScript); + + bool Load() { - PrepareAuraScript(spell_botanica_shift_form_AuraScript); + _lastSchool = 0; + _lastForm = 0; + _swapTime = 0; + return true; + } - bool Load() + bool CheckProc(ProcEventInfo& eventInfo) + { + if (SpellInfo const* spellInfo = eventInfo.GetDamageInfo()->GetSpellInfo()) { - _lastSchool = 0; - _lastForm = 0; - _swapTime = 0; - return true; - } + if ((spellInfo->GetSchoolMask() & _lastSchool) && _swapTime > time(nullptr)) + return false; - bool CheckProc(ProcEventInfo& eventInfo) - { - if (SpellInfo const* spellInfo = eventInfo.GetDamageInfo()->GetSpellInfo()) + uint32 form = 0; + switch (GetFirstSchoolInMask(spellInfo->GetSchoolMask())) { - if ((spellInfo->GetSchoolMask() & _lastSchool) && _swapTime > time(nullptr)) - return false; - - uint32 form = 0; - switch (GetFirstSchoolInMask(spellInfo->GetSchoolMask())) - { - case SPELL_SCHOOL_FIRE: form = SPELL_FIRE_FORM; break; - case SPELL_SCHOOL_FROST: form = SPELL_FROST_FORM; break; - case SPELL_SCHOOL_ARCANE: form = SPELL_ARCANE_FORM; break; - case SPELL_SCHOOL_SHADOW: form = SPELL_SHADOW_FORM; break; - default: - break; - } - - if (form) - { - _swapTime = time(nullptr) + 6; - _lastSchool = spellInfo->GetSchoolMask(); - GetUnitOwner()->RemoveAurasDueToSpell(_lastForm); - _lastForm = form; - GetUnitOwner()->CastSpell(GetUnitOwner(), _lastForm, true); - } + case SPELL_SCHOOL_FIRE: + form = SPELL_FIRE_FORM; + break; + case SPELL_SCHOOL_FROST: + form = SPELL_FROST_FORM; + break; + case SPELL_SCHOOL_ARCANE: + form = SPELL_ARCANE_FORM; + break; + case SPELL_SCHOOL_SHADOW: + form = SPELL_SHADOW_FORM; + break; + default: + break; } - return false; + if (form) + { + _swapTime = time(nullptr) + 6; + _lastSchool = spellInfo->GetSchoolMask(); + GetUnitOwner()->RemoveAurasDueToSpell(_lastForm); + _lastForm = form; + GetUnitOwner()->CastSpell(GetUnitOwner(), _lastForm, true); + } } - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_botanica_shift_form_AuraScript::CheckProc); - } - - private: - uint32 _lastSchool; - uint32 _lastForm; - uint32 _swapTime; - }; - - AuraScript* GetAuraScript() const - { - return new spell_botanica_shift_form_AuraScript(); + return false; } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_botanica_shift_form_AuraScript::CheckProc); + } + + private: + uint32 _lastSchool; + uint32 _lastForm; + uint32 _swapTime; + }; + + AuraScript* GetAuraScript() const + { + return new spell_botanica_shift_form_AuraScript(); + } }; void AddSC_instance_the_botanica() diff --git a/src/server/scripts/Outland/boss_doomlord_kazzak.cpp b/src/server/scripts/Outland/boss_doomlord_kazzak.cpp index ad0d03bfb..3e7ebcedb 100644 --- a/src/server/scripts/Outland/boss_doomlord_kazzak.cpp +++ b/src/server/scripts/Outland/boss_doomlord_kazzak.cpp @@ -48,166 +48,166 @@ enum Events class boss_doomlord_kazzak : public CreatureScript { - public: - boss_doomlord_kazzak() : CreatureScript("boss_doomlord_kazzak") { } +public: + boss_doomlord_kazzak() : CreatureScript("boss_doomlord_kazzak") { } - struct boss_doomlordkazzakAI : public ScriptedAI + struct boss_doomlordkazzakAI : public ScriptedAI + { + boss_doomlordkazzakAI(Creature* creature) : ScriptedAI(creature) { - boss_doomlordkazzakAI(Creature* creature) : ScriptedAI(creature) - { - } - - void Reset() - { - _events.Reset(); - _events.ScheduleEvent(EVENT_SHADOW_VOLLEY, urand(6000, 10000)); - _events.ScheduleEvent(EVENT_CLEAVE, 7000); - _events.ScheduleEvent(EVENT_THUNDERCLAP, urand(14000, 18000)); - _events.ScheduleEvent(EVENT_VOID_BOLT, 30000); - _events.ScheduleEvent(EVENT_MARK_OF_KAZZAK, 25000); - _events.ScheduleEvent(EVENT_ENRAGE, 60000); - _events.ScheduleEvent(EVENT_TWISTED_REFLECTION, 33000); - _events.ScheduleEvent(EVENT_BERSERK, 180000); - } - - void JustRespawned() - { - Talk(SAY_INTRO); - } - - void EnterCombat(Unit* /*who*/) - { - Talk(SAY_AGGRO); - } - - void KilledUnit(Unit* victim) - { - // When Kazzak kills a player (not pets/totems), he regens some health - if (victim->GetTypeId() != TYPEID_PLAYER) - return; - - DoCast(me, SPELL_CAPTURE_SOUL); - - Talk(SAY_KILL); - } - - void JustDied(Unit* /*killer*/) - { - Talk(SAY_DEATH); - } - - void UpdateAI(uint32 diff) - { - // Return since we have no target - if (!UpdateVictim()) - return; - - _events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = _events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_SHADOW_VOLLEY: - DoCastVictim(SPELL_SHADOW_VOLLEY); - _events.ScheduleEvent(EVENT_SHADOW_VOLLEY, urand(4000, 6000)); - break; - case EVENT_CLEAVE: - DoCastVictim(SPELL_CLEAVE); - _events.ScheduleEvent(EVENT_CLEAVE, urand(8000, 12000)); - break; - case EVENT_THUNDERCLAP: - DoCastVictim(SPELL_THUNDERCLAP); - _events.ScheduleEvent(EVENT_THUNDERCLAP, urand(10000, 14000)); - break; - case EVENT_VOID_BOLT: - DoCastVictim(SPELL_VOID_BOLT); - _events.ScheduleEvent(EVENT_VOID_BOLT, urand(15000, 18000)); - break; - case EVENT_MARK_OF_KAZZAK: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, PowerUsersSelector(me, POWER_MANA, 100.0f, true))) - DoCast(target, SPELL_MARK_OF_KAZZAK); - _events.ScheduleEvent(EVENT_MARK_OF_KAZZAK, 20000); - break; - case EVENT_ENRAGE: - Talk(EMOTE_FRENZY); - DoCast(me, SPELL_ENRAGE); - _events.ScheduleEvent(EVENT_ENRAGE, 30000); - break; - case EVENT_TWISTED_REFLECTION: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) - DoCast(target, SPELL_TWISTED_REFLECTION); - _events.ScheduleEvent(EVENT_TWISTED_REFLECTION, 15000); - break; - case EVENT_BERSERK: - DoCast(me, SPELL_BERSERK); - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); - } - - private: - EventMap _events; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_doomlordkazzakAI (creature); } + + void Reset() + { + _events.Reset(); + _events.ScheduleEvent(EVENT_SHADOW_VOLLEY, urand(6000, 10000)); + _events.ScheduleEvent(EVENT_CLEAVE, 7000); + _events.ScheduleEvent(EVENT_THUNDERCLAP, urand(14000, 18000)); + _events.ScheduleEvent(EVENT_VOID_BOLT, 30000); + _events.ScheduleEvent(EVENT_MARK_OF_KAZZAK, 25000); + _events.ScheduleEvent(EVENT_ENRAGE, 60000); + _events.ScheduleEvent(EVENT_TWISTED_REFLECTION, 33000); + _events.ScheduleEvent(EVENT_BERSERK, 180000); + } + + void JustRespawned() + { + Talk(SAY_INTRO); + } + + void EnterCombat(Unit* /*who*/) + { + Talk(SAY_AGGRO); + } + + void KilledUnit(Unit* victim) + { + // When Kazzak kills a player (not pets/totems), he regens some health + if (victim->GetTypeId() != TYPEID_PLAYER) + return; + + DoCast(me, SPELL_CAPTURE_SOUL); + + Talk(SAY_KILL); + } + + void JustDied(Unit* /*killer*/) + { + Talk(SAY_DEATH); + } + + void UpdateAI(uint32 diff) + { + // Return since we have no target + if (!UpdateVictim()) + return; + + _events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_SHADOW_VOLLEY: + DoCastVictim(SPELL_SHADOW_VOLLEY); + _events.ScheduleEvent(EVENT_SHADOW_VOLLEY, urand(4000, 6000)); + break; + case EVENT_CLEAVE: + DoCastVictim(SPELL_CLEAVE); + _events.ScheduleEvent(EVENT_CLEAVE, urand(8000, 12000)); + break; + case EVENT_THUNDERCLAP: + DoCastVictim(SPELL_THUNDERCLAP); + _events.ScheduleEvent(EVENT_THUNDERCLAP, urand(10000, 14000)); + break; + case EVENT_VOID_BOLT: + DoCastVictim(SPELL_VOID_BOLT); + _events.ScheduleEvent(EVENT_VOID_BOLT, urand(15000, 18000)); + break; + case EVENT_MARK_OF_KAZZAK: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, PowerUsersSelector(me, POWER_MANA, 100.0f, true))) + DoCast(target, SPELL_MARK_OF_KAZZAK); + _events.ScheduleEvent(EVENT_MARK_OF_KAZZAK, 20000); + break; + case EVENT_ENRAGE: + Talk(EMOTE_FRENZY); + DoCast(me, SPELL_ENRAGE); + _events.ScheduleEvent(EVENT_ENRAGE, 30000); + break; + case EVENT_TWISTED_REFLECTION: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) + DoCast(target, SPELL_TWISTED_REFLECTION); + _events.ScheduleEvent(EVENT_TWISTED_REFLECTION, 15000); + break; + case EVENT_BERSERK: + DoCast(me, SPELL_BERSERK); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + + private: + EventMap _events; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_doomlordkazzakAI (creature); + } }; class spell_mark_of_kazzak : public SpellScriptLoader { - public: - spell_mark_of_kazzak() : SpellScriptLoader("spell_mark_of_kazzak") { } +public: + spell_mark_of_kazzak() : SpellScriptLoader("spell_mark_of_kazzak") { } - class spell_mark_of_kazzak_AuraScript : public AuraScript + class spell_mark_of_kazzak_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mark_of_kazzak_AuraScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareAuraScript(spell_mark_of_kazzak_AuraScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_MARK_OF_KAZZAK_DAMAGE)) - return false; - return true; - } - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - if (Unit* owner = GetUnitOwner()) - amount = CalculatePct(owner->GetPower(POWER_MANA), 5); - } - - void OnPeriodic(AuraEffect const* aurEff) - { - Unit* target = GetTarget(); - - if (target->GetPower(POWER_MANA) == 0) - { - target->CastSpell(target, SPELL_MARK_OF_KAZZAK_DAMAGE, true, NULL, aurEff); - // Remove aura - SetDuration(0); - } - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mark_of_kazzak_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_MANA_LEECH); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_mark_of_kazzak_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_MANA_LEECH); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_mark_of_kazzak_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_MARK_OF_KAZZAK_DAMAGE)) + return false; + return true; } + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + if (Unit* owner = GetUnitOwner()) + amount = CalculatePct(owner->GetPower(POWER_MANA), 5); + } + + void OnPeriodic(AuraEffect const* aurEff) + { + Unit* target = GetTarget(); + + if (target->GetPower(POWER_MANA) == 0) + { + target->CastSpell(target, SPELL_MARK_OF_KAZZAK_DAMAGE, true, NULL, aurEff); + // Remove aura + SetDuration(0); + } + } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mark_of_kazzak_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_MANA_LEECH); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_mark_of_kazzak_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_MANA_LEECH); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_mark_of_kazzak_AuraScript(); + } }; void AddSC_boss_doomlordkazzak() diff --git a/src/server/scripts/Outland/boss_doomwalker.cpp b/src/server/scripts/Outland/boss_doomwalker.cpp index 89127cbd2..8c30bc60a 100644 --- a/src/server/scripts/Outland/boss_doomwalker.cpp +++ b/src/server/scripts/Outland/boss_doomwalker.cpp @@ -38,118 +38,118 @@ enum Events class boss_doomwalker : public CreatureScript { - public: - boss_doomwalker() : CreatureScript("boss_doomwalker") { } +public: + boss_doomwalker() : CreatureScript("boss_doomwalker") { } - struct boss_doomwalkerAI : public ScriptedAI + struct boss_doomwalkerAI : public ScriptedAI + { + boss_doomwalkerAI(Creature* creature) : ScriptedAI(creature) { - boss_doomwalkerAI(Creature* creature) : ScriptedAI(creature) - { - } - - void Reset() - { - _events.Reset(); - _events.ScheduleEvent(EVENT_ENRAGE, 0); - _events.ScheduleEvent(EVENT_ARMOR, urand(5000, 13000)); - _events.ScheduleEvent(EVENT_CHAIN, urand(10000, 30000)); - _events.ScheduleEvent(EVENT_QUAKE, urand(25000, 35000)); - _events.ScheduleEvent(EVENT_OVERRUN, urand(30000, 45000)); - _inEnrage = false; - } - - void KilledUnit(Unit* victim) - { - victim->CastSpell(victim, SPELL_MARK_DEATH, 0); - - if (urand(0, 4)) - return; - - Talk(SAY_SLAY); - } - - void JustDied(Unit* /*killer*/) - { - Talk(SAY_DEATH); - } - - void EnterCombat(Unit* /*who*/) - { - Talk(SAY_AGGRO); - } - - void MoveInLineOfSight(Unit* who) - { - if (who && who->GetTypeId() == TYPEID_PLAYER && me->IsValidAttackTarget(who)) - if (who->HasAura(SPELL_MARK_DEATH,0) && !who->HasAura(27827)) // Spirit of Redemption - who->CastSpell(who, SPELL_AURA_DEATH, 1); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - _events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = _events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_ENRAGE: - if (!HealthAbovePct(20)) - { - DoCast(me, SPELL_ENRAGE); - _events.ScheduleEvent(EVENT_ENRAGE, 6000); - _inEnrage = true; - } - break; - case EVENT_OVERRUN: - Talk(SAY_OVERRUN); - DoCastVictim(SPELL_OVERRUN); - _events.ScheduleEvent(EVENT_OVERRUN, urand(25000, 40000)); - break; - case EVENT_QUAKE: - if (urand(0, 1)) - return; - - Talk(SAY_EARTHQUAKE); - - //remove enrage before casting earthquake because enrage + earthquake = 16000dmg over 8sec and all dead - if (_inEnrage) - me->RemoveAurasDueToSpell(SPELL_ENRAGE); - - DoCast(me, SPELL_EARTHQUAKE); - _events.ScheduleEvent(EVENT_QUAKE, urand(30000, 55000)); - break; - case EVENT_CHAIN: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true)) - DoCast(target, SPELL_CHAIN_LIGHTNING); - _events.ScheduleEvent(EVENT_CHAIN, urand(7000, 27000)); - break; - case EVENT_ARMOR: - DoCastVictim(SPELL_SUNDER_ARMOR); - _events.ScheduleEvent(EVENT_ARMOR, urand(10000, 25000)); - break; - default: - break; - } - } - DoMeleeAttackIfReady(); - } - - private: - EventMap _events; - bool _inEnrage; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_doomwalkerAI (creature); } + + void Reset() + { + _events.Reset(); + _events.ScheduleEvent(EVENT_ENRAGE, 0); + _events.ScheduleEvent(EVENT_ARMOR, urand(5000, 13000)); + _events.ScheduleEvent(EVENT_CHAIN, urand(10000, 30000)); + _events.ScheduleEvent(EVENT_QUAKE, urand(25000, 35000)); + _events.ScheduleEvent(EVENT_OVERRUN, urand(30000, 45000)); + _inEnrage = false; + } + + void KilledUnit(Unit* victim) + { + victim->CastSpell(victim, SPELL_MARK_DEATH, 0); + + if (urand(0, 4)) + return; + + Talk(SAY_SLAY); + } + + void JustDied(Unit* /*killer*/) + { + Talk(SAY_DEATH); + } + + void EnterCombat(Unit* /*who*/) + { + Talk(SAY_AGGRO); + } + + void MoveInLineOfSight(Unit* who) + { + if (who && who->GetTypeId() == TYPEID_PLAYER && me->IsValidAttackTarget(who)) + if (who->HasAura(SPELL_MARK_DEATH, 0) && !who->HasAura(27827)) // Spirit of Redemption + who->CastSpell(who, SPELL_AURA_DEATH, 1); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + _events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_ENRAGE: + if (!HealthAbovePct(20)) + { + DoCast(me, SPELL_ENRAGE); + _events.ScheduleEvent(EVENT_ENRAGE, 6000); + _inEnrage = true; + } + break; + case EVENT_OVERRUN: + Talk(SAY_OVERRUN); + DoCastVictim(SPELL_OVERRUN); + _events.ScheduleEvent(EVENT_OVERRUN, urand(25000, 40000)); + break; + case EVENT_QUAKE: + if (urand(0, 1)) + return; + + Talk(SAY_EARTHQUAKE); + + //remove enrage before casting earthquake because enrage + earthquake = 16000dmg over 8sec and all dead + if (_inEnrage) + me->RemoveAurasDueToSpell(SPELL_ENRAGE); + + DoCast(me, SPELL_EARTHQUAKE); + _events.ScheduleEvent(EVENT_QUAKE, urand(30000, 55000)); + break; + case EVENT_CHAIN: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true)) + DoCast(target, SPELL_CHAIN_LIGHTNING); + _events.ScheduleEvent(EVENT_CHAIN, urand(7000, 27000)); + break; + case EVENT_ARMOR: + DoCastVictim(SPELL_SUNDER_ARMOR); + _events.ScheduleEvent(EVENT_ARMOR, urand(10000, 25000)); + break; + default: + break; + } + } + DoMeleeAttackIfReady(); + } + + private: + EventMap _events; + bool _inEnrage; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_doomwalkerAI (creature); + } }; void AddSC_boss_doomwalker() diff --git a/src/server/scripts/Outland/zone_blades_edge_mountains.cpp b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp index 8949c8204..3e4240054 100644 --- a/src/server/scripts/Outland/zone_blades_edge_mountains.cpp +++ b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp @@ -67,7 +67,7 @@ public: uint64 PlayerGUID; uint64 CannonGUID; uint8 count; - + void Reset() override { Initialize(); @@ -111,7 +111,7 @@ public: player->KilledMonsterCredit(NPC_NORTH_GATE_CREDIT, TRIGGERED_NONE); // complete quest part if (Creature* bunny = GetClosestCreatureWithEntry(me, NPC_EXPLOSION_BUNNY, 200.0f)) - bunny->CastSpell(nullptr, SPELL_EXPLOSION, TRIGGERED_NONE); + bunny->CastSpell(nullptr, SPELL_EXPLOSION, TRIGGERED_NONE); if (Creature* cannon = ObjectAccessor::GetCreature(*me, CannonGUID)) cannon->DespawnOrUnsummon(5000); } @@ -155,7 +155,7 @@ public: case EVENT_PARTY_TIMER: if (roll_chance_i(20)) me->SummonCreature(NPC_HOUND, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); - else + else me->SummonCreature(NPC_FEL_IMP, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); events.ScheduleEvent(EVENT_PARTY_TIMER, 3000); break; @@ -188,14 +188,14 @@ public: { if (me->IsNonMeleeSpellCast(false)) return; - + if (Creature* Target = GetClosestCreatureWithEntry(me, NPC_DEATHS_DOOR_FEL_CANNON_TARGET_BUNNY, 200.0f)) { me->SetFacingToObject(Target); me->TauntFadeOut(Target); me->CombatStop(); // force } - + Reset(); } }; @@ -208,30 +208,30 @@ public: class spell_npc22275_crystal_prison : public SpellScriptLoader { - public: - spell_npc22275_crystal_prison() : SpellScriptLoader("spell_npc22275_crystal_prison") { } +public: + spell_npc22275_crystal_prison() : SpellScriptLoader("spell_npc22275_crystal_prison") { } - class spell_npc22275_crystal_prison_AuraScript : public AuraScript + class spell_npc22275_crystal_prison_AuraScript : public AuraScript + { + PrepareAuraScript(spell_npc22275_crystal_prison_AuraScript); + + void OnPeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_npc22275_crystal_prison_AuraScript); - - void OnPeriodic(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - SetDuration(0); - GetTarget()->CastSpell(GetTarget(), 40898, true); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_npc22275_crystal_prison_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_npc22275_crystal_prison_AuraScript(); + PreventDefaultAction(); + SetDuration(0); + GetTarget()->CastSpell(GetTarget(), 40898, true); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_npc22275_crystal_prison_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_npc22275_crystal_prison_AuraScript(); + } }; // Theirs @@ -320,7 +320,7 @@ public: if (spell->Id == SPELL_T_PHASE_MODULATOR && caster->GetTypeId() == TYPEID_PLAYER) { const uint32 entry_list[4] = {ENTRY_PROTO, ENTRY_ADOLE, ENTRY_MATUR, ENTRY_NIHIL}; - int cid = rand()%(4-1); + int cid = rand() % (4 - 1); if (entry_list[cid] == me->GetEntry()) ++cid; @@ -340,7 +340,8 @@ public: EnterEvadeMode(); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); IsNihil = true; - }else + } + else AttackStart(caster); } } @@ -373,12 +374,13 @@ public: case 4: me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); //take off to location above - me->GetMotionMaster()->MovePoint(0, me->GetPositionX()+50.0f, me->GetPositionY(), me->GetPositionZ()+50.0f); + me->GetMotionMaster()->MovePoint(0, me->GetPositionX() + 50.0f, me->GetPositionY(), me->GetPositionZ() + 50.0f); ++NihilSpeech_Phase; break; } NihilSpeech_Timer = 5000; - } else NihilSpeech_Timer -=diff; + } + else NihilSpeech_Timer -= diff; //anything below here is not interesting for Nihil, so skip it return; @@ -390,22 +392,25 @@ public: if (IntangiblePresence_Timer <= diff) { DoCastVictim(SPELL_INTANGIBLE_PRESENCE); - IntangiblePresence_Timer = 15000+rand()%15000; - } else IntangiblePresence_Timer -= diff; + IntangiblePresence_Timer = 15000 + rand() % 15000; + } + else IntangiblePresence_Timer -= diff; if (ManaBurn_Timer <= diff) { Unit* target = me->GetVictim(); if (target && target->getPowerType() == POWER_MANA) DoCast(target, SPELL_MANA_BURN); - ManaBurn_Timer = 8000+rand()%8000; - } else ManaBurn_Timer -= diff; + ManaBurn_Timer = 8000 + rand() % 8000; + } + else ManaBurn_Timer -= diff; if (ArcaneBlast_Timer <= diff) { DoCastVictim(SPELL_ARCANE_BLAST); - ArcaneBlast_Timer = 2500+rand()%5000; - } else ArcaneBlast_Timer -= diff; + ArcaneBlast_Timer = 2500 + rand() % 5000; + } + else ArcaneBlast_Timer -= diff; DoMeleeAttackIfReady(); } @@ -426,7 +431,7 @@ enum Daranelle SAY_SPELL_INFLUENCE = 0, SPELL_LASHHAN_CHANNEL = 36904, SPELL_DISPELLING_ANALYSIS = 37028, - + NPC_KALIRI_TOTEM = 21468 }; @@ -450,7 +455,7 @@ public: { if (who->HasAura(SPELL_LASHHAN_CHANNEL) && me->IsWithinDistInMap(who, 10.0f)) { - if (Creature * bird = who->FindNearestCreature(NPC_KALIRI_TOTEM, 10.0f)) + if (Creature* bird = who->FindNearestCreature(NPC_KALIRI_TOTEM, 10.0f)) { Talk(SAY_SPELL_INFLUENCE, who); /// @todo Move the below to updateAI and run if this statement == true @@ -543,470 +548,470 @@ enum SimonColors class npc_simon_bunny : public CreatureScript { - public: - npc_simon_bunny() : CreatureScript("npc_simon_bunny") { } +public: + npc_simon_bunny() : CreatureScript("npc_simon_bunny") { } - struct npc_simon_bunnyAI : public ScriptedAI + struct npc_simon_bunnyAI : public ScriptedAI + { + npc_simon_bunnyAI(Creature* creature) : ScriptedAI(creature) { } + + bool large; + bool listening; + uint8 gameLevel; + uint8 fails; + uint8 gameTicks; + uint64 playerGUID; + uint32 clusterIds[SIMON_MAX_COLORS]; + float zCoordCorrection; + float searchDistance; + EventMap _events; + std::list colorSequence, playableSequence, playerSequence; + + void UpdateAI(uint32 diff) { - npc_simon_bunnyAI(Creature* creature) : ScriptedAI(creature) { } + _events.Update(diff); - bool large; - bool listening; - uint8 gameLevel; - uint8 fails; - uint8 gameTicks; - uint64 playerGUID; - uint32 clusterIds[SIMON_MAX_COLORS]; - float zCoordCorrection; - float searchDistance; - EventMap _events; - std::list colorSequence, playableSequence, playerSequence; - - void UpdateAI(uint32 diff) + switch (_events.ExecuteEvent()) { - _events.Update(diff); - - switch (_events.ExecuteEvent()) - { - case EVENT_SIMON_PERIODIC_PLAYER_CHECK: - if (!CheckPlayer()) - ResetNode(); - else - _events.ScheduleEvent(EVENT_SIMON_PERIODIC_PLAYER_CHECK, 2000); - break; - case EVENT_SIMON_SETUP_PRE_GAME: - SetUpPreGame(); - _events.CancelEvent(EVENT_SIMON_GAME_TICK); - _events.ScheduleEvent(EVENT_SIMON_PLAY_SEQUENCE, 1000); - break; - case EVENT_SIMON_PLAY_SEQUENCE: - if (!playableSequence.empty()) - { - PlayNextColor(); - _events.ScheduleEvent(EVENT_SIMON_PLAY_SEQUENCE, 1500); - } - else - { - listening = true; - DoCast(SPELL_VISUAL_START_PLAYER_LEVEL); - playerSequence.clear(); - PrepareClusters(); - gameTicks = 0; - _events.ScheduleEvent(EVENT_SIMON_GAME_TICK, 3000); - } - break; - case EVENT_SIMON_GAME_TICK: - DoCast(SPELL_AUDIBLE_GAME_TICK); - - if (gameTicks > gameLevel) - _events.ScheduleEvent(EVENT_SIMON_TOO_LONG_TIME, 500); - else - _events.ScheduleEvent(EVENT_SIMON_GAME_TICK, 3000); - gameTicks++; - break; - case EVENT_SIMON_RESET_CLUSTERS: - PrepareClusters(true); - break; - case EVENT_SIMON_TOO_LONG_TIME: - DoAction(ACTION_SIMON_WRONG_SEQUENCE); - break; - case EVENT_SIMON_ROUND_FINISHED: - DoAction(ACTION_SIMON_ROUND_FINISHED); - break; - } - } - - void DoAction(int32 action) - { - switch (action) - { - case ACTION_SIMON_ROUND_FINISHED: - listening = false; - DoCast(SPELL_VISUAL_START_AI_LEVEL); - GiveRewardForLevel(gameLevel); - _events.CancelEventGroup(0); - if (gameLevel == 10) - ResetNode(); - else - _events.ScheduleEvent(EVENT_SIMON_SETUP_PRE_GAME, 1000); - break; - case ACTION_SIMON_CORRECT_FULL_SEQUENCE: - gameLevel++; - DoAction(ACTION_SIMON_ROUND_FINISHED); - break; - case ACTION_SIMON_WRONG_SEQUENCE: - GivePunishment(); - DoAction(ACTION_SIMON_ROUND_FINISHED); - break; - } - } - - // Called by color clusters script (go_simon_cluster) and used for knowing the button pressed by player - void SetData(uint32 type, uint32 /*data*/) - { - if (!listening) - return; - - uint8 pressedColor = SIMON_MAX_COLORS; - - if (type == clusterIds[SIMON_RED]) - pressedColor = SIMON_RED; - else if (type == clusterIds[SIMON_BLUE]) - pressedColor = SIMON_BLUE; - else if (type == clusterIds[SIMON_GREEN]) - pressedColor = SIMON_GREEN; - else if (type == clusterIds[SIMON_YELLOW]) - pressedColor = SIMON_YELLOW; - - PlayColor(pressedColor); - playerSequence.push_back(pressedColor); - _events.ScheduleEvent(EVENT_SIMON_RESET_CLUSTERS, 500); - CheckPlayerSequence(); - } - - // Used for getting involved player guid. Parameter id is used for defining if is a large(Monument) or small(Relic) node - void SetGUID(uint64 guid, int32 id) - { - me->SetCanFly(true); - - large = (bool)id; - playerGUID = guid; - StartGame(); - } - - /* - Resets all variables and also find the ids of the four closests color clusters, since every simon - node have diferent ids for clusters this is absolutely NECESSARY. - */ - void StartGame() - { - listening = false; - gameLevel = 0; - fails = 0; - gameTicks = 0; - zCoordCorrection = large ? 8.0f : 2.75f; - searchDistance = large ? 13.0f : 5.0f; - colorSequence.clear(); - playableSequence.clear(); - playerSequence.clear(); - me->SetObjectScale(large ? 2.0f : 1.0f); - - std::list ClusterList; - acore::AllWorldObjectsInRange objects(me, searchDistance); - acore::WorldObjectListSearcher searcher(me, ClusterList, objects); - me->VisitNearbyObject(searchDistance, searcher); - - for (std::list::const_iterator i = ClusterList.begin(); i != ClusterList.end(); ++i) - { - if (GameObject* go = (*i)->ToGameObject()) - { - // We are checking for displayid because all simon nodes have 4 clusters with different entries - if (large) - { - switch (go->GetGOInfo()->displayId) - { - case GO_BLUE_CLUSTER_DISPLAY_LARGE: - clusterIds[SIMON_BLUE] = go->GetEntry(); - break; - - case GO_RED_CLUSTER_DISPLAY_LARGE: - clusterIds[SIMON_RED] = go->GetEntry(); - break; - - case GO_GREEN_CLUSTER_DISPLAY_LARGE: - clusterIds[SIMON_GREEN] = go->GetEntry(); - break; - - case GO_YELLOW_CLUSTER_DISPLAY_LARGE: - clusterIds[SIMON_YELLOW] = go->GetEntry(); - break; - } - } - else - { - switch (go->GetGOInfo()->displayId) - { - case GO_BLUE_CLUSTER_DISPLAY: - clusterIds[SIMON_BLUE] = go->GetEntry(); - break; - - case GO_RED_CLUSTER_DISPLAY: - clusterIds[SIMON_RED] = go->GetEntry(); - break; - - case GO_GREEN_CLUSTER_DISPLAY: - clusterIds[SIMON_GREEN] = go->GetEntry(); - break; - - case GO_YELLOW_CLUSTER_DISPLAY: - clusterIds[SIMON_YELLOW] = go->GetEntry(); - break; - } - } - } - } - - _events.Reset(); - _events.ScheduleEvent(EVENT_SIMON_ROUND_FINISHED, 1000); - _events.ScheduleEvent(EVENT_SIMON_PERIODIC_PLAYER_CHECK, 2000); - - if (GameObject* relic = me->FindNearestGameObject(large ? GO_APEXIS_MONUMENT : GO_APEXIS_RELIC, searchDistance)) - relic->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - } - - // Called when despawning the bunny. Sets all the node GOs to their default states. - void ResetNode() - { - DoPlaySoundToSet(me, SOUND_DISABLE_NODE); - - for (uint32 clusterId = SIMON_BLUE; clusterId < SIMON_MAX_COLORS; clusterId++) - if (GameObject* cluster = me->FindNearestGameObject(clusterIds[clusterId], searchDistance)) - cluster->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - - for (uint32 auraId = GO_AURA_BLUE; auraId <= GO_AURA_YELLOW; auraId++) - if (GameObject* auraGo = me->FindNearestGameObject(auraId, searchDistance)) - auraGo->RemoveFromWorld(); - - if (GameObject* relic = me->FindNearestGameObject(large ? GO_APEXIS_MONUMENT : GO_APEXIS_RELIC, searchDistance)) - relic->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - - me->DespawnOrUnsummon(1000); - } - - /* - Called on every button click of player. Adds the clicked color to the player created sequence and - checks if it corresponds to the AI created sequence. If so, incremente gameLevel and start a new - round, if not, give punishment and restart current level. - */ - void CheckPlayerSequence() - { - bool correct = true; - if (playerSequence.size() <= colorSequence.size()) - for (std::list::const_iterator i = playerSequence.begin(), j = colorSequence.begin(); i != playerSequence.end(); ++i, ++j) - if ((*i) != (*j)) - correct = false; - - if (correct && (playerSequence.size() == colorSequence.size())) - DoAction(ACTION_SIMON_CORRECT_FULL_SEQUENCE); - else if (!correct) - DoAction(ACTION_SIMON_WRONG_SEQUENCE); - } - - /* - Generates a random sequence of colors depending on the gameLevel. We also copy this sequence to - the playableSequence wich will be used when playing the sequence to the player. - */ - void GenerateColorSequence() - { - colorSequence.clear(); - for (uint8 i = 0; i <= gameLevel; i++) - colorSequence.push_back(RAND(SIMON_BLUE, SIMON_RED, SIMON_GREEN, SIMON_YELLOW)); - - for (std::list::const_iterator i = colorSequence.begin(); i != colorSequence.end(); ++i) - playableSequence.push_back(*i); - } - - - // Remove any existant glowing auras over clusters and set clusters ready for interating with them. - void PrepareClusters(bool clustersOnly = false) - { - for (uint32 clusterId = SIMON_BLUE; clusterId < SIMON_MAX_COLORS; clusterId++) - if (GameObject* cluster = me->FindNearestGameObject(clusterIds[clusterId], searchDistance)) - cluster->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - - if (clustersOnly) - return; - - for (uint32 auraId = GO_AURA_BLUE; auraId <= GO_AURA_YELLOW; auraId++) - if (GameObject* auraGo = me->FindNearestGameObject(auraId, searchDistance)) - auraGo->RemoveFromWorld(); - } - - /* - Called when AI is playing the sequence for player. We cast the visual spell and then remove the - cast color from the casting sequence. - */ - void PlayNextColor() - { - PlayColor(*playableSequence.begin()); - playableSequence.erase(playableSequence.begin()); - } - - // Casts a spell and plays a sound depending on parameter color. - void PlayColor(uint8 color) - { - switch (color) - { - case SIMON_BLUE: - DoCast(SPELL_VISUAL_BLUE); - DoPlaySoundToSet(me, SOUND_BLUE); - break; - case SIMON_GREEN: - DoCast(SPELL_VISUAL_GREEN); - DoPlaySoundToSet(me, SOUND_GREEN); - break; - case SIMON_RED: - DoCast(SPELL_VISUAL_RED); - DoPlaySoundToSet(me, SOUND_RED); - break; - case SIMON_YELLOW: - DoCast(SPELL_VISUAL_YELLOW); - DoPlaySoundToSet(me, SOUND_YELLOW); - break; - } - } - - /* - Creates the transparent glowing auras on every cluster of this node. - After calling this function bunny is teleported to the center of the node. - */ - void SetUpPreGame() - { - for (uint32 clusterId = SIMON_BLUE; clusterId < SIMON_MAX_COLORS; clusterId++) - { - if (GameObject* cluster = me->FindNearestGameObject(clusterIds[clusterId], 2.0f*searchDistance)) - { - cluster->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - - // break since we don't need glowing auras for large clusters - if (large) - break; - - float x, y, z, o; - cluster->GetPosition(x, y, z, o); - me->NearTeleportTo(x, y, z, o); - - uint32 preGameSpellId; - if (cluster->GetEntry() == clusterIds[SIMON_RED]) - preGameSpellId = SPELL_PRE_GAME_RED; - else if (cluster->GetEntry() == clusterIds[SIMON_BLUE]) - preGameSpellId = SPELL_PRE_GAME_BLUE; - else if (cluster->GetEntry() == clusterIds[SIMON_GREEN]) - preGameSpellId = SPELL_PRE_GAME_GREEN; - else if (cluster->GetEntry() == clusterIds[SIMON_YELLOW]) - preGameSpellId = SPELL_PRE_GAME_YELLOW; - else break; - - me->CastSpell(cluster, preGameSpellId, true); - } - } - - if (GameObject* relic = me->FindNearestGameObject(large ? GO_APEXIS_MONUMENT : GO_APEXIS_RELIC, searchDistance)) - { - float x, y, z, o; - relic->GetPosition(x, y, z, o); - me->NearTeleportTo(x, y, z + zCoordCorrection, o); - } - - GenerateColorSequence(); - } - - // Handles the spell rewards. The spells also have the QuestCompleteEffect, so quests credits are working. - void GiveRewardForLevel(uint8 level) - { - uint32 rewSpell = 0; - switch (level) - { - case 6: - if (large) - GivePunishment(); - else - rewSpell = SPELL_REWARD_BUFF_1; - break; - case 8: - rewSpell = SPELL_REWARD_BUFF_2; - break; - case 10: - rewSpell = SPELL_REWARD_BUFF_3; - break; - } - - if (rewSpell) - if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) - DoCast(player, rewSpell, true); - } - - /* - Depending on the number of failed pushes for player the damage of the spell scales, so we first - cast the spell on the target that hits for 50 and shows the visual and then forces the player - to cast the damaging spell on it self with the modified basepoints. - 4 fails = death. - On large nodes punishment and reward are the same, summoning the Apexis Guardian. - */ - void GivePunishment() - { - if (large) - { - if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) - if (Creature* guardian = me->SummonCreature(NPC_APEXIS_GUARDIAN, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() - zCoordCorrection, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 20000)) - guardian->AI()->AttackStart(player); - - ResetNode(); - } - else - { - fails++; - - if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) - DoCast(player, SPELL_BAD_PRESS_TRIGGER, true); - - if (fails >= 4) + case EVENT_SIMON_PERIODIC_PLAYER_CHECK: + if (!CheckPlayer()) ResetNode(); - } - } + else + _events.ScheduleEvent(EVENT_SIMON_PERIODIC_PLAYER_CHECK, 2000); + break; + case EVENT_SIMON_SETUP_PRE_GAME: + SetUpPreGame(); + _events.CancelEvent(EVENT_SIMON_GAME_TICK); + _events.ScheduleEvent(EVENT_SIMON_PLAY_SEQUENCE, 1000); + break; + case EVENT_SIMON_PLAY_SEQUENCE: + if (!playableSequence.empty()) + { + PlayNextColor(); + _events.ScheduleEvent(EVENT_SIMON_PLAY_SEQUENCE, 1500); + } + else + { + listening = true; + DoCast(SPELL_VISUAL_START_PLAYER_LEVEL); + playerSequence.clear(); + PrepareClusters(); + gameTicks = 0; + _events.ScheduleEvent(EVENT_SIMON_GAME_TICK, 3000); + } + break; + case EVENT_SIMON_GAME_TICK: + DoCast(SPELL_AUDIBLE_GAME_TICK); - void SpellHitTarget(Unit* target, const SpellInfo* spell) + if (gameTicks > gameLevel) + _events.ScheduleEvent(EVENT_SIMON_TOO_LONG_TIME, 500); + else + _events.ScheduleEvent(EVENT_SIMON_GAME_TICK, 3000); + gameTicks++; + break; + case EVENT_SIMON_RESET_CLUSTERS: + PrepareClusters(true); + break; + case EVENT_SIMON_TOO_LONG_TIME: + DoAction(ACTION_SIMON_WRONG_SEQUENCE); + break; + case EVENT_SIMON_ROUND_FINISHED: + DoAction(ACTION_SIMON_ROUND_FINISHED); + break; + } + } + + void DoAction(int32 action) + { + switch (action) { - // Cast SPELL_BAD_PRESS_DAMAGE with scaled basepoints when the visual hits the target. - // Need Fix: When SPELL_BAD_PRESS_TRIGGER hits target it triggers spell SPELL_BAD_PRESS_DAMAGE by itself - // so player gets damage equal to calculated damage dbc basepoints for SPELL_BAD_PRESS_DAMAGE (~50) - if (spell->Id == SPELL_BAD_PRESS_TRIGGER) + case ACTION_SIMON_ROUND_FINISHED: + listening = false; + DoCast(SPELL_VISUAL_START_AI_LEVEL); + GiveRewardForLevel(gameLevel); + _events.CancelEventGroup(0); + if (gameLevel == 10) + ResetNode(); + else + _events.ScheduleEvent(EVENT_SIMON_SETUP_PRE_GAME, 1000); + break; + case ACTION_SIMON_CORRECT_FULL_SEQUENCE: + gameLevel++; + DoAction(ACTION_SIMON_ROUND_FINISHED); + break; + case ACTION_SIMON_WRONG_SEQUENCE: + GivePunishment(); + DoAction(ACTION_SIMON_ROUND_FINISHED); + break; + } + } + + // Called by color clusters script (go_simon_cluster) and used for knowing the button pressed by player + void SetData(uint32 type, uint32 /*data*/) + { + if (!listening) + return; + + uint8 pressedColor = SIMON_MAX_COLORS; + + if (type == clusterIds[SIMON_RED]) + pressedColor = SIMON_RED; + else if (type == clusterIds[SIMON_BLUE]) + pressedColor = SIMON_BLUE; + else if (type == clusterIds[SIMON_GREEN]) + pressedColor = SIMON_GREEN; + else if (type == clusterIds[SIMON_YELLOW]) + pressedColor = SIMON_YELLOW; + + PlayColor(pressedColor); + playerSequence.push_back(pressedColor); + _events.ScheduleEvent(EVENT_SIMON_RESET_CLUSTERS, 500); + CheckPlayerSequence(); + } + + // Used for getting involved player guid. Parameter id is used for defining if is a large(Monument) or small(Relic) node + void SetGUID(uint64 guid, int32 id) + { + me->SetCanFly(true); + + large = (bool)id; + playerGUID = guid; + StartGame(); + } + + /* + Resets all variables and also find the ids of the four closests color clusters, since every simon + node have diferent ids for clusters this is absolutely NECESSARY. + */ + void StartGame() + { + listening = false; + gameLevel = 0; + fails = 0; + gameTicks = 0; + zCoordCorrection = large ? 8.0f : 2.75f; + searchDistance = large ? 13.0f : 5.0f; + colorSequence.clear(); + playableSequence.clear(); + playerSequence.clear(); + me->SetObjectScale(large ? 2.0f : 1.0f); + + std::list ClusterList; + acore::AllWorldObjectsInRange objects(me, searchDistance); + acore::WorldObjectListSearcher searcher(me, ClusterList, objects); + me->VisitNearbyObject(searchDistance, searcher); + + for (std::list::const_iterator i = ClusterList.begin(); i != ClusterList.end(); ++i) + { + if (GameObject* go = (*i)->ToGameObject()) { - int32 bp = (int32)((float)(fails)*0.33f*target->GetMaxHealth()); - target->CastCustomSpell(target, SPELL_BAD_PRESS_DAMAGE, &bp, nullptr, nullptr, true); + // We are checking for displayid because all simon nodes have 4 clusters with different entries + if (large) + { + switch (go->GetGOInfo()->displayId) + { + case GO_BLUE_CLUSTER_DISPLAY_LARGE: + clusterIds[SIMON_BLUE] = go->GetEntry(); + break; + + case GO_RED_CLUSTER_DISPLAY_LARGE: + clusterIds[SIMON_RED] = go->GetEntry(); + break; + + case GO_GREEN_CLUSTER_DISPLAY_LARGE: + clusterIds[SIMON_GREEN] = go->GetEntry(); + break; + + case GO_YELLOW_CLUSTER_DISPLAY_LARGE: + clusterIds[SIMON_YELLOW] = go->GetEntry(); + break; + } + } + else + { + switch (go->GetGOInfo()->displayId) + { + case GO_BLUE_CLUSTER_DISPLAY: + clusterIds[SIMON_BLUE] = go->GetEntry(); + break; + + case GO_RED_CLUSTER_DISPLAY: + clusterIds[SIMON_RED] = go->GetEntry(); + break; + + case GO_GREEN_CLUSTER_DISPLAY: + clusterIds[SIMON_GREEN] = go->GetEntry(); + break; + + case GO_YELLOW_CLUSTER_DISPLAY: + clusterIds[SIMON_YELLOW] = go->GetEntry(); + break; + } + } } } - // Checks if player has already die or has get too far from the current node - bool CheckPlayer() + _events.Reset(); + _events.ScheduleEvent(EVENT_SIMON_ROUND_FINISHED, 1000); + _events.ScheduleEvent(EVENT_SIMON_PERIODIC_PLAYER_CHECK, 2000); + + if (GameObject* relic = me->FindNearestGameObject(large ? GO_APEXIS_MONUMENT : GO_APEXIS_RELIC, searchDistance)) + relic->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + } + + // Called when despawning the bunny. Sets all the node GOs to their default states. + void ResetNode() + { + DoPlaySoundToSet(me, SOUND_DISABLE_NODE); + + for (uint32 clusterId = SIMON_BLUE; clusterId < SIMON_MAX_COLORS; clusterId++) + if (GameObject* cluster = me->FindNearestGameObject(clusterIds[clusterId], searchDistance)) + cluster->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + + for (uint32 auraId = GO_AURA_BLUE; auraId <= GO_AURA_YELLOW; auraId++) + if (GameObject* auraGo = me->FindNearestGameObject(auraId, searchDistance)) + auraGo->RemoveFromWorld(); + + if (GameObject* relic = me->FindNearestGameObject(large ? GO_APEXIS_MONUMENT : GO_APEXIS_RELIC, searchDistance)) + relic->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + + me->DespawnOrUnsummon(1000); + } + + /* + Called on every button click of player. Adds the clicked color to the player created sequence and + checks if it corresponds to the AI created sequence. If so, incremente gameLevel and start a new + round, if not, give punishment and restart current level. + */ + void CheckPlayerSequence() + { + bool correct = true; + if (playerSequence.size() <= colorSequence.size()) + for (std::list::const_iterator i = playerSequence.begin(), j = colorSequence.begin(); i != playerSequence.end(); ++i, ++j) + if ((*i) != (*j)) + correct = false; + + if (correct && (playerSequence.size() == colorSequence.size())) + DoAction(ACTION_SIMON_CORRECT_FULL_SEQUENCE); + else if (!correct) + DoAction(ACTION_SIMON_WRONG_SEQUENCE); + } + + /* + Generates a random sequence of colors depending on the gameLevel. We also copy this sequence to + the playableSequence wich will be used when playing the sequence to the player. + */ + void GenerateColorSequence() + { + colorSequence.clear(); + for (uint8 i = 0; i <= gameLevel; i++) + colorSequence.push_back(RAND(SIMON_BLUE, SIMON_RED, SIMON_GREEN, SIMON_YELLOW)); + + for (std::list::const_iterator i = colorSequence.begin(); i != colorSequence.end(); ++i) + playableSequence.push_back(*i); + } + + + // Remove any existant glowing auras over clusters and set clusters ready for interating with them. + void PrepareClusters(bool clustersOnly = false) + { + for (uint32 clusterId = SIMON_BLUE; clusterId < SIMON_MAX_COLORS; clusterId++) + if (GameObject* cluster = me->FindNearestGameObject(clusterIds[clusterId], searchDistance)) + cluster->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + + if (clustersOnly) + return; + + for (uint32 auraId = GO_AURA_BLUE; auraId <= GO_AURA_YELLOW; auraId++) + if (GameObject* auraGo = me->FindNearestGameObject(auraId, searchDistance)) + auraGo->RemoveFromWorld(); + } + + /* + Called when AI is playing the sequence for player. We cast the visual spell and then remove the + cast color from the casting sequence. + */ + void PlayNextColor() + { + PlayColor(*playableSequence.begin()); + playableSequence.erase(playableSequence.begin()); + } + + // Casts a spell and plays a sound depending on parameter color. + void PlayColor(uint8 color) + { + switch (color) + { + case SIMON_BLUE: + DoCast(SPELL_VISUAL_BLUE); + DoPlaySoundToSet(me, SOUND_BLUE); + break; + case SIMON_GREEN: + DoCast(SPELL_VISUAL_GREEN); + DoPlaySoundToSet(me, SOUND_GREEN); + break; + case SIMON_RED: + DoCast(SPELL_VISUAL_RED); + DoPlaySoundToSet(me, SOUND_RED); + break; + case SIMON_YELLOW: + DoCast(SPELL_VISUAL_YELLOW); + DoPlaySoundToSet(me, SOUND_YELLOW); + break; + } + } + + /* + Creates the transparent glowing auras on every cluster of this node. + After calling this function bunny is teleported to the center of the node. + */ + void SetUpPreGame() + { + for (uint32 clusterId = SIMON_BLUE; clusterId < SIMON_MAX_COLORS; clusterId++) + { + if (GameObject* cluster = me->FindNearestGameObject(clusterIds[clusterId], 2.0f * searchDistance)) + { + cluster->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + + // break since we don't need glowing auras for large clusters + if (large) + break; + + float x, y, z, o; + cluster->GetPosition(x, y, z, o); + me->NearTeleportTo(x, y, z, o); + + uint32 preGameSpellId; + if (cluster->GetEntry() == clusterIds[SIMON_RED]) + preGameSpellId = SPELL_PRE_GAME_RED; + else if (cluster->GetEntry() == clusterIds[SIMON_BLUE]) + preGameSpellId = SPELL_PRE_GAME_BLUE; + else if (cluster->GetEntry() == clusterIds[SIMON_GREEN]) + preGameSpellId = SPELL_PRE_GAME_GREEN; + else if (cluster->GetEntry() == clusterIds[SIMON_YELLOW]) + preGameSpellId = SPELL_PRE_GAME_YELLOW; + else break; + + me->CastSpell(cluster, preGameSpellId, true); + } + } + + if (GameObject* relic = me->FindNearestGameObject(large ? GO_APEXIS_MONUMENT : GO_APEXIS_RELIC, searchDistance)) + { + float x, y, z, o; + relic->GetPosition(x, y, z, o); + me->NearTeleportTo(x, y, z + zCoordCorrection, o); + } + + GenerateColorSequence(); + } + + // Handles the spell rewards. The spells also have the QuestCompleteEffect, so quests credits are working. + void GiveRewardForLevel(uint8 level) + { + uint32 rewSpell = 0; + switch (level) + { + case 6: + if (large) + GivePunishment(); + else + rewSpell = SPELL_REWARD_BUFF_1; + break; + case 8: + rewSpell = SPELL_REWARD_BUFF_2; + break; + case 10: + rewSpell = SPELL_REWARD_BUFF_3; + break; + } + + if (rewSpell) + if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) + DoCast(player, rewSpell, true); + } + + /* + Depending on the number of failed pushes for player the damage of the spell scales, so we first + cast the spell on the target that hits for 50 and shows the visual and then forces the player + to cast the damaging spell on it self with the modified basepoints. + 4 fails = death. + On large nodes punishment and reward are the same, summoning the Apexis Guardian. + */ + void GivePunishment() + { + if (large) { if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) - { - if (player->isDead()) - return false; - if (player->GetDistance2d(me) >= 2.0f*searchDistance) - { - GivePunishment(); - return false; - } - } - else - return false; + if (Creature* guardian = me->SummonCreature(NPC_APEXIS_GUARDIAN, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() - zCoordCorrection, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 20000)) + guardian->AI()->AttackStart(player); - return true; + ResetNode(); } - }; + else + { + fails++; - CreatureAI* GetAI(Creature* creature) const - { - return new npc_simon_bunnyAI(creature); + if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) + DoCast(player, SPELL_BAD_PRESS_TRIGGER, true); + + if (fails >= 4) + ResetNode(); + } } + + void SpellHitTarget(Unit* target, const SpellInfo* spell) + { + // Cast SPELL_BAD_PRESS_DAMAGE with scaled basepoints when the visual hits the target. + // Need Fix: When SPELL_BAD_PRESS_TRIGGER hits target it triggers spell SPELL_BAD_PRESS_DAMAGE by itself + // so player gets damage equal to calculated damage dbc basepoints for SPELL_BAD_PRESS_DAMAGE (~50) + if (spell->Id == SPELL_BAD_PRESS_TRIGGER) + { + int32 bp = (int32)((float)(fails) * 0.33f * target->GetMaxHealth()); + target->CastCustomSpell(target, SPELL_BAD_PRESS_DAMAGE, &bp, nullptr, nullptr, true); + } + } + + // Checks if player has already die or has get too far from the current node + bool CheckPlayer() + { + if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) + { + if (player->isDead()) + return false; + if (player->GetDistance2d(me) >= 2.0f * searchDistance) + { + GivePunishment(); + return false; + } + } + else + return false; + + return true; + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_simon_bunnyAI(creature); + } }; class go_simon_cluster : public GameObjectScript { - public: - go_simon_cluster() : GameObjectScript("go_simon_cluster") { } +public: + go_simon_cluster() : GameObjectScript("go_simon_cluster") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - if (Creature* bunny = go->FindNearestCreature(NPC_SIMON_BUNNY, 12.0f, true)) - bunny->AI()->SetData(go->GetEntry(), 0); + bool OnGossipHello(Player* player, GameObject* go) override + { + if (Creature* bunny = go->FindNearestCreature(NPC_SIMON_BUNNY, 12.0f, true)) + bunny->AI()->SetData(go->GetEntry(), 0); - player->CastSpell(player, go->GetGOInfo()->goober.spellId, true); - go->AddUse(); - return true; - } + player->CastSpell(player, go->GetGOInfo()->goober.spellId, true); + go->AddUse(); + return true; + } }; enum ApexisRelic @@ -1021,31 +1026,31 @@ enum ApexisRelic class go_apexis_relic : public GameObjectScript { - public: - go_apexis_relic() : GameObjectScript("go_apexis_relic") { } +public: + go_apexis_relic() : GameObjectScript("go_apexis_relic") { } - bool OnGossipHello(Player* player, GameObject* go) override + bool OnGossipHello(Player* player, GameObject* go) override + { + player->PrepareGossipMenu(go, go->GetGOInfo()->questgiver.gossipID); + player->SendPreparedGossip(go); + return true; + } + + bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 /*action*/) override + { + CloseGossipMenuFor(player); + + bool large = (go->GetEntry() == GO_APEXIS_MONUMENT); + if (player->HasItemCount(ITEM_APEXIS_SHARD, large ? 35 : 1)) { - player->PrepareGossipMenu(go, go->GetGOInfo()->questgiver.gossipID); - player->SendPreparedGossip(go); - return true; + player->CastSpell(player, large ? SPELL_TAKE_REAGENTS_GROUP : SPELL_TAKE_REAGENTS_SOLO, false); + + if (Creature* bunny = player->SummonCreature(NPC_SIMON_BUNNY, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ())) + bunny->AI()->SetGUID(player->GetGUID(), large); } - bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 /*action*/) override - { - CloseGossipMenuFor(player); - - bool large = (go->GetEntry() == GO_APEXIS_MONUMENT); - if (player->HasItemCount(ITEM_APEXIS_SHARD, large ? 35 : 1)) - { - player->CastSpell(player, large ? SPELL_TAKE_REAGENTS_GROUP : SPELL_TAKE_REAGENTS_SOLO, false); - - if (Creature* bunny = player->SummonCreature(NPC_SIMON_BUNNY, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ())) - bunny->AI()->SetGUID(player->GetGUID(), large); - } - - return true; - } + return true; + } }; /*###### @@ -1107,9 +1112,9 @@ public: timer -= diff; } - private: - uint64 playerGuid; - uint32 timer; + private: + uint64 playerGuid; + uint32 timer; }; CreatureAI* GetAI(Creature* creature) const @@ -1120,30 +1125,30 @@ public: class spell_oscillating_field : public SpellScriptLoader { - public: - spell_oscillating_field() : SpellScriptLoader("spell_oscillating_field") { } +public: + spell_oscillating_field() : SpellScriptLoader("spell_oscillating_field") { } - class spell_oscillating_field_SpellScript : public SpellScript + class spell_oscillating_field_SpellScript : public SpellScript + { + PrepareSpellScript(spell_oscillating_field_SpellScript); + + void HandleEffect(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_oscillating_field_SpellScript); - - void HandleEffect(SpellEffIndex /*effIndex*/) - { - if (Player* player = GetHitPlayer()) - if (player->GetAuraCount(SPELL_OSCILLATION_FIELD) == 5 && player->GetQuestStatus(QUEST_GAUGING_THE_RESONANT_FREQUENCY) == QUEST_STATUS_INCOMPLETE) - player->CompleteQuest(QUEST_GAUGING_THE_RESONANT_FREQUENCY); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_oscillating_field_SpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_APPLY_AURA); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_oscillating_field_SpellScript(); + if (Player* player = GetHitPlayer()) + if (player->GetAuraCount(SPELL_OSCILLATION_FIELD) == 5 && player->GetQuestStatus(QUEST_GAUGING_THE_RESONANT_FREQUENCY) == QUEST_STATUS_INCOMPLETE) + player->CompleteQuest(QUEST_GAUGING_THE_RESONANT_FREQUENCY); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_oscillating_field_SpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_APPLY_AURA); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_oscillating_field_SpellScript(); + } }; void AddSC_blades_edge_mountains() diff --git a/src/server/scripts/Outland/zone_hellfire_peninsula.cpp b/src/server/scripts/Outland/zone_hellfire_peninsula.cpp index 3090600d8..66677fc34 100644 --- a/src/server/scripts/Outland/zone_hellfire_peninsula.cpp +++ b/src/server/scripts/Outland/zone_hellfire_peninsula.cpp @@ -30,36 +30,36 @@ EndContentData */ class spell_q10935_the_exorcism_of_colonel_jules : public SpellScriptLoader { - public: - spell_q10935_the_exorcism_of_colonel_jules() : SpellScriptLoader("spell_q10935_the_exorcism_of_colonel_jules") { } +public: + spell_q10935_the_exorcism_of_colonel_jules() : SpellScriptLoader("spell_q10935_the_exorcism_of_colonel_jules") { } - class spell_q10935_the_exorcism_of_colonel_jules_SpellScript : public SpellScript + class spell_q10935_the_exorcism_of_colonel_jules_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q10935_the_exorcism_of_colonel_jules_SpellScript); + + void HandleDummy(SpellEffIndex effIndex) { - PrepareSpellScript(spell_q10935_the_exorcism_of_colonel_jules_SpellScript); + PreventHitDefaultEffect(effIndex); + Creature* target = GetHitCreature(); + if (!target) + return; - void HandleDummy(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - Creature* target = GetHitCreature(); - if (!target) - return; - - if (GetCaster()->IsHostileTo(target)) - GetCaster()->CastSpell(target, 39323 /*SPELL_HOLY_FIRE*/, true); - else - GetCaster()->CastSpell(target, 39322 /*SPELL_HEAL_BARADA*/, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_q10935_the_exorcism_of_colonel_jules_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q10935_the_exorcism_of_colonel_jules_SpellScript(); + if (GetCaster()->IsHostileTo(target)) + GetCaster()->CastSpell(target, 39323 /*SPELL_HOLY_FIRE*/, true); + else + GetCaster()->CastSpell(target, 39322 /*SPELL_HEAL_BARADA*/, true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_q10935_the_exorcism_of_colonel_jules_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q10935_the_exorcism_of_colonel_jules_SpellScript(); + } }; @@ -107,7 +107,8 @@ public: { me->setFaction(FACTION_HOSTILE); faction_Timer = 0; - } else faction_Timer -= diff; + } + else faction_Timer -= diff; } if (!UpdateVictim()) @@ -128,13 +129,15 @@ public: { DoCastVictim(SPELL_SHOCK); shock_Timer = 10000; - } else shock_Timer -= diff; + } + else shock_Timer -= diff; if (envelopingWinds_Timer <= diff) { DoCastVictim(SPELL_ENVELOPING_WINDS); envelopingWinds_Timer = 25000; - } else envelopingWinds_Timer -= diff; + } + else envelopingWinds_Timer -= diff; DoMeleeAttackIfReady(); } diff --git a/src/server/scripts/Outland/zone_nagrand.cpp b/src/server/scripts/Outland/zone_nagrand.cpp index a3d667630..402a3c06e 100644 --- a/src/server/scripts/Outland/zone_nagrand.cpp +++ b/src/server/scripts/Outland/zone_nagrand.cpp @@ -49,8 +49,8 @@ enum MagharCaptive NPC_MURK_PUTRIFIER = 18202 }; -static float m_afAmbushA[]= {-1568.805786f, 8533.873047f, 1.958f}; -static float m_afAmbushB[]= {-1491.554321f, 8506.483398f, 1.248f}; +static float m_afAmbushA[] = {-1568.805786f, 8533.873047f, 1.958f}; +static float m_afAmbushB[] = {-1491.554321f, 8506.483398f, 1.248f}; class npc_maghar_captive : public CreatureScript { @@ -68,8 +68,8 @@ public: EscortAI->Start(true, false, player->GetGUID(), quest); creature->AI()->Talk(SAY_MAG_START); - creature->SummonCreature(NPC_MURK_RAIDER, m_afAmbushA[0]+2.5f, m_afAmbushA[1]-2.5f, m_afAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - creature->SummonCreature(NPC_MURK_PUTRIFIER, m_afAmbushA[0]-2.5f, m_afAmbushA[1]+2.5f, m_afAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + creature->SummonCreature(NPC_MURK_RAIDER, m_afAmbushA[0] + 2.5f, m_afAmbushA[1] - 2.5f, m_afAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + creature->SummonCreature(NPC_MURK_PUTRIFIER, m_afAmbushA[0] - 2.5f, m_afAmbushA[1] + 2.5f, m_afAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); creature->SummonCreature(NPC_MURK_BRUTE, m_afAmbushA[0], m_afAmbushA[1], m_afAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); } } @@ -123,9 +123,9 @@ public: if (Creature* temp = me->SummonCreature(NPC_MURK_PUTRIFIER, m_afAmbushB[0], m_afAmbushB[1], m_afAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000)) temp->AI()->Talk(SAY_MAG_MORE_REPLY); - me->SummonCreature(NPC_MURK_PUTRIFIER, m_afAmbushB[0]-2.5f, m_afAmbushB[1]-2.5f, m_afAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - me->SummonCreature(NPC_MURK_SCAVENGER, m_afAmbushB[0]+2.5f, m_afAmbushB[1]+2.5f, m_afAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - me->SummonCreature(NPC_MURK_SCAVENGER, m_afAmbushB[0]+2.5f, m_afAmbushB[1]-2.5f, m_afAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + me->SummonCreature(NPC_MURK_PUTRIFIER, m_afAmbushB[0] - 2.5f, m_afAmbushB[1] - 2.5f, m_afAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + me->SummonCreature(NPC_MURK_SCAVENGER, m_afAmbushB[0] + 2.5f, m_afAmbushB[1] + 2.5f, m_afAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + me->SummonCreature(NPC_MURK_SCAVENGER, m_afAmbushB[0] + 2.5f, m_afAmbushB[1] - 2.5f, m_afAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); break; case 16: Talk(SAY_MAG_COMPLETE); @@ -156,7 +156,7 @@ public: { if (spell->Id == SPELL_CHAIN_LIGHTNING) { - if (rand()%10) + if (rand() % 10) return; Talk(SAY_MAG_LIGHTNING); @@ -254,23 +254,23 @@ public: enum CorkiData { - // first quest - QUEST_HELP = 9923, - NPC_CORKI = 18445, - NPC_CORKI_CREDIT_1 = 18369, - GO_CORKIS_PRISON = 182349, - CORKI_SAY_THANKS = 0, - // 2nd quest - QUEST_CORKIS_GONE_MISSING_AGAIN = 9924, - NPC_CORKI_2 = 20812, - GO_CORKIS_PRISON_2 = 182350, - CORKI_SAY_PROMISE = 0, - // 3rd quest - QUEST_CHOWAR_THE_PILLAGER = 9955, - NPC_CORKI_3 = 18369, - NPC_CORKI_CREDIT_3 = 18444, - GO_CORKIS_PRISON_3 = 182521, - CORKI_SAY_LAST = 0 + // first quest + QUEST_HELP = 9923, + NPC_CORKI = 18445, + NPC_CORKI_CREDIT_1 = 18369, + GO_CORKIS_PRISON = 182349, + CORKI_SAY_THANKS = 0, + // 2nd quest + QUEST_CORKIS_GONE_MISSING_AGAIN = 9924, + NPC_CORKI_2 = 20812, + GO_CORKIS_PRISON_2 = 182350, + CORKI_SAY_PROMISE = 0, + // 3rd quest + QUEST_CHOWAR_THE_PILLAGER = 9955, + NPC_CORKI_3 = 18369, + NPC_CORKI_CREDIT_3 = 18444, + GO_CORKIS_PRISON_3 = 182521, + CORKI_SAY_LAST = 0 }; class go_corkis_prison : public GameObjectScript @@ -285,7 +285,7 @@ public: { if (Creature* corki = go->FindNearestCreature(NPC_CORKI, 25, true)) { - corki->GetMotionMaster()->MovePoint(1, go->GetPositionX()+5, go->GetPositionY(), go->GetPositionZ()); + corki->GetMotionMaster()->MovePoint(1, go->GetPositionX() + 5, go->GetPositionY(), go->GetPositionZ()); if (player) player->KilledMonsterCredit(NPC_CORKI_CREDIT_1, 0); } @@ -295,7 +295,7 @@ public: { if (Creature* corki = go->FindNearestCreature(NPC_CORKI_2, 25, true)) { - corki->GetMotionMaster()->MovePoint(1, go->GetPositionX()-5, go->GetPositionY(), go->GetPositionZ()); + corki->GetMotionMaster()->MovePoint(1, go->GetPositionX() - 5, go->GetPositionY(), go->GetPositionZ()); if (player) player->KilledMonsterCredit(NPC_CORKI_2, 0); } @@ -305,7 +305,7 @@ public: { if (Creature* corki = go->FindNearestCreature(NPC_CORKI_3, 25, true)) { - corki->GetMotionMaster()->MovePoint(1, go->GetPositionX()+4, go->GetPositionY(), go->GetPositionZ()); + corki->GetMotionMaster()->MovePoint(1, go->GetPositionX() + 4, go->GetPositionY(), go->GetPositionZ()); if (player) player->KilledMonsterCredit(NPC_CORKI_CREDIT_3, 0); } @@ -318,55 +318,55 @@ public: class npc_corki : public CreatureScript { public: - npc_corki() : CreatureScript("npc_corki") { } + npc_corki() : CreatureScript("npc_corki") { } - CreatureAI* GetAI(Creature* creature) const - { - return new npc_corkiAI(creature); - } + CreatureAI* GetAI(Creature* creature) const + { + return new npc_corkiAI(creature); + } - struct npc_corkiAI : public ScriptedAI - { - npc_corkiAI(Creature* creature) : ScriptedAI(creature) { } + struct npc_corkiAI : public ScriptedAI + { + npc_corkiAI(Creature* creature) : ScriptedAI(creature) { } - uint32 Say_Timer; - bool ReleasedFromCage; + uint32 Say_Timer; + bool ReleasedFromCage; - void Reset() - { - Say_Timer = 5000; - ReleasedFromCage = false; - } + void Reset() + { + Say_Timer = 5000; + ReleasedFromCage = false; + } - void UpdateAI(uint32 diff) - { - if (ReleasedFromCage) - { - if (Say_Timer <= diff) - { - me->DespawnOrUnsummon(); - ReleasedFromCage = false; - } - else - Say_Timer -= diff; - } - } + void UpdateAI(uint32 diff) + { + if (ReleasedFromCage) + { + if (Say_Timer <= diff) + { + me->DespawnOrUnsummon(); + ReleasedFromCage = false; + } + else + Say_Timer -= diff; + } + } - void MovementInform(uint32 type, uint32 id) - { - if (type == POINT_MOTION_TYPE && id == 1) - { - Say_Timer = 5000; - ReleasedFromCage = true; - if (me->GetEntry() == NPC_CORKI) - Talk(CORKI_SAY_THANKS); - if (me->GetEntry() == NPC_CORKI_2) - Talk(CORKI_SAY_PROMISE); - if (me->GetEntry() == NPC_CORKI_3) - Talk(CORKI_SAY_LAST); - } - }; - }; + void MovementInform(uint32 type, uint32 id) + { + if (type == POINT_MOTION_TYPE && id == 1) + { + Say_Timer = 5000; + ReleasedFromCage = true; + if (me->GetEntry() == NPC_CORKI) + Talk(CORKI_SAY_THANKS); + if (me->GetEntry() == NPC_CORKI_2) + Talk(CORKI_SAY_PROMISE); + if (me->GetEntry() == NPC_CORKI_3) + Talk(CORKI_SAY_LAST); + } + }; + }; }; /*##### @@ -396,8 +396,8 @@ enum KurenaiCaptive NPC_KUR_MURK_PUTRIFIER = 18202, }; -static float kurenaiAmbushA[]= {-1520.6f, 8468.4f, -4.1f}; -static float kurenaiAmbushB[]= {-1491.554321f, 8506.483398f, 1.248f}; +static float kurenaiAmbushA[] = {-1520.6f, 8468.4f, -4.1f}; +static float kurenaiAmbushB[] = {-1491.554321f, 8506.483398f, 1.248f}; class npc_kurenai_captive : public CreatureScript { @@ -431,8 +431,8 @@ public: Start(true, false, guid); Talk(SAY_KUR_START); - me->SummonCreature(NPC_KUR_MURK_RAIDER, kurenaiAmbushA[0]+2.5f, kurenaiAmbushA[1]-2.5f, kurenaiAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 50000); - me->SummonCreature(NPC_KUR_MURK_BRUTE, kurenaiAmbushA[0]-2.5f, kurenaiAmbushA[1]+2.5f, kurenaiAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 50000); + me->SummonCreature(NPC_KUR_MURK_RAIDER, kurenaiAmbushA[0] + 2.5f, kurenaiAmbushA[1] - 2.5f, kurenaiAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 50000); + me->SummonCreature(NPC_KUR_MURK_BRUTE, kurenaiAmbushA[0] - 2.5f, kurenaiAmbushA[1] + 2.5f, kurenaiAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 50000); me->SummonCreature(NPC_KUR_MURK_SCAVENGER, kurenaiAmbushA[0], kurenaiAmbushA[1], kurenaiAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 50000); } @@ -465,27 +465,27 @@ public: switch (waypointId) { case 3: - { - Talk(SAY_KUR_MORE); + { + Talk(SAY_KUR_MORE); - if (Creature* cr = me->SummonCreature(NPC_KUR_MURK_PUTRIFIER, kurenaiAmbushB[0], kurenaiAmbushB[1], kurenaiAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000)) - cr->AI()->Talk(SAY_KUR_MORE_TWO); + if (Creature* cr = me->SummonCreature(NPC_KUR_MURK_PUTRIFIER, kurenaiAmbushB[0], kurenaiAmbushB[1], kurenaiAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000)) + cr->AI()->Talk(SAY_KUR_MORE_TWO); - me->SummonCreature(NPC_KUR_MURK_PUTRIFIER, kurenaiAmbushB[0]-2.5f, kurenaiAmbushB[1]-2.5f, kurenaiAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - me->SummonCreature(NPC_KUR_MURK_SCAVENGER, kurenaiAmbushB[0]+2.5f, kurenaiAmbushB[1]+2.5f, kurenaiAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - me->SummonCreature(NPC_KUR_MURK_SCAVENGER, kurenaiAmbushB[0]+2.5f, kurenaiAmbushB[1]-2.5f, kurenaiAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - break; - } + me->SummonCreature(NPC_KUR_MURK_PUTRIFIER, kurenaiAmbushB[0] - 2.5f, kurenaiAmbushB[1] - 2.5f, kurenaiAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + me->SummonCreature(NPC_KUR_MURK_SCAVENGER, kurenaiAmbushB[0] + 2.5f, kurenaiAmbushB[1] + 2.5f, kurenaiAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + me->SummonCreature(NPC_KUR_MURK_SCAVENGER, kurenaiAmbushB[0] + 2.5f, kurenaiAmbushB[1] - 2.5f, kurenaiAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + break; + } case 7: - { - Talk(SAY_KUR_COMPLETE); + { + Talk(SAY_KUR_COMPLETE); - if (Player* player = GetPlayerForEscort()) - player->GroupEventHappens(QUEST_TOTEM_KARDASH_A, me); + if (Player* player = GetPlayerForEscort()) + player->GroupEventHappens(QUEST_TOTEM_KARDASH_A, me); - SetRun(); - break; - } + SetRun(); + break; + } } } @@ -505,7 +505,7 @@ public: { if (spell->Id == SPELL_KUR_CHAIN_LIGHTNING) { - if (rand()%30) + if (rand() % 30) return; Talk(SAY_KUR_LIGHTNING); @@ -513,7 +513,7 @@ public: if (spell->Id == SPELL_KUR_FROST_SHOCK) { - if (rand()%30) + if (rand() % 30) return; Talk(SAY_KUR_SHOCK); @@ -532,7 +532,8 @@ public: { DoCastVictim(SPELL_KUR_CHAIN_LIGHTNING); ChainLightningTimer = urand(7000, 14000); - } else ChainLightningTimer -= diff; + } + else ChainLightningTimer -= diff; if (HealthBelowPct(30)) { @@ -540,14 +541,16 @@ public: { DoCast(me, SPELL_KUR_HEALING_WAVE); HealTimer = 5000; - } else HealTimer -= diff; + } + else HealTimer -= diff; } if (FrostShockTimer <= diff) { DoCastVictim(SPELL_KUR_FROST_SHOCK); FrostShockTimer = urand(7500, 15000); - } else FrostShockTimer -= diff; + } + else FrostShockTimer -= diff; DoMeleeAttackIfReady(); } @@ -574,7 +577,7 @@ public: bool OnGossipHello(Player* player, GameObject* go) override { go->UseDoorOrButton(); - + if (player->GetQuestStatus(QUEST_FINDING_THE_SURVIVORS) != QUEST_STATUS_INCOMPLETE) return false; diff --git a/src/server/scripts/Outland/zone_netherstorm.cpp b/src/server/scripts/Outland/zone_netherstorm.cpp index 2210aa433..02f1e5b4a 100644 --- a/src/server/scripts/Outland/zone_netherstorm.cpp +++ b/src/server/scripts/Outland/zone_netherstorm.cpp @@ -197,863 +197,863 @@ const Position IshanahSpawnPosition { 4926.066895f, 3825.549072f, 211.494125f, 0 class deathblow_to_the_legion_trigger : public CreatureScript { - public: - deathblow_to_the_legion_trigger() : CreatureScript("deathblow_to_the_legion_trigger") { } +public: + deathblow_to_the_legion_trigger() : CreatureScript("deathblow_to_the_legion_trigger") { } - CreatureAI* GetAI(Creature* creature) const override + CreatureAI* GetAI(Creature* creature) const override + { + return new deathblow_to_the_legion_triggerAI(creature); + } + + struct deathblow_to_the_legion_triggerAI : public ScriptedAI + { + deathblow_to_the_legion_triggerAI(Creature* creature) : ScriptedAI(creature), _summons(me) { } + + EventMap _events; + SummonList _summons; + + void JustSummoned(Creature* cr) override { _summons.Summon(cr); } + + void MoveInLineOfSight(Unit* who) override { - return new deathblow_to_the_legion_triggerAI(creature); - } - - struct deathblow_to_the_legion_triggerAI : public ScriptedAI - { - deathblow_to_the_legion_triggerAI(Creature* creature) : ScriptedAI(creature), _summons(me) { } - - EventMap _events; - SummonList _summons; - - void JustSummoned(Creature* cr) override { _summons.Summon(cr); } - - void MoveInLineOfSight(Unit* who) override + if (who->GetTypeId() == TYPEID_PLAYER && who->IsAlive()) { - if (who->GetTypeId() == TYPEID_PLAYER && who->IsAlive()) + if (who->ToPlayer()->GetQuestStatus(DEATHBLOW_TO_THE_LEGION) == QUEST_STATUS_INCOMPLETE && me->FindNearestCreature(SOCRETHAR, 500.0f, true)) { - if (who->ToPlayer()->GetQuestStatus(DEATHBLOW_TO_THE_LEGION) == QUEST_STATUS_INCOMPLETE && me->FindNearestCreature(SOCRETHAR, 500.0f, true)) + if (!_summons.HasEntry(ADYEN_THE_LIGHTBRINGER)) { - if (!_summons.HasEntry(ADYEN_THE_LIGHTBRINGER)) - { - _summons.RemoveNotExisting(); - me->SummonCreature(ADYEN_THE_LIGHTBRINGER, AdyenSpawnPosition, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 300000); - if (!_summons.HasEntry(EXARCH_ORELIS)) - me->SummonCreature(EXARCH_ORELIS, OrelisSpawnPosition, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 300000); - if (!_summons.HasEntry(ANCHORITE_KARJA)) - me->SummonCreature(ANCHORITE_KARJA, KarjaSpawnPosition, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 300000); - } + _summons.RemoveNotExisting(); + me->SummonCreature(ADYEN_THE_LIGHTBRINGER, AdyenSpawnPosition, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 300000); + if (!_summons.HasEntry(EXARCH_ORELIS)) + me->SummonCreature(EXARCH_ORELIS, OrelisSpawnPosition, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 300000); + if (!_summons.HasEntry(ANCHORITE_KARJA)) + me->SummonCreature(ANCHORITE_KARJA, KarjaSpawnPosition, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 300000); } } } - }; + } + }; }; class adyen_the_lightbringer : public CreatureScript { - public: - adyen_the_lightbringer(): CreatureScript("adyen_the_lightbringer") { } +public: + adyen_the_lightbringer(): CreatureScript("adyen_the_lightbringer") { } - bool OnGossipHello(Player* player, Creature* creature) override + bool OnGossipHello(Player* player, Creature* creature) override + { + if (player->GetQuestStatus(DEATHBLOW_TO_THE_LEGION) == QUEST_STATUS_INCOMPLETE) + AddGossipItemFor(player, ADYEN_THE_LIGHTBRINGER, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + + SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + + return true; + } + + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override + { + ClearGossipMenuFor(player); + + if (action == GOSSIP_ACTION_INFO_DEF + 1) { - if (player->GetQuestStatus(DEATHBLOW_TO_THE_LEGION) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, ADYEN_THE_LIGHTBRINGER, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - - return true; + CloseGossipMenuFor(player); + creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + creature->AI()->DoAction(EVENT_START_PLAYER_READY); + if (Creature* orelis = creature->FindNearestCreature(EXARCH_ORELIS, 15.0f, true)) + orelis->AI()->DoAction(EVENT_ORELIS_WALK); + if (Creature* karja = creature->FindNearestCreature(ANCHORITE_KARJA, 15.0f, true)) + karja->AI()->DoAction(EVENT_KARJA_WALK); + if (Creature* socrethar = creature->FindNearestCreature(SOCRETHAR, 500.0f, true)) + socrethar->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE); } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override + return true; + } + + struct adyen_the_lightbringerAI : public ScriptedAI + { + adyen_the_lightbringerAI(Creature* creature) : ScriptedAI(creature), event_started(false) { } + + EventMap _events; + uint32 eventTimer, eventPhase; + bool event_started = false; + + void DoAction(int32 param) override { - ClearGossipMenuFor(player); - - if (action == GOSSIP_ACTION_INFO_DEF + 1) + if (param == EVENT_START_PLAYER_READY) { - CloseGossipMenuFor(player); - creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - creature->AI()->DoAction(EVENT_START_PLAYER_READY); - if (Creature* orelis = creature->FindNearestCreature(EXARCH_ORELIS, 15.0f, true)) - orelis->AI()->DoAction(EVENT_ORELIS_WALK); - if (Creature* karja = creature->FindNearestCreature(ANCHORITE_KARJA, 15.0f, true)) - karja->AI()->DoAction(EVENT_KARJA_WALK); - if (Creature* socrethar = creature->FindNearestCreature(SOCRETHAR, 500.0f, true)) - socrethar->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE); + me->GetMotionMaster()->MovePath(ADYEN_PATH_ID, false); + event_started = true; + } + else if (param == RESET_DEATHBLOW_EVENT) + { + me->ClearInCombat(); + me->AttackStop(); + me->GetMotionMaster()->MoveTargetedHome(); + me->DespawnOrUnsummon(15000); } - - return true; } - struct adyen_the_lightbringerAI : public ScriptedAI + void MovementInform(uint32 type, uint32 point) override { - adyen_the_lightbringerAI(Creature* creature) : ScriptedAI(creature), event_started(false) { } - - EventMap _events; - uint32 eventTimer, eventPhase; - bool event_started = false; - - void DoAction(int32 param) override - { - if (param == EVENT_START_PLAYER_READY) + if (type != POINT_MOTION_TYPE) + if (point == 9) { - me->GetMotionMaster()->MovePath(ADYEN_PATH_ID, false); - event_started = true; + if (Creature* socrethar = me->FindNearestCreature(SOCRETHAR, 50.0f, true)) + socrethar->AI()->DoAction(EVENT_ADYEN_SAY_1); + me->SetHomePosition(me->GetPosition()); } - else if (param == RESET_DEATHBLOW_EVENT) + } + + void EnterCombat(Unit* /*who*/) override + { + _events.ScheduleEvent(EVENT_CRUSADER_STRIKE, 3000); + _events.ScheduleEvent(EVENT_HAMMER_OF_JUSTICE, 6000); + _events.ScheduleEvent(EVENT_HOLY_LIGHT, 1000); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) { - me->ClearInCombat(); - me->AttackStop(); - me->GetMotionMaster()->MoveTargetedHome(); - me->DespawnOrUnsummon(15000); - } - } - - void MovementInform(uint32 type, uint32 point) override - { - if (type != POINT_MOTION_TYPE) - if (point == 9) - { - if (Creature* socrethar = me->FindNearestCreature(SOCRETHAR, 50.0f, true)) - socrethar->AI()->DoAction(EVENT_ADYEN_SAY_1); - me->SetHomePosition(me->GetPosition()); - } - } - - void EnterCombat(Unit * /*who*/) override - { - _events.ScheduleEvent(EVENT_CRUSADER_STRIKE, 3000); - _events.ScheduleEvent(EVENT_HAMMER_OF_JUSTICE, 6000); - _events.ScheduleEvent(EVENT_HOLY_LIGHT, 1000); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - _events.Update(diff); - - while (uint32 eventId = _events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_CRUSADER_STRIKE: - me->CastSpell(me->GetVictim(), CRUSADER_STRIKE, false); - _events.RepeatEvent(3500); - break; - case EVENT_HAMMER_OF_JUSTICE: - me->CastSpell(me->GetVictim(), HAMMER_OF_JUSTICE, false); - _events.RepeatEvent(urand(10000, 14000)); - break; - case EVENT_HOLY_LIGHT: - // if low enough will heal and trigger again in 18s. - if (me->GetHealthPct() <= 45) + case EVENT_CRUSADER_STRIKE: + me->CastSpell(me->GetVictim(), CRUSADER_STRIKE, false); + _events.RepeatEvent(3500); + break; + case EVENT_HAMMER_OF_JUSTICE: + me->CastSpell(me->GetVictim(), HAMMER_OF_JUSTICE, false); + _events.RepeatEvent(urand(10000, 14000)); + break; + case EVENT_HOLY_LIGHT: + // if low enough will heal and trigger again in 18s. + if (me->GetHealthPct() <= 45) + { + me->CastSpell(me, HOLY_LIGHT, false); + _events.RepeatEvent(urand(18000, 22000)); + } + else if (Unit* who = me->FindNearestCreature(ANCHORITE_KARJA, 30.0f, true)) + { + if (who->GetHealthPct() <= 45) { - me->CastSpell(me, HOLY_LIGHT, false); + me->CastSpell(who, HOLY_LIGHT, false); _events.RepeatEvent(urand(18000, 22000)); } - else if (Unit* who = me->FindNearestCreature(ANCHORITE_KARJA, 30.0f, true)) + } + else if (Unit* who = me->FindNearestCreature(EXARCH_ORELIS, 30.0f, true)) + { + if (who->GetHealthPct() <= 45) { - if (who->GetHealthPct() <= 45) - { - me->CastSpell(who, HOLY_LIGHT, false); - _events.RepeatEvent(urand(18000, 22000)); - } + me->CastSpell(who, HOLY_LIGHT, false); + _events.RepeatEvent(urand(18000, 22000)); } - else if (Unit* who = me->FindNearestCreature(EXARCH_ORELIS, 30.0f, true)) - { - if (who->GetHealthPct() <= 45) - { - me->CastSpell(who, HOLY_LIGHT, false); - _events.RepeatEvent(urand(18000, 22000)); - } - } - else - _events.RepeatEvent(1000); - break; - } + } + else + _events.RepeatEvent(1000); + break; } - - DoMeleeAttackIfReady(); } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return new adyen_the_lightbringerAI(creature); + DoMeleeAttackIfReady(); } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new adyen_the_lightbringerAI(creature); + } }; class anchorite_karja : public CreatureScript { - public: - anchorite_karja() : CreatureScript("anchorite_karja") { } +public: + anchorite_karja() : CreatureScript("anchorite_karja") { } - struct anchorite_karjaAI : public ScriptedAI + struct anchorite_karjaAI : public ScriptedAI + { + anchorite_karjaAI(Creature* creature) : ScriptedAI(creature) { } + + EventMap _events; + + void DoAction(int32 param) override { - anchorite_karjaAI(Creature* creature) : ScriptedAI(creature) { } - - EventMap _events; - - void DoAction(int32 param) override + if (param == EVENT_KARJA_WALK) { - if (param == EVENT_KARJA_WALK) - { - me->GetMotionMaster()->MovePath(KARJA_PATH_ID, false); - me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - } - else if (param == RESET_DEATHBLOW_EVENT) - { - me->ClearInCombat(); - me->AttackStop(); - me->GetMotionMaster()->MoveTargetedHome(); - me->DespawnOrUnsummon(15000); - } + me->GetMotionMaster()->MovePath(KARJA_PATH_ID, false); + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); } - - void MovementInform(uint32 type, uint32 point) override + else if (param == RESET_DEATHBLOW_EVENT) { - if (type != POINT_MOTION_TYPE) - if (point == 11) - me->SetHomePosition(me->GetPosition()); + me->ClearInCombat(); + me->AttackStop(); + me->GetMotionMaster()->MoveTargetedHome(); + me->DespawnOrUnsummon(15000); } - - void EnterCombat(Unit* who) override - { - AttackStart(who); - _events.ScheduleEvent(EVENT_SPELL_HOLY_SMITE, 1000); - } - - void UpdateAI(uint32 diff) override - { - _events.Update(diff); - - if (!UpdateVictim()) - return; - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch ( _events.ExecuteEvent()) - { - case EVENT_SPELL_HOLY_SMITE: - me->CastSpell(me->GetVictim(), HOLY_SMITE_KARJA, false); - _events.ScheduleEvent(EVENT_SPELL_HOLY_SMITE, 2500); - break; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new anchorite_karjaAI(creature); } + + void MovementInform(uint32 type, uint32 point) override + { + if (type != POINT_MOTION_TYPE) + if (point == 11) + me->SetHomePosition(me->GetPosition()); + } + + void EnterCombat(Unit* who) override + { + AttackStart(who); + _events.ScheduleEvent(EVENT_SPELL_HOLY_SMITE, 1000); + } + + void UpdateAI(uint32 diff) override + { + _events.Update(diff); + + if (!UpdateVictim()) + return; + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch ( _events.ExecuteEvent()) + { + case EVENT_SPELL_HOLY_SMITE: + me->CastSpell(me->GetVictim(), HOLY_SMITE_KARJA, false); + _events.ScheduleEvent(EVENT_SPELL_HOLY_SMITE, 2500); + break; + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new anchorite_karjaAI(creature); + } }; class exarch_orelis : public CreatureScript { - public: - exarch_orelis() : CreatureScript("exarch_orelis") { } +public: + exarch_orelis() : CreatureScript("exarch_orelis") { } - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const + { + return new exarch_orelisAI(creature); + } + + struct exarch_orelisAI : public ScriptedAI + { + exarch_orelisAI(Creature* creature) : ScriptedAI(creature) { } + + EventMap _events; + + void DoAction(int32 param) override { - return new exarch_orelisAI(creature); + if (param == EVENT_ORELIS_WALK) + { + me->GetMotionMaster()->MovePath(ORELIS_PATH_ID, false); + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + } + else if (param == RESET_DEATHBLOW_EVENT) + { + me->ClearInCombat(); + me->AttackStop(); + me->GetMotionMaster()->MoveTargetedHome(); + me->DespawnOrUnsummon(15000); + } } - struct exarch_orelisAI : public ScriptedAI + void JustSummoned(Creature*) override { - exarch_orelisAI(Creature* creature) : ScriptedAI(creature) { } + me->SetHomePosition(me->GetPosition()); + } - EventMap _events; + void AttackStart(Unit* who) override + { + ScriptedAI::AttackStart(who); + } - void DoAction(int32 param) override + void MovementInform(uint32 type, uint32 point) override + { + if (type != POINT_MOTION_TYPE) + if (point == 11) + me->SetHomePosition(me->GetPosition()); + } + + void EnterCombat(Unit* /*who*/) override + { + _events.ScheduleEvent(EVENT_SPELL_DEMORALIZING_SHOUT, 1000); + _events.ScheduleEvent(EVENT_SPELL_HEROIC_STRIKE, urand(2500, 4000)); + _events.ScheduleEvent(EVENT_SPELL_REND, urand(1500, 6000)); + } + + void UpdateAI(uint32 diff) override + { + _events.Update(diff); + + if (!UpdateVictim()) + return; + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (_events.ExecuteEvent()) { - if (param == EVENT_ORELIS_WALK) - { - me->GetMotionMaster()->MovePath(ORELIS_PATH_ID, false); - me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - } - else if (param == RESET_DEATHBLOW_EVENT) - { - me->ClearInCombat(); - me->AttackStop(); - me->GetMotionMaster()->MoveTargetedHome(); - me->DespawnOrUnsummon(15000); - } + case EVENT_SPELL_DEMORALIZING_SHOUT: + if (me->FindNearestCreature(me->GetVictim()->GetEntry(), 10.0f, true)) + { + me->CastSpell(me->GetVictim(), DEMORALIZING_SHOUT, false); + _events.ScheduleEvent(EVENT_SPELL_DEMORALIZING_SHOUT, urand(10000, 12000)); + } + else + _events.ScheduleEvent(EVENT_SPELL_DEMORALIZING_SHOUT, 1000); + break; + case EVENT_SPELL_HEROIC_STRIKE: + me->CastSpell(me->GetVictim(), HEROIC_STRIKE, false); + _events.ScheduleEvent(EVENT_SPELL_HEROIC_STRIKE, urand(3000, 4000)); + break; + case EVENT_SPELL_REND: + me->CastSpell(me->GetVictim(), REND, false); + _events.ScheduleEvent(EVENT_SPELL_REND, urand(5000, 8000)); + break; } - void JustSummoned(Creature *) override - { - me->SetHomePosition(me->GetPosition()); - } - - void AttackStart(Unit* who) override - { - ScriptedAI::AttackStart(who); - } - - void MovementInform(uint32 type, uint32 point) override - { - if (type != POINT_MOTION_TYPE) - if (point == 11) - me->SetHomePosition(me->GetPosition()); - } - - void EnterCombat(Unit* /*who*/) override - { - _events.ScheduleEvent(EVENT_SPELL_DEMORALIZING_SHOUT, 1000); - _events.ScheduleEvent(EVENT_SPELL_HEROIC_STRIKE, urand(2500, 4000)); - _events.ScheduleEvent(EVENT_SPELL_REND, urand(1500, 6000)); - } - - void UpdateAI(uint32 diff) override - { - _events.Update(diff); - - if (!UpdateVictim()) - return; - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (_events.ExecuteEvent()) - { - case EVENT_SPELL_DEMORALIZING_SHOUT: - if (me->FindNearestCreature(me->GetVictim()->GetEntry(), 10.0f, true)) - { - me->CastSpell(me->GetVictim(), DEMORALIZING_SHOUT, false); - _events.ScheduleEvent(EVENT_SPELL_DEMORALIZING_SHOUT, urand(10000, 12000)); - } - else - _events.ScheduleEvent(EVENT_SPELL_DEMORALIZING_SHOUT, 1000); - break; - case EVENT_SPELL_HEROIC_STRIKE: - me->CastSpell(me->GetVictim(), HEROIC_STRIKE, false); - _events.ScheduleEvent(EVENT_SPELL_HEROIC_STRIKE, urand(3000, 4000)); - break; - case EVENT_SPELL_REND: - me->CastSpell(me->GetVictim(), REND, false); - _events.ScheduleEvent(EVENT_SPELL_REND, urand(5000, 8000)); - break; - } - - DoMeleeAttackIfReady(); - } - }; + DoMeleeAttackIfReady(); + } + }; }; class socrethar : public CreatureScript { - public: - socrethar() : CreatureScript("socrethar") { } +public: + socrethar() : CreatureScript("socrethar") { } - struct socretharAI : public ScriptedAI - { - socretharAI(Creature* creature) : ScriptedAI(creature), + struct socretharAI : public ScriptedAI + { + socretharAI(Creature* creature) : ScriptedAI(creature), adyen(nullptr), orelis(nullptr), karja(nullptr), kaylaan(nullptr), ishanah(nullptr) { } - EventMap _actionEvents, combatEvents; - bool DeathblowToTheLegionRunning = false; - Creature* adyen, *orelis, *karja, *kaylaan, *ishanah; + EventMap _actionEvents, combatEvents; + bool DeathblowToTheLegionRunning = false; + Creature* adyen, *orelis, *karja, *kaylaan, *ishanah; - bool GetCreature(uint32 CreatureID) + bool GetCreature(uint32 CreatureID) + { + switch (CreatureID) { - switch (CreatureID) - { - case ADYEN_THE_LIGHTBRINGER: - adyen = nullptr; - adyen = me->FindNearestCreature(ADYEN_THE_LIGHTBRINGER, 100.0f, true); - if (adyen != nullptr) + case ADYEN_THE_LIGHTBRINGER: + adyen = nullptr; + adyen = me->FindNearestCreature(ADYEN_THE_LIGHTBRINGER, 100.0f, true); + if (adyen != nullptr) + return true; + break; + case EXARCH_ORELIS: + orelis = nullptr; + orelis = me->FindNearestCreature(EXARCH_ORELIS, 100.0f, true); + if (orelis != nullptr) + return true; + break; + case ANCHORITE_KARJA: + karja = nullptr; + karja = me->FindNearestCreature(ANCHORITE_KARJA, 100.0f, true); + if (karja != nullptr) + return true; + break; + case KAYLAAN_THE_LOST: + kaylaan = nullptr; + kaylaan = me->FindNearestCreature(KAYLAAN_THE_LOST, 100.0f, true); + if (kaylaan != nullptr) + return true; + break; + case ISHANAH_HIGH_PRIESTESS: + ishanah = nullptr; + ishanah = me->FindNearestCreature(ISHANAH_HIGH_PRIESTESS, 100.0f, true); + if (ishanah == nullptr) + { + // Ishanah may be dead; in this case we also need a reference to the creature for the respawn + ishanah = me->FindNearestCreature(ISHANAH_HIGH_PRIESTESS, 100.0f, false); + if (ishanah != nullptr) return true; - break; - case EXARCH_ORELIS: - orelis = nullptr; - orelis = me->FindNearestCreature(EXARCH_ORELIS, 100.0f, true); - if (orelis != nullptr) - return true; - break; - case ANCHORITE_KARJA: - karja = nullptr; - karja = me->FindNearestCreature(ANCHORITE_KARJA, 100.0f, true); - if (karja != nullptr) - return true; - break; - case KAYLAAN_THE_LOST: - kaylaan = nullptr; - kaylaan = me->FindNearestCreature(KAYLAAN_THE_LOST, 100.0f, true); - if (kaylaan != nullptr) - return true; - break; - case ISHANAH_HIGH_PRIESTESS: - ishanah = nullptr; - ishanah = me->FindNearestCreature(ISHANAH_HIGH_PRIESTESS, 100.0f, true); - if (ishanah == nullptr) - { - // Ishanah may be dead; in this case we also need a reference to the creature for the respawn - ishanah = me->FindNearestCreature(ISHANAH_HIGH_PRIESTESS, 100.0f, false); - if (ishanah != nullptr) - return true; - } - else - return true; - break; - } - return false; // When he doesn't find anyone + } + else + return true; + break; + } + return false; // When he doesn't find anyone + } + + void Reset() override + { + me->SetReactState(REACT_PASSIVE); + me->setFaction(EXODAR_ENEMY_FACTION); + adyen = nullptr; + orelis = nullptr; + karja = nullptr; + ishanah = nullptr; + } + + void DoAction(int32 param) override + { + switch (param) + { + case EVENT_ADYEN_SAY_1: + DeathblowToTheLegionRunning = true; + _actionEvents.ScheduleEvent(EVENT_ADYEN_SAY_1, 1000); + break; + case EVENT_ADYEN_SAY_3: + _actionEvents.ScheduleEvent(EVENT_ADYEN_SAY_3, 2000); + break; + case EVENT_KAYLAAN_SAY_1: + _actionEvents.ScheduleEvent(EVENT_KAYLAAN_SAY_1, 4000); + break; + case EVENT_END_ALDOR_FIGHT: + _actionEvents.ScheduleEvent(EVENT_END_ALDOR_FIGHT, 1); + break; + case EVENT_ISHANAH_SAY_1: + _actionEvents.ScheduleEvent(EVENT_ISHANAH_SAY_1, 2000); + break; + case RESET_DEATHBLOW_EVENT: + DeathblowToTheLegionRunning = false; + Reset(); + break; + } + } + + void JustDied(Unit* /*killer*/) override + { + DoCast(me, SOCRETHAR_QUEST_CREDIT); + + if (GetCreature(ISHANAH_HIGH_PRIESTESS)) + { + ishanah->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); + ishanah->DespawnOrUnsummon(60000); } - void Reset() override - { - me->SetReactState(REACT_PASSIVE); - me->setFaction(EXODAR_ENEMY_FACTION); - adyen = nullptr; - orelis = nullptr; - karja = nullptr; - ishanah = nullptr; - } + if (GetCreature(ADYEN_THE_LIGHTBRINGER)) + adyen->GetAI()->DoAction(RESET_DEATHBLOW_EVENT); - void DoAction(int32 param) override + if (GetCreature(EXARCH_ORELIS)) + orelis->GetAI()->DoAction(RESET_DEATHBLOW_EVENT); + + if (GetCreature(ANCHORITE_KARJA)) + karja->GetAI()->DoAction(RESET_DEATHBLOW_EVENT); + } + + void EnterCombat(Unit* /*who*/) override + { + combatEvents.ScheduleEvent(EVENT_SPELL_ANTI_MAGIC_SHIELD, 20000); + combatEvents.ScheduleEvent(EVENT_SPELL_BACKLASH, 4000); + combatEvents.ScheduleEvent(EVENT_SPELL_CLEAVE, 2000); + combatEvents.ScheduleEvent(EVENT_SPELL_FIREBALL_BARRAGE, 9000); + combatEvents.ScheduleEvent(EVENT_SPELL_SHADOW_BOLT_VOLLEY, 5000); + combatEvents.ScheduleEvent(EVENT_SPELL_NETHER_PROTECTION, 1); + } + + void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/, DamageEffectType /*damagetype*/, SpellSchoolMask /*damageSchoolMask*/) override + { + me->SetReactState(REACT_AGGRESSIVE); + } + + void UpdateAI(uint32 diff) override + { + if (DeathblowToTheLegionRunning) { - switch (param) + _actionEvents.Update(diff); + + switch (_actionEvents.ExecuteEvent()) { case EVENT_ADYEN_SAY_1: - DeathblowToTheLegionRunning = true; - _actionEvents.ScheduleEvent(EVENT_ADYEN_SAY_1, 1000); + if (GetCreature(ADYEN_THE_LIGHTBRINGER)) + adyen->AI()->Talk(0); + _actionEvents.ScheduleEvent(EVENT_SOCRETHAR_SAY_1, 11000); + break; + case EVENT_SOCRETHAR_SAY_1: + Talk(0); + _actionEvents.ScheduleEvent(EVENT_ADYEN_SAY_2, 7000); + break; + case EVENT_ADYEN_SAY_2: + if (GetCreature(ADYEN_THE_LIGHTBRINGER)) + adyen->AI()->Talk(1); + _actionEvents.ScheduleEvent(EVENT_SOCRETHAR_SAY_2, 11000); + break; + case EVENT_SOCRETHAR_SAY_2: + Talk(1); + if (Creature* summonKaylaan = me->SummonCreature(KAYLAAN_THE_LOST, KaylaanSpawnPosition, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 240000)) + summonKaylaan->GetMotionMaster()->MovePath(KAYLAAN_PATH_ID1, false); break; case EVENT_ADYEN_SAY_3: - _actionEvents.ScheduleEvent(EVENT_ADYEN_SAY_3, 2000); + if (GetCreature(ADYEN_THE_LIGHTBRINGER)) + adyen->AI()->Talk(2); + if (GetCreature(KAYLAAN_THE_LOST)) + kaylaan->SetStandState(UNIT_STAND_STATE_STAND); + _actionEvents.ScheduleEvent(EVENT_KAYLAAN_WALK_TO_ADYEN, 3500); + break; + case EVENT_KAYLAAN_WALK_TO_ADYEN: + if (GetCreature(KAYLAAN_THE_LOST)) + kaylaan->GetMotionMaster()->MovePath(KAYLAAN_PATH_ID2, false); break; case EVENT_KAYLAAN_SAY_1: - _actionEvents.ScheduleEvent(EVENT_KAYLAAN_SAY_1, 4000); + if (GetCreature(KAYLAAN_THE_LOST)) + { + kaylaan->AI()->Talk(0); + kaylaan->SetHomePosition(kaylaan->GetPosition()); + } + _actionEvents.ScheduleEvent(EVENT_KAYLAAN_SAY_2, 9000); + break; + case EVENT_KAYLAAN_SAY_2: + if (GetCreature(KAYLAAN_THE_LOST)) + kaylaan->AI()->Talk(1); + _actionEvents.ScheduleEvent(EVENT_KAYLAAN_SAY_3, 8000); + break; + case EVENT_KAYLAAN_SAY_3: + if (GetCreature(KAYLAAN_THE_LOST)) + kaylaan->AI()->Talk(2); + _actionEvents.ScheduleEvent(EVENT_ADYEN_SAY_4, 8000); + break; + case EVENT_ADYEN_SAY_4: + if (GetCreature(ADYEN_THE_LIGHTBRINGER)) + adyen->AI()->Talk(3); + _actionEvents.ScheduleEvent(EVENT_KAYLAAN_SAY_4, 11000); + break; + case EVENT_KAYLAAN_SAY_4: + if (GetCreature(KAYLAAN_THE_LOST)) + kaylaan->AI()->Talk(3); + _actionEvents.ScheduleEvent(EVENT_SPELL_POWER_OF_THE_LEGION, 5000); + break; + case EVENT_SPELL_POWER_OF_THE_LEGION: + if (GetCreature(KAYLAAN_THE_LOST)) + me->CastSpell(kaylaan, POWER_OF_THE_LEGION, false); + Talk(2); + _actionEvents.ScheduleEvent(EVENT_FIGHT_ALDOR, 3000); + break; + case EVENT_FIGHT_ALDOR: + if (GetCreature(KAYLAAN_THE_LOST)) + { + kaylaan->setFaction(EXODAR_ENEMY_FACTION); + if (GetCreature(ADYEN_THE_LIGHTBRINGER)) + kaylaan->AI()->AttackStart(adyen); + } break; case EVENT_END_ALDOR_FIGHT: - _actionEvents.ScheduleEvent(EVENT_END_ALDOR_FIGHT, 1); + if (GetCreature(KAYLAAN_THE_LOST)) + { + kaylaan->setFaction(EXODAR_FACTION); + kaylaan->GetMotionMaster()->MoveTargetedHome(); + kaylaan->CombatStop(); + kaylaan->ClearInCombat(); + } + + if (GetCreature(ADYEN_THE_LIGHTBRINGER)) + { + adyen->GetMotionMaster()->MoveTargetedHome(); + adyen->CombatStop(); + adyen->ClearInCombat(); + } + + if (GetCreature(EXARCH_ORELIS)) + { + orelis->GetMotionMaster()->MoveTargetedHome(); + orelis->CombatStop(); + orelis->ClearInCombat(); + } + + if (GetCreature(ANCHORITE_KARJA)) + { + karja->GetMotionMaster()->MoveTargetedHome(); + karja->CombatStop(); + karja->ClearInCombat(); + } + _actionEvents.ScheduleEvent(EVENT_SOCRETHAR_SAY_4, 2000); + break; + case EVENT_SOCRETHAR_SAY_4: + Talk(3); + _actionEvents.ScheduleEvent(EVENT_KAYLAAN_SAY_5, 8000); + break; + case EVENT_KAYLAAN_SAY_5: + if (GetCreature(KAYLAAN_THE_LOST)) + kaylaan->AI()->Talk(4); + if (Creature* summonIshanah = me->SummonCreature(ISHANAH_HIGH_PRIESTESS, IshanahSpawnPosition, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 180000)) + { + summonIshanah->GetMotionMaster()->MovePath(ISHANAH_PATH_ID, false); + summonIshanah->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); + } break; case EVENT_ISHANAH_SAY_1: - _actionEvents.ScheduleEvent(EVENT_ISHANAH_SAY_1, 2000); + if (GetCreature(ISHANAH_HIGH_PRIESTESS)) + ishanah->AI()->Talk(0); + if (GetCreature(KAYLAAN_THE_LOST)) + { + kaylaan->RemoveAurasDueToSpell(POWER_OF_THE_LEGION); + kaylaan->SetStandState(UNIT_STAND_STATE_KNEEL); + } + _actionEvents.ScheduleEvent(EVENT_ISHANAH_SAY_2, 6000); break; - case RESET_DEATHBLOW_EVENT: - DeathblowToTheLegionRunning = false; - Reset(); + case EVENT_ISHANAH_SAY_2: + if (GetCreature(ISHANAH_HIGH_PRIESTESS)) + ishanah->AI()->Talk(1); + _actionEvents.ScheduleEvent(EVENT_SOCRETHAR_SAY_5, 8000); + break; + case EVENT_SOCRETHAR_SAY_5: + Talk(4); + _actionEvents.ScheduleEvent(EVENT_KILL_ISHANAH, 4000); + break; + case EVENT_KILL_ISHANAH: + if (GetCreature(ISHANAH_HIGH_PRIESTESS)) + me->CastSpell(ishanah, WRATH_OF_SOCRETHAR); + _actionEvents.ScheduleEvent(EVENT_ISHANAH_DIES, 1500); + break; + case EVENT_ISHANAH_DIES: + if (GetCreature(ISHANAH_HIGH_PRIESTESS)) + me->Kill(me, ishanah); + _actionEvents.ScheduleEvent(EVENT_KAYLAAN_SAY_6, 4000); + break; + case EVENT_KAYLAAN_SAY_6: + if (GetCreature(KAYLAAN_THE_LOST)) + { + kaylaan->AI()->Talk(6); + kaylaan->SetStandState(UNIT_STAND_STATE_STAND); + kaylaan->GetMotionMaster()->MovePath(207942, false); + } + _actionEvents.ScheduleEvent(EVENT_KAYLAAN_SAY_7, 9000); + break; + case EVENT_KAYLAAN_SAY_7: + if (GetCreature(KAYLAAN_THE_LOST)) + { + kaylaan->AI()->Talk(7); + kaylaan->CastSpell(kaylaan, DIVINE_SHIELD); + } + _actionEvents.ScheduleEvent(EVENT_KAYLAAN_RESSURECTION, 1000); + break; + case EVENT_KAYLAAN_RESSURECTION: + if (GetCreature(KAYLAAN_THE_LOST)) + kaylaan->CastSpell(ishanah, REDEMPTION); + _actionEvents.ScheduleEvent(EVENT_ISHANAH_IS_BACK_AGAIN, 11000); + break; + case EVENT_ISHANAH_IS_BACK_AGAIN: + if (GetCreature(ISHANAH_HIGH_PRIESTESS)) + { + ishanah->Respawn(); + ishanah->setActive(true); // ensure that Ishanah disappears, even when no player is near + ishanah->DespawnOrUnsummon(600000); // ensure that Ishanah disappears after 10 minutes + ishanah->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); + } + _actionEvents.ScheduleEvent(EVENT_SOCRETHAR_SAY_6, 3000); + break; + case EVENT_SOCRETHAR_SAY_6: + Talk(5); + _actionEvents.ScheduleEvent(EVENT_KILL_KAYLAAN, 4000); + break; + case EVENT_KILL_KAYLAAN: + if (GetCreature(KAYLAAN_THE_LOST)) + me->CastSpell(kaylaan, WRATH_OF_SOCRETHAR); + _actionEvents.ScheduleEvent(EVENT_KAYLAAN_DIES, 1500); + break; + case EVENT_KAYLAAN_DIES: + if (GetCreature(KAYLAAN_THE_LOST)) + me->Kill(me, kaylaan); + _actionEvents.ScheduleEvent(EVENT_FINAL_FIGHT, 3000); + break; + case EVENT_FINAL_FIGHT: + // Prepare Socrethar for encounter + me->setFaction(EXODAR_ENEMY_FACTION); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE); + me->SetReactState(REACT_AGGRESSIVE); + + // Engage combat with Socrethar + if (GetCreature(ADYEN_THE_LIGHTBRINGER)) + adyen->AI()->EnterCombat(me); + if (GetCreature(EXARCH_ORELIS)) + orelis->AI()->EnterCombat(me); + if (GetCreature(ANCHORITE_KARJA)) + karja->AI()->EnterCombat(me); + if (GetCreature(ISHANAH_HIGH_PRIESTESS)) + ishanah->AI()->EnterCombat(me); break; } } - void JustDied(Unit* /*killer*/) override + if (!UpdateVictim()) + return; + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + combatEvents.Update(diff); + + switch (combatEvents.ExecuteEvent()) { - DoCast(me, SOCRETHAR_QUEST_CREDIT); - - if (GetCreature(ISHANAH_HIGH_PRIESTESS)) - { - ishanah->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); - ishanah->DespawnOrUnsummon(60000); - } - - if (GetCreature(ADYEN_THE_LIGHTBRINGER)) - adyen->GetAI()->DoAction(RESET_DEATHBLOW_EVENT); - - if (GetCreature(EXARCH_ORELIS)) - orelis->GetAI()->DoAction(RESET_DEATHBLOW_EVENT); - - if (GetCreature(ANCHORITE_KARJA)) - karja->GetAI()->DoAction(RESET_DEATHBLOW_EVENT); + case EVENT_SPELL_NETHER_PROTECTION: + if (!me->HasAura(NETHER_PROTECTION)) + me->CastSpell(me, NETHER_PROTECTION, false); + break; + case EVENT_SPELL_ANTI_MAGIC_SHIELD: + me->CastSpell(me, ANTI_MAGIC_SHIELD, false); + combatEvents.ScheduleEvent(EVENT_SPELL_ANTI_MAGIC_SHIELD, 20000); + break; + case EVENT_SPELL_BACKLASH: + DoCastVictim(BACKLASH); + combatEvents.ScheduleEvent(EVENT_SPELL_BACKLASH, 7000); + break; + case EVENT_SPELL_CLEAVE: + me->CastSpell(me->GetVictim(), CLEAVE, false); + combatEvents.ScheduleEvent(EVENT_SPELL_CLEAVE, 3000); + break; + case EVENT_SPELL_FIREBALL_BARRAGE: + me->CastSpell(me->GetVictim(), FIREBALL_BARRAGE, false); + combatEvents.ScheduleEvent(EVENT_SPELL_FIREBALL_BARRAGE, 15000); + break; + case EVENT_SPELL_SHADOW_BOLT_VOLLEY: + me->CastSpell(me->GetVictim(), SHADOW_BOLT_VOLLEY, false); + combatEvents.ScheduleEvent(EVENT_SPELL_SHADOW_BOLT_VOLLEY, 10000); + break; } - void EnterCombat(Unit* /*who*/) override - { - combatEvents.ScheduleEvent(EVENT_SPELL_ANTI_MAGIC_SHIELD, 20000); - combatEvents.ScheduleEvent(EVENT_SPELL_BACKLASH, 4000); - combatEvents.ScheduleEvent(EVENT_SPELL_CLEAVE, 2000); - combatEvents.ScheduleEvent(EVENT_SPELL_FIREBALL_BARRAGE, 9000); - combatEvents.ScheduleEvent(EVENT_SPELL_SHADOW_BOLT_VOLLEY, 5000); - combatEvents.ScheduleEvent(EVENT_SPELL_NETHER_PROTECTION, 1); - } - - void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/, DamageEffectType /*damagetype*/, SpellSchoolMask /*damageSchoolMask*/) override - { - me->SetReactState(REACT_AGGRESSIVE); - } - - void UpdateAI(uint32 diff) override - { - if (DeathblowToTheLegionRunning) - { - _actionEvents.Update(diff); - - switch (_actionEvents.ExecuteEvent()) - { - case EVENT_ADYEN_SAY_1: - if (GetCreature(ADYEN_THE_LIGHTBRINGER)) - adyen->AI()->Talk(0); - _actionEvents.ScheduleEvent(EVENT_SOCRETHAR_SAY_1, 11000); - break; - case EVENT_SOCRETHAR_SAY_1: - Talk(0); - _actionEvents.ScheduleEvent(EVENT_ADYEN_SAY_2, 7000); - break; - case EVENT_ADYEN_SAY_2: - if (GetCreature(ADYEN_THE_LIGHTBRINGER)) - adyen->AI()->Talk(1); - _actionEvents.ScheduleEvent(EVENT_SOCRETHAR_SAY_2, 11000); - break; - case EVENT_SOCRETHAR_SAY_2: - Talk(1); - if (Creature* summonKaylaan = me->SummonCreature(KAYLAAN_THE_LOST, KaylaanSpawnPosition, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 240000)) - summonKaylaan->GetMotionMaster()->MovePath(KAYLAAN_PATH_ID1, false); - break; - case EVENT_ADYEN_SAY_3: - if (GetCreature(ADYEN_THE_LIGHTBRINGER)) - adyen->AI()->Talk(2); - if (GetCreature(KAYLAAN_THE_LOST)) - kaylaan->SetStandState(UNIT_STAND_STATE_STAND); - _actionEvents.ScheduleEvent(EVENT_KAYLAAN_WALK_TO_ADYEN, 3500); - break; - case EVENT_KAYLAAN_WALK_TO_ADYEN: - if (GetCreature(KAYLAAN_THE_LOST)) - kaylaan->GetMotionMaster()->MovePath(KAYLAAN_PATH_ID2, false); - break; - case EVENT_KAYLAAN_SAY_1: - if (GetCreature(KAYLAAN_THE_LOST)) - { - kaylaan->AI()->Talk(0); - kaylaan->SetHomePosition(kaylaan->GetPosition()); - } - _actionEvents.ScheduleEvent(EVENT_KAYLAAN_SAY_2, 9000); - break; - case EVENT_KAYLAAN_SAY_2: - if (GetCreature(KAYLAAN_THE_LOST)) - kaylaan->AI()->Talk(1); - _actionEvents.ScheduleEvent(EVENT_KAYLAAN_SAY_3, 8000); - break; - case EVENT_KAYLAAN_SAY_3: - if (GetCreature(KAYLAAN_THE_LOST)) - kaylaan->AI()->Talk(2); - _actionEvents.ScheduleEvent(EVENT_ADYEN_SAY_4, 8000); - break; - case EVENT_ADYEN_SAY_4: - if (GetCreature(ADYEN_THE_LIGHTBRINGER)) - adyen->AI()->Talk(3); - _actionEvents.ScheduleEvent(EVENT_KAYLAAN_SAY_4, 11000); - break; - case EVENT_KAYLAAN_SAY_4: - if (GetCreature(KAYLAAN_THE_LOST)) - kaylaan->AI()->Talk(3); - _actionEvents.ScheduleEvent(EVENT_SPELL_POWER_OF_THE_LEGION, 5000); - break; - case EVENT_SPELL_POWER_OF_THE_LEGION: - if (GetCreature(KAYLAAN_THE_LOST)) - me->CastSpell(kaylaan, POWER_OF_THE_LEGION, false); - Talk(2); - _actionEvents.ScheduleEvent(EVENT_FIGHT_ALDOR, 3000); - break; - case EVENT_FIGHT_ALDOR: - if (GetCreature(KAYLAAN_THE_LOST)) - { - kaylaan->setFaction(EXODAR_ENEMY_FACTION); - if (GetCreature(ADYEN_THE_LIGHTBRINGER)) - kaylaan->AI()->AttackStart(adyen); - } - break; - case EVENT_END_ALDOR_FIGHT: - if (GetCreature(KAYLAAN_THE_LOST)) - { - kaylaan->setFaction(EXODAR_FACTION); - kaylaan->GetMotionMaster()->MoveTargetedHome(); - kaylaan->CombatStop(); - kaylaan->ClearInCombat(); - } - - if (GetCreature(ADYEN_THE_LIGHTBRINGER)) - { - adyen->GetMotionMaster()->MoveTargetedHome(); - adyen->CombatStop(); - adyen->ClearInCombat(); - } - - if (GetCreature(EXARCH_ORELIS)) - { - orelis->GetMotionMaster()->MoveTargetedHome(); - orelis->CombatStop(); - orelis->ClearInCombat(); - } - - if (GetCreature(ANCHORITE_KARJA)) - { - karja->GetMotionMaster()->MoveTargetedHome(); - karja->CombatStop(); - karja->ClearInCombat(); - } - _actionEvents.ScheduleEvent(EVENT_SOCRETHAR_SAY_4, 2000); - break; - case EVENT_SOCRETHAR_SAY_4: - Talk(3); - _actionEvents.ScheduleEvent(EVENT_KAYLAAN_SAY_5, 8000); - break; - case EVENT_KAYLAAN_SAY_5: - if (GetCreature(KAYLAAN_THE_LOST)) - kaylaan->AI()->Talk(4); - if (Creature* summonIshanah = me->SummonCreature(ISHANAH_HIGH_PRIESTESS, IshanahSpawnPosition, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 180000)) - { - summonIshanah->GetMotionMaster()->MovePath(ISHANAH_PATH_ID, false); - summonIshanah->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); - } - break; - case EVENT_ISHANAH_SAY_1: - if (GetCreature(ISHANAH_HIGH_PRIESTESS)) - ishanah->AI()->Talk(0); - if (GetCreature(KAYLAAN_THE_LOST)) - { - kaylaan->RemoveAurasDueToSpell(POWER_OF_THE_LEGION); - kaylaan->SetStandState(UNIT_STAND_STATE_KNEEL); - } - _actionEvents.ScheduleEvent(EVENT_ISHANAH_SAY_2, 6000); - break; - case EVENT_ISHANAH_SAY_2: - if (GetCreature(ISHANAH_HIGH_PRIESTESS)) - ishanah->AI()->Talk(1); - _actionEvents.ScheduleEvent(EVENT_SOCRETHAR_SAY_5, 8000); - break; - case EVENT_SOCRETHAR_SAY_5: - Talk(4); - _actionEvents.ScheduleEvent(EVENT_KILL_ISHANAH, 4000); - break; - case EVENT_KILL_ISHANAH: - if (GetCreature(ISHANAH_HIGH_PRIESTESS)) - me->CastSpell(ishanah, WRATH_OF_SOCRETHAR); - _actionEvents.ScheduleEvent(EVENT_ISHANAH_DIES, 1500); - break; - case EVENT_ISHANAH_DIES: - if (GetCreature(ISHANAH_HIGH_PRIESTESS)) - me->Kill(me,ishanah); - _actionEvents.ScheduleEvent(EVENT_KAYLAAN_SAY_6, 4000); - break; - case EVENT_KAYLAAN_SAY_6: - if (GetCreature(KAYLAAN_THE_LOST)) - { - kaylaan->AI()->Talk(6); - kaylaan->SetStandState(UNIT_STAND_STATE_STAND); - kaylaan->GetMotionMaster()->MovePath(207942, false); - } - _actionEvents.ScheduleEvent(EVENT_KAYLAAN_SAY_7, 9000); - break; - case EVENT_KAYLAAN_SAY_7: - if (GetCreature(KAYLAAN_THE_LOST)) - { - kaylaan->AI()->Talk(7); - kaylaan->CastSpell(kaylaan, DIVINE_SHIELD); - } - _actionEvents.ScheduleEvent(EVENT_KAYLAAN_RESSURECTION, 1000); - break; - case EVENT_KAYLAAN_RESSURECTION: - if (GetCreature(KAYLAAN_THE_LOST)) - kaylaan->CastSpell(ishanah, REDEMPTION); - _actionEvents.ScheduleEvent(EVENT_ISHANAH_IS_BACK_AGAIN, 11000); - break; - case EVENT_ISHANAH_IS_BACK_AGAIN: - if (GetCreature(ISHANAH_HIGH_PRIESTESS)) - { - ishanah->Respawn(); - ishanah->setActive(true); // ensure that Ishanah disappears, even when no player is near - ishanah->DespawnOrUnsummon(600000); // ensure that Ishanah disappears after 10 minutes - ishanah->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); - } - _actionEvents.ScheduleEvent(EVENT_SOCRETHAR_SAY_6, 3000); - break; - case EVENT_SOCRETHAR_SAY_6: - Talk(5); - _actionEvents.ScheduleEvent(EVENT_KILL_KAYLAAN, 4000); - break; - case EVENT_KILL_KAYLAAN: - if (GetCreature(KAYLAAN_THE_LOST)) - me->CastSpell(kaylaan, WRATH_OF_SOCRETHAR); - _actionEvents.ScheduleEvent(EVENT_KAYLAAN_DIES, 1500); - break; - case EVENT_KAYLAAN_DIES: - if (GetCreature(KAYLAAN_THE_LOST)) - me->Kill(me, kaylaan); - _actionEvents.ScheduleEvent(EVENT_FINAL_FIGHT, 3000); - break; - case EVENT_FINAL_FIGHT: - // Prepare Socrethar for encounter - me->setFaction(EXODAR_ENEMY_FACTION); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE); - me->SetReactState(REACT_AGGRESSIVE); - - // Engage combat with Socrethar - if (GetCreature(ADYEN_THE_LIGHTBRINGER)) - adyen->AI()->EnterCombat(me); - if (GetCreature(EXARCH_ORELIS)) - orelis->AI()->EnterCombat(me); - if (GetCreature(ANCHORITE_KARJA)) - karja->AI()->EnterCombat(me); - if (GetCreature(ISHANAH_HIGH_PRIESTESS)) - ishanah->AI()->EnterCombat(me); - break; - } - } - - if (!UpdateVictim()) - return; - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - combatEvents.Update(diff); - - switch (combatEvents.ExecuteEvent()) - { - case EVENT_SPELL_NETHER_PROTECTION: - if (!me->HasAura(NETHER_PROTECTION)) - me->CastSpell(me, NETHER_PROTECTION, false); - break; - case EVENT_SPELL_ANTI_MAGIC_SHIELD: - me->CastSpell(me, ANTI_MAGIC_SHIELD, false); - combatEvents.ScheduleEvent(EVENT_SPELL_ANTI_MAGIC_SHIELD, 20000); - break; - case EVENT_SPELL_BACKLASH: - DoCastVictim(BACKLASH); - combatEvents.ScheduleEvent(EVENT_SPELL_BACKLASH, 7000); - break; - case EVENT_SPELL_CLEAVE: - me->CastSpell(me->GetVictim(), CLEAVE, false); - combatEvents.ScheduleEvent(EVENT_SPELL_CLEAVE, 3000); - break; - case EVENT_SPELL_FIREBALL_BARRAGE: - me->CastSpell(me->GetVictim(), FIREBALL_BARRAGE, false); - combatEvents.ScheduleEvent(EVENT_SPELL_FIREBALL_BARRAGE, 15000); - break; - case EVENT_SPELL_SHADOW_BOLT_VOLLEY: - me->CastSpell(me->GetVictim(), SHADOW_BOLT_VOLLEY, false); - combatEvents.ScheduleEvent(EVENT_SPELL_SHADOW_BOLT_VOLLEY, 10000); - break; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new socretharAI(creature); + DoMeleeAttackIfReady(); } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new socretharAI(creature); + } }; class kaylaan_the_lost : public CreatureScript { - public: - kaylaan_the_lost() : CreatureScript("kaylaan_the_lost") { } +public: + kaylaan_the_lost() : CreatureScript("kaylaan_the_lost") { } - struct kaylaan_the_lostAI : public ScriptedAI + struct kaylaan_the_lostAI : public ScriptedAI + { + kaylaan_the_lostAI(Creature* creature) : ScriptedAI(creature) { } + + EventMap _events; + bool first_waypath_done = false; + bool second_waypath_done = false; + bool adyen_dead = false, karja_dead = false, orelis_dead = false; + + void EnterCombat(Unit* /*who*/) override { - kaylaan_the_lostAI(Creature* creature) : ScriptedAI(creature) { } + _events.ScheduleEvent(EVENT_SPELL_BURNING_LIGHT, 2000); + _events.ScheduleEvent(EVENT_SPELL_CONSECRATION, 3000); + } - EventMap _events; - bool first_waypath_done = false; - bool second_waypath_done = false; - bool adyen_dead = false, karja_dead = false, orelis_dead = false; + void ResetDeathblowEvent(bool event_over /* If true then reset the event*/) + { + me->RemoveAurasDueToSpell(POWER_OF_THE_LEGION); + me->GetMotionMaster()->MoveTargetedHome(); - void EnterCombat(Unit* /*who*/) override + // Get socrethar AI so we can reset the event + if (event_over) { - _events.ScheduleEvent(EVENT_SPELL_BURNING_LIGHT, 2000); - _events.ScheduleEvent(EVENT_SPELL_CONSECRATION, 3000); + if (Unit* socrethar = me->FindNearestCreature(SOCRETHAR, 100.0f, true)) + socrethar->GetAI()->DoAction(RESET_DEATHBLOW_EVENT); + + karja_dead = false; + orelis_dead = false; + adyen_dead = false; + + me->DespawnOrUnsummon(5000); // Despawn in 5 seconds to reset event + } + } + + void KilledUnit(Unit* victim) override + { + switch (victim->GetEntry()) + { + case ADYEN_THE_LIGHTBRINGER: + adyen_dead = true; + break; + case ANCHORITE_KARJA: + karja_dead = true; + break; + case EXARCH_ORELIS: + orelis_dead = true; + break; } - void ResetDeathblowEvent(bool event_over /* If true then reset the event*/) + if (adyen_dead && karja_dead && orelis_dead) + ResetDeathblowEvent(true); + } + + void MovementInform(uint32 type, uint32 point) override + { + if (type != POINT_MOTION_TYPE) { - me->RemoveAurasDueToSpell(POWER_OF_THE_LEGION); - me->GetMotionMaster()->MoveTargetedHome(); - - // Get socrethar AI so we can reset the event - if (event_over) + if (point == 4) { - if (Unit * socrethar = me->FindNearestCreature(SOCRETHAR, 100.0f, true)) - socrethar->GetAI()->DoAction(RESET_DEATHBLOW_EVENT); - - karja_dead = false; - orelis_dead = false; - adyen_dead = false; - - me->DespawnOrUnsummon(5000); // Despawn in 5 seconds to reset event + // First waypath complete + me->SetStandState(UNIT_STAND_STATE_KNEEL); + if (Creature* socrethar = me->FindNearestCreature(SOCRETHAR, 30.0f, true)) + socrethar->AI()->DoAction(EVENT_ADYEN_SAY_3); + first_waypath_done = true; } - } - - void KilledUnit(Unit* victim) override - { - switch (victim->GetEntry()) + else if (point == 0) { - case ADYEN_THE_LIGHTBRINGER: - adyen_dead = true; - break; - case ANCHORITE_KARJA: - karja_dead = true; - break; - case EXARCH_ORELIS: - orelis_dead = true; - break; - } - - if (adyen_dead && karja_dead && orelis_dead) - ResetDeathblowEvent(true); - } - - void MovementInform(uint32 type, uint32 point) override - { - if (type != POINT_MOTION_TYPE) - { - if (point == 4) + if (first_waypath_done) { - // First waypath complete - me->SetStandState(UNIT_STAND_STATE_KNEEL); - if (Creature* socrethar = me->FindNearestCreature(SOCRETHAR, 30.0f, true)) - socrethar->AI()->DoAction(EVENT_ADYEN_SAY_3); - first_waypath_done = true; - } - else if (point == 0) - { - if (first_waypath_done) + if (!second_waypath_done) { - if (!second_waypath_done) + // Second waypath complete + me->SetHomePosition(me->GetPosition()); + if (Creature* adyen = me->FindNearestCreature(ADYEN_THE_LIGHTBRINGER, 30.0f, true)) + me->SetOrientation(adyen->GetPositionX()); + if (Creature* socrethar = me->FindNearestCreature(SOCRETHAR, 30.0f, true)) { - // Second waypath complete - me->SetHomePosition(me->GetPosition()); - if (Creature* adyen = me->FindNearestCreature(ADYEN_THE_LIGHTBRINGER, 30.0f, true)) - me->SetOrientation(adyen->GetPositionX()); - if (Creature* socrethar = me->FindNearestCreature(SOCRETHAR, 30.0f, true)) - { - socrethar->AI()->DoAction(EVENT_KAYLAAN_SAY_1); - second_waypath_done = true; - } + socrethar->AI()->DoAction(EVENT_KAYLAAN_SAY_1); + second_waypath_done = true; } } } } } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - _events.Update(diff); - - if (me->GetHealthPct() <= 30) - if (Creature* socrethar = me->FindNearestCreature(SOCRETHAR, 200.0f, true)) - socrethar->AI()->DoAction(EVENT_END_ALDOR_FIGHT); - - switch (_events.ExecuteEvent()) - { - case EVENT_SPELL_BURNING_LIGHT: - me->CastSpell(me->GetVictim(), BURNING_LIGHT, false); - _events.ScheduleEvent(EVENT_SPELL_BURNING_LIGHT, 4000); - break; - case EVENT_SPELL_CONSECRATION: - if (me->FindNearestCreature(me->GetVictim()->GetGUID(), 10.0f, true)) - me->CastSpell(me, CONSECRATION, false); - _events.ScheduleEvent(EVENT_SPELL_CONSECRATION, 14000); - break; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new kaylaan_the_lostAI(creature); } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + _events.Update(diff); + + if (me->GetHealthPct() <= 30) + if (Creature* socrethar = me->FindNearestCreature(SOCRETHAR, 200.0f, true)) + socrethar->AI()->DoAction(EVENT_END_ALDOR_FIGHT); + + switch (_events.ExecuteEvent()) + { + case EVENT_SPELL_BURNING_LIGHT: + me->CastSpell(me->GetVictim(), BURNING_LIGHT, false); + _events.ScheduleEvent(EVENT_SPELL_BURNING_LIGHT, 4000); + break; + case EVENT_SPELL_CONSECRATION: + if (me->FindNearestCreature(me->GetVictim()->GetGUID(), 10.0f, true)) + me->CastSpell(me, CONSECRATION, false); + _events.ScheduleEvent(EVENT_SPELL_CONSECRATION, 14000); + break; + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new kaylaan_the_lostAI(creature); + } }; // Ours @@ -1083,236 +1083,236 @@ enum saeed class npc_captain_saeed : public CreatureScript { - public: - npc_captain_saeed() : CreatureScript("npc_captain_saeed") { } +public: + npc_captain_saeed() : CreatureScript("npc_captain_saeed") { } - struct npc_captain_saeedAI : public npc_escortAI + struct npc_captain_saeedAI : public npc_escortAI + { + npc_captain_saeedAI(Creature* creature) : npc_escortAI(creature), summons(me) {} + + SummonList summons; + EventMap events; + bool started, fight; + + void Reset() override { - npc_captain_saeedAI(Creature* creature) : npc_escortAI(creature), summons(me) {} - - SummonList summons; - EventMap events; - bool started, fight; - - void Reset() override + if (!summons.empty()) { - if (!summons.empty()) - { - for (std::list::iterator itr = summons.begin(); itr != summons.end(); ++itr) + for (std::list::iterator itr = summons.begin(); itr != summons.end(); ++itr) if (Creature* cr = ObjectAccessor::GetCreature(*me, *itr)) { float x, y, z, o; cr->GetRespawnPosition(x, y, z, &o); cr->SetHomePosition(x, y, z, o); } - } - events.Reset(); - summons.clear(); - started = false; - fight = false; - me->RestoreFaction(); } + events.Reset(); + summons.clear(); + started = false; + fight = false; + me->RestoreFaction(); + } - void MoveInLineOfSight(Unit* who) override + void MoveInLineOfSight(Unit* who) override + { + if (Player* player = GetPlayerForEscort()) + if (me->GetDistance(who) < 10.0f && !me->GetVictim()) + if (player->IsValidAttackTarget(who)) + { + AttackStart(who); + return; + } + + npc_escortAI::MoveInLineOfSight(who); + } + + void SetGUID(uint64 playerGUID, int32 type) override + { + if (type == DATA_START_ENCOUNTER) { - if (Player* player = GetPlayerForEscort()) - if (me->GetDistance(who) < 10.0f && !me->GetVictim()) - if (player->IsValidAttackTarget(who)) - { - AttackStart(who); - return; - } + Start(true, true, playerGUID); + SetEscortPaused(true); + started = true; - npc_escortAI::MoveInLineOfSight(who); - } - - void SetGUID(uint64 playerGUID, int32 type) override - { - if (type == DATA_START_ENCOUNTER) + std::list cl; + me->GetCreaturesWithEntryInRange(cl, 20.0f, NPC_PROTECTORATE_AVENGER); + for (std::list::iterator itr = cl.begin(); itr != cl.end(); ++itr) { - Start(true, true, playerGUID); + summons.Summon(*itr); + (*itr)->HandleEmoteCommand(EMOTE_ONESHOT_ROAR); + (*itr)->setFaction(250); + } + cl.clear(); + me->GetCreaturesWithEntryInRange(cl, 20.0f, NPC_PROTECTORATE_DEFENDER); + for (std::list::iterator itr = cl.begin(); itr != cl.end(); ++itr) + { + summons.Summon(*itr); + (*itr)->HandleEmoteCommand(EMOTE_ONESHOT_ROAR); + (*itr)->setFaction(250); + } + + me->setFaction(250); + Talk(SAY_SAEED_0); + events.ScheduleEvent(EVENT_START_WALK, 3000); + } + else if (type == DATA_START_FIGHT) + { + Talk(SAY_SAEED_2); + SetEscortPaused(false); + me->SetUInt32Value(UNIT_NPC_FLAGS, 0); + } + } + + void EnterEvadeMode() override + { + if (fight) + SetEscortPaused(false); + + SummonsAction(nullptr); + npc_escortAI::EnterEvadeMode(); + } + + void SummonsAction(Unit* who) + { + float i = 0; + for (std::list::iterator itr = summons.begin(); itr != summons.end(); ++itr, i += 1.0f) + if (Creature* cr = ObjectAccessor::GetCreature(*me, *itr)) + { + if (who == nullptr) + { + cr->GetMotionMaster()->Clear(false); + cr->GetMotionMaster()->MoveFollow(me, 2.0f, M_PI / 2.0f + (i / summons.size() * M_PI)); + } + else + { + cr->SetHomePosition(cr->GetPositionX(), cr->GetPositionY(), cr->GetPositionZ(), cr->GetOrientation()); + cr->AI()->AttackStart(who); + } + } + } + + void WaypointReached(uint32 i) override + { + Player* player = GetPlayerForEscort(); + if (!player) + return; + + switch (i) + { + case 16: + Talk(SAY_SAEED_1); + me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); SetEscortPaused(true); - started = true; + break; + case 18: + events.ScheduleEvent(EVENT_START_FIGHT1, 0); + SetEscortPaused(true); + break; + case 19: + summons.DespawnAll(); + break; + } + } - std::list cl; - me->GetCreaturesWithEntryInRange(cl, 20.0f, NPC_PROTECTORATE_AVENGER); - for (std::list::iterator itr = cl.begin(); itr != cl.end(); ++itr) - { - summons.Summon(*itr); - (*itr)->HandleEmoteCommand(EMOTE_ONESHOT_ROAR); - (*itr)->setFaction(250); - } - cl.clear(); - me->GetCreaturesWithEntryInRange(cl, 20.0f, NPC_PROTECTORATE_DEFENDER); - for (std::list::iterator itr = cl.begin(); itr != cl.end(); ++itr) - { - summons.Summon(*itr); - (*itr)->HandleEmoteCommand(EMOTE_ONESHOT_ROAR); - (*itr)->setFaction(250); - } + void EnterCombat(Unit* who) override + { + SummonsAction(who); + } - me->setFaction(250); - Talk(SAY_SAEED_0); - events.ScheduleEvent(EVENT_START_WALK, 3000); - } - else if (type == DATA_START_FIGHT) - { - Talk(SAY_SAEED_2); + void JustDied(Unit* /*killer*/) override + { + Player* player = GetPlayerForEscort(); + if (player) + player->FailQuest(QUEST_DIMENSIUS_DEVOURING); + + summons.DespawnAll(); + } + + void CorpseRemoved(uint32&) override + { + summons.DespawnAll(); + } + + uint32 GetData(uint32 data) const override + { + if (data == 1) + return (uint32)started; + + return 0; + } + + void UpdateAI(uint32 diff) override + { + npc_escortAI::UpdateAI(diff); + + events.Update(diff); + switch (events.ExecuteEvent()) + { + case EVENT_START_WALK: + SummonsAction(nullptr); SetEscortPaused(false); - me->SetUInt32Value(UNIT_NPC_FLAGS, 0); - } - } - - void EnterEvadeMode() override - { - if (fight) - SetEscortPaused(false); - - SummonsAction(nullptr); - npc_escortAI::EnterEvadeMode(); - } - - void SummonsAction(Unit* who) - { - float i = 0; - for (std::list::iterator itr = summons.begin(); itr != summons.end(); ++itr, i += 1.0f) - if (Creature* cr = ObjectAccessor::GetCreature(*me, *itr)) + break; + case EVENT_START_FIGHT1: + Talk(SAY_SAEED_3); + events.ScheduleEvent(EVENT_START_FIGHT2, 3000); + break; + case EVENT_START_FIGHT2: + if (Creature* dimensius = me->FindNearestCreature(NPC_DIMENSIUS, 50.0f)) { - if (who == nullptr) - { - cr->GetMotionMaster()->Clear(false); - cr->GetMotionMaster()->MoveFollow(me, 2.0f, M_PI/2.0f + (i / summons.size() * M_PI)); - } - else - { - cr->SetHomePosition(cr->GetPositionX(), cr->GetPositionY(), cr->GetPositionZ(), cr->GetOrientation()); - cr->AI()->AttackStart(who); - } + dimensius->RemoveAurasDueToSpell(SPELL_DIMENSIUS_TRANSFORM); + dimensius->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); + AttackStart(dimensius); + fight = true; } + break; } - void WaypointReached(uint32 i) override - { - Player* player = GetPlayerForEscort(); - if (!player) - return; + if (!UpdateVictim()) + return; - switch (i) - { - case 16: - Talk(SAY_SAEED_1); - me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - SetEscortPaused(true); - break; - case 18: - events.ScheduleEvent(EVENT_START_FIGHT1, 0); - SetEscortPaused(true); - break; - case 19: - summons.DespawnAll(); - break; - } - } + DoMeleeAttackIfReady(); + } + }; - void EnterCombat(Unit* who) override - { - SummonsAction(who); - } - - void JustDied(Unit* /*killer*/) override - { - Player* player = GetPlayerForEscort(); - if (player) - player->FailQuest(QUEST_DIMENSIUS_DEVOURING); - - summons.DespawnAll(); - } - - void CorpseRemoved(uint32&) override - { - summons.DespawnAll(); - } - - uint32 GetData(uint32 data) const override - { - if (data == 1) - return (uint32)started; - - return 0; - } - - void UpdateAI(uint32 diff) override - { - npc_escortAI::UpdateAI(diff); - - events.Update(diff); - switch (events.ExecuteEvent()) - { - case EVENT_START_WALK: - SummonsAction(nullptr); - SetEscortPaused(false); - break; - case EVENT_START_FIGHT1: - Talk(SAY_SAEED_3); - events.ScheduleEvent(EVENT_START_FIGHT2, 3000); - break; - case EVENT_START_FIGHT2: - if (Creature* dimensius = me->FindNearestCreature(NPC_DIMENSIUS, 50.0f)) - { - dimensius->RemoveAurasDueToSpell(SPELL_DIMENSIUS_TRANSFORM); - dimensius->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); - AttackStart(dimensius); - fight = true; - } - break; - } - - if (!UpdateVictim()) - return; - - DoMeleeAttackIfReady(); - } - }; - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) override + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) override + { + ClearGossipMenuFor(player); + if (uiAction == GOSSIP_ACTION_INFO_DEF + 1) { - ClearGossipMenuFor(player); - if (uiAction == GOSSIP_ACTION_INFO_DEF+1) - { - creature->AI()->SetGUID(player->GetGUID(), DATA_START_ENCOUNTER); - player->KilledMonsterCredit(creature->GetEntry(), 0); - } - else if (uiAction == GOSSIP_ACTION_INFO_DEF+2) - { - creature->AI()->SetGUID(player->GetGUID(), DATA_START_FIGHT); - } - - CloseGossipMenuFor(player); - return true; + creature->AI()->SetGUID(player->GetGUID(), DATA_START_ENCOUNTER); + player->KilledMonsterCredit(creature->GetEntry(), 0); + } + else if (uiAction == GOSSIP_ACTION_INFO_DEF + 2) + { + creature->AI()->SetGUID(player->GetGUID(), DATA_START_FIGHT); } - bool OnGossipHello(Player* player, Creature* creature) override + CloseGossipMenuFor(player); + return true; + } + + bool OnGossipHello(Player* player, Creature* creature) override + { + if (creature->IsQuestGiver()) + player->PrepareQuestMenu(creature->GetGUID()); + + if (player->GetQuestStatus(QUEST_DIMENSIUS_DEVOURING) == QUEST_STATUS_INCOMPLETE) { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (player->GetQuestStatus(QUEST_DIMENSIUS_DEVOURING) == QUEST_STATUS_INCOMPLETE) - { - if (!creature->AI()->GetData(1)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Let's move out.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - else - AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Let's start the battle.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - } - - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - - return true; + if (!creature->AI()->GetData(1)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Let's move out.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + else + AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Let's start the battle.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); } - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_captain_saeedAI(creature); - } + SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + + return true; + } + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_captain_saeedAI(creature); + } }; @@ -1484,104 +1484,104 @@ public: //Phase 1 Dawnforge say switch (Phase) { - case 1: - Talk(SAY_COMMANDER_DAWNFORGE_1); - ++Phase; - Phase_Timer = 16000; - break; - //Phase 2 Ardonis say - case 2: - ardonis->AI()->Talk(SAY_ARCANIST_ARDONIS_1); - ++Phase; - Phase_Timer = 16000; - break; - //Phase 3 Dawnforge say - case 3: - Talk(SAY_COMMANDER_DAWNFORGE_2); - ++Phase; - Phase_Timer = 16000; - break; - //Phase 4 Pathaleon spawns up to phase 9 - case 4: - //spawn pathaleon's image - me->SummonCreature(CreatureEntry[2], 2325.851563f, 2799.534668f, 133.084229f, 6.038996f, TEMPSUMMON_TIMED_DESPAWN, 90000); - ++Phase; - Phase_Timer = 500; - break; - //Phase 5 Pathaleon say - case 5: - pathaleon->AI()->Talk(SAY_PATHALEON_CULATOR_IMAGE_1); - ++Phase; - Phase_Timer = 6000; - break; - //Phase 6 - case 6: - switch (PhaseSubphase) - { - //Subphase 1: Turn Dawnforge and Ardonis - case 0: - Turn_to_Pathaleons_Image(); - ++PhaseSubphase; - Phase_Timer = 8000; - break; - //Subphase 2 Dawnforge say case 1: - Talk(SAY_COMMANDER_DAWNFORGE_3); - PhaseSubphase = 0; + Talk(SAY_COMMANDER_DAWNFORGE_1); ++Phase; - Phase_Timer = 8000; - break; - } - break; - //Phase 7 Pathaleons say 3 Sentence, every sentence need a subphase - case 7: - switch (PhaseSubphase) - { - //Subphase 1 - case 0: - pathaleon->AI()->Talk(SAY_PATHALEON_CULATOR_IMAGE_2); - ++PhaseSubphase; - Phase_Timer = 12000; - break; - //Subphase 2 - case 1: - pathaleon->AI()->Talk(SAY_PATHALEON_CULATOR_IMAGE_2_1); - ++PhaseSubphase; Phase_Timer = 16000; break; - //Subphase 3 + //Phase 2 Ardonis say case 2: - pathaleon->AI()->Talk(SAY_PATHALEON_CULATOR_IMAGE_2_2); + ardonis->AI()->Talk(SAY_ARCANIST_ARDONIS_1); + ++Phase; + Phase_Timer = 16000; + break; + //Phase 3 Dawnforge say + case 3: + Talk(SAY_COMMANDER_DAWNFORGE_2); + ++Phase; + Phase_Timer = 16000; + break; + //Phase 4 Pathaleon spawns up to phase 9 + case 4: + //spawn pathaleon's image + me->SummonCreature(CreatureEntry[2], 2325.851563f, 2799.534668f, 133.084229f, 6.038996f, TEMPSUMMON_TIMED_DESPAWN, 90000); + ++Phase; + Phase_Timer = 500; + break; + //Phase 5 Pathaleon say + case 5: + pathaleon->AI()->Talk(SAY_PATHALEON_CULATOR_IMAGE_1); + ++Phase; + Phase_Timer = 6000; + break; + //Phase 6 + case 6: + switch (PhaseSubphase) + { + //Subphase 1: Turn Dawnforge and Ardonis + case 0: + Turn_to_Pathaleons_Image(); + ++PhaseSubphase; + Phase_Timer = 8000; + break; + //Subphase 2 Dawnforge say + case 1: + Talk(SAY_COMMANDER_DAWNFORGE_3); + PhaseSubphase = 0; + ++Phase; + Phase_Timer = 8000; + break; + } + break; + //Phase 7 Pathaleons say 3 Sentence, every sentence need a subphase + case 7: + switch (PhaseSubphase) + { + //Subphase 1 + case 0: + pathaleon->AI()->Talk(SAY_PATHALEON_CULATOR_IMAGE_2); + ++PhaseSubphase; + Phase_Timer = 12000; + break; + //Subphase 2 + case 1: + pathaleon->AI()->Talk(SAY_PATHALEON_CULATOR_IMAGE_2_1); + ++PhaseSubphase; + Phase_Timer = 16000; + break; + //Subphase 3 + case 2: + pathaleon->AI()->Talk(SAY_PATHALEON_CULATOR_IMAGE_2_2); + PhaseSubphase = 0; + ++Phase; + Phase_Timer = 10000; + break; + } + break; + //Phase 8 Dawnforge & Ardonis say + case 8: + Talk(SAY_COMMANDER_DAWNFORGE_4); + ardonis->AI()->Talk(SAY_ARCANIST_ARDONIS_2); + ++Phase; + Phase_Timer = 4000; + break; + //Phase 9 Pathaleons Despawn, Reset Dawnforge & Ardonis angle + case 9: + Turn_to_eachother(); + //hide pathaleon, unit will despawn shortly + pathaleon->SetVisible(false); PhaseSubphase = 0; ++Phase; - Phase_Timer = 10000; + Phase_Timer = 3000; break; - } - break; - //Phase 8 Dawnforge & Ardonis say - case 8: - Talk(SAY_COMMANDER_DAWNFORGE_4); - ardonis->AI()->Talk(SAY_ARCANIST_ARDONIS_2); - ++Phase; - Phase_Timer = 4000; - break; - //Phase 9 Pathaleons Despawn, Reset Dawnforge & Ardonis angle - case 9: - Turn_to_eachother(); - //hide pathaleon, unit will despawn shortly - pathaleon->SetVisible(false); - PhaseSubphase = 0; - ++Phase; - Phase_Timer = 3000; - break; //Phase 10 Dawnforge say - case 10: - Talk(SAY_COMMANDER_DAWNFORGE_5); - player->AreaExploredOrEventHappens(QUEST_INFO_GATHERING); - Reset(); - break; + case 10: + Talk(SAY_COMMANDER_DAWNFORGE_5); + player->AreaExploredOrEventHappens(QUEST_INFO_GATHERING); + Reset(); + break; } - } + } }; }; @@ -1616,7 +1616,7 @@ enum ProfessorDabiriData { SPELL_PHASE_DISTRUPTOR = 35780, - //WHISPER_DABIRI = 0, not existing in database + //WHISPER_DABIRI = 0, not existing in database QUEST_DIMENSIUS = 10439, QUEST_ON_NETHERY_WINGS = 10438, @@ -1631,12 +1631,12 @@ public: //OnQuestAccept: //if (quest->GetQuestId() == QUEST_DIMENSIUS) - //creature->AI()->Talk(WHISPER_DABIRI, player); + //creature->AI()->Talk(WHISPER_DABIRI, player); bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override { ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF + 1) { creature->CastSpell(player, SPELL_PHASE_DISTRUPTOR, false); CloseGossipMenuFor(player); @@ -1651,7 +1651,7 @@ public: player->PrepareQuestMenu(creature->GetGUID()); if (player->GetQuestStatus(QUEST_ON_NETHERY_WINGS) == QUEST_STATUS_INCOMPLETE && !player->HasItemCount(29778)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); @@ -1764,12 +1764,13 @@ public: } else ManaBurnTimer = 3500; - } else ManaBurnTimer -= diff; + } + else ManaBurnTimer -= diff; if (Player* player = ObjectAccessor::GetPlayer(*me, PlayerGUID)) // start: support for quest 10190 { if (!Weak && HealthBelowPct(WeakPercent) - && player->GetQuestStatus(QUEST_RECHARGING_THE_BATTERIES) == QUEST_STATUS_INCOMPLETE) + && player->GetQuestStatus(QUEST_RECHARGING_THE_BATTERIES) == QUEST_STATUS_INCOMPLETE) { Talk(EMOTE_WEAK); Weak = true; @@ -1912,8 +1913,8 @@ public: void Reset() { - bTake=false; - uiTakeTimer=3000; + bTake = false; + uiTakeTimer = 3000; } void WaypointReached(uint32 waypointId) @@ -1933,7 +1934,7 @@ public: // take the GO -> animation me->HandleEmoteCommand(EMOTE_STATE_LOOT); SetEscortPaused(true); - bTake=true; + bTake = true; } break; case 36: //return and quest_complete @@ -1960,7 +1961,7 @@ public: if (GameObject* go = GetClosestGameObjectWithEntry(me, GO_DRAENEI_MACHINE, INTERACTION_DISTANCE)) { SetEscortPaused(false); - bTake=false; + bTake = false; uiTakeTimer = 3000; go->Delete(); } diff --git a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp index 07dcb9882..e139c1aee 100644 --- a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp +++ b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp @@ -38,52 +38,52 @@ EndContentData */ // Ours class spell_q10612_10613_the_fel_and_the_furious : public SpellScriptLoader { - public: - spell_q10612_10613_the_fel_and_the_furious() : SpellScriptLoader("spell_q10612_10613_the_fel_and_the_furious") { } +public: + spell_q10612_10613_the_fel_and_the_furious() : SpellScriptLoader("spell_q10612_10613_the_fel_and_the_furious") { } - class spell_q10612_10613_the_fel_and_the_furious_SpellScript : public SpellScript + class spell_q10612_10613_the_fel_and_the_furious_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q10612_10613_the_fel_and_the_furious_SpellScript); + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_q10612_10613_the_fel_and_the_furious_SpellScript); + Player* charmer = GetCaster()->GetCharmerOrOwnerPlayerOrPlayerItself(); + if (!charmer) + return; - void HandleScriptEffect(SpellEffIndex /*effIndex*/) + std::list gList; + GetCaster()->GetGameObjectListWithEntryInGrid(gList, 184979, 30.0f); + uint8 counter = 0; + for (std::list::const_iterator itr = gList.begin(); itr != gList.end(); ++itr, ++counter) { - Player* charmer = GetCaster()->GetCharmerOrOwnerPlayerOrPlayerItself(); - if (!charmer) - return; - - std::list gList; - GetCaster()->GetGameObjectListWithEntryInGrid(gList, 184979, 30.0f); - uint8 counter = 0; - for (std::list::const_iterator itr = gList.begin(); itr != gList.end(); ++itr, ++counter) + if (counter >= 10) + break; + GameObject* go = *itr; + if (!go->isSpawned()) + continue; + Creature* cr2 = go->SummonTrigger(go->GetPositionX(), go->GetPositionY(), go->GetPositionZ() + 2.0f, 0.0f, 100); + if (cr2) { - if (counter >= 10) - break; - GameObject* go = *itr; - if (!go->isSpawned()) - continue; - Creature* cr2 = go->SummonTrigger(go->GetPositionX(), go->GetPositionY(), go->GetPositionZ()+2.0f, 0.0f, 100); - if (cr2) - { - cr2->setFaction(14); - cr2->SetUInt32Value(UNIT_FIELD_FLAGS, 0); - GetCaster()->CastSpell(cr2, 38083, true); - } - - go->SetLootState(GO_JUST_DEACTIVATED); - charmer->KilledMonsterCredit(21959, 0); + cr2->setFaction(14); + cr2->SetUInt32Value(UNIT_FIELD_FLAGS, 0); + GetCaster()->CastSpell(cr2, 38083, true); } - } - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_q10612_10613_the_fel_and_the_furious_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + go->SetLootState(GO_JUST_DEACTIVATED); + charmer->KilledMonsterCredit(21959, 0); } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q10612_10613_the_fel_and_the_furious_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_q10612_10613_the_fel_and_the_furious_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q10612_10613_the_fel_and_the_furious_SpellScript(); + } }; class spell_q10563_q10596_to_legion_hold : public SpellScriptLoader @@ -95,7 +95,7 @@ public: { PrepareAuraScript(spell_q10563_q10596_to_legion_hold_AuraScript) - void HandleEffectRemove(AuraEffect const * /*aurEff*/, AuraEffectHandleModes /*mode*/) + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { if (Player* player = GetTarget()->ToPlayer()) { @@ -104,7 +104,7 @@ public: } } - void HandleEffectApply(AuraEffect const * /*aurEff*/, AuraEffectHandleModes /*mode*/) + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { if (Player* player = GetTarget()->ToPlayer()) { @@ -182,16 +182,16 @@ public: { switch (eventId) { - case EVENT_CAST_SUMMON_INFERNAL: - { - if (Unit* infernal = ObjectAccessor::GetUnit(*me, infernalGUID)) - if (infernal->GetDisplayId() == MODEL_INVISIBLE) - me->CastSpell(infernal, SPELL_SUMMON_INFERNAL, true); - events.ScheduleEvent(EVENT_CAST_SUMMON_INFERNAL, 12000); - break; - } - default: - break; + case EVENT_CAST_SUMMON_INFERNAL: + { + if (Unit* infernal = ObjectAccessor::GetUnit(*me, infernalGUID)) + if (infernal->GetDisplayId() == MODEL_INVISIBLE) + me->CastSpell(infernal, SPELL_SUMMON_INFERNAL, true); + events.ScheduleEvent(EVENT_CAST_SUMMON_INFERNAL, 12000); + break; + } + default: + break; } } } @@ -394,7 +394,7 @@ public: else EatTimer -= diff; - return; + return; } if (!UpdateVictim()) @@ -404,7 +404,8 @@ public: { DoCastVictim(SPELL_NETHER_BREATH); CastTimer = 5000; - } else CastTimer -= diff; + } + else CastTimer -= diff; DoMeleeAttackIfReady(); } @@ -540,7 +541,8 @@ public: me->GetMotionMaster()->MovePoint(1, pos); } } - } else FlyTimer -= diff; + } + else FlyTimer -= diff; } return; } @@ -651,39 +653,39 @@ public: { switch (events.ExecuteEvent()) { - case EVENT_WALK_TO_MUTTON: - me->SetWalk(true); - me->GetMotionMaster()->MovePoint(1, x, y, z, true); - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_NONE); - me->HandleEmoteCommand(EMOTE_ONESHOT_CHEER); - break; - case EVENT_POISONED: - if (GameObject* food = me->FindNearestGameObject(DELICIOUS_MUTTON, 5.0f)) - food->RemoveFromWorld(); - if (roll_chance_i(20)) - Talk(SAY_POISONED_1); - CreditPlayer(); - me->CastSpell(me, SPELL_VOMIT); - events.ScheduleEvent(EVENT_KILL, 5000); - break; - case EVENT_KILL: - Unit::DealDamage(me, me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); - break; + case EVENT_WALK_TO_MUTTON: + me->SetWalk(true); + me->GetMotionMaster()->MovePoint(1, x, y, z, true); + me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_NONE); + me->HandleEmoteCommand(EMOTE_ONESHOT_CHEER); + break; + case EVENT_POISONED: + if (GameObject* food = me->FindNearestGameObject(DELICIOUS_MUTTON, 5.0f)) + food->RemoveFromWorld(); + if (roll_chance_i(20)) + Talk(SAY_POISONED_1); + CreditPlayer(); + me->CastSpell(me, SPELL_VOMIT); + events.ScheduleEvent(EVENT_KILL, 5000); + break; + case EVENT_KILL: + Unit::DealDamage(me, me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); + break; } return; } switch (events.ExecuteEvent()) { - case EVENT_KICK: - if (me->GetVictim()->HasUnitState(SPELL_STATE_CASTING)) - DoCastVictim(SPELL_KICK); - events.RepeatEvent(urand(5000, 10000)); - break; - case EVENT_SUNDER: - DoCastVictim(SPELL_SUNDER); - events.RepeatEvent(urand(5000, 10000)); - break; + case EVENT_KICK: + if (me->GetVictim()->HasUnitState(SPELL_STATE_CASTING)) + DoCastVictim(SPELL_KICK); + events.RepeatEvent(urand(5000, 10000)); + break; + case EVENT_SUNDER: + DoCastVictim(SPELL_SUNDER); + events.RepeatEvent(urand(5000, 10000)); + break; } DoMeleeAttackIfReady(); @@ -737,7 +739,7 @@ public: bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) override { ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF + 1) { ItemPosCountVec dest; uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, 30658, 1, nullptr); @@ -747,7 +749,7 @@ public: ClearGossipMenuFor(player); } } - if (action == GOSSIP_ACTION_INFO_DEF+2) + if (action == GOSSIP_ACTION_INFO_DEF + 2) { ItemPosCountVec dest; uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, 30659, 1, nullptr); @@ -763,9 +765,9 @@ public: bool OnGossipHello(Player* player, Creature* creature) override { if (player->GetQuestStatus(10583) == QUEST_STATUS_INCOMPLETE && !player->HasItemCount(30658, 1, true)) - AddGossipItemFor(player, 0, GOSSIP_HSK1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + AddGossipItemFor(player, 0, GOSSIP_HSK1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); if (player->GetQuestStatus(10601) == QUEST_STATUS_INCOMPLETE && !player->HasItemCount(30659, 1, true)) - AddGossipItemFor(player, 0, GOSSIP_HSK2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); + AddGossipItemFor(player, 0, GOSSIP_HSK2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); @@ -789,19 +791,19 @@ enum Karynaku class npc_karynaku : public CreatureScript { - public: - npc_karynaku() : CreatureScript("npc_karynaku") { } +public: + npc_karynaku() : CreatureScript("npc_karynaku") { } - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) - { - if (quest->GetQuestId() == QUEST_ALLY_OF_NETHER) - player->ActivateTaxiPathTo(TAXI_PATH_ID); + bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) + { + if (quest->GetQuestId() == QUEST_ALLY_OF_NETHER) + player->ActivateTaxiPathTo(TAXI_PATH_ID); - if (quest->GetQuestId() == QUEST_ZUHULED_THE_WACK) - creature->SummonCreature(NPC_ZUHULED_THE_WACKED, -4204.94f, 316.397f, 122.508f, 1.309f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 300000); + if (quest->GetQuestId() == QUEST_ZUHULED_THE_WACK) + creature->SummonCreature(NPC_ZUHULED_THE_WACKED, -4204.94f, 316.397f, 122.508f, 1.309f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 300000); - return true; - } + return true; + } }; /*#### @@ -941,7 +943,7 @@ public: void EnterCombat(Unit* who) { //don't always use - if (rand()%5) + if (rand() % 5) return; //only aggro text if not player @@ -997,7 +999,7 @@ struct TorlothCinematic }; // Creature 0 - Torloth, 1 - Illidan -static TorlothCinematic TorlothAnim[]= +static TorlothCinematic TorlothAnim[] = { {0, 2000}, {1, 7000}, @@ -1014,7 +1016,7 @@ struct Location }; //Cordinates for Spawns -static Location SpawnLocation[]= +static Location SpawnLocation[] = { //Cords used for: {-4615.8556f, 1342.2532f, 139.9f, 1.612f}, //Illidari Soldier @@ -1041,7 +1043,7 @@ struct WaveData uint32 CreatureId, SpawnTimer, YellTimer; }; -static WaveData WavesInfo[]= +static WaveData WavesInfo[] = { {9, 0, 22075, 10000, 7000}, //Illidari Soldier {2, 9, 22074, 10000, 7000}, //Illidari Mind Breaker @@ -1051,10 +1053,10 @@ static WaveData WavesInfo[]= struct SpawnSpells { - uint32 Timer1, Timer2, SpellId; + uint32 Timer1, Timer2, SpellId; }; -static SpawnSpells SpawnCast[]= +static SpawnSpells SpawnCast[] = { {10000, 15000, 35871}, // Illidari Soldier Cast - Spellbreaker {10000, 10000, 38985}, // Illidari Mind Breake Cast - Focused Bursts @@ -1125,31 +1127,31 @@ public: switch (AnimationCount) { - case 0: - me->SetUInt32Value(UNIT_FIELD_BYTES_1, 8); - break; - case 3: - me->RemoveFlag(UNIT_FIELD_BYTES_1, 8); - break; - case 5: - if (Player* AggroTarget = ObjectAccessor::GetPlayer(*me, AggroTargetGUID)) - { - me->SetTarget(AggroTarget->GetGUID()); - me->AddThreat(AggroTarget, 1); - me->HandleEmoteCommand(EMOTE_ONESHOT_POINT); - } - break; - case 6: - if (Player* AggroTarget = ObjectAccessor::GetPlayer(*me, AggroTargetGUID)) - { - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - me->ClearUnitState(UNIT_STATE_ROOT); + case 0: + me->SetUInt32Value(UNIT_FIELD_BYTES_1, 8); + break; + case 3: + me->RemoveFlag(UNIT_FIELD_BYTES_1, 8); + break; + case 5: + if (Player* AggroTarget = ObjectAccessor::GetPlayer(*me, AggroTargetGUID)) + { + me->SetTarget(AggroTarget->GetGUID()); + me->AddThreat(AggroTarget, 1); + me->HandleEmoteCommand(EMOTE_ONESHOT_POINT); + } + break; + case 6: + if (Player* AggroTarget = ObjectAccessor::GetPlayer(*me, AggroTargetGUID)) + { + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + me->ClearUnitState(UNIT_STATE_ROOT); - float x, y, z; - AggroTarget->GetPosition(x, y, z); - me->GetMotionMaster()->MovePoint(0, x, y, z); - } - break; + float x, y, z; + AggroTarget->GetPosition(x, y, z); + me->GetMotionMaster()->MovePoint(0, x, y, z); + } + break; } ++AnimationCount; } @@ -1161,13 +1163,15 @@ public: if (AnimationTimer <= diff) { HandleAnimation(); - } else AnimationTimer -= diff; + } + else AnimationTimer -= diff; } if (AnimationCount < 6) { me->CombatStop(); - } else if (!Timers) + } + else if (!Timers) { SpellTimer1 = SpawnCast[6].Timer1; SpellTimer2 = SpawnCast[7].Timer1; @@ -1180,20 +1184,23 @@ public: if (SpellTimer1 <= diff) { DoCastVictim(SpawnCast[6].SpellId);//Cleave - SpellTimer1 = SpawnCast[6].Timer2 + (rand()%10 * 1000); - } else SpellTimer1 -= diff; + SpellTimer1 = SpawnCast[6].Timer2 + (rand() % 10 * 1000); + } + else SpellTimer1 -= diff; if (SpellTimer2 <= diff) { DoCastVictim(SpawnCast[7].SpellId);//Shadowfury - SpellTimer2 = SpawnCast[7].Timer2 + (rand()%5 * 1000); - } else SpellTimer2 -= diff; + SpellTimer2 = SpawnCast[7].Timer2 + (rand() % 5 * 1000); + } + else SpellTimer2 -= diff; if (SpellTimer3 <= diff) { DoCast(me, SpawnCast[8].SpellId); - SpellTimer3 = SpawnCast[8].Timer2 + (rand()%7 * 1000);//Spell Reflection - } else SpellTimer3 -= diff; + SpellTimer3 = SpawnCast[8].Timer2 + (rand() % 7 * 1000); //Spell Reflection + } + else SpellTimer3 -= diff; } DoMeleeAttackIfReady(); @@ -1292,7 +1299,7 @@ public: Group::MemberSlotList const& members = EventGroup->GetMemberSlots(); - for (Group::member_citerator itr = members.begin(); itr!= members.end(); ++itr) + for (Group::member_citerator itr = members.begin(); itr != members.end(); ++itr) { Player* GroupMember = ObjectAccessor::GetPlayer(*me, itr->guid); if (!GroupMember) @@ -1315,7 +1322,7 @@ public: if (GroupMemberCount == DeadMemberCount) { - for (Group::member_citerator itr = members.begin(); itr!= members.end(); ++itr) + for (Group::member_citerator itr = members.begin(); itr != members.end(); ++itr) { if (Player* groupMember = ObjectAccessor::GetPlayer(*me, itr->guid)) if (groupMember->GetQuestStatus(QUEST_BATTLE_OF_THE_CRIMSON_WATCH) == QUEST_STATUS_INCOMPLETE) @@ -1323,7 +1330,8 @@ public: } Failed = true; } - } else if (player->isDead() || !player->IsWithinDistInMap(me, EVENT_AREA_RADIUS)) + } + else if (player->isDead() || !player->IsWithinDistInMap(me, EVENT_AREA_RADIUS)) { player->FailQuest(QUEST_BATTLE_OF_THE_CRIMSON_WATCH); Failed = true; @@ -1413,18 +1421,18 @@ public: { if (me->GetEntry() == 22075)//Illidari Soldier { - SpellTimer1 = SpawnCast[0].Timer1 + (rand()%4 * 1000); + SpellTimer1 = SpawnCast[0].Timer1 + (rand() % 4 * 1000); } if (me->GetEntry() == 22074)//Illidari Mind Breaker { - SpellTimer1 = SpawnCast[1].Timer1 + (rand()%10 * 1000); - SpellTimer2 = SpawnCast[2].Timer1 + (rand()%4 * 1000); - SpellTimer3 = SpawnCast[3].Timer1 + (rand()%4 * 1000); + SpellTimer1 = SpawnCast[1].Timer1 + (rand() % 10 * 1000); + SpellTimer2 = SpawnCast[2].Timer1 + (rand() % 4 * 1000); + SpellTimer3 = SpawnCast[3].Timer1 + (rand() % 4 * 1000); } if (me->GetEntry() == 19797)// Illidari Highlord { - SpellTimer1 = SpawnCast[4].Timer1 + (rand()%4 * 1000); - SpellTimer2 = SpawnCast[5].Timer1 + (rand()%4 * 1000); + SpellTimer1 = SpawnCast[4].Timer1 + (rand() % 4 * 1000); + SpellTimer2 = SpawnCast[5].Timer1 + (rand() % 4 * 1000); } Timers = true; } @@ -1434,8 +1442,9 @@ public: if (SpellTimer1 <= diff) { DoCastVictim(SpawnCast[0].SpellId);//Spellbreaker - SpellTimer1 = SpawnCast[0].Timer2 + (rand()%5 * 1000); - } else SpellTimer1 -= diff; + SpellTimer1 = SpawnCast[0].Timer2 + (rand() % 5 * 1000); + } + else SpellTimer1 -= diff; } //Illidari Mind Breaker if (me->GetEntry() == 22074) @@ -1447,22 +1456,26 @@ public: if (target->GetTypeId() == TYPEID_PLAYER) { DoCast(target, SpawnCast[1].SpellId); //Focused Bursts - SpellTimer1 = SpawnCast[1].Timer2 + (rand()%5 * 1000); - } else SpellTimer1 = 2000; + SpellTimer1 = SpawnCast[1].Timer2 + (rand() % 5 * 1000); + } + else SpellTimer1 = 2000; } - } else SpellTimer1 -= diff; + } + else SpellTimer1 -= diff; if (SpellTimer2 <= diff) { DoCastVictim(SpawnCast[2].SpellId);//Psychic Scream - SpellTimer2 = SpawnCast[2].Timer2 + (rand()%13 * 1000); - } else SpellTimer2 -= diff; + SpellTimer2 = SpawnCast[2].Timer2 + (rand() % 13 * 1000); + } + else SpellTimer2 -= diff; if (SpellTimer3 <= diff) { DoCastVictim(SpawnCast[3].SpellId);//Mind Blast - SpellTimer3 = SpawnCast[3].Timer2 + (rand()%8 * 1000); - } else SpellTimer3 -= diff; + SpellTimer3 = SpawnCast[3].Timer2 + (rand() % 8 * 1000); + } + else SpellTimer3 -= diff; } //Illidari Highlord if (me->GetEntry() == 19797) @@ -1470,14 +1483,16 @@ public: if (SpellTimer1 <= diff) { DoCastVictim(SpawnCast[4].SpellId);//Curse Of Flames - SpellTimer1 = SpawnCast[4].Timer2 + (rand()%10 * 1000); - } else SpellTimer1 -= diff; + SpellTimer1 = SpawnCast[4].Timer2 + (rand() % 10 * 1000); + } + else SpellTimer1 -= diff; if (SpellTimer2 <= diff) { DoCastVictim(SpawnCast[5].SpellId);//Flamestrike - SpellTimer2 = SpawnCast[5].Timer2 + (rand()%7 * 13000); - } else SpellTimer2 -= diff; + SpellTimer2 = SpawnCast[5].Timer2 + (rand() % 7 * 13000); + } + else SpellTimer2 -= diff; } DoMeleeAttackIfReady(); @@ -1506,7 +1521,7 @@ void npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::SummonNextWave() { if (WaveCount == 0)//1 Wave { - if (rand()%3 == 1 && FelguardCount<2) + if (rand() % 3 == 1 && FelguardCount < 2) { Spawn->SetDisplayId(18654); ++FelguardCount; @@ -1516,7 +1531,7 @@ void npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::SummonNextWave() Spawn->SetDisplayId(19991); ++DreadlordCount; } - else if (FelguardCount<2) + else if (FelguardCount < 2) { Spawn->SetDisplayId(18654); ++FelguardCount; @@ -1569,10 +1584,10 @@ public: { CAST_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, Illidan->AI())->PlayerGUID = player->GetGUID(); CAST_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, Illidan->AI())->LiveCount = 0; - CAST_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, Illidan->AI())->EventStarted=true; + CAST_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, Illidan->AI())->EventStarted = true; } } - return true; + return true; } }; @@ -1582,7 +1597,7 @@ public: enum Enraged_Dpirits { -// QUESTS + // QUESTS QUEST_ENRAGED_SPIRITS_FIRE_EARTH = 10458, QUEST_ENRAGED_SPIRITS_AIR = 10481, QUEST_ENRAGED_SPIRITS_WATER = 10480, @@ -1630,7 +1645,7 @@ public: CreatureAI* GetAI(Creature* creature) const { - return new npc_enraged_spiritAI(creature); + return new npc_enraged_spiritAI(creature); } struct npc_enraged_spiritAI : public ScriptedAI @@ -1651,22 +1666,22 @@ public: switch (me->GetEntry()) { - case NPC_ENRAGED_FIRE_SPIRIT: + case NPC_ENRAGED_FIRE_SPIRIT: entry = NPC_FIERY_SOUL; //credit = SPELL_FIERY_SOUL_CAPTURED_CREDIT; credit = NPC_CREDIT_FIRE; break; - case NPC_ENRAGED_EARTH_SPIRIT: + case NPC_ENRAGED_EARTH_SPIRIT: entry = NPC_EARTHEN_SOUL; //credit = SPELL_EARTHEN_SOUL_CAPTURED_CREDIT; credit = NPC_CREDIT_EARTH; break; - case NPC_ENRAGED_AIR_SPIRIT: + case NPC_ENRAGED_AIR_SPIRIT: entry = NPC_ENRAGED_AIRY_SOUL; //credit = SPELL_AIRY_SOUL_CAPTURED_CREDIT; credit = NPC_CREDIT_AIR; break; - case NPC_ENRAGED_WATER_SPIRIT: + case NPC_ENRAGED_WATER_SPIRIT: entry = NPC_ENRAGED_WATERY_SOUL; //credit = SPELL_WATERY_SOUL_CAPTURED_CREDIT; credit = NPC_CREDIT_WATER; @@ -1685,17 +1700,17 @@ public: // FIND TOTEM, PROCESS QUEST if (Summoned) { - totemOspirits = me->FindNearestCreature(ENTRY_TOTEM_OF_SPIRITS, RADIUS_TOTEM_OF_SPIRITS); - if (totemOspirits) - { - Summoned->setFaction(FACTION_ENRAGED_SOUL_FRIENDLY); - Summoned->GetMotionMaster()->MovePoint(0, totemOspirits->GetPositionX(), totemOspirits->GetPositionY(), Summoned->GetPositionZ()); + totemOspirits = me->FindNearestCreature(ENTRY_TOTEM_OF_SPIRITS, RADIUS_TOTEM_OF_SPIRITS); + if (totemOspirits) + { + Summoned->setFaction(FACTION_ENRAGED_SOUL_FRIENDLY); + Summoned->GetMotionMaster()->MovePoint(0, totemOspirits->GetPositionX(), totemOspirits->GetPositionY(), Summoned->GetPositionZ()); - if (Unit* owner = totemOspirits->GetOwner()) - if (Player* player = owner->ToPlayer()) - player->KilledMonsterCredit(credit, 0); - DoCast(totemOspirits, SPELL_SOUL_CAPTURED); - } + if (Unit* owner = totemOspirits->GetOwner()) + if (Player* player = owner->ToPlayer()) + player->KilledMonsterCredit(credit, 0); + DoCast(totemOspirits, SPELL_SOUL_CAPTURED); + } } } }; @@ -1770,7 +1785,7 @@ public: // Respawn the tuber if (tuberGUID) if (GameObject* tuber = ObjectAccessor::GetGameObject(*me, tuberGUID)) - // @Workaround: find how to properly respawn the GO + // @Workaround: find how to properly respawn the GO tuber->SetPhaseMask(1, true); Reset(); diff --git a/src/server/scripts/Outland/zone_shattrath_city.cpp b/src/server/scripts/Outland/zone_shattrath_city.cpp index 725b0332d..7a0a686f9 100644 --- a/src/server/scripts/Outland/zone_shattrath_city.cpp +++ b/src/server/scripts/Outland/zone_shattrath_city.cpp @@ -48,7 +48,7 @@ public: bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override { ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF + 1) { CloseGossipMenuFor(player); creature->setFaction(FACTION_HOSTILE_RD); @@ -60,7 +60,7 @@ public: bool OnGossipHello(Player* player, Creature* creature) override { if (player->GetQuestStatus(QUEST_CRACK_SKULLS) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_RALIQ, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_RALIQ, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); SendGossipMenuFor(player, 9440, creature->GetGUID()); return true; @@ -96,7 +96,8 @@ public: { DoCastVictim(SPELL_UPPERCUT); Uppercut_Timer = 15000; - } else Uppercut_Timer -= diff; + } + else Uppercut_Timer -= diff; DoMeleeAttackIfReady(); } @@ -159,7 +160,7 @@ public: me->RestoreFaction(); } - void DamageTaken(Unit* done_by, uint32 &damage, DamageEffectType, SpellSchoolMask) override + void DamageTaken(Unit* done_by, uint32& damage, DamageEffectType, SpellSchoolMask) override { // xinef: some corrections if (done_by) @@ -181,7 +182,8 @@ public: { DoCastVictim(SPELL_MAGNETIC_PULL); MagneticPull_Timer = 15000; - } else MagneticPull_Timer -= diff; + } + else MagneticPull_Timer -= diff; DoMeleeAttackIfReady(); } @@ -261,7 +263,7 @@ public: bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) override { ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF + 1) player->CastSpell(player, 37778, false); return true; @@ -270,7 +272,7 @@ public: bool OnGossipHello(Player* player, Creature* creature) override { if (player->GetReputationRank(989) >= REP_REVERED) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HZ, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HZ, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); @@ -444,9 +446,9 @@ public: bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override { ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF + 1) SendGossipMenuFor(player, 9458, creature->GetGUID()); - else if (action == GOSSIP_ACTION_INFO_DEF+2) + else if (action == GOSSIP_ACTION_INFO_DEF + 2) SendGossipMenuFor(player, 9459, creature->GetGUID()); return true; @@ -457,8 +459,8 @@ public: if (creature->IsQuestGiver()) player->PrepareQuestMenu(creature->GetGUID()); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, ISANAH_GOSSIP_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, ISANAH_GOSSIP_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, ISANAH_GOSSIP_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, ISANAH_GOSSIP_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); diff --git a/src/server/scripts/Outland/zone_terokkar_forest.cpp b/src/server/scripts/Outland/zone_terokkar_forest.cpp index 40f651453..289eee8d0 100644 --- a/src/server/scripts/Outland/zone_terokkar_forest.cpp +++ b/src/server/scripts/Outland/zone_terokkar_forest.cpp @@ -43,91 +43,91 @@ enum fumping class spell_q10930_big_bone_worm : public SpellScriptLoader { - public: - spell_q10930_big_bone_worm() : SpellScriptLoader("spell_q10930_big_bone_worm") { } +public: + spell_q10930_big_bone_worm() : SpellScriptLoader("spell_q10930_big_bone_worm") { } - class spell_q10930_big_bone_worm_SpellScript : public SpellScript + class spell_q10930_big_bone_worm_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q10930_big_bone_worm_SpellScript); + + void SetDest(SpellDestination& dest) { - PrepareSpellScript(spell_q10930_big_bone_worm_SpellScript); - - void SetDest(SpellDestination& dest) - { - Position const offset = { 0.5f, 0.5f, 5.0f, 0.0f }; - dest.RelocateOffset(offset); - } - - void Register() - { - OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_q10930_big_bone_worm_SpellScript::SetDest, EFFECT_1, TARGET_DEST_CASTER); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q10930_big_bone_worm_SpellScript(); + Position const offset = { 0.5f, 0.5f, 5.0f, 0.0f }; + dest.RelocateOffset(offset); } - class spell_q10930_big_bone_worm_AuraScript : public AuraScript + void Register() { - PrepareAuraScript(spell_q10930_big_bone_worm_AuraScript); - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) - return; - - GetUnitOwner()->CastSpell(GetUnitOwner(), RAND(SPELL_SUMMON_HAISHULUD, SPELL_SUMMON_MATURE_BONE_SIFTER1, SPELL_SUMMON_MATURE_BONE_SIFTER3), true); - } - - void Register() - { - OnEffectRemove += AuraEffectRemoveFn(spell_q10930_big_bone_worm_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_q10930_big_bone_worm_AuraScript(); + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_q10930_big_bone_worm_SpellScript::SetDest, EFFECT_1, TARGET_DEST_CASTER); } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q10930_big_bone_worm_SpellScript(); + } + + class spell_q10930_big_bone_worm_AuraScript : public AuraScript + { + PrepareAuraScript(spell_q10930_big_bone_worm_AuraScript); + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) + return; + + GetUnitOwner()->CastSpell(GetUnitOwner(), RAND(SPELL_SUMMON_HAISHULUD, SPELL_SUMMON_MATURE_BONE_SIFTER1, SPELL_SUMMON_MATURE_BONE_SIFTER3), true); + } + + void Register() + { + OnEffectRemove += AuraEffectRemoveFn(spell_q10930_big_bone_worm_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_q10930_big_bone_worm_AuraScript(); + } }; class spell_q10929_fumping : SpellScriptLoader { - public: - spell_q10929_fumping() : SpellScriptLoader("spell_q10929_fumping") { } +public: + spell_q10929_fumping() : SpellScriptLoader("spell_q10929_fumping") { } - class spell_q10929_fumping_SpellScript : public SpellScript + class spell_q10929_fumping_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q10929_fumping_SpellScript); + + void SetDest(SpellDestination& dest) { - PrepareSpellScript(spell_q10929_fumping_SpellScript); - - void SetDest(SpellDestination& dest) - { - Position const offset = { 0.5f, 0.5f, 5.0f, 0.0f }; - dest.RelocateOffset(offset); - } - - void Register() - { - OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_q10929_fumping_SpellScript::SetDest, EFFECT_1, TARGET_DEST_CASTER); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q10929_fumping_SpellScript(); + Position const offset = { 0.5f, 0.5f, 5.0f, 0.0f }; + dest.RelocateOffset(offset); } - class spell_q10929_fumping_AuraScript : public AuraScript + void Register() { - PrepareAuraScript(spell_q10929_fumping_AuraScript); + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_q10929_fumping_SpellScript::SetDest, EFFECT_1, TARGET_DEST_CASTER); + } + }; - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) - return; + SpellScript* GetSpellScript() const + { + return new spell_q10929_fumping_SpellScript(); + } - GetUnitOwner()->CastSpell(GetUnitOwner(), RAND(SPELL_SUMMON_SAND_GNOME1, SPELL_SUMMON_SAND_GNOME3, SPELL_SUMMON_MATURE_BONE_SIFTER1, SPELL_SUMMON_MATURE_BONE_SIFTER3), true); - } + class spell_q10929_fumping_AuraScript : public AuraScript + { + PrepareAuraScript(spell_q10929_fumping_AuraScript); + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) + return; + + GetUnitOwner()->CastSpell(GetUnitOwner(), RAND(SPELL_SUMMON_SAND_GNOME1, SPELL_SUMMON_SAND_GNOME3, SPELL_SUMMON_MATURE_BONE_SIFTER1, SPELL_SUMMON_MATURE_BONE_SIFTER3), true); + } void Register() { @@ -143,23 +143,23 @@ class spell_q10929_fumping : SpellScriptLoader class npc_greatfather_aldrimus : public CreatureScript { - public: - npc_greatfather_aldrimus() : CreatureScript("npc_greatfather_aldrimus") { } +public: + npc_greatfather_aldrimus() : CreatureScript("npc_greatfather_aldrimus") { } - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const + { + return new npc_greatfather_aldrimusAI(creature); + } + + struct npc_greatfather_aldrimusAI : public ScriptedAI + { + npc_greatfather_aldrimusAI(Creature* c) : ScriptedAI(c) {} + + bool CanBeSeen(Player const* player) { - return new npc_greatfather_aldrimusAI(creature); + return player->GetQuestStatus(10253) == QUEST_STATUS_REWARDED; } - - struct npc_greatfather_aldrimusAI : public ScriptedAI - { - npc_greatfather_aldrimusAI(Creature* c) : ScriptedAI(c) {} - - bool CanBeSeen(Player const* player) - { - return player->GetQuestStatus(10253) == QUEST_STATUS_REWARDED; - } - }; + }; }; enum q10036Torgos @@ -169,29 +169,29 @@ enum q10036Torgos class spell_q10036_torgos : public SpellScriptLoader { - public: - spell_q10036_torgos() : SpellScriptLoader("spell_q10036_torgos") { } +public: + spell_q10036_torgos() : SpellScriptLoader("spell_q10036_torgos") { } - class spell_q10036_torgos_SpellScript : public SpellScript + class spell_q10036_torgos_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q10036_torgos_SpellScript); + + void HandleSendEvent(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_q10036_torgos_SpellScript); - - void HandleSendEvent(SpellEffIndex /*effIndex*/) - { - if (Creature* torgos = GetCaster()->FindNearestCreature(NPC_TORGOS, 100.0f, true)) - torgos->GetAI()->AttackStart(GetCaster()); - } - - void Register() - { - OnEffectLaunch += SpellEffectFn(spell_q10036_torgos_SpellScript::HandleSendEvent, EFFECT_0, SPELL_EFFECT_SEND_EVENT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q10036_torgos_SpellScript(); + if (Creature* torgos = GetCaster()->FindNearestCreature(NPC_TORGOS, 100.0f, true)) + torgos->GetAI()->AttackStart(GetCaster()); } + + void Register() + { + OnEffectLaunch += SpellEffectFn(spell_q10036_torgos_SpellScript::HandleSendEvent, EFFECT_0, SPELL_EFFECT_SEND_EVENT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q10036_torgos_SpellScript(); + } }; enum eQ10923EvilDrawsNear @@ -205,113 +205,113 @@ enum eQ10923EvilDrawsNear class spell_q10923_evil_draws_near_summon : public SpellScriptLoader { - public: - spell_q10923_evil_draws_near_summon() : SpellScriptLoader("spell_q10923_evil_draws_near_summon") { } +public: + spell_q10923_evil_draws_near_summon() : SpellScriptLoader("spell_q10923_evil_draws_near_summon") { } - class spell_q10923_evil_draws_near_summon_SpellScript : public SpellScript + class spell_q10923_evil_draws_near_summon_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q10923_evil_draws_near_summon_SpellScript); + + void HandleSendEvent(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_q10923_evil_draws_near_summon_SpellScript); - - void HandleSendEvent(SpellEffIndex /*effIndex*/) - { - if (Creature* auchenai = GetCaster()->FindNearestCreature(NPC_AUCHENAI_DEATH_SPIRIT, 10.0f, true)) - auchenai->CastSpell(auchenai, SPELL_DUSTIN_UNDEAD_DRAGON_VISUAL_AURA, true); - } - - void Register() - { - OnEffectLaunch += SpellEffectFn(spell_q10923_evil_draws_near_summon_SpellScript::HandleSendEvent, EFFECT_0, SPELL_EFFECT_SEND_EVENT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q10923_evil_draws_near_summon_SpellScript(); + if (Creature* auchenai = GetCaster()->FindNearestCreature(NPC_AUCHENAI_DEATH_SPIRIT, 10.0f, true)) + auchenai->CastSpell(auchenai, SPELL_DUSTIN_UNDEAD_DRAGON_VISUAL_AURA, true); } + + void Register() + { + OnEffectLaunch += SpellEffectFn(spell_q10923_evil_draws_near_summon_SpellScript::HandleSendEvent, EFFECT_0, SPELL_EFFECT_SEND_EVENT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q10923_evil_draws_near_summon_SpellScript(); + } }; class spell_q10923_evil_draws_near_periodic : public SpellScriptLoader { - public: - spell_q10923_evil_draws_near_periodic() : SpellScriptLoader("spell_q10923_evil_draws_near_periodic") { } +public: + spell_q10923_evil_draws_near_periodic() : SpellScriptLoader("spell_q10923_evil_draws_near_periodic") { } - class spell_q10923_evil_draws_near_periodic_AuraScript : public AuraScript + class spell_q10923_evil_draws_near_periodic_AuraScript : public AuraScript + { + PrepareAuraScript(spell_q10923_evil_draws_near_periodic_AuraScript); + + void HandlePeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_q10923_evil_draws_near_periodic_AuraScript); - - void HandlePeriodic(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - GetUnitOwner()->CastSpell(GetUnitOwner(), RAND(SPELL_DUSTIN_UNDEAD_DRAGON_VISUAL1, SPELL_DUSTIN_UNDEAD_DRAGON_VISUAL2), true); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_q10923_evil_draws_near_periodic_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_q10923_evil_draws_near_periodic_AuraScript(); + PreventDefaultAction(); + GetUnitOwner()->CastSpell(GetUnitOwner(), RAND(SPELL_DUSTIN_UNDEAD_DRAGON_VISUAL1, SPELL_DUSTIN_UNDEAD_DRAGON_VISUAL2), true); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_q10923_evil_draws_near_periodic_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_q10923_evil_draws_near_periodic_AuraScript(); + } }; class spell_q10923_evil_draws_near_visual : public SpellScriptLoader { - public: - spell_q10923_evil_draws_near_visual() : SpellScriptLoader("spell_q10923_evil_draws_near_visual") { } +public: + spell_q10923_evil_draws_near_visual() : SpellScriptLoader("spell_q10923_evil_draws_near_visual") { } - class spell_q10923_evil_draws_near_visual_SpellScript : public SpellScript + class spell_q10923_evil_draws_near_visual_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q10923_evil_draws_near_visual_SpellScript); + + void SetDest(SpellDestination& dest) { - PrepareSpellScript(spell_q10923_evil_draws_near_visual_SpellScript); - - void SetDest(SpellDestination& dest) - { - // Adjust effect summon position - Position const offset = { 0.0f, 0.0f, 20.0f, 0.0f }; - dest.RelocateOffset(offset); - } - - void Register() - { - OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_q10923_evil_draws_near_visual_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER_RADIUS); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q10923_evil_draws_near_visual_SpellScript(); + // Adjust effect summon position + Position const offset = { 0.0f, 0.0f, 20.0f, 0.0f }; + dest.RelocateOffset(offset); } + + void Register() + { + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_q10923_evil_draws_near_visual_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER_RADIUS); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q10923_evil_draws_near_visual_SpellScript(); + } }; class spell_q10898_skywing : public SpellScriptLoader { - public: - spell_q10898_skywing() : SpellScriptLoader("spell_q10898_skywing") { } +public: + spell_q10898_skywing() : SpellScriptLoader("spell_q10898_skywing") { } - class spell_q10898_skywing_SpellScript : public SpellScript + class spell_q10898_skywing_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q10898_skywing_SpellScript); + + void SetDest(SpellDestination& dest) { - PrepareSpellScript(spell_q10898_skywing_SpellScript); - - void SetDest(SpellDestination& dest) - { - // Adjust effect summon position - Position const offset = { frand(-7.0f, 7.0f), frand(-7.0f, 7.0f), 11.0f, 0.0f }; - dest.Relocate(*GetCaster()); - dest.RelocateOffset(offset); - } - - void Register() - { - OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_q10898_skywing_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER_RANDOM); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q10898_skywing_SpellScript(); + // Adjust effect summon position + Position const offset = { frand(-7.0f, 7.0f), frand(-7.0f, 7.0f), 11.0f, 0.0f }; + dest.Relocate(*GetCaster()); + dest.RelocateOffset(offset); } + + void Register() + { + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_q10898_skywing_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER_RANDOM); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q10898_skywing_SpellScript(); + } }; @@ -371,7 +371,7 @@ public: UnkorUnfriendly_Timer = 60000; } - void DamageTaken(Unit* done_by, uint32 &damage, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit* done_by, uint32& damage, DamageEffectType, SpellSchoolMask) { if (!done_by) return; @@ -385,8 +385,8 @@ public: { Player* groupie = itr->GetSource(); if (groupie && groupie->IsInMap(player) && - groupie->GetQuestStatus(QUEST_DONTKILLTHEFATONE) == QUEST_STATUS_INCOMPLETE && - groupie->GetReqKillOrCastCurrentCount(QUEST_DONTKILLTHEFATONE, 18260) == 10) + groupie->GetQuestStatus(QUEST_DONTKILLTHEFATONE) == QUEST_STATUS_INCOMPLETE && + groupie->GetReqKillOrCastCurrentCount(QUEST_DONTKILLTHEFATONE, 18260) == 10) { groupie->AreaExploredOrEventHappens(QUEST_DONTKILLTHEFATONE); if (!CanDoQuest) @@ -395,7 +395,7 @@ public: } } else if (player->GetQuestStatus(QUEST_DONTKILLTHEFATONE) == QUEST_STATUS_INCOMPLETE && - player->GetReqKillOrCastCurrentCount(QUEST_DONTKILLTHEFATONE, 18260) == 10) + player->GetReqKillOrCastCurrentCount(QUEST_DONTKILLTHEFATONE, 18260) == 10) { player->AreaExploredOrEventHappens(QUEST_DONTKILLTHEFATONE); CanDoQuest = true; @@ -418,7 +418,8 @@ public: { EnterEvadeMode(); return; - } else UnkorUnfriendly_Timer -= diff; + } + else UnkorUnfriendly_Timer -= diff; } } @@ -429,7 +430,8 @@ public: { DoCast(me, SPELL_PULVERIZE); Pulverize_Timer = 9000; - } else Pulverize_Timer -= diff; + } + else Pulverize_Timer -= diff; DoMeleeAttackIfReady(); } @@ -457,11 +459,11 @@ public: void Reset() { } void EnterCombat(Unit* /*who*/) { } - void DamageTaken(Unit* done_by, uint32 &damage, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit* done_by, uint32& damage, DamageEffectType, SpellSchoolMask) { if (done_by && done_by->GetTypeId() == TYPEID_PLAYER) if (me->GetHealth() <= damage) - if (rand()%100 < 75) + if (rand() % 100 < 75) //Summon Wood Mites DoCast(me, 39130, true); } @@ -489,11 +491,11 @@ public: void Reset() { } void EnterCombat(Unit* /*who*/) { } - void DamageTaken(Unit* done_by, uint32 &damage, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit* done_by, uint32& damage, DamageEffectType, SpellSchoolMask) { if (done_by && done_by->GetTypeId() == TYPEID_PLAYER) if (me->GetHealth() <= damage) - if (rand()%100 < 75) + if (rand() % 100 < 75) //Summon Lots of Wood Mights DoCast(me, 39134, true); } @@ -529,10 +531,10 @@ public: ClearGossipMenuFor(player); if (action == GOSSIP_ACTION_INFO_DEF) { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FLOON2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FLOON2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); SendGossipMenuFor(player, 9443, creature->GetGUID()); } - if (action == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF + 1) { CloseGossipMenuFor(player); creature->setFaction(FACTION_HOSTILE_FL); @@ -588,19 +590,22 @@ public: { DoCastVictim(SPELL_SILENCE); Silence_Timer = 30000; - } else Silence_Timer -= diff; + } + else Silence_Timer -= diff; if (FrostNova_Timer <= diff) { DoCast(me, SPELL_FROST_NOVA); FrostNova_Timer = 20000; - } else FrostNova_Timer -= diff; + } + else FrostNova_Timer -= diff; if (Frostbolt_Timer <= diff) { DoCastVictim(SPELL_FROSTBOLT); Frostbolt_Timer = 5000; - } else Frostbolt_Timer -= diff; + } + else Frostbolt_Timer -= diff; DoMeleeAttackIfReady(); } @@ -768,7 +773,9 @@ public: ClearGossipMenuFor(player); switch (sender) { - case GOSSIP_SENDER_MAIN: SendActionMenu(player, go, action); break; + case GOSSIP_SENDER_MAIN: + SendActionMenu(player, go, action); + break; } return true; } @@ -792,16 +799,16 @@ public: switch (action) { case GOSSIP_ACTION_INFO_DEF + 1: - player->CastSpell(player, 40642, false); + player->CastSpell(player, 40642, false); break; case GOSSIP_ACTION_INFO_DEF + 2: - player->CastSpell(player, 40640, false); + player->CastSpell(player, 40640, false); break; case GOSSIP_ACTION_INFO_DEF + 3: - player->CastSpell(player, 40632, false); + player->CastSpell(player, 40632, false); break; case GOSSIP_ACTION_INFO_DEF + 4: - player->CastSpell(player, 40644, false); + player->CastSpell(player, 40644, false); break; } } diff --git a/src/server/scripts/Outland/zone_zangarmarsh.cpp b/src/server/scripts/Outland/zone_zangarmarsh.cpp index 6df09e4a4..543a7c1b6 100644 --- a/src/server/scripts/Outland/zone_zangarmarsh.cpp +++ b/src/server/scripts/Outland/zone_zangarmarsh.cpp @@ -59,7 +59,7 @@ public: } else { - creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); + creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); Creature* cr; if ((cr = creature->SummonCreature(17957, -186, -790, 43.8f, 4.2f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000))) cr->AI()->AttackStart(creature); @@ -96,13 +96,13 @@ public: } void EnterCombat(Unit*) override - { - _spoken = 2; + { + _spoken = 2; } - uint32 GetData(uint32) const override - { - return _spoken == 2; + uint32 GetData(uint32) const override + { + return _spoken == 2; } }; @@ -149,10 +149,10 @@ public: if (player->GetReputationRank(942) > REP_NEUTRAL) { if (creature->GetEntry() == NPC_ASHYEN) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BLESS_ASH, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BLESS_ASH, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); if (creature->GetEntry() == NPC_KELETH) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BLESS_KEL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BLESS_KEL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); } SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); @@ -162,7 +162,7 @@ public: bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override { ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) + if (action == GOSSIP_ACTION_INFO_DEF + 1) { creature->setPowerType(POWER_MANA); creature->SetMaxPower(POWER_MANA, 200); //set a "fake" mana value, we can't depend on database doing it in this case @@ -172,7 +172,8 @@ public: { uint32 spell = 0; switch (player->GetReputationRank(942)) - { //mark of lore + { + //mark of lore case REP_FRIENDLY: spell = SPELL_BLESS_ASH_FRI; break; @@ -276,7 +277,8 @@ public: { DoCastVictim(SPELL_LIGHTNING_BOLT); LightningBolt_Timer = 5000; - } else LightningBolt_Timer -= diff; + } + else LightningBolt_Timer -= diff; DoMeleeAttackIfReady(); } @@ -346,22 +348,22 @@ public: SendGossipMenuFor(player, 9229, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF + 2: - { - if (!player->HasItemCount(24573)) { - ItemPosCountVec dest; - uint32 itemId = 24573; - InventoryResult msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, 1, nullptr); - if (msg == EQUIP_ERR_OK) + if (!player->HasItemCount(24573)) { - player->StoreNewItem(dest, itemId, true); + ItemPosCountVec dest; + uint32 itemId = 24573; + InventoryResult msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, 1, nullptr); + if (msg == EQUIP_ERR_OK) + { + player->StoreNewItem(dest, itemId, true); + } + else + player->SendEquipError(msg, nullptr, nullptr, itemId); } - else - player->SendEquipError(msg, nullptr, nullptr, itemId); + SendGossipMenuFor(player, 9231, creature->GetGUID()); + break; } - SendGossipMenuFor(player, 9231, creature->GetGUID()); - break; - } } return true; } diff --git a/src/server/scripts/Pet/pet_dk.cpp b/src/server/scripts/Pet/pet_dk.cpp index 6b889b06b..60f44186f 100644 --- a/src/server/scripts/Pet/pet_dk.cpp +++ b/src/server/scripts/Pet/pet_dk.cpp @@ -31,259 +31,259 @@ enum DeathKnightSpells class npc_pet_dk_ebon_gargoyle : public CreatureScript { - public: - npc_pet_dk_ebon_gargoyle() : CreatureScript("npc_pet_dk_ebon_gargoyle") { } +public: + npc_pet_dk_ebon_gargoyle() : CreatureScript("npc_pet_dk_ebon_gargoyle") { } - struct npc_pet_dk_ebon_gargoyleAI : ScriptedAI + struct npc_pet_dk_ebon_gargoyleAI : ScriptedAI + { + npc_pet_dk_ebon_gargoyleAI(Creature* creature) : ScriptedAI(creature) { - npc_pet_dk_ebon_gargoyleAI(Creature* creature) : ScriptedAI(creature) - { - _despawnTimer = 36000; // 30 secs + 4 fly out + 2 initial attack timer - _despawning = false; - _initialSelection = true; - _targetGUID = 0; - } - - void MovementInform(uint32 type, uint32 point) - { - if (type == POINT_MOTION_TYPE && point == 1) - { - me->SetCanFly(false); - me->SetDisableGravity(false); - } - } - - void InitializeAI() - { - ScriptedAI::InitializeAI(); - Unit* owner = me->GetOwner(); - if (!owner) - return; - - // Xinef: Night of the Dead avoidance - if (Aura *aur = me->GetAura(SPELL_DK_NIGHT_OF_THE_DEAD)) - if (Unit* owner = me->GetOwner()) - if (AuraEffect *aurEff = owner->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_DEATHKNIGHT, 2718, 0)) - if (aur->GetEffect(0)) - aur->GetEffect(0)->SetAmount(-aurEff->GetSpellInfo()->Effects[EFFECT_2].CalcValue()); - - float tz = me->GetMap()->GetHeight(me->GetPhaseMask(), me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), true, MAX_FALL_DISTANCE); - me->GetMotionMaster()->MoveCharge(me->GetPositionX(), me->GetPositionY(), tz, 7.0f, 1); - me->AddUnitState(UNIT_STATE_NO_ENVIRONMENT_UPD); - me->SetCanFly(true); - me->SetDisableGravity(true); - _selectionTimer = 2000; - _initialCastTimer = 0; - } - - void MySelectNextTarget() - { - Unit* owner = me->GetOwner(); - if (owner && owner->GetTypeId() == TYPEID_PLAYER && (!me->GetVictim() || me->GetVictim()->IsImmunedToSpell(sSpellMgr->GetSpellInfo(51963)) || !me->IsValidAttackTarget(me->GetVictim()) || !owner->CanSeeOrDetect(me->GetVictim()))) - { - Unit* selection = owner->ToPlayer()->GetSelectedUnit(); - if (selection && selection != me->GetVictim() && me->IsValidAttackTarget(selection)) - { - me->GetMotionMaster()->Clear(false); - SetGazeOn(selection); - } - - else if (!me->GetVictim() || !owner->CanSeeOrDetect(me->GetVictim())) - { - me->CombatStop(true); - me->GetMotionMaster()->Clear(false); - me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, 0.0f); - RemoveTargetAura(); - } - } - } - - void AttackStart(Unit* who) - { - RemoveTargetAura(); - _targetGUID = who->GetGUID(); - me->AddAura(SPELL_DK_SUMMON_GARGOYLE_1, who); - ScriptedAI::AttackStart(who); - } - - void RemoveTargetAura() - { - if (Unit* target = ObjectAccessor::GetUnit(*me, _targetGUID)) - target->RemoveAura(SPELL_DK_SUMMON_GARGOYLE_1, me->GetGUID()); - } - - void Reset() - { - _selectionTimer = 0; - me->SetReactState(REACT_PASSIVE); - MySelectNextTarget(); - } - - // Fly away when dismissed - void FlyAway() - { - RemoveTargetAura(); - - // Stop Fighting - me->CombatStop(true); - me->ApplyModFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE, true); - - // Sanctuary - me->CastSpell(me, SPELL_DK_SANCTUARY, true); - me->SetReactState(REACT_PASSIVE); - - me->SetSpeed(MOVE_FLIGHT, 1.0f, true); - me->SetSpeed(MOVE_RUN, 1.0f, true); - float x = me->GetPositionX() + 20 * cos(me->GetOrientation()); - float y = me->GetPositionY() + 20 * sin(me->GetOrientation()); - float z = me->GetPositionZ() + 40; - me->DisableSpline(); - me->GetMotionMaster()->Clear(false); - - me->GetMotionMaster()->MoveCharge(x, y, z, 7.0f, 1); - me->SetCanFly(true); - me->SetDisableGravity(true); - - _despawning = true; - } - - void UpdateAI(uint32 diff) - { - if (_initialSelection) - { - _initialSelection = false; - // Find victim of Summon Gargoyle spell - std::list targets; - acore::AnyUnfriendlyUnitInObjectRangeCheck u_check(me, me, 50); - acore::UnitListSearcher searcher(me, targets, u_check); - me->VisitNearbyObject(50, searcher); - for (std::list::const_iterator iter = targets.begin(); iter != targets.end(); ++iter) - if ((*iter)->GetAura(SPELL_DK_SUMMON_GARGOYLE_1, me->GetOwnerGUID())) - { - (*iter)->RemoveAura(SPELL_DK_SUMMON_GARGOYLE_1, me->GetOwnerGUID()); - SetGazeOn(*iter); - _targetGUID = (*iter)->GetGUID(); - break; - } - } - if (_despawnTimer > 4000) - { - _despawnTimer -= diff; - if (!UpdateVictimWithGaze()) - { - MySelectNextTarget(); - return; - } - - _initialCastTimer += diff; - _selectionTimer += diff; - if (_selectionTimer >= 1000) - { - MySelectNextTarget(); - _selectionTimer = 0; - } - if (_initialCastTimer >= 2000 && !me->HasUnitState(UNIT_STATE_CASTING | UNIT_STATE_LOST_CONTROL) && me->GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == NULL_MOTION_TYPE) - me->CastSpell(me->GetVictim(), 51963, false); - } - else - { - if (!_despawning) - FlyAway(); - - if (_despawnTimer > diff) - _despawnTimer -= diff; - else - me->DespawnOrUnsummon(); - } - } - - private: - uint64 _targetGUID; - uint32 _despawnTimer; - uint32 _selectionTimer; - uint32 _initialCastTimer; - bool _despawning; - bool _initialSelection; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_pet_dk_ebon_gargoyleAI(creature); + _despawnTimer = 36000; // 30 secs + 4 fly out + 2 initial attack timer + _despawning = false; + _initialSelection = true; + _targetGUID = 0; } + + void MovementInform(uint32 type, uint32 point) + { + if (type == POINT_MOTION_TYPE && point == 1) + { + me->SetCanFly(false); + me->SetDisableGravity(false); + } + } + + void InitializeAI() + { + ScriptedAI::InitializeAI(); + Unit* owner = me->GetOwner(); + if (!owner) + return; + + // Xinef: Night of the Dead avoidance + if (Aura* aur = me->GetAura(SPELL_DK_NIGHT_OF_THE_DEAD)) + if (Unit* owner = me->GetOwner()) + if (AuraEffect* aurEff = owner->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_DEATHKNIGHT, 2718, 0)) + if (aur->GetEffect(0)) + aur->GetEffect(0)->SetAmount(-aurEff->GetSpellInfo()->Effects[EFFECT_2].CalcValue()); + + float tz = me->GetMap()->GetHeight(me->GetPhaseMask(), me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), true, MAX_FALL_DISTANCE); + me->GetMotionMaster()->MoveCharge(me->GetPositionX(), me->GetPositionY(), tz, 7.0f, 1); + me->AddUnitState(UNIT_STATE_NO_ENVIRONMENT_UPD); + me->SetCanFly(true); + me->SetDisableGravity(true); + _selectionTimer = 2000; + _initialCastTimer = 0; + } + + void MySelectNextTarget() + { + Unit* owner = me->GetOwner(); + if (owner && owner->GetTypeId() == TYPEID_PLAYER && (!me->GetVictim() || me->GetVictim()->IsImmunedToSpell(sSpellMgr->GetSpellInfo(51963)) || !me->IsValidAttackTarget(me->GetVictim()) || !owner->CanSeeOrDetect(me->GetVictim()))) + { + Unit* selection = owner->ToPlayer()->GetSelectedUnit(); + if (selection && selection != me->GetVictim() && me->IsValidAttackTarget(selection)) + { + me->GetMotionMaster()->Clear(false); + SetGazeOn(selection); + } + + else if (!me->GetVictim() || !owner->CanSeeOrDetect(me->GetVictim())) + { + me->CombatStop(true); + me->GetMotionMaster()->Clear(false); + me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, 0.0f); + RemoveTargetAura(); + } + } + } + + void AttackStart(Unit* who) + { + RemoveTargetAura(); + _targetGUID = who->GetGUID(); + me->AddAura(SPELL_DK_SUMMON_GARGOYLE_1, who); + ScriptedAI::AttackStart(who); + } + + void RemoveTargetAura() + { + if (Unit* target = ObjectAccessor::GetUnit(*me, _targetGUID)) + target->RemoveAura(SPELL_DK_SUMMON_GARGOYLE_1, me->GetGUID()); + } + + void Reset() + { + _selectionTimer = 0; + me->SetReactState(REACT_PASSIVE); + MySelectNextTarget(); + } + + // Fly away when dismissed + void FlyAway() + { + RemoveTargetAura(); + + // Stop Fighting + me->CombatStop(true); + me->ApplyModFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE, true); + + // Sanctuary + me->CastSpell(me, SPELL_DK_SANCTUARY, true); + me->SetReactState(REACT_PASSIVE); + + me->SetSpeed(MOVE_FLIGHT, 1.0f, true); + me->SetSpeed(MOVE_RUN, 1.0f, true); + float x = me->GetPositionX() + 20 * cos(me->GetOrientation()); + float y = me->GetPositionY() + 20 * sin(me->GetOrientation()); + float z = me->GetPositionZ() + 40; + me->DisableSpline(); + me->GetMotionMaster()->Clear(false); + + me->GetMotionMaster()->MoveCharge(x, y, z, 7.0f, 1); + me->SetCanFly(true); + me->SetDisableGravity(true); + + _despawning = true; + } + + void UpdateAI(uint32 diff) + { + if (_initialSelection) + { + _initialSelection = false; + // Find victim of Summon Gargoyle spell + std::list targets; + acore::AnyUnfriendlyUnitInObjectRangeCheck u_check(me, me, 50); + acore::UnitListSearcher searcher(me, targets, u_check); + me->VisitNearbyObject(50, searcher); + for (std::list::const_iterator iter = targets.begin(); iter != targets.end(); ++iter) + if ((*iter)->GetAura(SPELL_DK_SUMMON_GARGOYLE_1, me->GetOwnerGUID())) + { + (*iter)->RemoveAura(SPELL_DK_SUMMON_GARGOYLE_1, me->GetOwnerGUID()); + SetGazeOn(*iter); + _targetGUID = (*iter)->GetGUID(); + break; + } + } + if (_despawnTimer > 4000) + { + _despawnTimer -= diff; + if (!UpdateVictimWithGaze()) + { + MySelectNextTarget(); + return; + } + + _initialCastTimer += diff; + _selectionTimer += diff; + if (_selectionTimer >= 1000) + { + MySelectNextTarget(); + _selectionTimer = 0; + } + if (_initialCastTimer >= 2000 && !me->HasUnitState(UNIT_STATE_CASTING | UNIT_STATE_LOST_CONTROL) && me->GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == NULL_MOTION_TYPE) + me->CastSpell(me->GetVictim(), 51963, false); + } + else + { + if (!_despawning) + FlyAway(); + + if (_despawnTimer > diff) + _despawnTimer -= diff; + else + me->DespawnOrUnsummon(); + } + } + + private: + uint64 _targetGUID; + uint32 _despawnTimer; + uint32 _selectionTimer; + uint32 _initialCastTimer; + bool _despawning; + bool _initialSelection; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_pet_dk_ebon_gargoyleAI(creature); + } }; class npc_pet_dk_ghoul : public CreatureScript { - public: - npc_pet_dk_ghoul() : CreatureScript("npc_pet_dk_ghoul") { } +public: + npc_pet_dk_ghoul() : CreatureScript("npc_pet_dk_ghoul") { } - struct npc_pet_dk_ghoulAI : public CombatAI + struct npc_pet_dk_ghoulAI : public CombatAI + { + npc_pet_dk_ghoulAI(Creature* c) : CombatAI(c) { } + + void JustDied(Unit* /*who*/) { - npc_pet_dk_ghoulAI(Creature *c) : CombatAI(c) { } - - void JustDied(Unit * /*who*/) - { - if (me->IsGuardian() || me->IsSummon()) - me->ToTempSummon()->UnSummon(); - } - }; - - CreatureAI* GetAI(Creature* pCreature) const - { - return new npc_pet_dk_ghoulAI (pCreature); + if (me->IsGuardian() || me->IsSummon()) + me->ToTempSummon()->UnSummon(); } + }; + + CreatureAI* GetAI(Creature* pCreature) const + { + return new npc_pet_dk_ghoulAI (pCreature); + } }; class npc_pet_dk_army_of_the_dead : public CreatureScript { - public: - npc_pet_dk_army_of_the_dead() : CreatureScript("npc_pet_dk_army_of_the_dead") { } +public: + npc_pet_dk_army_of_the_dead() : CreatureScript("npc_pet_dk_army_of_the_dead") { } - struct npc_pet_dk_army_of_the_deadAI : public CombatAI + struct npc_pet_dk_army_of_the_deadAI : public CombatAI + { + npc_pet_dk_army_of_the_deadAI(Creature* creature) : CombatAI(creature) { } + + void InitializeAI() { - npc_pet_dk_army_of_the_deadAI(Creature* creature) : CombatAI(creature) { } + CombatAI::InitializeAI(); + ((Minion*)me)->SetFollowAngle(rand_norm() * 2 * M_PI); - void InitializeAI() - { - CombatAI::InitializeAI(); - ((Minion*)me)->SetFollowAngle(rand_norm()*2*M_PI); - - // Heroism / Bloodlust immunity - me->ApplySpellImmune(0, IMMUNITY_ID, 32182, true); - me->ApplySpellImmune(0, IMMUNITY_ID, 2825, true); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_pet_dk_army_of_the_deadAI (creature); + // Heroism / Bloodlust immunity + me->ApplySpellImmune(0, IMMUNITY_ID, 32182, true); + me->ApplySpellImmune(0, IMMUNITY_ID, 2825, true); } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_pet_dk_army_of_the_deadAI (creature); + } }; class npc_pet_dk_dancing_rune_weapon : public CreatureScript { - public: - npc_pet_dk_dancing_rune_weapon() : CreatureScript("npc_pet_dk_dancing_rune_weapon") { } +public: + npc_pet_dk_dancing_rune_weapon() : CreatureScript("npc_pet_dk_dancing_rune_weapon") { } - struct npc_pet_dk_dancing_rune_weaponAI : public NullCreatureAI + struct npc_pet_dk_dancing_rune_weaponAI : public NullCreatureAI + { + npc_pet_dk_dancing_rune_weaponAI(Creature* creature) : NullCreatureAI(creature) { } + + void InitializeAI() { - npc_pet_dk_dancing_rune_weaponAI(Creature* creature) : NullCreatureAI(creature) { } + // Xinef: Hit / Expertise scaling + me->AddAura(61017, me); + if (Unit* owner = me->GetOwner()) + me->GetMotionMaster()->MoveFollow(owner, 0.01f, me->GetFollowAngle(), MOTION_SLOT_CONTROLLED); - void InitializeAI() - { - // Xinef: Hit / Expertise scaling - me->AddAura(61017, me); - if (Unit* owner = me->GetOwner()) - me->GetMotionMaster()->MoveFollow(owner, 0.01f, me->GetFollowAngle(), MOTION_SLOT_CONTROLLED); - - NullCreatureAI::InitializeAI(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_pet_dk_dancing_rune_weaponAI (creature); + NullCreatureAI::InitializeAI(); } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_pet_dk_dancing_rune_weaponAI (creature); + } }; void AddSC_deathknight_pet_scripts() diff --git a/src/server/scripts/Pet/pet_generic.cpp b/src/server/scripts/Pet/pet_generic.cpp index aa0bf458b..b32f1f3b0 100644 --- a/src/server/scripts/Pet/pet_generic.cpp +++ b/src/server/scripts/Pet/pet_generic.cpp @@ -30,55 +30,55 @@ enum Mojo class npc_pet_gen_mojo : public CreatureScript { - public: - npc_pet_gen_mojo() : CreatureScript("npc_pet_gen_mojo") { } +public: + npc_pet_gen_mojo() : CreatureScript("npc_pet_gen_mojo") { } - struct npc_pet_gen_mojoAI : public ScriptedAI + struct npc_pet_gen_mojoAI : public ScriptedAI + { + npc_pet_gen_mojoAI(Creature* creature) : ScriptedAI(creature) { } + + void Reset() { - npc_pet_gen_mojoAI(Creature* creature) : ScriptedAI(creature) { } + _victimGUID = 0; - void Reset() - { - _victimGUID = 0; - - if (Unit* owner = me->GetOwner()) - me->GetMotionMaster()->MoveFollow(owner, 0.0f, 0.0f); - } - - void EnterCombat(Unit* /*who*/) { } - void UpdateAI(uint32 /*diff*/) { } - - void ReceiveEmote(Player* player, uint32 emote) - { - me->HandleEmoteCommand(emote); - Unit* owner = me->GetOwner(); - if (emote != TEXT_EMOTE_KISS || !owner || owner->GetTypeId() != TYPEID_PLAYER || - owner->ToPlayer()->GetTeamId(true) != player->GetTeamId(true)) - { - return; - } - - Talk(SAY_MOJO, player); - - if (_victimGUID) - if (Player* victim = ObjectAccessor::GetPlayer(*me, _victimGUID)) - victim->RemoveAura(SPELL_FEELING_FROGGY); - - _victimGUID = player->GetGUID(); - - DoCast(player, SPELL_FEELING_FROGGY, true); - DoCast(me, SPELL_SEDUCTION_VISUAL, true); - me->GetMotionMaster()->MoveFollow(player, 0.0f, 0.0f); - } - - private: - uint64 _victimGUID; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_pet_gen_mojoAI(creature); + if (Unit* owner = me->GetOwner()) + me->GetMotionMaster()->MoveFollow(owner, 0.0f, 0.0f); } + + void EnterCombat(Unit* /*who*/) { } + void UpdateAI(uint32 /*diff*/) { } + + void ReceiveEmote(Player* player, uint32 emote) + { + me->HandleEmoteCommand(emote); + Unit* owner = me->GetOwner(); + if (emote != TEXT_EMOTE_KISS || !owner || owner->GetTypeId() != TYPEID_PLAYER || + owner->ToPlayer()->GetTeamId(true) != player->GetTeamId(true)) + { + return; + } + + Talk(SAY_MOJO, player); + + if (_victimGUID) + if (Player* victim = ObjectAccessor::GetPlayer(*me, _victimGUID)) + victim->RemoveAura(SPELL_FEELING_FROGGY); + + _victimGUID = player->GetGUID(); + + DoCast(player, SPELL_FEELING_FROGGY, true); + DoCast(me, SPELL_SEDUCTION_VISUAL, true); + me->GetMotionMaster()->MoveFollow(player, 0.0f, 0.0f); + } + + private: + uint64 _victimGUID; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_pet_gen_mojoAI(creature); + } }; enum soulTrader @@ -102,7 +102,7 @@ public: { uint64 ownerGUID; EventMap events; - npc_pet_gen_soul_trader_beaconAI(Creature *c) : ScriptedAI(c) + npc_pet_gen_soul_trader_beaconAI(Creature* c) : ScriptedAI(c) { events.Reset(); events.ScheduleEvent(EVENT_INITIAL_TALK, 0); @@ -214,7 +214,7 @@ public: struct npc_pet_gen_argent_pony_bridleAI : public ScriptedAI { - npc_pet_gen_argent_pony_bridleAI(Creature *c) : ScriptedAI(c) + npc_pet_gen_argent_pony_bridleAI(Creature* c) : ScriptedAI(c) { _state = ARGENT_PONY_STATE_NONE; _init = false; @@ -256,10 +256,10 @@ public: { if (player->GetTeamId(true) == TEAM_ALLIANCE) { - if (uint32 cooldown = player->GetSpellCooldownDelay(SPELL_AURA_POSTMAN_S+i)) + if (uint32 cooldown = player->GetSpellCooldownDelay(SPELL_AURA_POSTMAN_S + i)) { duration = cooldown; - aura = SPELL_AURA_POSTMAN_S+i; + aura = SPELL_AURA_POSTMAN_S + i; _state = argentPonyService[TEAM_ALLIANCE][i]; me->ToTempSummon()->UnSummon(duration); break; @@ -267,10 +267,10 @@ public: } else { - if (uint32 cooldown = player->GetSpellCooldownDelay(SPELL_AURA_BANK_G+i)) + if (uint32 cooldown = player->GetSpellCooldownDelay(SPELL_AURA_BANK_G + i)) { - duration = cooldown*IN_MILLISECONDS; - aura = SPELL_AURA_BANK_G+i; + duration = cooldown * IN_MILLISECONDS; + aura = SPELL_AURA_BANK_G + i; _state = argentPonyService[TEAM_HORDE][i]; me->ToTempSummon()->UnSummon(duration); break; @@ -281,7 +281,7 @@ public: // Generate Banners uint32 mask = player->GetTeamId(true) ? RACEMASK_HORDE : RACEMASK_ALLIANCE; for (uint8 i = 1; i < MAX_RACES; ++i) - if (mask & (1 << (i-1)) && player->HasAchieved(argentBanners[i].achievement)) + if (mask & (1 << (i - 1)) && player->HasAchieved(argentBanners[i].achievement)) _banners[i] = true; } @@ -331,12 +331,12 @@ public: _state = param; } - private: - bool _init; - uint8 _state; - int32 _mountTimer; - bool _banners[MAX_RACES]; - uint32 _lastAura; + private: + bool _init; + uint8 _state; + int32 _mountTimer; + bool _banners[MAX_RACES]; + uint32 _lastAura; }; bool OnGossipHello(Player* player, Creature* creature) override @@ -382,13 +382,13 @@ public: creature->AI()->DoAction(ARGENT_PONY_STATE_BANK); break; case GOSSIP_ACTION_MAILBOX: - { - creature->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP|UNIT_NPC_FLAG_MAILBOX); - player->GetSession()->SendShowMailBox(creature->GetGUID()); - spellId = player->GetTeamId(true) ? SPELL_AURA_POSTMAN_G : SPELL_AURA_POSTMAN_S; - creature->AI()->DoAction(ARGENT_PONY_STATE_MAILBOX); - break; - } + { + creature->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_MAILBOX); + player->GetSession()->SendShowMailBox(creature->GetGUID()); + spellId = player->GetTeamId(true) ? SPELL_AURA_POSTMAN_G : SPELL_AURA_POSTMAN_S; + creature->AI()->DoAction(ARGENT_PONY_STATE_MAILBOX); + break; + } default: if (action > 60000) { @@ -401,9 +401,9 @@ public: if (spellId && !creature->HasAura(spellId)) { creature->CastSpell(creature, spellId, true); - player->AddSpellCooldown(spellId, 0, 3*MINUTE*IN_MILLISECONDS); - player->AddSpellCooldown(player->GetTeamId(true) ? SPELL_AURA_TIRED_G : SPELL_AURA_TIRED_S, 0, 3*MINUTE*IN_MILLISECONDS + 4*HOUR*IN_MILLISECONDS); - creature->DespawnOrUnsummon(3*MINUTE*IN_MILLISECONDS); + player->AddSpellCooldown(spellId, 0, 3 * MINUTE * IN_MILLISECONDS); + player->AddSpellCooldown(player->GetTeamId(true) ? SPELL_AURA_TIRED_G : SPELL_AURA_TIRED_S, 0, 3 * MINUTE * IN_MILLISECONDS + 4 * HOUR * IN_MILLISECONDS); + creature->DespawnOrUnsummon(3 * MINUTE * IN_MILLISECONDS); } return true; } @@ -433,16 +433,22 @@ public: struct npc_pet_gen_target_following_bombAI : public NullCreatureAI { - npc_pet_gen_target_following_bombAI(Creature *c) : NullCreatureAI(c) + npc_pet_gen_target_following_bombAI(Creature* c) : NullCreatureAI(c) { checkTimer = 0; bombSpellId = 0; switch (me->GetEntry()) { - case NPC_EXPLOSIVE_SHEEP: bombSpellId = SPELL_EXPLOSIVE_SHEEP; break; - case NPC_GOBLIN_BOMB: bombSpellId = SPELL_EXPLOSIVE_GOBLIN; break; - case NPC_HIGH_EXPLOSIVE_SHEEP: bombSpellId = SPELL_HIGH_EXPLOSIVE_SHEEP; break; + case NPC_EXPLOSIVE_SHEEP: + bombSpellId = SPELL_EXPLOSIVE_SHEEP; + break; + case NPC_GOBLIN_BOMB: + bombSpellId = SPELL_EXPLOSIVE_GOBLIN; + break; + case NPC_HIGH_EXPLOSIVE_SHEEP: + bombSpellId = SPELL_HIGH_EXPLOSIVE_SHEEP; + break; } } @@ -488,7 +494,7 @@ public: struct npc_pet_gen_gnomish_flame_turretAI : public ScriptedAI { - npc_pet_gen_gnomish_flame_turretAI(Creature *c) : ScriptedAI(c) + npc_pet_gen_gnomish_flame_turretAI(Creature* c) : ScriptedAI(c) { checkTimer = 0; } @@ -535,7 +541,7 @@ public: struct npc_pet_gen_valkyr_guardianAI : public ScriptedAI { - npc_pet_gen_valkyr_guardianAI(Creature *c) : ScriptedAI(c) + npc_pet_gen_valkyr_guardianAI(Creature* c) : ScriptedAI(c) { me->SetReactState(REACT_DEFENSIVE); me->SetDisableGravity(true); @@ -590,34 +596,34 @@ public: class spell_pet_gen_valkyr_guardian_smite : public SpellScriptLoader { - public: - spell_pet_gen_valkyr_guardian_smite() : SpellScriptLoader("spell_pet_gen_valkyr_guardian_smite") { } +public: + spell_pet_gen_valkyr_guardian_smite() : SpellScriptLoader("spell_pet_gen_valkyr_guardian_smite") { } - class spell_pet_gen_valkyr_guardian_smite_SpellScript : public SpellScript + class spell_pet_gen_valkyr_guardian_smite_SpellScript : public SpellScript + { + PrepareSpellScript(spell_pet_gen_valkyr_guardian_smite_SpellScript); + + void RecalculateDamage() { - PrepareSpellScript(spell_pet_gen_valkyr_guardian_smite_SpellScript); - - void RecalculateDamage() + if (GetHitUnit() != GetCaster()) { - if (GetHitUnit() != GetCaster()) - { - std::list* targetsInfo = GetSpell()->GetUniqueTargetInfo(); - for (std::list::iterator ihit = targetsInfo->begin(); ihit != targetsInfo->end(); ++ihit) - if (ihit->targetGUID == GetCaster()->GetGUID()) - ihit->damage = -int32(GetHitDamage()*0.25f); - } + std::list* targetsInfo = GetSpell()->GetUniqueTargetInfo(); + for (std::list::iterator ihit = targetsInfo->begin(); ihit != targetsInfo->end(); ++ihit) + if (ihit->targetGUID == GetCaster()->GetGUID()) + ihit->damage = -int32(GetHitDamage() * 0.25f); } - - void Register() - { - OnHit += SpellHitFn(spell_pet_gen_valkyr_guardian_smite_SpellScript::RecalculateDamage); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_pet_gen_valkyr_guardian_smite_SpellScript(); } + + void Register() + { + OnHit += SpellHitFn(spell_pet_gen_valkyr_guardian_smite_SpellScript::RecalculateDamage); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_pet_gen_valkyr_guardian_smite_SpellScript(); + } }; class npc_pet_gen_imp_in_a_bottle : public CreatureScript @@ -627,7 +633,7 @@ public: struct npc_pet_gen_imp_in_a_bottleAI : public NullCreatureAI { - npc_pet_gen_imp_in_a_bottleAI(Creature *c) : NullCreatureAI(c) + npc_pet_gen_imp_in_a_bottleAI(Creature* c) : NullCreatureAI(c) { _talkTimer = 0; _ownerGUID = 0; @@ -661,7 +667,7 @@ public: _data << uint32(me->GetName().size() + 1); _data << me->GetName(); _data << uint64(0); - _data << uint32(text.size()+1); + _data << uint32(text.size() + 1); _data << text.c_str(); _data << uint8(0); } @@ -705,7 +711,7 @@ public: struct npc_pet_gen_wind_rider_cubAI : public NullCreatureAI { - npc_pet_gen_wind_rider_cubAI(Creature *c) : NullCreatureAI(c) + npc_pet_gen_wind_rider_cubAI(Creature* c) : NullCreatureAI(c) { isFlying = true; checkTimer = 0; @@ -762,7 +768,7 @@ public: struct npc_pet_gen_plump_turkeyAI : public PassiveAI { - npc_pet_gen_plump_turkeyAI(Creature *c) : PassiveAI(c) + npc_pet_gen_plump_turkeyAI(Creature* c) : PassiveAI(c) { goGUID = 0; jumpTimer = 0; @@ -831,7 +837,7 @@ public: struct npc_pet_gen_toxic_wastelingAI : public PassiveAI { - npc_pet_gen_toxic_wastelingAI(Creature *c) : PassiveAI(c) + npc_pet_gen_toxic_wastelingAI(Creature* c) : PassiveAI(c) { } @@ -883,7 +889,7 @@ public: struct npc_pet_gen_fetch_ballAI : public NullCreatureAI { - npc_pet_gen_fetch_ballAI(Creature *c) : NullCreatureAI(c) + npc_pet_gen_fetch_ballAI(Creature* c) : NullCreatureAI(c) { } @@ -940,7 +946,7 @@ public: struct npc_pet_gen_mothAI : public NullCreatureAI { - npc_pet_gen_mothAI(Creature *c) : NullCreatureAI(c) + npc_pet_gen_mothAI(Creature* c) : NullCreatureAI(c) { me->AddUnitState(UNIT_STATE_NO_ENVIRONMENT_UPD); me->SetCanFly(true); diff --git a/src/server/scripts/Pet/pet_hunter.cpp b/src/server/scripts/Pet/pet_hunter.cpp index 90ea8e22f..0bae92628 100644 --- a/src/server/scripts/Pet/pet_hunter.cpp +++ b/src/server/scripts/Pet/pet_hunter.cpp @@ -28,118 +28,118 @@ enum HunterCreatures class npc_pet_hunter_snake_trap : public CreatureScript { - public: - npc_pet_hunter_snake_trap() : CreatureScript("npc_pet_hunter_snake_trap") { } +public: + npc_pet_hunter_snake_trap() : CreatureScript("npc_pet_hunter_snake_trap") { } - struct npc_pet_hunter_snake_trapAI : public ScriptedAI + struct npc_pet_hunter_snake_trapAI : public ScriptedAI + { + npc_pet_hunter_snake_trapAI(Creature* creature) : ScriptedAI(creature) { _init = false; } + + void Reset() { - npc_pet_hunter_snake_trapAI(Creature* creature) : ScriptedAI(creature) { _init = false; } + _spellTimer = urand(1500, 3000); - void Reset() - { - _spellTimer = urand(1500, 3000); - - // Start attacking attacker of owner on first ai update after spawn - move in line of sight may choose better target - if (!me->GetVictim()) - if (Unit *tgt = me->SelectNearestTarget(10.0f)) - { - me->AddThreat(tgt, 100000.0f); - AttackStart(tgt); - } - } - - void EnterEvadeMode() - { - // _EnterEvadeMode(); - me->DeleteThreatList(); - me->CombatStop(true); - me->LoadCreaturesAddon(true); - me->SetLootRecipient(nullptr); - me->ResetPlayerDamageReq(); - me->SetLastDamagedTime(0); - - me->AddUnitState(UNIT_STATE_EVADE); - me->GetMotionMaster()->MoveTargetedHome(); - - Reset(); - } - - //Redefined for random target selection: - void MoveInLineOfSight(Unit* who) - { - if (!me->GetVictim() && who->isTargetableForAttack() && (me->IsHostileTo(who)) && who->isInAccessiblePlaceFor(me)) + // Start attacking attacker of owner on first ai update after spawn - move in line of sight may choose better target + if (!me->GetVictim()) + if (Unit* tgt = me->SelectNearestTarget(10.0f)) { - if (me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE) - return; - - if (me->IsWithinDistInMap(who, 10.0f)) - { - me->AddThreat(who, 100000.0f); - AttackStart(who); - } + me->AddThreat(tgt, 100000.0f); + AttackStart(tgt); } - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - if (me->GetVictim()->HasBreakableByDamageCrowdControlAura(me)) - { - me->InterruptNonMeleeSpells(false); - return; - } - - if (!_init) - { - _init = true; - - CreatureTemplate const* Info = me->GetCreatureTemplate(); - uint32 health = uint32(107 * (me->getLevel() - 40) * 0.025f); - me->SetCreateHealth(health); - - for (uint8 stat = 0; stat < MAX_STATS; ++stat) - { - me->SetStat(Stats(stat), 0); - me->SetCreateStat(Stats(stat), 0); - } - - me->SetModifierValue(UNIT_MOD_HEALTH, BASE_VALUE, (float)health); - me->SetMaxHealth(health); - //Add delta to make them not all hit the same time - uint32 delta = urand(0, 700); - me->SetAttackTime(BASE_ATTACK, Info->BaseAttackTime + delta); - me->SetStatFloatValue(UNIT_FIELD_RANGED_ATTACK_POWER , float(Info->attackpower)); - me->CastSpell(me, SPELL_HUNTER_DEADLY_POISON_PASSIVE, true); - - // Glyph of Snake Trap - if (Unit* owner = me->GetOwner()) - if (owner->GetAuraEffectDummy(SPELL_HUNTER_GLYPH_OF_SNAKE_TRAP)) - me->CastSpell(me, SPELL_HUNTER_PET_SCALING, true); - } - - _spellTimer += diff; - if (_spellTimer >= 3000) - { - if (urand(0, 2) == 0) // 33% chance to cast - DoCastVictim(RAND(SPELL_HUNTER_MIND_NUMBING_POISON, SPELL_HUNTER_CRIPPLING_POISON)); - - _spellTimer = 0; - } - - DoMeleeAttackIfReady(); - } - - private: - bool _init; - uint32 _spellTimer; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_pet_hunter_snake_trapAI(creature); } + + void EnterEvadeMode() + { + // _EnterEvadeMode(); + me->DeleteThreatList(); + me->CombatStop(true); + me->LoadCreaturesAddon(true); + me->SetLootRecipient(nullptr); + me->ResetPlayerDamageReq(); + me->SetLastDamagedTime(0); + + me->AddUnitState(UNIT_STATE_EVADE); + me->GetMotionMaster()->MoveTargetedHome(); + + Reset(); + } + + //Redefined for random target selection: + void MoveInLineOfSight(Unit* who) + { + if (!me->GetVictim() && who->isTargetableForAttack() && (me->IsHostileTo(who)) && who->isInAccessiblePlaceFor(me)) + { + if (me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE) + return; + + if (me->IsWithinDistInMap(who, 10.0f)) + { + me->AddThreat(who, 100000.0f); + AttackStart(who); + } + } + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + if (me->GetVictim()->HasBreakableByDamageCrowdControlAura(me)) + { + me->InterruptNonMeleeSpells(false); + return; + } + + if (!_init) + { + _init = true; + + CreatureTemplate const* Info = me->GetCreatureTemplate(); + uint32 health = uint32(107 * (me->getLevel() - 40) * 0.025f); + me->SetCreateHealth(health); + + for (uint8 stat = 0; stat < MAX_STATS; ++stat) + { + me->SetStat(Stats(stat), 0); + me->SetCreateStat(Stats(stat), 0); + } + + me->SetModifierValue(UNIT_MOD_HEALTH, BASE_VALUE, (float)health); + me->SetMaxHealth(health); + //Add delta to make them not all hit the same time + uint32 delta = urand(0, 700); + me->SetAttackTime(BASE_ATTACK, Info->BaseAttackTime + delta); + me->SetStatFloatValue(UNIT_FIELD_RANGED_ATTACK_POWER, float(Info->attackpower)); + me->CastSpell(me, SPELL_HUNTER_DEADLY_POISON_PASSIVE, true); + + // Glyph of Snake Trap + if (Unit* owner = me->GetOwner()) + if (owner->GetAuraEffectDummy(SPELL_HUNTER_GLYPH_OF_SNAKE_TRAP)) + me->CastSpell(me, SPELL_HUNTER_PET_SCALING, true); + } + + _spellTimer += diff; + if (_spellTimer >= 3000) + { + if (urand(0, 2) == 0) // 33% chance to cast + DoCastVictim(RAND(SPELL_HUNTER_MIND_NUMBING_POISON, SPELL_HUNTER_CRIPPLING_POISON)); + + _spellTimer = 0; + } + + DoMeleeAttackIfReady(); + } + + private: + bool _init; + uint32 _spellTimer; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_pet_hunter_snake_trapAI(creature); + } }; void AddSC_hunter_pet_scripts() diff --git a/src/server/scripts/Pet/pet_mage.cpp b/src/server/scripts/Pet/pet_mage.cpp index 17395afd9..b1c36902d 100644 --- a/src/server/scripts/Pet/pet_mage.cpp +++ b/src/server/scripts/Pet/pet_mage.cpp @@ -29,192 +29,192 @@ enum MageSpells class DeathEvent : public BasicEvent { - public: - DeathEvent(Creature& owner) : BasicEvent(), _owner(owner) { } +public: + DeathEvent(Creature& owner) : BasicEvent(), _owner(owner) { } - bool Execute(uint64 /*eventTime*/, uint32 /*diff*/) - { - Unit::Kill(&_owner, &_owner); - return true; - } + bool Execute(uint64 /*eventTime*/, uint32 /*diff*/) + { + Unit::Kill(&_owner, &_owner); + return true; + } - private: - Creature& _owner; +private: + Creature& _owner; }; class npc_pet_mage_mirror_image : public CreatureScript { - public: - npc_pet_mage_mirror_image() : CreatureScript("npc_pet_mage_mirror_image") { } +public: + npc_pet_mage_mirror_image() : CreatureScript("npc_pet_mage_mirror_image") { } - struct npc_pet_mage_mirror_imageAI : CasterAI + struct npc_pet_mage_mirror_imageAI : CasterAI + { + npc_pet_mage_mirror_imageAI(Creature* creature) : CasterAI(creature) { } + + uint32 selectionTimer; + uint64 _ebonGargoyleGUID; + uint32 checktarget; + uint32 dist = urand(1, 5); + + void InitializeAI() { - npc_pet_mage_mirror_imageAI(Creature* creature) : CasterAI(creature) { } + CasterAI::InitializeAI(); + Unit* owner = me->GetOwner(); + if (!owner) + return; - uint32 selectionTimer; - uint64 _ebonGargoyleGUID; - uint32 checktarget; - uint32 dist = urand(1, 5); + // Clone Me! + owner->CastSpell(me, SPELL_MAGE_CLONE_ME, true); - void InitializeAI() + // xinef: Glyph of Mirror Image (4th copy) + float angle = 0.0f; + switch (me->GetUInt32Value(UNIT_CREATED_BY_SPELL)) { - CasterAI::InitializeAI(); - Unit* owner = me->GetOwner(); - if (!owner) - return; + case SPELL_SUMMON_MIRROR_IMAGE1: + angle = 0.5f * M_PI; + break; + case SPELL_SUMMON_MIRROR_IMAGE2: + angle = M_PI; + break; + case SPELL_SUMMON_MIRROR_IMAGE3: + angle = 1.5f * M_PI; + break; + } - // Clone Me! - owner->CastSpell(me, SPELL_MAGE_CLONE_ME, true); + ((Minion*)me)->SetFollowAngle(angle); + if (owner->IsInCombat()) + me->NearTeleportTo(me->GetPositionX() + cos(angle)*dist, me->GetPositionY() + sin(angle)*dist, me->GetPositionZ(), me->GetOrientation(), false, false, false, false); + else + me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, me->GetFollowAngle(), MOTION_SLOT_ACTIVE); - // xinef: Glyph of Mirror Image (4th copy) - float angle = 0.0f; - switch (me->GetUInt32Value(UNIT_CREATED_BY_SPELL)) + me->SetReactState(REACT_DEFENSIVE); + + // Xinef: Inherit Master's Threat List (not yet implemented) + //owner->CastSpell((Unit*)NULL, SPELL_MAGE_MASTERS_THREAT_LIST, true); + HostileReference* ref = owner->getHostileRefManager().getFirst(); + while (ref) + { + if (Unit* unit = ref->GetSource()->GetOwner()) + unit->AddThreat(me, ref->getThreat() - ref->getTempThreatModifier()); + ref = ref->next(); + } + + _ebonGargoyleGUID = 0; + + // Xinef: copy caster auras + Unit::VisibleAuraMap const* visibleAuraMap = owner->GetVisibleAuras(); + for (Unit::VisibleAuraMap::const_iterator itr = visibleAuraMap->begin(); itr != visibleAuraMap->end(); ++itr) + if (Aura* visAura = itr->second->GetBase()) { - case SPELL_SUMMON_MIRROR_IMAGE1: - angle = 0.5f * M_PI; - break; - case SPELL_SUMMON_MIRROR_IMAGE2: - angle = M_PI; - break; - case SPELL_SUMMON_MIRROR_IMAGE3: - angle = 1.5f * M_PI; - break; + // Ebon Gargoyle + if (visAura->GetId() == 49206 && me->GetUInt32Value(UNIT_CREATED_BY_SPELL) == SPELL_SUMMON_MIRROR_IMAGE1) + { + if (Unit* gargoyle = visAura->GetCaster()) + _ebonGargoyleGUID = gargoyle->GetGUID(); + continue; + } + SpellScriptsBounds bounds = sObjectMgr->GetSpellScriptsBounds(visAura->GetId()); + if (bounds.first != bounds.second) + continue; + std::vector const* spellTriggered = sSpellMgr->GetSpellLinked(visAura->GetId() + SPELL_LINK_AURA); + if (!spellTriggered || !spellTriggered->empty()) + continue; + if (Aura* newAura = me->AddAura(visAura->GetId(), me)) + newAura->SetDuration(visAura->GetDuration()); } - ((Minion*)me)->SetFollowAngle(angle); - if (owner->IsInCombat()) - me->NearTeleportTo(me->GetPositionX() + cos(angle)*dist, me->GetPositionY() + sin(angle)*dist, me->GetPositionZ(), me->GetOrientation(), false, false, false, false); - else - me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, me->GetFollowAngle(), MOTION_SLOT_ACTIVE); + me->m_Events.AddEvent(new DeathEvent(*me), me->m_Events.CalculateTime(29500)); + } - me->SetReactState(REACT_DEFENSIVE); + // Do not reload Creature templates on evade mode enter - prevent visual lost + void EnterEvadeMode() + { + if (me->IsInEvadeMode() || !me->IsAlive()) + return; - // Xinef: Inherit Master's Threat List (not yet implemented) - //owner->CastSpell((Unit*)NULL, SPELL_MAGE_MASTERS_THREAT_LIST, true); - HostileReference* ref = owner->getHostileRefManager().getFirst(); - while (ref) - { - if (Unit* unit = ref->GetSource()->GetOwner()) - unit->AddThreat(me, ref->getThreat() - ref->getTempThreatModifier()); - ref = ref->next(); - } + Unit* owner = me->GetCharmerOrOwner(); + me->CombatStop(true); + if (owner && !me->HasUnitState(UNIT_STATE_FOLLOW)) + { + me->GetMotionMaster()->Clear(false); + me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, me->GetFollowAngle(), MOTION_SLOT_ACTIVE); + } + } + + void MySelectNextTarget() + { + if (_ebonGargoyleGUID) + { + Unit* gargoyle = ObjectAccessor::GetUnit(*me, _ebonGargoyleGUID); + if (gargoyle && gargoyle->GetAI()) + gargoyle->GetAI()->AttackStart(me); _ebonGargoyleGUID = 0; - - // Xinef: copy caster auras - Unit::VisibleAuraMap const* visibleAuraMap = owner->GetVisibleAuras(); - for (Unit::VisibleAuraMap::const_iterator itr = visibleAuraMap->begin(); itr != visibleAuraMap->end(); ++itr) - if (Aura* visAura = itr->second->GetBase()) - { - // Ebon Gargoyle - if (visAura->GetId() == 49206 && me->GetUInt32Value(UNIT_CREATED_BY_SPELL) == SPELL_SUMMON_MIRROR_IMAGE1) - { - if (Unit* gargoyle = visAura->GetCaster()) - _ebonGargoyleGUID = gargoyle->GetGUID(); - continue; - } - SpellScriptsBounds bounds = sObjectMgr->GetSpellScriptsBounds(visAura->GetId()); - if (bounds.first != bounds.second) - continue; - std::vector const* spellTriggered = sSpellMgr->GetSpellLinked(visAura->GetId() + SPELL_LINK_AURA); - if (!spellTriggered || !spellTriggered->empty()) - continue; - if (Aura* newAura = me->AddAura(visAura->GetId(), me)) - newAura->SetDuration(visAura->GetDuration()); - } - - me->m_Events.AddEvent(new DeathEvent(*me), me->m_Events.CalculateTime(29500)); } - - // Do not reload Creature templates on evade mode enter - prevent visual lost - void EnterEvadeMode() + Unit* owner = me->GetOwner(); + if (owner && owner->GetTypeId() == TYPEID_PLAYER) { - if (me->IsInEvadeMode() || !me->IsAlive()) - return; + Unit* selection = owner->ToPlayer()->GetSelectedUnit(); - Unit* owner = me->GetCharmerOrOwner(); - - me->CombatStop(true); - if (owner && !me->HasUnitState(UNIT_STATE_FOLLOW)) + if (selection) { - me->GetMotionMaster()->Clear(false); - me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, me->GetFollowAngle(), MOTION_SLOT_ACTIVE); + me->getThreatManager().resetAllAggro(); + me->AddThreat(selection, 1000000.0f); + + if (owner->IsInCombat()) + AttackStart(selection); } + + if (!owner->IsInCombat() && !me->GetVictim()) + EnterEvadeMode(); + } + } + + void Reset() + { + selectionTimer = 0; + checktarget = 0; + } + + void UpdateAI(uint32 diff) + { + events.Update(diff); + if (events.GetTimer() < 1200) + return; + + if (!me->IsInCombat() || !me->GetVictim()) + { + MySelectNextTarget(); + return; } - void MySelectNextTarget() + checktarget += diff; + + if (checktarget >= 1000) { - if (_ebonGargoyleGUID) - { - Unit* gargoyle = ObjectAccessor::GetUnit(*me, _ebonGargoyleGUID); - if (gargoyle && gargoyle->GetAI()) - gargoyle->GetAI()->AttackStart(me); - _ebonGargoyleGUID = 0; - } - Unit* owner = me->GetOwner(); - if (owner && owner->GetTypeId() == TYPEID_PLAYER) - { - Unit* selection = owner->ToPlayer()->GetSelectedUnit(); - - if (selection) - { - me->getThreatManager().resetAllAggro(); - me->AddThreat(selection, 1000000.0f); - - if (owner->IsInCombat()) - AttackStart(selection); - } - - if (!owner->IsInCombat() && !me->GetVictim()) - EnterEvadeMode(); - } - } - - void Reset() - { - selectionTimer = 0; - checktarget = 0; - } - - void UpdateAI(uint32 diff) - { - events.Update(diff); - if (events.GetTimer() < 1200) - return; - - if (!me->IsInCombat() || !me->GetVictim()) + if (me->GetVictim()->HasBreakableByDamageCrowdControlAura() || !me->GetVictim()->IsAlive()) { MySelectNextTarget(); + me->InterruptNonMeleeSpells(true); // Stop casting if target is CC or not Alive. return; } - - checktarget += diff; - - if (checktarget >= 1000) - { - if (me->GetVictim()->HasBreakableByDamageCrowdControlAura() || !me->GetVictim()->IsAlive()) - { - MySelectNextTarget(); - me->InterruptNonMeleeSpells(true); // Stop casting if target is CC or not Alive. - return; - } - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - if (uint32 spellId = events.GetEvent()) - { - events.RescheduleEvent(spellId, spellId == 59637 ? 6500 : 2500); - me->CastSpell(me->GetVictim(), spellId, false); - } } - }; - CreatureAI* GetAI(Creature* creature) const - { - return new npc_pet_mage_mirror_imageAI(creature); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + if (uint32 spellId = events.GetEvent()) + { + events.RescheduleEvent(spellId, spellId == 59637 ? 6500 : 2500); + me->CastSpell(me->GetVictim(), spellId, false); + } } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_pet_mage_mirror_imageAI(creature); + } }; void AddSC_mage_pet_scripts() diff --git a/src/server/scripts/Pet/pet_priest.cpp b/src/server/scripts/Pet/pet_priest.cpp index cafa0094b..50a58c562 100644 --- a/src/server/scripts/Pet/pet_priest.cpp +++ b/src/server/scripts/Pet/pet_priest.cpp @@ -25,66 +25,66 @@ enum PriestSpells class npc_pet_pri_lightwell : public CreatureScript { - public: - npc_pet_pri_lightwell() : CreatureScript("npc_pet_pri_lightwell") { } +public: + npc_pet_pri_lightwell() : CreatureScript("npc_pet_pri_lightwell") { } - struct npc_pet_pri_lightwellAI : public TotemAI + struct npc_pet_pri_lightwellAI : public TotemAI + { + npc_pet_pri_lightwellAI(Creature* creature) : TotemAI(creature) { } + + void InitializeAI() { - npc_pet_pri_lightwellAI(Creature* creature) : TotemAI(creature) { } - - void InitializeAI() + if (Unit* owner = me->ToTempSummon()->GetSummoner()) { - if (Unit* owner = me->ToTempSummon()->GetSummoner()) - { - uint32 hp = uint32(owner->GetMaxHealth()*0.3f); - me->SetMaxHealth(hp); - me->SetHealth(hp); - me->SetLevel(owner->getLevel()); - } - - me->CastSpell(me, SPELL_PRIEST_LIGHTWELL_CHARGES, false); // Spell for Lightwell Charges - TotemAI::InitializeAI(); + uint32 hp = uint32(owner->GetMaxHealth() * 0.3f); + me->SetMaxHealth(hp); + me->SetHealth(hp); + me->SetLevel(owner->getLevel()); } - }; - CreatureAI* GetAI(Creature* creature) const - { - return new npc_pet_pri_lightwellAI(creature); + me->CastSpell(me, SPELL_PRIEST_LIGHTWELL_CHARGES, false); // Spell for Lightwell Charges + TotemAI::InitializeAI(); } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_pet_pri_lightwellAI(creature); + } }; class npc_pet_pri_shadowfiend : public CreatureScript { - public: - npc_pet_pri_shadowfiend() : CreatureScript("npc_pet_pri_shadowfiend") { } +public: + npc_pet_pri_shadowfiend() : CreatureScript("npc_pet_pri_shadowfiend") { } - struct npc_pet_pri_shadowfiendAI : public PetAI + struct npc_pet_pri_shadowfiendAI : public PetAI + { + npc_pet_pri_shadowfiendAI(Creature* creature) : PetAI(creature) { } + + void Reset() { - npc_pet_pri_shadowfiendAI(Creature* creature) : PetAI(creature) { } + PetAI::Reset(); + if (!me->HasAura(SPELL_PRIEST_SHADOWFIEND_DODGE)) + me->AddAura(SPELL_PRIEST_SHADOWFIEND_DODGE, me); - void Reset() - { - PetAI::Reset(); - if (!me->HasAura(SPELL_PRIEST_SHADOWFIEND_DODGE)) - me->AddAura(SPELL_PRIEST_SHADOWFIEND_DODGE, me); - - if (Unit* target = me->SelectNearestTarget(15.0f)) - AttackStart(target); - } - - void JustDied(Unit* /*killer*/) - { - if (me->IsSummon()) - if (Unit* owner = me->ToTempSummon()->GetSummoner()) - if (owner->HasAura(SPELL_PRIEST_GLYPH_OF_SHADOWFIEND)) - owner->CastSpell(owner, SPELL_PRIEST_GLYPH_OF_SHADOWFIEND_MANA, true); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_pet_pri_shadowfiendAI(creature); + if (Unit* target = me->SelectNearestTarget(15.0f)) + AttackStart(target); } + + void JustDied(Unit* /*killer*/) + { + if (me->IsSummon()) + if (Unit* owner = me->ToTempSummon()->GetSummoner()) + if (owner->HasAura(SPELL_PRIEST_GLYPH_OF_SHADOWFIEND)) + owner->CastSpell(owner, SPELL_PRIEST_GLYPH_OF_SHADOWFIEND_MANA, true); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_pet_pri_shadowfiendAI(creature); + } }; void AddSC_priest_pet_scripts() diff --git a/src/server/scripts/Pet/pet_shaman.cpp b/src/server/scripts/Pet/pet_shaman.cpp index 6ff20fdd6..ceff557f9 100644 --- a/src/server/scripts/Pet/pet_shaman.cpp +++ b/src/server/scripts/Pet/pet_shaman.cpp @@ -33,132 +33,132 @@ enum ShamanEvents class npc_pet_shaman_earth_elemental : public CreatureScript { - public: - npc_pet_shaman_earth_elemental() : CreatureScript("npc_pet_shaman_earth_elemental") { } +public: + npc_pet_shaman_earth_elemental() : CreatureScript("npc_pet_shaman_earth_elemental") { } - struct npc_pet_shaman_earth_elementalAI : public ScriptedAI + struct npc_pet_shaman_earth_elementalAI : public ScriptedAI + { + npc_pet_shaman_earth_elementalAI(Creature* creature) : ScriptedAI(creature), _initAttack(true) { } + + + void EnterCombat(Unit*) { - npc_pet_shaman_earth_elementalAI(Creature* creature) : ScriptedAI(creature), _initAttack(true) { } - - - void EnterCombat(Unit*) - { - _events.Reset(); - _events.ScheduleEvent(EVENT_SHAMAN_ANGEREDEARTH, 0); - } - - void InitializeAI() - { - me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, true); - } - - void UpdateAI(uint32 diff) - { - if (_initAttack) - { - if (!me->IsInCombat()) - if (Player* owner = me->GetCharmerOrOwnerPlayerOrPlayerItself()) - if (Unit* target = owner->GetSelectedUnit()) - if (me->_CanDetectFeignDeathOf(target) && me->CanCreatureAttack(target)) - AttackStart(target); - _initAttack = false; - } - - if (!UpdateVictim()) - return; - - _events.Update(diff); - - if (_events.ExecuteEvent() == EVENT_SHAMAN_ANGEREDEARTH) - { - DoCastVictim(SPELL_SHAMAN_ANGEREDEARTH); - _events.ScheduleEvent(EVENT_SHAMAN_ANGEREDEARTH, urand(5000, 20000)); - } - - DoMeleeAttackIfReady(); - } - - private: - EventMap _events; - bool _initAttack; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_pet_shaman_earth_elementalAI(creature); + _events.Reset(); + _events.ScheduleEvent(EVENT_SHAMAN_ANGEREDEARTH, 0); } + + void InitializeAI() + { + me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, true); + } + + void UpdateAI(uint32 diff) + { + if (_initAttack) + { + if (!me->IsInCombat()) + if (Player* owner = me->GetCharmerOrOwnerPlayerOrPlayerItself()) + if (Unit* target = owner->GetSelectedUnit()) + if (me->_CanDetectFeignDeathOf(target) && me->CanCreatureAttack(target)) + AttackStart(target); + _initAttack = false; + } + + if (!UpdateVictim()) + return; + + _events.Update(diff); + + if (_events.ExecuteEvent() == EVENT_SHAMAN_ANGEREDEARTH) + { + DoCastVictim(SPELL_SHAMAN_ANGEREDEARTH); + _events.ScheduleEvent(EVENT_SHAMAN_ANGEREDEARTH, urand(5000, 20000)); + } + + DoMeleeAttackIfReady(); + } + + private: + EventMap _events; + bool _initAttack; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_pet_shaman_earth_elementalAI(creature); + } }; class npc_pet_shaman_fire_elemental : public CreatureScript { - public: - npc_pet_shaman_fire_elemental() : CreatureScript("npc_pet_shaman_fire_elemental") { } +public: + npc_pet_shaman_fire_elemental() : CreatureScript("npc_pet_shaman_fire_elemental") { } - struct npc_pet_shaman_fire_elementalAI : public ScriptedAI + struct npc_pet_shaman_fire_elementalAI : public ScriptedAI + { + npc_pet_shaman_fire_elementalAI(Creature* creature) : ScriptedAI(creature), _initAttack(true) { } + + void InitializeAI() { - npc_pet_shaman_fire_elementalAI(Creature* creature) : ScriptedAI(creature), _initAttack(true) { } - - void InitializeAI() - { - me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, true); - } - - void EnterCombat(Unit*) - { - _events.Reset(); - _events.ScheduleEvent(EVENT_SHAMAN_FIRENOVA, urand(5000, 20000)); - _events.ScheduleEvent(EVENT_SHAMAN_FIREBLAST, urand(5000, 20000)); - //_events.ScheduleEvent(EVENT_SHAMAN_FIRESHIELD, 0); - - me->RemoveAurasDueToSpell(SPELL_SHAMAN_FIRESHIELD); - me->CastSpell(me, SPELL_SHAMAN_FIRESHIELD, true); - } - - void UpdateAI(uint32 diff) - { - if (_initAttack) - { - if (!me->IsInCombat()) - if (Player* owner = me->GetCharmerOrOwnerPlayerOrPlayerItself()) - if (Unit* target = owner->GetSelectedUnit()) - if (me->_CanDetectFeignDeathOf(target) && me->CanCreatureAttack(target)) - AttackStart(target); - _initAttack = false; - } - - if (!UpdateVictim()) - return; - - _events.Update(diff); - while (uint32 eventId = _events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_SHAMAN_FIRENOVA: - me->CastSpell(me, SPELL_SHAMAN_FIRENOVA, false); - _events.ScheduleEvent(EVENT_SHAMAN_FIRENOVA, urand(8000, 15000)); - break; - case EVENT_SHAMAN_FIREBLAST: - me->CastSpell(me->GetVictim(), SPELL_SHAMAN_FIREBLAST, false); - _events.ScheduleEvent(EVENT_SHAMAN_FIREBLAST, urand(4000, 8000)); - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); - } - - private: - EventMap _events; - bool _initAttack; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_pet_shaman_fire_elementalAI(creature); + me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, true); } + + void EnterCombat(Unit*) + { + _events.Reset(); + _events.ScheduleEvent(EVENT_SHAMAN_FIRENOVA, urand(5000, 20000)); + _events.ScheduleEvent(EVENT_SHAMAN_FIREBLAST, urand(5000, 20000)); + //_events.ScheduleEvent(EVENT_SHAMAN_FIRESHIELD, 0); + + me->RemoveAurasDueToSpell(SPELL_SHAMAN_FIRESHIELD); + me->CastSpell(me, SPELL_SHAMAN_FIRESHIELD, true); + } + + void UpdateAI(uint32 diff) + { + if (_initAttack) + { + if (!me->IsInCombat()) + if (Player* owner = me->GetCharmerOrOwnerPlayerOrPlayerItself()) + if (Unit* target = owner->GetSelectedUnit()) + if (me->_CanDetectFeignDeathOf(target) && me->CanCreatureAttack(target)) + AttackStart(target); + _initAttack = false; + } + + if (!UpdateVictim()) + return; + + _events.Update(diff); + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_SHAMAN_FIRENOVA: + me->CastSpell(me, SPELL_SHAMAN_FIRENOVA, false); + _events.ScheduleEvent(EVENT_SHAMAN_FIRENOVA, urand(8000, 15000)); + break; + case EVENT_SHAMAN_FIREBLAST: + me->CastSpell(me->GetVictim(), SPELL_SHAMAN_FIREBLAST, false); + _events.ScheduleEvent(EVENT_SHAMAN_FIREBLAST, urand(4000, 8000)); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + + private: + EventMap _events; + bool _initAttack; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_pet_shaman_fire_elementalAI(creature); + } }; void AddSC_shaman_pet_scripts() diff --git a/src/server/scripts/ScriptLoader.cpp b/src/server/scripts/ScriptLoader.cpp index a4d303118..947ce949d 100644 --- a/src/server/scripts/ScriptLoader.cpp +++ b/src/server/scripts/ScriptLoader.cpp @@ -1196,6 +1196,6 @@ void AddOutdoorPvPScripts() void AddCustomScripts() { #ifdef SCRIPTS - //~ AddSC_MySuperScript(); + //~ AddSC_MySuperScript(); #endif } diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp index 39dd64d2e..36f46c152 100644 --- a/src/server/scripts/Spells/spell_dk.cpp +++ b/src/server/scripts/Spells/spell_dk.cpp @@ -79,958 +79,958 @@ enum Misc // Ours class spell_dk_wandering_plague : public SpellScriptLoader { - public: - spell_dk_wandering_plague() : SpellScriptLoader("spell_dk_wandering_plague") { } +public: + spell_dk_wandering_plague() : SpellScriptLoader("spell_dk_wandering_plague") { } - class spell_dk_wandering_plague_SpellScript : public SpellScript + class spell_dk_wandering_plague_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dk_wandering_plague_SpellScript); + + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_dk_wandering_plague_SpellScript); - - void FilterTargets(std::list& targets) + static const AuraType ccAuras[] = { - static const AuraType ccAuras[] = - { - SPELL_AURA_MOD_CONFUSE, - SPELL_AURA_MOD_FEAR, - SPELL_AURA_MOD_STUN, - SPELL_AURA_MOD_ROOT, - SPELL_AURA_TRANSFORM, - SPELL_AURA_NONE - }; + SPELL_AURA_MOD_CONFUSE, + SPELL_AURA_MOD_FEAR, + SPELL_AURA_MOD_STUN, + SPELL_AURA_MOD_ROOT, + SPELL_AURA_TRANSFORM, + SPELL_AURA_NONE + }; - for (std::list::iterator itr = targets.begin(); itr != targets.end();) + for (std::list::iterator itr = targets.begin(); itr != targets.end();) + { + Unit* target = (*itr)->ToUnit(); + if (!target) { - Unit* target = (*itr)->ToUnit(); - if (!target) + targets.erase(itr++); + continue; + } + + bool skip = false; + for (uint8 index = 0; !skip && ccAuras[index] != SPELL_AURA_NONE; ++index) + { + Unit::AuraEffectList const& auras = target->GetAuraEffectsByType(ccAuras[index]); + for (Unit::AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i) + if ((*i)->GetAmount()) + { + skip = true; + break; + } + } + + if (skip) + targets.erase(itr++); + else + ++itr; + } + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dk_wandering_plague_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dk_wandering_plague_SpellScript(); + } +}; + +class spell_dk_raise_ally : public SpellScriptLoader +{ +public: + spell_dk_raise_ally() : SpellScriptLoader("spell_dk_raise_ally") { } + + class spell_dk_raise_ally_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dk_raise_ally_SpellScript); + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + if (Player* unitTarget = GetHitPlayer()) + { + unitTarget->CastSpell(unitTarget, GetEffectValue(), true); + if (Unit* ghoul = unitTarget->GetCharm()) + { + //health, mana, armor and resistance + PetLevelInfo const* pInfo = sObjectMgr->GetPetLevelInfo(ghoul->GetEntry(), ghoul->getLevel()); + if (pInfo) // exist in DB + { + ghoul->SetCreateHealth(pInfo->health); + ghoul->SetModifierValue(UNIT_MOD_HEALTH, BASE_VALUE, pInfo->health); + ghoul->SetModifierValue(UNIT_MOD_ARMOR, BASE_VALUE, float(pInfo->armor)); + for (uint8 stat = 0; stat < MAX_STATS; ++stat) + ghoul->SetCreateStat(Stats(stat), float(pInfo->stats[stat])); + } + + ghoul->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, float(ghoul->getLevel() - (ghoul->getLevel() / 4))); + ghoul->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, float(ghoul->getLevel() + (ghoul->getLevel() / 4))); + + // Avoidance, Night of the Dead + if (Aura* aur = ghoul->AddAura(62137, ghoul)) + if (AuraEffect* aurEff = GetCaster()->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_DEATHKNIGHT, 2718, 0)) + if (aur->GetEffect(0)) + aur->GetEffect(0)->SetAmount(-aurEff->GetSpellInfo()->Effects[EFFECT_2].CalcValue()); + + // Hit / Expertise scalling, warlock / hunter pets have this by default + ghoul->AddAura(SPELL_HUNTER_PET_SCALING_04, ghoul); + + // DK Ghoul haste refresh + float val = (GetCaster()->m_modAttackSpeedPct[BASE_ATTACK] - 1.0f) * 100.0f; + ghoul->m_modAttackSpeedPct[BASE_ATTACK] = GetCaster()->m_modAttackSpeedPct[BASE_ATTACK]; + ghoul->SetFloatValue(UNIT_FIELD_BASEATTACKTIME, 2000.0f); + ghoul->ApplyPercentModFloatValue(UNIT_FIELD_BASEATTACKTIME, val, true); // we want to reduce attack time + + // Strength + Stamina + for (uint8 i = STAT_STRENGTH; i <= STAT_STAMINA; ++i) + { + Stats stat = Stats(i); + if (stat != STAT_STRENGTH && stat != STAT_STAMINA) + continue; + + float value = 0.0f; + float mod = (stat == STAT_STAMINA ? 0.3f : 0.7f); + + // Check just if owner has Ravenous Dead since it's effect is not an aura + AuraEffect const* aurEff = GetCaster()->GetAuraEffect(SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, SPELLFAMILY_DEATHKNIGHT, 3010, 0); + if (aurEff) + { + SpellInfo const* spellInfo = aurEff->GetSpellInfo(); // Then get the SpellProto and add the dummy effect value + AddPct(mod, spellInfo->Effects[EFFECT_1].CalcValue()); // Ravenous Dead edits the original scale + } + // Glyph of the Ghoul + aurEff = GetCaster()->GetAuraEffect(SPELL_DK_GLYPH_OF_THE_GHOUL, EFFECT_0); + if (aurEff) + mod += CalculatePct(1.0f, aurEff->GetAmount()); // Glyph of the Ghoul adds a flat value to the scale mod + + value = float(GetCaster()->GetStat(stat)) * mod; + value = ghoul->GetTotalStatValue(stat, value); + ghoul->SetStat(stat, int32(value)); + ghoul->ApplyStatBuffMod(stat, value, true); + } + + // Attack Power + ghoul->SetModifierValue(UNIT_MOD_ATTACK_POWER, BASE_VALUE, 589 + ghoul->GetStat(STAT_STRENGTH) + ghoul->GetStat(STAT_AGILITY)); + ghoul->SetInt32Value(UNIT_FIELD_ATTACK_POWER, (int32)ghoul->GetModifierValue(UNIT_MOD_ATTACK_POWER, BASE_VALUE) * ghoul->GetModifierValue(UNIT_MOD_ATTACK_POWER, BASE_PCT)); + ghoul->SetInt32Value(UNIT_FIELD_ATTACK_POWER_MODS, (int32)ghoul->GetModifierValue(UNIT_MOD_ATTACK_POWER, TOTAL_VALUE)); + ghoul->SetFloatValue(UNIT_FIELD_ATTACK_POWER_MULTIPLIER, ghoul->GetModifierValue(UNIT_MOD_ATTACK_POWER, TOTAL_PCT) - 1.0f); + + // Health + ghoul->SetModifierValue(UNIT_MOD_HEALTH, TOTAL_VALUE, (ghoul->GetStat(STAT_STAMINA) - ghoul->GetCreateStat(STAT_STAMINA)) * 10.0f); + + // Power Energy + ghoul->SetModifierValue(UnitMods(UNIT_MOD_POWER_START + POWER_ENERGY), BASE_VALUE, ghoul->GetCreatePowers(POWER_ENERGY)); + ghoul->UpdateAllStats(); + ghoul->SetFullHealth(); + + // Aura Immunities + ghoul->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_MELEE_RANGED_HASTE, true, SPELL_BLOCK_TYPE_POSITIVE); + ghoul->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MELEE_SLOW, true, SPELL_BLOCK_TYPE_POSITIVE); + ghoul->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_STAT, true, SPELL_BLOCK_TYPE_POSITIVE); + ghoul->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, true, SPELL_BLOCK_TYPE_POSITIVE); + ghoul->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_ATTACK_POWER, true, SPELL_BLOCK_TYPE_POSITIVE); + ghoul->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_ATTACK_POWER_PCT, true, SPELL_BLOCK_TYPE_POSITIVE); + } + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_dk_raise_ally_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dk_raise_ally_SpellScript(); + } +}; + +class spell_dk_raise_ally_trigger : public SpellScriptLoader +{ +public: + spell_dk_raise_ally_trigger() : SpellScriptLoader("spell_dk_raise_ally_trigger") { } + + class spell_dk_raise_ally_trigger_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_raise_ally_trigger_AuraScript); + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* charm = GetUnitOwner()->GetCharm()) + if (GetSpellInfo()->Effects[EFFECT_0].MiscValue >= 0 && charm->GetEntry() == uint32(GetSpellInfo()->Effects[EFFECT_0].MiscValue)) + charm->ToCreature()->DespawnOrUnsummon(); + } + + void Register() + { + OnEffectRemove += AuraEffectRemoveFn(spell_dk_raise_ally_trigger_AuraScript::HandleEffectRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dk_raise_ally_trigger_AuraScript(); + } +}; + +class spell_dk_aotd_taunt : public SpellScriptLoader +{ +public: + spell_dk_aotd_taunt() : SpellScriptLoader("spell_dk_aotd_taunt") { } + + class spell_dk_aotd_taunt_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dk_aotd_taunt_SpellScript); + + void FilterTargets(std::list& targets) + { + for (std::list::iterator itr = targets.begin(); itr != targets.end();) + { + // ignore bosses + if (Creature* cr = (*itr)->ToCreature()) + if (cr->isWorldBoss()) { targets.erase(itr++); continue; } - bool skip = false; - for (uint8 index = 0; !skip && ccAuras[index] != SPELL_AURA_NONE; ++index) - { - Unit::AuraEffectList const& auras = target->GetAuraEffectsByType(ccAuras[index]); - for (Unit::AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i) - if ((*i)->GetAmount()) - { - skip = true; - break; - } - } - - if (skip) - targets.erase(itr++); - else - ++itr; - } + ++itr; } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dk_wandering_plague_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dk_wandering_plague_SpellScript(); } -}; -class spell_dk_raise_ally : public SpellScriptLoader -{ - public: - spell_dk_raise_ally() : SpellScriptLoader("spell_dk_raise_ally") { } - - class spell_dk_raise_ally_SpellScript : public SpellScript + void Register() { - PrepareSpellScript(spell_dk_raise_ally_SpellScript); - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - if (Player* unitTarget = GetHitPlayer()) - { - unitTarget->CastSpell(unitTarget, GetEffectValue(), true); - if (Unit* ghoul = unitTarget->GetCharm()) - { - //health, mana, armor and resistance - PetLevelInfo const* pInfo = sObjectMgr->GetPetLevelInfo(ghoul->GetEntry(), ghoul->getLevel()); - if (pInfo) // exist in DB - { - ghoul->SetCreateHealth(pInfo->health); - ghoul->SetModifierValue(UNIT_MOD_HEALTH, BASE_VALUE, pInfo->health); - ghoul->SetModifierValue(UNIT_MOD_ARMOR, BASE_VALUE, float(pInfo->armor)); - for (uint8 stat = 0; stat < MAX_STATS; ++stat) - ghoul->SetCreateStat(Stats(stat), float(pInfo->stats[stat])); - } - - ghoul->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, float(ghoul->getLevel() - (ghoul->getLevel() / 4))); - ghoul->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, float(ghoul->getLevel() + (ghoul->getLevel() / 4))); - - // Avoidance, Night of the Dead - if (Aura *aur = ghoul->AddAura(62137, ghoul)) - if (AuraEffect *aurEff = GetCaster()->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_DEATHKNIGHT, 2718, 0)) - if (aur->GetEffect(0)) - aur->GetEffect(0)->SetAmount(-aurEff->GetSpellInfo()->Effects[EFFECT_2].CalcValue()); - - // Hit / Expertise scalling, warlock / hunter pets have this by default - ghoul->AddAura(SPELL_HUNTER_PET_SCALING_04, ghoul); - - // DK Ghoul haste refresh - float val = (GetCaster()->m_modAttackSpeedPct[BASE_ATTACK] - 1.0f) * 100.0f; - ghoul->m_modAttackSpeedPct[BASE_ATTACK] = GetCaster()->m_modAttackSpeedPct[BASE_ATTACK]; - ghoul->SetFloatValue(UNIT_FIELD_BASEATTACKTIME, 2000.0f); - ghoul->ApplyPercentModFloatValue(UNIT_FIELD_BASEATTACKTIME, val, true); // we want to reduce attack time - - // Strength + Stamina - for (uint8 i = STAT_STRENGTH; i <= STAT_STAMINA; ++i) - { - Stats stat = Stats(i); - if (stat != STAT_STRENGTH && stat != STAT_STAMINA) - continue; - - float value = 0.0f; - float mod = (stat == STAT_STAMINA ? 0.3f : 0.7f); - - // Check just if owner has Ravenous Dead since it's effect is not an aura - AuraEffect const* aurEff = GetCaster()->GetAuraEffect(SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, SPELLFAMILY_DEATHKNIGHT, 3010, 0); - if (aurEff) - { - SpellInfo const* spellInfo = aurEff->GetSpellInfo(); // Then get the SpellProto and add the dummy effect value - AddPct(mod, spellInfo->Effects[EFFECT_1].CalcValue()); // Ravenous Dead edits the original scale - } - // Glyph of the Ghoul - aurEff = GetCaster()->GetAuraEffect(SPELL_DK_GLYPH_OF_THE_GHOUL, EFFECT_0); - if (aurEff) - mod += CalculatePct(1.0f, aurEff->GetAmount()); // Glyph of the Ghoul adds a flat value to the scale mod - - value = float(GetCaster()->GetStat(stat)) * mod; - value = ghoul->GetTotalStatValue(stat, value); - ghoul->SetStat(stat, int32(value)); - ghoul->ApplyStatBuffMod(stat, value, true); - } - - // Attack Power - ghoul->SetModifierValue(UNIT_MOD_ATTACK_POWER, BASE_VALUE, 589 + ghoul->GetStat(STAT_STRENGTH) + ghoul->GetStat(STAT_AGILITY)); - ghoul->SetInt32Value(UNIT_FIELD_ATTACK_POWER, (int32)ghoul->GetModifierValue(UNIT_MOD_ATTACK_POWER, BASE_VALUE) * ghoul->GetModifierValue(UNIT_MOD_ATTACK_POWER, BASE_PCT)); - ghoul->SetInt32Value(UNIT_FIELD_ATTACK_POWER_MODS, (int32)ghoul->GetModifierValue(UNIT_MOD_ATTACK_POWER, TOTAL_VALUE)); - ghoul->SetFloatValue(UNIT_FIELD_ATTACK_POWER_MULTIPLIER, ghoul->GetModifierValue(UNIT_MOD_ATTACK_POWER, TOTAL_PCT) - 1.0f); - - // Health - ghoul->SetModifierValue(UNIT_MOD_HEALTH, TOTAL_VALUE, (ghoul->GetStat(STAT_STAMINA) - ghoul->GetCreateStat(STAT_STAMINA))*10.0f); - - // Power Energy - ghoul->SetModifierValue(UnitMods(UNIT_MOD_POWER_START+POWER_ENERGY), BASE_VALUE, ghoul->GetCreatePowers(POWER_ENERGY)); - ghoul->UpdateAllStats(); - ghoul->SetFullHealth(); - - // Aura Immunities - ghoul->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_MELEE_RANGED_HASTE, true, SPELL_BLOCK_TYPE_POSITIVE); - ghoul->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MELEE_SLOW, true, SPELL_BLOCK_TYPE_POSITIVE); - ghoul->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_STAT, true, SPELL_BLOCK_TYPE_POSITIVE); - ghoul->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, true, SPELL_BLOCK_TYPE_POSITIVE); - ghoul->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_ATTACK_POWER, true, SPELL_BLOCK_TYPE_POSITIVE); - ghoul->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_ATTACK_POWER_PCT, true, SPELL_BLOCK_TYPE_POSITIVE); - } - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_dk_raise_ally_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dk_raise_ally_SpellScript(); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dk_aotd_taunt_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY); } -}; + }; -class spell_dk_raise_ally_trigger : public SpellScriptLoader -{ - public: - spell_dk_raise_ally_trigger() : SpellScriptLoader("spell_dk_raise_ally_trigger") { } - - class spell_dk_raise_ally_trigger_AuraScript : public AuraScript - { - PrepareAuraScript(spell_dk_raise_ally_trigger_AuraScript); - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* charm = GetUnitOwner()->GetCharm()) - if (GetSpellInfo()->Effects[EFFECT_0].MiscValue >= 0 && charm->GetEntry() == uint32(GetSpellInfo()->Effects[EFFECT_0].MiscValue)) - charm->ToCreature()->DespawnOrUnsummon(); - } - - void Register() - { - OnEffectRemove += AuraEffectRemoveFn(spell_dk_raise_ally_trigger_AuraScript::HandleEffectRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dk_raise_ally_trigger_AuraScript(); - } -}; - -class spell_dk_aotd_taunt : public SpellScriptLoader -{ - public: - spell_dk_aotd_taunt() : SpellScriptLoader("spell_dk_aotd_taunt") { } - - class spell_dk_aotd_taunt_SpellScript : public SpellScript - { - PrepareSpellScript(spell_dk_aotd_taunt_SpellScript); - - void FilterTargets(std::list& targets) - { - for (std::list::iterator itr = targets.begin(); itr != targets.end();) - { - // ignore bosses - if (Creature* cr = (*itr)->ToCreature()) - if (cr->isWorldBoss()) - { - targets.erase(itr++); - continue; - } - - ++itr; - } - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dk_aotd_taunt_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dk_aotd_taunt_SpellScript(); - } + SpellScript* GetSpellScript() const + { + return new spell_dk_aotd_taunt_SpellScript(); + } }; class spell_dk_death_and_decay : public SpellScriptLoader { - public: - spell_dk_death_and_decay() : SpellScriptLoader("spell_dk_death_and_decay") { } +public: + spell_dk_death_and_decay() : SpellScriptLoader("spell_dk_death_and_decay") { } - class spell_dk_death_and_decay_SpellScript : public SpellScript + class spell_dk_death_and_decay_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dk_death_and_decay_SpellScript); + + void RecalculateDamage() { - PrepareSpellScript(spell_dk_death_and_decay_SpellScript); + Unit* caster = GetCaster(); + Unit* target = GetHitUnit(); + int32 damage = GetHitDamage(); - void RecalculateDamage() - { - Unit* caster = GetCaster(); - Unit* target = GetHitUnit(); - int32 damage = GetHitDamage(); + // T10P2 bonus + if (AuraEffect* aurEff = caster->GetAuraEffectDummy(70650)) + AddPct(damage, aurEff->GetAmount()); + // Glyph of Death and Decay + if (AuraEffect* aurEff = caster->GetAuraEffect(58629, EFFECT_0)) + AddPct(damage, aurEff->GetAmount()); - // T10P2 bonus - if (AuraEffect* aurEff = caster->GetAuraEffectDummy(70650)) - AddPct(damage, aurEff->GetAmount()); - // Glyph of Death and Decay - if (AuraEffect* aurEff = caster->GetAuraEffect(58629, EFFECT_0)) - AddPct(damage, aurEff->GetAmount()); + // Xinef: include AOE damage reducing auras + if (target) + damage = target->CalculateAOEDamageReduction(damage, GetSpellInfo()->SchoolMask, caster); - // Xinef: include AOE damage reducing auras - if (target) - damage = target->CalculateAOEDamageReduction(damage, GetSpellInfo()->SchoolMask, caster); - - SetHitDamage(damage); - } - - void Register() - { - if (m_scriptSpellId == SPELL_DK_DEATH_AND_DECAY_TRIGGER) - OnHit += SpellHitFn(spell_dk_death_and_decay_SpellScript::RecalculateDamage); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dk_death_and_decay_SpellScript(); + SetHitDamage(damage); } - class spell_dk_death_and_decay_AuraScript : public AuraScript + void Register() { - PrepareAuraScript(spell_dk_death_and_decay_AuraScript); - - void HandlePeriodic(AuraEffect const* aurEff) - { - PreventDefaultAction(); - if (GetCaster() && GetTarget()) - { - int32 basePoints0 = aurEff->GetAmount(); - GetCaster()->CastCustomSpell(GetTarget(), SPELL_DK_DEATH_AND_DECAY_TRIGGER, &basePoints0, nullptr, nullptr, true, 0, aurEff); - } - } - - void Register() - { - if (m_scriptSpellId != SPELL_DK_DEATH_AND_DECAY_TRIGGER) - OnEffectPeriodic += AuraEffectPeriodicFn(spell_dk_death_and_decay_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dk_death_and_decay_AuraScript(); + if (m_scriptSpellId == SPELL_DK_DEATH_AND_DECAY_TRIGGER) + OnHit += SpellHitFn(spell_dk_death_and_decay_SpellScript::RecalculateDamage); } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dk_death_and_decay_SpellScript(); + } + + class spell_dk_death_and_decay_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_death_and_decay_AuraScript); + + void HandlePeriodic(AuraEffect const* aurEff) + { + PreventDefaultAction(); + if (GetCaster() && GetTarget()) + { + int32 basePoints0 = aurEff->GetAmount(); + GetCaster()->CastCustomSpell(GetTarget(), SPELL_DK_DEATH_AND_DECAY_TRIGGER, &basePoints0, nullptr, nullptr, true, 0, aurEff); + } + } + + void Register() + { + if (m_scriptSpellId != SPELL_DK_DEATH_AND_DECAY_TRIGGER) + OnEffectPeriodic += AuraEffectPeriodicFn(spell_dk_death_and_decay_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dk_death_and_decay_AuraScript(); + } }; class spell_dk_master_of_ghouls : public SpellScriptLoader { - public: - spell_dk_master_of_ghouls() : SpellScriptLoader("spell_dk_master_of_ghouls") { } +public: + spell_dk_master_of_ghouls() : SpellScriptLoader("spell_dk_master_of_ghouls") { } - class spell_dk_master_of_ghouls_AuraScript : public AuraScript + class spell_dk_master_of_ghouls_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_master_of_ghouls_AuraScript); + + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_dk_master_of_ghouls_AuraScript); - - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - if (target->GetTypeId() == TYPEID_PLAYER) - target->ToPlayer()->SetShowDKPet(true); - } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - if (target->GetTypeId() == TYPEID_PLAYER) - target->ToPlayer()->SetShowDKPet(false); - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_dk_master_of_ghouls_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_ADD_FLAT_MODIFIER, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_dk_master_of_ghouls_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_ADD_FLAT_MODIFIER, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dk_master_of_ghouls_AuraScript(); + Unit* target = GetTarget(); + if (target->GetTypeId() == TYPEID_PLAYER) + target->ToPlayer()->SetShowDKPet(true); } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + if (target->GetTypeId() == TYPEID_PLAYER) + target->ToPlayer()->SetShowDKPet(false); + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_dk_master_of_ghouls_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_ADD_FLAT_MODIFIER, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_dk_master_of_ghouls_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_ADD_FLAT_MODIFIER, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dk_master_of_ghouls_AuraScript(); + } }; class spell_dk_chains_of_ice : public SpellScriptLoader { - public: - spell_dk_chains_of_ice() : SpellScriptLoader("spell_dk_chains_of_ice") { } +public: + spell_dk_chains_of_ice() : SpellScriptLoader("spell_dk_chains_of_ice") { } - class spell_dk_chains_of_ice_SpellScript : public SpellScript + class spell_dk_chains_of_ice_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dk_chains_of_ice_SpellScript); + + void HandleAfterCast() { - PrepareSpellScript(spell_dk_chains_of_ice_SpellScript); - - void HandleAfterCast() + if (Unit* target = GetExplTargetUnit()) { - if (Unit* target = GetExplTargetUnit()) - { - std::list const* targetsInfo = GetSpell()->GetUniqueTargetInfo(); - for (std::list::const_iterator ihit = targetsInfo->begin(); ihit != targetsInfo->end(); ++ihit) - if (ihit->missCondition == SPELL_MISS_NONE && ihit->targetGUID == target->GetGUID()) - GetCaster()->CastSpell(target, 55095 /*SPELL_FROST_FEVER*/, true); - } + std::list const* targetsInfo = GetSpell()->GetUniqueTargetInfo(); + for (std::list::const_iterator ihit = targetsInfo->begin(); ihit != targetsInfo->end(); ++ihit) + if (ihit->missCondition == SPELL_MISS_NONE && ihit->targetGUID == target->GetGUID()) + GetCaster()->CastSpell(target, 55095 /*SPELL_FROST_FEVER*/, true); } - - void Register() - { - AfterCast += SpellCastFn(spell_dk_chains_of_ice_SpellScript::HandleAfterCast); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dk_chains_of_ice_SpellScript(); } - class spell_dk_chains_of_ice_AuraScript : public AuraScript + void Register() { - PrepareAuraScript(spell_dk_chains_of_ice_AuraScript); - - void HandlePeriodic(AuraEffect* aurEff) - { - // Get 0 effect aura - if (AuraEffect* slow = GetAura()->GetEffect(0)) - { - int32 newAmount = slow->GetAmount() + aurEff->GetAmount(); - if (newAmount > 0) - newAmount = 0; - slow->ChangeAmount(newAmount); - } - } - - void Register() - { - OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_dk_chains_of_ice_AuraScript::HandlePeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dk_chains_of_ice_AuraScript(); + AfterCast += SpellCastFn(spell_dk_chains_of_ice_SpellScript::HandleAfterCast); } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dk_chains_of_ice_SpellScript(); + } + + class spell_dk_chains_of_ice_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_chains_of_ice_AuraScript); + + void HandlePeriodic(AuraEffect* aurEff) + { + // Get 0 effect aura + if (AuraEffect* slow = GetAura()->GetEffect(0)) + { + int32 newAmount = slow->GetAmount() + aurEff->GetAmount(); + if (newAmount > 0) + newAmount = 0; + slow->ChangeAmount(newAmount); + } + } + + void Register() + { + OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_dk_chains_of_ice_AuraScript::HandlePeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dk_chains_of_ice_AuraScript(); + } }; class spell_dk_bloodworms : public SpellScriptLoader { - public: - spell_dk_bloodworms() : SpellScriptLoader("spell_dk_bloodworms") { } +public: + spell_dk_bloodworms() : SpellScriptLoader("spell_dk_bloodworms") { } - class spell_dk_bloodworms_SpellScript : public SpellScript + class spell_dk_bloodworms_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dk_bloodworms_SpellScript); + + void HandleSummon(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_dk_bloodworms_SpellScript); - - void HandleSummon(SpellEffIndex /*effIndex*/) - { - SetEffectValue(irand(2, 4)); - } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_dk_bloodworms_SpellScript::HandleSummon, EFFECT_0, SPELL_EFFECT_SUMMON); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dk_bloodworms_SpellScript(); + SetEffectValue(irand(2, 4)); } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_dk_bloodworms_SpellScript::HandleSummon, EFFECT_0, SPELL_EFFECT_SUMMON); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dk_bloodworms_SpellScript(); + } }; class spell_dk_summon_gargoyle : public SpellScriptLoader { - public: - spell_dk_summon_gargoyle() : SpellScriptLoader("spell_dk_summon_gargoyle") { } +public: + spell_dk_summon_gargoyle() : SpellScriptLoader("spell_dk_summon_gargoyle") { } - class spell_dk_summon_gargoyle_SpellScript : public SpellScript + class spell_dk_summon_gargoyle_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dk_summon_gargoyle_SpellScript); + + void SetDest(SpellDestination& dest) { - PrepareSpellScript(spell_dk_summon_gargoyle_SpellScript); - - void SetDest(SpellDestination& dest) - { - // Adjust effect summon position - if (GetCaster()->IsWithinLOS(dest._position.GetPositionX(), dest._position.GetPositionY(), dest._position.GetPositionZ()+15.0f)) - dest._position.m_positionZ += 15.0f; - } - - void Register() - { - OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_dk_summon_gargoyle_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER_FRONT_LEFT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dk_summon_gargoyle_SpellScript(); + // Adjust effect summon position + if (GetCaster()->IsWithinLOS(dest._position.GetPositionX(), dest._position.GetPositionY(), dest._position.GetPositionZ() + 15.0f)) + dest._position.m_positionZ += 15.0f; } + + void Register() + { + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_dk_summon_gargoyle_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER_FRONT_LEFT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dk_summon_gargoyle_SpellScript(); + } }; class spell_dk_improved_blood_presence_proc : public SpellScriptLoader { - public: - spell_dk_improved_blood_presence_proc() : SpellScriptLoader("spell_dk_improved_blood_presence_proc") { } +public: + spell_dk_improved_blood_presence_proc() : SpellScriptLoader("spell_dk_improved_blood_presence_proc") { } - class spell_dk_improved_blood_presence_proc_AuraScript : public AuraScript + class spell_dk_improved_blood_presence_proc_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_improved_blood_presence_proc_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_dk_improved_blood_presence_proc_AuraScript); - - bool CheckProc(ProcEventInfo& eventInfo) - { - return eventInfo.GetDamageInfo()->GetDamage(); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_dk_improved_blood_presence_proc_AuraScript::CheckProc); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dk_improved_blood_presence_proc_AuraScript(); + return eventInfo.GetDamageInfo()->GetDamage(); } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_dk_improved_blood_presence_proc_AuraScript::CheckProc); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dk_improved_blood_presence_proc_AuraScript(); + } }; class spell_dk_wandering_plague_aura : public SpellScriptLoader { - public: - spell_dk_wandering_plague_aura() : SpellScriptLoader("spell_dk_wandering_plague_aura") { } +public: + spell_dk_wandering_plague_aura() : SpellScriptLoader("spell_dk_wandering_plague_aura") { } - class spell_dk_wandering_plague_aura_AuraScript : public AuraScript + class spell_dk_wandering_plague_aura_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_wandering_plague_aura_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_dk_wandering_plague_aura_AuraScript); + const SpellInfo* spellInfo = eventInfo.GetDamageInfo()->GetSpellInfo(); + if (!spellInfo || !eventInfo.GetActionTarget()) + return false; - bool CheckProc(ProcEventInfo& eventInfo) - { - const SpellInfo* spellInfo = eventInfo.GetDamageInfo()->GetSpellInfo(); - if (!spellInfo || !eventInfo.GetActionTarget()) - return false; + if (!roll_chance_f(eventInfo.GetActor()->GetUnitCriticalChance(BASE_ATTACK, eventInfo.GetActionTarget()))) + return false; - if (!roll_chance_f(eventInfo.GetActor()->GetUnitCriticalChance(BASE_ATTACK, eventInfo.GetActionTarget()))) - return false; - - return !eventInfo.GetActor()->HasSpellCooldown(SPELL_DK_WANDERING_PLAGUE_TRIGGER); - } - - // xinef: prevent default proc with castItem passed, which applies 30 sec cooldown to procing of the aura - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - - eventInfo.GetActor()->AddSpellCooldown(SPELL_DK_WANDERING_PLAGUE_TRIGGER, 0, 1000); - eventInfo.GetActor()->CastCustomSpell(SPELL_DK_WANDERING_PLAGUE_TRIGGER, SPELLVALUE_BASE_POINT0, CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount()), eventInfo.GetActionTarget(), TRIGGERED_FULL_MASK); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_dk_wandering_plague_aura_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_dk_wandering_plague_aura_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dk_wandering_plague_aura_AuraScript(); + return !eventInfo.GetActor()->HasSpellCooldown(SPELL_DK_WANDERING_PLAGUE_TRIGGER); } + + // xinef: prevent default proc with castItem passed, which applies 30 sec cooldown to procing of the aura + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + eventInfo.GetActor()->AddSpellCooldown(SPELL_DK_WANDERING_PLAGUE_TRIGGER, 0, 1000); + eventInfo.GetActor()->CastCustomSpell(SPELL_DK_WANDERING_PLAGUE_TRIGGER, SPELLVALUE_BASE_POINT0, CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount()), eventInfo.GetActionTarget(), TRIGGERED_FULL_MASK); + } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_dk_wandering_plague_aura_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_dk_wandering_plague_aura_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dk_wandering_plague_aura_AuraScript(); + } }; class spell_dk_rune_of_the_fallen_crusader : public SpellScriptLoader { - public: - spell_dk_rune_of_the_fallen_crusader() : SpellScriptLoader("spell_dk_rune_of_the_fallen_crusader") { } +public: + spell_dk_rune_of_the_fallen_crusader() : SpellScriptLoader("spell_dk_rune_of_the_fallen_crusader") { } - class spell_dk_rune_of_the_fallen_crusader_SpellScript : public SpellScript + class spell_dk_rune_of_the_fallen_crusader_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dk_rune_of_the_fallen_crusader_SpellScript); + + void RecalculateDamage() { - PrepareSpellScript(spell_dk_rune_of_the_fallen_crusader_SpellScript); - - void RecalculateDamage() - { - std::list* targetsInfo = GetSpell()->GetUniqueTargetInfo(); - for (std::list::iterator ihit = targetsInfo->begin(); ihit != targetsInfo->end(); ++ihit) - if (ihit->targetGUID == GetCaster()->GetGUID()) - ihit->crit = roll_chance_f(GetCaster()->GetFloatValue(PLAYER_CRIT_PERCENTAGE)); - } - - void Register() - { - OnHit += SpellHitFn(spell_dk_rune_of_the_fallen_crusader_SpellScript::RecalculateDamage); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dk_rune_of_the_fallen_crusader_SpellScript(); + std::list* targetsInfo = GetSpell()->GetUniqueTargetInfo(); + for (std::list::iterator ihit = targetsInfo->begin(); ihit != targetsInfo->end(); ++ihit) + if (ihit->targetGUID == GetCaster()->GetGUID()) + ihit->crit = roll_chance_f(GetCaster()->GetFloatValue(PLAYER_CRIT_PERCENTAGE)); } + + void Register() + { + OnHit += SpellHitFn(spell_dk_rune_of_the_fallen_crusader_SpellScript::RecalculateDamage); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dk_rune_of_the_fallen_crusader_SpellScript(); + } }; class spell_dk_bone_shield : public SpellScriptLoader { - public: - spell_dk_bone_shield() : SpellScriptLoader("spell_dk_bone_shield") { } +public: + spell_dk_bone_shield() : SpellScriptLoader("spell_dk_bone_shield") { } - class spell_dk_bone_shield_AuraScript : public AuraScript + class spell_dk_bone_shield_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_bone_shield_AuraScript); + + void HandleProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_dk_bone_shield_AuraScript); - - void HandleProc(ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - if (!eventInfo.GetDamageInfo()->GetSpellInfo() || !eventInfo.GetDamageInfo()->GetSpellInfo()->IsTargetingArea()) - DropCharge(); - } - - void Register() - { - OnProc += AuraProcFn(spell_dk_bone_shield_AuraScript::HandleProc); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dk_bone_shield_AuraScript(); + PreventDefaultAction(); + if (!eventInfo.GetDamageInfo()->GetSpellInfo() || !eventInfo.GetDamageInfo()->GetSpellInfo()->IsTargetingArea()) + DropCharge(); } + + void Register() + { + OnProc += AuraProcFn(spell_dk_bone_shield_AuraScript::HandleProc); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dk_bone_shield_AuraScript(); + } }; class spell_dk_hungering_cold : public SpellScriptLoader { - public: - spell_dk_hungering_cold() : SpellScriptLoader("spell_dk_hungering_cold") { } +public: + spell_dk_hungering_cold() : SpellScriptLoader("spell_dk_hungering_cold") { } - class spell_dk_hungering_cold_AuraScript : public AuraScript + class spell_dk_hungering_cold_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_hungering_cold_AuraScript); + + void HandleProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_dk_hungering_cold_AuraScript); - - void HandleProc(ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - if (eventInfo.GetDamageInfo()->GetDamage() > 0 && (!eventInfo.GetDamageInfo()->GetSpellInfo() || eventInfo.GetDamageInfo()->GetSpellInfo()->Dispel != DISPEL_DISEASE)) - SetDuration(0); - } - - void Register() - { - OnProc += AuraProcFn(spell_dk_hungering_cold_AuraScript::HandleProc); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dk_hungering_cold_AuraScript(); + PreventDefaultAction(); + if (eventInfo.GetDamageInfo()->GetDamage() > 0 && (!eventInfo.GetDamageInfo()->GetSpellInfo() || eventInfo.GetDamageInfo()->GetSpellInfo()->Dispel != DISPEL_DISEASE)) + SetDuration(0); } + + void Register() + { + OnProc += AuraProcFn(spell_dk_hungering_cold_AuraScript::HandleProc); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dk_hungering_cold_AuraScript(); + } }; class spell_dk_blood_caked_blade : public SpellScriptLoader { - public: - spell_dk_blood_caked_blade() : SpellScriptLoader("spell_dk_blood_caked_blade") { } +public: + spell_dk_blood_caked_blade() : SpellScriptLoader("spell_dk_blood_caked_blade") { } - class spell_dk_blood_caked_blade_AuraScript : public AuraScript + class spell_dk_blood_caked_blade_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_blood_caked_blade_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_dk_blood_caked_blade_AuraScript); + return eventInfo.GetActionTarget() && eventInfo.GetActionTarget()->IsAlive(); + } - bool CheckProc(ProcEventInfo& eventInfo) + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), aurEff->GetSpellInfo()->Effects[EFFECT_0].TriggerSpell, true, NULL, aurEff); + + // Xinef: Shadowmourne hack (blood-caked blade trigger proc disabled...) + if (roll_chance_i(75) && eventInfo.GetActor()->FindMap() && !eventInfo.GetActor()->FindMap()->IsBattlegroundOrArena() && eventInfo.GetActor()->HasAura(71903) && !eventInfo.GetActor()->HasAura(SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF)) { - return eventInfo.GetActionTarget() && eventInfo.GetActionTarget()->IsAlive(); - } + eventInfo.GetActor()->CastSpell(eventInfo.GetActor(), SPELL_SHADOWMOURNE_SOUL_FRAGMENT, true); - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), aurEff->GetSpellInfo()->Effects[EFFECT_0].TriggerSpell, true, NULL, aurEff); - - // Xinef: Shadowmourne hack (blood-caked blade trigger proc disabled...) - if (roll_chance_i(75) && eventInfo.GetActor()->FindMap() && !eventInfo.GetActor()->FindMap()->IsBattlegroundOrArena() && eventInfo.GetActor()->HasAura(71903) && !eventInfo.GetActor()->HasAura(SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF)) + // this can't be handled in AuraScript of SoulFragments because we need to know victim + if (Aura* soulFragments = eventInfo.GetActor()->GetAura(SPELL_SHADOWMOURNE_SOUL_FRAGMENT)) { - eventInfo.GetActor()->CastSpell(eventInfo.GetActor(), SPELL_SHADOWMOURNE_SOUL_FRAGMENT, true); - - // this can't be handled in AuraScript of SoulFragments because we need to know victim - if (Aura* soulFragments = eventInfo.GetActor()->GetAura(SPELL_SHADOWMOURNE_SOUL_FRAGMENT)) + if (soulFragments->GetStackAmount() >= 10) { - if (soulFragments->GetStackAmount() >= 10) - { - eventInfo.GetActor()->CastSpell(eventInfo.GetActor(), SPELL_SHADOWMOURNE_CHAOS_BANE_DAMAGE, true, nullptr); - soulFragments->Remove(); - } + eventInfo.GetActor()->CastSpell(eventInfo.GetActor(), SPELL_SHADOWMOURNE_CHAOS_BANE_DAMAGE, true, nullptr); + soulFragments->Remove(); } } } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_dk_blood_caked_blade_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_dk_blood_caked_blade_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dk_blood_caked_blade_AuraScript(); } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_dk_blood_caked_blade_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_dk_blood_caked_blade_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dk_blood_caked_blade_AuraScript(); + } }; class spell_dk_dancing_rune_weapon : public SpellScriptLoader { - public: - spell_dk_dancing_rune_weapon() : SpellScriptLoader("spell_dk_dancing_rune_weapon") { } +public: + spell_dk_dancing_rune_weapon() : SpellScriptLoader("spell_dk_dancing_rune_weapon") { } - class spell_dk_dancing_rune_weapon_AuraScript : public AuraScript + class spell_dk_dancing_rune_weapon_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_dancing_rune_weapon_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_dk_dancing_rune_weapon_AuraScript); - - bool CheckProc(ProcEventInfo& eventInfo) - { - if (!eventInfo.GetActor() || !eventInfo.GetActionTarget() || !eventInfo.GetActionTarget()->IsAlive() || eventInfo.GetActor()->GetTypeId() != TYPEID_PLAYER) - return false; - - const SpellInfo* spellInfo = eventInfo.GetDamageInfo()->GetSpellInfo(); - if (!spellInfo) - return true; - - // Death Coil exception, Check if spell is from spellbook - if (spellInfo->Id != SPELL_DK_DEATH_COIL_DAMAGE && !eventInfo.GetActor()->ToPlayer()->HasActiveSpell(spellInfo->Id)) - return false; - - // Can't cast raise dead/ally, death grip, dark command, death pact, death and decay, anti-magic shell - if (spellInfo->SpellFamilyFlags.HasFlag(0x20A1220, 0x10000000, 0x0)) - return false; - - // AoE can be cast only once - if (spellInfo->IsTargetingArea() && eventInfo.GetActor() != eventInfo.GetActionTarget()) - return false; - - // No spells with summoning - if (spellInfo->HasEffect(SPELL_EFFECT_SUMMON)) - return false; - - // No Positive Spells - if (spellInfo->IsPositive()) - return false; + if (!eventInfo.GetActor() || !eventInfo.GetActionTarget() || !eventInfo.GetActionTarget()->IsAlive() || eventInfo.GetActor()->GetTypeId() != TYPEID_PLAYER) + return false; + const SpellInfo* spellInfo = eventInfo.GetDamageInfo()->GetSpellInfo(); + if (!spellInfo) return true; - } - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); + // Death Coil exception, Check if spell is from spellbook + if (spellInfo->Id != SPELL_DK_DEATH_COIL_DAMAGE && !eventInfo.GetActor()->ToPlayer()->HasActiveSpell(spellInfo->Id)) + return false; - Unit* player = eventInfo.GetActor(); - Unit* target = eventInfo.GetActionTarget(); - Unit* dancingRuneWeapon = nullptr; - for (Unit::ControlSet::const_iterator itr = player->m_Controlled.begin(); itr != player->m_Controlled.end(); ++itr) - if (int32((*itr)->GetEntry()) == GetSpellInfo()->Effects[EFFECT_0].MiscValue) - { - dancingRuneWeapon = *itr; - break; - } - - if (!dancingRuneWeapon) - return; + // Can't cast raise dead/ally, death grip, dark command, death pact, death and decay, anti-magic shell + if (spellInfo->SpellFamilyFlags.HasFlag(0x20A1220, 0x10000000, 0x0)) + return false; - dancingRuneWeapon->SetOrientation(dancingRuneWeapon->GetAngle(target)); - if (const SpellInfo* procSpell = eventInfo.GetDamageInfo()->GetSpellInfo()) - { - // xinef: ugly hack - if (!procSpell->IsAffectingArea()) - GetUnitOwner()->SetFloatValue(UNIT_FIELD_COMBATREACH, 10.0f); - dancingRuneWeapon->CastSpell(target, procSpell->Id, true, NULL, aurEff, dancingRuneWeapon->GetGUID()); - GetUnitOwner()->SetFloatValue(UNIT_FIELD_COMBATREACH, 0.01f); - } - else - { - target = player->GetMeleeHitRedirectTarget(target); - CalcDamageInfo damageInfo; - player->CalculateMeleeDamage(target, 0, &damageInfo, eventInfo.GetDamageInfo()->GetAttackType()); - Unit::DealDamageMods(target, damageInfo.damage, &damageInfo.absorb); - damageInfo.attacker = dancingRuneWeapon; - damageInfo.damage /= 2.0f; - dancingRuneWeapon->SendAttackStateUpdate(&damageInfo); - dancingRuneWeapon->DealMeleeDamage(&damageInfo, true); - } - } + // AoE can be cast only once + if (spellInfo->IsTargetingArea() && eventInfo.GetActor() != eventInfo.GetActionTarget()) + return false; - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_dk_dancing_rune_weapon_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_dk_dancing_rune_weapon_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_DUMMY); - } - }; + // No spells with summoning + if (spellInfo->HasEffect(SPELL_EFFECT_SUMMON)) + return false; - AuraScript* GetAuraScript() const - { - return new spell_dk_dancing_rune_weapon_AuraScript(); + // No Positive Spells + if (spellInfo->IsPositive()) + return false; + + return true; } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + Unit* player = eventInfo.GetActor(); + Unit* target = eventInfo.GetActionTarget(); + Unit* dancingRuneWeapon = nullptr; + for (Unit::ControlSet::const_iterator itr = player->m_Controlled.begin(); itr != player->m_Controlled.end(); ++itr) + if (int32((*itr)->GetEntry()) == GetSpellInfo()->Effects[EFFECT_0].MiscValue) + { + dancingRuneWeapon = *itr; + break; + } + + if (!dancingRuneWeapon) + return; + + dancingRuneWeapon->SetOrientation(dancingRuneWeapon->GetAngle(target)); + if (const SpellInfo* procSpell = eventInfo.GetDamageInfo()->GetSpellInfo()) + { + // xinef: ugly hack + if (!procSpell->IsAffectingArea()) + GetUnitOwner()->SetFloatValue(UNIT_FIELD_COMBATREACH, 10.0f); + dancingRuneWeapon->CastSpell(target, procSpell->Id, true, NULL, aurEff, dancingRuneWeapon->GetGUID()); + GetUnitOwner()->SetFloatValue(UNIT_FIELD_COMBATREACH, 0.01f); + } + else + { + target = player->GetMeleeHitRedirectTarget(target); + CalcDamageInfo damageInfo; + player->CalculateMeleeDamage(target, 0, &damageInfo, eventInfo.GetDamageInfo()->GetAttackType()); + Unit::DealDamageMods(target, damageInfo.damage, &damageInfo.absorb); + damageInfo.attacker = dancingRuneWeapon; + damageInfo.damage /= 2.0f; + dancingRuneWeapon->SendAttackStateUpdate(&damageInfo); + dancingRuneWeapon->DealMeleeDamage(&damageInfo, true); + } + } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_dk_dancing_rune_weapon_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_dk_dancing_rune_weapon_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dk_dancing_rune_weapon_AuraScript(); + } }; class spell_dk_dancing_rune_weapon_visual : public SpellScriptLoader { - public: - spell_dk_dancing_rune_weapon_visual() : SpellScriptLoader("spell_dk_dancing_rune_weapon_visual") { } +public: + spell_dk_dancing_rune_weapon_visual() : SpellScriptLoader("spell_dk_dancing_rune_weapon_visual") { } - class spell_dk_dancing_rune_weapon_visual_AuraScript : public AuraScript + class spell_dk_dancing_rune_weapon_visual_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_dancing_rune_weapon_visual_AuraScript); + + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_dk_dancing_rune_weapon_visual_AuraScript); - - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + PreventDefaultAction(); + if (Unit* owner = GetUnitOwner()->ToTempSummon()->GetSummoner()) { - PreventDefaultAction(); - if (Unit* owner = GetUnitOwner()->ToTempSummon()->GetSummoner()) - { - GetUnitOwner()->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, owner->GetUInt32Value(PLAYER_VISIBLE_ITEM_16_ENTRYID)); - GetUnitOwner()->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, owner->GetUInt32Value(PLAYER_VISIBLE_ITEM_17_ENTRYID)); - GetUnitOwner()->SetFloatValue(UNIT_FIELD_COMBATREACH, 0.01f); - } + GetUnitOwner()->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, owner->GetUInt32Value(PLAYER_VISIBLE_ITEM_16_ENTRYID)); + GetUnitOwner()->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, owner->GetUInt32Value(PLAYER_VISIBLE_ITEM_17_ENTRYID)); + GetUnitOwner()->SetFloatValue(UNIT_FIELD_COMBATREACH, 0.01f); } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_dk_dancing_rune_weapon_visual_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dk_dancing_rune_weapon_visual_AuraScript(); } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_dk_dancing_rune_weapon_visual_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dk_dancing_rune_weapon_visual_AuraScript(); + } }; class spell_dk_scent_of_blood_trigger : public SpellScriptLoader { - public: - spell_dk_scent_of_blood_trigger() : SpellScriptLoader("spell_dk_scent_of_blood_trigger") { } +public: + spell_dk_scent_of_blood_trigger() : SpellScriptLoader("spell_dk_scent_of_blood_trigger") { } - class spell_dk_scent_of_blood_trigger_AuraScript : public AuraScript + class spell_dk_scent_of_blood_trigger_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_scent_of_blood_trigger_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_dk_scent_of_blood_trigger_AuraScript); - - bool CheckProc(ProcEventInfo& eventInfo) - { - return (eventInfo.GetHitMask() & (PROC_EX_DODGE|PROC_EX_PARRY)) || eventInfo.GetDamageInfo()->GetDamage(); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_dk_scent_of_blood_trigger_AuraScript::CheckProc); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dk_scent_of_blood_trigger_AuraScript(); + return (eventInfo.GetHitMask() & (PROC_EX_DODGE | PROC_EX_PARRY)) || eventInfo.GetDamageInfo()->GetDamage(); } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_dk_scent_of_blood_trigger_AuraScript::CheckProc); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dk_scent_of_blood_trigger_AuraScript(); + } }; class spell_dk_pet_scaling : public SpellScriptLoader { - public: - spell_dk_pet_scaling() : SpellScriptLoader("spell_dk_pet_scaling") { } +public: + spell_dk_pet_scaling() : SpellScriptLoader("spell_dk_pet_scaling") { } - class spell_dk_pet_scaling_AuraScript : public AuraScript + class spell_dk_pet_scaling_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_pet_scaling_AuraScript); + + void CalculateStatAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) { - PrepareAuraScript(spell_dk_pet_scaling_AuraScript); + Stats stat = Stats(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].MiscValue); - void CalculateStatAmount(AuraEffect const* aurEff, int32 & amount, bool & /*canBeRecalculated*/) + // xinef: dk ghoul inherits 70% of strength and 30% of stamina + if (GetUnitOwner()->GetEntry() != NPC_RISEN_GHOUL) { - Stats stat = Stats(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].MiscValue); + // xinef: ebon garogyle - inherit 30% of stamina + if (GetUnitOwner()->GetEntry() == NPC_EBON_GARGOYLE && stat == STAT_STAMINA) + if (Unit* owner = GetUnitOwner()->GetOwner()) + amount = CalculatePct(std::max(0, owner->GetStat(stat)), 30); + return; + } - // xinef: dk ghoul inherits 70% of strength and 30% of stamina - if (GetUnitOwner()->GetEntry() != NPC_RISEN_GHOUL) + if (Unit* owner = GetUnitOwner()->GetOwner()) + { + int32 modifier = stat == STAT_STRENGTH ? 70 : 30; + + // Check just if owner has Ravenous Dead since it's effect is not an aura + if (AuraEffect const* rdEff = owner->GetAuraEffect(SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, SPELLFAMILY_DEATHKNIGHT, 3010, 0)) { - // xinef: ebon garogyle - inherit 30% of stamina - if (GetUnitOwner()->GetEntry() == NPC_EBON_GARGOYLE && stat == STAT_STAMINA) - if (Unit* owner = GetUnitOwner()->GetOwner()) - amount = CalculatePct(std::max(0, owner->GetStat(stat)), 30); - return; + SpellInfo const* spellInfo = rdEff->GetSpellInfo(); // Then get the SpellProto and add the dummy effect value + AddPct(modifier, spellInfo->Effects[EFFECT_1].CalcValue()); // Ravenous Dead edits the original scale } - if (Unit* owner = GetUnitOwner()->GetOwner()) - { - int32 modifier = stat == STAT_STRENGTH ? 70 : 30; + // xinef: Glyph of the Ghoul + if (AuraEffect const* glyphEff = owner->GetAuraEffect(SPELL_DK_GLYPH_OF_THE_GHOUL, EFFECT_0)) + modifier += glyphEff->GetAmount(); - // Check just if owner has Ravenous Dead since it's effect is not an aura - if (AuraEffect const* rdEff = owner->GetAuraEffect(SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, SPELLFAMILY_DEATHKNIGHT, 3010, 0)) - { - SpellInfo const* spellInfo = rdEff->GetSpellInfo(); // Then get the SpellProto and add the dummy effect value - AddPct(modifier, spellInfo->Effects[EFFECT_1].CalcValue()); // Ravenous Dead edits the original scale - } - - // xinef: Glyph of the Ghoul - if (AuraEffect const* glyphEff = owner->GetAuraEffect(SPELL_DK_GLYPH_OF_THE_GHOUL, EFFECT_0)) - modifier += glyphEff->GetAmount(); - - amount = CalculatePct(std::max(0, owner->GetStat(stat)), modifier); - } + amount = CalculatePct(std::max(0, owner->GetStat(stat)), modifier); } - - void CalculateSPAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - // xinef: dk gargoyle inherits 33% of SP - if (GetUnitOwner()->GetEntry() != NPC_EBON_GARGOYLE) - return; - - if (Unit* owner = GetUnitOwner()->GetOwner()) - { - int32 modifier = 33; - - // xinef: impurity - if (owner->GetDummyAuraEffect(SPELLFAMILY_DEATHKNIGHT, 1986, 0)) - modifier = 40; - - amount = CalculatePct(std::max(0, owner->GetTotalAttackPowerValue(BASE_ATTACK)), modifier); - - // xinef: Update appropriate player field - if (owner->GetTypeId() == TYPEID_PLAYER) - owner->SetUInt32Value(PLAYER_PET_SPELL_POWER, (uint32)amount); - } - } - - void CalculateHasteAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - // xinef: scale haste with owners melee haste - if (Unit* owner = GetUnitOwner()->GetOwner()) - if (owner->m_modAttackSpeedPct[BASE_ATTACK] < 1.0f) // inherit haste only - amount = std::min(100, int32(((1.0f / owner->m_modAttackSpeedPct[BASE_ATTACK]) - 1.0f) * 100.0f)); - } - - void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - if (aurEff->GetAuraType() != SPELL_AURA_MELEE_SLOW) - return; - - GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK, true, SPELL_BLOCK_TYPE_POSITIVE); - GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_MELEE_RANGED_HASTE, true, SPELL_BLOCK_TYPE_POSITIVE); - GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MELEE_SLOW, true, SPELL_BLOCK_TYPE_POSITIVE); - - if (GetUnitOwner()->IsPet()) - return; - - GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_STAT, true, SPELL_BLOCK_TYPE_POSITIVE); - GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, true, SPELL_BLOCK_TYPE_POSITIVE); - GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_ATTACK_POWER, true, SPELL_BLOCK_TYPE_POSITIVE); - GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_ATTACK_POWER_PCT, true, SPELL_BLOCK_TYPE_POSITIVE); - } - - void CalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude) - { - if (!GetUnitOwner()->IsPet()) - return; - - isPeriodic = true; - amplitude = 2*IN_MILLISECONDS; - } - - void HandlePeriodic(AuraEffect const* aurEff) - { - PreventDefaultAction(); - if (aurEff->GetAuraType() == SPELL_AURA_MOD_STAT && (aurEff->GetMiscValue() == STAT_STAMINA || aurEff->GetMiscValue() == STAT_INTELLECT)) - { - int32 currentAmount = aurEff->GetAmount(); - int32 newAmount = GetEffect(aurEff->GetEffIndex())->CalculateAmount(GetCaster()); - if (newAmount != currentAmount) - { - if (aurEff->GetMiscValue() == STAT_STAMINA) - { - uint32 actStat = GetUnitOwner()->GetHealth(); - GetEffect(aurEff->GetEffIndex())->ChangeAmount(newAmount, false); - GetUnitOwner()->SetHealth(std::min(GetUnitOwner()->GetMaxHealth(), actStat)); - } - else - { - uint32 actStat = GetUnitOwner()->GetPower(POWER_MANA); - GetEffect(aurEff->GetEffIndex())->ChangeAmount(newAmount, false); - GetUnitOwner()->SetPower(POWER_MANA, std::min(GetUnitOwner()->GetMaxPower(POWER_MANA), actStat)); - } - } - } - else - GetEffect(aurEff->GetEffIndex())->RecalculateAmount(); - } - - void Register() - { - if (m_scriptSpellId == 54566) - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_pet_scaling_AuraScript::CalculateStatAmount, EFFECT_ALL, SPELL_AURA_MOD_STAT); - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_pet_scaling_AuraScript::CalculateSPAmount, EFFECT_ALL, SPELL_AURA_MOD_DAMAGE_DONE); - } - - if (m_scriptSpellId == 51996) - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_pet_scaling_AuraScript::CalculateHasteAmount, EFFECT_ALL, SPELL_AURA_MELEE_SLOW); - - OnEffectApply += AuraEffectApplyFn(spell_dk_pet_scaling_AuraScript::HandleEffectApply, EFFECT_ALL, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); - DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_dk_pet_scaling_AuraScript::CalcPeriodic, EFFECT_ALL, SPELL_AURA_ANY); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_dk_pet_scaling_AuraScript::HandlePeriodic, EFFECT_ALL, SPELL_AURA_ANY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dk_pet_scaling_AuraScript(); } + + void CalculateSPAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + // xinef: dk gargoyle inherits 33% of SP + if (GetUnitOwner()->GetEntry() != NPC_EBON_GARGOYLE) + return; + + if (Unit* owner = GetUnitOwner()->GetOwner()) + { + int32 modifier = 33; + + // xinef: impurity + if (owner->GetDummyAuraEffect(SPELLFAMILY_DEATHKNIGHT, 1986, 0)) + modifier = 40; + + amount = CalculatePct(std::max(0, owner->GetTotalAttackPowerValue(BASE_ATTACK)), modifier); + + // xinef: Update appropriate player field + if (owner->GetTypeId() == TYPEID_PLAYER) + owner->SetUInt32Value(PLAYER_PET_SPELL_POWER, (uint32)amount); + } + } + + void CalculateHasteAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + // xinef: scale haste with owners melee haste + if (Unit* owner = GetUnitOwner()->GetOwner()) + if (owner->m_modAttackSpeedPct[BASE_ATTACK] < 1.0f) // inherit haste only + amount = std::min(100, int32(((1.0f / owner->m_modAttackSpeedPct[BASE_ATTACK]) - 1.0f) * 100.0f)); + } + + void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + if (aurEff->GetAuraType() != SPELL_AURA_MELEE_SLOW) + return; + + GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK, true, SPELL_BLOCK_TYPE_POSITIVE); + GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_MELEE_RANGED_HASTE, true, SPELL_BLOCK_TYPE_POSITIVE); + GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MELEE_SLOW, true, SPELL_BLOCK_TYPE_POSITIVE); + + if (GetUnitOwner()->IsPet()) + return; + + GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_STAT, true, SPELL_BLOCK_TYPE_POSITIVE); + GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, true, SPELL_BLOCK_TYPE_POSITIVE); + GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_ATTACK_POWER, true, SPELL_BLOCK_TYPE_POSITIVE); + GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_ATTACK_POWER_PCT, true, SPELL_BLOCK_TYPE_POSITIVE); + } + + void CalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude) + { + if (!GetUnitOwner()->IsPet()) + return; + + isPeriodic = true; + amplitude = 2 * IN_MILLISECONDS; + } + + void HandlePeriodic(AuraEffect const* aurEff) + { + PreventDefaultAction(); + if (aurEff->GetAuraType() == SPELL_AURA_MOD_STAT && (aurEff->GetMiscValue() == STAT_STAMINA || aurEff->GetMiscValue() == STAT_INTELLECT)) + { + int32 currentAmount = aurEff->GetAmount(); + int32 newAmount = GetEffect(aurEff->GetEffIndex())->CalculateAmount(GetCaster()); + if (newAmount != currentAmount) + { + if (aurEff->GetMiscValue() == STAT_STAMINA) + { + uint32 actStat = GetUnitOwner()->GetHealth(); + GetEffect(aurEff->GetEffIndex())->ChangeAmount(newAmount, false); + GetUnitOwner()->SetHealth(std::min(GetUnitOwner()->GetMaxHealth(), actStat)); + } + else + { + uint32 actStat = GetUnitOwner()->GetPower(POWER_MANA); + GetEffect(aurEff->GetEffIndex())->ChangeAmount(newAmount, false); + GetUnitOwner()->SetPower(POWER_MANA, std::min(GetUnitOwner()->GetMaxPower(POWER_MANA), actStat)); + } + } + } + else + GetEffect(aurEff->GetEffIndex())->RecalculateAmount(); + } + + void Register() + { + if (m_scriptSpellId == 54566) + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_pet_scaling_AuraScript::CalculateStatAmount, EFFECT_ALL, SPELL_AURA_MOD_STAT); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_pet_scaling_AuraScript::CalculateSPAmount, EFFECT_ALL, SPELL_AURA_MOD_DAMAGE_DONE); + } + + if (m_scriptSpellId == 51996) + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_pet_scaling_AuraScript::CalculateHasteAmount, EFFECT_ALL, SPELL_AURA_MELEE_SLOW); + + OnEffectApply += AuraEffectApplyFn(spell_dk_pet_scaling_AuraScript::HandleEffectApply, EFFECT_ALL, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); + DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_dk_pet_scaling_AuraScript::CalcPeriodic, EFFECT_ALL, SPELL_AURA_ANY); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_dk_pet_scaling_AuraScript::HandlePeriodic, EFFECT_ALL, SPELL_AURA_ANY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dk_pet_scaling_AuraScript(); + } }; @@ -1038,266 +1038,266 @@ class spell_dk_pet_scaling : public SpellScriptLoader // 50462 - Anti-Magic Shell (on raid member) class spell_dk_anti_magic_shell_raid : public SpellScriptLoader { - public: - spell_dk_anti_magic_shell_raid() : SpellScriptLoader("spell_dk_anti_magic_shell_raid") { } +public: + spell_dk_anti_magic_shell_raid() : SpellScriptLoader("spell_dk_anti_magic_shell_raid") { } - class spell_dk_anti_magic_shell_raid_AuraScript : public AuraScript + class spell_dk_anti_magic_shell_raid_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_anti_magic_shell_raid_AuraScript); + + uint32 absorbPct; + + bool Load() { - PrepareAuraScript(spell_dk_anti_magic_shell_raid_AuraScript); - - uint32 absorbPct; - - bool Load() - { - absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); - return true; - } - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - // TODO: this should absorb limited amount of damage, but no info on calculation formula - amount = -1; - } - - void Absorb(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount) - { - absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct); - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_anti_magic_shell_raid_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); - OnEffectAbsorb += AuraEffectAbsorbFn(spell_dk_anti_magic_shell_raid_AuraScript::Absorb, EFFECT_0); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dk_anti_magic_shell_raid_AuraScript(); + absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); + return true; } + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + // TODO: this should absorb limited amount of damage, but no info on calculation formula + amount = -1; + } + + void Absorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount) + { + absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct); + } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_anti_magic_shell_raid_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); + OnEffectAbsorb += AuraEffectAbsorbFn(spell_dk_anti_magic_shell_raid_AuraScript::Absorb, EFFECT_0); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dk_anti_magic_shell_raid_AuraScript(); + } }; // 48707 - Anti-Magic Shell (on self) class spell_dk_anti_magic_shell_self : public SpellScriptLoader { - public: - spell_dk_anti_magic_shell_self() : SpellScriptLoader("spell_dk_anti_magic_shell_self") { } +public: + spell_dk_anti_magic_shell_self() : SpellScriptLoader("spell_dk_anti_magic_shell_self") { } - class spell_dk_anti_magic_shell_self_AuraScript : public AuraScript + class spell_dk_anti_magic_shell_self_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_anti_magic_shell_self_AuraScript); + + uint32 absorbPct, hpPct; + bool Load() { - PrepareAuraScript(spell_dk_anti_magic_shell_self_AuraScript); - - uint32 absorbPct, hpPct; - bool Load() - { - absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); - hpPct = GetSpellInfo()->Effects[EFFECT_1].CalcValue(GetCaster()); - return true; - } - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_DK_RUNIC_POWER_ENERGIZE)) - return false; - return true; - } - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - amount = GetCaster()->CountPctFromMaxHealth(hpPct); - } - - void Absorb(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount) - { - absorbAmount = std::min(CalculatePct(dmgInfo.GetDamage(), absorbPct), GetTarget()->CountPctFromMaxHealth(hpPct)); - } - - void Trigger(AuraEffect* aurEff, DamageInfo& /*dmgInfo*/, uint32& absorbAmount) - { - // damage absorbed by Anti-Magic Shell energizes the DK with additional runic power. - // This, if I'm not mistaken, shows that we get back ~20% of the absorbed damage as runic power. - int32 bp = CalculatePct(absorbAmount, 20); - GetTarget()->CastCustomSpell(SPELL_DK_RUNIC_POWER_ENERGIZE, SPELLVALUE_BASE_POINT0, bp, GetTarget(), true, NULL, aurEff); - } - - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - target->ApplySpellImmune(GetId(), IMMUNITY_ID, 33786, true); // cyclone - } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - target->ApplySpellImmune(GetId(), IMMUNITY_ID, 33786, false); // cyclone - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_anti_magic_shell_self_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); - OnEffectAbsorb += AuraEffectAbsorbFn(spell_dk_anti_magic_shell_self_AuraScript::Absorb, EFFECT_0); - AfterEffectAbsorb += AuraEffectAbsorbFn(spell_dk_anti_magic_shell_self_AuraScript::Trigger, EFFECT_0); - - OnEffectApply += AuraEffectApplyFn(spell_dk_anti_magic_shell_self_AuraScript::HandleEffectApply, EFFECT_1, SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_dk_anti_magic_shell_self_AuraScript::HandleEffectRemove, EFFECT_1, SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dk_anti_magic_shell_self_AuraScript(); + absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); + hpPct = GetSpellInfo()->Effects[EFFECT_1].CalcValue(GetCaster()); + return true; } + + bool Validate(SpellInfo const* /*spellInfo*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_DK_RUNIC_POWER_ENERGIZE)) + return false; + return true; + } + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + amount = GetCaster()->CountPctFromMaxHealth(hpPct); + } + + void Absorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount) + { + absorbAmount = std::min(CalculatePct(dmgInfo.GetDamage(), absorbPct), GetTarget()->CountPctFromMaxHealth(hpPct)); + } + + void Trigger(AuraEffect* aurEff, DamageInfo& /*dmgInfo*/, uint32& absorbAmount) + { + // damage absorbed by Anti-Magic Shell energizes the DK with additional runic power. + // This, if I'm not mistaken, shows that we get back ~20% of the absorbed damage as runic power. + int32 bp = CalculatePct(absorbAmount, 20); + GetTarget()->CastCustomSpell(SPELL_DK_RUNIC_POWER_ENERGIZE, SPELLVALUE_BASE_POINT0, bp, GetTarget(), true, NULL, aurEff); + } + + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + target->ApplySpellImmune(GetId(), IMMUNITY_ID, 33786, true); // cyclone + } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + target->ApplySpellImmune(GetId(), IMMUNITY_ID, 33786, false); // cyclone + } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_anti_magic_shell_self_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); + OnEffectAbsorb += AuraEffectAbsorbFn(spell_dk_anti_magic_shell_self_AuraScript::Absorb, EFFECT_0); + AfterEffectAbsorb += AuraEffectAbsorbFn(spell_dk_anti_magic_shell_self_AuraScript::Trigger, EFFECT_0); + + OnEffectApply += AuraEffectApplyFn(spell_dk_anti_magic_shell_self_AuraScript::HandleEffectApply, EFFECT_1, SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_dk_anti_magic_shell_self_AuraScript::HandleEffectRemove, EFFECT_1, SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dk_anti_magic_shell_self_AuraScript(); + } }; // 50461 - Anti-Magic Zone class spell_dk_anti_magic_zone : public SpellScriptLoader { - public: - spell_dk_anti_magic_zone() : SpellScriptLoader("spell_dk_anti_magic_zone") { } +public: + spell_dk_anti_magic_zone() : SpellScriptLoader("spell_dk_anti_magic_zone") { } - class spell_dk_anti_magic_zone_AuraScript : public AuraScript + class spell_dk_anti_magic_zone_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_anti_magic_zone_AuraScript); + + uint32 absorbPct; + + bool Load() { - PrepareAuraScript(spell_dk_anti_magic_zone_AuraScript); - - uint32 absorbPct; - - bool Load() - { - absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); - return true; - } - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_DK_ANTI_MAGIC_SHELL_TALENT)) - return false; - return true; - } - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & canBeRecalculated) - { - SpellInfo const* talentSpell = sSpellMgr->GetSpellInfo(SPELL_DK_ANTI_MAGIC_SHELL_TALENT); - amount = talentSpell->Effects[EFFECT_0].CalcValue(GetCaster()); - if (Unit* totem = GetCaster()) - if (Unit* owner = totem->ToTotem()->GetSummoner()) - amount += int32(2 * owner->GetTotalAttackPowerValue(BASE_ATTACK)); - canBeRecalculated = false; - } - - void Absorb(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount) - { - absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct); - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_anti_magic_zone_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); - OnEffectAbsorb += AuraEffectAbsorbFn(spell_dk_anti_magic_zone_AuraScript::Absorb, EFFECT_0); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dk_anti_magic_zone_AuraScript(); + absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); + return true; } + + bool Validate(SpellInfo const* /*spellInfo*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_DK_ANTI_MAGIC_SHELL_TALENT)) + return false; + return true; + } + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) + { + SpellInfo const* talentSpell = sSpellMgr->GetSpellInfo(SPELL_DK_ANTI_MAGIC_SHELL_TALENT); + amount = talentSpell->Effects[EFFECT_0].CalcValue(GetCaster()); + if (Unit* totem = GetCaster()) + if (Unit* owner = totem->ToTotem()->GetSummoner()) + amount += int32(2 * owner->GetTotalAttackPowerValue(BASE_ATTACK)); + canBeRecalculated = false; + } + + void Absorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount) + { + absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct); + } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_anti_magic_zone_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); + OnEffectAbsorb += AuraEffectAbsorbFn(spell_dk_anti_magic_zone_AuraScript::Absorb, EFFECT_0); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dk_anti_magic_zone_AuraScript(); + } }; // 48721 - Blood Boil class spell_dk_blood_boil : public SpellScriptLoader { - public: - spell_dk_blood_boil() : SpellScriptLoader("spell_dk_blood_boil") { } +public: + spell_dk_blood_boil() : SpellScriptLoader("spell_dk_blood_boil") { } - class spell_dk_blood_boil_SpellScript : public SpellScript + class spell_dk_blood_boil_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dk_blood_boil_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_dk_blood_boil_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_DK_BLOOD_BOIL_TRIGGERED)) - return false; - return true; - } - - bool Load() - { - _executed = false; - return GetCaster()->GetTypeId() == TYPEID_PLAYER && GetCaster()->getClass() == CLASS_DEATH_KNIGHT; - } - - void HandleAfterHit() - { - if (_executed || !GetHitUnit()) - return; - - _executed = true; - GetCaster()->CastSpell(GetCaster(), SPELL_DK_BLOOD_BOIL_TRIGGERED, true); - } - - void Register() - { - AfterHit += SpellHitFn(spell_dk_blood_boil_SpellScript::HandleAfterHit); - } - - bool _executed; - }; - - SpellScript* GetSpellScript() const - { - return new spell_dk_blood_boil_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_DK_BLOOD_BOIL_TRIGGERED)) + return false; + return true; } + + bool Load() + { + _executed = false; + return GetCaster()->GetTypeId() == TYPEID_PLAYER && GetCaster()->getClass() == CLASS_DEATH_KNIGHT; + } + + void HandleAfterHit() + { + if (_executed || !GetHitUnit()) + return; + + _executed = true; + GetCaster()->CastSpell(GetCaster(), SPELL_DK_BLOOD_BOIL_TRIGGERED, true); + } + + void Register() + { + AfterHit += SpellHitFn(spell_dk_blood_boil_SpellScript::HandleAfterHit); + } + + bool _executed; + }; + + SpellScript* GetSpellScript() const + { + return new spell_dk_blood_boil_SpellScript(); + } }; // 50453 - Bloodworms Health Leech class spell_dk_blood_gorged : public SpellScriptLoader { - public: - spell_dk_blood_gorged() : SpellScriptLoader("spell_dk_blood_gorged") { } +public: + spell_dk_blood_gorged() : SpellScriptLoader("spell_dk_blood_gorged") { } - class spell_dk_blood_gorged_AuraScript : public AuraScript + class spell_dk_blood_gorged_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_blood_gorged_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_dk_blood_gorged_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_DK_BLOOD_GORGED_HEAL)) - return false; - return true; - } - - bool Load() - { - _procTarget = nullptr; - return true; - } - - bool CheckProc(ProcEventInfo& /*eventInfo*/) - { - _procTarget = GetTarget()->GetOwner(); - return _procTarget; - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - int32 bp = int32(eventInfo.GetDamageInfo()->GetDamage() * 1.5f); - GetTarget()->CastCustomSpell(SPELL_DK_BLOOD_GORGED_HEAL, SPELLVALUE_BASE_POINT0, bp, _procTarget, true, NULL, aurEff); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_dk_blood_gorged_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_dk_blood_gorged_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - - private: - Unit* _procTarget; - }; - - AuraScript* GetAuraScript() const - { - return new spell_dk_blood_gorged_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_DK_BLOOD_GORGED_HEAL)) + return false; + return true; } + + bool Load() + { + _procTarget = nullptr; + return true; + } + + bool CheckProc(ProcEventInfo& /*eventInfo*/) + { + _procTarget = GetTarget()->GetOwner(); + return _procTarget; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + int32 bp = int32(eventInfo.GetDamageInfo()->GetDamage() * 1.5f); + GetTarget()->CastCustomSpell(SPELL_DK_BLOOD_GORGED_HEAL, SPELLVALUE_BASE_POINT0, bp, _procTarget, true, NULL, aurEff); + } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_dk_blood_gorged_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_dk_blood_gorged_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + + private: + Unit* _procTarget; + }; + + AuraScript* GetAuraScript() const + { + return new spell_dk_blood_gorged_AuraScript(); + } }; class CorpseExplosionCheck @@ -1310,8 +1310,8 @@ public: if (Unit* target = obj->ToUnit()) { if ((target->isDead() || (_allowGhoul && target->GetEntry() == NPC_DK_GHOUL && target->GetOwnerGUID() == _casterGUID)) - && !(target->GetCreatureTypeMask() & CREATURE_TYPEMASK_MECHANICAL_OR_ELEMENTAL) - && target->GetDisplayId() == target->GetNativeDisplayId()) + && !(target->GetCreatureTypeMask() & CREATURE_TYPEMASK_MECHANICAL_OR_ELEMENTAL) + && target->GetDisplayId() == target->GetNativeDisplayId()) return false; } @@ -1326,246 +1326,246 @@ private: // 49158 - Corpse Explosion (51325, 51326, 51327, 51328) class spell_dk_corpse_explosion : public SpellScriptLoader { - public: - spell_dk_corpse_explosion() : SpellScriptLoader("spell_dk_corpse_explosion") { } +public: + spell_dk_corpse_explosion() : SpellScriptLoader("spell_dk_corpse_explosion") { } - class spell_dk_corpse_explosion_SpellScript : public SpellScript + class spell_dk_corpse_explosion_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dk_corpse_explosion_SpellScript); + + bool Validate(SpellInfo const* spellInfo) { - PrepareSpellScript(spell_dk_corpse_explosion_SpellScript); - - bool Validate(SpellInfo const* spellInfo) - { - if (!sSpellMgr->GetSpellInfo(SPELL_DK_CORPSE_EXPLOSION_TRIGGERED) + if (!sSpellMgr->GetSpellInfo(SPELL_DK_CORPSE_EXPLOSION_TRIGGERED) || !sSpellMgr->GetSpellInfo(SPELL_DK_GHOUL_EXPLODE) || !sSpellMgr->GetSpellInfo(SPELL_DK_CORPSE_EXPLOSION_VISUAL) || !sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_1].CalcValue())) - return false; - return true; - } - - bool Load() - { - _target = nullptr; - return true; - } - - void CheckTarget(WorldObject*& target) - { - if (CorpseExplosionCheck(GetCaster()->GetGUID(), true)(target)) - target = nullptr; - - _target = target; - } - - void CheckTargets(std::list& targets) - { - WorldObject* target = _target; - if (!target) - { - targets.remove_if(CorpseExplosionCheck(GetCaster()->GetGUID(), false)); - if (targets.empty()) - { - FinishCast(SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW); - return; - } - target = acore::Containers::SelectRandomContainerElement(targets); - targets.clear(); - targets.push_back(target); - } - else - targets.clear(); - } - - void HandleDamage(SpellEffIndex effIndex, Unit* target) - { - if (effIndex == EFFECT_0) - GetCaster()->CastCustomSpell(GetSpellInfo()->Effects[EFFECT_1].CalcValue(), SPELLVALUE_BASE_POINT0, GetEffectValue(), target, true); - else if (effIndex == EFFECT_1) - GetCaster()->CastCustomSpell(GetEffectValue(), SPELLVALUE_BASE_POINT0, GetSpell()->CalculateSpellDamage(EFFECT_0, nullptr), target, true); - } - - void HandleCorpseExplosion(SpellEffIndex effIndex) - { - if (Unit* unitTarget = GetHitUnit()) - { - if (unitTarget->IsAlive()) // Living ghoul as a target - { - unitTarget->ToCreature()->m_CreatureSpellCooldowns.clear(); - if (CharmInfo* charmInfo = unitTarget->GetCharmInfo()) - charmInfo->GetGlobalCooldownMgr().CancelGlobalCooldown(sSpellMgr->GetSpellInfo(SPELL_DK_GHOUL_EXPLODE)); - - unitTarget->StopMoving(); - unitTarget->CastSpell(unitTarget, SPELL_DK_GHOUL_EXPLODE, false); - // Corpse Explosion (Suicide) and Set corpse look handled in SpellScript of SPELL_DK_GHOUL_EXPLODE - } - else // Some corpse - { - HandleDamage(effIndex, unitTarget); - // Corpse Explosion (Suicide) - unitTarget->CastSpell(unitTarget, SPELL_DK_CORPSE_EXPLOSION_TRIGGERED, true); - // Set corpse look - GetCaster()->CastSpell(unitTarget, SPELL_DK_CORPSE_EXPLOSION_VISUAL, true); - } - } - } - - void Register() - { - OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_dk_corpse_explosion_SpellScript::CheckTarget, EFFECT_0, TARGET_UNIT_TARGET_ANY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dk_corpse_explosion_SpellScript::CheckTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ENTRY); - OnEffectHitTarget += SpellEffectFn(spell_dk_corpse_explosion_SpellScript::HandleCorpseExplosion, EFFECT_0, SPELL_EFFECT_DUMMY); - OnEffectHitTarget += SpellEffectFn(spell_dk_corpse_explosion_SpellScript::HandleCorpseExplosion, EFFECT_1, SPELL_EFFECT_DUMMY); - } - - private: - WorldObject* _target; - }; - - SpellScript* GetSpellScript() const - { - return new spell_dk_corpse_explosion_SpellScript(); + return false; + return true; } + + bool Load() + { + _target = nullptr; + return true; + } + + void CheckTarget(WorldObject*& target) + { + if (CorpseExplosionCheck(GetCaster()->GetGUID(), true)(target)) + target = nullptr; + + _target = target; + } + + void CheckTargets(std::list& targets) + { + WorldObject* target = _target; + if (!target) + { + targets.remove_if(CorpseExplosionCheck(GetCaster()->GetGUID(), false)); + if (targets.empty()) + { + FinishCast(SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW); + return; + } + target = acore::Containers::SelectRandomContainerElement(targets); + targets.clear(); + targets.push_back(target); + } + else + targets.clear(); + } + + void HandleDamage(SpellEffIndex effIndex, Unit* target) + { + if (effIndex == EFFECT_0) + GetCaster()->CastCustomSpell(GetSpellInfo()->Effects[EFFECT_1].CalcValue(), SPELLVALUE_BASE_POINT0, GetEffectValue(), target, true); + else if (effIndex == EFFECT_1) + GetCaster()->CastCustomSpell(GetEffectValue(), SPELLVALUE_BASE_POINT0, GetSpell()->CalculateSpellDamage(EFFECT_0, nullptr), target, true); + } + + void HandleCorpseExplosion(SpellEffIndex effIndex) + { + if (Unit* unitTarget = GetHitUnit()) + { + if (unitTarget->IsAlive()) // Living ghoul as a target + { + unitTarget->ToCreature()->m_CreatureSpellCooldowns.clear(); + if (CharmInfo* charmInfo = unitTarget->GetCharmInfo()) + charmInfo->GetGlobalCooldownMgr().CancelGlobalCooldown(sSpellMgr->GetSpellInfo(SPELL_DK_GHOUL_EXPLODE)); + + unitTarget->StopMoving(); + unitTarget->CastSpell(unitTarget, SPELL_DK_GHOUL_EXPLODE, false); + // Corpse Explosion (Suicide) and Set corpse look handled in SpellScript of SPELL_DK_GHOUL_EXPLODE + } + else // Some corpse + { + HandleDamage(effIndex, unitTarget); + // Corpse Explosion (Suicide) + unitTarget->CastSpell(unitTarget, SPELL_DK_CORPSE_EXPLOSION_TRIGGERED, true); + // Set corpse look + GetCaster()->CastSpell(unitTarget, SPELL_DK_CORPSE_EXPLOSION_VISUAL, true); + } + } + } + + void Register() + { + OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_dk_corpse_explosion_SpellScript::CheckTarget, EFFECT_0, TARGET_UNIT_TARGET_ANY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dk_corpse_explosion_SpellScript::CheckTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ENTRY); + OnEffectHitTarget += SpellEffectFn(spell_dk_corpse_explosion_SpellScript::HandleCorpseExplosion, EFFECT_0, SPELL_EFFECT_DUMMY); + OnEffectHitTarget += SpellEffectFn(spell_dk_corpse_explosion_SpellScript::HandleCorpseExplosion, EFFECT_1, SPELL_EFFECT_DUMMY); + } + + private: + WorldObject* _target; + }; + + SpellScript* GetSpellScript() const + { + return new spell_dk_corpse_explosion_SpellScript(); + } }; // -47541, 52375, 59134, -62900 - Death Coil class spell_dk_death_coil : public SpellScriptLoader { - public: - spell_dk_death_coil() : SpellScriptLoader("spell_dk_death_coil") { } +public: + spell_dk_death_coil() : SpellScriptLoader("spell_dk_death_coil") { } - class spell_dk_death_coil_SpellScript : public SpellScript + class spell_dk_death_coil_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dk_death_coil_SpellScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareSpellScript(spell_dk_death_coil_SpellScript); + if (!sSpellMgr->GetSpellInfo(SPELL_DK_DEATH_COIL_DAMAGE) || !sSpellMgr->GetSpellInfo(SPELL_DK_DEATH_COIL_HEAL)) + return false; + return true; + } - bool Validate(SpellInfo const* /*spell*/) + void HandleDummy(SpellEffIndex /*effIndex*/) + { + int32 damage = GetEffectValue(); + Unit* caster = GetCaster(); + if (Unit* target = GetHitUnit()) { - if (!sSpellMgr->GetSpellInfo(SPELL_DK_DEATH_COIL_DAMAGE) || !sSpellMgr->GetSpellInfo(SPELL_DK_DEATH_COIL_HEAL)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - int32 damage = GetEffectValue(); - Unit* caster = GetCaster(); - if (Unit* target = GetHitUnit()) + if (caster->IsFriendlyTo(target)) { - if (caster->IsFriendlyTo(target)) - { - int32 bp = int32(damage * 1.5f); - caster->CastCustomSpell(target, SPELL_DK_DEATH_COIL_HEAL, &bp, nullptr, nullptr, true); - } - else - { - if (AuraEffect const* auraEffect = caster->GetAuraEffect(SPELL_DK_ITEM_SIGIL_VENGEFUL_HEART, EFFECT_1)) - damage += auraEffect->GetBaseAmount(); - caster->CastCustomSpell(target, SPELL_DK_DEATH_COIL_DAMAGE, &damage, nullptr, nullptr, true); - } - } - } - - SpellCastResult CheckCast() - { - Unit* caster = GetCaster(); - if (Unit* target = GetExplTargetUnit()) - { - if (!caster->IsFriendlyTo(target) && !caster->isInFront(target)) - return SPELL_FAILED_UNIT_NOT_INFRONT; - - if (target->IsFriendlyTo(caster) && target->GetCreatureType() != CREATURE_TYPE_UNDEAD) - return SPELL_FAILED_BAD_TARGETS; + int32 bp = int32(damage * 1.5f); + caster->CastCustomSpell(target, SPELL_DK_DEATH_COIL_HEAL, &bp, nullptr, nullptr, true); } else - return SPELL_FAILED_BAD_TARGETS; - - return SPELL_CAST_OK; + { + if (AuraEffect const* auraEffect = caster->GetAuraEffect(SPELL_DK_ITEM_SIGIL_VENGEFUL_HEART, EFFECT_1)) + damage += auraEffect->GetBaseAmount(); + caster->CastCustomSpell(target, SPELL_DK_DEATH_COIL_DAMAGE, &damage, nullptr, nullptr, true); + } } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_dk_death_coil_SpellScript::CheckCast); - OnEffectHitTarget += SpellEffectFn(spell_dk_death_coil_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dk_death_coil_SpellScript(); } + + SpellCastResult CheckCast() + { + Unit* caster = GetCaster(); + if (Unit* target = GetExplTargetUnit()) + { + if (!caster->IsFriendlyTo(target) && !caster->isInFront(target)) + return SPELL_FAILED_UNIT_NOT_INFRONT; + + if (target->IsFriendlyTo(caster) && target->GetCreatureType() != CREATURE_TYPE_UNDEAD) + return SPELL_FAILED_BAD_TARGETS; + } + else + return SPELL_FAILED_BAD_TARGETS; + + return SPELL_CAST_OK; + } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_dk_death_coil_SpellScript::CheckCast); + OnEffectHitTarget += SpellEffectFn(spell_dk_death_coil_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dk_death_coil_SpellScript(); + } }; // 52751 - Death Gate class spell_dk_death_gate : public SpellScriptLoader { - public: - spell_dk_death_gate() : SpellScriptLoader("spell_dk_death_gate") { } +public: + spell_dk_death_gate() : SpellScriptLoader("spell_dk_death_gate") { } - class spell_dk_death_gate_SpellScript : public SpellScript + class spell_dk_death_gate_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dk_death_gate_SpellScript); + + SpellCastResult CheckClass() { - PrepareSpellScript(spell_dk_death_gate_SpellScript); - - SpellCastResult CheckClass() + if (GetCaster()->getClass() != CLASS_DEATH_KNIGHT) { - if (GetCaster()->getClass() != CLASS_DEATH_KNIGHT) - { - SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_MUST_BE_DEATH_KNIGHT); - return SPELL_FAILED_CUSTOM_ERROR; - } - - return SPELL_CAST_OK; + SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_MUST_BE_DEATH_KNIGHT); + return SPELL_FAILED_CUSTOM_ERROR; } - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - target->CastSpell(target, GetEffectValue(), false); - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_dk_death_gate_SpellScript::CheckClass); - OnEffectHitTarget += SpellEffectFn(spell_dk_death_gate_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dk_death_gate_SpellScript(); + return SPELL_CAST_OK; } + + void HandleScript(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) + target->CastSpell(target, GetEffectValue(), false); + } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_dk_death_gate_SpellScript::CheckClass); + OnEffectHitTarget += SpellEffectFn(spell_dk_death_gate_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dk_death_gate_SpellScript(); + } }; // 49560 - Death Grip class spell_dk_death_grip : public SpellScriptLoader { - public: - spell_dk_death_grip() : SpellScriptLoader("spell_dk_death_grip") { } +public: + spell_dk_death_grip() : SpellScriptLoader("spell_dk_death_grip") { } - class spell_dk_death_grip_SpellScript : public SpellScript + class spell_dk_death_grip_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dk_death_grip_SpellScript); + + SpellCastResult CheckCast() { - PrepareSpellScript(spell_dk_death_grip_SpellScript); + Unit* caster = GetCaster(); + Unit* target = GetExplTargetUnit(); - SpellCastResult CheckCast() + if (target->GetTypeId() == TYPEID_PLAYER && caster->GetExactDist(target) < 8.0f) // xinef: should be 8.0f, but we have to add target size (1.5f) + return SPELL_FAILED_TOO_CLOSE; + + if (caster->HasUnitState(UNIT_STATE_JUMPING) || caster->HasUnitMovementFlag(MOVEMENTFLAG_FALLING)) + return SPELL_FAILED_MOVING; + + return SPELL_CAST_OK; + } + + uint32 EntryCheck(uint32 entry) + { + Creature* targetCreature = GetHitCreature(); + + switch (targetCreature->GetEntry()) { - Unit* caster = GetCaster(); - Unit* target = GetExplTargetUnit(); - - if (target->GetTypeId() == TYPEID_PLAYER && caster->GetExactDist(target) < 8.0f) // xinef: should be 8.0f, but we have to add target size (1.5f) - return SPELL_FAILED_TOO_CLOSE; - - if (caster->HasUnitState(UNIT_STATE_JUMPING) || caster->HasUnitMovementFlag(MOVEMENTFLAG_FALLING)) - return SPELL_FAILED_MOVING; - - return SPELL_CAST_OK; - } - - uint32 EntryCheck(uint32 entry) - { - Creature* targetCreature = GetHitCreature(); - - switch (targetCreature->GetEntry()) - { - //Alliance Faction Champions + //Alliance Faction Champions case 34461: case 34460: case 34469: @@ -1581,7 +1581,7 @@ class spell_dk_death_grip : public SpellScriptLoader case 34474: case 34475: - //Horde Faction Champions + //Horde Faction Champions case 34458: case 34451: case 34459: @@ -1598,471 +1598,471 @@ class spell_dk_death_grip : public SpellScriptLoader case 34453: return entry; break; - } - return 0; } + return 0; + } - void HandleBaseDummy(SpellEffIndex /*effIndex*/) + void HandleBaseDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + Unit* target = GetHitUnit(); + Unit* baseTarget = GetExplTargetUnit(); + Creature* targetCreature = GetHitCreature(); + + if (caster != target) { - Unit* caster = GetCaster(); - Unit* target = GetHitUnit(); - Unit* baseTarget = GetExplTargetUnit(); - Creature* targetCreature = GetHitCreature(); + if (targetCreature && (targetCreature->isWorldBoss() || targetCreature->IsDungeonBoss()) && targetCreature->GetEntry() != EntryCheck(targetCreature->GetEntry())) + { + return; + } + else + { + caster->CastSpell(target, 49560, true); + const SpellInfo* spellInfo = sSpellMgr->GetSpellInfo(1766); // Rogue kick + if (!target->IsImmunedToSpellEffect(spellInfo, EFFECT_0)) + target->InterruptNonMeleeSpells(true); + } + } + else + baseTarget->CastSpell(caster, 49560, true); + } - if (caster != target) - { - if (targetCreature && (targetCreature->isWorldBoss() || targetCreature->IsDungeonBoss()) && targetCreature->GetEntry() != EntryCheck(targetCreature->GetEntry())) + void HandleDummy(SpellEffIndex /*effIndex*/) + { + float casterZ = GetCaster()->GetPositionZ(); // for Ring of Valor + WorldLocation gripPos = *GetExplTargetDest(); + if (Unit* target = GetHitUnit()) + if (!target->HasAuraType(SPELL_AURA_DEFLECT_SPELLS) || target->HasUnitState(UNIT_STATE_STUNNED)) // Deterrence + { + if (target != GetCaster()) { - return; - } - else - { - caster->CastSpell(target, 49560, true); const SpellInfo* spellInfo = sSpellMgr->GetSpellInfo(1766); // Rogue kick if (!target->IsImmunedToSpellEffect(spellInfo, EFFECT_0)) - target->InterruptNonMeleeSpells(true); + target->InterruptNonMeleeSpells(false, 0, false); } + + if (target->GetMapId() == 618) // for Ring of Valor + gripPos.m_positionZ = std::max(casterZ + 0.2f, 28.5f); + + target->CastSpell(gripPos.GetPositionX(), gripPos.GetPositionY(), gripPos.GetPositionZ(), 57604, true); } - else - baseTarget->CastSpell(caster, 49560, true); - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - float casterZ = GetCaster()->GetPositionZ(); // for Ring of Valor - WorldLocation gripPos = *GetExplTargetDest(); - if (Unit* target = GetHitUnit()) - if (!target->HasAuraType(SPELL_AURA_DEFLECT_SPELLS) || target->HasUnitState(UNIT_STATE_STUNNED)) // Deterrence - { - if (target != GetCaster()) - { - const SpellInfo* spellInfo = sSpellMgr->GetSpellInfo(1766); // Rogue kick - if (!target->IsImmunedToSpellEffect(spellInfo, EFFECT_0)) - target->InterruptNonMeleeSpells(false, 0, false); - } - - if (target->GetMapId() == 618) // for Ring of Valor - gripPos.m_positionZ = std::max(casterZ+0.2f, 28.5f); - - target->CastSpell(gripPos.GetPositionX(), gripPos.GetPositionY(), gripPos.GetPositionZ(), 57604, true); - } - } - - void Register() - { - if (m_scriptSpellId == 49576) // xinef: base death grip, add pvp range restriction - { - OnCheckCast += SpellCheckCastFn(spell_dk_death_grip_SpellScript::CheckCast); - OnEffectHitTarget += SpellEffectFn(spell_dk_death_grip_SpellScript::HandleBaseDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - else - OnEffectHitTarget += SpellEffectFn(spell_dk_death_grip_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dk_death_grip_SpellScript(); } + + void Register() + { + if (m_scriptSpellId == 49576) // xinef: base death grip, add pvp range restriction + { + OnCheckCast += SpellCheckCastFn(spell_dk_death_grip_SpellScript::CheckCast); + OnEffectHitTarget += SpellEffectFn(spell_dk_death_grip_SpellScript::HandleBaseDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + else + OnEffectHitTarget += SpellEffectFn(spell_dk_death_grip_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dk_death_grip_SpellScript(); + } }; // 48743 - Death Pact class spell_dk_death_pact : public SpellScriptLoader { - public: - spell_dk_death_pact() : SpellScriptLoader("spell_dk_death_pact") { } +public: + spell_dk_death_pact() : SpellScriptLoader("spell_dk_death_pact") { } - class spell_dk_death_pact_SpellScript : public SpellScript + class spell_dk_death_pact_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dk_death_pact_SpellScript); + + SpellCastResult CheckCast() { - PrepareSpellScript(spell_dk_death_pact_SpellScript); - - SpellCastResult CheckCast() - { - // Check if we have valid targets, otherwise skip spell casting here - if (Player* player = GetCaster()->ToPlayer()) - for (Unit::ControlSet::const_iterator itr = player->m_Controlled.begin(); itr != player->m_Controlled.end(); ++itr) - if (Creature* undeadPet = (*itr)->ToCreature()) - if (undeadPet->IsAlive() && + // Check if we have valid targets, otherwise skip spell casting here + if (Player* player = GetCaster()->ToPlayer()) + for (Unit::ControlSet::const_iterator itr = player->m_Controlled.begin(); itr != player->m_Controlled.end(); ++itr) + if (Creature* undeadPet = (*itr)->ToCreature()) + if (undeadPet->IsAlive() && undeadPet->GetOwnerGUID() == player->GetGUID() && undeadPet->GetCreatureType() == CREATURE_TYPE_UNDEAD && undeadPet->IsWithinDist(player, 100.0f, false)) - return SPELL_CAST_OK; + return SPELL_CAST_OK; - return SPELL_FAILED_NO_PET; - } - - void FilterTargets(std::list& targetList) - { - Unit* target = nullptr; - for (std::list::iterator itr = targetList.begin(); itr != targetList.end(); ++itr) - { - if (Unit* unit = (*itr)->ToUnit()) - if (unit->GetOwnerGUID() == GetCaster()->GetGUID() && unit->GetCreatureType() == CREATURE_TYPE_UNDEAD) - { - target = unit; - break; - } - } - - targetList.clear(); - if (target) - { - // xinef: remove all auras preventing effect execution - target->RemoveAllAurasOnDeath(); - targetList.push_back(target); - } - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_dk_death_pact_SpellScript::CheckCast); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dk_death_pact_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ALLY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dk_death_pact_SpellScript(); + return SPELL_FAILED_NO_PET; } + + void FilterTargets(std::list& targetList) + { + Unit* target = nullptr; + for (std::list::iterator itr = targetList.begin(); itr != targetList.end(); ++itr) + { + if (Unit* unit = (*itr)->ToUnit()) + if (unit->GetOwnerGUID() == GetCaster()->GetGUID() && unit->GetCreatureType() == CREATURE_TYPE_UNDEAD) + { + target = unit; + break; + } + } + + targetList.clear(); + if (target) + { + // xinef: remove all auras preventing effect execution + target->RemoveAllAurasOnDeath(); + targetList.push_back(target); + } + } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_dk_death_pact_SpellScript::CheckCast); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dk_death_pact_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ALLY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dk_death_pact_SpellScript(); + } }; // -49998 - Death Strike class spell_dk_death_strike : public SpellScriptLoader { - public: - spell_dk_death_strike() : SpellScriptLoader("spell_dk_death_strike") { } +public: + spell_dk_death_strike() : SpellScriptLoader("spell_dk_death_strike") { } - class spell_dk_death_strike_SpellScript : public SpellScript + class spell_dk_death_strike_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dk_death_strike_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_dk_death_strike_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_DK_DEATH_STRIKE_HEAL)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - if (Unit* target = GetHitUnit()) - { - uint32 count = target->GetDiseasesByCaster(caster->GetGUID()); - int32 bp = int32(count * caster->CountPctFromMaxHealth(int32(GetSpellInfo()->Effects[EFFECT_0].DamageMultiplier))); - // Improved Death Strike - if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_DEATHKNIGHT, DK_ICON_ID_IMPROVED_DEATH_STRIKE, 0)) - AddPct(bp, caster->CalculateSpellDamage(caster, aurEff->GetSpellInfo(), 2)); - caster->CastCustomSpell(caster, SPELL_DK_DEATH_STRIKE_HEAL, &bp, nullptr, nullptr, false); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_dk_death_strike_SpellScript::HandleDummy, EFFECT_2, SPELL_EFFECT_DUMMY); - } - - }; - - SpellScript* GetSpellScript() const - { - return new spell_dk_death_strike_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_DK_DEATH_STRIKE_HEAL)) + return false; + return true; } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (Unit* target = GetHitUnit()) + { + uint32 count = target->GetDiseasesByCaster(caster->GetGUID()); + int32 bp = int32(count * caster->CountPctFromMaxHealth(int32(GetSpellInfo()->Effects[EFFECT_0].DamageMultiplier))); + // Improved Death Strike + if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_DEATHKNIGHT, DK_ICON_ID_IMPROVED_DEATH_STRIKE, 0)) + AddPct(bp, caster->CalculateSpellDamage(caster, aurEff->GetSpellInfo(), 2)); + caster->CastCustomSpell(caster, SPELL_DK_DEATH_STRIKE_HEAL, &bp, nullptr, nullptr, false); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_dk_death_strike_SpellScript::HandleDummy, EFFECT_2, SPELL_EFFECT_DUMMY); + } + + }; + + SpellScript* GetSpellScript() const + { + return new spell_dk_death_strike_SpellScript(); + } }; // 47496 - Explode, Ghoul spell for Corpse Explosion class spell_dk_ghoul_explode : public SpellScriptLoader { - public: - spell_dk_ghoul_explode() : SpellScriptLoader("spell_dk_ghoul_explode") { } +public: + spell_dk_ghoul_explode() : SpellScriptLoader("spell_dk_ghoul_explode") { } - class spell_dk_ghoul_explode_SpellScript : public SpellScript + class spell_dk_ghoul_explode_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dk_ghoul_explode_SpellScript); + + bool Validate(SpellInfo const* spellInfo) { - PrepareSpellScript(spell_dk_ghoul_explode_SpellScript); - - bool Validate(SpellInfo const* spellInfo) - { - if (!sSpellMgr->GetSpellInfo(SPELL_DK_CORPSE_EXPLOSION_TRIGGERED) + if (!sSpellMgr->GetSpellInfo(SPELL_DK_CORPSE_EXPLOSION_TRIGGERED) || spellInfo->Effects[EFFECT_2].CalcValue() <= 0) - return false; - return true; - } - - void HandleDamage(SpellEffIndex /*effIndex*/) - { - int32 value = int32(GetCaster()->CountPctFromMaxHealth(GetSpellInfo()->Effects[EFFECT_2].CalcValue(GetCaster()))); - SetEffectValue(value); - } - - void Suicide(SpellEffIndex /*effIndex*/) - { - if (Unit* unitTarget = GetHitUnit()) - { - // Corpse Explosion (Suicide) - unitTarget->CastSpell(unitTarget, SPELL_DK_CORPSE_EXPLOSION_TRIGGERED, true); - // Set corpse look - GetCaster()->CastSpell(unitTarget, SPELL_DK_CORPSE_EXPLOSION_VISUAL, true); - } - } - - void Register() - { - OnEffectLaunchTarget += SpellEffectFn(spell_dk_ghoul_explode_SpellScript::HandleDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); - OnEffectHitTarget += SpellEffectFn(spell_dk_ghoul_explode_SpellScript::Suicide, EFFECT_1, SPELL_EFFECT_SCHOOL_DAMAGE); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dk_ghoul_explode_SpellScript(); + return false; + return true; } + + void HandleDamage(SpellEffIndex /*effIndex*/) + { + int32 value = int32(GetCaster()->CountPctFromMaxHealth(GetSpellInfo()->Effects[EFFECT_2].CalcValue(GetCaster()))); + SetEffectValue(value); + } + + void Suicide(SpellEffIndex /*effIndex*/) + { + if (Unit* unitTarget = GetHitUnit()) + { + // Corpse Explosion (Suicide) + unitTarget->CastSpell(unitTarget, SPELL_DK_CORPSE_EXPLOSION_TRIGGERED, true); + // Set corpse look + GetCaster()->CastSpell(unitTarget, SPELL_DK_CORPSE_EXPLOSION_VISUAL, true); + } + } + + void Register() + { + OnEffectLaunchTarget += SpellEffectFn(spell_dk_ghoul_explode_SpellScript::HandleDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + OnEffectHitTarget += SpellEffectFn(spell_dk_ghoul_explode_SpellScript::Suicide, EFFECT_1, SPELL_EFFECT_SCHOOL_DAMAGE); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dk_ghoul_explode_SpellScript(); + } }; // 48792 - Icebound Fortitude class spell_dk_icebound_fortitude : public SpellScriptLoader { - public: - spell_dk_icebound_fortitude() : SpellScriptLoader("spell_dk_icebound_fortitude") { } +public: + spell_dk_icebound_fortitude() : SpellScriptLoader("spell_dk_icebound_fortitude") { } - class spell_dk_icebound_fortitude_AuraScript : public AuraScript + class spell_dk_icebound_fortitude_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_icebound_fortitude_AuraScript); + + bool Load() { - PrepareAuraScript(spell_dk_icebound_fortitude_AuraScript); - - bool Load() - { - Unit* caster = GetCaster(); - return caster && caster->GetTypeId() == TYPEID_PLAYER; - } - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - if (Unit* caster = GetCaster()) - { - int32 value = amount; - uint32 defValue = uint32(caster->ToPlayer()->GetSkillValue(SKILL_DEFENSE) + caster->ToPlayer()->GetRatingBonusValue(CR_DEFENSE_SKILL)); - - if (defValue > 400) - value -= int32((defValue - 400) * 0.15); - - // Glyph of Icebound Fortitude - if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_DK_GLYPH_OF_ICEBOUND_FORTITUDE, EFFECT_0)) - { - int32 valMax = -aurEff->GetAmount(); - if (value > valMax) - value = valMax; - } - amount = value; - } - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_icebound_fortitude_AuraScript::CalculateAmount, EFFECT_2, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dk_icebound_fortitude_AuraScript(); + Unit* caster = GetCaster(); + return caster && caster->GetTypeId() == TYPEID_PLAYER; } + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + if (Unit* caster = GetCaster()) + { + int32 value = amount; + uint32 defValue = uint32(caster->ToPlayer()->GetSkillValue(SKILL_DEFENSE) + caster->ToPlayer()->GetRatingBonusValue(CR_DEFENSE_SKILL)); + + if (defValue > 400) + value -= int32((defValue - 400) * 0.15); + + // Glyph of Icebound Fortitude + if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_DK_GLYPH_OF_ICEBOUND_FORTITUDE, EFFECT_0)) + { + int32 valMax = -aurEff->GetAmount(); + if (value > valMax) + value = valMax; + } + amount = value; + } + } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_icebound_fortitude_AuraScript::CalculateAmount, EFFECT_2, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dk_icebound_fortitude_AuraScript(); + } }; // -50365 - Improved Blood Presence class spell_dk_improved_blood_presence : public SpellScriptLoader { - public: - spell_dk_improved_blood_presence() : SpellScriptLoader("spell_dk_improved_blood_presence") { } +public: + spell_dk_improved_blood_presence() : SpellScriptLoader("spell_dk_improved_blood_presence") { } - class spell_dk_improved_blood_presence_AuraScript : public AuraScript + class spell_dk_improved_blood_presence_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_improved_blood_presence_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_dk_improved_blood_presence_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_DK_BLOOD_PRESENCE) + if (!sSpellMgr->GetSpellInfo(SPELL_DK_BLOOD_PRESENCE) || !sSpellMgr->GetSpellInfo(SPELL_DK_FROST_PRESENCE) || !sSpellMgr->GetSpellInfo(SPELL_DK_UNHOLY_PRESENCE) || !sSpellMgr->GetSpellInfo(SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED)) - return false; - return true; - } - - void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - if ((target->HasAura(SPELL_DK_FROST_PRESENCE) || target->HasAura(SPELL_DK_UNHOLY_PRESENCE)) && !target->HasAura(SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED)) - target->CastCustomSpell(SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED, SPELLVALUE_BASE_POINT1, aurEff->GetAmount(), target, true, NULL, aurEff); - } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - if (!target->HasAura(SPELL_DK_BLOOD_PRESENCE)) - target->RemoveAura(SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED); - } - - void Register() - { - AfterEffectApply += AuraEffectApplyFn(spell_dk_improved_blood_presence_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_dk_improved_blood_presence_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dk_improved_blood_presence_AuraScript(); + return false; + return true; } + + void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + if ((target->HasAura(SPELL_DK_FROST_PRESENCE) || target->HasAura(SPELL_DK_UNHOLY_PRESENCE)) && !target->HasAura(SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED)) + target->CastCustomSpell(SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED, SPELLVALUE_BASE_POINT1, aurEff->GetAmount(), target, true, NULL, aurEff); + } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + if (!target->HasAura(SPELL_DK_BLOOD_PRESENCE)) + target->RemoveAura(SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED); + } + + void Register() + { + AfterEffectApply += AuraEffectApplyFn(spell_dk_improved_blood_presence_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_dk_improved_blood_presence_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dk_improved_blood_presence_AuraScript(); + } }; // -50384 - Improved Frost Presence class spell_dk_improved_frost_presence : public SpellScriptLoader { - public: - spell_dk_improved_frost_presence() : SpellScriptLoader("spell_dk_improved_frost_presence") { } +public: + spell_dk_improved_frost_presence() : SpellScriptLoader("spell_dk_improved_frost_presence") { } - class spell_dk_improved_frost_presence_AuraScript : public AuraScript + class spell_dk_improved_frost_presence_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_improved_frost_presence_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_dk_improved_frost_presence_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_DK_BLOOD_PRESENCE) + if (!sSpellMgr->GetSpellInfo(SPELL_DK_BLOOD_PRESENCE) || !sSpellMgr->GetSpellInfo(SPELL_DK_FROST_PRESENCE) || !sSpellMgr->GetSpellInfo(SPELL_DK_UNHOLY_PRESENCE) || !sSpellMgr->GetSpellInfo(SPELL_DK_FROST_PRESENCE_TRIGGERED)) - return false; - return true; - } - - void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - if ((target->HasAura(SPELL_DK_BLOOD_PRESENCE) || target->HasAura(SPELL_DK_UNHOLY_PRESENCE)) && !target->HasAura(SPELL_DK_FROST_PRESENCE_TRIGGERED)) - target->CastCustomSpell(SPELL_DK_FROST_PRESENCE_TRIGGERED, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), target, true, NULL, aurEff); - } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - if (!target->HasAura(SPELL_DK_FROST_PRESENCE)) - target->RemoveAura(SPELL_DK_FROST_PRESENCE_TRIGGERED); - } - - void Register() - { - AfterEffectApply += AuraEffectApplyFn(spell_dk_improved_frost_presence_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_dk_improved_frost_presence_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dk_improved_frost_presence_AuraScript(); + return false; + return true; } + + void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + if ((target->HasAura(SPELL_DK_BLOOD_PRESENCE) || target->HasAura(SPELL_DK_UNHOLY_PRESENCE)) && !target->HasAura(SPELL_DK_FROST_PRESENCE_TRIGGERED)) + target->CastCustomSpell(SPELL_DK_FROST_PRESENCE_TRIGGERED, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), target, true, NULL, aurEff); + } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + if (!target->HasAura(SPELL_DK_FROST_PRESENCE)) + target->RemoveAura(SPELL_DK_FROST_PRESENCE_TRIGGERED); + } + + void Register() + { + AfterEffectApply += AuraEffectApplyFn(spell_dk_improved_frost_presence_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_dk_improved_frost_presence_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dk_improved_frost_presence_AuraScript(); + } }; // -50391 - Improved Unholy Presence class spell_dk_improved_unholy_presence : public SpellScriptLoader { - public: - spell_dk_improved_unholy_presence() : SpellScriptLoader("spell_dk_improved_unholy_presence") { } +public: + spell_dk_improved_unholy_presence() : SpellScriptLoader("spell_dk_improved_unholy_presence") { } - class spell_dk_improved_unholy_presence_AuraScript : public AuraScript + class spell_dk_improved_unholy_presence_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_improved_unholy_presence_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_dk_improved_unholy_presence_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_DK_BLOOD_PRESENCE) + if (!sSpellMgr->GetSpellInfo(SPELL_DK_BLOOD_PRESENCE) || !sSpellMgr->GetSpellInfo(SPELL_DK_FROST_PRESENCE) || !sSpellMgr->GetSpellInfo(SPELL_DK_UNHOLY_PRESENCE) || !sSpellMgr->GetSpellInfo(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED) || !sSpellMgr->GetSpellInfo(SPELL_DK_UNHOLY_PRESENCE_TRIGGERED)) - return false; - return true; - } - - void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - if (target->HasAura(SPELL_DK_UNHOLY_PRESENCE) && !target->HasAura(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED)) - { - // Not listed as any effect, only base points set in dbc - int32 basePoints = GetSpellInfo()->Effects[EFFECT_1].CalcValue(); - target->CastCustomSpell(target, SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED, &basePoints, &basePoints, &basePoints, true, NULL, aurEff); - } - - if ((target->HasAura(SPELL_DK_BLOOD_PRESENCE) || target->HasAura(SPELL_DK_FROST_PRESENCE)) && !target->HasAura(SPELL_DK_UNHOLY_PRESENCE_TRIGGERED)) - target->CastCustomSpell(SPELL_DK_UNHOLY_PRESENCE_TRIGGERED, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), target, true, NULL, aurEff); - } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - - target->RemoveAura(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED); - - if (!target->HasAura(SPELL_DK_UNHOLY_PRESENCE)) - target->RemoveAura(SPELL_DK_UNHOLY_PRESENCE_TRIGGERED); - } - - void Register() - { - AfterEffectApply += AuraEffectApplyFn(spell_dk_improved_unholy_presence_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_dk_improved_unholy_presence_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dk_improved_unholy_presence_AuraScript(); + return false; + return true; } + + void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + if (target->HasAura(SPELL_DK_UNHOLY_PRESENCE) && !target->HasAura(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED)) + { + // Not listed as any effect, only base points set in dbc + int32 basePoints = GetSpellInfo()->Effects[EFFECT_1].CalcValue(); + target->CastCustomSpell(target, SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED, &basePoints, &basePoints, &basePoints, true, NULL, aurEff); + } + + if ((target->HasAura(SPELL_DK_BLOOD_PRESENCE) || target->HasAura(SPELL_DK_FROST_PRESENCE)) && !target->HasAura(SPELL_DK_UNHOLY_PRESENCE_TRIGGERED)) + target->CastCustomSpell(SPELL_DK_UNHOLY_PRESENCE_TRIGGERED, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), target, true, NULL, aurEff); + } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + + target->RemoveAura(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED); + + if (!target->HasAura(SPELL_DK_UNHOLY_PRESENCE)) + target->RemoveAura(SPELL_DK_UNHOLY_PRESENCE_TRIGGERED); + } + + void Register() + { + AfterEffectApply += AuraEffectApplyFn(spell_dk_improved_unholy_presence_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_dk_improved_unholy_presence_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dk_improved_unholy_presence_AuraScript(); + } }; // ID - 50842 Pestilence class spell_dk_pestilence : public SpellScriptLoader { - public: - spell_dk_pestilence() : SpellScriptLoader("spell_dk_pestilence") { } +public: + spell_dk_pestilence() : SpellScriptLoader("spell_dk_pestilence") { } - class spell_dk_pestilence_SpellScript : public SpellScript + class spell_dk_pestilence_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dk_pestilence_SpellScript); + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_dk_pestilence_SpellScript); + Unit* caster = GetCaster(); + Unit* hitUnit = GetHitUnit(); + Unit* target = GetExplTargetUnit(); + if (!target) + return; - void HandleScriptEffect(SpellEffIndex /*effIndex*/) + if (target != hitUnit || caster->GetAura(SPELL_DK_GLYPH_OF_DISEASE)) { - Unit* caster = GetCaster(); - Unit* hitUnit = GetHitUnit(); - Unit* target = GetExplTargetUnit(); - if (!target) - return; + // xinef: checked in target selection + //if (!m_targets.GetUnitTarget()->IsWithinLOSInMap(unitTarget)) + // return; - if (target != hitUnit || caster->GetAura(SPELL_DK_GLYPH_OF_DISEASE)) - { - // xinef: checked in target selection - //if (!m_targets.GetUnitTarget()->IsWithinLOSInMap(unitTarget)) - // return; - - // And spread them on target - // Blood Plague - if (target->GetAura(SPELL_DK_BLOOD_PLAGUE, caster->GetGUID())) - caster->CastSpell(hitUnit, SPELL_DK_BLOOD_PLAGUE, true); - // Frost Fever - if (target->GetAura(SPELL_DK_FROST_FEVER, caster->GetGUID())) - caster->CastSpell(hitUnit, SPELL_DK_FROST_FEVER, true); - } + // And spread them on target + // Blood Plague + if (target->GetAura(SPELL_DK_BLOOD_PLAGUE, caster->GetGUID())) + caster->CastSpell(hitUnit, SPELL_DK_BLOOD_PLAGUE, true); + // Frost Fever + if (target->GetAura(SPELL_DK_FROST_FEVER, caster->GetGUID())) + caster->CastSpell(hitUnit, SPELL_DK_FROST_FEVER, true); } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_dk_pestilence_SpellScript::HandleScriptEffect, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dk_pestilence_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_dk_pestilence_SpellScript::HandleScriptEffect, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dk_pestilence_SpellScript(); + } }; // 48266 - Blood Presence @@ -2070,16 +2070,16 @@ class spell_dk_pestilence : public SpellScriptLoader // 48265 - Unholy Presence class spell_dk_presence : public SpellScriptLoader { - public: - spell_dk_presence() : SpellScriptLoader("spell_dk_presence") { } +public: + spell_dk_presence() : SpellScriptLoader("spell_dk_presence") { } - class spell_dk_presence_AuraScript : public AuraScript + class spell_dk_presence_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_presence_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_dk_presence_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_DK_BLOOD_PRESENCE) + if (!sSpellMgr->GetSpellInfo(SPELL_DK_BLOOD_PRESENCE) || !sSpellMgr->GetSpellInfo(SPELL_DK_FROST_PRESENCE) || !sSpellMgr->GetSpellInfo(SPELL_DK_UNHOLY_PRESENCE) || !sSpellMgr->GetSpellInfo(SPELL_DK_IMPROVED_BLOOD_PRESENCE_R1) @@ -2089,520 +2089,520 @@ class spell_dk_presence : public SpellScriptLoader || !sSpellMgr->GetSpellInfo(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED) || !sSpellMgr->GetSpellInfo(SPELL_DK_FROST_PRESENCE_TRIGGERED) || !sSpellMgr->GetSpellInfo(SPELL_DK_UNHOLY_PRESENCE_TRIGGERED)) - return false; - - return true; - } - - void HandleImprovedBloodPresence(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - - 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)) - target->CastCustomSpell(SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED, SPELLVALUE_BASE_POINT1, impAurEff->GetAmount(), target, true, NULL, aurEff); - } - - void HandleImprovedFrostPresence(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - - 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)) - target->CastCustomSpell(SPELL_DK_FROST_PRESENCE_TRIGGERED, SPELLVALUE_BASE_POINT0, impAurEff->GetAmount(), target, true, NULL, aurEff); - } - - void HandleImprovedUnholyPresence(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - - 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 (GetId() == SPELL_DK_UNHOLY_PRESENCE) - { - // Not listed as any effect, only base points set - int32 bp = impAurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue(); - target->CastCustomSpell(target, SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED, &bp, &bp, &bp, true, NULL, aurEff); - } - else if (!target->HasAura(SPELL_DK_UNHOLY_PRESENCE_TRIGGERED)) - target->CastCustomSpell(SPELL_DK_UNHOLY_PRESENCE_TRIGGERED, SPELLVALUE_BASE_POINT0, impAurEff->GetAmount(), target, true, NULL, aurEff); - } - } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - target->RemoveAura(SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED); - target->RemoveAura(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED); - target->RemoveAura(SPELL_DK_FROST_PRESENCE_TRIGGERED); - target->RemoveAura(SPELL_DK_UNHOLY_PRESENCE_TRIGGERED); - } - - void Register() - { - AfterEffectApply += AuraEffectApplyFn(spell_dk_presence_AuraScript::HandleImprovedBloodPresence, EFFECT_0, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); - AfterEffectApply += AuraEffectApplyFn(spell_dk_presence_AuraScript::HandleImprovedFrostPresence, EFFECT_0, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); - AfterEffectApply += AuraEffectApplyFn(spell_dk_presence_AuraScript::HandleImprovedUnholyPresence, EFFECT_0, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_dk_presence_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dk_presence_AuraScript(); - } -}; - -class RaiseDeadCheck -{ - public: - explicit RaiseDeadCheck(Player const* caster) : _caster(caster) { } - - bool operator()(WorldObject* obj) const - { - if (Unit* target = obj->ToUnit()) - { - if (!target->IsAlive() - && _caster->isHonorOrXPTarget(target) - && target->GetCreatureType() == CREATURE_TYPE_HUMANOID - && target->GetDisplayId() == target->GetNativeDisplayId()) - return false; - } + return false; return true; } - private: - Player const* _caster; + void HandleImprovedBloodPresence(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + + 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)) + target->CastCustomSpell(SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED, SPELLVALUE_BASE_POINT1, impAurEff->GetAmount(), target, true, NULL, aurEff); + } + + void HandleImprovedFrostPresence(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + + 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)) + target->CastCustomSpell(SPELL_DK_FROST_PRESENCE_TRIGGERED, SPELLVALUE_BASE_POINT0, impAurEff->GetAmount(), target, true, NULL, aurEff); + } + + void HandleImprovedUnholyPresence(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + + 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 (GetId() == SPELL_DK_UNHOLY_PRESENCE) + { + // Not listed as any effect, only base points set + int32 bp = impAurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue(); + target->CastCustomSpell(target, SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED, &bp, &bp, &bp, true, NULL, aurEff); + } + else if (!target->HasAura(SPELL_DK_UNHOLY_PRESENCE_TRIGGERED)) + target->CastCustomSpell(SPELL_DK_UNHOLY_PRESENCE_TRIGGERED, SPELLVALUE_BASE_POINT0, impAurEff->GetAmount(), target, true, NULL, aurEff); + } + } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + target->RemoveAura(SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED); + target->RemoveAura(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED); + target->RemoveAura(SPELL_DK_FROST_PRESENCE_TRIGGERED); + target->RemoveAura(SPELL_DK_UNHOLY_PRESENCE_TRIGGERED); + } + + void Register() + { + AfterEffectApply += AuraEffectApplyFn(spell_dk_presence_AuraScript::HandleImprovedBloodPresence, EFFECT_0, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); + AfterEffectApply += AuraEffectApplyFn(spell_dk_presence_AuraScript::HandleImprovedFrostPresence, EFFECT_0, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); + AfterEffectApply += AuraEffectApplyFn(spell_dk_presence_AuraScript::HandleImprovedUnholyPresence, EFFECT_0, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_dk_presence_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dk_presence_AuraScript(); + } +}; + +class RaiseDeadCheck +{ +public: + explicit RaiseDeadCheck(Player const* caster) : _caster(caster) { } + + bool operator()(WorldObject* obj) const + { + if (Unit* target = obj->ToUnit()) + { + if (!target->IsAlive() + && _caster->isHonorOrXPTarget(target) + && target->GetCreatureType() == CREATURE_TYPE_HUMANOID + && target->GetDisplayId() == target->GetNativeDisplayId()) + return false; + } + + return true; + } + +private: + Player const* _caster; }; // 46584 - Raise Dead class spell_dk_raise_dead : public SpellScriptLoader { - public: - spell_dk_raise_dead() : SpellScriptLoader("spell_dk_raise_dead") { } +public: + spell_dk_raise_dead() : SpellScriptLoader("spell_dk_raise_dead") { } - class spell_dk_raise_dead_SpellScript : public SpellScript + class spell_dk_raise_dead_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dk_raise_dead_SpellScript); + + bool Validate(SpellInfo const* spellInfo) { - PrepareSpellScript(spell_dk_raise_dead_SpellScript); - - bool Validate(SpellInfo const* spellInfo) - { - if (!sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_1].CalcValue()) + if (!sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_1].CalcValue()) || !sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_2].CalcValue()) || !sSpellMgr->GetSpellInfo(SPELL_DK_RAISE_DEAD_USE_REAGENT) || !sSpellMgr->GetSpellInfo(SPELL_DK_MASTER_OF_GHOULS)) - return false; - return true; - } + return false; + return true; + } - bool Load() - { - _result = SPELL_CAST_OK; - _corpse = false; - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } + bool Load() + { + _result = SPELL_CAST_OK; + _corpse = false; + return GetCaster()->GetTypeId() == TYPEID_PLAYER; + } - SpellCastResult CheckCast() - { - /// process spell target selection before cast starts - /// targets of effect_1 are used to check cast - GetSpell()->SelectSpellTargets(); - /// cleanup spell target map, and fill it again on normal way - GetSpell()->CleanupTargetList(); - /// _result is set in spell target selection - return _result; - } + SpellCastResult CheckCast() + { + /// process spell target selection before cast starts + /// targets of effect_1 are used to check cast + GetSpell()->SelectSpellTargets(); + /// cleanup spell target map, and fill it again on normal way + GetSpell()->CleanupTargetList(); + /// _result is set in spell target selection + return _result; + } - SpellCastResult CheckReagents() + SpellCastResult CheckReagents() + { + /// @workaround: there is no access to castresult of other spells, check it manually + SpellInfo const* reagentSpell = sSpellMgr->GetSpellInfo(SPELL_DK_RAISE_DEAD_USE_REAGENT); + Player* player = GetCaster()->ToPlayer(); + if (!player->CanNoReagentCast(reagentSpell)) { - /// @workaround: there is no access to castresult of other spells, check it manually - SpellInfo const* reagentSpell = sSpellMgr->GetSpellInfo(SPELL_DK_RAISE_DEAD_USE_REAGENT); - Player* player = GetCaster()->ToPlayer(); - if (!player->CanNoReagentCast(reagentSpell)) + for (uint32 i = 0; i < MAX_SPELL_REAGENTS; i++) { - for (uint32 i = 0; i < MAX_SPELL_REAGENTS; i++) - { - if (reagentSpell->Reagent[i] <= 0) - continue; + if (reagentSpell->Reagent[i] <= 0) + continue; - if (!player->HasItemCount(reagentSpell->Reagent[i], reagentSpell->ReagentCount[i])) - { - Spell::SendCastResult(player, reagentSpell, 0, SPELL_FAILED_REAGENTS); - return SPELL_FAILED_DONT_REPORT; - } + if (!player->HasItemCount(reagentSpell->Reagent[i], reagentSpell->ReagentCount[i])) + { + Spell::SendCastResult(player, reagentSpell, 0, SPELL_FAILED_REAGENTS); + return SPELL_FAILED_DONT_REPORT; } } - return SPELL_CAST_OK; } - - void CheckTargets(std::list& targets) - { - targets.remove_if(RaiseDeadCheck(GetCaster()->ToPlayer())); - - if (targets.empty()) - { - if (GetSpell()->getState() == SPELL_STATE_PREPARING) - _result = CheckReagents(); - - return; - } - - WorldObject* target = acore::Containers::SelectRandomContainerElement(targets); - targets.clear(); - targets.push_back(target); - _corpse = true; - } - - void CheckTarget(WorldObject*& target) - { - // Don't add caster to target map, if we found a corpse to raise dead - if (_corpse) - target = nullptr; - } - - void ConsumeReagents() - { - // No corpse found, take reagents - if (!_corpse) - GetCaster()->CastSpell(GetCaster(), SPELL_DK_RAISE_DEAD_USE_REAGENT, TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_IGNORE_POWER_AND_REAGENT_COST)); - } - - uint32 GetGhoulSpellId() - { - // Do we have talent Master of Ghouls? - if (GetCaster()->HasAura(SPELL_DK_MASTER_OF_GHOULS)) - // summon as pet - return GetSpellInfo()->Effects[EFFECT_2].CalcValue(); - - // or guardian - return GetSpellInfo()->Effects[EFFECT_1].CalcValue(); - } - - void HandleRaiseDead(SpellEffIndex /*effIndex*/) - { - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(GetGhoulSpellId()); - SpellCastTargets targets; - targets.SetDst(*GetHitUnit()); - - GetCaster()->CastSpell(targets, spellInfo, NULL, TRIGGERED_FULL_MASK, nullptr, nullptr, GetCaster()->GetGUID()); - GetCaster()->ToPlayer()->RemoveSpellCooldown(GetSpellInfo()->Id, true); - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_dk_raise_dead_SpellScript::CheckCast); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dk_raise_dead_SpellScript::CheckTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ENTRY); - OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_dk_raise_dead_SpellScript::CheckTarget, EFFECT_2, TARGET_UNIT_CASTER); - OnCast += SpellCastFn(spell_dk_raise_dead_SpellScript::ConsumeReagents); - OnEffectHitTarget += SpellEffectFn(spell_dk_raise_dead_SpellScript::HandleRaiseDead, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); - OnEffectHitTarget += SpellEffectFn(spell_dk_raise_dead_SpellScript::HandleRaiseDead, EFFECT_2, SPELL_EFFECT_DUMMY); - } - - private: - SpellCastResult _result; - bool _corpse; - }; - - SpellScript* GetSpellScript() const - { - return new spell_dk_raise_dead_SpellScript(); + return SPELL_CAST_OK; } + + void CheckTargets(std::list& targets) + { + targets.remove_if(RaiseDeadCheck(GetCaster()->ToPlayer())); + + if (targets.empty()) + { + if (GetSpell()->getState() == SPELL_STATE_PREPARING) + _result = CheckReagents(); + + return; + } + + WorldObject* target = acore::Containers::SelectRandomContainerElement(targets); + targets.clear(); + targets.push_back(target); + _corpse = true; + } + + void CheckTarget(WorldObject*& target) + { + // Don't add caster to target map, if we found a corpse to raise dead + if (_corpse) + target = nullptr; + } + + void ConsumeReagents() + { + // No corpse found, take reagents + if (!_corpse) + GetCaster()->CastSpell(GetCaster(), SPELL_DK_RAISE_DEAD_USE_REAGENT, TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_IGNORE_POWER_AND_REAGENT_COST)); + } + + uint32 GetGhoulSpellId() + { + // Do we have talent Master of Ghouls? + if (GetCaster()->HasAura(SPELL_DK_MASTER_OF_GHOULS)) + // summon as pet + return GetSpellInfo()->Effects[EFFECT_2].CalcValue(); + + // or guardian + return GetSpellInfo()->Effects[EFFECT_1].CalcValue(); + } + + void HandleRaiseDead(SpellEffIndex /*effIndex*/) + { + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(GetGhoulSpellId()); + SpellCastTargets targets; + targets.SetDst(*GetHitUnit()); + + GetCaster()->CastSpell(targets, spellInfo, NULL, TRIGGERED_FULL_MASK, nullptr, nullptr, GetCaster()->GetGUID()); + GetCaster()->ToPlayer()->RemoveSpellCooldown(GetSpellInfo()->Id, true); + } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_dk_raise_dead_SpellScript::CheckCast); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dk_raise_dead_SpellScript::CheckTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ENTRY); + OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_dk_raise_dead_SpellScript::CheckTarget, EFFECT_2, TARGET_UNIT_CASTER); + OnCast += SpellCastFn(spell_dk_raise_dead_SpellScript::ConsumeReagents); + OnEffectHitTarget += SpellEffectFn(spell_dk_raise_dead_SpellScript::HandleRaiseDead, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + OnEffectHitTarget += SpellEffectFn(spell_dk_raise_dead_SpellScript::HandleRaiseDead, EFFECT_2, SPELL_EFFECT_DUMMY); + } + + private: + SpellCastResult _result; + bool _corpse; + }; + + SpellScript* GetSpellScript() const + { + return new spell_dk_raise_dead_SpellScript(); + } }; // 59754 Rune Tap - Party class spell_dk_rune_tap_party : public SpellScriptLoader { - public: - spell_dk_rune_tap_party() : SpellScriptLoader("spell_dk_rune_tap_party") { } +public: + spell_dk_rune_tap_party() : SpellScriptLoader("spell_dk_rune_tap_party") { } - class spell_dk_rune_tap_party_SpellScript : public SpellScript + class spell_dk_rune_tap_party_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dk_rune_tap_party_SpellScript); + + void CheckTargets(std::list& targets) { - PrepareSpellScript(spell_dk_rune_tap_party_SpellScript); - - void CheckTargets(std::list& targets) - { - targets.remove(GetCaster()); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dk_rune_tap_party_SpellScript::CheckTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_PARTY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dk_rune_tap_party_SpellScript(); + targets.remove(GetCaster()); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dk_rune_tap_party_SpellScript::CheckTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_PARTY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dk_rune_tap_party_SpellScript(); + } }; // 50421 - Scent of Blood class spell_dk_scent_of_blood : public SpellScriptLoader { - public: - spell_dk_scent_of_blood() : SpellScriptLoader("spell_dk_scent_of_blood") { } +public: + spell_dk_scent_of_blood() : SpellScriptLoader("spell_dk_scent_of_blood") { } - class spell_dk_scent_of_blood_AuraScript : public AuraScript + class spell_dk_scent_of_blood_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_scent_of_blood_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_dk_scent_of_blood_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_DK_SCENT_OF_BLOOD)) - return false; - return true; - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) - { - PreventDefaultAction(); - GetTarget()->CastSpell(GetTarget(), SPELL_DK_SCENT_OF_BLOOD, true, NULL, aurEff); - GetTarget()->RemoveAuraFromStack(GetSpellInfo()->Id); - } - - void Register() - { - OnEffectProc += AuraEffectProcFn(spell_dk_scent_of_blood_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dk_scent_of_blood_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_DK_SCENT_OF_BLOOD)) + return false; + return true; } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + GetTarget()->CastSpell(GetTarget(), SPELL_DK_SCENT_OF_BLOOD, true, NULL, aurEff); + GetTarget()->RemoveAuraFromStack(GetSpellInfo()->Id); + } + + void Register() + { + OnEffectProc += AuraEffectProcFn(spell_dk_scent_of_blood_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dk_scent_of_blood_AuraScript(); + } }; // 55090 - Scourge Strike (55265, 55270, 55271) class spell_dk_scourge_strike : public SpellScriptLoader { - public: - spell_dk_scourge_strike() : SpellScriptLoader("spell_dk_scourge_strike") { } +public: + spell_dk_scourge_strike() : SpellScriptLoader("spell_dk_scourge_strike") { } - class spell_dk_scourge_strike_SpellScript : public SpellScript + class spell_dk_scourge_strike_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dk_scourge_strike_SpellScript); + float multiplier; + uint64 guid; + + bool Load() { - PrepareSpellScript(spell_dk_scourge_strike_SpellScript); - float multiplier; - uint64 guid; + multiplier = 1.0f; + guid = 0; + return true; + } - bool Load() + bool Validate(SpellInfo const* /*spellInfo*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_DK_SCOURGE_STRIKE_TRIGGERED)) + return false; + return true; + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (Unit* unitTarget = GetHitUnit()) { - multiplier = 1.0f; - guid = 0; - return true; + uint8 mode = caster->GetAuraEffectDummy(SPELL_DK_GLYPH_OF_SCOURGE_STRIKE) ? 2 : 0; + float disease_amt = GetEffectValue(); + + // Death Knight T8 Melee 4P Bonus + if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_DK_ITEM_T8_MELEE_4P_BONUS, EFFECT_0)) + AddPct(disease_amt, aurEff->GetAmount()); + + multiplier = disease_amt * unitTarget->GetDiseasesByCaster(caster->GetGUID(), mode) / 100.0f; + guid = unitTarget->GetGUID(); } + } - bool Validate(SpellInfo const* /*spellInfo*/) + void HandleAfterHit() + { + Unit* caster = GetCaster(); + if (Unit* unitTarget = ObjectAccessor::GetUnit(*caster, guid)) { - if (!sSpellMgr->GetSpellInfo(SPELL_DK_SCOURGE_STRIKE_TRIGGERED)) - return false; - return true; - } + int32 bp = GetHitDamage() * multiplier; + caster->CastCustomSpell(unitTarget, SPELL_DK_SCOURGE_STRIKE_TRIGGERED, &bp, nullptr, nullptr, true); - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - if (Unit* unitTarget = GetHitUnit()) + // Xinef: Shadowmourne hack (scourge strike trigger proc disabled...) + if (roll_chance_i(75) && caster->FindMap() && !caster->FindMap()->IsBattlegroundOrArena() && caster->HasAura(71903) && !caster->HasAura(SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF)) { - uint8 mode = caster->GetAuraEffectDummy(SPELL_DK_GLYPH_OF_SCOURGE_STRIKE) ? 2 : 0; - float disease_amt = GetEffectValue(); + caster->CastSpell(caster, SPELL_SHADOWMOURNE_SOUL_FRAGMENT, true); - // Death Knight T8 Melee 4P Bonus - if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_DK_ITEM_T8_MELEE_4P_BONUS, EFFECT_0)) - AddPct(disease_amt, aurEff->GetAmount()); - - multiplier = disease_amt * unitTarget->GetDiseasesByCaster(caster->GetGUID(), mode) / 100.0f; - guid = unitTarget->GetGUID(); - } - } - - void HandleAfterHit() - { - Unit* caster = GetCaster(); - if (Unit *unitTarget = ObjectAccessor::GetUnit(*caster, guid)) - { - int32 bp = GetHitDamage() * multiplier; - caster->CastCustomSpell(unitTarget, SPELL_DK_SCOURGE_STRIKE_TRIGGERED, &bp, nullptr, nullptr, true); - - // Xinef: Shadowmourne hack (scourge strike trigger proc disabled...) - if (roll_chance_i(75) && caster->FindMap() && !caster->FindMap()->IsBattlegroundOrArena() && caster->HasAura(71903) && !caster->HasAura(SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF)) + // this can't be handled in AuraScript of SoulFragments because we need to know victim + if (Aura* soulFragments = caster->GetAura(SPELL_SHADOWMOURNE_SOUL_FRAGMENT)) { - caster->CastSpell(caster, SPELL_SHADOWMOURNE_SOUL_FRAGMENT, true); - - // this can't be handled in AuraScript of SoulFragments because we need to know victim - if (Aura* soulFragments = caster->GetAura(SPELL_SHADOWMOURNE_SOUL_FRAGMENT)) + if (soulFragments->GetStackAmount() >= 10) { - if (soulFragments->GetStackAmount() >= 10) - { - caster->CastSpell(caster, SPELL_SHADOWMOURNE_CHAOS_BANE_DAMAGE, true, nullptr); - soulFragments->Remove(); - } + caster->CastSpell(caster, SPELL_SHADOWMOURNE_CHAOS_BANE_DAMAGE, true, nullptr); + soulFragments->Remove(); } } } } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_dk_scourge_strike_SpellScript::HandleDummy, EFFECT_2, SPELL_EFFECT_DUMMY); - AfterHit += SpellHitFn(spell_dk_scourge_strike_SpellScript::HandleAfterHit); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dk_scourge_strike_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_dk_scourge_strike_SpellScript::HandleDummy, EFFECT_2, SPELL_EFFECT_DUMMY); + AfterHit += SpellHitFn(spell_dk_scourge_strike_SpellScript::HandleAfterHit); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dk_scourge_strike_SpellScript(); + } }; // 49145 - Spell Deflection class spell_dk_spell_deflection : public SpellScriptLoader { - public: - spell_dk_spell_deflection() : SpellScriptLoader("spell_dk_spell_deflection") { } +public: + spell_dk_spell_deflection() : SpellScriptLoader("spell_dk_spell_deflection") { } - class spell_dk_spell_deflection_AuraScript : public AuraScript + class spell_dk_spell_deflection_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_spell_deflection_AuraScript); + + uint32 absorbPct; + + bool Load() { - PrepareAuraScript(spell_dk_spell_deflection_AuraScript); - - uint32 absorbPct; - - bool Load() - { - absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); - return true; - } - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - // Set absorbtion amount to unlimited - amount = -1; - } - - void Absorb(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount) - { - // You have a chance equal to your Parry chance - float chance = GetTarget()->GetUnitParryChance(); - if (GetTarget()->IsNonMeleeSpellCast(false, false, true) || GetTarget()->HasUnitState(UNIT_STATE_CONTROLLED)) - chance = 0.0f; - - if ((dmgInfo.GetDamageType() == SPELL_DIRECT_DAMAGE) && roll_chance_f(chance)) - absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct); - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_spell_deflection_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); - OnEffectAbsorb += AuraEffectAbsorbFn(spell_dk_spell_deflection_AuraScript::Absorb, EFFECT_0); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dk_spell_deflection_AuraScript(); + absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); + return true; } + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + // Set absorbtion amount to unlimited + amount = -1; + } + + void Absorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount) + { + // You have a chance equal to your Parry chance + float chance = GetTarget()->GetUnitParryChance(); + if (GetTarget()->IsNonMeleeSpellCast(false, false, true) || GetTarget()->HasUnitState(UNIT_STATE_CONTROLLED)) + chance = 0.0f; + + if ((dmgInfo.GetDamageType() == SPELL_DIRECT_DAMAGE) && roll_chance_f(chance)) + absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct); + } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_spell_deflection_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); + OnEffectAbsorb += AuraEffectAbsorbFn(spell_dk_spell_deflection_AuraScript::Absorb, EFFECT_0); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dk_spell_deflection_AuraScript(); + } }; // 55233 - Vampiric Blood class spell_dk_vampiric_blood : public SpellScriptLoader { - public: - spell_dk_vampiric_blood() : SpellScriptLoader("spell_dk_vampiric_blood") { } +public: + spell_dk_vampiric_blood() : SpellScriptLoader("spell_dk_vampiric_blood") { } - class spell_dk_vampiric_blood_AuraScript : public AuraScript + class spell_dk_vampiric_blood_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_vampiric_blood_AuraScript); + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) { - PrepareAuraScript(spell_dk_vampiric_blood_AuraScript); - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - amount = GetUnitOwner()->CountPctFromMaxHealth(amount); - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_vampiric_blood_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_INCREASE_HEALTH); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dk_vampiric_blood_AuraScript(); + amount = GetUnitOwner()->CountPctFromMaxHealth(amount); } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_vampiric_blood_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_INCREASE_HEALTH); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dk_vampiric_blood_AuraScript(); + } }; // 52284 - Will of the Necropolis class spell_dk_will_of_the_necropolis : public SpellScriptLoader { - public: - spell_dk_will_of_the_necropolis() : SpellScriptLoader("spell_dk_will_of_the_necropolis") { } +public: + spell_dk_will_of_the_necropolis() : SpellScriptLoader("spell_dk_will_of_the_necropolis") { } - class spell_dk_will_of_the_necropolis_AuraScript : public AuraScript + class spell_dk_will_of_the_necropolis_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_will_of_the_necropolis_AuraScript); + + bool Validate(SpellInfo const* spellInfo) { - PrepareAuraScript(spell_dk_will_of_the_necropolis_AuraScript); + SpellInfo const* firstRankSpellInfo = sSpellMgr->GetSpellInfo(SPELL_DK_WILL_OF_THE_NECROPOLIS_AURA_R1); + if (!firstRankSpellInfo) + return false; - bool Validate(SpellInfo const* spellInfo) - { - SpellInfo const* firstRankSpellInfo = sSpellMgr->GetSpellInfo(SPELL_DK_WILL_OF_THE_NECROPOLIS_AURA_R1); - if (!firstRankSpellInfo) - return false; + // can't use other spell than will of the necropolis due to spell_ranks dependency + if (!spellInfo->IsRankOf(firstRankSpellInfo)) + return false; - // can't use other spell than will of the necropolis due to spell_ranks dependency - if (!spellInfo->IsRankOf(firstRankSpellInfo)) - return false; + uint8 rank = spellInfo->GetRank(); + if (!sSpellMgr->GetSpellWithRank(SPELL_DK_WILL_OF_THE_NECROPOLIS_TALENT_R1, rank, true)) + return false; - uint8 rank = spellInfo->GetRank(); - if (!sSpellMgr->GetSpellWithRank(SPELL_DK_WILL_OF_THE_NECROPOLIS_TALENT_R1, rank, true)) - return false; - - return true; - } - - uint32 absorbPct; - - bool Load() - { - absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); - return true; - } - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - // Set absorbtion amount to unlimited - amount = -1; - } - - void Absorb(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount) - { - // min pct of hp is stored in effect 0 of talent spell - uint8 rank = GetSpellInfo()->GetRank(); - SpellInfo const* talentProto = sSpellMgr->GetSpellInfo(sSpellMgr->GetSpellWithRank(SPELL_DK_WILL_OF_THE_NECROPOLIS_TALENT_R1, rank)); - - int32 remainingHp = int32(GetTarget()->GetHealth() - dmgInfo.GetDamage()); - int32 minHp = int32(GetTarget()->CountPctFromMaxHealth(talentProto->Effects[EFFECT_0].CalcValue(GetCaster()))); - - // Damage that would take you below [effect0] health or taken while you are at [effect0] - if (remainingHp < minHp) - absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct); - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_will_of_the_necropolis_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); - OnEffectAbsorb += AuraEffectAbsorbFn(spell_dk_will_of_the_necropolis_AuraScript::Absorb, EFFECT_0); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dk_will_of_the_necropolis_AuraScript(); + return true; } + + uint32 absorbPct; + + bool Load() + { + absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); + return true; + } + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + // Set absorbtion amount to unlimited + amount = -1; + } + + void Absorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount) + { + // min pct of hp is stored in effect 0 of talent spell + uint8 rank = GetSpellInfo()->GetRank(); + SpellInfo const* talentProto = sSpellMgr->GetSpellInfo(sSpellMgr->GetSpellWithRank(SPELL_DK_WILL_OF_THE_NECROPOLIS_TALENT_R1, rank)); + + int32 remainingHp = int32(GetTarget()->GetHealth() - dmgInfo.GetDamage()); + int32 minHp = int32(GetTarget()->CountPctFromMaxHealth(talentProto->Effects[EFFECT_0].CalcValue(GetCaster()))); + + // Damage that would take you below [effect0] health or taken while you are at [effect0] + if (remainingHp < minHp) + absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct); + } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_will_of_the_necropolis_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); + OnEffectAbsorb += AuraEffectAbsorbFn(spell_dk_will_of_the_necropolis_AuraScript::Absorb, EFFECT_0); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dk_will_of_the_necropolis_AuraScript(); + } }; void AddSC_deathknight_spell_scripts() diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp index 12eebfee7..aee54f88e 100644 --- a/src/server/scripts/Spells/spell_druid.cpp +++ b/src/server/scripts/Spells/spell_druid.cpp @@ -53,316 +53,316 @@ enum DruidSpells // Ours class spell_dru_t10_balance_4p_bonus : public SpellScriptLoader { - public: - spell_dru_t10_balance_4p_bonus() : SpellScriptLoader("spell_dru_t10_balance_4p_bonus") { } +public: + spell_dru_t10_balance_4p_bonus() : SpellScriptLoader("spell_dru_t10_balance_4p_bonus") { } - class spell_dru_t10_balance_4p_bonus_AuraScript : public AuraScript + class spell_dru_t10_balance_4p_bonus_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_t10_balance_4p_bonus_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_dru_t10_balance_4p_bonus_AuraScript); - - bool CheckProc(ProcEventInfo& eventInfo) - { - return eventInfo.GetActor() && eventInfo.GetProcTarget(); - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - - uint32 triggered_spell_id = 71023; - SpellInfo const* triggeredSpell = sSpellMgr->GetSpellInfo(triggered_spell_id); - - int32 amount = CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount()) / triggeredSpell->GetMaxTicks(); - eventInfo.GetProcTarget()->CastDelayedSpellWithPeriodicAmount(GetTarget(), triggered_spell_id, SPELL_AURA_PERIODIC_DAMAGE, amount, EFFECT_0); - - //GetTarget()->CastCustomSpell(triggered_spell_id, SPELLVALUE_BASE_POINT0, amount, eventInfo.GetProcTarget(), true, NULL, aurEff); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_dru_t10_balance_4p_bonus_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_dru_t10_balance_4p_bonus_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dru_t10_balance_4p_bonus_AuraScript(); + return eventInfo.GetActor() && eventInfo.GetProcTarget(); } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + uint32 triggered_spell_id = 71023; + SpellInfo const* triggeredSpell = sSpellMgr->GetSpellInfo(triggered_spell_id); + + int32 amount = CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount()) / triggeredSpell->GetMaxTicks(); + eventInfo.GetProcTarget()->CastDelayedSpellWithPeriodicAmount(GetTarget(), triggered_spell_id, SPELL_AURA_PERIODIC_DAMAGE, amount, EFFECT_0); + + //GetTarget()->CastCustomSpell(triggered_spell_id, SPELLVALUE_BASE_POINT0, amount, eventInfo.GetProcTarget(), true, NULL, aurEff); + } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_dru_t10_balance_4p_bonus_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_dru_t10_balance_4p_bonus_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dru_t10_balance_4p_bonus_AuraScript(); + } }; class spell_dru_nurturing_instinct : public SpellScriptLoader { - public: - spell_dru_nurturing_instinct() : SpellScriptLoader("spell_dru_nurturing_instinct") { } +public: + spell_dru_nurturing_instinct() : SpellScriptLoader("spell_dru_nurturing_instinct") { } - class spell_dru_nurturing_instinct_AuraScript : public AuraScript + class spell_dru_nurturing_instinct_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_nurturing_instinct_AuraScript); + + void AfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_dru_nurturing_instinct_AuraScript); - - void AfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Player* player = GetTarget()->ToPlayer()) - player->addSpell(GetSpellInfo()->GetRank() == 1 ? SPELL_DRUID_NURTURING_INSTINCT_R1 : SPELL_DRUID_NURTURING_INSTINCT_R2, SPEC_MASK_ALL, false, true); - } - - void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Player* player = GetTarget()->ToPlayer()) - player->removeSpell(GetSpellInfo()->GetRank() == 1 ? SPELL_DRUID_NURTURING_INSTINCT_R1 : SPELL_DRUID_NURTURING_INSTINCT_R2, SPEC_MASK_ALL, true); - } - - void Register() - { - AfterEffectApply += AuraEffectApplyFn(spell_dru_nurturing_instinct_AuraScript::AfterApply, EFFECT_0, SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_dru_nurturing_instinct_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dru_nurturing_instinct_AuraScript(); + if (Player* player = GetTarget()->ToPlayer()) + player->addSpell(GetSpellInfo()->GetRank() == 1 ? SPELL_DRUID_NURTURING_INSTINCT_R1 : SPELL_DRUID_NURTURING_INSTINCT_R2, SPEC_MASK_ALL, false, true); } + + void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Player* player = GetTarget()->ToPlayer()) + player->removeSpell(GetSpellInfo()->GetRank() == 1 ? SPELL_DRUID_NURTURING_INSTINCT_R1 : SPELL_DRUID_NURTURING_INSTINCT_R2, SPEC_MASK_ALL, true); + } + + void Register() + { + AfterEffectApply += AuraEffectApplyFn(spell_dru_nurturing_instinct_AuraScript::AfterApply, EFFECT_0, SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_dru_nurturing_instinct_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dru_nurturing_instinct_AuraScript(); + } }; class spell_dru_feral_swiftness : public SpellScriptLoader { - public: - spell_dru_feral_swiftness() : SpellScriptLoader("spell_dru_feral_swiftness") { } +public: + spell_dru_feral_swiftness() : SpellScriptLoader("spell_dru_feral_swiftness") { } - class spell_dru_feral_swiftness_AuraScript : public AuraScript + class spell_dru_feral_swiftness_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_feral_swiftness_AuraScript); + + void AfterApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_dru_feral_swiftness_AuraScript); - - void AfterApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - if (Player* player = GetTarget()->ToPlayer()) - if (uint8 rank = player->HasTalent(SPELL_DRUID_FERAL_SWIFTNESS_R1, player->GetActiveSpec()) ? 1 : (player->HasTalent(SPELL_DRUID_FERAL_SWIFTNESS_R2, player->GetActiveSpec()) ? 2 : 0)) - player->CastSpell(player, rank == 1 ? SPELL_DRUID_FERAL_SWIFTNESS_PASSIVE_1 : SPELL_DRUID_FERAL_SWIFTNESS_PASSIVE_2, true, NULL, aurEff, GetCasterGUID()); - } - - void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetTarget()->RemoveAurasDueToSpell(SPELL_DRUID_FERAL_SWIFTNESS_PASSIVE_1); - GetTarget()->RemoveAurasDueToSpell(SPELL_DRUID_FERAL_SWIFTNESS_PASSIVE_2); - } - - void Register() - { - AfterEffectApply += AuraEffectApplyFn(spell_dru_feral_swiftness_AuraScript::AfterApply, EFFECT_0, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_dru_feral_swiftness_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dru_feral_swiftness_AuraScript(); + if (Player* player = GetTarget()->ToPlayer()) + if (uint8 rank = player->HasTalent(SPELL_DRUID_FERAL_SWIFTNESS_R1, player->GetActiveSpec()) ? 1 : (player->HasTalent(SPELL_DRUID_FERAL_SWIFTNESS_R2, player->GetActiveSpec()) ? 2 : 0)) + player->CastSpell(player, rank == 1 ? SPELL_DRUID_FERAL_SWIFTNESS_PASSIVE_1 : SPELL_DRUID_FERAL_SWIFTNESS_PASSIVE_2, true, NULL, aurEff, GetCasterGUID()); } + + void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->RemoveAurasDueToSpell(SPELL_DRUID_FERAL_SWIFTNESS_PASSIVE_1); + GetTarget()->RemoveAurasDueToSpell(SPELL_DRUID_FERAL_SWIFTNESS_PASSIVE_2); + } + + void Register() + { + AfterEffectApply += AuraEffectApplyFn(spell_dru_feral_swiftness_AuraScript::AfterApply, EFFECT_0, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_dru_feral_swiftness_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dru_feral_swiftness_AuraScript(); + } }; class spell_dru_omen_of_clarity : public SpellScriptLoader { - public: - spell_dru_omen_of_clarity() : SpellScriptLoader("spell_dru_omen_of_clarity") { } +public: + spell_dru_omen_of_clarity() : SpellScriptLoader("spell_dru_omen_of_clarity") { } - class spell_dru_omen_of_clarity_AuraScript : public AuraScript + class spell_dru_omen_of_clarity_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_omen_of_clarity_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_dru_omen_of_clarity_AuraScript); + const SpellInfo* spellInfo = eventInfo.GetDamageInfo()->GetSpellInfo(); + if (!spellInfo) + return true; - bool CheckProc(ProcEventInfo& eventInfo) - { - const SpellInfo* spellInfo = eventInfo.GetDamageInfo()->GetSpellInfo(); - if (!spellInfo) - return true; + // xinef: no mana cost + if (spellInfo->ManaCost == 0 && spellInfo->ManaCostPercentage == 0) + return false; - // xinef: no mana cost - if (spellInfo->ManaCost == 0 && spellInfo->ManaCostPercentage == 0) - return false; - - // xinef: SPELL_ATTR0_CU_NO_INITIAL_THREAT and SPELL_ATTR0_CU_DIRECT_DAMAGE contains spells capable of healing and damaging + some others, but this is taken care of above - return spellInfo->HasAttribute(SpellCustomAttributes(SPELL_ATTR0_CU_DIRECT_DAMAGE|SPELL_ATTR0_CU_NO_INITIAL_THREAT)); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_dru_omen_of_clarity_AuraScript::CheckProc); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dru_omen_of_clarity_AuraScript(); + // xinef: SPELL_ATTR0_CU_NO_INITIAL_THREAT and SPELL_ATTR0_CU_DIRECT_DAMAGE contains spells capable of healing and damaging + some others, but this is taken care of above + return spellInfo->HasAttribute(SpellCustomAttributes(SPELL_ATTR0_CU_DIRECT_DAMAGE | SPELL_ATTR0_CU_NO_INITIAL_THREAT)); } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_dru_omen_of_clarity_AuraScript::CheckProc); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dru_omen_of_clarity_AuraScript(); + } }; class spell_dru_brambles_treant : public SpellScriptLoader { - public: - spell_dru_brambles_treant() : SpellScriptLoader("spell_dru_brambles_treant") { } +public: + spell_dru_brambles_treant() : SpellScriptLoader("spell_dru_brambles_treant") { } - class spell_dru_brambles_treant_AuraScript : public AuraScript + class spell_dru_brambles_treant_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_brambles_treant_AuraScript); + + bool CheckProc(ProcEventInfo& /*eventInfo*/) { - PrepareAuraScript(spell_dru_brambles_treant_AuraScript); - - bool CheckProc(ProcEventInfo& /*eventInfo*/) + if (Player* player = GetUnitOwner()->GetSpellModOwner()) { - if (Player* player = GetUnitOwner()->GetSpellModOwner()) - { - int32 amount = 0; - if (player->HasAura(SPELL_DRUID_BARKSKIN, player->GetGUID())) - player->ApplySpellMod(SPELL_DRUID_BARKSKIN, SPELLMOD_CHANCE_OF_SUCCESS, amount); + int32 amount = 0; + if (player->HasAura(SPELL_DRUID_BARKSKIN, player->GetGUID())) + player->ApplySpellMod(SPELL_DRUID_BARKSKIN, SPELLMOD_CHANCE_OF_SUCCESS, amount); - return roll_chance_i(amount); - } - - return false; + return roll_chance_i(amount); } - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - // xinef: chance of success stores proper amount of damage increase - // xinef: little hack because GetSpellModOwner will return NULL pointer at this point (early summoning stage) - if (GetUnitOwner()->IsSummon()) - if (Unit* owner = GetUnitOwner()->ToTempSummon()->GetSummoner()) - if (Player* player = owner->GetSpellModOwner()) - player->ApplySpellMod(SPELL_DRUID_BARKSKIN, SPELLMOD_CHANCE_OF_SUCCESS, amount); - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_brambles_treant_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE); - DoCheckProc += AuraCheckProcFn(spell_dru_brambles_treant_AuraScript::CheckProc); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dru_brambles_treant_AuraScript(); + return false; } + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + // xinef: chance of success stores proper amount of damage increase + // xinef: little hack because GetSpellModOwner will return NULL pointer at this point (early summoning stage) + if (GetUnitOwner()->IsSummon()) + if (Unit* owner = GetUnitOwner()->ToTempSummon()->GetSummoner()) + if (Player* player = owner->GetSpellModOwner()) + player->ApplySpellMod(SPELL_DRUID_BARKSKIN, SPELLMOD_CHANCE_OF_SUCCESS, amount); + } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_brambles_treant_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE); + DoCheckProc += AuraCheckProcFn(spell_dru_brambles_treant_AuraScript::CheckProc); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dru_brambles_treant_AuraScript(); + } }; class spell_dru_barkskin : public SpellScriptLoader { - public: - spell_dru_barkskin() : SpellScriptLoader("spell_dru_barkskin") { } +public: + spell_dru_barkskin() : SpellScriptLoader("spell_dru_barkskin") { } - class spell_dru_barkskin_AuraScript : public AuraScript + class spell_dru_barkskin_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_barkskin_AuraScript); + + void AfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_dru_barkskin_AuraScript); - - void AfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (GetUnitOwner()->HasAura(SPELL_DRUID_GLYPH_OF_BARKSKIN, GetUnitOwner()->GetGUID())) - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_DRUID_GLYPH_OF_BARKSKIN_TRIGGER, true); - } - - void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetUnitOwner()->RemoveAurasDueToSpell(SPELL_DRUID_GLYPH_OF_BARKSKIN_TRIGGER, GetUnitOwner()->GetGUID()); - } - - void Register() - { - AfterEffectApply += AuraEffectApplyFn(spell_dru_barkskin_AuraScript::AfterApply, EFFECT_0, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_dru_barkskin_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dru_barkskin_AuraScript(); + if (GetUnitOwner()->HasAura(SPELL_DRUID_GLYPH_OF_BARKSKIN, GetUnitOwner()->GetGUID())) + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_DRUID_GLYPH_OF_BARKSKIN_TRIGGER, true); } + + void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetUnitOwner()->RemoveAurasDueToSpell(SPELL_DRUID_GLYPH_OF_BARKSKIN_TRIGGER, GetUnitOwner()->GetGUID()); + } + + void Register() + { + AfterEffectApply += AuraEffectApplyFn(spell_dru_barkskin_AuraScript::AfterApply, EFFECT_0, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_dru_barkskin_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dru_barkskin_AuraScript(); + } }; class spell_dru_treant_scaling : public SpellScriptLoader { - public: - spell_dru_treant_scaling() : SpellScriptLoader("spell_dru_treant_scaling") { } +public: + spell_dru_treant_scaling() : SpellScriptLoader("spell_dru_treant_scaling") { } - class spell_dru_treant_scaling_AuraScript : public AuraScript + class spell_dru_treant_scaling_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_treant_scaling_AuraScript); + + void CalculateResistanceAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) { - PrepareAuraScript(spell_dru_treant_scaling_AuraScript); - - void CalculateResistanceAmount(AuraEffect const* aurEff, int32 & amount, bool & /*canBeRecalculated*/) + // xinef: treant inherits 40% of resistance from owner and 35% of armor (guessed) + if (Unit* owner = GetUnitOwner()->GetOwner()) { - // xinef: treant inherits 40% of resistance from owner and 35% of armor (guessed) - if (Unit* owner = GetUnitOwner()->GetOwner()) - { - SpellSchoolMask schoolMask = SpellSchoolMask(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].MiscValue); - int32 modifier = schoolMask == SPELL_SCHOOL_MASK_NORMAL ? 35 : 40; - amount = CalculatePct(std::max(0, owner->GetResistance(schoolMask)), modifier); - } + SpellSchoolMask schoolMask = SpellSchoolMask(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].MiscValue); + int32 modifier = schoolMask == SPELL_SCHOOL_MASK_NORMAL ? 35 : 40; + amount = CalculatePct(std::max(0, owner->GetResistance(schoolMask)), modifier); } - - void CalculateStatAmount(AuraEffect const* aurEff, int32 & amount, bool & /*canBeRecalculated*/) - { - // xinef: treant inherits 30% of intellect / stamina (guessed) - if (Unit* owner = GetUnitOwner()->GetOwner()) - { - Stats stat = Stats(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].MiscValue); - amount = CalculatePct(std::max(0, owner->GetStat(stat)), 30); - } - } - - void CalculateAPAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - // xinef: treant inherits 105% of SP as AP - 15% of damage increase per hit - if (Unit* owner = GetUnitOwner()->GetOwner()) - { - int32 nature = owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_NATURE); - amount = CalculatePct(std::max(0, nature), 105); - - // xinef: brambles talent - if (AuraEffect const* bramblesEff = owner->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_DRUID, 53, 2)) - AddPct(amount, bramblesEff->GetAmount()); - } - } - - void CalculateSPAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - // xinef: treant inherits 15% of SP - if (Unit* owner = GetUnitOwner()->GetOwner()) - { - int32 nature = owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_NATURE); - amount = CalculatePct(std::max(0, nature), 15); - - // xinef: Update appropriate player field - if (owner->GetTypeId() == TYPEID_PLAYER) - owner->SetUInt32Value(PLAYER_PET_SPELL_POWER, (uint32)amount); - } - } - - void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, aurEff->GetAuraType(), true, SPELL_BLOCK_TYPE_POSITIVE); - if (aurEff->GetAuraType() == SPELL_AURA_MOD_ATTACK_POWER) - GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_ATTACK_POWER_PCT, true, SPELL_BLOCK_TYPE_POSITIVE); - else if (aurEff->GetAuraType() == SPELL_AURA_MOD_STAT) - GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, true, SPELL_BLOCK_TYPE_POSITIVE); - } - - void Register() - { - if (m_scriptSpellId != 35669) - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_treant_scaling_AuraScript::CalculateResistanceAmount, EFFECT_ALL, SPELL_AURA_MOD_RESISTANCE); - - if (m_scriptSpellId == 35669 || m_scriptSpellId == 35670) - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_treant_scaling_AuraScript::CalculateStatAmount, EFFECT_ALL, SPELL_AURA_MOD_STAT); - - if (m_scriptSpellId == 35669) - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_treant_scaling_AuraScript::CalculateAPAmount, EFFECT_ALL, SPELL_AURA_MOD_ATTACK_POWER); - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_treant_scaling_AuraScript::CalculateSPAmount, EFFECT_ALL, SPELL_AURA_MOD_DAMAGE_DONE); - } - - OnEffectApply += AuraEffectApplyFn(spell_dru_treant_scaling_AuraScript::HandleEffectApply, EFFECT_ALL, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dru_treant_scaling_AuraScript(); } + + void CalculateStatAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) + { + // xinef: treant inherits 30% of intellect / stamina (guessed) + if (Unit* owner = GetUnitOwner()->GetOwner()) + { + Stats stat = Stats(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].MiscValue); + amount = CalculatePct(std::max(0, owner->GetStat(stat)), 30); + } + } + + void CalculateAPAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + // xinef: treant inherits 105% of SP as AP - 15% of damage increase per hit + if (Unit* owner = GetUnitOwner()->GetOwner()) + { + int32 nature = owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_NATURE); + amount = CalculatePct(std::max(0, nature), 105); + + // xinef: brambles talent + if (AuraEffect const* bramblesEff = owner->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_DRUID, 53, 2)) + AddPct(amount, bramblesEff->GetAmount()); + } + } + + void CalculateSPAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + // xinef: treant inherits 15% of SP + if (Unit* owner = GetUnitOwner()->GetOwner()) + { + int32 nature = owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_NATURE); + amount = CalculatePct(std::max(0, nature), 15); + + // xinef: Update appropriate player field + if (owner->GetTypeId() == TYPEID_PLAYER) + owner->SetUInt32Value(PLAYER_PET_SPELL_POWER, (uint32)amount); + } + } + + void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, aurEff->GetAuraType(), true, SPELL_BLOCK_TYPE_POSITIVE); + if (aurEff->GetAuraType() == SPELL_AURA_MOD_ATTACK_POWER) + GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_ATTACK_POWER_PCT, true, SPELL_BLOCK_TYPE_POSITIVE); + else if (aurEff->GetAuraType() == SPELL_AURA_MOD_STAT) + GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, true, SPELL_BLOCK_TYPE_POSITIVE); + } + + void Register() + { + if (m_scriptSpellId != 35669) + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_treant_scaling_AuraScript::CalculateResistanceAmount, EFFECT_ALL, SPELL_AURA_MOD_RESISTANCE); + + if (m_scriptSpellId == 35669 || m_scriptSpellId == 35670) + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_treant_scaling_AuraScript::CalculateStatAmount, EFFECT_ALL, SPELL_AURA_MOD_STAT); + + if (m_scriptSpellId == 35669) + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_treant_scaling_AuraScript::CalculateAPAmount, EFFECT_ALL, SPELL_AURA_MOD_ATTACK_POWER); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_treant_scaling_AuraScript::CalculateSPAmount, EFFECT_ALL, SPELL_AURA_MOD_DAMAGE_DONE); + } + + OnEffectApply += AuraEffectApplyFn(spell_dru_treant_scaling_AuraScript::HandleEffectApply, EFFECT_ALL, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dru_treant_scaling_AuraScript(); + } }; @@ -370,1000 +370,1000 @@ class spell_dru_treant_scaling : public SpellScriptLoader // -1850 - Dash class spell_dru_dash : public SpellScriptLoader { - public: - spell_dru_dash() : SpellScriptLoader("spell_dru_dash") { } +public: + spell_dru_dash() : SpellScriptLoader("spell_dru_dash") { } - class spell_dru_dash_AuraScript : public AuraScript + class spell_dru_dash_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_dash_AuraScript); + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) { - PrepareAuraScript(spell_dru_dash_AuraScript); - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - // do not set speed if not in cat form - if (GetUnitOwner()->GetShapeshiftForm() != FORM_CAT) - amount = 0; - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_dash_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_INCREASE_SPEED); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dru_dash_AuraScript(); + // do not set speed if not in cat form + if (GetUnitOwner()->GetShapeshiftForm() != FORM_CAT) + amount = 0; } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_dash_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_INCREASE_SPEED); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dru_dash_AuraScript(); + } }; // 5229 - Enrage class spell_dru_enrage : public SpellScriptLoader { - public: - spell_dru_enrage() : SpellScriptLoader("spell_dru_enrage") { } +public: + spell_dru_enrage() : SpellScriptLoader("spell_dru_enrage") { } - class spell_dru_enrage_SpellScript : public SpellScript + class spell_dru_enrage_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dru_enrage_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_dru_enrage_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_KING_OF_THE_JUNGLE) + if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_KING_OF_THE_JUNGLE) || !sSpellMgr->GetSpellInfo(SPELL_DRUID_ENRAGE_MOD_DAMAGE)) - return false; - return true; - } - - void OnHit() - { - if (AuraEffect const* aurEff = GetHitUnit()->GetAuraEffectOfRankedSpell(SPELL_DRUID_KING_OF_THE_JUNGLE, EFFECT_0)) - GetHitUnit()->CastCustomSpell(SPELL_DRUID_ENRAGE_MOD_DAMAGE, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetHitUnit(), true); - } - - void Register() - { - AfterHit += SpellHitFn(spell_dru_enrage_SpellScript::OnHit); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dru_enrage_SpellScript(); + return false; + return true; } + + void OnHit() + { + if (AuraEffect const* aurEff = GetHitUnit()->GetAuraEffectOfRankedSpell(SPELL_DRUID_KING_OF_THE_JUNGLE, EFFECT_0)) + GetHitUnit()->CastCustomSpell(SPELL_DRUID_ENRAGE_MOD_DAMAGE, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetHitUnit(), true); + } + + void Register() + { + AfterHit += SpellHitFn(spell_dru_enrage_SpellScript::OnHit); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dru_enrage_SpellScript(); + } }; // 54846 - Glyph of Starfire class spell_dru_glyph_of_starfire : public SpellScriptLoader { - public: - spell_dru_glyph_of_starfire() : SpellScriptLoader("spell_dru_glyph_of_starfire") { } +public: + spell_dru_glyph_of_starfire() : SpellScriptLoader("spell_dru_glyph_of_starfire") { } - class spell_dru_glyph_of_starfire_SpellScript : public SpellScript + class spell_dru_glyph_of_starfire_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dru_glyph_of_starfire_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_dru_glyph_of_starfire_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_INCREASED_MOONFIRE_DURATION) || !sSpellMgr->GetSpellInfo(SPELL_DRUID_NATURES_SPLENDOR)) - return false; - return true; - } - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - if (Unit* unitTarget = GetHitUnit()) - if (AuraEffect const* aurEff = unitTarget->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x00000002, 0, 0, caster->GetGUID())) - { - Aura* aura = aurEff->GetBase(); - - uint32 countMin = aura->GetMaxDuration(); - uint32 countMax = aura->GetSpellInfo()->GetMaxDuration() + 9000; - if (caster->HasAura(SPELL_DRUID_INCREASED_MOONFIRE_DURATION)) - countMax += 3000; - if (caster->HasAura(SPELL_DRUID_NATURES_SPLENDOR)) - countMax += 3000; - - if (countMin < countMax) - { - aura->SetDuration(uint32(aura->GetDuration() + 3000)); - aura->SetMaxDuration(countMin + 3000); - } - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_dru_glyph_of_starfire_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dru_glyph_of_starfire_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_INCREASED_MOONFIRE_DURATION) || !sSpellMgr->GetSpellInfo(SPELL_DRUID_NATURES_SPLENDOR)) + return false; + return true; } + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (Unit* unitTarget = GetHitUnit()) + if (AuraEffect const* aurEff = unitTarget->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x00000002, 0, 0, caster->GetGUID())) + { + Aura* aura = aurEff->GetBase(); + + uint32 countMin = aura->GetMaxDuration(); + uint32 countMax = aura->GetSpellInfo()->GetMaxDuration() + 9000; + if (caster->HasAura(SPELL_DRUID_INCREASED_MOONFIRE_DURATION)) + countMax += 3000; + if (caster->HasAura(SPELL_DRUID_NATURES_SPLENDOR)) + countMax += 3000; + + if (countMin < countMax) + { + aura->SetDuration(uint32(aura->GetDuration() + 3000)); + aura->SetMaxDuration(countMin + 3000); + } + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_dru_glyph_of_starfire_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dru_glyph_of_starfire_SpellScript(); + } }; // 34246 - Idol of the Emerald Queen // 60779 - Idol of Lush Moss class spell_dru_idol_lifebloom : public SpellScriptLoader { - public: - spell_dru_idol_lifebloom() : SpellScriptLoader("spell_dru_idol_lifebloom") { } +public: + spell_dru_idol_lifebloom() : SpellScriptLoader("spell_dru_idol_lifebloom") { } - class spell_dru_idol_lifebloom_AuraScript : public AuraScript + class spell_dru_idol_lifebloom_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_idol_lifebloom_AuraScript); + + void HandleEffectCalcSpellMod(AuraEffect const* aurEff, SpellModifier*& spellMod) { - PrepareAuraScript(spell_dru_idol_lifebloom_AuraScript); - - void HandleEffectCalcSpellMod(AuraEffect const* aurEff, SpellModifier*& spellMod) + if (!spellMod) { - if (!spellMod) - { - spellMod = new SpellModifier(GetAura()); - spellMod->op = SPELLMOD_DOT; - spellMod->type = SPELLMOD_FLAT; - spellMod->spellId = GetId(); - spellMod->mask = GetSpellInfo()->Effects[aurEff->GetEffIndex()].SpellClassMask; - } - spellMod->value = aurEff->GetAmount() / 7; + spellMod = new SpellModifier(GetAura()); + spellMod->op = SPELLMOD_DOT; + spellMod->type = SPELLMOD_FLAT; + spellMod->spellId = GetId(); + spellMod->mask = GetSpellInfo()->Effects[aurEff->GetEffIndex()].SpellClassMask; } - - void Register() - { - DoEffectCalcSpellMod += AuraEffectCalcSpellModFn(spell_dru_idol_lifebloom_AuraScript::HandleEffectCalcSpellMod, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dru_idol_lifebloom_AuraScript(); + spellMod->value = aurEff->GetAmount() / 7; } + + void Register() + { + DoEffectCalcSpellMod += AuraEffectCalcSpellModFn(spell_dru_idol_lifebloom_AuraScript::HandleEffectCalcSpellMod, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dru_idol_lifebloom_AuraScript(); + } }; // 29166 - Innervate class spell_dru_innervate : public SpellScriptLoader { - public: - spell_dru_innervate() : SpellScriptLoader("spell_dru_innervate") { } +public: + spell_dru_innervate() : SpellScriptLoader("spell_dru_innervate") { } - class spell_dru_innervate_AuraScript : public AuraScript + class spell_dru_innervate_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_innervate_AuraScript); + + void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) { - PrepareAuraScript(spell_dru_innervate_AuraScript); - - void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) - { - if (Unit* caster = GetCaster()) - amount = int32(CalculatePct(caster->GetCreatePowers(POWER_MANA), amount) / aurEff->GetTotalTicks()); - else - amount = 0; - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_innervate_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_ENERGIZE); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dru_innervate_AuraScript(); + if (Unit* caster = GetCaster()) + amount = int32(CalculatePct(caster->GetCreatePowers(POWER_MANA), amount) / aurEff->GetTotalTicks()); + else + amount = 0; } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_innervate_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_ENERGIZE); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dru_innervate_AuraScript(); + } }; // -5570 - Insect Swarm class spell_dru_insect_swarm : public SpellScriptLoader { - public: - spell_dru_insect_swarm() : SpellScriptLoader("spell_dru_insect_swarm") { } +public: + spell_dru_insect_swarm() : SpellScriptLoader("spell_dru_insect_swarm") { } - class spell_dru_insect_swarm_AuraScript : public AuraScript + class spell_dru_insect_swarm_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_insect_swarm_AuraScript); + + void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) { - PrepareAuraScript(spell_dru_insect_swarm_AuraScript); - - void CalculateAmount(AuraEffect const* aurEff, int32 & amount, bool & /*canBeRecalculated*/) - { - if (Unit* caster = GetCaster()) - if (AuraEffect const* relicAurEff = caster->GetAuraEffect(SPELL_DRUID_ITEM_T8_BALANCE_RELIC, EFFECT_0)) - amount += relicAurEff->GetAmount() / aurEff->GetTotalTicks(); - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_insect_swarm_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dru_insect_swarm_AuraScript(); + if (Unit* caster = GetCaster()) + if (AuraEffect const* relicAurEff = caster->GetAuraEffect(SPELL_DRUID_ITEM_T8_BALANCE_RELIC, EFFECT_0)) + amount += relicAurEff->GetAmount() / aurEff->GetTotalTicks(); } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_insect_swarm_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dru_insect_swarm_AuraScript(); + } }; // -33763 - Lifebloom class spell_dru_lifebloom : public SpellScriptLoader { - public: - spell_dru_lifebloom() : SpellScriptLoader("spell_dru_lifebloom") { } +public: + spell_dru_lifebloom() : SpellScriptLoader("spell_dru_lifebloom") { } - class spell_dru_lifebloom_AuraScript : public AuraScript + class spell_dru_lifebloom_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_lifebloom_AuraScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareAuraScript(spell_dru_lifebloom_AuraScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_LIFEBLOOM_FINAL_HEAL)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_LIFEBLOOM_ENERGIZE)) - return false; - return true; - } - - void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - // Final heal only on duration end - if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) - return; - - // final heal - int32 stack = GetStackAmount(); - int32 healAmount = aurEff->GetAmount(); - const SpellInfo* finalHeal = sSpellMgr->GetSpellInfo(SPELL_DRUID_LIFEBLOOM_FINAL_HEAL); - - if (Unit* caster = GetCaster()) - { - healAmount = caster->SpellHealingBonusDone(GetTarget(), finalHeal, healAmount, HEAL, 0.0f, stack); - healAmount = GetTarget()->SpellHealingBonusTaken(caster, finalHeal, healAmount, HEAL, stack); - // restore mana - int32 returnmana = (GetSpellInfo()->ManaCostPercentage * caster->GetCreateMana() / 100) * stack / 2; - caster->CastCustomSpell(caster, SPELL_DRUID_LIFEBLOOM_ENERGIZE, &returnmana, nullptr, nullptr, true, NULL, aurEff, GetCasterGUID()); - } - GetTarget()->CastCustomSpell(GetTarget(), SPELL_DRUID_LIFEBLOOM_FINAL_HEAL, &healAmount, nullptr, nullptr, true, NULL, aurEff, GetCasterGUID()); - } - - void HandleDispel(DispelInfo* dispelInfo) - { - if (Unit* target = GetUnitOwner()) - { - if (GetEffect(EFFECT_1)) - { - Unit* caster = GetCaster(); - int32 healAmount = GetSpellInfo()->Effects[EFFECT_1].CalcValue(caster ? caster : target, 0, target) * dispelInfo->GetRemovedCharges(); - const SpellInfo* finalHeal = sSpellMgr->GetSpellInfo(SPELL_DRUID_LIFEBLOOM_FINAL_HEAL); - if (caster) - { - // healing with bonus - healAmount = caster->SpellHealingBonusDone(target, finalHeal, healAmount, HEAL, 0.0f, dispelInfo->GetRemovedCharges()); - healAmount = target->SpellHealingBonusTaken(caster, finalHeal, healAmount, HEAL, dispelInfo->GetRemovedCharges()); - - // mana amount - int32 mana = CalculatePct(caster->GetCreateMana(), GetSpellInfo()->ManaCostPercentage) * dispelInfo->GetRemovedCharges() / 2; - caster->CastCustomSpell(caster, SPELL_DRUID_LIFEBLOOM_ENERGIZE, &mana, nullptr, nullptr, true, nullptr, nullptr, GetCasterGUID()); - } - target->CastCustomSpell(target, SPELL_DRUID_LIFEBLOOM_FINAL_HEAL, &healAmount, nullptr, nullptr, true, nullptr, nullptr, GetCasterGUID()); - } - } - } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_dru_lifebloom_AuraScript::AfterRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - AfterDispel += AuraDispelFn(spell_dru_lifebloom_AuraScript::HandleDispel); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dru_lifebloom_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_LIFEBLOOM_FINAL_HEAL)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_LIFEBLOOM_ENERGIZE)) + return false; + return true; } + + void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + // Final heal only on duration end + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) + return; + + // final heal + int32 stack = GetStackAmount(); + int32 healAmount = aurEff->GetAmount(); + const SpellInfo* finalHeal = sSpellMgr->GetSpellInfo(SPELL_DRUID_LIFEBLOOM_FINAL_HEAL); + + if (Unit* caster = GetCaster()) + { + healAmount = caster->SpellHealingBonusDone(GetTarget(), finalHeal, healAmount, HEAL, 0.0f, stack); + healAmount = GetTarget()->SpellHealingBonusTaken(caster, finalHeal, healAmount, HEAL, stack); + // restore mana + int32 returnmana = (GetSpellInfo()->ManaCostPercentage * caster->GetCreateMana() / 100) * stack / 2; + caster->CastCustomSpell(caster, SPELL_DRUID_LIFEBLOOM_ENERGIZE, &returnmana, nullptr, nullptr, true, NULL, aurEff, GetCasterGUID()); + } + GetTarget()->CastCustomSpell(GetTarget(), SPELL_DRUID_LIFEBLOOM_FINAL_HEAL, &healAmount, nullptr, nullptr, true, NULL, aurEff, GetCasterGUID()); + } + + void HandleDispel(DispelInfo* dispelInfo) + { + if (Unit* target = GetUnitOwner()) + { + if (GetEffect(EFFECT_1)) + { + Unit* caster = GetCaster(); + int32 healAmount = GetSpellInfo()->Effects[EFFECT_1].CalcValue(caster ? caster : target, 0, target) * dispelInfo->GetRemovedCharges(); + const SpellInfo* finalHeal = sSpellMgr->GetSpellInfo(SPELL_DRUID_LIFEBLOOM_FINAL_HEAL); + if (caster) + { + // healing with bonus + healAmount = caster->SpellHealingBonusDone(target, finalHeal, healAmount, HEAL, 0.0f, dispelInfo->GetRemovedCharges()); + healAmount = target->SpellHealingBonusTaken(caster, finalHeal, healAmount, HEAL, dispelInfo->GetRemovedCharges()); + + // mana amount + int32 mana = CalculatePct(caster->GetCreateMana(), GetSpellInfo()->ManaCostPercentage) * dispelInfo->GetRemovedCharges() / 2; + caster->CastCustomSpell(caster, SPELL_DRUID_LIFEBLOOM_ENERGIZE, &mana, nullptr, nullptr, true, nullptr, nullptr, GetCasterGUID()); + } + target->CastCustomSpell(target, SPELL_DRUID_LIFEBLOOM_FINAL_HEAL, &healAmount, nullptr, nullptr, true, nullptr, nullptr, GetCasterGUID()); + } + } + } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_dru_lifebloom_AuraScript::AfterRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterDispel += AuraDispelFn(spell_dru_lifebloom_AuraScript::HandleDispel); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dru_lifebloom_AuraScript(); + } }; // -48496 - Living Seed class spell_dru_living_seed : public SpellScriptLoader { - public: - spell_dru_living_seed() : SpellScriptLoader("spell_dru_living_seed") { } +public: + spell_dru_living_seed() : SpellScriptLoader("spell_dru_living_seed") { } - class spell_dru_living_seed_AuraScript : public AuraScript + class spell_dru_living_seed_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_living_seed_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_dru_living_seed_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_LIVING_SEED_PROC)) - return false; - return true; - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - int32 amount = CalculatePct(eventInfo.GetHealInfo()->GetHeal(), aurEff->GetAmount()); - GetTarget()->CastCustomSpell(SPELL_DRUID_LIVING_SEED_PROC, SPELLVALUE_BASE_POINT0, amount, eventInfo.GetProcTarget(), true, NULL, aurEff); - } - - void Register() - { - OnEffectProc += AuraEffectProcFn(spell_dru_living_seed_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dru_living_seed_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_LIVING_SEED_PROC)) + return false; + return true; } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + int32 amount = CalculatePct(eventInfo.GetHealInfo()->GetHeal(), aurEff->GetAmount()); + GetTarget()->CastCustomSpell(SPELL_DRUID_LIVING_SEED_PROC, SPELLVALUE_BASE_POINT0, amount, eventInfo.GetProcTarget(), true, NULL, aurEff); + } + + void Register() + { + OnEffectProc += AuraEffectProcFn(spell_dru_living_seed_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dru_living_seed_AuraScript(); + } }; // 48504 - Living Seed (Proc) class spell_dru_living_seed_proc : public SpellScriptLoader { - public: - spell_dru_living_seed_proc() : SpellScriptLoader("spell_dru_living_seed_proc") { } +public: + spell_dru_living_seed_proc() : SpellScriptLoader("spell_dru_living_seed_proc") { } - class spell_dru_living_seed_proc_AuraScript : public AuraScript + class spell_dru_living_seed_proc_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_living_seed_proc_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_dru_living_seed_proc_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_LIVING_SEED_HEAL)) - return false; - return true; - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) - { - PreventDefaultAction(); - GetTarget()->CastCustomSpell(SPELL_DRUID_LIVING_SEED_HEAL, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetTarget(), true, NULL, aurEff); - } - - void Register() - { - OnEffectProc += AuraEffectProcFn(spell_dru_living_seed_proc_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dru_living_seed_proc_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_LIVING_SEED_HEAL)) + return false; + return true; } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + GetTarget()->CastCustomSpell(SPELL_DRUID_LIVING_SEED_HEAL, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetTarget(), true, NULL, aurEff); + } + + void Register() + { + OnEffectProc += AuraEffectProcFn(spell_dru_living_seed_proc_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dru_living_seed_proc_AuraScript(); + } }; // 69366 - Moonkin Form passive class spell_dru_moonkin_form_passive : public SpellScriptLoader { - public: - spell_dru_moonkin_form_passive() : SpellScriptLoader("spell_dru_moonkin_form_passive") { } +public: + spell_dru_moonkin_form_passive() : SpellScriptLoader("spell_dru_moonkin_form_passive") { } - class spell_dru_moonkin_form_passive_AuraScript : public AuraScript + class spell_dru_moonkin_form_passive_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_moonkin_form_passive_AuraScript); + + uint32 absorbPct; + + bool Load() { - PrepareAuraScript(spell_dru_moonkin_form_passive_AuraScript); - - uint32 absorbPct; - - bool Load() - { - absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); - return true; - } - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - // Set absorbtion amount to unlimited - amount = -1; - } - - void Absorb(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount) - { - // reduces all damage taken while Stunned in Moonkin Form - if (GetTarget()->GetUInt32Value(UNIT_FIELD_FLAGS) & (UNIT_FLAG_STUNNED) && GetTarget()->HasAuraWithMechanic(1<Effects[EFFECT_0].CalcValue(GetCaster()); + return true; } + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + // Set absorbtion amount to unlimited + amount = -1; + } + + void Absorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount) + { + // reduces all damage taken while Stunned in Moonkin Form + if (GetTarget()->GetUInt32Value(UNIT_FIELD_FLAGS) & (UNIT_FLAG_STUNNED) && GetTarget()->HasAuraWithMechanic(1 << MECHANIC_STUN)) + absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct); + } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_moonkin_form_passive_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); + OnEffectAbsorb += AuraEffectAbsorbFn(spell_dru_moonkin_form_passive_AuraScript::Absorb, EFFECT_0); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dru_moonkin_form_passive_AuraScript(); + } }; // 48391 - Owlkin Frenzy class spell_dru_owlkin_frenzy : public SpellScriptLoader { - public: - spell_dru_owlkin_frenzy() : SpellScriptLoader("spell_dru_owlkin_frenzy") { } +public: + spell_dru_owlkin_frenzy() : SpellScriptLoader("spell_dru_owlkin_frenzy") { } - class spell_dru_owlkin_frenzy_AuraScript : public AuraScript + class spell_dru_owlkin_frenzy_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_owlkin_frenzy_AuraScript); + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) { - PrepareAuraScript(spell_dru_owlkin_frenzy_AuraScript); - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - amount = CalculatePct(GetUnitOwner()->GetCreatePowers(POWER_MANA), amount); - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_owlkin_frenzy_AuraScript::CalculateAmount, EFFECT_2, SPELL_AURA_PERIODIC_ENERGIZE); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dru_owlkin_frenzy_AuraScript(); + amount = CalculatePct(GetUnitOwner()->GetCreatePowers(POWER_MANA), amount); } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_owlkin_frenzy_AuraScript::CalculateAmount, EFFECT_2, SPELL_AURA_PERIODIC_ENERGIZE); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dru_owlkin_frenzy_AuraScript(); + } }; // -16972 - Predatory Strikes class spell_dru_predatory_strikes : public SpellScriptLoader { - public: - spell_dru_predatory_strikes() : SpellScriptLoader("spell_dru_predatory_strikes") { } +public: + spell_dru_predatory_strikes() : SpellScriptLoader("spell_dru_predatory_strikes") { } - class spell_dru_predatory_strikes_AuraScript : public AuraScript + class spell_dru_predatory_strikes_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_predatory_strikes_AuraScript); + + void UpdateAmount(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_dru_predatory_strikes_AuraScript); - - void UpdateAmount(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Player* target = GetTarget()->ToPlayer()) - target->UpdateAttackPowerAndDamage(); - } - - void Register() - { - AfterEffectApply += AuraEffectApplyFn(spell_dru_predatory_strikes_AuraScript::UpdateAmount, EFFECT_ALL, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK); - AfterEffectRemove += AuraEffectRemoveFn(spell_dru_predatory_strikes_AuraScript::UpdateAmount, EFFECT_ALL, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dru_predatory_strikes_AuraScript(); + if (Player* target = GetTarget()->ToPlayer()) + target->UpdateAttackPowerAndDamage(); } + + void Register() + { + AfterEffectApply += AuraEffectApplyFn(spell_dru_predatory_strikes_AuraScript::UpdateAmount, EFFECT_ALL, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK); + AfterEffectRemove += AuraEffectRemoveFn(spell_dru_predatory_strikes_AuraScript::UpdateAmount, EFFECT_ALL, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dru_predatory_strikes_AuraScript(); + } }; // 33851 - Primal Tenacity class spell_dru_primal_tenacity : public SpellScriptLoader { - public: - spell_dru_primal_tenacity() : SpellScriptLoader("spell_dru_primal_tenacity") { } +public: + spell_dru_primal_tenacity() : SpellScriptLoader("spell_dru_primal_tenacity") { } - class spell_dru_primal_tenacity_AuraScript : public AuraScript + class spell_dru_primal_tenacity_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_primal_tenacity_AuraScript); + + uint32 absorbPct; + + bool Load() { - PrepareAuraScript(spell_dru_primal_tenacity_AuraScript); - - uint32 absorbPct; - - bool Load() - { - absorbPct = GetSpellInfo()->Effects[EFFECT_1].CalcValue(GetCaster()); - return true; - } - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - // Set absorbtion amount to unlimited - amount = -1; - } - - void Absorb(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount) - { - // reduces all damage taken while Stunned in Cat Form - if (GetTarget()->GetShapeshiftForm() == FORM_CAT && GetTarget()->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED) && GetTarget()->HasAuraWithMechanic(1<Effects[EFFECT_1].CalcValue(GetCaster()); + return true; } + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + // Set absorbtion amount to unlimited + amount = -1; + } + + void Absorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount) + { + // reduces all damage taken while Stunned in Cat Form + if (GetTarget()->GetShapeshiftForm() == FORM_CAT && GetTarget()->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED) && GetTarget()->HasAuraWithMechanic(1 << MECHANIC_STUN)) + absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct); + } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_primal_tenacity_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_SCHOOL_ABSORB); + OnEffectAbsorb += AuraEffectAbsorbFn(spell_dru_primal_tenacity_AuraScript::Absorb, EFFECT_1); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dru_primal_tenacity_AuraScript(); + } }; // -1079 - Rip class spell_dru_rip : public SpellScriptLoader { - public: - spell_dru_rip() : SpellScriptLoader("spell_dru_rip") { } +public: + spell_dru_rip() : SpellScriptLoader("spell_dru_rip") { } - class spell_dru_rip_AuraScript : public AuraScript + class spell_dru_rip_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_rip_AuraScript); + + bool Load() { - PrepareAuraScript(spell_dru_rip_AuraScript); - - bool Load() - { - Unit* caster = GetCaster(); - return caster && caster->GetTypeId() == TYPEID_PLAYER; - } - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) - { - canBeRecalculated = false; - - if (Unit* caster = GetCaster()) - { - // 0.01 * $AP * cp - uint8 cp = caster->ToPlayer()->GetComboPoints(); - - // Idol of Feral Shadows. Can't be handled as SpellMod due its dependency from CPs - if (AuraEffect const* idol = caster->GetAuraEffect(SPELL_DRUID_IDOL_OF_FERAL_SHADOWS, EFFECT_0)) - amount += cp * idol->GetAmount(); - // Idol of Worship. Can't be handled as SpellMod due its dependency from CPs - else if (AuraEffect const* idol = caster->GetAuraEffect(SPELL_DRUID_IDOL_OF_WORSHIP, EFFECT_0)) - amount += cp * idol->GetAmount(); - - amount += int32(CalculatePct(caster->GetTotalAttackPowerValue(BASE_ATTACK), cp)); - } - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_rip_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dru_rip_AuraScript(); + Unit* caster = GetCaster(); + return caster && caster->GetTypeId() == TYPEID_PLAYER; } + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) + { + canBeRecalculated = false; + + if (Unit* caster = GetCaster()) + { + // 0.01 * $AP * cp + uint8 cp = caster->ToPlayer()->GetComboPoints(); + + // Idol of Feral Shadows. Can't be handled as SpellMod due its dependency from CPs + if (AuraEffect const* idol = caster->GetAuraEffect(SPELL_DRUID_IDOL_OF_FERAL_SHADOWS, EFFECT_0)) + amount += cp * idol->GetAmount(); + // Idol of Worship. Can't be handled as SpellMod due its dependency from CPs + else if (AuraEffect const* idol = caster->GetAuraEffect(SPELL_DRUID_IDOL_OF_WORSHIP, EFFECT_0)) + amount += cp * idol->GetAmount(); + + amount += int32(CalculatePct(caster->GetTotalAttackPowerValue(BASE_ATTACK), cp)); + } + } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_rip_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dru_rip_AuraScript(); + } }; // 62606 - Savage Defense class spell_dru_savage_defense : public SpellScriptLoader { - public: - spell_dru_savage_defense() : SpellScriptLoader("spell_dru_savage_defense") { } +public: + spell_dru_savage_defense() : SpellScriptLoader("spell_dru_savage_defense") { } - class spell_dru_savage_defense_AuraScript : public AuraScript + class spell_dru_savage_defense_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_savage_defense_AuraScript); + + uint32 absorbPct; + + bool Load() { - PrepareAuraScript(spell_dru_savage_defense_AuraScript); - - uint32 absorbPct; - - bool Load() - { - absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); - return true; - } - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - // Set absorbtion amount to unlimited - amount = -1; - } - - void Absorb(AuraEffect* aurEff, DamageInfo & /*dmgInfo*/, uint32 & absorbAmount) - { - absorbAmount = uint32(CalculatePct(GetTarget()->GetTotalAttackPowerValue(BASE_ATTACK), absorbPct)); - aurEff->SetAmount(0); - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_savage_defense_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); - OnEffectAbsorb += AuraEffectAbsorbFn(spell_dru_savage_defense_AuraScript::Absorb, EFFECT_0); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dru_savage_defense_AuraScript(); + absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); + return true; } + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + // Set absorbtion amount to unlimited + amount = -1; + } + + void Absorb(AuraEffect* aurEff, DamageInfo& /*dmgInfo*/, uint32& absorbAmount) + { + absorbAmount = uint32(CalculatePct(GetTarget()->GetTotalAttackPowerValue(BASE_ATTACK), absorbPct)); + aurEff->SetAmount(0); + } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_savage_defense_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); + OnEffectAbsorb += AuraEffectAbsorbFn(spell_dru_savage_defense_AuraScript::Absorb, EFFECT_0); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dru_savage_defense_AuraScript(); + } }; // 52610 - Savage Roar class spell_dru_savage_roar : public SpellScriptLoader { - public: - spell_dru_savage_roar() : SpellScriptLoader("spell_dru_savage_roar") { } +public: + spell_dru_savage_roar() : SpellScriptLoader("spell_dru_savage_roar") { } - class spell_dru_savage_roar_SpellScript : public SpellScript + class spell_dru_savage_roar_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dru_savage_roar_SpellScript); + + SpellCastResult CheckCast() { - PrepareSpellScript(spell_dru_savage_roar_SpellScript); + Unit* caster = GetCaster(); + if (caster->GetShapeshiftForm() != FORM_CAT) + return SPELL_FAILED_ONLY_SHAPESHIFT; - SpellCastResult CheckCast() - { - Unit* caster = GetCaster(); - if (caster->GetShapeshiftForm() != FORM_CAT) - return SPELL_FAILED_ONLY_SHAPESHIFT; - - return SPELL_CAST_OK; - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_dru_savage_roar_SpellScript::CheckCast); - } - }; - - class spell_dru_savage_roar_AuraScript : public AuraScript - { - PrepareAuraScript(spell_dru_savage_roar_AuraScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_SAVAGE_ROAR)) - return false; - return true; - } - - void AfterApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - target->CastSpell(target, SPELL_DRUID_SAVAGE_ROAR, true, NULL, aurEff, GetCasterGUID()); - } - - void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetTarget()->RemoveAurasDueToSpell(SPELL_DRUID_SAVAGE_ROAR); - } - - void Register() - { - AfterEffectApply += AuraEffectApplyFn(spell_dru_savage_roar_AuraScript::AfterApply, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_dru_savage_roar_AuraScript::AfterRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dru_savage_roar_SpellScript(); + return SPELL_CAST_OK; } - AuraScript* GetAuraScript() const + void Register() { - return new spell_dru_savage_roar_AuraScript(); + OnCheckCast += SpellCheckCastFn(spell_dru_savage_roar_SpellScript::CheckCast); } + }; + + class spell_dru_savage_roar_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_savage_roar_AuraScript); + + bool Validate(SpellInfo const* /*spell*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_SAVAGE_ROAR)) + return false; + return true; + } + + void AfterApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + target->CastSpell(target, SPELL_DRUID_SAVAGE_ROAR, true, NULL, aurEff, GetCasterGUID()); + } + + void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->RemoveAurasDueToSpell(SPELL_DRUID_SAVAGE_ROAR); + } + + void Register() + { + AfterEffectApply += AuraEffectApplyFn(spell_dru_savage_roar_AuraScript::AfterApply, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_dru_savage_roar_AuraScript::AfterRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dru_savage_roar_SpellScript(); + } + + AuraScript* GetAuraScript() const + { + return new spell_dru_savage_roar_AuraScript(); + } }; // -50294 - Starfall (AOE) class spell_dru_starfall_aoe : public SpellScriptLoader { - public: - spell_dru_starfall_aoe() : SpellScriptLoader("spell_dru_starfall_aoe") { } +public: + spell_dru_starfall_aoe() : SpellScriptLoader("spell_dru_starfall_aoe") { } - class spell_dru_starfall_aoe_SpellScript : public SpellScript + class spell_dru_starfall_aoe_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dru_starfall_aoe_SpellScript); + + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_dru_starfall_aoe_SpellScript); - - void FilterTargets(std::list& targets) - { - targets.remove(GetExplTargetUnit()); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dru_starfall_aoe_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dru_starfall_aoe_SpellScript(); + targets.remove(GetExplTargetUnit()); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dru_starfall_aoe_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dru_starfall_aoe_SpellScript(); + } }; // -50286 - Starfall (Dummy) class spell_dru_starfall_dummy : public SpellScriptLoader { - public: - spell_dru_starfall_dummy() : SpellScriptLoader("spell_dru_starfall_dummy") { } +public: + spell_dru_starfall_dummy() : SpellScriptLoader("spell_dru_starfall_dummy") { } - class spell_dru_starfall_dummy_SpellScript : public SpellScript + class spell_dru_starfall_dummy_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dru_starfall_dummy_SpellScript); + + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_dru_starfall_dummy_SpellScript); - - void FilterTargets(std::list& targets) - { - acore::Containers::RandomResizeList(targets, 2); - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - // Shapeshifting into an animal form or mounting cancels the effect - if (caster->GetCreatureType() == CREATURE_TYPE_BEAST || caster->IsMounted()) - { - if (SpellInfo const* spellInfo = GetTriggeringSpell()) - caster->RemoveAurasDueToSpell(spellInfo->Id); - return; - } - - // Any effect which causes you to lose control of your character will supress the starfall effect. - if (caster->HasUnitState(UNIT_STATE_CONTROLLED)) - return; - - caster->CastSpell(GetHitUnit(), uint32(GetEffectValue()), true); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dru_starfall_dummy_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - OnEffectHitTarget += SpellEffectFn(spell_dru_starfall_dummy_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dru_starfall_dummy_SpellScript(); + acore::Containers::RandomResizeList(targets, 2); } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + // Shapeshifting into an animal form or mounting cancels the effect + if (caster->GetCreatureType() == CREATURE_TYPE_BEAST || caster->IsMounted()) + { + if (SpellInfo const* spellInfo = GetTriggeringSpell()) + caster->RemoveAurasDueToSpell(spellInfo->Id); + return; + } + + // Any effect which causes you to lose control of your character will supress the starfall effect. + if (caster->HasUnitState(UNIT_STATE_CONTROLLED)) + return; + + caster->CastSpell(GetHitUnit(), uint32(GetEffectValue()), true); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dru_starfall_dummy_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_dru_starfall_dummy_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dru_starfall_dummy_SpellScript(); + } }; // 61336 - Survival Instincts class spell_dru_survival_instincts : public SpellScriptLoader { - public: - spell_dru_survival_instincts() : SpellScriptLoader("spell_dru_survival_instincts") { } +public: + spell_dru_survival_instincts() : SpellScriptLoader("spell_dru_survival_instincts") { } - class spell_dru_survival_instincts_SpellScript : public SpellScript + class spell_dru_survival_instincts_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dru_survival_instincts_SpellScript); + + SpellCastResult CheckCast() { - PrepareSpellScript(spell_dru_survival_instincts_SpellScript); + Unit* caster = GetCaster(); + if (!caster->IsInFeralForm()) + return SPELL_FAILED_ONLY_SHAPESHIFT; - SpellCastResult CheckCast() - { - Unit* caster = GetCaster(); - if (!caster->IsInFeralForm()) - return SPELL_FAILED_ONLY_SHAPESHIFT; - - return SPELL_CAST_OK; - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_dru_survival_instincts_SpellScript::CheckCast); - } - }; - - class spell_dru_survival_instincts_AuraScript : public AuraScript - { - PrepareAuraScript(spell_dru_survival_instincts_AuraScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_SURVIVAL_INSTINCTS)) - return false; - return true; - } - - void AfterApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - int32 bp0 = target->CountPctFromMaxHealth(aurEff->GetAmount()); - target->CastCustomSpell(target, SPELL_DRUID_SURVIVAL_INSTINCTS, &bp0, nullptr, nullptr, true); - } - - void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetTarget()->RemoveAurasDueToSpell(SPELL_DRUID_SURVIVAL_INSTINCTS); - } - - void Register() - { - AfterEffectApply += AuraEffectApplyFn(spell_dru_survival_instincts_AuraScript::AfterApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK); - AfterEffectRemove += AuraEffectRemoveFn(spell_dru_survival_instincts_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dru_survival_instincts_SpellScript(); + return SPELL_CAST_OK; } - AuraScript* GetAuraScript() const + void Register() { - return new spell_dru_survival_instincts_AuraScript(); + OnCheckCast += SpellCheckCastFn(spell_dru_survival_instincts_SpellScript::CheckCast); } + }; + + class spell_dru_survival_instincts_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_survival_instincts_AuraScript); + + bool Validate(SpellInfo const* /*spell*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_SURVIVAL_INSTINCTS)) + return false; + return true; + } + + void AfterApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + int32 bp0 = target->CountPctFromMaxHealth(aurEff->GetAmount()); + target->CastCustomSpell(target, SPELL_DRUID_SURVIVAL_INSTINCTS, &bp0, nullptr, nullptr, true); + } + + void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->RemoveAurasDueToSpell(SPELL_DRUID_SURVIVAL_INSTINCTS); + } + + void Register() + { + AfterEffectApply += AuraEffectApplyFn(spell_dru_survival_instincts_AuraScript::AfterApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK); + AfterEffectRemove += AuraEffectRemoveFn(spell_dru_survival_instincts_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dru_survival_instincts_SpellScript(); + } + + AuraScript* GetAuraScript() const + { + return new spell_dru_survival_instincts_AuraScript(); + } }; // 40121 - Swift Flight Form (Passive) class spell_dru_swift_flight_passive : public SpellScriptLoader { - public: - spell_dru_swift_flight_passive() : SpellScriptLoader("spell_dru_swift_flight_passive") { } +public: + spell_dru_swift_flight_passive() : SpellScriptLoader("spell_dru_swift_flight_passive") { } - class spell_dru_swift_flight_passive_AuraScript : public AuraScript + class spell_dru_swift_flight_passive_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_swift_flight_passive_AuraScript); + + bool Load() { - PrepareAuraScript(spell_dru_swift_flight_passive_AuraScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - if (Player* caster = GetCaster()->ToPlayer()) - if (caster->Has310Flyer(false)) - amount = 310; - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_swift_flight_passive_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_INCREASE_VEHICLE_FLIGHT_SPEED); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dru_swift_flight_passive_AuraScript(); + return GetCaster()->GetTypeId() == TYPEID_PLAYER; } + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + if (Player* caster = GetCaster()->ToPlayer()) + if (caster->Has310Flyer(false)) + amount = 310; + } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_swift_flight_passive_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_INCREASE_VEHICLE_FLIGHT_SPEED); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dru_swift_flight_passive_AuraScript(); + } }; // -5217 - Tiger's Fury class spell_dru_tiger_s_fury : public SpellScriptLoader { - public: - spell_dru_tiger_s_fury() : SpellScriptLoader("spell_dru_tiger_s_fury") { } +public: + spell_dru_tiger_s_fury() : SpellScriptLoader("spell_dru_tiger_s_fury") { } - class spell_dru_tiger_s_fury_SpellScript : public SpellScript + class spell_dru_tiger_s_fury_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dru_tiger_s_fury_SpellScript); + + void OnHit() { - PrepareSpellScript(spell_dru_tiger_s_fury_SpellScript); - - void OnHit() - { - if (AuraEffect const* aurEff = GetHitUnit()->GetAuraEffectOfRankedSpell(SPELL_DRUID_KING_OF_THE_JUNGLE, EFFECT_1)) - GetHitUnit()->CastCustomSpell(SPELL_DRUID_TIGER_S_FURY_ENERGIZE, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetHitUnit(), true); - } - - void Register() - { - AfterHit += SpellHitFn(spell_dru_tiger_s_fury_SpellScript::OnHit); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dru_tiger_s_fury_SpellScript(); + if (AuraEffect const* aurEff = GetHitUnit()->GetAuraEffectOfRankedSpell(SPELL_DRUID_KING_OF_THE_JUNGLE, EFFECT_1)) + GetHitUnit()->CastCustomSpell(SPELL_DRUID_TIGER_S_FURY_ENERGIZE, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetHitUnit(), true); } + + void Register() + { + AfterHit += SpellHitFn(spell_dru_tiger_s_fury_SpellScript::OnHit); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dru_tiger_s_fury_SpellScript(); + } }; // -61391 - Typhoon class spell_dru_typhoon : public SpellScriptLoader { - public: - spell_dru_typhoon() : SpellScriptLoader("spell_dru_typhoon") { } +public: + spell_dru_typhoon() : SpellScriptLoader("spell_dru_typhoon") { } - class spell_dru_typhoon_SpellScript : public SpellScript + class spell_dru_typhoon_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dru_typhoon_SpellScript); + + void HandleKnockBack(SpellEffIndex effIndex) { - PrepareSpellScript(spell_dru_typhoon_SpellScript); - - void HandleKnockBack(SpellEffIndex effIndex) - { - // Glyph of Typhoon - if (GetCaster()->HasAura(SPELL_DRUID_GLYPH_OF_TYPHOON)) - PreventHitDefaultEffect(effIndex); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_dru_typhoon_SpellScript::HandleKnockBack, EFFECT_0, SPELL_EFFECT_KNOCK_BACK); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dru_typhoon_SpellScript(); + // Glyph of Typhoon + if (GetCaster()->HasAura(SPELL_DRUID_GLYPH_OF_TYPHOON)) + PreventHitDefaultEffect(effIndex); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_dru_typhoon_SpellScript::HandleKnockBack, EFFECT_0, SPELL_EFFECT_KNOCK_BACK); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dru_typhoon_SpellScript(); + } }; // 70691 - Item T10 Restoration 4P Bonus class spell_dru_t10_restoration_4p_bonus : public SpellScriptLoader { - public: - spell_dru_t10_restoration_4p_bonus() : SpellScriptLoader("spell_dru_t10_restoration_4p_bonus") { } +public: + spell_dru_t10_restoration_4p_bonus() : SpellScriptLoader("spell_dru_t10_restoration_4p_bonus") { } - class spell_dru_t10_restoration_4p_bonus_SpellScript : public SpellScript + class spell_dru_t10_restoration_4p_bonus_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dru_t10_restoration_4p_bonus_SpellScript); + + bool Load() { - PrepareSpellScript(spell_dru_t10_restoration_4p_bonus_SpellScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - void FilterTargets(std::list& targets) - { - if (!GetCaster()->ToPlayer()->GetGroup()) - { - targets.clear(); - targets.push_back(GetCaster()); - } - else - { - targets.remove(GetExplTargetUnit()); - std::list tempTargets; - for (std::list::const_iterator itr = targets.begin(); itr != targets.end(); ++itr) - if ((*itr)->isType(TYPEMASK_UNIT|TYPEMASK_PLAYER) && GetCaster()->IsInRaidWith((*itr)->ToUnit()) && !(*itr)->ToUnit()->GetAuraEffect(SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_DRUID, 64, EFFECT_0)) - tempTargets.push_back((*itr)->ToUnit()); - - if (tempTargets.empty()) - { - targets.clear(); - FinishCast(SPELL_FAILED_DONT_REPORT); - return; - } - - tempTargets.sort(acore::HealthPctOrderPred()); - targets.clear(); - targets.push_back(tempTargets.front()); - } - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dru_t10_restoration_4p_bonus_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dru_t10_restoration_4p_bonus_SpellScript(); + return GetCaster()->GetTypeId() == TYPEID_PLAYER; } + + void FilterTargets(std::list& targets) + { + if (!GetCaster()->ToPlayer()->GetGroup()) + { + targets.clear(); + targets.push_back(GetCaster()); + } + else + { + targets.remove(GetExplTargetUnit()); + std::list tempTargets; + for (std::list::const_iterator itr = targets.begin(); itr != targets.end(); ++itr) + if ((*itr)->isType(TYPEMASK_UNIT | TYPEMASK_PLAYER) && GetCaster()->IsInRaidWith((*itr)->ToUnit()) && !(*itr)->ToUnit()->GetAuraEffect(SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_DRUID, 64, EFFECT_0)) + tempTargets.push_back((*itr)->ToUnit()); + + if (tempTargets.empty()) + { + targets.clear(); + FinishCast(SPELL_FAILED_DONT_REPORT); + return; + } + + tempTargets.sort(acore::HealthPctOrderPred()); + targets.clear(); + targets.push_back(tempTargets.front()); + } + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dru_t10_restoration_4p_bonus_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dru_t10_restoration_4p_bonus_SpellScript(); + } }; // -48438 - Wild Growth class spell_dru_wild_growth : public SpellScriptLoader { - public: - spell_dru_wild_growth() : SpellScriptLoader("spell_dru_wild_growth") { } +public: + spell_dru_wild_growth() : SpellScriptLoader("spell_dru_wild_growth") { } - class spell_dru_wild_growth_SpellScript : public SpellScript + class spell_dru_wild_growth_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dru_wild_growth_SpellScript); + + bool Validate(SpellInfo const* spellInfo) { - PrepareSpellScript(spell_dru_wild_growth_SpellScript); - - bool Validate(SpellInfo const* spellInfo) - { - if (spellInfo->Effects[EFFECT_2].IsEffect() || spellInfo->Effects[EFFECT_2].CalcValue() <= 0) - return false; - return true; - } - - void FilterTargets(std::list& targets) - { - targets.remove_if(acore::RaidCheck(GetCaster(), false)); - - uint32 const maxTargets = GetCaster()->HasAura(SPELL_DRUID_GLYPH_OF_WILD_GROWTH) ? 6 : 5; - - if (targets.size() > maxTargets) - { - targets.sort(acore::HealthPctOrderPred()); - targets.resize(maxTargets); - } - - _targets = targets; - } - - void SetTargets(std::list& targets) - { - targets = _targets; - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dru_wild_growth_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dru_wild_growth_SpellScript::SetTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ALLY); - } - - private: - std::list _targets; - }; - - SpellScript* GetSpellScript() const - { - return new spell_dru_wild_growth_SpellScript(); + if (spellInfo->Effects[EFFECT_2].IsEffect() || spellInfo->Effects[EFFECT_2].CalcValue() <= 0) + return false; + return true; } + + void FilterTargets(std::list& targets) + { + targets.remove_if(acore::RaidCheck(GetCaster(), false)); + + uint32 const maxTargets = GetCaster()->HasAura(SPELL_DRUID_GLYPH_OF_WILD_GROWTH) ? 6 : 5; + + if (targets.size() > maxTargets) + { + targets.sort(acore::HealthPctOrderPred()); + targets.resize(maxTargets); + } + + _targets = targets; + } + + void SetTargets(std::list& targets) + { + targets = _targets; + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dru_wild_growth_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dru_wild_growth_SpellScript::SetTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ALLY); + } + + private: + std::list _targets; + }; + + SpellScript* GetSpellScript() const + { + return new spell_dru_wild_growth_SpellScript(); + } }; void AddSC_druid_spell_scripts() diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index 634423779..bb4eeaa6b 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -50,7 +50,7 @@ public: _hasFlag = false; return true; } - + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { _modelId = GetUnitOwner()->GetDisplayId(); @@ -61,7 +61,7 @@ public: GetUnitOwner()->SetDisplayId(11686); GetUnitOwner()->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); for (uint8 i = 0; i < 3; ++i) - GetUnitOwner()->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + i, 0); + GetUnitOwner()->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + i, 0); } void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) @@ -93,74 +93,74 @@ public: class spell_the_flag_of_ownership : public SpellScriptLoader { - public: - spell_the_flag_of_ownership() : SpellScriptLoader("spell_the_flag_of_ownership") { } +public: + spell_the_flag_of_ownership() : SpellScriptLoader("spell_the_flag_of_ownership") { } - class spell_the_flag_of_ownership_SpellScript : public SpellScript + class spell_the_flag_of_ownership_SpellScript : public SpellScript + { + PrepareSpellScript(spell_the_flag_of_ownership_SpellScript); + + bool haveTarget; + bool Load() { - PrepareSpellScript(spell_the_flag_of_ownership_SpellScript); - - bool haveTarget; - bool Load() - { - haveTarget = false; - return true; - } - - void HandleScript(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - if (!caster || caster->GetTypeId() != TYPEID_PLAYER) - return; - Player* target = GetHitPlayer(); - if (!target) - return; - caster->CastSpell(target, 52605, true); - char buff[100]; - sprintf(buff, "%s plants the Flag of Ownership in the corpse of %s.", caster->GetName().c_str(), target->GetName().c_str()); - caster->MonsterTextEmote(buff, caster); - haveTarget = true; - } - - void FilterTargets(std::list& targets) - { - for( std::list::iterator itr = targets.begin(); itr != targets.end(); ) - { - if ((*itr)->GetTypeId() != TYPEID_PLAYER || (*itr)->ToPlayer()->IsAlive()) - { - targets.erase(itr); - itr = targets.begin(); - continue; - } - ++itr; - } - } - - void HandleFinish() - { - Unit* caster = GetCaster(); - if (!caster || !caster->ToPlayer()) - return; - - if (!haveTarget) - { - caster->ToPlayer()->RemoveSpellCooldown(GetSpellInfo()->Id, true); - Spell::SendCastResult(caster->ToPlayer(), GetSpellInfo(), 0, SPELL_FAILED_BAD_TARGETS); - } - } - - void Register() - { - AfterCast += SpellCastFn(spell_the_flag_of_ownership_SpellScript::HandleFinish); - OnEffectHitTarget += SpellEffectFn(spell_the_flag_of_ownership_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_flag_of_ownership_SpellScript::FilterTargets, EFFECT_0, TARGET_CORPSE_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_the_flag_of_ownership_SpellScript(); + haveTarget = false; + return true; } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (!caster || caster->GetTypeId() != TYPEID_PLAYER) + return; + Player* target = GetHitPlayer(); + if (!target) + return; + caster->CastSpell(target, 52605, true); + char buff[100]; + sprintf(buff, "%s plants the Flag of Ownership in the corpse of %s.", caster->GetName().c_str(), target->GetName().c_str()); + caster->MonsterTextEmote(buff, caster); + haveTarget = true; + } + + void FilterTargets(std::list& targets) + { + for( std::list::iterator itr = targets.begin(); itr != targets.end(); ) + { + if ((*itr)->GetTypeId() != TYPEID_PLAYER || (*itr)->ToPlayer()->IsAlive()) + { + targets.erase(itr); + itr = targets.begin(); + continue; + } + ++itr; + } + } + + void HandleFinish() + { + Unit* caster = GetCaster(); + if (!caster || !caster->ToPlayer()) + return; + + if (!haveTarget) + { + caster->ToPlayer()->RemoveSpellCooldown(GetSpellInfo()->Id, true); + Spell::SendCastResult(caster->ToPlayer(), GetSpellInfo(), 0, SPELL_FAILED_BAD_TARGETS); + } + } + + void Register() + { + AfterCast += SpellCastFn(spell_the_flag_of_ownership_SpellScript::HandleFinish); + OnEffectHitTarget += SpellEffectFn(spell_the_flag_of_ownership_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_flag_of_ownership_SpellScript::FilterTargets, EFFECT_0, TARGET_CORPSE_SRC_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_the_flag_of_ownership_SpellScript(); + } }; class spell_gen_have_item_auras : public SpellScriptLoader @@ -171,7 +171,7 @@ public: class spell_gen_have_item_auras_AuraScript : public AuraScript { PrepareAuraScript(spell_gen_have_item_auras_AuraScript) - + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { Unit* target = GetTarget(); @@ -181,17 +181,21 @@ public: switch (GetSpellInfo()->Id) { case 51060: // Have Withered Batwing - entry = 28294; break; + entry = 28294; + break; case 51068: // Have Muddy Mire Maggot - entry = 28293; break; + entry = 28293; + break; case 51094: // Have Chilled Serpent Mucus - entry = 28296; break; + entry = 28296; + break; case 51088: // Have Amberseed - entry = 28295; break; + entry = 28295; + break; } if (entry) - target->ToPlayer()->KilledMonsterCredit(entry, 0); + target->ToPlayer()->KilledMonsterCredit(entry, 0); } } @@ -209,174 +213,174 @@ public: class spell_gen_mine_sweeper : public SpellScriptLoader { - public: - spell_gen_mine_sweeper() : SpellScriptLoader("spell_gen_mine_sweeper") { } +public: + spell_gen_mine_sweeper() : SpellScriptLoader("spell_gen_mine_sweeper") { } - class spell_gen_mine_sweeper_SpellScript : public SpellScript + class spell_gen_mine_sweeper_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_mine_sweeper_SpellScript); + + void HandleSchoolDMG(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_gen_mine_sweeper_SpellScript); + Unit* caster = GetCaster(); + Player* target = GetHitPlayer(); + if (!target) + return; - void HandleSchoolDMG(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - Player* target = GetHitPlayer(); - if (!target) - return; - - target->RemoveAurasByType(SPELL_AURA_MOUNTED); - caster->CastSpell(target, 54402, true); - } - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitPlayer()) - if (Aura* aur = target->GetAura(GetSpellInfo()->Id)) - if (aur->GetStackAmount() >= 10) - target->CastSpell(target, 57064, true); - } - - void Register() - { - if (m_scriptSpellId == 54355) - OnEffectHitTarget += SpellEffectFn(spell_gen_mine_sweeper_SpellScript::HandleSchoolDMG, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); - else - OnEffectHitTarget += SpellEffectFn(spell_gen_mine_sweeper_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_mine_sweeper_SpellScript(); + target->RemoveAurasByType(SPELL_AURA_MOUNTED); + caster->CastSpell(target, 54402, true); } + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + if (Unit* target = GetHitPlayer()) + if (Aura* aur = target->GetAura(GetSpellInfo()->Id)) + if (aur->GetStackAmount() >= 10) + target->CastSpell(target, 57064, true); + } + + void Register() + { + if (m_scriptSpellId == 54355) + OnEffectHitTarget += SpellEffectFn(spell_gen_mine_sweeper_SpellScript::HandleSchoolDMG, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + else + OnEffectHitTarget += SpellEffectFn(spell_gen_mine_sweeper_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_mine_sweeper_SpellScript(); + } }; class spell_gen_reduced_above_60 : public SpellScriptLoader { - public: - spell_gen_reduced_above_60() : SpellScriptLoader("spell_gen_reduced_above_60") { } +public: + spell_gen_reduced_above_60() : SpellScriptLoader("spell_gen_reduced_above_60") { } - class spell_gen_reduced_above_60_SpellScript : public SpellScript + class spell_gen_reduced_above_60_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_reduced_above_60_SpellScript); + + void RecalculateDamage() { - PrepareSpellScript(spell_gen_reduced_above_60_SpellScript); - - void RecalculateDamage() - { - if (Unit* target = GetHitUnit()) - if (target->getLevel() > 60) - { - int32 damage = GetHitDamage(); - AddPct(damage, -4*int8(std::min(target->getLevel(), uint8(85))-60)); // prevents reduce by more than 100% - SetHitDamage(damage); - } - } - - void Register() - { - OnHit += SpellHitFn(spell_gen_reduced_above_60_SpellScript::RecalculateDamage); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_reduced_above_60_SpellScript(); + if (Unit* target = GetHitUnit()) + if (target->getLevel() > 60) + { + int32 damage = GetHitDamage(); + AddPct(damage, -4 * int8(std::min(target->getLevel(), uint8(85)) - 60)); // prevents reduce by more than 100% + SetHitDamage(damage); + } } - class spell_gen_reduced_above_60_AuraScript : public AuraScript + void Register() { - PrepareAuraScript(spell_gen_reduced_above_60_AuraScript); - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - if (Unit* owner = GetUnitOwner()) - if (owner->getLevel() > 60) - AddPct(amount, -4*int8(std::min(owner->getLevel(), uint8(85))-60)); // prevents reduce by more than 100% - } - - void Register() - { - if (m_scriptSpellId != 20004) // Lifestealing enchange - no aura effect - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_reduced_above_60_AuraScript::CalculateAmount, EFFECT_ALL, SPELL_AURA_ANY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_reduced_above_60_AuraScript(); + OnHit += SpellHitFn(spell_gen_reduced_above_60_SpellScript::RecalculateDamage); } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_reduced_above_60_SpellScript(); + } + + class spell_gen_reduced_above_60_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_reduced_above_60_AuraScript); + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + if (Unit* owner = GetUnitOwner()) + if (owner->getLevel() > 60) + AddPct(amount, -4 * int8(std::min(owner->getLevel(), uint8(85)) - 60)); // prevents reduce by more than 100% + } + + void Register() + { + if (m_scriptSpellId != 20004) // Lifestealing enchange - no aura effect + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_reduced_above_60_AuraScript::CalculateAmount, EFFECT_ALL, SPELL_AURA_ANY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_reduced_above_60_AuraScript(); + } }; class spell_gen_relocaste_dest : public SpellScriptLoader { +public: + spell_gen_relocaste_dest(const char* name, float x, float y, float z, float o) : SpellScriptLoader(name), _x(x), _y(y), _z(z), _o(o) { } + + class spell_gen_relocaste_dest_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_relocaste_dest_SpellScript); public: - spell_gen_relocaste_dest(const char* name, float x, float y, float z, float o) : SpellScriptLoader(name), _x(x), _y(y), _z(z), _o(o) { } + spell_gen_relocaste_dest_SpellScript(float x, float y, float z, float o) : _x(x), _y(y), _z(z), _o(o) { } - class spell_gen_relocaste_dest_SpellScript : public SpellScript + void RelocateDest() { - PrepareSpellScript(spell_gen_relocaste_dest_SpellScript); - public: - spell_gen_relocaste_dest_SpellScript(float x, float y, float z, float o) : _x(x), _y(y), _z(z), _o(o) { } - - void RelocateDest() - { - Position const offset = {_x, _y, _z, _o}; - const_cast(GetExplTargetDest())->RelocateOffset(offset); - } - - void Register() - { - OnCast += SpellCastFn(spell_gen_relocaste_dest_SpellScript::RelocateDest); - } - - private: - float _x, _y, _z, _o; - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_relocaste_dest_SpellScript(_x, _y, _z, _o); + Position const offset = {_x, _y, _z, _o}; + const_cast(GetExplTargetDest())->RelocateOffset(offset); } - + + void Register() + { + OnCast += SpellCastFn(spell_gen_relocaste_dest_SpellScript::RelocateDest); + } + private: float _x, _y, _z, _o; + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_relocaste_dest_SpellScript(_x, _y, _z, _o); + } + +private: + float _x, _y, _z, _o; }; class spell_gen_allow_proc_from_spells_with_cost : public SpellScriptLoader { - public: - spell_gen_allow_proc_from_spells_with_cost() : SpellScriptLoader("spell_gen_allow_proc_from_spells_with_cost") { } +public: + spell_gen_allow_proc_from_spells_with_cost() : SpellScriptLoader("spell_gen_allow_proc_from_spells_with_cost") { } - class spell_gen_allow_proc_from_spells_with_cost_AuraScript : public AuraScript + class spell_gen_allow_proc_from_spells_with_cost_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_allow_proc_from_spells_with_cost_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_gen_allow_proc_from_spells_with_cost_AuraScript); + SpellInfo const* spellInfo = eventInfo.GetDamageInfo()->GetSpellInfo(); + if (!spellInfo) + return false; - bool CheckProc(ProcEventInfo& eventInfo) - { - SpellInfo const* spellInfo = eventInfo.GetDamageInfo()->GetSpellInfo(); - if (!spellInfo) - return false; + // xinef: Spells with no damage class and physical school only are not treated as spells + if ((eventInfo.GetTypeMask() & (PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_NEG | PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS)) && spellInfo->SchoolMask == SPELL_SCHOOL_MASK_NORMAL) + return false; - // xinef: Spells with no damage class and physical school only are not treated as spells - if ((eventInfo.GetTypeMask() & (PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_NEG|PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS)) && spellInfo->SchoolMask == SPELL_SCHOOL_MASK_NORMAL) - return false; + // xinef: holy nova exception + if (spellInfo->SpellFamilyName == SPELLFAMILY_PRIEST && spellInfo->SpellIconID == 1874) + return spellInfo->HasEffect(SPELL_EFFECT_HEAL); - // xinef: holy nova exception - if (spellInfo->SpellFamilyName == SPELLFAMILY_PRIEST && spellInfo->SpellIconID == 1874) - return spellInfo->HasEffect(SPELL_EFFECT_HEAL); - - // xinef: Holy Shock exception... - return spellInfo->ManaCost > 0 || spellInfo->ManaCostPercentage > 0 || (spellInfo->SpellFamilyName == SPELLFAMILY_PALADIN && spellInfo->SpellIconID == 156); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_gen_allow_proc_from_spells_with_cost_AuraScript::CheckProc); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_allow_proc_from_spells_with_cost_AuraScript(); + // xinef: Holy Shock exception... + return spellInfo->ManaCost > 0 || spellInfo->ManaCostPercentage > 0 || (spellInfo->SpellFamilyName == SPELLFAMILY_PALADIN && spellInfo->SpellIconID == 156); } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_gen_allow_proc_from_spells_with_cost_AuraScript::CheckProc); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_allow_proc_from_spells_with_cost_AuraScript(); + } }; class spell_gen_bg_preparation : public SpellScriptLoader @@ -387,7 +391,7 @@ public: class spell_gen_bg_preparation_AuraScript : public AuraScript { PrepareAuraScript(spell_gen_bg_preparation_AuraScript) - + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { GetTarget()->ApplySpellImmune(GetId(), IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_ALL, true); @@ -401,7 +405,7 @@ public: void CalcPeriodic(AuraEffect const* /*effect*/, bool& isPeriodic, int32& amplitude) { isPeriodic = true; - amplitude = 3*IN_MILLISECONDS; + amplitude = 3 * IN_MILLISECONDS; } void Update(AuraEffect* /*effect*/) @@ -434,911 +438,911 @@ public: class spell_gen_disabled_above_level : public SpellScriptLoader { +public: + spell_gen_disabled_above_level(char const* name, uint8 level) : SpellScriptLoader(name), _level(level) { } + + class spell_gen_disabled_above_level_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_disabled_above_level_SpellScript) + public: - spell_gen_disabled_above_level(char const* name, uint8 level) : SpellScriptLoader(name), _level(level) { } + spell_gen_disabled_above_level_SpellScript(uint8 level) : SpellScript(), _level(level) { } - class spell_gen_disabled_above_level_SpellScript : public SpellScript + + SpellCastResult CheckRequirement() { - PrepareSpellScript(spell_gen_disabled_above_level_SpellScript) + if (Unit* target = GetExplTargetUnit()) + if (target->getLevel() >= _level) + return SPELL_FAILED_DONT_REPORT; - public: - spell_gen_disabled_above_level_SpellScript(uint8 level) : SpellScript(), _level(level) { } + return SPELL_CAST_OK; + } - - SpellCastResult CheckRequirement() - { - if (Unit* target = GetExplTargetUnit()) - if (target->getLevel() >= _level) - return SPELL_FAILED_DONT_REPORT; - - return SPELL_CAST_OK; - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_gen_disabled_above_level_SpellScript::CheckRequirement); - } - - private: - uint8 _level; - }; - - SpellScript* GetSpellScript() const + void Register() { - return new spell_gen_disabled_above_level_SpellScript(_level); + OnCheckCast += SpellCheckCastFn(spell_gen_disabled_above_level_SpellScript::CheckRequirement); } private: uint8 _level; + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_disabled_above_level_SpellScript(_level); + } + +private: + uint8 _level; }; class spell_pet_hit_expertise_scalling : public SpellScriptLoader { - public: - spell_pet_hit_expertise_scalling() : SpellScriptLoader("spell_pet_hit_expertise_scalling") { } +public: + spell_pet_hit_expertise_scalling() : SpellScriptLoader("spell_pet_hit_expertise_scalling") { } - class spell_pet_hit_expertise_scalling_AuraScript : public AuraScript + class spell_pet_hit_expertise_scalling_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pet_hit_expertise_scalling_AuraScript) + + int32 CalculatePercent(float hitChance, float cap, float maxChance) { - PrepareAuraScript(spell_pet_hit_expertise_scalling_AuraScript) - - int32 CalculatePercent(float hitChance, float cap, float maxChance) - { - return (hitChance / cap) * maxChance; - } - - void CalculateHitAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - if (Player* modOwner = GetUnitOwner()->GetSpellModOwner()) - { - if (modOwner->getClass() == CLASS_HUNTER) - amount = CalculatePercent(modOwner->m_modRangedHitChance, 8.0f, 8.0f); - else if (modOwner->getPowerType() == POWER_MANA) - amount = CalculatePercent(modOwner->m_modSpellHitChance, 17.0f, 8.0f); - else - amount = CalculatePercent(modOwner->m_modMeleeHitChance, 8.0f, 8.0f); - } - } - - void CalculateSpellHitAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - if (Player* modOwner = GetUnitOwner()->GetSpellModOwner()) - { - if (modOwner->getClass() == CLASS_HUNTER) - amount = CalculatePercent(modOwner->m_modRangedHitChance, 8.0f, 17.0f); - else if (modOwner->getPowerType() == POWER_MANA) - amount = CalculatePercent(modOwner->m_modSpellHitChance, 17.0f, 17.0f); - else - amount = CalculatePercent(modOwner->m_modMeleeHitChance, 8.0f, 17.0f); - } - } - - void CalculateExpertiseAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - if (Player* modOwner = GetUnitOwner()->GetSpellModOwner()) - { - if (modOwner->getClass() == CLASS_HUNTER) - amount = CalculatePercent(modOwner->m_modRangedHitChance, 8.0f, 26.0f); - else if (modOwner->getPowerType() == POWER_MANA) - amount = CalculatePercent(modOwner->m_modSpellHitChance, 17.0f, 26.0f); - else - amount = CalculatePercent(modOwner->m_modMeleeHitChance, 8.0f, 26.0f); - } - } - - void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - GetUnitOwner()->ApplySpellImmune(GetId(), IMMUNITY_STATE, aurEff->GetAuraType(), true, SPELL_BLOCK_TYPE_POSITIVE); - } - - void CalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude) - { - if (!GetUnitOwner()->IsPet()) - return; - - isPeriodic = true; - amplitude = 3*IN_MILLISECONDS; - } - - void HandlePeriodic(AuraEffect const* aurEff) - { - PreventDefaultAction(); - GetEffect(aurEff->GetEffIndex())->RecalculateAmount(); - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pet_hit_expertise_scalling_AuraScript::CalculateHitAmount, EFFECT_0, SPELL_AURA_MOD_HIT_CHANCE); - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pet_hit_expertise_scalling_AuraScript::CalculateSpellHitAmount, EFFECT_1, SPELL_AURA_MOD_SPELL_HIT_CHANCE); - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pet_hit_expertise_scalling_AuraScript::CalculateExpertiseAmount, EFFECT_2, SPELL_AURA_MOD_EXPERTISE); - - OnEffectApply += AuraEffectApplyFn(spell_pet_hit_expertise_scalling_AuraScript::HandleEffectApply, EFFECT_ALL, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); - DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_pet_hit_expertise_scalling_AuraScript::CalcPeriodic, EFFECT_ALL, SPELL_AURA_ANY); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_pet_hit_expertise_scalling_AuraScript::HandlePeriodic, EFFECT_ALL, SPELL_AURA_ANY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_pet_hit_expertise_scalling_AuraScript(); + return (hitChance / cap) * maxChance; } + + void CalculateHitAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + if (Player* modOwner = GetUnitOwner()->GetSpellModOwner()) + { + if (modOwner->getClass() == CLASS_HUNTER) + amount = CalculatePercent(modOwner->m_modRangedHitChance, 8.0f, 8.0f); + else if (modOwner->getPowerType() == POWER_MANA) + amount = CalculatePercent(modOwner->m_modSpellHitChance, 17.0f, 8.0f); + else + amount = CalculatePercent(modOwner->m_modMeleeHitChance, 8.0f, 8.0f); + } + } + + void CalculateSpellHitAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + if (Player* modOwner = GetUnitOwner()->GetSpellModOwner()) + { + if (modOwner->getClass() == CLASS_HUNTER) + amount = CalculatePercent(modOwner->m_modRangedHitChance, 8.0f, 17.0f); + else if (modOwner->getPowerType() == POWER_MANA) + amount = CalculatePercent(modOwner->m_modSpellHitChance, 17.0f, 17.0f); + else + amount = CalculatePercent(modOwner->m_modMeleeHitChance, 8.0f, 17.0f); + } + } + + void CalculateExpertiseAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + if (Player* modOwner = GetUnitOwner()->GetSpellModOwner()) + { + if (modOwner->getClass() == CLASS_HUNTER) + amount = CalculatePercent(modOwner->m_modRangedHitChance, 8.0f, 26.0f); + else if (modOwner->getPowerType() == POWER_MANA) + amount = CalculatePercent(modOwner->m_modSpellHitChance, 17.0f, 26.0f); + else + amount = CalculatePercent(modOwner->m_modMeleeHitChance, 8.0f, 26.0f); + } + } + + void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + GetUnitOwner()->ApplySpellImmune(GetId(), IMMUNITY_STATE, aurEff->GetAuraType(), true, SPELL_BLOCK_TYPE_POSITIVE); + } + + void CalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude) + { + if (!GetUnitOwner()->IsPet()) + return; + + isPeriodic = true; + amplitude = 3 * IN_MILLISECONDS; + } + + void HandlePeriodic(AuraEffect const* aurEff) + { + PreventDefaultAction(); + GetEffect(aurEff->GetEffIndex())->RecalculateAmount(); + } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pet_hit_expertise_scalling_AuraScript::CalculateHitAmount, EFFECT_0, SPELL_AURA_MOD_HIT_CHANCE); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pet_hit_expertise_scalling_AuraScript::CalculateSpellHitAmount, EFFECT_1, SPELL_AURA_MOD_SPELL_HIT_CHANCE); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pet_hit_expertise_scalling_AuraScript::CalculateExpertiseAmount, EFFECT_2, SPELL_AURA_MOD_EXPERTISE); + + OnEffectApply += AuraEffectApplyFn(spell_pet_hit_expertise_scalling_AuraScript::HandleEffectApply, EFFECT_ALL, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); + DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_pet_hit_expertise_scalling_AuraScript::CalcPeriodic, EFFECT_ALL, SPELL_AURA_ANY); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_pet_hit_expertise_scalling_AuraScript::HandlePeriodic, EFFECT_ALL, SPELL_AURA_ANY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_pet_hit_expertise_scalling_AuraScript(); + } }; class spell_gen_grow_flower_patch : public SpellScriptLoader { - public: - spell_gen_grow_flower_patch() : SpellScriptLoader("spell_gen_grow_flower_patch") { } +public: + spell_gen_grow_flower_patch() : SpellScriptLoader("spell_gen_grow_flower_patch") { } - class spell_gen_grow_flower_patch_SpellScript : public SpellScript + class spell_gen_grow_flower_patch_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_grow_flower_patch_SpellScript) + + SpellCastResult CheckCast() { - PrepareSpellScript(spell_gen_grow_flower_patch_SpellScript) + if (GetCaster()->HasAuraType(SPELL_AURA_MOD_STEALTH) || GetCaster()->HasAuraType(SPELL_AURA_MOD_INVISIBILITY)) + return SPELL_FAILED_DONT_REPORT; - SpellCastResult CheckCast() - { - if (GetCaster()->HasAuraType(SPELL_AURA_MOD_STEALTH) || GetCaster()->HasAuraType(SPELL_AURA_MOD_INVISIBILITY)) - return SPELL_FAILED_DONT_REPORT; - - return SPELL_CAST_OK; - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_gen_grow_flower_patch_SpellScript::CheckCast); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_grow_flower_patch_SpellScript(); + return SPELL_CAST_OK; } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_gen_grow_flower_patch_SpellScript::CheckCast); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_grow_flower_patch_SpellScript(); + } }; class spell_gen_rallying_cry_of_the_dragonslayer : public SpellScriptLoader { - public: - spell_gen_rallying_cry_of_the_dragonslayer() : SpellScriptLoader("spell_gen_rallying_cry_of_the_dragonslayer") { } +public: + spell_gen_rallying_cry_of_the_dragonslayer() : SpellScriptLoader("spell_gen_rallying_cry_of_the_dragonslayer") { } - class spell_gen_rallying_cry_of_the_dragonslayer_SpellScript : public SpellScript + class spell_gen_rallying_cry_of_the_dragonslayer_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_rallying_cry_of_the_dragonslayer_SpellScript); + + void SelectTarget(std::list& targets) { - PrepareSpellScript(spell_gen_rallying_cry_of_the_dragonslayer_SpellScript); + targets.clear(); - void SelectTarget(std::list& targets) - { - targets.clear(); + uint32 zoneId = 1519; + if (GetCaster()->GetMapId() == 1) // Kalimdor + zoneId = 1637; - uint32 zoneId = 1519; - if (GetCaster()->GetMapId() == 1) // Kalimdor - zoneId = 1637; - - Map::PlayerList const& pList = GetCaster()->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr) - if (itr->GetSource()->GetZoneId() == zoneId) - targets.push_back(itr->GetSource()); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_gen_rallying_cry_of_the_dragonslayer_SpellScript::SelectTarget, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ALLY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_rallying_cry_of_the_dragonslayer_SpellScript(); + Map::PlayerList const& pList = GetCaster()->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr) + if (itr->GetSource()->GetZoneId() == zoneId) + targets.push_back(itr->GetSource()); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_gen_rallying_cry_of_the_dragonslayer_SpellScript::SelectTarget, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ALLY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_rallying_cry_of_the_dragonslayer_SpellScript(); + } }; class spell_gen_adals_song_of_battle : public SpellScriptLoader { - public: - spell_gen_adals_song_of_battle() : SpellScriptLoader("spell_gen_adals_song_of_battle") { } +public: + spell_gen_adals_song_of_battle() : SpellScriptLoader("spell_gen_adals_song_of_battle") { } - class spell_gen_adals_song_of_battle_SpellScript : public SpellScript + class spell_gen_adals_song_of_battle_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_adals_song_of_battle_SpellScript); + + void SelectTarget(std::list& targets) { - PrepareSpellScript(spell_gen_adals_song_of_battle_SpellScript); - - void SelectTarget(std::list& targets) - { - targets.clear(); - Map::PlayerList const& pList = GetCaster()->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr) - if (itr->GetSource()->GetZoneId() == 3703 /*Shattrath*/) - targets.push_back(itr->GetSource()); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_gen_adals_song_of_battle_SpellScript::SelectTarget, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ALLY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_adals_song_of_battle_SpellScript(); + targets.clear(); + Map::PlayerList const& pList = GetCaster()->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr) + if (itr->GetSource()->GetZoneId() == 3703 /*Shattrath*/) + targets.push_back(itr->GetSource()); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_gen_adals_song_of_battle_SpellScript::SelectTarget, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ALLY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_adals_song_of_battle_SpellScript(); + } }; class spell_gen_disabled_above_63 : public SpellScriptLoader { - public: - spell_gen_disabled_above_63() : SpellScriptLoader("spell_gen_disabled_above_63") { } +public: + spell_gen_disabled_above_63() : SpellScriptLoader("spell_gen_disabled_above_63") { } - class spell_gen_disabled_above_63_AuraScript : public AuraScript + class spell_gen_disabled_above_63_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_disabled_above_63_AuraScript); + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) { - PrepareAuraScript(spell_gen_disabled_above_63_AuraScript); - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - Unit* target = GetUnitOwner(); - if (target->getLevel() <= 63) - amount = amount * target->getLevel() / 60; - else - SetDuration(1); - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_disabled_above_63_AuraScript::CalculateAmount, EFFECT_ALL, SPELL_AURA_ANY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_disabled_above_63_AuraScript(); + Unit* target = GetUnitOwner(); + if (target->getLevel() <= 63) + amount = amount * target->getLevel() / 60; + else + SetDuration(1); } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_disabled_above_63_AuraScript::CalculateAmount, EFFECT_ALL, SPELL_AURA_ANY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_disabled_above_63_AuraScript(); + } }; class spell_gen_black_magic_enchant : public SpellScriptLoader { - public: - spell_gen_black_magic_enchant() : SpellScriptLoader("spell_gen_black_magic_enchant") { } +public: + spell_gen_black_magic_enchant() : SpellScriptLoader("spell_gen_black_magic_enchant") { } - class spell_gen_black_magic_enchant_AuraScript : public AuraScript + class spell_gen_black_magic_enchant_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_black_magic_enchant_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_gen_black_magic_enchant_AuraScript); + SpellInfo const* spellInfo = eventInfo.GetDamageInfo()->GetSpellInfo(); + if (!spellInfo) + return false; - bool CheckProc(ProcEventInfo& eventInfo) - { - SpellInfo const* spellInfo = eventInfo.GetDamageInfo()->GetSpellInfo(); - if (!spellInfo) - return false; + // Xinef: Old 'code' + if (eventInfo.GetTypeMask() & PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_NEG) + return true; - // Xinef: Old 'code' - if (eventInfo.GetTypeMask() & PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_NEG) + // Implement Black Magic enchant Bug + if (spellInfo->SpellFamilyName == SPELLFAMILY_DRUID) + if (spellInfo->SpellIconID == 2857 /*SPELL_INFECTED_WOUNDS*/ || spellInfo->SpellIconID == 147 /*SPELL_SHRED*/ || spellInfo->SpellFamilyFlags[1] & 0x400 /*SPELL_MANGLE_(CAT)*/) return true; - // Implement Black Magic enchant Bug - if (spellInfo->SpellFamilyName == SPELLFAMILY_DRUID) - if (spellInfo->SpellIconID == 2857 /*SPELL_INFECTED_WOUNDS*/ || spellInfo->SpellIconID == 147 /*SPELL_SHRED*/ || spellInfo->SpellFamilyFlags[1] & 0x400 /*SPELL_MANGLE_(CAT)*/) - return true; - - return false; - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_gen_black_magic_enchant_AuraScript::CheckProc); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_black_magic_enchant_AuraScript(); + return false; } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_gen_black_magic_enchant_AuraScript::CheckProc); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_black_magic_enchant_AuraScript(); + } }; class spell_gen_area_aura_select_players : public SpellScriptLoader { - public: - spell_gen_area_aura_select_players() : SpellScriptLoader("spell_gen_area_aura_select_players") { } +public: + spell_gen_area_aura_select_players() : SpellScriptLoader("spell_gen_area_aura_select_players") { } - class spell_gen_area_aura_select_players_AuraScript : public AuraScript + class spell_gen_area_aura_select_players_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_area_aura_select_players_AuraScript); + + bool CheckAreaTarget(Unit* target) { - PrepareAuraScript(spell_gen_area_aura_select_players_AuraScript); - - bool CheckAreaTarget(Unit* target) - { - return target->GetTypeId() == TYPEID_PLAYER; - } - void Register() - { - DoCheckAreaTarget += AuraCheckAreaTargetFn(spell_gen_area_aura_select_players_AuraScript::CheckAreaTarget); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_area_aura_select_players_AuraScript(); + return target->GetTypeId() == TYPEID_PLAYER; } + void Register() + { + DoCheckAreaTarget += AuraCheckAreaTargetFn(spell_gen_area_aura_select_players_AuraScript::CheckAreaTarget); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_area_aura_select_players_AuraScript(); + } }; class spell_gen_select_target_count : public SpellScriptLoader { +public: + spell_gen_select_target_count(const char* name, Targets effTarget, uint8 count) : SpellScriptLoader(name), _effTarget(effTarget), _count(count) { } + + class spell_gen_select_target_count_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_select_target_count_SpellScript); + public: - spell_gen_select_target_count(const char* name, Targets effTarget, uint8 count) : SpellScriptLoader(name), _effTarget(effTarget), _count(count) { } + spell_gen_select_target_count_SpellScript(Targets effTarget, uint8 count) : _effTarget(effTarget), _count(count) { } - class spell_gen_select_target_count_SpellScript : public SpellScript + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_gen_select_target_count_SpellScript); + targets.remove(GetCaster()); + acore::Containers::RandomResizeList(targets, _count); + } - public: - spell_gen_select_target_count_SpellScript(Targets effTarget, uint8 count) : _effTarget(effTarget), _count(count) { } - - void FilterTargets(std::list& targets) - { - targets.remove(GetCaster()); - acore::Containers::RandomResizeList(targets, _count); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_gen_select_target_count_SpellScript::FilterTargets, EFFECT_ALL, _effTarget); - } - - private: - Targets _effTarget; - uint8 _count; - }; - - SpellScript* GetSpellScript() const + void Register() { - return new spell_gen_select_target_count_SpellScript(_effTarget, _count); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_gen_select_target_count_SpellScript::FilterTargets, EFFECT_ALL, _effTarget); } private: Targets _effTarget; uint8 _count; + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_select_target_count_SpellScript(_effTarget, _count); + } + +private: + Targets _effTarget; + uint8 _count; }; class spell_gen_use_spell_base_level_check : public SpellScriptLoader { - public: - spell_gen_use_spell_base_level_check() : SpellScriptLoader("spell_gen_use_spell_base_level_check") { } +public: + spell_gen_use_spell_base_level_check() : SpellScriptLoader("spell_gen_use_spell_base_level_check") { } - class spell_gen_use_spell_base_level_check_SpellScript : public SpellScript + class spell_gen_use_spell_base_level_check_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_use_spell_base_level_check_SpellScript) + + SpellCastResult CheckRequirement() { - PrepareSpellScript(spell_gen_use_spell_base_level_check_SpellScript) - - SpellCastResult CheckRequirement() - { - if (GetCaster()->getLevel() < GetSpellInfo()->BaseLevel) - return SPELL_FAILED_LEVEL_REQUIREMENT; - return SPELL_CAST_OK; - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_gen_use_spell_base_level_check_SpellScript::CheckRequirement); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_use_spell_base_level_check_SpellScript(); + if (GetCaster()->getLevel() < GetSpellInfo()->BaseLevel) + return SPELL_FAILED_LEVEL_REQUIREMENT; + return SPELL_CAST_OK; } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_gen_use_spell_base_level_check_SpellScript::CheckRequirement); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_use_spell_base_level_check_SpellScript(); + } }; class spell_gen_proc_from_direct_damage : public SpellScriptLoader { - public: - spell_gen_proc_from_direct_damage() : SpellScriptLoader("spell_gen_proc_from_direct_damage") { } +public: + spell_gen_proc_from_direct_damage() : SpellScriptLoader("spell_gen_proc_from_direct_damage") { } - class spell_gen_proc_from_direct_damage_AuraScript : public AuraScript + class spell_gen_proc_from_direct_damage_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_proc_from_direct_damage_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_gen_proc_from_direct_damage_AuraScript); - - bool CheckProc(ProcEventInfo& eventInfo) - { - return !eventInfo.GetDamageInfo()->GetSpellInfo() || !eventInfo.GetDamageInfo()->GetSpellInfo()->IsTargetingArea(); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_gen_proc_from_direct_damage_AuraScript::CheckProc); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_proc_from_direct_damage_AuraScript(); + return !eventInfo.GetDamageInfo()->GetSpellInfo() || !eventInfo.GetDamageInfo()->GetSpellInfo()->IsTargetingArea(); } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_gen_proc_from_direct_damage_AuraScript::CheckProc); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_proc_from_direct_damage_AuraScript(); + } }; class spell_gen_no_offhand_proc : public SpellScriptLoader { - public: - spell_gen_no_offhand_proc() : SpellScriptLoader("spell_gen_no_offhand_proc") { } +public: + spell_gen_no_offhand_proc() : SpellScriptLoader("spell_gen_no_offhand_proc") { } - class spell_gen_no_offhand_proc_AuraScript : public AuraScript + class spell_gen_no_offhand_proc_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_no_offhand_proc_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_gen_no_offhand_proc_AuraScript); - - bool CheckProc(ProcEventInfo& eventInfo) - { - return !(eventInfo.GetTypeMask() & PROC_FLAG_DONE_OFFHAND_ATTACK); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_gen_no_offhand_proc_AuraScript::CheckProc); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_no_offhand_proc_AuraScript(); + return !(eventInfo.GetTypeMask() & PROC_FLAG_DONE_OFFHAND_ATTACK); } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_gen_no_offhand_proc_AuraScript::CheckProc); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_no_offhand_proc_AuraScript(); + } }; class spell_gen_proc_once_per_cast : public SpellScriptLoader { - public: - spell_gen_proc_once_per_cast() : SpellScriptLoader("spell_gen_proc_once_per_cast") { } +public: + spell_gen_proc_once_per_cast() : SpellScriptLoader("spell_gen_proc_once_per_cast") { } - class spell_gen_proc_once_per_cast_AuraScript : public AuraScript + class spell_gen_proc_once_per_cast_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_proc_once_per_cast_AuraScript); + + bool Load() { - PrepareAuraScript(spell_gen_proc_once_per_cast_AuraScript); - - bool Load() - { - _spellPointer = nullptr; - return true; - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - if (Player* player = eventInfo.GetActor()->ToPlayer()) - { - if (player->m_spellModTakingSpell == _spellPointer) - return false; - _spellPointer = player->m_spellModTakingSpell; - } - return true; - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_gen_proc_once_per_cast_AuraScript::CheckProc); - } - - private: - Spell* _spellPointer; - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_proc_once_per_cast_AuraScript(); + _spellPointer = nullptr; + return true; } + + bool CheckProc(ProcEventInfo& eventInfo) + { + if (Player* player = eventInfo.GetActor()->ToPlayer()) + { + if (player->m_spellModTakingSpell == _spellPointer) + return false; + _spellPointer = player->m_spellModTakingSpell; + } + return true; + } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_gen_proc_once_per_cast_AuraScript::CheckProc); + } + + private: + Spell* _spellPointer; + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_proc_once_per_cast_AuraScript(); + } }; class spell_gen_proc_on_self : public SpellScriptLoader { - public: - spell_gen_proc_on_self() : SpellScriptLoader("spell_gen_proc_on_self") { } +public: + spell_gen_proc_on_self() : SpellScriptLoader("spell_gen_proc_on_self") { } - class spell_gen_proc_on_self_AuraScript : public AuraScript + class spell_gen_proc_on_self_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_proc_on_self_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_gen_proc_on_self_AuraScript); - - bool CheckProc(ProcEventInfo& eventInfo) - { - return eventInfo.GetActor() == eventInfo.GetActionTarget(); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_gen_proc_on_self_AuraScript::CheckProc); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_proc_on_self_AuraScript(); + return eventInfo.GetActor() == eventInfo.GetActionTarget(); } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_gen_proc_on_self_AuraScript::CheckProc); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_proc_on_self_AuraScript(); + } }; class spell_gen_proc_not_self : public SpellScriptLoader { - public: - spell_gen_proc_not_self() : SpellScriptLoader("spell_gen_proc_not_self") { } +public: + spell_gen_proc_not_self() : SpellScriptLoader("spell_gen_proc_not_self") { } - class spell_gen_proc_not_self_AuraScript : public AuraScript + class spell_gen_proc_not_self_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_proc_not_self_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_gen_proc_not_self_AuraScript); - - bool CheckProc(ProcEventInfo& eventInfo) - { - return eventInfo.GetActor() != eventInfo.GetActionTarget(); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_gen_proc_not_self_AuraScript::CheckProc); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_proc_not_self_AuraScript(); + return eventInfo.GetActor() != eventInfo.GetActionTarget(); } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_gen_proc_not_self_AuraScript::CheckProc); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_proc_not_self_AuraScript(); + } }; class spell_gen_baby_murloc_passive : public SpellScriptLoader { - public: - spell_gen_baby_murloc_passive() : SpellScriptLoader("spell_gen_baby_murloc_passive") { } +public: + spell_gen_baby_murloc_passive() : SpellScriptLoader("spell_gen_baby_murloc_passive") { } - class spell_gen_baby_murloc_passive_AuraScript : public AuraScript + class spell_gen_baby_murloc_passive_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_baby_murloc_passive_AuraScript); + + void HandleApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_gen_baby_murloc_passive_AuraScript); - - void HandleApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - GetAura()->GetEffect(aurEff->GetEffIndex())->SetPeriodicTimer(urand(60000, 120000)); - } - - void HandlePeriodicTimer(AuraEffect* aurEff) - { - aurEff->SetPeriodicTimer(urand(120000, 240000)); - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_gen_baby_murloc_passive_AuraScript::HandleApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); - OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_gen_baby_murloc_passive_AuraScript::HandlePeriodicTimer, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_baby_murloc_passive_AuraScript(); + GetAura()->GetEffect(aurEff->GetEffIndex())->SetPeriodicTimer(urand(60000, 120000)); } + + void HandlePeriodicTimer(AuraEffect* aurEff) + { + aurEff->SetPeriodicTimer(urand(120000, 240000)); + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_gen_baby_murloc_passive_AuraScript::HandleApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_gen_baby_murloc_passive_AuraScript::HandlePeriodicTimer, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_baby_murloc_passive_AuraScript(); + } }; class spell_gen_baby_murloc : public SpellScriptLoader { - public: - spell_gen_baby_murloc() : SpellScriptLoader("spell_gen_baby_murloc") { } +public: + spell_gen_baby_murloc() : SpellScriptLoader("spell_gen_baby_murloc") { } - class spell_gen_baby_murloc_AuraScript : public AuraScript + class spell_gen_baby_murloc_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_baby_murloc_AuraScript) + + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_gen_baby_murloc_AuraScript) - - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetTarget()->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_DANCE); - } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetTarget()->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_gen_baby_murloc_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_gen_baby_murloc_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_baby_murloc_AuraScript(); + GetTarget()->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_DANCE); } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_gen_baby_murloc_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_gen_baby_murloc_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_baby_murloc_AuraScript(); + } }; class spell_gen_fixate : public SpellScriptLoader { - public: - spell_gen_fixate() : SpellScriptLoader("spell_gen_fixate") { } +public: + spell_gen_fixate() : SpellScriptLoader("spell_gen_fixate") { } - class spell_gen_fixate_SpellScript : public SpellScript + class spell_gen_fixate_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_fixate_SpellScript); + + void HandleScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_gen_fixate_SpellScript); - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - target->CastSpell(GetCaster(), GetEffectValue(), true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_gen_fixate_SpellScript::HandleScriptEffect, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_fixate_SpellScript(); + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) + target->CastSpell(GetCaster(), GetEffectValue(), true); } - class spell_gen_fixate_AuraScript : public AuraScript + void Register() { - PrepareAuraScript(spell_gen_fixate_AuraScript) - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) - caster->RemoveAurasDueToSpell(GetSpellInfo()->Effects[EFFECT_2].CalcValue(), GetTarget()->GetGUID()); - } - - void Register() - { - OnEffectRemove += AuraEffectRemoveFn(spell_gen_fixate_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_fixate_AuraScript(); + OnEffectHitTarget += SpellEffectFn(spell_gen_fixate_SpellScript::HandleScriptEffect, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_fixate_SpellScript(); + } + + class spell_gen_fixate_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_fixate_AuraScript) + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* caster = GetCaster()) + caster->RemoveAurasDueToSpell(GetSpellInfo()->Effects[EFFECT_2].CalcValue(), GetTarget()->GetGUID()); + } + + void Register() + { + OnEffectRemove += AuraEffectRemoveFn(spell_gen_fixate_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_fixate_AuraScript(); + } }; class spell_gen_proc_above_75 : public SpellScriptLoader { - public: - spell_gen_proc_above_75() : SpellScriptLoader("spell_gen_proc_above_75") { } +public: + spell_gen_proc_above_75() : SpellScriptLoader("spell_gen_proc_above_75") { } - class spell_gen_proc_above_75_AuraScript : public AuraScript + class spell_gen_proc_above_75_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_proc_above_75_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_gen_proc_above_75_AuraScript); - - bool CheckProc(ProcEventInfo& eventInfo) - { - return eventInfo.GetActor() && eventInfo.GetActor()->getLevel() >= 75; - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_gen_proc_above_75_AuraScript::CheckProc); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_proc_above_75_AuraScript(); + return eventInfo.GetActor() && eventInfo.GetActor()->getLevel() >= 75; } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_gen_proc_above_75_AuraScript::CheckProc); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_proc_above_75_AuraScript(); + } }; class spell_gen_periodic_knock_away : public SpellScriptLoader { - public: - spell_gen_periodic_knock_away() : SpellScriptLoader("spell_gen_periodic_knock_away") { } +public: + spell_gen_periodic_knock_away() : SpellScriptLoader("spell_gen_periodic_knock_away") { } - class spell_gen_periodic_knock_away_AuraScript : public AuraScript + class spell_gen_periodic_knock_away_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_periodic_knock_away_AuraScript); + + void OnPeriodic(AuraEffect const* aurEff) { - PrepareAuraScript(spell_gen_periodic_knock_away_AuraScript); - - void OnPeriodic(AuraEffect const* aurEff) - { - PreventDefaultAction(); - if (Unit* victim = GetUnitOwner()->GetVictim()) - GetUnitOwner()->CastSpell(victim, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_periodic_knock_away_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_periodic_knock_away_AuraScript(); + PreventDefaultAction(); + if (Unit* victim = GetUnitOwner()->GetVictim()) + GetUnitOwner()->CastSpell(victim, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_periodic_knock_away_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_periodic_knock_away_AuraScript(); + } }; class spell_gen_knock_away : public SpellScriptLoader { - public: - spell_gen_knock_away() : SpellScriptLoader("spell_gen_knock_away") { } +public: + spell_gen_knock_away() : SpellScriptLoader("spell_gen_knock_away") { } - class spell_gen_knock_away_SpellScript : public SpellScript + class spell_gen_knock_away_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_knock_away_SpellScript); + + void HandleScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_gen_knock_away_SpellScript); - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - if (Creature* caster = GetCaster()->ToCreature()) - caster->getThreatManager().modifyThreatPercent(target, -25); // Xinef: amount confirmed by onyxia and void reaver notes - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_gen_knock_away_SpellScript::HandleScriptEffect, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_knock_away_SpellScript(); + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) + if (Creature* caster = GetCaster()->ToCreature()) + caster->getThreatManager().modifyThreatPercent(target, -25); // Xinef: amount confirmed by onyxia and void reaver notes } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_gen_knock_away_SpellScript::HandleScriptEffect, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_knock_away_SpellScript(); + } }; class spell_gen_mod_radius_by_caster_scale : public SpellScriptLoader { - public: - spell_gen_mod_radius_by_caster_scale() : SpellScriptLoader("spell_gen_mod_radius_by_caster_scale") { } +public: + spell_gen_mod_radius_by_caster_scale() : SpellScriptLoader("spell_gen_mod_radius_by_caster_scale") { } - class spell_gen_mod_radius_by_caster_scale_SpellScript : public SpellScript + class spell_gen_mod_radius_by_caster_scale_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_mod_radius_by_caster_scale_SpellScript) + + bool Load() { - PrepareSpellScript(spell_gen_mod_radius_by_caster_scale_SpellScript) - - bool Load() - { - GetSpell()->SetSpellValue(SPELLVALUE_RADIUS_MOD, 10000.0f * GetCaster()->GetFloatValue(OBJECT_FIELD_SCALE_X)); - return true; - } - - void Register() - { - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_mod_radius_by_caster_scale_SpellScript(); + GetSpell()->SetSpellValue(SPELLVALUE_RADIUS_MOD, 10000.0f * GetCaster()->GetFloatValue(OBJECT_FIELD_SCALE_X)); + return true; } + + void Register() + { + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_mod_radius_by_caster_scale_SpellScript(); + } }; class spell_gen_proc_reduced_above_60 : public SpellScriptLoader { - public: - spell_gen_proc_reduced_above_60() : SpellScriptLoader("spell_gen_proc_reduced_above_60") { } +public: + spell_gen_proc_reduced_above_60() : SpellScriptLoader("spell_gen_proc_reduced_above_60") { } - class spell_gen_proc_reduced_above_60_AuraScript : public AuraScript + class spell_gen_proc_reduced_above_60_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_proc_reduced_above_60_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_gen_proc_reduced_above_60_AuraScript); + // Xinef: mostly its 33.(3)% reduce by 70 and 66.(6)% by 80 + if (eventInfo.GetActor() && eventInfo.GetActor()->getLevel() > 60) + if (roll_chance_f((eventInfo.GetActor()->getLevel() - 60) * 3.33f)) + return false; - bool CheckProc(ProcEventInfo& eventInfo) - { - // Xinef: mostly its 33.(3)% reduce by 70 and 66.(6)% by 80 - if (eventInfo.GetActor() && eventInfo.GetActor()->getLevel() > 60) - if (roll_chance_f((eventInfo.GetActor()->getLevel() - 60) * 3.33f)) - return false; - - return true; - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_gen_proc_reduced_above_60_AuraScript::CheckProc); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_proc_reduced_above_60_AuraScript(); + return true; } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_gen_proc_reduced_above_60_AuraScript::CheckProc); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_proc_reduced_above_60_AuraScript(); + } }; class spell_gen_visual_dummy_stun : public SpellScriptLoader { - public: - spell_gen_visual_dummy_stun() : SpellScriptLoader("spell_gen_visual_dummy_stun") { } +public: + spell_gen_visual_dummy_stun() : SpellScriptLoader("spell_gen_visual_dummy_stun") { } - class spell_gen_visual_dummy_stun_AuraScript : public AuraScript + class spell_gen_visual_dummy_stun_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_visual_dummy_stun_AuraScript); + + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_gen_visual_dummy_stun_AuraScript); - - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - target->SetControlled(true, UNIT_STATE_STUNNED); - } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - target->SetControlled(false, UNIT_STATE_STUNNED); - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_gen_visual_dummy_stun_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_gen_visual_dummy_stun_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_visual_dummy_stun_AuraScript(); + Unit* target = GetTarget(); + target->SetControlled(true, UNIT_STATE_STUNNED); } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + target->SetControlled(false, UNIT_STATE_STUNNED); + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_gen_visual_dummy_stun_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_gen_visual_dummy_stun_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_visual_dummy_stun_AuraScript(); + } }; class spell_gen_random_target32 : public SpellScriptLoader { - public: - spell_gen_random_target32() : SpellScriptLoader("spell_gen_random_target32") { } +public: + spell_gen_random_target32() : SpellScriptLoader("spell_gen_random_target32") { } - class spell_gen_random_target32_SpellScript : public SpellScript + class spell_gen_random_target32_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_random_target32_SpellScript); + + void ModDest(SpellDestination& dest) { - PrepareSpellScript(spell_gen_random_target32_SpellScript); + float dist = GetSpellInfo()->Effects[EFFECT_0].CalcRadius(GetCaster()); + float angle = frand(0.0f, 2 * M_PI); - void ModDest(SpellDestination& dest) - { - float dist = GetSpellInfo()->Effects[EFFECT_0].CalcRadius(GetCaster()); - float angle = frand(0.0f, 2*M_PI); - - Position pos; - GetCaster()->GetNearPosition(pos, dist, angle); - dest.Relocate(pos); - } - - void Register() - { - OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_gen_random_target32_SpellScript::ModDest, EFFECT_0, TARGET_DEST_CASTER_SUMMON); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_random_target32_SpellScript(); + Position pos; + GetCaster()->GetNearPosition(pos, dist, angle); + dest.Relocate(pos); } + + void Register() + { + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_gen_random_target32_SpellScript::ModDest, EFFECT_0, TARGET_DEST_CASTER_SUMMON); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_random_target32_SpellScript(); + } }; class spell_gen_hate_to_zero : public SpellScriptLoader { - public: - spell_gen_hate_to_zero() : SpellScriptLoader("spell_gen_hate_to_zero") { } +public: + spell_gen_hate_to_zero() : SpellScriptLoader("spell_gen_hate_to_zero") { } - class spell_gen_hate_to_zero_SpellScript : public SpellScript + class spell_gen_hate_to_zero_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_hate_to_zero_SpellScript); + + void HandleDummy(SpellEffIndex effIndex) { - PrepareSpellScript(spell_gen_hate_to_zero_SpellScript); - - void HandleDummy(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - if (Creature* caster = GetCaster()->ToCreature()) - caster->getThreatManager().modifyThreatPercent(target, -100); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_gen_hate_to_zero_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_hate_to_zero_SpellScript(); + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) + if (Creature* caster = GetCaster()->ToCreature()) + caster->getThreatManager().modifyThreatPercent(target, -100); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_gen_hate_to_zero_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_hate_to_zero_SpellScript(); + } }; class spell_gen_focused_bursts : public SpellScriptLoader { - public: - spell_gen_focused_bursts() : SpellScriptLoader("spell_gen_focused_bursts") { } +public: + spell_gen_focused_bursts() : SpellScriptLoader("spell_gen_focused_bursts") { } - class spell_gen_focused_bursts_SpellScript : public SpellScript + class spell_gen_focused_bursts_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_focused_bursts_SpellScript); + + void HandleDummy(SpellEffIndex effIndex) { - PrepareSpellScript(spell_gen_focused_bursts_SpellScript); + PreventHitDefaultEffect(effIndex); + if (effIndex != EFFECT_0) + return; - void HandleDummy(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (effIndex != EFFECT_0) - return; - - if (Unit* target = GetHitUnit()) - GetCaster()->CastSpell(target, uint32(GetSpellInfo()->Effects[EFFECT_0].BasePoints)+urand(1, 3), true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_gen_focused_bursts_SpellScript::HandleDummy, EFFECT_ALL, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_focused_bursts_SpellScript(); + if (Unit* target = GetHitUnit()) + GetCaster()->CastSpell(target, uint32(GetSpellInfo()->Effects[EFFECT_0].BasePoints) + urand(1, 3), true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_gen_focused_bursts_SpellScript::HandleDummy, EFFECT_ALL, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_focused_bursts_SpellScript(); + } }; enum eFlurryOfClaws @@ -1350,62 +1354,62 @@ enum eFlurryOfClaws class spell_gen_flurry_of_claws : public SpellScriptLoader { - public: - spell_gen_flurry_of_claws() : SpellScriptLoader("spell_gen_flurry_of_claws") { } +public: + spell_gen_flurry_of_claws() : SpellScriptLoader("spell_gen_flurry_of_claws") { } - class spell_gen_flurry_of_claws_AuraScript : public AuraScript + class spell_gen_flurry_of_claws_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_flurry_of_claws_AuraScript); + + void OnPeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_gen_flurry_of_claws_AuraScript); - - void OnPeriodic(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - if (Unit* target = GetUnitOwner()->SelectNearbyTarget(nullptr, 7.0f)) - if (target->GetEntry() == NPC_FRENZYHEART_RAVAGER || target->GetEntry() == NPC_FRENZYHEART_HUNTER) - { - int32 basePoints = irand(1400, 2200); - GetUnitOwner()->CastCustomSpell(SPELL_FLURRY_OF_CLAWS_DAMAGE, SPELLVALUE_BASE_POINT0, basePoints, target, TRIGGERED_FULL_MASK); - } - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_flurry_of_claws_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_flurry_of_claws_AuraScript(); + PreventDefaultAction(); + if (Unit* target = GetUnitOwner()->SelectNearbyTarget(nullptr, 7.0f)) + if (target->GetEntry() == NPC_FRENZYHEART_RAVAGER || target->GetEntry() == NPC_FRENZYHEART_HUNTER) + { + int32 basePoints = irand(1400, 2200); + GetUnitOwner()->CastCustomSpell(SPELL_FLURRY_OF_CLAWS_DAMAGE, SPELLVALUE_BASE_POINT0, basePoints, target, TRIGGERED_FULL_MASK); + } } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_flurry_of_claws_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_flurry_of_claws_AuraScript(); + } }; class spell_gen_throw_back : public SpellScriptLoader { - public: - spell_gen_throw_back() : SpellScriptLoader("spell_gen_throw_back") { } +public: + spell_gen_throw_back() : SpellScriptLoader("spell_gen_throw_back") { } - class spell_gen_throw_back_SpellScript : public SpellScript + class spell_gen_throw_back_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_throw_back_SpellScript); + + void HandleScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_gen_throw_back_SpellScript); - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - target->CastSpell(GetCaster(), uint32(GetEffectValue()), true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_gen_throw_back_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_throw_back_SpellScript(); + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) + target->CastSpell(GetCaster(), uint32(GetEffectValue()), true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_gen_throw_back_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_throw_back_SpellScript(); + } }; enum eHaunted @@ -1415,120 +1419,120 @@ enum eHaunted class spell_gen_haunted : public SpellScriptLoader { - public: - spell_gen_haunted() : SpellScriptLoader("spell_gen_haunted") { } +public: + spell_gen_haunted() : SpellScriptLoader("spell_gen_haunted") { } - class spell_gen_haunted_AuraScript : public AuraScript + class spell_gen_haunted_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_haunted_AuraScript); + + void HandleEffectCalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude) { - PrepareAuraScript(spell_gen_haunted_AuraScript); - - void HandleEffectCalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude) - { - isPeriodic = true; - amplitude = urand(120,300) * IN_MILLISECONDS; - } - - void HandleEffectPeriodic(AuraEffect const * /*aurEff*/) - { - if (Unit* caster = GetCaster()) - { - Position pos; - caster->GetRandomNearPosition(pos, 5.0f); - if (Creature* haunt = caster->SummonCreature(NPC_SCOURGE_HAUNT, pos, TEMPSUMMON_TIMED_DESPAWN, urand(10,20) * IN_MILLISECONDS)) - { - haunt->SetSpeed(MOVE_RUN, 0.5, true); - haunt->GetMotionMaster()->MoveFollow(caster, 1, M_PI); - } - } - } - - void HandleOnEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) - if (Creature* haunt = caster->FindNearestCreature(NPC_SCOURGE_HAUNT, 5.0f, true)) - haunt->DespawnOrUnsummon(); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_haunted_AuraScript::HandleEffectPeriodic, EFFECT_1, SPELL_AURA_DUMMY); - DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_gen_haunted_AuraScript::HandleEffectCalcPeriodic, EFFECT_1, SPELL_AURA_DUMMY); - OnEffectRemove += AuraEffectRemoveFn(spell_gen_haunted_AuraScript::HandleOnEffectRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_haunted_AuraScript(); + isPeriodic = true; + amplitude = urand(120, 300) * IN_MILLISECONDS; } - class spell_gen_haunted_SpellScript : public SpellScript + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) { - PrepareSpellScript(spell_gen_haunted_SpellScript); - - void HandleOnEffectHit(SpellEffIndex effIndex) + if (Unit* caster = GetCaster()) { - PreventHitDefaultEffect(effIndex); - - if (Unit* caster = GetCaster()) + Position pos; + caster->GetRandomNearPosition(pos, 5.0f); + if (Creature* haunt = caster->SummonCreature(NPC_SCOURGE_HAUNT, pos, TEMPSUMMON_TIMED_DESPAWN, urand(10, 20) * IN_MILLISECONDS)) { - Position pos; - caster->GetRandomNearPosition(pos, 5.0f); - if (Creature* haunt = caster->SummonCreature(NPC_SCOURGE_HAUNT, pos, TEMPSUMMON_TIMED_DESPAWN, urand(10,20) * IN_MILLISECONDS)) - { - haunt->SetSpeed(MOVE_RUN, 0.5, true); - haunt->GetMotionMaster()->MoveFollow(caster, 1, M_PI); - } + haunt->SetSpeed(MOVE_RUN, 0.5, true); + haunt->GetMotionMaster()->MoveFollow(caster, 1, M_PI); } } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_gen_haunted_SpellScript::HandleOnEffectHit, EFFECT_0, SPELL_EFFECT_SUMMON); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_haunted_SpellScript(); } + + void HandleOnEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* caster = GetCaster()) + if (Creature* haunt = caster->FindNearestCreature(NPC_SCOURGE_HAUNT, 5.0f, true)) + haunt->DespawnOrUnsummon(); + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_haunted_AuraScript::HandleEffectPeriodic, EFFECT_1, SPELL_AURA_DUMMY); + DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_gen_haunted_AuraScript::HandleEffectCalcPeriodic, EFFECT_1, SPELL_AURA_DUMMY); + OnEffectRemove += AuraEffectRemoveFn(spell_gen_haunted_AuraScript::HandleOnEffectRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_haunted_AuraScript(); + } + + class spell_gen_haunted_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_haunted_SpellScript); + + void HandleOnEffectHit(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + + if (Unit* caster = GetCaster()) + { + Position pos; + caster->GetRandomNearPosition(pos, 5.0f); + if (Creature* haunt = caster->SummonCreature(NPC_SCOURGE_HAUNT, pos, TEMPSUMMON_TIMED_DESPAWN, urand(10, 20) * IN_MILLISECONDS)) + { + haunt->SetSpeed(MOVE_RUN, 0.5, true); + haunt->GetMotionMaster()->MoveFollow(caster, 1, M_PI); + } + } + } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_gen_haunted_SpellScript::HandleOnEffectHit, EFFECT_0, SPELL_EFFECT_SUMMON); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_haunted_SpellScript(); + } }; // Theirs class spell_gen_absorb0_hitlimit1 : public SpellScriptLoader { - public: - spell_gen_absorb0_hitlimit1() : SpellScriptLoader("spell_gen_absorb0_hitlimit1") { } +public: + spell_gen_absorb0_hitlimit1() : SpellScriptLoader("spell_gen_absorb0_hitlimit1") { } - class spell_gen_absorb0_hitlimit1_AuraScript : public AuraScript + class spell_gen_absorb0_hitlimit1_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_absorb0_hitlimit1_AuraScript); + + uint32 limit; + + bool Load() { - PrepareAuraScript(spell_gen_absorb0_hitlimit1_AuraScript); - - uint32 limit; - - bool Load() - { - // Max absorb stored in 1 dummy effect - limit = GetSpellInfo()->Effects[EFFECT_1].CalcValue(); - return true; - } - - void Absorb(AuraEffect* /*aurEff*/, DamageInfo& /*dmgInfo*/, uint32& absorbAmount) - { - absorbAmount = std::min(limit, absorbAmount); - } - - void Register() - { - OnEffectAbsorb += AuraEffectAbsorbFn(spell_gen_absorb0_hitlimit1_AuraScript::Absorb, EFFECT_0); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_absorb0_hitlimit1_AuraScript(); + // Max absorb stored in 1 dummy effect + limit = GetSpellInfo()->Effects[EFFECT_1].CalcValue(); + return true; } + + void Absorb(AuraEffect* /*aurEff*/, DamageInfo& /*dmgInfo*/, uint32& absorbAmount) + { + absorbAmount = std::min(limit, absorbAmount); + } + + void Register() + { + OnEffectAbsorb += AuraEffectAbsorbFn(spell_gen_absorb0_hitlimit1_AuraScript::Absorb, EFFECT_0); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_absorb0_hitlimit1_AuraScript(); + } }; // 28764 - Adaptive Warding (Frostfire Regalia Set) @@ -1543,154 +1547,154 @@ enum AdaptiveWarding class spell_gen_adaptive_warding : public SpellScriptLoader { - public: - spell_gen_adaptive_warding() : SpellScriptLoader("spell_gen_adaptive_warding") { } +public: + spell_gen_adaptive_warding() : SpellScriptLoader("spell_gen_adaptive_warding") { } - class spell_gen_adaptive_warding_AuraScript : public AuraScript + class spell_gen_adaptive_warding_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_adaptive_warding_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_gen_adaptive_warding_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_GEN_ADAPTIVE_WARDING_FIRE) || + if (!sSpellMgr->GetSpellInfo(SPELL_GEN_ADAPTIVE_WARDING_FIRE) || !sSpellMgr->GetSpellInfo(SPELL_GEN_ADAPTIVE_WARDING_NATURE) || !sSpellMgr->GetSpellInfo(SPELL_GEN_ADAPTIVE_WARDING_FROST) || !sSpellMgr->GetSpellInfo(SPELL_GEN_ADAPTIVE_WARDING_SHADOW) || !sSpellMgr->GetSpellInfo(SPELL_GEN_ADAPTIVE_WARDING_ARCANE)) - return false; - return true; - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - if (eventInfo.GetDamageInfo()->GetSpellInfo()) // eventInfo.GetSpellInfo() - return false; - - // find Mage Armor - if (!GetTarget()->GetAuraEffect(SPELL_AURA_MOD_MANA_REGEN_INTERRUPT, SPELLFAMILY_MAGE, 0x10000000, 0x0, 0x0)) - return false; - - switch (GetFirstSchoolInMask(eventInfo.GetSchoolMask())) - { - case SPELL_SCHOOL_NORMAL: - case SPELL_SCHOOL_HOLY: - return false; - default: - break; - } - return true; - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - - uint32 spellId = 0; - switch (GetFirstSchoolInMask(eventInfo.GetSchoolMask())) - { - case SPELL_SCHOOL_FIRE: - spellId = SPELL_GEN_ADAPTIVE_WARDING_FIRE; - break; - case SPELL_SCHOOL_NATURE: - spellId = SPELL_GEN_ADAPTIVE_WARDING_NATURE; - break; - case SPELL_SCHOOL_FROST: - spellId = SPELL_GEN_ADAPTIVE_WARDING_FROST; - break; - case SPELL_SCHOOL_SHADOW: - spellId = SPELL_GEN_ADAPTIVE_WARDING_SHADOW; - break; - case SPELL_SCHOOL_ARCANE: - spellId = SPELL_GEN_ADAPTIVE_WARDING_ARCANE; - break; - default: - return; - } - GetTarget()->CastSpell(GetTarget(), spellId, true, NULL, aurEff); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_gen_adaptive_warding_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_gen_adaptive_warding_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_adaptive_warding_AuraScript(); + return false; + return true; } + + bool CheckProc(ProcEventInfo& eventInfo) + { + if (eventInfo.GetDamageInfo()->GetSpellInfo()) // eventInfo.GetSpellInfo() + return false; + + // find Mage Armor + if (!GetTarget()->GetAuraEffect(SPELL_AURA_MOD_MANA_REGEN_INTERRUPT, SPELLFAMILY_MAGE, 0x10000000, 0x0, 0x0)) + return false; + + switch (GetFirstSchoolInMask(eventInfo.GetSchoolMask())) + { + case SPELL_SCHOOL_NORMAL: + case SPELL_SCHOOL_HOLY: + return false; + default: + break; + } + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + uint32 spellId = 0; + switch (GetFirstSchoolInMask(eventInfo.GetSchoolMask())) + { + case SPELL_SCHOOL_FIRE: + spellId = SPELL_GEN_ADAPTIVE_WARDING_FIRE; + break; + case SPELL_SCHOOL_NATURE: + spellId = SPELL_GEN_ADAPTIVE_WARDING_NATURE; + break; + case SPELL_SCHOOL_FROST: + spellId = SPELL_GEN_ADAPTIVE_WARDING_FROST; + break; + case SPELL_SCHOOL_SHADOW: + spellId = SPELL_GEN_ADAPTIVE_WARDING_SHADOW; + break; + case SPELL_SCHOOL_ARCANE: + spellId = SPELL_GEN_ADAPTIVE_WARDING_ARCANE; + break; + default: + return; + } + GetTarget()->CastSpell(GetTarget(), spellId, true, NULL, aurEff); + } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_gen_adaptive_warding_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_gen_adaptive_warding_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_adaptive_warding_AuraScript(); + } }; class spell_gen_av_drekthar_presence : public SpellScriptLoader { - public: - spell_gen_av_drekthar_presence() : SpellScriptLoader("spell_gen_av_drekthar_presence") { } +public: + spell_gen_av_drekthar_presence() : SpellScriptLoader("spell_gen_av_drekthar_presence") { } - class spell_gen_av_drekthar_presence_AuraScript : public AuraScript + class spell_gen_av_drekthar_presence_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_av_drekthar_presence_AuraScript); + + bool CheckAreaTarget(Unit* target) { - PrepareAuraScript(spell_gen_av_drekthar_presence_AuraScript); - - bool CheckAreaTarget(Unit* target) + switch (target->GetEntry()) { - switch (target->GetEntry()) - { - // alliance - case 14762: // Dun Baldar North Marshal - case 14763: // Dun Baldar South Marshal - case 14764: // Icewing Marshal - case 14765: // Stonehearth Marshal - case 11948: // Vandar Stormspike - // horde - case 14772: // East Frostwolf Warmaster - case 14776: // Tower Point Warmaster - case 14773: // Iceblood Warmaster - case 14777: // West Frostwolf Warmaster - case 11946: // Drek'thar - return true; - default: - return false; - } + // alliance + case 14762: // Dun Baldar North Marshal + case 14763: // Dun Baldar South Marshal + case 14764: // Icewing Marshal + case 14765: // Stonehearth Marshal + case 11948: // Vandar Stormspike + // horde + case 14772: // East Frostwolf Warmaster + case 14776: // Tower Point Warmaster + case 14773: // Iceblood Warmaster + case 14777: // West Frostwolf Warmaster + case 11946: // Drek'thar + return true; + default: + return false; } - - void Register() - { - DoCheckAreaTarget += AuraCheckAreaTargetFn(spell_gen_av_drekthar_presence_AuraScript::CheckAreaTarget); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_av_drekthar_presence_AuraScript(); } + + void Register() + { + DoCheckAreaTarget += AuraCheckAreaTargetFn(spell_gen_av_drekthar_presence_AuraScript::CheckAreaTarget); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_av_drekthar_presence_AuraScript(); + } }; // 46394 Brutallus Burn class spell_gen_burn_brutallus : public SpellScriptLoader { - public: - spell_gen_burn_brutallus() : SpellScriptLoader("spell_gen_burn_brutallus") { } +public: + spell_gen_burn_brutallus() : SpellScriptLoader("spell_gen_burn_brutallus") { } - class spell_gen_burn_brutallus_AuraScript : public AuraScript + class spell_gen_burn_brutallus_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_burn_brutallus_AuraScript); + + void HandleEffectPeriodicUpdate(AuraEffect* aurEff) { - PrepareAuraScript(spell_gen_burn_brutallus_AuraScript); - - void HandleEffectPeriodicUpdate(AuraEffect* aurEff) - { - if (aurEff->GetTickNumber() % 11 == 0) - aurEff->SetAmount(aurEff->GetAmount() * 2); - } - - void Register() - { - OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_gen_burn_brutallus_AuraScript::HandleEffectPeriodicUpdate, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_burn_brutallus_AuraScript(); + if (aurEff->GetTickNumber() % 11 == 0) + aurEff->SetAmount(aurEff->GetAmount() * 2); } + + void Register() + { + OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_gen_burn_brutallus_AuraScript::HandleEffectPeriodicUpdate, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_burn_brutallus_AuraScript(); + } }; enum CannibalizeSpells @@ -1700,50 +1704,50 @@ enum CannibalizeSpells class spell_gen_cannibalize : public SpellScriptLoader { - public: - spell_gen_cannibalize() : SpellScriptLoader("spell_gen_cannibalize") { } +public: + spell_gen_cannibalize() : SpellScriptLoader("spell_gen_cannibalize") { } - class spell_gen_cannibalize_SpellScript : public SpellScript + class spell_gen_cannibalize_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_cannibalize_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_gen_cannibalize_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_CANNIBALIZE_TRIGGERED)) - return false; - return true; - } - - SpellCastResult CheckIfCorpseNear() - { - Unit* caster = GetCaster(); - float max_range = GetSpellInfo()->GetMaxRange(false); - WorldObject* result = nullptr; - // search for nearby enemy corpse in range - acore::AnyDeadUnitSpellTargetInRangeCheck check(caster, max_range, GetSpellInfo(), TARGET_CHECK_CORPSE); - acore::WorldObjectSearcher searcher(caster, result, check); - caster->GetMap()->VisitFirstFound(caster->m_positionX, caster->m_positionY, max_range, searcher); - if (!result) - return SPELL_FAILED_NO_EDIBLE_CORPSES; - return SPELL_CAST_OK; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - GetCaster()->CastSpell(GetCaster(), SPELL_CANNIBALIZE_TRIGGERED, false); - } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_gen_cannibalize_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - OnCheckCast += SpellCheckCastFn(spell_gen_cannibalize_SpellScript::CheckIfCorpseNear); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_cannibalize_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_CANNIBALIZE_TRIGGERED)) + return false; + return true; } + + SpellCastResult CheckIfCorpseNear() + { + Unit* caster = GetCaster(); + float max_range = GetSpellInfo()->GetMaxRange(false); + WorldObject* result = nullptr; + // search for nearby enemy corpse in range + acore::AnyDeadUnitSpellTargetInRangeCheck check(caster, max_range, GetSpellInfo(), TARGET_CHECK_CORPSE); + acore::WorldObjectSearcher searcher(caster, result, check); + caster->GetMap()->VisitFirstFound(caster->m_positionX, caster->m_positionY, max_range, searcher); + if (!result) + return SPELL_FAILED_NO_EDIBLE_CORPSES; + return SPELL_CAST_OK; + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + GetCaster()->CastSpell(GetCaster(), SPELL_CANNIBALIZE_TRIGGERED, false); + } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_gen_cannibalize_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + OnCheckCast += SpellCheckCastFn(spell_gen_cannibalize_SpellScript::CheckIfCorpseNear); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_cannibalize_SpellScript(); + } }; // 63845 - Create Lance @@ -1755,44 +1759,44 @@ enum CreateLanceSpells class spell_gen_create_lance : public SpellScriptLoader { - public: - spell_gen_create_lance() : SpellScriptLoader("spell_gen_create_lance") { } +public: + spell_gen_create_lance() : SpellScriptLoader("spell_gen_create_lance") { } - class spell_gen_create_lance_SpellScript : public SpellScript + class spell_gen_create_lance_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_create_lance_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_gen_create_lance_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_CREATE_LANCE_ALLIANCE) || + if (!sSpellMgr->GetSpellInfo(SPELL_CREATE_LANCE_ALLIANCE) || !sSpellMgr->GetSpellInfo(SPELL_CREATE_LANCE_HORDE)) - return false; - return true; - } - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - - if (Player* target = GetHitPlayer()) - { - if (target->GetTeamId() == TEAM_ALLIANCE) - GetCaster()->CastSpell(target, SPELL_CREATE_LANCE_ALLIANCE, true); - else - GetCaster()->CastSpell(target, SPELL_CREATE_LANCE_HORDE, true); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_gen_create_lance_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_create_lance_SpellScript(); + return false; + return true; } + + void HandleScript(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + + if (Player* target = GetHitPlayer()) + { + if (target->GetTeamId() == TEAM_ALLIANCE) + GetCaster()->CastSpell(target, SPELL_CREATE_LANCE_ALLIANCE, true); + else + GetCaster()->CastSpell(target, SPELL_CREATE_LANCE_HORDE, true); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_gen_create_lance_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_create_lance_SpellScript(); + } }; enum MossCoveredFeet @@ -1804,36 +1808,36 @@ enum MossCoveredFeet // 31399 Moss Covered Feet class spell_gen_moss_covered_feet : public SpellScriptLoader { - public: - spell_gen_moss_covered_feet() : SpellScriptLoader("spell_gen_moss_covered_feet") { } +public: + spell_gen_moss_covered_feet() : SpellScriptLoader("spell_gen_moss_covered_feet") { } - class spell_gen_moss_covered_feet_AuraScript : public AuraScript + class spell_gen_moss_covered_feet_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_moss_covered_feet_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_gen_moss_covered_feet_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - if (!sSpellMgr->GetSpellInfo(SPELL_FALL_DOWN)) - return false; - return true; - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - eventInfo.GetActionTarget()->CastSpell((Unit*)nullptr, SPELL_FALL_DOWN, true, nullptr, aurEff); - } - - void Register() override - { - OnEffectProc += AuraEffectProcFn(spell_gen_moss_covered_feet_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_gen_moss_covered_feet_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_FALL_DOWN)) + return false; + return true; } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + eventInfo.GetActionTarget()->CastSpell((Unit*)nullptr, SPELL_FALL_DOWN, true, nullptr, aurEff); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_gen_moss_covered_feet_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_gen_moss_covered_feet_AuraScript(); + } }; enum Netherbloom @@ -1844,54 +1848,54 @@ enum Netherbloom // 28702 - Netherbloom class spell_gen_netherbloom : public SpellScriptLoader { - public: - spell_gen_netherbloom() : SpellScriptLoader("spell_gen_netherbloom") { } +public: + spell_gen_netherbloom() : SpellScriptLoader("spell_gen_netherbloom") { } - class spell_gen_netherbloom_SpellScript : public SpellScript + class spell_gen_netherbloom_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_netherbloom_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_gen_netherbloom_SpellScript); + for (uint8 i = 0; i < 5; ++i) + if (!sSpellMgr->GetSpellInfo(SPELL_NETHERBLOOM_POLLEN_1 + i)) + return false; + return true; + } - bool Validate(SpellInfo const* /*spellInfo*/) + void HandleScript(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + + if (Unit* target = GetHitUnit()) { + // 25% chance of casting a random buff + if (roll_chance_i(75)) + return; + + // triggered spells are 28703 to 28707 + // Note: some sources say, that there was the possibility of + // receiving a debuff. However, this seems to be removed by a patch. + + // don't overwrite an existing aura for (uint8 i = 0; i < 5; ++i) - if (!sSpellMgr->GetSpellInfo(SPELL_NETHERBLOOM_POLLEN_1 + i)) - return false; - return true; - } - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - - if (Unit* target = GetHitUnit()) - { - // 25% chance of casting a random buff - if (roll_chance_i(75)) + if (target->HasAura(SPELL_NETHERBLOOM_POLLEN_1 + i)) return; - // triggered spells are 28703 to 28707 - // Note: some sources say, that there was the possibility of - // receiving a debuff. However, this seems to be removed by a patch. - - // don't overwrite an existing aura - for (uint8 i = 0; i < 5; ++i) - if (target->HasAura(SPELL_NETHERBLOOM_POLLEN_1 + i)) - return; - - target->CastSpell(target, SPELL_NETHERBLOOM_POLLEN_1 + urand(0, 4), true); - } + target->CastSpell(target, SPELL_NETHERBLOOM_POLLEN_1 + urand(0, 4), true); } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_gen_netherbloom_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_netherbloom_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_gen_netherbloom_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_netherbloom_SpellScript(); + } }; enum NightmareVine @@ -1902,42 +1906,42 @@ enum NightmareVine // 28720 - Nightmare Vine class spell_gen_nightmare_vine : public SpellScriptLoader { - public: - spell_gen_nightmare_vine() : SpellScriptLoader("spell_gen_nightmare_vine") { } +public: + spell_gen_nightmare_vine() : SpellScriptLoader("spell_gen_nightmare_vine") { } - class spell_gen_nightmare_vine_SpellScript : public SpellScript + class spell_gen_nightmare_vine_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_nightmare_vine_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_gen_nightmare_vine_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_NIGHTMARE_POLLEN)) - return false; - return true; - } - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - - if (Unit* target = GetHitUnit()) - { - // 25% chance of casting Nightmare Pollen - if (roll_chance_i(25)) - target->CastSpell(target, SPELL_NIGHTMARE_POLLEN, true); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_gen_nightmare_vine_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_nightmare_vine_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_NIGHTMARE_POLLEN)) + return false; + return true; } + + void HandleScript(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + + if (Unit* target = GetHitUnit()) + { + // 25% chance of casting Nightmare Pollen + if (roll_chance_i(25)) + target->CastSpell(target, SPELL_NIGHTMARE_POLLEN, true); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_gen_nightmare_vine_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_nightmare_vine_SpellScript(); + } }; enum ObsidianArmor @@ -1953,78 +1957,78 @@ enum ObsidianArmor // 27539 - Obsidian Armor class spell_gen_obsidian_armor : public SpellScriptLoader { - public: - spell_gen_obsidian_armor() : SpellScriptLoader("spell_gen_obsidian_armor") { } +public: + spell_gen_obsidian_armor() : SpellScriptLoader("spell_gen_obsidian_armor") { } - class spell_gen_obsidian_armor_AuraScript : public AuraScript + class spell_gen_obsidian_armor_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_obsidian_armor_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_gen_obsidian_armor_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_HOLY) || + if (!sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_HOLY) || !sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_FIRE) || !sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_NATURE) || !sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_FROST) || !sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_SHADOW) || !sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_ARCANE)) - return false; - return true; - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - if (eventInfo.GetDamageInfo()->GetSpellInfo()) // eventInfo.GetSpellInfo() - return false; - - if (GetFirstSchoolInMask(eventInfo.GetSchoolMask()) == SPELL_SCHOOL_NORMAL) - return false; - - return true; - } - - void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - - uint32 spellId = 0; - switch (GetFirstSchoolInMask(eventInfo.GetSchoolMask())) - { - case SPELL_SCHOOL_HOLY: - spellId = SPELL_GEN_OBSIDIAN_ARMOR_HOLY; - break; - case SPELL_SCHOOL_FIRE: - spellId = SPELL_GEN_OBSIDIAN_ARMOR_FIRE; - break; - case SPELL_SCHOOL_NATURE: - spellId = SPELL_GEN_OBSIDIAN_ARMOR_NATURE; - break; - case SPELL_SCHOOL_FROST: - spellId = SPELL_GEN_OBSIDIAN_ARMOR_FROST; - break; - case SPELL_SCHOOL_SHADOW: - spellId = SPELL_GEN_OBSIDIAN_ARMOR_SHADOW; - break; - case SPELL_SCHOOL_ARCANE: - spellId = SPELL_GEN_OBSIDIAN_ARMOR_ARCANE; - break; - default: - return; - } - GetTarget()->CastSpell(GetTarget(), spellId, true, NULL, aurEff); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_gen_obsidian_armor_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_gen_obsidian_armor_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_obsidian_armor_AuraScript(); + return false; + return true; } + + bool CheckProc(ProcEventInfo& eventInfo) + { + if (eventInfo.GetDamageInfo()->GetSpellInfo()) // eventInfo.GetSpellInfo() + return false; + + if (GetFirstSchoolInMask(eventInfo.GetSchoolMask()) == SPELL_SCHOOL_NORMAL) + return false; + + return true; + } + + void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + uint32 spellId = 0; + switch (GetFirstSchoolInMask(eventInfo.GetSchoolMask())) + { + case SPELL_SCHOOL_HOLY: + spellId = SPELL_GEN_OBSIDIAN_ARMOR_HOLY; + break; + case SPELL_SCHOOL_FIRE: + spellId = SPELL_GEN_OBSIDIAN_ARMOR_FIRE; + break; + case SPELL_SCHOOL_NATURE: + spellId = SPELL_GEN_OBSIDIAN_ARMOR_NATURE; + break; + case SPELL_SCHOOL_FROST: + spellId = SPELL_GEN_OBSIDIAN_ARMOR_FROST; + break; + case SPELL_SCHOOL_SHADOW: + spellId = SPELL_GEN_OBSIDIAN_ARMOR_SHADOW; + break; + case SPELL_SCHOOL_ARCANE: + spellId = SPELL_GEN_OBSIDIAN_ARMOR_ARCANE; + break; + default: + return; + } + GetTarget()->CastSpell(GetTarget(), spellId, true, NULL, aurEff); + } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_gen_obsidian_armor_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_gen_obsidian_armor_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_obsidian_armor_AuraScript(); + } }; enum ParachuteSpells @@ -2036,104 +2040,104 @@ enum ParachuteSpells // 45472 Parachute class spell_gen_parachute : public SpellScriptLoader { - public: - spell_gen_parachute() : SpellScriptLoader("spell_gen_parachute") { } +public: + spell_gen_parachute() : SpellScriptLoader("spell_gen_parachute") { } - class spell_gen_parachute_AuraScript : public AuraScript + class spell_gen_parachute_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_parachute_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_gen_parachute_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_PARACHUTE) || + if (!sSpellMgr->GetSpellInfo(SPELL_PARACHUTE) || !sSpellMgr->GetSpellInfo(SPELL_PARACHUTE_BUFF)) - return false; - return true; - } - - void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) - { - if (Player* target = GetTarget()->ToPlayer()) - if (target->IsFalling()) - { - target->RemoveAurasDueToSpell(SPELL_PARACHUTE); - target->CastSpell(target, SPELL_PARACHUTE_BUFF, true); - } - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_parachute_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_parachute_AuraScript(); + return false; + return true; } + + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) + { + if (Player* target = GetTarget()->ToPlayer()) + if (target->IsFalling()) + { + target->RemoveAurasDueToSpell(SPELL_PARACHUTE); + target->CastSpell(target, SPELL_PARACHUTE_BUFF, true); + } + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_parachute_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_parachute_AuraScript(); + } }; class spell_gen_pet_summoned : public SpellScriptLoader { - public: - spell_gen_pet_summoned() : SpellScriptLoader("spell_gen_pet_summoned") { } +public: + spell_gen_pet_summoned() : SpellScriptLoader("spell_gen_pet_summoned") { } - class spell_gen_pet_summoned_SpellScript : public SpellScript + class spell_gen_pet_summoned_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_pet_summoned_SpellScript); + + bool Load() { - PrepareSpellScript(spell_gen_pet_summoned_SpellScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - void HandleScript(SpellEffIndex /*effIndex*/) - { - Player* player = GetCaster()->ToPlayer(); - if (player->GetLastPetNumber() && player->CanResummonPet(player->GetLastPetSpell())) - Pet::LoadPetFromDB(player, PET_LOAD_SUMMON_PET, 0, player->GetLastPetNumber(), true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_gen_pet_summoned_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_pet_summoned_SpellScript(); + return GetCaster()->GetTypeId() == TYPEID_PLAYER; } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Player* player = GetCaster()->ToPlayer(); + if (player->GetLastPetNumber() && player->CanResummonPet(player->GetLastPetSpell())) + Pet::LoadPetFromDB(player, PET_LOAD_SUMMON_PET, 0, player->GetLastPetNumber(), true); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_gen_pet_summoned_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_pet_summoned_SpellScript(); + } }; class spell_gen_remove_flight_auras : public SpellScriptLoader { - public: - spell_gen_remove_flight_auras() : SpellScriptLoader("spell_gen_remove_flight_auras") { } +public: + spell_gen_remove_flight_auras() : SpellScriptLoader("spell_gen_remove_flight_auras") { } - class spell_gen_remove_flight_auras_SpellScript : public SpellScript + class spell_gen_remove_flight_auras_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_remove_flight_auras_SpellScript); + + void HandleScript(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_gen_remove_flight_auras_SpellScript); - - void HandleScript(SpellEffIndex /*effIndex*/) + if (Unit* target = GetHitUnit()) { - if (Unit* target = GetHitUnit()) - { - target->RemoveAurasByType(SPELL_AURA_FLY); - target->RemoveAurasByType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED); - } + target->RemoveAurasByType(SPELL_AURA_FLY); + target->RemoveAurasByType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED); } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_gen_remove_flight_auras_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_remove_flight_auras_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_gen_remove_flight_auras_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_remove_flight_auras_SpellScript(); + } }; enum EluneCandle @@ -2151,105 +2155,105 @@ enum EluneCandle class spell_gen_elune_candle : public SpellScriptLoader { - public: - spell_gen_elune_candle() : SpellScriptLoader("spell_gen_elune_candle") { } +public: + spell_gen_elune_candle() : SpellScriptLoader("spell_gen_elune_candle") { } - class spell_gen_elune_candle_SpellScript : public SpellScript + class spell_gen_elune_candle_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_elune_candle_SpellScript); + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_gen_elune_candle_SpellScript); - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_ELUNE_CANDLE_OMEN_HEAD) || + if (!sSpellMgr->GetSpellInfo(SPELL_ELUNE_CANDLE_OMEN_HEAD) || !sSpellMgr->GetSpellInfo(SPELL_ELUNE_CANDLE_OMEN_CHEST) || !sSpellMgr->GetSpellInfo(SPELL_ELUNE_CANDLE_OMEN_HAND_R) || !sSpellMgr->GetSpellInfo(SPELL_ELUNE_CANDLE_OMEN_HAND_L) || !sSpellMgr->GetSpellInfo(SPELL_ELUNE_CANDLE_NORMAL)) - return false; - return true; - } - - void HandleScript(SpellEffIndex /*effIndex*/) - { - uint32 spellId = 0; - - if (GetHitUnit()->GetEntry() == NPC_OMEN) - { - switch (urand(0, 3)) - { - case 0: - spellId = SPELL_ELUNE_CANDLE_OMEN_HEAD; - break; - case 1: - spellId = SPELL_ELUNE_CANDLE_OMEN_CHEST; - break; - case 2: - spellId = SPELL_ELUNE_CANDLE_OMEN_HAND_R; - break; - case 3: - spellId = SPELL_ELUNE_CANDLE_OMEN_HAND_L; - break; - } - } - else - spellId = SPELL_ELUNE_CANDLE_NORMAL; - - GetCaster()->CastSpell(GetHitUnit(), spellId, true, nullptr); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_gen_elune_candle_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_elune_candle_SpellScript(); + return false; + return true; } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + uint32 spellId = 0; + + if (GetHitUnit()->GetEntry() == NPC_OMEN) + { + switch (urand(0, 3)) + { + case 0: + spellId = SPELL_ELUNE_CANDLE_OMEN_HEAD; + break; + case 1: + spellId = SPELL_ELUNE_CANDLE_OMEN_CHEST; + break; + case 2: + spellId = SPELL_ELUNE_CANDLE_OMEN_HAND_R; + break; + case 3: + spellId = SPELL_ELUNE_CANDLE_OMEN_HAND_L; + break; + } + } + else + spellId = SPELL_ELUNE_CANDLE_NORMAL; + + GetCaster()->CastSpell(GetHitUnit(), spellId, true, nullptr); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_gen_elune_candle_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_elune_candle_SpellScript(); + } }; class spell_gen_creature_permanent_feign_death : public SpellScriptLoader { - public: - spell_gen_creature_permanent_feign_death() : SpellScriptLoader("spell_gen_creature_permanent_feign_death") { } +public: + spell_gen_creature_permanent_feign_death() : SpellScriptLoader("spell_gen_creature_permanent_feign_death") { } - class spell_gen_creature_permanent_feign_death_AuraScript : public AuraScript + class spell_gen_creature_permanent_feign_death_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_creature_permanent_feign_death_AuraScript); + + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_gen_creature_permanent_feign_death_AuraScript); + Unit* target = GetTarget(); + target->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); + target->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); + target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - target->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); - target->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); - target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); - - if (target->GetTypeId() == TYPEID_UNIT) - target->ToCreature()->SetReactState(REACT_PASSIVE); - } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - target->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); - target->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); - target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); - - if (target->GetTypeId() == TYPEID_UNIT) - target->ToCreature()->SetReactState(REACT_AGGRESSIVE); - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_gen_creature_permanent_feign_death_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectApplyFn(spell_gen_creature_permanent_feign_death_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_creature_permanent_feign_death_AuraScript(); + if (target->GetTypeId() == TYPEID_UNIT) + target->ToCreature()->SetReactState(REACT_PASSIVE); } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + target->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); + target->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); + target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + + if (target->GetTypeId() == TYPEID_UNIT) + target->ToCreature()->SetReactState(REACT_AGGRESSIVE); + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_gen_creature_permanent_feign_death_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectApplyFn(spell_gen_creature_permanent_feign_death_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_creature_permanent_feign_death_AuraScript(); + } }; enum PvPTrinketTriggeredSpells @@ -2260,70 +2264,71 @@ enum PvPTrinketTriggeredSpells class spell_pvp_trinket_wotf_shared_cd : public SpellScriptLoader { - public: - spell_pvp_trinket_wotf_shared_cd() : SpellScriptLoader("spell_pvp_trinket_wotf_shared_cd") {} +public: + spell_pvp_trinket_wotf_shared_cd() : SpellScriptLoader("spell_pvp_trinket_wotf_shared_cd") {} - class spell_pvp_trinket_wotf_shared_cd_SpellScript : public SpellScript + class spell_pvp_trinket_wotf_shared_cd_SpellScript : public SpellScript + { + PrepareSpellScript(spell_pvp_trinket_wotf_shared_cd_SpellScript); + + bool Load() { - PrepareSpellScript(spell_pvp_trinket_wotf_shared_cd_SpellScript); + return GetCaster()->GetTypeId() == TYPEID_PLAYER; + } - bool Load() + bool Validate(SpellInfo const* /*spellEntry*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_WILL_OF_THE_FORSAKEN_COOLDOWN_TRIGGER) || !sSpellMgr->GetSpellInfo(SPELL_WILL_OF_THE_FORSAKEN_COOLDOWN_TRIGGER_WOTF)) + return false; + return true; + } + + void HandleScript() + { + Player* player = GetCaster()->ToPlayer(); + // This is only needed because spells cast from spell_linked_spell are triggered by default + // Spell::SendSpellCooldown() skips all spells with TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD + player->AddSpellAndCategoryCooldowns(GetSpellInfo(), GetCastItem() ? GetCastItem()->GetEntry() : 0, GetSpell()); + + if (player->GetTeamId(true) == TEAM_HORDE) { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } + if (GetSpellInfo()->Id == SPELL_WILL_OF_THE_FORSAKEN_COOLDOWN_TRIGGER) + { + WorldPacket data; + player->BuildCooldownPacket(data, SPELL_COOLDOWN_FLAG_INCLUDE_GCD, 7744, GetSpellInfo()->CategoryRecoveryTime); // Will of the forsaken + player->GetSession()->SendPacket(&data); + } + else + { + WorldPacket data(SMSG_INITIAL_SPELLS, (1 + 2 + 2 + 4 + 2 + 2 + 4 + 4)); + data << uint8(0); + data << uint16(0); + data << uint16(1); + data << uint32(42292); // PvP Trinket spell + data << uint16(0); // cast item id + data << uint16(GetSpellInfo()->GetCategory()); // spell category + data << uint32(0); + data << uint32(GetSpellInfo()->CategoryRecoveryTime); + player->GetSession()->SendPacket(&data); - bool Validate(SpellInfo const* /*spellEntry*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_WILL_OF_THE_FORSAKEN_COOLDOWN_TRIGGER) || !sSpellMgr->GetSpellInfo(SPELL_WILL_OF_THE_FORSAKEN_COOLDOWN_TRIGGER_WOTF)) - return false; - return true; - } + WorldPacket data2; + player->BuildCooldownPacket(data, SPELL_COOLDOWN_FLAG_INCLUDE_GCD, 42292, GetSpellInfo()->CategoryRecoveryTime); // PvP Trinket spell + player->GetSession()->SendPacket(&data2); - void HandleScript() - { - Player* player = GetCaster()->ToPlayer(); - // This is only needed because spells cast from spell_linked_spell are triggered by default - // Spell::SendSpellCooldown() skips all spells with TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD - player->AddSpellAndCategoryCooldowns(GetSpellInfo(), GetCastItem() ? GetCastItem()->GetEntry() : 0, GetSpell()); - - if (player->GetTeamId(true) == TEAM_HORDE) { - if (GetSpellInfo()->Id == SPELL_WILL_OF_THE_FORSAKEN_COOLDOWN_TRIGGER) - { - WorldPacket data; - player->BuildCooldownPacket(data, SPELL_COOLDOWN_FLAG_INCLUDE_GCD, 7744, GetSpellInfo()->CategoryRecoveryTime); // Will of the forsaken - player->GetSession()->SendPacket(&data); - } - else - { - WorldPacket data(SMSG_INITIAL_SPELLS, (1+2+2+4+2+2+4+4)); - data << uint8(0); - data << uint16(0); - data << uint16(1); - data << uint32(42292); // PvP Trinket spell - data << uint16(0); // cast item id - data << uint16(GetSpellInfo()->GetCategory()); // spell category - data << uint32(0); - data << uint32(GetSpellInfo()->CategoryRecoveryTime); - player->GetSession()->SendPacket(&data); - - WorldPacket data2; - player->BuildCooldownPacket(data, SPELL_COOLDOWN_FLAG_INCLUDE_GCD, 42292, GetSpellInfo()->CategoryRecoveryTime); // PvP Trinket spell - player->GetSession()->SendPacket(&data2); - - } } } - - void Register() - { - AfterCast += SpellCastFn(spell_pvp_trinket_wotf_shared_cd_SpellScript::HandleScript); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_pvp_trinket_wotf_shared_cd_SpellScript(); } + + void Register() + { + AfterCast += SpellCastFn(spell_pvp_trinket_wotf_shared_cd_SpellScript::HandleScript); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_pvp_trinket_wotf_shared_cd_SpellScript(); + } }; enum AnimalBloodPoolSpell @@ -2335,47 +2340,47 @@ enum AnimalBloodPoolSpell class spell_gen_animal_blood : public SpellScriptLoader { - public: - spell_gen_animal_blood() : SpellScriptLoader("spell_gen_animal_blood") { } +public: + spell_gen_animal_blood() : SpellScriptLoader("spell_gen_animal_blood") { } - class spell_gen_animal_blood_AuraScript : public AuraScript + class spell_gen_animal_blood_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_animal_blood_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_gen_animal_blood_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_SPAWN_BLOOD_POOL)) - return false; - return true; - } - - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - // Remove all auras with spell id 46221, except the one currently being applied - while (Aura* aur = GetUnitOwner()->GetOwnedAura(SPELL_ANIMAL_BLOOD, 0, 0, 0, GetAura())) - GetUnitOwner()->RemoveOwnedAura(aur); - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* owner = GetUnitOwner()) - { - if (owner->IsInWater()) - owner->CastSpell(owner, SPELL_SPAWN_BLOOD_POOL, true); - } - } - - void Register() - { - AfterEffectApply += AuraEffectApplyFn(spell_gen_animal_blood_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_gen_animal_blood_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_animal_blood_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_SPAWN_BLOOD_POOL)) + return false; + return true; } + + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + // Remove all auras with spell id 46221, except the one currently being applied + while (Aura* aur = GetUnitOwner()->GetOwnedAura(SPELL_ANIMAL_BLOOD, 0, 0, 0, GetAura())) + GetUnitOwner()->RemoveOwnedAura(aur); + } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* owner = GetUnitOwner()) + { + if (owner->IsInWater()) + owner->CastSpell(owner, SPELL_SPAWN_BLOOD_POOL, true); + } + } + + void Register() + { + AfterEffectApply += AuraEffectApplyFn(spell_gen_animal_blood_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_gen_animal_blood_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_animal_blood_AuraScript(); + } }; enum DivineStormSpell @@ -2386,120 +2391,120 @@ enum DivineStormSpell // 70769 Divine Storm! class spell_gen_divine_storm_cd_reset : public SpellScriptLoader { - public: - spell_gen_divine_storm_cd_reset() : SpellScriptLoader("spell_gen_divine_storm_cd_reset") { } +public: + spell_gen_divine_storm_cd_reset() : SpellScriptLoader("spell_gen_divine_storm_cd_reset") { } - class spell_gen_divine_storm_cd_reset_SpellScript : public SpellScript + class spell_gen_divine_storm_cd_reset_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_divine_storm_cd_reset_SpellScript); + + bool Load() { - PrepareSpellScript(spell_gen_divine_storm_cd_reset_SpellScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_DIVINE_STORM)) - return false; - return true; - } - - void HandleScript(SpellEffIndex /*effIndex*/) - { - Player* caster = GetCaster()->ToPlayer(); - if (caster->HasSpellCooldown(SPELL_DIVINE_STORM)) - caster->RemoveSpellCooldown(SPELL_DIVINE_STORM, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_gen_divine_storm_cd_reset_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_divine_storm_cd_reset_SpellScript(); + return GetCaster()->GetTypeId() == TYPEID_PLAYER; } + + bool Validate(SpellInfo const* /*spellInfo*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_DIVINE_STORM)) + return false; + return true; + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Player* caster = GetCaster()->ToPlayer(); + if (caster->HasSpellCooldown(SPELL_DIVINE_STORM)) + caster->RemoveSpellCooldown(SPELL_DIVINE_STORM, true); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_gen_divine_storm_cd_reset_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_divine_storm_cd_reset_SpellScript(); + } }; class spell_gen_profession_research : public SpellScriptLoader { - public: - spell_gen_profession_research() : SpellScriptLoader("spell_gen_profession_research") { } +public: + spell_gen_profession_research() : SpellScriptLoader("spell_gen_profession_research") { } - class spell_gen_profession_research_SpellScript : public SpellScript + class spell_gen_profession_research_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_profession_research_SpellScript); + + bool Load() { - PrepareSpellScript(spell_gen_profession_research_SpellScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - SpellCastResult CheckRequirement() - { - if (HasDiscoveredAllSpells(GetSpellInfo()->Id, GetCaster()->ToPlayer())) - { - SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_NOTHING_TO_DISCOVER); - return SPELL_FAILED_CUSTOM_ERROR; - } - - return SPELL_CAST_OK; - } - - void HandleScript(SpellEffIndex /*effIndex*/) - { - Player* caster = GetCaster()->ToPlayer(); - uint32 spellId = GetSpellInfo()->Id; - - // learn random explicit discovery recipe (if any) - if (uint32 discoveredSpellId = GetExplicitDiscoverySpell(spellId, caster)) - caster->learnSpell(discoveredSpellId); - - caster->UpdateCraftSkill(spellId); - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_gen_profession_research_SpellScript::CheckRequirement); - OnEffectHitTarget += SpellEffectFn(spell_gen_profession_research_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_profession_research_SpellScript(); + return GetCaster()->GetTypeId() == TYPEID_PLAYER; } + + SpellCastResult CheckRequirement() + { + if (HasDiscoveredAllSpells(GetSpellInfo()->Id, GetCaster()->ToPlayer())) + { + SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_NOTHING_TO_DISCOVER); + return SPELL_FAILED_CUSTOM_ERROR; + } + + return SPELL_CAST_OK; + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Player* caster = GetCaster()->ToPlayer(); + uint32 spellId = GetSpellInfo()->Id; + + // learn random explicit discovery recipe (if any) + if (uint32 discoveredSpellId = GetExplicitDiscoverySpell(spellId, caster)) + caster->learnSpell(discoveredSpellId); + + caster->UpdateCraftSkill(spellId); + } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_gen_profession_research_SpellScript::CheckRequirement); + OnEffectHitTarget += SpellEffectFn(spell_gen_profession_research_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_profession_research_SpellScript(); + } }; class spell_gen_clone : public SpellScriptLoader { - public: - spell_gen_clone() : SpellScriptLoader("spell_gen_clone") { } +public: + spell_gen_clone() : SpellScriptLoader("spell_gen_clone") { } - class spell_gen_clone_SpellScript : public SpellScript + class spell_gen_clone_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_clone_SpellScript); + + void HandleScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_gen_clone_SpellScript); - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetHitUnit()->CastSpell(GetCaster(), uint32(GetEffectValue()), true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_gen_clone_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); - OnEffectHitTarget += SpellEffectFn(spell_gen_clone_SpellScript::HandleScriptEffect, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_clone_SpellScript(); + PreventHitDefaultEffect(effIndex); + GetHitUnit()->CastSpell(GetCaster(), uint32(GetEffectValue()), true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_gen_clone_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + OnEffectHitTarget += SpellEffectFn(spell_gen_clone_SpellScript::HandleScriptEffect, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_clone_SpellScript(); + } }; enum CloneWeaponSpells @@ -2516,70 +2521,70 @@ enum CloneWeaponSpells class spell_gen_clone_weapon : public SpellScriptLoader { - public: - spell_gen_clone_weapon() : SpellScriptLoader("spell_gen_clone_weapon") { } +public: + spell_gen_clone_weapon() : SpellScriptLoader("spell_gen_clone_weapon") { } - class spell_gen_clone_weapon_SpellScript : public SpellScript + class spell_gen_clone_weapon_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_clone_weapon_SpellScript); + + void HandleScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_gen_clone_weapon_SpellScript); - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetHitUnit()->CastSpell(GetCaster(), uint32(GetEffectValue()), true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_gen_clone_weapon_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_clone_weapon_SpellScript(); + PreventHitDefaultEffect(effIndex); + GetHitUnit()->CastSpell(GetCaster(), uint32(GetEffectValue()), true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_gen_clone_weapon_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_clone_weapon_SpellScript(); + } }; class spell_gen_clone_weapon_aura : public SpellScriptLoader { - public: - spell_gen_clone_weapon_aura() : SpellScriptLoader("spell_gen_clone_weapon_aura") { } +public: + spell_gen_clone_weapon_aura() : SpellScriptLoader("spell_gen_clone_weapon_aura") { } - class spell_gen_clone_weapon_auraScript : public AuraScript + class spell_gen_clone_weapon_auraScript : public AuraScript + { + PrepareAuraScript(spell_gen_clone_weapon_auraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_gen_clone_weapon_auraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_COPY_WEAPON_AURA) || + if (!sSpellMgr->GetSpellInfo(SPELL_COPY_WEAPON_AURA) || !sSpellMgr->GetSpellInfo(SPELL_COPY_WEAPON_2_AURA) || !sSpellMgr->GetSpellInfo(SPELL_COPY_WEAPON_3_AURA) || !sSpellMgr->GetSpellInfo(SPELL_COPY_OFFHAND_AURA) || !sSpellMgr->GetSpellInfo(SPELL_COPY_OFFHAND_2_AURA) || !sSpellMgr->GetSpellInfo(SPELL_COPY_RANGED_AURA)) - return false; - return true; - } + return false; + return true; + } - bool Load() + bool Load() + { + prevItem = 0; + return true; + } + + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* caster = GetCaster(); + Unit* target = GetTarget(); + if (!caster) + return; + + switch (GetSpellInfo()->Id) { - prevItem = 0; - return true; - } - - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* caster = GetCaster(); - Unit* target = GetTarget(); - if (!caster) - return; - - switch (GetSpellInfo()->Id) - { - case SPELL_COPY_WEAPON_AURA: - case SPELL_COPY_WEAPON_2_AURA: - case SPELL_COPY_WEAPON_3_AURA: + case SPELL_COPY_WEAPON_AURA: + case SPELL_COPY_WEAPON_2_AURA: + case SPELL_COPY_WEAPON_3_AURA: { prevItem = target->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID); @@ -2592,8 +2597,8 @@ class spell_gen_clone_weapon_aura : public SpellScriptLoader target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, caster->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID)); break; } - case SPELL_COPY_OFFHAND_AURA: - case SPELL_COPY_OFFHAND_2_AURA: + case SPELL_COPY_OFFHAND_AURA: + case SPELL_COPY_OFFHAND_2_AURA: { prevItem = target->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID) + 1; @@ -2606,7 +2611,7 @@ class spell_gen_clone_weapon_aura : public SpellScriptLoader target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, caster->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1)); break; } - case SPELL_COPY_RANGED_AURA: + case SPELL_COPY_RANGED_AURA: { prevItem = target->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID) + 2; @@ -2619,48 +2624,48 @@ class spell_gen_clone_weapon_aura : public SpellScriptLoader target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 2, caster->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 2)); break; } - default: - break; - } + default: + break; } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - - switch (GetSpellInfo()->Id) - { - case SPELL_COPY_WEAPON_AURA: - case SPELL_COPY_WEAPON_2_AURA: - case SPELL_COPY_WEAPON_3_AURA: - target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, prevItem); - break; - case SPELL_COPY_OFFHAND_AURA: - case SPELL_COPY_OFFHAND_2_AURA: - target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, prevItem); - break; - case SPELL_COPY_RANGED_AURA: - target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 2, prevItem); - break; - default: - break; - } - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_gen_clone_weapon_auraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - OnEffectRemove += AuraEffectRemoveFn(spell_gen_clone_weapon_auraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - } - - private: - uint32 prevItem; - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_clone_weapon_auraScript(); } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + + switch (GetSpellInfo()->Id) + { + case SPELL_COPY_WEAPON_AURA: + case SPELL_COPY_WEAPON_2_AURA: + case SPELL_COPY_WEAPON_3_AURA: + target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, prevItem); + break; + case SPELL_COPY_OFFHAND_AURA: + case SPELL_COPY_OFFHAND_2_AURA: + target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, prevItem); + break; + case SPELL_COPY_RANGED_AURA: + target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 2, prevItem); + break; + default: + break; + } + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_gen_clone_weapon_auraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + OnEffectRemove += AuraEffectRemoveFn(spell_gen_clone_weapon_auraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + } + + private: + uint32 prevItem; + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_clone_weapon_auraScript(); + } }; enum SeaforiumSpells @@ -2670,45 +2675,45 @@ enum SeaforiumSpells class spell_gen_seaforium_blast : public SpellScriptLoader { - public: - spell_gen_seaforium_blast() : SpellScriptLoader("spell_gen_seaforium_blast") { } +public: + spell_gen_seaforium_blast() : SpellScriptLoader("spell_gen_seaforium_blast") { } - class spell_gen_seaforium_blast_SpellScript : public SpellScript + class spell_gen_seaforium_blast_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_seaforium_blast_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_gen_seaforium_blast_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_PLANT_CHARGES_CREDIT_ACHIEVEMENT)) - return false; - return true; - } - - bool Load() - { - // OriginalCaster is always available in Spell::prepare - return GetOriginalCaster()->GetTypeId() == TYPEID_PLAYER; - } - - void AchievementCredit(SpellEffIndex /*effIndex*/) - { - // but in effect handling OriginalCaster can become NULL - if (Unit* originalCaster = GetOriginalCaster()) - if (GameObject* go = GetHitGObj()) - if (go->GetGOValue()->Building.Health > 0 && go->GetGOInfo()->type == GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING) - originalCaster->CastSpell(originalCaster, SPELL_PLANT_CHARGES_CREDIT_ACHIEVEMENT, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_gen_seaforium_blast_SpellScript::AchievementCredit, EFFECT_1, SPELL_EFFECT_GAMEOBJECT_DAMAGE); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_seaforium_blast_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_PLANT_CHARGES_CREDIT_ACHIEVEMENT)) + return false; + return true; } + + bool Load() + { + // OriginalCaster is always available in Spell::prepare + return GetOriginalCaster()->GetTypeId() == TYPEID_PLAYER; + } + + void AchievementCredit(SpellEffIndex /*effIndex*/) + { + // but in effect handling OriginalCaster can become NULL + if (Unit* originalCaster = GetOriginalCaster()) + if (GameObject* go = GetHitGObj()) + if (go->GetGOValue()->Building.Health > 0 && go->GetGOInfo()->type == GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING) + originalCaster->CastSpell(originalCaster, SPELL_PLANT_CHARGES_CREDIT_ACHIEVEMENT, true); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_gen_seaforium_blast_SpellScript::AchievementCredit, EFFECT_1, SPELL_EFFECT_GAMEOBJECT_DAMAGE); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_seaforium_blast_SpellScript(); + } }; enum FriendOrFowl @@ -2718,83 +2723,83 @@ enum FriendOrFowl class spell_gen_turkey_marker : public SpellScriptLoader { - public: - spell_gen_turkey_marker() : SpellScriptLoader("spell_gen_turkey_marker") { } +public: + spell_gen_turkey_marker() : SpellScriptLoader("spell_gen_turkey_marker") { } - class spell_gen_turkey_marker_AuraScript : public AuraScript + class spell_gen_turkey_marker_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_turkey_marker_AuraScript); + + bool Load() { - PrepareAuraScript(spell_gen_turkey_marker_AuraScript); - - bool Load() - { - _applyTimes.clear(); - stackAmount = 0; - return true; - } - - void OnPeriodic(AuraEffect const* aurEff) - { - if (GetStackAmount() > stackAmount) - { - _applyTimes.push_back(World::GetGameTimeMS()); - stackAmount++; - } - - // pop stack if it expired for us - if (_applyTimes.front() + GetMaxDuration() < World::GetGameTimeMS()) - { - stackAmount--; - ModStackAmount(-1, AURA_REMOVE_BY_EXPIRE); - } - - // dont cast this spell on every tick - if (stackAmount >= 15 && stackAmount < 40) - { - stackAmount = 40; - GetTarget()->CastSpell(GetTarget(), SPELL_TURKEY_VENGEANCE, true, NULL, aurEff, GetCasterGUID()); - } - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_turkey_marker_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - - std::list _applyTimes; - int16 stackAmount; - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_turkey_marker_AuraScript(); + _applyTimes.clear(); + stackAmount = 0; + return true; } + + void OnPeriodic(AuraEffect const* aurEff) + { + if (GetStackAmount() > stackAmount) + { + _applyTimes.push_back(World::GetGameTimeMS()); + stackAmount++; + } + + // pop stack if it expired for us + if (_applyTimes.front() + GetMaxDuration() < World::GetGameTimeMS()) + { + stackAmount--; + ModStackAmount(-1, AURA_REMOVE_BY_EXPIRE); + } + + // dont cast this spell on every tick + if (stackAmount >= 15 && stackAmount < 40) + { + stackAmount = 40; + GetTarget()->CastSpell(GetTarget(), SPELL_TURKEY_VENGEANCE, true, NULL, aurEff, GetCasterGUID()); + } + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_turkey_marker_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + + std::list _applyTimes; + int16 stackAmount; + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_turkey_marker_AuraScript(); + } }; class spell_gen_lifeblood : public SpellScriptLoader { - public: - spell_gen_lifeblood() : SpellScriptLoader("spell_gen_lifeblood") { } +public: + spell_gen_lifeblood() : SpellScriptLoader("spell_gen_lifeblood") { } - class spell_gen_lifeblood_AuraScript : public AuraScript + class spell_gen_lifeblood_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_lifeblood_AuraScript); + + void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) { - PrepareAuraScript(spell_gen_lifeblood_AuraScript); - - void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) - { - if (Unit* owner = GetUnitOwner()) - amount += int32(CalculatePct(owner->GetMaxHealth(), 1.5f / aurEff->GetTotalTicks())); - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_lifeblood_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_HEAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_lifeblood_AuraScript(); + if (Unit* owner = GetUnitOwner()) + amount += int32(CalculatePct(owner->GetMaxHealth(), 1.5f / aurEff->GetTotalTicks())); } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_lifeblood_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_HEAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_lifeblood_AuraScript(); + } }; enum MagicRoosterSpells @@ -2806,83 +2811,83 @@ enum MagicRoosterSpells class spell_gen_magic_rooster : public SpellScriptLoader { - public: - spell_gen_magic_rooster() : SpellScriptLoader("spell_gen_magic_rooster") { } +public: + spell_gen_magic_rooster() : SpellScriptLoader("spell_gen_magic_rooster") { } - class spell_gen_magic_rooster_SpellScript : public SpellScript + class spell_gen_magic_rooster_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_magic_rooster_SpellScript); + + void HandleScript(SpellEffIndex effIndex) { - PrepareSpellScript(spell_gen_magic_rooster_SpellScript); - - void HandleScript(SpellEffIndex effIndex) + PreventHitDefaultEffect(effIndex); + if (Player* target = GetHitPlayer()) { - PreventHitDefaultEffect(effIndex); - if (Player* target = GetHitPlayer()) + uint32 petNumber = target->GetTemporaryUnsummonedPetNumber(); + target->SetTemporaryUnsummonedPetNumber(0); + + // prevent client crashes from stacking mounts + target->RemoveAurasByType(SPELL_AURA_MOUNTED); + + uint32 spellId = SPELL_MAGIC_ROOSTER_NORMAL; + switch (target->getRace()) { - uint32 petNumber = target->GetTemporaryUnsummonedPetNumber(); - target->SetTemporaryUnsummonedPetNumber(0); - - // prevent client crashes from stacking mounts - target->RemoveAurasByType(SPELL_AURA_MOUNTED); - - uint32 spellId = SPELL_MAGIC_ROOSTER_NORMAL; - switch (target->getRace()) - { - case RACE_DRAENEI: - if (target->getGender() == GENDER_MALE) - spellId = SPELL_MAGIC_ROOSTER_DRAENEI_MALE; - break; - case RACE_TAUREN: - if (target->getGender() == GENDER_MALE) - spellId = SPELL_MAGIC_ROOSTER_TAUREN_MALE; - break; - default: - break; - } - - target->CastSpell(target, spellId, true); - if (petNumber) - target->SetTemporaryUnsummonedPetNumber(petNumber); + case RACE_DRAENEI: + if (target->getGender() == GENDER_MALE) + spellId = SPELL_MAGIC_ROOSTER_DRAENEI_MALE; + break; + case RACE_TAUREN: + if (target->getGender() == GENDER_MALE) + spellId = SPELL_MAGIC_ROOSTER_TAUREN_MALE; + break; + default: + break; } - } - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_gen_magic_rooster_SpellScript::HandleScript, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); + target->CastSpell(target, spellId, true); + if (petNumber) + target->SetTemporaryUnsummonedPetNumber(petNumber); } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_magic_rooster_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_gen_magic_rooster_SpellScript::HandleScript, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_magic_rooster_SpellScript(); + } }; class spell_gen_allow_cast_from_item_only : public SpellScriptLoader { - public: - spell_gen_allow_cast_from_item_only() : SpellScriptLoader("spell_gen_allow_cast_from_item_only") { } +public: + spell_gen_allow_cast_from_item_only() : SpellScriptLoader("spell_gen_allow_cast_from_item_only") { } - class spell_gen_allow_cast_from_item_only_SpellScript : public SpellScript + class spell_gen_allow_cast_from_item_only_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_allow_cast_from_item_only_SpellScript); + + SpellCastResult CheckRequirement() { - PrepareSpellScript(spell_gen_allow_cast_from_item_only_SpellScript); - - SpellCastResult CheckRequirement() - { - if (!GetCastItem()) - return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; - return SPELL_CAST_OK; - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_gen_allow_cast_from_item_only_SpellScript::CheckRequirement); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_allow_cast_from_item_only_SpellScript(); + if (!GetCastItem()) + return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; + return SPELL_CAST_OK; } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_gen_allow_cast_from_item_only_SpellScript::CheckRequirement); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_allow_cast_from_item_only_SpellScript(); + } }; enum VehicleScaling @@ -2892,126 +2897,126 @@ enum VehicleScaling class spell_gen_vehicle_scaling : public SpellScriptLoader { - public: - spell_gen_vehicle_scaling() : SpellScriptLoader("spell_gen_vehicle_scaling") { } +public: + spell_gen_vehicle_scaling() : SpellScriptLoader("spell_gen_vehicle_scaling") { } - class spell_gen_vehicle_scaling_SpellScript : public SpellScript + class spell_gen_vehicle_scaling_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_vehicle_scaling_SpellScript); + + SpellCastResult CheckSeat() { - PrepareSpellScript(spell_gen_vehicle_scaling_SpellScript); + if (Vehicle* veh = GetCaster()->GetVehicle()) + if (const VehicleSeatEntry* seatEntry = veh->GetSeatForPassenger(GetCaster())) + if (seatEntry->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL) + return SPELL_CAST_OK; - SpellCastResult CheckSeat() - { - if (Vehicle* veh = GetCaster()->GetVehicle()) - if (const VehicleSeatEntry* seatEntry = veh->GetSeatForPassenger(GetCaster())) - if (seatEntry->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL) - return SPELL_CAST_OK; - - return SPELL_FAILED_DONT_REPORT; - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_gen_vehicle_scaling_SpellScript::CheckSeat); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_vehicle_scaling_SpellScript(); + return SPELL_FAILED_DONT_REPORT; } - class spell_gen_vehicle_scaling_AuraScript : public AuraScript + void Register() { - PrepareAuraScript(spell_gen_vehicle_scaling_AuraScript); - - bool Load() - { - return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER && GetOwner()->GetTypeId() == TYPEID_UNIT; - } - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - Unit* caster = GetCaster(); - float factor; - uint16 baseItemLevel; - - /// @todo Reserach coeffs for different vehicles - switch (GetId()) - { - case SPELL_GEAR_SCALING: - factor = 1.0f; - baseItemLevel = 205; - break; - default: - factor = 1.0f; - baseItemLevel = 170; - break; - } - - float avgILvl = caster->ToPlayer()->GetAverageItemLevel(); - if (avgILvl < baseItemLevel) - return; /// @todo Research possibility of scaling down - - amount = uint16((avgILvl - baseItemLevel) * factor); - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_vehicle_scaling_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_HEALING_PCT); - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_vehicle_scaling_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE); - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_vehicle_scaling_AuraScript::CalculateAmount, EFFECT_2, SPELL_AURA_MOD_INCREASE_HEALTH_PERCENT); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_vehicle_scaling_AuraScript(); + OnCheckCast += SpellCheckCastFn(spell_gen_vehicle_scaling_SpellScript::CheckSeat); } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_vehicle_scaling_SpellScript(); + } + + class spell_gen_vehicle_scaling_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_vehicle_scaling_AuraScript); + + bool Load() + { + return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER && GetOwner()->GetTypeId() == TYPEID_UNIT; + } + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + Unit* caster = GetCaster(); + float factor; + uint16 baseItemLevel; + + /// @todo Reserach coeffs for different vehicles + switch (GetId()) + { + case SPELL_GEAR_SCALING: + factor = 1.0f; + baseItemLevel = 205; + break; + default: + factor = 1.0f; + baseItemLevel = 170; + break; + } + + float avgILvl = caster->ToPlayer()->GetAverageItemLevel(); + if (avgILvl < baseItemLevel) + return; /// @todo Research possibility of scaling down + + amount = uint16((avgILvl - baseItemLevel) * factor); + } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_vehicle_scaling_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_HEALING_PCT); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_vehicle_scaling_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_vehicle_scaling_AuraScript::CalculateAmount, EFFECT_2, SPELL_AURA_MOD_INCREASE_HEALTH_PERCENT); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_vehicle_scaling_AuraScript(); + } }; class spell_gen_oracle_wolvar_reputation : public SpellScriptLoader { - public: - spell_gen_oracle_wolvar_reputation() : SpellScriptLoader("spell_gen_oracle_wolvar_reputation") { } +public: + spell_gen_oracle_wolvar_reputation() : SpellScriptLoader("spell_gen_oracle_wolvar_reputation") { } - class spell_gen_oracle_wolvar_reputation_SpellScript : public SpellScript + class spell_gen_oracle_wolvar_reputation_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_oracle_wolvar_reputation_SpellScript); + + bool Load() { - PrepareSpellScript(spell_gen_oracle_wolvar_reputation_SpellScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - void HandleDummy(SpellEffIndex effIndex) - { - Player* player = GetCaster()->ToPlayer(); - uint32 factionId = GetSpellInfo()->Effects[effIndex].CalcValue(); - int32 repChange = GetSpellInfo()->Effects[EFFECT_1].CalcValue(); - - FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionId); - - if (!factionEntry) - return; - - // Set rep to baserep + basepoints (expecting spillover for oposite faction -> become hated) - // Not when player already has equal or higher rep with this faction - if (player->GetReputationMgr().GetReputation(factionEntry) <= repChange) - player->GetReputationMgr().SetReputation(factionEntry, repChange); - - // EFFECT_INDEX_2 most likely update at war state, we already handle this in SetReputation - } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_gen_oracle_wolvar_reputation_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_oracle_wolvar_reputation_SpellScript(); + return GetCaster()->GetTypeId() == TYPEID_PLAYER; } + + void HandleDummy(SpellEffIndex effIndex) + { + Player* player = GetCaster()->ToPlayer(); + uint32 factionId = GetSpellInfo()->Effects[effIndex].CalcValue(); + int32 repChange = GetSpellInfo()->Effects[EFFECT_1].CalcValue(); + + FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionId); + + if (!factionEntry) + return; + + // Set rep to baserep + basepoints (expecting spillover for oposite faction -> become hated) + // Not when player already has equal or higher rep with this faction + if (player->GetReputationMgr().GetReputation(factionEntry) <= repChange) + player->GetReputationMgr().SetReputation(factionEntry, repChange); + + // EFFECT_INDEX_2 most likely update at war state, we already handle this in SetReputation + } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_gen_oracle_wolvar_reputation_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_oracle_wolvar_reputation_SpellScript(); + } }; enum DamageReductionAura @@ -3025,50 +3030,50 @@ enum DamageReductionAura class spell_gen_damage_reduction_aura : public SpellScriptLoader { - public: - spell_gen_damage_reduction_aura() : SpellScriptLoader("spell_gen_damage_reduction_aura") { } +public: + spell_gen_damage_reduction_aura() : SpellScriptLoader("spell_gen_damage_reduction_aura") { } - class spell_gen_damage_reduction_AuraScript : public AuraScript + class spell_gen_damage_reduction_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_damage_reduction_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_gen_damage_reduction_AuraScript); + if (!sSpellMgr->GetSpellInfo(SPELL_DAMAGE_REDUCTION_AURA)) + return false; + return true; + } - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_DAMAGE_REDUCTION_AURA)) - return false; - return true; - } + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + target->CastSpell(target, SPELL_DAMAGE_REDUCTION_AURA, true); + } - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - target->CastSpell(target, SPELL_DAMAGE_REDUCTION_AURA, true); - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - if (target->HasAura(SPELL_DAMAGE_REDUCTION_AURA) && !(target->HasAura(SPELL_BLESSING_OF_SANCTUARY) || + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + if (target->HasAura(SPELL_DAMAGE_REDUCTION_AURA) && !(target->HasAura(SPELL_BLESSING_OF_SANCTUARY) || target->HasAura(SPELL_GREATER_BLESSING_OF_SANCTUARY) || target->HasAura(SPELL_RENEWED_HOPE) || target->HasAura(SPELL_VIGILANCE))) - { - target->RemoveAurasDueToSpell(SPELL_DAMAGE_REDUCTION_AURA); - } - } - - void Register() { - OnEffectApply += AuraEffectApplyFn(spell_gen_damage_reduction_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - OnEffectRemove += AuraEffectRemoveFn(spell_gen_damage_reduction_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + target->RemoveAurasDueToSpell(SPELL_DAMAGE_REDUCTION_AURA); } - - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_damage_reduction_AuraScript(); } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_gen_damage_reduction_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + OnEffectRemove += AuraEffectRemoveFn(spell_gen_damage_reduction_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + } + + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_damage_reduction_AuraScript(); + } }; enum DummyTrigger @@ -3079,78 +3084,78 @@ enum DummyTrigger class spell_gen_dummy_trigger : public SpellScriptLoader { - public: - spell_gen_dummy_trigger() : SpellScriptLoader("spell_gen_dummy_trigger") { } +public: + spell_gen_dummy_trigger() : SpellScriptLoader("spell_gen_dummy_trigger") { } - class spell_gen_dummy_trigger_SpellScript : public SpellScript + class spell_gen_dummy_trigger_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_dummy_trigger_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_gen_dummy_trigger_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_PERSISTANT_SHIELD_TRIGGERED) || + if (!sSpellMgr->GetSpellInfo(SPELL_PERSISTANT_SHIELD_TRIGGERED) || !sSpellMgr->GetSpellInfo(SPELL_PERSISTANT_SHIELD)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /* effIndex */) - { - int32 damage = GetEffectValue(); - Unit* caster = GetCaster(); - if (Unit* target = GetHitUnit()) - if (SpellInfo const* triggeredByAuraSpell = GetTriggeringSpell()) - if (triggeredByAuraSpell->Id == SPELL_PERSISTANT_SHIELD_TRIGGERED) - caster->CastCustomSpell(target, SPELL_PERSISTANT_SHIELD_TRIGGERED, &damage, nullptr, nullptr, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_gen_dummy_trigger_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_dummy_trigger_SpellScript(); + return false; + return true; } + + void HandleDummy(SpellEffIndex /* effIndex */) + { + int32 damage = GetEffectValue(); + Unit* caster = GetCaster(); + if (Unit* target = GetHitUnit()) + if (SpellInfo const* triggeredByAuraSpell = GetTriggeringSpell()) + if (triggeredByAuraSpell->Id == SPELL_PERSISTANT_SHIELD_TRIGGERED) + caster->CastCustomSpell(target, SPELL_PERSISTANT_SHIELD_TRIGGERED, &damage, nullptr, nullptr, true); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_gen_dummy_trigger_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_dummy_trigger_SpellScript(); + } }; class spell_gen_spirit_healer_res : public SpellScriptLoader { - public: - spell_gen_spirit_healer_res(): SpellScriptLoader("spell_gen_spirit_healer_res") { } +public: + spell_gen_spirit_healer_res(): SpellScriptLoader("spell_gen_spirit_healer_res") { } - class spell_gen_spirit_healer_res_SpellScript : public SpellScript + class spell_gen_spirit_healer_res_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_spirit_healer_res_SpellScript); + + bool Load() { - PrepareSpellScript(spell_gen_spirit_healer_res_SpellScript); - - bool Load() - { - return GetOriginalCaster() && GetOriginalCaster()->GetTypeId() == TYPEID_PLAYER; - } - - void HandleDummy(SpellEffIndex /* effIndex */) - { - Player* originalCaster = GetOriginalCaster()->ToPlayer(); - if (Unit* target = GetHitUnit()) - { - WorldPacket data(SMSG_SPIRIT_HEALER_CONFIRM, 8); - data << uint64(target->GetGUID()); - originalCaster->GetSession()->SendPacket(&data); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_gen_spirit_healer_res_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_spirit_healer_res_SpellScript(); + return GetOriginalCaster() && GetOriginalCaster()->GetTypeId() == TYPEID_PLAYER; } + + void HandleDummy(SpellEffIndex /* effIndex */) + { + Player* originalCaster = GetOriginalCaster()->ToPlayer(); + if (Unit* target = GetHitUnit()) + { + WorldPacket data(SMSG_SPIRIT_HEALER_CONFIRM, 8); + data << uint64(target->GetGUID()); + originalCaster->GetSession()->SendPacket(&data); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_gen_spirit_healer_res_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_spirit_healer_res_SpellScript(); + } }; enum TransporterBackfires @@ -3162,44 +3167,44 @@ enum TransporterBackfires class spell_gen_gadgetzan_transporter_backfire : public SpellScriptLoader { - public: - spell_gen_gadgetzan_transporter_backfire() : SpellScriptLoader("spell_gen_gadgetzan_transporter_backfire") { } +public: + spell_gen_gadgetzan_transporter_backfire() : SpellScriptLoader("spell_gen_gadgetzan_transporter_backfire") { } - class spell_gen_gadgetzan_transporter_backfire_SpellScript : public SpellScript + class spell_gen_gadgetzan_transporter_backfire_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_gadgetzan_transporter_backfire_SpellScript) + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_gen_gadgetzan_transporter_backfire_SpellScript) - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_TRANSPORTER_MALFUNCTION_POLYMORPH) || + if (!sSpellMgr->GetSpellInfo(SPELL_TRANSPORTER_MALFUNCTION_POLYMORPH) || !sSpellMgr->GetSpellInfo(SPELL_TRANSPORTER_EVIL_TWIN) || !sSpellMgr->GetSpellInfo(SPELL_TRANSPORTER_MALFUNCTION_MISS)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /* effIndex */) - { - Unit* caster = GetCaster(); - int32 r = irand(0, 119); - if (r < 20) // Transporter Malfunction - 1/6 polymorph - caster->CastSpell(caster, SPELL_TRANSPORTER_MALFUNCTION_POLYMORPH, true); - else if (r < 100) // Evil Twin - 4/6 evil twin - caster->CastSpell(caster, SPELL_TRANSPORTER_EVIL_TWIN, true); - else // Transporter Malfunction - 1/6 miss the target - caster->CastSpell(caster, SPELL_TRANSPORTER_MALFUNCTION_MISS, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_gen_gadgetzan_transporter_backfire_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_gadgetzan_transporter_backfire_SpellScript(); + return false; + return true; } + + void HandleDummy(SpellEffIndex /* effIndex */) + { + Unit* caster = GetCaster(); + int32 r = irand(0, 119); + if (r < 20) // Transporter Malfunction - 1/6 polymorph + caster->CastSpell(caster, SPELL_TRANSPORTER_MALFUNCTION_POLYMORPH, true); + else if (r < 100) // Evil Twin - 4/6 evil twin + caster->CastSpell(caster, SPELL_TRANSPORTER_EVIL_TWIN, true); + else // Transporter Malfunction - 1/6 miss the target + caster->CastSpell(caster, SPELL_TRANSPORTER_MALFUNCTION_MISS, true); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_gen_gadgetzan_transporter_backfire_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_gadgetzan_transporter_backfire_SpellScript(); + } }; enum GnomishTransporter @@ -3210,36 +3215,36 @@ enum GnomishTransporter class spell_gen_gnomish_transporter : public SpellScriptLoader { - public: - spell_gen_gnomish_transporter() : SpellScriptLoader("spell_gen_gnomish_transporter") { } +public: + spell_gen_gnomish_transporter() : SpellScriptLoader("spell_gen_gnomish_transporter") { } - class spell_gen_gnomish_transporter_SpellScript : public SpellScript + class spell_gen_gnomish_transporter_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_gnomish_transporter_SpellScript) + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_gen_gnomish_transporter_SpellScript) - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_TRANSPORTER_SUCCESS) || + if (!sSpellMgr->GetSpellInfo(SPELL_TRANSPORTER_SUCCESS) || !sSpellMgr->GetSpellInfo(SPELL_TRANSPORTER_FAILURE)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /* effIndex */) - { - GetCaster()->CastSpell(GetCaster(), roll_chance_i(50) ? SPELL_TRANSPORTER_SUCCESS : SPELL_TRANSPORTER_FAILURE, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_gen_gnomish_transporter_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_gnomish_transporter_SpellScript(); + return false; + return true; } + + void HandleDummy(SpellEffIndex /* effIndex */) + { + GetCaster()->CastSpell(GetCaster(), roll_chance_i(50) ? SPELL_TRANSPORTER_SUCCESS : SPELL_TRANSPORTER_FAILURE, true); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_gen_gnomish_transporter_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_gnomish_transporter_SpellScript(); + } }; enum DalaranDisguiseSpells @@ -3255,65 +3260,65 @@ enum DalaranDisguiseSpells class spell_gen_dalaran_disguise : public SpellScriptLoader { - public: - spell_gen_dalaran_disguise(const char* name) : SpellScriptLoader(name) { } +public: + spell_gen_dalaran_disguise(const char* name) : SpellScriptLoader(name) { } - class spell_gen_dalaran_disguise_SpellScript : public SpellScript + class spell_gen_dalaran_disguise_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_dalaran_disguise_SpellScript); + + bool Validate(SpellInfo const* spellInfo) { - PrepareSpellScript(spell_gen_dalaran_disguise_SpellScript); - - bool Validate(SpellInfo const* spellInfo) + switch (spellInfo->Id) { - switch (spellInfo->Id) + case SPELL_SUNREAVER_DISGUISE_TRIGGER: + if (!sSpellMgr->GetSpellInfo(SPELL_SUNREAVER_DISGUISE_FEMALE) || + !sSpellMgr->GetSpellInfo(SPELL_SUNREAVER_DISGUISE_MALE)) + return false; + break; + case SPELL_SILVER_COVENANT_DISGUISE_TRIGGER: + if (!sSpellMgr->GetSpellInfo(SPELL_SILVER_COVENANT_DISGUISE_FEMALE) || + !sSpellMgr->GetSpellInfo(SPELL_SILVER_COVENANT_DISGUISE_MALE)) + return false; + break; + } + return true; + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + if (Player* player = GetHitPlayer()) + { + uint8 gender = player->getGender(); + + uint32 spellId = GetSpellInfo()->Id; + + switch (spellId) { case SPELL_SUNREAVER_DISGUISE_TRIGGER: - if (!sSpellMgr->GetSpellInfo(SPELL_SUNREAVER_DISGUISE_FEMALE) || - !sSpellMgr->GetSpellInfo(SPELL_SUNREAVER_DISGUISE_MALE)) - return false; + spellId = gender ? SPELL_SUNREAVER_DISGUISE_FEMALE : SPELL_SUNREAVER_DISGUISE_MALE; break; case SPELL_SILVER_COVENANT_DISGUISE_TRIGGER: - if (!sSpellMgr->GetSpellInfo(SPELL_SILVER_COVENANT_DISGUISE_FEMALE) || - !sSpellMgr->GetSpellInfo(SPELL_SILVER_COVENANT_DISGUISE_MALE)) - return false; + spellId = gender ? SPELL_SILVER_COVENANT_DISGUISE_FEMALE : SPELL_SILVER_COVENANT_DISGUISE_MALE; + break; + default: break; } - return true; + + GetCaster()->CastSpell(player, spellId, true); } - - void HandleScript(SpellEffIndex /*effIndex*/) - { - if (Player* player = GetHitPlayer()) - { - uint8 gender = player->getGender(); - - uint32 spellId = GetSpellInfo()->Id; - - switch (spellId) - { - case SPELL_SUNREAVER_DISGUISE_TRIGGER: - spellId = gender ? SPELL_SUNREAVER_DISGUISE_FEMALE : SPELL_SUNREAVER_DISGUISE_MALE; - break; - case SPELL_SILVER_COVENANT_DISGUISE_TRIGGER: - spellId = gender ? SPELL_SILVER_COVENANT_DISGUISE_FEMALE : SPELL_SILVER_COVENANT_DISGUISE_MALE; - break; - default: - break; - } - - GetCaster()->CastSpell(player, spellId, true); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_gen_dalaran_disguise_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_dalaran_disguise_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_gen_dalaran_disguise_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_dalaran_disguise_SpellScript(); + } }; /* DOCUMENTATION: Break-Shield spells @@ -3352,20 +3357,20 @@ enum BreakShieldSpells class spell_gen_break_shield: public SpellScriptLoader { - public: - spell_gen_break_shield(const char* name) : SpellScriptLoader(name) { } +public: + spell_gen_break_shield(const char* name) : SpellScriptLoader(name) { } - class spell_gen_break_shield_SpellScript : public SpellScript + class spell_gen_break_shield_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_break_shield_SpellScript) + + void HandleScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_gen_break_shield_SpellScript) + Unit* target = GetHitUnit(); - void HandleScriptEffect(SpellEffIndex effIndex) + switch (effIndex) { - Unit* target = GetHitUnit(); - - switch (effIndex) - { - case EFFECT_0: // On spells wich trigger the damaging spell (and also the visual) + case EFFECT_0: // On spells wich trigger the damaging spell (and also the visual) { uint32 spellId; @@ -3389,7 +3394,7 @@ class spell_gen_break_shield: public SpellScriptLoader GetCaster()->CastSpell(target, spellId, false); break; } - case EFFECT_1: // On damaging spells, for removing a defend layer + case EFFECT_1: // On damaging spells, for removing a defend layer { Unit::AuraApplicationMap const& auras = target->GetAppliedAuras(); for (Unit::AuraApplicationMap::const_iterator itr = auras.begin(); itr != auras.end(); ++itr) @@ -3410,21 +3415,21 @@ class spell_gen_break_shield: public SpellScriptLoader } break; } - default: - break; - } + default: + break; } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_gen_break_shield_SpellScript::HandleScriptEffect, EFFECT_FIRST_FOUND, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_break_shield_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_gen_break_shield_SpellScript::HandleScriptEffect, EFFECT_FIRST_FOUND, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_break_shield_SpellScript(); + } }; /* DOCUMENTATION: Charge spells @@ -3479,20 +3484,20 @@ enum ChargeSpells class spell_gen_mounted_charge: public SpellScriptLoader { - public: - spell_gen_mounted_charge() : SpellScriptLoader("spell_gen_mounted_charge") { } +public: + spell_gen_mounted_charge() : SpellScriptLoader("spell_gen_mounted_charge") { } - class spell_gen_mounted_charge_SpellScript : public SpellScript + class spell_gen_mounted_charge_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_mounted_charge_SpellScript) + + void HandleScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_gen_mounted_charge_SpellScript) + Unit* target = GetHitUnit(); - void HandleScriptEffect(SpellEffIndex effIndex) + switch (effIndex) { - Unit* target = GetHitUnit(); - - switch (effIndex) - { - case EFFECT_0: // On spells wich trigger the damaging spell (and also the visual) + case EFFECT_0: // On spells wich trigger the damaging spell (and also the visual) { uint32 spellId; @@ -3518,8 +3523,8 @@ class spell_gen_mounted_charge: public SpellScriptLoader GetCaster()->CastSpell(target, spellId, false); break; } - case EFFECT_1: // On damaging spells, for removing a defend layer - case EFFECT_2: + case EFFECT_1: // On damaging spells, for removing a defend layer + case EFFECT_2: { Unit::AuraApplicationMap const& auras = target->GetAppliedAuras(); for (Unit::AuraApplicationMap::const_iterator itr = auras.begin(); itr != auras.end(); ++itr) @@ -3540,52 +3545,52 @@ class spell_gen_mounted_charge: public SpellScriptLoader } break; } - } } - - void HandleChargeEffect(SpellEffIndex /*effIndex*/) - { - uint32 spellId; - - switch (GetSpellInfo()->Id) - { - case SPELL_CHARGE_CHARGING_EFFECT_8K5: - spellId = SPELL_CHARGE_DAMAGE_8K5; - break; - case SPELL_CHARGE_CHARGING_EFFECT_20K_1: - case SPELL_CHARGE_CHARGING_EFFECT_20K_2: - spellId = SPELL_CHARGE_DAMAGE_20K; - break; - case SPELL_CHARGE_CHARGING_EFFECT_45K_1: - case SPELL_CHARGE_CHARGING_EFFECT_45K_2: - spellId = SPELL_CHARGE_DAMAGE_45K; - break; - default: - return; - } - - if (Unit* rider = GetCaster()->GetCharmer()) - rider->CastSpell(GetHitUnit(), spellId, false); - else - GetCaster()->CastSpell(GetHitUnit(), spellId, false); - } - - void Register() - { - SpellInfo const* spell = sSpellMgr->GetSpellInfo(m_scriptSpellId); - - if (spell->HasEffect(SPELL_EFFECT_SCRIPT_EFFECT)) - OnEffectHitTarget += SpellEffectFn(spell_gen_mounted_charge_SpellScript::HandleScriptEffect, EFFECT_FIRST_FOUND, SPELL_EFFECT_SCRIPT_EFFECT); - - if (spell->Effects[EFFECT_0].Effect == SPELL_EFFECT_CHARGE) - OnEffectHitTarget += SpellEffectFn(spell_gen_mounted_charge_SpellScript::HandleChargeEffect, EFFECT_0, SPELL_EFFECT_CHARGE); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_mounted_charge_SpellScript(); } + + void HandleChargeEffect(SpellEffIndex /*effIndex*/) + { + uint32 spellId; + + switch (GetSpellInfo()->Id) + { + case SPELL_CHARGE_CHARGING_EFFECT_8K5: + spellId = SPELL_CHARGE_DAMAGE_8K5; + break; + case SPELL_CHARGE_CHARGING_EFFECT_20K_1: + case SPELL_CHARGE_CHARGING_EFFECT_20K_2: + spellId = SPELL_CHARGE_DAMAGE_20K; + break; + case SPELL_CHARGE_CHARGING_EFFECT_45K_1: + case SPELL_CHARGE_CHARGING_EFFECT_45K_2: + spellId = SPELL_CHARGE_DAMAGE_45K; + break; + default: + return; + } + + if (Unit* rider = GetCaster()->GetCharmer()) + rider->CastSpell(GetHitUnit(), spellId, false); + else + GetCaster()->CastSpell(GetHitUnit(), spellId, false); + } + + void Register() + { + SpellInfo const* spell = sSpellMgr->GetSpellInfo(m_scriptSpellId); + + if (spell->HasEffect(SPELL_EFFECT_SCRIPT_EFFECT)) + OnEffectHitTarget += SpellEffectFn(spell_gen_mounted_charge_SpellScript::HandleScriptEffect, EFFECT_FIRST_FOUND, SPELL_EFFECT_SCRIPT_EFFECT); + + if (spell->Effects[EFFECT_0].Effect == SPELL_EFFECT_CHARGE) + OnEffectHitTarget += SpellEffectFn(spell_gen_mounted_charge_SpellScript::HandleChargeEffect, EFFECT_0, SPELL_EFFECT_CHARGE); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_mounted_charge_SpellScript(); + } }; enum DefendVisuals @@ -3597,109 +3602,109 @@ enum DefendVisuals class spell_gen_defend : public SpellScriptLoader { - public: - spell_gen_defend() : SpellScriptLoader("spell_gen_defend") { } +public: + spell_gen_defend() : SpellScriptLoader("spell_gen_defend") { } - class spell_gen_defend_AuraScript : public AuraScript + class spell_gen_defend_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_defend_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_gen_defend_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_VISUAL_SHIELD_1)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_VISUAL_SHIELD_2)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_VISUAL_SHIELD_3)) - return false; - return true; - } - - void RefreshVisualShields(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - if (GetCaster()) - { - Unit* target = GetTarget(); - - for (uint8 i = 0; i < GetSpellInfo()->StackAmount; ++i) - target->RemoveAurasDueToSpell(SPELL_VISUAL_SHIELD_1 + i); - - target->CastSpell(target, SPELL_VISUAL_SHIELD_1 + GetAura()->GetStackAmount() - 1, true, NULL, aurEff); - } - else - GetTarget()->RemoveAurasDueToSpell(GetId()); - } - - void RemoveVisualShields(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - for (uint8 i = 0; i < GetSpellInfo()->StackAmount; ++i) - GetTarget()->RemoveAurasDueToSpell(SPELL_VISUAL_SHIELD_1 + i); - } - - void RemoveDummyFromDriver(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) - if (TempSummon* vehicle = caster->ToTempSummon()) - if (Unit* rider = vehicle->GetSummoner()) - rider->RemoveAurasDueToSpell(GetId()); - } - - void Register() - { - SpellInfo const* spell = sSpellMgr->GetSpellInfo(m_scriptSpellId); - - // Defend spells cast by NPCs (add visuals) - if (spell->Effects[EFFECT_0].ApplyAuraName == SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN) - { - AfterEffectApply += AuraEffectApplyFn(spell_gen_defend_AuraScript::RefreshVisualShields, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - OnEffectRemove += AuraEffectRemoveFn(spell_gen_defend_AuraScript::RemoveVisualShields, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK); - } - - // Remove Defend spell from player when he dismounts - if (spell->Effects[EFFECT_2].ApplyAuraName == SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN) - OnEffectRemove += AuraEffectRemoveFn(spell_gen_defend_AuraScript::RemoveDummyFromDriver, EFFECT_2, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_REAL); - - // Defend spells cast by players (add/remove visuals) - if (spell->Effects[EFFECT_1].ApplyAuraName == SPELL_AURA_DUMMY) - { - AfterEffectApply += AuraEffectApplyFn(spell_gen_defend_AuraScript::RefreshVisualShields, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - OnEffectRemove += AuraEffectRemoveFn(spell_gen_defend_AuraScript::RemoveVisualShields, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK); - } - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_defend_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_VISUAL_SHIELD_1)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_VISUAL_SHIELD_2)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_VISUAL_SHIELD_3)) + return false; + return true; } + + void RefreshVisualShields(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + if (GetCaster()) + { + Unit* target = GetTarget(); + + for (uint8 i = 0; i < GetSpellInfo()->StackAmount; ++i) + target->RemoveAurasDueToSpell(SPELL_VISUAL_SHIELD_1 + i); + + target->CastSpell(target, SPELL_VISUAL_SHIELD_1 + GetAura()->GetStackAmount() - 1, true, NULL, aurEff); + } + else + GetTarget()->RemoveAurasDueToSpell(GetId()); + } + + void RemoveVisualShields(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + for (uint8 i = 0; i < GetSpellInfo()->StackAmount; ++i) + GetTarget()->RemoveAurasDueToSpell(SPELL_VISUAL_SHIELD_1 + i); + } + + void RemoveDummyFromDriver(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* caster = GetCaster()) + if (TempSummon* vehicle = caster->ToTempSummon()) + if (Unit* rider = vehicle->GetSummoner()) + rider->RemoveAurasDueToSpell(GetId()); + } + + void Register() + { + SpellInfo const* spell = sSpellMgr->GetSpellInfo(m_scriptSpellId); + + // Defend spells cast by NPCs (add visuals) + if (spell->Effects[EFFECT_0].ApplyAuraName == SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN) + { + AfterEffectApply += AuraEffectApplyFn(spell_gen_defend_AuraScript::RefreshVisualShields, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + OnEffectRemove += AuraEffectRemoveFn(spell_gen_defend_AuraScript::RemoveVisualShields, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK); + } + + // Remove Defend spell from player when he dismounts + if (spell->Effects[EFFECT_2].ApplyAuraName == SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN) + OnEffectRemove += AuraEffectRemoveFn(spell_gen_defend_AuraScript::RemoveDummyFromDriver, EFFECT_2, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_REAL); + + // Defend spells cast by players (add/remove visuals) + if (spell->Effects[EFFECT_1].ApplyAuraName == SPELL_AURA_DUMMY) + { + AfterEffectApply += AuraEffectApplyFn(spell_gen_defend_AuraScript::RefreshVisualShields, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + OnEffectRemove += AuraEffectRemoveFn(spell_gen_defend_AuraScript::RemoveVisualShields, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK); + } + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_defend_AuraScript(); + } }; // 41213, 43416, 69222, 73076 - Throw Shield class spell_gen_throw_shield : public SpellScriptLoader { - public: - spell_gen_throw_shield() : SpellScriptLoader("spell_gen_throw_shield") { } +public: + spell_gen_throw_shield() : SpellScriptLoader("spell_gen_throw_shield") { } - class spell_gen_throw_shield_SpellScript : public SpellScript + class spell_gen_throw_shield_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_throw_shield_SpellScript); + + void HandleScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_gen_throw_shield_SpellScript); - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetCaster()->CastSpell(GetHitUnit(), uint32(GetEffectValue()), true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_gen_throw_shield_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_throw_shield_SpellScript(); + PreventHitDefaultEffect(effIndex); + GetCaster()->CastSpell(GetHitUnit(), uint32(GetEffectValue()), true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_gen_throw_shield_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_throw_shield_SpellScript(); + } }; enum MountedDuelSpells @@ -3710,48 +3715,48 @@ enum MountedDuelSpells class spell_gen_tournament_duel : public SpellScriptLoader { - public: - spell_gen_tournament_duel() : SpellScriptLoader("spell_gen_tournament_duel") { } +public: + spell_gen_tournament_duel() : SpellScriptLoader("spell_gen_tournament_duel") { } - class spell_gen_tournament_duel_SpellScript : public SpellScript + class spell_gen_tournament_duel_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_tournament_duel_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_gen_tournament_duel_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_ON_TOURNAMENT_MOUNT) || + if (!sSpellMgr->GetSpellInfo(SPELL_ON_TOURNAMENT_MOUNT) || !sSpellMgr->GetSpellInfo(SPELL_MOUNTED_DUEL)) - return false; - return true; - } + return false; + return true; + } - void HandleScriptEffect(SpellEffIndex /*effIndex*/) + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + if (Unit* rider = GetCaster()->GetCharmer()) { - if (Unit* rider = GetCaster()->GetCharmer()) + if (Player* playerTarget = GetHitPlayer()) { - if (Player* playerTarget = GetHitPlayer()) - { - if (playerTarget->HasAura(SPELL_ON_TOURNAMENT_MOUNT) && playerTarget->GetVehicleBase()) - rider->CastSpell(playerTarget, SPELL_MOUNTED_DUEL, true); - } - else if (Unit* unitTarget = GetHitUnit()) - { - if (unitTarget->GetCharmer() && unitTarget->GetCharmer()->GetTypeId() == TYPEID_PLAYER && unitTarget->GetCharmer()->HasAura(SPELL_ON_TOURNAMENT_MOUNT)) - rider->CastSpell(unitTarget->GetCharmer(), SPELL_MOUNTED_DUEL, true); - } + if (playerTarget->HasAura(SPELL_ON_TOURNAMENT_MOUNT) && playerTarget->GetVehicleBase()) + rider->CastSpell(playerTarget, SPELL_MOUNTED_DUEL, true); + } + else if (Unit* unitTarget = GetHitUnit()) + { + if (unitTarget->GetCharmer() && unitTarget->GetCharmer()->GetTypeId() == TYPEID_PLAYER && unitTarget->GetCharmer()->HasAura(SPELL_ON_TOURNAMENT_MOUNT)) + rider->CastSpell(unitTarget->GetCharmer(), SPELL_MOUNTED_DUEL, true); } } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_gen_tournament_duel_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_tournament_duel_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_gen_tournament_duel_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_tournament_duel_SpellScript(); + } }; enum TournamentMountsSpells @@ -3761,44 +3766,44 @@ enum TournamentMountsSpells class spell_gen_summon_tournament_mount : public SpellScriptLoader { - public: - spell_gen_summon_tournament_mount() : SpellScriptLoader("spell_gen_summon_tournament_mount") { } +public: + spell_gen_summon_tournament_mount() : SpellScriptLoader("spell_gen_summon_tournament_mount") { } - class spell_gen_summon_tournament_mount_SpellScript : public SpellScript + class spell_gen_summon_tournament_mount_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_summon_tournament_mount_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_gen_summon_tournament_mount_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_LANCE_EQUIPPED)) - return false; - return true; - } - - SpellCastResult CheckIfLanceEquiped() - { - if (GetCaster()->IsInDisallowedMountForm()) - GetCaster()->RemoveAurasByType(SPELL_AURA_MOD_SHAPESHIFT); - - if (!GetCaster()->HasAura(SPELL_LANCE_EQUIPPED)) - { - SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_MUST_HAVE_LANCE_EQUIPPED); - return SPELL_FAILED_CUSTOM_ERROR; - } - - return SPELL_CAST_OK; - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_gen_summon_tournament_mount_SpellScript::CheckIfLanceEquiped); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_summon_tournament_mount_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_LANCE_EQUIPPED)) + return false; + return true; } + + SpellCastResult CheckIfLanceEquiped() + { + if (GetCaster()->IsInDisallowedMountForm()) + GetCaster()->RemoveAurasByType(SPELL_AURA_MOD_SHAPESHIFT); + + if (!GetCaster()->HasAura(SPELL_LANCE_EQUIPPED)) + { + SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_MUST_HAVE_LANCE_EQUIPPED); + return SPELL_FAILED_CUSTOM_ERROR; + } + + return SPELL_CAST_OK; + } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_gen_summon_tournament_mount_SpellScript::CheckIfLanceEquiped); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_summon_tournament_mount_SpellScript(); + } }; enum TournamentPennantSpells @@ -3898,45 +3903,45 @@ enum TournamentQuestsAchievements class spell_gen_on_tournament_mount : public SpellScriptLoader { - public: - spell_gen_on_tournament_mount() : SpellScriptLoader("spell_gen_on_tournament_mount") { } +public: + spell_gen_on_tournament_mount() : SpellScriptLoader("spell_gen_on_tournament_mount") { } - class spell_gen_on_tournament_mount_AuraScript : public AuraScript + class spell_gen_on_tournament_mount_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_on_tournament_mount_AuraScript); + + uint32 _pennantSpellId; + + bool Load() { - PrepareAuraScript(spell_gen_on_tournament_mount_AuraScript); + _pennantSpellId = 0; + return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER; + } - uint32 _pennantSpellId; - - bool Load() + void HandleApplyEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* caster = GetCaster()) { - _pennantSpellId = 0; - return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - void HandleApplyEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) + if (Unit* vehicle = caster->GetVehicleBase()) { - if (Unit* vehicle = caster->GetVehicleBase()) - { - _pennantSpellId = GetPennatSpellId(caster->ToPlayer(), vehicle); - caster->CastSpell(caster, _pennantSpellId, true); - } + _pennantSpellId = GetPennatSpellId(caster->ToPlayer(), vehicle); + caster->CastSpell(caster, _pennantSpellId, true); } } + } - void HandleRemoveEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) - caster->RemoveAurasDueToSpell(_pennantSpellId); - } + void HandleRemoveEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* caster = GetCaster()) + caster->RemoveAurasDueToSpell(_pennantSpellId); + } - uint32 GetPennatSpellId(Player* player, Unit* mount) + uint32 GetPennatSpellId(Player* player, Unit* mount) + { + switch (mount->GetEntry()) { - switch (mount->GetEntry()) - { - case NPC_ARGENT_STEED_ASPIRANT: - case NPC_STORMWIND_STEED: + case NPC_ARGENT_STEED_ASPIRANT: + case NPC_STORMWIND_STEED: { if (player->HasAchieved(ACHIEVEMENT_CHAMPION_STORMWIND)) return SPELL_PENNANT_STORMWIND_CHAMPION; @@ -3945,7 +3950,7 @@ class spell_gen_on_tournament_mount : public SpellScriptLoader else return SPELL_PENNANT_STORMWIND_ASPIRANT; } - case NPC_GNOMEREGAN_MECHANOSTRIDER: + case NPC_GNOMEREGAN_MECHANOSTRIDER: { if (player->HasAchieved(ACHIEVEMENT_CHAMPION_GNOMEREGAN)) return SPELL_PENNANT_GNOMEREGAN_CHAMPION; @@ -3954,7 +3959,7 @@ class spell_gen_on_tournament_mount : public SpellScriptLoader else return SPELL_PENNANT_GNOMEREGAN_ASPIRANT; } - case NPC_DARK_SPEAR_RAPTOR: + case NPC_DARK_SPEAR_RAPTOR: { if (player->HasAchieved(ACHIEVEMENT_CHAMPION_SEN_JIN)) return SPELL_PENNANT_SEN_JIN_CHAMPION; @@ -3963,8 +3968,8 @@ class spell_gen_on_tournament_mount : public SpellScriptLoader else return SPELL_PENNANT_SEN_JIN_ASPIRANT; } - case NPC_ARGENT_HAWKSTRIDER_ASPIRANT: - case NPC_SILVERMOON_HAWKSTRIDER: + case NPC_ARGENT_HAWKSTRIDER_ASPIRANT: + case NPC_SILVERMOON_HAWKSTRIDER: { if (player->HasAchieved(ACHIEVEMENT_CHAMPION_SILVERMOON)) return SPELL_PENNANT_SILVERMOON_CHAMPION; @@ -3973,7 +3978,7 @@ class spell_gen_on_tournament_mount : public SpellScriptLoader else return SPELL_PENNANT_SILVERMOON_ASPIRANT; } - case NPC_DARNASSIAN_NIGHTSABER: + case NPC_DARNASSIAN_NIGHTSABER: { if (player->HasAchieved(ACHIEVEMENT_CHAMPION_DARNASSUS)) return SPELL_PENNANT_DARNASSUS_CHAMPION; @@ -3982,7 +3987,7 @@ class spell_gen_on_tournament_mount : public SpellScriptLoader else return SPELL_PENNANT_DARNASSUS_ASPIRANT; } - case NPC_EXODAR_ELEKK: + case NPC_EXODAR_ELEKK: { if (player->HasAchieved(ACHIEVEMENT_CHAMPION_THE_EXODAR)) return SPELL_PENNANT_EXODAR_CHAMPION; @@ -3991,7 +3996,7 @@ class spell_gen_on_tournament_mount : public SpellScriptLoader else return SPELL_PENNANT_EXODAR_ASPIRANT; } - case NPC_IRONFORGE_RAM: + case NPC_IRONFORGE_RAM: { if (player->HasAchieved(ACHIEVEMENT_CHAMPION_IRONFORGE)) return SPELL_PENNANT_IRONFORGE_CHAMPION; @@ -4000,7 +4005,7 @@ class spell_gen_on_tournament_mount : public SpellScriptLoader else return SPELL_PENNANT_IRONFORGE_ASPIRANT; } - case NPC_FORSAKEN_WARHORSE: + case NPC_FORSAKEN_WARHORSE: { if (player->HasAchieved(ACHIEVEMENT_CHAMPION_UNDERCITY)) return SPELL_PENNANT_UNDERCITY_CHAMPION; @@ -4009,7 +4014,7 @@ class spell_gen_on_tournament_mount : public SpellScriptLoader else return SPELL_PENNANT_UNDERCITY_ASPIRANT; } - case NPC_ORGRIMMAR_WOLF: + case NPC_ORGRIMMAR_WOLF: { if (player->HasAchieved(ACHIEVEMENT_CHAMPION_ORGRIMMAR)) return SPELL_PENNANT_ORGRIMMAR_CHAMPION; @@ -4018,7 +4023,7 @@ class spell_gen_on_tournament_mount : public SpellScriptLoader else return SPELL_PENNANT_ORGRIMMAR_ASPIRANT; } - case NPC_THUNDER_BLUFF_KODO: + case NPC_THUNDER_BLUFF_KODO: { if (player->HasAchieved(ACHIEVEMENT_CHAMPION_THUNDER_BLUFF)) return SPELL_PENNANT_THUNDER_BLUFF_CHAMPION; @@ -4027,7 +4032,7 @@ class spell_gen_on_tournament_mount : public SpellScriptLoader else return SPELL_PENNANT_THUNDER_BLUFF_ASPIRANT; } - case NPC_ARGENT_WARHORSE: + case NPC_ARGENT_WARHORSE: { if (player->HasAchieved(ACHIEVEMENT_CHAMPION_ALLIANCE) || player->HasAchieved(ACHIEVEMENT_CHAMPION_HORDE)) return player->getClass() == CLASS_DEATH_KNIGHT ? SPELL_PENNANT_EBON_BLADE_CHAMPION : SPELL_PENNANT_ARGENT_CRUSADE_CHAMPION; @@ -4036,162 +4041,162 @@ class spell_gen_on_tournament_mount : public SpellScriptLoader else return player->getClass() == CLASS_DEATH_KNIGHT ? SPELL_PENNANT_EBON_BLADE_ASPIRANT : SPELL_PENNANT_ARGENT_CRUSADE_ASPIRANT; } - default: - return 0; - } + default: + return 0; } - - void Register() - { - AfterEffectApply += AuraEffectApplyFn(spell_gen_on_tournament_mount_AuraScript::HandleApplyEffect, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - OnEffectRemove += AuraEffectRemoveFn(spell_gen_on_tournament_mount_AuraScript::HandleRemoveEffect, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_on_tournament_mount_AuraScript(); } + + void Register() + { + AfterEffectApply += AuraEffectApplyFn(spell_gen_on_tournament_mount_AuraScript::HandleApplyEffect, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + OnEffectRemove += AuraEffectRemoveFn(spell_gen_on_tournament_mount_AuraScript::HandleRemoveEffect, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_on_tournament_mount_AuraScript(); + } }; class spell_gen_tournament_pennant : public SpellScriptLoader { - public: - spell_gen_tournament_pennant() : SpellScriptLoader("spell_gen_tournament_pennant") { } +public: + spell_gen_tournament_pennant() : SpellScriptLoader("spell_gen_tournament_pennant") { } - class spell_gen_tournament_pennant_AuraScript : public AuraScript + class spell_gen_tournament_pennant_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_tournament_pennant_AuraScript); + + bool Load() { - PrepareAuraScript(spell_gen_tournament_pennant_AuraScript); - - bool Load() - { - return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - void HandleApplyEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) - if (!caster->GetVehicleBase()) - caster->RemoveAurasDueToSpell(GetId()); - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_gen_tournament_pennant_AuraScript::HandleApplyEffect, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_tournament_pennant_AuraScript(); + return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER; } + + void HandleApplyEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* caster = GetCaster()) + if (!caster->GetVehicleBase()) + caster->RemoveAurasDueToSpell(GetId()); + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_gen_tournament_pennant_AuraScript::HandleApplyEffect, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_tournament_pennant_AuraScript(); + } }; class spell_gen_ds_flush_knockback : public SpellScriptLoader { - public: - spell_gen_ds_flush_knockback() : SpellScriptLoader("spell_gen_ds_flush_knockback") { } +public: + spell_gen_ds_flush_knockback() : SpellScriptLoader("spell_gen_ds_flush_knockback") { } - class spell_gen_ds_flush_knockback_SpellScript : public SpellScript + class spell_gen_ds_flush_knockback_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_ds_flush_knockback_SpellScript); + + void HandleScript(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_gen_ds_flush_knockback_SpellScript); - - void HandleScript(SpellEffIndex /*effIndex*/) + // Here the target is the water spout and determines the position where the player is knocked from + if (Unit* target = GetHitUnit()) { - // Here the target is the water spout and determines the position where the player is knocked from - if (Unit* target = GetHitUnit()) + if (Player* player = GetCaster()->ToPlayer()) { - if (Player* player = GetCaster()->ToPlayer()) - { - float horizontalSpeed = 20.0f + (40.0f - GetCaster()->GetDistance(target)); - float verticalSpeed = 8.0f; - // This method relies on the Dalaran Sewer map disposition and Water Spout position - // What we do is knock the player from a position exactly behind him and at the end of the pipe - player->KnockbackFrom(target->GetPositionX(), player->GetPositionY(), horizontalSpeed, verticalSpeed); - } + float horizontalSpeed = 20.0f + (40.0f - GetCaster()->GetDistance(target)); + float verticalSpeed = 8.0f; + // This method relies on the Dalaran Sewer map disposition and Water Spout position + // What we do is knock the player from a position exactly behind him and at the end of the pipe + player->KnockbackFrom(target->GetPositionX(), player->GetPositionY(), horizontalSpeed, verticalSpeed); } } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_gen_ds_flush_knockback_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_ds_flush_knockback_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_gen_ds_flush_knockback_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_ds_flush_knockback_SpellScript(); + } }; class spell_gen_count_pct_from_max_hp : public SpellScriptLoader { +public: + spell_gen_count_pct_from_max_hp(char const* name, int32 damagePct = 0) : SpellScriptLoader(name), _damagePct(damagePct) { } + + class spell_gen_count_pct_from_max_hp_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_count_pct_from_max_hp_SpellScript) + public: - spell_gen_count_pct_from_max_hp(char const* name, int32 damagePct = 0) : SpellScriptLoader(name), _damagePct(damagePct) { } + spell_gen_count_pct_from_max_hp_SpellScript(int32 damagePct) : SpellScript(), _damagePct(damagePct) { } - class spell_gen_count_pct_from_max_hp_SpellScript : public SpellScript + void RecalculateDamage() { - PrepareSpellScript(spell_gen_count_pct_from_max_hp_SpellScript) + if (!_damagePct) + _damagePct = GetHitDamage(); - public: - spell_gen_count_pct_from_max_hp_SpellScript(int32 damagePct) : SpellScript(), _damagePct(damagePct) { } + SetHitDamage(GetHitUnit()->CountPctFromMaxHealth(_damagePct)); + } - void RecalculateDamage() - { - if (!_damagePct) - _damagePct = GetHitDamage(); - - SetHitDamage(GetHitUnit()->CountPctFromMaxHealth(_damagePct)); - } - - void Register() - { - OnHit += SpellHitFn(spell_gen_count_pct_from_max_hp_SpellScript::RecalculateDamage); - } - - private: - int32 _damagePct; - }; - - SpellScript* GetSpellScript() const + void Register() { - return new spell_gen_count_pct_from_max_hp_SpellScript(_damagePct); + OnHit += SpellHitFn(spell_gen_count_pct_from_max_hp_SpellScript::RecalculateDamage); } private: int32 _damagePct; + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_count_pct_from_max_hp_SpellScript(_damagePct); + } + +private: + int32 _damagePct; }; class spell_gen_despawn_self : public SpellScriptLoader { - public: - spell_gen_despawn_self() : SpellScriptLoader("spell_gen_despawn_self") { } +public: + spell_gen_despawn_self() : SpellScriptLoader("spell_gen_despawn_self") { } - class spell_gen_despawn_self_SpellScript : public SpellScript + class spell_gen_despawn_self_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_despawn_self_SpellScript); + + bool Load() { - PrepareSpellScript(spell_gen_despawn_self_SpellScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_UNIT; - } - - void HandleDummy(SpellEffIndex effIndex) - { - if (GetSpellInfo()->Effects[effIndex].Effect == SPELL_EFFECT_DUMMY || GetSpellInfo()->Effects[effIndex].Effect == SPELL_EFFECT_SCRIPT_EFFECT) - GetCaster()->ToCreature()->DespawnOrUnsummon(1); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_gen_despawn_self_SpellScript::HandleDummy, EFFECT_ALL, SPELL_EFFECT_ANY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_despawn_self_SpellScript(); + return GetCaster()->GetTypeId() == TYPEID_UNIT; } + + void HandleDummy(SpellEffIndex effIndex) + { + if (GetSpellInfo()->Effects[effIndex].Effect == SPELL_EFFECT_DUMMY || GetSpellInfo()->Effects[effIndex].Effect == SPELL_EFFECT_SCRIPT_EFFECT) + GetCaster()->ToCreature()->DespawnOrUnsummon(1); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_gen_despawn_self_SpellScript::HandleDummy, EFFECT_ALL, SPELL_EFFECT_ANY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_despawn_self_SpellScript(); + } }; enum GenericBandage @@ -4201,97 +4206,97 @@ enum GenericBandage class spell_gen_bandage : public SpellScriptLoader { - public: - spell_gen_bandage() : SpellScriptLoader("spell_gen_bandage") { } +public: + spell_gen_bandage() : SpellScriptLoader("spell_gen_bandage") { } - class spell_gen_bandage_SpellScript : public SpellScript + class spell_gen_bandage_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_bandage_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_gen_bandage_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_RECENTLY_BANDAGED)) - return false; - return true; - } - - SpellCastResult CheckCast() - { - if (Unit* target = GetExplTargetUnit()) - { - if (target->HasAura(SPELL_RECENTLY_BANDAGED)) - return SPELL_FAILED_TARGET_AURASTATE; - } - return SPELL_CAST_OK; - } - - void HandleScript() - { - if (Unit* target = GetHitUnit()) - GetCaster()->CastSpell(target, SPELL_RECENTLY_BANDAGED, true); - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_gen_bandage_SpellScript::CheckCast); - AfterHit += SpellHitFn(spell_gen_bandage_SpellScript::HandleScript); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_bandage_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_RECENTLY_BANDAGED)) + return false; + return true; } + + SpellCastResult CheckCast() + { + if (Unit* target = GetExplTargetUnit()) + { + if (target->HasAura(SPELL_RECENTLY_BANDAGED)) + return SPELL_FAILED_TARGET_AURASTATE; + } + return SPELL_CAST_OK; + } + + void HandleScript() + { + if (Unit* target = GetHitUnit()) + GetCaster()->CastSpell(target, SPELL_RECENTLY_BANDAGED, true); + } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_gen_bandage_SpellScript::CheckCast); + AfterHit += SpellHitFn(spell_gen_bandage_SpellScript::HandleScript); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_bandage_SpellScript(); + } }; // Blade Warding - 64440 enum BladeWarding { - SPELL_GEN_BLADE_WARDING_TRIGGERED = 64442 + SPELL_GEN_BLADE_WARDING_TRIGGERED = 64442 }; class spell_gen_blade_warding : public SpellScriptLoader { public: - spell_gen_blade_warding() : SpellScriptLoader("spell_gen_blade_warding") { } + spell_gen_blade_warding() : SpellScriptLoader("spell_gen_blade_warding") { } - class spell_gen_blade_warding_AuraScript : public AuraScript - { - PrepareAuraScript(spell_gen_blade_warding_AuraScript); + class spell_gen_blade_warding_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_blade_warding_AuraScript); - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_GEN_BLADE_WARDING_TRIGGERED)) - return false; - return true; - } + bool Validate(SpellInfo const* /*spellInfo*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_GEN_BLADE_WARDING_TRIGGERED)) + return false; + return true; + } - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); - Unit* caster = eventInfo.GetActionTarget(); - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_GEN_BLADE_WARDING_TRIGGERED); + Unit* caster = eventInfo.GetActionTarget(); + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_GEN_BLADE_WARDING_TRIGGERED); - uint8 stacks = GetStackAmount(); - int32 bp = 0; + uint8 stacks = GetStackAmount(); + int32 bp = 0; - for (uint8 i = 0; i < stacks; ++i) - bp += spellInfo->Effects[EFFECT_0].CalcValue(caster); + for (uint8 i = 0; i < stacks; ++i) + bp += spellInfo->Effects[EFFECT_0].CalcValue(caster); - caster->CastCustomSpell(SPELL_GEN_BLADE_WARDING_TRIGGERED, SPELLVALUE_BASE_POINT0, bp, eventInfo.GetActor(), TRIGGERED_FULL_MASK, nullptr, aurEff); - } + caster->CastCustomSpell(SPELL_GEN_BLADE_WARDING_TRIGGERED, SPELLVALUE_BASE_POINT0, bp, eventInfo.GetActor(), TRIGGERED_FULL_MASK, nullptr, aurEff); + } - void Register() - { - OnEffectProc += AuraEffectProcFn(spell_gen_blade_warding_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_PROC_TRIGGER_SPELL); - } - }; + void Register() + { + OnEffectProc += AuraEffectProcFn(spell_gen_blade_warding_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; - AuraScript* GetAuraScript() const - { - return new spell_gen_blade_warding_AuraScript(); - } + AuraScript* GetAuraScript() const + { + return new spell_gen_blade_warding_AuraScript(); + } }; enum GenericLifebloom @@ -4305,49 +4310,49 @@ enum GenericLifebloom class spell_gen_lifebloom : public SpellScriptLoader { +public: + spell_gen_lifebloom(const char* name, uint32 spellId) : SpellScriptLoader(name), _spellId(spellId) { } + + class spell_gen_lifebloom_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_lifebloom_AuraScript); + public: - spell_gen_lifebloom(const char* name, uint32 spellId) : SpellScriptLoader(name), _spellId(spellId) { } + spell_gen_lifebloom_AuraScript(uint32 spellId) : AuraScript(), _spellId(spellId) { } - class spell_gen_lifebloom_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_gen_lifebloom_AuraScript); + if (!sSpellMgr->GetSpellInfo(_spellId)) + return false; + return true; + } - public: - spell_gen_lifebloom_AuraScript(uint32 spellId) : AuraScript(), _spellId(spellId) { } - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(_spellId)) - return false; - return true; - } - - void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - // Final heal only on duration end - if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE && GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_ENEMY_SPELL) - return; - - // final heal - GetTarget()->CastSpell(GetTarget(), _spellId, true, NULL, aurEff, GetCasterGUID()); - } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_gen_lifebloom_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_PERIODIC_HEAL, AURA_EFFECT_HANDLE_REAL); - } - - private: - uint32 _spellId; - }; - - AuraScript* GetAuraScript() const + void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { - return new spell_gen_lifebloom_AuraScript(_spellId); + // Final heal only on duration end + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE && GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_ENEMY_SPELL) + return; + + // final heal + GetTarget()->CastSpell(GetTarget(), _spellId, true, NULL, aurEff, GetCasterGUID()); + } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_gen_lifebloom_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_PERIODIC_HEAL, AURA_EFFECT_HANDLE_REAL); } private: uint32 _spellId; + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_lifebloom_AuraScript(_spellId); + } + +private: + uint32 _spellId; }; enum SummonElemental @@ -4358,55 +4363,55 @@ enum SummonElemental class spell_gen_summon_elemental : public SpellScriptLoader { +public: + spell_gen_summon_elemental(const char* name, uint32 spellId) : SpellScriptLoader(name), _spellId(spellId) { } + + class spell_gen_summon_elemental_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_summon_elemental_AuraScript); + public: - spell_gen_summon_elemental(const char* name, uint32 spellId) : SpellScriptLoader(name), _spellId(spellId) { } + spell_gen_summon_elemental_AuraScript(uint32 spellId) : AuraScript(), _spellId(spellId) { } - class spell_gen_summon_elemental_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_gen_summon_elemental_AuraScript); + if (!sSpellMgr->GetSpellInfo(_spellId)) + return false; + return true; + } - public: - spell_gen_summon_elemental_AuraScript(uint32 spellId) : AuraScript(), _spellId(spellId) { } - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(_spellId)) - return false; - return true; - } - - void AfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (GetCaster()) - if (Unit* owner = GetCaster()->GetOwner()) - owner->CastSpell(owner, _spellId, true); - } - - void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (GetCaster()) - if (Unit* owner = GetCaster()->GetOwner()) - if (owner->GetTypeId() == TYPEID_PLAYER) /// @todo this check is maybe wrong - owner->ToPlayer()->RemovePet(nullptr, PET_SAVE_NOT_IN_SLOT, true); - } - - void Register() - { - AfterEffectApply += AuraEffectApplyFn(spell_gen_summon_elemental_AuraScript::AfterApply, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_gen_summon_elemental_AuraScript::AfterRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - - private: - uint32 _spellId; - }; - - AuraScript* GetAuraScript() const + void AfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - return new spell_gen_summon_elemental_AuraScript(_spellId); + if (GetCaster()) + if (Unit* owner = GetCaster()->GetOwner()) + owner->CastSpell(owner, _spellId, true); + } + + void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (GetCaster()) + if (Unit* owner = GetCaster()->GetOwner()) + if (owner->GetTypeId() == TYPEID_PLAYER) /// @todo this check is maybe wrong + owner->ToPlayer()->RemovePet(nullptr, PET_SAVE_NOT_IN_SLOT, true); + } + + void Register() + { + AfterEffectApply += AuraEffectApplyFn(spell_gen_summon_elemental_AuraScript::AfterApply, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_gen_summon_elemental_AuraScript::AfterRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); } private: uint32 _spellId; + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_summon_elemental_AuraScript(_spellId); + } + +private: + uint32 _spellId; }; enum Mounts @@ -4468,120 +4473,106 @@ enum Mounts class spell_gen_mount : public SpellScriptLoader { +public: + spell_gen_mount(const char* name, uint32 mount0 = 0, uint32 mount60 = 0, uint32 mount100 = 0, uint32 mount150 = 0, uint32 mount280 = 0, uint32 mount310 = 0) : SpellScriptLoader(name), + _mount0(mount0), _mount60(mount60), _mount100(mount100), _mount150(mount150), _mount280(mount280), _mount310(mount310) { } + + class spell_gen_mount_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_mount_SpellScript); + public: - spell_gen_mount(const char* name, uint32 mount0 = 0, uint32 mount60 = 0, uint32 mount100 = 0, uint32 mount150 = 0, uint32 mount280 = 0, uint32 mount310 = 0) : SpellScriptLoader(name), + spell_gen_mount_SpellScript(uint32 mount0, uint32 mount60, uint32 mount100, uint32 mount150, uint32 mount280, uint32 mount310) : SpellScript(), _mount0(mount0), _mount60(mount60), _mount100(mount100), _mount150(mount150), _mount280(mount280), _mount310(mount310) { } - class spell_gen_mount_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_gen_mount_SpellScript); + if (_mount0 && !sSpellMgr->GetSpellInfo(_mount0)) + return false; + if (_mount60 && !sSpellMgr->GetSpellInfo(_mount60)) + return false; + if (_mount100 && !sSpellMgr->GetSpellInfo(_mount100)) + return false; + if (_mount150 && !sSpellMgr->GetSpellInfo(_mount150)) + return false; + if (_mount280 && !sSpellMgr->GetSpellInfo(_mount280)) + return false; + if (_mount310 && !sSpellMgr->GetSpellInfo(_mount310)) + return false; + return true; + } - public: - spell_gen_mount_SpellScript(uint32 mount0, uint32 mount60, uint32 mount100, uint32 mount150, uint32 mount280, uint32 mount310) : SpellScript(), - _mount0(mount0), _mount60(mount60), _mount100(mount100), _mount150(mount150), _mount280(mount280), _mount310(mount310) { } + void HandleMount(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); - bool Validate(SpellInfo const* /*spellInfo*/) + if (Player* target = GetHitPlayer()) { - if (_mount0 && !sSpellMgr->GetSpellInfo(_mount0)) - return false; - if (_mount60 && !sSpellMgr->GetSpellInfo(_mount60)) - return false; - if (_mount100 && !sSpellMgr->GetSpellInfo(_mount100)) - return false; - if (_mount150 && !sSpellMgr->GetSpellInfo(_mount150)) - return false; - if (_mount280 && !sSpellMgr->GetSpellInfo(_mount280)) - return false; - if (_mount310 && !sSpellMgr->GetSpellInfo(_mount310)) - return false; - return true; - } + uint32 petNumber = target->GetTemporaryUnsummonedPetNumber(); + target->SetTemporaryUnsummonedPetNumber(0); - void HandleMount(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); + // Prevent stacking of mounts and client crashes upon dismounting + target->RemoveAurasByType(SPELL_AURA_MOUNTED, 0, GetHitAura()); - if (Player* target = GetHitPlayer()) + // Triggered spell id dependent on riding skill and zone + bool canFly = false; + uint32 map = GetVirtualMapForMapAndZone(target->GetMapId(), target->GetZoneId()); + if (map == 530 || (map == 571 && target->HasSpell(SPELL_COLD_WEATHER_FLYING))) + canFly = true; + + AreaTableEntry const* area = sAreaTableStore.LookupEntry(target->GetAreaId()); + // Xinef: add battlefield check + Battlefield* Bf = sBattlefieldMgr->GetBattlefieldToZoneId(target->GetZoneId()); + if (!area || (canFly && ((area->flags & AREA_FLAG_NO_FLY_ZONE) || (Bf && !Bf->CanFlyIn())))) + canFly = false; + + uint32 mount = 0; + switch (target->GetBaseSkillValue(SKILL_RIDING)) { - uint32 petNumber = target->GetTemporaryUnsummonedPetNumber(); - target->SetTemporaryUnsummonedPetNumber(0); - - // Prevent stacking of mounts and client crashes upon dismounting - target->RemoveAurasByType(SPELL_AURA_MOUNTED, 0, GetHitAura()); - - // Triggered spell id dependent on riding skill and zone - bool canFly = false; - uint32 map = GetVirtualMapForMapAndZone(target->GetMapId(), target->GetZoneId()); - if (map == 530 || (map == 571 && target->HasSpell(SPELL_COLD_WEATHER_FLYING))) - canFly = true; - - AreaTableEntry const* area = sAreaTableStore.LookupEntry(target->GetAreaId()); - // Xinef: add battlefield check - Battlefield* Bf = sBattlefieldMgr->GetBattlefieldToZoneId(target->GetZoneId()); - if (!area || (canFly && ((area->flags & AREA_FLAG_NO_FLY_ZONE) || (Bf && !Bf->CanFlyIn())))) - canFly = false; - - uint32 mount = 0; - switch (target->GetBaseSkillValue(SKILL_RIDING)) - { - case 0: - mount = _mount0; - break; - case 75: - mount = _mount60; - break; - case 150: + case 0: + mount = _mount0; + break; + case 75: + mount = _mount60; + break; + case 150: + mount = _mount100; + break; + case 225: + if (canFly) + mount = _mount150; + else mount = _mount100; - break; - case 225: - if (canFly) - mount = _mount150; + break; + case 300: + if (canFly) + { + if (_mount310 && target->Has310Flyer(false)) + mount = _mount310; else - mount = _mount100; - break; - case 300: - if (canFly) - { - if (_mount310 && target->Has310Flyer(false)) - mount = _mount310; - else - mount = _mount280; - } - else - mount = _mount100; - break; - default: - break; - } - - if (mount) - { - PreventHitAura(); - target->CastSpell(target, mount, true); - } - - if (petNumber) - target->SetTemporaryUnsummonedPetNumber(petNumber); + mount = _mount280; + } + else + mount = _mount100; + break; + default: + break; } + + if (mount) + { + PreventHitAura(); + target->CastSpell(target, mount, true); + } + + if (petNumber) + target->SetTemporaryUnsummonedPetNumber(petNumber); } + } - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_gen_mount_SpellScript::HandleMount, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); - } - - private: - uint32 _mount0; - uint32 _mount60; - uint32 _mount100; - uint32 _mount150; - uint32 _mount280; - uint32 _mount310; - }; - - SpellScript* GetSpellScript() const + void Register() { - return new spell_gen_mount_SpellScript(_mount0, _mount60, _mount100, _mount150, _mount280, _mount310); + OnEffectHitTarget += SpellEffectFn(spell_gen_mount_SpellScript::HandleMount, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); } private: @@ -4591,6 +4582,20 @@ class spell_gen_mount : public SpellScriptLoader uint32 _mount150; uint32 _mount280; uint32 _mount310; + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_mount_SpellScript(_mount0, _mount60, _mount100, _mount150, _mount280, _mount310); + } + +private: + uint32 _mount0; + uint32 _mount60; + uint32 _mount100; + uint32 _mount150; + uint32 _mount280; + uint32 _mount310; }; enum FoamSword @@ -4604,39 +4609,39 @@ enum FoamSword class spell_gen_upper_deck_create_foam_sword : public SpellScriptLoader { - public: - spell_gen_upper_deck_create_foam_sword() : SpellScriptLoader("spell_gen_upper_deck_create_foam_sword") { } +public: + spell_gen_upper_deck_create_foam_sword() : SpellScriptLoader("spell_gen_upper_deck_create_foam_sword") { } - class spell_gen_upper_deck_create_foam_sword_SpellScript : public SpellScript + class spell_gen_upper_deck_create_foam_sword_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_upper_deck_create_foam_sword_SpellScript); + + void HandleScript(SpellEffIndex effIndex) { - PrepareSpellScript(spell_gen_upper_deck_create_foam_sword_SpellScript); - - void HandleScript(SpellEffIndex effIndex) + if (Player* player = GetHitPlayer()) { - if (Player* player = GetHitPlayer()) + static uint32 const itemId[5] = { ITEM_FOAM_SWORD_GREEN, ITEM_FOAM_SWORD_PINK, ITEM_FOAM_SWORD_BLUE, ITEM_FOAM_SWORD_RED, ITEM_FOAM_SWORD_YELLOW }; + // player can only have one of these items + for (uint8 i = 0; i < 5; ++i) { - static uint32 const itemId[5] = { ITEM_FOAM_SWORD_GREEN, ITEM_FOAM_SWORD_PINK, ITEM_FOAM_SWORD_BLUE, ITEM_FOAM_SWORD_RED, ITEM_FOAM_SWORD_YELLOW }; - // player can only have one of these items - for (uint8 i = 0; i < 5; ++i) - { - if (player->HasItemCount(itemId[i], 1, true)) - return; - } - - CreateItem(effIndex, itemId[urand(0, 4)]); + if (player->HasItemCount(itemId[i], 1, true)) + return; } - } - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_gen_upper_deck_create_foam_sword_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + CreateItem(effIndex, itemId[urand(0, 4)]); } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_upper_deck_create_foam_sword_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_gen_upper_deck_create_foam_sword_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_upper_deck_create_foam_sword_SpellScript(); + } }; enum Bonked @@ -4648,94 +4653,94 @@ enum Bonked class spell_gen_bonked : public SpellScriptLoader { - public: - spell_gen_bonked() : SpellScriptLoader("spell_gen_bonked") { } +public: + spell_gen_bonked() : SpellScriptLoader("spell_gen_bonked") { } - class spell_gen_bonked_SpellScript : public SpellScript + class spell_gen_bonked_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_bonked_SpellScript); + + void HandleScript(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_gen_bonked_SpellScript); - - void HandleScript(SpellEffIndex /*effIndex*/) + if (Player* target = GetHitPlayer()) { - if (Player* target = GetHitPlayer()) + Aura const* aura = GetHitAura(); + if (!(aura && aura->GetStackAmount() == 3)) + return; + + target->CastSpell(target, SPELL_FOAM_SWORD_DEFEAT, true); + target->RemoveAurasDueToSpell(SPELL_BONKED); + + if (Aura const* aura = target->GetAura(SPELL_ON_GUARD)) { - Aura const* aura = GetHitAura(); - if (!(aura && aura->GetStackAmount() == 3)) - return; - - target->CastSpell(target, SPELL_FOAM_SWORD_DEFEAT, true); - target->RemoveAurasDueToSpell(SPELL_BONKED); - - if (Aura const* aura = target->GetAura(SPELL_ON_GUARD)) - { - if (Item* item = target->GetItemByGuid(aura->GetCastItemGUID())) - target->DestroyItemCount(item->GetEntry(), 1, true); - } + if (Item* item = target->GetItemByGuid(aura->GetCastItemGUID())) + target->DestroyItemCount(item->GetEntry(), 1, true); } } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_gen_bonked_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_bonked_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_gen_bonked_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_bonked_SpellScript(); + } }; class spell_gen_gift_of_naaru : public SpellScriptLoader { - public: - spell_gen_gift_of_naaru() : SpellScriptLoader("spell_gen_gift_of_naaru") { } +public: + spell_gen_gift_of_naaru() : SpellScriptLoader("spell_gen_gift_of_naaru") { } - class spell_gen_gift_of_naaru_AuraScript : public AuraScript + class spell_gen_gift_of_naaru_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_gift_of_naaru_AuraScript); + + void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) { - PrepareAuraScript(spell_gen_gift_of_naaru_AuraScript); + if (!GetCaster()) + return; - void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) + float heal = 0.0f; + switch (GetSpellInfo()->SpellFamilyName) { - if (!GetCaster()) - return; - - float heal = 0.0f; - switch (GetSpellInfo()->SpellFamilyName) - { - case SPELLFAMILY_MAGE: - case SPELLFAMILY_WARLOCK: - case SPELLFAMILY_PRIEST: - heal = 1.885f * float(GetCaster()->SpellBaseDamageBonusDone(GetSpellInfo()->GetSchoolMask())); - break; - case SPELLFAMILY_PALADIN: - case SPELLFAMILY_SHAMAN: - heal = std::max(1.885f * float(GetCaster()->SpellBaseDamageBonusDone(GetSpellInfo()->GetSchoolMask())), 1.1f * float(GetCaster()->GetTotalAttackPowerValue(BASE_ATTACK))); - break; - case SPELLFAMILY_WARRIOR: - case SPELLFAMILY_HUNTER: - case SPELLFAMILY_DEATHKNIGHT: - heal = 1.1f * float(std::max(GetCaster()->GetTotalAttackPowerValue(BASE_ATTACK), GetCaster()->GetTotalAttackPowerValue(RANGED_ATTACK))); - break; - case SPELLFAMILY_GENERIC: - default: - break; - } - - int32 healTick = floor(heal / aurEff->GetTotalTicks()); - amount += int32(std::max(healTick, 0)); + case SPELLFAMILY_MAGE: + case SPELLFAMILY_WARLOCK: + case SPELLFAMILY_PRIEST: + heal = 1.885f * float(GetCaster()->SpellBaseDamageBonusDone(GetSpellInfo()->GetSchoolMask())); + break; + case SPELLFAMILY_PALADIN: + case SPELLFAMILY_SHAMAN: + heal = std::max(1.885f * float(GetCaster()->SpellBaseDamageBonusDone(GetSpellInfo()->GetSchoolMask())), 1.1f * float(GetCaster()->GetTotalAttackPowerValue(BASE_ATTACK))); + break; + case SPELLFAMILY_WARRIOR: + case SPELLFAMILY_HUNTER: + case SPELLFAMILY_DEATHKNIGHT: + heal = 1.1f * float(std::max(GetCaster()->GetTotalAttackPowerValue(BASE_ATTACK), GetCaster()->GetTotalAttackPowerValue(RANGED_ATTACK))); + break; + case SPELLFAMILY_GENERIC: + default: + break; } - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_gift_of_naaru_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_HEAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_gift_of_naaru_AuraScript(); + int32 healTick = floor(heal / aurEff->GetTotalTicks()); + amount += int32(std::max(healTick, 0)); } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_gift_of_naaru_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_HEAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_gift_of_naaru_AuraScript(); + } }; enum Replenishment @@ -4746,82 +4751,82 @@ enum Replenishment class spell_gen_replenishment : public SpellScriptLoader { - public: - spell_gen_replenishment() : SpellScriptLoader("spell_gen_replenishment") { } +public: + spell_gen_replenishment() : SpellScriptLoader("spell_gen_replenishment") { } - class spell_gen_replenishment_SpellScript : public SpellScript + class spell_gen_replenishment_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_replenishment_SpellScript); + + void RemoveInvalidTargets(std::list& targets) { - PrepareSpellScript(spell_gen_replenishment_SpellScript); - - void RemoveInvalidTargets(std::list& targets) + // In arenas Replenishment may only affect the caster + if (Player* caster = GetCaster()->ToPlayer()) { - // In arenas Replenishment may only affect the caster - if (Player* caster = GetCaster()->ToPlayer()) + if (caster->InArena()) { - if (caster->InArena()) - { - targets.clear(); - targets.push_back(caster); - return; - } - } - - targets.remove_if(acore::PowerCheck(POWER_MANA, false)); - - uint8 const maxTargets = 10; - - if (targets.size() > maxTargets) - { - targets.sort(acore::PowerPctOrderPred(POWER_MANA)); - targets.resize(maxTargets); + targets.clear(); + targets.push_back(caster); + return; } } - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_gen_replenishment_SpellScript::RemoveInvalidTargets, EFFECT_ALL, TARGET_UNIT_CASTER_AREA_RAID); - } - }; + targets.remove_if(acore::PowerCheck(POWER_MANA, false)); - SpellScript* GetSpellScript() const - { - return new spell_gen_replenishment_SpellScript(); + uint8 const maxTargets = 10; + + if (targets.size() > maxTargets) + { + targets.sort(acore::PowerPctOrderPred(POWER_MANA)); + targets.resize(maxTargets); + } } - class spell_gen_replenishment_AuraScript : public AuraScript + void Register() { - PrepareAuraScript(spell_gen_replenishment_AuraScript); - - bool Load() - { - return GetUnitOwner()->GetPower(POWER_MANA); - } - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - switch (GetSpellInfo()->Id) - { - case SPELL_REPLENISHMENT: - amount = GetUnitOwner()->GetMaxPower(POWER_MANA) * 0.002f; - break; - case SPELL_INFINITE_REPLENISHMENT: - amount = GetUnitOwner()->GetMaxPower(POWER_MANA) * 0.0025f; - break; - default: - break; - } - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_replenishment_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_ENERGIZE); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_replenishment_AuraScript(); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_gen_replenishment_SpellScript::RemoveInvalidTargets, EFFECT_ALL, TARGET_UNIT_CASTER_AREA_RAID); } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_replenishment_SpellScript(); + } + + class spell_gen_replenishment_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_replenishment_AuraScript); + + bool Load() + { + return GetUnitOwner()->GetPower(POWER_MANA); + } + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + switch (GetSpellInfo()->Id) + { + case SPELL_REPLENISHMENT: + amount = GetUnitOwner()->GetMaxPower(POWER_MANA) * 0.002f; + break; + case SPELL_INFINITE_REPLENISHMENT: + amount = GetUnitOwner()->GetMaxPower(POWER_MANA) * 0.0025f; + break; + default: + break; + } + } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_replenishment_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_ENERGIZE); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_replenishment_AuraScript(); + } }; enum SpectatorCheerTrigger @@ -4835,28 +4840,28 @@ uint8 const EmoteArray[3] = { EMOTE_ONE_SHOT_CHEER, EMOTE_ONE_SHOT_EXCLAMATION, class spell_gen_spectator_cheer_trigger : public SpellScriptLoader { - public: - spell_gen_spectator_cheer_trigger() : SpellScriptLoader("spell_gen_spectator_cheer_trigger") { } +public: + spell_gen_spectator_cheer_trigger() : SpellScriptLoader("spell_gen_spectator_cheer_trigger") { } - class spell_gen_spectator_cheer_trigger_SpellScript : public SpellScript + class spell_gen_spectator_cheer_trigger_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_spectator_cheer_trigger_SpellScript) + + void HandleDummy(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_gen_spectator_cheer_trigger_SpellScript) - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - GetCaster()->HandleEmoteCommand(EmoteArray[urand(0, 2)]); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_gen_spectator_cheer_trigger_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_spectator_cheer_trigger_SpellScript(); + GetCaster()->HandleEmoteCommand(EmoteArray[urand(0, 2)]); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_gen_spectator_cheer_trigger_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_spectator_cheer_trigger_SpellScript(); + } }; enum VendorBarkTrigger @@ -4867,31 +4872,31 @@ enum VendorBarkTrigger class spell_gen_vendor_bark_trigger : public SpellScriptLoader { - public: - spell_gen_vendor_bark_trigger() : SpellScriptLoader("spell_gen_vendor_bark_trigger") { } +public: + spell_gen_vendor_bark_trigger() : SpellScriptLoader("spell_gen_vendor_bark_trigger") { } - class spell_gen_vendor_bark_trigger_SpellScript : public SpellScript + class spell_gen_vendor_bark_trigger_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_vendor_bark_trigger_SpellScript) + + void HandleDummy(SpellEffIndex /* effIndex */) { - PrepareSpellScript(spell_gen_vendor_bark_trigger_SpellScript) - - void HandleDummy(SpellEffIndex /* effIndex */) - { - if (Creature* vendor = GetCaster()->ToCreature()) - if (vendor->GetEntry() == NPC_AMPHITHEATER_VENDOR) - vendor->AI()->Talk(SAY_AMPHITHEATER_VENDOR); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_gen_vendor_bark_trigger_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_vendor_bark_trigger_SpellScript(); + if (Creature* vendor = GetCaster()->ToCreature()) + if (vendor->GetEntry() == NPC_AMPHITHEATER_VENDOR) + vendor->AI()->Talk(SAY_AMPHITHEATER_VENDOR); } + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_gen_vendor_bark_trigger_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_vendor_bark_trigger_SpellScript(); + } + }; enum WhisperGulchYoggSaronWhisper @@ -4901,106 +4906,106 @@ enum WhisperGulchYoggSaronWhisper class spell_gen_whisper_gulch_yogg_saron_whisper : public SpellScriptLoader { - public: - spell_gen_whisper_gulch_yogg_saron_whisper() : SpellScriptLoader("spell_gen_whisper_gulch_yogg_saron_whisper") { } +public: + spell_gen_whisper_gulch_yogg_saron_whisper() : SpellScriptLoader("spell_gen_whisper_gulch_yogg_saron_whisper") { } - class spell_gen_whisper_gulch_yogg_saron_whisper_AuraScript : public AuraScript + class spell_gen_whisper_gulch_yogg_saron_whisper_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_whisper_gulch_yogg_saron_whisper_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_gen_whisper_gulch_yogg_saron_whisper_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_YOGG_SARON_WHISPER_DUMMY)) - return false; - return true; - } - - void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - GetTarget()->CastSpell((Unit*)NULL, SPELL_YOGG_SARON_WHISPER_DUMMY, true); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_whisper_gulch_yogg_saron_whisper_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_gen_whisper_gulch_yogg_saron_whisper_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_YOGG_SARON_WHISPER_DUMMY)) + return false; + return true; } + + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) + { + PreventDefaultAction(); + GetTarget()->CastSpell((Unit*)NULL, SPELL_YOGG_SARON_WHISPER_DUMMY, true); + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_whisper_gulch_yogg_saron_whisper_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_whisper_gulch_yogg_saron_whisper_AuraScript(); + } }; - + class spell_gen_eject_all_passengers : public SpellScriptLoader { - public: - spell_gen_eject_all_passengers() : SpellScriptLoader("spell_gen_eject_all_passengers") { } +public: + spell_gen_eject_all_passengers() : SpellScriptLoader("spell_gen_eject_all_passengers") { } - class spell_gen_eject_all_passengers_SpellScript : public SpellScript + class spell_gen_eject_all_passengers_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_eject_all_passengers_SpellScript); + + void RemoveVehicleAuras() { - PrepareSpellScript(spell_gen_eject_all_passengers_SpellScript); - - void RemoveVehicleAuras() + Unit* u = nullptr; + if (Vehicle* vehicle = GetHitUnit()->GetVehicleKit()) { - Unit* u = nullptr; - if (Vehicle* vehicle = GetHitUnit()->GetVehicleKit()) - { - u = vehicle->GetPassenger(0); - vehicle->RemoveAllPassengers(); - } - if (u) - u->RemoveAurasDueToSpell(VEHICLE_SPELL_PARACHUTE); + u = vehicle->GetPassenger(0); + vehicle->RemoveAllPassengers(); } - - void Register() - { - AfterHit += SpellHitFn(spell_gen_eject_all_passengers_SpellScript::RemoveVehicleAuras); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_eject_all_passengers_SpellScript(); + if (u) + u->RemoveAurasDueToSpell(VEHICLE_SPELL_PARACHUTE); } + + void Register() + { + AfterHit += SpellHitFn(spell_gen_eject_all_passengers_SpellScript::RemoveVehicleAuras); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_eject_all_passengers_SpellScript(); + } }; class spell_gen_eject_passenger : public SpellScriptLoader { - public: - spell_gen_eject_passenger() : SpellScriptLoader("spell_gen_eject_passenger") { } +public: + spell_gen_eject_passenger() : SpellScriptLoader("spell_gen_eject_passenger") { } - class spell_gen_eject_passenger_SpellScript : public SpellScript + class spell_gen_eject_passenger_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_eject_passenger_SpellScript); + + bool Validate(SpellInfo const* spellInfo) { - PrepareSpellScript(spell_gen_eject_passenger_SpellScript); - - bool Validate(SpellInfo const* spellInfo) - { - if (spellInfo->Effects[EFFECT_0].CalcValue() < 1) - return false; - return true; - } - - void EjectPassenger(SpellEffIndex /*effIndex*/) - { - if (Vehicle* vehicle = GetHitUnit()->GetVehicleKit()) - { - if (Unit* passenger = vehicle->GetPassenger(GetEffectValue() - 1)) - passenger->ExitVehicle(); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_gen_eject_passenger_SpellScript::EjectPassenger, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_gen_eject_passenger_SpellScript(); + if (spellInfo->Effects[EFFECT_0].CalcValue() < 1) + return false; + return true; } + + void EjectPassenger(SpellEffIndex /*effIndex*/) + { + if (Vehicle* vehicle = GetHitUnit()->GetVehicleKit()) + { + if (Unit* passenger = vehicle->GetPassenger(GetEffectValue() - 1)) + passenger->ExitVehicle(); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_gen_eject_passenger_SpellScript::EjectPassenger, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_eject_passenger_SpellScript(); + } }; void AddSC_generic_spell_scripts() diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp index d9a521e0e..1b7cdde2e 100644 --- a/src/server/scripts/Spells/spell_hunter.cpp +++ b/src/server/scripts/Spells/spell_hunter.cpp @@ -54,286 +54,286 @@ enum HunterSpells // Ours class spell_hun_check_pet_los : public SpellScriptLoader { - public: - spell_hun_check_pet_los() : SpellScriptLoader("spell_hun_check_pet_los") {} +public: + spell_hun_check_pet_los() : SpellScriptLoader("spell_hun_check_pet_los") {} - class spell_hun_check_pet_los_SpellScript : public SpellScript + class spell_hun_check_pet_los_SpellScript : public SpellScript + { + PrepareSpellScript(spell_hun_check_pet_los_SpellScript); + + SpellCastResult CheckCast() { - PrepareSpellScript(spell_hun_check_pet_los_SpellScript); + Unit* pet = GetCaster()->GetGuardianPet(); + if (!pet) + pet = GetCaster()->GetCharm(); - SpellCastResult CheckCast() + if (!pet) + return SPELL_FAILED_NO_PET; + + if (!pet->IsAlive()) { - Unit* pet = GetCaster()->GetGuardianPet(); - if (!pet) - pet = GetCaster()->GetCharm(); - - if (!pet) - return SPELL_FAILED_NO_PET; - - if (!pet->IsAlive()) - { - SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_PET_IS_DEAD); - return SPELL_FAILED_CUSTOM_ERROR; - } - - if (!GetCaster()->IsWithinLOSInMap(pet)) - return SPELL_FAILED_LINE_OF_SIGHT; - - return SPELL_CAST_OK; + SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_PET_IS_DEAD); + return SPELL_FAILED_CUSTOM_ERROR; } - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_hun_check_pet_los_SpellScript::CheckCast); - } - }; + if (!GetCaster()->IsWithinLOSInMap(pet)) + return SPELL_FAILED_LINE_OF_SIGHT; - SpellScript* GetSpellScript() const - { - return new spell_hun_check_pet_los_SpellScript(); + return SPELL_CAST_OK; } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_hun_check_pet_los_SpellScript::CheckCast); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_hun_check_pet_los_SpellScript(); + } }; class spell_hun_cower : public SpellScriptLoader { - public: - spell_hun_cower() : SpellScriptLoader("spell_hun_cower") { } +public: + spell_hun_cower() : SpellScriptLoader("spell_hun_cower") { } - class spell_hun_cower_AuraScript : public AuraScript + class spell_hun_cower_AuraScript : public AuraScript + { + PrepareAuraScript(spell_hun_cower_AuraScript); + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) { - PrepareAuraScript(spell_hun_cower_AuraScript); - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - if (AuraEffect* aurEff = GetUnitOwner()->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_PET, GetSpellInfo()->SpellIconID, EFFECT_0)) - AddPct(amount, aurEff->GetAmount()); - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_hun_cower_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_DECREASE_SPEED); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_hun_cower_AuraScript(); + if (AuraEffect* aurEff = GetUnitOwner()->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_PET, GetSpellInfo()->SpellIconID, EFFECT_0)) + AddPct(amount, aurEff->GetAmount()); } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_hun_cower_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_DECREASE_SPEED); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_hun_cower_AuraScript(); + } }; class spell_hun_wyvern_sting : public SpellScriptLoader { - public: - spell_hun_wyvern_sting() : SpellScriptLoader("spell_hun_wyvern_sting") { } +public: + spell_hun_wyvern_sting() : SpellScriptLoader("spell_hun_wyvern_sting") { } - class spell_hun_wyvern_sting_AuraScript : public AuraScript + class spell_hun_wyvern_sting_AuraScript : public AuraScript + { + PrepareAuraScript(spell_hun_wyvern_sting_AuraScript) + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_hun_wyvern_sting_AuraScript) - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) - caster->CastSpell(GetTarget(), sSpellMgr->GetSpellWithRank(SPELL_HUNTER_WYVERN_STING_DOT, GetSpellInfo()->GetRank()), true); - } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_hun_wyvern_sting_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_hun_wyvern_sting_AuraScript(); + if (Unit* caster = GetCaster()) + caster->CastSpell(GetTarget(), sSpellMgr->GetSpellWithRank(SPELL_HUNTER_WYVERN_STING_DOT, GetSpellInfo()->GetRank()), true); } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_hun_wyvern_sting_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_hun_wyvern_sting_AuraScript(); + } }; class spell_hun_animal_handler : public SpellScriptLoader { - public: - spell_hun_animal_handler() : SpellScriptLoader("spell_hun_animal_handler") { } +public: + spell_hun_animal_handler() : SpellScriptLoader("spell_hun_animal_handler") { } - class spell_hun_animal_handler_AuraScript : public AuraScript + class spell_hun_animal_handler_AuraScript : public AuraScript + { + PrepareAuraScript(spell_hun_animal_handler_AuraScript); + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) { - PrepareAuraScript(spell_hun_animal_handler_AuraScript); - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - amount = 0; - if (Unit* owner = GetUnitOwner()->GetOwner()) - if (AuraEffect const* animalHandlerEff = owner->GetDummyAuraEffect(SPELLFAMILY_HUNTER, 2234, EFFECT_1)) - amount = animalHandlerEff->GetAmount(); - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_hun_animal_handler_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_ATTACK_POWER_PCT); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_hun_animal_handler_AuraScript(); + amount = 0; + if (Unit* owner = GetUnitOwner()->GetOwner()) + if (AuraEffect const* animalHandlerEff = owner->GetDummyAuraEffect(SPELLFAMILY_HUNTER, 2234, EFFECT_1)) + amount = animalHandlerEff->GetAmount(); } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_hun_animal_handler_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_ATTACK_POWER_PCT); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_hun_animal_handler_AuraScript(); + } }; class spell_hun_generic_scaling : public SpellScriptLoader { - public: - spell_hun_generic_scaling() : SpellScriptLoader("spell_hun_generic_scaling") { } +public: + spell_hun_generic_scaling() : SpellScriptLoader("spell_hun_generic_scaling") { } - class spell_hun_generic_scaling_AuraScript : public AuraScript + class spell_hun_generic_scaling_AuraScript : public AuraScript + { + PrepareAuraScript(spell_hun_generic_scaling_AuraScript); + + void CalculateResistanceAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) { - PrepareAuraScript(spell_hun_generic_scaling_AuraScript); - - void CalculateResistanceAmount(AuraEffect const* aurEff, int32 & amount, bool & /*canBeRecalculated*/) + // xinef: pet inherits 40% of resistance from owner and 35% of armor + if (Unit* owner = GetUnitOwner()->GetOwner()) { - // xinef: pet inherits 40% of resistance from owner and 35% of armor - if (Unit* owner = GetUnitOwner()->GetOwner()) - { - SpellSchoolMask schoolMask = SpellSchoolMask(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].MiscValue); - int32 modifier = schoolMask == SPELL_SCHOOL_MASK_NORMAL ? 35 : 40; - amount = CalculatePct(std::max(0, owner->GetResistance(schoolMask)), modifier); - } + SpellSchoolMask schoolMask = SpellSchoolMask(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].MiscValue); + int32 modifier = schoolMask == SPELL_SCHOOL_MASK_NORMAL ? 35 : 40; + amount = CalculatePct(std::max(0, owner->GetResistance(schoolMask)), modifier); } + } - void CalculateStatAmount(AuraEffect const* aurEff, int32 & amount, bool & /*canBeRecalculated*/) + void CalculateStatAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) + { + if (Unit* owner = GetUnitOwner()->GetOwner()) { - if (Unit* owner = GetUnitOwner()->GetOwner()) - { - // xinef: by default pet inherits 45% of stamina - int32 modifier = 45; + // xinef: by default pet inherits 45% of stamina + int32 modifier = 45; - // xinef: Wild Hunt bonus for stamina - if (AuraEffect* wildHuntEff = GetUnitOwner()->GetDummyAuraEffect(SPELLFAMILY_PET, 3748, EFFECT_0)) - AddPct(modifier, wildHuntEff->GetAmount()); + // xinef: Wild Hunt bonus for stamina + if (AuraEffect* wildHuntEff = GetUnitOwner()->GetDummyAuraEffect(SPELLFAMILY_PET, 3748, EFFECT_0)) + AddPct(modifier, wildHuntEff->GetAmount()); - amount = CalculatePct(std::max(0, owner->GetStat(Stats(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].MiscValue))), modifier); - } + amount = CalculatePct(std::max(0, owner->GetStat(Stats(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].MiscValue))), modifier); } + } - void CalculateAPAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) + void CalculateAPAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + if (Unit* owner = GetUnitOwner()->GetOwner()) { - if (Unit* owner = GetUnitOwner()->GetOwner()) - { - // xinef: by default 22% of RAP - int32 modifier = 22; - - // xinef: Wild Hunt bonus for AP - if (AuraEffect* wildHuntEff = GetUnitOwner()->GetDummyAuraEffect(SPELLFAMILY_PET, 3748, EFFECT_1)) - AddPct(modifier, wildHuntEff->GetAmount()); + // xinef: by default 22% of RAP + int32 modifier = 22; - float ownerAP = owner->GetTotalAttackPowerValue(RANGED_ATTACK); + // xinef: Wild Hunt bonus for AP + if (AuraEffect* wildHuntEff = GetUnitOwner()->GetDummyAuraEffect(SPELLFAMILY_PET, 3748, EFFECT_1)) + AddPct(modifier, wildHuntEff->GetAmount()); - // Xinef: Hunter vs. Wild - if (AuraEffect* HvWEff = owner->GetAuraEffect(SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT, SPELLFAMILY_HUNTER, 3647, EFFECT_0)) - ownerAP += CalculatePct(owner->GetStat(STAT_STAMINA), HvWEff->GetAmount()); + float ownerAP = owner->GetTotalAttackPowerValue(RANGED_ATTACK); - amount = CalculatePct(std::max(0, ownerAP), modifier); - } + // Xinef: Hunter vs. Wild + if (AuraEffect* HvWEff = owner->GetAuraEffect(SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT, SPELLFAMILY_HUNTER, 3647, EFFECT_0)) + ownerAP += CalculatePct(owner->GetStat(STAT_STAMINA), HvWEff->GetAmount()); + + amount = CalculatePct(std::max(0, ownerAP), modifier); } + } - void CalculateSPAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) + void CalculateSPAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + if (Unit* owner = GetUnitOwner()->GetOwner()) { - if (Unit* owner = GetUnitOwner()->GetOwner()) - { - // xinef: by default 12.87% of RAP - float modifier = 12.87f; - - // xinef: Wild Hunt bonus for AP - if (AuraEffect* wildHuntEff = GetUnitOwner()->GetDummyAuraEffect(SPELLFAMILY_PET, 3748, EFFECT_1)) - AddPct(modifier, wildHuntEff->GetAmount()); + // xinef: by default 12.87% of RAP + float modifier = 12.87f; - amount = CalculatePct(std::max(0, owner->GetTotalAttackPowerValue(RANGED_ATTACK)), modifier); + // xinef: Wild Hunt bonus for AP + if (AuraEffect* wildHuntEff = GetUnitOwner()->GetDummyAuraEffect(SPELLFAMILY_PET, 3748, EFFECT_1)) + AddPct(modifier, wildHuntEff->GetAmount()); - // xinef: Update appropriate player field - if (owner->GetTypeId() == TYPEID_PLAYER) - owner->SetUInt32Value(PLAYER_PET_SPELL_POWER, (uint32)amount); - } + amount = CalculatePct(std::max(0, owner->GetTotalAttackPowerValue(RANGED_ATTACK)), modifier); + + // xinef: Update appropriate player field + if (owner->GetTypeId() == TYPEID_PLAYER) + owner->SetUInt32Value(PLAYER_PET_SPELL_POWER, (uint32)amount); } + } - void CalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude) + void CalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude) + { + isPeriodic = true; + amplitude = 2 * IN_MILLISECONDS; + } + + void HandlePeriodic(AuraEffect const* aurEff) + { + PreventDefaultAction(); + if (aurEff->GetAuraType() == SPELL_AURA_MOD_STAT && (aurEff->GetMiscValue() == STAT_STAMINA || aurEff->GetMiscValue() == STAT_INTELLECT)) { - isPeriodic = true; - amplitude = 2*IN_MILLISECONDS; - } - - void HandlePeriodic(AuraEffect const* aurEff) - { - PreventDefaultAction(); - if (aurEff->GetAuraType() == SPELL_AURA_MOD_STAT && (aurEff->GetMiscValue() == STAT_STAMINA || aurEff->GetMiscValue() == STAT_INTELLECT)) + int32 currentAmount = aurEff->GetAmount(); + int32 newAmount = GetEffect(aurEff->GetEffIndex())->CalculateAmount(GetCaster()); + if (newAmount != currentAmount) { - int32 currentAmount = aurEff->GetAmount(); - int32 newAmount = GetEffect(aurEff->GetEffIndex())->CalculateAmount(GetCaster()); - if (newAmount != currentAmount) + if (aurEff->GetMiscValue() == STAT_STAMINA) { - if (aurEff->GetMiscValue() == STAT_STAMINA) - { - uint32 actStat = GetUnitOwner()->GetHealth(); - GetEffect(aurEff->GetEffIndex())->ChangeAmount(newAmount, false); - GetUnitOwner()->SetHealth(std::min(GetUnitOwner()->GetMaxHealth(), actStat)); - } - else - { - uint32 actStat = GetUnitOwner()->GetPower(POWER_MANA); - GetEffect(aurEff->GetEffIndex())->ChangeAmount(newAmount, false); - GetUnitOwner()->SetPower(POWER_MANA, std::min(GetUnitOwner()->GetMaxPower(POWER_MANA), actStat)); - } + uint32 actStat = GetUnitOwner()->GetHealth(); + GetEffect(aurEff->GetEffIndex())->ChangeAmount(newAmount, false); + GetUnitOwner()->SetHealth(std::min(GetUnitOwner()->GetMaxHealth(), actStat)); + } + else + { + uint32 actStat = GetUnitOwner()->GetPower(POWER_MANA); + GetEffect(aurEff->GetEffIndex())->ChangeAmount(newAmount, false); + GetUnitOwner()->SetPower(POWER_MANA, std::min(GetUnitOwner()->GetMaxPower(POWER_MANA), actStat)); } } - else - GetEffect(aurEff->GetEffIndex())->RecalculateAmount(); } - - void Register() - { - if (m_scriptSpellId != 34902) - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_hun_generic_scaling_AuraScript::CalculateResistanceAmount, EFFECT_ALL, SPELL_AURA_MOD_RESISTANCE); - else - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_hun_generic_scaling_AuraScript::CalculateStatAmount, EFFECT_ALL, SPELL_AURA_MOD_STAT); - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_hun_generic_scaling_AuraScript::CalculateAPAmount, EFFECT_ALL, SPELL_AURA_MOD_ATTACK_POWER); - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_hun_generic_scaling_AuraScript::CalculateSPAmount, EFFECT_ALL, SPELL_AURA_MOD_DAMAGE_DONE); - } - - DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_hun_generic_scaling_AuraScript::CalcPeriodic, EFFECT_ALL, SPELL_AURA_ANY); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_hun_generic_scaling_AuraScript::HandlePeriodic, EFFECT_ALL, SPELL_AURA_ANY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_hun_generic_scaling_AuraScript(); + else + GetEffect(aurEff->GetEffIndex())->RecalculateAmount(); } + + void Register() + { + if (m_scriptSpellId != 34902) + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_hun_generic_scaling_AuraScript::CalculateResistanceAmount, EFFECT_ALL, SPELL_AURA_MOD_RESISTANCE); + else + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_hun_generic_scaling_AuraScript::CalculateStatAmount, EFFECT_ALL, SPELL_AURA_MOD_STAT); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_hun_generic_scaling_AuraScript::CalculateAPAmount, EFFECT_ALL, SPELL_AURA_MOD_ATTACK_POWER); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_hun_generic_scaling_AuraScript::CalculateSPAmount, EFFECT_ALL, SPELL_AURA_MOD_DAMAGE_DONE); + } + + DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_hun_generic_scaling_AuraScript::CalcPeriodic, EFFECT_ALL, SPELL_AURA_ANY); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_hun_generic_scaling_AuraScript::HandlePeriodic, EFFECT_ALL, SPELL_AURA_ANY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_hun_generic_scaling_AuraScript(); + } }; // Taming the Beast quests (despawn creature after dismiss) class spell_hun_taming_the_beast : public SpellScriptLoader { - public: - spell_hun_taming_the_beast() : SpellScriptLoader("spell_hun_taming_the_beast") { } +public: + spell_hun_taming_the_beast() : SpellScriptLoader("spell_hun_taming_the_beast") { } - class spell_hun_taming_the_beast_AuraScript : public AuraScript + class spell_hun_taming_the_beast_AuraScript : public AuraScript + { + PrepareAuraScript(spell_hun_taming_the_beast_AuraScript); + + void HandleOnEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_hun_taming_the_beast_AuraScript); - - void HandleOnEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* target = GetTarget()) - if (Creature* creature = target->ToCreature()) - creature->DespawnOrUnsummon(1); - } - - void Register() - { - OnEffectRemove += AuraEffectRemoveFn(spell_hun_taming_the_beast_AuraScript::HandleOnEffectRemove, EFFECT_0, SPELL_AURA_MOD_CHARM, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_hun_taming_the_beast_AuraScript(); + if (Unit* target = GetTarget()) + if (Creature* creature = target->ToCreature()) + creature->DespawnOrUnsummon(1); } + + void Register() + { + OnEffectRemove += AuraEffectRemoveFn(spell_hun_taming_the_beast_AuraScript::HandleOnEffectRemove, EFFECT_0, SPELL_AURA_MOD_CHARM, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_hun_taming_the_beast_AuraScript(); + } }; @@ -342,67 +342,67 @@ class spell_hun_taming_the_beast : public SpellScriptLoader // 13161 Aspect of the Beast class spell_hun_aspect_of_the_beast : public SpellScriptLoader { - public: - spell_hun_aspect_of_the_beast() : SpellScriptLoader("spell_hun_aspect_of_the_beast") { } +public: + spell_hun_aspect_of_the_beast() : SpellScriptLoader("spell_hun_aspect_of_the_beast") { } - class spell_hun_aspect_of_the_beast_AuraScript : public AuraScript + class spell_hun_aspect_of_the_beast_AuraScript : public AuraScript + { + PrepareAuraScript(spell_hun_aspect_of_the_beast_AuraScript); + + bool Load() { - PrepareAuraScript(spell_hun_aspect_of_the_beast_AuraScript); - - bool Load() - { - return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_ASPECT_OF_THE_BEAST_PET)) - return false; - return true; - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (GetCaster()) - if (Player* caster = GetCaster()->ToPlayer()) - if (Pet* pet = caster->GetPet()) - pet->RemoveAurasDueToSpell(SPELL_HUNTER_ASPECT_OF_THE_BEAST_PET); - } - - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (GetCaster()) - if (Player* caster = GetCaster()->ToPlayer()) - if (caster->GetPet()) - caster->CastSpell(caster, SPELL_HUNTER_ASPECT_OF_THE_BEAST_PET, true); - } - - void OnPetApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* pet = GetUnitOwner(); - if (Unit* owner = pet->GetOwner()) - if (owner->HasAura(SPELL_HUNTER_ASPECT_OF_THE_BEAST)) - return; - - SetDuration(0); - } - - void Register() - { - if (m_scriptSpellId == 13161) - { - AfterEffectApply += AuraEffectApplyFn(spell_hun_aspect_of_the_beast_AuraScript::OnApply, EFFECT_0, SPELL_AURA_UNTRACKABLE, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_hun_aspect_of_the_beast_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_UNTRACKABLE, AURA_EFFECT_HANDLE_REAL); - } - else - AfterEffectApply += AuraEffectApplyFn(spell_hun_aspect_of_the_beast_AuraScript::OnPetApply, EFFECT_0, SPELL_AURA_UNTRACKABLE, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_hun_aspect_of_the_beast_AuraScript(); + return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER; } + + bool Validate(SpellInfo const* /*spellInfo*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_ASPECT_OF_THE_BEAST_PET)) + return false; + return true; + } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (GetCaster()) + if (Player* caster = GetCaster()->ToPlayer()) + if (Pet* pet = caster->GetPet()) + pet->RemoveAurasDueToSpell(SPELL_HUNTER_ASPECT_OF_THE_BEAST_PET); + } + + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (GetCaster()) + if (Player* caster = GetCaster()->ToPlayer()) + if (caster->GetPet()) + caster->CastSpell(caster, SPELL_HUNTER_ASPECT_OF_THE_BEAST_PET, true); + } + + void OnPetApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* pet = GetUnitOwner(); + if (Unit* owner = pet->GetOwner()) + if (owner->HasAura(SPELL_HUNTER_ASPECT_OF_THE_BEAST)) + return; + + SetDuration(0); + } + + void Register() + { + if (m_scriptSpellId == 13161) + { + AfterEffectApply += AuraEffectApplyFn(spell_hun_aspect_of_the_beast_AuraScript::OnApply, EFFECT_0, SPELL_AURA_UNTRACKABLE, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_hun_aspect_of_the_beast_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_UNTRACKABLE, AURA_EFFECT_HANDLE_REAL); + } + else + AfterEffectApply += AuraEffectApplyFn(spell_hun_aspect_of_the_beast_AuraScript::OnPetApply, EFFECT_0, SPELL_AURA_UNTRACKABLE, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_hun_aspect_of_the_beast_AuraScript(); + } }; @@ -410,815 +410,815 @@ class spell_hun_aspect_of_the_beast : public SpellScriptLoader // 34074 - Aspect of the Viper class spell_hun_ascpect_of_the_viper : public SpellScriptLoader { - public: - spell_hun_ascpect_of_the_viper() : SpellScriptLoader("spell_hun_ascpect_of_the_viper") { } +public: + spell_hun_ascpect_of_the_viper() : SpellScriptLoader("spell_hun_ascpect_of_the_viper") { } - class spell_hun_ascpect_of_the_viper_AuraScript : public AuraScript + class spell_hun_ascpect_of_the_viper_AuraScript : public AuraScript + { + PrepareAuraScript(spell_hun_ascpect_of_the_viper_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_hun_ascpect_of_the_viper_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_ASPECT_OF_THE_VIPER_ENERGIZE) || + if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_ASPECT_OF_THE_VIPER_ENERGIZE) || !sSpellMgr->GetSpellInfo(SPELL_HUNTER_GLYPH_OF_ASPECT_OF_THE_VIPER) || !sSpellMgr->GetSpellInfo(SPELL_HUNTER_VIPER_ATTACK_SPEED) || !sSpellMgr->GetSpellInfo(SPELL_HUNTER_VICIOUS_VIPER)) - return false; - return true; - } - - bool CheckProc(ProcEventInfo& procInfo) - { - SpellInfo const* spellInfo = procInfo.GetDamageInfo()->GetSpellInfo(); - // Xinef: cannot proc from volley damage - if (spellInfo && (spellInfo->SpellFamilyFlags[0] & 0x2000) && spellInfo->Effects[EFFECT_0].Effect == SPELL_EFFECT_SCHOOL_DAMAGE) - return false; - return true; - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) - { - PreventDefaultAction(); - - uint32 maxMana = GetTarget()->GetMaxPower(POWER_MANA); - int32 mana = CalculatePct(maxMana, GetTarget()->GetAttackTime(RANGED_ATTACK) / 1000.0f); - - if (AuraEffect const* glyph = GetTarget()->GetAuraEffect(SPELL_HUNTER_GLYPH_OF_ASPECT_OF_THE_VIPER, EFFECT_0)) - AddPct(mana, glyph->GetAmount()); - - GetTarget()->CastCustomSpell(SPELL_HUNTER_ASPECT_OF_THE_VIPER_ENERGIZE, SPELLVALUE_BASE_POINT0, mana, GetTarget(), true, NULL, aurEff); - } - - void OnApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - // Hunter T7 4P Bonus - if (GetTarget()->HasAura(SPELL_HUNTER_VIPER_ATTACK_SPEED)) - GetTarget()->CastSpell(GetTarget(), SPELL_HUNTER_VICIOUS_VIPER, true, NULL, aurEff); - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - // Hunter T7 4P Bonus - if (GetTarget()->HasAura(SPELL_HUNTER_VIPER_ATTACK_SPEED)) - GetTarget()->RemoveAurasDueToSpell(SPELL_HUNTER_VICIOUS_VIPER); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_hun_ascpect_of_the_viper_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_hun_ascpect_of_the_viper_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_OBS_MOD_POWER); - AfterEffectApply += AuraEffectApplyFn(spell_hun_ascpect_of_the_viper_AuraScript::OnApply, EFFECT_0, SPELL_AURA_OBS_MOD_POWER, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_hun_ascpect_of_the_viper_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_OBS_MOD_POWER, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_hun_ascpect_of_the_viper_AuraScript(); + return false; + return true; } + + bool CheckProc(ProcEventInfo& procInfo) + { + SpellInfo const* spellInfo = procInfo.GetDamageInfo()->GetSpellInfo(); + // Xinef: cannot proc from volley damage + if (spellInfo && (spellInfo->SpellFamilyFlags[0] & 0x2000) && spellInfo->Effects[EFFECT_0].Effect == SPELL_EFFECT_SCHOOL_DAMAGE) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + + uint32 maxMana = GetTarget()->GetMaxPower(POWER_MANA); + int32 mana = CalculatePct(maxMana, GetTarget()->GetAttackTime(RANGED_ATTACK) / 1000.0f); + + if (AuraEffect const* glyph = GetTarget()->GetAuraEffect(SPELL_HUNTER_GLYPH_OF_ASPECT_OF_THE_VIPER, EFFECT_0)) + AddPct(mana, glyph->GetAmount()); + + GetTarget()->CastCustomSpell(SPELL_HUNTER_ASPECT_OF_THE_VIPER_ENERGIZE, SPELLVALUE_BASE_POINT0, mana, GetTarget(), true, NULL, aurEff); + } + + void OnApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + // Hunter T7 4P Bonus + if (GetTarget()->HasAura(SPELL_HUNTER_VIPER_ATTACK_SPEED)) + GetTarget()->CastSpell(GetTarget(), SPELL_HUNTER_VICIOUS_VIPER, true, NULL, aurEff); + } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + // Hunter T7 4P Bonus + if (GetTarget()->HasAura(SPELL_HUNTER_VIPER_ATTACK_SPEED)) + GetTarget()->RemoveAurasDueToSpell(SPELL_HUNTER_VICIOUS_VIPER); + } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_hun_ascpect_of_the_viper_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_hun_ascpect_of_the_viper_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_OBS_MOD_POWER); + AfterEffectApply += AuraEffectApplyFn(spell_hun_ascpect_of_the_viper_AuraScript::OnApply, EFFECT_0, SPELL_AURA_OBS_MOD_POWER, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_hun_ascpect_of_the_viper_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_OBS_MOD_POWER, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_hun_ascpect_of_the_viper_AuraScript(); + } }; // 53209 Chimera Shot class spell_hun_chimera_shot : public SpellScriptLoader { - public: - spell_hun_chimera_shot() : SpellScriptLoader("spell_hun_chimera_shot") { } +public: + spell_hun_chimera_shot() : SpellScriptLoader("spell_hun_chimera_shot") { } - class spell_hun_chimera_shot_SpellScript : public SpellScript + class spell_hun_chimera_shot_SpellScript : public SpellScript + { + PrepareSpellScript(spell_hun_chimera_shot_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_hun_chimera_shot_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_CHIMERA_SHOT_SERPENT) || !sSpellMgr->GetSpellInfo(SPELL_HUNTER_CHIMERA_SHOT_VIPER) || !sSpellMgr->GetSpellInfo(SPELL_HUNTER_CHIMERA_SHOT_SCORPID)) - return false; - return true; - } - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - if (Unit* unitTarget = GetHitUnit()) - { - uint32 spellId = 0; - int32 basePoint = 0; - Unit::AuraApplicationMap& Auras = unitTarget->GetAppliedAuras(); - for (Unit::AuraApplicationMap::iterator i = Auras.begin(); i != Auras.end(); ++i) - { - Aura* aura = i->second->GetBase(); - if (aura->GetCasterGUID() != caster->GetGUID()) - continue; - - // Search only Serpent Sting, Viper Sting, Scorpid Sting auras - flag96 familyFlag = aura->GetSpellInfo()->SpellFamilyFlags; - if (!(familyFlag[1] & 0x00000080 || familyFlag[0] & 0x0000C000)) - continue; - if (AuraEffect* aurEff = aura->GetEffect(0)) - { - // Serpent Sting - Instantly deals 40% of the damage done by your Serpent Sting. - if (familyFlag[0] & 0x4000) - { - int32 TickCount = aurEff->GetTotalTicks(); - spellId = SPELL_HUNTER_CHIMERA_SHOT_SERPENT; - basePoint = aurEff->GetAmount(); - ApplyPct(basePoint, TickCount * 40); - basePoint = unitTarget->SpellDamageBonusTaken(caster, aura->GetSpellInfo(), basePoint, DOT, aura->GetStackAmount()); - } - // Viper Sting - Instantly restores mana to you equal to 60% of the total amount drained by your Viper Sting. - else if (familyFlag[1] & 0x00000080) - { - int32 TickCount = aura->GetEffect(0)->GetTotalTicks(); - spellId = SPELL_HUNTER_CHIMERA_SHOT_VIPER; - - // Amount of one aura tick - basePoint = int32(CalculatePct(unitTarget->GetMaxPower(POWER_MANA), aurEff->GetAmount())); - int32 casterBasePoint = aurEff->GetAmount() * unitTarget->GetMaxPower(POWER_MANA) / 50; // TODO: WTF? caster uses unitTarget? - if (basePoint > casterBasePoint) - basePoint = casterBasePoint; - ApplyPct(basePoint, TickCount * 60); - } - // Scorpid Sting - Attempts to Disarm the target for 10 sec. This effect cannot occur more than once per 1 minute. - else if (familyFlag[0] & 0x00008000) - { - if (caster->ToPlayer()) // Scorpid Sting - Add 1 minute cooldown - { - if (caster->ToPlayer()->HasSpellCooldown(SPELL_HUNTER_CHIMERA_SHOT_SCORPID)) - break; - - caster->ToPlayer()->AddSpellCooldown(SPELL_HUNTER_CHIMERA_SHOT_SCORPID, 0, 60000); - } - - spellId = SPELL_HUNTER_CHIMERA_SHOT_SCORPID; - } - - // Refresh aura duration - aura->RefreshDuration(); - aurEff->ChangeAmount(aurEff->CalculateAmount(caster), false); - } - break; - } - - if (spellId) - caster->CastCustomSpell(unitTarget, spellId, &basePoint, 0, 0, true); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_hun_chimera_shot_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_hun_chimera_shot_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_CHIMERA_SHOT_SERPENT) || !sSpellMgr->GetSpellInfo(SPELL_HUNTER_CHIMERA_SHOT_VIPER) || !sSpellMgr->GetSpellInfo(SPELL_HUNTER_CHIMERA_SHOT_SCORPID)) + return false; + return true; } + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (Unit* unitTarget = GetHitUnit()) + { + uint32 spellId = 0; + int32 basePoint = 0; + Unit::AuraApplicationMap& Auras = unitTarget->GetAppliedAuras(); + for (Unit::AuraApplicationMap::iterator i = Auras.begin(); i != Auras.end(); ++i) + { + Aura* aura = i->second->GetBase(); + if (aura->GetCasterGUID() != caster->GetGUID()) + continue; + + // Search only Serpent Sting, Viper Sting, Scorpid Sting auras + flag96 familyFlag = aura->GetSpellInfo()->SpellFamilyFlags; + if (!(familyFlag[1] & 0x00000080 || familyFlag[0] & 0x0000C000)) + continue; + if (AuraEffect* aurEff = aura->GetEffect(0)) + { + // Serpent Sting - Instantly deals 40% of the damage done by your Serpent Sting. + if (familyFlag[0] & 0x4000) + { + int32 TickCount = aurEff->GetTotalTicks(); + spellId = SPELL_HUNTER_CHIMERA_SHOT_SERPENT; + basePoint = aurEff->GetAmount(); + ApplyPct(basePoint, TickCount * 40); + basePoint = unitTarget->SpellDamageBonusTaken(caster, aura->GetSpellInfo(), basePoint, DOT, aura->GetStackAmount()); + } + // Viper Sting - Instantly restores mana to you equal to 60% of the total amount drained by your Viper Sting. + else if (familyFlag[1] & 0x00000080) + { + int32 TickCount = aura->GetEffect(0)->GetTotalTicks(); + spellId = SPELL_HUNTER_CHIMERA_SHOT_VIPER; + + // Amount of one aura tick + basePoint = int32(CalculatePct(unitTarget->GetMaxPower(POWER_MANA), aurEff->GetAmount())); + int32 casterBasePoint = aurEff->GetAmount() * unitTarget->GetMaxPower(POWER_MANA) / 50; // TODO: WTF? caster uses unitTarget? + if (basePoint > casterBasePoint) + basePoint = casterBasePoint; + ApplyPct(basePoint, TickCount * 60); + } + // Scorpid Sting - Attempts to Disarm the target for 10 sec. This effect cannot occur more than once per 1 minute. + else if (familyFlag[0] & 0x00008000) + { + if (caster->ToPlayer()) // Scorpid Sting - Add 1 minute cooldown + { + if (caster->ToPlayer()->HasSpellCooldown(SPELL_HUNTER_CHIMERA_SHOT_SCORPID)) + break; + + caster->ToPlayer()->AddSpellCooldown(SPELL_HUNTER_CHIMERA_SHOT_SCORPID, 0, 60000); + } + + spellId = SPELL_HUNTER_CHIMERA_SHOT_SCORPID; + } + + // Refresh aura duration + aura->RefreshDuration(); + aurEff->ChangeAmount(aurEff->CalculateAmount(caster), false); + } + break; + } + + if (spellId) + caster->CastCustomSpell(unitTarget, spellId, &basePoint, 0, 0, true); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_hun_chimera_shot_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_hun_chimera_shot_SpellScript(); + } }; // -19572 - Improved Mend Pet class spell_hun_improved_mend_pet : public SpellScriptLoader { - public: - spell_hun_improved_mend_pet() : SpellScriptLoader("spell_hun_improved_mend_pet") { } +public: + spell_hun_improved_mend_pet() : SpellScriptLoader("spell_hun_improved_mend_pet") { } - class spell_hun_improved_mend_pet_AuraScript : public AuraScript + class spell_hun_improved_mend_pet_AuraScript : public AuraScript + { + PrepareAuraScript(spell_hun_improved_mend_pet_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_hun_improved_mend_pet_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_IMPROVED_MEND_PET)) - return false; - return true; - } - - bool CheckProc(ProcEventInfo& /*eventInfo*/) - { - return roll_chance_i(GetEffect(EFFECT_0)->GetAmount()); - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) - { - PreventDefaultAction(); - GetTarget()->CastSpell(GetTarget(), SPELL_HUNTER_IMPROVED_MEND_PET, true, NULL, aurEff); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_hun_improved_mend_pet_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_hun_improved_mend_pet_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_hun_improved_mend_pet_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_IMPROVED_MEND_PET)) + return false; + return true; } + + bool CheckProc(ProcEventInfo& /*eventInfo*/) + { + return roll_chance_i(GetEffect(EFFECT_0)->GetAmount()); + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + GetTarget()->CastSpell(GetTarget(), SPELL_HUNTER_IMPROVED_MEND_PET, true, NULL, aurEff); + } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_hun_improved_mend_pet_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_hun_improved_mend_pet_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_hun_improved_mend_pet_AuraScript(); + } }; // 53412 - Invigoration class spell_hun_invigoration : public SpellScriptLoader { - public: - spell_hun_invigoration() : SpellScriptLoader("spell_hun_invigoration") { } +public: + spell_hun_invigoration() : SpellScriptLoader("spell_hun_invigoration") { } - class spell_hun_invigoration_SpellScript : public SpellScript + class spell_hun_invigoration_SpellScript : public SpellScript + { + PrepareSpellScript(spell_hun_invigoration_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_hun_invigoration_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_INVIGORATION_TRIGGERED)) - return false; - return true; - } - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) - { - if (Unit* unitTarget = GetHitUnit()) - if (AuraEffect* aurEff = unitTarget->GetDummyAuraEffect(SPELLFAMILY_HUNTER, 3487, 0)) - if (roll_chance_i(aurEff->GetAmount())) - unitTarget->CastSpell(unitTarget, SPELL_HUNTER_INVIGORATION_TRIGGERED, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_hun_invigoration_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_hun_invigoration_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_INVIGORATION_TRIGGERED)) + return false; + return true; } + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + if (Unit* unitTarget = GetHitUnit()) + if (AuraEffect* aurEff = unitTarget->GetDummyAuraEffect(SPELLFAMILY_HUNTER, 3487, 0)) + if (roll_chance_i(aurEff->GetAmount())) + unitTarget->CastSpell(unitTarget, SPELL_HUNTER_INVIGORATION_TRIGGERED, true); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_hun_invigoration_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_hun_invigoration_SpellScript(); + } }; // 53478 - Last Stand Pet class spell_hun_last_stand_pet : public SpellScriptLoader { - public: - spell_hun_last_stand_pet() : SpellScriptLoader("spell_hun_last_stand_pet") { } +public: + spell_hun_last_stand_pet() : SpellScriptLoader("spell_hun_last_stand_pet") { } - class spell_hun_last_stand_pet_SpellScript : public SpellScript + class spell_hun_last_stand_pet_SpellScript : public SpellScript + { + PrepareSpellScript(spell_hun_last_stand_pet_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_hun_last_stand_pet_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_PET_LAST_STAND_TRIGGERED)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - int32 healthModSpellBasePoints0 = int32(caster->CountPctFromMaxHealth(30)); - caster->CastCustomSpell(caster, SPELL_HUNTER_PET_LAST_STAND_TRIGGERED, &healthModSpellBasePoints0, nullptr, nullptr, true, nullptr); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_hun_last_stand_pet_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_hun_last_stand_pet_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_PET_LAST_STAND_TRIGGERED)) + return false; + return true; } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + int32 healthModSpellBasePoints0 = int32(caster->CountPctFromMaxHealth(30)); + caster->CastCustomSpell(caster, SPELL_HUNTER_PET_LAST_STAND_TRIGGERED, &healthModSpellBasePoints0, nullptr, nullptr, true, nullptr); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_hun_last_stand_pet_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_hun_last_stand_pet_SpellScript(); + } }; // 53271 - Masters Call class spell_hun_masters_call : public SpellScriptLoader { - public: - spell_hun_masters_call() : SpellScriptLoader("spell_hun_masters_call") { } +public: + spell_hun_masters_call() : SpellScriptLoader("spell_hun_masters_call") { } - class spell_hun_masters_call_SpellScript : public SpellScript + class spell_hun_masters_call_SpellScript : public SpellScript + { + PrepareSpellScript(spell_hun_masters_call_SpellScript); + + bool Validate(SpellInfo const* spellInfo) { - PrepareSpellScript(spell_hun_masters_call_SpellScript); + if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_MASTERS_CALL_TRIGGERED) || !sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_0].CalcValue()) || !sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_1].CalcValue())) + return false; + return true; + } - bool Validate(SpellInfo const* spellInfo) + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + if (Unit* target = GetHitUnit()) { - if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_MASTERS_CALL_TRIGGERED) || !sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_0].CalcValue()) || !sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_1].CalcValue())) - return false; - return true; - } - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) + // Cannot be processed while pet is dead + TriggerCastFlags castMask = TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_IGNORE_CASTER_AURASTATE); + //target->CastSpell(target, GetEffectValue(), castMask); + target->CastSpell(target, SPELL_HUNTER_MASTERS_CALL_TRIGGERED, castMask); + // there is a possibility that this effect should access effect 0 (dummy) target, but i dubt that + // it's more likely that on on retail it's possible to call target selector based on dbc values + // anyways, we're using GetExplTargetUnit() here and it's ok + if (Unit* ally = GetExplTargetUnit()) { - // Cannot be processed while pet is dead - TriggerCastFlags castMask = TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_IGNORE_CASTER_AURASTATE); - //target->CastSpell(target, GetEffectValue(), castMask); - target->CastSpell(target, SPELL_HUNTER_MASTERS_CALL_TRIGGERED, castMask); - // there is a possibility that this effect should access effect 0 (dummy) target, but i dubt that - // it's more likely that on on retail it's possible to call target selector based on dbc values - // anyways, we're using GetExplTargetUnit() here and it's ok - if (Unit* ally = GetExplTargetUnit()) - { - //target->CastSpell(ally, GetEffectValue(), castMask); - target->CastSpell(ally, GetSpellInfo()->Effects[EFFECT_0].CalcValue(), castMask); - } + //target->CastSpell(ally, GetEffectValue(), castMask); + target->CastSpell(ally, GetSpellInfo()->Effects[EFFECT_0].CalcValue(), castMask); } } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_hun_masters_call_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_hun_masters_call_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_hun_masters_call_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_hun_masters_call_SpellScript(); + } }; // 23989 - Readiness class spell_hun_readiness : public SpellScriptLoader { - public: - spell_hun_readiness() : SpellScriptLoader("spell_hun_readiness") { } +public: + spell_hun_readiness() : SpellScriptLoader("spell_hun_readiness") { } - class spell_hun_readiness_SpellScript : public SpellScript + class spell_hun_readiness_SpellScript : public SpellScript + { + PrepareSpellScript(spell_hun_readiness_SpellScript); + + bool Load() { - PrepareSpellScript(spell_hun_readiness_SpellScript); + return GetCaster()->GetTypeId() == TYPEID_PLAYER; + } - bool Load() + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Player* caster = GetCaster()->ToPlayer(); + // immediately finishes the cooldown on your other Hunter abilities except Bestial Wrath + + PlayerSpellMap const& spellMap = caster->GetSpellMap(); + for (PlayerSpellMap::const_iterator itr = spellMap.begin(); itr != spellMap.end(); ++itr) { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Player* caster = GetCaster()->ToPlayer(); - // immediately finishes the cooldown on your other Hunter abilities except Bestial Wrath - - PlayerSpellMap const& spellMap = caster->GetSpellMap(); - for (PlayerSpellMap::const_iterator itr = spellMap.begin(); itr != spellMap.end(); ++itr) - { - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->first); - if (spellInfo->SpellFamilyName == SPELLFAMILY_HUNTER && + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->first); + if (spellInfo->SpellFamilyName == SPELLFAMILY_HUNTER && spellInfo->Id != SPELL_HUNTER_READINESS && spellInfo->Id != SPELL_HUNTER_BESTIAL_WRATH && spellInfo->Id != SPELL_DRAENEI_GIFT_OF_THE_NAARU && spellInfo->GetRecoveryTime() > 0) - { - SpellCooldowns::iterator citr = caster->GetSpellCooldownMap().find(spellInfo->Id); - if (citr != caster->GetSpellCooldownMap().end() && citr->second.needSendToClient) - caster->RemoveSpellCooldown(spellInfo->Id, true); - else - caster->RemoveSpellCooldown(spellInfo->Id, false); - } - - // force removal of the disarm cooldown - caster->RemoveSpellCooldown(SPELL_HUNTER_CHIMERA_SHOT_SCORPID, false); + { + SpellCooldowns::iterator citr = caster->GetSpellCooldownMap().find(spellInfo->Id); + if (citr != caster->GetSpellCooldownMap().end() && citr->second.needSendToClient) + caster->RemoveSpellCooldown(spellInfo->Id, true); + else + caster->RemoveSpellCooldown(spellInfo->Id, false); } - } - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_hun_readiness_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + // force removal of the disarm cooldown + caster->RemoveSpellCooldown(SPELL_HUNTER_CHIMERA_SHOT_SCORPID, false); } - }; - - SpellScript* GetSpellScript() const - { - return new spell_hun_readiness_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_hun_readiness_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_hun_readiness_SpellScript(); + } }; // 37506 - Scatter Shot class spell_hun_scatter_shot : public SpellScriptLoader { - public: - spell_hun_scatter_shot() : SpellScriptLoader("spell_hun_scatter_shot") { } +public: + spell_hun_scatter_shot() : SpellScriptLoader("spell_hun_scatter_shot") { } - class spell_hun_scatter_shot_SpellScript : public SpellScript + class spell_hun_scatter_shot_SpellScript : public SpellScript + { + PrepareSpellScript(spell_hun_scatter_shot_SpellScript); + + bool Load() { - PrepareSpellScript(spell_hun_scatter_shot_SpellScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Player* caster = GetCaster()->ToPlayer(); - // break Auto Shot and autohit - caster->InterruptSpell(CURRENT_AUTOREPEAT_SPELL); - caster->AttackStop(); - caster->SendAttackSwingCancelAttack(); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_hun_scatter_shot_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_hun_scatter_shot_SpellScript(); + return GetCaster()->GetTypeId() == TYPEID_PLAYER; } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Player* caster = GetCaster()->ToPlayer(); + // break Auto Shot and autohit + caster->InterruptSpell(CURRENT_AUTOREPEAT_SPELL); + caster->AttackStop(); + caster->SendAttackSwingCancelAttack(); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_hun_scatter_shot_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_hun_scatter_shot_SpellScript(); + } }; // -53302 - Sniper Training class spell_hun_sniper_training : public SpellScriptLoader { - public: - spell_hun_sniper_training() : SpellScriptLoader("spell_hun_sniper_training") { } +public: + spell_hun_sniper_training() : SpellScriptLoader("spell_hun_sniper_training") { } - class spell_hun_sniper_training_AuraScript : public AuraScript + class spell_hun_sniper_training_AuraScript : public AuraScript + { + PrepareAuraScript(spell_hun_sniper_training_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_hun_sniper_training_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_SNIPER_TRAINING_R1) || !sSpellMgr->GetSpellInfo(SPELL_HUNTER_SNIPER_TRAINING_BUFF_R1)) - return false; - return true; - } - - void HandlePeriodic(AuraEffect const* aurEff) - { - PreventDefaultAction(); - if (aurEff->GetAmount() <= 0) - { - Unit* caster = GetCaster(); - uint32 spellId = SPELL_HUNTER_SNIPER_TRAINING_BUFF_R1 + GetId() - SPELL_HUNTER_SNIPER_TRAINING_R1; - if (Unit* target = GetTarget()) - { - SpellInfo const* triggeredSpellInfo = sSpellMgr->GetSpellInfo(spellId); - Unit* triggerCaster = triggeredSpellInfo->NeedsToBeTriggeredByCaster(GetSpellInfo()) ? caster : target; - triggerCaster->CastSpell(target, triggeredSpellInfo, true, 0, aurEff); - } - } - } - - void HandleUpdatePeriodic(AuraEffect* aurEff) - { - if (Player* playerTarget = GetUnitOwner()->ToPlayer()) - { - int32 baseAmount = aurEff->GetBaseAmount(); - int32 amount = playerTarget->isMoving() || aurEff->GetAmount() <= 0 ? - playerTarget->CalculateSpellDamage(playerTarget, GetSpellInfo(), aurEff->GetEffIndex(), &baseAmount) : - aurEff->GetAmount() - 1; - aurEff->SetAmount(amount); - } - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_hun_sniper_training_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_hun_sniper_training_AuraScript::HandleUpdatePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_hun_sniper_training_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_SNIPER_TRAINING_R1) || !sSpellMgr->GetSpellInfo(SPELL_HUNTER_SNIPER_TRAINING_BUFF_R1)) + return false; + return true; } + + void HandlePeriodic(AuraEffect const* aurEff) + { + PreventDefaultAction(); + if (aurEff->GetAmount() <= 0) + { + Unit* caster = GetCaster(); + uint32 spellId = SPELL_HUNTER_SNIPER_TRAINING_BUFF_R1 + GetId() - SPELL_HUNTER_SNIPER_TRAINING_R1; + if (Unit* target = GetTarget()) + { + SpellInfo const* triggeredSpellInfo = sSpellMgr->GetSpellInfo(spellId); + Unit* triggerCaster = triggeredSpellInfo->NeedsToBeTriggeredByCaster(GetSpellInfo()) ? caster : target; + triggerCaster->CastSpell(target, triggeredSpellInfo, true, 0, aurEff); + } + } + } + + void HandleUpdatePeriodic(AuraEffect* aurEff) + { + if (Player* playerTarget = GetUnitOwner()->ToPlayer()) + { + int32 baseAmount = aurEff->GetBaseAmount(); + int32 amount = playerTarget->isMoving() || aurEff->GetAmount() <= 0 ? + playerTarget->CalculateSpellDamage(playerTarget, GetSpellInfo(), aurEff->GetEffIndex(), &baseAmount) : + aurEff->GetAmount() - 1; + aurEff->SetAmount(amount); + } + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_hun_sniper_training_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_hun_sniper_training_AuraScript::HandleUpdatePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_hun_sniper_training_AuraScript(); + } }; // 55709 - Pet Heart of the Phoenix class spell_hun_pet_heart_of_the_phoenix : public SpellScriptLoader { - public: - spell_hun_pet_heart_of_the_phoenix() : SpellScriptLoader("spell_hun_pet_heart_of_the_phoenix") { } +public: + spell_hun_pet_heart_of_the_phoenix() : SpellScriptLoader("spell_hun_pet_heart_of_the_phoenix") { } - class spell_hun_pet_heart_of_the_phoenix_SpellScript : public SpellScript + class spell_hun_pet_heart_of_the_phoenix_SpellScript : public SpellScript + { + PrepareSpellScript(spell_hun_pet_heart_of_the_phoenix_SpellScript); + + bool Load() { - PrepareSpellScript(spell_hun_pet_heart_of_the_phoenix_SpellScript); - - bool Load() - { - if (!GetCaster()->IsPet()) - return false; - return true; - } - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_TRIGGERED) || !sSpellMgr->GetSpellInfo(SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_DEBUFF)) - return false; - return true; - } - - SpellCastResult CheckCast() - { - Unit* caster = GetCaster(); - if (caster->IsAlive()) - return SPELL_FAILED_TARGET_NOT_DEAD; - if (caster->HasAura(SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_DEBUFF)) - return SPELL_FAILED_CASTER_AURASTATE; - return SPELL_CAST_OK; - } - - void HandleScript(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - if (Unit* owner = caster->GetOwner()) - if (!caster->HasAura(SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_DEBUFF)) - { - owner->CastCustomSpell(SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_TRIGGERED, SPELLVALUE_BASE_POINT0, 100, caster, true); - caster->CastSpell(caster, SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_DEBUFF, true); - } - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_hun_pet_heart_of_the_phoenix_SpellScript::CheckCast); - OnEffectHitTarget += SpellEffectFn(spell_hun_pet_heart_of_the_phoenix_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_hun_pet_heart_of_the_phoenix_SpellScript(); + if (!GetCaster()->IsPet()) + return false; + return true; } + + bool Validate(SpellInfo const* /*spellInfo*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_TRIGGERED) || !sSpellMgr->GetSpellInfo(SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_DEBUFF)) + return false; + return true; + } + + SpellCastResult CheckCast() + { + Unit* caster = GetCaster(); + if (caster->IsAlive()) + return SPELL_FAILED_TARGET_NOT_DEAD; + if (caster->HasAura(SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_DEBUFF)) + return SPELL_FAILED_CASTER_AURASTATE; + return SPELL_CAST_OK; + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (Unit* owner = caster->GetOwner()) + if (!caster->HasAura(SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_DEBUFF)) + { + owner->CastCustomSpell(SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_TRIGGERED, SPELLVALUE_BASE_POINT0, 100, caster, true); + caster->CastSpell(caster, SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_DEBUFF, true); + } + } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_hun_pet_heart_of_the_phoenix_SpellScript::CheckCast); + OnEffectHitTarget += SpellEffectFn(spell_hun_pet_heart_of_the_phoenix_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_hun_pet_heart_of_the_phoenix_SpellScript(); + } }; // 54044 - Pet Carrion Feeder class spell_hun_pet_carrion_feeder : public SpellScriptLoader { - public: - spell_hun_pet_carrion_feeder() : SpellScriptLoader("spell_hun_pet_carrion_feeder") { } +public: + spell_hun_pet_carrion_feeder() : SpellScriptLoader("spell_hun_pet_carrion_feeder") { } - class spell_hun_pet_carrion_feeder_SpellScript : public SpellScript + class spell_hun_pet_carrion_feeder_SpellScript : public SpellScript + { + PrepareSpellScript(spell_hun_pet_carrion_feeder_SpellScript); + + bool Load() { - PrepareSpellScript(spell_hun_pet_carrion_feeder_SpellScript); - - bool Load() - { - if (!GetCaster()->IsPet()) - return false; - return true; - } - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_PET_CARRION_FEEDER_TRIGGERED)) - return false; - return true; - } - - SpellCastResult CheckIfCorpseNear() - { - Unit* caster = GetCaster(); - float max_range = GetSpellInfo()->GetMaxRange(false); - WorldObject* result = nullptr; - // search for nearby enemy corpse in range - acore::AnyDeadUnitSpellTargetInRangeCheck check(caster, max_range, GetSpellInfo(), TARGET_CHECK_ENEMY); - acore::WorldObjectSearcher searcher(caster, result, check); - caster->GetMap()->VisitFirstFound(caster->m_positionX, caster->m_positionY, max_range, searcher); - if (!result) - return SPELL_FAILED_NO_EDIBLE_CORPSES; - return SPELL_CAST_OK; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - caster->CastSpell(caster, SPELL_HUNTER_PET_CARRION_FEEDER_TRIGGERED, false); - } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_hun_pet_carrion_feeder_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - OnCheckCast += SpellCheckCastFn(spell_hun_pet_carrion_feeder_SpellScript::CheckIfCorpseNear); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_hun_pet_carrion_feeder_SpellScript(); + if (!GetCaster()->IsPet()) + return false; + return true; } + + bool Validate(SpellInfo const* /*spellInfo*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_PET_CARRION_FEEDER_TRIGGERED)) + return false; + return true; + } + + SpellCastResult CheckIfCorpseNear() + { + Unit* caster = GetCaster(); + float max_range = GetSpellInfo()->GetMaxRange(false); + WorldObject* result = nullptr; + // search for nearby enemy corpse in range + acore::AnyDeadUnitSpellTargetInRangeCheck check(caster, max_range, GetSpellInfo(), TARGET_CHECK_ENEMY); + acore::WorldObjectSearcher searcher(caster, result, check); + caster->GetMap()->VisitFirstFound(caster->m_positionX, caster->m_positionY, max_range, searcher); + if (!result) + return SPELL_FAILED_NO_EDIBLE_CORPSES; + return SPELL_CAST_OK; + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + caster->CastSpell(caster, SPELL_HUNTER_PET_CARRION_FEEDER_TRIGGERED, false); + } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_hun_pet_carrion_feeder_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + OnCheckCast += SpellCheckCastFn(spell_hun_pet_carrion_feeder_SpellScript::CheckIfCorpseNear); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_hun_pet_carrion_feeder_SpellScript(); + } }; // 34477 - Misdirection class spell_hun_misdirection : public SpellScriptLoader { - public: - spell_hun_misdirection() : SpellScriptLoader("spell_hun_misdirection") { } +public: + spell_hun_misdirection() : SpellScriptLoader("spell_hun_misdirection") { } - class spell_hun_misdirection_AuraScript : public AuraScript + class spell_hun_misdirection_AuraScript : public AuraScript + { + PrepareAuraScript(spell_hun_misdirection_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_hun_misdirection_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_MISDIRECTION_PROC)) - return false; - return true; - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEFAULT || !GetTarget()->HasAura(SPELL_HUNTER_MISDIRECTION_PROC)) - GetTarget()->ResetRedirectThreat(); - } - - bool CheckProc(ProcEventInfo& /*eventInfo*/) - { - return GetTarget()->GetRedirectThreatTarget(); - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) - { - PreventDefaultAction(); - GetTarget()->CastSpell(GetTarget(), SPELL_HUNTER_MISDIRECTION_PROC, true, NULL, aurEff); - } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_hun_misdirection_AuraScript::OnRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - DoCheckProc += AuraCheckProcFn(spell_hun_misdirection_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_hun_misdirection_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_hun_misdirection_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_MISDIRECTION_PROC)) + return false; + return true; } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEFAULT || !GetTarget()->HasAura(SPELL_HUNTER_MISDIRECTION_PROC)) + GetTarget()->ResetRedirectThreat(); + } + + bool CheckProc(ProcEventInfo& /*eventInfo*/) + { + return GetTarget()->GetRedirectThreatTarget(); + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + GetTarget()->CastSpell(GetTarget(), SPELL_HUNTER_MISDIRECTION_PROC, true, NULL, aurEff); + } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_hun_misdirection_AuraScript::OnRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + DoCheckProc += AuraCheckProcFn(spell_hun_misdirection_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_hun_misdirection_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_hun_misdirection_AuraScript(); + } }; // 35079 - Misdirection (Proc) class spell_hun_misdirection_proc : public SpellScriptLoader { - public: - spell_hun_misdirection_proc() : SpellScriptLoader("spell_hun_misdirection_proc") { } +public: + spell_hun_misdirection_proc() : SpellScriptLoader("spell_hun_misdirection_proc") { } - class spell_hun_misdirection_proc_AuraScript : public AuraScript + class spell_hun_misdirection_proc_AuraScript : public AuraScript + { + PrepareAuraScript(spell_hun_misdirection_proc_AuraScript); + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_hun_misdirection_proc_AuraScript); - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetTarget()->ResetRedirectThreat(); - } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_hun_misdirection_proc_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_hun_misdirection_proc_AuraScript(); + GetTarget()->ResetRedirectThreat(); } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_hun_misdirection_proc_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_hun_misdirection_proc_AuraScript(); + } }; // 781 - Disengage class spell_hun_disengage : public SpellScriptLoader { - public: - spell_hun_disengage() : SpellScriptLoader("spell_hun_disengage") { } +public: + spell_hun_disengage() : SpellScriptLoader("spell_hun_disengage") { } - class spell_hun_disengage_SpellScript : public SpellScript + class spell_hun_disengage_SpellScript : public SpellScript + { + PrepareSpellScript(spell_hun_disengage_SpellScript); + + SpellCastResult CheckCast() { - PrepareSpellScript(spell_hun_disengage_SpellScript); + Unit* caster = GetCaster(); + if (caster->GetTypeId() == TYPEID_PLAYER && !caster->IsInCombat()) + return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; - SpellCastResult CheckCast() - { - Unit* caster = GetCaster(); - if (caster->GetTypeId() == TYPEID_PLAYER && !caster->IsInCombat()) - return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; - - return SPELL_CAST_OK; - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_hun_disengage_SpellScript::CheckCast); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_hun_disengage_SpellScript(); + return SPELL_CAST_OK; } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_hun_disengage_SpellScript::CheckCast); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_hun_disengage_SpellScript(); + } }; // 1515 - Tame Beast class spell_hun_tame_beast : public SpellScriptLoader { - public: - spell_hun_tame_beast() : SpellScriptLoader("spell_hun_tame_beast") { } +public: + spell_hun_tame_beast() : SpellScriptLoader("spell_hun_tame_beast") { } - class spell_hun_tame_beast_SpellScript : public SpellScript + class spell_hun_tame_beast_SpellScript : public SpellScript + { + PrepareSpellScript(spell_hun_tame_beast_SpellScript); + + SpellCastResult CheckCast() { - PrepareSpellScript(spell_hun_tame_beast_SpellScript); + Unit* caster = GetCaster(); + if (caster->GetTypeId() != TYPEID_PLAYER) + return SPELL_FAILED_DONT_REPORT; - SpellCastResult CheckCast() + Player* player = GetCaster()->ToPlayer(); + + if (!GetExplTargetUnit()) { - Unit* caster = GetCaster(); - if (caster->GetTypeId() != TYPEID_PLAYER) - return SPELL_FAILED_DONT_REPORT; - - Player* player = GetCaster()->ToPlayer(); - - if (!GetExplTargetUnit()) - { - player->SendTameFailure(PET_TAME_INVALID_CREATURE); - return SPELL_FAILED_DONT_REPORT; - } - - if (Creature* target = GetExplTargetUnit()->ToCreature()) - { - if (target->getLevel() > player->getLevel()) - { - player->SendTameFailure(PET_TAME_TOO_HIGHLEVEL); - return SPELL_FAILED_DONT_REPORT; - } - - if (target->GetCreatureTemplate()->IsExotic() && !player->CanTameExoticPets()) - { - player->SendTameFailure(PET_TAME_CANT_CONTROL_EXOTIC); - return SPELL_FAILED_DONT_REPORT; - } - - if (!target->GetCreatureTemplate()->IsTameable(player->CanTameExoticPets())) - { - player->SendTameFailure(PET_TAME_NOT_TAMEABLE); - return SPELL_FAILED_DONT_REPORT; - } - - if (caster->GetPetGUID() || player->GetTemporaryUnsummonedPetNumber() || player->IsPetDismissed() || player->GetCharmGUID()) - { - player->SendTameFailure(PET_TAME_ANOTHER_SUMMON_ACTIVE); - return SPELL_FAILED_DONT_REPORT; - } - - } - else - { - player->SendTameFailure(PET_TAME_INVALID_CREATURE); - return SPELL_FAILED_DONT_REPORT; - } - - return SPELL_CAST_OK; + player->SendTameFailure(PET_TAME_INVALID_CREATURE); + return SPELL_FAILED_DONT_REPORT; } - void Register() + if (Creature* target = GetExplTargetUnit()->ToCreature()) { - OnCheckCast += SpellCheckCastFn(spell_hun_tame_beast_SpellScript::CheckCast); - } - }; + if (target->getLevel() > player->getLevel()) + { + player->SendTameFailure(PET_TAME_TOO_HIGHLEVEL); + return SPELL_FAILED_DONT_REPORT; + } - SpellScript* GetSpellScript() const - { - return new spell_hun_tame_beast_SpellScript(); + if (target->GetCreatureTemplate()->IsExotic() && !player->CanTameExoticPets()) + { + player->SendTameFailure(PET_TAME_CANT_CONTROL_EXOTIC); + return SPELL_FAILED_DONT_REPORT; + } + + if (!target->GetCreatureTemplate()->IsTameable(player->CanTameExoticPets())) + { + player->SendTameFailure(PET_TAME_NOT_TAMEABLE); + return SPELL_FAILED_DONT_REPORT; + } + + if (caster->GetPetGUID() || player->GetTemporaryUnsummonedPetNumber() || player->IsPetDismissed() || player->GetCharmGUID()) + { + player->SendTameFailure(PET_TAME_ANOTHER_SUMMON_ACTIVE); + return SPELL_FAILED_DONT_REPORT; + } + + } + else + { + player->SendTameFailure(PET_TAME_INVALID_CREATURE); + return SPELL_FAILED_DONT_REPORT; + } + + return SPELL_CAST_OK; } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_hun_tame_beast_SpellScript::CheckCast); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_hun_tame_beast_SpellScript(); + } }; // 60144 - Viper Attack Speed class spell_hun_viper_attack_speed : public SpellScriptLoader { - public: - spell_hun_viper_attack_speed() : SpellScriptLoader("spell_hun_viper_attack_speed") { } +public: + spell_hun_viper_attack_speed() : SpellScriptLoader("spell_hun_viper_attack_speed") { } - class spell_hun_viper_attack_speed_AuraScript : public AuraScript + class spell_hun_viper_attack_speed_AuraScript : public AuraScript + { + PrepareAuraScript(spell_hun_viper_attack_speed_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_hun_viper_attack_speed_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_ASPECT_OF_THE_VIPER) || + if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_ASPECT_OF_THE_VIPER) || !sSpellMgr->GetSpellInfo(SPELL_HUNTER_VICIOUS_VIPER)) - return false; - return true; - } - - void OnApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - if (GetTarget()->HasAura(SPELL_HUNTER_ASPECT_OF_THE_VIPER)) - GetTarget()->CastSpell(GetTarget(), SPELL_HUNTER_VICIOUS_VIPER, true, NULL, aurEff); - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - // possible exploit - GetTarget()->RemoveAurasDueToSpell(SPELL_HUNTER_VICIOUS_VIPER); - } - - void Register() - { - AfterEffectApply += AuraEffectApplyFn(spell_hun_viper_attack_speed_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_hun_viper_attack_speed_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_hun_viper_attack_speed_AuraScript(); + return false; + return true; } + + void OnApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + if (GetTarget()->HasAura(SPELL_HUNTER_ASPECT_OF_THE_VIPER)) + GetTarget()->CastSpell(GetTarget(), SPELL_HUNTER_VICIOUS_VIPER, true, NULL, aurEff); + } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + // possible exploit + GetTarget()->RemoveAurasDueToSpell(SPELL_HUNTER_VICIOUS_VIPER); + } + + void Register() + { + AfterEffectApply += AuraEffectApplyFn(spell_hun_viper_attack_speed_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_hun_viper_attack_speed_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_hun_viper_attack_speed_AuraScript(); + } }; void AddSC_hunter_spell_scripts() diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp index 71600c0e0..dc9692864 100644 --- a/src/server/scripts/Spells/spell_item.cpp +++ b/src/server/scripts/Spells/spell_item.cpp @@ -20,32 +20,32 @@ class spell_item_massive_seaforium_charge : public SpellScriptLoader { - public: - spell_item_massive_seaforium_charge() : SpellScriptLoader("spell_item_massive_seaforium_charge") { } +public: + spell_item_massive_seaforium_charge() : SpellScriptLoader("spell_item_massive_seaforium_charge") { } - class spell_item_massive_seaforium_charge_SpellScript : public SpellScript + class spell_item_massive_seaforium_charge_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_massive_seaforium_charge_SpellScript); + + void HandleItemRemove(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_item_massive_seaforium_charge_SpellScript); + if (!GetHitUnit() || !GetHitUnit()->ToPlayer()) + return; - void HandleItemRemove(SpellEffIndex /*effIndex*/) - { - if (!GetHitUnit() || !GetHitUnit()->ToPlayer()) - return; - - Player* target = GetHitUnit()->ToPlayer(); - target->DestroyItemCount(39213, 1, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_massive_seaforium_charge_SpellScript::HandleItemRemove, EFFECT_0, SPELL_EFFECT_SUMMON_OBJECT_WILD); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_massive_seaforium_charge_SpellScript(); + Player* target = GetHitUnit()->ToPlayer(); + target->DestroyItemCount(39213, 1, true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_massive_seaforium_charge_SpellScript::HandleItemRemove, EFFECT_0, SPELL_EFFECT_SUMMON_OBJECT_WILD); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_massive_seaforium_charge_SpellScript(); + } }; enum TitaniumSealOfDalaran @@ -57,46 +57,46 @@ enum TitaniumSealOfDalaran class spell_item_titanium_seal_of_dalaran : public SpellScriptLoader { - public: - spell_item_titanium_seal_of_dalaran() : SpellScriptLoader("spell_item_titanium_seal_of_dalaran") {} +public: + spell_item_titanium_seal_of_dalaran() : SpellScriptLoader("spell_item_titanium_seal_of_dalaran") {} - class spell_item_titanium_seal_of_dalaran_SpellScript : public SpellScript + class spell_item_titanium_seal_of_dalaran_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_titanium_seal_of_dalaran_SpellScript) + + void OnScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_item_titanium_seal_of_dalaran_SpellScript) + PreventHitDefaultEffect(effIndex); - void OnScriptEffect(SpellEffIndex effIndex) + Unit* caster = GetCaster(); + if (Player* player = caster->ToPlayer()) { - PreventHitDefaultEffect(effIndex); - - Unit* caster = GetCaster(); - if (Player* player = caster->ToPlayer()) + LocaleConstant loc_idx = player->GetSession()->GetSessionDbLocaleIndex(); + if (BroadcastText const* bct = sObjectMgr->GetBroadcastText(TITANIUM_SEAL_OF_DALARAN_BROADCAST_TEXT_ID_FLIP)) + player->TextEmote(bct->GetText(loc_idx, player->getGender())); + if (urand(0, 1)) { - LocaleConstant loc_idx = player->GetSession()->GetSessionDbLocaleIndex(); - if (BroadcastText const* bct = sObjectMgr->GetBroadcastText(TITANIUM_SEAL_OF_DALARAN_BROADCAST_TEXT_ID_FLIP)) + if (BroadcastText const* bct = sObjectMgr->GetBroadcastText(TITANIUM_SEAL_OF_DALARAN_BROADCAST_TEXT_ID_FACE_DOWN)) + player->TextEmote(bct->GetText(loc_idx, player->getGender())); + } + else + { + if (BroadcastText const* bct = sObjectMgr->GetBroadcastText(TITANIUM_SEAL_OF_DALARAN_BROADCAST_TEXT_ID_HEADS_UP)) player->TextEmote(bct->GetText(loc_idx, player->getGender())); - if (urand(0,1)) - { - if (BroadcastText const* bct = sObjectMgr->GetBroadcastText(TITANIUM_SEAL_OF_DALARAN_BROADCAST_TEXT_ID_FACE_DOWN)) - player->TextEmote(bct->GetText(loc_idx, player->getGender())); - } - else - { - if (BroadcastText const* bct = sObjectMgr->GetBroadcastText(TITANIUM_SEAL_OF_DALARAN_BROADCAST_TEXT_ID_HEADS_UP)) - player->TextEmote(bct->GetText(loc_idx, player->getGender())); - } } } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_titanium_seal_of_dalaran_SpellScript::OnScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_titanium_seal_of_dalaran_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_titanium_seal_of_dalaran_SpellScript::OnScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_titanium_seal_of_dalaran_SpellScript(); + } }; enum AmplifyDish @@ -110,116 +110,116 @@ enum AmplifyDish class spell_item_mind_amplify_dish : public SpellScriptLoader { - public: - spell_item_mind_amplify_dish() : SpellScriptLoader("spell_item_mind_amplify_dish") {} +public: + spell_item_mind_amplify_dish() : SpellScriptLoader("spell_item_mind_amplify_dish") {} - class spell_item_mind_amplify_dish_SpellScript : public SpellScript + class spell_item_mind_amplify_dish_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_mind_amplify_dish_SpellScript) + + void OnDummyEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_item_mind_amplify_dish_SpellScript) + PreventHitDefaultEffect(effIndex); - void OnDummyEffect(SpellEffIndex effIndex) + Unit* caster = GetCaster(); + if (Player* player = caster->ToPlayer()) { - PreventHitDefaultEffect(effIndex); - - Unit* caster = GetCaster(); - if (Player* player = caster->ToPlayer()) + if (Unit* target = GetHitUnit()) { - if (Unit *target = GetHitUnit()) - { - // little protection - if (target->ToCreature()) - if (target->ToCreature()->GetCreatureTemplate()->rank > CREATURE_ELITE_NORMAL) - return; + // little protection + if (target->ToCreature()) + if (target->ToCreature()->GetCreatureTemplate()->rank > CREATURE_ELITE_NORMAL) + return; - if (GetSpellInfo()->Id != SPELL_AMPLIFY_10S) - if (target->getLevel() > 60) - return; + if (GetSpellInfo()->Id != SPELL_AMPLIFY_10S) + if (target->getLevel() > 60) + return; - uint8 pct = std::max(0, 20+player->getLevel()-target->getLevel()); - if (roll_chance_i(pct)) - player->CastSpell(target, SPELL_MENTAL_BATTLE, true); - else if (roll_chance_i(pct)) - player->CastSpell(target, GetSpellInfo()->Id == SPELL_AMPLIFY_10S ? SPELL_AMPLIFY_CHARM_10S : SPELL_AMPLIFY_CHARM_30S, true); - } + uint8 pct = std::max(0, 20 + player->getLevel() - target->getLevel()); + if (roll_chance_i(pct)) + player->CastSpell(target, SPELL_MENTAL_BATTLE, true); + else if (roll_chance_i(pct)) + player->CastSpell(target, GetSpellInfo()->Id == SPELL_AMPLIFY_10S ? SPELL_AMPLIFY_CHARM_10S : SPELL_AMPLIFY_CHARM_30S, true); } } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_mind_amplify_dish_SpellScript::OnDummyEffect, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_mind_amplify_dish_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_mind_amplify_dish_SpellScript::OnDummyEffect, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_mind_amplify_dish_SpellScript(); + } }; class spell_item_runescroll_of_fortitude : public SpellScriptLoader { - public: - spell_item_runescroll_of_fortitude() : SpellScriptLoader("spell_item_runescroll_of_fortitude") {} +public: + spell_item_runescroll_of_fortitude() : SpellScriptLoader("spell_item_runescroll_of_fortitude") {} - class spell_item_runescroll_of_fortitude_SpellScript : public SpellScript + class spell_item_runescroll_of_fortitude_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_runescroll_of_fortitude_SpellScript) + + void OnScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_item_runescroll_of_fortitude_SpellScript) + PreventHitDefaultEffect(effIndex); - void OnScriptEffect(SpellEffIndex effIndex) + if (Unit* target = GetHitUnit()) { - PreventHitDefaultEffect(effIndex); + if (target->getLevel() < 70) + return; - if (Unit* target = GetHitUnit()) - { - if (target->getLevel() < 70) - return; - - target->CastSpell(target, 72590, true); // Stamina spell (Fortitude) - } + target->CastSpell(target, 72590, true); // Stamina spell (Fortitude) } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_runescroll_of_fortitude_SpellScript::OnScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_runescroll_of_fortitude_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_runescroll_of_fortitude_SpellScript::OnScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_runescroll_of_fortitude_SpellScript(); + } }; class spell_item_branns_communicator : public SpellScriptLoader { - public: - spell_item_branns_communicator() : SpellScriptLoader("spell_item_branns_communicator") {} +public: + spell_item_branns_communicator() : SpellScriptLoader("spell_item_branns_communicator") {} - class spell_item_branns_communicator_SpellScript : public SpellScript + class spell_item_branns_communicator_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_branns_communicator_SpellScript) + + void OnScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_item_branns_communicator_SpellScript) + PreventHitDefaultEffect(effIndex); - void OnScriptEffect(SpellEffIndex effIndex) + if (Player* target = GetHitPlayer()) { - PreventHitDefaultEffect(effIndex); - - if (Player* target = GetHitPlayer()) - { - target->KilledMonsterCredit(29579, 0); // Brann's entry - target->CastSpell(target, 55038, true); // Brann summoning spell - } + target->KilledMonsterCredit(29579, 0); // Brann's entry + target->CastSpell(target, 55038, true); // Brann summoning spell } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_branns_communicator_SpellScript::OnScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_branns_communicator_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_branns_communicator_SpellScript::OnScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_branns_communicator_SpellScript(); + } }; class spell_item_goblin_gumbo_kettle : public SpellScriptLoader @@ -234,13 +234,13 @@ public: void CalcPeriodic(AuraEffect const* /*effect*/, bool& isPeriodic, int32& amplitude) { isPeriodic = true; - amplitude = urand(10*IN_MILLISECONDS, 40*IN_MILLISECONDS); + amplitude = urand(10 * IN_MILLISECONDS, 40 * IN_MILLISECONDS); } void Update(AuraEffect* effect) { PreventDefaultAction(); - effect->SetPeriodicTimer(urand(10*IN_MILLISECONDS, 40*IN_MILLISECONDS)); + effect->SetPeriodicTimer(urand(10 * IN_MILLISECONDS, 40 * IN_MILLISECONDS)); if (Unit* owner = GetUnitOwner()) owner->CastSpell(owner, 42755 /*Goblin Gumbo Trigger*/, true); } @@ -332,30 +332,30 @@ public: class spell_item_toy_train_set : public SpellScriptLoader { - public: - spell_item_toy_train_set() : SpellScriptLoader("spell_item_toy_train_set") {} +public: + spell_item_toy_train_set() : SpellScriptLoader("spell_item_toy_train_set") {} - class spell_item_toy_train_set_SpellScript : public SpellScript + class spell_item_toy_train_set_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_toy_train_set_SpellScript) + + void HandleScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_item_toy_train_set_SpellScript) - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - target->HandleEmoteCommand(EMOTE_ONESHOT_TRAIN); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_toy_train_set_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_toy_train_set_SpellScript(); + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) + target->HandleEmoteCommand(EMOTE_ONESHOT_TRAIN); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_toy_train_set_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_toy_train_set_SpellScript(); + } }; enum eChicken @@ -397,85 +397,85 @@ public: class spell_item_sleepy_willy : public SpellScriptLoader { - public: - spell_item_sleepy_willy() : SpellScriptLoader("spell_item_sleepy_willy") {} +public: + spell_item_sleepy_willy() : SpellScriptLoader("spell_item_sleepy_willy") {} - class spell_item_sleepy_willy_SpellScript : public SpellScript + class spell_item_sleepy_willy_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_sleepy_willy_SpellScript); + + void SelectTarget(std::list& targets) { - PrepareSpellScript(spell_item_sleepy_willy_SpellScript); + Creature* target = nullptr; + for (std::list::const_iterator itr = targets.begin(); itr != targets.end(); ++itr) + if (Creature* creature = (*itr)->ToCreature()) + if (creature->IsCritter()) + { + target = creature; + break; + } - void SelectTarget(std::list& targets) - { - Creature* target = nullptr; - for (std::list::const_iterator itr = targets.begin(); itr != targets.end(); ++itr) - if (Creature* creature = (*itr)->ToCreature()) - if (creature->IsCritter()) - { - target = creature; - break; - } - - targets.clear(); - if (target) - targets.push_back(target); - } - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - Creature* target = GetHitCreature(); - if (!target) - return; - - GetCaster()->CastSpell(target, GetEffectValue(), false); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_item_sleepy_willy_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); - OnEffectHitTarget += SpellEffectFn(spell_item_sleepy_willy_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_sleepy_willy_SpellScript(); + targets.clear(); + if (target) + targets.push_back(target); } + + void HandleScriptEffect(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + Creature* target = GetHitCreature(); + if (!target) + return; + + GetCaster()->CastSpell(target, GetEffectValue(), false); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_item_sleepy_willy_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + OnEffectHitTarget += SpellEffectFn(spell_item_sleepy_willy_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_sleepy_willy_SpellScript(); + } }; class spell_item_lil_phylactery : public SpellScriptLoader { - public: - spell_item_lil_phylactery() : SpellScriptLoader("spell_item_lil_phylactery") { } +public: + spell_item_lil_phylactery() : SpellScriptLoader("spell_item_lil_phylactery") { } - class spell_item_lil_phylactery_AuraScript : public AuraScript + class spell_item_lil_phylactery_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_lil_phylactery_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_item_lil_phylactery_AuraScript); - - bool CheckProc(ProcEventInfo& eventInfo) - { - return eventInfo.GetActionTarget() && (eventInfo.GetActionTarget()->GetTypeId() != TYPEID_UNIT || eventInfo.GetActionTarget()->ToCreature()->isWorldBoss()); - } - - void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) - { - PreventDefaultAction(); - - if (Unit* critter = ObjectAccessor::GetUnit(*GetUnitOwner(), GetUnitOwner()->GetCritterGUID())) - GetUnitOwner()->CastSpell(critter, 69731 /*SPELL_LICH_PET_AURA_ON_KILL*/, true); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_item_lil_phylactery_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_item_lil_phylactery_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_item_lil_phylactery_AuraScript(); + return eventInfo.GetActionTarget() && (eventInfo.GetActionTarget()->GetTypeId() != TYPEID_UNIT || eventInfo.GetActionTarget()->ToCreature()->isWorldBoss()); } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + + if (Unit* critter = ObjectAccessor::GetUnit(*GetUnitOwner(), GetUnitOwner()->GetCritterGUID())) + GetUnitOwner()->CastSpell(critter, 69731 /*SPELL_LICH_PET_AURA_ON_KILL*/, true); + } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_item_lil_phylactery_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_item_lil_phylactery_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_item_lil_phylactery_AuraScript(); + } }; class spell_item_shifting_naaru_silver : public SpellScriptLoader @@ -525,116 +525,116 @@ public: class spell_item_toxic_wasteling : public SpellScriptLoader { - public: - spell_item_toxic_wasteling() : SpellScriptLoader("spell_item_toxic_wasteling") {} +public: + spell_item_toxic_wasteling() : SpellScriptLoader("spell_item_toxic_wasteling") {} - class spell_item_toxic_wasteling_SpellScript : public SpellScript + class spell_item_toxic_wasteling_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_toxic_wasteling_SpellScript); + + void HandleJump(SpellEffIndex effIndex) { - PrepareSpellScript(spell_item_toxic_wasteling_SpellScript); - - void HandleJump(SpellEffIndex effIndex) + PreventHitDefaultEffect(effIndex); + if (Creature* target = GetHitCreature()) { - PreventHitDefaultEffect(effIndex); - if (Creature* target = GetHitCreature()) - { - GetCaster()->GetMotionMaster()->Clear(false); - GetCaster()->GetMotionMaster()->MoveIdle(); - GetCaster()->ToCreature()->SetHomePosition(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0.0f); - GetCaster()->GetMotionMaster()->MoveJump(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 12.0f, 3.0f, 1); - target->DespawnOrUnsummon(1500); - } + GetCaster()->GetMotionMaster()->Clear(false); + GetCaster()->GetMotionMaster()->MoveIdle(); + GetCaster()->ToCreature()->SetHomePosition(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0.0f); + GetCaster()->GetMotionMaster()->MoveJump(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 12.0f, 3.0f, 1); + target->DespawnOrUnsummon(1500); } - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - } - - void Register() - { - OnEffectLaunchTarget += SpellEffectFn(spell_item_toxic_wasteling_SpellScript::HandleJump, EFFECT_0, SPELL_EFFECT_JUMP); - OnEffectHitTarget += SpellEffectFn(spell_item_toxic_wasteling_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_toxic_wasteling_SpellScript(); } + + void HandleScriptEffect(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + } + + void Register() + { + OnEffectLaunchTarget += SpellEffectFn(spell_item_toxic_wasteling_SpellScript::HandleJump, EFFECT_0, SPELL_EFFECT_JUMP); + OnEffectHitTarget += SpellEffectFn(spell_item_toxic_wasteling_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_toxic_wasteling_SpellScript(); + } }; class spell_item_lil_xt : public SpellScriptLoader { - public: - spell_item_lil_xt() : SpellScriptLoader("spell_item_lil_xt") {} +public: + spell_item_lil_xt() : SpellScriptLoader("spell_item_lil_xt") {} - class spell_item_lil_xt_SpellScript : public SpellScript + class spell_item_lil_xt_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_lil_xt_SpellScript); + + void HandleScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_item_lil_xt_SpellScript); - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - Creature* target = GetHitCreature(); - if (!target) - return; - GetCaster()->CastSpell(target, GetEffectValue(), false); - } - - void HandleDummy(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - Creature* target = GetHitCreature(); - if (!target) - return; - if (GetCaster()->GetTypeId() == TYPEID_UNIT && GetCaster()->ToCreature()->AI()) - GetCaster()->ToCreature()->AI()->Talk(2); - target->DespawnOrUnsummon(500); - } - - void Register() - { - if (m_scriptSpellId == 76098) - OnEffectHitTarget += SpellEffectFn(spell_item_lil_xt_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - else - OnEffectHitTarget += SpellEffectFn(spell_item_lil_xt_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_lil_xt_SpellScript(); + PreventHitDefaultEffect(effIndex); + Creature* target = GetHitCreature(); + if (!target) + return; + GetCaster()->CastSpell(target, GetEffectValue(), false); } + + void HandleDummy(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + Creature* target = GetHitCreature(); + if (!target) + return; + if (GetCaster()->GetTypeId() == TYPEID_UNIT && GetCaster()->ToCreature()->AI()) + GetCaster()->ToCreature()->AI()->Talk(2); + target->DespawnOrUnsummon(500); + } + + void Register() + { + if (m_scriptSpellId == 76098) + OnEffectHitTarget += SpellEffectFn(spell_item_lil_xt_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + else + OnEffectHitTarget += SpellEffectFn(spell_item_lil_xt_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_lil_xt_SpellScript(); + } }; class spell_item_essence_of_life : public SpellScriptLoader { - public: - spell_item_essence_of_life() : SpellScriptLoader("spell_item_essence_of_life") { } +public: + spell_item_essence_of_life() : SpellScriptLoader("spell_item_essence_of_life") { } - class spell_item_essence_of_life_AuraScript : public AuraScript + class spell_item_essence_of_life_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_essence_of_life_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_item_essence_of_life_AuraScript); + SpellInfo const* spellInfo = eventInfo.GetDamageInfo()->GetSpellInfo(); + if (!spellInfo || !spellInfo->HasEffect(SPELL_EFFECT_HEAL)) + return false; - bool CheckProc(ProcEventInfo& eventInfo) - { - SpellInfo const* spellInfo = eventInfo.GetDamageInfo()->GetSpellInfo(); - if (!spellInfo || !spellInfo->HasEffect(SPELL_EFFECT_HEAL)) - return false; - - return spellInfo->ManaCost > 0 || spellInfo->ManaCostPercentage > 0 || (spellInfo->SpellFamilyName == SPELLFAMILY_PALADIN && spellInfo->SpellIconID == 156); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_item_essence_of_life_AuraScript::CheckProc); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_item_essence_of_life_AuraScript(); + return spellInfo->ManaCost > 0 || spellInfo->ManaCostPercentage > 0 || (spellInfo->SpellFamilyName == SPELLFAMILY_PALADIN && spellInfo->SpellIconID == 156); } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_item_essence_of_life_AuraScript::CheckProc); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_item_essence_of_life_AuraScript(); + } }; const uint32 crazyAlchemistTable[5] = @@ -648,68 +648,68 @@ const uint32 crazyAlchemistTable[5] = class spell_item_crazy_alchemists_potion : public SpellScriptLoader { - public: - spell_item_crazy_alchemists_potion() : SpellScriptLoader("spell_item_crazy_alchemists_potion") {} +public: + spell_item_crazy_alchemists_potion() : SpellScriptLoader("spell_item_crazy_alchemists_potion") {} - class spell_item_crazy_alchemists_potion_SpellScript : public SpellScript + class spell_item_crazy_alchemists_potion_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_crazy_alchemists_potion_SpellScript); + + void HandleHeal(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_item_crazy_alchemists_potion_SpellScript); - - void HandleHeal(SpellEffIndex /*effIndex*/) - { - // Xinef: 20% to get additional effect, guessed - if (roll_chance_i(20)) - GetCaster()->CastSpell(GetCaster(), crazyAlchemistTable[urand(0, (GetCaster()->getPowerType() == POWER_MANA ? 4 : 3))], true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_crazy_alchemists_potion_SpellScript::HandleHeal, EFFECT_0, SPELL_EFFECT_HEAL); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_crazy_alchemists_potion_SpellScript(); + // Xinef: 20% to get additional effect, guessed + if (roll_chance_i(20)) + GetCaster()->CastSpell(GetCaster(), crazyAlchemistTable[urand(0, (GetCaster()->getPowerType() == POWER_MANA ? 4 : 3))], true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_crazy_alchemists_potion_SpellScript::HandleHeal, EFFECT_0, SPELL_EFFECT_HEAL); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_crazy_alchemists_potion_SpellScript(); + } }; class spell_item_skull_of_impeding_doom : public SpellScriptLoader { - public: - spell_item_skull_of_impeding_doom() : SpellScriptLoader("spell_item_skull_of_impeding_doom") { } +public: + spell_item_skull_of_impeding_doom() : SpellScriptLoader("spell_item_skull_of_impeding_doom") { } - class spell_item_skull_of_impeding_doom_AuraScript : public AuraScript + class spell_item_skull_of_impeding_doom_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_skull_of_impeding_doom_AuraScript); + + void CalculateDamageAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) { - PrepareAuraScript(spell_item_skull_of_impeding_doom_AuraScript); + if (!GetCaster()) + return; - void CalculateDamageAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - if (!GetCaster()) - return; - - amount = GetCaster()->GetMaxHealth()*0.12f; // 5 ticks which reduce health by 60% - } - - void CalculateManaLeechAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - if (!GetCaster() || GetCaster()->getPowerType() != POWER_MANA) - return; - - amount = GetCaster()->GetMaxPower(POWER_MANA)*0.12f; // 5 ticks which reduce health by 60% - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_item_skull_of_impeding_doom_AuraScript::CalculateDamageAmount, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE); - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_item_skull_of_impeding_doom_AuraScript::CalculateManaLeechAmount, EFFECT_2, SPELL_AURA_PERIODIC_MANA_LEECH); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_item_skull_of_impeding_doom_AuraScript(); + amount = GetCaster()->GetMaxHealth() * 0.12f; // 5 ticks which reduce health by 60% } + + void CalculateManaLeechAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + if (!GetCaster() || GetCaster()->getPowerType() != POWER_MANA) + return; + + amount = GetCaster()->GetMaxPower(POWER_MANA) * 0.12f; // 5 ticks which reduce health by 60% + } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_item_skull_of_impeding_doom_AuraScript::CalculateDamageAmount, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_item_skull_of_impeding_doom_AuraScript::CalculateManaLeechAmount, EFFECT_2, SPELL_AURA_PERIODIC_MANA_LEECH); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_item_skull_of_impeding_doom_AuraScript(); + } }; class spell_item_carrot_on_a_stick : public SpellScriptLoader @@ -763,139 +763,145 @@ enum Feast class spell_item_feast : public SpellScriptLoader { - public: - spell_item_feast() : SpellScriptLoader("spell_item_feast") {} +public: + spell_item_feast() : SpellScriptLoader("spell_item_feast") {} - class spell_item_feast_SpellScript : public SpellScript + class spell_item_feast_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_feast_SpellScript); + + bool Load() { - PrepareSpellScript(spell_item_feast_SpellScript); + return GetCaster()->GetTypeId() == TYPEID_PLAYER; + } - bool Load() + void HandleScriptEffect(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + + Unit* caster = GetCaster(); + if (Player* player = caster->ToPlayer()) { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } + LocaleConstant loc_idx = player->GetSession()->GetSessionDbLocaleIndex(); - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - - Unit* caster = GetCaster(); - if (Player* player = caster->ToPlayer()) + switch(GetSpellInfo()->Id) { - LocaleConstant loc_idx = player->GetSession()->GetSessionDbLocaleIndex(); - - switch(GetSpellInfo()->Id) - { - case SPELL_GREAT_FEAST: - if (BroadcastText const* bct = sObjectMgr->GetBroadcastText(GREAT_FEAST_BROADCAST_TEXT_ID_PREPARE)) - player->MonsterTextEmote(bct->GetText(loc_idx, player->getGender()).c_str(), player, false); - break; - case SPELL_FISH_FEAST: - if (BroadcastText const* bct = sObjectMgr->GetBroadcastText(FISH_FEAST_BROADCAST_TEXT_ID_PREPARE)) - player->MonsterTextEmote(bct->GetText(loc_idx, player->getGender()).c_str(), player, false); - break; - case SPELL_SMALL_FEAST: - if (BroadcastText const* bct = sObjectMgr->GetBroadcastText(SMALL_FEAST_BROADCAST_TEXT_ID_PREPARE)) - player->MonsterTextEmote(bct->GetText(loc_idx, player->getGender()).c_str(), player, false); - break; - case SPELL_GIGANTIC_FEAST: - if (BroadcastText const* bct = sObjectMgr->GetBroadcastText(GIGANTIC_FEAST_BROADCAST_TEXT_ID_PREPARE)) - player->MonsterTextEmote(bct->GetText(loc_idx, player->getGender()).c_str(), player, false); - break; - } + case SPELL_GREAT_FEAST: + if (BroadcastText const* bct = sObjectMgr->GetBroadcastText(GREAT_FEAST_BROADCAST_TEXT_ID_PREPARE)) + player->MonsterTextEmote(bct->GetText(loc_idx, player->getGender()).c_str(), player, false); + break; + case SPELL_FISH_FEAST: + if (BroadcastText const* bct = sObjectMgr->GetBroadcastText(FISH_FEAST_BROADCAST_TEXT_ID_PREPARE)) + player->MonsterTextEmote(bct->GetText(loc_idx, player->getGender()).c_str(), player, false); + break; + case SPELL_SMALL_FEAST: + if (BroadcastText const* bct = sObjectMgr->GetBroadcastText(SMALL_FEAST_BROADCAST_TEXT_ID_PREPARE)) + player->MonsterTextEmote(bct->GetText(loc_idx, player->getGender()).c_str(), player, false); + break; + case SPELL_GIGANTIC_FEAST: + if (BroadcastText const* bct = sObjectMgr->GetBroadcastText(GIGANTIC_FEAST_BROADCAST_TEXT_ID_PREPARE)) + player->MonsterTextEmote(bct->GetText(loc_idx, player->getGender()).c_str(), player, false); + break; } } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_feast_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_feast_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_feast_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_feast_SpellScript(); + } }; class spell_item_gnomish_universal_remote : public SpellScriptLoader { - public: - spell_item_gnomish_universal_remote() : SpellScriptLoader("spell_item_gnomish_universal_remote") {} +public: + spell_item_gnomish_universal_remote() : SpellScriptLoader("spell_item_gnomish_universal_remote") {} - class spell_item_gnomish_universal_remote_SpellScript : public SpellScript + class spell_item_gnomish_universal_remote_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_gnomish_universal_remote_SpellScript); + + void HandleDummy(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_item_gnomish_universal_remote_SpellScript); + Unit* target = GetHitUnit(); + if (!target) + return; - void HandleDummy(SpellEffIndex /*effIndex*/) + uint32 spellId = 0; + switch (urand(0, 2)) { - Unit* target = GetHitUnit(); - if (!target) - return; - - uint32 spellId = 0; - switch (urand(0,2)) - { - case 0: spellId = 8345; break; // charm - case 1: spellId = 8346; break; // root - case 2: spellId = 8347; break; // threat - } - if (spellId) - GetCaster()->CastSpell(target, spellId, true); + case 0: + spellId = 8345; + break; // charm + case 1: + spellId = 8346; + break; // root + case 2: + spellId = 8347; + break; // threat } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_gnomish_universal_remote_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_gnomish_universal_remote_SpellScript(); + if (spellId) + GetCaster()->CastSpell(target, spellId, true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_gnomish_universal_remote_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_gnomish_universal_remote_SpellScript(); + } }; class spell_item_strong_anti_venom : public SpellScriptLoader { - public: - spell_item_strong_anti_venom() : SpellScriptLoader("spell_item_strong_anti_venom") {} +public: + spell_item_strong_anti_venom() : SpellScriptLoader("spell_item_strong_anti_venom") {} - class spell_item_strong_anti_venom_SpellScript : public SpellScript + class spell_item_strong_anti_venom_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_strong_anti_venom_SpellScript); + + void HandleDummy(SpellEffIndex effIndex) { - PrepareSpellScript(spell_item_strong_anti_venom_SpellScript); - - void HandleDummy(SpellEffIndex effIndex) + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) + std::list removeList; + Unit::AuraMap const& auras = target->GetOwnedAuras(); + for (Unit::AuraMap::const_iterator itr = auras.begin(); itr != auras.end(); ++itr) { - std::list removeList; - Unit::AuraMap const& auras = target->GetOwnedAuras(); - for (Unit::AuraMap::const_iterator itr = auras.begin(); itr != auras.end(); ++itr) - { - Aura* aura = itr->second; - if (aura->GetSpellInfo()->SpellLevel > 35 || aura->GetSpellInfo()->Dispel != DISPEL_POISON) - continue; + Aura* aura = itr->second; + if (aura->GetSpellInfo()->SpellLevel > 35 || aura->GetSpellInfo()->Dispel != DISPEL_POISON) + continue; - removeList.push_back(aura->GetId()); - } - - for (std::list::const_iterator itr = removeList.begin(); itr != removeList.end(); ++itr) - target->RemoveAurasDueToSpell(*itr); + removeList.push_back(aura->GetId()); } - } - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_strong_anti_venom_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + for (std::list::const_iterator itr = removeList.begin(); itr != removeList.end(); ++itr) + target->RemoveAurasDueToSpell(*itr); } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_strong_anti_venom_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_strong_anti_venom_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_strong_anti_venom_SpellScript(); + } }; enum GnomishShrinkRay @@ -906,165 +912,165 @@ enum GnomishShrinkRay class spell_item_gnomish_shrink_ray : public SpellScriptLoader { - public: - spell_item_gnomish_shrink_ray() : SpellScriptLoader("spell_item_gnomish_shrink_ray") { } +public: + spell_item_gnomish_shrink_ray() : SpellScriptLoader("spell_item_gnomish_shrink_ray") { } - class spell_item_gnomish_shrink_ray_SpellScript : public SpellScript + class spell_item_gnomish_shrink_ray_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_gnomish_shrink_ray_SpellScript); + + void HandleDummy(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_item_gnomish_shrink_ray_SpellScript); - - void HandleDummy(SpellEffIndex /*effIndex*/) + Unit* caster = GetCaster(); + if (Unit* target = GetHitUnit()) { - Unit* caster = GetCaster(); - if (Unit* target = GetHitUnit()) - { - if (urand(0, 99) < 15) - caster->CastSpell(caster, SPELL_GNOMISH_SHRINK_RAY_SELF, true, nullptr); - else - caster->CastSpell(target, SPELL_GNOMISH_SHRINK_RAY_TARGET, true, nullptr); - } + if (urand(0, 99) < 15) + caster->CastSpell(caster, SPELL_GNOMISH_SHRINK_RAY_SELF, true, nullptr); + else + caster->CastSpell(target, SPELL_GNOMISH_SHRINK_RAY_TARGET, true, nullptr); } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_gnomish_shrink_ray_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_gnomish_shrink_ray_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_gnomish_shrink_ray_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_gnomish_shrink_ray_SpellScript(); + } }; class spell_item_goblin_weather_machine : public SpellScriptLoader { - public: - spell_item_goblin_weather_machine() : SpellScriptLoader("spell_item_goblin_weather_machine") { } +public: + spell_item_goblin_weather_machine() : SpellScriptLoader("spell_item_goblin_weather_machine") { } - class spell_item_goblin_weather_machine_SpellScript : public SpellScript + class spell_item_goblin_weather_machine_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_goblin_weather_machine_SpellScript); + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_item_goblin_weather_machine_SpellScript); - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) + if (Unit* target = GetHitUnit()) { - if (Unit* target = GetHitUnit()) - { - uint32 spellId = 46736; - if (uint8 add = urand(0, 3)) - spellId += add+1; - - target->CastSpell(target, spellId, true); - } - } - - void Register() - { - if (m_scriptSpellId == 46203) - OnEffectHitTarget += SpellEffectFn(spell_item_goblin_weather_machine_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_goblin_weather_machine_SpellScript(); - } - - class spell_item_goblin_weather_machine_AuraScript : public AuraScript - { - PrepareAuraScript(spell_item_goblin_weather_machine_AuraScript); - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (roll_chance_i(50)) - return; - uint32 spellId = 46736; if (uint8 add = urand(0, 3)) - spellId += add+1; + spellId += add + 1; - GetUnitOwner()->CastSpell(GetUnitOwner(), spellId, true); + target->CastSpell(target, spellId, true); } - - void Register() - { - if (m_scriptSpellId != 46203) - AfterEffectRemove += AuraEffectRemoveFn(spell_item_goblin_weather_machine_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_item_goblin_weather_machine_AuraScript(); } + + void Register() + { + if (m_scriptSpellId == 46203) + OnEffectHitTarget += SpellEffectFn(spell_item_goblin_weather_machine_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_goblin_weather_machine_SpellScript(); + } + + class spell_item_goblin_weather_machine_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_goblin_weather_machine_AuraScript); + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (roll_chance_i(50)) + return; + + uint32 spellId = 46736; + if (uint8 add = urand(0, 3)) + spellId += add + 1; + + GetUnitOwner()->CastSpell(GetUnitOwner(), spellId, true); + } + + void Register() + { + if (m_scriptSpellId != 46203) + AfterEffectRemove += AuraEffectRemoveFn(spell_item_goblin_weather_machine_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_item_goblin_weather_machine_AuraScript(); + } }; class spell_item_light_lamp : public SpellScriptLoader { - public: - spell_item_light_lamp() : SpellScriptLoader("spell_item_light_lamp") { } +public: + spell_item_light_lamp() : SpellScriptLoader("spell_item_light_lamp") { } - class spell_item_light_lamp_SpellScript : public SpellScript + class spell_item_light_lamp_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_light_lamp_SpellScript); + + void HandleActivateObject(SpellEffIndex effIndex) { - PrepareSpellScript(spell_item_light_lamp_SpellScript); - - void HandleActivateObject(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (GameObject* go = GetHitGObj()) - go->UseDoorOrButton(); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_light_lamp_SpellScript::HandleActivateObject, EFFECT_0, SPELL_EFFECT_ACTIVATE_OBJECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_light_lamp_SpellScript(); + PreventHitDefaultEffect(effIndex); + if (GameObject* go = GetHitGObj()) + go->UseDoorOrButton(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_light_lamp_SpellScript::HandleActivateObject, EFFECT_0, SPELL_EFFECT_ACTIVATE_OBJECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_light_lamp_SpellScript(); + } }; class spell_item_fetch_ball : public SpellScriptLoader { - public: - spell_item_fetch_ball() : SpellScriptLoader("spell_item_fetch_ball") {} +public: + spell_item_fetch_ball() : SpellScriptLoader("spell_item_fetch_ball") {} - class spell_item_fetch_ball_SpellScript : public SpellScript + class spell_item_fetch_ball_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_fetch_ball_SpellScript); + + void SelectTarget(std::list& targets) { - PrepareSpellScript(spell_item_fetch_ball_SpellScript); - - void SelectTarget(std::list& targets) - { - Creature* target = nullptr; - for (std::list::const_iterator itr = targets.begin(); itr != targets.end(); ++itr) - if (Creature* creature = (*itr)->ToCreature()) - { - if (creature->GetOwnerGUID() == GetCaster()->GetOwnerGUID() && !creature->IsNonMeleeSpellCast(false) && + Creature* target = nullptr; + for (std::list::const_iterator itr = targets.begin(); itr != targets.end(); ++itr) + if (Creature* creature = (*itr)->ToCreature()) + { + if (creature->GetOwnerGUID() == GetCaster()->GetOwnerGUID() && !creature->IsNonMeleeSpellCast(false) && creature->GetMotionMaster()->GetCurrentMovementGeneratorType() != POINT_MOTION_TYPE) - { - target = creature; - break; - } + { + target = creature; + break; } + } - targets.clear(); - if (target) - targets.push_back(target); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_item_fetch_ball_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_fetch_ball_SpellScript(); + targets.clear(); + if (target) + targets.push_back(target); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_item_fetch_ball_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_fetch_ball_SpellScript(); + } }; enum oracleAblutions @@ -1077,173 +1083,173 @@ enum oracleAblutions class spell_item_oracle_ablutions : public SpellScriptLoader { - public: - spell_item_oracle_ablutions() : SpellScriptLoader("spell_item_oracle_ablutions") {} +public: + spell_item_oracle_ablutions() : SpellScriptLoader("spell_item_oracle_ablutions") {} - class spell_item_oracle_ablutions_SpellScript : public SpellScript + class spell_item_oracle_ablutions_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_oracle_ablutions_SpellScript) + + void HandleScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_item_oracle_ablutions_SpellScript) - - void HandleScriptEffect(SpellEffIndex effIndex) + PreventHitDefaultEffect(effIndex); + Unit* caster = GetCaster(); + switch (caster->getPowerType()) { - PreventHitDefaultEffect(effIndex); - Unit* caster = GetCaster(); - switch (caster->getPowerType()) - { - case POWER_RUNIC_POWER: - caster->CastSpell(caster, SPELL_ABLUTION_RUNIC, true); - break; - case POWER_MANA: + case POWER_RUNIC_POWER: + caster->CastSpell(caster, SPELL_ABLUTION_RUNIC, true); + break; + case POWER_MANA: { int32 mana = CalculatePct(caster->GetMaxPower(POWER_MANA), 5.0f); caster->CastCustomSpell(SPELL_ABLUTION_MANA, SPELLVALUE_BASE_POINT0, mana, caster, true); break; } - case POWER_RAGE: - caster->CastSpell(caster, SPELL_ABLUTION_RAGE, true); - break; - case POWER_ENERGY: - caster->CastSpell(caster, SPELL_ABLUTION_ENERGY, true); - break; - default: - break; - } + case POWER_RAGE: + caster->CastSpell(caster, SPELL_ABLUTION_RAGE, true); + break; + case POWER_ENERGY: + caster->CastSpell(caster, SPELL_ABLUTION_ENERGY, true); + break; + default: + break; } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_oracle_ablutions_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_oracle_ablutions_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_oracle_ablutions_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_oracle_ablutions_SpellScript(); + } }; class spell_item_trauma : public SpellScriptLoader { - public: - spell_item_trauma() : SpellScriptLoader("spell_item_trauma") { } +public: + spell_item_trauma() : SpellScriptLoader("spell_item_trauma") { } - class spell_item_trauma_AuraScript : public AuraScript + class spell_item_trauma_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_trauma_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_item_trauma_AuraScript); - - bool CheckProc(ProcEventInfo& eventInfo) - { - return eventInfo.GetActionTarget(); - } - - void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - GetUnitOwner()->CastSpell(eventInfo.GetActionTarget(), GetSpellInfo()->Effects[EFFECT_0].TriggerSpell, true); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_item_trauma_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_item_trauma_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_item_trauma_AuraScript(); + return eventInfo.GetActionTarget(); } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + GetUnitOwner()->CastSpell(eventInfo.GetActionTarget(), GetSpellInfo()->Effects[EFFECT_0].TriggerSpell, true); + } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_item_trauma_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_item_trauma_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_item_trauma_AuraScript(); + } }; class spell_item_blade_ward_enchant : public SpellScriptLoader { - public: - spell_item_blade_ward_enchant() : SpellScriptLoader("spell_item_blade_ward_enchant") { } +public: + spell_item_blade_ward_enchant() : SpellScriptLoader("spell_item_blade_ward_enchant") { } - class spell_item_blade_ward_enchant_AuraScript : public AuraScript + class spell_item_blade_ward_enchant_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_blade_ward_enchant_AuraScript); + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_item_blade_ward_enchant_AuraScript); - - void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - const SpellInfo* spellInfo = sSpellMgr->GetSpellInfo(64442 /*SPELL_BLADE_WARDING*/); - int32 basepoints = spellInfo->Effects[EFFECT_0].CalcValue() * this->GetStackAmount(); - eventInfo.GetActionTarget()->CastCustomSpell(spellInfo->Id, SPELLVALUE_BASE_POINT0, basepoints, eventInfo.GetActor(), true); - } - - void Register() - { - OnEffectProc += AuraEffectProcFn(spell_item_blade_ward_enchant_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_PROC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_item_blade_ward_enchant_AuraScript(); + PreventDefaultAction(); + const SpellInfo* spellInfo = sSpellMgr->GetSpellInfo(64442 /*SPELL_BLADE_WARDING*/); + int32 basepoints = spellInfo->Effects[EFFECT_0].CalcValue() * this->GetStackAmount(); + eventInfo.GetActionTarget()->CastCustomSpell(spellInfo->Id, SPELLVALUE_BASE_POINT0, basepoints, eventInfo.GetActor(), true); } + + void Register() + { + OnEffectProc += AuraEffectProcFn(spell_item_blade_ward_enchant_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_item_blade_ward_enchant_AuraScript(); + } }; class spell_item_blood_draining_enchant : public SpellScriptLoader { - public: - spell_item_blood_draining_enchant() : SpellScriptLoader("spell_item_blood_draining_enchant") { } +public: + spell_item_blood_draining_enchant() : SpellScriptLoader("spell_item_blood_draining_enchant") { } - class spell_item_blood_draining_enchant_AuraScript : public AuraScript + class spell_item_blood_draining_enchant_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_blood_draining_enchant_AuraScript); + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_item_blood_draining_enchant_AuraScript); + PreventDefaultAction(); + if ((eventInfo.GetActionTarget()->GetHealth() - eventInfo.GetDamageInfo()->GetDamage()) >= eventInfo.GetActionTarget()->CountPctFromMaxHealth(35)) + return; - void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - if ((eventInfo.GetActionTarget()->GetHealth() - eventInfo.GetDamageInfo()->GetDamage()) >= eventInfo.GetActionTarget()->CountPctFromMaxHealth(35)) - return; - - const SpellInfo* spellInfo = sSpellMgr->GetSpellInfo(64569 /*SPELL_BLOOD_RESERVE*/); - int32 basepoints = spellInfo->Effects[EFFECT_0].CalcValue() * this->GetStackAmount(); - eventInfo.GetActionTarget()->CastCustomSpell(spellInfo->Id, SPELLVALUE_BASE_POINT0, basepoints, eventInfo.GetActionTarget(), true); - eventInfo.GetActionTarget()->RemoveAurasDueToSpell(GetSpellInfo()->Id); // Remove rest auras - } - - void Register() - { - OnEffectProc += AuraEffectProcFn(spell_item_blood_draining_enchant_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_item_blood_draining_enchant_AuraScript(); + const SpellInfo* spellInfo = sSpellMgr->GetSpellInfo(64569 /*SPELL_BLOOD_RESERVE*/); + int32 basepoints = spellInfo->Effects[EFFECT_0].CalcValue() * this->GetStackAmount(); + eventInfo.GetActionTarget()->CastCustomSpell(spellInfo->Id, SPELLVALUE_BASE_POINT0, basepoints, eventInfo.GetActionTarget(), true); + eventInfo.GetActionTarget()->RemoveAurasDueToSpell(GetSpellInfo()->Id); // Remove rest auras } + + void Register() + { + OnEffectProc += AuraEffectProcFn(spell_item_blood_draining_enchant_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_item_blood_draining_enchant_AuraScript(); + } }; class spell_item_dragon_kite_summon_lightning_bunny : public SpellScriptLoader { - public: - spell_item_dragon_kite_summon_lightning_bunny() : SpellScriptLoader("spell_item_dragon_kite_summon_lightning_bunny") { } +public: + spell_item_dragon_kite_summon_lightning_bunny() : SpellScriptLoader("spell_item_dragon_kite_summon_lightning_bunny") { } - class spell_item_dragon_kite_summon_lightning_bunny_SpellScript : public SpellScript + class spell_item_dragon_kite_summon_lightning_bunny_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_dragon_kite_summon_lightning_bunny_SpellScript); + + void SetDest(SpellDestination& dest) { - PrepareSpellScript(spell_item_dragon_kite_summon_lightning_bunny_SpellScript); - - void SetDest(SpellDestination& dest) - { - // Adjust effect summon position - Position const offset = { 3.0f, 3.0f, 20.0f, 0.0f }; - dest.Relocate(*GetCaster()); - dest.RelocateOffset(offset); - } - - void Register() - { - OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_item_dragon_kite_summon_lightning_bunny_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER_RANDOM); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_dragon_kite_summon_lightning_bunny_SpellScript(); + // Adjust effect summon position + Position const offset = { 3.0f, 3.0f, 20.0f, 0.0f }; + dest.Relocate(*GetCaster()); + dest.RelocateOffset(offset); } + + void Register() + { + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_item_dragon_kite_summon_lightning_bunny_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER_RANDOM); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_dragon_kite_summon_lightning_bunny_SpellScript(); + } }; class spell_item_enchanted_broom_periodic : public SpellScriptLoader @@ -1266,7 +1272,7 @@ public: } else { - GetTarget()->CastSpell(GetTarget(), GetId()-1, true); + GetTarget()->CastSpell(GetTarget(), GetId() - 1, true); GetTarget()->GetMotionMaster()->Clear(false); GetTarget()->GetMotionMaster()->MoveRandom(5.0f); } @@ -1287,36 +1293,36 @@ public: class spell_item_summon_or_dismiss : public SpellScriptLoader { - public: - spell_item_summon_or_dismiss() : SpellScriptLoader("spell_item_summon_or_dismiss") { } +public: + spell_item_summon_or_dismiss() : SpellScriptLoader("spell_item_summon_or_dismiss") { } - class spell_item_summon_or_dismiss_SpellScript : public SpellScript + class spell_item_summon_or_dismiss_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_summon_or_dismiss_SpellScript); + + void HandleSummon(SpellEffIndex effIndex) { - PrepareSpellScript(spell_item_summon_or_dismiss_SpellScript); - - void HandleSummon(SpellEffIndex effIndex) + for (Unit::ControlSet::iterator itr = GetCaster()->m_Controlled.begin(); itr != GetCaster()->m_Controlled.end(); ++itr) { - for (Unit::ControlSet::iterator itr = GetCaster()->m_Controlled.begin(); itr != GetCaster()->m_Controlled.end(); ++itr) + if (GetSpellInfo()->Effects[effIndex].MiscValue >= 0 && (*itr)->GetEntry() == uint32(GetSpellInfo()->Effects[effIndex].MiscValue)) { - if (GetSpellInfo()->Effects[effIndex].MiscValue >= 0 && (*itr)->GetEntry() == uint32(GetSpellInfo()->Effects[effIndex].MiscValue)) - { - (*itr)->ToTempSummon()->UnSummon(); - PreventHitDefaultEffect(effIndex); - return; - } + (*itr)->ToTempSummon()->UnSummon(); + PreventHitDefaultEffect(effIndex); + return; } } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_item_summon_or_dismiss_SpellScript::HandleSummon, EFFECT_ALL, SPELL_EFFECT_SUMMON); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_summon_or_dismiss_SpellScript; } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_item_summon_or_dismiss_SpellScript::HandleSummon, EFFECT_ALL, SPELL_EFFECT_SUMMON); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_summon_or_dismiss_SpellScript; + } }; enum eDreanicPaleAle @@ -1326,49 +1332,49 @@ enum eDreanicPaleAle class spell_item_draenic_pale_ale : public SpellScriptLoader { - public: - spell_item_draenic_pale_ale() : SpellScriptLoader("spell_item_draenic_pale_ale") { } +public: + spell_item_draenic_pale_ale() : SpellScriptLoader("spell_item_draenic_pale_ale") { } - class spell_item_draenic_pale_ale_SpellScript : public SpellScript + class spell_item_draenic_pale_ale_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_draenic_pale_ale_SpellScript); + + void HandleSummon(SpellEffIndex effIndex) { - PrepareSpellScript(spell_item_draenic_pale_ale_SpellScript); + PreventHitDefaultEffect(effIndex); + if (roll_chance_i(70)) + return; - void HandleSummon(SpellEffIndex effIndex) + GetCaster()->CastSpell(GetCaster(), SPELL_PINK_ELEKK, true); + + float radius = GetSpellInfo()->Effects[effIndex].CalcRadius(); + for (uint8 count = 0; count < GetEffectValue(); ++count) { - PreventHitDefaultEffect(effIndex); - if (roll_chance_i(70)) - return; + Position pos = *GetCaster(); + GetCaster()->GetClosePoint(pos.m_positionX, pos.m_positionY, pos.m_positionZ, pos.m_orientation, radius, M_PI - 1.2f + 0.3f * urand(0, 8)); + Creature* summon = GetCaster()->SummonCreature(GetSpellInfo()->Effects[effIndex].MiscValue, pos, TEMPSUMMON_TIMED_DESPAWN, GetSpellInfo()->GetDuration()); + if (!summon) + continue; - GetCaster()->CastSpell(GetCaster(), SPELL_PINK_ELEKK, true); - - float radius = GetSpellInfo()->Effects[effIndex].CalcRadius(); - for (uint8 count = 0; count < GetEffectValue(); ++count) - { - Position pos = *GetCaster(); - GetCaster()->GetClosePoint(pos.m_positionX, pos.m_positionY, pos.m_positionZ, pos.m_orientation, radius, M_PI - 1.2f + 0.3f * urand(0, 8)); - Creature* summon = GetCaster()->SummonCreature(GetSpellInfo()->Effects[effIndex].MiscValue, pos, TEMPSUMMON_TIMED_DESPAWN, GetSpellInfo()->GetDuration()); - if (!summon) - continue; - - summon->SetOwnerGUID(GetCaster()->GetGUID()); - summon->setFaction(GetCaster()->getFaction()); - summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); - summon->SetReactState(REACT_PASSIVE); - summon->GetMotionMaster()->MoveFollow(GetCaster(), PET_FOLLOW_DIST, GetCaster()->GetAngle(summon), MOTION_SLOT_CONTROLLED); - GetSpell()->ExecuteLogEffectSummonObject(effIndex, summon); - } + summon->SetOwnerGUID(GetCaster()->GetGUID()); + summon->setFaction(GetCaster()->getFaction()); + summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + summon->SetReactState(REACT_PASSIVE); + summon->GetMotionMaster()->MoveFollow(GetCaster(), PET_FOLLOW_DIST, GetCaster()->GetAngle(summon), MOTION_SLOT_CONTROLLED); + GetSpell()->ExecuteLogEffectSummonObject(effIndex, summon); } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_item_draenic_pale_ale_SpellScript::HandleSummon, EFFECT_0, SPELL_EFFECT_SUMMON); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_draenic_pale_ale_SpellScript; } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_item_draenic_pale_ale_SpellScript::HandleSummon, EFFECT_0, SPELL_EFFECT_SUMMON); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_draenic_pale_ale_SpellScript; + } }; enum eMoleMachine @@ -1378,55 +1384,55 @@ enum eMoleMachine class spell_item_direbrew_remote : public SpellScriptLoader { - public: - spell_item_direbrew_remote() : SpellScriptLoader("spell_item_direbrew_remote") { } +public: + spell_item_direbrew_remote() : SpellScriptLoader("spell_item_direbrew_remote") { } - class spell_item_direbrew_remote_AuraScript : public AuraScript + class spell_item_direbrew_remote_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_direbrew_remote_AuraScript); + + void HandlePeriodicTick(AuraEffect const* aurEff) { - PrepareAuraScript(spell_item_direbrew_remote_AuraScript); - - void HandlePeriodicTick(AuraEffect const* aurEff) + PreventDefaultAction(); + if (aurEff->GetTickNumber() >= 2) { - PreventDefaultAction(); - if (aurEff->GetTickNumber() >= 2) - { - SetDuration(0); - GetTarget()->CastSpell(GetTarget(), SPELL_MOLE_MACHINE_PORT_TO_GRIM_GUZZLER, true); - } + SetDuration(0); + GetTarget()->CastSpell(GetTarget(), SPELL_MOLE_MACHINE_PORT_TO_GRIM_GUZZLER, true); } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_item_direbrew_remote_AuraScript::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_item_direbrew_remote_AuraScript(); } - class spell_item_direbrew_remote_SpellScript : public SpellScript + void Register() { - PrepareSpellScript(spell_item_direbrew_remote_SpellScript) - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - target->HandleEmoteCommand(EMOTE_ONESHOT_WAVE); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_direbrew_remote_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_direbrew_remote_SpellScript(); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_item_direbrew_remote_AuraScript::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); } + }; + + AuraScript* GetAuraScript() const + { + return new spell_item_direbrew_remote_AuraScript(); + } + + class spell_item_direbrew_remote_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_direbrew_remote_SpellScript) + + void HandleScriptEffect(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) + target->HandleEmoteCommand(EMOTE_ONESHOT_WAVE); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_direbrew_remote_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_direbrew_remote_SpellScript(); + } }; enum EyeOfGruul @@ -1440,61 +1446,61 @@ enum EyeOfGruul // 37705 - Healing Discount class spell_item_eye_of_gruul_healing_discount : public SpellScriptLoader { - public: - spell_item_eye_of_gruul_healing_discount() : SpellScriptLoader("spell_item_eye_of_gruul_healing_discount") { } +public: + spell_item_eye_of_gruul_healing_discount() : SpellScriptLoader("spell_item_eye_of_gruul_healing_discount") { } - class spell_item_eye_of_gruul_healing_discount_AuraScript : public AuraScript + class spell_item_eye_of_gruul_healing_discount_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_eye_of_gruul_healing_discount_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_item_eye_of_gruul_healing_discount_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_ITEM_HEALING_TRANCE) + if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_ITEM_HEALING_TRANCE) || !sSpellMgr->GetSpellInfo(SPELL_PALADIN_ITEM_HEALING_TRANCE) || !sSpellMgr->GetSpellInfo(SPELL_PRIEST_ITEM_HEALING_TRANCE) || !sSpellMgr->GetSpellInfo(SPELL_SHAMAN_ITEM_HEALING_TRANCE)) - return false; - return true; - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) - { - PreventDefaultAction(); - if (Unit* unitTarget = GetTarget()) - { - uint32 spell_id = 0; - switch (unitTarget->getClass()) - { - case CLASS_DRUID: - spell_id = SPELL_DRUID_ITEM_HEALING_TRANCE; - break; - case CLASS_PALADIN: - spell_id = SPELL_PALADIN_ITEM_HEALING_TRANCE; - break; - case CLASS_PRIEST: - spell_id = SPELL_PRIEST_ITEM_HEALING_TRANCE; - break; - case CLASS_SHAMAN: - spell_id = SPELL_SHAMAN_ITEM_HEALING_TRANCE; - break; - default: - return; // ignore for non-healing classes - } - - unitTarget->CastSpell(unitTarget, spell_id, true, NULL, aurEff); - } - } - - void Register() - { - OnEffectProc += AuraEffectProcFn(spell_item_eye_of_gruul_healing_discount_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_item_eye_of_gruul_healing_discount_AuraScript(); + return false; + return true; } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + if (Unit* unitTarget = GetTarget()) + { + uint32 spell_id = 0; + switch (unitTarget->getClass()) + { + case CLASS_DRUID: + spell_id = SPELL_DRUID_ITEM_HEALING_TRANCE; + break; + case CLASS_PALADIN: + spell_id = SPELL_PALADIN_ITEM_HEALING_TRANCE; + break; + case CLASS_PRIEST: + spell_id = SPELL_PRIEST_ITEM_HEALING_TRANCE; + break; + case CLASS_SHAMAN: + spell_id = SPELL_SHAMAN_ITEM_HEALING_TRANCE; + break; + default: + return; // ignore for non-healing classes + } + + unitTarget->CastSpell(unitTarget, spell_id, true, NULL, aurEff); + } + } + + void Register() + { + OnEffectProc += AuraEffectProcFn(spell_item_eye_of_gruul_healing_discount_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_item_eye_of_gruul_healing_discount_AuraScript(); + } }; enum eArgentKnight @@ -1504,85 +1510,85 @@ enum eArgentKnight class spell_item_summon_argent_knight : public SpellScriptLoader { - public: - spell_item_summon_argent_knight() : SpellScriptLoader("spell_item_summon_argent_knight") { } +public: + spell_item_summon_argent_knight() : SpellScriptLoader("spell_item_summon_argent_knight") { } - class spell_item_summon_argent_knight_SpellScript : public SpellScript + class spell_item_summon_argent_knight_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_summon_argent_knight_SpellScript); + + void HandleOnEffectHit(SpellEffIndex effIndex) { - PrepareSpellScript(spell_item_summon_argent_knight_SpellScript); - - void HandleOnEffectHit(SpellEffIndex effIndex) + if (Unit* caster = GetCaster()) { - if (Unit* caster = GetCaster()) + if (caster->GetTypeId() == TYPEID_PLAYER) { - if (caster->GetTypeId() == TYPEID_PLAYER) + // summoning the "Argent Knight (Horde)" is default for spell 54307; + if (caster->ToPlayer()->GetTeamId() == TEAM_ALLIANCE) { - // summoning the "Argent Knight (Horde)" is default for spell 54307; - if (caster->ToPlayer()->GetTeamId() == TEAM_ALLIANCE) - { - // prevent default summoning and summon "Argent Knight (Alliance)" instead - PreventHitDefaultEffect(effIndex); - caster->CastSpell(caster, SPELL_SUMMON_ARGENT_KNIGHT_ALLIANCE, true); - } + // prevent default summoning and summon "Argent Knight (Alliance)" instead + PreventHitDefaultEffect(effIndex); + caster->CastSpell(caster, SPELL_SUMMON_ARGENT_KNIGHT_ALLIANCE, true); } } } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_item_summon_argent_knight_SpellScript::HandleOnEffectHit, EFFECT_0, SPELL_EFFECT_SUMMON); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_summon_argent_knight_SpellScript(); } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_item_summon_argent_knight_SpellScript::HandleOnEffectHit, EFFECT_0, SPELL_EFFECT_SUMMON); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_summon_argent_knight_SpellScript(); + } }; // Theirs // Generic script for handling item dummy effects which trigger another spell. class spell_item_trigger_spell : public SpellScriptLoader { +private: + uint32 _triggeredSpellId; + +public: + spell_item_trigger_spell(const char* name, uint32 triggeredSpellId) : SpellScriptLoader(name), _triggeredSpellId(triggeredSpellId) { } + + class spell_item_trigger_spell_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_trigger_spell_SpellScript); private: uint32 _triggeredSpellId; public: - spell_item_trigger_spell(const char* name, uint32 triggeredSpellId) : SpellScriptLoader(name), _triggeredSpellId(triggeredSpellId) { } + spell_item_trigger_spell_SpellScript(uint32 triggeredSpellId) : SpellScript(), _triggeredSpellId(triggeredSpellId) { } - class spell_item_trigger_spell_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_item_trigger_spell_SpellScript); - private: - uint32 _triggeredSpellId; - - public: - spell_item_trigger_spell_SpellScript(uint32 triggeredSpellId) : SpellScript(), _triggeredSpellId(triggeredSpellId) { } - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(_triggeredSpellId)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - if (Item* item = GetCastItem()) - caster->CastSpell(caster, _triggeredSpellId, true, item); - } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_item_trigger_spell_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_trigger_spell_SpellScript(_triggeredSpellId); + if (!sSpellMgr->GetSpellInfo(_triggeredSpellId)) + return false; + return true; } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (Item* item = GetCastItem()) + caster->CastSpell(caster, _triggeredSpellId, true, item); + } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_item_trigger_spell_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_trigger_spell_SpellScript(_triggeredSpellId); + } }; enum AegisOfPreservation @@ -1593,65 +1599,65 @@ enum AegisOfPreservation // 23780 - Aegis of Preservation class spell_item_aegis_of_preservation : public SpellScriptLoader { - public: - spell_item_aegis_of_preservation() : SpellScriptLoader("spell_item_aegis_of_preservation") { } +public: + spell_item_aegis_of_preservation() : SpellScriptLoader("spell_item_aegis_of_preservation") { } - class spell_item_aegis_of_preservation_AuraScript : public AuraScript + class spell_item_aegis_of_preservation_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_aegis_of_preservation_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_item_aegis_of_preservation_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_AEGIS_HEAL)) - return false; - return true; - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) - { - PreventDefaultAction(); - GetTarget()->CastSpell(GetTarget(), SPELL_AEGIS_HEAL, true, NULL, aurEff); - } - - void Register() - { - OnEffectProc += AuraEffectProcFn(spell_item_aegis_of_preservation_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_PROC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_item_aegis_of_preservation_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_AEGIS_HEAL)) + return false; + return true; } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + GetTarget()->CastSpell(GetTarget(), SPELL_AEGIS_HEAL, true, NULL, aurEff); + } + + void Register() + { + OnEffectProc += AuraEffectProcFn(spell_item_aegis_of_preservation_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_item_aegis_of_preservation_AuraScript(); + } }; // 26400 - Arcane Shroud class spell_item_arcane_shroud : public SpellScriptLoader { - public: - spell_item_arcane_shroud() : SpellScriptLoader("spell_item_arcane_shroud") { } +public: + spell_item_arcane_shroud() : SpellScriptLoader("spell_item_arcane_shroud") { } - class spell_item_arcane_shroud_AuraScript : public AuraScript + class spell_item_arcane_shroud_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_arcane_shroud_AuraScript); + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) { - PrepareAuraScript(spell_item_arcane_shroud_AuraScript); - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - int32 diff = GetUnitOwner()->getLevel() - 60; - if (diff > 0) - amount += 2 * diff; - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_item_arcane_shroud_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_THREAT); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_item_arcane_shroud_AuraScript(); + int32 diff = GetUnitOwner()->getLevel() - 60; + if (diff > 0) + amount += 2 * diff; } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_item_arcane_shroud_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_THREAT); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_item_arcane_shroud_AuraScript(); + } }; // 64415 - Val'anyr Hammer of Ancient Kings - Equip Effect @@ -1695,54 +1701,54 @@ enum BlessingOfAncientKings class spell_item_blessing_of_ancient_kings : public SpellScriptLoader { - public: - spell_item_blessing_of_ancient_kings() : SpellScriptLoader("spell_item_blessing_of_ancient_kings") { } +public: + spell_item_blessing_of_ancient_kings() : SpellScriptLoader("spell_item_blessing_of_ancient_kings") { } - class spell_item_blessing_of_ancient_kings_AuraScript : public AuraScript + class spell_item_blessing_of_ancient_kings_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_blessing_of_ancient_kings_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_item_blessing_of_ancient_kings_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_PROTECTION_OF_ANCIENT_KINGS)) - return false; - return true; - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - return eventInfo.GetProcTarget(); - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - - int32 absorb = int32(CalculatePct(eventInfo.GetHealInfo()->GetHeal(), 15.0f)); - // xinef: all heals contribute to one bubble - if (AuraEffect* protEff = eventInfo.GetProcTarget()->GetAuraEffect(SPELL_PROTECTION_OF_ANCIENT_KINGS, 0/*, eventInfo.GetActor()->GetGUID()*/)) - { - // The shield can grow to a maximum size of 20,000 damage absorbtion - protEff->SetAmount(std::min(protEff->GetAmount() + absorb, 20000)); - - // Refresh and return to prevent replacing the aura - protEff->GetBase()->RefreshDuration(); - } - else - GetTarget()->CastCustomSpell(SPELL_PROTECTION_OF_ANCIENT_KINGS, SPELLVALUE_BASE_POINT0, absorb, eventInfo.GetProcTarget(), true, NULL, aurEff); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_item_blessing_of_ancient_kings_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_item_blessing_of_ancient_kings_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_item_blessing_of_ancient_kings_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_PROTECTION_OF_ANCIENT_KINGS)) + return false; + return true; } + + bool CheckProc(ProcEventInfo& eventInfo) + { + return eventInfo.GetProcTarget(); + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + int32 absorb = int32(CalculatePct(eventInfo.GetHealInfo()->GetHeal(), 15.0f)); + // xinef: all heals contribute to one bubble + if (AuraEffect* protEff = eventInfo.GetProcTarget()->GetAuraEffect(SPELL_PROTECTION_OF_ANCIENT_KINGS, 0/*, eventInfo.GetActor()->GetGUID()*/)) + { + // The shield can grow to a maximum size of 20,000 damage absorbtion + protEff->SetAmount(std::min(protEff->GetAmount() + absorb, 20000)); + + // Refresh and return to prevent replacing the aura + protEff->GetBase()->RefreshDuration(); + } + else + GetTarget()->CastCustomSpell(SPELL_PROTECTION_OF_ANCIENT_KINGS, SPELLVALUE_BASE_POINT0, absorb, eventInfo.GetProcTarget(), true, NULL, aurEff); + } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_item_blessing_of_ancient_kings_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_item_blessing_of_ancient_kings_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_item_blessing_of_ancient_kings_AuraScript(); + } }; // 8342 - Defibrillate (Goblin Jumper Cables) have 33% chance on success @@ -1756,51 +1762,51 @@ enum Defibrillate class spell_item_defibrillate : public SpellScriptLoader { +public: + spell_item_defibrillate(char const* name, uint8 chance, uint32 failSpell = 0) : SpellScriptLoader(name), _chance(chance), _failSpell(failSpell) { } + + class spell_item_defibrillate_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_defibrillate_SpellScript); + public: - spell_item_defibrillate(char const* name, uint8 chance, uint32 failSpell = 0) : SpellScriptLoader(name), _chance(chance), _failSpell(failSpell) { } + spell_item_defibrillate_SpellScript(uint8 chance, uint32 failSpell) : SpellScript(), _chance(chance), _failSpell(failSpell) { } - class spell_item_defibrillate_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_item_defibrillate_SpellScript); + if (_failSpell && !sSpellMgr->GetSpellInfo(_failSpell)) + return false; + return true; + } - public: - spell_item_defibrillate_SpellScript(uint8 chance, uint32 failSpell) : SpellScript(), _chance(chance), _failSpell(failSpell) { } - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (_failSpell && !sSpellMgr->GetSpellInfo(_failSpell)) - return false; - return true; - } - - void HandleScript(SpellEffIndex effIndex) - { - if (roll_chance_i(_chance)) - { - PreventHitDefaultEffect(effIndex); - if (_failSpell) - GetCaster()->CastSpell(GetCaster(), _failSpell, true, GetCastItem()); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_defibrillate_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_RESURRECT); - } - - private: - uint8 _chance; - uint32 _failSpell; - }; - - SpellScript* GetSpellScript() const + void HandleScript(SpellEffIndex effIndex) { - return new spell_item_defibrillate_SpellScript(_chance, _failSpell); + if (roll_chance_i(_chance)) + { + PreventHitDefaultEffect(effIndex); + if (_failSpell) + GetCaster()->CastSpell(GetCaster(), _failSpell, true, GetCastItem()); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_defibrillate_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_RESURRECT); } private: uint8 _chance; uint32 _failSpell; + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_defibrillate_SpellScript(_chance, _failSpell); + } + +private: + uint8 _chance; + uint32 _failSpell; }; enum DesperateDefense @@ -1811,36 +1817,36 @@ enum DesperateDefense // 33896 - Desperate Defense class spell_item_desperate_defense : public SpellScriptLoader { - public: - spell_item_desperate_defense() : SpellScriptLoader("spell_item_desperate_defense") { } +public: + spell_item_desperate_defense() : SpellScriptLoader("spell_item_desperate_defense") { } - class spell_item_desperate_defense_AuraScript : public AuraScript + class spell_item_desperate_defense_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_desperate_defense_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_item_desperate_defense_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_DESPERATE_RAGE)) - return false; - return true; - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) - { - PreventDefaultAction(); - GetTarget()->CastSpell(GetTarget(), SPELL_DESPERATE_RAGE, true, NULL, aurEff); - } - - void Register() - { - OnEffectProc += AuraEffectProcFn(spell_item_desperate_defense_AuraScript::HandleProc, EFFECT_2, SPELL_AURA_PROC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_item_desperate_defense_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_DESPERATE_RAGE)) + return false; + return true; } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + GetTarget()->CastSpell(GetTarget(), SPELL_DESPERATE_RAGE, true, NULL, aurEff); + } + + void Register() + { + OnEffectProc += AuraEffectProcFn(spell_item_desperate_defense_AuraScript::HandleProc, EFFECT_2, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_item_desperate_defense_AuraScript(); + } }; // http://www.wowhead.com/item=6522 Deviate Fish @@ -1856,77 +1862,77 @@ enum DeviateFishSpells class spell_item_deviate_fish : public SpellScriptLoader { - public: - spell_item_deviate_fish() : SpellScriptLoader("spell_item_deviate_fish") { } +public: + spell_item_deviate_fish() : SpellScriptLoader("spell_item_deviate_fish") { } - class spell_item_deviate_fish_SpellScript : public SpellScript + class spell_item_deviate_fish_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_deviate_fish_SpellScript); + + bool Load() { - PrepareSpellScript(spell_item_deviate_fish_SpellScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - bool Validate(SpellInfo const* /*spellInfo*/) - { - for (uint32 spellId = SPELL_SLEEPY; spellId <= SPELL_HEALTHY_SPIRIT; ++spellId) - if (!sSpellMgr->GetSpellInfo(spellId)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - uint32 spellId = urand(SPELL_SLEEPY, SPELL_HEALTHY_SPIRIT); - caster->CastSpell(caster, spellId, true, nullptr); - } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_item_deviate_fish_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_deviate_fish_SpellScript(); + return GetCaster()->GetTypeId() == TYPEID_PLAYER; } + + bool Validate(SpellInfo const* /*spellInfo*/) + { + for (uint32 spellId = SPELL_SLEEPY; spellId <= SPELL_HEALTHY_SPIRIT; ++spellId) + if (!sSpellMgr->GetSpellInfo(spellId)) + return false; + return true; + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + uint32 spellId = urand(SPELL_SLEEPY, SPELL_HEALTHY_SPIRIT); + caster->CastSpell(caster, spellId, true, nullptr); + } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_item_deviate_fish_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_deviate_fish_SpellScript(); + } }; // 71610, 71641 - Echoes of Light (Althor's Abacus) class spell_item_echoes_of_light : public SpellScriptLoader { - public: - spell_item_echoes_of_light() : SpellScriptLoader("spell_item_echoes_of_light") { } +public: + spell_item_echoes_of_light() : SpellScriptLoader("spell_item_echoes_of_light") { } - class spell_item_echoes_of_light_SpellScript : public SpellScript + class spell_item_echoes_of_light_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_echoes_of_light_SpellScript); + + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_item_echoes_of_light_SpellScript); + if (targets.size() < 2) + return; - void FilterTargets(std::list& targets) - { - if (targets.size() < 2) - return; + targets.sort(acore::HealthPctOrderPred()); - targets.sort(acore::HealthPctOrderPred()); - - WorldObject* target = targets.front(); - targets.clear(); - targets.push_back(target); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_item_echoes_of_light_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_echoes_of_light_SpellScript(); + WorldObject* target = targets.front(); + targets.clear(); + targets.push_back(target); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_item_echoes_of_light_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_echoes_of_light_SpellScript(); + } }; // 7434 - Fate Rune of Unsurpassed Vigor @@ -1937,35 +1943,35 @@ enum FateRuneOfUnsurpassedVigor class spell_item_fate_rune_of_unsurpassed_vigor : public SpellScriptLoader { - public: - spell_item_fate_rune_of_unsurpassed_vigor() : SpellScriptLoader("spell_item_fate_rune_of_unsurpassed_vigor") { } +public: + spell_item_fate_rune_of_unsurpassed_vigor() : SpellScriptLoader("spell_item_fate_rune_of_unsurpassed_vigor") { } - class spell_item_fate_rune_of_unsurpassed_vigor_AuraScript : public AuraScript + class spell_item_fate_rune_of_unsurpassed_vigor_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_fate_rune_of_unsurpassed_vigor_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_item_fate_rune_of_unsurpassed_vigor_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_UNSURPASSED_VIGOR)) - return false; - return true; - } - - void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) - { - GetTarget()->CastSpell(GetTarget(), SPELL_UNSURPASSED_VIGOR, true); - } - - void Register() - { - OnEffectProc += AuraEffectProcFn(spell_item_fate_rune_of_unsurpassed_vigor_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_item_fate_rune_of_unsurpassed_vigor_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_UNSURPASSED_VIGOR)) + return false; + return true; } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) + { + GetTarget()->CastSpell(GetTarget(), SPELL_UNSURPASSED_VIGOR, true); + } + + void Register() + { + OnEffectProc += AuraEffectProcFn(spell_item_fate_rune_of_unsurpassed_vigor_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_item_fate_rune_of_unsurpassed_vigor_AuraScript(); + } }; // http://www.wowhead.com/item=47499 Flask of the North @@ -1979,63 +1985,63 @@ enum FlaskOfTheNorthSpells class spell_item_flask_of_the_north : public SpellScriptLoader { - public: - spell_item_flask_of_the_north() : SpellScriptLoader("spell_item_flask_of_the_north") { } +public: + spell_item_flask_of_the_north() : SpellScriptLoader("spell_item_flask_of_the_north") { } - class spell_item_flask_of_the_north_SpellScript : public SpellScript + class spell_item_flask_of_the_north_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_flask_of_the_north_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_item_flask_of_the_north_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_FLASK_OF_THE_NORTH_SP) || !sSpellMgr->GetSpellInfo(SPELL_FLASK_OF_THE_NORTH_AP) || !sSpellMgr->GetSpellInfo(SPELL_FLASK_OF_THE_NORTH_STR)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - std::vector possibleSpells; - switch (caster->getClass()) - { - case CLASS_WARLOCK: - case CLASS_MAGE: - case CLASS_PRIEST: - possibleSpells.push_back(SPELL_FLASK_OF_THE_NORTH_SP); - break; - case CLASS_DEATH_KNIGHT: - case CLASS_WARRIOR: - possibleSpells.push_back(SPELL_FLASK_OF_THE_NORTH_STR); - break; - case CLASS_ROGUE: - case CLASS_HUNTER: - possibleSpells.push_back(SPELL_FLASK_OF_THE_NORTH_AP); - break; - case CLASS_DRUID: - case CLASS_PALADIN: - possibleSpells.push_back(SPELL_FLASK_OF_THE_NORTH_SP); - possibleSpells.push_back(SPELL_FLASK_OF_THE_NORTH_STR); - break; - case CLASS_SHAMAN: - possibleSpells.push_back(SPELL_FLASK_OF_THE_NORTH_SP); - possibleSpells.push_back(SPELL_FLASK_OF_THE_NORTH_AP); - break; - } - - caster->CastSpell(caster, possibleSpells[irand(0, (possibleSpells.size() - 1))], true, nullptr); - } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_item_flask_of_the_north_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_flask_of_the_north_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_FLASK_OF_THE_NORTH_SP) || !sSpellMgr->GetSpellInfo(SPELL_FLASK_OF_THE_NORTH_AP) || !sSpellMgr->GetSpellInfo(SPELL_FLASK_OF_THE_NORTH_STR)) + return false; + return true; } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + std::vector possibleSpells; + switch (caster->getClass()) + { + case CLASS_WARLOCK: + case CLASS_MAGE: + case CLASS_PRIEST: + possibleSpells.push_back(SPELL_FLASK_OF_THE_NORTH_SP); + break; + case CLASS_DEATH_KNIGHT: + case CLASS_WARRIOR: + possibleSpells.push_back(SPELL_FLASK_OF_THE_NORTH_STR); + break; + case CLASS_ROGUE: + case CLASS_HUNTER: + possibleSpells.push_back(SPELL_FLASK_OF_THE_NORTH_AP); + break; + case CLASS_DRUID: + case CLASS_PALADIN: + possibleSpells.push_back(SPELL_FLASK_OF_THE_NORTH_SP); + possibleSpells.push_back(SPELL_FLASK_OF_THE_NORTH_STR); + break; + case CLASS_SHAMAN: + possibleSpells.push_back(SPELL_FLASK_OF_THE_NORTH_SP); + possibleSpells.push_back(SPELL_FLASK_OF_THE_NORTH_AP); + break; + } + + caster->CastSpell(caster, possibleSpells[irand(0, (possibleSpells.size() - 1))], true, nullptr); + } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_item_flask_of_the_north_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_flask_of_the_north_SpellScript(); + } }; // http://www.wowhead.com/item=10645 Gnomish Death Ray @@ -2048,42 +2054,42 @@ enum GnomishDeathRay class spell_item_gnomish_death_ray : public SpellScriptLoader { - public: - spell_item_gnomish_death_ray() : SpellScriptLoader("spell_item_gnomish_death_ray") { } +public: + spell_item_gnomish_death_ray() : SpellScriptLoader("spell_item_gnomish_death_ray") { } - class spell_item_gnomish_death_ray_SpellScript : public SpellScript + class spell_item_gnomish_death_ray_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_gnomish_death_ray_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_item_gnomish_death_ray_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_GNOMISH_DEATH_RAY_SELF) || !sSpellMgr->GetSpellInfo(SPELL_GNOMISH_DEATH_RAY_TARGET)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - if (Unit* target = GetHitUnit()) - { - if (urand(0, 99) < 15) - caster->CastSpell(caster, SPELL_GNOMISH_DEATH_RAY_SELF, true, nullptr); // failure - else - caster->CastSpell(target, SPELL_GNOMISH_DEATH_RAY_TARGET, true, nullptr); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_gnomish_death_ray_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_gnomish_death_ray_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_GNOMISH_DEATH_RAY_SELF) || !sSpellMgr->GetSpellInfo(SPELL_GNOMISH_DEATH_RAY_TARGET)) + return false; + return true; } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (Unit* target = GetHitUnit()) + { + if (urand(0, 99) < 15) + caster->CastSpell(caster, SPELL_GNOMISH_DEATH_RAY_SELF, true, nullptr); // failure + else + caster->CastSpell(target, SPELL_GNOMISH_DEATH_RAY_TARGET, true, nullptr); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_gnomish_death_ray_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_gnomish_death_ray_SpellScript(); + } }; // http://www.wowhead.com/item=27388 Mr. Pinchy @@ -2099,105 +2105,153 @@ enum MakeAWish class spell_item_make_a_wish : public SpellScriptLoader { - public: - spell_item_make_a_wish() : SpellScriptLoader("spell_item_make_a_wish") { } +public: + spell_item_make_a_wish() : SpellScriptLoader("spell_item_make_a_wish") { } - class spell_item_make_a_wish_SpellScript : public SpellScript + class spell_item_make_a_wish_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_make_a_wish_SpellScript); + + bool Load() { - PrepareSpellScript(spell_item_make_a_wish_SpellScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_MR_PINCHYS_BLESSING) || !sSpellMgr->GetSpellInfo(SPELL_SUMMON_MIGHTY_MR_PINCHY) || !sSpellMgr->GetSpellInfo(SPELL_SUMMON_FURIOUS_MR_PINCHY) || !sSpellMgr->GetSpellInfo(SPELL_TINY_MAGICAL_CRAWDAD) || !sSpellMgr->GetSpellInfo(SPELL_MR_PINCHYS_GIFT)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - uint32 spellId = SPELL_MR_PINCHYS_GIFT; - switch (urand(1, 5)) - { - case 1: spellId = SPELL_MR_PINCHYS_BLESSING; break; - case 2: spellId = SPELL_SUMMON_MIGHTY_MR_PINCHY; break; - case 3: spellId = SPELL_SUMMON_FURIOUS_MR_PINCHY; break; - case 4: spellId = SPELL_TINY_MAGICAL_CRAWDAD; break; - } - caster->CastSpell(caster, spellId, true, nullptr); - } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_item_make_a_wish_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_make_a_wish_SpellScript(); + return GetCaster()->GetTypeId() == TYPEID_PLAYER; } + + bool Validate(SpellInfo const* /*spellInfo*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_MR_PINCHYS_BLESSING) || !sSpellMgr->GetSpellInfo(SPELL_SUMMON_MIGHTY_MR_PINCHY) || !sSpellMgr->GetSpellInfo(SPELL_SUMMON_FURIOUS_MR_PINCHY) || !sSpellMgr->GetSpellInfo(SPELL_TINY_MAGICAL_CRAWDAD) || !sSpellMgr->GetSpellInfo(SPELL_MR_PINCHYS_GIFT)) + return false; + return true; + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + uint32 spellId = SPELL_MR_PINCHYS_GIFT; + switch (urand(1, 5)) + { + case 1: + spellId = SPELL_MR_PINCHYS_BLESSING; + break; + case 2: + spellId = SPELL_SUMMON_MIGHTY_MR_PINCHY; + break; + case 3: + spellId = SPELL_SUMMON_FURIOUS_MR_PINCHY; + break; + case 4: + spellId = SPELL_TINY_MAGICAL_CRAWDAD; + break; + } + caster->CastSpell(caster, spellId, true, nullptr); + } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_item_make_a_wish_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_make_a_wish_SpellScript(); + } }; // http://www.wowhead.com/item=32686 Mingo's Fortune Giblets // 40802 Mingo's Fortune Generator class spell_item_mingos_fortune_generator : public SpellScriptLoader { - public: - spell_item_mingos_fortune_generator() : SpellScriptLoader("spell_item_mingos_fortune_generator") { } +public: + spell_item_mingos_fortune_generator() : SpellScriptLoader("spell_item_mingos_fortune_generator") { } - class spell_item_mingos_fortune_generator_SpellScript : public SpellScript + class spell_item_mingos_fortune_generator_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_mingos_fortune_generator_SpellScript); + + void HandleDummy(SpellEffIndex effIndex) { - PrepareSpellScript(spell_item_mingos_fortune_generator_SpellScript); - - void HandleDummy(SpellEffIndex effIndex) + // Selecting one from Bloodstained Fortune item + uint32 newitemid; + switch (urand(1, 20)) { - // Selecting one from Bloodstained Fortune item - uint32 newitemid; - switch (urand(1, 20)) - { - case 1: newitemid = 32688; break; - case 2: newitemid = 32689; break; - case 3: newitemid = 32690; break; - case 4: newitemid = 32691; break; - case 5: newitemid = 32692; break; - case 6: newitemid = 32693; break; - case 7: newitemid = 32700; break; - case 8: newitemid = 32701; break; - case 9: newitemid = 32702; break; - case 10: newitemid = 32703; break; - case 11: newitemid = 32704; break; - case 12: newitemid = 32705; break; - case 13: newitemid = 32706; break; - case 14: newitemid = 32707; break; - case 15: newitemid = 32708; break; - case 16: newitemid = 32709; break; - case 17: newitemid = 32710; break; - case 18: newitemid = 32711; break; - case 19: newitemid = 32712; break; - case 20: newitemid = 32713; break; - default: - return; - } - - CreateItem(effIndex, newitemid); + case 1: + newitemid = 32688; + break; + case 2: + newitemid = 32689; + break; + case 3: + newitemid = 32690; + break; + case 4: + newitemid = 32691; + break; + case 5: + newitemid = 32692; + break; + case 6: + newitemid = 32693; + break; + case 7: + newitemid = 32700; + break; + case 8: + newitemid = 32701; + break; + case 9: + newitemid = 32702; + break; + case 10: + newitemid = 32703; + break; + case 11: + newitemid = 32704; + break; + case 12: + newitemid = 32705; + break; + case 13: + newitemid = 32706; + break; + case 14: + newitemid = 32707; + break; + case 15: + newitemid = 32708; + break; + case 16: + newitemid = 32709; + break; + case 17: + newitemid = 32710; + break; + case 18: + newitemid = 32711; + break; + case 19: + newitemid = 32712; + break; + case 20: + newitemid = 32713; + break; + default: + return; } - void Register() - { - OnEffectHit += SpellEffectFn(spell_item_mingos_fortune_generator_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_mingos_fortune_generator_SpellScript(); + CreateItem(effIndex, newitemid); } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_item_mingos_fortune_generator_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_mingos_fortune_generator_SpellScript(); + } }; // 71875, 71877 - Item - Black Bruise: Necrotic Touch Proc @@ -2208,43 +2262,43 @@ enum NecroticTouch class spell_item_necrotic_touch : public SpellScriptLoader { - public: - spell_item_necrotic_touch() : SpellScriptLoader("spell_item_necrotic_touch") { } +public: + spell_item_necrotic_touch() : SpellScriptLoader("spell_item_necrotic_touch") { } - class spell_item_necrotic_touch_AuraScript : public AuraScript + class spell_item_necrotic_touch_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_necrotic_touch_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_item_necrotic_touch_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_ITEM_NECROTIC_TOUCH_PROC)) - return false; - return true; - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - return eventInfo.GetProcTarget() && eventInfo.GetProcTarget()->IsAlive(); - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - int32 bp = CalculatePct(int32(eventInfo.GetDamageInfo()->GetDamage()), aurEff->GetAmount()); - GetTarget()->CastCustomSpell(SPELL_ITEM_NECROTIC_TOUCH_PROC, SPELLVALUE_BASE_POINT0, bp, eventInfo.GetProcTarget(), true, NULL, aurEff); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_item_necrotic_touch_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_item_necrotic_touch_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_item_necrotic_touch_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_ITEM_NECROTIC_TOUCH_PROC)) + return false; + return true; } + + bool CheckProc(ProcEventInfo& eventInfo) + { + return eventInfo.GetProcTarget() && eventInfo.GetProcTarget()->IsAlive(); + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + int32 bp = CalculatePct(int32(eventInfo.GetDamageInfo()->GetDamage()), aurEff->GetAmount()); + GetTarget()->CastCustomSpell(SPELL_ITEM_NECROTIC_TOUCH_PROC, SPELLVALUE_BASE_POINT0, bp, eventInfo.GetProcTarget(), true, NULL, aurEff); + } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_item_necrotic_touch_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_item_necrotic_touch_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_item_necrotic_touch_AuraScript(); + } }; // http://www.wowhead.com/item=10720 Gnomish Net-o-Matic Projector @@ -2258,45 +2312,45 @@ enum NetOMaticSpells class spell_item_net_o_matic : public SpellScriptLoader { - public: - spell_item_net_o_matic() : SpellScriptLoader("spell_item_net_o_matic") { } +public: + spell_item_net_o_matic() : SpellScriptLoader("spell_item_net_o_matic") { } - class spell_item_net_o_matic_SpellScript : public SpellScript + class spell_item_net_o_matic_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_net_o_matic_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_item_net_o_matic_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_NET_O_MATIC_TRIGGERED1) || !sSpellMgr->GetSpellInfo(SPELL_NET_O_MATIC_TRIGGERED2) || !sSpellMgr->GetSpellInfo(SPELL_NET_O_MATIC_TRIGGERED3)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - { - uint32 spellId = SPELL_NET_O_MATIC_TRIGGERED3; - uint32 roll = urand(0, 99); - if (roll < 2) // 2% for 30 sec self root (off-like chance unknown) - spellId = SPELL_NET_O_MATIC_TRIGGERED1; - else if (roll < 4) // 2% for 20 sec root, charge to target (off-like chance unknown) - spellId = SPELL_NET_O_MATIC_TRIGGERED2; - - GetCaster()->CastSpell(target, spellId, true, nullptr); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_net_o_matic_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_net_o_matic_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_NET_O_MATIC_TRIGGERED1) || !sSpellMgr->GetSpellInfo(SPELL_NET_O_MATIC_TRIGGERED2) || !sSpellMgr->GetSpellInfo(SPELL_NET_O_MATIC_TRIGGERED3)) + return false; + return true; } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + if (Unit* target = GetHitUnit()) + { + uint32 spellId = SPELL_NET_O_MATIC_TRIGGERED3; + uint32 roll = urand(0, 99); + if (roll < 2) // 2% for 30 sec self root (off-like chance unknown) + spellId = SPELL_NET_O_MATIC_TRIGGERED1; + else if (roll < 4) // 2% for 20 sec root, charge to target (off-like chance unknown) + spellId = SPELL_NET_O_MATIC_TRIGGERED2; + + GetCaster()->CastSpell(target, spellId, true, nullptr); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_net_o_matic_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_net_o_matic_SpellScript(); + } }; // http://www.wowhead.com/item=8529 Noggenfogger Elixir @@ -2310,77 +2364,81 @@ enum NoggenfoggerElixirSpells class spell_item_noggenfogger_elixir : public SpellScriptLoader { - public: - spell_item_noggenfogger_elixir() : SpellScriptLoader("spell_item_noggenfogger_elixir") { } +public: + spell_item_noggenfogger_elixir() : SpellScriptLoader("spell_item_noggenfogger_elixir") { } - class spell_item_noggenfogger_elixir_SpellScript : public SpellScript + class spell_item_noggenfogger_elixir_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_noggenfogger_elixir_SpellScript); + + bool Load() { - PrepareSpellScript(spell_item_noggenfogger_elixir_SpellScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_NOGGENFOGGER_ELIXIR_TRIGGERED1) || !sSpellMgr->GetSpellInfo(SPELL_NOGGENFOGGER_ELIXIR_TRIGGERED2) || !sSpellMgr->GetSpellInfo(SPELL_NOGGENFOGGER_ELIXIR_TRIGGERED3)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - uint32 spellId = SPELL_NOGGENFOGGER_ELIXIR_TRIGGERED3; - switch (urand(1, 3)) - { - case 1: spellId = SPELL_NOGGENFOGGER_ELIXIR_TRIGGERED1; break; - case 2: spellId = SPELL_NOGGENFOGGER_ELIXIR_TRIGGERED2; break; - } - - caster->CastSpell(caster, spellId, true, nullptr); - } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_item_noggenfogger_elixir_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_noggenfogger_elixir_SpellScript(); + return GetCaster()->GetTypeId() == TYPEID_PLAYER; } + + bool Validate(SpellInfo const* /*spellInfo*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_NOGGENFOGGER_ELIXIR_TRIGGERED1) || !sSpellMgr->GetSpellInfo(SPELL_NOGGENFOGGER_ELIXIR_TRIGGERED2) || !sSpellMgr->GetSpellInfo(SPELL_NOGGENFOGGER_ELIXIR_TRIGGERED3)) + return false; + return true; + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + uint32 spellId = SPELL_NOGGENFOGGER_ELIXIR_TRIGGERED3; + switch (urand(1, 3)) + { + case 1: + spellId = SPELL_NOGGENFOGGER_ELIXIR_TRIGGERED1; + break; + case 2: + spellId = SPELL_NOGGENFOGGER_ELIXIR_TRIGGERED2; + break; + } + + caster->CastSpell(caster, spellId, true, nullptr); + } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_item_noggenfogger_elixir_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_noggenfogger_elixir_SpellScript(); + } }; // 17512 - Piccolo of the Flaming Fire class spell_item_piccolo_of_the_flaming_fire : public SpellScriptLoader { - public: - spell_item_piccolo_of_the_flaming_fire() : SpellScriptLoader("spell_item_piccolo_of_the_flaming_fire") { } +public: + spell_item_piccolo_of_the_flaming_fire() : SpellScriptLoader("spell_item_piccolo_of_the_flaming_fire") { } - class spell_item_piccolo_of_the_flaming_fire_SpellScript : public SpellScript + class spell_item_piccolo_of_the_flaming_fire_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_piccolo_of_the_flaming_fire_SpellScript); + + void HandleScript(SpellEffIndex effIndex) { - PrepareSpellScript(spell_item_piccolo_of_the_flaming_fire_SpellScript); - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Player* target = GetHitPlayer()) - target->HandleEmoteCommand(EMOTE_STATE_DANCE); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_piccolo_of_the_flaming_fire_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_piccolo_of_the_flaming_fire_SpellScript(); + PreventHitDefaultEffect(effIndex); + if (Player* target = GetHitPlayer()) + target->HandleEmoteCommand(EMOTE_STATE_DANCE); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_piccolo_of_the_flaming_fire_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_piccolo_of_the_flaming_fire_SpellScript(); + } }; // http://www.wowhead.com/item=6657 Savory Deviate Delight @@ -2395,50 +2453,54 @@ enum SavoryDeviateDelight class spell_item_savory_deviate_delight : public SpellScriptLoader { - public: - spell_item_savory_deviate_delight() : SpellScriptLoader("spell_item_savory_deviate_delight") { } +public: + spell_item_savory_deviate_delight() : SpellScriptLoader("spell_item_savory_deviate_delight") { } - class spell_item_savory_deviate_delight_SpellScript : public SpellScript + class spell_item_savory_deviate_delight_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_savory_deviate_delight_SpellScript); + + bool Load() { - PrepareSpellScript(spell_item_savory_deviate_delight_SpellScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - bool Validate(SpellInfo const* /*spellInfo*/) - { - for (uint32 spellId = SPELL_FLIP_OUT_MALE; spellId <= SPELL_YAAARRRR_FEMALE; ++spellId) - if (!sSpellMgr->GetSpellInfo(spellId)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - uint32 spellId = 0; - switch (urand(1, 2)) - { - // Flip Out - ninja - case 1: spellId = (caster->getGender() == GENDER_MALE ? SPELL_FLIP_OUT_MALE : SPELL_FLIP_OUT_FEMALE); break; - // Yaaarrrr - pirate - case 2: spellId = (caster->getGender() == GENDER_MALE ? SPELL_YAAARRRR_MALE : SPELL_YAAARRRR_FEMALE); break; - } - caster->CastSpell(caster, spellId, true, nullptr); - } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_item_savory_deviate_delight_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_savory_deviate_delight_SpellScript(); + return GetCaster()->GetTypeId() == TYPEID_PLAYER; } + + bool Validate(SpellInfo const* /*spellInfo*/) + { + for (uint32 spellId = SPELL_FLIP_OUT_MALE; spellId <= SPELL_YAAARRRR_FEMALE; ++spellId) + if (!sSpellMgr->GetSpellInfo(spellId)) + return false; + return true; + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + uint32 spellId = 0; + switch (urand(1, 2)) + { + // Flip Out - ninja + case 1: + spellId = (caster->getGender() == GENDER_MALE ? SPELL_FLIP_OUT_MALE : SPELL_FLIP_OUT_FEMALE); + break; + // Yaaarrrr - pirate + case 2: + spellId = (caster->getGender() == GENDER_MALE ? SPELL_YAAARRRR_MALE : SPELL_YAAARRRR_FEMALE); + break; + } + caster->CastSpell(caster, spellId, true, nullptr); + } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_item_savory_deviate_delight_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_savory_deviate_delight_SpellScript(); + } }; // 48129 - Scroll of Recall @@ -2456,62 +2518,62 @@ enum ScrollOfRecall class spell_item_scroll_of_recall : public SpellScriptLoader { - public: - spell_item_scroll_of_recall() : SpellScriptLoader("spell_item_scroll_of_recall") { } +public: + spell_item_scroll_of_recall() : SpellScriptLoader("spell_item_scroll_of_recall") { } - class spell_item_scroll_of_recall_SpellScript : public SpellScript + class spell_item_scroll_of_recall_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_scroll_of_recall_SpellScript); + + bool Load() { - PrepareSpellScript(spell_item_scroll_of_recall_SpellScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - void HandleScript(SpellEffIndex effIndex) - { - Unit* caster = GetCaster(); - uint8 maxSafeLevel = 0; - switch (GetSpellInfo()->Id) - { - case SPELL_SCROLL_OF_RECALL_I: // Scroll of Recall - maxSafeLevel = 40; - break; - case SPELL_SCROLL_OF_RECALL_II: // Scroll of Recall II - maxSafeLevel = 70; - break; - case SPELL_SCROLL_OF_RECALL_III: // Scroll of Recal III - maxSafeLevel = 80; - break; - default: - break; - } - - if (caster->getLevel() > maxSafeLevel) - { - caster->CastSpell(caster, SPELL_LOST, true); - - // ALLIANCE from 60323 to 60330 - HORDE from 60328 to 60335 - uint32 spellId = SPELL_SCROLL_OF_RECALL_FAIL_ALLIANCE_1; - if (GetCaster()->ToPlayer()->GetTeamId() == TEAM_HORDE) - spellId = SPELL_SCROLL_OF_RECALL_FAIL_HORDE_1; - - GetCaster()->CastSpell(GetCaster(), spellId + urand(0, 7), true); - - PreventHitDefaultEffect(effIndex); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_scroll_of_recall_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_TELEPORT_UNITS); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_scroll_of_recall_SpellScript(); + return GetCaster()->GetTypeId() == TYPEID_PLAYER; } + + void HandleScript(SpellEffIndex effIndex) + { + Unit* caster = GetCaster(); + uint8 maxSafeLevel = 0; + switch (GetSpellInfo()->Id) + { + case SPELL_SCROLL_OF_RECALL_I: // Scroll of Recall + maxSafeLevel = 40; + break; + case SPELL_SCROLL_OF_RECALL_II: // Scroll of Recall II + maxSafeLevel = 70; + break; + case SPELL_SCROLL_OF_RECALL_III: // Scroll of Recal III + maxSafeLevel = 80; + break; + default: + break; + } + + if (caster->getLevel() > maxSafeLevel) + { + caster->CastSpell(caster, SPELL_LOST, true); + + // ALLIANCE from 60323 to 60330 - HORDE from 60328 to 60335 + uint32 spellId = SPELL_SCROLL_OF_RECALL_FAIL_ALLIANCE_1; + if (GetCaster()->ToPlayer()->GetTeamId() == TEAM_HORDE) + spellId = SPELL_SCROLL_OF_RECALL_FAIL_HORDE_1; + + GetCaster()->CastSpell(GetCaster(), spellId + urand(0, 7), true); + + PreventHitDefaultEffect(effIndex); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_scroll_of_recall_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_TELEPORT_UNITS); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_scroll_of_recall_SpellScript(); + } }; // 71169 - Shadow's Fate (Shadowmourne questline) @@ -2531,101 +2593,101 @@ enum ExceptionCreature class spell_item_unsated_craving : public SpellScriptLoader { - public: - spell_item_unsated_craving() : SpellScriptLoader("spell_item_unsated_craving") { } +public: + spell_item_unsated_craving() : SpellScriptLoader("spell_item_unsated_craving") { } - class spell_item_unsated_craving_AuraScript : public AuraScript + class spell_item_unsated_craving_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_unsated_craving_AuraScript); + + bool isException(Unit* target) const { - PrepareAuraScript(spell_item_unsated_craving_AuraScript); - - bool isException(Unit* target) const + switch (target->GetEntry()) { - switch (target->GetEntry()) - { - case NPC_GLUTTONOUS_ABOMINATION: - case NPC_RISEN_ARCHMAGE: - case NPC_BLISTERING_ZOMBIE: - case NPC_BLAZING_SKELETON: - case NPC_SINDRAGOSA: - return true; - default: - return false; - } + case NPC_GLUTTONOUS_ABOMINATION: + case NPC_RISEN_ARCHMAGE: + case NPC_BLISTERING_ZOMBIE: + case NPC_BLAZING_SKELETON: + case NPC_SINDRAGOSA: + return true; + default: + return false; + } + } + + bool CheckProc(ProcEventInfo& procInfo) + { + Unit* caster = procInfo.GetActor(); + if (!caster || caster->GetTypeId() != TYPEID_PLAYER) + { + return false; } - bool CheckProc(ProcEventInfo& procInfo) + Unit* target = procInfo.GetActionTarget(); + if (target && isException(target)) { - Unit* caster = procInfo.GetActor(); - if (!caster || caster->GetTypeId() != TYPEID_PLAYER) - { - return false; - } - - Unit* target = procInfo.GetActionTarget(); - if (target && isException(target)) - { - return true; - } - - if (!target || target->GetTypeId() != TYPEID_UNIT || target->IsCritter() || target->IsSummon()) - { - return false; - } - return true; } - // xinef: prevent default proc with castItem passed, which applies 30 sec cooldown to procing of the aura - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + if (!target || target->GetTypeId() != TYPEID_UNIT || target->IsCritter() || target->IsSummon()) { - PreventDefaultAction(); - eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, TRIGGERED_FULL_MASK); + return false; } - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_item_unsated_craving_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_item_unsated_craving_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_item_unsated_craving_AuraScript(); + return true; } + + // xinef: prevent default proc with castItem passed, which applies 30 sec cooldown to procing of the aura + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, TRIGGERED_FULL_MASK); + } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_item_unsated_craving_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_item_unsated_craving_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_item_unsated_craving_AuraScript(); + } }; class spell_item_shadows_fate : public SpellScriptLoader { - public: - spell_item_shadows_fate() : SpellScriptLoader("spell_item_shadows_fate") { } +public: + spell_item_shadows_fate() : SpellScriptLoader("spell_item_shadows_fate") { } - class spell_item_shadows_fate_AuraScript : public AuraScript + class spell_item_shadows_fate_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_shadows_fate_AuraScript); + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_item_shadows_fate_AuraScript); + PreventDefaultAction(); - void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); + Unit* caster = eventInfo.GetActor(); + Unit* target = GetCaster(); + if (!caster || !target) + return; - Unit* caster = eventInfo.GetActor(); - Unit* target = GetCaster(); - if (!caster || !target) - return; - - caster->CastSpell(target, SPELL_SOUL_FEAST, TRIGGERED_FULL_MASK); - } - - void Register() - { - OnEffectProc += AuraEffectProcFn(spell_item_shadows_fate_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_item_shadows_fate_AuraScript(); + caster->CastSpell(target, SPELL_SOUL_FEAST, TRIGGERED_FULL_MASK); } + + void Register() + { + OnEffectProc += AuraEffectProcFn(spell_item_shadows_fate_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_item_shadows_fate_AuraScript(); + } }; enum Shadowmourne @@ -2640,144 +2702,144 @@ enum Shadowmourne // 71903 - Item - Shadowmourne Legendary class spell_item_shadowmourne : public SpellScriptLoader { - public: - spell_item_shadowmourne() : SpellScriptLoader("spell_item_shadowmourne") { } +public: + spell_item_shadowmourne() : SpellScriptLoader("spell_item_shadowmourne") { } - class spell_item_shadowmourne_AuraScript : public AuraScript + class spell_item_shadowmourne_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_shadowmourne_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_item_shadowmourne_AuraScript); + if (!sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_CHAOS_BANE_DAMAGE)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_SOUL_FRAGMENT)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF)) + return false; + return true; + } - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_CHAOS_BANE_DAMAGE)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_SOUL_FRAGMENT)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF)) - return false; - return true; - } + bool CheckProc(ProcEventInfo& eventInfo) + { + if (GetTarget()->HasAura(SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF)) // cant collect shards while under effect of Chaos Bane buff + return false; - bool CheckProc(ProcEventInfo& eventInfo) - { - if (GetTarget()->HasAura(SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF)) // cant collect shards while under effect of Chaos Bane buff - return false; + // Xinef: Not on BG / Arena + /*if (!GetTarget()->FindMap() || GetTarget()->FindMap()->IsBattlegroundOrArena()) + return false;*/ - // Xinef: Not on BG / Arena - /*if (!GetTarget()->FindMap() || GetTarget()->FindMap()->IsBattlegroundOrArena()) - return false;*/ - - if (const SpellInfo* procSpell = eventInfo.GetDamageInfo()->GetSpellInfo()) - if (!eventInfo.GetDamageInfo()->GetDamage()) + if (const SpellInfo* procSpell = eventInfo.GetDamageInfo()->GetSpellInfo()) + if (!eventInfo.GetDamageInfo()->GetDamage()) + { + if (procSpell->SpellFamilyName == SPELLFAMILY_WARRIOR) { - if (procSpell->SpellFamilyName == SPELLFAMILY_WARRIOR) - { - if (!procSpell->SpellFamilyFlags.HasFlag(0x2|0x20|0x4000, 0x0, 0x0)) - return false; - } - else if (procSpell->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT) - { - if (procSpell->Id != 55078 /*Blood Plague*/) - return false; - } - else + if (!procSpell->SpellFamilyFlags.HasFlag(0x2 | 0x20 | 0x4000, 0x0, 0x0)) return false; } - - return eventInfo.GetProcTarget() && eventInfo.GetActor() != eventInfo.GetProcTarget() && eventInfo.GetProcTarget()->IsAlive(); - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - GetTarget()->CastSpell(GetTarget(), SPELL_SHADOWMOURNE_SOUL_FRAGMENT, true, NULL, aurEff); - - // this can't be handled in AuraScript of SoulFragments because we need to know victim - if (Aura* soulFragments = GetTarget()->GetAura(SPELL_SHADOWMOURNE_SOUL_FRAGMENT)) - { - if (soulFragments->GetStackAmount() >= 10) + else if (procSpell->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT) { - GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_SHADOWMOURNE_CHAOS_BANE_DAMAGE, true, NULL, aurEff); - soulFragments->Remove(); + if (procSpell->Id != 55078 /*Blood Plague*/) + return false; } + else + return false; + } + + return eventInfo.GetProcTarget() && eventInfo.GetActor() != eventInfo.GetProcTarget() && eventInfo.GetProcTarget()->IsAlive(); + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + GetTarget()->CastSpell(GetTarget(), SPELL_SHADOWMOURNE_SOUL_FRAGMENT, true, NULL, aurEff); + + // this can't be handled in AuraScript of SoulFragments because we need to know victim + if (Aura* soulFragments = GetTarget()->GetAura(SPELL_SHADOWMOURNE_SOUL_FRAGMENT)) + { + if (soulFragments->GetStackAmount() >= 10) + { + GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_SHADOWMOURNE_CHAOS_BANE_DAMAGE, true, NULL, aurEff); + soulFragments->Remove(); } } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetTarget()->RemoveAurasDueToSpell(SPELL_SHADOWMOURNE_SOUL_FRAGMENT); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_item_shadowmourne_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_item_shadowmourne_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - AfterEffectRemove += AuraEffectRemoveFn(spell_item_shadowmourne_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_item_shadowmourne_AuraScript(); } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->RemoveAurasDueToSpell(SPELL_SHADOWMOURNE_SOUL_FRAGMENT); + } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_item_shadowmourne_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_item_shadowmourne_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + AfterEffectRemove += AuraEffectRemoveFn(spell_item_shadowmourne_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_item_shadowmourne_AuraScript(); + } }; // 71905 - Soul Fragment class spell_item_shadowmourne_soul_fragment : public SpellScriptLoader { - public: - spell_item_shadowmourne_soul_fragment() : SpellScriptLoader("spell_item_shadowmourne_soul_fragment") { } +public: + spell_item_shadowmourne_soul_fragment() : SpellScriptLoader("spell_item_shadowmourne_soul_fragment") { } - class spell_item_shadowmourne_soul_fragment_AuraScript : public AuraScript + class spell_item_shadowmourne_soul_fragment_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_shadowmourne_soul_fragment_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_item_shadowmourne_soul_fragment_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_VISUAL_LOW) || !sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_VISUAL_HIGH) || !sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF)) - return false; - return true; - } - - void OnStackChange(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - switch (GetStackAmount()) - { - case 1: - target->CastSpell(target, SPELL_SHADOWMOURNE_VISUAL_LOW, true); - break; - case 6: - target->RemoveAurasDueToSpell(SPELL_SHADOWMOURNE_VISUAL_LOW); - target->CastSpell(target, SPELL_SHADOWMOURNE_VISUAL_HIGH, true); - break; - case 10: - target->RemoveAurasDueToSpell(SPELL_SHADOWMOURNE_VISUAL_HIGH); - target->CastSpell(target, SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF, true); - break; - default: - break; - } - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - target->RemoveAurasDueToSpell(SPELL_SHADOWMOURNE_VISUAL_LOW); - target->RemoveAurasDueToSpell(SPELL_SHADOWMOURNE_VISUAL_HIGH); - } - - void Register() - { - AfterEffectApply += AuraEffectApplyFn(spell_item_shadowmourne_soul_fragment_AuraScript::OnStackChange, EFFECT_0, SPELL_AURA_MOD_STAT, AuraEffectHandleModes(AURA_EFFECT_HANDLE_REAL | AURA_EFFECT_HANDLE_REAPPLY)); - AfterEffectRemove += AuraEffectRemoveFn(spell_item_shadowmourne_soul_fragment_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_MOD_STAT, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_item_shadowmourne_soul_fragment_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_VISUAL_LOW) || !sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_VISUAL_HIGH) || !sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF)) + return false; + return true; } + + void OnStackChange(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + switch (GetStackAmount()) + { + case 1: + target->CastSpell(target, SPELL_SHADOWMOURNE_VISUAL_LOW, true); + break; + case 6: + target->RemoveAurasDueToSpell(SPELL_SHADOWMOURNE_VISUAL_LOW); + target->CastSpell(target, SPELL_SHADOWMOURNE_VISUAL_HIGH, true); + break; + case 10: + target->RemoveAurasDueToSpell(SPELL_SHADOWMOURNE_VISUAL_HIGH); + target->CastSpell(target, SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF, true); + break; + default: + break; + } + } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + target->RemoveAurasDueToSpell(SPELL_SHADOWMOURNE_VISUAL_LOW); + target->RemoveAurasDueToSpell(SPELL_SHADOWMOURNE_VISUAL_HIGH); + } + + void Register() + { + AfterEffectApply += AuraEffectApplyFn(spell_item_shadowmourne_soul_fragment_AuraScript::OnStackChange, EFFECT_0, SPELL_AURA_MOD_STAT, AuraEffectHandleModes(AURA_EFFECT_HANDLE_REAL | AURA_EFFECT_HANDLE_REAPPLY)); + AfterEffectRemove += AuraEffectRemoveFn(spell_item_shadowmourne_soul_fragment_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_MOD_STAT, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_item_shadowmourne_soul_fragment_AuraScript(); + } }; // http://www.wowhead.com/item=7734 Six Demon Bag @@ -2794,90 +2856,90 @@ enum SixDemonBagSpells class spell_item_six_demon_bag : public SpellScriptLoader { - public: - spell_item_six_demon_bag() : SpellScriptLoader("spell_item_six_demon_bag") { } +public: + spell_item_six_demon_bag() : SpellScriptLoader("spell_item_six_demon_bag") { } - class spell_item_six_demon_bag_SpellScript : public SpellScript + class spell_item_six_demon_bag_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_six_demon_bag_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_item_six_demon_bag_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_FROSTBOLT) || !sSpellMgr->GetSpellInfo(SPELL_POLYMORPH) || !sSpellMgr->GetSpellInfo(SPELL_SUMMON_FELHOUND_MINION) || !sSpellMgr->GetSpellInfo(SPELL_FIREBALL) || !sSpellMgr->GetSpellInfo(SPELL_CHAIN_LIGHTNING) || !sSpellMgr->GetSpellInfo(SPELL_ENVELOPING_WINDS)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - if (Unit* target = GetHitUnit()) - { - uint32 spellId = 0; - uint32 rand = urand(0, 99); - if (rand < 25) // Fireball (25% chance) - spellId = SPELL_FIREBALL; - else if (rand < 50) // Frostball (25% chance) - spellId = SPELL_FROSTBOLT; - else if (rand < 70) // Chain Lighting (20% chance) - spellId = SPELL_CHAIN_LIGHTNING; - else if (rand < 80) // Polymorph (10% chance) - { - spellId = SPELL_POLYMORPH; - if (urand(0, 100) <= 30) // 30% chance to self-cast - target = caster; - } - else if (rand < 95) // Enveloping Winds (15% chance) - spellId = SPELL_ENVELOPING_WINDS; - else // Summon Felhund minion (5% chance) - { - spellId = SPELL_SUMMON_FELHOUND_MINION; - target = caster; - } - - caster->CastSpell(target, spellId, true, GetCastItem()); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_six_demon_bag_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_six_demon_bag_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_FROSTBOLT) || !sSpellMgr->GetSpellInfo(SPELL_POLYMORPH) || !sSpellMgr->GetSpellInfo(SPELL_SUMMON_FELHOUND_MINION) || !sSpellMgr->GetSpellInfo(SPELL_FIREBALL) || !sSpellMgr->GetSpellInfo(SPELL_CHAIN_LIGHTNING) || !sSpellMgr->GetSpellInfo(SPELL_ENVELOPING_WINDS)) + return false; + return true; } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (Unit* target = GetHitUnit()) + { + uint32 spellId = 0; + uint32 rand = urand(0, 99); + if (rand < 25) // Fireball (25% chance) + spellId = SPELL_FIREBALL; + else if (rand < 50) // Frostball (25% chance) + spellId = SPELL_FROSTBOLT; + else if (rand < 70) // Chain Lighting (20% chance) + spellId = SPELL_CHAIN_LIGHTNING; + else if (rand < 80) // Polymorph (10% chance) + { + spellId = SPELL_POLYMORPH; + if (urand(0, 100) <= 30) // 30% chance to self-cast + target = caster; + } + else if (rand < 95) // Enveloping Winds (15% chance) + spellId = SPELL_ENVELOPING_WINDS; + else // Summon Felhund minion (5% chance) + { + spellId = SPELL_SUMMON_FELHOUND_MINION; + target = caster; + } + + caster->CastSpell(target, spellId, true, GetCastItem()); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_six_demon_bag_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_six_demon_bag_SpellScript(); + } }; // 28862 - The Eye of Diminution class spell_item_the_eye_of_diminution : public SpellScriptLoader { - public: - spell_item_the_eye_of_diminution() : SpellScriptLoader("spell_item_the_eye_of_diminution") { } +public: + spell_item_the_eye_of_diminution() : SpellScriptLoader("spell_item_the_eye_of_diminution") { } - class spell_item_the_eye_of_diminution_AuraScript : public AuraScript + class spell_item_the_eye_of_diminution_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_the_eye_of_diminution_AuraScript); + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) { - PrepareAuraScript(spell_item_the_eye_of_diminution_AuraScript); - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - int32 diff = GetUnitOwner()->getLevel() - 60; - if (diff > 0) - amount += diff; - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_item_the_eye_of_diminution_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_THREAT); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_item_the_eye_of_diminution_AuraScript(); + int32 diff = GetUnitOwner()->getLevel() - 60; + if (diff > 0) + amount += diff; } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_item_the_eye_of_diminution_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_THREAT); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_item_the_eye_of_diminution_AuraScript(); + } }; // http://www.wowhead.com/item=44012 Underbelly Elixir @@ -2892,46 +2954,50 @@ enum UnderbellyElixirSpells class spell_item_underbelly_elixir : public SpellScriptLoader { - public: - spell_item_underbelly_elixir() : SpellScriptLoader("spell_item_underbelly_elixir") { } +public: + spell_item_underbelly_elixir() : SpellScriptLoader("spell_item_underbelly_elixir") { } - class spell_item_underbelly_elixir_SpellScript : public SpellScript + class spell_item_underbelly_elixir_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_underbelly_elixir_SpellScript); + + bool Load() { - PrepareSpellScript(spell_item_underbelly_elixir_SpellScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_UNDERBELLY_ELIXIR_TRIGGERED1) || !sSpellMgr->GetSpellInfo(SPELL_UNDERBELLY_ELIXIR_TRIGGERED2) || !sSpellMgr->GetSpellInfo(SPELL_UNDERBELLY_ELIXIR_TRIGGERED3)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - uint32 spellId = SPELL_UNDERBELLY_ELIXIR_TRIGGERED2; - switch (urand(1, (caster->GetPositionZ() < 637 ? 3 : 2))) - { - case 1: spellId = SPELL_UNDERBELLY_ELIXIR_TRIGGERED1; break; - case 2: spellId = SPELL_UNDERBELLY_ELIXIR_TRIGGERED3; break; - } - caster->CastSpell(caster, spellId, true, GetCastItem(), NULL, caster->GetGUID()); - } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_item_underbelly_elixir_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_underbelly_elixir_SpellScript(); + return GetCaster()->GetTypeId() == TYPEID_PLAYER; } + bool Validate(SpellInfo const* /*spellInfo*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_UNDERBELLY_ELIXIR_TRIGGERED1) || !sSpellMgr->GetSpellInfo(SPELL_UNDERBELLY_ELIXIR_TRIGGERED2) || !sSpellMgr->GetSpellInfo(SPELL_UNDERBELLY_ELIXIR_TRIGGERED3)) + return false; + return true; + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + uint32 spellId = SPELL_UNDERBELLY_ELIXIR_TRIGGERED2; + switch (urand(1, (caster->GetPositionZ() < 637 ? 3 : 2))) + { + case 1: + spellId = SPELL_UNDERBELLY_ELIXIR_TRIGGERED1; + break; + case 2: + spellId = SPELL_UNDERBELLY_ELIXIR_TRIGGERED3; + break; + } + caster->CastSpell(caster, spellId, true, GetCastItem(), NULL, caster->GetGUID()); + } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_item_underbelly_elixir_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_underbelly_elixir_SpellScript(); + } }; enum GenericData @@ -2944,50 +3010,50 @@ enum GenericData class spell_item_book_of_glyph_mastery : public SpellScriptLoader { - public: - spell_item_book_of_glyph_mastery() : SpellScriptLoader("spell_item_book_of_glyph_mastery") { } +public: + spell_item_book_of_glyph_mastery() : SpellScriptLoader("spell_item_book_of_glyph_mastery") { } - class spell_item_book_of_glyph_mastery_SpellScript : public SpellScript + class spell_item_book_of_glyph_mastery_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_book_of_glyph_mastery_SpellScript); + + bool Load() { - PrepareSpellScript(spell_item_book_of_glyph_mastery_SpellScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - SpellCastResult CheckRequirement() - { - if (HasDiscoveredAllSpells(GetSpellInfo()->Id, GetCaster()->ToPlayer())) - { - SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_LEARNED_EVERYTHING); - return SPELL_FAILED_CUSTOM_ERROR; - } - - return SPELL_CAST_OK; - } - - void HandleScript(SpellEffIndex /*effIndex*/) - { - Player* caster = GetCaster()->ToPlayer(); - uint32 spellId = GetSpellInfo()->Id; - - // learn random explicit discovery recipe (if any) - if (uint32 discoveredSpellId = GetExplicitDiscoverySpell(spellId, caster)) - caster->learnSpell(discoveredSpellId); - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_item_book_of_glyph_mastery_SpellScript::CheckRequirement); - OnEffectHitTarget += SpellEffectFn(spell_item_book_of_glyph_mastery_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_book_of_glyph_mastery_SpellScript(); + return GetCaster()->GetTypeId() == TYPEID_PLAYER; } + + SpellCastResult CheckRequirement() + { + if (HasDiscoveredAllSpells(GetSpellInfo()->Id, GetCaster()->ToPlayer())) + { + SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_LEARNED_EVERYTHING); + return SPELL_FAILED_CUSTOM_ERROR; + } + + return SPELL_CAST_OK; + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Player* caster = GetCaster()->ToPlayer(); + uint32 spellId = GetSpellInfo()->Id; + + // learn random explicit discovery recipe (if any) + if (uint32 discoveredSpellId = GetExplicitDiscoverySpell(spellId, caster)) + caster->learnSpell(discoveredSpellId); + } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_item_book_of_glyph_mastery_SpellScript::CheckRequirement); + OnEffectHitTarget += SpellEffectFn(spell_item_book_of_glyph_mastery_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_book_of_glyph_mastery_SpellScript(); + } }; enum Sinkholes @@ -2999,35 +3065,35 @@ enum Sinkholes class spell_item_map_of_the_geyser_fields : public SpellScriptLoader { - public: - spell_item_map_of_the_geyser_fields() : SpellScriptLoader("spell_item_map_of_the_geyser_fields") { } +public: + spell_item_map_of_the_geyser_fields() : SpellScriptLoader("spell_item_map_of_the_geyser_fields") { } - class spell_item_map_of_the_geyser_fields_SpellScript : public SpellScript + class spell_item_map_of_the_geyser_fields_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_map_of_the_geyser_fields_SpellScript); + + SpellCastResult CheckSinkholes() { - PrepareSpellScript(spell_item_map_of_the_geyser_fields_SpellScript); - - SpellCastResult CheckSinkholes() - { - Unit* caster = GetCaster(); - if (caster->FindNearestCreature(NPC_SOUTH_SINKHOLE, 30.0f, true) || + Unit* caster = GetCaster(); + if (caster->FindNearestCreature(NPC_SOUTH_SINKHOLE, 30.0f, true) || caster->FindNearestCreature(NPC_NORTHEAST_SINKHOLE, 30.0f, true) || caster->FindNearestCreature(NPC_NORTHWEST_SINKHOLE, 30.0f, true)) - return SPELL_CAST_OK; + return SPELL_CAST_OK; - SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_MUST_BE_CLOSE_TO_SINKHOLE); - return SPELL_FAILED_CUSTOM_ERROR; - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_item_map_of_the_geyser_fields_SpellScript::CheckSinkholes); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_map_of_the_geyser_fields_SpellScript(); + SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_MUST_BE_CLOSE_TO_SINKHOLE); + return SPELL_FAILED_CUSTOM_ERROR; } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_item_map_of_the_geyser_fields_SpellScript::CheckSinkholes); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_map_of_the_geyser_fields_SpellScript(); + } }; enum VanquishedClutchesSpells @@ -3039,37 +3105,37 @@ enum VanquishedClutchesSpells class spell_item_vanquished_clutches : public SpellScriptLoader { - public: - spell_item_vanquished_clutches() : SpellScriptLoader("spell_item_vanquished_clutches") { } +public: + spell_item_vanquished_clutches() : SpellScriptLoader("spell_item_vanquished_clutches") { } - class spell_item_vanquished_clutches_SpellScript : public SpellScript + class spell_item_vanquished_clutches_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_vanquished_clutches_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_item_vanquished_clutches_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_CRUSHER) || !sSpellMgr->GetSpellInfo(SPELL_CONSTRICTOR) || !sSpellMgr->GetSpellInfo(SPELL_CORRUPTOR)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - uint32 spellId = RAND(SPELL_CRUSHER, SPELL_CONSTRICTOR, SPELL_CORRUPTOR); - Unit* caster = GetCaster(); - caster->CastSpell(caster, spellId, true); - } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_item_vanquished_clutches_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_vanquished_clutches_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_CRUSHER) || !sSpellMgr->GetSpellInfo(SPELL_CONSTRICTOR) || !sSpellMgr->GetSpellInfo(SPELL_CORRUPTOR)) + return false; + return true; } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + uint32 spellId = RAND(SPELL_CRUSHER, SPELL_CONSTRICTOR, SPELL_CORRUPTOR); + Unit* caster = GetCaster(); + caster->CastSpell(caster, spellId, true); + } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_item_vanquished_clutches_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_vanquished_clutches_SpellScript(); + } }; enum AshbringerSounds @@ -3090,41 +3156,41 @@ enum AshbringerSounds class spell_item_ashbringer : public SpellScriptLoader { - public: - spell_item_ashbringer() : SpellScriptLoader("spell_item_ashbringer") { } +public: + spell_item_ashbringer() : SpellScriptLoader("spell_item_ashbringer") { } - class spell_item_ashbringer_SpellScript : public SpellScript + class spell_item_ashbringer_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_ashbringer_SpellScript); + + bool Load() { - PrepareSpellScript(spell_item_ashbringer_SpellScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - void OnDummyEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - - Player* player = GetCaster()->ToPlayer(); - uint32 sound_id = RAND( SOUND_ASHBRINGER_1, SOUND_ASHBRINGER_2, SOUND_ASHBRINGER_3, SOUND_ASHBRINGER_4, SOUND_ASHBRINGER_5, SOUND_ASHBRINGER_6, - SOUND_ASHBRINGER_7, SOUND_ASHBRINGER_8, SOUND_ASHBRINGER_9, SOUND_ASHBRINGER_10, SOUND_ASHBRINGER_11, SOUND_ASHBRINGER_12 ); - - // Ashbringers effect (spellID 28441) retriggers every 5 seconds, with a chance of making it say one of the above 12 sounds - if (urand(0, 60) < 1) - player->PlayDirectSound(sound_id, player); - } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_item_ashbringer_SpellScript::OnDummyEffect, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_ashbringer_SpellScript(); + return GetCaster()->GetTypeId() == TYPEID_PLAYER; } + + void OnDummyEffect(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + + Player* player = GetCaster()->ToPlayer(); + uint32 sound_id = RAND( SOUND_ASHBRINGER_1, SOUND_ASHBRINGER_2, SOUND_ASHBRINGER_3, SOUND_ASHBRINGER_4, SOUND_ASHBRINGER_5, SOUND_ASHBRINGER_6, + SOUND_ASHBRINGER_7, SOUND_ASHBRINGER_8, SOUND_ASHBRINGER_9, SOUND_ASHBRINGER_10, SOUND_ASHBRINGER_11, SOUND_ASHBRINGER_12 ); + + // Ashbringers effect (spellID 28441) retriggers every 5 seconds, with a chance of making it say one of the above 12 sounds + if (urand(0, 60) < 1) + player->PlayDirectSound(sound_id, player); + } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_item_ashbringer_SpellScript::OnDummyEffect, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_ashbringer_SpellScript(); + } }; enum MagicEater @@ -3139,77 +3205,77 @@ enum MagicEater class spell_magic_eater_food : public SpellScriptLoader { - public: - spell_magic_eater_food() : SpellScriptLoader("spell_magic_eater_food") { } +public: + spell_magic_eater_food() : SpellScriptLoader("spell_magic_eater_food") { } - class spell_magic_eater_food_AuraScript : public AuraScript + class spell_magic_eater_food_AuraScript : public AuraScript + { + PrepareAuraScript(spell_magic_eater_food_AuraScript); + + void HandleTriggerSpell(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_magic_eater_food_AuraScript); - - void HandleTriggerSpell(AuraEffect const* /*aurEff*/) + PreventDefaultAction(); + Unit* target = GetTarget(); + switch (urand(0, 5)) { - PreventDefaultAction(); - Unit* target = GetTarget(); - switch (urand(0, 5)) - { - case 0: - target->CastSpell(target, SPELL_WILD_MAGIC, true); - break; - case 1: - target->CastSpell(target, SPELL_WELL_FED_1, true); - break; - case 2: - target->CastSpell(target, SPELL_WELL_FED_2, true); - break; - case 3: - target->CastSpell(target, SPELL_WELL_FED_3, true); - break; - case 4: - target->CastSpell(target, SPELL_WELL_FED_4, true); - break; - case 5: - target->CastSpell(target, SPELL_WELL_FED_5, true); - break; - } + case 0: + target->CastSpell(target, SPELL_WILD_MAGIC, true); + break; + case 1: + target->CastSpell(target, SPELL_WELL_FED_1, true); + break; + case 2: + target->CastSpell(target, SPELL_WELL_FED_2, true); + break; + case 3: + target->CastSpell(target, SPELL_WELL_FED_3, true); + break; + case 4: + target->CastSpell(target, SPELL_WELL_FED_4, true); + break; + case 5: + target->CastSpell(target, SPELL_WELL_FED_5, true); + break; } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_magic_eater_food_AuraScript::HandleTriggerSpell, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_magic_eater_food_AuraScript(); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_magic_eater_food_AuraScript::HandleTriggerSpell, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_magic_eater_food_AuraScript(); + } }; class spell_item_shimmering_vessel : public SpellScriptLoader { - public: - spell_item_shimmering_vessel() : SpellScriptLoader("spell_item_shimmering_vessel") { } +public: + spell_item_shimmering_vessel() : SpellScriptLoader("spell_item_shimmering_vessel") { } - class spell_item_shimmering_vessel_SpellScript : public SpellScript + class spell_item_shimmering_vessel_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_shimmering_vessel_SpellScript); + + void HandleDummy(SpellEffIndex /* effIndex */) { - PrepareSpellScript(spell_item_shimmering_vessel_SpellScript); - - void HandleDummy(SpellEffIndex /* effIndex */) - { - if (Creature* target = GetHitCreature()) - target->setDeathState(JUST_RESPAWNED); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_shimmering_vessel_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_shimmering_vessel_SpellScript(); + if (Creature* target = GetHitCreature()) + target->setDeathState(JUST_RESPAWNED); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_shimmering_vessel_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_shimmering_vessel_SpellScript(); + } }; enum PurifyHelboarMeat @@ -3220,41 +3286,41 @@ enum PurifyHelboarMeat class spell_item_purify_helboar_meat : public SpellScriptLoader { - public: - spell_item_purify_helboar_meat() : SpellScriptLoader("spell_item_purify_helboar_meat") { } +public: + spell_item_purify_helboar_meat() : SpellScriptLoader("spell_item_purify_helboar_meat") { } - class spell_item_purify_helboar_meat_SpellScript : public SpellScript + class spell_item_purify_helboar_meat_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_purify_helboar_meat_SpellScript); + + bool Load() { - PrepareSpellScript(spell_item_purify_helboar_meat_SpellScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_SUMMON_PURIFIED_HELBOAR_MEAT) || !sSpellMgr->GetSpellInfo(SPELL_SUMMON_TOXIC_HELBOAR_MEAT)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /* effIndex */) - { - Unit* caster = GetCaster(); - caster->CastSpell(caster, roll_chance_i(50) ? SPELL_SUMMON_PURIFIED_HELBOAR_MEAT : SPELL_SUMMON_TOXIC_HELBOAR_MEAT, true, nullptr); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_purify_helboar_meat_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_purify_helboar_meat_SpellScript(); + return GetCaster()->GetTypeId() == TYPEID_PLAYER; } + + bool Validate(SpellInfo const* /*spell*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_SUMMON_PURIFIED_HELBOAR_MEAT) || !sSpellMgr->GetSpellInfo(SPELL_SUMMON_TOXIC_HELBOAR_MEAT)) + return false; + return true; + } + + void HandleDummy(SpellEffIndex /* effIndex */) + { + Unit* caster = GetCaster(); + caster->CastSpell(caster, roll_chance_i(50) ? SPELL_SUMMON_PURIFIED_HELBOAR_MEAT : SPELL_SUMMON_TOXIC_HELBOAR_MEAT, true, nullptr); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_purify_helboar_meat_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_purify_helboar_meat_SpellScript(); + } }; enum CrystalPrison @@ -3264,40 +3330,40 @@ enum CrystalPrison class spell_item_crystal_prison_dummy_dnd : public SpellScriptLoader { - public: - spell_item_crystal_prison_dummy_dnd() : SpellScriptLoader("spell_item_crystal_prison_dummy_dnd") { } +public: + spell_item_crystal_prison_dummy_dnd() : SpellScriptLoader("spell_item_crystal_prison_dummy_dnd") { } - class spell_item_crystal_prison_dummy_dnd_SpellScript : public SpellScript + class spell_item_crystal_prison_dummy_dnd_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_crystal_prison_dummy_dnd_SpellScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareSpellScript(spell_item_crystal_prison_dummy_dnd_SpellScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sObjectMgr->GetGameObjectTemplate(OBJECT_IMPRISONED_DOOMGUARD)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /* effIndex */) - { - if (Creature* target = GetHitCreature()) - if (target->isDead() && !target->IsPet()) - { - GetCaster()->SummonGameObject(OBJECT_IMPRISONED_DOOMGUARD, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), target->GetOrientation(), 0, 0, 0, 0, uint32(target->GetRespawnTime()-time(nullptr))); - target->DespawnOrUnsummon(); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_crystal_prison_dummy_dnd_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_crystal_prison_dummy_dnd_SpellScript(); + if (!sObjectMgr->GetGameObjectTemplate(OBJECT_IMPRISONED_DOOMGUARD)) + return false; + return true; } + + void HandleDummy(SpellEffIndex /* effIndex */) + { + if (Creature* target = GetHitCreature()) + if (target->isDead() && !target->IsPet()) + { + GetCaster()->SummonGameObject(OBJECT_IMPRISONED_DOOMGUARD, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), target->GetOrientation(), 0, 0, 0, 0, uint32(target->GetRespawnTime() - time(nullptr))); + target->DespawnOrUnsummon(); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_crystal_prison_dummy_dnd_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_crystal_prison_dummy_dnd_SpellScript(); + } }; enum ReindeerTransformation @@ -3311,55 +3377,55 @@ enum ReindeerTransformation class spell_item_reindeer_transformation : public SpellScriptLoader { - public: - spell_item_reindeer_transformation() : SpellScriptLoader("spell_item_reindeer_transformation") { } +public: + spell_item_reindeer_transformation() : SpellScriptLoader("spell_item_reindeer_transformation") { } - class spell_item_reindeer_transformation_SpellScript : public SpellScript + class spell_item_reindeer_transformation_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_reindeer_transformation_SpellScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareSpellScript(spell_item_reindeer_transformation_SpellScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_FLYING_REINDEER_310) || !sSpellMgr->GetSpellInfo(SPELL_FLYING_REINDEER_280) + if (!sSpellMgr->GetSpellInfo(SPELL_FLYING_REINDEER_310) || !sSpellMgr->GetSpellInfo(SPELL_FLYING_REINDEER_280) || !sSpellMgr->GetSpellInfo(SPELL_FLYING_REINDEER_60) || !sSpellMgr->GetSpellInfo(SPELL_REINDEER_100) || !sSpellMgr->GetSpellInfo(SPELL_REINDEER_60)) - return false; - return true; - } + return false; + return true; + } - void HandleDummy(SpellEffIndex /* effIndex */) + void HandleDummy(SpellEffIndex /* effIndex */) + { + Unit* caster = GetCaster(); + if (caster->HasAuraType(SPELL_AURA_MOUNTED)) { - Unit* caster = GetCaster(); - if (caster->HasAuraType(SPELL_AURA_MOUNTED)) - { - float flyspeed = caster->GetSpeedRate(MOVE_FLIGHT); - float speed = caster->GetSpeedRate(MOVE_RUN); + float flyspeed = caster->GetSpeedRate(MOVE_FLIGHT); + float speed = caster->GetSpeedRate(MOVE_RUN); - caster->RemoveAurasByType(SPELL_AURA_MOUNTED); - //5 different spells used depending on mounted speed and if mount can fly or not + caster->RemoveAurasByType(SPELL_AURA_MOUNTED); + //5 different spells used depending on mounted speed and if mount can fly or not - if (flyspeed >= 4.1f) - // Flying Reindeer - caster->CastSpell(caster, SPELL_FLYING_REINDEER_310, true); //310% flying Reindeer - else if (flyspeed >= 3.8f) - // Flying Reindeer - caster->CastSpell(caster, SPELL_FLYING_REINDEER_280, true); //280% flying Reindeer - else if (flyspeed >= 1.6f) - // Flying Reindeer - caster->CastSpell(caster, SPELL_FLYING_REINDEER_60, true); //60% flying Reindeer - else if (speed >= 2.0f) - // Reindeer - caster->CastSpell(caster, SPELL_REINDEER_100, true); //100% ground Reindeer - else - // Reindeer - caster->CastSpell(caster, SPELL_REINDEER_60, true); //60% ground Reindeer - } + if (flyspeed >= 4.1f) + // Flying Reindeer + caster->CastSpell(caster, SPELL_FLYING_REINDEER_310, true); //310% flying Reindeer + else if (flyspeed >= 3.8f) + // Flying Reindeer + caster->CastSpell(caster, SPELL_FLYING_REINDEER_280, true); //280% flying Reindeer + else if (flyspeed >= 1.6f) + // Flying Reindeer + caster->CastSpell(caster, SPELL_FLYING_REINDEER_60, true); //60% flying Reindeer + else if (speed >= 2.0f) + // Reindeer + caster->CastSpell(caster, SPELL_REINDEER_100, true); //100% ground Reindeer + else + // Reindeer + caster->CastSpell(caster, SPELL_REINDEER_60, true); //60% ground Reindeer } + } - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_reindeer_transformation_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_reindeer_transformation_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } }; SpellScript* GetSpellScript() const @@ -3376,42 +3442,42 @@ enum NighInvulnerability class spell_item_nigh_invulnerability : public SpellScriptLoader { - public: - spell_item_nigh_invulnerability() : SpellScriptLoader("spell_item_nigh_invulnerability") { } +public: + spell_item_nigh_invulnerability() : SpellScriptLoader("spell_item_nigh_invulnerability") { } - class spell_item_nigh_invulnerability_SpellScript : public SpellScript + class spell_item_nigh_invulnerability_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_nigh_invulnerability_SpellScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareSpellScript(spell_item_nigh_invulnerability_SpellScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_NIGH_INVULNERABILITY) || !sSpellMgr->GetSpellInfo(SPELL_COMPLETE_VULNERABILITY)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /* effIndex */) - { - Unit* caster = GetCaster(); - if (Item* castItem = GetCastItem()) - { - if (roll_chance_i(86)) // Nigh-Invulnerability - success - caster->CastSpell(caster, SPELL_NIGH_INVULNERABILITY, true, castItem); - else // Complete Vulnerability - backfire in 14% casts - caster->CastSpell(caster, SPELL_COMPLETE_VULNERABILITY, true, castItem); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_nigh_invulnerability_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_nigh_invulnerability_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_NIGH_INVULNERABILITY) || !sSpellMgr->GetSpellInfo(SPELL_COMPLETE_VULNERABILITY)) + return false; + return true; } + + void HandleDummy(SpellEffIndex /* effIndex */) + { + Unit* caster = GetCaster(); + if (Item* castItem = GetCastItem()) + { + if (roll_chance_i(86)) // Nigh-Invulnerability - success + caster->CastSpell(caster, SPELL_NIGH_INVULNERABILITY, true, castItem); + else // Complete Vulnerability - backfire in 14% casts + caster->CastSpell(caster, SPELL_COMPLETE_VULNERABILITY, true, castItem); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_nigh_invulnerability_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_nigh_invulnerability_SpellScript(); + } }; enum Poultryzer @@ -3422,36 +3488,36 @@ enum Poultryzer class spell_item_poultryizer : public SpellScriptLoader { - public: - spell_item_poultryizer() : SpellScriptLoader("spell_item_poultryizer") { } +public: + spell_item_poultryizer() : SpellScriptLoader("spell_item_poultryizer") { } - class spell_item_poultryizer_SpellScript : public SpellScript + class spell_item_poultryizer_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_poultryizer_SpellScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareSpellScript(spell_item_poultryizer_SpellScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_POULTRYIZER_SUCCESS) || !sSpellMgr->GetSpellInfo(SPELL_POULTRYIZER_BACKFIRE)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /* effIndex */) - { - if (GetCastItem() && GetHitUnit()) - GetCaster()->CastSpell(GetHitUnit(), roll_chance_i(80) ? SPELL_POULTRYIZER_SUCCESS : SPELL_POULTRYIZER_BACKFIRE, true, GetCastItem()); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_poultryizer_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_poultryizer_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_POULTRYIZER_SUCCESS) || !sSpellMgr->GetSpellInfo(SPELL_POULTRYIZER_BACKFIRE)) + return false; + return true; } + + void HandleDummy(SpellEffIndex /* effIndex */) + { + if (GetCastItem() && GetHitUnit()) + GetCaster()->CastSpell(GetHitUnit(), roll_chance_i(80) ? SPELL_POULTRYIZER_SUCCESS : SPELL_POULTRYIZER_BACKFIRE, true, GetCastItem()); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_poultryizer_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_poultryizer_SpellScript(); + } }; enum SocretharsStone @@ -3462,50 +3528,50 @@ enum SocretharsStone class spell_item_socrethars_stone : public SpellScriptLoader { - public: - spell_item_socrethars_stone() : SpellScriptLoader("spell_item_socrethars_stone") { } +public: + spell_item_socrethars_stone() : SpellScriptLoader("spell_item_socrethars_stone") { } - class spell_item_socrethars_stone_SpellScript : public SpellScript + class spell_item_socrethars_stone_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_socrethars_stone_SpellScript); + + bool Load() { - PrepareSpellScript(spell_item_socrethars_stone_SpellScript); - - bool Load() - { - return (GetCaster()->GetAreaId() == 3900 || GetCaster()->GetAreaId() == 3742); - } - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_SOCRETHAR_TO_SEAT) || !sSpellMgr->GetSpellInfo(SPELL_SOCRETHAR_FROM_SEAT)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /* effIndex */) - { - Unit* caster = GetCaster(); - switch (caster->GetAreaId()) - { - case 3900: - caster->CastSpell(caster, SPELL_SOCRETHAR_TO_SEAT, true); - break; - case 3742: - caster->CastSpell(caster, SPELL_SOCRETHAR_FROM_SEAT, true); - break; - default: - return; - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_socrethars_stone_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_socrethars_stone_SpellScript(); + return (GetCaster()->GetAreaId() == 3900 || GetCaster()->GetAreaId() == 3742); } + bool Validate(SpellInfo const* /*spell*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_SOCRETHAR_TO_SEAT) || !sSpellMgr->GetSpellInfo(SPELL_SOCRETHAR_FROM_SEAT)) + return false; + return true; + } + + void HandleDummy(SpellEffIndex /* effIndex */) + { + Unit* caster = GetCaster(); + switch (caster->GetAreaId()) + { + case 3900: + caster->CastSpell(caster, SPELL_SOCRETHAR_TO_SEAT, true); + break; + case 3742: + caster->CastSpell(caster, SPELL_SOCRETHAR_FROM_SEAT, true); + break; + default: + return; + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_socrethars_stone_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_socrethars_stone_SpellScript(); + } }; enum DemonBroiledSurprise @@ -3517,54 +3583,54 @@ enum DemonBroiledSurprise class spell_item_demon_broiled_surprise : public SpellScriptLoader { - public: - spell_item_demon_broiled_surprise() : SpellScriptLoader("spell_item_demon_broiled_surprise") { } +public: + spell_item_demon_broiled_surprise() : SpellScriptLoader("spell_item_demon_broiled_surprise") { } - class spell_item_demon_broiled_surprise_SpellScript : public SpellScript + class spell_item_demon_broiled_surprise_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_demon_broiled_surprise_SpellScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareSpellScript(spell_item_demon_broiled_surprise_SpellScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_CREATE_DEMON_BROILED_SURPRISE) || !sObjectMgr->GetCreatureTemplate(NPC_ABYSSAL_FLAMEBRINGER) || !sObjectMgr->GetQuestTemplate(QUEST_SUPER_HOT_STEW)) - return false; - return true; - } - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - void HandleDummy(SpellEffIndex /* effIndex */) - { - Unit* player = GetCaster(); - player->CastSpell(player, SPELL_CREATE_DEMON_BROILED_SURPRISE, false); - } - - SpellCastResult CheckRequirement() - { - Player* player = GetCaster()->ToPlayer(); - if (player->GetQuestStatus(QUEST_SUPER_HOT_STEW) != QUEST_STATUS_INCOMPLETE) - return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; - - if (Creature* creature = player->FindNearestCreature(NPC_ABYSSAL_FLAMEBRINGER, 10, false)) - if (creature->isDead()) - return SPELL_CAST_OK; - return SPELL_FAILED_NOT_HERE; - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_demon_broiled_surprise_SpellScript::HandleDummy, EFFECT_1, SPELL_EFFECT_DUMMY); - OnCheckCast += SpellCheckCastFn(spell_item_demon_broiled_surprise_SpellScript::CheckRequirement); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_demon_broiled_surprise_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_CREATE_DEMON_BROILED_SURPRISE) || !sObjectMgr->GetCreatureTemplate(NPC_ABYSSAL_FLAMEBRINGER) || !sObjectMgr->GetQuestTemplate(QUEST_SUPER_HOT_STEW)) + return false; + return true; } + + bool Load() + { + return GetCaster()->GetTypeId() == TYPEID_PLAYER; + } + + void HandleDummy(SpellEffIndex /* effIndex */) + { + Unit* player = GetCaster(); + player->CastSpell(player, SPELL_CREATE_DEMON_BROILED_SURPRISE, false); + } + + SpellCastResult CheckRequirement() + { + Player* player = GetCaster()->ToPlayer(); + if (player->GetQuestStatus(QUEST_SUPER_HOT_STEW) != QUEST_STATUS_INCOMPLETE) + return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; + + if (Creature* creature = player->FindNearestCreature(NPC_ABYSSAL_FLAMEBRINGER, 10, false)) + if (creature->isDead()) + return SPELL_CAST_OK; + return SPELL_FAILED_NOT_HERE; + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_demon_broiled_surprise_SpellScript::HandleDummy, EFFECT_1, SPELL_EFFECT_DUMMY); + OnCheckCast += SpellCheckCastFn(spell_item_demon_broiled_surprise_SpellScript::CheckRequirement); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_demon_broiled_surprise_SpellScript(); + } }; enum CompleteRaptorCapture @@ -3574,42 +3640,42 @@ enum CompleteRaptorCapture class spell_item_complete_raptor_capture : public SpellScriptLoader { - public: - spell_item_complete_raptor_capture() : SpellScriptLoader("spell_item_complete_raptor_capture") { } +public: + spell_item_complete_raptor_capture() : SpellScriptLoader("spell_item_complete_raptor_capture") { } - class spell_item_complete_raptor_capture_SpellScript : public SpellScript + class spell_item_complete_raptor_capture_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_complete_raptor_capture_SpellScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareSpellScript(spell_item_complete_raptor_capture_SpellScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_RAPTOR_CAPTURE_CREDIT)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /* effIndex */) - { - Unit* caster = GetCaster(); - if (GetHitCreature()) - { - GetHitCreature()->DespawnOrUnsummon(); - - //cast spell Raptor Capture Credit - caster->CastSpell(caster, SPELL_RAPTOR_CAPTURE_CREDIT, true, nullptr); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_complete_raptor_capture_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_complete_raptor_capture_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_RAPTOR_CAPTURE_CREDIT)) + return false; + return true; } + + void HandleDummy(SpellEffIndex /* effIndex */) + { + Unit* caster = GetCaster(); + if (GetHitCreature()) + { + GetHitCreature()->DespawnOrUnsummon(); + + //cast spell Raptor Capture Credit + caster->CastSpell(caster, SPELL_RAPTOR_CAPTURE_CREDIT, true, nullptr); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_complete_raptor_capture_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_complete_raptor_capture_SpellScript(); + } }; enum ImpaleLeviroth @@ -3620,42 +3686,42 @@ enum ImpaleLeviroth class spell_item_impale_leviroth : public SpellScriptLoader { - public: - spell_item_impale_leviroth() : SpellScriptLoader("spell_item_impale_leviroth") { } +public: + spell_item_impale_leviroth() : SpellScriptLoader("spell_item_impale_leviroth") { } - class spell_item_impale_leviroth_SpellScript : public SpellScript + class spell_item_impale_leviroth_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_impale_leviroth_SpellScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareSpellScript(spell_item_impale_leviroth_SpellScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sObjectMgr->GetCreatureTemplate(NPC_LEVIROTH)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /* effIndex */) - { - if (Creature* target = GetHitCreature()) - if (target->GetEntry() == NPC_LEVIROTH && target->HealthAbovePct(94)) - { - target->CastSpell(target, SPELL_LEVIROTH_SELF_IMPALE, true); - target->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, 150); - target->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, 200); - target->LowerPlayerDamageReq(target->GetMaxHealth()); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_impale_leviroth_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_impale_leviroth_SpellScript(); + if (!sObjectMgr->GetCreatureTemplate(NPC_LEVIROTH)) + return false; + return true; } + + void HandleDummy(SpellEffIndex /* effIndex */) + { + if (Creature* target = GetHitCreature()) + if (target->GetEntry() == NPC_LEVIROTH && target->HealthAbovePct(94)) + { + target->CastSpell(target, SPELL_LEVIROTH_SELF_IMPALE, true); + target->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, 150); + target->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, 200); + target->LowerPlayerDamageReq(target->GetMaxHealth()); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_impale_leviroth_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_impale_leviroth_SpellScript(); + } }; enum BrewfestMountTransformation @@ -3670,59 +3736,59 @@ enum BrewfestMountTransformation class spell_item_brewfest_mount_transformation : public SpellScriptLoader { - public: - spell_item_brewfest_mount_transformation() : SpellScriptLoader("spell_item_brewfest_mount_transformation") { } +public: + spell_item_brewfest_mount_transformation() : SpellScriptLoader("spell_item_brewfest_mount_transformation") { } - class spell_item_brewfest_mount_transformation_SpellScript : public SpellScript + class spell_item_brewfest_mount_transformation_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_brewfest_mount_transformation_SpellScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareSpellScript(spell_item_brewfest_mount_transformation_SpellScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_MOUNT_RAM_100) || !sSpellMgr->GetSpellInfo(SPELL_MOUNT_RAM_60) || !sSpellMgr->GetSpellInfo(SPELL_MOUNT_KODO_100) || !sSpellMgr->GetSpellInfo(SPELL_MOUNT_KODO_60)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /* effIndex */) - { - Player* caster = GetCaster()->ToPlayer(); - if (caster->HasAuraType(SPELL_AURA_MOUNTED)) - { - caster->RemoveAurasByType(SPELL_AURA_MOUNTED); - uint32 spell_id; - - switch (GetSpellInfo()->Id) - { - case SPELL_BREWFEST_MOUNT_TRANSFORM: - if (caster->GetSpeedRate(MOVE_RUN) >= 2.0f) - spell_id = caster->GetTeamId() == TEAM_ALLIANCE ? SPELL_MOUNT_RAM_100 : SPELL_MOUNT_KODO_100; - else - spell_id = caster->GetTeamId() == TEAM_ALLIANCE ? SPELL_MOUNT_RAM_60 : SPELL_MOUNT_KODO_60; - break; - case SPELL_BREWFEST_MOUNT_TRANSFORM_REVERSE: - if (caster->GetSpeedRate(MOVE_RUN) >= 2.0f) - spell_id = caster->GetTeamId() == TEAM_HORDE ? SPELL_MOUNT_RAM_100 : SPELL_MOUNT_KODO_100; - else - spell_id = caster->GetTeamId() == TEAM_HORDE ? SPELL_MOUNT_RAM_60 : SPELL_MOUNT_KODO_60; - break; - default: - return; - } - caster->CastSpell(caster, spell_id, true); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_brewfest_mount_transformation_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_brewfest_mount_transformation_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_MOUNT_RAM_100) || !sSpellMgr->GetSpellInfo(SPELL_MOUNT_RAM_60) || !sSpellMgr->GetSpellInfo(SPELL_MOUNT_KODO_100) || !sSpellMgr->GetSpellInfo(SPELL_MOUNT_KODO_60)) + return false; + return true; } + + void HandleDummy(SpellEffIndex /* effIndex */) + { + Player* caster = GetCaster()->ToPlayer(); + if (caster->HasAuraType(SPELL_AURA_MOUNTED)) + { + caster->RemoveAurasByType(SPELL_AURA_MOUNTED); + uint32 spell_id; + + switch (GetSpellInfo()->Id) + { + case SPELL_BREWFEST_MOUNT_TRANSFORM: + if (caster->GetSpeedRate(MOVE_RUN) >= 2.0f) + spell_id = caster->GetTeamId() == TEAM_ALLIANCE ? SPELL_MOUNT_RAM_100 : SPELL_MOUNT_KODO_100; + else + spell_id = caster->GetTeamId() == TEAM_ALLIANCE ? SPELL_MOUNT_RAM_60 : SPELL_MOUNT_KODO_60; + break; + case SPELL_BREWFEST_MOUNT_TRANSFORM_REVERSE: + if (caster->GetSpeedRate(MOVE_RUN) >= 2.0f) + spell_id = caster->GetTeamId() == TEAM_HORDE ? SPELL_MOUNT_RAM_100 : SPELL_MOUNT_KODO_100; + else + spell_id = caster->GetTeamId() == TEAM_HORDE ? SPELL_MOUNT_RAM_60 : SPELL_MOUNT_KODO_60; + break; + default: + return; + } + caster->CastSpell(caster, spell_id, true); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_brewfest_mount_transformation_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_brewfest_mount_transformation_SpellScript(); + } }; enum NitroBoots @@ -3733,43 +3799,43 @@ enum NitroBoots class spell_item_nitro_boots : public SpellScriptLoader { - public: - spell_item_nitro_boots() : SpellScriptLoader("spell_item_nitro_boots") { } +public: + spell_item_nitro_boots() : SpellScriptLoader("spell_item_nitro_boots") { } - class spell_item_nitro_boots_SpellScript : public SpellScript + class spell_item_nitro_boots_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_nitro_boots_SpellScript); + + bool Load() { - PrepareSpellScript(spell_item_nitro_boots_SpellScript); - - bool Load() - { - if (!GetCastItem()) - return false; - return true; - } - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_NITRO_BOOTS_SUCCESS) || !sSpellMgr->GetSpellInfo(SPELL_NITRO_BOOTS_BACKFIRE)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /* effIndex */) - { - Unit* caster = GetCaster(); - caster->CastSpell(caster, caster->GetMap()->IsDungeon() || roll_chance_i(95) ? SPELL_NITRO_BOOTS_SUCCESS : SPELL_NITRO_BOOTS_BACKFIRE, true, GetCastItem()); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_nitro_boots_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_nitro_boots_SpellScript(); + if (!GetCastItem()) + return false; + return true; } + + bool Validate(SpellInfo const* /*spell*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_NITRO_BOOTS_SUCCESS) || !sSpellMgr->GetSpellInfo(SPELL_NITRO_BOOTS_BACKFIRE)) + return false; + return true; + } + + void HandleDummy(SpellEffIndex /* effIndex */) + { + Unit* caster = GetCaster(); + caster->CastSpell(caster, caster->GetMap()->IsDungeon() || roll_chance_i(95) ? SPELL_NITRO_BOOTS_SUCCESS : SPELL_NITRO_BOOTS_BACKFIRE, true, GetCastItem()); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_nitro_boots_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_nitro_boots_SpellScript(); + } }; enum TeachLanguage @@ -3780,43 +3846,43 @@ enum TeachLanguage class spell_item_teach_language : public SpellScriptLoader { - public: - spell_item_teach_language() : SpellScriptLoader("spell_item_teach_language") { } +public: + spell_item_teach_language() : SpellScriptLoader("spell_item_teach_language") { } - class spell_item_teach_language_SpellScript : public SpellScript + class spell_item_teach_language_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_teach_language_SpellScript); + + bool Load() { - PrepareSpellScript(spell_item_teach_language_SpellScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_LEARN_GNOMISH_BINARY) || !sSpellMgr->GetSpellInfo(SPELL_LEARN_GOBLIN_BINARY)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /* effIndex */) - { - Player* caster = GetCaster()->ToPlayer(); - - if (roll_chance_i(34)) - caster->CastSpell(caster, caster->GetTeamId() == TEAM_ALLIANCE ? SPELL_LEARN_GNOMISH_BINARY : SPELL_LEARN_GOBLIN_BINARY, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_teach_language_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_teach_language_SpellScript(); + return GetCaster()->GetTypeId() == TYPEID_PLAYER; } + + bool Validate(SpellInfo const* /*spell*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_LEARN_GNOMISH_BINARY) || !sSpellMgr->GetSpellInfo(SPELL_LEARN_GOBLIN_BINARY)) + return false; + return true; + } + + void HandleDummy(SpellEffIndex /* effIndex */) + { + Player* caster = GetCaster()->ToPlayer(); + + if (roll_chance_i(34)) + caster->CastSpell(caster, caster->GetTeamId() == TEAM_ALLIANCE ? SPELL_LEARN_GNOMISH_BINARY : SPELL_LEARN_GOBLIN_BINARY, true); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_teach_language_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_teach_language_SpellScript(); + } }; enum RocketBoots @@ -3826,53 +3892,53 @@ enum RocketBoots class spell_item_rocket_boots : public SpellScriptLoader { - public: - spell_item_rocket_boots() : SpellScriptLoader("spell_item_rocket_boots") { } +public: + spell_item_rocket_boots() : SpellScriptLoader("spell_item_rocket_boots") { } - class spell_item_rocket_boots_SpellScript : public SpellScript + class spell_item_rocket_boots_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_rocket_boots_SpellScript); + + bool Load() { - PrepareSpellScript(spell_item_rocket_boots_SpellScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_ROCKET_BOOTS_PROC)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /* effIndex */) - { - Player* caster = GetCaster()->ToPlayer(); - if (Battleground* bg = caster->GetBattleground()) - bg->EventPlayerDroppedFlag(caster); - - caster->RemoveSpellCooldown(SPELL_ROCKET_BOOTS_PROC); - caster->CastSpell(caster, SPELL_ROCKET_BOOTS_PROC, true, nullptr); - } - - SpellCastResult CheckCast() - { - if (GetCaster()->IsInWater()) - return SPELL_FAILED_ONLY_ABOVEWATER; - return SPELL_CAST_OK; - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_item_rocket_boots_SpellScript::CheckCast); - OnEffectHitTarget += SpellEffectFn(spell_item_rocket_boots_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_rocket_boots_SpellScript(); + return GetCaster()->GetTypeId() == TYPEID_PLAYER; } + + bool Validate(SpellInfo const* /*spell*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_ROCKET_BOOTS_PROC)) + return false; + return true; + } + + void HandleDummy(SpellEffIndex /* effIndex */) + { + Player* caster = GetCaster()->ToPlayer(); + if (Battleground* bg = caster->GetBattleground()) + bg->EventPlayerDroppedFlag(caster); + + caster->RemoveSpellCooldown(SPELL_ROCKET_BOOTS_PROC); + caster->CastSpell(caster, SPELL_ROCKET_BOOTS_PROC, true, nullptr); + } + + SpellCastResult CheckCast() + { + if (GetCaster()->IsInWater()) + return SPELL_FAILED_ONLY_ABOVEWATER; + return SPELL_CAST_OK; + } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_item_rocket_boots_SpellScript::CheckCast); + OnEffectHitTarget += SpellEffectFn(spell_item_rocket_boots_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_rocket_boots_SpellScript(); + } }; enum PygmyOil @@ -3883,75 +3949,75 @@ enum PygmyOil class spell_item_pygmy_oil : public SpellScriptLoader { - public: - spell_item_pygmy_oil() : SpellScriptLoader("spell_item_pygmy_oil") { } +public: + spell_item_pygmy_oil() : SpellScriptLoader("spell_item_pygmy_oil") { } - class spell_item_pygmy_oil_SpellScript : public SpellScript + class spell_item_pygmy_oil_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_pygmy_oil_SpellScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareSpellScript(spell_item_pygmy_oil_SpellScript); + if (!sSpellMgr->GetSpellInfo(SPELL_PYGMY_OIL_PYGMY_AURA) || !sSpellMgr->GetSpellInfo(SPELL_PYGMY_OIL_SMALLER_AURA)) + return false; + return true; + } - bool Validate(SpellInfo const* /*spell*/) + void HandleDummy(SpellEffIndex /* effIndex */) + { + Unit* caster = GetCaster(); + if (Aura* aura = caster->GetAura(SPELL_PYGMY_OIL_PYGMY_AURA)) + aura->RefreshDuration(); + else { - if (!sSpellMgr->GetSpellInfo(SPELL_PYGMY_OIL_PYGMY_AURA) || !sSpellMgr->GetSpellInfo(SPELL_PYGMY_OIL_SMALLER_AURA)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /* effIndex */) - { - Unit* caster = GetCaster(); - if (Aura* aura = caster->GetAura(SPELL_PYGMY_OIL_PYGMY_AURA)) - aura->RefreshDuration(); + aura = caster->GetAura(SPELL_PYGMY_OIL_SMALLER_AURA); + if (!aura || aura->GetStackAmount() < 5 || !roll_chance_i(50)) + caster->CastSpell(caster, SPELL_PYGMY_OIL_SMALLER_AURA, true); else { - aura = caster->GetAura(SPELL_PYGMY_OIL_SMALLER_AURA); - if (!aura || aura->GetStackAmount() < 5 || !roll_chance_i(50)) - caster->CastSpell(caster, SPELL_PYGMY_OIL_SMALLER_AURA, true); - else - { - aura->Remove(); - caster->CastSpell(caster, SPELL_PYGMY_OIL_PYGMY_AURA, true); - } + aura->Remove(); + caster->CastSpell(caster, SPELL_PYGMY_OIL_PYGMY_AURA, true); } } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_pygmy_oil_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_pygmy_oil_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_pygmy_oil_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_pygmy_oil_SpellScript(); + } }; class spell_item_unusual_compass : public SpellScriptLoader { - public: - spell_item_unusual_compass() : SpellScriptLoader("spell_item_unusual_compass") { } +public: + spell_item_unusual_compass() : SpellScriptLoader("spell_item_unusual_compass") { } - class spell_item_unusual_compass_SpellScript : public SpellScript + class spell_item_unusual_compass_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_unusual_compass_SpellScript); + + void HandleDummy(SpellEffIndex /* effIndex */) { - PrepareSpellScript(spell_item_unusual_compass_SpellScript); - - void HandleDummy(SpellEffIndex /* effIndex */) - { - Unit* caster = GetCaster(); - caster->SetFacingTo(frand(0.0f, 2.0f * M_PI)); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_unusual_compass_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_unusual_compass_SpellScript(); + Unit* caster = GetCaster(); + caster->SetFacingTo(frand(0.0f, 2.0f * M_PI)); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_unusual_compass_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_unusual_compass_SpellScript(); + } }; enum ChickenCover @@ -3964,48 +4030,48 @@ enum ChickenCover class spell_item_chicken_cover : public SpellScriptLoader { - public: - spell_item_chicken_cover() : SpellScriptLoader("spell_item_chicken_cover") { } +public: + spell_item_chicken_cover() : SpellScriptLoader("spell_item_chicken_cover") { } - class spell_item_chicken_cover_SpellScript : public SpellScript + class spell_item_chicken_cover_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_chicken_cover_SpellScript); + + bool Load() { - PrepareSpellScript(spell_item_chicken_cover_SpellScript); + return GetCaster()->GetTypeId() == TYPEID_PLAYER; + } - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } + bool Validate(SpellInfo const* /*spell*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_CHICKEN_NET) || !sSpellMgr->GetSpellInfo(SPELL_CAPTURE_CHICKEN_ESCAPE) || !sObjectMgr->GetQuestTemplate(QUEST_CHICKEN_PARTY) || !sObjectMgr->GetQuestTemplate(QUEST_FLOWN_THE_COOP)) + return false; + return true; + } - bool Validate(SpellInfo const* /*spell*/) + void HandleDummy(SpellEffIndex /* effIndex */) + { + Player* caster = GetCaster()->ToPlayer(); + if (Unit* target = GetHitUnit()) { - if (!sSpellMgr->GetSpellInfo(SPELL_CHICKEN_NET) || !sSpellMgr->GetSpellInfo(SPELL_CAPTURE_CHICKEN_ESCAPE) || !sObjectMgr->GetQuestTemplate(QUEST_CHICKEN_PARTY) || !sObjectMgr->GetQuestTemplate(QUEST_FLOWN_THE_COOP)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /* effIndex */) - { - Player* caster = GetCaster()->ToPlayer(); - if (Unit* target = GetHitUnit()) + if (!target->HasAura(SPELL_CHICKEN_NET) && (caster->GetQuestStatus(QUEST_CHICKEN_PARTY) == QUEST_STATUS_INCOMPLETE || caster->GetQuestStatus(QUEST_FLOWN_THE_COOP) == QUEST_STATUS_INCOMPLETE)) { - if (!target->HasAura(SPELL_CHICKEN_NET) && (caster->GetQuestStatus(QUEST_CHICKEN_PARTY) == QUEST_STATUS_INCOMPLETE || caster->GetQuestStatus(QUEST_FLOWN_THE_COOP) == QUEST_STATUS_INCOMPLETE)) - { - caster->CastSpell(caster, SPELL_CAPTURE_CHICKEN_ESCAPE, true); - Unit::Kill(target, target); - } + caster->CastSpell(caster, SPELL_CAPTURE_CHICKEN_ESCAPE, true); + Unit::Kill(target, target); } } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_chicken_cover_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_chicken_cover_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_chicken_cover_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_chicken_cover_SpellScript(); + } }; enum Refocus @@ -4017,63 +4083,63 @@ enum Refocus class spell_item_refocus : public SpellScriptLoader { - public: - spell_item_refocus() : SpellScriptLoader("spell_item_refocus") { } +public: + spell_item_refocus() : SpellScriptLoader("spell_item_refocus") { } - class spell_item_refocus_SpellScript : public SpellScript + class spell_item_refocus_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_refocus_SpellScript); + + void HandleDummy(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_item_refocus_SpellScript); + Player* caster = GetCaster()->ToPlayer(); - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Player* caster = GetCaster()->ToPlayer(); + if (!caster || caster->getClass() != CLASS_HUNTER) + return; - if (!caster || caster->getClass() != CLASS_HUNTER) - return; - - caster->RemoveSpellCooldown(SPELL_AIMED_SHOT, true); - caster->RemoveSpellCooldown(SPELL_MULTISHOT, true); - caster->RemoveSpellCooldown(SPELL_VOLLEY, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_refocus_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_refocus_SpellScript(); + caster->RemoveSpellCooldown(SPELL_AIMED_SHOT, true); + caster->RemoveSpellCooldown(SPELL_MULTISHOT, true); + caster->RemoveSpellCooldown(SPELL_VOLLEY, true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_refocus_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_refocus_SpellScript(); + } }; class spell_item_muisek_vessel : public SpellScriptLoader { - public: - spell_item_muisek_vessel() : SpellScriptLoader("spell_item_muisek_vessel") { } +public: + spell_item_muisek_vessel() : SpellScriptLoader("spell_item_muisek_vessel") { } - class spell_item_muisek_vessel_SpellScript : public SpellScript + class spell_item_muisek_vessel_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_muisek_vessel_SpellScript); + + void HandleDummy(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_item_muisek_vessel_SpellScript); - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - if (Creature* target = GetHitCreature()) - if (target->isDead()) - target->DespawnOrUnsummon(); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_item_muisek_vessel_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_item_muisek_vessel_SpellScript(); + if (Creature* target = GetHitCreature()) + if (target->isDead()) + target->DespawnOrUnsummon(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_item_muisek_vessel_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_item_muisek_vessel_SpellScript(); + } }; enum GreatmothersSoulcather diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index db03a310e..80510dd50 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -48,158 +48,158 @@ enum MageSpells // Ours class spell_mage_arcane_blast : public SpellScriptLoader { - public: - spell_mage_arcane_blast() : SpellScriptLoader("spell_mage_arcane_blast") { } +public: + spell_mage_arcane_blast() : SpellScriptLoader("spell_mage_arcane_blast") { } - class spell_mage_arcane_blast_SpellScript : public SpellScript + class spell_mage_arcane_blast_SpellScript : public SpellScript + { + PrepareSpellScript(spell_mage_arcane_blast_SpellScript); + + bool Load() { _triggerSpellId = 0; return true; } + + void HandleTriggerSpell(SpellEffIndex effIndex) { - PrepareSpellScript(spell_mage_arcane_blast_SpellScript); - - bool Load() { _triggerSpellId = 0; return true; } - - void HandleTriggerSpell(SpellEffIndex effIndex) - { - _triggerSpellId = GetSpellInfo()->Effects[effIndex].TriggerSpell; - PreventHitDefaultEffect(effIndex); - } - - void HandleAfterCast() - { - GetCaster()->CastSpell(GetCaster(), _triggerSpellId, TRIGGERED_FULL_MASK); - } - - void Register() - { - OnEffectLaunch += SpellEffectFn(spell_mage_arcane_blast_SpellScript::HandleTriggerSpell, EFFECT_1, SPELL_EFFECT_TRIGGER_SPELL); - OnEffectLaunchTarget += SpellEffectFn(spell_mage_arcane_blast_SpellScript::HandleTriggerSpell, EFFECT_1, SPELL_EFFECT_TRIGGER_SPELL); - AfterCast += SpellCastFn(spell_mage_arcane_blast_SpellScript::HandleAfterCast); - } - - private: - uint32 _triggerSpellId; - }; - - SpellScript* GetSpellScript() const - { - return new spell_mage_arcane_blast_SpellScript(); + _triggerSpellId = GetSpellInfo()->Effects[effIndex].TriggerSpell; + PreventHitDefaultEffect(effIndex); } + + void HandleAfterCast() + { + GetCaster()->CastSpell(GetCaster(), _triggerSpellId, TRIGGERED_FULL_MASK); + } + + void Register() + { + OnEffectLaunch += SpellEffectFn(spell_mage_arcane_blast_SpellScript::HandleTriggerSpell, EFFECT_1, SPELL_EFFECT_TRIGGER_SPELL); + OnEffectLaunchTarget += SpellEffectFn(spell_mage_arcane_blast_SpellScript::HandleTriggerSpell, EFFECT_1, SPELL_EFFECT_TRIGGER_SPELL); + AfterCast += SpellCastFn(spell_mage_arcane_blast_SpellScript::HandleAfterCast); + } + + private: + uint32 _triggerSpellId; + }; + + SpellScript* GetSpellScript() const + { + return new spell_mage_arcane_blast_SpellScript(); + } }; class spell_mage_deep_freeze : public SpellScriptLoader { - public: - spell_mage_deep_freeze() : SpellScriptLoader("spell_mage_deep_freeze") { } +public: + spell_mage_deep_freeze() : SpellScriptLoader("spell_mage_deep_freeze") { } - class spell_mage_deep_freeze_SpellScript : public SpellScript + class spell_mage_deep_freeze_SpellScript : public SpellScript + { + PrepareSpellScript(spell_mage_deep_freeze_SpellScript) + + void HandleOnHit() { - PrepareSpellScript(spell_mage_deep_freeze_SpellScript) - - void HandleOnHit() - { - if (Unit* caster = GetCaster()) - if (Unit* target = (caster->ToPlayer() ? caster->ToPlayer()->GetSelectedUnit() : nullptr)) - if (Creature* cTarget = target->ToCreature()) - if (cTarget->HasMechanicTemplateImmunity(1 << (MECHANIC_STUN - 1))) - caster->CastSpell(cTarget, 71757, true); - } - - void Register() - { - OnHit += SpellHitFn(spell_mage_deep_freeze_SpellScript::HandleOnHit); - } - }; - - SpellScript * GetSpellScript() const - { - return new spell_mage_deep_freeze_SpellScript(); + if (Unit* caster = GetCaster()) + if (Unit* target = (caster->ToPlayer() ? caster->ToPlayer()->GetSelectedUnit() : nullptr)) + if (Creature* cTarget = target->ToCreature()) + if (cTarget->HasMechanicTemplateImmunity(1 << (MECHANIC_STUN - 1))) + caster->CastSpell(cTarget, 71757, true); } + + void Register() + { + OnHit += SpellHitFn(spell_mage_deep_freeze_SpellScript::HandleOnHit); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_mage_deep_freeze_SpellScript(); + } }; class spell_mage_burning_determination : public SpellScriptLoader { - public: - spell_mage_burning_determination() : SpellScriptLoader("spell_mage_burning_determination") { } +public: + spell_mage_burning_determination() : SpellScriptLoader("spell_mage_burning_determination") { } - class spell_mage_burning_determination_AuraScript : public AuraScript + class spell_mage_burning_determination_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mage_burning_determination_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_mage_burning_determination_AuraScript); + if (!eventInfo.GetDamageInfo()->GetSpellInfo() || !eventInfo.GetActionTarget()) + return false; - bool CheckProc(ProcEventInfo& eventInfo) + // Need Interrupt or Silenced mechanic + if (!(eventInfo.GetDamageInfo()->GetSpellInfo()->GetAllEffectsMechanicMask() & ((1 << MECHANIC_INTERRUPT) | (1 << MECHANIC_SILENCE)))) + return false; + + // Xinef: immuned effect should just eat charge + if (eventInfo.GetHitMask() & PROC_EX_IMMUNE) { - if (!eventInfo.GetDamageInfo()->GetSpellInfo() || !eventInfo.GetActionTarget()) - return false; - - // Need Interrupt or Silenced mechanic - if (!(eventInfo.GetDamageInfo()->GetSpellInfo()->GetAllEffectsMechanicMask() & ((1<RemoveAurasDueToSpell(54748); + return false; + } + if (Aura* aura = eventInfo.GetActionTarget()->GetAura(54748)) + { + if (aura->GetDuration() < aura->GetMaxDuration()) eventInfo.GetActionTarget()->RemoveAurasDueToSpell(54748); - return false; - } - if (Aura* aura = eventInfo.GetActionTarget()->GetAura(54748)) - { - if (aura->GetDuration() < aura->GetMaxDuration()) - eventInfo.GetActionTarget()->RemoveAurasDueToSpell(54748); - return false; - } - - return true; + return false; } - void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) - { - PreventDefaultAction(); - GetUnitOwner()->CastSpell(GetUnitOwner(), 54748, true); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_mage_burning_determination_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_mage_burning_determination_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_mage_burning_determination_AuraScript(); + return true; } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + GetUnitOwner()->CastSpell(GetUnitOwner(), 54748, true); + } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_mage_burning_determination_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_mage_burning_determination_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_mage_burning_determination_AuraScript(); + } }; class spell_mage_molten_armor : public SpellScriptLoader { - public: - spell_mage_molten_armor() : SpellScriptLoader("spell_mage_molten_armor") { } +public: + spell_mage_molten_armor() : SpellScriptLoader("spell_mage_molten_armor") { } - class spell_mage_molten_armor_AuraScript : public AuraScript + class spell_mage_molten_armor_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mage_molten_armor_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_mage_molten_armor_AuraScript); + const SpellInfo* spellInfo = eventInfo.GetDamageInfo()->GetSpellInfo(); + if (!spellInfo || (eventInfo.GetTypeMask() & PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK)) + return true; - bool CheckProc(ProcEventInfo& eventInfo) - { - const SpellInfo* spellInfo = eventInfo.GetDamageInfo()->GetSpellInfo(); - if (!spellInfo || (eventInfo.GetTypeMask() & PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK)) - return true; + // Xinef: Molten Shields talent + if (AuraEffect* aurEff = eventInfo.GetActionTarget()->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_MAGE, 16, EFFECT_0)) + return roll_chance_i(aurEff->GetSpellInfo()->GetRank() * 50); - // Xinef: Molten Shields talent - if (AuraEffect* aurEff = eventInfo.GetActionTarget()->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_MAGE, 16, EFFECT_0)) - return roll_chance_i(aurEff->GetSpellInfo()->GetRank()*50); - - return false; - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_mage_molten_armor_AuraScript::CheckProc); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_mage_molten_armor_AuraScript(); + return false; } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_mage_molten_armor_AuraScript::CheckProc); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_mage_molten_armor_AuraScript(); + } }; class spell_mage_mirror_image : public SpellScriptLoader @@ -210,7 +210,7 @@ public: class spell_mage_mirror_image_AuraScript : public AuraScript { PrepareAuraScript(spell_mage_mirror_image_AuraScript) - + void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { GetTarget()->CastSpell((Unit*)NULL, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true); @@ -236,264 +236,264 @@ public: class spell_mage_burnout : public SpellScriptLoader { - public: - spell_mage_burnout() : SpellScriptLoader("spell_mage_burnout") { } +public: + spell_mage_burnout() : SpellScriptLoader("spell_mage_burnout") { } - class spell_mage_burnout_AuraScript : public AuraScript + class spell_mage_burnout_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mage_burnout_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_mage_burnout_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_BURNOUT_TRIGGER)) - return false; - return true; - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - return eventInfo.GetDamageInfo()->GetSpellInfo(); // eventInfo.GetSpellInfo() - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - - int32 mana = int32(eventInfo.GetDamageInfo()->GetSpellInfo()->CalcPowerCost(GetTarget(), eventInfo.GetDamageInfo()->GetSchoolMask())); - mana = CalculatePct(mana, aurEff->GetAmount()); - - GetTarget()->CastCustomSpell(SPELL_MAGE_BURNOUT_TRIGGER, SPELLVALUE_BASE_POINT0, mana, GetTarget(), true, NULL, aurEff); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_mage_burnout_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_mage_burnout_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_mage_burnout_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_BURNOUT_TRIGGER)) + return false; + return true; } + + bool CheckProc(ProcEventInfo& eventInfo) + { + return eventInfo.GetDamageInfo()->GetSpellInfo(); // eventInfo.GetSpellInfo() + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + int32 mana = int32(eventInfo.GetDamageInfo()->GetSpellInfo()->CalcPowerCost(GetTarget(), eventInfo.GetDamageInfo()->GetSchoolMask())); + mana = CalculatePct(mana, aurEff->GetAmount()); + + GetTarget()->CastCustomSpell(SPELL_MAGE_BURNOUT_TRIGGER, SPELLVALUE_BASE_POINT0, mana, GetTarget(), true, NULL, aurEff); + } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_mage_burnout_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_mage_burnout_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_mage_burnout_AuraScript(); + } }; class spell_mage_burnout_trigger : public SpellScriptLoader { - public: - spell_mage_burnout_trigger() : SpellScriptLoader("spell_mage_burnout_trigger") { } +public: + spell_mage_burnout_trigger() : SpellScriptLoader("spell_mage_burnout_trigger") { } - class spell_mage_burnout_trigger_SpellScript : public SpellScript + class spell_mage_burnout_trigger_SpellScript : public SpellScript + { + PrepareSpellScript(spell_mage_burnout_trigger_SpellScript); + + void HandleDummy(SpellEffIndex effIndex) { - PrepareSpellScript(spell_mage_burnout_trigger_SpellScript); - - void HandleDummy(SpellEffIndex effIndex) + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - { - int32 newDamage = -(target->ModifyPower(POWER_MANA, -GetEffectValue())); - GetSpell()->ExecuteLogEffectTakeTargetPower(effIndex, target, POWER_MANA, newDamage, 0.0f); - } + int32 newDamage = -(target->ModifyPower(POWER_MANA, -GetEffectValue())); + GetSpell()->ExecuteLogEffectTakeTargetPower(effIndex, target, POWER_MANA, newDamage, 0.0f); } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_mage_burnout_trigger_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_POWER_BURN); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_mage_burnout_trigger_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_mage_burnout_trigger_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_POWER_BURN); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_mage_burnout_trigger_SpellScript(); + } }; class spell_mage_pet_scaling : public SpellScriptLoader { - public: - spell_mage_pet_scaling() : SpellScriptLoader("spell_mage_pet_scaling") { } +public: + spell_mage_pet_scaling() : SpellScriptLoader("spell_mage_pet_scaling") { } - class spell_mage_pet_scaling_AuraScript : public AuraScript + class spell_mage_pet_scaling_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mage_pet_scaling_AuraScript); + + void CalculateResistanceAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) { - PrepareAuraScript(spell_mage_pet_scaling_AuraScript); - - void CalculateResistanceAmount(AuraEffect const* aurEff, int32 & amount, bool & /*canBeRecalculated*/) + // xinef: mage pet inherits 40% of resistance from owner and 35% of armor (guessed) + if (Unit* owner = GetUnitOwner()->GetOwner()) { - // xinef: mage pet inherits 40% of resistance from owner and 35% of armor (guessed) - if (Unit* owner = GetUnitOwner()->GetOwner()) + SpellSchoolMask schoolMask = SpellSchoolMask(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].MiscValue); + int32 modifier = schoolMask == SPELL_SCHOOL_MASK_NORMAL ? 35 : 40; + amount = CalculatePct(std::max(0, owner->GetResistance(schoolMask)), modifier); + } + } + + void CalculateStatAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) + { + // xinef: mage pet inherits 30% of intellect / stamina + if (Unit* owner = GetUnitOwner()->GetOwner()) + { + Stats stat = Stats(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].MiscValue); + amount = CalculatePct(std::max(0, owner->GetStat(stat)), 30); + } + } + + void CalculateAPAmount(AuraEffect const* /*aurEff*/, int32& /*amount*/, bool& /*canBeRecalculated*/) + { + // xinef: mage pet inherits 0% AP + } + + void CalculateSPAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + // xinef: mage pet inherits 33% of SP + if (Unit* owner = GetUnitOwner()->GetOwner()) + { + int32 frost = owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_FROST); + amount = CalculatePct(std::max(0, frost), 33); + + // xinef: Update appropriate player field + if (owner->GetTypeId() == TYPEID_PLAYER) + owner->SetUInt32Value(PLAYER_PET_SPELL_POWER, (uint32)amount); + } + } + + void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + if (GetUnitOwner()->IsPet()) + return; + + GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, aurEff->GetAuraType(), true, SPELL_BLOCK_TYPE_POSITIVE); + if (aurEff->GetAuraType() == SPELL_AURA_MOD_ATTACK_POWER) + GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_ATTACK_POWER_PCT, true, SPELL_BLOCK_TYPE_POSITIVE); + else if (aurEff->GetAuraType() == SPELL_AURA_MOD_STAT) + GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, true, SPELL_BLOCK_TYPE_POSITIVE); + } + + void CalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude) + { + if (!GetUnitOwner()->IsPet()) + return; + + isPeriodic = true; + amplitude = 2 * IN_MILLISECONDS; + } + + void HandlePeriodic(AuraEffect const* aurEff) + { + PreventDefaultAction(); + if (aurEff->GetAuraType() == SPELL_AURA_MOD_STAT && (aurEff->GetMiscValue() == STAT_STAMINA || aurEff->GetMiscValue() == STAT_INTELLECT)) + { + int32 currentAmount = aurEff->GetAmount(); + int32 newAmount = GetEffect(aurEff->GetEffIndex())->CalculateAmount(GetCaster()); + if (newAmount != currentAmount) { - SpellSchoolMask schoolMask = SpellSchoolMask(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].MiscValue); - int32 modifier = schoolMask == SPELL_SCHOOL_MASK_NORMAL ? 35 : 40; - amount = CalculatePct(std::max(0, owner->GetResistance(schoolMask)), modifier); - } - } - - void CalculateStatAmount(AuraEffect const* aurEff, int32 & amount, bool & /*canBeRecalculated*/) - { - // xinef: mage pet inherits 30% of intellect / stamina - if (Unit* owner = GetUnitOwner()->GetOwner()) - { - Stats stat = Stats(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].MiscValue); - amount = CalculatePct(std::max(0, owner->GetStat(stat)), 30); - } - } - - void CalculateAPAmount(AuraEffect const* /*aurEff*/, int32 & /*amount*/, bool & /*canBeRecalculated*/) - { - // xinef: mage pet inherits 0% AP - } - - void CalculateSPAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - // xinef: mage pet inherits 33% of SP - if (Unit* owner = GetUnitOwner()->GetOwner()) - { - int32 frost = owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_FROST); - amount = CalculatePct(std::max(0, frost), 33); - - // xinef: Update appropriate player field - if (owner->GetTypeId() == TYPEID_PLAYER) - owner->SetUInt32Value(PLAYER_PET_SPELL_POWER, (uint32)amount); - } - } - - void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - if (GetUnitOwner()->IsPet()) - return; - - GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, aurEff->GetAuraType(), true, SPELL_BLOCK_TYPE_POSITIVE); - if (aurEff->GetAuraType() == SPELL_AURA_MOD_ATTACK_POWER) - GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_ATTACK_POWER_PCT, true, SPELL_BLOCK_TYPE_POSITIVE); - else if (aurEff->GetAuraType() == SPELL_AURA_MOD_STAT) - GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, true, SPELL_BLOCK_TYPE_POSITIVE); - } - - void CalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude) - { - if (!GetUnitOwner()->IsPet()) - return; - - isPeriodic = true; - amplitude = 2*IN_MILLISECONDS; - } - - void HandlePeriodic(AuraEffect const* aurEff) - { - PreventDefaultAction(); - if (aurEff->GetAuraType() == SPELL_AURA_MOD_STAT && (aurEff->GetMiscValue() == STAT_STAMINA || aurEff->GetMiscValue() == STAT_INTELLECT)) - { - int32 currentAmount = aurEff->GetAmount(); - int32 newAmount = GetEffect(aurEff->GetEffIndex())->CalculateAmount(GetCaster()); - if (newAmount != currentAmount) + if (aurEff->GetMiscValue() == STAT_STAMINA) { - if (aurEff->GetMiscValue() == STAT_STAMINA) - { - uint32 actStat = GetUnitOwner()->GetHealth(); - GetEffect(aurEff->GetEffIndex())->ChangeAmount(newAmount, false); - GetUnitOwner()->SetHealth(std::min(GetUnitOwner()->GetMaxHealth(), actStat)); - } - else - { - uint32 actStat = GetUnitOwner()->GetPower(POWER_MANA); - GetEffect(aurEff->GetEffIndex())->ChangeAmount(newAmount, false); - GetUnitOwner()->SetPower(POWER_MANA, std::min(GetUnitOwner()->GetMaxPower(POWER_MANA), actStat)); - } + uint32 actStat = GetUnitOwner()->GetHealth(); + GetEffect(aurEff->GetEffIndex())->ChangeAmount(newAmount, false); + GetUnitOwner()->SetHealth(std::min(GetUnitOwner()->GetMaxHealth(), actStat)); + } + else + { + uint32 actStat = GetUnitOwner()->GetPower(POWER_MANA); + GetEffect(aurEff->GetEffIndex())->ChangeAmount(newAmount, false); + GetUnitOwner()->SetPower(POWER_MANA, std::min(GetUnitOwner()->GetMaxPower(POWER_MANA), actStat)); } } - else - GetEffect(aurEff->GetEffIndex())->RecalculateAmount(); } - - void Register() - { - if (m_scriptSpellId != 35657) - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_pet_scaling_AuraScript::CalculateResistanceAmount, EFFECT_ALL, SPELL_AURA_MOD_RESISTANCE); - - if (m_scriptSpellId == 35657 || m_scriptSpellId == 35658) - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_pet_scaling_AuraScript::CalculateStatAmount, EFFECT_ALL, SPELL_AURA_MOD_STAT); - - if (m_scriptSpellId == 35657) - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_pet_scaling_AuraScript::CalculateAPAmount, EFFECT_ALL, SPELL_AURA_MOD_ATTACK_POWER); - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_pet_scaling_AuraScript::CalculateSPAmount, EFFECT_ALL, SPELL_AURA_MOD_DAMAGE_DONE); - } - - OnEffectApply += AuraEffectApplyFn(spell_mage_pet_scaling_AuraScript::HandleEffectApply, EFFECT_ALL, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); - DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_mage_pet_scaling_AuraScript::CalcPeriodic, EFFECT_ALL, SPELL_AURA_ANY); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_mage_pet_scaling_AuraScript::HandlePeriodic, EFFECT_ALL, SPELL_AURA_ANY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_mage_pet_scaling_AuraScript(); + else + GetEffect(aurEff->GetEffIndex())->RecalculateAmount(); } + + void Register() + { + if (m_scriptSpellId != 35657) + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_pet_scaling_AuraScript::CalculateResistanceAmount, EFFECT_ALL, SPELL_AURA_MOD_RESISTANCE); + + if (m_scriptSpellId == 35657 || m_scriptSpellId == 35658) + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_pet_scaling_AuraScript::CalculateStatAmount, EFFECT_ALL, SPELL_AURA_MOD_STAT); + + if (m_scriptSpellId == 35657) + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_pet_scaling_AuraScript::CalculateAPAmount, EFFECT_ALL, SPELL_AURA_MOD_ATTACK_POWER); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_pet_scaling_AuraScript::CalculateSPAmount, EFFECT_ALL, SPELL_AURA_MOD_DAMAGE_DONE); + } + + OnEffectApply += AuraEffectApplyFn(spell_mage_pet_scaling_AuraScript::HandleEffectApply, EFFECT_ALL, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); + DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_mage_pet_scaling_AuraScript::CalcPeriodic, EFFECT_ALL, SPELL_AURA_ANY); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_mage_pet_scaling_AuraScript::HandlePeriodic, EFFECT_ALL, SPELL_AURA_ANY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_mage_pet_scaling_AuraScript(); + } }; class spell_mage_brain_freeze : public SpellScriptLoader { - public: - spell_mage_brain_freeze() : SpellScriptLoader("spell_mage_brain_freeze") { } +public: + spell_mage_brain_freeze() : SpellScriptLoader("spell_mage_brain_freeze") { } - class spell_mage_brain_freeze_AuraScript : public AuraScript + class spell_mage_brain_freeze_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mage_brain_freeze_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_mage_brain_freeze_AuraScript); + const SpellInfo* spellInfo = eventInfo.GetDamageInfo()->GetSpellInfo(); + if (!spellInfo) + return false; - bool CheckProc(ProcEventInfo& eventInfo) - { - const SpellInfo* spellInfo = eventInfo.GetDamageInfo()->GetSpellInfo(); - if (!spellInfo) - return false; + // xinef: Improved Blizzard, generic chilled check + if (spellInfo->SpellFamilyFlags[0] & 0x100000) + return spellInfo->Id == SPELL_MAGE_IMPROVED_BLIZZARD_CHILLED; - // xinef: Improved Blizzard, generic chilled check - if (spellInfo->SpellFamilyFlags[0] & 0x100000) - return spellInfo->Id == SPELL_MAGE_IMPROVED_BLIZZARD_CHILLED; - - return true; - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_mage_brain_freeze_AuraScript::CheckProc); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_mage_brain_freeze_AuraScript(); + return true; } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_mage_brain_freeze_AuraScript::CheckProc); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_mage_brain_freeze_AuraScript(); + } }; class spell_mage_glyph_of_eternal_water : public SpellScriptLoader { - public: - spell_mage_glyph_of_eternal_water() : SpellScriptLoader("spell_mage_glyph_of_eternal_water") { } +public: + spell_mage_glyph_of_eternal_water() : SpellScriptLoader("spell_mage_glyph_of_eternal_water") { } - class spell_mage_glyph_of_eternal_water_AuraScript : public AuraScript + class spell_mage_glyph_of_eternal_water_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mage_glyph_of_eternal_water_AuraScript); + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_mage_glyph_of_eternal_water_AuraScript); - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* target = GetTarget()) - if (Player* player = target->ToPlayer()) - if (Pet* pet = player->GetPet()) - if (pet->GetEntry() == NPC_WATER_ELEMENTAL_PERM) - pet->Remove(PET_SAVE_NOT_IN_SLOT); - } - - void Register() - { - OnEffectRemove += AuraEffectRemoveFn(spell_mage_glyph_of_eternal_water_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_mage_glyph_of_eternal_water_AuraScript(); + if (Unit* target = GetTarget()) + if (Player* player = target->ToPlayer()) + if (Pet* pet = player->GetPet()) + if (pet->GetEntry() == NPC_WATER_ELEMENTAL_PERM) + pet->Remove(PET_SAVE_NOT_IN_SLOT); } + + void Register() + { + OnEffectRemove += AuraEffectRemoveFn(spell_mage_glyph_of_eternal_water_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_mage_glyph_of_eternal_water_AuraScript(); + } }; @@ -501,499 +501,499 @@ class spell_mage_glyph_of_eternal_water : public SpellScriptLoader // Incanter's Absorbtion class spell_mage_incanters_absorbtion_base_AuraScript : public AuraScript { - public: - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_INCANTERS_ABSORBTION_R1)) - return false; - return true; - } +public: + bool Validate(SpellInfo const* /*spellInfo*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_INCANTERS_ABSORBTION_R1)) + return false; + return true; + } - void Trigger(AuraEffect* aurEff, DamageInfo& /*dmgInfo*/, uint32& absorbAmount) - { - Unit* target = GetTarget(); + void Trigger(AuraEffect* aurEff, DamageInfo& /*dmgInfo*/, uint32& absorbAmount) + { + Unit* target = GetTarget(); - if (AuraEffect* talentAurEff = target->GetAuraEffectOfRankedSpell(SPELL_MAGE_INCANTERS_ABSORBTION_R1, EFFECT_0)) + if (AuraEffect* talentAurEff = target->GetAuraEffectOfRankedSpell(SPELL_MAGE_INCANTERS_ABSORBTION_R1, EFFECT_0)) + { + int32 bp = CalculatePct(absorbAmount, talentAurEff->GetAmount()); + if (AuraEffect* currentAura = target->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_DONE, SPELLFAMILY_MAGE, 2941, EFFECT_0)) { - int32 bp = CalculatePct(absorbAmount, talentAurEff->GetAmount()); - if (AuraEffect* currentAura = target->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_DONE, SPELLFAMILY_MAGE, 2941, EFFECT_0)) - { - bp += int32(currentAura->GetAmount() * (currentAura->GetBase()->GetDuration() / (float)currentAura->GetBase()->GetMaxDuration())); - currentAura->ChangeAmount(bp); - currentAura->GetBase()->RefreshDuration(); - } - else - target->CastCustomSpell(target, SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED, &bp, nullptr, nullptr, true, NULL, aurEff); + bp += int32(currentAura->GetAmount() * (currentAura->GetBase()->GetDuration() / (float)currentAura->GetBase()->GetMaxDuration())); + currentAura->ChangeAmount(bp); + currentAura->GetBase()->RefreshDuration(); } + else + target->CastCustomSpell(target, SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED, &bp, nullptr, nullptr, true, NULL, aurEff); } + } }; // -11113 - Blast Wave class spell_mage_blast_wave : public SpellScriptLoader { - public: - spell_mage_blast_wave() : SpellScriptLoader("spell_mage_blast_wave") { } +public: + spell_mage_blast_wave() : SpellScriptLoader("spell_mage_blast_wave") { } - class spell_mage_blast_wave_SpellScript : public SpellScript + class spell_mage_blast_wave_SpellScript : public SpellScript + { + PrepareSpellScript(spell_mage_blast_wave_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_mage_blast_wave_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_GLYPH_OF_BLAST_WAVE)) - return false; - return true; - } - - void HandleKnockBack(SpellEffIndex effIndex) - { - if (GetCaster()->HasAura(SPELL_MAGE_GLYPH_OF_BLAST_WAVE)) - PreventHitDefaultEffect(effIndex); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_mage_blast_wave_SpellScript::HandleKnockBack, EFFECT_2, SPELL_EFFECT_KNOCK_BACK); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_mage_blast_wave_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_GLYPH_OF_BLAST_WAVE)) + return false; + return true; } + + void HandleKnockBack(SpellEffIndex effIndex) + { + if (GetCaster()->HasAura(SPELL_MAGE_GLYPH_OF_BLAST_WAVE)) + PreventHitDefaultEffect(effIndex); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_mage_blast_wave_SpellScript::HandleKnockBack, EFFECT_2, SPELL_EFFECT_KNOCK_BACK); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_mage_blast_wave_SpellScript(); + } }; // 11958 - Cold Snap class spell_mage_cold_snap : public SpellScriptLoader { - public: - spell_mage_cold_snap() : SpellScriptLoader("spell_mage_cold_snap") { } +public: + spell_mage_cold_snap() : SpellScriptLoader("spell_mage_cold_snap") { } - class spell_mage_cold_snap_SpellScript : public SpellScript + class spell_mage_cold_snap_SpellScript : public SpellScript + { + PrepareSpellScript(spell_mage_cold_snap_SpellScript); + + bool Load() { - PrepareSpellScript(spell_mage_cold_snap_SpellScript); + return GetCaster()->GetTypeId() == TYPEID_PLAYER; + } - bool Load() + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Player* caster = GetCaster()->ToPlayer(); + // immediately finishes the cooldown on Frost spells + + PlayerSpellMap const& spellMap = caster->GetSpellMap(); + for (PlayerSpellMap::const_iterator itr = spellMap.begin(); itr != spellMap.end(); ++itr) { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Player* caster = GetCaster()->ToPlayer(); - // immediately finishes the cooldown on Frost spells - - PlayerSpellMap const& spellMap = caster->GetSpellMap(); - for (PlayerSpellMap::const_iterator itr = spellMap.begin(); itr != spellMap.end(); ++itr) + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->first); + if (spellInfo->SpellFamilyName == SPELLFAMILY_MAGE && (spellInfo->GetSchoolMask() & SPELL_SCHOOL_MASK_FROST) && spellInfo->Id != SPELL_MAGE_COLD_SNAP && spellInfo->GetRecoveryTime() > 0) { - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->first); - if (spellInfo->SpellFamilyName == SPELLFAMILY_MAGE && (spellInfo->GetSchoolMask() & SPELL_SCHOOL_MASK_FROST) && spellInfo->Id != SPELL_MAGE_COLD_SNAP && spellInfo->GetRecoveryTime() > 0) - { - SpellCooldowns::iterator citr = caster->GetSpellCooldownMap().find(spellInfo->Id); - if (citr != caster->GetSpellCooldownMap().end() && citr->second.needSendToClient) - caster->RemoveSpellCooldown(spellInfo->Id, true); - else - caster->RemoveSpellCooldown(spellInfo->Id, false); - } + SpellCooldowns::iterator citr = caster->GetSpellCooldownMap().find(spellInfo->Id); + if (citr != caster->GetSpellCooldownMap().end() && citr->second.needSendToClient) + caster->RemoveSpellCooldown(spellInfo->Id, true); + else + caster->RemoveSpellCooldown(spellInfo->Id, false); } } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_mage_cold_snap_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_mage_cold_snap_SpellScript(); } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_mage_cold_snap_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_mage_cold_snap_SpellScript(); + } }; // -543 - Fire Ward // -6143 - Frost Ward class spell_mage_fire_frost_ward : public SpellScriptLoader { - public: - spell_mage_fire_frost_ward() : SpellScriptLoader("spell_mage_fire_frost_ward") { } +public: + spell_mage_fire_frost_ward() : SpellScriptLoader("spell_mage_fire_frost_ward") { } - class spell_mage_fire_frost_ward_AuraScript : public spell_mage_incanters_absorbtion_base_AuraScript + class spell_mage_fire_frost_ward_AuraScript : public spell_mage_incanters_absorbtion_base_AuraScript + { + PrepareAuraScript(spell_mage_fire_frost_ward_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_mage_fire_frost_ward_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_FROST_WARDING_TRIGGERED)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_FROST_WARDING_R1)) - return false; - return true; - } - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) - { - canBeRecalculated = false; - if (Unit* caster = GetCaster()) - { - // +80.68% from sp bonus - float bonus = 0.8068f; - - bonus *= caster->SpellBaseDamageBonusDone(GetSpellInfo()->GetSchoolMask()); - bonus *= caster->CalculateLevelPenalty(GetSpellInfo()); - - amount += int32(bonus); - } - } - - void Absorb(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount) - { - Unit* target = GetTarget(); - if (AuraEffect* talentAurEff = target->GetAuraEffectOfRankedSpell(SPELL_MAGE_FROST_WARDING_R1, EFFECT_0)) - { - int32 chance = talentAurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue(); // SPELL_EFFECT_DUMMY with NO_TARGET - - if (roll_chance_i(chance)) - { - int32 bp = dmgInfo.GetDamage(); - target->CastCustomSpell(target, SPELL_MAGE_FROST_WARDING_TRIGGERED, &bp, nullptr, nullptr, true, NULL, aurEff); - absorbAmount = 0; - - // Xinef: trigger Incanters Absorbtion - uint32 damage = dmgInfo.GetDamage(); - Trigger(aurEff, dmgInfo, damage); - - // Xinef: hack for chaos bolt - if (!dmgInfo.GetSpellInfo() || dmgInfo.GetSpellInfo()->SpellIconID != 3178) - dmgInfo.AbsorbDamage(bp); - - PreventDefaultAction(); - } - } - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_fire_frost_ward_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); - OnEffectAbsorb += AuraEffectAbsorbFn(spell_mage_fire_frost_ward_AuraScript::Absorb, EFFECT_0); - AfterEffectAbsorb += AuraEffectAbsorbFn(spell_mage_fire_frost_ward_AuraScript::Trigger, EFFECT_0); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_mage_fire_frost_ward_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_FROST_WARDING_TRIGGERED)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_FROST_WARDING_R1)) + return false; + return true; } + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) + { + canBeRecalculated = false; + if (Unit* caster = GetCaster()) + { + // +80.68% from sp bonus + float bonus = 0.8068f; + + bonus *= caster->SpellBaseDamageBonusDone(GetSpellInfo()->GetSchoolMask()); + bonus *= caster->CalculateLevelPenalty(GetSpellInfo()); + + amount += int32(bonus); + } + } + + void Absorb(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount) + { + Unit* target = GetTarget(); + if (AuraEffect* talentAurEff = target->GetAuraEffectOfRankedSpell(SPELL_MAGE_FROST_WARDING_R1, EFFECT_0)) + { + int32 chance = talentAurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue(); // SPELL_EFFECT_DUMMY with NO_TARGET + + if (roll_chance_i(chance)) + { + int32 bp = dmgInfo.GetDamage(); + target->CastCustomSpell(target, SPELL_MAGE_FROST_WARDING_TRIGGERED, &bp, nullptr, nullptr, true, NULL, aurEff); + absorbAmount = 0; + + // Xinef: trigger Incanters Absorbtion + uint32 damage = dmgInfo.GetDamage(); + Trigger(aurEff, dmgInfo, damage); + + // Xinef: hack for chaos bolt + if (!dmgInfo.GetSpellInfo() || dmgInfo.GetSpellInfo()->SpellIconID != 3178) + dmgInfo.AbsorbDamage(bp); + + PreventDefaultAction(); + } + } + } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_fire_frost_ward_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); + OnEffectAbsorb += AuraEffectAbsorbFn(spell_mage_fire_frost_ward_AuraScript::Absorb, EFFECT_0); + AfterEffectAbsorb += AuraEffectAbsorbFn(spell_mage_fire_frost_ward_AuraScript::Trigger, EFFECT_0); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_mage_fire_frost_ward_AuraScript(); + } }; // 54646 - Focus Magic class spell_mage_focus_magic : public SpellScriptLoader { - public: - spell_mage_focus_magic() : SpellScriptLoader("spell_mage_focus_magic") { } +public: + spell_mage_focus_magic() : SpellScriptLoader("spell_mage_focus_magic") { } - class spell_mage_focus_magic_AuraScript : public AuraScript + class spell_mage_focus_magic_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mage_focus_magic_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_mage_focus_magic_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_FOCUS_MAGIC_PROC)) - return false; - return true; - } - - bool Load() - { - _procTarget = nullptr; - return true; - } - - bool CheckProc(ProcEventInfo& /*eventInfo*/) - { - _procTarget = GetCaster(); - return _procTarget && _procTarget->IsAlive(); - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) - { - PreventDefaultAction(); - GetTarget()->CastSpell(_procTarget, SPELL_MAGE_FOCUS_MAGIC_PROC, true, NULL, aurEff); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_mage_focus_magic_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_mage_focus_magic_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_MOD_SPELL_CRIT_CHANCE); - } - - private: - Unit* _procTarget; - }; - - AuraScript* GetAuraScript() const - { - return new spell_mage_focus_magic_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_FOCUS_MAGIC_PROC)) + return false; + return true; } + + bool Load() + { + _procTarget = nullptr; + return true; + } + + bool CheckProc(ProcEventInfo& /*eventInfo*/) + { + _procTarget = GetCaster(); + return _procTarget && _procTarget->IsAlive(); + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + GetTarget()->CastSpell(_procTarget, SPELL_MAGE_FOCUS_MAGIC_PROC, true, NULL, aurEff); + } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_mage_focus_magic_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_mage_focus_magic_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_MOD_SPELL_CRIT_CHANCE); + } + + private: + Unit* _procTarget; + }; + + AuraScript* GetAuraScript() const + { + return new spell_mage_focus_magic_AuraScript(); + } }; // -11426 - Ice Barrier class spell_mage_ice_barrier : public SpellScriptLoader { - public: - spell_mage_ice_barrier() : SpellScriptLoader("spell_mage_ice_barrier") { } +public: + spell_mage_ice_barrier() : SpellScriptLoader("spell_mage_ice_barrier") { } - static int32 CalculateSpellAmount(Unit* caster, int32 amount, const SpellInfo* spellInfo, const AuraEffect* aurEff) + static int32 CalculateSpellAmount(Unit* caster, int32 amount, const SpellInfo* spellInfo, const AuraEffect* aurEff) + { + // +80.68% from sp bonus + float bonus = 0.8068f; + + bonus *= caster->SpellBaseDamageBonusDone(spellInfo->GetSchoolMask()); + + // Glyph of Ice Barrier: its weird having a SPELLMOD_ALL_EFFECTS here but its blizzards doing :) + // Glyph of Ice Barrier is only applied at the spell damage bonus because it was already applied to the base value in CalculateSpellDamage + bonus = caster->ApplyEffectModifiers(spellInfo, aurEff->GetEffIndex(), bonus); + + bonus *= caster->CalculateLevelPenalty(spellInfo); + + amount += int32(bonus); + return amount; + } + + class spell_mage_ice_barrier_AuraScript : public spell_mage_incanters_absorbtion_base_AuraScript + { + PrepareAuraScript(spell_mage_ice_barrier_AuraScript); + + void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& canBeRecalculated) { - // +80.68% from sp bonus - float bonus = 0.8068f; - - bonus *= caster->SpellBaseDamageBonusDone(spellInfo->GetSchoolMask()); - - // Glyph of Ice Barrier: its weird having a SPELLMOD_ALL_EFFECTS here but its blizzards doing :) - // Glyph of Ice Barrier is only applied at the spell damage bonus because it was already applied to the base value in CalculateSpellDamage - bonus = caster->ApplyEffectModifiers(spellInfo, aurEff->GetEffIndex(), bonus); - - bonus *= caster->CalculateLevelPenalty(spellInfo); - - amount += int32(bonus); - return amount; + canBeRecalculated = false; + if (Unit* caster = GetCaster()) + amount = CalculateSpellAmount(caster, amount, GetSpellInfo(), aurEff); } - class spell_mage_ice_barrier_AuraScript : public spell_mage_incanters_absorbtion_base_AuraScript + void Register() { - PrepareAuraScript(spell_mage_ice_barrier_AuraScript); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_ice_barrier_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); + AfterEffectAbsorb += AuraEffectAbsorbFn(spell_mage_ice_barrier_AuraScript::Trigger, EFFECT_0); + } + }; - void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& canBeRecalculated) + AuraScript* GetAuraScript() const + { + return new spell_mage_ice_barrier_AuraScript(); + } + + class spell_mage_ice_barrier_SpellScript : public SpellScript + { + PrepareSpellScript(spell_mage_ice_barrier_SpellScript); + + SpellCastResult CheckCast() + { + Unit* caster = GetCaster(); + + if (AuraEffect* aurEff = caster->GetAuraEffect(SPELL_AURA_SCHOOL_ABSORB, (SpellFamilyNames)GetSpellInfo()->SpellFamilyName, GetSpellInfo()->SpellIconID, EFFECT_0)) { - canBeRecalculated = false; - if (Unit* caster = GetCaster()) - amount = CalculateSpellAmount(caster, amount, GetSpellInfo(), aurEff); + int32 newAmount = GetSpellInfo()->Effects[EFFECT_0].CalcValue(caster, NULL, nullptr); + newAmount = CalculateSpellAmount(caster, newAmount, GetSpellInfo(), aurEff); + + if (aurEff->GetAmount() > newAmount) + return SPELL_FAILED_AURA_BOUNCED; } - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_ice_barrier_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); - AfterEffectAbsorb += AuraEffectAbsorbFn(spell_mage_ice_barrier_AuraScript::Trigger, EFFECT_0); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_mage_ice_barrier_AuraScript(); + return SPELL_CAST_OK; } - class spell_mage_ice_barrier_SpellScript : public SpellScript + void Register() { - PrepareSpellScript(spell_mage_ice_barrier_SpellScript); - - SpellCastResult CheckCast() - { - Unit* caster = GetCaster(); - - if (AuraEffect* aurEff = caster->GetAuraEffect(SPELL_AURA_SCHOOL_ABSORB, (SpellFamilyNames)GetSpellInfo()->SpellFamilyName, GetSpellInfo()->SpellIconID, EFFECT_0)) - { - int32 newAmount = GetSpellInfo()->Effects[EFFECT_0].CalcValue(caster, NULL, nullptr); - newAmount = CalculateSpellAmount(caster, newAmount, GetSpellInfo(), aurEff); - - if (aurEff->GetAmount() > newAmount) - return SPELL_FAILED_AURA_BOUNCED; - } - - return SPELL_CAST_OK; - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_mage_ice_barrier_SpellScript::CheckCast); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_mage_ice_barrier_SpellScript; + OnCheckCast += SpellCheckCastFn(spell_mage_ice_barrier_SpellScript::CheckCast); } + }; + + SpellScript* GetSpellScript() const + { + return new spell_mage_ice_barrier_SpellScript; + } }; // -11119 - Ignite class spell_mage_ignite : public SpellScriptLoader { - public: - spell_mage_ignite() : SpellScriptLoader("spell_mage_ignite") { } +public: + spell_mage_ignite() : SpellScriptLoader("spell_mage_ignite") { } - class spell_mage_ignite_AuraScript : public AuraScript + class spell_mage_ignite_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mage_ignite_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_mage_ignite_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_IGNITE)) - return false; - return true; - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - if (!eventInfo.GetActor() || !eventInfo.GetProcTarget()) - return false; - - // Molten Armor - if (SpellInfo const* spellInfo = eventInfo.GetDamageInfo()->GetSpellInfo()) - if (spellInfo->SpellFamilyFlags[1] & 0x8) - return false; - - return true; - } - - void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - - SpellInfo const* igniteDot = sSpellMgr->GetSpellInfo(SPELL_MAGE_IGNITE); - int32 pct = 8 * GetSpellInfo()->GetRank(); - - int32 amount = int32(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), pct) / igniteDot->GetMaxTicks()); - - // Xinef: implement ignite bug - eventInfo.GetProcTarget()->CastDelayedSpellWithPeriodicAmount(eventInfo.GetActor(), SPELL_MAGE_IGNITE, SPELL_AURA_PERIODIC_DAMAGE, amount); - //GetTarget()->CastCustomSpell(SPELL_MAGE_IGNITE, SPELLVALUE_BASE_POINT0, amount, eventInfo.GetProcTarget(), true, NULL, aurEff); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_mage_ignite_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_mage_ignite_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_mage_ignite_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_IGNITE)) + return false; + return true; } + + bool CheckProc(ProcEventInfo& eventInfo) + { + if (!eventInfo.GetActor() || !eventInfo.GetProcTarget()) + return false; + + // Molten Armor + if (SpellInfo const* spellInfo = eventInfo.GetDamageInfo()->GetSpellInfo()) + if (spellInfo->SpellFamilyFlags[1] & 0x8) + return false; + + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + SpellInfo const* igniteDot = sSpellMgr->GetSpellInfo(SPELL_MAGE_IGNITE); + int32 pct = 8 * GetSpellInfo()->GetRank(); + + int32 amount = int32(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), pct) / igniteDot->GetMaxTicks()); + + // Xinef: implement ignite bug + eventInfo.GetProcTarget()->CastDelayedSpellWithPeriodicAmount(eventInfo.GetActor(), SPELL_MAGE_IGNITE, SPELL_AURA_PERIODIC_DAMAGE, amount); + //GetTarget()->CastCustomSpell(SPELL_MAGE_IGNITE, SPELLVALUE_BASE_POINT0, amount, eventInfo.GetProcTarget(), true, NULL, aurEff); + } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_mage_ignite_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_mage_ignite_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_mage_ignite_AuraScript(); + } }; // -44457 - Living Bomb class spell_mage_living_bomb : public SpellScriptLoader { - public: - spell_mage_living_bomb() : SpellScriptLoader("spell_mage_living_bomb") { } +public: + spell_mage_living_bomb() : SpellScriptLoader("spell_mage_living_bomb") { } - class spell_mage_living_bomb_AuraScript : public AuraScript + class spell_mage_living_bomb_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mage_living_bomb_AuraScript); + + bool Validate(SpellInfo const* spell) { - PrepareAuraScript(spell_mage_living_bomb_AuraScript); - - bool Validate(SpellInfo const* spell) - { - if (!sSpellMgr->GetSpellInfo(uint32(spell->Effects[EFFECT_1].CalcValue()))) - return false; - return true; - } - - void AfterRemove(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(), uint32(aurEff->GetAmount()), true, NULL, aurEff); - } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_mage_living_bomb_AuraScript::AfterRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_mage_living_bomb_AuraScript(); + if (!sSpellMgr->GetSpellInfo(uint32(spell->Effects[EFFECT_1].CalcValue()))) + return false; + return true; } + + void AfterRemove(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(), uint32(aurEff->GetAmount()), true, NULL, aurEff); + } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_mage_living_bomb_AuraScript::AfterRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_mage_living_bomb_AuraScript(); + } }; // -1463 - Mana Shield class spell_mage_mana_shield : public SpellScriptLoader { - public: - spell_mage_mana_shield() : SpellScriptLoader("spell_mage_mana_shield") { } +public: + spell_mage_mana_shield() : SpellScriptLoader("spell_mage_mana_shield") { } - class spell_mage_mana_shield_AuraScript : public spell_mage_incanters_absorbtion_base_AuraScript + class spell_mage_mana_shield_AuraScript : public spell_mage_incanters_absorbtion_base_AuraScript + { + PrepareAuraScript(spell_mage_mana_shield_AuraScript); + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) { - PrepareAuraScript(spell_mage_mana_shield_AuraScript); - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) + canBeRecalculated = false; + if (Unit* caster = GetCaster()) { - canBeRecalculated = false; - if (Unit* caster = GetCaster()) - { - // +80.53% from sp bonus - float bonus = 0.8053f; + // +80.53% from sp bonus + float bonus = 0.8053f; - bonus *= caster->SpellBaseDamageBonusDone(GetSpellInfo()->GetSchoolMask()); - bonus *= caster->CalculateLevelPenalty(GetSpellInfo()); + bonus *= caster->SpellBaseDamageBonusDone(GetSpellInfo()->GetSchoolMask()); + bonus *= caster->CalculateLevelPenalty(GetSpellInfo()); - amount += int32(bonus); - } + amount += int32(bonus); } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_mana_shield_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MANA_SHIELD); - AfterEffectManaShield += AuraEffectManaShieldFn(spell_mage_mana_shield_AuraScript::Trigger, EFFECT_0); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_mage_mana_shield_AuraScript(); } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_mana_shield_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MANA_SHIELD); + AfterEffectManaShield += AuraEffectManaShieldFn(spell_mage_mana_shield_AuraScript::Trigger, EFFECT_0); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_mage_mana_shield_AuraScript(); + } }; // -29074 - Master of Elements class spell_mage_master_of_elements : public SpellScriptLoader { - public: - spell_mage_master_of_elements() : SpellScriptLoader("spell_mage_master_of_elements") { } +public: + spell_mage_master_of_elements() : SpellScriptLoader("spell_mage_master_of_elements") { } - class spell_mage_master_of_elements_AuraScript : public AuraScript + class spell_mage_master_of_elements_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mage_master_of_elements_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_mage_master_of_elements_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_MASTER_OF_ELEMENTS_ENERGIZE)) - return false; - return true; - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - return eventInfo.GetDamageInfo()->GetSpellInfo(); // eventInfo.GetSpellInfo() - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - - int32 mana = int32(eventInfo.GetDamageInfo()->GetSpellInfo()->CalcPowerCost(GetTarget(), eventInfo.GetDamageInfo()->GetSchoolMask())); - mana = CalculatePct(mana, aurEff->GetAmount()); - - if (mana > 0) - GetTarget()->CastCustomSpell(SPELL_MAGE_MASTER_OF_ELEMENTS_ENERGIZE, SPELLVALUE_BASE_POINT0, mana, GetTarget(), true, NULL, aurEff); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_mage_master_of_elements_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_mage_master_of_elements_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_mage_master_of_elements_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_MASTER_OF_ELEMENTS_ENERGIZE)) + return false; + return true; } + + bool CheckProc(ProcEventInfo& eventInfo) + { + return eventInfo.GetDamageInfo()->GetSpellInfo(); // eventInfo.GetSpellInfo() + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + int32 mana = int32(eventInfo.GetDamageInfo()->GetSpellInfo()->CalcPowerCost(GetTarget(), eventInfo.GetDamageInfo()->GetSchoolMask())); + mana = CalculatePct(mana, aurEff->GetAmount()); + + if (mana > 0) + GetTarget()->CastCustomSpell(SPELL_MAGE_MASTER_OF_ELEMENTS_ENERGIZE, SPELLVALUE_BASE_POINT0, mana, GetTarget(), true, NULL, aurEff); + } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_mage_master_of_elements_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_mage_master_of_elements_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_mage_master_of_elements_AuraScript(); + } }; enum SilvermoonPolymorph @@ -1005,41 +1005,41 @@ enum SilvermoonPolymorph // 32826 - Polymorph (Visual) class spell_mage_polymorph_cast_visual : public SpellScriptLoader { - public: - spell_mage_polymorph_cast_visual() : SpellScriptLoader("spell_mage_polymorph_visual") { } +public: + spell_mage_polymorph_cast_visual() : SpellScriptLoader("spell_mage_polymorph_visual") { } - class spell_mage_polymorph_cast_visual_SpellScript : public SpellScript + class spell_mage_polymorph_cast_visual_SpellScript : public SpellScript + { + PrepareSpellScript(spell_mage_polymorph_cast_visual_SpellScript); + + static const uint32 PolymorhForms[6]; + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_mage_polymorph_cast_visual_SpellScript); - - static const uint32 PolymorhForms[6]; - - bool Validate(SpellInfo const* /*spellInfo*/) - { - // check if spell ids exist in dbc - for (uint32 i = 0; i < 6; ++i) - if (!sSpellMgr->GetSpellInfo(PolymorhForms[i])) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetCaster()->FindNearestCreature(NPC_AUROSALIA, 30.0f)) - if (target->GetTypeId() == TYPEID_UNIT) - target->CastSpell(target, PolymorhForms[urand(0, 5)], true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_mage_polymorph_cast_visual_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_mage_polymorph_cast_visual_SpellScript(); + // check if spell ids exist in dbc + for (uint32 i = 0; i < 6; ++i) + if (!sSpellMgr->GetSpellInfo(PolymorhForms[i])) + return false; + return true; } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + if (Unit* target = GetCaster()->FindNearestCreature(NPC_AUROSALIA, 30.0f)) + if (target->GetTypeId() == TYPEID_UNIT) + target->CastSpell(target, PolymorhForms[urand(0, 5)], true); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_mage_polymorph_cast_visual_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_mage_polymorph_cast_visual_SpellScript(); + } }; const uint32 spell_mage_polymorph_cast_visual::spell_mage_polymorph_cast_visual_SpellScript::PolymorhForms[6] = @@ -1055,59 +1055,59 @@ const uint32 spell_mage_polymorph_cast_visual::spell_mage_polymorph_cast_visual_ // 31687 - Summon Water Elemental class spell_mage_summon_water_elemental : public SpellScriptLoader { - public: - spell_mage_summon_water_elemental() : SpellScriptLoader("spell_mage_summon_water_elemental") { } +public: + spell_mage_summon_water_elemental() : SpellScriptLoader("spell_mage_summon_water_elemental") { } - class spell_mage_summon_water_elemental_SpellScript : public SpellScript + class spell_mage_summon_water_elemental_SpellScript : public SpellScript + { + PrepareSpellScript(spell_mage_summon_water_elemental_SpellScript) + bool Validate(SpellInfo const* /*spellEntry*/) { - PrepareSpellScript(spell_mage_summon_water_elemental_SpellScript) - bool Validate(SpellInfo const* /*spellEntry*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_GLYPH_OF_ETERNAL_WATER)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_SUMMON_WATER_ELEMENTAL_TEMPORARY)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_SUMMON_WATER_ELEMENTAL_PERMANENT)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - - if (Creature *pet = ObjectAccessor::GetCreature(*caster, caster->GetPetGUID())) - if (!pet->IsAlive()) - pet->ToTempSummon()->UnSummon(); - - // Glyph of Eternal Water - if (caster->HasAura(SPELL_MAGE_GLYPH_OF_ETERNAL_WATER)) - caster->CastSpell(caster, SPELL_MAGE_SUMMON_WATER_ELEMENTAL_PERMANENT, true); - else - caster->CastSpell(caster, SPELL_MAGE_SUMMON_WATER_ELEMENTAL_TEMPORARY, true); - - - if (Creature *pet = ObjectAccessor::GetCreature(*caster, caster->GetPetGUID())) - if (pet->GetCharmInfo() && caster->ToPlayer()) - { - pet->m_CreatureSpellCooldowns.clear(); - const SpellInfo* spellEntry = sSpellMgr->GetSpellInfo(31707); - pet->GetCharmInfo()->ToggleCreatureAutocast(spellEntry, true); - pet->GetCharmInfo()->SetSpellAutocast(spellEntry, true); - caster->ToPlayer()->CharmSpellInitialize(); - } - } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_mage_summon_water_elemental_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_mage_summon_water_elemental_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_GLYPH_OF_ETERNAL_WATER)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_SUMMON_WATER_ELEMENTAL_TEMPORARY)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_SUMMON_WATER_ELEMENTAL_PERMANENT)) + return false; + return true; } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + + if (Creature* pet = ObjectAccessor::GetCreature(*caster, caster->GetPetGUID())) + if (!pet->IsAlive()) + pet->ToTempSummon()->UnSummon(); + + // Glyph of Eternal Water + if (caster->HasAura(SPELL_MAGE_GLYPH_OF_ETERNAL_WATER)) + caster->CastSpell(caster, SPELL_MAGE_SUMMON_WATER_ELEMENTAL_PERMANENT, true); + else + caster->CastSpell(caster, SPELL_MAGE_SUMMON_WATER_ELEMENTAL_TEMPORARY, true); + + + if (Creature* pet = ObjectAccessor::GetCreature(*caster, caster->GetPetGUID())) + if (pet->GetCharmInfo() && caster->ToPlayer()) + { + pet->m_CreatureSpellCooldowns.clear(); + const SpellInfo* spellEntry = sSpellMgr->GetSpellInfo(31707); + pet->GetCharmInfo()->ToggleCreatureAutocast(spellEntry, true); + pet->GetCharmInfo()->SetSpellAutocast(spellEntry, true); + caster->ToPlayer()->CharmSpellInitialize(); + } + } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_mage_summon_water_elemental_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_mage_summon_water_elemental_SpellScript(); + } }; void AddSC_mage_spell_scripts() diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp index 33c340416..115ecc364 100644 --- a/src/server/scripts/Spells/spell_paladin.cpp +++ b/src/server/scripts/Spells/spell_paladin.cpp @@ -80,210 +80,210 @@ enum PaladinSpellIcons // Ours class spell_pal_seal_of_command : public SpellScriptLoader { - public: - spell_pal_seal_of_command() : SpellScriptLoader("spell_pal_seal_of_command") { } +public: + spell_pal_seal_of_command() : SpellScriptLoader("spell_pal_seal_of_command") { } - class spell_pal_seal_of_command_AuraScript : public AuraScript + class spell_pal_seal_of_command_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pal_seal_of_command_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_pal_seal_of_command_AuraScript); - - bool CheckProc(ProcEventInfo& eventInfo) - { - if (const SpellInfo* procSpell = eventInfo.GetDamageInfo()->GetSpellInfo()) - if (procSpell->SpellIconID == 3025) // Righteous Vengeance, should not proc SoC - return false; - return true; - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - int32 targets = 3; - if (const SpellInfo* procSpell = eventInfo.GetDamageInfo()->GetSpellInfo()) - if (procSpell->IsAffectingArea()) - targets = 1; - - eventInfo.GetActor()->CastCustomSpell(aurEff->GetSpellInfo()->Effects[EFFECT_0].TriggerSpell, SPELLVALUE_MAX_TARGETS, targets, eventInfo.GetActionTarget(), false, NULL, aurEff); - } - - void Register() - { - if (m_scriptSpellId == 20375) - { - DoCheckProc += AuraCheckProcFn(spell_pal_seal_of_command_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_pal_seal_of_command_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); - } - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_pal_seal_of_command_AuraScript(); + if (const SpellInfo* procSpell = eventInfo.GetDamageInfo()->GetSpellInfo()) + if (procSpell->SpellIconID == 3025) // Righteous Vengeance, should not proc SoC + return false; + return true; } - class spell_pal_seal_of_command_SpellScript : public SpellScript + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { - PrepareSpellScript(spell_pal_seal_of_command_SpellScript); + PreventDefaultAction(); + int32 targets = 3; + if (const SpellInfo* procSpell = eventInfo.GetDamageInfo()->GetSpellInfo()) + if (procSpell->IsAffectingArea()) + targets = 1; - void FilterTargets(std::list& targets) - { - if (const SpellValue* spellValue = GetSpellValue()) - if (spellValue->MaxAffectedTargets == 1) - targets.clear(); - } - - void Register() - { - if (m_scriptSpellId == 20424) - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pal_seal_of_command_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_TARGET_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_pal_seal_of_command_SpellScript(); + eventInfo.GetActor()->CastCustomSpell(aurEff->GetSpellInfo()->Effects[EFFECT_0].TriggerSpell, SPELLVALUE_MAX_TARGETS, targets, eventInfo.GetActionTarget(), false, NULL, aurEff); } + + void Register() + { + if (m_scriptSpellId == 20375) + { + DoCheckProc += AuraCheckProcFn(spell_pal_seal_of_command_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_pal_seal_of_command_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_pal_seal_of_command_AuraScript(); + } + + class spell_pal_seal_of_command_SpellScript : public SpellScript + { + PrepareSpellScript(spell_pal_seal_of_command_SpellScript); + + void FilterTargets(std::list& targets) + { + if (const SpellValue* spellValue = GetSpellValue()) + if (spellValue->MaxAffectedTargets == 1) + targets.clear(); + } + + void Register() + { + if (m_scriptSpellId == 20424) + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pal_seal_of_command_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_TARGET_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_pal_seal_of_command_SpellScript(); + } }; class spell_pal_divine_intervention : public SpellScriptLoader { - public: - spell_pal_divine_intervention() : SpellScriptLoader("spell_pal_divine_intervention") { } +public: + spell_pal_divine_intervention() : SpellScriptLoader("spell_pal_divine_intervention") { } - class spell_pal_divine_intervention_AuraScript : public AuraScript + class spell_pal_divine_intervention_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pal_divine_intervention_AuraScript); + + void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_pal_divine_intervention_AuraScript); - - void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (!GetTarget()->IsInCombat() && GetTarget()->GetTypeId() == TYPEID_PLAYER) - GetTarget()->RemoveAurasDueToSpell(GetTarget()->ToPlayer()->GetTeamId() == TEAM_ALLIANCE ? 57723 : 57724); - } - - void Register() - { - OnEffectRemove += AuraEffectRemoveFn(spell_pal_divine_intervention_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_SCHOOL_IMMUNITY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_pal_divine_intervention_AuraScript(); + if (!GetTarget()->IsInCombat() && GetTarget()->GetTypeId() == TYPEID_PLAYER) + GetTarget()->RemoveAurasDueToSpell(GetTarget()->ToPlayer()->GetTeamId() == TEAM_ALLIANCE ? 57723 : 57724); } + + void Register() + { + OnEffectRemove += AuraEffectRemoveFn(spell_pal_divine_intervention_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_SCHOOL_IMMUNITY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_pal_divine_intervention_AuraScript(); + } }; class spell_pal_seal_of_light : public SpellScriptLoader { - public: - spell_pal_seal_of_light() : SpellScriptLoader("spell_pal_seal_of_light") { } +public: + spell_pal_seal_of_light() : SpellScriptLoader("spell_pal_seal_of_light") { } - class spell_pal_seal_of_light_AuraScript : public AuraScript + class spell_pal_seal_of_light_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pal_seal_of_light_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_pal_seal_of_light_AuraScript); - - bool CheckProc(ProcEventInfo& eventInfo) - { - // xinef: skip divine storm self hit (dummy) and righteous vengeance (0x20000000= - return eventInfo.GetActor() != eventInfo.GetProcTarget() && (!eventInfo.GetDamageInfo()->GetSpellInfo() || !eventInfo.GetDamageInfo()->GetSpellInfo()->SpellFamilyFlags.HasFlag(0x20000000)); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_pal_seal_of_light_AuraScript::CheckProc); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_pal_seal_of_light_AuraScript(); + // xinef: skip divine storm self hit (dummy) and righteous vengeance (0x20000000= + return eventInfo.GetActor() != eventInfo.GetProcTarget() && (!eventInfo.GetDamageInfo()->GetSpellInfo() || !eventInfo.GetDamageInfo()->GetSpellInfo()->SpellFamilyFlags.HasFlag(0x20000000)); } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_pal_seal_of_light_AuraScript::CheckProc); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_pal_seal_of_light_AuraScript(); + } }; class spell_pal_sacred_shield_base : public SpellScriptLoader { - public: - spell_pal_sacred_shield_base() : SpellScriptLoader("spell_pal_sacred_shield_base") { } +public: + spell_pal_sacred_shield_base() : SpellScriptLoader("spell_pal_sacred_shield_base") { } - class spell_pal_sacred_shield_base_AuraScript : public AuraScript + class spell_pal_sacred_shield_base_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pal_sacred_shield_base_AuraScript); + + void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) { - PrepareAuraScript(spell_pal_sacred_shield_base_AuraScript); - - void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) + if (Unit* caster = GetCaster()) { - if (Unit* caster = GetCaster()) - { - const SpellInfo* spellInfo = sSpellMgr->GetSpellInfo(GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell); - amount = spellInfo->Effects[EFFECT_0].CalcValue(); + const SpellInfo* spellInfo = sSpellMgr->GetSpellInfo(GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell); + amount = spellInfo->Effects[EFFECT_0].CalcValue(); - // +75.00% from sp bonus - amount += CalculatePct(caster->SpellBaseDamageBonusDone(spellInfo->GetSchoolMask()), 75.0f); + // +75.00% from sp bonus + amount += CalculatePct(caster->SpellBaseDamageBonusDone(spellInfo->GetSchoolMask()), 75.0f); - // Xinef: removed divine guardian because it will affect triggered spell with increased amount - // Arena - Dampening - if (AuraEffect const* dampening = caster->GetAuraEffect(SPELL_GENERIC_ARENA_DAMPENING, EFFECT_0)) - AddPct(amount, dampening->GetAmount()); - // Battleground - Dampening - else if (AuraEffect const* dampening = caster->GetAuraEffect(SPELL_GENERIC_BATTLEGROUND_DAMPENING, EFFECT_0)) - AddPct(amount, dampening->GetAmount()); - } + // Xinef: removed divine guardian because it will affect triggered spell with increased amount + // Arena - Dampening + if (AuraEffect const* dampening = caster->GetAuraEffect(SPELL_GENERIC_ARENA_DAMPENING, EFFECT_0)) + AddPct(amount, dampening->GetAmount()); + // Battleground - Dampening + else if (AuraEffect const* dampening = caster->GetAuraEffect(SPELL_GENERIC_BATTLEGROUND_DAMPENING, EFFECT_0)) + AddPct(amount, dampening->GetAmount()); } - - bool CheckProc(ProcEventInfo& eventInfo) - { - return !(eventInfo.GetHitMask() & PROC_EX_INTERNAL_HOT) && eventInfo.GetDamageInfo()->GetDamage() > 0; - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - - if (eventInfo.GetTypeMask() & PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_POS) - { - Unit* caster = eventInfo.GetActor(); - const SpellInfo* procSpell = eventInfo.GetDamageInfo()->GetSpellInfo(); - if (caster && procSpell->SpellFamilyName == SPELLFAMILY_PALADIN && - procSpell->SpellFamilyFlags.HasFlag(0x40000000) && caster->GetAuraEffect(SPELL_AURA_PROC_TRIGGER_SPELL, SPELLFAMILY_PALADIN, 3021, 0)) // need infusion of light - { - int32 basepoints = int32(float(eventInfo.GetDamageInfo()->GetDamage())/12.0f); - // Item - Paladin T9 Holy 4P Bonus (Flash of Light) - if (AuraEffect const* aurEffect = caster->GetAuraEffect(67191, EFFECT_0)) - AddPct(basepoints, aurEffect->GetAmount()); - - caster->CastCustomSpell(eventInfo.GetActionTarget(), 66922, &basepoints, nullptr, nullptr, true, 0, aurEff, caster->GetGUID()); - return; - } - - return; - } - - uint32 triggered_spell_id = GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell; - if (eventInfo.GetActionTarget()->HasSpellCooldown(triggered_spell_id)) - return; - - uint32 cooldown = eventInfo.GetProcCooldown(); - int32 basepoints = aurEff->GetAmount(); - - // Item - Paladin T8 Holy 4P Bonus - if (Unit* caster = aurEff->GetCaster()) - if (AuraEffect const* aurEffect = caster->GetAuraEffect(64895, 0)) - cooldown = aurEffect->GetAmount()*IN_MILLISECONDS; - - eventInfo.GetActionTarget()->AddSpellCooldown(triggered_spell_id, 0, cooldown); - eventInfo.GetActionTarget()->CastCustomSpell(eventInfo.GetActionTarget(), triggered_spell_id, &basepoints, nullptr, nullptr, true, NULL, aurEff, eventInfo.GetActionTarget()->GetGUID()); - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pal_sacred_shield_base_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_DUMMY); - DoCheckProc += AuraCheckProcFn(spell_pal_sacred_shield_base_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_pal_sacred_shield_base_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_pal_sacred_shield_base_AuraScript(); } + + bool CheckProc(ProcEventInfo& eventInfo) + { + return !(eventInfo.GetHitMask() & PROC_EX_INTERNAL_HOT) && eventInfo.GetDamageInfo()->GetDamage() > 0; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + if (eventInfo.GetTypeMask() & PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_POS) + { + Unit* caster = eventInfo.GetActor(); + const SpellInfo* procSpell = eventInfo.GetDamageInfo()->GetSpellInfo(); + if (caster && procSpell->SpellFamilyName == SPELLFAMILY_PALADIN && + procSpell->SpellFamilyFlags.HasFlag(0x40000000) && caster->GetAuraEffect(SPELL_AURA_PROC_TRIGGER_SPELL, SPELLFAMILY_PALADIN, 3021, 0)) // need infusion of light + { + int32 basepoints = int32(float(eventInfo.GetDamageInfo()->GetDamage()) / 12.0f); + // Item - Paladin T9 Holy 4P Bonus (Flash of Light) + if (AuraEffect const* aurEffect = caster->GetAuraEffect(67191, EFFECT_0)) + AddPct(basepoints, aurEffect->GetAmount()); + + caster->CastCustomSpell(eventInfo.GetActionTarget(), 66922, &basepoints, nullptr, nullptr, true, 0, aurEff, caster->GetGUID()); + return; + } + + return; + } + + uint32 triggered_spell_id = GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell; + if (eventInfo.GetActionTarget()->HasSpellCooldown(triggered_spell_id)) + return; + + uint32 cooldown = eventInfo.GetProcCooldown(); + int32 basepoints = aurEff->GetAmount(); + + // Item - Paladin T8 Holy 4P Bonus + if (Unit* caster = aurEff->GetCaster()) + if (AuraEffect const* aurEffect = caster->GetAuraEffect(64895, 0)) + cooldown = aurEffect->GetAmount() * IN_MILLISECONDS; + + eventInfo.GetActionTarget()->AddSpellCooldown(triggered_spell_id, 0, cooldown); + eventInfo.GetActionTarget()->CastCustomSpell(eventInfo.GetActionTarget(), triggered_spell_id, &basepoints, nullptr, nullptr, true, NULL, aurEff, eventInfo.GetActionTarget()->GetGUID()); + } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pal_sacred_shield_base_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_DUMMY); + DoCheckProc += AuraCheckProcFn(spell_pal_sacred_shield_base_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_pal_sacred_shield_base_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_pal_sacred_shield_base_AuraScript(); + } }; @@ -291,8 +291,8 @@ class spell_pal_sacred_shield_base : public SpellScriptLoader // 31850 - Ardent Defender class spell_pal_ardent_defender : public SpellScriptLoader { - public: - spell_pal_ardent_defender() : SpellScriptLoader("spell_pal_ardent_defender") { } +public: + spell_pal_ardent_defender() : SpellScriptLoader("spell_pal_ardent_defender") { } class spell_pal_ardent_defender_AuraScript : public AuraScript { @@ -327,13 +327,13 @@ class spell_pal_ardent_defender : public SpellScriptLoader return GetUnitOwner()->GetTypeId() == TYPEID_PLAYER; } - void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) { // Set absorbtion amount to unlimited amount = -1; } - void Absorb(AuraEffect* aurEff, DamageInfo & dmgInfo, uint32 & absorbAmount) + void Absorb(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount) { Unit* victim = GetTarget(); int32 remainingHealth = victim->GetHealth() - dmgInfo.GetDamage(); @@ -349,8 +349,8 @@ class spell_pal_ardent_defender : public SpellScriptLoader // Formula: max defense at level + 140 (raiting from gear) uint32 reqDefForMaxHeal = victim->getLevel() * 5 + 140; float pctFromDefense = (defenseSkillValue >= reqDefForMaxHeal) - ? 1.0f - : float(defenseSkillValue) / float(reqDefForMaxHeal); + ? 1.0f + : float(defenseSkillValue) / float(reqDefForMaxHeal); int32 healAmount = int32(victim->CountPctFromMaxHealth(uint32(healPct * pctFromDefense))); victim->CastCustomSpell(PAL_SPELL_ARDENT_DEFENDER_HEAL, SPELLVALUE_BASE_POINT0, healAmount, victim, true, nullptr, aurEff); @@ -360,8 +360,8 @@ class spell_pal_ardent_defender : public SpellScriptLoader { // Reduce damage that brings us under 35% (or full damage if we are already under 35%) by x% uint32 damageToReduce = (victim->GetHealth() < allowedHealth) - ? dmgInfo.GetDamage() - : allowedHealth - remainingHealth; + ? dmgInfo.GetDamage() + : allowedHealth - remainingHealth; absorbAmount = CalculatePct(damageToReduce, absorbPct); } } @@ -382,627 +382,627 @@ class spell_pal_ardent_defender : public SpellScriptLoader // 31884 - Avenging Wrath class spell_pal_avenging_wrath : public SpellScriptLoader { - public: - spell_pal_avenging_wrath() : SpellScriptLoader("spell_pal_avenging_wrath") { } +public: + spell_pal_avenging_wrath() : SpellScriptLoader("spell_pal_avenging_wrath") { } - class spell_pal_avenging_wrath_AuraScript : public AuraScript + class spell_pal_avenging_wrath_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pal_avenging_wrath_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_pal_avenging_wrath_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_SANCTIFIED_WRATH) + if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_SANCTIFIED_WRATH) || !sSpellMgr->GetSpellInfo(SPELL_PALADIN_SANCTIFIED_WRATH_TALENT_R1)) - return false; - return true; - } - - void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - if (AuraEffect const* aurEff = target->GetAuraEffectOfRankedSpell(SPELL_PALADIN_SANCTIFIED_WRATH_TALENT_R1, EFFECT_2)) - { - int32 basepoints = aurEff->GetAmount(); - target->CastCustomSpell(target, SPELL_PALADIN_SANCTIFIED_WRATH, &basepoints, &basepoints, NULL, true, NULL, aurEff); - } - } - - void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetTarget()->RemoveAurasDueToSpell(SPELL_PALADIN_SANCTIFIED_WRATH); - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_pal_avenging_wrath_AuraScript::HandleApply, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_pal_avenging_wrath_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_pal_avenging_wrath_AuraScript(); + return false; + return true; } + + void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + if (AuraEffect const* aurEff = target->GetAuraEffectOfRankedSpell(SPELL_PALADIN_SANCTIFIED_WRATH_TALENT_R1, EFFECT_2)) + { + int32 basepoints = aurEff->GetAmount(); + target->CastCustomSpell(target, SPELL_PALADIN_SANCTIFIED_WRATH, &basepoints, &basepoints, NULL, true, NULL, aurEff); + } + } + + void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->RemoveAurasDueToSpell(SPELL_PALADIN_SANCTIFIED_WRATH); + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_pal_avenging_wrath_AuraScript::HandleApply, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_pal_avenging_wrath_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_pal_avenging_wrath_AuraScript(); + } }; // 37877 - Blessing of Faith class spell_pal_blessing_of_faith : public SpellScriptLoader { - public: - spell_pal_blessing_of_faith() : SpellScriptLoader("spell_pal_blessing_of_faith") { } +public: + spell_pal_blessing_of_faith() : SpellScriptLoader("spell_pal_blessing_of_faith") { } - class spell_pal_blessing_of_faith_SpellScript : public SpellScript + class spell_pal_blessing_of_faith_SpellScript : public SpellScript + { + PrepareSpellScript(spell_pal_blessing_of_faith_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_pal_blessing_of_faith_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_BLESSING_OF_LOWER_CITY_DRUID) || !sSpellMgr->GetSpellInfo(SPELL_PALADIN_BLESSING_OF_LOWER_CITY_PALADIN) || !sSpellMgr->GetSpellInfo(SPELL_PALADIN_BLESSING_OF_LOWER_CITY_PRIEST) || !sSpellMgr->GetSpellInfo(SPELL_PALADIN_BLESSING_OF_LOWER_CITY_SHAMAN)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - if (Unit* unitTarget = GetHitUnit()) - { - uint32 spell_id = 0; - switch (unitTarget->getClass()) - { - case CLASS_DRUID: - spell_id = SPELL_PALADIN_BLESSING_OF_LOWER_CITY_DRUID; - break; - case CLASS_PALADIN: - spell_id = SPELL_PALADIN_BLESSING_OF_LOWER_CITY_PALADIN; - break; - case CLASS_PRIEST: - spell_id = SPELL_PALADIN_BLESSING_OF_LOWER_CITY_PRIEST; - break; - case CLASS_SHAMAN: - spell_id = SPELL_PALADIN_BLESSING_OF_LOWER_CITY_SHAMAN; - break; - default: - return; // ignore for non-healing classes - } - Unit* caster = GetCaster(); - caster->CastSpell(caster, spell_id, true); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_pal_blessing_of_faith_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_pal_blessing_of_faith_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_BLESSING_OF_LOWER_CITY_DRUID) || !sSpellMgr->GetSpellInfo(SPELL_PALADIN_BLESSING_OF_LOWER_CITY_PALADIN) || !sSpellMgr->GetSpellInfo(SPELL_PALADIN_BLESSING_OF_LOWER_CITY_PRIEST) || !sSpellMgr->GetSpellInfo(SPELL_PALADIN_BLESSING_OF_LOWER_CITY_SHAMAN)) + return false; + return true; } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + if (Unit* unitTarget = GetHitUnit()) + { + uint32 spell_id = 0; + switch (unitTarget->getClass()) + { + case CLASS_DRUID: + spell_id = SPELL_PALADIN_BLESSING_OF_LOWER_CITY_DRUID; + break; + case CLASS_PALADIN: + spell_id = SPELL_PALADIN_BLESSING_OF_LOWER_CITY_PALADIN; + break; + case CLASS_PRIEST: + spell_id = SPELL_PALADIN_BLESSING_OF_LOWER_CITY_PRIEST; + break; + case CLASS_SHAMAN: + spell_id = SPELL_PALADIN_BLESSING_OF_LOWER_CITY_SHAMAN; + break; + default: + return; // ignore for non-healing classes + } + Unit* caster = GetCaster(); + caster->CastSpell(caster, spell_id, true); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_pal_blessing_of_faith_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_pal_blessing_of_faith_SpellScript(); + } }; // 20911 - Blessing of Sanctuary // 25899 - Greater Blessing of Sanctuary class spell_pal_blessing_of_sanctuary : public SpellScriptLoader { - public: - spell_pal_blessing_of_sanctuary() : SpellScriptLoader("spell_pal_blessing_of_sanctuary") { } +public: + spell_pal_blessing_of_sanctuary() : SpellScriptLoader("spell_pal_blessing_of_sanctuary") { } - class spell_pal_blessing_of_sanctuary_AuraScript : public AuraScript + class spell_pal_blessing_of_sanctuary_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pal_blessing_of_sanctuary_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_pal_blessing_of_sanctuary_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_BLESSING_OF_SANCTUARY_BUFF)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_BLESSING_OF_SANCTUARY_ENERGIZE)) - return false; - return true; - } - - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - if (Unit* caster = GetCaster()) - { - // xinef: hack - int32 value = 9; - caster->CastCustomSpell(target, SPELL_PALADIN_BLESSING_OF_SANCTUARY_BUFF, &value, &value, 0, true); - } - } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - target->RemoveAura(SPELL_PALADIN_BLESSING_OF_SANCTUARY_BUFF, GetCasterGUID()); - } - - bool CheckProc(ProcEventInfo& /*eventInfo*/) - { - return GetTarget()->getPowerType() == POWER_MANA; - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) - { - PreventDefaultAction(); - GetTarget()->CastSpell(GetTarget(), SPELL_PALADIN_BLESSING_OF_SANCTUARY_ENERGIZE, true, NULL, aurEff); - } - - void Register() - { - AfterEffectApply += AuraEffectApplyFn(spell_pal_blessing_of_sanctuary_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - AfterEffectRemove += AuraEffectRemoveFn(spell_pal_blessing_of_sanctuary_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - DoCheckProc += AuraCheckProcFn(spell_pal_blessing_of_sanctuary_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_pal_blessing_of_sanctuary_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_pal_blessing_of_sanctuary_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_BLESSING_OF_SANCTUARY_BUFF)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_BLESSING_OF_SANCTUARY_ENERGIZE)) + return false; + return true; } + + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + if (Unit* caster = GetCaster()) + { + // xinef: hack + int32 value = 9; + caster->CastCustomSpell(target, SPELL_PALADIN_BLESSING_OF_SANCTUARY_BUFF, &value, &value, 0, true); + } + } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + target->RemoveAura(SPELL_PALADIN_BLESSING_OF_SANCTUARY_BUFF, GetCasterGUID()); + } + + bool CheckProc(ProcEventInfo& /*eventInfo*/) + { + return GetTarget()->getPowerType() == POWER_MANA; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + GetTarget()->CastSpell(GetTarget(), SPELL_PALADIN_BLESSING_OF_SANCTUARY_ENERGIZE, true, NULL, aurEff); + } + + void Register() + { + AfterEffectApply += AuraEffectApplyFn(spell_pal_blessing_of_sanctuary_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + AfterEffectRemove += AuraEffectRemoveFn(spell_pal_blessing_of_sanctuary_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + DoCheckProc += AuraCheckProcFn(spell_pal_blessing_of_sanctuary_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_pal_blessing_of_sanctuary_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_pal_blessing_of_sanctuary_AuraScript(); + } }; // 64205 - Divine Sacrifice class spell_pal_divine_sacrifice : public SpellScriptLoader { - public: - spell_pal_divine_sacrifice() : SpellScriptLoader("spell_pal_divine_sacrifice") { } +public: + spell_pal_divine_sacrifice() : SpellScriptLoader("spell_pal_divine_sacrifice") { } - class spell_pal_divine_sacrifice_AuraScript : public AuraScript + class spell_pal_divine_sacrifice_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pal_divine_sacrifice_AuraScript); + + uint32 groupSize, minHpPct; + int32 remainingAmount; + + bool Load() { - PrepareAuraScript(spell_pal_divine_sacrifice_AuraScript); - - uint32 groupSize, minHpPct; - int32 remainingAmount; - - bool Load() + if (Unit* caster = GetCaster()) { - if (Unit* caster = GetCaster()) + if (caster->GetTypeId() == TYPEID_PLAYER) { - if (caster->GetTypeId() == TYPEID_PLAYER) - { - if (caster->ToPlayer()->GetGroup()) - groupSize = caster->ToPlayer()->GetGroup()->GetMembersCount(); - else - groupSize = 1; - } + if (caster->ToPlayer()->GetGroup()) + groupSize = caster->ToPlayer()->GetGroup()->GetMembersCount(); else - return false; - - remainingAmount = (caster->CountPctFromMaxHealth(GetSpellInfo()->Effects[EFFECT_2].CalcValue(caster)) * groupSize); - minHpPct = GetSpellInfo()->Effects[EFFECT_1].CalcValue(caster); - return true; + groupSize = 1; } - return false; - } + else + return false; - void Split(AuraEffect* /*aurEff*/, DamageInfo & /*dmgInfo*/, uint32 & splitAmount) - { - remainingAmount -= splitAmount; - // break when absorbed everything it could, or if the casters hp drops below 20% - if (Unit* caster = GetCaster()) - if (remainingAmount <= 0 || (caster->GetHealthPct() < minHpPct)) - caster->RemoveAura(SPELL_PALADIN_DIVINE_SACRIFICE); + remainingAmount = (caster->CountPctFromMaxHealth(GetSpellInfo()->Effects[EFFECT_2].CalcValue(caster)) * groupSize); + minHpPct = GetSpellInfo()->Effects[EFFECT_1].CalcValue(caster); + return true; } - - void Register() - { - OnEffectSplit += AuraEffectSplitFn(spell_pal_divine_sacrifice_AuraScript::Split, EFFECT_0); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_pal_divine_sacrifice_AuraScript(); + return false; } + + void Split(AuraEffect* /*aurEff*/, DamageInfo& /*dmgInfo*/, uint32& splitAmount) + { + remainingAmount -= splitAmount; + // break when absorbed everything it could, or if the casters hp drops below 20% + if (Unit* caster = GetCaster()) + if (remainingAmount <= 0 || (caster->GetHealthPct() < minHpPct)) + caster->RemoveAura(SPELL_PALADIN_DIVINE_SACRIFICE); + } + + void Register() + { + OnEffectSplit += AuraEffectSplitFn(spell_pal_divine_sacrifice_AuraScript::Split, EFFECT_0); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_pal_divine_sacrifice_AuraScript(); + } }; // 53385 - Divine Storm class spell_pal_divine_storm : public SpellScriptLoader { - public: - spell_pal_divine_storm() : SpellScriptLoader("spell_pal_divine_storm") { } +public: + spell_pal_divine_storm() : SpellScriptLoader("spell_pal_divine_storm") { } - class spell_pal_divine_storm_SpellScript : public SpellScript + class spell_pal_divine_storm_SpellScript : public SpellScript + { + PrepareSpellScript(spell_pal_divine_storm_SpellScript); + + uint32 healPct; + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_pal_divine_storm_SpellScript); - - uint32 healPct; - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_DIVINE_STORM_DUMMY)) - return false; - return true; - } - - bool Load() - { - healPct = GetSpellInfo()->Effects[EFFECT_1].CalcValue(GetCaster()); - return true; - } - - void TriggerHeal() - { - Unit* caster = GetCaster(); - if (GetHitUnit() != caster) - caster->CastCustomSpell(SPELL_PALADIN_DIVINE_STORM_DUMMY, SPELLVALUE_BASE_POINT0, (GetHitDamage() * healPct) / 100, caster, true); - } - - void Register() - { - AfterHit += SpellHitFn(spell_pal_divine_storm_SpellScript::TriggerHeal); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_pal_divine_storm_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_DIVINE_STORM_DUMMY)) + return false; + return true; } + + bool Load() + { + healPct = GetSpellInfo()->Effects[EFFECT_1].CalcValue(GetCaster()); + return true; + } + + void TriggerHeal() + { + Unit* caster = GetCaster(); + if (GetHitUnit() != caster) + caster->CastCustomSpell(SPELL_PALADIN_DIVINE_STORM_DUMMY, SPELLVALUE_BASE_POINT0, (GetHitDamage() * healPct) / 100, caster, true); + } + + void Register() + { + AfterHit += SpellHitFn(spell_pal_divine_storm_SpellScript::TriggerHeal); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_pal_divine_storm_SpellScript(); + } }; // 54171 - Divine Storm (Dummy) class spell_pal_divine_storm_dummy : public SpellScriptLoader { - public: - spell_pal_divine_storm_dummy() : SpellScriptLoader("spell_pal_divine_storm_dummy") { } +public: + spell_pal_divine_storm_dummy() : SpellScriptLoader("spell_pal_divine_storm_dummy") { } - class spell_pal_divine_storm_dummy_SpellScript : public SpellScript + class spell_pal_divine_storm_dummy_SpellScript : public SpellScript + { + PrepareSpellScript(spell_pal_divine_storm_dummy_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_pal_divine_storm_dummy_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_DIVINE_STORM_HEAL)) - return false; - return true; - } - - void CountTargets(std::list& targetList) - { - acore::Containers::RandomResizeList(targetList, GetSpellValue()->MaxAffectedTargets); - _targetCount = targetList.size(); - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - if (!_targetCount || ! GetHitUnit()) - return; - - int32 heal = GetEffectValue() / _targetCount; - GetCaster()->CastCustomSpell(GetHitUnit(), SPELL_PALADIN_DIVINE_STORM_HEAL, &heal, nullptr, nullptr, true); - } - private: - uint32 _targetCount; - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_pal_divine_storm_dummy_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pal_divine_storm_dummy_SpellScript::CountTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_RAID); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_pal_divine_storm_dummy_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_DIVINE_STORM_HEAL)) + return false; + return true; } + + void CountTargets(std::list& targetList) + { + acore::Containers::RandomResizeList(targetList, GetSpellValue()->MaxAffectedTargets); + _targetCount = targetList.size(); + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + if (!_targetCount || ! GetHitUnit()) + return; + + int32 heal = GetEffectValue() / _targetCount; + GetCaster()->CastCustomSpell(GetHitUnit(), SPELL_PALADIN_DIVINE_STORM_HEAL, &heal, nullptr, nullptr, true); + } + private: + uint32 _targetCount; + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_pal_divine_storm_dummy_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pal_divine_storm_dummy_SpellScript::CountTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_RAID); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_pal_divine_storm_dummy_SpellScript(); + } }; // 33695 - Exorcism and Holy Wrath Damage class spell_pal_exorcism_and_holy_wrath_damage : public SpellScriptLoader { - public: - spell_pal_exorcism_and_holy_wrath_damage() : SpellScriptLoader("spell_pal_exorcism_and_holy_wrath_damage") { } +public: + spell_pal_exorcism_and_holy_wrath_damage() : SpellScriptLoader("spell_pal_exorcism_and_holy_wrath_damage") { } - class spell_pal_exorcism_and_holy_wrath_damage_AuraScript : public AuraScript + class spell_pal_exorcism_and_holy_wrath_damage_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pal_exorcism_and_holy_wrath_damage_AuraScript); + + void HandleEffectCalcSpellMod(AuraEffect const* aurEff, SpellModifier*& spellMod) { - PrepareAuraScript(spell_pal_exorcism_and_holy_wrath_damage_AuraScript); - - void HandleEffectCalcSpellMod(AuraEffect const* aurEff, SpellModifier*& spellMod) + if (!spellMod) { - if (!spellMod) - { - spellMod = new SpellModifier(aurEff->GetBase()); - spellMod->op = SPELLMOD_DAMAGE; - spellMod->type = SPELLMOD_FLAT; - spellMod->spellId = GetId(); - spellMod->mask[1] = 0x200002; - } - - spellMod->value = aurEff->GetAmount(); + spellMod = new SpellModifier(aurEff->GetBase()); + spellMod->op = SPELLMOD_DAMAGE; + spellMod->type = SPELLMOD_FLAT; + spellMod->spellId = GetId(); + spellMod->mask[1] = 0x200002; } - void Register() - { - DoEffectCalcSpellMod += AuraEffectCalcSpellModFn(spell_pal_exorcism_and_holy_wrath_damage_AuraScript::HandleEffectCalcSpellMod, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_pal_exorcism_and_holy_wrath_damage_AuraScript(); + spellMod->value = aurEff->GetAmount(); } + + void Register() + { + DoEffectCalcSpellMod += AuraEffectCalcSpellModFn(spell_pal_exorcism_and_holy_wrath_damage_AuraScript::HandleEffectCalcSpellMod, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_pal_exorcism_and_holy_wrath_damage_AuraScript(); + } }; // -9799 - Eye for an Eye class spell_pal_eye_for_an_eye : public SpellScriptLoader { - public: - spell_pal_eye_for_an_eye() : SpellScriptLoader("spell_pal_eye_for_an_eye") { } +public: + spell_pal_eye_for_an_eye() : SpellScriptLoader("spell_pal_eye_for_an_eye") { } - class spell_pal_eye_for_an_eye_AuraScript : public AuraScript + class spell_pal_eye_for_an_eye_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pal_eye_for_an_eye_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_pal_eye_for_an_eye_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_EYE_FOR_AN_EYE_DAMAGE)) - return false; - return true; - } - - void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - // return damage % to attacker but < 50% own total health - int32 damage = int32(std::min(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount()), GetTarget()->GetMaxHealth() / 2)); - GetTarget()->CastCustomSpell(SPELL_PALADIN_EYE_FOR_AN_EYE_DAMAGE, SPELLVALUE_BASE_POINT0, damage, eventInfo.GetProcTarget(), true, NULL, aurEff); - } - - void Register() - { - OnEffectProc += AuraEffectProcFn(spell_pal_eye_for_an_eye_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_pal_eye_for_an_eye_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_EYE_FOR_AN_EYE_DAMAGE)) + return false; + return true; } + + void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + // return damage % to attacker but < 50% own total health + int32 damage = int32(std::min(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount()), GetTarget()->GetMaxHealth() / 2)); + GetTarget()->CastCustomSpell(SPELL_PALADIN_EYE_FOR_AN_EYE_DAMAGE, SPELLVALUE_BASE_POINT0, damage, eventInfo.GetProcTarget(), true, NULL, aurEff); + } + + void Register() + { + OnEffectProc += AuraEffectProcFn(spell_pal_eye_for_an_eye_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_pal_eye_for_an_eye_AuraScript(); + } }; // 54968 - Glyph of Holy Light class spell_pal_glyph_of_holy_light : public SpellScriptLoader { - public: - spell_pal_glyph_of_holy_light() : SpellScriptLoader("spell_pal_glyph_of_holy_light") { } +public: + spell_pal_glyph_of_holy_light() : SpellScriptLoader("spell_pal_glyph_of_holy_light") { } - class spell_pal_glyph_of_holy_light_SpellScript : public SpellScript + class spell_pal_glyph_of_holy_light_SpellScript : public SpellScript + { + PrepareSpellScript(spell_pal_glyph_of_holy_light_SpellScript); + + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_pal_glyph_of_holy_light_SpellScript); + uint32 const maxTargets = GetSpellInfo()->MaxAffectedTargets; - void FilterTargets(std::list& targets) + if (targets.size() > maxTargets) { - uint32 const maxTargets = GetSpellInfo()->MaxAffectedTargets; - - if (targets.size() > maxTargets) - { - targets.sort(acore::HealthPctOrderPred()); - targets.resize(maxTargets); - } + targets.sort(acore::HealthPctOrderPred()); + targets.resize(maxTargets); } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pal_glyph_of_holy_light_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_pal_glyph_of_holy_light_SpellScript(); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pal_glyph_of_holy_light_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_pal_glyph_of_holy_light_SpellScript(); + } }; // 63521 - Guarded by The Light class spell_pal_guarded_by_the_light : public SpellScriptLoader { - public: - spell_pal_guarded_by_the_light() : SpellScriptLoader("spell_pal_guarded_by_the_light") { } +public: + spell_pal_guarded_by_the_light() : SpellScriptLoader("spell_pal_guarded_by_the_light") { } - class spell_pal_guarded_by_the_light_SpellScript : public SpellScript + class spell_pal_guarded_by_the_light_SpellScript : public SpellScript + { + PrepareSpellScript(spell_pal_guarded_by_the_light_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_pal_guarded_by_the_light_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_DIVINE_PLEA)) - return false; - return true; - } - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) - { - // Divine Plea - if (Aura* aura = GetCaster()->GetAura(SPELL_PALADIN_DIVINE_PLEA)) - aura->RefreshDuration(); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_pal_guarded_by_the_light_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_pal_guarded_by_the_light_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_DIVINE_PLEA)) + return false; + return true; } + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + // Divine Plea + if (Aura* aura = GetCaster()->GetAura(SPELL_PALADIN_DIVINE_PLEA)) + aura->RefreshDuration(); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_pal_guarded_by_the_light_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_pal_guarded_by_the_light_SpellScript(); + } }; // 6940 - Hand of Sacrifice class spell_pal_hand_of_sacrifice : public SpellScriptLoader { - public: - spell_pal_hand_of_sacrifice() : SpellScriptLoader("spell_pal_hand_of_sacrifice") { } +public: + spell_pal_hand_of_sacrifice() : SpellScriptLoader("spell_pal_hand_of_sacrifice") { } - class spell_pal_hand_of_sacrifice_AuraScript : public AuraScript + class spell_pal_hand_of_sacrifice_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pal_hand_of_sacrifice_AuraScript); + + int32 remainingAmount; + + bool Load() { - PrepareAuraScript(spell_pal_hand_of_sacrifice_AuraScript); - - int32 remainingAmount; - - bool Load() + if (Unit* caster = GetCaster()) { - if (Unit* caster = GetCaster()) - { - remainingAmount = caster->GetMaxHealth(); - return true; - } - return false; + remainingAmount = caster->GetMaxHealth(); + return true; } - - void Split(AuraEffect* /*aurEff*/, DamageInfo & /*dmgInfo*/, uint32 & splitAmount) - { - remainingAmount -= splitAmount; - - if (remainingAmount <= 0) - { - GetTarget()->RemoveAura(SPELL_PALADIN_HAND_OF_SACRIFICE); - } - } - - void Register() - { - OnEffectSplit += AuraEffectSplitFn(spell_pal_hand_of_sacrifice_AuraScript::Split, EFFECT_0); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_pal_hand_of_sacrifice_AuraScript(); + return false; } - class spell_pal_hand_of_sacrifice_SpellScript : public SpellScript + void Split(AuraEffect* /*aurEff*/, DamageInfo& /*dmgInfo*/, uint32& splitAmount) { - PrepareSpellScript(spell_pal_hand_of_sacrifice_SpellScript); + remainingAmount -= splitAmount; - SpellCastResult CheckTarget() + if (remainingAmount <= 0) { - Unit* target = GetExplTargetUnit(); - if (!target || target->HasAura(SPELL_PALADIN_DIVINE_SACRIFICE)) - return SPELL_FAILED_TARGET_AURASTATE; - - return SPELL_CAST_OK; + GetTarget()->RemoveAura(SPELL_PALADIN_HAND_OF_SACRIFICE); } + } - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_pal_hand_of_sacrifice_SpellScript::CheckTarget); - } - }; - - SpellScript* GetSpellScript() const + void Register() { - return new spell_pal_hand_of_sacrifice_SpellScript(); - }; + OnEffectSplit += AuraEffectSplitFn(spell_pal_hand_of_sacrifice_AuraScript::Split, EFFECT_0); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_pal_hand_of_sacrifice_AuraScript(); + } + + class spell_pal_hand_of_sacrifice_SpellScript : public SpellScript + { + PrepareSpellScript(spell_pal_hand_of_sacrifice_SpellScript); + + SpellCastResult CheckTarget() + { + Unit* target = GetExplTargetUnit(); + if (!target || target->HasAura(SPELL_PALADIN_DIVINE_SACRIFICE)) + return SPELL_FAILED_TARGET_AURASTATE; + + return SPELL_CAST_OK; + } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_pal_hand_of_sacrifice_SpellScript::CheckTarget); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_pal_hand_of_sacrifice_SpellScript(); + }; }; // 1038 - Hand of Salvation class spell_pal_hand_of_salvation : public SpellScriptLoader { - public: - spell_pal_hand_of_salvation() : SpellScriptLoader("spell_pal_hand_of_salvation") { } +public: + spell_pal_hand_of_salvation() : SpellScriptLoader("spell_pal_hand_of_salvation") { } - class spell_pal_hand_of_salvation_AuraScript : public AuraScript + class spell_pal_hand_of_salvation_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pal_hand_of_salvation_AuraScript); + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) { - PrepareAuraScript(spell_pal_hand_of_salvation_AuraScript); - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + if (Unit* caster = GetCaster()) { - if (Unit* caster = GetCaster()) - { - // Glyph of Salvation - if (caster->GetGUID() == GetUnitOwner()->GetGUID()) - if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_PALADIN_GLYPH_OF_SALVATION, EFFECT_0)) - amount -= aurEff->GetAmount(); - } + // Glyph of Salvation + if (caster->GetGUID() == GetUnitOwner()->GetGUID()) + if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_PALADIN_GLYPH_OF_SALVATION, EFFECT_0)) + amount -= aurEff->GetAmount(); } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pal_hand_of_salvation_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_pal_hand_of_salvation_AuraScript(); } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pal_hand_of_salvation_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_pal_hand_of_salvation_AuraScript(); + } }; // -20473 - Holy Shock class spell_pal_holy_shock : public SpellScriptLoader { - public: - spell_pal_holy_shock() : SpellScriptLoader("spell_pal_holy_shock") { } +public: + spell_pal_holy_shock() : SpellScriptLoader("spell_pal_holy_shock") { } - class spell_pal_holy_shock_SpellScript : public SpellScript + class spell_pal_holy_shock_SpellScript : public SpellScript + { + PrepareSpellScript(spell_pal_holy_shock_SpellScript); + + bool Validate(SpellInfo const* spellInfo) { - PrepareSpellScript(spell_pal_holy_shock_SpellScript); + SpellInfo const* firstRankSpellInfo = sSpellMgr->GetSpellInfo(SPELL_PALADIN_HOLY_SHOCK_R1); + if (!firstRankSpellInfo) + return false; - bool Validate(SpellInfo const* spellInfo) - { - SpellInfo const* firstRankSpellInfo = sSpellMgr->GetSpellInfo(SPELL_PALADIN_HOLY_SHOCK_R1); - if (!firstRankSpellInfo) - return false; + // can't use other spell than holy shock due to spell_ranks dependency + if (!spellInfo->IsRankOf(firstRankSpellInfo)) + return false; - // can't use other spell than holy shock due to spell_ranks dependency - if (!spellInfo->IsRankOf(firstRankSpellInfo)) - return false; + uint8 rank = spellInfo->GetRank(); + if (!sSpellMgr->GetSpellWithRank(SPELL_PALADIN_HOLY_SHOCK_R1_DAMAGE, rank, true) || !sSpellMgr->GetSpellWithRank(SPELL_PALADIN_HOLY_SHOCK_R1_HEALING, rank, true)) + return false; - uint8 rank = spellInfo->GetRank(); - if (!sSpellMgr->GetSpellWithRank(SPELL_PALADIN_HOLY_SHOCK_R1_DAMAGE, rank, true) || !sSpellMgr->GetSpellWithRank(SPELL_PALADIN_HOLY_SHOCK_R1_HEALING, rank, true)) - return false; - - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - if (Unit* unitTarget = GetHitUnit()) - { - uint8 rank = GetSpellInfo()->GetRank(); - if (caster->IsFriendlyTo(unitTarget)) - caster->CastSpell(unitTarget, sSpellMgr->GetSpellWithRank(SPELL_PALADIN_HOLY_SHOCK_R1_HEALING, rank), true); - else - caster->CastSpell(unitTarget, sSpellMgr->GetSpellWithRank(SPELL_PALADIN_HOLY_SHOCK_R1_DAMAGE, rank), true); - } - } - - SpellCastResult CheckCast() - { - Unit* caster = GetCaster(); - if (Unit* target = GetExplTargetUnit()) - { - if (!caster->IsFriendlyTo(target)) - { - if (!caster->IsValidAttackTarget(target)) - return SPELL_FAILED_BAD_TARGETS; - - if (!caster->isInFront(target)) - return SPELL_FAILED_UNIT_NOT_INFRONT; - } - } - else - return SPELL_FAILED_BAD_TARGETS; - return SPELL_CAST_OK; - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_pal_holy_shock_SpellScript::CheckCast); - OnEffectHitTarget += SpellEffectFn(spell_pal_holy_shock_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_pal_holy_shock_SpellScript(); + return true; } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (Unit* unitTarget = GetHitUnit()) + { + uint8 rank = GetSpellInfo()->GetRank(); + if (caster->IsFriendlyTo(unitTarget)) + caster->CastSpell(unitTarget, sSpellMgr->GetSpellWithRank(SPELL_PALADIN_HOLY_SHOCK_R1_HEALING, rank), true); + else + caster->CastSpell(unitTarget, sSpellMgr->GetSpellWithRank(SPELL_PALADIN_HOLY_SHOCK_R1_DAMAGE, rank), true); + } + } + + SpellCastResult CheckCast() + { + Unit* caster = GetCaster(); + if (Unit* target = GetExplTargetUnit()) + { + if (!caster->IsFriendlyTo(target)) + { + if (!caster->IsValidAttackTarget(target)) + return SPELL_FAILED_BAD_TARGETS; + + if (!caster->isInFront(target)) + return SPELL_FAILED_UNIT_NOT_INFRONT; + } + } + else + return SPELL_FAILED_BAD_TARGETS; + return SPELL_CAST_OK; + } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_pal_holy_shock_SpellScript::CheckCast); + OnEffectHitTarget += SpellEffectFn(spell_pal_holy_shock_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_pal_holy_shock_SpellScript(); + } }; // 53407 - Judgement of Justice @@ -1010,289 +1010,289 @@ class spell_pal_holy_shock : public SpellScriptLoader // 53408 - Judgement of Wisdom class spell_pal_judgement : public SpellScriptLoader { +public: + spell_pal_judgement(char const* scriptName, uint32 spellId) : SpellScriptLoader(scriptName), _spellId(spellId) { } + + class spell_pal_judgement_SpellScript : public SpellScript + { + PrepareSpellScript(spell_pal_judgement_SpellScript); + public: - spell_pal_judgement(char const* scriptName, uint32 spellId) : SpellScriptLoader(scriptName), _spellId(spellId) { } + spell_pal_judgement_SpellScript(uint32 spellId) : SpellScript(), _spellId(spellId) { } - class spell_pal_judgement_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_pal_judgement_SpellScript); - - public: - spell_pal_judgement_SpellScript(uint32 spellId) : SpellScript(), _spellId(spellId) { } - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_JUDGEMENT_DAMAGE) + if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_JUDGEMENT_DAMAGE) || !sSpellMgr->GetSpellInfo(_spellId)) - return false; - return true; - } + return false; + return true; + } - void HandleScriptEffect(SpellEffIndex /*effIndex*/) - { - uint32 spellId2 = SPELL_PALADIN_JUDGEMENT_DAMAGE; - - // some seals have SPELL_AURA_DUMMY in EFFECT_2 - Unit::AuraEffectList const& auras = GetCaster()->GetAuraEffectsByType(SPELL_AURA_DUMMY); - for (Unit::AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i) - { - if ((*i)->GetSpellInfo()->GetSpellSpecific() == SPELL_SPECIFIC_SEAL && (*i)->GetEffIndex() == EFFECT_2) - if (sSpellMgr->GetSpellInfo((*i)->GetAmount())) - { - spellId2 = (*i)->GetAmount(); - break; - } - } - - GetCaster()->CastSpell(GetHitUnit(), _spellId, true); - GetCaster()->CastSpell(GetHitUnit(), spellId2, true); - - // Judgement of the Just - if (GetCaster()->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_PALADIN, 3015, 0)) - GetCaster()->CastSpell(GetHitUnit(), 68055, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_pal_judgement_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - - private: - uint32 const _spellId; - }; - - SpellScript* GetSpellScript() const + void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - return new spell_pal_judgement_SpellScript(_spellId); + uint32 spellId2 = SPELL_PALADIN_JUDGEMENT_DAMAGE; + + // some seals have SPELL_AURA_DUMMY in EFFECT_2 + Unit::AuraEffectList const& auras = GetCaster()->GetAuraEffectsByType(SPELL_AURA_DUMMY); + for (Unit::AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i) + { + if ((*i)->GetSpellInfo()->GetSpellSpecific() == SPELL_SPECIFIC_SEAL && (*i)->GetEffIndex() == EFFECT_2) + if (sSpellMgr->GetSpellInfo((*i)->GetAmount())) + { + spellId2 = (*i)->GetAmount(); + break; + } + } + + GetCaster()->CastSpell(GetHitUnit(), _spellId, true); + GetCaster()->CastSpell(GetHitUnit(), spellId2, true); + + // Judgement of the Just + if (GetCaster()->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_PALADIN, 3015, 0)) + GetCaster()->CastSpell(GetHitUnit(), 68055, true); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_pal_judgement_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } private: uint32 const _spellId; + }; + + SpellScript* GetSpellScript() const + { + return new spell_pal_judgement_SpellScript(_spellId); + } + +private: + uint32 const _spellId; }; // 20425 - Judgement of Command class spell_pal_judgement_of_command : public SpellScriptLoader { - public: - spell_pal_judgement_of_command() : SpellScriptLoader("spell_pal_judgement_of_command") { } +public: + spell_pal_judgement_of_command() : SpellScriptLoader("spell_pal_judgement_of_command") { } - class spell_pal_judgement_of_command_SpellScript : public SpellScript + class spell_pal_judgement_of_command_SpellScript : public SpellScript + { + PrepareSpellScript(spell_pal_judgement_of_command_SpellScript); + + void HandleDummy(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_pal_judgement_of_command_SpellScript); - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - if (Unit* unitTarget = GetHitUnit()) - if (SpellInfo const* spell_proto = sSpellMgr->GetSpellInfo(GetEffectValue())) - GetCaster()->CastSpell(unitTarget, spell_proto, true, nullptr); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_pal_judgement_of_command_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_pal_judgement_of_command_SpellScript(); + if (Unit* unitTarget = GetHitUnit()) + if (SpellInfo const* spell_proto = sSpellMgr->GetSpellInfo(GetEffectValue())) + GetCaster()->CastSpell(unitTarget, spell_proto, true, nullptr); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_pal_judgement_of_command_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_pal_judgement_of_command_SpellScript(); + } }; // -633 - Lay on Hands class spell_pal_lay_on_hands : public SpellScriptLoader { - public: - spell_pal_lay_on_hands() : SpellScriptLoader("spell_pal_lay_on_hands") { } +public: + spell_pal_lay_on_hands() : SpellScriptLoader("spell_pal_lay_on_hands") { } - class spell_pal_lay_on_hands_SpellScript : public SpellScript + class spell_pal_lay_on_hands_SpellScript : public SpellScript + { + PrepareSpellScript(spell_pal_lay_on_hands_SpellScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareSpellScript(spell_pal_lay_on_hands_SpellScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_FORBEARANCE)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_AVENGING_WRATH_MARKER)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_IMMUNE_SHIELD_MARKER)) - return false; - return true; - } - - bool Load() - { - _manaAmount = 0; - return true; - } - - SpellCastResult CheckCast() - { - Unit* caster = GetCaster(); - if (Unit* target = GetExplTargetUnit()) - if (caster == target) - if (target->HasAura(SPELL_PALADIN_FORBEARANCE) || target->HasAura(SPELL_PALADIN_AVENGING_WRATH_MARKER) || target->HasAura(SPELL_PALADIN_IMMUNE_SHIELD_MARKER)) - return SPELL_FAILED_TARGET_AURASTATE; - - // Xinef: Glyph of Divinity - if (Unit* target = GetExplTargetUnit()) - if (target->getPowerType() == POWER_MANA) - _manaAmount = target->GetPower(POWER_MANA); - - return SPELL_CAST_OK; - } - - void HandleScript() - { - Unit* caster = GetCaster(); - Unit* target = GetHitUnit(); - if (caster == target) - { - caster->CastSpell(caster, SPELL_PALADIN_FORBEARANCE, true); - caster->CastSpell(caster, SPELL_PALADIN_AVENGING_WRATH_MARKER, true); - caster->CastSpell(caster, SPELL_PALADIN_IMMUNE_SHIELD_MARKER, true); - } - // Xinef: Glyph of Divinity - else if (target && caster->HasAura(54939) && GetSpellInfo()->Id != 633 && _manaAmount > 0) // excluding first rank - { - _manaAmount = target->GetPower(POWER_MANA) - _manaAmount; - if (_manaAmount > 0) - caster->CastCustomSpell(54986 /*Energize*/, SPELLVALUE_BASE_POINT1, _manaAmount, caster, true); - } - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_pal_lay_on_hands_SpellScript::CheckCast); - AfterHit += SpellHitFn(spell_pal_lay_on_hands_SpellScript::HandleScript); - } - - int32 _manaAmount; - }; - - SpellScript* GetSpellScript() const - { - return new spell_pal_lay_on_hands_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_FORBEARANCE)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_AVENGING_WRATH_MARKER)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_IMMUNE_SHIELD_MARKER)) + return false; + return true; } + + bool Load() + { + _manaAmount = 0; + return true; + } + + SpellCastResult CheckCast() + { + Unit* caster = GetCaster(); + if (Unit* target = GetExplTargetUnit()) + if (caster == target) + if (target->HasAura(SPELL_PALADIN_FORBEARANCE) || target->HasAura(SPELL_PALADIN_AVENGING_WRATH_MARKER) || target->HasAura(SPELL_PALADIN_IMMUNE_SHIELD_MARKER)) + return SPELL_FAILED_TARGET_AURASTATE; + + // Xinef: Glyph of Divinity + if (Unit* target = GetExplTargetUnit()) + if (target->getPowerType() == POWER_MANA) + _manaAmount = target->GetPower(POWER_MANA); + + return SPELL_CAST_OK; + } + + void HandleScript() + { + Unit* caster = GetCaster(); + Unit* target = GetHitUnit(); + if (caster == target) + { + caster->CastSpell(caster, SPELL_PALADIN_FORBEARANCE, true); + caster->CastSpell(caster, SPELL_PALADIN_AVENGING_WRATH_MARKER, true); + caster->CastSpell(caster, SPELL_PALADIN_IMMUNE_SHIELD_MARKER, true); + } + // Xinef: Glyph of Divinity + else if (target && caster->HasAura(54939) && GetSpellInfo()->Id != 633 && _manaAmount > 0) // excluding first rank + { + _manaAmount = target->GetPower(POWER_MANA) - _manaAmount; + if (_manaAmount > 0) + caster->CastCustomSpell(54986 /*Energize*/, SPELLVALUE_BASE_POINT1, _manaAmount, caster, true); + } + } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_pal_lay_on_hands_SpellScript::CheckCast); + AfterHit += SpellHitFn(spell_pal_lay_on_hands_SpellScript::HandleScript); + } + + int32 _manaAmount; + }; + + SpellScript* GetSpellScript() const + { + return new spell_pal_lay_on_hands_SpellScript(); + } }; // 31789 - Righteous Defense class spell_pal_righteous_defense : public SpellScriptLoader { - public: - spell_pal_righteous_defense() : SpellScriptLoader("spell_pal_righteous_defense") { } +public: + spell_pal_righteous_defense() : SpellScriptLoader("spell_pal_righteous_defense") { } - class spell_pal_righteous_defense_SpellScript : public SpellScript + class spell_pal_righteous_defense_SpellScript : public SpellScript + { + PrepareSpellScript(spell_pal_righteous_defense_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_pal_righteous_defense_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_RIGHTEOUS_DEFENSE_TAUNT)) - return false; - return true; - } - - SpellCastResult CheckCast() - { - Unit* caster = GetCaster(); - if (caster->GetTypeId() != TYPEID_PLAYER) - return SPELL_FAILED_DONT_REPORT; - - if (Unit* target = GetExplTargetUnit()) - { - if (!target->IsFriendlyTo(caster) || target->getAttackers().empty()) - return SPELL_FAILED_BAD_TARGETS; - } - else - return SPELL_FAILED_BAD_TARGETS; - - return SPELL_CAST_OK; - } - - void HandleTriggerSpellLaunch(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - } - - void HandleTriggerSpellHit(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - GetCaster()->CastSpell(target, SPELL_PALADIN_RIGHTEOUS_DEFENSE_TAUNT, true); - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_pal_righteous_defense_SpellScript::CheckCast); - //! WORKAROUND - //! target select will be executed in hitphase of effect 0 - //! so we must handle trigger spell also in hit phase (default execution in launch phase) - //! see issue #3718 - OnEffectLaunchTarget += SpellEffectFn(spell_pal_righteous_defense_SpellScript::HandleTriggerSpellLaunch, EFFECT_1, SPELL_EFFECT_TRIGGER_SPELL); - OnEffectHitTarget += SpellEffectFn(spell_pal_righteous_defense_SpellScript::HandleTriggerSpellHit, EFFECT_1, SPELL_EFFECT_TRIGGER_SPELL); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_pal_righteous_defense_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_RIGHTEOUS_DEFENSE_TAUNT)) + return false; + return true; } + + SpellCastResult CheckCast() + { + Unit* caster = GetCaster(); + if (caster->GetTypeId() != TYPEID_PLAYER) + return SPELL_FAILED_DONT_REPORT; + + if (Unit* target = GetExplTargetUnit()) + { + if (!target->IsFriendlyTo(caster) || target->getAttackers().empty()) + return SPELL_FAILED_BAD_TARGETS; + } + else + return SPELL_FAILED_BAD_TARGETS; + + return SPELL_CAST_OK; + } + + void HandleTriggerSpellLaunch(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + } + + void HandleTriggerSpellHit(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) + GetCaster()->CastSpell(target, SPELL_PALADIN_RIGHTEOUS_DEFENSE_TAUNT, true); + } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_pal_righteous_defense_SpellScript::CheckCast); + //! WORKAROUND + //! target select will be executed in hitphase of effect 0 + //! so we must handle trigger spell also in hit phase (default execution in launch phase) + //! see issue #3718 + OnEffectLaunchTarget += SpellEffectFn(spell_pal_righteous_defense_SpellScript::HandleTriggerSpellLaunch, EFFECT_1, SPELL_EFFECT_TRIGGER_SPELL); + OnEffectHitTarget += SpellEffectFn(spell_pal_righteous_defense_SpellScript::HandleTriggerSpellHit, EFFECT_1, SPELL_EFFECT_TRIGGER_SPELL); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_pal_righteous_defense_SpellScript(); + } }; // 20154, 21084 - Seal of Righteousness - melee proc dummy (addition ${$MWS*(0.022*$AP+0.044*$SPH)} damage) class spell_pal_seal_of_righteousness : public SpellScriptLoader { - public: - spell_pal_seal_of_righteousness() : SpellScriptLoader("spell_pal_seal_of_righteousness") { } +public: + spell_pal_seal_of_righteousness() : SpellScriptLoader("spell_pal_seal_of_righteousness") { } - class spell_pal_seal_of_righteousness_AuraScript : public AuraScript + class spell_pal_seal_of_righteousness_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pal_seal_of_righteousness_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_pal_seal_of_righteousness_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_SEAL_OF_RIGHTEOUSNESS)) - return false; - return true; - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - Unit* target = eventInfo.GetProcTarget(); - if (!target) - return false; - - return target->IsAlive() && !eventInfo.GetTriggerAuraSpell() && (eventInfo.GetDamageInfo()->GetDamage() || (eventInfo.GetHitMask() & PROC_EX_ABSORB)); - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - - float ap = GetTarget()->GetTotalAttackPowerValue(BASE_ATTACK); - int32 holy = GetTarget()->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_HOLY); - holy += eventInfo.GetProcTarget()->SpellBaseDamageBonusTaken(SPELL_SCHOOL_MASK_HOLY); - - // Xinef: Libram of Divine Purpose - if (AuraEffect* aurEff = GetTarget()->GetDummyAuraEffect(SPELLFAMILY_PALADIN, 2025, EFFECT_0)) - holy += aurEff->GetAmount(); - - int32 bp = std::max(0, int32((ap * 0.022f + 0.044f * holy) * GetTarget()->GetAttackTime(BASE_ATTACK) / 1000)); - GetTarget()->CastCustomSpell(SPELL_PALADIN_SEAL_OF_RIGHTEOUSNESS, SPELLVALUE_BASE_POINT0, bp, eventInfo.GetProcTarget(), true, NULL, aurEff); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_pal_seal_of_righteousness_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_pal_seal_of_righteousness_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_pal_seal_of_righteousness_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_SEAL_OF_RIGHTEOUSNESS)) + return false; + return true; } + + bool CheckProc(ProcEventInfo& eventInfo) + { + Unit* target = eventInfo.GetProcTarget(); + if (!target) + return false; + + return target->IsAlive() && !eventInfo.GetTriggerAuraSpell() && (eventInfo.GetDamageInfo()->GetDamage() || (eventInfo.GetHitMask() & PROC_EX_ABSORB)); + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + float ap = GetTarget()->GetTotalAttackPowerValue(BASE_ATTACK); + int32 holy = GetTarget()->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_HOLY); + holy += eventInfo.GetProcTarget()->SpellBaseDamageBonusTaken(SPELL_SCHOOL_MASK_HOLY); + + // Xinef: Libram of Divine Purpose + if (AuraEffect* aurEff = GetTarget()->GetDummyAuraEffect(SPELLFAMILY_PALADIN, 2025, EFFECT_0)) + holy += aurEff->GetAmount(); + + int32 bp = std::max(0, int32((ap * 0.022f + 0.044f * holy) * GetTarget()->GetAttackTime(BASE_ATTACK) / 1000)); + GetTarget()->CastCustomSpell(SPELL_PALADIN_SEAL_OF_RIGHTEOUSNESS, SPELLVALUE_BASE_POINT0, bp, eventInfo.GetProcTarget(), true, NULL, aurEff); + } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_pal_seal_of_righteousness_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_pal_seal_of_righteousness_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_pal_seal_of_righteousness_AuraScript(); + } }; void AddSC_paladin_spell_scripts() diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp index a0988c439..ea8ffa84e 100644 --- a/src/server/scripts/Spells/spell_priest.cpp +++ b/src/server/scripts/Spells/spell_priest.cpp @@ -49,89 +49,89 @@ enum PriestSpellIcons // Ours class spell_pri_shadowfiend_scaling : public SpellScriptLoader { - public: - spell_pri_shadowfiend_scaling() : SpellScriptLoader("spell_pri_shadowfiend_scaling") { } +public: + spell_pri_shadowfiend_scaling() : SpellScriptLoader("spell_pri_shadowfiend_scaling") { } - class spell_pri_shadowfiend_scaling_AuraScript : public AuraScript + class spell_pri_shadowfiend_scaling_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pri_shadowfiend_scaling_AuraScript); + + void CalculateResistanceAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) { - PrepareAuraScript(spell_pri_shadowfiend_scaling_AuraScript); - - void CalculateResistanceAmount(AuraEffect const* aurEff, int32 & amount, bool & /*canBeRecalculated*/) + // xinef: shadowfiend inherits 40% of resistance from owner and 35% of armor (guessed) + if (Unit* owner = GetUnitOwner()->GetOwner()) { - // xinef: shadowfiend inherits 40% of resistance from owner and 35% of armor (guessed) - if (Unit* owner = GetUnitOwner()->GetOwner()) - { - SpellSchoolMask schoolMask = SpellSchoolMask(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].MiscValue); - int32 modifier = schoolMask == SPELL_SCHOOL_MASK_NORMAL ? 35 : 40; - amount = CalculatePct(std::max(0, owner->GetResistance(schoolMask)), modifier); - } + SpellSchoolMask schoolMask = SpellSchoolMask(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].MiscValue); + int32 modifier = schoolMask == SPELL_SCHOOL_MASK_NORMAL ? 35 : 40; + amount = CalculatePct(std::max(0, owner->GetResistance(schoolMask)), modifier); } - - void CalculateStatAmount(AuraEffect const* aurEff, int32 & amount, bool & /*canBeRecalculated*/) - { - // xinef: shadowfiend inherits 30% of intellect / stamina (guessed) - if (Unit* owner = GetUnitOwner()->GetOwner()) - { - Stats stat = Stats(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].MiscValue); - amount = CalculatePct(std::max(0, owner->GetStat(stat)), 30); - } - } - - void CalculateAPAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - // xinef: shadowfiend inherits 333% of SP as AP - 35.7% of damage increase per hit - if (Unit* owner = GetUnitOwner()->GetOwner()) - { - int32 shadow = owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_SHADOW); - amount = CalculatePct(std::max(0, shadow), 300); // xinef: deacrased to 300, including 15% from self buff - } - } - - void CalculateSPAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - // xinef: shadowfiend inherits 30% of SP - if (Unit* owner = GetUnitOwner()->GetOwner()) - { - int32 shadow = owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_SHADOW); - amount = CalculatePct(std::max(0, shadow), 30); - - // xinef: Update appropriate player field - if (owner->GetTypeId() == TYPEID_PLAYER) - owner->SetUInt32Value(PLAYER_PET_SPELL_POWER, (uint32)amount); - } - } - - void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, aurEff->GetAuraType(), true, SPELL_BLOCK_TYPE_POSITIVE); - if (aurEff->GetAuraType() == SPELL_AURA_MOD_ATTACK_POWER) - GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_ATTACK_POWER_PCT, true, SPELL_BLOCK_TYPE_POSITIVE); - else if (aurEff->GetAuraType() == SPELL_AURA_MOD_STAT) - GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, true, SPELL_BLOCK_TYPE_POSITIVE); - } - - void Register() - { - if (m_scriptSpellId != 35661) - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pri_shadowfiend_scaling_AuraScript::CalculateResistanceAmount, EFFECT_ALL, SPELL_AURA_MOD_RESISTANCE); - - if (m_scriptSpellId == 35661 || m_scriptSpellId == 35662) - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pri_shadowfiend_scaling_AuraScript::CalculateStatAmount, EFFECT_ALL, SPELL_AURA_MOD_STAT); - - if (m_scriptSpellId == 35661) - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pri_shadowfiend_scaling_AuraScript::CalculateAPAmount, EFFECT_ALL, SPELL_AURA_MOD_ATTACK_POWER); - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pri_shadowfiend_scaling_AuraScript::CalculateSPAmount, EFFECT_ALL, SPELL_AURA_MOD_DAMAGE_DONE); - } - - OnEffectApply += AuraEffectApplyFn(spell_pri_shadowfiend_scaling_AuraScript::HandleEffectApply, EFFECT_ALL, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_pri_shadowfiend_scaling_AuraScript(); } + + void CalculateStatAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) + { + // xinef: shadowfiend inherits 30% of intellect / stamina (guessed) + if (Unit* owner = GetUnitOwner()->GetOwner()) + { + Stats stat = Stats(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].MiscValue); + amount = CalculatePct(std::max(0, owner->GetStat(stat)), 30); + } + } + + void CalculateAPAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + // xinef: shadowfiend inherits 333% of SP as AP - 35.7% of damage increase per hit + if (Unit* owner = GetUnitOwner()->GetOwner()) + { + int32 shadow = owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_SHADOW); + amount = CalculatePct(std::max(0, shadow), 300); // xinef: deacrased to 300, including 15% from self buff + } + } + + void CalculateSPAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + // xinef: shadowfiend inherits 30% of SP + if (Unit* owner = GetUnitOwner()->GetOwner()) + { + int32 shadow = owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_SHADOW); + amount = CalculatePct(std::max(0, shadow), 30); + + // xinef: Update appropriate player field + if (owner->GetTypeId() == TYPEID_PLAYER) + owner->SetUInt32Value(PLAYER_PET_SPELL_POWER, (uint32)amount); + } + } + + void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, aurEff->GetAuraType(), true, SPELL_BLOCK_TYPE_POSITIVE); + if (aurEff->GetAuraType() == SPELL_AURA_MOD_ATTACK_POWER) + GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_ATTACK_POWER_PCT, true, SPELL_BLOCK_TYPE_POSITIVE); + else if (aurEff->GetAuraType() == SPELL_AURA_MOD_STAT) + GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, true, SPELL_BLOCK_TYPE_POSITIVE); + } + + void Register() + { + if (m_scriptSpellId != 35661) + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pri_shadowfiend_scaling_AuraScript::CalculateResistanceAmount, EFFECT_ALL, SPELL_AURA_MOD_RESISTANCE); + + if (m_scriptSpellId == 35661 || m_scriptSpellId == 35662) + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pri_shadowfiend_scaling_AuraScript::CalculateStatAmount, EFFECT_ALL, SPELL_AURA_MOD_STAT); + + if (m_scriptSpellId == 35661) + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pri_shadowfiend_scaling_AuraScript::CalculateAPAmount, EFFECT_ALL, SPELL_AURA_MOD_ATTACK_POWER); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pri_shadowfiend_scaling_AuraScript::CalculateSPAmount, EFFECT_ALL, SPELL_AURA_MOD_DAMAGE_DONE); + } + + OnEffectApply += AuraEffectApplyFn(spell_pri_shadowfiend_scaling_AuraScript::HandleEffectApply, EFFECT_ALL, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_pri_shadowfiend_scaling_AuraScript(); + } }; @@ -139,849 +139,849 @@ class spell_pri_shadowfiend_scaling : public SpellScriptLoader // -34861 - Circle of Healing class spell_pri_circle_of_healing : public SpellScriptLoader { - public: - spell_pri_circle_of_healing() : SpellScriptLoader("spell_pri_circle_of_healing") { } +public: + spell_pri_circle_of_healing() : SpellScriptLoader("spell_pri_circle_of_healing") { } - class spell_pri_circle_of_healing_SpellScript : public SpellScript + class spell_pri_circle_of_healing_SpellScript : public SpellScript + { + PrepareSpellScript(spell_pri_circle_of_healing_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_pri_circle_of_healing_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_GLYPH_OF_CIRCLE_OF_HEALING)) - return false; - return true; - } - - void FilterTargets(std::list& targets) - { - targets.remove_if(acore::RaidCheck(GetCaster(), false)); - - uint32 const maxTargets = GetCaster()->HasAura(SPELL_PRIEST_GLYPH_OF_CIRCLE_OF_HEALING) ? 6 : 5; // Glyph of Circle of Healing - - if (targets.size() > maxTargets) - { - targets.sort(acore::HealthPctOrderPred()); - targets.resize(maxTargets); - } - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_circle_of_healing_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_pri_circle_of_healing_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_GLYPH_OF_CIRCLE_OF_HEALING)) + return false; + return true; } + + void FilterTargets(std::list& targets) + { + targets.remove_if(acore::RaidCheck(GetCaster(), false)); + + uint32 const maxTargets = GetCaster()->HasAura(SPELL_PRIEST_GLYPH_OF_CIRCLE_OF_HEALING) ? 6 : 5; // Glyph of Circle of Healing + + if (targets.size() > maxTargets) + { + targets.sort(acore::HealthPctOrderPred()); + targets.resize(maxTargets); + } + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_circle_of_healing_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_pri_circle_of_healing_SpellScript(); + } }; // -47509 - Divine Aegis class spell_pri_divine_aegis : public SpellScriptLoader { - public: - spell_pri_divine_aegis() : SpellScriptLoader("spell_pri_divine_aegis") { } +public: + spell_pri_divine_aegis() : SpellScriptLoader("spell_pri_divine_aegis") { } - class spell_pri_divine_aegis_AuraScript : public AuraScript + class spell_pri_divine_aegis_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pri_divine_aegis_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_pri_divine_aegis_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_DIVINE_AEGIS)) - return false; - return true; - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - return eventInfo.GetProcTarget(); - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - - int32 absorb = CalculatePct(int32(eventInfo.GetHealInfo()->GetHeal()), aurEff->GetAmount()); - - // Multiple effects stack, so let's try to find this aura. - if (AuraEffect const* aegis = eventInfo.GetProcTarget()->GetAuraEffect(SPELL_PRIEST_DIVINE_AEGIS, EFFECT_0)) - absorb += aegis->GetAmount(); - - absorb = std::min(absorb, eventInfo.GetProcTarget()->getLevel() * 125); - - GetTarget()->CastCustomSpell(SPELL_PRIEST_DIVINE_AEGIS, SPELLVALUE_BASE_POINT0, absorb, eventInfo.GetProcTarget(), true, NULL, aurEff); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_pri_divine_aegis_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_pri_divine_aegis_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_pri_divine_aegis_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_DIVINE_AEGIS)) + return false; + return true; } + + bool CheckProc(ProcEventInfo& eventInfo) + { + return eventInfo.GetProcTarget(); + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + int32 absorb = CalculatePct(int32(eventInfo.GetHealInfo()->GetHeal()), aurEff->GetAmount()); + + // Multiple effects stack, so let's try to find this aura. + if (AuraEffect const* aegis = eventInfo.GetProcTarget()->GetAuraEffect(SPELL_PRIEST_DIVINE_AEGIS, EFFECT_0)) + absorb += aegis->GetAmount(); + + absorb = std::min(absorb, eventInfo.GetProcTarget()->getLevel() * 125); + + GetTarget()->CastCustomSpell(SPELL_PRIEST_DIVINE_AEGIS, SPELLVALUE_BASE_POINT0, absorb, eventInfo.GetProcTarget(), true, NULL, aurEff); + } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_pri_divine_aegis_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_pri_divine_aegis_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_pri_divine_aegis_AuraScript(); + } }; // 64844 - Divine Hymn class spell_pri_divine_hymn : public SpellScriptLoader { - public: - spell_pri_divine_hymn() : SpellScriptLoader("spell_pri_divine_hymn") { } +public: + spell_pri_divine_hymn() : SpellScriptLoader("spell_pri_divine_hymn") { } - class spell_pri_divine_hymn_SpellScript : public SpellScript + class spell_pri_divine_hymn_SpellScript : public SpellScript + { + PrepareSpellScript(spell_pri_divine_hymn_SpellScript); + + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_pri_divine_hymn_SpellScript); + targets.remove_if(acore::RaidCheck(GetCaster(), false)); - void FilterTargets(std::list& targets) + uint32 const maxTargets = 3; + + if (targets.size() > maxTargets) { - targets.remove_if(acore::RaidCheck(GetCaster(), false)); - - uint32 const maxTargets = 3; - - if (targets.size() > maxTargets) - { - targets.sort(acore::HealthPctOrderPred()); - targets.resize(maxTargets); - } + targets.sort(acore::HealthPctOrderPred()); + targets.resize(maxTargets); } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_divine_hymn_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ALLY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_pri_divine_hymn_SpellScript(); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_divine_hymn_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ALLY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_pri_divine_hymn_SpellScript(); + } }; // 55680 - Glyph of Prayer of Healing class spell_pri_glyph_of_prayer_of_healing : public SpellScriptLoader { - public: - spell_pri_glyph_of_prayer_of_healing() : SpellScriptLoader("spell_pri_glyph_of_prayer_of_healing") { } +public: + spell_pri_glyph_of_prayer_of_healing() : SpellScriptLoader("spell_pri_glyph_of_prayer_of_healing") { } - class spell_pri_glyph_of_prayer_of_healing_AuraScript : public AuraScript + class spell_pri_glyph_of_prayer_of_healing_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pri_glyph_of_prayer_of_healing_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_pri_glyph_of_prayer_of_healing_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_GLYPH_OF_PRAYER_OF_HEALING_HEAL)) - return false; - return true; - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - - SpellInfo const* triggeredSpellInfo = sSpellMgr->GetSpellInfo(SPELL_PRIEST_GLYPH_OF_PRAYER_OF_HEALING_HEAL); - int32 heal = int32(CalculatePct(int32(eventInfo.GetHealInfo()->GetHeal()), aurEff->GetAmount()) / triggeredSpellInfo->GetMaxTicks()); - GetTarget()->CastCustomSpell(SPELL_PRIEST_GLYPH_OF_PRAYER_OF_HEALING_HEAL, SPELLVALUE_BASE_POINT0, heal, eventInfo.GetProcTarget(), true, NULL, aurEff); - } - - void Register() - { - OnEffectProc += AuraEffectProcFn(spell_pri_glyph_of_prayer_of_healing_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_pri_glyph_of_prayer_of_healing_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_GLYPH_OF_PRAYER_OF_HEALING_HEAL)) + return false; + return true; } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + SpellInfo const* triggeredSpellInfo = sSpellMgr->GetSpellInfo(SPELL_PRIEST_GLYPH_OF_PRAYER_OF_HEALING_HEAL); + int32 heal = int32(CalculatePct(int32(eventInfo.GetHealInfo()->GetHeal()), aurEff->GetAmount()) / triggeredSpellInfo->GetMaxTicks()); + GetTarget()->CastCustomSpell(SPELL_PRIEST_GLYPH_OF_PRAYER_OF_HEALING_HEAL, SPELLVALUE_BASE_POINT0, heal, eventInfo.GetProcTarget(), true, NULL, aurEff); + } + + void Register() + { + OnEffectProc += AuraEffectProcFn(spell_pri_glyph_of_prayer_of_healing_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_pri_glyph_of_prayer_of_healing_AuraScript(); + } }; // 47788 - Guardian Spirit class spell_pri_guardian_spirit : public SpellScriptLoader { - public: - spell_pri_guardian_spirit() : SpellScriptLoader("spell_pri_guardian_spirit") { } +public: + spell_pri_guardian_spirit() : SpellScriptLoader("spell_pri_guardian_spirit") { } - class spell_pri_guardian_spirit_AuraScript : public AuraScript + class spell_pri_guardian_spirit_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pri_guardian_spirit_AuraScript); + + uint32 healPct; + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_pri_guardian_spirit_AuraScript); - - uint32 healPct; - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_GUARDIAN_SPIRIT_HEAL)) - return false; - return true; - } - - bool Load() - { - healPct = GetSpellInfo()->Effects[EFFECT_1].CalcValue(); - return true; - } - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - // Set absorbtion amount to unlimited - amount = -1; - } - - void Absorb(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount) - { - Unit* target = GetTarget(); - if (dmgInfo.GetDamage() < target->GetHealth()) - return; - - int32 healAmount = int32(target->CountPctFromMaxHealth(healPct)); - // remove the aura now, we don't want 40% healing bonus - Remove(AURA_REMOVE_BY_ENEMY_SPELL); - target->CastCustomSpell(target, SPELL_PRIEST_GUARDIAN_SPIRIT_HEAL, &healAmount, nullptr, nullptr, true); - absorbAmount = dmgInfo.GetDamage(); - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pri_guardian_spirit_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_SCHOOL_ABSORB); - OnEffectAbsorb += AuraEffectAbsorbFn(spell_pri_guardian_spirit_AuraScript::Absorb, EFFECT_1); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_pri_guardian_spirit_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_GUARDIAN_SPIRIT_HEAL)) + return false; + return true; } + + bool Load() + { + healPct = GetSpellInfo()->Effects[EFFECT_1].CalcValue(); + return true; + } + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + // Set absorbtion amount to unlimited + amount = -1; + } + + void Absorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount) + { + Unit* target = GetTarget(); + if (dmgInfo.GetDamage() < target->GetHealth()) + return; + + int32 healAmount = int32(target->CountPctFromMaxHealth(healPct)); + // remove the aura now, we don't want 40% healing bonus + Remove(AURA_REMOVE_BY_ENEMY_SPELL); + target->CastCustomSpell(target, SPELL_PRIEST_GUARDIAN_SPIRIT_HEAL, &healAmount, nullptr, nullptr, true); + absorbAmount = dmgInfo.GetDamage(); + } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pri_guardian_spirit_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_SCHOOL_ABSORB); + OnEffectAbsorb += AuraEffectAbsorbFn(spell_pri_guardian_spirit_AuraScript::Absorb, EFFECT_1); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_pri_guardian_spirit_AuraScript(); + } }; // 64904 - Hymn of Hope class spell_pri_hymn_of_hope : public SpellScriptLoader { - public: - spell_pri_hymn_of_hope() : SpellScriptLoader("spell_pri_hymn_of_hope") { } +public: + spell_pri_hymn_of_hope() : SpellScriptLoader("spell_pri_hymn_of_hope") { } - class spell_pri_hymn_of_hope_SpellScript : public SpellScript + class spell_pri_hymn_of_hope_SpellScript : public SpellScript + { + PrepareSpellScript(spell_pri_hymn_of_hope_SpellScript); + + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_pri_hymn_of_hope_SpellScript); + targets.remove_if(acore::PowerCheck(POWER_MANA, false)); + targets.remove_if(acore::RaidCheck(GetCaster(), false)); - void FilterTargets(std::list& targets) + uint32 const maxTargets = 3; + + if (targets.size() > maxTargets) { - targets.remove_if(acore::PowerCheck(POWER_MANA, false)); - targets.remove_if(acore::RaidCheck(GetCaster(), false)); - - uint32 const maxTargets = 3; - - if (targets.size() > maxTargets) - { - targets.sort(acore::PowerPctOrderPred(POWER_MANA)); - targets.resize(maxTargets); - } + targets.sort(acore::PowerPctOrderPred(POWER_MANA)); + targets.resize(maxTargets); } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_hymn_of_hope_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ALLY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_pri_hymn_of_hope_SpellScript(); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_hymn_of_hope_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ALLY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_pri_hymn_of_hope_SpellScript(); + } }; // 37594 - Greater Heal Refund class spell_pri_item_greater_heal_refund : public SpellScriptLoader { - public: - spell_pri_item_greater_heal_refund() : SpellScriptLoader("spell_pri_item_greater_heal_refund") { } +public: + spell_pri_item_greater_heal_refund() : SpellScriptLoader("spell_pri_item_greater_heal_refund") { } - class spell_pri_item_greater_heal_refund_AuraScript : public AuraScript + class spell_pri_item_greater_heal_refund_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pri_item_greater_heal_refund_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_pri_item_greater_heal_refund_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_ITEM_EFFICIENCY)) - return false; - return true; - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - if (HealInfo* healInfo = eventInfo.GetHealInfo()) - if (Unit* healTarget = healInfo->GetTarget()) - if (eventInfo.GetHitMask() & PROC_EX_NO_OVERHEAL && healTarget->IsFullHealth()) - return true; + if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_ITEM_EFFICIENCY)) return false; - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) - { - PreventDefaultAction(); - GetTarget()->CastSpell(GetTarget(), SPELL_PRIEST_ITEM_EFFICIENCY, true, NULL, aurEff); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_pri_item_greater_heal_refund_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_pri_item_greater_heal_refund_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_pri_item_greater_heal_refund_AuraScript(); + return true; } + + bool CheckProc(ProcEventInfo& eventInfo) + { + if (HealInfo* healInfo = eventInfo.GetHealInfo()) + if (Unit* healTarget = healInfo->GetTarget()) + if (eventInfo.GetHitMask() & PROC_EX_NO_OVERHEAL && healTarget->IsFullHealth()) + return true; + return false; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + GetTarget()->CastSpell(GetTarget(), SPELL_PRIEST_ITEM_EFFICIENCY, true, NULL, aurEff); + } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_pri_item_greater_heal_refund_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_pri_item_greater_heal_refund_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_pri_item_greater_heal_refund_AuraScript(); + } }; // -7001 - Lightwell Renew class spell_pri_lightwell_renew : public SpellScriptLoader { - public: - spell_pri_lightwell_renew() : SpellScriptLoader("spell_pri_lightwell_renew") { } +public: + spell_pri_lightwell_renew() : SpellScriptLoader("spell_pri_lightwell_renew") { } - class spell_pri_lightwell_renew_AuraScript : public AuraScript + class spell_pri_lightwell_renew_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pri_lightwell_renew_AuraScript); + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) { - PrepareAuraScript(spell_pri_lightwell_renew_AuraScript); - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + if (Unit* caster = GetCaster()) { - if (Unit* caster = GetCaster()) - { - // Bonus from Glyph of Lightwell - if (AuraEffect* modHealing = caster->GetAuraEffect(SPELL_PRIEST_GLYPH_OF_LIGHTWELL, EFFECT_0)) - AddPct(amount, modHealing->GetAmount()); - } + // Bonus from Glyph of Lightwell + if (AuraEffect* modHealing = caster->GetAuraEffect(SPELL_PRIEST_GLYPH_OF_LIGHTWELL, EFFECT_0)) + AddPct(amount, modHealing->GetAmount()); } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pri_lightwell_renew_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_HEAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_pri_lightwell_renew_AuraScript(); } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pri_lightwell_renew_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_HEAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_pri_lightwell_renew_AuraScript(); + } }; // 8129 - Mana Burn class spell_pri_mana_burn : public SpellScriptLoader { - public: - spell_pri_mana_burn() : SpellScriptLoader("spell_pri_mana_burn") { } +public: + spell_pri_mana_burn() : SpellScriptLoader("spell_pri_mana_burn") { } - class spell_pri_mana_burn_SpellScript : public SpellScript + class spell_pri_mana_burn_SpellScript : public SpellScript + { + PrepareSpellScript(spell_pri_mana_burn_SpellScript); + + void HandleAfterHit() { - PrepareSpellScript(spell_pri_mana_burn_SpellScript); - - void HandleAfterHit() - { - if (Unit* unitTarget = GetHitUnit()) - unitTarget->RemoveAurasWithMechanic((1 << MECHANIC_FEAR) | (1 << MECHANIC_POLYMORPH)); - } - - void Register() - { - AfterHit += SpellHitFn(spell_pri_mana_burn_SpellScript::HandleAfterHit); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_pri_mana_burn_SpellScript; + if (Unit* unitTarget = GetHitUnit()) + unitTarget->RemoveAurasWithMechanic((1 << MECHANIC_FEAR) | (1 << MECHANIC_POLYMORPH)); } + + void Register() + { + AfterHit += SpellHitFn(spell_pri_mana_burn_SpellScript::HandleAfterHit); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_pri_mana_burn_SpellScript; + } }; // 28305 - Mana Leech (Passive) (Priest Pet Aura) class spell_pri_mana_leech : public SpellScriptLoader { - public: - spell_pri_mana_leech() : SpellScriptLoader("spell_pri_mana_leech") { } +public: + spell_pri_mana_leech() : SpellScriptLoader("spell_pri_mana_leech") { } - class spell_pri_mana_leech_AuraScript : public AuraScript + class spell_pri_mana_leech_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pri_mana_leech_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_pri_mana_leech_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_MANA_LEECH_PROC)) - return false; - return true; - } - - bool Load() - { - _procTarget = nullptr; - return true; - } - - bool CheckProc(ProcEventInfo& /*eventInfo*/) - { - _procTarget = GetTarget()->GetOwner(); - return _procTarget; - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) - { - PreventDefaultAction(); - GetTarget()->CastSpell(_procTarget, SPELL_PRIEST_MANA_LEECH_PROC, true, NULL, aurEff); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_pri_mana_leech_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_pri_mana_leech_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - - private: - Unit* _procTarget; - }; - - AuraScript* GetAuraScript() const - { - return new spell_pri_mana_leech_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_MANA_LEECH_PROC)) + return false; + return true; } + + bool Load() + { + _procTarget = nullptr; + return true; + } + + bool CheckProc(ProcEventInfo& /*eventInfo*/) + { + _procTarget = GetTarget()->GetOwner(); + return _procTarget; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + GetTarget()->CastSpell(_procTarget, SPELL_PRIEST_MANA_LEECH_PROC, true, NULL, aurEff); + } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_pri_mana_leech_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_pri_mana_leech_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + + private: + Unit* _procTarget; + }; + + AuraScript* GetAuraScript() const + { + return new spell_pri_mana_leech_AuraScript(); + } }; // -49821 - Mind Sear class spell_pri_mind_sear : public SpellScriptLoader { - public: - spell_pri_mind_sear() : SpellScriptLoader("spell_pri_mind_sear") { } +public: + spell_pri_mind_sear() : SpellScriptLoader("spell_pri_mind_sear") { } - class spell_pri_mind_sear_SpellScript : public SpellScript + class spell_pri_mind_sear_SpellScript : public SpellScript + { + PrepareSpellScript(spell_pri_mind_sear_SpellScript); + + void FilterTargets(std::list& unitList) { - PrepareSpellScript(spell_pri_mind_sear_SpellScript); - - void FilterTargets(std::list& unitList) - { - unitList.remove_if(acore::ObjectGUIDCheck(GetCaster()->GetUInt64Value(UNIT_FIELD_CHANNEL_OBJECT), true)); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_mind_sear_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_pri_mind_sear_SpellScript(); + unitList.remove_if(acore::ObjectGUIDCheck(GetCaster()->GetUInt64Value(UNIT_FIELD_CHANNEL_OBJECT), true)); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_mind_sear_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_pri_mind_sear_SpellScript(); + } }; // 47948 - Pain and Suffering (Proc) class spell_pri_pain_and_suffering_proc : public SpellScriptLoader { - public: - spell_pri_pain_and_suffering_proc() : SpellScriptLoader("spell_pri_pain_and_suffering_proc") { } +public: + spell_pri_pain_and_suffering_proc() : SpellScriptLoader("spell_pri_pain_and_suffering_proc") { } - class spell_pri_pain_and_suffering_proc_SpellScript : public SpellScript + class spell_pri_pain_and_suffering_proc_SpellScript : public SpellScript + { + PrepareSpellScript(spell_pri_pain_and_suffering_proc_SpellScript); + + void HandleEffectScriptEffect(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_pri_pain_and_suffering_proc_SpellScript); - - void HandleEffectScriptEffect(SpellEffIndex /*effIndex*/) - { - // Refresh Shadow Word: Pain on target - if (Unit* unitTarget = GetHitUnit()) - if (AuraEffect* aur = unitTarget->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_PRIEST, 0x8000, 0, 0, GetCaster()->GetGUID())) - { - aur->GetBase()->RefreshTimersWithMods(); - aur->ChangeAmount(aur->CalculateAmount(aur->GetCaster()), false); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_pri_pain_and_suffering_proc_SpellScript::HandleEffectScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_pri_pain_and_suffering_proc_SpellScript; + // Refresh Shadow Word: Pain on target + if (Unit* unitTarget = GetHitUnit()) + if (AuraEffect* aur = unitTarget->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_PRIEST, 0x8000, 0, 0, GetCaster()->GetGUID())) + { + aur->GetBase()->RefreshTimersWithMods(); + aur->ChangeAmount(aur->CalculateAmount(aur->GetCaster()), false); + } } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_pri_pain_and_suffering_proc_SpellScript::HandleEffectScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_pri_pain_and_suffering_proc_SpellScript; + } }; // -47540 - Penance class spell_pri_penance : public SpellScriptLoader { - public: - spell_pri_penance() : SpellScriptLoader("spell_pri_penance") { } +public: + spell_pri_penance() : SpellScriptLoader("spell_pri_penance") { } - class spell_pri_penance_SpellScript : public SpellScript + class spell_pri_penance_SpellScript : public SpellScript + { + PrepareSpellScript(spell_pri_penance_SpellScript); + + bool Load() { - PrepareSpellScript(spell_pri_penance_SpellScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - bool Validate(SpellInfo const* spellInfo) - { - SpellInfo const* firstRankSpellInfo = sSpellMgr->GetSpellInfo(SPELL_PRIEST_PENANCE_R1); - if (!firstRankSpellInfo) - return false; - - // can't use other spell than this penance due to spell_ranks dependency - if (!spellInfo->IsRankOf(firstRankSpellInfo)) - return false; - - uint8 rank = spellInfo->GetRank(); - if (!sSpellMgr->GetSpellWithRank(SPELL_PRIEST_PENANCE_R1_DAMAGE, rank, true)) - return false; - if (!sSpellMgr->GetSpellWithRank(SPELL_PRIEST_PENANCE_R1_HEAL, rank, true)) - return false; - - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - if (Unit* unitTarget = GetHitUnit()) - { - if (!unitTarget->IsAlive()) - return; - - uint8 rank = GetSpellInfo()->GetRank(); - - if (caster->IsFriendlyTo(unitTarget)) - caster->CastSpell(unitTarget, sSpellMgr->GetSpellWithRank(SPELL_PRIEST_PENANCE_R1_HEAL, rank), false); - else - caster->CastSpell(unitTarget, sSpellMgr->GetSpellWithRank(SPELL_PRIEST_PENANCE_R1_DAMAGE, rank), false); - } - } - - SpellCastResult CheckCast() - { - Unit* caster = GetCaster(); - if (Unit* target = GetExplTargetUnit()) - { - if (!caster->IsFriendlyTo(target)) - { - if (!caster->IsValidAttackTarget(target)) - return SPELL_FAILED_BAD_TARGETS; - - if (!caster->isInFront(target)) - return SPELL_FAILED_UNIT_NOT_INFRONT; - } - } - else - return SPELL_FAILED_BAD_TARGETS; - return SPELL_CAST_OK; - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_pri_penance_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - OnCheckCast += SpellCheckCastFn(spell_pri_penance_SpellScript::CheckCast); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_pri_penance_SpellScript; + return GetCaster()->GetTypeId() == TYPEID_PLAYER; } + + bool Validate(SpellInfo const* spellInfo) + { + SpellInfo const* firstRankSpellInfo = sSpellMgr->GetSpellInfo(SPELL_PRIEST_PENANCE_R1); + if (!firstRankSpellInfo) + return false; + + // can't use other spell than this penance due to spell_ranks dependency + if (!spellInfo->IsRankOf(firstRankSpellInfo)) + return false; + + uint8 rank = spellInfo->GetRank(); + if (!sSpellMgr->GetSpellWithRank(SPELL_PRIEST_PENANCE_R1_DAMAGE, rank, true)) + return false; + if (!sSpellMgr->GetSpellWithRank(SPELL_PRIEST_PENANCE_R1_HEAL, rank, true)) + return false; + + return true; + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (Unit* unitTarget = GetHitUnit()) + { + if (!unitTarget->IsAlive()) + return; + + uint8 rank = GetSpellInfo()->GetRank(); + + if (caster->IsFriendlyTo(unitTarget)) + caster->CastSpell(unitTarget, sSpellMgr->GetSpellWithRank(SPELL_PRIEST_PENANCE_R1_HEAL, rank), false); + else + caster->CastSpell(unitTarget, sSpellMgr->GetSpellWithRank(SPELL_PRIEST_PENANCE_R1_DAMAGE, rank), false); + } + } + + SpellCastResult CheckCast() + { + Unit* caster = GetCaster(); + if (Unit* target = GetExplTargetUnit()) + { + if (!caster->IsFriendlyTo(target)) + { + if (!caster->IsValidAttackTarget(target)) + return SPELL_FAILED_BAD_TARGETS; + + if (!caster->isInFront(target)) + return SPELL_FAILED_UNIT_NOT_INFRONT; + } + } + else + return SPELL_FAILED_BAD_TARGETS; + return SPELL_CAST_OK; + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_pri_penance_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + OnCheckCast += SpellCheckCastFn(spell_pri_penance_SpellScript::CheckCast); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_pri_penance_SpellScript; + } }; // -17 - Power Word: Shield class spell_pri_power_word_shield : public SpellScriptLoader { - public: - spell_pri_power_word_shield() : SpellScriptLoader("spell_pri_power_word_shield") { } +public: + spell_pri_power_word_shield() : SpellScriptLoader("spell_pri_power_word_shield") { } - static int32 CalculateSpellAmount(Unit* caster, int32 amount, const SpellInfo* spellInfo, const AuraEffect* aurEff) + static int32 CalculateSpellAmount(Unit* caster, int32 amount, const SpellInfo* spellInfo, const AuraEffect* aurEff) + { + // +80.68% from sp bonus + float bonus = 0.8068f; + + // Borrowed Time + if (AuraEffect const* borrowedTime = caster->GetDummyAuraEffect(SPELLFAMILY_PRIEST, PRIEST_ICON_ID_BORROWED_TIME, EFFECT_1)) + bonus += CalculatePct(1.0f, borrowedTime->GetAmount()); + + bonus *= caster->SpellBaseHealingBonusDone(spellInfo->GetSchoolMask()); + + // Improved PW: Shield: its weird having a SPELLMOD_ALL_EFFECTS here but its blizzards doing :) + // Improved PW: Shield is only applied at the spell healing bonus because it was already applied to the base value in CalculateSpellDamage + bonus = caster->ApplyEffectModifiers(spellInfo, aurEff->GetEffIndex(), bonus); + bonus *= caster->CalculateLevelPenalty(spellInfo); + + amount += int32(bonus); + + // Twin Disciplines + if (AuraEffect const* twinDisciplines = caster->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_PRIEST, 0x400000, 0, 0, caster->GetGUID())) + AddPct(amount, twinDisciplines->GetAmount()); + + // Focused Power, xinef: apply positive modifier only + if (int32 healModifier = caster->GetMaxPositiveAuraModifier(SPELL_AURA_MOD_HEALING_DONE_PERCENT)) + AddPct(amount, healModifier); + + // Arena - Dampening + if (AuraEffect const* dampening = caster->GetAuraEffect(SPELL_GENERIC_ARENA_DAMPENING, EFFECT_0)) + AddPct(amount, dampening->GetAmount()); + // Battleground - Dampening + else if (AuraEffect const* dampening = caster->GetAuraEffect(SPELL_GENERIC_BATTLEGROUND_DAMPENING, EFFECT_0)) + AddPct(amount, dampening->GetAmount()); + + return amount; + } + + class spell_pri_power_word_shield_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pri_power_word_shield_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - // +80.68% from sp bonus - float bonus = 0.8068f; - - // Borrowed Time - if (AuraEffect const* borrowedTime = caster->GetDummyAuraEffect(SPELLFAMILY_PRIEST, PRIEST_ICON_ID_BORROWED_TIME, EFFECT_1)) - bonus += CalculatePct(1.0f, borrowedTime->GetAmount()); - - bonus *= caster->SpellBaseHealingBonusDone(spellInfo->GetSchoolMask()); - - // Improved PW: Shield: its weird having a SPELLMOD_ALL_EFFECTS here but its blizzards doing :) - // Improved PW: Shield is only applied at the spell healing bonus because it was already applied to the base value in CalculateSpellDamage - bonus = caster->ApplyEffectModifiers(spellInfo, aurEff->GetEffIndex(), bonus); - bonus *= caster->CalculateLevelPenalty(spellInfo); - - amount += int32(bonus); - - // Twin Disciplines - if (AuraEffect const* twinDisciplines = caster->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_PRIEST, 0x400000, 0, 0, caster->GetGUID())) - AddPct(amount, twinDisciplines->GetAmount()); - - // Focused Power, xinef: apply positive modifier only - if (int32 healModifier = caster->GetMaxPositiveAuraModifier(SPELL_AURA_MOD_HEALING_DONE_PERCENT)) - AddPct(amount, healModifier); - - // Arena - Dampening - if (AuraEffect const* dampening = caster->GetAuraEffect(SPELL_GENERIC_ARENA_DAMPENING, EFFECT_0)) - AddPct(amount, dampening->GetAmount()); - // Battleground - Dampening - else if (AuraEffect const* dampening = caster->GetAuraEffect(SPELL_GENERIC_BATTLEGROUND_DAMPENING, EFFECT_0)) - AddPct(amount, dampening->GetAmount()); - - return amount; + if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_REFLECTIVE_SHIELD_R1)) + return false; + return true; } - class spell_pri_power_word_shield_AuraScript : public AuraScript + void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& canBeRecalculated) { - PrepareAuraScript(spell_pri_power_word_shield_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_REFLECTIVE_SHIELD_R1)) - return false; - return true; - } - - void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& canBeRecalculated) - { - canBeRecalculated = false; - if (Unit* caster = GetCaster()) - amount = CalculateSpellAmount(caster, amount, GetSpellInfo(), aurEff); - } - - void ReflectDamage(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount) - { - Unit* target = GetTarget(); - if (dmgInfo.GetAttacker() == target) - return; - - if (Unit* owner = GetUnitOwner()) - if (AuraEffect* talentAurEff = owner->GetAuraEffectOfRankedSpell(SPELL_PRIEST_REFLECTIVE_SHIELD_R1, EFFECT_0)) - { - int32 bp = CalculatePct(absorbAmount, talentAurEff->GetAmount()); - // xinef: prevents infinite loop! - if (!dmgInfo.GetSpellInfo() || dmgInfo.GetSpellInfo()->Id != SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED) - target->CastCustomSpell(dmgInfo.GetAttacker(), SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED, &bp, nullptr, nullptr, true, NULL, aurEff); - } - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pri_power_word_shield_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); - AfterEffectAbsorb += AuraEffectAbsorbFn(spell_pri_power_word_shield_AuraScript::ReflectDamage, EFFECT_0); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_pri_power_word_shield_AuraScript(); + canBeRecalculated = false; + if (Unit* caster = GetCaster()) + amount = CalculateSpellAmount(caster, amount, GetSpellInfo(), aurEff); } - class spell_pri_power_word_shield_SpellScript : public SpellScript + void ReflectDamage(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount) { - PrepareSpellScript(spell_pri_power_word_shield_SpellScript); + Unit* target = GetTarget(); + if (dmgInfo.GetAttacker() == target) + return; - SpellCastResult CheckCast() - { - Unit* caster = GetCaster(); - Unit* target = GetExplTargetUnit(); - if (!target) - return SPELL_FAILED_BAD_TARGETS; - - if (AuraEffect* aurEff = target->GetAuraEffect(SPELL_AURA_SCHOOL_ABSORB, (SpellFamilyNames)GetSpellInfo()->SpellFamilyName, GetSpellInfo()->SpellIconID, EFFECT_0)) + if (Unit* owner = GetUnitOwner()) + if (AuraEffect* talentAurEff = owner->GetAuraEffectOfRankedSpell(SPELL_PRIEST_REFLECTIVE_SHIELD_R1, EFFECT_0)) { - int32 newAmount = GetSpellInfo()->Effects[EFFECT_0].CalcValue(caster, NULL, nullptr); - newAmount = CalculateSpellAmount(caster, newAmount, GetSpellInfo(), aurEff); - - if (aurEff->GetAmount() > newAmount) - return SPELL_FAILED_AURA_BOUNCED; + int32 bp = CalculatePct(absorbAmount, talentAurEff->GetAmount()); + // xinef: prevents infinite loop! + if (!dmgInfo.GetSpellInfo() || dmgInfo.GetSpellInfo()->Id != SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED) + target->CastCustomSpell(dmgInfo.GetAttacker(), SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED, &bp, nullptr, nullptr, true, NULL, aurEff); } - - return SPELL_CAST_OK; - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_pri_power_word_shield_SpellScript::CheckCast); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_pri_power_word_shield_SpellScript; } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pri_power_word_shield_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); + AfterEffectAbsorb += AuraEffectAbsorbFn(spell_pri_power_word_shield_AuraScript::ReflectDamage, EFFECT_0); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_pri_power_word_shield_AuraScript(); + } + + class spell_pri_power_word_shield_SpellScript : public SpellScript + { + PrepareSpellScript(spell_pri_power_word_shield_SpellScript); + + SpellCastResult CheckCast() + { + Unit* caster = GetCaster(); + Unit* target = GetExplTargetUnit(); + if (!target) + return SPELL_FAILED_BAD_TARGETS; + + if (AuraEffect* aurEff = target->GetAuraEffect(SPELL_AURA_SCHOOL_ABSORB, (SpellFamilyNames)GetSpellInfo()->SpellFamilyName, GetSpellInfo()->SpellIconID, EFFECT_0)) + { + int32 newAmount = GetSpellInfo()->Effects[EFFECT_0].CalcValue(caster, NULL, nullptr); + newAmount = CalculateSpellAmount(caster, newAmount, GetSpellInfo(), aurEff); + + if (aurEff->GetAmount() > newAmount) + return SPELL_FAILED_AURA_BOUNCED; + } + + return SPELL_CAST_OK; + } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_pri_power_word_shield_SpellScript::CheckCast); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_pri_power_word_shield_SpellScript; + } }; // 33110 - Prayer of Mending Heal class spell_pri_prayer_of_mending_heal : public SpellScriptLoader { - public: - spell_pri_prayer_of_mending_heal() : SpellScriptLoader("spell_pri_prayer_of_mending_heal") { } +public: + spell_pri_prayer_of_mending_heal() : SpellScriptLoader("spell_pri_prayer_of_mending_heal") { } - class spell_pri_prayer_of_mending_heal_SpellScript : public SpellScript + class spell_pri_prayer_of_mending_heal_SpellScript : public SpellScript + { + PrepareSpellScript(spell_pri_prayer_of_mending_heal_SpellScript); + + void HandleHeal(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_pri_prayer_of_mending_heal_SpellScript); - - void HandleHeal(SpellEffIndex /*effIndex*/) + if (Unit* caster = GetOriginalCaster()) { - if (Unit* caster = GetOriginalCaster()) + if (AuraEffect* aurEff = caster->GetAuraEffect(SPELL_PRIEST_T9_HEALING_2P, EFFECT_0)) { - if (AuraEffect* aurEff = caster->GetAuraEffect(SPELL_PRIEST_T9_HEALING_2P, EFFECT_0)) - { - int32 heal = GetHitHeal(); - AddPct(heal, aurEff->GetAmount()); - SetHitHeal(heal); - } + int32 heal = GetHitHeal(); + AddPct(heal, aurEff->GetAmount()); + SetHitHeal(heal); } } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_pri_prayer_of_mending_heal_SpellScript::HandleHeal, EFFECT_0, SPELL_EFFECT_HEAL); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_pri_prayer_of_mending_heal_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_pri_prayer_of_mending_heal_SpellScript::HandleHeal, EFFECT_0, SPELL_EFFECT_HEAL); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_pri_prayer_of_mending_heal_SpellScript(); + } }; // -139 - Renew class spell_pri_renew : public SpellScriptLoader { - public: - spell_pri_renew() : SpellScriptLoader("spell_pri_renew") { } +public: + spell_pri_renew() : SpellScriptLoader("spell_pri_renew") { } - class spell_pri_renew_AuraScript : public AuraScript + class spell_pri_renew_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pri_renew_AuraScript); + + bool Load() { - PrepareAuraScript(spell_pri_renew_AuraScript); + return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER; + } - bool Load() + void HandleApplyEffect(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + if (Unit* caster = GetCaster()) { - return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - void HandleApplyEffect(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) + // Empowered Renew + if (AuraEffect const* empoweredRenewAurEff = caster->GetDummyAuraEffect(SPELLFAMILY_PRIEST, PRIEST_ICON_ID_EMPOWERED_RENEW_TALENT, EFFECT_1)) { - // Empowered Renew - if (AuraEffect const* empoweredRenewAurEff = caster->GetDummyAuraEffect(SPELLFAMILY_PRIEST, PRIEST_ICON_ID_EMPOWERED_RENEW_TALENT, EFFECT_1)) - { - uint32 heal = GetEffect(EFFECT_0)->GetAmount(); - heal = GetTarget()->SpellHealingBonusTaken(caster, GetSpellInfo(), heal, DOT); + uint32 heal = GetEffect(EFFECT_0)->GetAmount(); + heal = GetTarget()->SpellHealingBonusTaken(caster, GetSpellInfo(), heal, DOT); - int32 basepoints0 = empoweredRenewAurEff->GetAmount() * GetEffect(EFFECT_0)->GetTotalTicks() * int32(heal) / 100; - caster->CastCustomSpell(GetTarget(), SPELL_PRIEST_EMPOWERED_RENEW, &basepoints0, nullptr, nullptr, true, NULL, aurEff); - } + int32 basepoints0 = empoweredRenewAurEff->GetAmount() * GetEffect(EFFECT_0)->GetTotalTicks() * int32(heal) / 100; + caster->CastCustomSpell(GetTarget(), SPELL_PRIEST_EMPOWERED_RENEW, &basepoints0, nullptr, nullptr, true, NULL, aurEff); } } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_pri_renew_AuraScript::HandleApplyEffect, EFFECT_0, SPELL_AURA_PERIODIC_HEAL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_pri_renew_AuraScript(); } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_pri_renew_AuraScript::HandleApplyEffect, EFFECT_0, SPELL_AURA_PERIODIC_HEAL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_pri_renew_AuraScript(); + } }; // -32379 - Shadow Word Death class spell_pri_shadow_word_death : public SpellScriptLoader { - public: - spell_pri_shadow_word_death() : SpellScriptLoader("spell_pri_shadow_word_death") { } +public: + spell_pri_shadow_word_death() : SpellScriptLoader("spell_pri_shadow_word_death") { } - class spell_pri_shadow_word_death_SpellScript : public SpellScript + class spell_pri_shadow_word_death_SpellScript : public SpellScript + { + PrepareSpellScript(spell_pri_shadow_word_death_SpellScript); + + void HandleDamage() { - PrepareSpellScript(spell_pri_shadow_word_death_SpellScript); + int32 damage = GetHitDamage(); - void HandleDamage() - { - int32 damage = GetHitDamage(); + // Pain and Suffering reduces damage + if (AuraEffect* aurEff = GetCaster()->GetDummyAuraEffect(SPELLFAMILY_PRIEST, PRIEST_ICON_ID_PAIN_AND_SUFFERING, EFFECT_1)) + AddPct(damage, aurEff->GetAmount()); - // Pain and Suffering reduces damage - if (AuraEffect* aurEff = GetCaster()->GetDummyAuraEffect(SPELLFAMILY_PRIEST, PRIEST_ICON_ID_PAIN_AND_SUFFERING, EFFECT_1)) - AddPct(damage, aurEff->GetAmount()); - - GetCaster()->CastCustomSpell(GetCaster(), SPELL_PRIEST_SHADOW_WORD_DEATH, &damage, 0, 0, true); - } - - void Register() - { - OnHit += SpellHitFn(spell_pri_shadow_word_death_SpellScript::HandleDamage); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_pri_shadow_word_death_SpellScript(); + GetCaster()->CastCustomSpell(GetCaster(), SPELL_PRIEST_SHADOW_WORD_DEATH, &damage, 0, 0, true); } + + void Register() + { + OnHit += SpellHitFn(spell_pri_shadow_word_death_SpellScript::HandleDamage); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_pri_shadow_word_death_SpellScript(); + } }; // -34914 - Vampiric Touch class spell_pri_vampiric_touch : public SpellScriptLoader { - public: - spell_pri_vampiric_touch() : SpellScriptLoader("spell_pri_vampiric_touch") { } +public: + spell_pri_vampiric_touch() : SpellScriptLoader("spell_pri_vampiric_touch") { } - class spell_pri_vampiric_touch_AuraScript : public AuraScript + class spell_pri_vampiric_touch_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pri_vampiric_touch_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_pri_vampiric_touch_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_VAMPIRIC_TOUCH_DISPEL)) - return false; - return true; - } - - void HandleDispel(DispelInfo* /*dispelInfo*/) - { - if (Unit* caster = GetCaster()) - if (Unit* target = GetUnitOwner()) - if (AuraEffect const* aurEff = GetEffect(EFFECT_1)) - { - int32 damage = aurEff->GetBaseAmount(); - damage = aurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue(caster, &damage, nullptr) * 8; - // backfire damage - caster->CastCustomSpell(target, SPELL_PRIEST_VAMPIRIC_TOUCH_DISPEL, &damage, nullptr, nullptr, true, NULL, aurEff); - } - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - return eventInfo.GetActionTarget() && eventInfo.GetActionTarget()->IsAlive() && GetOwner()->GetGUID() == eventInfo.GetActionTarget()->GetGUID(); - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - eventInfo.GetActor()->CastSpell(eventInfo.GetActor(), 57669, true, NULL, aurEff); - } - - void Register() - { - AfterDispel += AuraDispelFn(spell_pri_vampiric_touch_AuraScript::HandleDispel); - DoCheckProc += AuraCheckProcFn(spell_pri_vampiric_touch_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_pri_vampiric_touch_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_pri_vampiric_touch_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_VAMPIRIC_TOUCH_DISPEL)) + return false; + return true; } + + void HandleDispel(DispelInfo* /*dispelInfo*/) + { + if (Unit* caster = GetCaster()) + if (Unit* target = GetUnitOwner()) + if (AuraEffect const* aurEff = GetEffect(EFFECT_1)) + { + int32 damage = aurEff->GetBaseAmount(); + damage = aurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue(caster, &damage, nullptr) * 8; + // backfire damage + caster->CastCustomSpell(target, SPELL_PRIEST_VAMPIRIC_TOUCH_DISPEL, &damage, nullptr, nullptr, true, NULL, aurEff); + } + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + return eventInfo.GetActionTarget() && eventInfo.GetActionTarget()->IsAlive() && GetOwner()->GetGUID() == eventInfo.GetActionTarget()->GetGUID(); + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + eventInfo.GetActor()->CastSpell(eventInfo.GetActor(), 57669, true, NULL, aurEff); + } + + void Register() + { + AfterDispel += AuraDispelFn(spell_pri_vampiric_touch_AuraScript::HandleDispel); + DoCheckProc += AuraCheckProcFn(spell_pri_vampiric_touch_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_pri_vampiric_touch_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_pri_vampiric_touch_AuraScript(); + } }; void AddSC_priest_spell_scripts() diff --git a/src/server/scripts/Spells/spell_quest.cpp b/src/server/scripts/Spells/spell_quest.cpp index b1e748a3c..466b68565 100644 --- a/src/server/scripts/Spells/spell_quest.cpp +++ b/src/server/scripts/Spells/spell_quest.cpp @@ -24,74 +24,74 @@ // Ours class spell_q11065_wrangle_some_aether_rays : public SpellScriptLoader { - public: - spell_q11065_wrangle_some_aether_rays() : SpellScriptLoader("spell_q11065_wrangle_some_aether_rays") { } +public: + spell_q11065_wrangle_some_aether_rays() : SpellScriptLoader("spell_q11065_wrangle_some_aether_rays") { } - class spell_q11065_wrangle_some_aether_rays_SpellScript : public SpellScript + class spell_q11065_wrangle_some_aether_rays_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q11065_wrangle_some_aether_rays_SpellScript); + + SpellCastResult CheckCast() { - PrepareSpellScript(spell_q11065_wrangle_some_aether_rays_SpellScript); + // if thane is present and not in combat - allow cast + if (Unit* target = GetExplTargetUnit()) + if (target->GetHealthPct() < 40.0f) + return SPELL_CAST_OK; - SpellCastResult CheckCast() - { - // if thane is present and not in combat - allow cast - if (Unit* target = GetExplTargetUnit()) - if (target->GetHealthPct() < 40.0f) - return SPELL_CAST_OK; - - return SPELL_FAILED_CASTER_AURASTATE; - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_q11065_wrangle_some_aether_rays_SpellScript::CheckCast); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q11065_wrangle_some_aether_rays_SpellScript(); + return SPELL_FAILED_CASTER_AURASTATE; } - class spell_q11065_wrangle_some_aether_rays_AuraScript : public AuraScript + void Register() { - PrepareAuraScript(spell_q11065_wrangle_some_aether_rays_AuraScript) - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* ar = GetTarget(); - if (ar && ar->ToCreature()) - { - if (GetCaster() && GetCaster()->ToPlayer()) - { - Player* player = GetCaster()->ToPlayer(); + OnCheckCast += SpellCheckCastFn(spell_q11065_wrangle_some_aether_rays_SpellScript::CheckCast); + } + }; - player->KilledMonsterCredit(23343, 0); - if (Creature *cr = GetCaster()->SummonCreature(23343, ar->GetPositionX(), ar->GetPositionY(), ar->GetPositionZ(), ar->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN, 180000)) - { - cr->CastSpell(player, 40926, true); - cr->GetMotionMaster()->MoveFollow(player, 5.0f, 2*M_PI*rand_norm()); - ar->ToCreature()->DespawnOrUnsummon(500); - } + SpellScript* GetSpellScript() const + { + return new spell_q11065_wrangle_some_aether_rays_SpellScript(); + } + + class spell_q11065_wrangle_some_aether_rays_AuraScript : public AuraScript + { + PrepareAuraScript(spell_q11065_wrangle_some_aether_rays_AuraScript) + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* ar = GetTarget(); + if (ar && ar->ToCreature()) + { + if (GetCaster() && GetCaster()->ToPlayer()) + { + Player* player = GetCaster()->ToPlayer(); + + player->KilledMonsterCredit(23343, 0); + if (Creature* cr = GetCaster()->SummonCreature(23343, ar->GetPositionX(), ar->GetPositionY(), ar->GetPositionZ(), ar->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN, 180000)) + { + cr->CastSpell(player, 40926, true); + cr->GetMotionMaster()->MoveFollow(player, 5.0f, 2 * M_PI * rand_norm()); + ar->ToCreature()->DespawnOrUnsummon(500); } } } - - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - SetDuration(5000); - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_q11065_wrangle_some_aether_rays_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_q11065_wrangle_some_aether_rays_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - - }; - - AuraScript* GetAuraScript() const - { - return new spell_q11065_wrangle_some_aether_rays_AuraScript(); } + + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + SetDuration(5000); + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_q11065_wrangle_some_aether_rays_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_q11065_wrangle_some_aether_rays_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + + }; + + AuraScript* GetAuraScript() const + { + return new spell_q11065_wrangle_some_aether_rays_AuraScript(); + } }; enum eDrakuru @@ -104,160 +104,160 @@ enum eDrakuru class spell_image_of_drakuru_reagent_check : public SpellScriptLoader { - public: - spell_image_of_drakuru_reagent_check() : SpellScriptLoader("spell_image_of_drakuru_reagent_check") { } +public: + spell_image_of_drakuru_reagent_check() : SpellScriptLoader("spell_image_of_drakuru_reagent_check") { } - class spell_image_of_drakuru_reagent_check_SpellScript : public SpellScript + class spell_image_of_drakuru_reagent_check_SpellScript : public SpellScript + { + PrepareSpellScript(spell_image_of_drakuru_reagent_check_SpellScript); + + void HandleDummyEffect(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_image_of_drakuru_reagent_check_SpellScript); + Unit* caster = GetCaster(); + if (!caster || !caster->ToPlayer()) + return; + Player* player = caster->ToPlayer(); - void HandleDummyEffect(SpellEffIndex /*effIndex*/) + float dist = player->GetDistance(3385, -1807, 114); + if (dist < 40.0f) { - Unit* caster = GetCaster(); - if (!caster || !caster->ToPlayer()) - return; - Player* player = caster->ToPlayer(); - - float dist = player->GetDistance(3385, -1807, 114); - if (dist < 40.0f) - { - caster->ToPlayer()->GroupEventHappens(QUEST_SUBJECT_TO_INTERPRETATION, caster); - caster->CastSpell(caster, 47118, false); - return; - } - - dist = player->GetDistance(4244, -2025, 238); - if (dist < 40.0f) - { - caster->CastSpell(caster, 47150, false); - return; - } - - dist = player->GetDistance(4524, -3472, 228); - if (dist < 40.0f) - { - caster->ToPlayer()->GroupEventHappens(QUEST_MY_HEART_IS_IN_YOUR_HANDS, caster); - caster->CastSpell(caster, 47317, false); - return; - } - - dist = player->GetDistance(4599, -4877, 48); - if (dist < 40.0f) - { - caster->CastSpell(caster, 47406, false); - return; - } - - dist = player->GetDistance(-236, -614, 116); - if (dist < 40.0f) - { - caster->CastSpell(caster, 50440, false); - return; - } + caster->ToPlayer()->GroupEventHappens(QUEST_SUBJECT_TO_INTERPRETATION, caster); + caster->CastSpell(caster, 47118, false); + return; } - void Register() + dist = player->GetDistance(4244, -2025, 238); + if (dist < 40.0f) { - OnEffectHitTarget += SpellEffectFn(spell_image_of_drakuru_reagent_check_SpellScript::HandleDummyEffect, EFFECT_0, SPELL_EFFECT_DUMMY); + caster->CastSpell(caster, 47150, false); + return; } - }; - SpellScript* GetSpellScript() const + dist = player->GetDistance(4524, -3472, 228); + if (dist < 40.0f) + { + caster->ToPlayer()->GroupEventHappens(QUEST_MY_HEART_IS_IN_YOUR_HANDS, caster); + caster->CastSpell(caster, 47317, false); + return; + } + + dist = player->GetDistance(4599, -4877, 48); + if (dist < 40.0f) + { + caster->CastSpell(caster, 47406, false); + return; + } + + dist = player->GetDistance(-236, -614, 116); + if (dist < 40.0f) + { + caster->CastSpell(caster, 50440, false); + return; + } + } + + void Register() { - return new spell_image_of_drakuru_reagent_check_SpellScript(); - }; + OnEffectHitTarget += SpellEffectFn(spell_image_of_drakuru_reagent_check_SpellScript::HandleDummyEffect, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_image_of_drakuru_reagent_check_SpellScript(); + }; }; class spell_q12014_steady_as_a_rock : public SpellScriptLoader { - public: - spell_q12014_steady_as_a_rock() : SpellScriptLoader("spell_q12014_steady_as_a_rock") { } +public: + spell_q12014_steady_as_a_rock() : SpellScriptLoader("spell_q12014_steady_as_a_rock") { } - class spell_q12014_steady_as_a_rock_SpellScript : public SpellScript + class spell_q12014_steady_as_a_rock_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q12014_steady_as_a_rock_SpellScript); + + void HandleFinish() { - PrepareSpellScript(spell_q12014_steady_as_a_rock_SpellScript); + Unit* caster = GetCaster(); + if (!caster || !caster->ToPlayer()) // caster cant be null, but meh :p + return; - void HandleFinish() + if (caster->ToPlayer()->GetQuestStatus(12014 /*QUEST_STEADY_AS_A_ROCK*/) == QUEST_STATUS_INCOMPLETE) { - Unit* caster = GetCaster(); - if (!caster || !caster->ToPlayer()) // caster cant be null, but meh :p - return; - - if (caster->ToPlayer()->GetQuestStatus(12014 /*QUEST_STEADY_AS_A_ROCK*/) == QUEST_STATUS_INCOMPLETE) - { - float x = caster->GetPositionX() + 3.0f*cos(caster->GetOrientation()); - float y = caster->GetPositionY() + 3.0f*sin(caster->GetOrientation()); - float o = caster->GetOrientation() < M_PI ? caster->GetOrientation()+M_PI : caster->GetOrientation()-M_PI; - caster->SummonGameObject(188367, x, y, caster->GetPositionZ(), o, 0.0f, 0.0f, 0.0f, 0.0f, 60000); - } + float x = caster->GetPositionX() + 3.0f * cos(caster->GetOrientation()); + float y = caster->GetPositionY() + 3.0f * sin(caster->GetOrientation()); + float o = caster->GetOrientation() < M_PI ? caster->GetOrientation() + M_PI : caster->GetOrientation() - M_PI; + caster->SummonGameObject(188367, x, y, caster->GetPositionZ(), o, 0.0f, 0.0f, 0.0f, 0.0f, 60000); } + } - void Register() - { - AfterCast += SpellCastFn(spell_q12014_steady_as_a_rock_SpellScript::HandleFinish); - } - }; - - SpellScript* GetSpellScript() const + void Register() { - return new spell_q12014_steady_as_a_rock_SpellScript(); - }; + AfterCast += SpellCastFn(spell_q12014_steady_as_a_rock_SpellScript::HandleFinish); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q12014_steady_as_a_rock_SpellScript(); + }; }; class spell_q11026_a11051_banish_the_demons : public SpellScriptLoader { - public: - spell_q11026_a11051_banish_the_demons() : SpellScriptLoader("spell_q11026_a11051_banish_the_demons") { } +public: + spell_q11026_a11051_banish_the_demons() : SpellScriptLoader("spell_q11026_a11051_banish_the_demons") { } - class spell_q11026_a11051_banish_the_demons_AuraScript : public AuraScript + class spell_q11026_a11051_banish_the_demons_AuraScript : public AuraScript + { + PrepareAuraScript(spell_q11026_a11051_banish_the_demons_AuraScript) + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_q11026_a11051_banish_the_demons_AuraScript) - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* ar = GetTarget(); - if (ar && !ar->IsAlive()) - ar->CastSpell(ar, 40828, true); // Banish kill credit - } - - void Register() - { - // aura spell only - if (m_scriptSpellId == 40825) - OnEffectRemove += AuraEffectRemoveFn(spell_q11026_a11051_banish_the_demons_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - - }; - - AuraScript* GetAuraScript() const - { - return new spell_q11026_a11051_banish_the_demons_AuraScript(); + Unit* ar = GetTarget(); + if (ar && !ar->IsAlive()) + ar->CastSpell(ar, 40828, true); // Banish kill credit } - class spell_q11026_a11051_banish_the_demons_SpellScript : public SpellScript + void Register() { - PrepareSpellScript(spell_q11026_a11051_banish_the_demons_SpellScript); + // aura spell only + if (m_scriptSpellId == 40825) + OnEffectRemove += AuraEffectRemoveFn(spell_q11026_a11051_banish_the_demons_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } - void HandleScriptEffect(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - if (Unit* owner = target->ToTempSummon()->GetSummoner()) - if (owner->GetTypeId() == TYPEID_PLAYER) - owner->ToPlayer()->KilledMonsterCredit(23327, 0); // Some trigger, just count - } + }; - void Register() - { - // script effect only - if (m_scriptSpellId == 40828) - OnEffectHitTarget += SpellEffectFn(spell_q11026_a11051_banish_the_demons_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; + AuraScript* GetAuraScript() const + { + return new spell_q11026_a11051_banish_the_demons_AuraScript(); + } - SpellScript* GetSpellScript() const + class spell_q11026_a11051_banish_the_demons_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q11026_a11051_banish_the_demons_SpellScript); + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - return new spell_q11026_a11051_banish_the_demons_SpellScript(); - }; + if (Unit* target = GetHitUnit()) + if (Unit* owner = target->ToTempSummon()->GetSummoner()) + if (owner->GetTypeId() == TYPEID_PLAYER) + owner->ToPlayer()->KilledMonsterCredit(23327, 0); // Some trigger, just count + } + + void Register() + { + // script effect only + if (m_scriptSpellId == 40828) + OnEffectHitTarget += SpellEffectFn(spell_q11026_a11051_banish_the_demons_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q11026_a11051_banish_the_demons_SpellScript(); + }; }; class spell_q10525_vision_guide : public SpellScriptLoader @@ -271,7 +271,7 @@ public: void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - SetDuration(75*IN_MILLISECONDS); + SetDuration(75 * IN_MILLISECONDS); } void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) @@ -307,7 +307,7 @@ public: class spell_q11322_q11317_the_cleansing_AuraScript : public AuraScript { PrepareAuraScript(spell_q11322_q11317_the_cleansing_AuraScript) - + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { Unit* ar = GetCaster(); @@ -315,7 +315,7 @@ public: { if (ar->ToPlayer()->GetQuestStatus(11317) == QUEST_STATUS_INCOMPLETE || ar->ToPlayer()->GetQuestStatus(11322) == QUEST_STATUS_INCOMPLETE) ar->SummonCreature(27959, 3032.0f, -5095.0f, 723.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); - + ar->SetStandState(UNIT_STAND_STATE_SIT); } } @@ -402,44 +402,44 @@ public: class spell_q13086_last_line_of_defence : public SpellScriptLoader { - public: - spell_q13086_last_line_of_defence() : SpellScriptLoader("spell_q13086_last_line_of_defence") { } +public: + spell_q13086_last_line_of_defence() : SpellScriptLoader("spell_q13086_last_line_of_defence") { } - class spell_q13086_last_line_of_defence_SpellScript : public SpellScript + class spell_q13086_last_line_of_defence_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q13086_last_line_of_defence_SpellScript); + + bool Load() { _triggerSpellId = 0; return true; } + + void HandleDummy(SpellEffIndex effIndex) { - PrepareSpellScript(spell_q13086_last_line_of_defence_SpellScript); + if (effIndex == EFFECT_0) + _triggerSpellId = GetSpellInfo()->Effects[effIndex].CalcValue(); - bool Load() { _triggerSpellId = 0; return true; } - - void HandleDummy(SpellEffIndex effIndex) - { - if (effIndex == EFFECT_0) - _triggerSpellId = GetSpellInfo()->Effects[effIndex].CalcValue(); - - PreventHitEffect(effIndex); - } - - void HandleAfterCast() - { - if (WorldLocation const* loc = GetExplTargetDest()) - GetCaster()->CastSpell(loc->GetPositionX(), loc->GetPositionY(), loc->GetPositionZ(), _triggerSpellId, true); - } - - void Register() - { - OnEffectLaunch += SpellEffectFn(spell_q13086_last_line_of_defence_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - OnEffectLaunch += SpellEffectFn(spell_q13086_last_line_of_defence_SpellScript::HandleDummy, EFFECT_1, SPELL_EFFECT_DUMMY); - AfterCast += SpellCastFn(spell_q13086_last_line_of_defence_SpellScript::HandleAfterCast); - } - - private: - uint32 _triggerSpellId; - }; - - SpellScript* GetSpellScript() const - { - return new spell_q13086_last_line_of_defence_SpellScript(); + PreventHitEffect(effIndex); } + + void HandleAfterCast() + { + if (WorldLocation const* loc = GetExplTargetDest()) + GetCaster()->CastSpell(loc->GetPositionX(), loc->GetPositionY(), loc->GetPositionZ(), _triggerSpellId, true); + } + + void Register() + { + OnEffectLaunch += SpellEffectFn(spell_q13086_last_line_of_defence_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + OnEffectLaunch += SpellEffectFn(spell_q13086_last_line_of_defence_SpellScript::HandleDummy, EFFECT_1, SPELL_EFFECT_DUMMY); + AfterCast += SpellCastFn(spell_q13086_last_line_of_defence_SpellScript::HandleAfterCast); + } + + private: + uint32 _triggerSpellId; + }; + + SpellScript* GetSpellScript() const + { + return new spell_q13086_last_line_of_defence_SpellScript(); + } }; enum eShadowVaultDecree @@ -449,42 +449,42 @@ enum eShadowVaultDecree class spell_q12943_shadow_vault_decree : public SpellScriptLoader { - public: - spell_q12943_shadow_vault_decree() : SpellScriptLoader("spell_q12943_shadow_vault_decree") { } +public: + spell_q12943_shadow_vault_decree() : SpellScriptLoader("spell_q12943_shadow_vault_decree") { } - class spell_q12943_shadow_vault_decree_SpellScript : public SpellScript + class spell_q12943_shadow_vault_decree_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q12943_shadow_vault_decree_SpellScript); + + SpellCastResult CheckRequirement() { - PrepareSpellScript(spell_q12943_shadow_vault_decree_SpellScript); + // if thane is present and not in combat - allow cast + Unit* caster = GetCaster(); + if (Creature* thane = caster->FindNearestCreature(NPC_THANE_UFRANG, 30.0f)) + if (!thane->IsInCombat()) + return SPELL_CAST_OK; - SpellCastResult CheckRequirement() - { - // if thane is present and not in combat - allow cast - Unit* caster = GetCaster(); - if (Creature* thane = caster->FindNearestCreature(NPC_THANE_UFRANG, 30.0f)) - if (!thane->IsInCombat()) - return SPELL_CAST_OK; - - return SPELL_FAILED_CASTER_AURASTATE; - } - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - if (Creature* thane = caster->FindNearestCreature(NPC_THANE_UFRANG, 30.0f)) - thane->AI()->AttackStart(caster); - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_q12943_shadow_vault_decree_SpellScript::CheckRequirement); - OnEffectHitTarget += SpellEffectFn(spell_q12943_shadow_vault_decree_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q12943_shadow_vault_decree_SpellScript(); + return SPELL_FAILED_CASTER_AURASTATE; } + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (Creature* thane = caster->FindNearestCreature(NPC_THANE_UFRANG, 30.0f)) + thane->AI()->AttackStart(caster); + } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_q12943_shadow_vault_decree_SpellScript::CheckRequirement); + OnEffectHitTarget += SpellEffectFn(spell_q12943_shadow_vault_decree_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q12943_shadow_vault_decree_SpellScript(); + } }; class spell_q10769_dissension_amongst_the_ranks : public SpellScriptLoader @@ -495,7 +495,7 @@ public: class spell_q10769_dissension_amongst_the_ranks_AuraScript : public AuraScript { PrepareAuraScript(spell_q10769_dissension_amongst_the_ranks_AuraScript) - + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { Unit* ar = GetTarget(); @@ -600,58 +600,58 @@ public: class spell_quest_dragonmaw_race_generic : public SpellScriptLoader { - public: - spell_quest_dragonmaw_race_generic() : SpellScriptLoader("spell_quest_dragonmaw_race_generic") { } +public: + spell_quest_dragonmaw_race_generic() : SpellScriptLoader("spell_quest_dragonmaw_race_generic") { } - class spell_quest_dragonmaw_race_generic_SpellScript : public SpellScript + class spell_quest_dragonmaw_race_generic_SpellScript : public SpellScript + { + PrepareSpellScript(spell_quest_dragonmaw_race_generic_SpellScript); + + bool Load() { - PrepareSpellScript(spell_quest_dragonmaw_race_generic_SpellScript); - - bool Load() - { - _x = _y = _z = 0.0f; - return true; - } - - SpellCastResult RelocateDest() - { - Unit* caster = GetCaster(); - float o = Position::NormalizeOrientation(caster->GetOrientation()+frand(0.0f, 2*M_PI)); - float dist = frand(5.0f, 30.0f); - _x = caster->GetPositionX()+dist*cos(o); - _y = caster->GetPositionY()+dist*sin(o); - _z = caster->GetPositionZ()+frand(-10.0f, 15.0f); - GetSpell()->m_targets.SetDst(_x, _y, _z, 0.0f, caster->GetMapId()); - return SPELL_CAST_OK; - } - - void ChangeDest(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - Unit* caster = GetCaster(); - if (Creature* trigger = caster->SummonCreature(23356, _x, _y, _z, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 1500)) - { - trigger->CastSpell(trigger, GetSpellInfo()->Effects[effIndex].TriggerSpell, true); - if (GetSpellInfo()->Effects[effIndex].TriggerSpell == 41064) - trigger->CastSpell(trigger, 41284, true); - } - - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_quest_dragonmaw_race_generic_SpellScript::RelocateDest); - OnEffectHit += SpellEffectFn(spell_quest_dragonmaw_race_generic_SpellScript::ChangeDest, EFFECT_0, SPELL_EFFECT_TRIGGER_MISSILE); - } - - private: - float _x, _y, _z; - }; - - SpellScript* GetSpellScript() const - { - return new spell_quest_dragonmaw_race_generic_SpellScript(); + _x = _y = _z = 0.0f; + return true; } + + SpellCastResult RelocateDest() + { + Unit* caster = GetCaster(); + float o = Position::NormalizeOrientation(caster->GetOrientation() + frand(0.0f, 2 * M_PI)); + float dist = frand(5.0f, 30.0f); + _x = caster->GetPositionX() + dist * cos(o); + _y = caster->GetPositionY() + dist * sin(o); + _z = caster->GetPositionZ() + frand(-10.0f, 15.0f); + GetSpell()->m_targets.SetDst(_x, _y, _z, 0.0f, caster->GetMapId()); + return SPELL_CAST_OK; + } + + void ChangeDest(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + Unit* caster = GetCaster(); + if (Creature* trigger = caster->SummonCreature(23356, _x, _y, _z, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 1500)) + { + trigger->CastSpell(trigger, GetSpellInfo()->Effects[effIndex].TriggerSpell, true); + if (GetSpellInfo()->Effects[effIndex].TriggerSpell == 41064) + trigger->CastSpell(trigger, 41284, true); + } + + } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_quest_dragonmaw_race_generic_SpellScript::RelocateDest); + OnEffectHit += SpellEffectFn(spell_quest_dragonmaw_race_generic_SpellScript::ChangeDest, EFFECT_0, SPELL_EFFECT_TRIGGER_MISSILE); + } + + private: + float _x, _y, _z; + }; + + SpellScript* GetSpellScript() const + { + return new spell_quest_dragonmaw_race_generic_SpellScript(); + } }; class spell_q11670_it_was_the_orcs_honest : public SpellScriptLoader @@ -765,10 +765,18 @@ public: switch (task) { - case 0: spellId = SPELL_SOARING_10557; break; - case 1: spellId = SPELL_SOARING_10710; break; - case 2: spellId = SPELL_SOARING_10711; break; - case 3: spellId = SPELL_SOARING_10712; break; + case 0: + spellId = SPELL_SOARING_10557; + break; + case 1: + spellId = SPELL_SOARING_10710; + break; + case 2: + spellId = SPELL_SOARING_10711; + break; + case 3: + spellId = SPELL_SOARING_10712; + break; } player->RemoveAurasDueToSpell(SPELL_CANNON_CHARGING_PORT); @@ -776,7 +784,7 @@ public: } } - void HandleEffectPeriodicSelf(AuraEffect const * aurEff) + void HandleEffectPeriodicSelf(AuraEffect const* aurEff) { if (aurEff->GetTickNumber() == 1) { @@ -788,7 +796,7 @@ public: PerformKick(); } - void HandleEffectPeriodicPlatform(AuraEffect const * aurEff) + void HandleEffectPeriodicPlatform(AuraEffect const* aurEff) { if (aurEff->GetTickNumber() == 1) GetTarget()->CastSpell(GetTarget(), SPELL_CANNON_CHARGING_STATE2, true); @@ -841,14 +849,14 @@ public: } void HandleScript(SpellEffIndex /*effIndex*/) - { + { if(Unit* target = GetHitUnit()) { if(Player* p = target->ToPlayer()) { p->CastSpell(p, p->getGender() == GENDER_FEMALE ? SPELL_SCARLET_RAVEN_PRIEST_IMAGE_FEMALE : SPELL_SCARLET_RAVEN_PRIEST_IMAGE_MALE, false); } - } + } } void Register() @@ -875,7 +883,7 @@ public: void HandleScript(SpellEffIndex effIndex) { PreventHitDefaultEffect(effIndex); - GetCaster()->CastSpell(GetCaster(), GetEffectValue(), true); + GetCaster()->CastSpell(GetCaster(), GetEffectValue(), true); } SpellCastResult CheckRequirement() @@ -915,7 +923,7 @@ public: if (Unit* unit = GetHitUnit()) if (unit->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC)) return; - GetCaster()->CastCustomSpell(42576 /*SPELL_CANNON_BLAST*/, SPELLVALUE_BASE_POINT0, GetEffectValue(), GetCaster(), true); + GetCaster()->CastCustomSpell(42576 /*SPELL_CANNON_BLAST*/, SPELLVALUE_BASE_POINT0, GetEffectValue(), GetCaster(), true); } void Register() @@ -984,29 +992,29 @@ public: class spell_q10985_light_of_the_naaru : public SpellScriptLoader { - public: - spell_q10985_light_of_the_naaru() : SpellScriptLoader("spell_q10985_light_of_the_naaru") { } +public: + spell_q10985_light_of_the_naaru() : SpellScriptLoader("spell_q10985_light_of_the_naaru") { } - class spell_q10985_light_of_the_naaru_AuraScript : public AuraScript + class spell_q10985_light_of_the_naaru_AuraScript : public AuraScript + { + PrepareAuraScript(spell_q10985_light_of_the_naaru_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_q10985_light_of_the_naaru_AuraScript); - - bool CheckProc(ProcEventInfo& eventInfo) - { - Unit* target = eventInfo.GetActionTarget(); - return target && target->getFaction() == 1843; // Xinef: Illidari demons faction - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_q10985_light_of_the_naaru_AuraScript::CheckProc); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_q10985_light_of_the_naaru_AuraScript(); + Unit* target = eventInfo.GetActionTarget(); + return target && target->getFaction() == 1843; // Xinef: Illidari demons faction } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_q10985_light_of_the_naaru_AuraScript::CheckProc); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_q10985_light_of_the_naaru_AuraScript(); + } }; @@ -1014,37 +1022,37 @@ class spell_q10985_light_of_the_naaru : public SpellScriptLoader class spell_generic_quest_update_entry_SpellScript : public SpellScript { PrepareSpellScript(spell_generic_quest_update_entry_SpellScript); - private: - uint16 _spellEffect; - uint8 _effIndex; - uint32 _originalEntry; - uint32 _newEntry; - bool _shouldAttack; - uint32 _despawnTime; +private: + uint16 _spellEffect; + uint8 _effIndex; + uint32 _originalEntry; + uint32 _newEntry; + bool _shouldAttack; + uint32 _despawnTime; - public: - spell_generic_quest_update_entry_SpellScript(uint16 spellEffect, uint8 effIndex, uint32 originalEntry, uint32 newEntry, bool shouldAttack, uint32 despawnTime = 0) : - SpellScript(), _spellEffect(spellEffect), _effIndex(effIndex), _originalEntry(originalEntry), - _newEntry(newEntry), _shouldAttack(shouldAttack), _despawnTime(despawnTime) { } +public: + spell_generic_quest_update_entry_SpellScript(uint16 spellEffect, uint8 effIndex, uint32 originalEntry, uint32 newEntry, bool shouldAttack, uint32 despawnTime = 0) : + SpellScript(), _spellEffect(spellEffect), _effIndex(effIndex), _originalEntry(originalEntry), + _newEntry(newEntry), _shouldAttack(shouldAttack), _despawnTime(despawnTime) { } - void HandleDummy(SpellEffIndex /*effIndex*/) - { - if (Creature* creatureTarget = GetHitCreature()) - if (!creatureTarget->IsPet() && creatureTarget->GetEntry() == _originalEntry) - { - creatureTarget->UpdateEntry(_newEntry); - if (_shouldAttack && creatureTarget->IsAIEnabled) - creatureTarget->AI()->AttackStart(GetCaster()); + void HandleDummy(SpellEffIndex /*effIndex*/) + { + if (Creature* creatureTarget = GetHitCreature()) + if (!creatureTarget->IsPet() && creatureTarget->GetEntry() == _originalEntry) + { + creatureTarget->UpdateEntry(_newEntry); + if (_shouldAttack && creatureTarget->IsAIEnabled) + creatureTarget->AI()->AttackStart(GetCaster()); - if (_despawnTime) - creatureTarget->DespawnOrUnsummon(_despawnTime); - } - } + if (_despawnTime) + creatureTarget->DespawnOrUnsummon(_despawnTime); + } + } - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_generic_quest_update_entry_SpellScript::HandleDummy, _effIndex, _spellEffect); - } + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_generic_quest_update_entry_SpellScript::HandleDummy, _effIndex, _spellEffect); + } }; // http://www.wowhead.com/quest=55 Morbent Fel @@ -1057,13 +1065,13 @@ enum Quest55Data class spell_q55_sacred_cleansing : public SpellScriptLoader { - public: - spell_q55_sacred_cleansing() : SpellScriptLoader("spell_q55_sacred_cleansing") { } +public: + spell_q55_sacred_cleansing() : SpellScriptLoader("spell_q55_sacred_cleansing") { } - SpellScript* GetSpellScript() const - { - return new spell_generic_quest_update_entry_SpellScript(SPELL_EFFECT_DUMMY, EFFECT_1, NPC_MORBENT, NPC_WEAKENED_MORBENT, true); - } + SpellScript* GetSpellScript() const + { + return new spell_generic_quest_update_entry_SpellScript(SPELL_EFFECT_DUMMY, EFFECT_1, NPC_MORBENT, NPC_WEAKENED_MORBENT, true); + } }; // 9712 - Thaumaturgy Channel @@ -1074,37 +1082,37 @@ enum ThaumaturgyChannel class spell_q2203_thaumaturgy_channel : public SpellScriptLoader { - public: - spell_q2203_thaumaturgy_channel() : SpellScriptLoader("spell_q2203_thaumaturgy_channel") { } +public: + spell_q2203_thaumaturgy_channel() : SpellScriptLoader("spell_q2203_thaumaturgy_channel") { } - class spell_q2203_thaumaturgy_channel_AuraScript : public AuraScript + class spell_q2203_thaumaturgy_channel_AuraScript : public AuraScript + { + PrepareAuraScript(spell_q2203_thaumaturgy_channel_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_q2203_thaumaturgy_channel_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_THAUMATURGY_CHANNEL)) - return false; - return true; - } - - void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - if (Unit* caster = GetCaster()) - caster->CastSpell(caster, SPELL_THAUMATURGY_CHANNEL, false); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_q2203_thaumaturgy_channel_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_q2203_thaumaturgy_channel_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_THAUMATURGY_CHANNEL)) + return false; + return true; } + + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) + { + PreventDefaultAction(); + if (Unit* caster = GetCaster()) + caster->CastSpell(caster, SPELL_THAUMATURGY_CHANNEL, false); + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_q2203_thaumaturgy_channel_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_q2203_thaumaturgy_channel_AuraScript(); + } }; // http://www.wowhead.com/quest=5206 Marauders of Darrowshire @@ -1117,42 +1125,42 @@ enum Quest5206Data class spell_q5206_test_fetid_skull : public SpellScriptLoader { - public: - spell_q5206_test_fetid_skull() : SpellScriptLoader("spell_q5206_test_fetid_skull") { } +public: + spell_q5206_test_fetid_skull() : SpellScriptLoader("spell_q5206_test_fetid_skull") { } - class spell_q5206_test_fetid_skull_SpellScript : public SpellScript + class spell_q5206_test_fetid_skull_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q5206_test_fetid_skull_SpellScript); + + bool Load() { - PrepareSpellScript(spell_q5206_test_fetid_skull_SpellScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - bool Validate(SpellInfo const* /*spellEntry*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_CREATE_RESONATING_SKULL) || !sSpellMgr->GetSpellInfo(SPELL_CREATE_BONE_DUST)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - uint32 spellId = roll_chance_i(50) ? SPELL_CREATE_RESONATING_SKULL : SPELL_CREATE_BONE_DUST; - caster->CastSpell(caster, spellId, true, nullptr); - } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_q5206_test_fetid_skull_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q5206_test_fetid_skull_SpellScript(); + return GetCaster()->GetTypeId() == TYPEID_PLAYER; } + + bool Validate(SpellInfo const* /*spellEntry*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_CREATE_RESONATING_SKULL) || !sSpellMgr->GetSpellInfo(SPELL_CREATE_BONE_DUST)) + return false; + return true; + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + uint32 spellId = roll_chance_i(50) ? SPELL_CREATE_RESONATING_SKULL : SPELL_CREATE_BONE_DUST; + caster->CastSpell(caster, spellId, true, nullptr); + } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_q5206_test_fetid_skull_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q5206_test_fetid_skull_SpellScript(); + } }; // http://www.wowhead.com/quest=6124 Curing the Sick (A) @@ -1169,57 +1177,57 @@ enum Quests6124_6129Data class spell_q6124_6129_apply_salve : public SpellScriptLoader { - public: - spell_q6124_6129_apply_salve() : SpellScriptLoader("spell_q6124_6129_apply_salve") { } +public: + spell_q6124_6129_apply_salve() : SpellScriptLoader("spell_q6124_6129_apply_salve") { } - class spell_q6124_6129_apply_salve_SpellScript : public SpellScript + class spell_q6124_6129_apply_salve_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q6124_6129_apply_salve_SpellScript); + + bool Load() { - PrepareSpellScript(spell_q6124_6129_apply_salve_SpellScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Player* caster = GetCaster()->ToPlayer(); - if (GetCastItem()) - if (Creature* creatureTarget = GetHitCreature()) - { - uint32 newEntry = 0; - switch (caster->GetTeamId()) - { - case TEAM_HORDE: - if (creatureTarget->GetEntry() == NPC_SICKLY_GAZELLE) - newEntry = NPC_CURED_GAZELLE; - break; - case TEAM_ALLIANCE: - if (creatureTarget->GetEntry() == NPC_SICKLY_DEER) - newEntry = NPC_CURED_DEER; - break; - default: - break; - } - if (newEntry) - { - creatureTarget->UpdateEntry(newEntry); - creatureTarget->DespawnOrUnsummon(DESPAWN_TIME); - caster->KilledMonsterCredit(newEntry, 0); - } - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_q6124_6129_apply_salve_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q6124_6129_apply_salve_SpellScript(); + return GetCaster()->GetTypeId() == TYPEID_PLAYER; } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Player* caster = GetCaster()->ToPlayer(); + if (GetCastItem()) + if (Creature* creatureTarget = GetHitCreature()) + { + uint32 newEntry = 0; + switch (caster->GetTeamId()) + { + case TEAM_HORDE: + if (creatureTarget->GetEntry() == NPC_SICKLY_GAZELLE) + newEntry = NPC_CURED_GAZELLE; + break; + case TEAM_ALLIANCE: + if (creatureTarget->GetEntry() == NPC_SICKLY_DEER) + newEntry = NPC_CURED_DEER; + break; + default: + break; + } + if (newEntry) + { + creatureTarget->UpdateEntry(newEntry); + creatureTarget->DespawnOrUnsummon(DESPAWN_TIME); + caster->KilledMonsterCredit(newEntry, 0); + } + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_q6124_6129_apply_salve_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q6124_6129_apply_salve_SpellScript(); + } }; // http://www.wowhead.com/quest=11396 Bring Down Those Shields (A) @@ -1233,111 +1241,111 @@ enum Quest11396_11399Data // 43874 Scourge Mur'gul Camp: Force Shield Arcane Purple x3 class spell_q11396_11399_force_shield_arcane_purple_x3 : public SpellScriptLoader { - public: - spell_q11396_11399_force_shield_arcane_purple_x3() : SpellScriptLoader("spell_q11396_11399_force_shield_arcane_purple_x3") { } +public: + spell_q11396_11399_force_shield_arcane_purple_x3() : SpellScriptLoader("spell_q11396_11399_force_shield_arcane_purple_x3") { } - class spell_q11396_11399_force_shield_arcane_purple_x3_AuraScript : public AuraScript + class spell_q11396_11399_force_shield_arcane_purple_x3_AuraScript : public AuraScript + { + PrepareAuraScript(spell_q11396_11399_force_shield_arcane_purple_x3_AuraScript); + + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_q11396_11399_force_shield_arcane_purple_x3_AuraScript); - - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); + Unit* target = GetTarget(); target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); target->SetControlled(true, UNIT_STATE_STUNNED); - } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetTarget()->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_q11396_11399_force_shield_arcane_purple_x3_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_q11396_11399_force_shield_arcane_purple_x3_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - - }; - - AuraScript* GetAuraScript() const - { - return new spell_q11396_11399_force_shield_arcane_purple_x3_AuraScript(); } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_q11396_11399_force_shield_arcane_purple_x3_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_q11396_11399_force_shield_arcane_purple_x3_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + + }; + + AuraScript* GetAuraScript() const + { + return new spell_q11396_11399_force_shield_arcane_purple_x3_AuraScript(); + } }; // 50133 Scourging Crystal Controller class spell_q11396_11399_scourging_crystal_controller : public SpellScriptLoader { - public: - spell_q11396_11399_scourging_crystal_controller() : SpellScriptLoader("spell_q11396_11399_scourging_crystal_controller") { } +public: + spell_q11396_11399_scourging_crystal_controller() : SpellScriptLoader("spell_q11396_11399_scourging_crystal_controller") { } - class spell_q11396_11399_scourging_crystal_controller_SpellScript : public SpellScript + class spell_q11396_11399_scourging_crystal_controller_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q11396_11399_scourging_crystal_controller_SpellScript); + + bool Validate(SpellInfo const* /*spellEntry*/) { - PrepareSpellScript(spell_q11396_11399_scourging_crystal_controller_SpellScript); + if (!sSpellMgr->GetSpellInfo(SPELL_FORCE_SHIELD_ARCANE_PURPLE_X3) || !sSpellMgr->GetSpellInfo(SPELL_SCOURGING_CRYSTAL_CONTROLLER)) + return false; + return true; + } - bool Validate(SpellInfo const* /*spellEntry*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_FORCE_SHIELD_ARCANE_PURPLE_X3) || !sSpellMgr->GetSpellInfo(SPELL_SCOURGING_CRYSTAL_CONTROLLER)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - if (Creature* target = GetHitCreature()) - if (target->HasAura(SPELL_FORCE_SHIELD_ARCANE_PURPLE_X3)) - // Make sure nobody else is channeling the same target - if (!target->HasAura(SPELL_SCOURGING_CRYSTAL_CONTROLLER)) - GetCaster()->CastSpell(target, SPELL_SCOURGING_CRYSTAL_CONTROLLER, true, GetCastItem()); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_q11396_11399_scourging_crystal_controller_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const + void HandleDummy(SpellEffIndex /*effIndex*/) { - return new spell_q11396_11399_scourging_crystal_controller_SpellScript(); - }; + if (Creature* target = GetHitCreature()) + if (target->HasAura(SPELL_FORCE_SHIELD_ARCANE_PURPLE_X3)) + // Make sure nobody else is channeling the same target + if (!target->HasAura(SPELL_SCOURGING_CRYSTAL_CONTROLLER)) + GetCaster()->CastSpell(target, SPELL_SCOURGING_CRYSTAL_CONTROLLER, true, GetCastItem()); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_q11396_11399_scourging_crystal_controller_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q11396_11399_scourging_crystal_controller_SpellScript(); + }; }; // 43882 Scourging Crystal Controller Dummy class spell_q11396_11399_scourging_crystal_controller_dummy : public SpellScriptLoader { - public: - spell_q11396_11399_scourging_crystal_controller_dummy() : SpellScriptLoader("spell_q11396_11399_scourging_crystal_controller_dummy") { } +public: + spell_q11396_11399_scourging_crystal_controller_dummy() : SpellScriptLoader("spell_q11396_11399_scourging_crystal_controller_dummy") { } - class spell_q11396_11399_scourging_crystal_controller_dummy_SpellScript : public SpellScript + class spell_q11396_11399_scourging_crystal_controller_dummy_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q11396_11399_scourging_crystal_controller_dummy_SpellScript); + + bool Validate(SpellInfo const* /*spellEntry*/) { - PrepareSpellScript(spell_q11396_11399_scourging_crystal_controller_dummy_SpellScript); + if (!sSpellMgr->GetSpellInfo(SPELL_FORCE_SHIELD_ARCANE_PURPLE_X3)) + return false; + return true; + } - bool Validate(SpellInfo const* /*spellEntry*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_FORCE_SHIELD_ARCANE_PURPLE_X3)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - if (target->GetTypeId() == TYPEID_UNIT) - target->RemoveAurasDueToSpell(SPELL_FORCE_SHIELD_ARCANE_PURPLE_X3); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_q11396_11399_scourging_crystal_controller_dummy_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const + void HandleDummy(SpellEffIndex /*effIndex*/) { - return new spell_q11396_11399_scourging_crystal_controller_dummy_SpellScript(); - }; + if (Unit* target = GetHitUnit()) + if (target->GetTypeId() == TYPEID_UNIT) + target->RemoveAurasDueToSpell(SPELL_FORCE_SHIELD_ARCANE_PURPLE_X3); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_q11396_11399_scourging_crystal_controller_dummy_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q11396_11399_scourging_crystal_controller_dummy_SpellScript(); + }; }; // http://www.wowhead.com/quest=11515 Blood for Blood @@ -1350,13 +1358,13 @@ enum Quest11515Data class spell_q11515_fel_siphon_dummy : public SpellScriptLoader { - public: - spell_q11515_fel_siphon_dummy() : SpellScriptLoader("spell_q11515_fel_siphon_dummy") { } +public: + spell_q11515_fel_siphon_dummy() : SpellScriptLoader("spell_q11515_fel_siphon_dummy") { } - SpellScript* GetSpellScript() const - { - return new spell_generic_quest_update_entry_SpellScript(SPELL_EFFECT_DUMMY, EFFECT_0, NPC_FELBLOOD_INITIATE, NPC_EMACIATED_FELBLOOD, true); - } + SpellScript* GetSpellScript() const + { + return new spell_generic_quest_update_entry_SpellScript(SPELL_EFFECT_DUMMY, EFFECT_0, NPC_FELBLOOD_INITIATE, NPC_EMACIATED_FELBLOOD, true); + } }; // http://www.wowhead.com/quest=11587 Prison Break @@ -1370,43 +1378,43 @@ enum Quest11587Data class spell_q11587_arcane_prisoner_rescue : public SpellScriptLoader { - public: - spell_q11587_arcane_prisoner_rescue() : SpellScriptLoader("spell_q11587_arcane_prisoner_rescue") { } +public: + spell_q11587_arcane_prisoner_rescue() : SpellScriptLoader("spell_q11587_arcane_prisoner_rescue") { } - class spell_q11587_arcane_prisoner_rescue_SpellScript : public SpellScript + class spell_q11587_arcane_prisoner_rescue_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q11587_arcane_prisoner_rescue_SpellScript); + + bool Validate(SpellInfo const* /*spellEntry*/) { - PrepareSpellScript(spell_q11587_arcane_prisoner_rescue_SpellScript); - - bool Validate(SpellInfo const* /*spellEntry*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_SUMMON_ARCANE_PRISONER_MALE) || !sSpellMgr->GetSpellInfo(SPELL_SUMMON_ARCANE_PRISONER_FEMALE) || !sSpellMgr->GetSpellInfo(SPELL_ARCANE_PRISONER_KILL_CREDIT)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - if (Unit* unitTarget = GetHitUnit()) - { - uint32 spellId = SPELL_SUMMON_ARCANE_PRISONER_MALE; - if (rand() % 2) - spellId = SPELL_SUMMON_ARCANE_PRISONER_FEMALE; - caster->CastSpell(caster, spellId, true); - unitTarget->CastSpell(caster, SPELL_ARCANE_PRISONER_KILL_CREDIT, true); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_q11587_arcane_prisoner_rescue_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q11587_arcane_prisoner_rescue_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_SUMMON_ARCANE_PRISONER_MALE) || !sSpellMgr->GetSpellInfo(SPELL_SUMMON_ARCANE_PRISONER_FEMALE) || !sSpellMgr->GetSpellInfo(SPELL_ARCANE_PRISONER_KILL_CREDIT)) + return false; + return true; } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (Unit* unitTarget = GetHitUnit()) + { + uint32 spellId = SPELL_SUMMON_ARCANE_PRISONER_MALE; + if (rand() % 2) + spellId = SPELL_SUMMON_ARCANE_PRISONER_FEMALE; + caster->CastSpell(caster, spellId, true); + unitTarget->CastSpell(caster, SPELL_ARCANE_PRISONER_KILL_CREDIT, true); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_q11587_arcane_prisoner_rescue_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q11587_arcane_prisoner_rescue_SpellScript(); + } }; // http://www.wowhead.com/quest=11730 Master and Servant @@ -1428,58 +1436,68 @@ enum Quest11730Data class spell_q11730_ultrasonic_screwdriver : public SpellScriptLoader { - public: - spell_q11730_ultrasonic_screwdriver() : SpellScriptLoader("spell_q11730_ultrasonic_screwdriver") { } +public: + spell_q11730_ultrasonic_screwdriver() : SpellScriptLoader("spell_q11730_ultrasonic_screwdriver") { } - class spell_q11730_ultrasonic_screwdriver_SpellScript : public SpellScript + class spell_q11730_ultrasonic_screwdriver_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q11730_ultrasonic_screwdriver_SpellScript); + + bool Load() { - PrepareSpellScript(spell_q11730_ultrasonic_screwdriver_SpellScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER && GetCastItem(); - } - - bool Validate(SpellInfo const* /*spellEntry*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_SUMMON_SCAVENGEBOT_004A8) || !sSpellMgr->GetSpellInfo(SPELL_SUMMON_SENTRYBOT_57K) || !sSpellMgr->GetSpellInfo(SPELL_SUMMON_DEFENDOTANK_66D) || !sSpellMgr->GetSpellInfo(SPELL_SUMMON_SCAVENGEBOT_005B6) || !sSpellMgr->GetSpellInfo(SPELL_SUMMON_55D_COLLECTATRON) || !sSpellMgr->GetSpellInfo(SPELL_ROBOT_KILL_CREDIT)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Item* castItem = GetCastItem(); - Unit* caster = GetCaster(); - if (Creature* target = GetHitCreature()) - { - uint32 spellId = 0; - switch (target->GetEntry()) - { - case NPC_SCAVENGEBOT_004A8: spellId = SPELL_SUMMON_SCAVENGEBOT_004A8; break; - case NPC_SENTRYBOT_57K: spellId = SPELL_SUMMON_SENTRYBOT_57K; break; - case NPC_DEFENDOTANK_66D: spellId = SPELL_SUMMON_DEFENDOTANK_66D; break; - case NPC_SCAVENGEBOT_005B6: spellId = SPELL_SUMMON_SCAVENGEBOT_005B6; break; - case NPC_55D_COLLECTATRON: spellId = SPELL_SUMMON_55D_COLLECTATRON; break; - default: - return; - } - caster->CastSpell(caster, spellId, true, castItem); - caster->CastSpell(caster, SPELL_ROBOT_KILL_CREDIT, true); - target->DespawnOrUnsummon(); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_q11730_ultrasonic_screwdriver_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q11730_ultrasonic_screwdriver_SpellScript(); + return GetCaster()->GetTypeId() == TYPEID_PLAYER && GetCastItem(); } + + bool Validate(SpellInfo const* /*spellEntry*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_SUMMON_SCAVENGEBOT_004A8) || !sSpellMgr->GetSpellInfo(SPELL_SUMMON_SENTRYBOT_57K) || !sSpellMgr->GetSpellInfo(SPELL_SUMMON_DEFENDOTANK_66D) || !sSpellMgr->GetSpellInfo(SPELL_SUMMON_SCAVENGEBOT_005B6) || !sSpellMgr->GetSpellInfo(SPELL_SUMMON_55D_COLLECTATRON) || !sSpellMgr->GetSpellInfo(SPELL_ROBOT_KILL_CREDIT)) + return false; + return true; + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Item* castItem = GetCastItem(); + Unit* caster = GetCaster(); + if (Creature* target = GetHitCreature()) + { + uint32 spellId = 0; + switch (target->GetEntry()) + { + case NPC_SCAVENGEBOT_004A8: + spellId = SPELL_SUMMON_SCAVENGEBOT_004A8; + break; + case NPC_SENTRYBOT_57K: + spellId = SPELL_SUMMON_SENTRYBOT_57K; + break; + case NPC_DEFENDOTANK_66D: + spellId = SPELL_SUMMON_DEFENDOTANK_66D; + break; + case NPC_SCAVENGEBOT_005B6: + spellId = SPELL_SUMMON_SCAVENGEBOT_005B6; + break; + case NPC_55D_COLLECTATRON: + spellId = SPELL_SUMMON_55D_COLLECTATRON; + break; + default: + return; + } + caster->CastSpell(caster, spellId, true, castItem); + caster->CastSpell(caster, SPELL_ROBOT_KILL_CREDIT, true); + target->DespawnOrUnsummon(); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_q11730_ultrasonic_screwdriver_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q11730_ultrasonic_screwdriver_SpellScript(); + } }; // http://www.wowhead.com/quest=12459 That Which Creates Can Also Destroy @@ -1498,39 +1516,45 @@ enum Quest12459Data class spell_q12459_seeds_of_natures_wrath : public SpellScriptLoader { - public: - spell_q12459_seeds_of_natures_wrath() : SpellScriptLoader("spell_q12459_seeds_of_natures_wrath") { } +public: + spell_q12459_seeds_of_natures_wrath() : SpellScriptLoader("spell_q12459_seeds_of_natures_wrath") { } - class spell_q12459_seeds_of_natures_wrath_SpellScript : public SpellScript + class spell_q12459_seeds_of_natures_wrath_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q12459_seeds_of_natures_wrath_SpellScript); + + void HandleDummy(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_q12459_seeds_of_natures_wrath_SpellScript); - - void HandleDummy(SpellEffIndex /*effIndex*/) + if (Creature* creatureTarget = GetHitCreature()) { - if (Creature* creatureTarget = GetHitCreature()) + uint32 uiNewEntry = 0; + switch (creatureTarget->GetEntry()) { - uint32 uiNewEntry = 0; - switch (creatureTarget->GetEntry()) - { - case NPC_REANIMATED_FROSTWYRM: uiNewEntry = NPC_WEAK_REANIMATED_FROSTWYRM; break; - case NPC_TURGID: uiNewEntry = NPC_WEAK_TURGID; break; - case NPC_DEATHGAZE: uiNewEntry = NPC_WEAK_DEATHGAZE; break; - } - if (uiNewEntry) - creatureTarget->UpdateEntry(uiNewEntry); + case NPC_REANIMATED_FROSTWYRM: + uiNewEntry = NPC_WEAK_REANIMATED_FROSTWYRM; + break; + case NPC_TURGID: + uiNewEntry = NPC_WEAK_TURGID; + break; + case NPC_DEATHGAZE: + uiNewEntry = NPC_WEAK_DEATHGAZE; + break; } + if (uiNewEntry) + creatureTarget->UpdateEntry(uiNewEntry); } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_q12459_seeds_of_natures_wrath_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q12459_seeds_of_natures_wrath_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_q12459_seeds_of_natures_wrath_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q12459_seeds_of_natures_wrath_SpellScript(); + } }; // http://www.wowhead.com/quest=12634 Some Make Lemonade, Some Make Liquor @@ -1545,79 +1569,83 @@ enum Quest12634Data class spell_q12634_despawn_fruit_tosser : public SpellScriptLoader { - public: - spell_q12634_despawn_fruit_tosser() : SpellScriptLoader("spell_q12634_despawn_fruit_tosser") { } +public: + spell_q12634_despawn_fruit_tosser() : SpellScriptLoader("spell_q12634_despawn_fruit_tosser") { } - class spell_q12634_despawn_fruit_tosser_SpellScript : public SpellScript + class spell_q12634_despawn_fruit_tosser_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q12634_despawn_fruit_tosser_SpellScript); + + bool Validate(SpellInfo const* /*spellEntry*/) { - PrepareSpellScript(spell_q12634_despawn_fruit_tosser_SpellScript); - - bool Validate(SpellInfo const* /*spellEntry*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_BANANAS_FALL_TO_GROUND) || !sSpellMgr->GetSpellInfo(SPELL_ORANGE_FALLS_TO_GROUND) || !sSpellMgr->GetSpellInfo(SPELL_PAPAYA_FALLS_TO_GROUND) || !sSpellMgr->GetSpellInfo(SPELL_SUMMON_ADVENTUROUS_DWARF)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - uint32 spellId = SPELL_BANANAS_FALL_TO_GROUND; - switch (urand(0, 3)) - { - case 1: spellId = SPELL_ORANGE_FALLS_TO_GROUND; break; - case 2: spellId = SPELL_PAPAYA_FALLS_TO_GROUND; break; - } - // sometimes, if you're lucky, you get a dwarf - if (roll_chance_i(5)) - spellId = SPELL_SUMMON_ADVENTUROUS_DWARF; - GetCaster()->CastSpell(GetCaster(), spellId, true, nullptr); - } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_q12634_despawn_fruit_tosser_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q12634_despawn_fruit_tosser_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_BANANAS_FALL_TO_GROUND) || !sSpellMgr->GetSpellInfo(SPELL_ORANGE_FALLS_TO_GROUND) || !sSpellMgr->GetSpellInfo(SPELL_PAPAYA_FALLS_TO_GROUND) || !sSpellMgr->GetSpellInfo(SPELL_SUMMON_ADVENTUROUS_DWARF)) + return false; + return true; } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + uint32 spellId = SPELL_BANANAS_FALL_TO_GROUND; + switch (urand(0, 3)) + { + case 1: + spellId = SPELL_ORANGE_FALLS_TO_GROUND; + break; + case 2: + spellId = SPELL_PAPAYA_FALLS_TO_GROUND; + break; + } + // sometimes, if you're lucky, you get a dwarf + if (roll_chance_i(5)) + spellId = SPELL_SUMMON_ADVENTUROUS_DWARF; + GetCaster()->CastSpell(GetCaster(), spellId, true, nullptr); + } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_q12634_despawn_fruit_tosser_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q12634_despawn_fruit_tosser_SpellScript(); + } }; // http://www.wowhead.com/quest=12683 Burning to Help // 52308 Take Sputum Sample class spell_q12683_take_sputum_sample : public SpellScriptLoader { - public: - spell_q12683_take_sputum_sample() : SpellScriptLoader("spell_q12683_take_sputum_sample") { } +public: + spell_q12683_take_sputum_sample() : SpellScriptLoader("spell_q12683_take_sputum_sample") { } - class spell_q12683_take_sputum_sample_SpellScript : public SpellScript + class spell_q12683_take_sputum_sample_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q12683_take_sputum_sample_SpellScript); + + void HandleDummy(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_q12683_take_sputum_sample_SpellScript); + uint32 reqAuraId = GetSpellInfo()->Effects[EFFECT_1].CalcValue(); - void HandleDummy(SpellEffIndex /*effIndex*/) + Unit* caster = GetCaster(); + if (caster->HasAuraEffect(reqAuraId, 0)) { - uint32 reqAuraId = GetSpellInfo()->Effects[EFFECT_1].CalcValue(); - - Unit* caster = GetCaster(); - if (caster->HasAuraEffect(reqAuraId, 0)) - { - uint32 spellId = GetSpellInfo()->Effects[EFFECT_0].CalcValue(); - caster->CastSpell(caster, spellId, true, nullptr); - } + uint32 spellId = GetSpellInfo()->Effects[EFFECT_0].CalcValue(); + caster->CastSpell(caster, spellId, true, nullptr); } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_q12683_take_sputum_sample_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q12683_take_sputum_sample_SpellScript(); } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_q12683_take_sputum_sample_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q12683_take_sputum_sample_SpellScript(); + } }; // http://www.wowhead.com/quest=12851 Going Bearback @@ -1634,52 +1662,52 @@ enum Quest12851Data class spell_q12851_going_bearback : public SpellScriptLoader { - public: - spell_q12851_going_bearback() : SpellScriptLoader("spell_q12851_going_bearback") { } +public: + spell_q12851_going_bearback() : SpellScriptLoader("spell_q12851_going_bearback") { } - class spell_q12851_going_bearback_AuraScript : public AuraScript + class spell_q12851_going_bearback_AuraScript : public AuraScript + { + PrepareAuraScript(spell_q12851_going_bearback_AuraScript); + + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_q12851_going_bearback_AuraScript); - - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + if (Unit* caster = GetCaster()) { - if (Unit* caster = GetCaster()) - { - Unit* target = GetTarget(); - // Already in fire - if (target->HasAura(SPELL_ABLAZE)) - return; + Unit* target = GetTarget(); + // Already in fire + if (target->HasAura(SPELL_ABLAZE)) + return; - if (Player* player = caster->GetCharmerOrOwnerPlayerOrPlayerItself()) + if (Player* player = caster->GetCharmerOrOwnerPlayerOrPlayerItself()) + { + switch (target->GetEntry()) { - switch (target->GetEntry()) - { - case NPC_FROSTWORG: - target->CastSpell(player, SPELL_FROSTWORG_CREDIT, true); - target->CastSpell(target, SPELL_IMMOLATION, true); - target->CastSpell(target, SPELL_ABLAZE, true); - break; - case NPC_FROSTGIANT: - target->CastSpell(player, SPELL_FROSTGIANT_CREDIT, true); - target->CastSpell(target, SPELL_IMMOLATION, true); - target->CastSpell(target, SPELL_ABLAZE, true); - break; - } + case NPC_FROSTWORG: + target->CastSpell(player, SPELL_FROSTWORG_CREDIT, true); + target->CastSpell(target, SPELL_IMMOLATION, true); + target->CastSpell(target, SPELL_ABLAZE, true); + break; + case NPC_FROSTGIANT: + target->CastSpell(player, SPELL_FROSTGIANT_CREDIT, true); + target->CastSpell(target, SPELL_IMMOLATION, true); + target->CastSpell(target, SPELL_ABLAZE, true); + break; } } } - - void Register() - { - AfterEffectApply += AuraEffectApplyFn(spell_q12851_going_bearback_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - } - - }; - - AuraScript* GetAuraScript() const - { - return new spell_q12851_going_bearback_AuraScript(); } + + void Register() + { + AfterEffectApply += AuraEffectApplyFn(spell_q12851_going_bearback_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + } + + }; + + AuraScript* GetAuraScript() const + { + return new spell_q12851_going_bearback_AuraScript(); + } }; // http://www.wowhead.com/quest=12937 Relief for the Fallen @@ -1692,46 +1720,46 @@ enum Quest12937Data class spell_q12937_relief_for_the_fallen : public SpellScriptLoader { - public: - spell_q12937_relief_for_the_fallen() : SpellScriptLoader("spell_q12937_relief_for_the_fallen") { } +public: + spell_q12937_relief_for_the_fallen() : SpellScriptLoader("spell_q12937_relief_for_the_fallen") { } - class spell_q12937_relief_for_the_fallen_SpellScript : public SpellScript + class spell_q12937_relief_for_the_fallen_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q12937_relief_for_the_fallen_SpellScript); + + bool Load() { - PrepareSpellScript(spell_q12937_relief_for_the_fallen_SpellScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - bool Validate(SpellInfo const* /*spellEntry*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_TRIGGER_AID_OF_THE_EARTHEN)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Player* caster = GetCaster()->ToPlayer(); - if (Creature* target = GetHitCreature()) - { - caster->CastSpell(caster, SPELL_TRIGGER_AID_OF_THE_EARTHEN, true, nullptr); - caster->KilledMonsterCredit(NPC_FALLEN_EARTHEN_DEFENDER, 0); - target->DespawnOrUnsummon(); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_q12937_relief_for_the_fallen_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q12937_relief_for_the_fallen_SpellScript(); + return GetCaster()->GetTypeId() == TYPEID_PLAYER; } + + bool Validate(SpellInfo const* /*spellEntry*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_TRIGGER_AID_OF_THE_EARTHEN)) + return false; + return true; + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Player* caster = GetCaster()->ToPlayer(); + if (Creature* target = GetHitCreature()) + { + caster->CastSpell(caster, SPELL_TRIGGER_AID_OF_THE_EARTHEN, true, nullptr); + caster->KilledMonsterCredit(NPC_FALLEN_EARTHEN_DEFENDER, 0); + target->DespawnOrUnsummon(); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_q12937_relief_for_the_fallen_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q12937_relief_for_the_fallen_SpellScript(); + } }; enum Whoarethey @@ -1743,40 +1771,40 @@ enum Whoarethey class spell_q10041_q10040_who_are_they : public SpellScriptLoader { - public: - spell_q10041_q10040_who_are_they() : SpellScriptLoader("spell_q10041_q10040_who_are_they") { } +public: + spell_q10041_q10040_who_are_they() : SpellScriptLoader("spell_q10041_q10040_who_are_they") { } - class spell_q10041_q10040_who_are_they_SpellScript : public SpellScript + class spell_q10041_q10040_who_are_they_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q10041_q10040_who_are_they_SpellScript); + + bool Validate(SpellInfo const* /*spellEntry*/) { - PrepareSpellScript(spell_q10041_q10040_who_are_they_SpellScript); - - bool Validate(SpellInfo const* /*spellEntry*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_MALE_DISGUISE) || !sSpellMgr->GetSpellInfo(SPELL_FEMALE_DISGUISE) || !sSpellMgr->GetSpellInfo(SPELL_GENERIC_DISGUISE)) - return false; - return true; - } - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Player* target = GetHitPlayer()) - { - target->CastSpell(target, target->getGender() == GENDER_MALE ? SPELL_MALE_DISGUISE : SPELL_FEMALE_DISGUISE, true); - target->CastSpell(target, SPELL_GENERIC_DISGUISE, true); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_q10041_q10040_who_are_they_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q10041_q10040_who_are_they_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_MALE_DISGUISE) || !sSpellMgr->GetSpellInfo(SPELL_FEMALE_DISGUISE) || !sSpellMgr->GetSpellInfo(SPELL_GENERIC_DISGUISE)) + return false; + return true; } + + void HandleScript(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (Player* target = GetHitPlayer()) + { + target->CastSpell(target, target->getGender() == GENDER_MALE ? SPELL_MALE_DISGUISE : SPELL_FEMALE_DISGUISE, true); + target->CastSpell(target, SPELL_GENERIC_DISGUISE, true); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_q10041_q10040_who_are_they_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q10041_q10040_who_are_they_SpellScript(); + } }; enum symboloflife @@ -1787,38 +1815,38 @@ enum symboloflife // 8593 Symbol of life dummy class spell_symbol_of_life_dummy : public SpellScriptLoader { - public: - spell_symbol_of_life_dummy() : SpellScriptLoader("spell_symbol_of_life_dummy") { } +public: + spell_symbol_of_life_dummy() : SpellScriptLoader("spell_symbol_of_life_dummy") { } - class spell_symbol_of_life_dummy_SpellScript : public SpellScript + class spell_symbol_of_life_dummy_SpellScript : public SpellScript + { + PrepareSpellScript(spell_symbol_of_life_dummy_SpellScript); + + void HandleDummy(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_symbol_of_life_dummy_SpellScript); - - void HandleDummy(SpellEffIndex /*effIndex*/) + if (Creature* target = GetHitCreature()) { - if (Creature* target = GetHitCreature()) + if (target->HasAura(SPELL_PERMANENT_FEIGN_DEATH)) { - if (target->HasAura(SPELL_PERMANENT_FEIGN_DEATH)) - { - target->RemoveAurasDueToSpell(SPELL_PERMANENT_FEIGN_DEATH); - target->SetUInt32Value(UNIT_DYNAMIC_FLAGS, 0); - target->SetUInt32Value(UNIT_FIELD_FLAGS_2, 0); - target->SetHealth(target->GetMaxHealth() / 2); - target->SetPower(POWER_MANA, uint32(target->GetMaxPower(POWER_MANA) * 0.75f)); - } + target->RemoveAurasDueToSpell(SPELL_PERMANENT_FEIGN_DEATH); + target->SetUInt32Value(UNIT_DYNAMIC_FLAGS, 0); + target->SetUInt32Value(UNIT_FIELD_FLAGS_2, 0); + target->SetHealth(target->GetMaxHealth() / 2); + target->SetPower(POWER_MANA, uint32(target->GetMaxPower(POWER_MANA) * 0.75f)); } } + } - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_symbol_of_life_dummy_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const + void Register() { - return new spell_symbol_of_life_dummy_SpellScript(); - }; + OnEffectHitTarget += SpellEffectFn(spell_symbol_of_life_dummy_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_symbol_of_life_dummy_SpellScript(); + }; }; // http://www.wowhead.com/quest=12659 Scalps! @@ -1830,38 +1858,38 @@ enum Quest12659Data class spell_q12659_ahunaes_knife : public SpellScriptLoader { - public: - spell_q12659_ahunaes_knife() : SpellScriptLoader("spell_q12659_ahunaes_knife") { } +public: + spell_q12659_ahunaes_knife() : SpellScriptLoader("spell_q12659_ahunaes_knife") { } - class spell_q12659_ahunaes_knife_SpellScript : public SpellScript + class spell_q12659_ahunaes_knife_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q12659_ahunaes_knife_SpellScript); + + bool Load() { - PrepareSpellScript(spell_q12659_ahunaes_knife_SpellScript); + return GetCaster()->GetTypeId() == TYPEID_PLAYER; + } - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Player* caster = GetCaster()->ToPlayer(); - if (Creature* target = GetHitCreature()) - { - target->DespawnOrUnsummon(); - caster->KilledMonsterCredit(NPC_SCALPS_KC_BUNNY, 0); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_q12659_ahunaes_knife_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const + void HandleDummy(SpellEffIndex /*effIndex*/) { - return new spell_q12659_ahunaes_knife_SpellScript(); - }; + Player* caster = GetCaster()->ToPlayer(); + if (Creature* target = GetHitCreature()) + { + target->DespawnOrUnsummon(); + caster->KilledMonsterCredit(NPC_SCALPS_KC_BUNNY, 0); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_q12659_ahunaes_knife_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q12659_ahunaes_knife_SpellScript(); + }; }; enum StoppingTheSpread @@ -1872,42 +1900,42 @@ enum StoppingTheSpread class spell_q9874_liquid_fire : public SpellScriptLoader { - public: - spell_q9874_liquid_fire() : SpellScriptLoader("spell_q9874_liquid_fire") +public: + spell_q9874_liquid_fire() : SpellScriptLoader("spell_q9874_liquid_fire") + { + } + + class spell_q9874_liquid_fire_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q9874_liquid_fire_SpellScript); + + bool Load() { + return GetCaster()->GetTypeId() == TYPEID_PLAYER; } - class spell_q9874_liquid_fire_SpellScript : public SpellScript + void HandleDummy(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_q9874_liquid_fire_SpellScript); + Player* caster = GetCaster()->ToPlayer(); + if (Creature* target = GetHitCreature()) + if (target && !target->HasAura(SPELL_FLAMES)) + { + caster->KilledMonsterCredit(NPC_VILLAGER_KILL_CREDIT, 0); + target->CastSpell(target, SPELL_FLAMES, true); + target->DespawnOrUnsummon(20000); + } + } - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Player* caster = GetCaster()->ToPlayer(); - if (Creature* target = GetHitCreature()) - if (target && !target->HasAura(SPELL_FLAMES)) - { - caster->KilledMonsterCredit(NPC_VILLAGER_KILL_CREDIT, 0); - target->CastSpell(target, SPELL_FLAMES, true); - target->DespawnOrUnsummon(20000); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_q9874_liquid_fire_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const + void Register() { - return new spell_q9874_liquid_fire_SpellScript(); - }; + OnEffectHitTarget += SpellEffectFn(spell_q9874_liquid_fire_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q9874_liquid_fire_SpellScript(); + }; }; enum SalvagingLifesStength @@ -1917,41 +1945,41 @@ enum SalvagingLifesStength class spell_q12805_lifeblood_dummy : public SpellScriptLoader { - public: - spell_q12805_lifeblood_dummy() : SpellScriptLoader("spell_q12805_lifeblood_dummy") +public: + spell_q12805_lifeblood_dummy() : SpellScriptLoader("spell_q12805_lifeblood_dummy") + { + } + + class spell_q12805_lifeblood_dummy_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q12805_lifeblood_dummy_SpellScript); + + bool Load() { + return GetCaster()->GetTypeId() == TYPEID_PLAYER; } - class spell_q12805_lifeblood_dummy_SpellScript : public SpellScript + void HandleScript(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_q12805_lifeblood_dummy_SpellScript); - - bool Load() + Player* caster = GetCaster()->ToPlayer(); + if (Creature* target = GetHitCreature()) { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; + caster->KilledMonsterCredit(NPC_SHARD_KILL_CREDIT, 0); + target->CastSpell(target, uint32(GetEffectValue()), true); + target->DespawnOrUnsummon(2000); } + } - void HandleScript(SpellEffIndex /*effIndex*/) - { - Player* caster = GetCaster()->ToPlayer(); - if (Creature* target = GetHitCreature()) - { - caster->KilledMonsterCredit(NPC_SHARD_KILL_CREDIT, 0); - target->CastSpell(target, uint32(GetEffectValue()), true); - target->DespawnOrUnsummon(2000); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_q12805_lifeblood_dummy_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const + void Register() { - return new spell_q12805_lifeblood_dummy_SpellScript(); - }; + OnEffectHitTarget += SpellEffectFn(spell_q12805_lifeblood_dummy_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q12805_lifeblood_dummy_SpellScript(); + }; }; /* @@ -1967,31 +1995,31 @@ enum BattleStandard class spell_q13280_13283_plant_battle_standard: public SpellScriptLoader { - public: - spell_q13280_13283_plant_battle_standard() : SpellScriptLoader("spell_q13280_13283_plant_battle_standard") { } +public: + spell_q13280_13283_plant_battle_standard() : SpellScriptLoader("spell_q13280_13283_plant_battle_standard") { } - class spell_q13280_13283_plant_battle_standard_SpellScript : public SpellScript + class spell_q13280_13283_plant_battle_standard_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q13280_13283_plant_battle_standard_SpellScript); + + void HandleDummy(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_q13280_13283_plant_battle_standard_SpellScript); - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - if (caster->IsVehicle()) - if (Unit* player = caster->GetVehicleKit()->GetPassenger(0)) - player->ToPlayer()->KilledMonsterCredit(NPC_KING_OF_THE_MOUNTAINT_KC, 0); - } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_q13280_13283_plant_battle_standard_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q13280_13283_plant_battle_standard_SpellScript(); + Unit* caster = GetCaster(); + if (caster->IsVehicle()) + if (Unit* player = caster->GetVehicleKit()->GetPassenger(0)) + player->ToPlayer()->KilledMonsterCredit(NPC_KING_OF_THE_MOUNTAINT_KC, 0); } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_q13280_13283_plant_battle_standard_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q13280_13283_plant_battle_standard_SpellScript(); + } }; enum ChumTheWaterSummons @@ -2004,36 +2032,36 @@ enum ChumTheWaterSummons class spell_q14112_14145_chum_the_water: public SpellScriptLoader { - public: - spell_q14112_14145_chum_the_water() : SpellScriptLoader("spell_q14112_14145_chum_the_water") { } +public: + spell_q14112_14145_chum_the_water() : SpellScriptLoader("spell_q14112_14145_chum_the_water") { } - class spell_q14112_14145_chum_the_water_SpellScript : public SpellScript + class spell_q14112_14145_chum_the_water_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q14112_14145_chum_the_water_SpellScript); + + bool Validate(SpellInfo const* /*spellEntry*/) { - PrepareSpellScript(spell_q14112_14145_chum_the_water_SpellScript); - - bool Validate(SpellInfo const* /*spellEntry*/) - { - if (!sSpellMgr->GetSpellInfo(SUMMON_ANGRY_KVALDIR) || !sSpellMgr->GetSpellInfo(SUMMON_NORTH_SEA_MAKO) || !sSpellMgr->GetSpellInfo(SUMMON_NORTH_SEA_THRESHER) || !sSpellMgr->GetSpellInfo(SUMMON_NORTH_SEA_BLUE_SHARK)) - return false; - return true; - } - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - caster->CastSpell(caster, RAND(SUMMON_ANGRY_KVALDIR, SUMMON_NORTH_SEA_MAKO, SUMMON_NORTH_SEA_THRESHER, SUMMON_NORTH_SEA_BLUE_SHARK)); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_q14112_14145_chum_the_water_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q14112_14145_chum_the_water_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SUMMON_ANGRY_KVALDIR) || !sSpellMgr->GetSpellInfo(SUMMON_NORTH_SEA_MAKO) || !sSpellMgr->GetSpellInfo(SUMMON_NORTH_SEA_THRESHER) || !sSpellMgr->GetSpellInfo(SUMMON_NORTH_SEA_BLUE_SHARK)) + return false; + return true; } + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + caster->CastSpell(caster, RAND(SUMMON_ANGRY_KVALDIR, SUMMON_NORTH_SEA_MAKO, SUMMON_NORTH_SEA_THRESHER, SUMMON_NORTH_SEA_BLUE_SHARK)); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_q14112_14145_chum_the_water_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q14112_14145_chum_the_water_SpellScript(); + } }; // http://old01.wowhead.com/quest=9452 - Red Snapper - Very Tasty! @@ -2049,56 +2077,56 @@ enum RedSnapperVeryTasty class spell_q9452_cast_net: public SpellScriptLoader { - public: - spell_q9452_cast_net() : SpellScriptLoader("spell_q9452_cast_net") { } +public: + spell_q9452_cast_net() : SpellScriptLoader("spell_q9452_cast_net") { } - class spell_q9452_cast_net_SpellScript : public SpellScript + class spell_q9452_cast_net_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q9452_cast_net_SpellScript); + + bool Load() { - PrepareSpellScript(spell_q9452_cast_net_SpellScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - SpellCastResult CheckCast() - { - GameObject* go = GetCaster()->FindNearestGameObject(GO_SCHOOL_OF_RED_SNAPPER, 3.0f); - if (!go || go->GetRespawnTime()) - return SPELL_FAILED_REQUIRES_SPELL_FOCUS; - - return SPELL_CAST_OK; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Player* caster = GetCaster()->ToPlayer(); - if (roll_chance_i(66)) - caster->AddItem(ITEM_RED_SNAPPER, 1); - else - caster->CastSpell(caster, SPELL_NEW_SUMMON_TEST, true); - } - - void HandleActiveObject(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetHitGObj()->SetRespawnTime(roll_chance_i(50) ? 2 * MINUTE : 3 * MINUTE); - GetHitGObj()->Use(GetCaster()); - GetHitGObj()->SetLootState(GO_JUST_DEACTIVATED); - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_q9452_cast_net_SpellScript::CheckCast); - OnEffectHit += SpellEffectFn(spell_q9452_cast_net_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - OnEffectHitTarget += SpellEffectFn(spell_q9452_cast_net_SpellScript::HandleActiveObject, EFFECT_1, SPELL_EFFECT_ACTIVATE_OBJECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q9452_cast_net_SpellScript(); + return GetCaster()->GetTypeId() == TYPEID_PLAYER; } + + SpellCastResult CheckCast() + { + GameObject* go = GetCaster()->FindNearestGameObject(GO_SCHOOL_OF_RED_SNAPPER, 3.0f); + if (!go || go->GetRespawnTime()) + return SPELL_FAILED_REQUIRES_SPELL_FOCUS; + + return SPELL_CAST_OK; + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Player* caster = GetCaster()->ToPlayer(); + if (roll_chance_i(66)) + caster->AddItem(ITEM_RED_SNAPPER, 1); + else + caster->CastSpell(caster, SPELL_NEW_SUMMON_TEST, true); + } + + void HandleActiveObject(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + GetHitGObj()->SetRespawnTime(roll_chance_i(50) ? 2 * MINUTE : 3 * MINUTE); + GetHitGObj()->Use(GetCaster()); + GetHitGObj()->SetLootState(GO_JUST_DEACTIVATED); + } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_q9452_cast_net_SpellScript::CheckCast); + OnEffectHit += SpellEffectFn(spell_q9452_cast_net_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + OnEffectHitTarget += SpellEffectFn(spell_q9452_cast_net_SpellScript::HandleActiveObject, EFFECT_1, SPELL_EFFECT_ACTIVATE_OBJECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q9452_cast_net_SpellScript(); + } }; enum HodirsHelm @@ -2155,50 +2183,50 @@ enum LeaveNothingToChance class spell_q12277_wintergarde_mine_explosion : public SpellScriptLoader { - public: - spell_q12277_wintergarde_mine_explosion() : SpellScriptLoader("spell_q12277_wintergarde_mine_explosion") { } +public: + spell_q12277_wintergarde_mine_explosion() : SpellScriptLoader("spell_q12277_wintergarde_mine_explosion") { } - class spell_q12277_wintergarde_mine_explosion_SpellScript : public SpellScript + class spell_q12277_wintergarde_mine_explosion_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q12277_wintergarde_mine_explosion_SpellScript); + + void HandleDummy(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_q12277_wintergarde_mine_explosion_SpellScript); - - void HandleDummy(SpellEffIndex /*effIndex*/) + if (Creature* unitTarget = GetHitCreature()) { - if (Creature* unitTarget = GetHitCreature()) + if (Unit* caster = GetCaster()) { - if (Unit* caster = GetCaster()) + if (caster->GetTypeId() == TYPEID_UNIT) { - if (caster->GetTypeId() == TYPEID_UNIT) + if (Unit* owner = caster->GetOwner()) { - if (Unit* owner = caster->GetOwner()) + switch (unitTarget->GetEntry()) { - switch (unitTarget->GetEntry()) - { - case NPC_UPPER_MINE_SHAFT: - caster->CastSpell(owner, SPELL_UPPER_MINE_SHAFT_CREDIT, true); - break; - case NPC_LOWER_MINE_SHAFT: - caster->CastSpell(owner, SPELL_LOWER_MINE_SHAFT_CREDIT, true); - break; - default: - break; - } + case NPC_UPPER_MINE_SHAFT: + caster->CastSpell(owner, SPELL_UPPER_MINE_SHAFT_CREDIT, true); + break; + case NPC_LOWER_MINE_SHAFT: + caster->CastSpell(owner, SPELL_LOWER_MINE_SHAFT_CREDIT, true); + break; + default: + break; } } } } } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_q12277_wintergarde_mine_explosion_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q12277_wintergarde_mine_explosion_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_q12277_wintergarde_mine_explosion_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q12277_wintergarde_mine_explosion_SpellScript(); + } }; enum FocusOnTheBeach @@ -2246,42 +2274,42 @@ enum ACleansingSong class spell_q12735_song_of_cleansing : public SpellScriptLoader { - public: - spell_q12735_song_of_cleansing() : SpellScriptLoader("spell_q12735_song_of_cleansing") { } +public: + spell_q12735_song_of_cleansing() : SpellScriptLoader("spell_q12735_song_of_cleansing") { } - class spell_q12735_song_of_cleansing_SpellScript : public SpellScript + class spell_q12735_song_of_cleansing_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q12735_song_of_cleansing_SpellScript); + + void HandleScript(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_q12735_song_of_cleansing_SpellScript); - - void HandleScript(SpellEffIndex /*effIndex*/) + Unit* caster = GetCaster(); + switch (caster->GetAreaId()) { - Unit* caster = GetCaster(); - switch (caster->GetAreaId()) - { - case AREA_BITTERTIDELAKE: - caster->CastSpell(caster, SPELL_SUMMON_SPIRIT_ATAH); - break; - case AREA_RIVERSHEART: - caster->CastSpell(caster, SPELL_SUMMON_SPIRIT_HAKHALAN); - break; - case AREA_WINTERGRASPRIVER: - caster->CastSpell(caster, SPELL_SUMMON_SPIRIT_KOOSU); - break; - default: - break; - } + case AREA_BITTERTIDELAKE: + caster->CastSpell(caster, SPELL_SUMMON_SPIRIT_ATAH); + break; + case AREA_RIVERSHEART: + caster->CastSpell(caster, SPELL_SUMMON_SPIRIT_HAKHALAN); + break; + case AREA_WINTERGRASPRIVER: + caster->CastSpell(caster, SPELL_SUMMON_SPIRIT_KOOSU); + break; + default: + break; } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_q12735_song_of_cleansing_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q12735_song_of_cleansing_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_q12735_song_of_cleansing_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q12735_song_of_cleansing_SpellScript(); + } }; // "Bombing Run" and "Bomb Them Again!" @@ -2298,187 +2326,187 @@ enum Quest11010_11102_11023Data // 40113 Knockdown Fel Cannon: The Aggro Check Aura class spell_q11010_q11102_q11023_aggro_check_aura : public SpellScriptLoader { - public: - spell_q11010_q11102_q11023_aggro_check_aura() : SpellScriptLoader("spell_q11010_q11102_q11023_aggro_check_aura") { } +public: + spell_q11010_q11102_q11023_aggro_check_aura() : SpellScriptLoader("spell_q11010_q11102_q11023_aggro_check_aura") { } - class spell_q11010_q11102_q11023_aggro_check_aura_AuraScript : public AuraScript + class spell_q11010_q11102_q11023_aggro_check_aura_AuraScript : public AuraScript + { + PrepareAuraScript(spell_q11010_q11102_q11023_aggro_check_aura_AuraScript); + + void HandleTriggerSpell(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_q11010_q11102_q11023_aggro_check_aura_AuraScript); - - void HandleTriggerSpell(AuraEffect const* /*aurEff*/) - { - if (Unit* target = GetTarget()) - // On trigger proccing - target->CastSpell(target, SPELL_AGGRO_CHECK); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_q11010_q11102_q11023_aggro_check_aura_AuraScript::HandleTriggerSpell, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_q11010_q11102_q11023_aggro_check_aura_AuraScript(); + if (Unit* target = GetTarget()) + // On trigger proccing + target->CastSpell(target, SPELL_AGGRO_CHECK); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_q11010_q11102_q11023_aggro_check_aura_AuraScript::HandleTriggerSpell, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_q11010_q11102_q11023_aggro_check_aura_AuraScript(); + } }; // 40112 Knockdown Fel Cannon: The Aggro Check class spell_q11010_q11102_q11023_aggro_check : public SpellScriptLoader { - public: - spell_q11010_q11102_q11023_aggro_check() : SpellScriptLoader("spell_q11010_q11102_q11023_aggro_check") { } +public: + spell_q11010_q11102_q11023_aggro_check() : SpellScriptLoader("spell_q11010_q11102_q11023_aggro_check") { } - class spell_q11010_q11102_q11023_aggro_check_SpellScript : public SpellScript + class spell_q11010_q11102_q11023_aggro_check_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q11010_q11102_q11023_aggro_check_SpellScript); + + void HandleDummy(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_q11010_q11102_q11023_aggro_check_SpellScript); - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - if (Player* playerTarget = GetHitPlayer()) - // Check if found player target is on fly mount or using flying form - if (playerTarget->HasAuraType(SPELL_AURA_FLY) || playerTarget->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED)) - playerTarget->CastSpell(playerTarget, SPELL_FLAK_CANNON_TRIGGER, TRIGGERED_FULL_MASK); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_q11010_q11102_q11023_aggro_check_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q11010_q11102_q11023_aggro_check_SpellScript(); + if (Player* playerTarget = GetHitPlayer()) + // Check if found player target is on fly mount or using flying form + if (playerTarget->HasAuraType(SPELL_AURA_FLY) || playerTarget->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED)) + playerTarget->CastSpell(playerTarget, SPELL_FLAK_CANNON_TRIGGER, TRIGGERED_FULL_MASK); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_q11010_q11102_q11023_aggro_check_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q11010_q11102_q11023_aggro_check_SpellScript(); + } }; // 40119 Knockdown Fel Cannon: The Aggro Burst class spell_q11010_q11102_q11023_aggro_burst : public SpellScriptLoader { - public: - spell_q11010_q11102_q11023_aggro_burst() : SpellScriptLoader("spell_q11010_q11102_q11023_aggro_burst") { } +public: + spell_q11010_q11102_q11023_aggro_burst() : SpellScriptLoader("spell_q11010_q11102_q11023_aggro_burst") { } - class spell_q11010_q11102_q11023_aggro_burst_AuraScript : public AuraScript + class spell_q11010_q11102_q11023_aggro_burst_AuraScript : public AuraScript + { + PrepareAuraScript(spell_q11010_q11102_q11023_aggro_burst_AuraScript); + + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_q11010_q11102_q11023_aggro_burst_AuraScript); - - void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) - { - if (Unit* target = GetTarget()) - // On each tick cast Choose Loc to trigger summon - target->CastSpell(target, SPELL_CHOOSE_LOC); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_q11010_q11102_q11023_aggro_burst_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_q11010_q11102_q11023_aggro_burst_AuraScript(); + if (Unit* target = GetTarget()) + // On each tick cast Choose Loc to trigger summon + target->CastSpell(target, SPELL_CHOOSE_LOC); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_q11010_q11102_q11023_aggro_burst_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_q11010_q11102_q11023_aggro_burst_AuraScript(); + } }; // 40056 Knockdown Fel Cannon: Choose Loc class spell_q11010_q11102_q11023_choose_loc : public SpellScriptLoader { - public: - spell_q11010_q11102_q11023_choose_loc() : SpellScriptLoader("spell_q11010_q11102_q11023_choose_loc") { } +public: + spell_q11010_q11102_q11023_choose_loc() : SpellScriptLoader("spell_q11010_q11102_q11023_choose_loc") { } - class spell_q11010_q11102_q11023_choose_loc_SpellScript : public SpellScript + class spell_q11010_q11102_q11023_choose_loc_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q11010_q11102_q11023_choose_loc_SpellScript); + + void HandleDummy(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_q11010_q11102_q11023_choose_loc_SpellScript); - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - // Check for player that is in 65 y range - std::list playerList; - acore::AnyPlayerInObjectRangeCheck checker(caster, 65.0f); - acore::PlayerListSearcher searcher(caster, playerList, checker); - caster->VisitNearbyWorldObject(65.0f, searcher); - for (std::list::const_iterator itr = playerList.begin(); itr != playerList.end(); ++itr) - // Check if found player target is on fly mount or using flying form - if ((*itr)->HasAuraType(SPELL_AURA_FLY) || (*itr)->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED)) - // Summom Fel Cannon (bunny version) at found player - caster->SummonCreature(NPC_FEL_CANNON2, (*itr)->GetPositionX(), (*itr)->GetPositionY(), (*itr)->GetPositionZ()); - } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_q11010_q11102_q11023_choose_loc_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q11010_q11102_q11023_choose_loc_SpellScript(); + Unit* caster = GetCaster(); + // Check for player that is in 65 y range + std::list playerList; + acore::AnyPlayerInObjectRangeCheck checker(caster, 65.0f); + acore::PlayerListSearcher searcher(caster, playerList, checker); + caster->VisitNearbyWorldObject(65.0f, searcher); + for (std::list::const_iterator itr = playerList.begin(); itr != playerList.end(); ++itr) + // Check if found player target is on fly mount or using flying form + if ((*itr)->HasAuraType(SPELL_AURA_FLY) || (*itr)->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED)) + // Summom Fel Cannon (bunny version) at found player + caster->SummonCreature(NPC_FEL_CANNON2, (*itr)->GetPositionX(), (*itr)->GetPositionY(), (*itr)->GetPositionZ()); } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_q11010_q11102_q11023_choose_loc_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q11010_q11102_q11023_choose_loc_SpellScript(); + } }; // 39844 - Skyguard Blasting Charge // 40160 - Throw Bomb class spell_q11010_q11102_q11023_q11008_check_fly_mount : public SpellScriptLoader { - public: - spell_q11010_q11102_q11023_q11008_check_fly_mount() : SpellScriptLoader("spell_q11010_q11102_q11023_q11008_check_fly_mount") { } +public: + spell_q11010_q11102_q11023_q11008_check_fly_mount() : SpellScriptLoader("spell_q11010_q11102_q11023_q11008_check_fly_mount") { } - class spell_q11010_q11102_q11023_q11008_check_fly_mount_SpellScript : public SpellScript + class spell_q11010_q11102_q11023_q11008_check_fly_mount_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q11010_q11102_q11023_q11008_check_fly_mount_SpellScript); + + SpellCastResult CheckRequirement() { - PrepareSpellScript(spell_q11010_q11102_q11023_q11008_check_fly_mount_SpellScript); - - SpellCastResult CheckRequirement() - { - Unit* caster = GetCaster(); - // This spell will be cast only if caster has one of these auras - if (!(caster->HasAuraType(SPELL_AURA_FLY) || caster->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED))) - return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; - return SPELL_CAST_OK; - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_q11010_q11102_q11023_q11008_check_fly_mount_SpellScript::CheckRequirement); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q11010_q11102_q11023_q11008_check_fly_mount_SpellScript(); + Unit* caster = GetCaster(); + // This spell will be cast only if caster has one of these auras + if (!(caster->HasAuraType(SPELL_AURA_FLY) || caster->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED))) + return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; + return SPELL_CAST_OK; } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_q11010_q11102_q11023_q11008_check_fly_mount_SpellScript::CheckRequirement); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q11010_q11102_q11023_q11008_check_fly_mount_SpellScript(); + } }; // 55368 - Summon Stefan class spell_q12661_q12669_q12676_q12677_q12713_summon_stefan : public SpellScriptLoader { - public: - spell_q12661_q12669_q12676_q12677_q12713_summon_stefan() : SpellScriptLoader("spell_q12661_q12669_q12676_q12677_q12713_summon_stefan") { } +public: + spell_q12661_q12669_q12676_q12677_q12713_summon_stefan() : SpellScriptLoader("spell_q12661_q12669_q12676_q12677_q12713_summon_stefan") { } - class spell_q12661_q12669_q12676_q12677_q12713_summon_stefan_SpellScript : public SpellScript + class spell_q12661_q12669_q12676_q12677_q12713_summon_stefan_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q12661_q12669_q12676_q12677_q12713_summon_stefan_SpellScript); + + void SetDest(SpellDestination& dest) { - PrepareSpellScript(spell_q12661_q12669_q12676_q12677_q12713_summon_stefan_SpellScript); - - void SetDest(SpellDestination& dest) - { - // Adjust effect summon position - Position const offset = { 0.0f, 0.0f, 20.0f, 0.0f }; - dest.RelocateOffset(offset); - } - - void Register() - { - OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_q12661_q12669_q12676_q12677_q12713_summon_stefan_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER_BACK); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q12661_q12669_q12676_q12677_q12713_summon_stefan_SpellScript(); + // Adjust effect summon position + Position const offset = { 0.0f, 0.0f, 20.0f, 0.0f }; + dest.RelocateOffset(offset); } + + void Register() + { + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_q12661_q12669_q12676_q12677_q12713_summon_stefan_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER_BACK); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q12661_q12669_q12676_q12677_q12713_summon_stefan_SpellScript(); + } }; enum QuenchingMist @@ -2488,35 +2516,35 @@ enum QuenchingMist class spell_q12730_quenching_mist : public SpellScriptLoader { - public: - spell_q12730_quenching_mist() : SpellScriptLoader("spell_q12730_quenching_mist") { } +public: + spell_q12730_quenching_mist() : SpellScriptLoader("spell_q12730_quenching_mist") { } - class spell_q12730_quenching_mist_AuraScript : public AuraScript + class spell_q12730_quenching_mist_AuraScript : public AuraScript + { + PrepareAuraScript(spell_q12730_quenching_mist_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_q12730_quenching_mist_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_FLICKERING_FLAMES)) - return false; - return true; - } - - void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) - { - GetTarget()->RemoveAurasDueToSpell(SPELL_FLICKERING_FLAMES); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_q12730_quenching_mist_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_HEAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_q12730_quenching_mist_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_FLICKERING_FLAMES)) + return false; + return true; } + + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) + { + GetTarget()->RemoveAurasDueToSpell(SPELL_FLICKERING_FLAMES); + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_q12730_quenching_mist_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_HEAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_q12730_quenching_mist_AuraScript(); + } }; // 13291 - Borrowed Technology/13292 - The Solution Solution /Daily//13239 - Volatility/13261 - Volatiliy /Daily// @@ -2531,69 +2559,69 @@ enum Quest13291_13292_13239_13261Data class spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy : public SpellScriptLoader { - public: - spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy() : SpellScriptLoader("spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy") { } +public: + spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy() : SpellScriptLoader("spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy") { } - class spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy_SpellScript : public SpellScript + class spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy_SpellScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareSpellScript(spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy_SpellScript); + if (!sSpellMgr->GetSpellInfo(SPELL_RIDE)) + return false; - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_RIDE)) - return false; - - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - if (!GetHitCreature()) - return; - // TO DO: Being triggered is hack, but in checkcast it doesn't pass aurastate requirements. - // Beside that the decoy won't keep it's freeze animation state when enter. - GetHitCreature()->CastSpell(GetCaster(), SPELL_RIDE, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy_SpellScript(); + return true; } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + if (!GetHitCreature()) + return; + // TO DO: Being triggered is hack, but in checkcast it doesn't pass aurastate requirements. + // Beside that the decoy won't keep it's freeze animation state when enter. + GetHitCreature()->CastSpell(GetCaster(), SPELL_RIDE, true); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy_SpellScript(); + } }; // 59303 - Summon Frost Wyrm class spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon : public SpellScriptLoader { - public: - spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon() : SpellScriptLoader("spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon") { } +public: + spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon() : SpellScriptLoader("spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon") { } - class spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon_SpellScript : public SpellScript + class spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon_SpellScript); + + void SetDest(SpellDestination& dest) { - PrepareSpellScript(spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon_SpellScript); - - void SetDest(SpellDestination& dest) - { - // Adjust effect summon position - Position const offset = { 0.0f, 0.0f, 20.0f, 0.0f }; - dest.RelocateOffset(offset); - } - - void Register() - { - OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER_BACK); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon_SpellScript(); + // Adjust effect summon position + Position const offset = { 0.0f, 0.0f, 20.0f, 0.0f }; + dest.RelocateOffset(offset); } + + void Register() + { + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER_BACK); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon_SpellScript(); + } }; enum BearFlankMaster @@ -2605,52 +2633,52 @@ enum BearFlankMaster class spell_q13011_bear_flank_master : public SpellScriptLoader { - public: - spell_q13011_bear_flank_master() : SpellScriptLoader("spell_q13011_bear_flank_master") { } +public: + spell_q13011_bear_flank_master() : SpellScriptLoader("spell_q13011_bear_flank_master") { } - class spell_q13011_bear_flank_master_SpellScript : public SpellScript + class spell_q13011_bear_flank_master_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q13011_bear_flank_master_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_q13011_bear_flank_master_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_BEAR_FLANK_MASTER) || + if (!sSpellMgr->GetSpellInfo(SPELL_BEAR_FLANK_MASTER) || !sSpellMgr->GetSpellInfo(SPELL_CREATE_BEAR_FLANK)) - return false; - return true; - } - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_UNIT; - } - - void HandleScript(SpellEffIndex /*effIndex*/) - { - bool failed = RAND(0, 1); // 50% chance - Creature* creature = GetCaster()->ToCreature(); - if (Player* player = GetHitPlayer()) - { - if (failed) - { - player->CastSpell(creature, SPELL_BEAR_FLANK_FAIL); - creature->AI()->Talk(0, player); - } - else - player->CastSpell(player, SPELL_CREATE_BEAR_FLANK); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_q13011_bear_flank_master_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q13011_bear_flank_master_SpellScript(); + return false; + return true; } + + bool Load() + { + return GetCaster()->GetTypeId() == TYPEID_UNIT; + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + bool failed = RAND(0, 1); // 50% chance + Creature* creature = GetCaster()->ToCreature(); + if (Player* player = GetHitPlayer()) + { + if (failed) + { + player->CastSpell(creature, SPELL_BEAR_FLANK_FAIL); + creature->AI()->Talk(0, player); + } + else + player->CastSpell(player, SPELL_CREATE_BEAR_FLANK); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_q13011_bear_flank_master_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q13011_bear_flank_master_SpellScript(); + } }; enum BurstAtTheSeams @@ -2672,72 +2700,72 @@ enum BurstAtTheSeams class spell_q12690_burst_at_the_seams : public SpellScriptLoader { - public: - spell_q12690_burst_at_the_seams() : SpellScriptLoader("spell_q12690_burst_at_the_seams") { } +public: + spell_q12690_burst_at_the_seams() : SpellScriptLoader("spell_q12690_burst_at_the_seams") { } - class spell_q12690_burst_at_the_seams_SpellScript : public SpellScript + class spell_q12690_burst_at_the_seams_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q12690_burst_at_the_seams_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_q12690_burst_at_the_seams_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_BURST_AT_THE_SEAMS) + if (!sSpellMgr->GetSpellInfo(SPELL_BURST_AT_THE_SEAMS) || !sSpellMgr->GetSpellInfo(SPELL_BURST_AT_THE_SEAMS_DMG) || !sSpellMgr->GetSpellInfo(SPELL_BURST_AT_THE_SEAMS_DMG_2) || !sSpellMgr->GetSpellInfo(SPELL_BURST_AT_THE_SEAMS_BONE) || !sSpellMgr->GetSpellInfo(SPELL_BURST_AT_THE_SEAMS_MEAT) || !sSpellMgr->GetSpellInfo(SPELL_BURST_AT_THE_SEAMS_BMEAT)) - return false; - return true; - } + return false; + return true; + } - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_UNIT; - } + bool Load() + { + return GetCaster()->GetTypeId() == TYPEID_UNIT; + } - void HandleKnockBack(SpellEffIndex /*effIndex*/) + void HandleKnockBack(SpellEffIndex /*effIndex*/) + { + if (Unit* creature = GetHitCreature()) { - if (Unit* creature = GetHitCreature()) + if (Unit* charmer = GetCaster()->GetCharmerOrOwner()) { - if (Unit* charmer = GetCaster()->GetCharmerOrOwner()) + if (Player* player = charmer->ToPlayer()) { - if (Player* player = charmer->ToPlayer()) + if (player->GetQuestStatus(QUEST_BURST_AT_THE_SEAMS) == QUEST_STATUS_INCOMPLETE) { - if (player->GetQuestStatus(QUEST_BURST_AT_THE_SEAMS) == QUEST_STATUS_INCOMPLETE) - { - creature->CastSpell(creature, SPELL_BURST_AT_THE_SEAMS_BONE, true); - creature->CastSpell(creature, SPELL_BURST_AT_THE_SEAMS_MEAT, true); - creature->CastSpell(creature, SPELL_BURST_AT_THE_SEAMS_BMEAT, true); - creature->CastSpell(creature, SPELL_BURST_AT_THE_SEAMS_DMG, true); - creature->CastSpell(creature, SPELL_BURST_AT_THE_SEAMS_DMG_2, true); + creature->CastSpell(creature, SPELL_BURST_AT_THE_SEAMS_BONE, true); + creature->CastSpell(creature, SPELL_BURST_AT_THE_SEAMS_MEAT, true); + creature->CastSpell(creature, SPELL_BURST_AT_THE_SEAMS_BMEAT, true); + creature->CastSpell(creature, SPELL_BURST_AT_THE_SEAMS_DMG, true); + creature->CastSpell(creature, SPELL_BURST_AT_THE_SEAMS_DMG_2, true); - player->CastSpell(player, SPELL_DRAKKARI_SKULLCRUSHER_CREDIT, true); - uint16 count = player->GetReqKillOrCastCurrentCount(QUEST_BURST_AT_THE_SEAMS, NPC_DRAKKARI_CHIEFTAINK); - if ((count % 20) == 0) - player->CastSpell(player, SPELL_SUMMON_DRAKKARI_CHIEFTAIN, true); - } + player->CastSpell(player, SPELL_DRAKKARI_SKULLCRUSHER_CREDIT, true); + uint16 count = player->GetReqKillOrCastCurrentCount(QUEST_BURST_AT_THE_SEAMS, NPC_DRAKKARI_CHIEFTAINK); + if ((count % 20) == 0) + player->CastSpell(player, SPELL_SUMMON_DRAKKARI_CHIEFTAIN, true); } } } } - - void HandleScript(SpellEffIndex /*effIndex*/) - { - GetCaster()->ToCreature()->DespawnOrUnsummon(2 * IN_MILLISECONDS); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_q12690_burst_at_the_seams_SpellScript::HandleKnockBack, EFFECT_1, SPELL_EFFECT_KNOCK_BACK); - OnEffectHitTarget += SpellEffectFn(spell_q12690_burst_at_the_seams_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q12690_burst_at_the_seams_SpellScript(); } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetCaster()->ToCreature()->DespawnOrUnsummon(2 * IN_MILLISECONDS); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_q12690_burst_at_the_seams_SpellScript::HandleKnockBack, EFFECT_1, SPELL_EFFECT_KNOCK_BACK); + OnEffectHitTarget += SpellEffectFn(spell_q12690_burst_at_the_seams_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q12690_burst_at_the_seams_SpellScript(); + } }; enum EscapeFromSilverbrook @@ -2748,67 +2776,67 @@ enum EscapeFromSilverbrook // 48682 - Escape from Silverbrook - Periodic Dummy class spell_q12308_escape_from_silverbrook : public SpellScriptLoader { - public: - spell_q12308_escape_from_silverbrook() : SpellScriptLoader("spell_q12308_escape_from_silverbrook") { } +public: + spell_q12308_escape_from_silverbrook() : SpellScriptLoader("spell_q12308_escape_from_silverbrook") { } - class spell_q12308_escape_from_silverbrook_SpellScript : public SpellScript + class spell_q12308_escape_from_silverbrook_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q12308_escape_from_silverbrook_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_q12308_escape_from_silverbrook_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_SUMMON_WORGEN)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - GetCaster()->CastSpell(GetCaster(), SPELL_SUMMON_WORGEN, true); - } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_q12308_escape_from_silverbrook_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q12308_escape_from_silverbrook_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_SUMMON_WORGEN)) + return false; + return true; } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + GetCaster()->CastSpell(GetCaster(), SPELL_SUMMON_WORGEN, true); + } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_q12308_escape_from_silverbrook_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q12308_escape_from_silverbrook_SpellScript(); + } }; // 48681 - Summon Silverbrook Worgen class spell_q12308_escape_from_silverbrook_summon_worgen : public SpellScriptLoader { - public: - spell_q12308_escape_from_silverbrook_summon_worgen() : SpellScriptLoader("spell_q12308_escape_from_silverbrook_summon_worgen") { } +public: + spell_q12308_escape_from_silverbrook_summon_worgen() : SpellScriptLoader("spell_q12308_escape_from_silverbrook_summon_worgen") { } - class spell_q12308_escape_from_silverbrook_summon_worgen_SpellScript : public SpellScript + class spell_q12308_escape_from_silverbrook_summon_worgen_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q12308_escape_from_silverbrook_summon_worgen_SpellScript); + + void ModDest(SpellDestination& dest) { - PrepareSpellScript(spell_q12308_escape_from_silverbrook_summon_worgen_SpellScript); + float dist = GetSpellInfo()->Effects[EFFECT_0].CalcRadius(GetCaster()); + float angle = frand(0.75f, 1.25f) * M_PI; - void ModDest(SpellDestination& dest) - { - float dist = GetSpellInfo()->Effects[EFFECT_0].CalcRadius(GetCaster()); - float angle = frand(0.75f, 1.25f) * M_PI; - - Position pos; - GetCaster()->GetNearPosition(pos, dist, angle); - dest.Relocate(pos); - } - - void Register() - { - OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_q12308_escape_from_silverbrook_summon_worgen_SpellScript::ModDest, EFFECT_0, TARGET_DEST_CASTER_SUMMON); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q12308_escape_from_silverbrook_summon_worgen_SpellScript(); + Position pos; + GetCaster()->GetNearPosition(pos, dist, angle); + dest.Relocate(pos); } + + void Register() + { + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_q12308_escape_from_silverbrook_summon_worgen_SpellScript::ModDest, EFFECT_0, TARGET_DEST_CASTER_SUMMON); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q12308_escape_from_silverbrook_summon_worgen_SpellScript(); + } }; @@ -2828,114 +2856,114 @@ enum DeathComesFromOnHigh // 51858 - Siphon of Acherus class spell_q12641_death_comes_from_on_high : public SpellScriptLoader { - public: - spell_q12641_death_comes_from_on_high() : SpellScriptLoader("spell_q12641_death_comes_from_on_high") { } +public: + spell_q12641_death_comes_from_on_high() : SpellScriptLoader("spell_q12641_death_comes_from_on_high") { } - class spell_q12641_death_comes_from_on_high_SpellScript : public SpellScript + class spell_q12641_death_comes_from_on_high_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q12641_death_comes_from_on_high_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_q12641_death_comes_from_on_high_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_FORGE_CREDIT) || + if (!sSpellMgr->GetSpellInfo(SPELL_FORGE_CREDIT) || !sSpellMgr->GetSpellInfo(SPELL_TOWN_HALL_CREDIT) || !sSpellMgr->GetSpellInfo(SPELL_SCARLET_HOLD_CREDIT) || !sSpellMgr->GetSpellInfo(SPELL_CHAPEL_CREDIT)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - uint32 spellId = 0; - - switch (GetHitCreature()->GetEntry()) - { - case NPC_NEW_AVALON_FORGE: - spellId = SPELL_FORGE_CREDIT; - break; - case NPC_NEW_AVALON_TOWN_HALL: - spellId = SPELL_TOWN_HALL_CREDIT; - break; - case NPC_SCARLET_HOLD: - spellId = SPELL_SCARLET_HOLD_CREDIT; - break; - case NPC_CHAPEL_OF_THE_CRIMSON_FLAME: - spellId = SPELL_CHAPEL_CREDIT; - break; - default: - return; - } - - GetCaster()->CastSpell((Unit*)NULL, spellId, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_q12641_death_comes_from_on_high_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q12641_death_comes_from_on_high_SpellScript(); + return false; + return true; } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + uint32 spellId = 0; + + switch (GetHitCreature()->GetEntry()) + { + case NPC_NEW_AVALON_FORGE: + spellId = SPELL_FORGE_CREDIT; + break; + case NPC_NEW_AVALON_TOWN_HALL: + spellId = SPELL_TOWN_HALL_CREDIT; + break; + case NPC_SCARLET_HOLD: + spellId = SPELL_SCARLET_HOLD_CREDIT; + break; + case NPC_CHAPEL_OF_THE_CRIMSON_FLAME: + spellId = SPELL_CHAPEL_CREDIT; + break; + default: + return; + } + + GetCaster()->CastSpell((Unit*)NULL, spellId, true); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_q12641_death_comes_from_on_high_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q12641_death_comes_from_on_high_SpellScript(); + } }; // 51769 - Emblazon Runeblade class spell_q12619_emblazon_runeblade : public SpellScriptLoader { - public: - spell_q12619_emblazon_runeblade() : SpellScriptLoader("spell_q12619_emblazon_runeblade") { } +public: + spell_q12619_emblazon_runeblade() : SpellScriptLoader("spell_q12619_emblazon_runeblade") { } - class spell_q12619_emblazon_runeblade_AuraScript : public AuraScript + class spell_q12619_emblazon_runeblade_AuraScript : public AuraScript + { + PrepareAuraScript(spell_q12619_emblazon_runeblade_AuraScript); + + void HandleEffectPeriodic(AuraEffect const* aurEff) { - PrepareAuraScript(spell_q12619_emblazon_runeblade_AuraScript); - - void HandleEffectPeriodic(AuraEffect const* aurEff) - { - PreventDefaultAction(); - if (Unit* caster = GetCaster()) - caster->CastSpell(caster, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true, NULL, aurEff); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_q12619_emblazon_runeblade_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_q12619_emblazon_runeblade_AuraScript(); + PreventDefaultAction(); + if (Unit* caster = GetCaster()) + caster->CastSpell(caster, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true, NULL, aurEff); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_q12619_emblazon_runeblade_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_q12619_emblazon_runeblade_AuraScript(); + } }; // 51770 - Emblazon Runeblade class spell_q12619_emblazon_runeblade_effect : public SpellScriptLoader { - public: - spell_q12619_emblazon_runeblade_effect() : SpellScriptLoader("spell_q12619_emblazon_runeblade_effect") { } +public: + spell_q12619_emblazon_runeblade_effect() : SpellScriptLoader("spell_q12619_emblazon_runeblade_effect") { } - class spell_q12619_emblazon_runeblade_effect_SpellScript : public SpellScript + class spell_q12619_emblazon_runeblade_effect_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q12619_emblazon_runeblade_effect_SpellScript); + + void HandleScript(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_q12619_emblazon_runeblade_effect_SpellScript); - - void HandleScript(SpellEffIndex /*effIndex*/) - { - GetCaster()->CastSpell(GetCaster(), uint32(GetEffectValue()), false); - } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_q12619_emblazon_runeblade_effect_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q12619_emblazon_runeblade_effect_SpellScript(); + GetCaster()->CastSpell(GetCaster(), uint32(GetEffectValue()), false); } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_q12619_emblazon_runeblade_effect_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q12619_emblazon_runeblade_effect_SpellScript(); + } }; enum Quest_The_Storm_King @@ -2946,39 +2974,39 @@ enum Quest_The_Storm_King class spell_q12919_gymers_grab : public SpellScriptLoader { - public: - spell_q12919_gymers_grab() : SpellScriptLoader("spell_q12919_gymers_grab") { } +public: + spell_q12919_gymers_grab() : SpellScriptLoader("spell_q12919_gymers_grab") { } - class spell_q12919_gymers_grab_SpellScript : public SpellScript + class spell_q12919_gymers_grab_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q12919_gymers_grab_SpellScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareSpellScript(spell_q12919_gymers_grab_SpellScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_RIDE_GYMER)) - return false; - return true; - } - - void HandleScript(SpellEffIndex /*effIndex*/) - { - int8 seatId = 2; - if (!GetHitCreature()) - return; - GetHitCreature()->CastCustomSpell(SPELL_RIDE_GYMER, SPELLVALUE_BASE_POINT0, seatId, GetCaster(), true); - GetHitCreature()->CastSpell(GetHitCreature(), SPELL_GRABBED, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_q12919_gymers_grab_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q12919_gymers_grab_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_RIDE_GYMER)) + return false; + return true; } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + int8 seatId = 2; + if (!GetHitCreature()) + return; + GetHitCreature()->CastCustomSpell(SPELL_RIDE_GYMER, SPELLVALUE_BASE_POINT0, seatId, GetCaster(), true); + GetHitCreature()->CastSpell(GetHitCreature(), SPELL_GRABBED, true); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_q12919_gymers_grab_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q12919_gymers_grab_SpellScript(); + } }; enum Quest_The_Storm_King_Throw @@ -2988,39 +3016,39 @@ enum Quest_The_Storm_King_Throw class spell_q12919_gymers_throw : public SpellScriptLoader { - public: - spell_q12919_gymers_throw() : SpellScriptLoader("spell_q12919_gymers_throw") { } +public: + spell_q12919_gymers_throw() : SpellScriptLoader("spell_q12919_gymers_throw") { } - class spell_q12919_gymers_throw_SpellScript : public SpellScript + class spell_q12919_gymers_throw_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q12919_gymers_throw_SpellScript); + + void HandleScript(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_q12919_gymers_throw_SpellScript); - - void HandleScript(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - if (caster->IsVehicle()) - if (Unit* passenger = caster->GetVehicleKit()->GetPassenger(1)) - { - passenger->ExitVehicle(); - caster->CastSpell(passenger, SPELL_VARGUL_EXPLOSION, true); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_q12919_gymers_throw_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_q12919_gymers_throw_SpellScript(); + Unit* caster = GetCaster(); + if (caster->IsVehicle()) + if (Unit* passenger = caster->GetVehicleKit()->GetPassenger(1)) + { + passenger->ExitVehicle(); + caster->CastSpell(passenger, SPELL_VARGUL_EXPLOSION, true); + } } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_q12919_gymers_throw_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q12919_gymers_throw_SpellScript(); + } }; #define QUEST_CROW_TRANSFORM 9718 -// spell 38776 +// spell 38776 class spell_q9718_crow_transform : public SpellScriptLoader { public: diff --git a/src/server/scripts/Spells/spell_rogue.cpp b/src/server/scripts/Spells/spell_rogue.cpp index 704e7a8b1..10826302e 100644 --- a/src/server/scripts/Spells/spell_rogue.cpp +++ b/src/server/scripts/Spells/spell_rogue.cpp @@ -74,28 +74,28 @@ public: class spell_rog_combat_potency : public SpellScriptLoader { - public: - spell_rog_combat_potency() : SpellScriptLoader("spell_rog_combat_potency") { } +public: + spell_rog_combat_potency() : SpellScriptLoader("spell_rog_combat_potency") { } - class spell_rog_combat_potency_AuraScript : public AuraScript + class spell_rog_combat_potency_AuraScript : public AuraScript + { + PrepareAuraScript(spell_rog_combat_potency_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_rog_combat_potency_AuraScript); - - bool CheckProc(ProcEventInfo& eventInfo) - { - return eventInfo.GetTypeMask() & PROC_FLAG_DONE_MELEE_AUTO_ATTACK; - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_rog_combat_potency_AuraScript::CheckProc); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_rog_combat_potency_AuraScript(); + return eventInfo.GetTypeMask() & PROC_FLAG_DONE_MELEE_AUTO_ATTACK; } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_rog_combat_potency_AuraScript::CheckProc); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_rog_combat_potency_AuraScript(); + } }; @@ -103,434 +103,447 @@ class spell_rog_combat_potency : public SpellScriptLoader // 13877, 33735, (check 51211, 65956) - Blade Flurry class spell_rog_blade_flurry : public SpellScriptLoader { - public: - spell_rog_blade_flurry() : SpellScriptLoader("spell_rog_blade_flurry") { } +public: + spell_rog_blade_flurry() : SpellScriptLoader("spell_rog_blade_flurry") { } - class spell_rog_blade_flurry_AuraScript : public AuraScript + class spell_rog_blade_flurry_AuraScript : public AuraScript + { + PrepareAuraScript(spell_rog_blade_flurry_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_rog_blade_flurry_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_BLADE_FLURRY_EXTRA_ATTACK)) - return false; - return true; - } - - bool Load() - { - _procTargetGUID = 0; - return true; - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - Unit* _procTarget = eventInfo.GetActor()->SelectNearbyNoTotemTarget(eventInfo.GetProcTarget()); - if (_procTarget) - _procTargetGUID = _procTarget->GetGUID(); - return _procTarget; - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - // Xinef: no _procTarget but checkproc passed?? - // Unit::CalculateAOEDamageReduction (this=0x0, damage=4118, schoolMask=1, caster=0x7ffdad089000) - Unit* procTarget = ObjectAccessor::GetUnit(*GetTarget(), _procTargetGUID); - if (procTarget && eventInfo.GetDamageInfo()) - { - int32 damage = eventInfo.GetDamageInfo()->GetDamage(); - // Xinef: Include AOE Damage Reduction auras - damage = procTarget->CalculateAOEDamageReduction(damage, SPELL_SCHOOL_MASK_NORMAL, GetTarget()); - - CustomSpellValues values; - values.AddSpellMod(SPELLVALUE_BASE_POINT0, damage); - values.AddSpellMod(SPELLVALUE_FORCED_CRIT_RESULT, int32(eventInfo.GetHitMask() & PROC_EX_CRITICAL_HIT)); - GetTarget()->CastCustomSpell(SPELL_ROGUE_BLADE_FLURRY_EXTRA_ATTACK, values, procTarget, TRIGGERED_FULL_MASK, NULL, aurEff); - } - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_rog_blade_flurry_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_rog_blade_flurry_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_MOD_MELEE_HASTE); - } - - private: - uint64 _procTargetGUID; - }; - - AuraScript* GetAuraScript() const - { - return new spell_rog_blade_flurry_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_BLADE_FLURRY_EXTRA_ATTACK)) + return false; + return true; } + + bool Load() + { + _procTargetGUID = 0; + return true; + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + Unit* _procTarget = eventInfo.GetActor()->SelectNearbyNoTotemTarget(eventInfo.GetProcTarget()); + if (_procTarget) + _procTargetGUID = _procTarget->GetGUID(); + return _procTarget; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + // Xinef: no _procTarget but checkproc passed?? + // Unit::CalculateAOEDamageReduction (this=0x0, damage=4118, schoolMask=1, caster=0x7ffdad089000) + Unit* procTarget = ObjectAccessor::GetUnit(*GetTarget(), _procTargetGUID); + if (procTarget && eventInfo.GetDamageInfo()) + { + int32 damage = eventInfo.GetDamageInfo()->GetDamage(); + // Xinef: Include AOE Damage Reduction auras + damage = procTarget->CalculateAOEDamageReduction(damage, SPELL_SCHOOL_MASK_NORMAL, GetTarget()); + + CustomSpellValues values; + values.AddSpellMod(SPELLVALUE_BASE_POINT0, damage); + values.AddSpellMod(SPELLVALUE_FORCED_CRIT_RESULT, int32(eventInfo.GetHitMask() & PROC_EX_CRITICAL_HIT)); + GetTarget()->CastCustomSpell(SPELL_ROGUE_BLADE_FLURRY_EXTRA_ATTACK, values, procTarget, TRIGGERED_FULL_MASK, NULL, aurEff); + } + } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_rog_blade_flurry_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_rog_blade_flurry_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_MOD_MELEE_HASTE); + } + + private: + uint64 _procTargetGUID; + }; + + AuraScript* GetAuraScript() const + { + return new spell_rog_blade_flurry_AuraScript(); + } }; // -31228 - Cheat Death class spell_rog_cheat_death : public SpellScriptLoader { - public: - spell_rog_cheat_death() : SpellScriptLoader("spell_rog_cheat_death") { } +public: + spell_rog_cheat_death() : SpellScriptLoader("spell_rog_cheat_death") { } - class spell_rog_cheat_death_AuraScript : public AuraScript + class spell_rog_cheat_death_AuraScript : public AuraScript + { + PrepareAuraScript(spell_rog_cheat_death_AuraScript); + + uint32 absorbChance; + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_rog_cheat_death_AuraScript); - - uint32 absorbChance; - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_CHEAT_DEATH_COOLDOWN)) - return false; - return true; - } - - bool Load() - { - absorbChance = GetSpellInfo()->Effects[EFFECT_0].CalcValue(); - return GetUnitOwner()->ToPlayer(); - } - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - // Set absorbtion amount to unlimited - amount = -1; - } - - void Absorb(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount) - { - Player* target = GetTarget()->ToPlayer(); - if (dmgInfo.GetDamage() < target->GetHealth() || target->HasSpellCooldown(SPELL_ROGUE_CHEAT_DEATH_COOLDOWN) || !roll_chance_i(absorbChance)) - return; - - target->CastSpell(target, SPELL_ROGUE_CHEAT_DEATH_COOLDOWN, true); - target->CastSpell(target, SPELL_ROGUE_CHEATING_DEATH, true); - target->AddSpellCooldown(SPELL_ROGUE_CHEAT_DEATH_COOLDOWN, 0, MINUTE*IN_MILLISECONDS); - - uint32 health10 = target->CountPctFromMaxHealth(10); - - // hp > 10% - absorb hp till 10% - if (target->GetHealth() > health10) - absorbAmount = dmgInfo.GetDamage() - target->GetHealth() + health10; - // hp lower than 10% - absorb everything - else - absorbAmount = dmgInfo.GetDamage(); - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_rog_cheat_death_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); - OnEffectAbsorb += AuraEffectAbsorbFn(spell_rog_cheat_death_AuraScript::Absorb, EFFECT_0); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_rog_cheat_death_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_CHEAT_DEATH_COOLDOWN)) + return false; + return true; } + + bool Load() + { + absorbChance = GetSpellInfo()->Effects[EFFECT_0].CalcValue(); + return GetUnitOwner()->ToPlayer(); + } + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + // Set absorbtion amount to unlimited + amount = -1; + } + + void Absorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount) + { + Player* target = GetTarget()->ToPlayer(); + if (dmgInfo.GetDamage() < target->GetHealth() || target->HasSpellCooldown(SPELL_ROGUE_CHEAT_DEATH_COOLDOWN) || !roll_chance_i(absorbChance)) + return; + + target->CastSpell(target, SPELL_ROGUE_CHEAT_DEATH_COOLDOWN, true); + target->CastSpell(target, SPELL_ROGUE_CHEATING_DEATH, true); + target->AddSpellCooldown(SPELL_ROGUE_CHEAT_DEATH_COOLDOWN, 0, MINUTE * IN_MILLISECONDS); + + uint32 health10 = target->CountPctFromMaxHealth(10); + + // hp > 10% - absorb hp till 10% + if (target->GetHealth() > health10) + absorbAmount = dmgInfo.GetDamage() - target->GetHealth() + health10; + // hp lower than 10% - absorb everything + else + absorbAmount = dmgInfo.GetDamage(); + } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_rog_cheat_death_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); + OnEffectAbsorb += AuraEffectAbsorbFn(spell_rog_cheat_death_AuraScript::Absorb, EFFECT_0); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_rog_cheat_death_AuraScript(); + } }; // -2818 - Deadly Poison class spell_rog_deadly_poison : public SpellScriptLoader { - public: - spell_rog_deadly_poison() : SpellScriptLoader("spell_rog_deadly_poison") { } +public: + spell_rog_deadly_poison() : SpellScriptLoader("spell_rog_deadly_poison") { } - class spell_rog_deadly_poison_SpellScript : public SpellScript + class spell_rog_deadly_poison_SpellScript : public SpellScript + { + PrepareSpellScript(spell_rog_deadly_poison_SpellScript); + + bool Load() { - PrepareSpellScript(spell_rog_deadly_poison_SpellScript); + _stackAmount = 0; + // at this point CastItem must already be initialized + return GetCaster()->GetTypeId() == TYPEID_PLAYER && GetCastItem(); + } - bool Load() - { - _stackAmount = 0; - // at this point CastItem must already be initialized - return GetCaster()->GetTypeId() == TYPEID_PLAYER && GetCastItem(); - } + void HandleBeforeHit() + { + if (Unit* target = GetHitUnit()) + // Deadly Poison + if (AuraEffect const* aurEff = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_ROGUE, 0x10000, 0x80000, 0, GetCaster()->GetGUID())) + _stackAmount = aurEff->GetBase()->GetStackAmount(); + } - void HandleBeforeHit() - { - if (Unit* target = GetHitUnit()) - // Deadly Poison - if (AuraEffect const* aurEff = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_ROGUE, 0x10000, 0x80000, 0, GetCaster()->GetGUID())) - _stackAmount = aurEff->GetBase()->GetStackAmount(); - } + void HandleAfterHit() + { + if (_stackAmount < 5) + return; - void HandleAfterHit() + Player* player = GetCaster()->ToPlayer(); + + if (Unit* target = GetHitUnit()) { - if (_stackAmount < 5) + + Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND); + + if (item == GetCastItem()) + item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND); + + if (!item) return; - Player* player = GetCaster()->ToPlayer(); - - if (Unit* target = GetHitUnit()) + // item combat enchantments + for (uint8 slot = 0; slot < MAX_ENCHANTMENT_SLOT; ++slot) { + SpellItemEnchantmentEntry const* enchant = sSpellItemEnchantmentStore.LookupEntry(item->GetEnchantmentId(EnchantmentSlot(slot))); + if (!enchant) + continue; - Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND); - - if (item == GetCastItem()) - item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND); - - if (!item) - return; - - // item combat enchantments - for (uint8 slot = 0; slot < MAX_ENCHANTMENT_SLOT; ++slot) + for (uint8 s = 0; s < 3; ++s) { - SpellItemEnchantmentEntry const* enchant = sSpellItemEnchantmentStore.LookupEntry(item->GetEnchantmentId(EnchantmentSlot(slot))); - if (!enchant) + if (enchant->type[s] != ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL) continue; - for (uint8 s = 0; s < 3; ++s) + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(enchant->spellid[s]); + if (!spellInfo) { - if (enchant->type[s] != ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL) - continue; - - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(enchant->spellid[s]); - if (!spellInfo) - { - sLog->outError("Player::CastItemCombatSpell Enchant %i, player (Name: %s, GUID: %u) cast unknown spell %i", enchant->ID, player->GetName().c_str(), player->GetGUIDLow(), enchant->spellid[s]); - continue; - } - - // Proc only rogue poisons - if (spellInfo->SpellFamilyName != SPELLFAMILY_ROGUE || spellInfo->Dispel != DISPEL_POISON) - continue; - - // Do not reproc deadly - if (spellInfo->SpellFamilyFlags.IsEqual(0x10000, 0x80000, 0)) - continue; - - if (spellInfo->IsPositive()) - player->CastSpell(player, enchant->spellid[s], true, item); - else - player->CastSpell(target, enchant->spellid[s], true, item); + sLog->outError("Player::CastItemCombatSpell Enchant %i, player (Name: %s, GUID: %u) cast unknown spell %i", enchant->ID, player->GetName().c_str(), player->GetGUIDLow(), enchant->spellid[s]); + continue; } + + // Proc only rogue poisons + if (spellInfo->SpellFamilyName != SPELLFAMILY_ROGUE || spellInfo->Dispel != DISPEL_POISON) + continue; + + // Do not reproc deadly + if (spellInfo->SpellFamilyFlags.IsEqual(0x10000, 0x80000, 0)) + continue; + + if (spellInfo->IsPositive()) + player->CastSpell(player, enchant->spellid[s], true, item); + else + player->CastSpell(target, enchant->spellid[s], true, item); } } } - - void Register() - { - BeforeHit += SpellHitFn(spell_rog_deadly_poison_SpellScript::HandleBeforeHit); - AfterHit += SpellHitFn(spell_rog_deadly_poison_SpellScript::HandleAfterHit); - } - - uint8 _stackAmount; - }; - - SpellScript* GetSpellScript() const - { - return new spell_rog_deadly_poison_SpellScript(); } + + void Register() + { + BeforeHit += SpellHitFn(spell_rog_deadly_poison_SpellScript::HandleBeforeHit); + AfterHit += SpellHitFn(spell_rog_deadly_poison_SpellScript::HandleAfterHit); + } + + uint8 _stackAmount; + }; + + SpellScript* GetSpellScript() const + { + return new spell_rog_deadly_poison_SpellScript(); + } }; // 51690 - Killing Spree #define KillingSpreeScriptName "spell_rog_killing_spree" class spell_rog_killing_spree : public SpellScriptLoader { - public: - spell_rog_killing_spree() : SpellScriptLoader(KillingSpreeScriptName) { } +public: + spell_rog_killing_spree() : SpellScriptLoader(KillingSpreeScriptName) { } - class spell_rog_killing_spree_SpellScript : public SpellScript + class spell_rog_killing_spree_SpellScript : public SpellScript + { + PrepareSpellScript(spell_rog_killing_spree_SpellScript); + + SpellCastResult CheckCast() { - PrepareSpellScript(spell_rog_killing_spree_SpellScript); - - SpellCastResult CheckCast() - { - // Kologarn area, Killing Spree should not work - if (GetCaster()->GetMapId() == 603 /*Ulduar*/ && GetCaster()->GetDistance2d(1766.936f, -24.748f) < 50.0f) - return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; - return SPELL_CAST_OK; - } - - void FilterTargets(std::list& targets) - { - if (targets.empty() || GetCaster()->GetVehicleBase() || GetCaster()->HasUnitState(UNIT_STATE_ROOT)) - FinishCast(SPELL_FAILED_OUT_OF_RANGE); - else - { - // Added attribute not breaking stealth, removes auras here - GetCaster()->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_CAST); - GetCaster()->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_SPELL_ATTACK); - } - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - if (Aura* aura = GetCaster()->GetAura(SPELL_ROGUE_KILLING_SPREE)) - { - if (spell_rog_killing_spree_AuraScript* script = dynamic_cast(aura->GetScriptByName(KillingSpreeScriptName))) - script->AddTarget(GetHitUnit()); - } - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_rog_killing_spree_SpellScript::CheckCast); - 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 - { - return new spell_rog_killing_spree_SpellScript(); + // Kologarn area, Killing Spree should not work + if (GetCaster()->GetMapId() == 603 /*Ulduar*/ && GetCaster()->GetDistance2d(1766.936f, -24.748f) < 50.0f) + return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; + return SPELL_CAST_OK; } - class spell_rog_killing_spree_AuraScript : public AuraScript + void FilterTargets(std::list& targets) { - PrepareAuraScript(spell_rog_killing_spree_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) + if (targets.empty() || GetCaster()->GetVehicleBase() || GetCaster()->HasUnitState(UNIT_STATE_ROOT)) + FinishCast(SPELL_FAILED_OUT_OF_RANGE); + else { - if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_KILLING_SPREE_TELEPORT) + // Added attribute not breaking stealth, removes auras here + GetCaster()->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_CAST); + GetCaster()->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_SPELL_ATTACK); + } + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + if (Aura* aura = GetCaster()->GetAura(SPELL_ROGUE_KILLING_SPREE)) + { + if (spell_rog_killing_spree_AuraScript* script = dynamic_cast(aura->GetScriptByName(KillingSpreeScriptName))) + script->AddTarget(GetHitUnit()); + } + } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_rog_killing_spree_SpellScript::CheckCast); + 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 + { + 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*/) + { + 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 = acore::Containers::SelectRandomContainerElement(_targets); - if (Unit* target = ObjectAccessor::GetUnit(*GetTarget(), guid)) - { - // xinef: target may be no longer valid - if (!GetTarget()->IsValidAttackTarget(target)) - { - _targets.remove(guid); - continue; - } - - GetTarget()->CastSpell(target, SPELL_ROGUE_KILLING_SPREE_TELEPORT, true); - - // xinef: ensure fast coordinates switch, dont wait for client to send opcode - WorldLocation const& dest = GetTarget()->ToPlayer()->GetTeleportDest(); - GetTarget()->ToPlayer()->UpdatePosition(dest, true); - - GetTarget()->CastSpell(target, SPELL_ROGUE_KILLING_SPREE_WEAPON_DMG, TriggerCastFlags(TRIGGERED_FULL_MASK&~TRIGGERED_DONT_REPORT_CAST_ERROR)); - break; - } - else - _targets.remove(guid); - } - } - - void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetTarget()->RemoveAurasDueToSpell(SPELL_ROGUE_KILLING_SPREE_DMG_BUFF); - } - - void Register() - { - 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 _targets; - }; - - AuraScript* GetAuraScript() const - { - return new spell_rog_killing_spree_AuraScript(); + 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 = acore::Containers::SelectRandomContainerElement(_targets); + if (Unit* target = ObjectAccessor::GetUnit(*GetTarget(), guid)) + { + // xinef: target may be no longer valid + if (!GetTarget()->IsValidAttackTarget(target)) + { + _targets.remove(guid); + continue; + } + + GetTarget()->CastSpell(target, SPELL_ROGUE_KILLING_SPREE_TELEPORT, true); + + // xinef: ensure fast coordinates switch, dont wait for client to send opcode + WorldLocation const& dest = GetTarget()->ToPlayer()->GetTeleportDest(); + GetTarget()->ToPlayer()->UpdatePosition(dest, true); + + GetTarget()->CastSpell(target, SPELL_ROGUE_KILLING_SPREE_WEAPON_DMG, TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_DONT_REPORT_CAST_ERROR)); + break; + } + else + _targets.remove(guid); + } + } + + void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->RemoveAurasDueToSpell(SPELL_ROGUE_KILLING_SPREE_DMG_BUFF); + } + + void Register() + { + 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 _targets; + }; + + AuraScript* GetAuraScript() const + { + return new spell_rog_killing_spree_AuraScript(); + } }; // -31130 - Nerves of Steel class spell_rog_nerves_of_steel : public SpellScriptLoader { - public: - spell_rog_nerves_of_steel() : SpellScriptLoader("spell_rog_nerves_of_steel") { } +public: + spell_rog_nerves_of_steel() : SpellScriptLoader("spell_rog_nerves_of_steel") { } - class spell_rog_nerves_of_steel_AuraScript : public AuraScript + class spell_rog_nerves_of_steel_AuraScript : public AuraScript + { + PrepareAuraScript(spell_rog_nerves_of_steel_AuraScript); + + uint32 absorbPct; + + bool Load() { - PrepareAuraScript(spell_rog_nerves_of_steel_AuraScript); - - uint32 absorbPct; - - bool Load() - { - absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); - return true; - } - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - // Set absorbtion amount to unlimited - amount = -1; - } - - void Absorb(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount) - { - // reduces all damage taken while stun or fear - if (GetTarget()->GetUInt32Value(UNIT_FIELD_FLAGS) & (UNIT_FLAG_FLEEING) || (GetTarget()->GetUInt32Value(UNIT_FIELD_FLAGS) & (UNIT_FLAG_STUNNED) && GetTarget()->HasAuraWithMechanic(1<Effects[EFFECT_0].CalcValue(GetCaster()); + return true; } + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + // Set absorbtion amount to unlimited + amount = -1; + } + + void Absorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount) + { + // reduces all damage taken while stun or fear + if (GetTarget()->GetUInt32Value(UNIT_FIELD_FLAGS) & (UNIT_FLAG_FLEEING) || (GetTarget()->GetUInt32Value(UNIT_FIELD_FLAGS) & (UNIT_FLAG_STUNNED) && GetTarget()->HasAuraWithMechanic(1 << MECHANIC_STUN))) + absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct); + } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_rog_nerves_of_steel_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); + OnEffectAbsorb += AuraEffectAbsorbFn(spell_rog_nerves_of_steel_AuraScript::Absorb, EFFECT_0); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_rog_nerves_of_steel_AuraScript(); + } }; // 14185 - Preparation class spell_rog_preparation : public SpellScriptLoader { - public: - spell_rog_preparation() : SpellScriptLoader("spell_rog_preparation") { } +public: + spell_rog_preparation() : SpellScriptLoader("spell_rog_preparation") { } - class spell_rog_preparation_SpellScript : public SpellScript + class spell_rog_preparation_SpellScript : public SpellScript + { + PrepareSpellScript(spell_rog_preparation_SpellScript); + + bool Load() { - PrepareSpellScript(spell_rog_preparation_SpellScript); + return GetCaster()->GetTypeId() == TYPEID_PLAYER; + } - bool Load() + bool Validate(SpellInfo const* /*spellInfo*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_GLYPH_OF_PREPARATION)) + return false; + return true; + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Player* caster = GetCaster()->ToPlayer(); + //immediately finishes the cooldown on certain Rogue abilities + + bool hasGlyph = caster->HasAura(SPELL_ROGUE_GLYPH_OF_PREPARATION); + PlayerSpellMap const& spellMap = caster->GetSpellMap(); + for (PlayerSpellMap::const_iterator itr = spellMap.begin(); itr != spellMap.end(); ++itr) { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_GLYPH_OF_PREPARATION)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Player* caster = GetCaster()->ToPlayer(); - //immediately finishes the cooldown on certain Rogue abilities - - bool hasGlyph = caster->HasAura(SPELL_ROGUE_GLYPH_OF_PREPARATION); - PlayerSpellMap const& spellMap = caster->GetSpellMap(); - for (PlayerSpellMap::const_iterator itr = spellMap.begin(); itr != spellMap.end(); ++itr) + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->first); + if (spellInfo->SpellFamilyName == SPELLFAMILY_ROGUE) { - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->first); - if (spellInfo->SpellFamilyName == SPELLFAMILY_ROGUE) - { - if (spellInfo->SpellFamilyFlags[1] & SPELLFAMILYFLAG1_ROGUE_COLDB_SHADOWSTEP || // Cold Blood, Shadowstep + if (spellInfo->SpellFamilyFlags[1] & SPELLFAMILYFLAG1_ROGUE_COLDB_SHADOWSTEP || // Cold Blood, Shadowstep spellInfo->SpellFamilyFlags[0] & SPELLFAMILYFLAG_ROGUE_VAN_EVAS_SPRINT) // Vanish, Evasion, Sprint + { + SpellCooldowns::iterator citr = caster->GetSpellCooldownMap().find(spellInfo->Id); + if (citr != caster->GetSpellCooldownMap().end() && citr->second.needSendToClient) + caster->RemoveSpellCooldown(spellInfo->Id, true); + else + caster->RemoveSpellCooldown(spellInfo->Id, false); + } + else if (hasGlyph) + { + if (spellInfo->SpellFamilyFlags[1] & SPELLFAMILYFLAG1_ROGUE_DISMANTLE || // Dismantle + spellInfo->SpellFamilyFlags[0] & SPELLFAMILYFLAG_ROGUE_KICK || // Kick + (spellInfo->SpellFamilyFlags[0] & SPELLFAMILYFLAG_ROGUE_BLADE_FLURRY && // Blade Flurry + spellInfo->SpellFamilyFlags[1] & SPELLFAMILYFLAG1_ROGUE_BLADE_FLURRY)) { SpellCooldowns::iterator citr = caster->GetSpellCooldownMap().find(spellInfo->Id); if (citr != caster->GetSpellCooldownMap().end() && citr->second.needSendToClient) @@ -538,266 +551,253 @@ class spell_rog_preparation : public SpellScriptLoader else caster->RemoveSpellCooldown(spellInfo->Id, false); } - else if (hasGlyph) - { - if (spellInfo->SpellFamilyFlags[1] & SPELLFAMILYFLAG1_ROGUE_DISMANTLE || // Dismantle - spellInfo->SpellFamilyFlags[0] & SPELLFAMILYFLAG_ROGUE_KICK || // Kick - (spellInfo->SpellFamilyFlags[0] & SPELLFAMILYFLAG_ROGUE_BLADE_FLURRY && // Blade Flurry - spellInfo->SpellFamilyFlags[1] & SPELLFAMILYFLAG1_ROGUE_BLADE_FLURRY)) - { - SpellCooldowns::iterator citr = caster->GetSpellCooldownMap().find(spellInfo->Id); - if (citr != caster->GetSpellCooldownMap().end() && citr->second.needSendToClient) - caster->RemoveSpellCooldown(spellInfo->Id, true); - else - caster->RemoveSpellCooldown(spellInfo->Id, false); - } - } } } } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_rog_preparation_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_rog_preparation_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_rog_preparation_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_rog_preparation_SpellScript(); + } }; // -51685 - Prey on the Weak class spell_rog_prey_on_the_weak : public SpellScriptLoader { - public: - spell_rog_prey_on_the_weak() : SpellScriptLoader("spell_rog_prey_on_the_weak") { } +public: + spell_rog_prey_on_the_weak() : SpellScriptLoader("spell_rog_prey_on_the_weak") { } - class spell_rog_prey_on_the_weak_AuraScript : public AuraScript + class spell_rog_prey_on_the_weak_AuraScript : public AuraScript + { + PrepareAuraScript(spell_rog_prey_on_the_weak_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_rog_prey_on_the_weak_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_PREY_ON_THE_WEAK)) - return false; - return true; - } - - void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) - { - Unit* target = GetTarget(); - Unit* victim = target->GetVictim(); - if (!victim && target->GetTypeId() == TYPEID_PLAYER) - victim = target->ToPlayer()->GetSelectedUnit(); - - if (victim && (target->GetHealthPct() > victim->GetHealthPct())) - { - if (!target->HasAura(SPELL_ROGUE_PREY_ON_THE_WEAK)) - { - int32 bp = GetSpellInfo()->Effects[EFFECT_0].CalcValue(); - target->CastCustomSpell(target, SPELL_ROGUE_PREY_ON_THE_WEAK, &bp, 0, 0, true); - } - } - else - target->RemoveAurasDueToSpell(SPELL_ROGUE_PREY_ON_THE_WEAK); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_rog_prey_on_the_weak_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_rog_prey_on_the_weak_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_PREY_ON_THE_WEAK)) + return false; + return true; } + + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) + { + Unit* target = GetTarget(); + Unit* victim = target->GetVictim(); + if (!victim && target->GetTypeId() == TYPEID_PLAYER) + victim = target->ToPlayer()->GetSelectedUnit(); + + if (victim && (target->GetHealthPct() > victim->GetHealthPct())) + { + if (!target->HasAura(SPELL_ROGUE_PREY_ON_THE_WEAK)) + { + int32 bp = GetSpellInfo()->Effects[EFFECT_0].CalcValue(); + target->CastCustomSpell(target, SPELL_ROGUE_PREY_ON_THE_WEAK, &bp, 0, 0, true); + } + } + else + target->RemoveAurasDueToSpell(SPELL_ROGUE_PREY_ON_THE_WEAK); + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_rog_prey_on_the_weak_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_rog_prey_on_the_weak_AuraScript(); + } }; // -1943 - Rupture class spell_rog_rupture : public SpellScriptLoader { - public: - spell_rog_rupture() : SpellScriptLoader("spell_rog_rupture") { } +public: + spell_rog_rupture() : SpellScriptLoader("spell_rog_rupture") { } - class spell_rog_rupture_AuraScript : public AuraScript + class spell_rog_rupture_AuraScript : public AuraScript + { + PrepareAuraScript(spell_rog_rupture_AuraScript); + + bool Load() { - PrepareAuraScript(spell_rog_rupture_AuraScript); - - bool Load() - { - Unit* caster = GetCaster(); - return caster && caster->GetTypeId() == TYPEID_PLAYER; - } - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) - { - if (Unit* caster = GetCaster()) - { - canBeRecalculated = false; - - float const attackpowerPerCombo[6] = - { - 0.0f, - 0.015f, // 1 point: ${($m1 + $b1*1 + 0.015 * $AP) * 4} damage over 8 secs - 0.024f, // 2 points: ${($m1 + $b1*2 + 0.024 * $AP) * 5} damage over 10 secs - 0.03f, // 3 points: ${($m1 + $b1*3 + 0.03 * $AP) * 6} damage over 12 secs - 0.03428571f, // 4 points: ${($m1 + $b1*4 + 0.03428571 * $AP) * 7} damage over 14 secs - 0.0375f // 5 points: ${($m1 + $b1*5 + 0.0375 * $AP) * 8} damage over 16 secs - }; - - uint8 cp = caster->ToPlayer()->GetComboPoints(); - if (cp > 5) - cp = 5; - - amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * attackpowerPerCombo[cp]); - } - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_rog_rupture_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_rog_rupture_AuraScript(); + Unit* caster = GetCaster(); + return caster && caster->GetTypeId() == TYPEID_PLAYER; } + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) + { + if (Unit* caster = GetCaster()) + { + canBeRecalculated = false; + + float const attackpowerPerCombo[6] = + { + 0.0f, + 0.015f, // 1 point: ${($m1 + $b1*1 + 0.015 * $AP) * 4} damage over 8 secs + 0.024f, // 2 points: ${($m1 + $b1*2 + 0.024 * $AP) * 5} damage over 10 secs + 0.03f, // 3 points: ${($m1 + $b1*3 + 0.03 * $AP) * 6} damage over 12 secs + 0.03428571f, // 4 points: ${($m1 + $b1*4 + 0.03428571 * $AP) * 7} damage over 14 secs + 0.0375f // 5 points: ${($m1 + $b1*5 + 0.0375 * $AP) * 8} damage over 16 secs + }; + + uint8 cp = caster->ToPlayer()->GetComboPoints(); + if (cp > 5) + cp = 5; + + amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * attackpowerPerCombo[cp]); + } + } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_rog_rupture_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_rog_rupture_AuraScript(); + } }; // 5938 - Shiv class spell_rog_shiv : public SpellScriptLoader { - public: - spell_rog_shiv() : SpellScriptLoader("spell_rog_shiv") { } +public: + spell_rog_shiv() : SpellScriptLoader("spell_rog_shiv") { } - class spell_rog_shiv_SpellScript : public SpellScript + class spell_rog_shiv_SpellScript : public SpellScript + { + PrepareSpellScript(spell_rog_shiv_SpellScript); + + bool Load() { - PrepareSpellScript(spell_rog_shiv_SpellScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_SHIV_TRIGGERED)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - if (Unit* unitTarget = GetHitUnit()) - caster->CastSpell(unitTarget, SPELL_ROGUE_SHIV_TRIGGERED, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_rog_shiv_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_rog_shiv_SpellScript(); + return GetCaster()->GetTypeId() == TYPEID_PLAYER; } + + bool Validate(SpellInfo const* /*spellInfo*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_SHIV_TRIGGERED)) + return false; + return true; + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (Unit* unitTarget = GetHitUnit()) + caster->CastSpell(unitTarget, SPELL_ROGUE_SHIV_TRIGGERED, true); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_rog_shiv_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_rog_shiv_SpellScript(); + } }; // 57934 - Tricks of the Trade class spell_rog_tricks_of_the_trade : public SpellScriptLoader { - public: - spell_rog_tricks_of_the_trade() : SpellScriptLoader("spell_rog_tricks_of_the_trade") { } +public: + spell_rog_tricks_of_the_trade() : SpellScriptLoader("spell_rog_tricks_of_the_trade") { } - class spell_rog_tricks_of_the_trade_AuraScript : public AuraScript + class spell_rog_tricks_of_the_trade_AuraScript : public AuraScript + { + PrepareAuraScript(spell_rog_tricks_of_the_trade_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_rog_tricks_of_the_trade_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_TRICKS_OF_THE_TRADE_DMG_BOOST)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_TRICKS_OF_THE_TRADE_PROC)) - return false; - return true; - } - - bool Load() - { - _redirectTarget = nullptr; - return true; - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEFAULT) - GetTarget()->ResetRedirectThreat(); - } - - bool CheckProc(ProcEventInfo& /*eventInfo*/) - { - _redirectTarget = GetTarget()->GetRedirectThreatTarget(); - return _redirectTarget; - } - - void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) - { - PreventDefaultAction(); - - Unit* target = GetTarget(); - target->CastSpell(_redirectTarget, SPELL_ROGUE_TRICKS_OF_THE_TRADE_DMG_BOOST, true); - target->CastSpell(target, SPELL_ROGUE_TRICKS_OF_THE_TRADE_PROC, true); - Remove(AURA_REMOVE_BY_DEFAULT); // maybe handle by proc charges - } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_rog_tricks_of_the_trade_AuraScript::OnRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - DoCheckProc += AuraCheckProcFn(spell_rog_tricks_of_the_trade_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_rog_tricks_of_the_trade_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_DUMMY); - } - - private: - Unit* _redirectTarget; - }; - - AuraScript* GetAuraScript() const - { - return new spell_rog_tricks_of_the_trade_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_TRICKS_OF_THE_TRADE_DMG_BOOST)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_TRICKS_OF_THE_TRADE_PROC)) + return false; + return true; } + + bool Load() + { + _redirectTarget = nullptr; + return true; + } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEFAULT) + GetTarget()->ResetRedirectThreat(); + } + + bool CheckProc(ProcEventInfo& /*eventInfo*/) + { + _redirectTarget = GetTarget()->GetRedirectThreatTarget(); + return _redirectTarget; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + + Unit* target = GetTarget(); + target->CastSpell(_redirectTarget, SPELL_ROGUE_TRICKS_OF_THE_TRADE_DMG_BOOST, true); + target->CastSpell(target, SPELL_ROGUE_TRICKS_OF_THE_TRADE_PROC, true); + Remove(AURA_REMOVE_BY_DEFAULT); // maybe handle by proc charges + } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_rog_tricks_of_the_trade_AuraScript::OnRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + DoCheckProc += AuraCheckProcFn(spell_rog_tricks_of_the_trade_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_rog_tricks_of_the_trade_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_DUMMY); + } + + private: + Unit* _redirectTarget; + }; + + AuraScript* GetAuraScript() const + { + return new spell_rog_tricks_of_the_trade_AuraScript(); + } }; // 59628 - Tricks of the Trade (Proc) class spell_rog_tricks_of_the_trade_proc : public SpellScriptLoader { - public: - spell_rog_tricks_of_the_trade_proc() : SpellScriptLoader("spell_rog_tricks_of_the_trade_proc") { } +public: + spell_rog_tricks_of_the_trade_proc() : SpellScriptLoader("spell_rog_tricks_of_the_trade_proc") { } - class spell_rog_tricks_of_the_trade_proc_AuraScript : public AuraScript + class spell_rog_tricks_of_the_trade_proc_AuraScript : public AuraScript + { + PrepareAuraScript(spell_rog_tricks_of_the_trade_proc_AuraScript); + + void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_rog_tricks_of_the_trade_proc_AuraScript); - - void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetTarget()->ResetRedirectThreat(); - } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_rog_tricks_of_the_trade_proc_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_rog_tricks_of_the_trade_proc_AuraScript(); + GetTarget()->ResetRedirectThreat(); } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_rog_tricks_of_the_trade_proc_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_rog_tricks_of_the_trade_proc_AuraScript(); + } }; void AddSC_rogue_spell_scripts() diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp index 5950f9bf5..7a2d4cf76 100644 --- a/src/server/scripts/Spells/spell_shaman.cpp +++ b/src/server/scripts/Spells/spell_shaman.cpp @@ -59,347 +59,347 @@ enum ShamanSpellIcons // Ours class spell_sha_totem_of_wrath : public SpellScriptLoader { - public: - spell_sha_totem_of_wrath() : SpellScriptLoader("spell_sha_totem_of_wrath") { } +public: + spell_sha_totem_of_wrath() : SpellScriptLoader("spell_sha_totem_of_wrath") { } - class spell_sha_totem_of_wrath_SpellScript : public SpellScript + class spell_sha_totem_of_wrath_SpellScript : public SpellScript + { + PrepareSpellScript(spell_sha_totem_of_wrath_SpellScript); + + void HandleAfterCast() { - PrepareSpellScript(spell_sha_totem_of_wrath_SpellScript); - - void HandleAfterCast() - { - if (AuraEffect* aurEff = GetCaster()->GetAuraEffect(63280, EFFECT_0)) - if (Creature* totem = GetCaster()->GetMap()->GetCreature(GetCaster()->m_SummonSlot[1])) // Fire totem summon slot - if (SpellInfo const* totemSpell = sSpellMgr->GetSpellInfo(totem->m_spells[0])) - { - int32 bp0 = CalculatePct(totemSpell->Effects[EFFECT_0].CalcValue(), aurEff->GetAmount()); - int32 bp1 = CalculatePct(totemSpell->Effects[EFFECT_1].CalcValue(), aurEff->GetAmount()); - GetCaster()->CastCustomSpell(GetCaster(), 63283, &bp0, &bp1, NULL, true); - } - } - - void Register() - { - AfterCast += SpellCastFn(spell_sha_totem_of_wrath_SpellScript::HandleAfterCast); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_sha_totem_of_wrath_SpellScript(); + if (AuraEffect* aurEff = GetCaster()->GetAuraEffect(63280, EFFECT_0)) + if (Creature* totem = GetCaster()->GetMap()->GetCreature(GetCaster()->m_SummonSlot[1])) // Fire totem summon slot + if (SpellInfo const* totemSpell = sSpellMgr->GetSpellInfo(totem->m_spells[0])) + { + int32 bp0 = CalculatePct(totemSpell->Effects[EFFECT_0].CalcValue(), aurEff->GetAmount()); + int32 bp1 = CalculatePct(totemSpell->Effects[EFFECT_1].CalcValue(), aurEff->GetAmount()); + GetCaster()->CastCustomSpell(GetCaster(), 63283, &bp0, &bp1, NULL, true); + } } + + void Register() + { + AfterCast += SpellCastFn(spell_sha_totem_of_wrath_SpellScript::HandleAfterCast); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_sha_totem_of_wrath_SpellScript(); + } }; class spell_sha_spirit_walk : public SpellScriptLoader { - public: - spell_sha_spirit_walk() : SpellScriptLoader("spell_sha_spirit_walk") { } +public: + spell_sha_spirit_walk() : SpellScriptLoader("spell_sha_spirit_walk") { } - class spell_sha_spirit_walk_SpellScript : public SpellScript + class spell_sha_spirit_walk_SpellScript : public SpellScript + { + PrepareSpellScript(spell_sha_spirit_walk_SpellScript); + + SpellCastResult CheckCast() { - PrepareSpellScript(spell_sha_spirit_walk_SpellScript); + if (Unit* owner = GetCaster()->GetOwner()) + if (GetCaster()->IsWithinDist(owner, GetSpellInfo()->GetMaxRange(GetSpellInfo()->IsPositive()))) + return SPELL_CAST_OK; - SpellCastResult CheckCast() - { - if (Unit* owner = GetCaster()->GetOwner()) - if (GetCaster()->IsWithinDist(owner, GetSpellInfo()->GetMaxRange(GetSpellInfo()->IsPositive()))) - return SPELL_CAST_OK; - - return SPELL_FAILED_OUT_OF_RANGE; - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_sha_spirit_walk_SpellScript::CheckCast); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_sha_spirit_walk_SpellScript(); + return SPELL_FAILED_OUT_OF_RANGE; } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_sha_spirit_walk_SpellScript::CheckCast); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_sha_spirit_walk_SpellScript(); + } }; class spell_sha_t10_restoration_4p_bonus : public SpellScriptLoader { - public: - spell_sha_t10_restoration_4p_bonus() : SpellScriptLoader("spell_sha_t10_restoration_4p_bonus") { } +public: + spell_sha_t10_restoration_4p_bonus() : SpellScriptLoader("spell_sha_t10_restoration_4p_bonus") { } - class spell_sha_t10_restoration_4p_bonus_AuraScript : public AuraScript + class spell_sha_t10_restoration_4p_bonus_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sha_t10_restoration_4p_bonus_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_sha_t10_restoration_4p_bonus_AuraScript); - - bool CheckProc(ProcEventInfo& eventInfo) - { - return eventInfo.GetActor() && eventInfo.GetProcTarget(); - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - - uint32 triggered_spell_id = 70809; - SpellInfo const* triggeredSpell = sSpellMgr->GetSpellInfo(triggered_spell_id); - int32 amount = CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount()) / triggeredSpell->GetMaxTicks(); - eventInfo.GetProcTarget()->CastDelayedSpellWithPeriodicAmount(GetTarget(), triggered_spell_id, SPELL_AURA_PERIODIC_HEAL, amount, EFFECT_0); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_sha_t10_restoration_4p_bonus_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_sha_t10_restoration_4p_bonus_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_sha_t10_restoration_4p_bonus_AuraScript(); + return eventInfo.GetActor() && eventInfo.GetProcTarget(); } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + uint32 triggered_spell_id = 70809; + SpellInfo const* triggeredSpell = sSpellMgr->GetSpellInfo(triggered_spell_id); + int32 amount = CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount()) / triggeredSpell->GetMaxTicks(); + eventInfo.GetProcTarget()->CastDelayedSpellWithPeriodicAmount(GetTarget(), triggered_spell_id, SPELL_AURA_PERIODIC_HEAL, amount, EFFECT_0); + } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_sha_t10_restoration_4p_bonus_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_sha_t10_restoration_4p_bonus_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_sha_t10_restoration_4p_bonus_AuraScript(); + } }; class spell_sha_totemic_mastery : public SpellScriptLoader { - public: - spell_sha_totemic_mastery() : SpellScriptLoader("spell_sha_totemic_mastery") { } +public: + spell_sha_totemic_mastery() : SpellScriptLoader("spell_sha_totemic_mastery") { } - class spell_sha_totemic_mastery_AuraScript : public AuraScript + class spell_sha_totemic_mastery_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sha_totemic_mastery_AuraScript); + + void HandlePeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_sha_totemic_mastery_AuraScript); + PreventDefaultAction(); - void HandlePeriodic(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); + for (uint8 i = SUMMON_SLOT_TOTEM; i < MAX_TOTEM_SLOT; ++i) + if (!GetTarget()->m_SummonSlot[i]) + return; - for (uint8 i = SUMMON_SLOT_TOTEM; i < MAX_TOTEM_SLOT; ++i) - if (!GetTarget()->m_SummonSlot[i]) - return; - - GetTarget()->CastSpell(GetTarget(), 38437, true); - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_sha_totemic_mastery_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_sha_totemic_mastery_AuraScript(); + GetTarget()->CastSpell(GetTarget(), 38437, true); } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_sha_totemic_mastery_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_sha_totemic_mastery_AuraScript(); + } }; class spell_sha_feral_spirit_scaling : public SpellScriptLoader { - public: - spell_sha_feral_spirit_scaling() : SpellScriptLoader("spell_sha_feral_spirit_scaling") { } +public: + spell_sha_feral_spirit_scaling() : SpellScriptLoader("spell_sha_feral_spirit_scaling") { } - class spell_sha_feral_spirit_scaling_AuraScript : public AuraScript + class spell_sha_feral_spirit_scaling_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sha_feral_spirit_scaling_AuraScript); + + void CalculateResistanceAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) { - PrepareAuraScript(spell_sha_feral_spirit_scaling_AuraScript); - - void CalculateResistanceAmount(AuraEffect const* aurEff, int32 & amount, bool & /*canBeRecalculated*/) + // xinef: feral spirit inherits 40% of resistance from owner and 35% of armor + if (Unit* owner = GetUnitOwner()->GetOwner()) { - // xinef: feral spirit inherits 40% of resistance from owner and 35% of armor - if (Unit* owner = GetUnitOwner()->GetOwner()) + SpellSchoolMask schoolMask = SpellSchoolMask(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].MiscValue); + int32 modifier = schoolMask == SPELL_SCHOOL_MASK_NORMAL ? 35 : 40; + amount = CalculatePct(std::max(0, owner->GetResistance(schoolMask)), modifier); + } + } + + void CalculateStatAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) + { + // xinef: by default feral spirit inherits 30% of stamina + if (Unit* owner = GetUnitOwner()->GetOwner()) + { + Stats stat = Stats(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].MiscValue); + amount = CalculatePct(std::max(0, owner->GetStat(stat)), 30); + } + } + + void CalculateAPAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + // xinef: by default feral spirit inherits 30% of AP + if (Unit* owner = GetUnitOwner()->GetOwner()) + { + int32 modifier = 30; + if (AuraEffect const* gofsEff = owner->GetAuraEffect(SPELL_SHAMAN_GLYPH_OF_FERAL_SPIRIT, EFFECT_0)) + modifier += gofsEff->GetAmount(); + + amount = CalculatePct(std::max(0, owner->GetTotalAttackPowerValue(BASE_ATTACK)), modifier); + } + } + + void CalculateSPAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + // xinef: by default feral spirit inherits 30% of AP as SP + if (Unit* owner = GetUnitOwner()->GetOwner()) + { + int32 modifier = 30; + if (AuraEffect const* gofsEff = owner->GetAuraEffect(SPELL_SHAMAN_GLYPH_OF_FERAL_SPIRIT, EFFECT_0)) + modifier += gofsEff->GetAmount(); + + amount = CalculatePct(std::max(0, owner->GetTotalAttackPowerValue(BASE_ATTACK)), modifier); + + // xinef: Update appropriate player field + if (owner->GetTypeId() == TYPEID_PLAYER) + owner->SetUInt32Value(PLAYER_PET_SPELL_POWER, (uint32)amount); + } + } + + void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, aurEff->GetAuraType(), true, SPELL_BLOCK_TYPE_POSITIVE); + if (aurEff->GetAuraType() == SPELL_AURA_MOD_ATTACK_POWER) + GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_ATTACK_POWER_PCT, true, SPELL_BLOCK_TYPE_POSITIVE); + else if (aurEff->GetAuraType() == SPELL_AURA_MOD_STAT) + GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, true, SPELL_BLOCK_TYPE_POSITIVE); + } + + void CalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude) + { + isPeriodic = true; + amplitude = 1 * IN_MILLISECONDS; + } + + void HandlePeriodic(AuraEffect const* aurEff) + { + PreventDefaultAction(); + if (aurEff->GetAuraType() == SPELL_AURA_MOD_STAT && (aurEff->GetMiscValue() == STAT_STAMINA || aurEff->GetMiscValue() == STAT_INTELLECT)) + { + int32 currentAmount = aurEff->GetAmount(); + int32 newAmount = GetEffect(aurEff->GetEffIndex())->CalculateAmount(GetCaster()); + if (newAmount != currentAmount) { - SpellSchoolMask schoolMask = SpellSchoolMask(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].MiscValue); - int32 modifier = schoolMask == SPELL_SCHOOL_MASK_NORMAL ? 35 : 40; - amount = CalculatePct(std::max(0, owner->GetResistance(schoolMask)), modifier); - } - } - - void CalculateStatAmount(AuraEffect const* aurEff, int32 & amount, bool & /*canBeRecalculated*/) - { - // xinef: by default feral spirit inherits 30% of stamina - if (Unit* owner = GetUnitOwner()->GetOwner()) - { - Stats stat = Stats(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].MiscValue); - amount = CalculatePct(std::max(0, owner->GetStat(stat)), 30); - } - } - - void CalculateAPAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - // xinef: by default feral spirit inherits 30% of AP - if (Unit* owner = GetUnitOwner()->GetOwner()) - { - int32 modifier = 30; - if (AuraEffect const* gofsEff = owner->GetAuraEffect(SPELL_SHAMAN_GLYPH_OF_FERAL_SPIRIT, EFFECT_0)) - modifier += gofsEff->GetAmount(); - - amount = CalculatePct(std::max(0, owner->GetTotalAttackPowerValue(BASE_ATTACK)), modifier); - } - } - - void CalculateSPAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - // xinef: by default feral spirit inherits 30% of AP as SP - if (Unit* owner = GetUnitOwner()->GetOwner()) - { - int32 modifier = 30; - if (AuraEffect const* gofsEff = owner->GetAuraEffect(SPELL_SHAMAN_GLYPH_OF_FERAL_SPIRIT, EFFECT_0)) - modifier += gofsEff->GetAmount(); - - amount = CalculatePct(std::max(0, owner->GetTotalAttackPowerValue(BASE_ATTACK)), modifier); - - // xinef: Update appropriate player field - if (owner->GetTypeId() == TYPEID_PLAYER) - owner->SetUInt32Value(PLAYER_PET_SPELL_POWER, (uint32)amount); - } - } - - void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, aurEff->GetAuraType(), true, SPELL_BLOCK_TYPE_POSITIVE); - if (aurEff->GetAuraType() == SPELL_AURA_MOD_ATTACK_POWER) - GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_ATTACK_POWER_PCT, true, SPELL_BLOCK_TYPE_POSITIVE); - else if (aurEff->GetAuraType() == SPELL_AURA_MOD_STAT) - GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, true, SPELL_BLOCK_TYPE_POSITIVE); - } - - void CalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude) - { - isPeriodic = true; - amplitude = 1*IN_MILLISECONDS; - } - - void HandlePeriodic(AuraEffect const* aurEff) - { - PreventDefaultAction(); - if (aurEff->GetAuraType() == SPELL_AURA_MOD_STAT && (aurEff->GetMiscValue() == STAT_STAMINA || aurEff->GetMiscValue() == STAT_INTELLECT)) - { - int32 currentAmount = aurEff->GetAmount(); - int32 newAmount = GetEffect(aurEff->GetEffIndex())->CalculateAmount(GetCaster()); - if (newAmount != currentAmount) + if (aurEff->GetMiscValue() == STAT_STAMINA) { - if (aurEff->GetMiscValue() == STAT_STAMINA) - { - uint32 actStat = GetUnitOwner()->GetHealth(); - GetEffect(aurEff->GetEffIndex())->ChangeAmount(newAmount, false); - GetUnitOwner()->SetHealth(std::min(GetUnitOwner()->GetMaxHealth(), actStat)); - } - else - { - uint32 actStat = GetUnitOwner()->GetPower(POWER_MANA); - GetEffect(aurEff->GetEffIndex())->ChangeAmount(newAmount, false); - GetUnitOwner()->SetPower(POWER_MANA, std::min(GetUnitOwner()->GetMaxPower(POWER_MANA), actStat)); - } + uint32 actStat = GetUnitOwner()->GetHealth(); + GetEffect(aurEff->GetEffIndex())->ChangeAmount(newAmount, false); + GetUnitOwner()->SetHealth(std::min(GetUnitOwner()->GetMaxHealth(), actStat)); + } + else + { + uint32 actStat = GetUnitOwner()->GetPower(POWER_MANA); + GetEffect(aurEff->GetEffIndex())->ChangeAmount(newAmount, false); + GetUnitOwner()->SetPower(POWER_MANA, std::min(GetUnitOwner()->GetMaxPower(POWER_MANA), actStat)); } } - else - GetEffect(aurEff->GetEffIndex())->RecalculateAmount(); } - - void Register() - { - if (m_scriptSpellId == 35675) - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_sha_feral_spirit_scaling_AuraScript::CalculateResistanceAmount, EFFECT_ALL, SPELL_AURA_MOD_RESISTANCE); - - if (m_scriptSpellId == 35674) - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_sha_feral_spirit_scaling_AuraScript::CalculateStatAmount, EFFECT_ALL, SPELL_AURA_MOD_STAT); - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_sha_feral_spirit_scaling_AuraScript::CalculateAPAmount, EFFECT_ALL, SPELL_AURA_MOD_ATTACK_POWER); - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_sha_feral_spirit_scaling_AuraScript::CalculateSPAmount, EFFECT_ALL, SPELL_AURA_MOD_DAMAGE_DONE); - } - - OnEffectApply += AuraEffectApplyFn(spell_sha_feral_spirit_scaling_AuraScript::HandleEffectApply, EFFECT_ALL, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); - DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_sha_feral_spirit_scaling_AuraScript::CalcPeriodic, EFFECT_ALL, SPELL_AURA_ANY); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_sha_feral_spirit_scaling_AuraScript::HandlePeriodic, EFFECT_ALL, SPELL_AURA_ANY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_sha_feral_spirit_scaling_AuraScript(); + else + GetEffect(aurEff->GetEffIndex())->RecalculateAmount(); } + + void Register() + { + if (m_scriptSpellId == 35675) + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_sha_feral_spirit_scaling_AuraScript::CalculateResistanceAmount, EFFECT_ALL, SPELL_AURA_MOD_RESISTANCE); + + if (m_scriptSpellId == 35674) + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_sha_feral_spirit_scaling_AuraScript::CalculateStatAmount, EFFECT_ALL, SPELL_AURA_MOD_STAT); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_sha_feral_spirit_scaling_AuraScript::CalculateAPAmount, EFFECT_ALL, SPELL_AURA_MOD_ATTACK_POWER); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_sha_feral_spirit_scaling_AuraScript::CalculateSPAmount, EFFECT_ALL, SPELL_AURA_MOD_DAMAGE_DONE); + } + + OnEffectApply += AuraEffectApplyFn(spell_sha_feral_spirit_scaling_AuraScript::HandleEffectApply, EFFECT_ALL, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); + DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_sha_feral_spirit_scaling_AuraScript::CalcPeriodic, EFFECT_ALL, SPELL_AURA_ANY); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_sha_feral_spirit_scaling_AuraScript::HandlePeriodic, EFFECT_ALL, SPELL_AURA_ANY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_sha_feral_spirit_scaling_AuraScript(); + } }; class spell_sha_fire_elemental_scaling : public SpellScriptLoader { - public: - spell_sha_fire_elemental_scaling() : SpellScriptLoader("spell_sha_fire_elemental_scaling") { } +public: + spell_sha_fire_elemental_scaling() : SpellScriptLoader("spell_sha_fire_elemental_scaling") { } - class spell_sha_fire_elemental_scaling_AuraScript : public AuraScript + class spell_sha_fire_elemental_scaling_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sha_fire_elemental_scaling_AuraScript); + + void CalculateResistanceAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) { - PrepareAuraScript(spell_sha_fire_elemental_scaling_AuraScript); - - void CalculateResistanceAmount(AuraEffect const* aurEff, int32 & amount, bool & /*canBeRecalculated*/) + // xinef: fire elemental inherits 40% of resistance from owner and 35% of armor + if (Unit* owner = GetUnitOwner()->GetOwner()) { - // xinef: fire elemental inherits 40% of resistance from owner and 35% of armor - if (Unit* owner = GetUnitOwner()->GetOwner()) - { - SpellSchoolMask schoolMask = SpellSchoolMask(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].MiscValue); - int32 modifier = schoolMask == SPELL_SCHOOL_MASK_NORMAL ? 35 : 40; - amount = CalculatePct(std::max(0, owner->GetResistance(schoolMask)), modifier); - } + SpellSchoolMask schoolMask = SpellSchoolMask(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].MiscValue); + int32 modifier = schoolMask == SPELL_SCHOOL_MASK_NORMAL ? 35 : 40; + amount = CalculatePct(std::max(0, owner->GetResistance(schoolMask)), modifier); } - - void CalculateStatAmount(AuraEffect const* aurEff, int32 & amount, bool & /*canBeRecalculated*/) - { - // xinef: fire elemental inherits 30% of intellect / stamina - if (Unit* owner = GetUnitOwner()->GetOwner()) - { - Stats stat = Stats(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].MiscValue); - amount = CalculatePct(std::max(0, owner->GetStat(stat)), 30); - } - } - - void CalculateAPAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - // xinef: fire elemental inherits 300% / 150% of SP as AP - if (Unit* owner = GetUnitOwner()->GetOwner()) - { - int32 fire = owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_FIRE); - amount = CalculatePct(std::max(0, fire), (GetUnitOwner()->GetEntry() == NPC_FIRE_ELEMENTAL ? 300 : 150)); - } - } - - void CalculateSPAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - // xinef: fire elemental inherits 100% of SP - if (Unit* owner = GetUnitOwner()->GetOwner()) - { - int32 fire = owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_FIRE); - amount = CalculatePct(std::max(0, fire), 100); - - // xinef: Update appropriate player field - if (owner->GetTypeId() == TYPEID_PLAYER) - owner->SetUInt32Value(PLAYER_PET_SPELL_POWER, (uint32)amount); - } - } - - void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, aurEff->GetAuraType(), true, SPELL_BLOCK_TYPE_POSITIVE); - if (aurEff->GetAuraType() == SPELL_AURA_MOD_ATTACK_POWER) - GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_ATTACK_POWER_PCT, true, SPELL_BLOCK_TYPE_POSITIVE); - else if (aurEff->GetAuraType() == SPELL_AURA_MOD_STAT) - GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, true, SPELL_BLOCK_TYPE_POSITIVE); - } - - void Register() - { - if (m_scriptSpellId != 35665 && m_scriptSpellId != 65225) - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_sha_fire_elemental_scaling_AuraScript::CalculateResistanceAmount, EFFECT_ALL, SPELL_AURA_MOD_RESISTANCE); - - if (m_scriptSpellId == 35666 || m_scriptSpellId == 65226) - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_sha_fire_elemental_scaling_AuraScript::CalculateStatAmount, EFFECT_ALL, SPELL_AURA_MOD_STAT); - - if (m_scriptSpellId == 35665 || m_scriptSpellId == 65225) - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_sha_fire_elemental_scaling_AuraScript::CalculateAPAmount, EFFECT_ALL, SPELL_AURA_MOD_ATTACK_POWER); - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_sha_fire_elemental_scaling_AuraScript::CalculateSPAmount, EFFECT_ALL, SPELL_AURA_MOD_DAMAGE_DONE); - } - - OnEffectApply += AuraEffectApplyFn(spell_sha_fire_elemental_scaling_AuraScript::HandleEffectApply, EFFECT_ALL, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_sha_fire_elemental_scaling_AuraScript(); } + + void CalculateStatAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) + { + // xinef: fire elemental inherits 30% of intellect / stamina + if (Unit* owner = GetUnitOwner()->GetOwner()) + { + Stats stat = Stats(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].MiscValue); + amount = CalculatePct(std::max(0, owner->GetStat(stat)), 30); + } + } + + void CalculateAPAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + // xinef: fire elemental inherits 300% / 150% of SP as AP + if (Unit* owner = GetUnitOwner()->GetOwner()) + { + int32 fire = owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_FIRE); + amount = CalculatePct(std::max(0, fire), (GetUnitOwner()->GetEntry() == NPC_FIRE_ELEMENTAL ? 300 : 150)); + } + } + + void CalculateSPAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + // xinef: fire elemental inherits 100% of SP + if (Unit* owner = GetUnitOwner()->GetOwner()) + { + int32 fire = owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_FIRE); + amount = CalculatePct(std::max(0, fire), 100); + + // xinef: Update appropriate player field + if (owner->GetTypeId() == TYPEID_PLAYER) + owner->SetUInt32Value(PLAYER_PET_SPELL_POWER, (uint32)amount); + } + } + + void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, aurEff->GetAuraType(), true, SPELL_BLOCK_TYPE_POSITIVE); + if (aurEff->GetAuraType() == SPELL_AURA_MOD_ATTACK_POWER) + GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_ATTACK_POWER_PCT, true, SPELL_BLOCK_TYPE_POSITIVE); + else if (aurEff->GetAuraType() == SPELL_AURA_MOD_STAT) + GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, true, SPELL_BLOCK_TYPE_POSITIVE); + } + + void Register() + { + if (m_scriptSpellId != 35665 && m_scriptSpellId != 65225) + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_sha_fire_elemental_scaling_AuraScript::CalculateResistanceAmount, EFFECT_ALL, SPELL_AURA_MOD_RESISTANCE); + + if (m_scriptSpellId == 35666 || m_scriptSpellId == 65226) + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_sha_fire_elemental_scaling_AuraScript::CalculateStatAmount, EFFECT_ALL, SPELL_AURA_MOD_STAT); + + if (m_scriptSpellId == 35665 || m_scriptSpellId == 65225) + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_sha_fire_elemental_scaling_AuraScript::CalculateAPAmount, EFFECT_ALL, SPELL_AURA_MOD_ATTACK_POWER); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_sha_fire_elemental_scaling_AuraScript::CalculateSPAmount, EFFECT_ALL, SPELL_AURA_MOD_DAMAGE_DONE); + } + + OnEffectApply += AuraEffectApplyFn(spell_sha_fire_elemental_scaling_AuraScript::HandleEffectApply, EFFECT_ALL, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_sha_fire_elemental_scaling_AuraScript(); + } }; @@ -407,949 +407,949 @@ class spell_sha_fire_elemental_scaling : public SpellScriptLoader // 52759 - Ancestral Awakening (Proc) class spell_sha_ancestral_awakening_proc : public SpellScriptLoader { - public: - spell_sha_ancestral_awakening_proc() : SpellScriptLoader("spell_sha_ancestral_awakening_proc") { } +public: + spell_sha_ancestral_awakening_proc() : SpellScriptLoader("spell_sha_ancestral_awakening_proc") { } - class spell_sha_ancestral_awakening_proc_SpellScript : public SpellScript + class spell_sha_ancestral_awakening_proc_SpellScript : public SpellScript + { + PrepareSpellScript(spell_sha_ancestral_awakening_proc_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_sha_ancestral_awakening_proc_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_ANCESTRAL_AWAKENING_PROC)) - return false; - return true; - } - - void FilterTargets(std::list& targets) - { - if (targets.size() < 2) - return; - - targets.sort(acore::HealthPctOrderPred()); - - WorldObject* target = targets.front(); - targets.clear(); - targets.push_back(target); - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - int32 damage = GetEffectValue(); - if (GetHitUnit()) - GetCaster()->CastCustomSpell(GetHitUnit(), SPELL_SHAMAN_ANCESTRAL_AWAKENING_PROC, &damage, nullptr, nullptr, true); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sha_ancestral_awakening_proc_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_RAID); - OnEffectHitTarget += SpellEffectFn(spell_sha_ancestral_awakening_proc_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_sha_ancestral_awakening_proc_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_ANCESTRAL_AWAKENING_PROC)) + return false; + return true; } + + void FilterTargets(std::list& targets) + { + if (targets.size() < 2) + return; + + targets.sort(acore::HealthPctOrderPred()); + + WorldObject* target = targets.front(); + targets.clear(); + targets.push_back(target); + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + int32 damage = GetEffectValue(); + if (GetHitUnit()) + GetCaster()->CastCustomSpell(GetHitUnit(), SPELL_SHAMAN_ANCESTRAL_AWAKENING_PROC, &damage, nullptr, nullptr, true); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sha_ancestral_awakening_proc_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_RAID); + OnEffectHitTarget += SpellEffectFn(spell_sha_ancestral_awakening_proc_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_sha_ancestral_awakening_proc_SpellScript(); + } }; // 51474 - Astral Shift class spell_sha_astral_shift : public SpellScriptLoader { - public: - spell_sha_astral_shift() : SpellScriptLoader("spell_sha_astral_shift") { } +public: + spell_sha_astral_shift() : SpellScriptLoader("spell_sha_astral_shift") { } - class spell_sha_astral_shift_AuraScript : public AuraScript + class spell_sha_astral_shift_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sha_astral_shift_AuraScript); + + uint32 absorbPct; + + bool Load() { - PrepareAuraScript(spell_sha_astral_shift_AuraScript); - - uint32 absorbPct; - - bool Load() - { - absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); - return true; - } - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - // Set absorbtion amount to unlimited - amount = -1; - } - - void Absorb(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount) - { - // reduces all damage taken while stun, fear or silence - if (GetTarget()->GetUInt32Value(UNIT_FIELD_FLAGS) & (UNIT_FLAG_FLEEING | UNIT_FLAG_SILENCED) || (GetTarget()->GetUInt32Value(UNIT_FIELD_FLAGS) & (UNIT_FLAG_STUNNED) && GetTarget()->HasAuraWithMechanic(1<Effects[EFFECT_0].CalcValue(GetCaster()); + return true; } + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + // Set absorbtion amount to unlimited + amount = -1; + } + + void Absorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount) + { + // reduces all damage taken while stun, fear or silence + if (GetTarget()->GetUInt32Value(UNIT_FIELD_FLAGS) & (UNIT_FLAG_FLEEING | UNIT_FLAG_SILENCED) || (GetTarget()->GetUInt32Value(UNIT_FIELD_FLAGS) & (UNIT_FLAG_STUNNED) && GetTarget()->HasAuraWithMechanic(1 << MECHANIC_STUN))) + absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct); + } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_sha_astral_shift_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); + OnEffectAbsorb += AuraEffectAbsorbFn(spell_sha_astral_shift_AuraScript::Absorb, EFFECT_0); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_sha_astral_shift_AuraScript(); + } }; // 2825 - Bloodlust class spell_sha_bloodlust : public SpellScriptLoader { - public: - spell_sha_bloodlust() : SpellScriptLoader("spell_sha_bloodlust") { } +public: + spell_sha_bloodlust() : SpellScriptLoader("spell_sha_bloodlust") { } - class spell_sha_bloodlust_SpellScript : public SpellScript + class spell_sha_bloodlust_SpellScript : public SpellScript + { + PrepareSpellScript(spell_sha_bloodlust_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_sha_bloodlust_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_SATED)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_EXHAUSTION)) - return false; - return true; - } - - void RemoveInvalidTargets(std::list& targets) - { - targets.remove_if(acore::UnitAuraCheck(true, SPELL_SHAMAN_SATED)); - targets.remove_if(acore::UnitAuraCheck(true, SPELL_SHAMAN_EXHAUSTION)); - } - - void ApplyDebuff() - { - if (Unit* target = GetHitUnit()) - target->CastSpell(target, SPELL_SHAMAN_SATED, true); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sha_bloodlust_SpellScript::RemoveInvalidTargets, EFFECT_ALL, TARGET_UNIT_CASTER_AREA_RAID); - AfterHit += SpellHitFn(spell_sha_bloodlust_SpellScript::ApplyDebuff); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_sha_bloodlust_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_SATED)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_EXHAUSTION)) + return false; + return true; } + + void RemoveInvalidTargets(std::list& targets) + { + targets.remove_if(acore::UnitAuraCheck(true, SPELL_SHAMAN_SATED)); + targets.remove_if(acore::UnitAuraCheck(true, SPELL_SHAMAN_EXHAUSTION)); + } + + void ApplyDebuff() + { + if (Unit* target = GetHitUnit()) + target->CastSpell(target, SPELL_SHAMAN_SATED, true); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sha_bloodlust_SpellScript::RemoveInvalidTargets, EFFECT_ALL, TARGET_UNIT_CASTER_AREA_RAID); + AfterHit += SpellHitFn(spell_sha_bloodlust_SpellScript::ApplyDebuff); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_sha_bloodlust_SpellScript(); + } }; // -1064 - Chain Heal class spell_sha_chain_heal : public SpellScriptLoader { - public: - spell_sha_chain_heal() : SpellScriptLoader("spell_sha_chain_heal") { } +public: + spell_sha_chain_heal() : SpellScriptLoader("spell_sha_chain_heal") { } - class spell_sha_chain_heal_SpellScript : public SpellScript + class spell_sha_chain_heal_SpellScript : public SpellScript + { + PrepareSpellScript(spell_sha_chain_heal_SpellScript); + + bool Load() { - PrepareSpellScript(spell_sha_chain_heal_SpellScript); - - bool Load() - { - firstHeal = true; - riptide = false; - return true; - } - - void HandleHeal(SpellEffIndex /*effIndex*/) - { - if (firstHeal) - { - // Check if the target has Riptide - if (AuraEffect* aurEff = GetHitUnit()->GetAuraEffect(SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_SHAMAN, 0, 0, 0x10, GetCaster()->GetGUID())) - { - riptide = true; - // Consume it - GetHitUnit()->RemoveAura(aurEff->GetBase()); - } - firstHeal = false; - } - // Riptide increases the Chain Heal effect by 25% - if (riptide) - SetHitHeal(GetHitHeal() * 1.25f); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_sha_chain_heal_SpellScript::HandleHeal, EFFECT_0, SPELL_EFFECT_HEAL); - } - - bool firstHeal; - bool riptide; - }; - - SpellScript* GetSpellScript() const - { - return new spell_sha_chain_heal_SpellScript(); + firstHeal = true; + riptide = false; + return true; } + + void HandleHeal(SpellEffIndex /*effIndex*/) + { + if (firstHeal) + { + // Check if the target has Riptide + if (AuraEffect* aurEff = GetHitUnit()->GetAuraEffect(SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_SHAMAN, 0, 0, 0x10, GetCaster()->GetGUID())) + { + riptide = true; + // Consume it + GetHitUnit()->RemoveAura(aurEff->GetBase()); + } + firstHeal = false; + } + // Riptide increases the Chain Heal effect by 25% + if (riptide) + SetHitHeal(GetHitHeal() * 1.25f); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_sha_chain_heal_SpellScript::HandleHeal, EFFECT_0, SPELL_EFFECT_HEAL); + } + + bool firstHeal; + bool riptide; + }; + + SpellScript* GetSpellScript() const + { + return new spell_sha_chain_heal_SpellScript(); + } }; // 8171 - Cleansing Totem (Pulse) class spell_sha_cleansing_totem_pulse : public SpellScriptLoader { - public: - spell_sha_cleansing_totem_pulse() : SpellScriptLoader("spell_sha_cleansing_totem_pulse") { } +public: + spell_sha_cleansing_totem_pulse() : SpellScriptLoader("spell_sha_cleansing_totem_pulse") { } - class spell_sha_cleansing_totem_pulse_SpellScript : public SpellScript + class spell_sha_cleansing_totem_pulse_SpellScript : public SpellScript + { + PrepareSpellScript(spell_sha_cleansing_totem_pulse_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_sha_cleansing_totem_pulse_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_CLEANSING_TOTEM_EFFECT)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - int32 bp = 1; - if (GetCaster() && GetHitUnit() && GetOriginalCaster()) - GetCaster()->CastCustomSpell(GetHitUnit(), SPELL_SHAMAN_CLEANSING_TOTEM_EFFECT, NULL, &bp, NULL, true, nullptr, nullptr, GetOriginalCaster()->GetGUID()); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_sha_cleansing_totem_pulse_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_sha_cleansing_totem_pulse_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_CLEANSING_TOTEM_EFFECT)) + return false; + return true; } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + int32 bp = 1; + if (GetCaster() && GetHitUnit() && GetOriginalCaster()) + GetCaster()->CastCustomSpell(GetHitUnit(), SPELL_SHAMAN_CLEANSING_TOTEM_EFFECT, NULL, &bp, NULL, true, nullptr, nullptr, GetOriginalCaster()->GetGUID()); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_sha_cleansing_totem_pulse_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_sha_cleansing_totem_pulse_SpellScript(); + } }; // -974 - Earth Shield class spell_sha_earth_shield : public SpellScriptLoader { - public: - spell_sha_earth_shield() : SpellScriptLoader("spell_sha_earth_shield") { } +public: + spell_sha_earth_shield() : SpellScriptLoader("spell_sha_earth_shield") { } - class spell_sha_earth_shield_AuraScript : public AuraScript + class spell_sha_earth_shield_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sha_earth_shield_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_sha_earth_shield_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_EARTH_SHIELD_HEAL)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_GLYPH_OF_EARTH_SHIELD)) - return false; - return true; - } - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool & /*canBeRecalculated*/) - { - if (Unit* caster = GetCaster()) - { - int32 baseAmount = amount; - amount = caster->SpellHealingBonusDone(GetUnitOwner(), GetSpellInfo(), amount, HEAL); - // xinef: taken should be calculated at every heal - //amount = GetUnitOwner()->SpellHealingBonusTaken(caster, GetSpellInfo(), amount, HEAL); - - // Glyph of Earth Shield - //! WORKAROUND - //! this glyphe is a proc - if (AuraEffect* glyphe = caster->GetAuraEffect(SPELL_SHAMAN_GLYPH_OF_EARTH_SHIELD, EFFECT_0)) - AddPct(amount, glyphe->GetAmount()); - - // xinef: Improved Shields - if ((baseAmount = amount - baseAmount)) - if (AuraEffect* aurEff = caster->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_SHAMAN, 19, EFFECT_1)) - { - ApplyPct(baseAmount, aurEff->GetAmount()); - amount += baseAmount; - } - } - } - - bool CheckProc(ProcEventInfo& /*eventInfo*/) - { - return !GetTarget()->HasSpellCooldown(SPELL_SHAMAN_EARTH_SHIELD_HEAL); - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) - { - PreventDefaultAction(); - GetTarget()->CastCustomSpell(SPELL_SHAMAN_EARTH_SHIELD_HEAL, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetTarget(), true, NULL, aurEff, GetCasterGUID()); - GetTarget()->AddSpellCooldown(SPELL_SHAMAN_EARTH_SHIELD_HEAL, 0, 3500); - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_sha_earth_shield_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_DUMMY); - DoCheckProc += AuraCheckProcFn(spell_sha_earth_shield_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_sha_earth_shield_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_sha_earth_shield_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_EARTH_SHIELD_HEAL)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_GLYPH_OF_EARTH_SHIELD)) + return false; + return true; } + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + if (Unit* caster = GetCaster()) + { + int32 baseAmount = amount; + amount = caster->SpellHealingBonusDone(GetUnitOwner(), GetSpellInfo(), amount, HEAL); + // xinef: taken should be calculated at every heal + //amount = GetUnitOwner()->SpellHealingBonusTaken(caster, GetSpellInfo(), amount, HEAL); + + // Glyph of Earth Shield + //! WORKAROUND + //! this glyphe is a proc + if (AuraEffect* glyphe = caster->GetAuraEffect(SPELL_SHAMAN_GLYPH_OF_EARTH_SHIELD, EFFECT_0)) + AddPct(amount, glyphe->GetAmount()); + + // xinef: Improved Shields + if ((baseAmount = amount - baseAmount)) + if (AuraEffect* aurEff = caster->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_SHAMAN, 19, EFFECT_1)) + { + ApplyPct(baseAmount, aurEff->GetAmount()); + amount += baseAmount; + } + } + } + + bool CheckProc(ProcEventInfo& /*eventInfo*/) + { + return !GetTarget()->HasSpellCooldown(SPELL_SHAMAN_EARTH_SHIELD_HEAL); + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + GetTarget()->CastCustomSpell(SPELL_SHAMAN_EARTH_SHIELD_HEAL, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetTarget(), true, NULL, aurEff, GetCasterGUID()); + GetTarget()->AddSpellCooldown(SPELL_SHAMAN_EARTH_SHIELD_HEAL, 0, 3500); + } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_sha_earth_shield_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_DUMMY); + DoCheckProc += AuraCheckProcFn(spell_sha_earth_shield_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_sha_earth_shield_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_sha_earth_shield_AuraScript(); + } }; // 6474 - Earthbind Totem - Fix Talent: Earthen Power class spell_sha_earthbind_totem : public SpellScriptLoader { - public: - spell_sha_earthbind_totem() : SpellScriptLoader("spell_sha_earthbind_totem") { } +public: + spell_sha_earthbind_totem() : SpellScriptLoader("spell_sha_earthbind_totem") { } - class spell_sha_earthbind_totem_AuraScript : public AuraScript + class spell_sha_earthbind_totem_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sha_earthbind_totem_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_sha_earthbind_totem_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_TOTEM_EARTHBIND_TOTEM) || !sSpellMgr->GetSpellInfo(SPELL_SHAMAN_TOTEM_EARTHEN_POWER)) - return false; - return true; - } - - void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) - { - if (!GetCaster()) - return; - if (Player* owner = GetCaster()->GetCharmerOrOwnerPlayerOrPlayerItself()) - if (AuraEffect* aur = owner->GetDummyAuraEffect(SPELLFAMILY_SHAMAN, 2289, 0)) - if (roll_chance_i(aur->GetBaseAmount())) - GetTarget()->CastSpell((Unit*)NULL, SPELL_SHAMAN_TOTEM_EARTHEN_POWER, true); - } - - void Apply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (!GetCaster()) - return; - Player* owner = GetCaster()->GetCharmerOrOwnerPlayerOrPlayerItself(); - if (!owner) - return; - // Storm, Earth and Fire - if (AuraEffect* aurEff = owner->GetAuraEffectOfRankedSpell(SPELL_SHAMAN_STORM_EARTH_AND_FIRE, EFFECT_1)) - { - if (roll_chance_i(aurEff->GetAmount())) - GetCaster()->CastSpell(GetCaster(), SPELL_SHAMAN_TOTEM_EARTHBIND_EARTHGRAB, false); - } - } - - void Register() - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_sha_earthbind_totem_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - OnEffectApply += AuraEffectApplyFn(spell_sha_earthbind_totem_AuraScript::Apply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_sha_earthbind_totem_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_TOTEM_EARTHBIND_TOTEM) || !sSpellMgr->GetSpellInfo(SPELL_SHAMAN_TOTEM_EARTHEN_POWER)) + return false; + return true; } + + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) + { + if (!GetCaster()) + return; + if (Player* owner = GetCaster()->GetCharmerOrOwnerPlayerOrPlayerItself()) + if (AuraEffect* aur = owner->GetDummyAuraEffect(SPELLFAMILY_SHAMAN, 2289, 0)) + if (roll_chance_i(aur->GetBaseAmount())) + GetTarget()->CastSpell((Unit*)NULL, SPELL_SHAMAN_TOTEM_EARTHEN_POWER, true); + } + + void Apply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (!GetCaster()) + return; + Player* owner = GetCaster()->GetCharmerOrOwnerPlayerOrPlayerItself(); + if (!owner) + return; + // Storm, Earth and Fire + if (AuraEffect* aurEff = owner->GetAuraEffectOfRankedSpell(SPELL_SHAMAN_STORM_EARTH_AND_FIRE, EFFECT_1)) + { + if (roll_chance_i(aurEff->GetAmount())) + GetCaster()->CastSpell(GetCaster(), SPELL_SHAMAN_TOTEM_EARTHBIND_EARTHGRAB, false); + } + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_sha_earthbind_totem_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + OnEffectApply += AuraEffectApplyFn(spell_sha_earthbind_totem_AuraScript::Apply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_sha_earthbind_totem_AuraScript(); + } }; class EarthenPowerTargetSelector { - public: - EarthenPowerTargetSelector() { } +public: + EarthenPowerTargetSelector() { } - bool operator() (WorldObject* target) - { - if (!target->ToUnit()) - return true; + bool operator() (WorldObject* target) + { + if (!target->ToUnit()) + return true; - if (!target->ToUnit()->HasAuraWithMechanic(1 << MECHANIC_SNARE)) - return true; + if (!target->ToUnit()->HasAuraWithMechanic(1 << MECHANIC_SNARE)) + return true; - return false; - } + return false; + } }; // 59566 - Earthen Power class spell_sha_earthen_power : public SpellScriptLoader { - public: - spell_sha_earthen_power() : SpellScriptLoader("spell_sha_earthen_power") { } +public: + spell_sha_earthen_power() : SpellScriptLoader("spell_sha_earthen_power") { } - class spell_sha_earthen_power_SpellScript : public SpellScript + class spell_sha_earthen_power_SpellScript : public SpellScript + { + PrepareSpellScript(spell_sha_earthen_power_SpellScript); + + void FilterTargets(std::list& unitList) { - PrepareSpellScript(spell_sha_earthen_power_SpellScript); - - void FilterTargets(std::list& unitList) - { - unitList.remove_if(EarthenPowerTargetSelector()); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sha_earthen_power_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_sha_earthen_power_SpellScript(); + unitList.remove_if(EarthenPowerTargetSelector()); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sha_earthen_power_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_sha_earthen_power_SpellScript(); + } }; // -1535 - Fire Nova class spell_sha_fire_nova : public SpellScriptLoader { - public: - spell_sha_fire_nova() : SpellScriptLoader("spell_sha_fire_nova") { } +public: + spell_sha_fire_nova() : SpellScriptLoader("spell_sha_fire_nova") { } - class spell_sha_fire_nova_SpellScript : public SpellScript + class spell_sha_fire_nova_SpellScript : public SpellScript + { + PrepareSpellScript(spell_sha_fire_nova_SpellScript); + + bool Validate(SpellInfo const* spellInfo) { - PrepareSpellScript(spell_sha_fire_nova_SpellScript); + SpellInfo const* firstRankSpellInfo = sSpellMgr->GetSpellInfo(SPELL_SHAMAN_FIRE_NOVA_R1); + if (!firstRankSpellInfo || !spellInfo->IsRankOf(firstRankSpellInfo)) + return false; - bool Validate(SpellInfo const* spellInfo) - { - SpellInfo const* firstRankSpellInfo = sSpellMgr->GetSpellInfo(SPELL_SHAMAN_FIRE_NOVA_R1); - if (!firstRankSpellInfo || !spellInfo->IsRankOf(firstRankSpellInfo)) - return false; - - uint8 rank = spellInfo->GetRank(); - if (!sSpellMgr->GetSpellWithRank(SPELL_SHAMAN_FIRE_NOVA_TRIGGERED_R1, rank, true)) - return false; - return true; - } - - SpellCastResult CheckFireTotem() - { - // fire totem - Unit* caster = GetCaster(); - if (Creature* totem = caster->GetMap()->GetCreature(caster->m_SummonSlot[1])) - { - if (!caster->IsWithinDistInMap(totem, caster->GetSpellMaxRangeForTarget(totem, GetSpellInfo()))) - return SPELL_FAILED_OUT_OF_RANGE; - return SPELL_CAST_OK; - } - else - { - SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_MUST_HAVE_FIRE_TOTEM); - return SPELL_FAILED_CUSTOM_ERROR; - } - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - if (Creature* totem = caster->GetMap()->GetCreature(caster->m_SummonSlot[1])) - { - uint8 rank = GetSpellInfo()->GetRank(); - if (totem->IsTotem()) - caster->CastSpell(totem, sSpellMgr->GetSpellWithRank(SPELL_SHAMAN_FIRE_NOVA_TRIGGERED_R1, rank), true); - } - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_sha_fire_nova_SpellScript::CheckFireTotem); - OnEffectHitTarget += SpellEffectFn(spell_sha_fire_nova_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_sha_fire_nova_SpellScript(); + uint8 rank = spellInfo->GetRank(); + if (!sSpellMgr->GetSpellWithRank(SPELL_SHAMAN_FIRE_NOVA_TRIGGERED_R1, rank, true)) + return false; + return true; } + + SpellCastResult CheckFireTotem() + { + // fire totem + Unit* caster = GetCaster(); + if (Creature* totem = caster->GetMap()->GetCreature(caster->m_SummonSlot[1])) + { + if (!caster->IsWithinDistInMap(totem, caster->GetSpellMaxRangeForTarget(totem, GetSpellInfo()))) + return SPELL_FAILED_OUT_OF_RANGE; + return SPELL_CAST_OK; + } + else + { + SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_MUST_HAVE_FIRE_TOTEM); + return SPELL_FAILED_CUSTOM_ERROR; + } + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (Creature* totem = caster->GetMap()->GetCreature(caster->m_SummonSlot[1])) + { + uint8 rank = GetSpellInfo()->GetRank(); + if (totem->IsTotem()) + caster->CastSpell(totem, sSpellMgr->GetSpellWithRank(SPELL_SHAMAN_FIRE_NOVA_TRIGGERED_R1, rank), true); + } + } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_sha_fire_nova_SpellScript::CheckFireTotem); + OnEffectHitTarget += SpellEffectFn(spell_sha_fire_nova_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_sha_fire_nova_SpellScript(); + } }; // -8050 - Flame Shock class spell_sha_flame_shock : public SpellScriptLoader { - public: - spell_sha_flame_shock() : SpellScriptLoader("spell_sha_flame_shock") { } +public: + spell_sha_flame_shock() : SpellScriptLoader("spell_sha_flame_shock") { } - class spell_sha_flame_shock_AuraScript : public AuraScript + class spell_sha_flame_shock_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sha_flame_shock_AuraScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareAuraScript(spell_sha_flame_shock_AuraScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_LAVA_FLOWS_R1)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_LAVA_FLOWS_TRIGGERED_R1)) - return false; - return true; - } - - void HandleDispel(DispelInfo* /*dispelInfo*/) - { - if (Unit* caster = GetCaster()) - // Lava Flows - if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_SHAMAN, SHAMAN_ICON_ID_SHAMAN_LAVA_FLOW, EFFECT_0)) - { - if (SpellInfo const* firstRankSpellInfo = sSpellMgr->GetSpellInfo(SPELL_SHAMAN_LAVA_FLOWS_R1)) - if (!aurEff->GetSpellInfo()->IsRankOf(firstRankSpellInfo)) - return; - - uint8 rank = aurEff->GetSpellInfo()->GetRank(); - caster->CastSpell(caster, sSpellMgr->GetSpellWithRank(SPELL_SHAMAN_LAVA_FLOWS_TRIGGERED_R1, rank), true); - } - } - - void Register() - { - AfterDispel += AuraDispelFn(spell_sha_flame_shock_AuraScript::HandleDispel); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_sha_flame_shock_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_LAVA_FLOWS_R1)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_LAVA_FLOWS_TRIGGERED_R1)) + return false; + return true; } + + void HandleDispel(DispelInfo* /*dispelInfo*/) + { + if (Unit* caster = GetCaster()) + // Lava Flows + if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_SHAMAN, SHAMAN_ICON_ID_SHAMAN_LAVA_FLOW, EFFECT_0)) + { + if (SpellInfo const* firstRankSpellInfo = sSpellMgr->GetSpellInfo(SPELL_SHAMAN_LAVA_FLOWS_R1)) + if (!aurEff->GetSpellInfo()->IsRankOf(firstRankSpellInfo)) + return; + + uint8 rank = aurEff->GetSpellInfo()->GetRank(); + caster->CastSpell(caster, sSpellMgr->GetSpellWithRank(SPELL_SHAMAN_LAVA_FLOWS_TRIGGERED_R1, rank), true); + } + } + + void Register() + { + AfterDispel += AuraDispelFn(spell_sha_flame_shock_AuraScript::HandleDispel); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_sha_flame_shock_AuraScript(); + } }; // 52041, 52046, 52047, 52048, 52049, 52050, 58759, 58760, 58761 - Healing Stream Totem class spell_sha_healing_stream_totem : public SpellScriptLoader { - public: - spell_sha_healing_stream_totem() : SpellScriptLoader("spell_sha_healing_stream_totem") { } +public: + spell_sha_healing_stream_totem() : SpellScriptLoader("spell_sha_healing_stream_totem") { } - class spell_sha_healing_stream_totem_SpellScript : public SpellScript + class spell_sha_healing_stream_totem_SpellScript : public SpellScript + { + PrepareSpellScript(spell_sha_healing_stream_totem_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_sha_healing_stream_totem_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_GLYPH_OF_HEALING_STREAM_TOTEM) || !sSpellMgr->GetSpellInfo(SPELL_SHAMAN_TOTEM_HEALING_STREAM_HEAL)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - int32 damage = GetEffectValue(); - SpellInfo const* triggeringSpell = GetTriggeringSpell(); - if (Unit* target = GetHitUnit()) - if (Unit* caster = GetCaster()) - { - if (Unit* owner = caster->GetOwner()) - { - if (triggeringSpell) - damage = int32(owner->SpellHealingBonusDone(target, triggeringSpell, damage, HEAL)); - - // Restorative Totems - if (AuraEffect* dummy = owner->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, SHAMAN_ICON_ID_RESTORATIVE_TOTEMS, 1)) - AddPct(damage, dummy->GetAmount()); - - // Glyph of Healing Stream Totem - if (AuraEffect const* aurEff = owner->GetAuraEffect(SPELL_SHAMAN_GLYPH_OF_HEALING_STREAM_TOTEM, EFFECT_0)) - AddPct(damage, aurEff->GetAmount()); - - damage = int32(target->SpellHealingBonusTaken(owner, triggeringSpell, damage, HEAL)); - } - caster->CastCustomSpell(target, SPELL_SHAMAN_TOTEM_HEALING_STREAM_HEAL, &damage, 0, 0, true, 0, 0, GetOriginalCaster()->GetGUID()); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_sha_healing_stream_totem_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_sha_healing_stream_totem_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_GLYPH_OF_HEALING_STREAM_TOTEM) || !sSpellMgr->GetSpellInfo(SPELL_SHAMAN_TOTEM_HEALING_STREAM_HEAL)) + return false; + return true; } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + int32 damage = GetEffectValue(); + SpellInfo const* triggeringSpell = GetTriggeringSpell(); + if (Unit* target = GetHitUnit()) + if (Unit* caster = GetCaster()) + { + if (Unit* owner = caster->GetOwner()) + { + if (triggeringSpell) + damage = int32(owner->SpellHealingBonusDone(target, triggeringSpell, damage, HEAL)); + + // Restorative Totems + if (AuraEffect* dummy = owner->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, SHAMAN_ICON_ID_RESTORATIVE_TOTEMS, 1)) + AddPct(damage, dummy->GetAmount()); + + // Glyph of Healing Stream Totem + if (AuraEffect const* aurEff = owner->GetAuraEffect(SPELL_SHAMAN_GLYPH_OF_HEALING_STREAM_TOTEM, EFFECT_0)) + AddPct(damage, aurEff->GetAmount()); + + damage = int32(target->SpellHealingBonusTaken(owner, triggeringSpell, damage, HEAL)); + } + caster->CastCustomSpell(target, SPELL_SHAMAN_TOTEM_HEALING_STREAM_HEAL, &damage, 0, 0, true, 0, 0, GetOriginalCaster()->GetGUID()); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_sha_healing_stream_totem_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_sha_healing_stream_totem_SpellScript(); + } }; // 32182 - Heroism class spell_sha_heroism : public SpellScriptLoader { - public: - spell_sha_heroism() : SpellScriptLoader("spell_sha_heroism") { } +public: + spell_sha_heroism() : SpellScriptLoader("spell_sha_heroism") { } - class spell_sha_heroism_SpellScript : public SpellScript + class spell_sha_heroism_SpellScript : public SpellScript + { + PrepareSpellScript(spell_sha_heroism_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_sha_heroism_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_EXHAUSTION)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_SATED)) - return false; - return true; - } - - void RemoveInvalidTargets(std::list& targets) - { - targets.remove_if(acore::UnitAuraCheck(true, SPELL_SHAMAN_EXHAUSTION)); - targets.remove_if(acore::UnitAuraCheck(true, SPELL_SHAMAN_SATED)); - } - - void ApplyDebuff() - { - if (Unit* target = GetHitUnit()) - target->CastSpell(target, SPELL_SHAMAN_EXHAUSTION, true); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sha_heroism_SpellScript::RemoveInvalidTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_RAID); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sha_heroism_SpellScript::RemoveInvalidTargets, EFFECT_1, TARGET_UNIT_CASTER_AREA_RAID); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sha_heroism_SpellScript::RemoveInvalidTargets, EFFECT_2, TARGET_UNIT_CASTER_AREA_RAID); - AfterHit += SpellHitFn(spell_sha_heroism_SpellScript::ApplyDebuff); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_sha_heroism_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_EXHAUSTION)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_SATED)) + return false; + return true; } + + void RemoveInvalidTargets(std::list& targets) + { + targets.remove_if(acore::UnitAuraCheck(true, SPELL_SHAMAN_EXHAUSTION)); + targets.remove_if(acore::UnitAuraCheck(true, SPELL_SHAMAN_SATED)); + } + + void ApplyDebuff() + { + if (Unit* target = GetHitUnit()) + target->CastSpell(target, SPELL_SHAMAN_EXHAUSTION, true); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sha_heroism_SpellScript::RemoveInvalidTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_RAID); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sha_heroism_SpellScript::RemoveInvalidTargets, EFFECT_1, TARGET_UNIT_CASTER_AREA_RAID); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sha_heroism_SpellScript::RemoveInvalidTargets, EFFECT_2, TARGET_UNIT_CASTER_AREA_RAID); + AfterHit += SpellHitFn(spell_sha_heroism_SpellScript::ApplyDebuff); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_sha_heroism_SpellScript(); + } }; // 23551 - Lightning Shield class spell_sha_item_lightning_shield : public SpellScriptLoader { - public: - spell_sha_item_lightning_shield() : SpellScriptLoader("spell_sha_item_lightning_shield") { } +public: + spell_sha_item_lightning_shield() : SpellScriptLoader("spell_sha_item_lightning_shield") { } - class spell_sha_item_lightning_shield_AuraScript : public AuraScript + class spell_sha_item_lightning_shield_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sha_item_lightning_shield_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_sha_item_lightning_shield_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_ITEM_LIGHTNING_SHIELD)) - return false; - return true; - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_SHAMAN_ITEM_LIGHTNING_SHIELD, true, NULL, aurEff); - } - - void Register() - { - OnEffectProc += AuraEffectProcFn(spell_sha_item_lightning_shield_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_sha_item_lightning_shield_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_ITEM_LIGHTNING_SHIELD)) + return false; + return true; } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_SHAMAN_ITEM_LIGHTNING_SHIELD, true, NULL, aurEff); + } + + void Register() + { + OnEffectProc += AuraEffectProcFn(spell_sha_item_lightning_shield_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_sha_item_lightning_shield_AuraScript(); + } }; // 23552 - Lightning Shield class spell_sha_item_lightning_shield_trigger : public SpellScriptLoader { - public: - spell_sha_item_lightning_shield_trigger() : SpellScriptLoader("spell_sha_item_lightning_shield_trigger") { } +public: + spell_sha_item_lightning_shield_trigger() : SpellScriptLoader("spell_sha_item_lightning_shield_trigger") { } - class spell_sha_item_lightning_shield_trigger_AuraScript : public AuraScript + class spell_sha_item_lightning_shield_trigger_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sha_item_lightning_shield_trigger_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_sha_item_lightning_shield_trigger_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_ITEM_MANA_SURGE)) - return false; - return true; - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) - { - PreventDefaultAction(); - GetTarget()->CastSpell(GetTarget(), SPELL_SHAMAN_ITEM_LIGHTNING_SHIELD_DAMAGE, true, NULL, aurEff); - } - - void Register() - { - OnEffectProc += AuraEffectProcFn(spell_sha_item_lightning_shield_trigger_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_sha_item_lightning_shield_trigger_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_ITEM_MANA_SURGE)) + return false; + return true; } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + GetTarget()->CastSpell(GetTarget(), SPELL_SHAMAN_ITEM_LIGHTNING_SHIELD_DAMAGE, true, NULL, aurEff); + } + + void Register() + { + OnEffectProc += AuraEffectProcFn(spell_sha_item_lightning_shield_trigger_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_sha_item_lightning_shield_trigger_AuraScript(); + } }; // 23572 - Mana Surge class spell_sha_item_mana_surge : public SpellScriptLoader { - public: - spell_sha_item_mana_surge() : SpellScriptLoader("spell_sha_item_mana_surge") { } +public: + spell_sha_item_mana_surge() : SpellScriptLoader("spell_sha_item_mana_surge") { } - class spell_sha_item_mana_surge_AuraScript : public AuraScript + class spell_sha_item_mana_surge_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sha_item_mana_surge_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_sha_item_mana_surge_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_ITEM_LIGHTNING_SHIELD_DAMAGE)) - return false; - return true; - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - return eventInfo.GetDamageInfo()->GetSpellInfo(); - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - int32 mana = eventInfo.GetDamageInfo()->GetSpellInfo()->CalcPowerCost(GetTarget(), eventInfo.GetSchoolMask()); - int32 damage = CalculatePct(mana, 35); - - GetTarget()->CastCustomSpell(SPELL_SHAMAN_ITEM_MANA_SURGE, SPELLVALUE_BASE_POINT0, damage, GetTarget(), true, NULL, aurEff); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_sha_item_mana_surge_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_sha_item_mana_surge_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_sha_item_mana_surge_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_ITEM_LIGHTNING_SHIELD_DAMAGE)) + return false; + return true; } + + bool CheckProc(ProcEventInfo& eventInfo) + { + return eventInfo.GetDamageInfo()->GetSpellInfo(); + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + int32 mana = eventInfo.GetDamageInfo()->GetSpellInfo()->CalcPowerCost(GetTarget(), eventInfo.GetSchoolMask()); + int32 damage = CalculatePct(mana, 35); + + GetTarget()->CastCustomSpell(SPELL_SHAMAN_ITEM_MANA_SURGE, SPELLVALUE_BASE_POINT0, damage, GetTarget(), true, NULL, aurEff); + } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_sha_item_mana_surge_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_sha_item_mana_surge_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_sha_item_mana_surge_AuraScript(); + } }; // 70811 - Item - Shaman T10 Elemental 2P Bonus class spell_sha_item_t10_elemental_2p_bonus : public SpellScriptLoader { - public: - spell_sha_item_t10_elemental_2p_bonus() : SpellScriptLoader("spell_sha_item_t10_elemental_2p_bonus") { } +public: + spell_sha_item_t10_elemental_2p_bonus() : SpellScriptLoader("spell_sha_item_t10_elemental_2p_bonus") { } - class spell_sha_item_t10_elemental_2p_bonus_AuraScript : public AuraScript + class spell_sha_item_t10_elemental_2p_bonus_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sha_item_t10_elemental_2p_bonus_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_sha_item_t10_elemental_2p_bonus_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_ELEMENTAL_MASTERY)) - return false; - return true; - } - - void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) - { - PreventDefaultAction(); - if (Player* target = GetTarget()->ToPlayer()) - target->ModifySpellCooldown(SPELL_SHAMAN_ELEMENTAL_MASTERY, -aurEff->GetAmount()); - } - - void Register() - { - OnEffectProc += AuraEffectProcFn(spell_sha_item_t10_elemental_2p_bonus_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_sha_item_t10_elemental_2p_bonus_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_ELEMENTAL_MASTERY)) + return false; + return true; } + + void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + if (Player* target = GetTarget()->ToPlayer()) + target->ModifySpellCooldown(SPELL_SHAMAN_ELEMENTAL_MASTERY, -aurEff->GetAmount()); + } + + void Register() + { + OnEffectProc += AuraEffectProcFn(spell_sha_item_t10_elemental_2p_bonus_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_sha_item_t10_elemental_2p_bonus_AuraScript(); + } }; // 60103 - Lava Lash class spell_sha_lava_lash : public SpellScriptLoader { - public: - spell_sha_lava_lash() : SpellScriptLoader("spell_sha_lava_lash") { } +public: + spell_sha_lava_lash() : SpellScriptLoader("spell_sha_lava_lash") { } - class spell_sha_lava_lash_SpellScript : public SpellScript + class spell_sha_lava_lash_SpellScript : public SpellScript + { + PrepareSpellScript(spell_sha_lava_lash_SpellScript) + + bool Load() { - PrepareSpellScript(spell_sha_lava_lash_SpellScript) + return GetCaster()->GetTypeId() == TYPEID_PLAYER; + } - bool Load() + void HandleDummy(SpellEffIndex /*effIndex*/) + { + if (Player* caster = GetCaster()->ToPlayer()) { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - if (Player* caster = GetCaster()->ToPlayer()) + int32 damage = GetEffectValue(); + int32 hitDamage = GetHitDamage(); + if (caster->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND)) { - int32 damage = GetEffectValue(); - int32 hitDamage = GetHitDamage(); - if (caster->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND)) - { - // Damage is increased by 25% if your off-hand weapon is enchanted with Flametongue. - if (caster->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, 0x200000, 0, 0)) - AddPct(hitDamage, damage); - SetHitDamage(hitDamage); - } + // Damage is increased by 25% if your off-hand weapon is enchanted with Flametongue. + if (caster->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, 0x200000, 0, 0)) + AddPct(hitDamage, damage); + SetHitDamage(hitDamage); } } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_sha_lava_lash_SpellScript::HandleDummy, EFFECT_1, SPELL_EFFECT_DUMMY); - } - - }; - - SpellScript* GetSpellScript() const - { - return new spell_sha_lava_lash_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_sha_lava_lash_SpellScript::HandleDummy, EFFECT_1, SPELL_EFFECT_DUMMY); + } + + }; + + SpellScript* GetSpellScript() const + { + return new spell_sha_lava_lash_SpellScript(); + } }; // 52031, 52033, 52034, 52035, 52036, 58778, 58779, 58780 - Mana Spring Totem class spell_sha_mana_spring_totem : public SpellScriptLoader { - public: - spell_sha_mana_spring_totem() : SpellScriptLoader("spell_sha_mana_spring_totem") { } +public: + spell_sha_mana_spring_totem() : SpellScriptLoader("spell_sha_mana_spring_totem") { } - class spell_sha_mana_spring_totem_SpellScript : public SpellScript + class spell_sha_mana_spring_totem_SpellScript : public SpellScript + { + PrepareSpellScript(spell_sha_mana_spring_totem_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_sha_mana_spring_totem_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_MANA_SPRING_TOTEM_ENERGIZE)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - int32 damage = GetEffectValue(); - if (Unit* target = GetHitUnit()) - if (Unit* caster = GetCaster()) - if (target->getPowerType() == POWER_MANA) - caster->CastCustomSpell(target, SPELL_SHAMAN_MANA_SPRING_TOTEM_ENERGIZE, &damage, 0, 0, true, 0, 0, GetOriginalCaster()->GetGUID()); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_sha_mana_spring_totem_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - - }; - - SpellScript* GetSpellScript() const - { - return new spell_sha_mana_spring_totem_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_MANA_SPRING_TOTEM_ENERGIZE)) + return false; + return true; } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + int32 damage = GetEffectValue(); + if (Unit* target = GetHitUnit()) + if (Unit* caster = GetCaster()) + if (target->getPowerType() == POWER_MANA) + caster->CastCustomSpell(target, SPELL_SHAMAN_MANA_SPRING_TOTEM_ENERGIZE, &damage, 0, 0, true, 0, 0, GetOriginalCaster()->GetGUID()); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_sha_mana_spring_totem_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + + }; + + SpellScript* GetSpellScript() const + { + return new spell_sha_mana_spring_totem_SpellScript(); + } }; // 39610 - Mana Tide Totem class spell_sha_mana_tide_totem : public SpellScriptLoader { - public: - spell_sha_mana_tide_totem() : SpellScriptLoader("spell_sha_mana_tide_totem") { } +public: + spell_sha_mana_tide_totem() : SpellScriptLoader("spell_sha_mana_tide_totem") { } - class spell_sha_mana_tide_totem_SpellScript : public SpellScript + class spell_sha_mana_tide_totem_SpellScript : public SpellScript + { + PrepareSpellScript(spell_sha_mana_tide_totem_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_sha_mana_tide_totem_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_GLYPH_OF_MANA_TIDE) || !sSpellMgr->GetSpellInfo(SPELL_SHAMAN_MANA_TIDE_TOTEM)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - if (Unit* caster = GetCaster()) - if (Unit* unitTarget = GetHitUnit()) - { - if (unitTarget->getPowerType() == POWER_MANA) - { - int32 effValue = GetEffectValue(); - // Glyph of Mana Tide - if (Unit* owner = caster->GetOwner()) - if (AuraEffect* dummy = owner->GetAuraEffect(SPELL_SHAMAN_GLYPH_OF_MANA_TIDE, 0)) - effValue += dummy->GetAmount(); - // Regenerate 6% of Total Mana Every 3 secs - int32 effBasePoints0 = int32(CalculatePct(unitTarget->GetMaxPower(POWER_MANA), effValue)); - caster->CastCustomSpell(unitTarget, SPELL_SHAMAN_MANA_TIDE_TOTEM, &effBasePoints0, nullptr, nullptr, true, nullptr, nullptr, GetOriginalCaster()->GetGUID()); - } - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_sha_mana_tide_totem_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_sha_mana_tide_totem_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_GLYPH_OF_MANA_TIDE) || !sSpellMgr->GetSpellInfo(SPELL_SHAMAN_MANA_TIDE_TOTEM)) + return false; + return true; } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + if (Unit* caster = GetCaster()) + if (Unit* unitTarget = GetHitUnit()) + { + if (unitTarget->getPowerType() == POWER_MANA) + { + int32 effValue = GetEffectValue(); + // Glyph of Mana Tide + if (Unit* owner = caster->GetOwner()) + if (AuraEffect* dummy = owner->GetAuraEffect(SPELL_SHAMAN_GLYPH_OF_MANA_TIDE, 0)) + effValue += dummy->GetAmount(); + // Regenerate 6% of Total Mana Every 3 secs + int32 effBasePoints0 = int32(CalculatePct(unitTarget->GetMaxPower(POWER_MANA), effValue)); + caster->CastCustomSpell(unitTarget, SPELL_SHAMAN_MANA_TIDE_TOTEM, &effBasePoints0, nullptr, nullptr, true, nullptr, nullptr, GetOriginalCaster()->GetGUID()); + } + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_sha_mana_tide_totem_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_sha_mana_tide_totem_SpellScript(); + } }; // 6495 - Sentry Totem class spell_sha_sentry_totem : public SpellScriptLoader { - public: - spell_sha_sentry_totem() : SpellScriptLoader("spell_sha_sentry_totem") { } +public: + spell_sha_sentry_totem() : SpellScriptLoader("spell_sha_sentry_totem") { } - class spell_sha_sentry_totem_AuraScript : public AuraScript + class spell_sha_sentry_totem_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sha_sentry_totem_AuraScript); + + bool Validate(SpellInfo const* /*spell*/) { - PrepareAuraScript(spell_sha_sentry_totem_AuraScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_BIND_SIGHT)) - return false; - return true; - } - - void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) - if (caster->GetTypeId() == TYPEID_PLAYER) - caster->ToPlayer()->StopCastingBindSight(); - } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_sha_sentry_totem_AuraScript::AfterRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_sha_sentry_totem_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_BIND_SIGHT)) + return false; + return true; } + + void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* caster = GetCaster()) + if (caster->GetTypeId() == TYPEID_PLAYER) + caster->ToPlayer()->StopCastingBindSight(); + } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_sha_sentry_totem_AuraScript::AfterRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_sha_sentry_totem_AuraScript(); + } }; // -51490 - Thunderstorm class spell_sha_thunderstorm : public SpellScriptLoader { - public: - spell_sha_thunderstorm() : SpellScriptLoader("spell_sha_thunderstorm") { } +public: + spell_sha_thunderstorm() : SpellScriptLoader("spell_sha_thunderstorm") { } - class spell_sha_thunderstorm_SpellScript : public SpellScript + class spell_sha_thunderstorm_SpellScript : public SpellScript + { + PrepareSpellScript(spell_sha_thunderstorm_SpellScript); + + void HandleKnockBack(SpellEffIndex effIndex) { - PrepareSpellScript(spell_sha_thunderstorm_SpellScript); - - void HandleKnockBack(SpellEffIndex effIndex) - { - // Glyph of Thunderstorm - if (GetCaster()->HasAura(SPELL_SHAMAN_GLYPH_OF_THUNDERSTORM)) - PreventHitDefaultEffect(effIndex); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_sha_thunderstorm_SpellScript::HandleKnockBack, EFFECT_2, SPELL_EFFECT_KNOCK_BACK); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_sha_thunderstorm_SpellScript(); + // Glyph of Thunderstorm + if (GetCaster()->HasAura(SPELL_SHAMAN_GLYPH_OF_THUNDERSTORM)) + PreventHitDefaultEffect(effIndex); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_sha_thunderstorm_SpellScript::HandleKnockBack, EFFECT_2, SPELL_EFFECT_KNOCK_BACK); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_sha_thunderstorm_SpellScript(); + } }; void AddSC_shaman_spell_scripts() diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp index c47d213d0..4d31dea0f 100644 --- a/src/server/scripts/Spells/spell_warlock.cpp +++ b/src/server/scripts/Spells/spell_warlock.cpp @@ -55,574 +55,574 @@ enum WarlockSpellIcons // Ours class spell_warl_eye_of_kilrogg : public SpellScriptLoader { - public: - spell_warl_eye_of_kilrogg() : SpellScriptLoader("spell_warl_eye_of_kilrogg") { } +public: + spell_warl_eye_of_kilrogg() : SpellScriptLoader("spell_warl_eye_of_kilrogg") { } - class spell_warl_eye_of_kilrogg_AuraScript : public AuraScript + class spell_warl_eye_of_kilrogg_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warl_eye_of_kilrogg_AuraScript); + + void HandleAuraApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_warl_eye_of_kilrogg_AuraScript); - - void HandleAuraApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + PreventDefaultAction(); + if (Player* player = GetTarget()->ToPlayer()) { - PreventDefaultAction(); - if (Player* player = GetTarget()->ToPlayer()) - { - player->UnsummonPetTemporaryIfAny(); + player->UnsummonPetTemporaryIfAny(); - // Glyph of Kilrogg - if (player->HasAura(58081)) - if (Unit* charm = player->GetCharm()) - { - charm->SetSpeed(MOVE_RUN, 2.14f, true); - if (charm->GetMapId() == 530 || charm->GetMapId() == 571) - { - charm->SetCanFly(true); - charm->SetSpeed(MOVE_FLIGHT, 2.14f, true); - charm->SendMovementFlagUpdate(); - } - } - } - } - - void HandleAuraRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Player* player = GetTarget()->ToPlayer()) - { + // Glyph of Kilrogg + if (player->HasAura(58081)) if (Unit* charm = player->GetCharm()) - charm->ToTempSummon()->UnSummon(); - - player->ResummonPetTemporaryUnSummonedIfAny(); - } + { + charm->SetSpeed(MOVE_RUN, 2.14f, true); + if (charm->GetMapId() == 530 || charm->GetMapId() == 571) + { + charm->SetCanFly(true); + charm->SetSpeed(MOVE_FLIGHT, 2.14f, true); + charm->SendMovementFlagUpdate(); + } + } } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_warl_eye_of_kilrogg_AuraScript::HandleAuraApply, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_warl_eye_of_kilrogg_AuraScript::HandleAuraRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_warl_eye_of_kilrogg_AuraScript(); } + + void HandleAuraRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Player* player = GetTarget()->ToPlayer()) + { + if (Unit* charm = player->GetCharm()) + charm->ToTempSummon()->UnSummon(); + + player->ResummonPetTemporaryUnSummonedIfAny(); + } + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_warl_eye_of_kilrogg_AuraScript::HandleAuraApply, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_warl_eye_of_kilrogg_AuraScript::HandleAuraRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_warl_eye_of_kilrogg_AuraScript(); + } }; class spell_warl_shadowflame : public SpellScriptLoader { - public: - spell_warl_shadowflame() : SpellScriptLoader("spell_warl_shadowflame") { } +public: + spell_warl_shadowflame() : SpellScriptLoader("spell_warl_shadowflame") { } - class spell_warl_shadowflame_SpellScript : public SpellScript + class spell_warl_shadowflame_SpellScript : public SpellScript + { + PrepareSpellScript(spell_warl_shadowflame_SpellScript); + + void HandleSchoolDMG(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_warl_shadowflame_SpellScript); - - void HandleSchoolDMG(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - GetCaster()->CastSpell(target, (GetSpellInfo()->Id == 47897 ? 47960 : 61291), true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_warl_shadowflame_SpellScript::HandleSchoolDMG, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_warl_shadowflame_SpellScript(); + if (Unit* target = GetHitUnit()) + GetCaster()->CastSpell(target, (GetSpellInfo()->Id == 47897 ? 47960 : 61291), true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_warl_shadowflame_SpellScript::HandleSchoolDMG, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_warl_shadowflame_SpellScript(); + } }; class spell_warl_seduction : public SpellScriptLoader { - public: - spell_warl_seduction() : SpellScriptLoader("spell_warl_seduction") { } +public: + spell_warl_seduction() : SpellScriptLoader("spell_warl_seduction") { } - class spell_warl_seduction_AuraScript : public AuraScript + class spell_warl_seduction_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warl_seduction_AuraScript); + + void HandleAuraApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_warl_seduction_AuraScript); - - void HandleAuraApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + if (Unit* caster = GetCaster()) { - if (Unit* caster = GetCaster()) - { - if (Unit* owner = caster->GetOwner()) - if (owner->GetAuraEffectDummy(56250)) - { - Unit* target = GetTarget(); - target->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE, 0, target->GetAura(32409)); // SW:D shall not be removed. - target->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT); - target->RemoveAurasByType(SPELL_AURA_PERIODIC_LEECH); - } - } + if (Unit* owner = caster->GetOwner()) + if (owner->GetAuraEffectDummy(56250)) + { + Unit* target = GetTarget(); + target->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE, 0, target->GetAura(32409)); // SW:D shall not be removed. + target->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT); + target->RemoveAurasByType(SPELL_AURA_PERIODIC_LEECH); + } } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_warl_seduction_AuraScript::HandleAuraApply, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_warl_seduction_AuraScript(); } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_warl_seduction_AuraScript::HandleAuraApply, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_warl_seduction_AuraScript(); + } }; class spell_warl_improved_demonic_tactics : public SpellScriptLoader { - public: - spell_warl_improved_demonic_tactics() : SpellScriptLoader("spell_warl_improved_demonic_tactics") { } +public: + spell_warl_improved_demonic_tactics() : SpellScriptLoader("spell_warl_improved_demonic_tactics") { } - class spell_warl_improved_demonic_tactics_AuraScript : public AuraScript + class spell_warl_improved_demonic_tactics_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warl_improved_demonic_tactics_AuraScript); + + bool Load() { - PrepareAuraScript(spell_warl_improved_demonic_tactics_AuraScript); - - bool Load() - { - return GetUnitOwner()->GetTypeId() == TYPEID_PLAYER; - } - - void CalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude) - { - isPeriodic = true; - amplitude = 10*IN_MILLISECONDS; - } - - void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) - { - if (aurEff->GetEffIndex() == EFFECT_0) - amount = CalculatePct(GetUnitOwner()->ToPlayer()->GetFloatValue(PLAYER_SPELL_CRIT_PERCENTAGE1 + SPELL_SCHOOL_FROST), GetSpellInfo()->Effects[EFFECT_0].CalcValue()); - else - amount = CalculatePct(GetUnitOwner()->ToPlayer()->GetFloatValue(PLAYER_CRIT_PERCENTAGE), GetSpellInfo()->Effects[EFFECT_0].CalcValue()); - } - - void HandleEffectCalcSpellMod(AuraEffect const* aurEff, SpellModifier*& spellMod) - { - if (!spellMod) - { - spellMod = new SpellModifier(aurEff->GetBase()); - spellMod->op = SpellModOp(aurEff->GetMiscValue()); - spellMod->type = SPELLMOD_FLAT; - spellMod->spellId = GetId(); - spellMod->mask = flag96(0x0, 0x2000, 0x0); // Pet Passive - } - - spellMod->value = aurEff->GetAmount(); - } - - void HandlePeriodic(AuraEffect const* aurEff) - { - PreventDefaultAction(); - GetAura()->GetEffect(aurEff->GetEffIndex())->RecalculateAmount(); - } - - void Register() - { - DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_warl_improved_demonic_tactics_AuraScript::CalcPeriodic, EFFECT_ALL, SPELL_AURA_DUMMY); - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warl_improved_demonic_tactics_AuraScript::CalculateAmount, EFFECT_ALL, SPELL_AURA_DUMMY); - DoEffectCalcSpellMod += AuraEffectCalcSpellModFn(spell_warl_improved_demonic_tactics_AuraScript::HandleEffectCalcSpellMod, EFFECT_ALL, SPELL_AURA_DUMMY); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_warl_improved_demonic_tactics_AuraScript::HandlePeriodic, EFFECT_ALL, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_warl_improved_demonic_tactics_AuraScript(); + return GetUnitOwner()->GetTypeId() == TYPEID_PLAYER; } + + void CalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude) + { + isPeriodic = true; + amplitude = 10 * IN_MILLISECONDS; + } + + void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) + { + if (aurEff->GetEffIndex() == EFFECT_0) + amount = CalculatePct(GetUnitOwner()->ToPlayer()->GetFloatValue(PLAYER_SPELL_CRIT_PERCENTAGE1 + SPELL_SCHOOL_FROST), GetSpellInfo()->Effects[EFFECT_0].CalcValue()); + else + amount = CalculatePct(GetUnitOwner()->ToPlayer()->GetFloatValue(PLAYER_CRIT_PERCENTAGE), GetSpellInfo()->Effects[EFFECT_0].CalcValue()); + } + + void HandleEffectCalcSpellMod(AuraEffect const* aurEff, SpellModifier*& spellMod) + { + if (!spellMod) + { + spellMod = new SpellModifier(aurEff->GetBase()); + spellMod->op = SpellModOp(aurEff->GetMiscValue()); + spellMod->type = SPELLMOD_FLAT; + spellMod->spellId = GetId(); + spellMod->mask = flag96(0x0, 0x2000, 0x0); // Pet Passive + } + + spellMod->value = aurEff->GetAmount(); + } + + void HandlePeriodic(AuraEffect const* aurEff) + { + PreventDefaultAction(); + GetAura()->GetEffect(aurEff->GetEffIndex())->RecalculateAmount(); + } + + void Register() + { + DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_warl_improved_demonic_tactics_AuraScript::CalcPeriodic, EFFECT_ALL, SPELL_AURA_DUMMY); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warl_improved_demonic_tactics_AuraScript::CalculateAmount, EFFECT_ALL, SPELL_AURA_DUMMY); + DoEffectCalcSpellMod += AuraEffectCalcSpellModFn(spell_warl_improved_demonic_tactics_AuraScript::HandleEffectCalcSpellMod, EFFECT_ALL, SPELL_AURA_DUMMY); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_warl_improved_demonic_tactics_AuraScript::HandlePeriodic, EFFECT_ALL, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_warl_improved_demonic_tactics_AuraScript(); + } }; class spell_warl_ritual_of_summoning : public SpellScriptLoader { - public: - spell_warl_ritual_of_summoning() : SpellScriptLoader("spell_warl_ritual_of_summoning") { } +public: + spell_warl_ritual_of_summoning() : SpellScriptLoader("spell_warl_ritual_of_summoning") { } - class spell_warl_ritual_of_summoning_SpellScript : public SpellScript + class spell_warl_ritual_of_summoning_SpellScript : public SpellScript + { + PrepareSpellScript(spell_warl_ritual_of_summoning_SpellScript); + + SpellCastResult CheckCast() { - PrepareSpellScript(spell_warl_ritual_of_summoning_SpellScript); - - SpellCastResult CheckCast() - { - if (GetCaster()->GetTypeId() == TYPEID_PLAYER) - if (GetCaster()->ToPlayer()->InBattleground()) - return SPELL_FAILED_NOT_IN_BATTLEGROUND; - return SPELL_CAST_OK; - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_warl_ritual_of_summoning_SpellScript::CheckCast); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_warl_ritual_of_summoning_SpellScript(); + if (GetCaster()->GetTypeId() == TYPEID_PLAYER) + if (GetCaster()->ToPlayer()->InBattleground()) + return SPELL_FAILED_NOT_IN_BATTLEGROUND; + return SPELL_CAST_OK; } + + void Register() + { + OnCheckCast += SpellCheckCastFn(spell_warl_ritual_of_summoning_SpellScript::CheckCast); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_warl_ritual_of_summoning_SpellScript(); + } }; class spell_warl_demonic_aegis : public SpellScriptLoader { - public: - spell_warl_demonic_aegis() : SpellScriptLoader("spell_warl_demonic_aegis") { } +public: + spell_warl_demonic_aegis() : SpellScriptLoader("spell_warl_demonic_aegis") { } - class spell_warl_demonic_aegis_AuraScript : public AuraScript + class spell_warl_demonic_aegis_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warl_demonic_aegis_AuraScript); + + void HandleAuraApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_warl_demonic_aegis_AuraScript); - - void HandleAuraApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - // Remove Fel Armor and Demon Armor - GetTarget()->RemoveAurasWithFamily(SPELLFAMILY_WARLOCK, 0, 0x20000020, 0, 0); - } - - void Register() - { - OnEffectRemove += AuraEffectRemoveFn(spell_warl_demonic_aegis_AuraScript::HandleAuraApply, EFFECT_0, SPELL_AURA_ADD_PCT_MODIFIER, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_warl_demonic_aegis_AuraScript(); + // Remove Fel Armor and Demon Armor + GetTarget()->RemoveAurasWithFamily(SPELLFAMILY_WARLOCK, 0, 0x20000020, 0, 0); } + + void Register() + { + OnEffectRemove += AuraEffectRemoveFn(spell_warl_demonic_aegis_AuraScript::HandleAuraApply, EFFECT_0, SPELL_AURA_ADD_PCT_MODIFIER, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_warl_demonic_aegis_AuraScript(); + } }; class spell_warl_demonic_knowledge : public SpellScriptLoader { - public: - spell_warl_demonic_knowledge() : SpellScriptLoader("spell_warl_demonic_knowledge") { } +public: + spell_warl_demonic_knowledge() : SpellScriptLoader("spell_warl_demonic_knowledge") { } - class spell_warl_demonic_knowledge_AuraScript : public AuraScript + class spell_warl_demonic_knowledge_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warl_demonic_knowledge_AuraScript); + + void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) { - PrepareAuraScript(spell_warl_demonic_knowledge_AuraScript); - - void CalculateAmount(AuraEffect const* aurEff, int32 & amount, bool & /*canBeRecalculated*/) - { - if (Unit* caster = GetCaster()) - amount = CalculatePct(caster->GetStat(STAT_STAMINA)+caster->GetStat(STAT_INTELLECT), aurEff->GetBaseAmount()); - } - - void CalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude) - { - isPeriodic = true; - amplitude = 5*IN_MILLISECONDS; - } - - void HandlePeriodic(AuraEffect const* aurEff) - { - PreventDefaultAction(); - GetEffect(aurEff->GetEffIndex())->RecalculateAmount(); - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warl_demonic_knowledge_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_DAMAGE_DONE); - DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_warl_demonic_knowledge_AuraScript::CalcPeriodic, EFFECT_0, SPELL_AURA_MOD_DAMAGE_DONE); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_warl_demonic_knowledge_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_MOD_DAMAGE_DONE); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_warl_demonic_knowledge_AuraScript(); + if (Unit* caster = GetCaster()) + amount = CalculatePct(caster->GetStat(STAT_STAMINA) + caster->GetStat(STAT_INTELLECT), aurEff->GetBaseAmount()); } + + void CalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude) + { + isPeriodic = true; + amplitude = 5 * IN_MILLISECONDS; + } + + void HandlePeriodic(AuraEffect const* aurEff) + { + PreventDefaultAction(); + GetEffect(aurEff->GetEffIndex())->RecalculateAmount(); + } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warl_demonic_knowledge_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_DAMAGE_DONE); + DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_warl_demonic_knowledge_AuraScript::CalcPeriodic, EFFECT_0, SPELL_AURA_MOD_DAMAGE_DONE); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_warl_demonic_knowledge_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_MOD_DAMAGE_DONE); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_warl_demonic_knowledge_AuraScript(); + } }; class spell_warl_generic_scaling : public SpellScriptLoader { - public: - spell_warl_generic_scaling() : SpellScriptLoader("spell_warl_generic_scaling") { } +public: + spell_warl_generic_scaling() : SpellScriptLoader("spell_warl_generic_scaling") { } - class spell_warl_generic_scaling_AuraScript : public AuraScript + class spell_warl_generic_scaling_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warl_generic_scaling_AuraScript); + + void CalculateResistanceAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) { - PrepareAuraScript(spell_warl_generic_scaling_AuraScript); - - void CalculateResistanceAmount(AuraEffect const* aurEff, int32 & amount, bool & /*canBeRecalculated*/) + // xinef: pet inherits 40% of resistance from owner and 35% of armor + if (Unit* owner = GetUnitOwner()->GetOwner()) { - // xinef: pet inherits 40% of resistance from owner and 35% of armor - if (Unit* owner = GetUnitOwner()->GetOwner()) - { - SpellSchoolMask schoolMask = SpellSchoolMask(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].MiscValue); - int32 modifier = schoolMask == SPELL_SCHOOL_MASK_NORMAL ? 35 : 40; - amount = CalculatePct(std::max(0, owner->GetResistance(schoolMask)), modifier); - } + SpellSchoolMask schoolMask = SpellSchoolMask(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].MiscValue); + int32 modifier = schoolMask == SPELL_SCHOOL_MASK_NORMAL ? 35 : 40; + amount = CalculatePct(std::max(0, owner->GetResistance(schoolMask)), modifier); } + } - void CalculateStatAmount(AuraEffect const* aurEff, int32 & amount, bool & /*canBeRecalculated*/) + void CalculateStatAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) + { + // xinef: by default warlock pet inherits 75% of stamina and 30% of intellect + if (Unit* owner = GetUnitOwner()->GetOwner()) { - // xinef: by default warlock pet inherits 75% of stamina and 30% of intellect - if (Unit* owner = GetUnitOwner()->GetOwner()) - { - Stats stat = Stats(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].MiscValue); - int32 modifier = stat == STAT_STAMINA ? 75 : 30; - amount = CalculatePct(std::max(0, owner->GetStat(stat)), modifier); - } + Stats stat = Stats(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].MiscValue); + int32 modifier = stat == STAT_STAMINA ? 75 : 30; + amount = CalculatePct(std::max(0, owner->GetStat(stat)), modifier); } + } - void CalculateAPAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) + void CalculateAPAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + // xinef: by default warlock pet inherits 57% of max(SP FIRE, SP SHADOW) as AP + if (Unit* owner = GetUnitOwner()->GetOwner()) { - // xinef: by default warlock pet inherits 57% of max(SP FIRE, SP SHADOW) as AP - if (Unit* owner = GetUnitOwner()->GetOwner()) - { - int32 fire = owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_FIRE); - int32 shadow = owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_SHADOW); - int32 maximum = (fire > shadow) ? fire : shadow; - amount = CalculatePct(std::max(0, maximum), 57); - } + int32 fire = owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_FIRE); + int32 shadow = owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_SHADOW); + int32 maximum = (fire > shadow) ? fire : shadow; + amount = CalculatePct(std::max(0, maximum), 57); } + } - void CalculateSPAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) + void CalculateSPAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + // xinef: by default warlock pet inherits 15% of max(SP FIRE, SP SHADOW) as SP + if (Unit* owner = GetUnitOwner()->GetOwner()) { - // xinef: by default warlock pet inherits 15% of max(SP FIRE, SP SHADOW) as SP - if (Unit* owner = GetUnitOwner()->GetOwner()) - { - int32 fire = owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_FIRE); - int32 shadow = owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_SHADOW); - int32 maximum = (fire > shadow) ? fire : shadow; - amount = CalculatePct(std::max(0, maximum), 15); + int32 fire = owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_FIRE); + int32 shadow = owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_SHADOW); + int32 maximum = (fire > shadow) ? fire : shadow; + amount = CalculatePct(std::max(0, maximum), 15); - // xinef: Update appropriate player field - if (owner->GetTypeId() == TYPEID_PLAYER) - owner->SetUInt32Value(PLAYER_PET_SPELL_POWER, (uint32)amount); - } + // xinef: Update appropriate player field + if (owner->GetTypeId() == TYPEID_PLAYER) + owner->SetUInt32Value(PLAYER_PET_SPELL_POWER, (uint32)amount); } + } - void CalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude) + void CalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude) + { + isPeriodic = true; + amplitude = 2 * IN_MILLISECONDS; + } + + void HandlePeriodic(AuraEffect const* aurEff) + { + PreventDefaultAction(); + if (aurEff->GetAuraType() == SPELL_AURA_MOD_STAT && (aurEff->GetMiscValue() == STAT_STAMINA || aurEff->GetMiscValue() == STAT_INTELLECT)) { - isPeriodic = true; - amplitude = 2*IN_MILLISECONDS; - } - - void HandlePeriodic(AuraEffect const* aurEff) - { - PreventDefaultAction(); - if (aurEff->GetAuraType() == SPELL_AURA_MOD_STAT && (aurEff->GetMiscValue() == STAT_STAMINA || aurEff->GetMiscValue() == STAT_INTELLECT)) + int32 currentAmount = aurEff->GetAmount(); + int32 newAmount = GetEffect(aurEff->GetEffIndex())->CalculateAmount(GetCaster()); + if (newAmount != currentAmount) { - int32 currentAmount = aurEff->GetAmount(); - int32 newAmount = GetEffect(aurEff->GetEffIndex())->CalculateAmount(GetCaster()); - if (newAmount != currentAmount) + if (aurEff->GetMiscValue() == STAT_STAMINA) { - if (aurEff->GetMiscValue() == STAT_STAMINA) - { - uint32 actStat = GetUnitOwner()->GetHealth(); - GetEffect(aurEff->GetEffIndex())->ChangeAmount(newAmount, false); - GetUnitOwner()->SetHealth(std::min(GetUnitOwner()->GetMaxHealth(), actStat)); - } - else - { - uint32 actStat = GetUnitOwner()->GetPower(POWER_MANA); - GetEffect(aurEff->GetEffIndex())->ChangeAmount(newAmount, false); - GetUnitOwner()->SetPower(POWER_MANA, std::min(GetUnitOwner()->GetMaxPower(POWER_MANA), actStat)); - } + uint32 actStat = GetUnitOwner()->GetHealth(); + GetEffect(aurEff->GetEffIndex())->ChangeAmount(newAmount, false); + GetUnitOwner()->SetHealth(std::min(GetUnitOwner()->GetMaxHealth(), actStat)); + } + else + { + uint32 actStat = GetUnitOwner()->GetPower(POWER_MANA); + GetEffect(aurEff->GetEffIndex())->ChangeAmount(newAmount, false); + GetUnitOwner()->SetPower(POWER_MANA, std::min(GetUnitOwner()->GetMaxPower(POWER_MANA), actStat)); } } - else - GetEffect(aurEff->GetEffIndex())->RecalculateAmount(); } - - void Register() - { - if (m_scriptSpellId != 34947) - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warl_generic_scaling_AuraScript::CalculateResistanceAmount, EFFECT_ALL, SPELL_AURA_MOD_RESISTANCE); - - if (m_scriptSpellId == 34947 || m_scriptSpellId == 34956) - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warl_generic_scaling_AuraScript::CalculateStatAmount, EFFECT_ALL, SPELL_AURA_MOD_STAT); - - if (m_scriptSpellId == 34947) - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warl_generic_scaling_AuraScript::CalculateAPAmount, EFFECT_ALL, SPELL_AURA_MOD_ATTACK_POWER); - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warl_generic_scaling_AuraScript::CalculateSPAmount, EFFECT_ALL, SPELL_AURA_MOD_DAMAGE_DONE); - } - - DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_warl_generic_scaling_AuraScript::CalcPeriodic, EFFECT_ALL, SPELL_AURA_ANY); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_warl_generic_scaling_AuraScript::HandlePeriodic, EFFECT_ALL, SPELL_AURA_ANY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_warl_generic_scaling_AuraScript(); + else + GetEffect(aurEff->GetEffIndex())->RecalculateAmount(); } + + void Register() + { + if (m_scriptSpellId != 34947) + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warl_generic_scaling_AuraScript::CalculateResistanceAmount, EFFECT_ALL, SPELL_AURA_MOD_RESISTANCE); + + if (m_scriptSpellId == 34947 || m_scriptSpellId == 34956) + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warl_generic_scaling_AuraScript::CalculateStatAmount, EFFECT_ALL, SPELL_AURA_MOD_STAT); + + if (m_scriptSpellId == 34947) + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warl_generic_scaling_AuraScript::CalculateAPAmount, EFFECT_ALL, SPELL_AURA_MOD_ATTACK_POWER); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warl_generic_scaling_AuraScript::CalculateSPAmount, EFFECT_ALL, SPELL_AURA_MOD_DAMAGE_DONE); + } + + DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_warl_generic_scaling_AuraScript::CalcPeriodic, EFFECT_ALL, SPELL_AURA_ANY); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_warl_generic_scaling_AuraScript::HandlePeriodic, EFFECT_ALL, SPELL_AURA_ANY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_warl_generic_scaling_AuraScript(); + } }; class spell_warl_infernal_scaling : public SpellScriptLoader { - public: - spell_warl_infernal_scaling() : SpellScriptLoader("spell_warl_infernal_scaling") { } +public: + spell_warl_infernal_scaling() : SpellScriptLoader("spell_warl_infernal_scaling") { } - class spell_warl_infernal_scaling_AuraScript : public AuraScript + class spell_warl_infernal_scaling_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warl_infernal_scaling_AuraScript); + + void CalculateResistanceAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) { - PrepareAuraScript(spell_warl_infernal_scaling_AuraScript); - - void CalculateResistanceAmount(AuraEffect const* aurEff, int32 & amount, bool & /*canBeRecalculated*/) + // xinef: pet inherits 40% of resistance from owner and 35% of armor + if (Unit* owner = GetUnitOwner()->GetOwner()) { - // xinef: pet inherits 40% of resistance from owner and 35% of armor - if (Unit* owner = GetUnitOwner()->GetOwner()) - { - SpellSchoolMask schoolMask = SpellSchoolMask(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].MiscValue); - int32 modifier = schoolMask == SPELL_SCHOOL_MASK_NORMAL ? 35 : 40; - amount = CalculatePct(std::max(0, owner->GetResistance(schoolMask)), modifier); - } + SpellSchoolMask schoolMask = SpellSchoolMask(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].MiscValue); + int32 modifier = schoolMask == SPELL_SCHOOL_MASK_NORMAL ? 35 : 40; + amount = CalculatePct(std::max(0, owner->GetResistance(schoolMask)), modifier); } - - void CalculateStatAmount(AuraEffect const* aurEff, int32 & amount, bool & /*canBeRecalculated*/) - { - // xinef: by default warlock pet inherits 75% of stamina and 30% of intellect - if (Unit* owner = GetUnitOwner()->GetOwner()) - { - Stats stat = Stats(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].MiscValue); - int32 modifier = stat == STAT_STAMINA ? 75 : 30; - amount = CalculatePct(std::max(0, owner->GetStat(stat)), modifier); - } - } - - void CalculateAPAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - // xinef: by default warlock pet inherits 57% of max(SP FIRE, SP SHADOW) as AP - if (Unit* owner = GetUnitOwner()->GetOwner()) - { - int32 fire = owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_FIRE); - int32 shadow = owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_SHADOW); - int32 maximum = (fire > shadow) ? fire : shadow; - amount = CalculatePct(std::max(0, maximum), 57); - } - } - - void CalculateSPAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - // xinef: by default warlock pet inherits 15% of max(SP FIRE, SP SHADOW) as SP - if (Unit* owner = GetUnitOwner()->GetOwner()) - { - int32 fire = owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_FIRE); - int32 shadow = owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_SHADOW); - int32 maximum = (fire > shadow) ? fire : shadow; - amount = CalculatePct(std::max(0, maximum), 15); - - // xinef: Update appropriate player field - if (owner->GetTypeId() == TYPEID_PLAYER) - owner->SetUInt32Value(PLAYER_PET_SPELL_POWER, (uint32)amount); - } - } - - void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, aurEff->GetAuraType(), true, SPELL_BLOCK_TYPE_POSITIVE); - if (aurEff->GetAuraType() == SPELL_AURA_MOD_ATTACK_POWER) - GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_ATTACK_POWER_PCT, true, SPELL_BLOCK_TYPE_POSITIVE); - else if (aurEff->GetAuraType() == SPELL_AURA_MOD_STAT) - GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, true, SPELL_BLOCK_TYPE_POSITIVE); - } - - void Register() - { - if (m_scriptSpellId != 36186) - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warl_infernal_scaling_AuraScript::CalculateResistanceAmount, EFFECT_ALL, SPELL_AURA_MOD_RESISTANCE); - - if (m_scriptSpellId == 36186 || m_scriptSpellId == 36188) - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warl_infernal_scaling_AuraScript::CalculateStatAmount, EFFECT_ALL, SPELL_AURA_MOD_STAT); - - if (m_scriptSpellId == 36186) - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warl_infernal_scaling_AuraScript::CalculateAPAmount, EFFECT_ALL, SPELL_AURA_MOD_ATTACK_POWER); - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warl_infernal_scaling_AuraScript::CalculateSPAmount, EFFECT_ALL, SPELL_AURA_MOD_DAMAGE_DONE); - } - - OnEffectApply += AuraEffectApplyFn(spell_warl_infernal_scaling_AuraScript::HandleEffectApply, EFFECT_ALL, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_warl_infernal_scaling_AuraScript(); } + + void CalculateStatAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) + { + // xinef: by default warlock pet inherits 75% of stamina and 30% of intellect + if (Unit* owner = GetUnitOwner()->GetOwner()) + { + Stats stat = Stats(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].MiscValue); + int32 modifier = stat == STAT_STAMINA ? 75 : 30; + amount = CalculatePct(std::max(0, owner->GetStat(stat)), modifier); + } + } + + void CalculateAPAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + // xinef: by default warlock pet inherits 57% of max(SP FIRE, SP SHADOW) as AP + if (Unit* owner = GetUnitOwner()->GetOwner()) + { + int32 fire = owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_FIRE); + int32 shadow = owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_SHADOW); + int32 maximum = (fire > shadow) ? fire : shadow; + amount = CalculatePct(std::max(0, maximum), 57); + } + } + + void CalculateSPAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + // xinef: by default warlock pet inherits 15% of max(SP FIRE, SP SHADOW) as SP + if (Unit* owner = GetUnitOwner()->GetOwner()) + { + int32 fire = owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_FIRE); + int32 shadow = owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_SHADOW); + int32 maximum = (fire > shadow) ? fire : shadow; + amount = CalculatePct(std::max(0, maximum), 15); + + // xinef: Update appropriate player field + if (owner->GetTypeId() == TYPEID_PLAYER) + owner->SetUInt32Value(PLAYER_PET_SPELL_POWER, (uint32)amount); + } + } + + void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, aurEff->GetAuraType(), true, SPELL_BLOCK_TYPE_POSITIVE); + if (aurEff->GetAuraType() == SPELL_AURA_MOD_ATTACK_POWER) + GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_ATTACK_POWER_PCT, true, SPELL_BLOCK_TYPE_POSITIVE); + else if (aurEff->GetAuraType() == SPELL_AURA_MOD_STAT) + GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, true, SPELL_BLOCK_TYPE_POSITIVE); + } + + void Register() + { + if (m_scriptSpellId != 36186) + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warl_infernal_scaling_AuraScript::CalculateResistanceAmount, EFFECT_ALL, SPELL_AURA_MOD_RESISTANCE); + + if (m_scriptSpellId == 36186 || m_scriptSpellId == 36188) + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warl_infernal_scaling_AuraScript::CalculateStatAmount, EFFECT_ALL, SPELL_AURA_MOD_STAT); + + if (m_scriptSpellId == 36186) + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warl_infernal_scaling_AuraScript::CalculateAPAmount, EFFECT_ALL, SPELL_AURA_MOD_ATTACK_POWER); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warl_infernal_scaling_AuraScript::CalculateSPAmount, EFFECT_ALL, SPELL_AURA_MOD_DAMAGE_DONE); + } + + OnEffectApply += AuraEffectApplyFn(spell_warl_infernal_scaling_AuraScript::HandleEffectApply, EFFECT_ALL, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_warl_infernal_scaling_AuraScript(); + } }; //Theirs // -710 - Banish class spell_warl_banish : public SpellScriptLoader { - public: - spell_warl_banish() : SpellScriptLoader("spell_warl_banish") { } +public: + spell_warl_banish() : SpellScriptLoader("spell_warl_banish") { } - class spell_warl_banish_SpellScript : public SpellScript + class spell_warl_banish_SpellScript : public SpellScript + { + PrepareSpellScript(spell_warl_banish_SpellScript); + + bool Load() { - PrepareSpellScript(spell_warl_banish_SpellScript); + _removed = false; + return true; + } - bool Load() + void HandleBanish() + { + if (Unit* target = GetHitUnit()) { - _removed = false; - return true; - } - - void HandleBanish() - { - if (Unit* target = GetHitUnit()) + if (target->GetAuraEffect(SPELL_AURA_SCHOOL_IMMUNITY, SPELLFAMILY_WARLOCK, 0, 0x08000000, 0)) { - if (target->GetAuraEffect(SPELL_AURA_SCHOOL_IMMUNITY, SPELLFAMILY_WARLOCK, 0, 0x08000000, 0)) - { - // No need to remove old aura since its removed due to not stack by current Banish aura - PreventHitDefaultEffect(EFFECT_0); - PreventHitDefaultEffect(EFFECT_1); - PreventHitDefaultEffect(EFFECT_2); - _removed = true; - } + // No need to remove old aura since its removed due to not stack by current Banish aura + PreventHitDefaultEffect(EFFECT_0); + PreventHitDefaultEffect(EFFECT_1); + PreventHitDefaultEffect(EFFECT_2); + _removed = true; } } - - void RemoveAura() - { - if (_removed) - PreventHitAura(); - } - - void Register() - { - BeforeHit += SpellHitFn(spell_warl_banish_SpellScript::HandleBanish); - AfterHit += SpellHitFn(spell_warl_banish_SpellScript::RemoveAura); - } - - bool _removed; - }; - - SpellScript* GetSpellScript() const - { - return new spell_warl_banish_SpellScript(); } + + void RemoveAura() + { + if (_removed) + PreventHitAura(); + } + + void Register() + { + BeforeHit += SpellHitFn(spell_warl_banish_SpellScript::HandleBanish); + AfterHit += SpellHitFn(spell_warl_banish_SpellScript::RemoveAura); + } + + bool _removed; + }; + + SpellScript* GetSpellScript() const + { + return new spell_warl_banish_SpellScript(); + } }; // 47193 - Demonic Empowerment class spell_warl_demonic_empowerment : public SpellScriptLoader { - public: - spell_warl_demonic_empowerment() : SpellScriptLoader("spell_warl_demonic_empowerment") { } +public: + spell_warl_demonic_empowerment() : SpellScriptLoader("spell_warl_demonic_empowerment") { } - class spell_warl_demonic_empowerment_SpellScript : public SpellScript + class spell_warl_demonic_empowerment_SpellScript : public SpellScript + { + PrepareSpellScript(spell_warl_demonic_empowerment_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_warl_demonic_empowerment_SpellScript); + if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMONIC_EMPOWERMENT_SUCCUBUS) || !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER) || !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELGUARD) || !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELHUNTER) || !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMONIC_EMPOWERMENT_IMP)) + return false; + return true; + } - bool Validate(SpellInfo const* /*spellInfo*/) + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + if (Creature* targetCreature = GetHitCreature()) { - if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMONIC_EMPOWERMENT_SUCCUBUS) || !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER) || !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELGUARD) || !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELHUNTER) || !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMONIC_EMPOWERMENT_IMP)) - return false; - return true; - } - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) - { - if (Creature* targetCreature = GetHitCreature()) + if (targetCreature->IsPet()) { - if (targetCreature->IsPet()) + CreatureTemplate const* ci = sObjectMgr->GetCreatureTemplate(targetCreature->GetEntry()); + switch (ci->family) { - CreatureTemplate const* ci = sObjectMgr->GetCreatureTemplate(targetCreature->GetEntry()); - switch (ci->family) - { - case CREATURE_FAMILY_SUCCUBUS: - targetCreature->CastSpell(targetCreature, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_SUCCUBUS, true); - break; - case CREATURE_FAMILY_VOIDWALKER: + case CREATURE_FAMILY_SUCCUBUS: + targetCreature->CastSpell(targetCreature, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_SUCCUBUS, true); + break; + case CREATURE_FAMILY_VOIDWALKER: { SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER); int32 hp = int32(targetCreature->CountPctFromMaxHealth(GetCaster()->CalculateSpellDamage(targetCreature, spellInfo, 0))); @@ -630,105 +630,106 @@ class spell_warl_demonic_empowerment : public SpellScriptLoader //unitTarget->CastSpell(unitTarget, 54441, true); break; } - case CREATURE_FAMILY_FELGUARD: - targetCreature->CastSpell(targetCreature, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELGUARD, true); - break; - case CREATURE_FAMILY_FELHUNTER: - targetCreature->CastSpell(targetCreature, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELHUNTER, true); - break; - case CREATURE_FAMILY_IMP: - targetCreature->CastSpell(targetCreature, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_IMP, true); - break; - } + case CREATURE_FAMILY_FELGUARD: + targetCreature->CastSpell(targetCreature, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELGUARD, true); + break; + case CREATURE_FAMILY_FELHUNTER: + targetCreature->CastSpell(targetCreature, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELHUNTER, true); + break; + case CREATURE_FAMILY_IMP: + targetCreature->CastSpell(targetCreature, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_IMP, true); + break; } } } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_warl_demonic_empowerment_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_warl_demonic_empowerment_SpellScript(); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_warl_demonic_empowerment_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_warl_demonic_empowerment_SpellScript(); + } }; // 6201 - Create Healthstone (and ranks) class spell_warl_create_healthstone : public SpellScriptLoader { - public: - spell_warl_create_healthstone() : SpellScriptLoader("spell_warl_create_healthstone") { } +public: + spell_warl_create_healthstone() : SpellScriptLoader("spell_warl_create_healthstone") { } - class spell_warl_create_healthstone_SpellScript : public SpellScript + class spell_warl_create_healthstone_SpellScript : public SpellScript + { + PrepareSpellScript(spell_warl_create_healthstone_SpellScript); + + static uint32 const iTypes[8][3]; + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_warl_create_healthstone_SpellScript); - - static uint32 const iTypes[8][3]; - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_IMPROVED_HEALTHSTONE_R1) || !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_IMPROVED_HEALTHSTONE_R2)) - return false; - return true; - } - - SpellCastResult CheckCast() - { - if (Player* caster = GetCaster()->ToPlayer()) - { - uint8 spellRank = GetSpellInfo()->GetRank(); - ItemPosCountVec dest; - InventoryResult msg = caster->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, iTypes[spellRank - 1][0], 1, nullptr); - if (msg != EQUIP_ERR_OK) - return SPELL_FAILED_TOO_MANY_OF_ITEM; - } - return SPELL_CAST_OK; - } - - void HandleScriptEffect(SpellEffIndex effIndex) - { - if (Unit* unitTarget = GetHitUnit()) - { - uint32 rank = 0; - // Improved Healthstone - if (AuraEffect const* aurEff = unitTarget->GetDummyAuraEffect(SPELLFAMILY_WARLOCK, 284, 0)) - { - switch (aurEff->GetId()) - { - case SPELL_WARLOCK_IMPROVED_HEALTHSTONE_R1: - rank = 1; - break; - case SPELL_WARLOCK_IMPROVED_HEALTHSTONE_R2: - rank = 2; - break; - default: - sLog->outError("Unknown rank of Improved Healthstone id: %d", aurEff->GetId()); - break; - } - } - uint8 spellRank = GetSpellInfo()->GetRank(); - if (spellRank > 0 && spellRank <= 8) - CreateItem(effIndex, iTypes[spellRank - 1][rank]); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_warl_create_healthstone_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - OnCheckCast += SpellCheckCastFn(spell_warl_create_healthstone_SpellScript::CheckCast); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_warl_create_healthstone_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_IMPROVED_HEALTHSTONE_R1) || !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_IMPROVED_HEALTHSTONE_R2)) + return false; + return true; } + + SpellCastResult CheckCast() + { + if (Player* caster = GetCaster()->ToPlayer()) + { + uint8 spellRank = GetSpellInfo()->GetRank(); + ItemPosCountVec dest; + InventoryResult msg = caster->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, iTypes[spellRank - 1][0], 1, nullptr); + if (msg != EQUIP_ERR_OK) + return SPELL_FAILED_TOO_MANY_OF_ITEM; + } + return SPELL_CAST_OK; + } + + void HandleScriptEffect(SpellEffIndex effIndex) + { + if (Unit* unitTarget = GetHitUnit()) + { + uint32 rank = 0; + // Improved Healthstone + if (AuraEffect const* aurEff = unitTarget->GetDummyAuraEffect(SPELLFAMILY_WARLOCK, 284, 0)) + { + switch (aurEff->GetId()) + { + case SPELL_WARLOCK_IMPROVED_HEALTHSTONE_R1: + rank = 1; + break; + case SPELL_WARLOCK_IMPROVED_HEALTHSTONE_R2: + rank = 2; + break; + default: + sLog->outError("Unknown rank of Improved Healthstone id: %d", aurEff->GetId()); + break; + } + } + uint8 spellRank = GetSpellInfo()->GetRank(); + if (spellRank > 0 && spellRank <= 8) + CreateItem(effIndex, iTypes[spellRank - 1][rank]); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_warl_create_healthstone_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + OnCheckCast += SpellCheckCastFn(spell_warl_create_healthstone_SpellScript::CheckCast); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_warl_create_healthstone_SpellScript(); + } }; -uint32 const spell_warl_create_healthstone::spell_warl_create_healthstone_SpellScript::iTypes[8][3] = { +uint32 const spell_warl_create_healthstone::spell_warl_create_healthstone_SpellScript::iTypes[8][3] = +{ { 5512, 19004, 19005}, // Minor Healthstone { 5511, 19006, 19007}, // Lesser Healthstone { 5509, 19008, 19009}, // Healthstone @@ -742,644 +743,644 @@ uint32 const spell_warl_create_healthstone::spell_warl_create_healthstone_SpellS // 47422 - Everlasting Affliction class spell_warl_everlasting_affliction : public SpellScriptLoader { - public: - spell_warl_everlasting_affliction() : SpellScriptLoader("spell_warl_everlasting_affliction") { } +public: + spell_warl_everlasting_affliction() : SpellScriptLoader("spell_warl_everlasting_affliction") { } - class spell_warl_everlasting_affliction_SpellScript : public SpellScript + class spell_warl_everlasting_affliction_SpellScript : public SpellScript + { + PrepareSpellScript(spell_warl_everlasting_affliction_SpellScript); + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_warl_everlasting_affliction_SpellScript); - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) - { - if (Unit* unitTarget = GetHitUnit()) - // Refresh corruption on target - if (AuraEffect* aur = unitTarget->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_WARLOCK, 0x2, 0, 0, GetCaster()->GetGUID())) - { - aur->GetBase()->RefreshTimersWithMods(); - aur->ChangeAmount(aur->CalculateAmount(aur->GetCaster()), false); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_warl_everlasting_affliction_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_warl_everlasting_affliction_SpellScript(); + if (Unit* unitTarget = GetHitUnit()) + // Refresh corruption on target + if (AuraEffect* aur = unitTarget->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_WARLOCK, 0x2, 0, 0, GetCaster()->GetGUID())) + { + aur->GetBase()->RefreshTimersWithMods(); + aur->ChangeAmount(aur->CalculateAmount(aur->GetCaster()), false); + } } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_warl_everlasting_affliction_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_warl_everlasting_affliction_SpellScript(); + } }; // 18541 - Ritual of Doom Effect class spell_warl_ritual_of_doom_effect : public SpellScriptLoader { - public: - spell_warl_ritual_of_doom_effect() : SpellScriptLoader("spell_warl_ritual_of_doom_effect") { } +public: + spell_warl_ritual_of_doom_effect() : SpellScriptLoader("spell_warl_ritual_of_doom_effect") { } - class spell_warl_ritual_of_doom_effect_SpellScript : public SpellScript + class spell_warl_ritual_of_doom_effect_SpellScript : public SpellScript + { + PrepareSpellScript(spell_warl_ritual_of_doom_effect_SpellScript); + + void HandleDummy(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_warl_ritual_of_doom_effect_SpellScript); - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - caster->CastSpell(caster, GetEffectValue(), true); - } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_warl_ritual_of_doom_effect_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_warl_ritual_of_doom_effect_SpellScript(); + Unit* caster = GetCaster(); + caster->CastSpell(caster, GetEffectValue(), true); } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_warl_ritual_of_doom_effect_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_warl_ritual_of_doom_effect_SpellScript(); + } }; // -27285 - Seed of Corruption class spell_warl_seed_of_corruption : public SpellScriptLoader { - public: - spell_warl_seed_of_corruption() : SpellScriptLoader("spell_warl_seed_of_corruption") { } +public: + spell_warl_seed_of_corruption() : SpellScriptLoader("spell_warl_seed_of_corruption") { } - class spell_warl_seed_of_corruption_SpellScript : public SpellScript + class spell_warl_seed_of_corruption_SpellScript : public SpellScript + { + PrepareSpellScript(spell_warl_seed_of_corruption_SpellScript); + + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_warl_seed_of_corruption_SpellScript); - - void FilterTargets(std::list& targets) - { - if (GetExplTargetUnit()) - targets.remove(GetExplTargetUnit()); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_warl_seed_of_corruption_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_warl_seed_of_corruption_SpellScript(); + if (GetExplTargetUnit()) + targets.remove(GetExplTargetUnit()); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_warl_seed_of_corruption_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_warl_seed_of_corruption_SpellScript(); + } }; // 29858 - Soulshatter class spell_warl_soulshatter : public SpellScriptLoader { - public: - spell_warl_soulshatter() : SpellScriptLoader("spell_warl_soulshatter") { } +public: + spell_warl_soulshatter() : SpellScriptLoader("spell_warl_soulshatter") { } - class spell_warl_soulshatter_SpellScript : public SpellScript + class spell_warl_soulshatter_SpellScript : public SpellScript + { + PrepareSpellScript(spell_warl_soulshatter_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_warl_soulshatter_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_SOULSHATTER)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - if (Unit* target = GetHitUnit()) - { - if (target->CanHaveThreatList() && target->getThreatManager().getThreat(caster) > 0.0f) - caster->CastSpell(target, SPELL_WARLOCK_SOULSHATTER, true); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_warl_soulshatter_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_warl_soulshatter_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_SOULSHATTER)) + return false; + return true; } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (Unit* target = GetHitUnit()) + { + if (target->CanHaveThreatList() && target->getThreatManager().getThreat(caster) > 0.0f) + caster->CastSpell(target, SPELL_WARLOCK_SOULSHATTER, true); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_warl_soulshatter_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_warl_soulshatter_SpellScript(); + } }; // 63108 - Siphon Life class spell_warl_siphon_life : public SpellScriptLoader { - public: - spell_warl_siphon_life() : SpellScriptLoader("spell_warl_siphon_life") { } +public: + spell_warl_siphon_life() : SpellScriptLoader("spell_warl_siphon_life") { } - class spell_warl_siphon_life_AuraScript : public AuraScript + class spell_warl_siphon_life_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warl_siphon_life_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_warl_siphon_life_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_SIPHON_LIFE_HEAL)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_GLYPH_OF_SIPHON_LIFE)) - return false; - return true; - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - return eventInfo.GetDamageInfo()->GetDamage() && GetTarget()->IsAlive(); - } - - void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - - int32 amount = int32(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount())); - // Glyph of Siphon Life - if (AuraEffect const* glyph = GetTarget()->GetAuraEffect(SPELL_WARLOCK_GLYPH_OF_SIPHON_LIFE, EFFECT_0)) - AddPct(amount, glyph->GetAmount()); - - GetTarget()->CastCustomSpell(SPELL_WARLOCK_SIPHON_LIFE_HEAL, SPELLVALUE_BASE_POINT0, amount, GetTarget(), true, NULL, aurEff); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_warl_siphon_life_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_warl_siphon_life_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_warl_siphon_life_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_SIPHON_LIFE_HEAL)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_GLYPH_OF_SIPHON_LIFE)) + return false; + return true; } + + bool CheckProc(ProcEventInfo& eventInfo) + { + return eventInfo.GetDamageInfo()->GetDamage() && GetTarget()->IsAlive(); + } + + void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + int32 amount = int32(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount())); + // Glyph of Siphon Life + if (AuraEffect const* glyph = GetTarget()->GetAuraEffect(SPELL_WARLOCK_GLYPH_OF_SIPHON_LIFE, EFFECT_0)) + AddPct(amount, glyph->GetAmount()); + + GetTarget()->CastCustomSpell(SPELL_WARLOCK_SIPHON_LIFE_HEAL, SPELLVALUE_BASE_POINT0, amount, GetTarget(), true, NULL, aurEff); + } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_warl_siphon_life_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_warl_siphon_life_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_warl_siphon_life_AuraScript(); + } }; // -1454 - Life Tap class spell_warl_life_tap : public SpellScriptLoader { - public: - spell_warl_life_tap() : SpellScriptLoader("spell_warl_life_tap") { } +public: + spell_warl_life_tap() : SpellScriptLoader("spell_warl_life_tap") { } - class spell_warl_life_tap_SpellScript : public SpellScript + class spell_warl_life_tap_SpellScript : public SpellScript + { + PrepareSpellScript(spell_warl_life_tap_SpellScript); + + bool Load() { - PrepareSpellScript(spell_warl_life_tap_SpellScript); + return GetCaster()->GetTypeId() == TYPEID_PLAYER; + } - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } + bool Validate(SpellInfo const* /*spell*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_LIFE_TAP_ENERGIZE) || !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_LIFE_TAP_ENERGIZE_2)) + return false; + return true; + } - bool Validate(SpellInfo const* /*spell*/) + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Player* caster = GetCaster()->ToPlayer(); + if (Unit* target = GetHitUnit()) { - if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_LIFE_TAP_ENERGIZE) || !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_LIFE_TAP_ENERGIZE_2)) - return false; - return true; - } + int32 damage = GetEffectValue() + 1.0f + (caster->GetStat(STAT_SPIRIT) * 1.5f); + int32 damage2Mana = GetEffectValue(); + int32 mana = int32(damage2Mana + (caster->GetInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS + SPELL_SCHOOL_SHADOW) * 0.5f)); - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Player* caster = GetCaster()->ToPlayer(); - if (Unit* target = GetHitUnit()) + // Shouldn't Appear in Combat Log + target->ModifyHealth(-damage); + + // Improved Life Tap mod + if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_WARLOCK, WARLOCK_ICON_ID_IMPROVED_LIFE_TAP, 0)) + AddPct(mana, aurEff->GetAmount()); + + caster->CastCustomSpell(target, SPELL_WARLOCK_LIFE_TAP_ENERGIZE, &mana, nullptr, nullptr, false); + + // Mana Feed + int32 manaFeedVal = 0; + if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_WARLOCK, WARLOCK_ICON_ID_MANA_FEED, 0)) + manaFeedVal = aurEff->GetAmount(); + + if (manaFeedVal > 0) { - int32 damage = GetEffectValue() + 1.0f + (caster->GetStat(STAT_SPIRIT) * 1.5f); - int32 damage2Mana = GetEffectValue(); - int32 mana = int32(damage2Mana + (caster->GetInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS+SPELL_SCHOOL_SHADOW) * 0.5f)); - - // Shouldn't Appear in Combat Log - target->ModifyHealth(-damage); - - // Improved Life Tap mod - if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_WARLOCK, WARLOCK_ICON_ID_IMPROVED_LIFE_TAP, 0)) - AddPct(mana, aurEff->GetAmount()); - - caster->CastCustomSpell(target, SPELL_WARLOCK_LIFE_TAP_ENERGIZE, &mana, nullptr, nullptr, false); - - // Mana Feed - int32 manaFeedVal = 0; - if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_WARLOCK, WARLOCK_ICON_ID_MANA_FEED, 0)) - manaFeedVal = aurEff->GetAmount(); - - if (manaFeedVal > 0) - { - ApplyPct(manaFeedVal, mana); - caster->CastCustomSpell(caster, SPELL_WARLOCK_LIFE_TAP_ENERGIZE_2, &manaFeedVal, nullptr, nullptr, true, nullptr); - } + ApplyPct(manaFeedVal, mana); + caster->CastCustomSpell(caster, SPELL_WARLOCK_LIFE_TAP_ENERGIZE_2, &manaFeedVal, nullptr, nullptr, true, nullptr); } } - - SpellCastResult CheckCast() - { - if ((int32(GetCaster()->GetHealth()) > int32(GetSpellInfo()->Effects[EFFECT_0].CalcValue() + (6.3875 * GetSpellInfo()->BaseLevel) + (GetCaster()->GetStat(STAT_SPIRIT) * 1.5f) + 1.0f ))) - return SPELL_CAST_OK; - return SPELL_FAILED_FIZZLE; - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_warl_life_tap_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - OnCheckCast += SpellCheckCastFn(spell_warl_life_tap_SpellScript::CheckCast); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_warl_life_tap_SpellScript(); } + + SpellCastResult CheckCast() + { + if ((int32(GetCaster()->GetHealth()) > int32(GetSpellInfo()->Effects[EFFECT_0].CalcValue() + (6.3875 * GetSpellInfo()->BaseLevel) + (GetCaster()->GetStat(STAT_SPIRIT) * 1.5f) + 1.0f ))) + return SPELL_CAST_OK; + return SPELL_FAILED_FIZZLE; + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_warl_life_tap_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + OnCheckCast += SpellCheckCastFn(spell_warl_life_tap_SpellScript::CheckCast); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_warl_life_tap_SpellScript(); + } }; // 48018 - Demonic Circle: Summon class spell_warl_demonic_circle_summon : public SpellScriptLoader { - public: - spell_warl_demonic_circle_summon() : SpellScriptLoader("spell_warl_demonic_circle_summon") { } +public: + spell_warl_demonic_circle_summon() : SpellScriptLoader("spell_warl_demonic_circle_summon") { } - class spell_warl_demonic_circle_summon_AuraScript : public AuraScript + class spell_warl_demonic_circle_summon_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warl_demonic_circle_summon_AuraScript); + + void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes mode) { - PrepareAuraScript(spell_warl_demonic_circle_summon_AuraScript); + // If effect is removed by expire remove the summoned demonic circle too. + if (!(mode & AURA_EFFECT_HANDLE_REAPPLY)) + GetTarget()->RemoveGameObject(GetId(), true); - void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes mode) - { - // If effect is removed by expire remove the summoned demonic circle too. - if (!(mode & AURA_EFFECT_HANDLE_REAPPLY)) - GetTarget()->RemoveGameObject(GetId(), true); - - GetTarget()->RemoveAura(SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST); - } - - void HandleDummyTick(AuraEffect const* /*aurEff*/) - { - if (GameObject* circle = GetTarget()->GetGameObject(GetId())) - { - // Here we check if player is in demonic circle teleport range, if so add - // WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST; allowing him to cast the WARLOCK_DEMONIC_CIRCLE_TELEPORT. - // If not in range remove the WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST. - - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMONIC_CIRCLE_TELEPORT); - - if (GetTarget()->IsWithinDist(circle, spellInfo->GetMaxRange(true))) - { - if (!GetTarget()->HasAura(SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST)) - GetTarget()->CastSpell(GetTarget(), SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST, true); - } - else - GetTarget()->RemoveAura(SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST); - } - } - - void Register() - { - OnEffectRemove += AuraEffectRemoveFn(spell_warl_demonic_circle_summon_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_warl_demonic_circle_summon_AuraScript::HandleDummyTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_warl_demonic_circle_summon_AuraScript(); + GetTarget()->RemoveAura(SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST); } + + void HandleDummyTick(AuraEffect const* /*aurEff*/) + { + if (GameObject* circle = GetTarget()->GetGameObject(GetId())) + { + // Here we check if player is in demonic circle teleport range, if so add + // WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST; allowing him to cast the WARLOCK_DEMONIC_CIRCLE_TELEPORT. + // If not in range remove the WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST. + + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMONIC_CIRCLE_TELEPORT); + + if (GetTarget()->IsWithinDist(circle, spellInfo->GetMaxRange(true))) + { + if (!GetTarget()->HasAura(SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST)) + GetTarget()->CastSpell(GetTarget(), SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST, true); + } + else + GetTarget()->RemoveAura(SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST); + } + } + + void Register() + { + OnEffectRemove += AuraEffectRemoveFn(spell_warl_demonic_circle_summon_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_warl_demonic_circle_summon_AuraScript::HandleDummyTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_warl_demonic_circle_summon_AuraScript(); + } }; // 48020 - Demonic Circle: Teleport class spell_warl_demonic_circle_teleport : public SpellScriptLoader { - public: - spell_warl_demonic_circle_teleport() : SpellScriptLoader("spell_warl_demonic_circle_teleport") { } +public: + spell_warl_demonic_circle_teleport() : SpellScriptLoader("spell_warl_demonic_circle_teleport") { } - class spell_warl_demonic_circle_teleport_AuraScript : public AuraScript + class spell_warl_demonic_circle_teleport_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warl_demonic_circle_teleport_AuraScript); + + void HandleTeleport(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_warl_demonic_circle_teleport_AuraScript); - - void HandleTeleport(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + if (Player* player = GetTarget()->ToPlayer()) { - if (Player* player = GetTarget()->ToPlayer()) + if (GameObject* circle = player->GetGameObject(SPELL_WARLOCK_DEMONIC_CIRCLE_SUMMON)) { - if (GameObject* circle = player->GetGameObject(SPELL_WARLOCK_DEMONIC_CIRCLE_SUMMON)) - { - player->NearTeleportTo(circle->GetPositionX(), circle->GetPositionY(), circle->GetPositionZ(), circle->GetOrientation(), false, false, false, true); - player->RemoveAurasWithMechanic(1<NearTeleportTo(circle->GetPositionX(), circle->GetPositionY(), circle->GetPositionZ(), circle->GetOrientation(), false, false, false, true); + player->RemoveAurasWithMechanic(1 << MECHANIC_SNARE); } } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_warl_demonic_circle_teleport_AuraScript::HandleTeleport, EFFECT_0, SPELL_AURA_MECHANIC_IMMUNITY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_warl_demonic_circle_teleport_AuraScript(); } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_warl_demonic_circle_teleport_AuraScript::HandleTeleport, EFFECT_0, SPELL_AURA_MECHANIC_IMMUNITY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_warl_demonic_circle_teleport_AuraScript(); + } }; // -47230 - Fel Synergy class spell_warl_fel_synergy : public SpellScriptLoader { - public: - spell_warl_fel_synergy() : SpellScriptLoader("spell_warl_fel_synergy") { } +public: + spell_warl_fel_synergy() : SpellScriptLoader("spell_warl_fel_synergy") { } - class spell_warl_fel_synergy_AuraScript : public AuraScript + class spell_warl_fel_synergy_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warl_fel_synergy_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_warl_fel_synergy_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_FEL_SYNERGY_HEAL)) - return false; - return true; - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - // Xinef: Added charm check - return (GetTarget()->GetGuardianPet() || GetTarget()->GetCharm()) && eventInfo.GetDamageInfo()->GetDamage(); - } - - void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - - int32 heal = CalculatePct(int32(eventInfo.GetDamageInfo()->GetDamage()), aurEff->GetAmount()); - GetTarget()->CastCustomSpell(SPELL_WARLOCK_FEL_SYNERGY_HEAL, SPELLVALUE_BASE_POINT0, heal, (Unit*)NULL, true, NULL, aurEff); // TARGET_UNIT_PET - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_warl_fel_synergy_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_warl_fel_synergy_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_warl_fel_synergy_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_FEL_SYNERGY_HEAL)) + return false; + return true; } + + bool CheckProc(ProcEventInfo& eventInfo) + { + // Xinef: Added charm check + return (GetTarget()->GetGuardianPet() || GetTarget()->GetCharm()) && eventInfo.GetDamageInfo()->GetDamage(); + } + + void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + int32 heal = CalculatePct(int32(eventInfo.GetDamageInfo()->GetDamage()), aurEff->GetAmount()); + GetTarget()->CastCustomSpell(SPELL_WARLOCK_FEL_SYNERGY_HEAL, SPELLVALUE_BASE_POINT0, heal, (Unit*)NULL, true, NULL, aurEff); // TARGET_UNIT_PET + } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_warl_fel_synergy_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_warl_fel_synergy_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_warl_fel_synergy_AuraScript(); + } }; // -48181 - Haunt class spell_warl_haunt : public SpellScriptLoader { - public: - spell_warl_haunt() : SpellScriptLoader("spell_warl_haunt") { } +public: + spell_warl_haunt() : SpellScriptLoader("spell_warl_haunt") { } - class spell_warl_haunt_SpellScript : public SpellScript + class spell_warl_haunt_SpellScript : public SpellScript + { + PrepareSpellScript(spell_warl_haunt_SpellScript); + + void HandleAfterHit() { - PrepareSpellScript(spell_warl_haunt_SpellScript); - - void HandleAfterHit() - { - if (Aura* aura = GetHitAura()) - if (AuraEffect* aurEff = aura->GetEffect(EFFECT_1)) - aurEff->SetAmount(CalculatePct(aurEff->GetAmount(), GetHitDamage())); - } - - void Register() - { - AfterHit += SpellHitFn(spell_warl_haunt_SpellScript::HandleAfterHit); - } - }; - - class spell_warl_haunt_AuraScript : public AuraScript - { - PrepareAuraScript(spell_warl_haunt_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_HAUNT_HEAL)) - return false; - return true; - } - - void HandleRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) - { - int32 amount = aurEff->GetAmount(); - GetTarget()->CastCustomSpell(caster, SPELL_WARLOCK_HAUNT_HEAL, &amount, nullptr, nullptr, true, NULL, aurEff, GetCasterGUID()); - } - } - - void Register() - { - OnEffectRemove += AuraEffectRemoveFn(spell_warl_haunt_AuraScript::HandleRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_warl_haunt_SpellScript(); + if (Aura* aura = GetHitAura()) + if (AuraEffect* aurEff = aura->GetEffect(EFFECT_1)) + aurEff->SetAmount(CalculatePct(aurEff->GetAmount(), GetHitDamage())); } - AuraScript* GetAuraScript() const + void Register() { - return new spell_warl_haunt_AuraScript(); + AfterHit += SpellHitFn(spell_warl_haunt_SpellScript::HandleAfterHit); } + }; + + class spell_warl_haunt_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warl_haunt_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_HAUNT_HEAL)) + return false; + return true; + } + + void HandleRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + if (Unit* caster = GetCaster()) + { + int32 amount = aurEff->GetAmount(); + GetTarget()->CastCustomSpell(caster, SPELL_WARLOCK_HAUNT_HEAL, &amount, nullptr, nullptr, true, NULL, aurEff, GetCasterGUID()); + } + } + + void Register() + { + OnEffectRemove += AuraEffectRemoveFn(spell_warl_haunt_AuraScript::HandleRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_warl_haunt_SpellScript(); + } + + AuraScript* GetAuraScript() const + { + return new spell_warl_haunt_AuraScript(); + } }; // -30108 - Unstable Affliction class spell_warl_unstable_affliction : public SpellScriptLoader { - public: - spell_warl_unstable_affliction() : SpellScriptLoader("spell_warl_unstable_affliction") { } +public: + spell_warl_unstable_affliction() : SpellScriptLoader("spell_warl_unstable_affliction") { } - class spell_warl_unstable_affliction_AuraScript : public AuraScript + class spell_warl_unstable_affliction_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warl_unstable_affliction_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_warl_unstable_affliction_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_UNSTABLE_AFFLICTION_DISPEL)) - return false; - return true; - } - - void HandleDispel(DispelInfo* dispelInfo) - { - if (Unit* caster = GetCaster()) - if (AuraEffect const* aurEff = GetEffect(EFFECT_0)) - { - int32 damage = aurEff->GetBaseAmount(); - damage = aurEff->GetSpellInfo()->Effects[EFFECT_0].CalcValue(caster, &damage, nullptr) * 9; - // backfire damage and silence - caster->CastCustomSpell(dispelInfo->GetDispeller(), SPELL_WARLOCK_UNSTABLE_AFFLICTION_DISPEL, &damage, nullptr, nullptr, true, NULL, aurEff); - } - } - - void Register() - { - AfterDispel += AuraDispelFn(spell_warl_unstable_affliction_AuraScript::HandleDispel); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_warl_unstable_affliction_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_UNSTABLE_AFFLICTION_DISPEL)) + return false; + return true; } + + void HandleDispel(DispelInfo* dispelInfo) + { + if (Unit* caster = GetCaster()) + if (AuraEffect const* aurEff = GetEffect(EFFECT_0)) + { + int32 damage = aurEff->GetBaseAmount(); + damage = aurEff->GetSpellInfo()->Effects[EFFECT_0].CalcValue(caster, &damage, nullptr) * 9; + // backfire damage and silence + caster->CastCustomSpell(dispelInfo->GetDispeller(), SPELL_WARLOCK_UNSTABLE_AFFLICTION_DISPEL, &damage, nullptr, nullptr, true, NULL, aurEff); + } + } + + void Register() + { + AfterDispel += AuraDispelFn(spell_warl_unstable_affliction_AuraScript::HandleDispel); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_warl_unstable_affliction_AuraScript(); + } }; // -603 - Curse of Doom class spell_warl_curse_of_doom : public SpellScriptLoader { - public: - spell_warl_curse_of_doom() : SpellScriptLoader("spell_warl_curse_of_doom") { } +public: + spell_warl_curse_of_doom() : SpellScriptLoader("spell_warl_curse_of_doom") { } - class spell_warl_curse_of_doom_AuraScript : public AuraScript + class spell_warl_curse_of_doom_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warl_curse_of_doom_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_warl_curse_of_doom_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_CURSE_OF_DOOM_EFFECT)) - return false; - return true; - } - - bool Load() - { - return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - if (!GetCaster()) - return; - - AuraRemoveMode removeMode = GetTargetApplication()->GetRemoveMode(); - if (removeMode != AURA_REMOVE_BY_DEATH || !IsExpired()) - return; - - if (GetCaster()->ToPlayer()->isHonorOrXPTarget(GetTarget())) - GetCaster()->CastSpell(GetTarget(), SPELL_WARLOCK_CURSE_OF_DOOM_EFFECT, true, NULL, aurEff); - } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_warl_curse_of_doom_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_warl_curse_of_doom_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_CURSE_OF_DOOM_EFFECT)) + return false; + return true; } + + bool Load() + { + return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER; + } + + void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + if (!GetCaster()) + return; + + AuraRemoveMode removeMode = GetTargetApplication()->GetRemoveMode(); + if (removeMode != AURA_REMOVE_BY_DEATH || !IsExpired()) + return; + + if (GetCaster()->ToPlayer()->isHonorOrXPTarget(GetTarget())) + GetCaster()->CastSpell(GetTarget(), SPELL_WARLOCK_CURSE_OF_DOOM_EFFECT, true, NULL, aurEff); + } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_warl_curse_of_doom_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_warl_curse_of_doom_AuraScript(); + } }; // -755 - Health Funnel class spell_warl_health_funnel : public SpellScriptLoader { - public: - spell_warl_health_funnel() : SpellScriptLoader("spell_warl_health_funnel") { } +public: + spell_warl_health_funnel() : SpellScriptLoader("spell_warl_health_funnel") { } - class spell_warl_health_funnel_AuraScript : public AuraScript + class spell_warl_health_funnel_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warl_health_funnel_AuraScript); + + void ApplyEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_warl_health_funnel_AuraScript); + Unit* caster = GetCaster(); + if (!caster) + return; - void ApplyEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* caster = GetCaster(); - if (!caster) - return; - - Unit* target = GetTarget(); - if (caster->HasAura(SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R2)) - target->CastSpell(target, SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R2, true); - else if (caster->HasAura(SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R1)) - target->CastSpell(target, SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R1, true); - } - - void RemoveEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - target->RemoveAurasDueToSpell(SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R1); - target->RemoveAurasDueToSpell(SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R2); - } - - void Register() - { - OnEffectRemove += AuraEffectRemoveFn(spell_warl_health_funnel_AuraScript::RemoveEffect, EFFECT_0, SPELL_AURA_PERIODIC_HEAL, AURA_EFFECT_HANDLE_REAL); - OnEffectApply += AuraEffectApplyFn(spell_warl_health_funnel_AuraScript::ApplyEffect, EFFECT_0, SPELL_AURA_PERIODIC_HEAL, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_warl_health_funnel_AuraScript(); + Unit* target = GetTarget(); + if (caster->HasAura(SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R2)) + target->CastSpell(target, SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R2, true); + else if (caster->HasAura(SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R1)) + target->CastSpell(target, SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R1, true); } + + void RemoveEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + target->RemoveAurasDueToSpell(SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R1); + target->RemoveAurasDueToSpell(SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R2); + } + + void Register() + { + OnEffectRemove += AuraEffectRemoveFn(spell_warl_health_funnel_AuraScript::RemoveEffect, EFFECT_0, SPELL_AURA_PERIODIC_HEAL, AURA_EFFECT_HANDLE_REAL); + OnEffectApply += AuraEffectApplyFn(spell_warl_health_funnel_AuraScript::ApplyEffect, EFFECT_0, SPELL_AURA_PERIODIC_HEAL, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_warl_health_funnel_AuraScript(); + } }; // -6229 - Shadow Ward class spell_warl_shadow_ward : public SpellScriptLoader { - public: - spell_warl_shadow_ward() : SpellScriptLoader("spell_warl_shadow_ward") { } +public: + spell_warl_shadow_ward() : SpellScriptLoader("spell_warl_shadow_ward") { } - class spell_warl_shadow_ward_AuraScript : public AuraScript + class spell_warl_shadow_ward_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warl_shadow_ward_AuraScript); + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) { - PrepareAuraScript(spell_warl_shadow_ward_AuraScript); - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) + canBeRecalculated = false; + if (Unit* caster = GetCaster()) { - canBeRecalculated = false; - if (Unit* caster = GetCaster()) - { - // +80.68% from sp bonus - float bonus = 0.8068f; + // +80.68% from sp bonus + float bonus = 0.8068f; - bonus *= caster->SpellBaseDamageBonusDone(GetSpellInfo()->GetSchoolMask()); - bonus *= caster->CalculateLevelPenalty(GetSpellInfo()); + bonus *= caster->SpellBaseDamageBonusDone(GetSpellInfo()->GetSchoolMask()); + bonus *= caster->CalculateLevelPenalty(GetSpellInfo()); - amount += int32(bonus); - } + amount += int32(bonus); } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warl_shadow_ward_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_warl_shadow_ward_AuraScript(); } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warl_shadow_ward_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_warl_shadow_ward_AuraScript(); + } }; // 63310 - Glyph of Shadowflame class spell_warl_glyph_of_shadowflame : public SpellScriptLoader { - public: - spell_warl_glyph_of_shadowflame() : SpellScriptLoader("spell_warl_glyph_of_shadowflame") { } +public: + spell_warl_glyph_of_shadowflame() : SpellScriptLoader("spell_warl_glyph_of_shadowflame") { } - class spell_warl_glyph_of_shadowflame_AuraScript : public AuraScript + class spell_warl_glyph_of_shadowflame_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warl_glyph_of_shadowflame_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_warl_glyph_of_shadowflame_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_GLYPH_OF_SHADOWFLAME)) - return false; - return true; - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_WARLOCK_GLYPH_OF_SHADOWFLAME, true, NULL, aurEff); - } - - void Register() - { - OnEffectProc += AuraEffectProcFn(spell_warl_glyph_of_shadowflame_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_warl_glyph_of_shadowflame_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_GLYPH_OF_SHADOWFLAME)) + return false; + return true; } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_WARLOCK_GLYPH_OF_SHADOWFLAME, true, NULL, aurEff); + } + + void Register() + { + OnEffectProc += AuraEffectProcFn(spell_warl_glyph_of_shadowflame_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_warl_glyph_of_shadowflame_AuraScript(); + } }; void AddSC_warlock_spell_scripts() diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp index af3d1ee80..2412df891 100644 --- a/src/server/scripts/Spells/spell_warrior.cpp +++ b/src/server/scripts/Spells/spell_warrior.cpp @@ -67,157 +67,157 @@ enum MiscSpells // Ours class spell_warr_mocking_blow : public SpellScriptLoader { - public: - spell_warr_mocking_blow() : SpellScriptLoader("spell_warr_mocking_blow") { } +public: + spell_warr_mocking_blow() : SpellScriptLoader("spell_warr_mocking_blow") { } - class spell_warr_mocking_blow_SpellScript : public SpellScript + class spell_warr_mocking_blow_SpellScript : public SpellScript + { + PrepareSpellScript(spell_warr_mocking_blow_SpellScript); + + void HandleOnHit() { - PrepareSpellScript(spell_warr_mocking_blow_SpellScript); - - void HandleOnHit() - { - if (Unit* target = GetHitUnit()) - if (target->IsImmunedToSpellEffect(GetSpellInfo(), EFFECT_1)) - SetHitDamage(0); - } - - void Register() - { - OnHit += SpellHitFn(spell_warr_mocking_blow_SpellScript::HandleOnHit); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_warr_mocking_blow_SpellScript(); + if (Unit* target = GetHitUnit()) + if (target->IsImmunedToSpellEffect(GetSpellInfo(), EFFECT_1)) + SetHitDamage(0); } + + void Register() + { + OnHit += SpellHitFn(spell_warr_mocking_blow_SpellScript::HandleOnHit); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_warr_mocking_blow_SpellScript(); + } }; class spell_warr_intervene : public SpellScriptLoader { - public: - spell_warr_intervene() : SpellScriptLoader("spell_warr_intervene") { } +public: + spell_warr_intervene() : SpellScriptLoader("spell_warr_intervene") { } - class spell_warr_intervene_SpellScript : public SpellScript + class spell_warr_intervene_SpellScript : public SpellScript + { + PrepareSpellScript(spell_warr_intervene_SpellScript); + + void HandleApplyAura(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_warr_intervene_SpellScript); - - void HandleApplyAura(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - target->CastSpell((Unit*)NULL, SPELL_WARRIOR_INTERVENE_TRIGGER, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_warr_intervene_SpellScript::HandleApplyAura, EFFECT_1, SPELL_EFFECT_APPLY_AURA); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_warr_intervene_SpellScript(); + if (Unit* target = GetHitUnit()) + target->CastSpell((Unit*)NULL, SPELL_WARRIOR_INTERVENE_TRIGGER, true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_warr_intervene_SpellScript::HandleApplyAura, EFFECT_1, SPELL_EFFECT_APPLY_AURA); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_warr_intervene_SpellScript(); + } }; class spell_warr_improved_spell_reflection : public SpellScriptLoader { - public: - spell_warr_improved_spell_reflection() : SpellScriptLoader("spell_warr_improved_spell_reflection") { } +public: + spell_warr_improved_spell_reflection() : SpellScriptLoader("spell_warr_improved_spell_reflection") { } - class spell_warr_improved_spell_reflection_AuraScript : public AuraScript + class spell_warr_improved_spell_reflection_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warr_improved_spell_reflection_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_warr_improved_spell_reflection_AuraScript); - - bool CheckProc(ProcEventInfo& eventInfo) - { - return eventInfo.GetDamageInfo()->GetSpellInfo() && eventInfo.GetDamageInfo()->GetSpellInfo()->Id == SPELL_WARRIOR_SPELL_REFLECTION; - } - - void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - CustomSpellValues values; - values.AddSpellMod(SPELLVALUE_MAX_TARGETS, aurEff->GetAmount()); - values.AddSpellMod(SPELLVALUE_RADIUS_MOD, 2000); // Base range = 100, final range = 20 value / 10000.0f = 0.2f - eventInfo.GetActor()->CastCustomSpell(SPELL_WARRIOR_IMPROVED_SPELL_REFLECTION_TRIGGER, values, eventInfo.GetActor(), TRIGGERED_FULL_MASK, nullptr); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_warr_improved_spell_reflection_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_warr_improved_spell_reflection_AuraScript::OnProc, EFFECT_1, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_warr_improved_spell_reflection_AuraScript(); + return eventInfo.GetDamageInfo()->GetSpellInfo() && eventInfo.GetDamageInfo()->GetSpellInfo()->Id == SPELL_WARRIOR_SPELL_REFLECTION; } + + void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + CustomSpellValues values; + values.AddSpellMod(SPELLVALUE_MAX_TARGETS, aurEff->GetAmount()); + values.AddSpellMod(SPELLVALUE_RADIUS_MOD, 2000); // Base range = 100, final range = 20 value / 10000.0f = 0.2f + eventInfo.GetActor()->CastCustomSpell(SPELL_WARRIOR_IMPROVED_SPELL_REFLECTION_TRIGGER, values, eventInfo.GetActor(), TRIGGERED_FULL_MASK, nullptr); + } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_warr_improved_spell_reflection_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_warr_improved_spell_reflection_AuraScript::OnProc, EFFECT_1, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_warr_improved_spell_reflection_AuraScript(); + } }; class spell_warr_improved_spell_reflection_trigger : public SpellScriptLoader { - public: - spell_warr_improved_spell_reflection_trigger() : SpellScriptLoader("spell_warr_improved_spell_reflection_trigger") { } +public: + spell_warr_improved_spell_reflection_trigger() : SpellScriptLoader("spell_warr_improved_spell_reflection_trigger") { } - class spell_warr_improved_spell_reflection_trigger_SpellScript : public SpellScript + class spell_warr_improved_spell_reflection_trigger_SpellScript : public SpellScript + { + PrepareSpellScript(spell_warr_improved_spell_reflection_trigger_SpellScript); + + void FilterTargets(std::list& unitList) { - PrepareSpellScript(spell_warr_improved_spell_reflection_trigger_SpellScript); - - void FilterTargets(std::list& unitList) - { - GetCaster()->RemoveAurasDueToSpell(SPELL_WARRIOR_SPELL_REFLECTION); - unitList.sort(acore::ObjectDistanceOrderPred(GetCaster())); - while (unitList.size() > GetSpellValue()->MaxAffectedTargets) - unitList.pop_back(); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_warr_improved_spell_reflection_trigger_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_PARTY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_warr_improved_spell_reflection_trigger_SpellScript(); + GetCaster()->RemoveAurasDueToSpell(SPELL_WARRIOR_SPELL_REFLECTION); + unitList.sort(acore::ObjectDistanceOrderPred(GetCaster())); + while (unitList.size() > GetSpellValue()->MaxAffectedTargets) + unitList.pop_back(); } - class spell_warr_improved_spell_reflection_trigger_AuraScript : public AuraScript + void Register() { - PrepareAuraScript(spell_warr_improved_spell_reflection_trigger_AuraScript); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_warr_improved_spell_reflection_trigger_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_PARTY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_warr_improved_spell_reflection_trigger_SpellScript(); + } + + class spell_warr_improved_spell_reflection_trigger_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warr_improved_spell_reflection_trigger_AuraScript); - void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (!IsExpired()) { - if (!IsExpired()) + // aura remove - remove auras from all party members + std::list PartyMembers; + GetUnitOwner()->GetPartyMembers(PartyMembers); + for (std::list::iterator itr = PartyMembers.begin(); itr != PartyMembers.end(); ++itr) { - // aura remove - remove auras from all party members - std::list PartyMembers; - GetUnitOwner()->GetPartyMembers(PartyMembers); - for (std::list::iterator itr = PartyMembers.begin(); itr != PartyMembers.end(); ++itr) - { - if ((*itr)->GetGUID() != GetOwner()->GetGUID()) - if (Aura* aur = (*itr)->GetAura(59725, GetCasterGUID())) - { - aur->SetDuration(0); - aur->Remove(); - } - } + if ((*itr)->GetGUID() != GetOwner()->GetGUID()) + if (Aura* aur = (*itr)->GetAura(59725, GetCasterGUID())) + { + aur->SetDuration(0); + aur->Remove(); + } } } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_warr_improved_spell_reflection_trigger_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_REFLECT_SPELLS, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_warr_improved_spell_reflection_trigger_AuraScript(); } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_warr_improved_spell_reflection_trigger_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_REFLECT_SPELLS, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_warr_improved_spell_reflection_trigger_AuraScript(); + } }; @@ -225,746 +225,746 @@ class spell_warr_improved_spell_reflection_trigger : public SpellScriptLoader // 12975 - Last Stand class spell_warr_last_stand : public SpellScriptLoader { - public: - spell_warr_last_stand() : SpellScriptLoader("spell_warr_last_stand") { } +public: + spell_warr_last_stand() : SpellScriptLoader("spell_warr_last_stand") { } - class spell_warr_last_stand_SpellScript : public SpellScript + class spell_warr_last_stand_SpellScript : public SpellScript + { + PrepareSpellScript(spell_warr_last_stand_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_warr_last_stand_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_LAST_STAND_TRIGGERED)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - int32 healthModSpellBasePoints0 = int32(caster->CountPctFromMaxHealth(GetEffectValue())); - caster->CastCustomSpell(caster, SPELL_WARRIOR_LAST_STAND_TRIGGERED, &healthModSpellBasePoints0, nullptr, nullptr, true, nullptr); - } - - void Register() - { - OnEffectHit += SpellEffectFn(spell_warr_last_stand_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_warr_last_stand_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_LAST_STAND_TRIGGERED)) + return false; + return true; } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + int32 healthModSpellBasePoints0 = int32(caster->CountPctFromMaxHealth(GetEffectValue())); + caster->CastCustomSpell(caster, SPELL_WARRIOR_LAST_STAND_TRIGGERED, &healthModSpellBasePoints0, nullptr, nullptr, true, nullptr); + } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_warr_last_stand_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_warr_last_stand_SpellScript(); + } }; // -12162 - Deep Wounds class spell_warr_deep_wounds : public SpellScriptLoader { - public: - spell_warr_deep_wounds() : SpellScriptLoader("spell_warr_deep_wounds") { } +public: + spell_warr_deep_wounds() : SpellScriptLoader("spell_warr_deep_wounds") { } - class spell_warr_deep_wounds_SpellScript : public SpellScript + class spell_warr_deep_wounds_SpellScript : public SpellScript + { + PrepareSpellScript(spell_warr_deep_wounds_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_warr_deep_wounds_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_DEEP_WOUNDS_RANK_1) || !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_DEEP_WOUNDS_RANK_2) || !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_DEEP_WOUNDS_RANK_3)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - int32 damage = std::max(GetEffectValue(), 0); - Unit* caster = GetCaster(); - if (Unit* target = GetHitUnit()) - { - // include target dependant auras - damage = target->MeleeDamageBonusTaken(caster, damage, BASE_ATTACK, GetSpellInfo()); - // apply percent damage mods - ApplyPct(damage, 16.0f * GetSpellInfo()->GetRank() / 6.0f); - target->CastDelayedSpellWithPeriodicAmount(caster, SPELL_WARRIOR_DEEP_WOUNDS_RANK_PERIODIC, SPELL_AURA_PERIODIC_DAMAGE, damage, EFFECT_0); - - //caster->CastCustomSpell(target, SPELL_WARRIOR_DEEP_WOUNDS_RANK_PERIODIC, &damage, nullptr, nullptr, true); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_warr_deep_wounds_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_warr_deep_wounds_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_DEEP_WOUNDS_RANK_1) || !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_DEEP_WOUNDS_RANK_2) || !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_DEEP_WOUNDS_RANK_3)) + return false; + return true; } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + int32 damage = std::max(GetEffectValue(), 0); + Unit* caster = GetCaster(); + if (Unit* target = GetHitUnit()) + { + // include target dependant auras + damage = target->MeleeDamageBonusTaken(caster, damage, BASE_ATTACK, GetSpellInfo()); + // apply percent damage mods + ApplyPct(damage, 16.0f * GetSpellInfo()->GetRank() / 6.0f); + target->CastDelayedSpellWithPeriodicAmount(caster, SPELL_WARRIOR_DEEP_WOUNDS_RANK_PERIODIC, SPELL_AURA_PERIODIC_DAMAGE, damage, EFFECT_0); + + //caster->CastCustomSpell(target, SPELL_WARRIOR_DEEP_WOUNDS_RANK_PERIODIC, &damage, nullptr, nullptr, true); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_warr_deep_wounds_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_warr_deep_wounds_SpellScript(); + } }; // -100 - Charge class spell_warr_charge : public SpellScriptLoader { - public: - spell_warr_charge() : SpellScriptLoader("spell_warr_charge") { } +public: + spell_warr_charge() : SpellScriptLoader("spell_warr_charge") { } - class spell_warr_charge_SpellScript : public SpellScript + class spell_warr_charge_SpellScript : public SpellScript + { + PrepareSpellScript(spell_warr_charge_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_warr_charge_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_TALENT) || !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_BUFF) || !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_CHARGE)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - int32 chargeBasePoints0 = GetEffectValue(); - Unit* caster = GetCaster(); - caster->CastCustomSpell(caster, SPELL_WARRIOR_CHARGE, &chargeBasePoints0, nullptr, nullptr, true); - - // Juggernaut crit bonus - if (caster->HasAura(SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_TALENT)) - caster->CastSpell(caster, SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_BUFF, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_warr_charge_SpellScript::HandleDummy, EFFECT_1, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_warr_charge_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_TALENT) || !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_BUFF) || !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_CHARGE)) + return false; + return true; } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + int32 chargeBasePoints0 = GetEffectValue(); + Unit* caster = GetCaster(); + caster->CastCustomSpell(caster, SPELL_WARRIOR_CHARGE, &chargeBasePoints0, nullptr, nullptr, true); + + // Juggernaut crit bonus + if (caster->HasAura(SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_TALENT)) + caster->CastSpell(caster, SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_BUFF, true); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_warr_charge_SpellScript::HandleDummy, EFFECT_1, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_warr_charge_SpellScript(); + } }; // -1464 - Slam class spell_warr_slam : public SpellScriptLoader { - public: - spell_warr_slam() : SpellScriptLoader("spell_warr_slam") { } +public: + spell_warr_slam() : SpellScriptLoader("spell_warr_slam") { } - class spell_warr_slam_SpellScript : public SpellScript + class spell_warr_slam_SpellScript : public SpellScript + { + PrepareSpellScript(spell_warr_slam_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_warr_slam_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_SLAM)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - if (GetHitUnit()) - GetCaster()->CastCustomSpell(SPELL_WARRIOR_SLAM, SPELLVALUE_BASE_POINT0, GetEffectValue(), GetHitUnit(), TRIGGERED_FULL_MASK); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_warr_slam_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_warr_slam_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_SLAM)) + return false; + return true; } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + if (GetHitUnit()) + GetCaster()->CastCustomSpell(SPELL_WARRIOR_SLAM, SPELLVALUE_BASE_POINT0, GetEffectValue(), GetHitUnit(), TRIGGERED_FULL_MASK); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_warr_slam_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_warr_slam_SpellScript(); + } }; // -58872 - Damage Shield class spell_warr_damage_shield : public SpellScriptLoader { - public: - spell_warr_damage_shield() : SpellScriptLoader("spell_warr_damage_shield") { } +public: + spell_warr_damage_shield() : SpellScriptLoader("spell_warr_damage_shield") { } - class spell_warr_damage_shield_AuraScript : public AuraScript + class spell_warr_damage_shield_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warr_damage_shield_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_warr_damage_shield_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_DAMAGE_SHIELD_DAMAGE)) - return false; - return true; - } - - void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - - // % of amount blocked - int32 damage = CalculatePct(int32(GetTarget()->GetShieldBlockValue()), aurEff->GetAmount()); - GetTarget()->CastCustomSpell(SPELL_WARRIOR_DAMAGE_SHIELD_DAMAGE, SPELLVALUE_BASE_POINT0, damage, eventInfo.GetProcTarget(), true, NULL, aurEff); - } - - void Register() - { - OnEffectProc += AuraEffectProcFn(spell_warr_damage_shield_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_warr_damage_shield_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_DAMAGE_SHIELD_DAMAGE)) + return false; + return true; } + + void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + // % of amount blocked + int32 damage = CalculatePct(int32(GetTarget()->GetShieldBlockValue()), aurEff->GetAmount()); + GetTarget()->CastCustomSpell(SPELL_WARRIOR_DAMAGE_SHIELD_DAMAGE, SPELLVALUE_BASE_POINT0, damage, eventInfo.GetProcTarget(), true, NULL, aurEff); + } + + void Register() + { + OnEffectProc += AuraEffectProcFn(spell_warr_damage_shield_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_warr_damage_shield_AuraScript(); + } }; // -5308 - Execute class spell_warr_execute : public SpellScriptLoader { - public: - spell_warr_execute() : SpellScriptLoader("spell_warr_execute") { } +public: + spell_warr_execute() : SpellScriptLoader("spell_warr_execute") { } - class spell_warr_execute_SpellScript : public SpellScript + class spell_warr_execute_SpellScript : public SpellScript + { + PrepareSpellScript(spell_warr_execute_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_warr_execute_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_EXECUTE) || !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_GLYPH_OF_EXECUTION)) - return false; - return true; - } - - void HandleEffect(SpellEffIndex effIndex) - { - Unit* caster = GetCaster(); - if (Unit* target = GetHitUnit()) - { - SpellInfo const* spellInfo = GetSpellInfo(); - int32 rageUsed = std::min(300 - spellInfo->CalcPowerCost(caster, SpellSchoolMask(spellInfo->SchoolMask)), caster->GetPower(POWER_RAGE)); - int32 newRage = std::max(0, caster->GetPower(POWER_RAGE) - rageUsed); - - // Sudden Death rage save - if (AuraEffect* aurEff = caster->GetAuraEffect(SPELL_AURA_PROC_TRIGGER_SPELL, SPELLFAMILY_GENERIC, WARRIOR_ICON_ID_SUDDEN_DEATH, EFFECT_0)) - { - int32 ragesave = aurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue() * 10; - newRage = std::max(newRage, ragesave); - } - - caster->SetPower(POWER_RAGE, uint32(newRage)); - // Glyph of Execution bonus - if (AuraEffect* aurEff = caster->GetAuraEffect(SPELL_WARRIOR_GLYPH_OF_EXECUTION, EFFECT_0)) - rageUsed += aurEff->GetAmount() * 10; - - - int32 bp = GetEffectValue() + int32(rageUsed * spellInfo->Effects[effIndex].DamageMultiplier + caster->GetTotalAttackPowerValue(BASE_ATTACK) * 0.2f); - caster->CastCustomSpell(target, SPELL_WARRIOR_EXECUTE, &bp, nullptr, nullptr, true, nullptr, nullptr, GetOriginalCaster()->GetGUID()); - } - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_warr_execute_SpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_warr_execute_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_EXECUTE) || !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_GLYPH_OF_EXECUTION)) + return false; + return true; } + + void HandleEffect(SpellEffIndex effIndex) + { + Unit* caster = GetCaster(); + if (Unit* target = GetHitUnit()) + { + SpellInfo const* spellInfo = GetSpellInfo(); + int32 rageUsed = std::min(300 - spellInfo->CalcPowerCost(caster, SpellSchoolMask(spellInfo->SchoolMask)), caster->GetPower(POWER_RAGE)); + int32 newRage = std::max(0, caster->GetPower(POWER_RAGE) - rageUsed); + + // Sudden Death rage save + if (AuraEffect* aurEff = caster->GetAuraEffect(SPELL_AURA_PROC_TRIGGER_SPELL, SPELLFAMILY_GENERIC, WARRIOR_ICON_ID_SUDDEN_DEATH, EFFECT_0)) + { + int32 ragesave = aurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue() * 10; + newRage = std::max(newRage, ragesave); + } + + caster->SetPower(POWER_RAGE, uint32(newRage)); + // Glyph of Execution bonus + if (AuraEffect* aurEff = caster->GetAuraEffect(SPELL_WARRIOR_GLYPH_OF_EXECUTION, EFFECT_0)) + rageUsed += aurEff->GetAmount() * 10; + + + int32 bp = GetEffectValue() + int32(rageUsed * spellInfo->Effects[effIndex].DamageMultiplier + caster->GetTotalAttackPowerValue(BASE_ATTACK) * 0.2f); + caster->CastCustomSpell(target, SPELL_WARRIOR_EXECUTE, &bp, nullptr, nullptr, true, nullptr, nullptr, GetOriginalCaster()->GetGUID()); + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_warr_execute_SpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_warr_execute_SpellScript(); + } }; // 12809 - Concussion Blow class spell_warr_concussion_blow : public SpellScriptLoader { - public: - spell_warr_concussion_blow() : SpellScriptLoader("spell_warr_concussion_blow") { } +public: + spell_warr_concussion_blow() : SpellScriptLoader("spell_warr_concussion_blow") { } - class spell_warr_concussion_blow_SpellScript : public SpellScript + class spell_warr_concussion_blow_SpellScript : public SpellScript + { + PrepareSpellScript(spell_warr_concussion_blow_SpellScript); + + void HandleDummy(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_warr_concussion_blow_SpellScript); - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - SetHitDamage(CalculatePct(GetCaster()->GetTotalAttackPowerValue(BASE_ATTACK), GetEffectValue())); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_warr_concussion_blow_SpellScript::HandleDummy, EFFECT_2, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_warr_concussion_blow_SpellScript(); + SetHitDamage(CalculatePct(GetCaster()->GetTotalAttackPowerValue(BASE_ATTACK), GetEffectValue())); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_warr_concussion_blow_SpellScript::HandleDummy, EFFECT_2, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_warr_concussion_blow_SpellScript(); + } }; // 23881 - Bloodthirst class spell_warr_bloodthirst : public SpellScriptLoader { - public: - spell_warr_bloodthirst() : SpellScriptLoader("spell_warr_bloodthirst") { } +public: + spell_warr_bloodthirst() : SpellScriptLoader("spell_warr_bloodthirst") { } - class spell_warr_bloodthirst_SpellScript : public SpellScript + class spell_warr_bloodthirst_SpellScript : public SpellScript + { + PrepareSpellScript(spell_warr_bloodthirst_SpellScript); + + void HandleDamage(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_warr_bloodthirst_SpellScript); + int32 damage = GetEffectValue(); + ApplyPct(damage, GetCaster()->GetTotalAttackPowerValue(BASE_ATTACK)); - void HandleDamage(SpellEffIndex /*effIndex*/) + if (Unit* target = GetHitUnit()) { - int32 damage = GetEffectValue(); - ApplyPct(damage, GetCaster()->GetTotalAttackPowerValue(BASE_ATTACK)); - - if (Unit* target = GetHitUnit()) - { - damage = GetCaster()->SpellDamageBonusDone(target, GetSpellInfo(), uint32(damage), SPELL_DIRECT_DAMAGE); - damage = target->SpellDamageBonusTaken(GetCaster(), GetSpellInfo(), uint32(damage), SPELL_DIRECT_DAMAGE); - } - SetHitDamage(damage); + damage = GetCaster()->SpellDamageBonusDone(target, GetSpellInfo(), uint32(damage), SPELL_DIRECT_DAMAGE); + damage = target->SpellDamageBonusTaken(GetCaster(), GetSpellInfo(), uint32(damage), SPELL_DIRECT_DAMAGE); } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - int32 damage = GetEffectValue(); - GetCaster()->CastCustomSpell(GetCaster(), SPELL_WARRIOR_BLOODTHIRST, &damage, nullptr, nullptr, true, nullptr); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_warr_bloodthirst_SpellScript::HandleDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); - OnEffectHit += SpellEffectFn(spell_warr_bloodthirst_SpellScript::HandleDummy, EFFECT_1, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_warr_bloodthirst_SpellScript(); + SetHitDamage(damage); } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + int32 damage = GetEffectValue(); + GetCaster()->CastCustomSpell(GetCaster(), SPELL_WARRIOR_BLOODTHIRST, &damage, nullptr, nullptr, true, nullptr); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_warr_bloodthirst_SpellScript::HandleDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + OnEffectHit += SpellEffectFn(spell_warr_bloodthirst_SpellScript::HandleDummy, EFFECT_1, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_warr_bloodthirst_SpellScript(); + } }; // 23880 - Bloodthirst (Heal) class spell_warr_bloodthirst_heal : public SpellScriptLoader { - public: - spell_warr_bloodthirst_heal() : SpellScriptLoader("spell_warr_bloodthirst_heal") { } +public: + spell_warr_bloodthirst_heal() : SpellScriptLoader("spell_warr_bloodthirst_heal") { } - class spell_warr_bloodthirst_heal_SpellScript : public SpellScript + class spell_warr_bloodthirst_heal_SpellScript : public SpellScript + { + PrepareSpellScript(spell_warr_bloodthirst_heal_SpellScript); + + void HandleHeal(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_warr_bloodthirst_heal_SpellScript); - - void HandleHeal(SpellEffIndex /*effIndex*/) - { - if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_WARRIOR_BLOODTHIRST_DAMAGE)) - SetHitHeal(GetCaster()->CountPctFromMaxHealth(spellInfo->Effects[EFFECT_1].CalcValue(GetCaster()))); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_warr_bloodthirst_heal_SpellScript::HandleHeal, EFFECT_0, SPELL_EFFECT_HEAL); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_warr_bloodthirst_heal_SpellScript(); + if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_WARRIOR_BLOODTHIRST_DAMAGE)) + SetHitHeal(GetCaster()->CountPctFromMaxHealth(spellInfo->Effects[EFFECT_1].CalcValue(GetCaster()))); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_warr_bloodthirst_heal_SpellScript::HandleHeal, EFFECT_0, SPELL_EFFECT_HEAL); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_warr_bloodthirst_heal_SpellScript(); + } }; // 7384, 7887, 11584, 11585 - Overpower class spell_warr_overpower : public SpellScriptLoader { - public: - spell_warr_overpower() : SpellScriptLoader("spell_warr_overpower") { } +public: + spell_warr_overpower() : SpellScriptLoader("spell_warr_overpower") { } - class spell_warr_overpower_SpellScript : public SpellScript + class spell_warr_overpower_SpellScript : public SpellScript + { + PrepareSpellScript(spell_warr_overpower_SpellScript); + + void HandleEffect(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_warr_overpower_SpellScript); + uint32 spellId = 0; + if (GetCaster()->HasAura(SPELL_WARRIOR_UNRELENTING_ASSAULT_RANK_1)) + spellId = SPELL_WARRIOR_UNRELENTING_ASSAULT_TRIGGER_1; + else if (GetCaster()->HasAura(SPELL_WARRIOR_UNRELENTING_ASSAULT_RANK_2)) + spellId = SPELL_WARRIOR_UNRELENTING_ASSAULT_TRIGGER_2; - void HandleEffect(SpellEffIndex /*effIndex*/) - { - uint32 spellId = 0; - if (GetCaster()->HasAura(SPELL_WARRIOR_UNRELENTING_ASSAULT_RANK_1)) - spellId = SPELL_WARRIOR_UNRELENTING_ASSAULT_TRIGGER_1; - else if (GetCaster()->HasAura(SPELL_WARRIOR_UNRELENTING_ASSAULT_RANK_2)) - spellId = SPELL_WARRIOR_UNRELENTING_ASSAULT_TRIGGER_2; + if (!spellId) + return; - if (!spellId) - return; - - if (Player* target = GetHitPlayer()) - if (target->HasUnitState(UNIT_STATE_CASTING)) - target->CastSpell(target, spellId, true, 0, 0, GetCaster()->GetGUID()); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_warr_overpower_SpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_ANY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_warr_overpower_SpellScript(); + if (Player* target = GetHitPlayer()) + if (target->HasUnitState(UNIT_STATE_CASTING)) + target->CastSpell(target, spellId, true, 0, 0, GetCaster()->GetGUID()); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_warr_overpower_SpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_ANY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_warr_overpower_SpellScript(); + } }; // 5246 - Intimidating Shout class spell_warr_intimidating_shout : public SpellScriptLoader { - public: - spell_warr_intimidating_shout() : SpellScriptLoader("spell_warr_intimidating_shout") { } +public: + spell_warr_intimidating_shout() : SpellScriptLoader("spell_warr_intimidating_shout") { } - class spell_warr_intimidating_shout_SpellScript : public SpellScript + class spell_warr_intimidating_shout_SpellScript : public SpellScript + { + PrepareSpellScript(spell_warr_intimidating_shout_SpellScript); + + void FilterTargets(std::list& unitList) { - PrepareSpellScript(spell_warr_intimidating_shout_SpellScript); - - void FilterTargets(std::list& unitList) - { - unitList.remove(GetExplTargetWorldObject()); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_warr_intimidating_shout_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_warr_intimidating_shout_SpellScript::FilterTargets, EFFECT_2, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_warr_intimidating_shout_SpellScript(); + unitList.remove(GetExplTargetWorldObject()); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_warr_intimidating_shout_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_warr_intimidating_shout_SpellScript::FilterTargets, EFFECT_2, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_warr_intimidating_shout_SpellScript(); + } }; // -772 - Rend class spell_warr_rend : public SpellScriptLoader { - public: - spell_warr_rend() : SpellScriptLoader("spell_warr_rend") { } +public: + spell_warr_rend() : SpellScriptLoader("spell_warr_rend") { } - class spell_warr_rend_AuraScript : public AuraScript + class spell_warr_rend_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warr_rend_AuraScript); + + void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& canBeRecalculated) { - PrepareAuraScript(spell_warr_rend_AuraScript); - - void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& canBeRecalculated) + if (Unit* caster = GetCaster()) { - if (Unit* caster = GetCaster()) + canBeRecalculated = false; + + // $0.2 * (($MWB + $mwb) / 2 + $AP / 14 * $MWS) bonus per tick + float ap = caster->GetTotalAttackPowerValue(BASE_ATTACK); + int32 mws = caster->GetAttackTime(BASE_ATTACK); + float mwbMin = caster->GetWeaponDamageRange(BASE_ATTACK, MINDAMAGE); + float mwbMax = caster->GetWeaponDamageRange(BASE_ATTACK, MAXDAMAGE); + float mwb = ((mwbMin + mwbMax) / 2 + ap * mws / 14000) * 0.2f; + amount += int32(caster->ApplyEffectModifiers(GetSpellInfo(), aurEff->GetEffIndex(), mwb)); + + // "If used while your target is above 75% health, Rend does 35% more damage." + // as for 3.1.3 only ranks above 9 (wrong tooltip?) + if (GetSpellInfo()->GetRank() >= 9) { - canBeRecalculated = false; - - // $0.2 * (($MWB + $mwb) / 2 + $AP / 14 * $MWS) bonus per tick - float ap = caster->GetTotalAttackPowerValue(BASE_ATTACK); - int32 mws = caster->GetAttackTime(BASE_ATTACK); - float mwbMin = caster->GetWeaponDamageRange(BASE_ATTACK, MINDAMAGE); - float mwbMax = caster->GetWeaponDamageRange(BASE_ATTACK, MAXDAMAGE); - float mwb = ((mwbMin + mwbMax) / 2 + ap * mws / 14000) * 0.2f; - amount += int32(caster->ApplyEffectModifiers(GetSpellInfo(), aurEff->GetEffIndex(), mwb)); - - // "If used while your target is above 75% health, Rend does 35% more damage." - // as for 3.1.3 only ranks above 9 (wrong tooltip?) - if (GetSpellInfo()->GetRank() >= 9) - { - if (GetUnitOwner()->HasAuraState(AURA_STATE_HEALTH_ABOVE_75_PERCENT, GetSpellInfo(), caster)) - AddPct(amount, GetSpellInfo()->Effects[EFFECT_2].CalcValue(caster)); - } + if (GetUnitOwner()->HasAuraState(AURA_STATE_HEALTH_ABOVE_75_PERCENT, GetSpellInfo(), caster)) + AddPct(amount, GetSpellInfo()->Effects[EFFECT_2].CalcValue(caster)); } } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warr_rend_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_warr_rend_AuraScript(); } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warr_rend_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_warr_rend_AuraScript(); + } }; // 64380, 65941 - Shattering Throw class spell_warr_shattering_throw : public SpellScriptLoader { - public: - spell_warr_shattering_throw() : SpellScriptLoader("spell_warr_shattering_throw") { } +public: + spell_warr_shattering_throw() : SpellScriptLoader("spell_warr_shattering_throw") { } - class spell_warr_shattering_throw_SpellScript : public SpellScript + class spell_warr_shattering_throw_SpellScript : public SpellScript + { + PrepareSpellScript(spell_warr_shattering_throw_SpellScript); + + void HandleScript(SpellEffIndex effIndex) { - PrepareSpellScript(spell_warr_shattering_throw_SpellScript); + PreventHitDefaultEffect(effIndex); - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - - // remove shields, will still display immune to damage part - if (Unit* target = GetHitUnit()) - target->RemoveAurasWithMechanic(1 << MECHANIC_IMMUNE_SHIELD, AURA_REMOVE_BY_ENEMY_SPELL); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_warr_shattering_throw_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_warr_shattering_throw_SpellScript(); + // remove shields, will still display immune to damage part + if (Unit* target = GetHitUnit()) + target->RemoveAurasWithMechanic(1 << MECHANIC_IMMUNE_SHIELD, AURA_REMOVE_BY_ENEMY_SPELL); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_warr_shattering_throw_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_warr_shattering_throw_SpellScript(); + } }; // 12328, 18765, 35429 - Sweeping Strikes class spell_warr_sweeping_strikes : public SpellScriptLoader { - public: - spell_warr_sweeping_strikes() : SpellScriptLoader("spell_warr_sweeping_strikes") { } +public: + spell_warr_sweeping_strikes() : SpellScriptLoader("spell_warr_sweeping_strikes") { } - class spell_warr_sweeping_strikes_AuraScript : public AuraScript + class spell_warr_sweeping_strikes_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warr_sweeping_strikes_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_warr_sweeping_strikes_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK)) - return false; - return true; - } - - bool Load() - { - _procTarget = nullptr; - return true; - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - _procTarget = eventInfo.GetActor()->SelectNearbyNoTotemTarget(eventInfo.GetProcTarget()); - return _procTarget && !eventInfo.GetDamageInfo()->GetSpellInfo(); - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - int32 damage = eventInfo.GetDamageInfo()->GetDamage(); - GetTarget()->CastCustomSpell(_procTarget, SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK, &damage, 0, 0, true, NULL, aurEff); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_warr_sweeping_strikes_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_warr_sweeping_strikes_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - - private: - Unit* _procTarget; - }; - - AuraScript* GetAuraScript() const - { - return new spell_warr_sweeping_strikes_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK)) + return false; + return true; } + + bool Load() + { + _procTarget = nullptr; + return true; + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + _procTarget = eventInfo.GetActor()->SelectNearbyNoTotemTarget(eventInfo.GetProcTarget()); + return _procTarget && !eventInfo.GetDamageInfo()->GetSpellInfo(); + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + int32 damage = eventInfo.GetDamageInfo()->GetDamage(); + GetTarget()->CastCustomSpell(_procTarget, SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK, &damage, 0, 0, true, NULL, aurEff); + } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_warr_sweeping_strikes_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_warr_sweeping_strikes_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + + private: + Unit* _procTarget; + }; + + AuraScript* GetAuraScript() const + { + return new spell_warr_sweeping_strikes_AuraScript(); + } }; // 50720 - Vigilance class spell_warr_vigilance : public SpellScriptLoader { - public: - spell_warr_vigilance() : SpellScriptLoader("spell_warr_vigilance") { } +public: + spell_warr_vigilance() : SpellScriptLoader("spell_warr_vigilance") { } - class spell_warr_vigilance_AuraScript : public AuraScript + class spell_warr_vigilance_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warr_vigilance_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_warr_vigilance_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_GLYPH_OF_VIGILANCE)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_VIGILANCE_PROC)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_VIGILANCE_REDIRECT_THREAT)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_GEN_DAMAGE_REDUCTION_AURA)) - return false; - return true; - } - - bool Load() - { - _procTarget = nullptr; - return true; - } - - void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - target->CastSpell(target, SPELL_GEN_DAMAGE_REDUCTION_AURA, true); - - if (Unit* caster = GetCaster()) - target->CastSpell(caster, SPELL_WARRIOR_VIGILANCE_REDIRECT_THREAT, true); - } - - void HandleAfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - //! WORKAROUND - //! this glyph is a proc - if (Unit* caster = GetCaster()) - { - if (AuraEffect const* glyph = caster->GetAuraEffect(SPELL_WARRIOR_GLYPH_OF_VIGILANCE, EFFECT_0)) - GetTarget()->ModifyRedirectThreat(glyph->GetAmount()); - } - } - - void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - if (target->HasAura(SPELL_GEN_DAMAGE_REDUCTION_AURA) && - !(target->HasAura(SPELL_PALADIN_BLESSING_OF_SANCTUARY) || - target->HasAura(SPELL_PALADIN_GREATER_BLESSING_OF_SANCTUARY) || - target->HasAura(SPELL_PRIEST_RENEWED_HOPE))) - { - target->RemoveAurasDueToSpell(SPELL_GEN_DAMAGE_REDUCTION_AURA); - } - - target->ResetRedirectThreat(); - } - - bool CheckProc(ProcEventInfo& /*eventInfo*/) - { - _procTarget = GetCaster(); - return _procTarget; - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) - { - PreventDefaultAction(); - GetTarget()->CastSpell(_procTarget, SPELL_WARRIOR_VIGILANCE_PROC, true, NULL, aurEff); - } - - void Register() - { - OnEffectApply += AuraEffectApplyFn(spell_warr_vigilance_AuraScript::HandleApply, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - AfterEffectApply += AuraEffectApplyFn(spell_warr_vigilance_AuraScript::HandleAfterApply, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - OnEffectRemove += AuraEffectRemoveFn(spell_warr_vigilance_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - DoCheckProc += AuraCheckProcFn(spell_warr_vigilance_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_warr_vigilance_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); - } - - private: - Unit* _procTarget; - }; - - AuraScript* GetAuraScript() const - { - return new spell_warr_vigilance_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_GLYPH_OF_VIGILANCE)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_VIGILANCE_PROC)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_VIGILANCE_REDIRECT_THREAT)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_GEN_DAMAGE_REDUCTION_AURA)) + return false; + return true; } + + bool Load() + { + _procTarget = nullptr; + return true; + } + + void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + target->CastSpell(target, SPELL_GEN_DAMAGE_REDUCTION_AURA, true); + + if (Unit* caster = GetCaster()) + target->CastSpell(caster, SPELL_WARRIOR_VIGILANCE_REDIRECT_THREAT, true); + } + + void HandleAfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + //! WORKAROUND + //! this glyph is a proc + if (Unit* caster = GetCaster()) + { + if (AuraEffect const* glyph = caster->GetAuraEffect(SPELL_WARRIOR_GLYPH_OF_VIGILANCE, EFFECT_0)) + GetTarget()->ModifyRedirectThreat(glyph->GetAmount()); + } + } + + void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + if (target->HasAura(SPELL_GEN_DAMAGE_REDUCTION_AURA) && + !(target->HasAura(SPELL_PALADIN_BLESSING_OF_SANCTUARY) || + target->HasAura(SPELL_PALADIN_GREATER_BLESSING_OF_SANCTUARY) || + target->HasAura(SPELL_PRIEST_RENEWED_HOPE))) + { + target->RemoveAurasDueToSpell(SPELL_GEN_DAMAGE_REDUCTION_AURA); + } + + target->ResetRedirectThreat(); + } + + bool CheckProc(ProcEventInfo& /*eventInfo*/) + { + _procTarget = GetCaster(); + return _procTarget; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + GetTarget()->CastSpell(_procTarget, SPELL_WARRIOR_VIGILANCE_PROC, true, NULL, aurEff); + } + + void Register() + { + OnEffectApply += AuraEffectApplyFn(spell_warr_vigilance_AuraScript::HandleApply, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + AfterEffectApply += AuraEffectApplyFn(spell_warr_vigilance_AuraScript::HandleAfterApply, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + OnEffectRemove += AuraEffectRemoveFn(spell_warr_vigilance_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + DoCheckProc += AuraCheckProcFn(spell_warr_vigilance_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_warr_vigilance_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } + + private: + Unit* _procTarget; + }; + + AuraScript* GetAuraScript() const + { + return new spell_warr_vigilance_AuraScript(); + } }; // 50725 - Vigilance class spell_warr_vigilance_trigger : public SpellScriptLoader { - public: - spell_warr_vigilance_trigger() : SpellScriptLoader("spell_warr_vigilance_trigger") { } +public: + spell_warr_vigilance_trigger() : SpellScriptLoader("spell_warr_vigilance_trigger") { } - class spell_warr_vigilance_trigger_SpellScript : public SpellScript + class spell_warr_vigilance_trigger_SpellScript : public SpellScript + { + PrepareSpellScript(spell_warr_vigilance_trigger_SpellScript); + + void HandleScript(SpellEffIndex effIndex) { - PrepareSpellScript(spell_warr_vigilance_trigger_SpellScript); + PreventHitDefaultEffect(effIndex); - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - - // Remove Taunt cooldown - if (Player* target = GetHitPlayer()) - target->RemoveSpellCooldown(SPELL_WARRIOR_TAUNT, true); - } - - void Register() - { - OnEffectHitTarget += SpellEffectFn(spell_warr_vigilance_trigger_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_warr_vigilance_trigger_SpellScript(); + // Remove Taunt cooldown + if (Player* target = GetHitPlayer()) + target->RemoveSpellCooldown(SPELL_WARRIOR_TAUNT, true); } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_warr_vigilance_trigger_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_warr_vigilance_trigger_SpellScript(); + } }; // 58387 - Glyph of Sunder Armor class spell_warr_glyph_of_sunder_armor : public SpellScriptLoader { - public: - spell_warr_glyph_of_sunder_armor() : SpellScriptLoader("spell_warr_glyph_of_sunder_armor") { } +public: + spell_warr_glyph_of_sunder_armor() : SpellScriptLoader("spell_warr_glyph_of_sunder_armor") { } - class spell_warr_glyph_of_sunder_armor_AuraScript : public AuraScript + class spell_warr_glyph_of_sunder_armor_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warr_glyph_of_sunder_armor_AuraScript); + + void HandleEffectCalcSpellMod(AuraEffect const* aurEff, SpellModifier*& spellMod) { - PrepareAuraScript(spell_warr_glyph_of_sunder_armor_AuraScript); - - void HandleEffectCalcSpellMod(AuraEffect const* aurEff, SpellModifier*& spellMod) + if (!spellMod) { - if (!spellMod) - { - spellMod = new SpellModifier(aurEff->GetBase()); - spellMod->op = SpellModOp(aurEff->GetMiscValue()); - spellMod->type = SPELLMOD_FLAT; - spellMod->spellId = GetId(); - spellMod->mask = GetSpellInfo()->Effects[aurEff->GetEffIndex()].SpellClassMask; - } - - spellMod->value = aurEff->GetAmount(); + spellMod = new SpellModifier(aurEff->GetBase()); + spellMod->op = SpellModOp(aurEff->GetMiscValue()); + spellMod->type = SPELLMOD_FLAT; + spellMod->spellId = GetId(); + spellMod->mask = GetSpellInfo()->Effects[aurEff->GetEffIndex()].SpellClassMask; } - void Register() - { - DoEffectCalcSpellMod += AuraEffectCalcSpellModFn(spell_warr_glyph_of_sunder_armor_AuraScript::HandleEffectCalcSpellMod, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_warr_glyph_of_sunder_armor_AuraScript(); + spellMod->value = aurEff->GetAmount(); } + + void Register() + { + DoEffectCalcSpellMod += AuraEffectCalcSpellModFn(spell_warr_glyph_of_sunder_armor_AuraScript::HandleEffectCalcSpellMod, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_warr_glyph_of_sunder_armor_AuraScript(); + } }; // 20230 - Retaliation class spell_warr_retaliation : public SpellScriptLoader { - public: - spell_warr_retaliation() : SpellScriptLoader("spell_warr_retaliation") { } +public: + spell_warr_retaliation() : SpellScriptLoader("spell_warr_retaliation") { } - class spell_warr_retaliation_AuraScript : public AuraScript + class spell_warr_retaliation_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warr_retaliation_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareAuraScript(spell_warr_retaliation_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_RETALIATION_DAMAGE)) - return false; - return true; - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - // check attack comes not from behind and warrior is not stunned - return GetTarget()->isInFront(eventInfo.GetActor(), M_PI) && !GetTarget()->HasUnitState(UNIT_STATE_STUNNED); - } - - void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_WARRIOR_RETALIATION_DAMAGE, true, NULL, aurEff); - } - - void Register() - { - DoCheckProc += AuraCheckProcFn(spell_warr_retaliation_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_warr_retaliation_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_warr_retaliation_AuraScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_RETALIATION_DAMAGE)) + return false; + return true; } + + bool CheckProc(ProcEventInfo& eventInfo) + { + // check attack comes not from behind and warrior is not stunned + return GetTarget()->isInFront(eventInfo.GetActor(), M_PI) && !GetTarget()->HasUnitState(UNIT_STATE_STUNNED); + } + + void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_WARRIOR_RETALIATION_DAMAGE, true, NULL, aurEff); + } + + void Register() + { + DoCheckProc += AuraCheckProcFn(spell_warr_retaliation_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_warr_retaliation_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_warr_retaliation_AuraScript(); + } }; void AddSC_warrior_spell_scripts() diff --git a/src/server/scripts/World/achievement_scripts.cpp b/src/server/scripts/World/achievement_scripts.cpp index 54cec637b..c3fbccdc1 100644 --- a/src/server/scripts/World/achievement_scripts.cpp +++ b/src/server/scripts/World/achievement_scripts.cpp @@ -17,116 +17,116 @@ class achievement_resilient_victory : public AchievementCriteriaScript { - public: - achievement_resilient_victory() : AchievementCriteriaScript("achievement_resilient_victory") { } +public: + achievement_resilient_victory() : AchievementCriteriaScript("achievement_resilient_victory") { } - bool OnCheck(Player* source, Unit* /*target*/) - { - Battleground* bg = source->GetBattleground(); - return bg && bg->GetBgTypeID(true) == BATTLEGROUND_AB && bg->ToBattlegroundAB()->IsTeamScores500Disadvantage(source->GetTeamId()); - } + bool OnCheck(Player* source, Unit* /*target*/) + { + Battleground* bg = source->GetBattleground(); + return bg && bg->GetBgTypeID(true) == BATTLEGROUND_AB && bg->ToBattlegroundAB()->IsTeamScores500Disadvantage(source->GetTeamId()); + } }; class achievement_bg_control_all_nodes : public AchievementCriteriaScript { - public: - achievement_bg_control_all_nodes() : AchievementCriteriaScript("achievement_bg_control_all_nodes") { } +public: + achievement_bg_control_all_nodes() : AchievementCriteriaScript("achievement_bg_control_all_nodes") { } - bool OnCheck(Player* source, Unit* /*target*/) - { - Battleground* bg = source->GetBattleground(); - return bg && bg->AllNodesConrolledByTeam(source->GetTeamId()); - } + bool OnCheck(Player* source, Unit* /*target*/) + { + Battleground* bg = source->GetBattleground(); + return bg && bg->AllNodesConrolledByTeam(source->GetTeamId()); + } }; class achievement_save_the_day : public AchievementCriteriaScript { - public: - achievement_save_the_day() : AchievementCriteriaScript("achievement_save_the_day") { } +public: + achievement_save_the_day() : AchievementCriteriaScript("achievement_save_the_day") { } - bool OnCheck(Player* source, Unit* target) - { - if (!target) - return false; - - if (Player const* player = target->ToPlayer()) - { - Battleground* bg = source->GetBattleground(); - return bg && bg->GetBgTypeID(true) == BATTLEGROUND_WS && bg->ToBattlegroundWS()->GetFlagState(player->GetTeamId()) == BG_WS_FLAG_STATE_ON_BASE; - } + bool OnCheck(Player* source, Unit* target) + { + if (!target) return false; + + if (Player const* player = target->ToPlayer()) + { + Battleground* bg = source->GetBattleground(); + return bg && bg->GetBgTypeID(true) == BATTLEGROUND_WS && bg->ToBattlegroundWS()->GetFlagState(player->GetTeamId()) == BG_WS_FLAG_STATE_ON_BASE; } + return false; + } }; class achievement_bg_ic_resource_glut : public AchievementCriteriaScript { - public: - achievement_bg_ic_resource_glut() : AchievementCriteriaScript("achievement_bg_ic_resource_glut") { } +public: + achievement_bg_ic_resource_glut() : AchievementCriteriaScript("achievement_bg_ic_resource_glut") { } - bool OnCheck(Player* source, Unit* /*target*/) - { - Battleground* bg = source->GetBattleground(); - return bg && bg->GetBgTypeID(true) == BATTLEGROUND_IC && bg->ToBattlegroundIC()->IsResourceGlutAllowed(source->GetTeamId()); - } + bool OnCheck(Player* source, Unit* /*target*/) + { + Battleground* bg = source->GetBattleground(); + return bg && bg->GetBgTypeID(true) == BATTLEGROUND_IC && bg->ToBattlegroundIC()->IsResourceGlutAllowed(source->GetTeamId()); + } }; class achievement_bg_ic_glaive_grave : public AchievementCriteriaScript { - public: - achievement_bg_ic_glaive_grave() : AchievementCriteriaScript("achievement_bg_ic_glaive_grave") { } +public: + achievement_bg_ic_glaive_grave() : AchievementCriteriaScript("achievement_bg_ic_glaive_grave") { } - bool OnCheck(Player* source, Unit* /*target*/) - { - if (Creature* vehicle = source->GetVehicleCreatureBase()) - return vehicle->GetEntry() == NPC_GLAIVE_THROWER_H || vehicle->GetEntry() == NPC_GLAIVE_THROWER_A; + bool OnCheck(Player* source, Unit* /*target*/) + { + if (Creature* vehicle = source->GetVehicleCreatureBase()) + return vehicle->GetEntry() == NPC_GLAIVE_THROWER_H || vehicle->GetEntry() == NPC_GLAIVE_THROWER_A; - return false; - } + return false; + } }; class achievement_bg_ic_mowed_down : public AchievementCriteriaScript { - public: - achievement_bg_ic_mowed_down() : AchievementCriteriaScript("achievement_bg_ic_mowed_down") { } +public: + achievement_bg_ic_mowed_down() : AchievementCriteriaScript("achievement_bg_ic_mowed_down") { } - bool OnCheck(Player* source, Unit* /*target*/) - { - if (Creature* vehicle = source->GetVehicleCreatureBase()) - return vehicle->GetEntry() == NPC_KEEP_CANNON; + bool OnCheck(Player* source, Unit* /*target*/) + { + if (Creature* vehicle = source->GetVehicleCreatureBase()) + return vehicle->GetEntry() == NPC_KEEP_CANNON; - return false; - } + return false; + } }; class achievement_bg_sa_artillery : public AchievementCriteriaScript { - public: - achievement_bg_sa_artillery() : AchievementCriteriaScript("achievement_bg_sa_artillery") { } +public: + achievement_bg_sa_artillery() : AchievementCriteriaScript("achievement_bg_sa_artillery") { } - bool OnCheck(Player* source, Unit* /*target*/) - { - if (Creature* vehicle = source->GetVehicleCreatureBase()) - return vehicle->GetEntry() == NPC_ANTI_PERSONNAL_CANNON; + bool OnCheck(Player* source, Unit* /*target*/) + { + if (Creature* vehicle = source->GetVehicleCreatureBase()) + return vehicle->GetEntry() == NPC_ANTI_PERSONNAL_CANNON; - return false; - } + return false; + } }; class achievement_arena_by_type : public AchievementCriteriaScript { - public: - achievement_arena_by_type(char const* name, uint8 arenaType) : AchievementCriteriaScript(name), - _arenaType(arenaType) - { - } +public: + achievement_arena_by_type(char const* name, uint8 arenaType) : AchievementCriteriaScript(name), + _arenaType(arenaType) + { + } - bool OnCheck(Player* source, Unit* /*target*/) - { - return source->InArena() && source->GetBattleground()->GetArenaType() == _arenaType; - } + bool OnCheck(Player* source, Unit* /*target*/) + { + return source->InArena() && source->GetBattleground()->GetArenaType() == _arenaType; + } - private: - uint8 const _arenaType; +private: + uint8 const _arenaType; }; class achievement_sickly_gazelle : public AchievementCriteriaScript @@ -149,38 +149,38 @@ public: class achievement_everything_counts : public AchievementCriteriaScript { - public: - achievement_everything_counts() : AchievementCriteriaScript("achievement_everything_counts") { } +public: + achievement_everything_counts() : AchievementCriteriaScript("achievement_everything_counts") { } - bool OnCheck(Player* source, Unit* /*target*/) - { - Battleground* bg = source->GetBattleground(); - return bg && bg->GetBgTypeID(true) == BATTLEGROUND_AV && bg->ToBattlegroundAV()->IsBothMinesControlledByTeam(source->GetTeamId()); - } + bool OnCheck(Player* source, Unit* /*target*/) + { + Battleground* bg = source->GetBattleground(); + return bg && bg->GetBgTypeID(true) == BATTLEGROUND_AV && bg->ToBattlegroundAV()->IsBothMinesControlledByTeam(source->GetTeamId()); + } }; class achievement_bg_av_perfection : public AchievementCriteriaScript { - public: - achievement_bg_av_perfection() : AchievementCriteriaScript("achievement_bg_av_perfection") { } +public: + achievement_bg_av_perfection() : AchievementCriteriaScript("achievement_bg_av_perfection") { } - bool OnCheck(Player* source, Unit* /*target*/) - { - Battleground* bg = source->GetBattleground(); - return bg && bg->GetBgTypeID(true) == BATTLEGROUND_AV && bg->ToBattlegroundAV()->IsAllTowersControlledAndCaptainAlive(source->GetTeamId()); - } + bool OnCheck(Player* source, Unit* /*target*/) + { + Battleground* bg = source->GetBattleground(); + return bg && bg->GetBgTypeID(true) == BATTLEGROUND_AV && bg->ToBattlegroundAV()->IsAllTowersControlledAndCaptainAlive(source->GetTeamId()); + } }; class achievement_sa_defense_of_the_ancients : public AchievementCriteriaScript { - public: - achievement_sa_defense_of_the_ancients() : AchievementCriteriaScript("achievement_sa_defense_of_the_ancients") { } +public: + achievement_sa_defense_of_the_ancients() : AchievementCriteriaScript("achievement_sa_defense_of_the_ancients") { } - bool OnCheck(Player* source, Unit* /*target*/) - { - Battleground* bg = source->GetBattleground(); - return bg && bg->GetBgTypeID(true) == BATTLEGROUND_SA && bg->ToBattlegroundSA()->AllowDefenseOfTheAncients(source); - } + bool OnCheck(Player* source, Unit* /*target*/) + { + Battleground* bg = source->GetBattleground(); + return bg && bg->GetBgTypeID(true) == BATTLEGROUND_SA && bg->ToBattlegroundSA()->AllowDefenseOfTheAncients(source); + } }; enum ArgentTournamentAreas @@ -195,50 +195,50 @@ enum ArgentTournamentAreas class achievement_tilted : public AchievementCriteriaScript { - public: - achievement_tilted() : AchievementCriteriaScript("achievement_tilted") {} +public: + achievement_tilted() : AchievementCriteriaScript("achievement_tilted") {} - bool OnCheck(Player* player, Unit* /*target*/) - { - if (!player) - return false; + bool OnCheck(Player* player, Unit* /*target*/) + { + if (!player) + return false; - uint32 areaid = player->GetAreaId(); - bool checkArea = areaid == AREA_ARGENT_TOURNAMENT_FIELDS || - areaid == AREA_RING_OF_ASPIRANTS || - areaid == AREA_RING_OF_ARGENT_VALIANTS || - areaid == AREA_RING_OF_ALLIANCE_VALIANTS || - areaid == AREA_RING_OF_HORDE_VALIANTS || - areaid == AREA_RING_OF_CHAMPIONS; + uint32 areaid = player->GetAreaId(); + bool checkArea = areaid == AREA_ARGENT_TOURNAMENT_FIELDS || + areaid == AREA_RING_OF_ASPIRANTS || + areaid == AREA_RING_OF_ARGENT_VALIANTS || + areaid == AREA_RING_OF_ALLIANCE_VALIANTS || + areaid == AREA_RING_OF_HORDE_VALIANTS || + areaid == AREA_RING_OF_CHAMPIONS; - return checkArea && player->duel && player->duel->isMounted; - } + return checkArea && player->duel && player->duel->isMounted; + } }; class achievement_not_even_a_scratch : public AchievementCriteriaScript { - public: - achievement_not_even_a_scratch() : AchievementCriteriaScript("achievement_not_even_a_scratch") { } +public: + achievement_not_even_a_scratch() : AchievementCriteriaScript("achievement_not_even_a_scratch") { } - bool OnCheck(Player* source, Unit* /*target*/) - { - if (!source) - return false; + bool OnCheck(Player* source, Unit* /*target*/) + { + if (!source) + return false; - Battleground* battleground = source->GetBattleground(); - return battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_SA && battleground->ToBattlegroundSA()->notEvenAScratch(source->GetTeamId()); - } + Battleground* battleground = source->GetBattleground(); + return battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_SA && battleground->ToBattlegroundSA()->notEvenAScratch(source->GetTeamId()); + } }; class achievement_killed_exp_or_honor_target : public AchievementCriteriaScript { - public: - achievement_killed_exp_or_honor_target() : AchievementCriteriaScript("achievement_killed_exp_or_honor_target") { } +public: + achievement_killed_exp_or_honor_target() : AchievementCriteriaScript("achievement_killed_exp_or_honor_target") { } - bool OnCheck(Player* player, Unit* target) - { - return target && player->isHonorOrXPTarget(target); - } + bool OnCheck(Player* player, Unit* target) + { + return target && player->isHonorOrXPTarget(target); + } }; void AddSC_achievement_scripts() diff --git a/src/server/scripts/World/action_ip_logger.cpp b/src/server/scripts/World/action_ip_logger.cpp index ab95c8732..ba5b90ed4 100644 --- a/src/server/scripts/World/action_ip_logger.cpp +++ b/src/server/scripts/World/action_ip_logger.cpp @@ -62,7 +62,7 @@ public: } // Registration Email can NOT be changed apart from GM level users. Thus, we do not require to log them... - // ACCOUNT_CHANGE_EMAIL = 4 + // ACCOUNT_CHANGE_EMAIL = 4 void OnEmailChange(uint32 accountId) override { AccountIPLogAction(accountId, ACCOUNT_CHANGE_EMAIL); // ... they get logged by gm command logger anyway @@ -76,7 +76,7 @@ public: /* It's impossible to log the account logout process out of character selection - shouldn't matter anyway, * as ip doesn't change through playing (obviously).*/ - // ACCOUNT_LOGOUT = 6 + // ACCOUNT_LOGOUT = 6 void AccountIPLogAction(uint32 accountId, IPLoggingTypes aType) { if (!sWorld->getBoolConfig(CONFIG_IP_BASED_ACTION_LOGGING)) @@ -94,32 +94,32 @@ public: // Avoids Magicnumbers in SQL table switch (aType) { - case ACCOUNT_LOGIN: - systemNote = "Logged on Successful AccountLogin"; - break; - case ACCOUNT_FAIL_LOGIN: - systemNote = "Logged on Failed AccountLogin"; - break; - case ACCOUNT_CHANGE_PW: - systemNote = "Logged on Successful Account Password Change"; - break; - case ACCOUNT_CHANGE_PW_FAIL: - systemNote = "Logged on Failed Account Password Change"; - break; - case ACCOUNT_CHANGE_EMAIL: - systemNote = "Logged on Successful Account Email Change"; - break; - case ACCOUNT_CHANGE_EMAIL_FAIL: - systemNote = "Logged on Failed Account Email Change"; - break; + case ACCOUNT_LOGIN: + systemNote = "Logged on Successful AccountLogin"; + break; + case ACCOUNT_FAIL_LOGIN: + systemNote = "Logged on Failed AccountLogin"; + break; + case ACCOUNT_CHANGE_PW: + systemNote = "Logged on Successful Account Password Change"; + break; + case ACCOUNT_CHANGE_PW_FAIL: + systemNote = "Logged on Failed Account Password Change"; + break; + case ACCOUNT_CHANGE_EMAIL: + systemNote = "Logged on Successful Account Email Change"; + break; + case ACCOUNT_CHANGE_EMAIL_FAIL: + systemNote = "Logged on Failed Account Email Change"; + break; /*case ACCOUNT_LOGOUT: systemNote = "Logged on AccountLogout"; //Can not be logged break;*/ - // Neither should happen. Ever. Period. If it does, call Ghostbusters and all your local software defences to investigate. - case UNKNOWN_ACTION: - default: - systemNote = "ERROR! Unknown action!"; - break; + // Neither should happen. Ever. Period. If it does, call Ghostbusters and all your local software defences to investigate. + case UNKNOWN_ACTION: + default: + systemNote = "ERROR! Unknown action!"; + break; } // Once we have done everything, we can insert the new log. @@ -202,26 +202,26 @@ public: // ... with this switch, so that we have a more accurate phrasing of what type it is switch (aType) { - case CHARACTER_CREATE: - systemNote = "Logged on CharacterCreate"; - break; - case CHARACTER_LOGIN: - systemNote = "Logged on CharacterLogin"; - break; - case CHARACTER_LOGOUT: - systemNote = "Logged on CharacterLogout"; - break; - case CHARACTER_DELETE: - systemNote = "Logged on CharacterDelete"; - break; - case CHARACTER_FAILED_DELETE: - systemNote = "Logged on Failed CharacterDelete"; - break; + case CHARACTER_CREATE: + systemNote = "Logged on CharacterCreate"; + break; + case CHARACTER_LOGIN: + systemNote = "Logged on CharacterLogin"; + break; + case CHARACTER_LOGOUT: + systemNote = "Logged on CharacterLogout"; + break; + case CHARACTER_DELETE: + systemNote = "Logged on CharacterDelete"; + break; + case CHARACTER_FAILED_DELETE: + systemNote = "Logged on Failed CharacterDelete"; + break; // Neither should happen. Ever. Period. If it does, call Mythbusters. - case UNKNOWN_ACTION: - default: - systemNote = "ERROR! Unknown action!"; - break; + case UNKNOWN_ACTION: + default: + systemNote = "ERROR! Unknown action!"; + break; } // Once we have done everything, we can insert the new log. @@ -274,17 +274,17 @@ public: // Avoids Magicnumbers in SQL table switch (aType) { - case CHARACTER_DELETE: - systemNote = "Logged on CharacterDelete"; - break; - case CHARACTER_FAILED_DELETE: - systemNote = "Logged on Failed CharacterDelete"; - break; + case CHARACTER_DELETE: + systemNote = "Logged on CharacterDelete"; + break; + case CHARACTER_FAILED_DELETE: + systemNote = "Logged on Failed CharacterDelete"; + break; // Neither should happen. Ever. Period. If it does, call to whatever god you have for mercy and guidance. - case UNKNOWN_ACTION: - default: - systemNote = "ERROR! Unknown action!"; - break; + case UNKNOWN_ACTION: + default: + systemNote = "ERROR! Unknown action!"; + break; } // Once we have done everything, we can insert the new log. diff --git a/src/server/scripts/World/areatrigger_scripts.cpp b/src/server/scripts/World/areatrigger_scripts.cpp index 8a736d40c..1f065b389 100644 --- a/src/server/scripts/World/areatrigger_scripts.cpp +++ b/src/server/scripts/World/areatrigger_scripts.cpp @@ -31,24 +31,24 @@ EndContentData */ // Ours class AreaTrigger_at_voltarus_middle : public AreaTriggerScript { - public: +public: - AreaTrigger_at_voltarus_middle() - : AreaTriggerScript("at_voltarus_middle") - { - } + AreaTrigger_at_voltarus_middle() + : AreaTriggerScript("at_voltarus_middle") + { + } - bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/) - { - if (player->IsAlive() && !player->IsInCombat()) - if (player->HasItemCount(39319)) // Scepter of Domination - { - player->TeleportTo(571, 6242.67f, -1972.10f, 484.783f, 0.6f); - return true; - } + bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/) + { + if (player->IsAlive() && !player->IsInCombat()) + if (player->HasItemCount(39319)) // Scepter of Domination + { + player->TeleportTo(571, 6242.67f, -1972.10f, 484.783f, 0.6f); + return true; + } - return false; - } + return false; + } }; @@ -64,21 +64,21 @@ enum CoilfangGOs class AreaTrigger_at_coilfang_waterfall : public AreaTriggerScript { - public: +public: - AreaTrigger_at_coilfang_waterfall() - : AreaTriggerScript("at_coilfang_waterfall") - { - } + AreaTrigger_at_coilfang_waterfall() + : AreaTriggerScript("at_coilfang_waterfall") + { + } - bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/) - { - if (GameObject* go = GetClosestGameObjectWithEntry(player, GO_COILFANG_WATERFALL, 35.0f)) - if (go->getLootState() == GO_READY) - go->UseDoorOrButton(); + bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/) + { + if (GameObject* go = GetClosestGameObjectWithEntry(player, GO_COILFANG_WATERFALL, 35.0f)) + if (go->getLootState() == GO_READY) + go->UseDoorOrButton(); - return false; - } + return false; + } }; /*##### @@ -96,33 +96,33 @@ enum LegionTeleporter class AreaTrigger_at_legion_teleporter : public AreaTriggerScript { - public: +public: - AreaTrigger_at_legion_teleporter() - : AreaTriggerScript("at_legion_teleporter") - { - } + AreaTrigger_at_legion_teleporter() + : AreaTriggerScript("at_legion_teleporter") + { + } - bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/) + bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/) + { + if (player->IsAlive() && !player->IsInCombat()) { - if (player->IsAlive() && !player->IsInCombat()) + if (player->GetTeamId() == TEAM_ALLIANCE && player->GetQuestRewardStatus(QUEST_GAINING_ACCESS_A)) { - if (player->GetTeamId() == TEAM_ALLIANCE && player->GetQuestRewardStatus(QUEST_GAINING_ACCESS_A)) - { - player->CastSpell(player, SPELL_TELE_A_TO, false); - return true; - } - - if (player->GetTeamId() == TEAM_HORDE && player->GetQuestRewardStatus(QUEST_GAINING_ACCESS_H)) - { - player->CastSpell(player, SPELL_TELE_H_TO, false); - return true; - } - - return false; + player->CastSpell(player, SPELL_TELE_A_TO, false); + return true; } + + if (player->GetTeamId() == TEAM_HORDE && player->GetQuestRewardStatus(QUEST_GAINING_ACCESS_H)) + { + player->CastSpell(player, SPELL_TELE_H_TO, false); + return true; + } + return false; } + return false; + } }; /*###### @@ -138,20 +138,20 @@ enum StormwrightShelf class AreaTrigger_at_stormwright_shelf : public AreaTriggerScript { - public: +public: - AreaTrigger_at_stormwright_shelf() - : AreaTriggerScript("at_stormwright_shelf") - { - } + AreaTrigger_at_stormwright_shelf() + : AreaTriggerScript("at_stormwright_shelf") + { + } - bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/) - { - if (!player->isDead() && player->GetQuestStatus(QUEST_STRENGTH_OF_THE_TEMPEST) == QUEST_STATUS_INCOMPLETE) - player->CastSpell(player, SPELL_CREATE_TRUE_POWER_OF_THE_TEMPEST, false); + bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/) + { + if (!player->isDead() && player->GetQuestStatus(QUEST_STRENGTH_OF_THE_TEMPEST) == QUEST_STATUS_INCOMPLETE) + player->CastSpell(player, SPELL_CREATE_TRUE_POWER_OF_THE_TEMPEST, false); - return true; - } + return true; + } }; /*###### @@ -166,23 +166,23 @@ enum ScentLarkorwi class AreaTrigger_at_scent_larkorwi : public AreaTriggerScript { - public: +public: - AreaTrigger_at_scent_larkorwi() - : AreaTriggerScript("at_scent_larkorwi") + AreaTrigger_at_scent_larkorwi() + : AreaTriggerScript("at_scent_larkorwi") + { + } + + bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/) + { + if (!player->isDead() && player->GetQuestStatus(QUEST_SCENT_OF_LARKORWI) == QUEST_STATUS_INCOMPLETE) { + if (!player->FindNearestCreature(NPC_LARKORWI_MATE, 15)) + player->SummonCreature(NPC_LARKORWI_MATE, player->GetPositionX() + 5, player->GetPositionY(), player->GetPositionZ(), 3.3f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 100000); } - bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/) - { - if (!player->isDead() && player->GetQuestStatus(QUEST_SCENT_OF_LARKORWI) == QUEST_STATUS_INCOMPLETE) - { - if (!player->FindNearestCreature(NPC_LARKORWI_MATE, 15)) - player->SummonCreature(NPC_LARKORWI_MATE, player->GetPositionX()+5, player->GetPositionY(), player->GetPositionZ(), 3.3f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 100000); - } - - return false; - } + return false; + } }; /*##### @@ -197,47 +197,47 @@ enum AtLastRites class AreaTrigger_at_last_rites : public AreaTriggerScript { - public: +public: - AreaTrigger_at_last_rites() - : AreaTriggerScript("at_last_rites") - { - } - - bool OnTrigger(Player* player, AreaTrigger const* trigger) - { - QuestStatus QLR = player->GetQuestStatus(QUEST_LAST_RITES); - QuestStatus QBT = player->GetQuestStatus(QUEST_BREAKING_THROUGH); - if (!(QLR == QUEST_STATUS_INCOMPLETE || QLR == QUEST_STATUS_COMPLETE || - QBT == QUEST_STATUS_INCOMPLETE || QBT == QUEST_STATUS_COMPLETE)) - return false; - - WorldLocation pPosition; - - switch (trigger->entry) - { - case 5332: - case 5338: - case 5339: - pPosition = WorldLocation(571, 3733.68f, 3563.25f, 290.812f, 3.665192f); - break; - case 5334: - pPosition = WorldLocation(571, 3802.38f, 3585.95f, 49.5765f, 0.0f); - break; - case 5340: - if (QBT == QUEST_STATUS_INCOMPLETE) - pPosition = WorldLocation(571, 3758, 3562, 345.51f, 0.0f); - else - pPosition = WorldLocation(571, 3687.91f, 3577.28f, 473.342f, 0.0f); - break; - default: - return false; - } - - player->TeleportTo(pPosition); + AreaTrigger_at_last_rites() + : AreaTriggerScript("at_last_rites") + { + } + bool OnTrigger(Player* player, AreaTrigger const* trigger) + { + QuestStatus QLR = player->GetQuestStatus(QUEST_LAST_RITES); + QuestStatus QBT = player->GetQuestStatus(QUEST_BREAKING_THROUGH); + if (!(QLR == QUEST_STATUS_INCOMPLETE || QLR == QUEST_STATUS_COMPLETE || + QBT == QUEST_STATUS_INCOMPLETE || QBT == QUEST_STATUS_COMPLETE)) return false; + + WorldLocation pPosition; + + switch (trigger->entry) + { + case 5332: + case 5338: + case 5339: + pPosition = WorldLocation(571, 3733.68f, 3563.25f, 290.812f, 3.665192f); + break; + case 5334: + pPosition = WorldLocation(571, 3802.38f, 3585.95f, 49.5765f, 0.0f); + break; + case 5340: + if (QBT == QUEST_STATUS_INCOMPLETE) + pPosition = WorldLocation(571, 3758, 3562, 345.51f, 0.0f); + else + pPosition = WorldLocation(571, 3687.91f, 3577.28f, 473.342f, 0.0f); + break; + default: + return false; } + + player->TeleportTo(pPosition); + + return false; + } }; /*###### @@ -259,29 +259,29 @@ enum Waygate class AreaTrigger_at_sholazar_waygate : public AreaTriggerScript { - public: +public: - AreaTrigger_at_sholazar_waygate() : AreaTriggerScript("at_sholazar_waygate") { } + AreaTrigger_at_sholazar_waygate() : AreaTriggerScript("at_sholazar_waygate") { } - bool OnTrigger(Player* player, AreaTrigger const* trigger) + bool OnTrigger(Player* player, AreaTrigger const* trigger) + { + if (!player->isDead() && (player->GetQuestStatus(QUEST_MEETING_A_GREAT_ONE) != QUEST_STATUS_NONE || + (player->GetQuestStatus(QUEST_THE_MAKERS_OVERLOOK) == QUEST_STATUS_REWARDED && player->GetQuestStatus(QUEST_THE_MAKERS_PERCH) == QUEST_STATUS_REWARDED))) { - if (!player->isDead() && (player->GetQuestStatus(QUEST_MEETING_A_GREAT_ONE) != QUEST_STATUS_NONE || - (player->GetQuestStatus(QUEST_THE_MAKERS_OVERLOOK) == QUEST_STATUS_REWARDED && player->GetQuestStatus(QUEST_THE_MAKERS_PERCH) == QUEST_STATUS_REWARDED))) + switch (trigger->entry) { - switch (trigger->entry) - { - case AT_SHOLAZAR: - player->CastSpell(player, SPELL_SHOLAZAR_TO_UNGORO_TELEPORT, true); - break; + case AT_SHOLAZAR: + player->CastSpell(player, SPELL_SHOLAZAR_TO_UNGORO_TELEPORT, true); + break; - case AT_UNGORO: - player->CastSpell(player, SPELL_UNGORO_TO_SHOLAZAR_TELEPORT, true); - break; - } + case AT_UNGORO: + player->CastSpell(player, SPELL_UNGORO_TO_SHOLAZAR_TELEPORT, true); + break; } - - return false; } + + return false; + } }; /*###### @@ -297,26 +297,26 @@ enum NatsLanding class AreaTrigger_at_nats_landing : public AreaTriggerScript { - public: - AreaTrigger_at_nats_landing() : AreaTriggerScript("at_nats_landing") { } +public: + AreaTrigger_at_nats_landing() : AreaTriggerScript("at_nats_landing") { } - bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/) + bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/) + { + if (!player->IsAlive() || !player->HasAura(SPELL_FISH_PASTE)) + return false; + + if (player->GetQuestStatus(QUEST_NATS_BARGAIN) == QUEST_STATUS_INCOMPLETE) { - if (!player->IsAlive() || !player->HasAura(SPELL_FISH_PASTE)) - return false; - - if (player->GetQuestStatus(QUEST_NATS_BARGAIN) == QUEST_STATUS_INCOMPLETE) + if (!player->FindNearestCreature(NPC_LURKING_SHARK, 20.0f)) { - if (!player->FindNearestCreature(NPC_LURKING_SHARK, 20.0f)) - { - if (Creature* shark = player->SummonCreature(NPC_LURKING_SHARK, -4246.243f, -3922.356f, -7.488f, 5.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 100000)) - shark->AI()->AttackStart(player); + if (Creature* shark = player->SummonCreature(NPC_LURKING_SHARK, -4246.243f, -3922.356f, -7.488f, 5.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 100000)) + shark->AI()->AttackStart(player); - return false; - } + return false; } - return true; } + return true; + } }; /*###### @@ -332,23 +332,23 @@ enum SentryPoint class AreaTrigger_at_sentry_point : public AreaTriggerScript { - public: - AreaTrigger_at_sentry_point() : AreaTriggerScript("at_sentry_point") { } +public: + AreaTrigger_at_sentry_point() : AreaTriggerScript("at_sentry_point") { } - bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/) + bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/) + { + auto quest_status = player->GetQuestStatus(QUEST_MISSING_DIPLO_PT14); + if (!player->IsAlive() || quest_status == QUEST_STATUS_NONE || quest_status == QUEST_STATUS_REWARDED) + return false; + + if (!player->FindNearestCreature(NPC_TERVOSH, 100.0f)) { - auto quest_status = player->GetQuestStatus(QUEST_MISSING_DIPLO_PT14); - if (!player->IsAlive() || quest_status == QUEST_STATUS_NONE || quest_status == QUEST_STATUS_REWARDED) - return false; - - if (!player->FindNearestCreature(NPC_TERVOSH, 100.0f)) - { - if(Creature* tervosh = player->SummonCreature(NPC_TERVOSH, -3476.51f, -4105.94f, 17.1f, 5.3816f, TEMPSUMMON_TIMED_DESPAWN, 60000)) - tervosh->CastSpell(tervosh, SPELL_TELEPORT_VISUAL, true); - } - - return true; + if(Creature* tervosh = player->SummonCreature(NPC_TERVOSH, -3476.51f, -4105.94f, 17.1f, 5.3816f, TEMPSUMMON_TIMED_DESPAWN, 60000)) + tervosh->CastSpell(tervosh, SPELL_TELEPORT_VISUAL, true); } + + return true; + } }; @@ -371,40 +371,40 @@ enum Brewfest class AreaTrigger_at_brewfest : public AreaTriggerScript { - public: - AreaTrigger_at_brewfest() : AreaTriggerScript("at_brewfest") - { - // Initialize for cooldown - _triggerTimes[AT_BREWFEST_DUROTAR] = _triggerTimes[AT_BREWFEST_DUN_MOROGH] = 0; - } +public: + AreaTrigger_at_brewfest() : AreaTriggerScript("at_brewfest") + { + // Initialize for cooldown + _triggerTimes[AT_BREWFEST_DUROTAR] = _triggerTimes[AT_BREWFEST_DUN_MOROGH] = 0; + } - bool OnTrigger(Player* player, AreaTrigger const* trigger) - { - uint32 triggerId = trigger->entry; - // Second trigger happened too early after first, skip for now - if (sWorld->GetGameTime() - _triggerTimes[triggerId] < AREATRIGGER_TALK_COOLDOWN) - return false; - - switch (triggerId) - { - case AT_BREWFEST_DUROTAR: - if (Creature* tapper = player->FindNearestCreature(NPC_TAPPER_SWINDLEKEG, 20.0f)) - tapper->AI()->Talk(SAY_WELCOME, player); - break; - case AT_BREWFEST_DUN_MOROGH: - if (Creature* ipfelkofer = player->FindNearestCreature(NPC_IPFELKOFER_IRONKEG, 20.0f)) - ipfelkofer->AI()->Talk(SAY_WELCOME, player); - break; - default: - break; - } - - _triggerTimes[triggerId] = sWorld->GetGameTime(); + bool OnTrigger(Player* player, AreaTrigger const* trigger) + { + uint32 triggerId = trigger->entry; + // Second trigger happened too early after first, skip for now + if (sWorld->GetGameTime() - _triggerTimes[triggerId] < AREATRIGGER_TALK_COOLDOWN) return false; + + switch (triggerId) + { + case AT_BREWFEST_DUROTAR: + if (Creature* tapper = player->FindNearestCreature(NPC_TAPPER_SWINDLEKEG, 20.0f)) + tapper->AI()->Talk(SAY_WELCOME, player); + break; + case AT_BREWFEST_DUN_MOROGH: + if (Creature* ipfelkofer = player->FindNearestCreature(NPC_IPFELKOFER_IRONKEG, 20.0f)) + ipfelkofer->AI()->Talk(SAY_WELCOME, player); + break; + default: + break; } - private: - std::map _triggerTimes; + _triggerTimes[triggerId] = sWorld->GetGameTime(); + return false; + } + +private: + std::map _triggerTimes; }; /*###### @@ -425,55 +425,55 @@ enum Area52Entrance class AreaTrigger_at_area_52_entrance : public AreaTriggerScript { - public: - AreaTrigger_at_area_52_entrance() : AreaTriggerScript("at_area_52_entrance") - { - _triggerTimes[AT_AREA_52_SOUTH] = _triggerTimes[AT_AREA_52_NORTH] = _triggerTimes[AT_AREA_52_WEST] = _triggerTimes[AT_AREA_52_EAST] = 0; - } +public: + AreaTrigger_at_area_52_entrance() : AreaTriggerScript("at_area_52_entrance") + { + _triggerTimes[AT_AREA_52_SOUTH] = _triggerTimes[AT_AREA_52_NORTH] = _triggerTimes[AT_AREA_52_WEST] = _triggerTimes[AT_AREA_52_EAST] = 0; + } - bool OnTrigger(Player* player, AreaTrigger const* trigger) - { - float x = 0.0f, y = 0.0f, z = 0.0f; + bool OnTrigger(Player* player, AreaTrigger const* trigger) + { + float x = 0.0f, y = 0.0f, z = 0.0f; - if (!player->IsAlive()) - return false; - - uint32 triggerId = trigger->entry; - if (sWorld->GetGameTime() - _triggerTimes[trigger->entry] < SUMMON_COOLDOWN) - return false; - - switch (triggerId) - { - case AT_AREA_52_EAST: - x = 3044.176f; - y = 3610.692f; - z = 143.61f; - break; - case AT_AREA_52_NORTH: - x = 3114.87f; - y = 3687.619f; - z = 143.62f; - break; - case AT_AREA_52_WEST: - x = 3017.79f; - y = 3746.806f; - z = 144.27f; - break; - case AT_AREA_52_SOUTH: - x = 2950.63f; - y = 3719.905f; - z = 143.33f; - break; - } - - player->SummonCreature(NPC_SPOTLIGHT, x, y, z, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 5000); - player->AddAura(SPELL_A52_NEURALYZER, player); - _triggerTimes[trigger->entry] = sWorld->GetGameTime(); + if (!player->IsAlive()) return false; + + uint32 triggerId = trigger->entry; + if (sWorld->GetGameTime() - _triggerTimes[trigger->entry] < SUMMON_COOLDOWN) + return false; + + switch (triggerId) + { + case AT_AREA_52_EAST: + x = 3044.176f; + y = 3610.692f; + z = 143.61f; + break; + case AT_AREA_52_NORTH: + x = 3114.87f; + y = 3687.619f; + z = 143.62f; + break; + case AT_AREA_52_WEST: + x = 3017.79f; + y = 3746.806f; + z = 144.27f; + break; + case AT_AREA_52_SOUTH: + x = 2950.63f; + y = 3719.905f; + z = 143.33f; + break; } - private: - std::map _triggerTimes; + player->SummonCreature(NPC_SPOTLIGHT, x, y, z, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 5000); + player->AddAura(SPELL_A52_NEURALYZER, player); + _triggerTimes[trigger->entry] = sWorld->GetGameTime(); + return false; + } + +private: + std::map _triggerTimes; }; void AddSC_areatrigger_scripts() diff --git a/src/server/scripts/World/boss_emerald_dragons.cpp b/src/server/scripts/World/boss_emerald_dragons.cpp index 09d6412e5..a2a3c598a 100644 --- a/src/server/scripts/World/boss_emerald_dragons.cpp +++ b/src/server/scripts/World/boss_emerald_dragons.cpp @@ -152,56 +152,56 @@ struct emerald_dragonAI : public WorldBossAI class npc_dream_fog : public CreatureScript { - public: - npc_dream_fog() : CreatureScript("npc_dream_fog") { } +public: + npc_dream_fog() : CreatureScript("npc_dream_fog") { } - struct npc_dream_fogAI : public ScriptedAI + struct npc_dream_fogAI : public ScriptedAI + { + npc_dream_fogAI(Creature* creature) : ScriptedAI(creature) { - npc_dream_fogAI(Creature* creature) : ScriptedAI(creature) - { - } + } - void Reset() - { - _roamTimer = 0; - } + void Reset() + { + _roamTimer = 0; + } - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; - if (!_roamTimer) + if (!_roamTimer) + { + // Chase target, but don't attack - otherwise just roam around + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) { - // Chase target, but don't attack - otherwise just roam around - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) - { - _roamTimer = urand(15000, 30000); - me->GetMotionMaster()->Clear(false); - me->GetMotionMaster()->MoveChase(target, 0.2f); - } - else - { - _roamTimer = 2500; - me->GetMotionMaster()->Clear(false); - me->GetMotionMaster()->MoveRandom(25.0f); - } - // Seeping fog movement is slow enough for a player to be able to walk backwards and still outpace it - me->SetWalk(true); - me->SetSpeed(MOVE_WALK, 0.75f); + _roamTimer = urand(15000, 30000); + me->GetMotionMaster()->Clear(false); + me->GetMotionMaster()->MoveChase(target, 0.2f); } else - _roamTimer -= diff; + { + _roamTimer = 2500; + me->GetMotionMaster()->Clear(false); + me->GetMotionMaster()->MoveRandom(25.0f); + } + // Seeping fog movement is slow enough for a player to be able to walk backwards and still outpace it + me->SetWalk(true); + me->SetSpeed(MOVE_WALK, 0.75f); } - - private: - uint32 _roamTimer; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_dream_fogAI(creature); + else + _roamTimer -= diff; } + + private: + uint32 _roamTimer; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_dream_fogAI(creature); + } }; /* @@ -229,63 +229,63 @@ enum YsondreSpells class boss_ysondre : public CreatureScript { - public: - boss_ysondre() : CreatureScript("boss_ysondre") { } +public: + boss_ysondre() : CreatureScript("boss_ysondre") { } - struct boss_ysondreAI : public emerald_dragonAI + struct boss_ysondreAI : public emerald_dragonAI + { + boss_ysondreAI(Creature* creature) : emerald_dragonAI(creature) { - boss_ysondreAI(Creature* creature) : emerald_dragonAI(creature) - { - } - - void Reset() - { - _stage = 1; - emerald_dragonAI::Reset(); - events.ScheduleEvent(EVENT_LIGHTNING_WAVE, 12000); - } - - void EnterCombat(Unit* who) - { - Talk(SAY_YSONDRE_AGGRO); - WorldBossAI::EnterCombat(who); - } - - // Summon druid spirits on 75%, 50% and 25% health - void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask) - { - if (!HealthAbovePct(100 - 25 * _stage)) - { - Talk(SAY_YSONDRE_SUMMON_DRUIDS); - - for (uint8 i = 0; i < 10; ++i) - DoCast(me, SPELL_SUMMON_DRUID_SPIRITS, true); - ++_stage; - } - } - - void ExecuteEvent(uint32 eventId) - { - switch (eventId) - { - case EVENT_LIGHTNING_WAVE: - DoCastVictim(SPELL_LIGHTNING_WAVE); - events.ScheduleEvent(EVENT_LIGHTNING_WAVE, urand(10000, 20000)); - break; - default: - emerald_dragonAI::ExecuteEvent(eventId); - break; - } - } - - private: - uint8 _stage; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_ysondreAI(creature); } + + void Reset() + { + _stage = 1; + emerald_dragonAI::Reset(); + events.ScheduleEvent(EVENT_LIGHTNING_WAVE, 12000); + } + + void EnterCombat(Unit* who) + { + Talk(SAY_YSONDRE_AGGRO); + WorldBossAI::EnterCombat(who); + } + + // Summon druid spirits on 75%, 50% and 25% health + void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask) + { + if (!HealthAbovePct(100 - 25 * _stage)) + { + Talk(SAY_YSONDRE_SUMMON_DRUIDS); + + for (uint8 i = 0; i < 10; ++i) + DoCast(me, SPELL_SUMMON_DRUID_SPIRITS, true); + ++_stage; + } + } + + void ExecuteEvent(uint32 eventId) + { + switch (eventId) + { + case EVENT_LIGHTNING_WAVE: + DoCastVictim(SPELL_LIGHTNING_WAVE); + events.ScheduleEvent(EVENT_LIGHTNING_WAVE, urand(10000, 20000)); + break; + default: + emerald_dragonAI::ExecuteEvent(eventId); + break; + } + } + + private: + uint8 _stage; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_ysondreAI(creature); + } }; /* @@ -317,109 +317,109 @@ enum LethonCreatures class boss_lethon : public CreatureScript { - public: - boss_lethon() : CreatureScript("boss_lethon") { } +public: + boss_lethon() : CreatureScript("boss_lethon") { } - struct boss_lethonAI : public emerald_dragonAI + struct boss_lethonAI : public emerald_dragonAI + { + boss_lethonAI(Creature* creature) : emerald_dragonAI(creature) { - boss_lethonAI(Creature* creature) : emerald_dragonAI(creature) - { - } - - void Reset() - { - _stage = 1; - emerald_dragonAI::Reset(); - events.ScheduleEvent(EVENT_SHADOW_BOLT_WHIRL, 10000); - } - - void EnterCombat(Unit* who) - { - Talk(SAY_LETHON_AGGRO); - WorldBossAI::EnterCombat(who); - } - - void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask) - { - if (!HealthAbovePct(100 - 25 * _stage)) - { - Talk(SAY_LETHON_DRAW_SPIRIT); - DoCast(me, SPELL_DRAW_SPIRIT); - ++_stage; - } - } - - void SpellHitTarget(Unit* target, SpellInfo const* spell) - { - if (spell->Id == SPELL_DRAW_SPIRIT && target->GetTypeId() == TYPEID_PLAYER) - { - Position targetPos; - target->GetPosition(&targetPos); - me->SummonCreature(NPC_SPIRIT_SHADE, targetPos, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 50000); - } - } - - void ExecuteEvent(uint32 eventId) - { - switch (eventId) - { - case EVENT_SHADOW_BOLT_WHIRL: - me->CastSpell((Unit*)NULL, SPELL_SHADOW_BOLT_WHIRL, false); - events.ScheduleEvent(EVENT_SHADOW_BOLT_WHIRL, urand(15000, 30000)); - break; - default: - emerald_dragonAI::ExecuteEvent(eventId); - break; - } - } - - private: - uint8 _stage; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_lethonAI(creature); } + + void Reset() + { + _stage = 1; + emerald_dragonAI::Reset(); + events.ScheduleEvent(EVENT_SHADOW_BOLT_WHIRL, 10000); + } + + void EnterCombat(Unit* who) + { + Talk(SAY_LETHON_AGGRO); + WorldBossAI::EnterCombat(who); + } + + void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask) + { + if (!HealthAbovePct(100 - 25 * _stage)) + { + Talk(SAY_LETHON_DRAW_SPIRIT); + DoCast(me, SPELL_DRAW_SPIRIT); + ++_stage; + } + } + + void SpellHitTarget(Unit* target, SpellInfo const* spell) + { + if (spell->Id == SPELL_DRAW_SPIRIT && target->GetTypeId() == TYPEID_PLAYER) + { + Position targetPos; + target->GetPosition(&targetPos); + me->SummonCreature(NPC_SPIRIT_SHADE, targetPos, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 50000); + } + } + + void ExecuteEvent(uint32 eventId) + { + switch (eventId) + { + case EVENT_SHADOW_BOLT_WHIRL: + me->CastSpell((Unit*)NULL, SPELL_SHADOW_BOLT_WHIRL, false); + events.ScheduleEvent(EVENT_SHADOW_BOLT_WHIRL, urand(15000, 30000)); + break; + default: + emerald_dragonAI::ExecuteEvent(eventId); + break; + } + } + + private: + uint8 _stage; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_lethonAI(creature); + } }; class npc_spirit_shade : public CreatureScript { - public: - npc_spirit_shade() : CreatureScript("npc_spirit_shade") { } +public: + npc_spirit_shade() : CreatureScript("npc_spirit_shade") { } - struct npc_spirit_shadeAI : public PassiveAI + struct npc_spirit_shadeAI : public PassiveAI + { + npc_spirit_shadeAI(Creature* creature) : PassiveAI(creature), _summonerGuid(0) { - npc_spirit_shadeAI(Creature* creature) : PassiveAI(creature), _summonerGuid(0) - { - } - - void IsSummonedBy(Unit* summoner) - { - if (!summoner) - return; - - _summonerGuid = summoner->GetGUID(); - me->GetMotionMaster()->MoveFollow(summoner, 0.0f, 0.0f); - } - - void MovementInform(uint32 moveType, uint32 data) - { - if (moveType == FOLLOW_MOTION_TYPE && data == _summonerGuid) - { - me->CastSpell((Unit*)NULL, SPELL_DARK_OFFERING, false); - me->DespawnOrUnsummon(1000); - } - } - - private: - uint64 _summonerGuid; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_spirit_shadeAI(creature); } + + void IsSummonedBy(Unit* summoner) + { + if (!summoner) + return; + + _summonerGuid = summoner->GetGUID(); + me->GetMotionMaster()->MoveFollow(summoner, 0.0f, 0.0f); + } + + void MovementInform(uint32 moveType, uint32 data) + { + if (moveType == FOLLOW_MOTION_TYPE && data == _summonerGuid) + { + me->CastSpell((Unit*)NULL, SPELL_DARK_OFFERING, false); + me->DespawnOrUnsummon(1000); + } + } + + private: + uint64 _summonerGuid; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_spirit_shadeAI(creature); + } }; /* @@ -443,67 +443,67 @@ enum EmerissSpells class boss_emeriss : public CreatureScript { - public: - boss_emeriss() : CreatureScript("boss_emeriss") { } +public: + boss_emeriss() : CreatureScript("boss_emeriss") { } - struct boss_emerissAI : public emerald_dragonAI + struct boss_emerissAI : public emerald_dragonAI + { + boss_emerissAI(Creature* creature) : emerald_dragonAI(creature) { - boss_emerissAI(Creature* creature) : emerald_dragonAI(creature) - { - } - - void Reset() - { - _stage = 1; - emerald_dragonAI::Reset(); - events.ScheduleEvent(EVENT_VOLATILE_INFECTION, 12000); - } - - void KilledUnit(Unit* who) - { - if (who->GetTypeId() == TYPEID_PLAYER) - DoCast(who, SPELL_PUTRID_MUSHROOM, true); - emerald_dragonAI::KilledUnit(who); - } - - void EnterCombat(Unit* who) - { - Talk(SAY_EMERISS_AGGRO); - WorldBossAI::EnterCombat(who); - } - - void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask) - { - if (!HealthAbovePct(100 - 25 * _stage)) - { - Talk(SAY_EMERISS_CAST_CORRUPTION); - DoCast(me, SPELL_CORRUPTION_OF_EARTH, true); - ++_stage; - } - } - - void ExecuteEvent(uint32 eventId) - { - switch (eventId) - { - case EVENT_VOLATILE_INFECTION: - DoCastVictim(SPELL_VOLATILE_INFECTION); - events.ScheduleEvent(EVENT_VOLATILE_INFECTION, 120000); - break; - default: - emerald_dragonAI::ExecuteEvent(eventId); - break; - } - } - - private: - uint8 _stage; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_emerissAI(creature); } + + void Reset() + { + _stage = 1; + emerald_dragonAI::Reset(); + events.ScheduleEvent(EVENT_VOLATILE_INFECTION, 12000); + } + + void KilledUnit(Unit* who) + { + if (who->GetTypeId() == TYPEID_PLAYER) + DoCast(who, SPELL_PUTRID_MUSHROOM, true); + emerald_dragonAI::KilledUnit(who); + } + + void EnterCombat(Unit* who) + { + Talk(SAY_EMERISS_AGGRO); + WorldBossAI::EnterCombat(who); + } + + void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask) + { + if (!HealthAbovePct(100 - 25 * _stage)) + { + Talk(SAY_EMERISS_CAST_CORRUPTION); + DoCast(me, SPELL_CORRUPTION_OF_EARTH, true); + ++_stage; + } + } + + void ExecuteEvent(uint32 eventId) + { + switch (eventId) + { + case EVENT_VOLATILE_INFECTION: + DoCastVictim(SPELL_VOLATILE_INFECTION); + events.ScheduleEvent(EVENT_VOLATILE_INFECTION, 120000); + break; + default: + emerald_dragonAI::ExecuteEvent(eventId); + break; + } + } + + private: + uint8 _stage; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_emerissAI(creature); + } }; /* @@ -535,125 +535,125 @@ uint32 const TaerarShadeSpells[] = class boss_taerar : public CreatureScript { - public: - boss_taerar() : CreatureScript("boss_taerar") { } +public: + boss_taerar() : CreatureScript("boss_taerar") { } - struct boss_taerarAI : public emerald_dragonAI + struct boss_taerarAI : public emerald_dragonAI + { + boss_taerarAI(Creature* creature) : emerald_dragonAI(creature) { - boss_taerarAI(Creature* creature) : emerald_dragonAI(creature) - { - } - - void Reset() - { - me->RemoveAurasDueToSpell(SPELL_SHADE); - _stage = 1; - - _shades = 0; - _banished = false; - _banishedTimer = 0; - - emerald_dragonAI::Reset(); - events.ScheduleEvent(EVENT_ARCANE_BLAST, 12000); - events.ScheduleEvent(EVENT_BELLOWING_ROAR, 30000); - } - - void EnterCombat(Unit* who) - { - Talk(SAY_TAERAR_AGGRO); - emerald_dragonAI::EnterCombat(who); - } - - void SummonedCreatureDies(Creature* /*summon*/, Unit*) - { - --_shades; - } - - void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask) - { - // At 75, 50 or 25 percent health, we need to activate the shades and go "banished" - // Note: _stage holds the amount of times they have been summoned - if (!_banished && !HealthAbovePct(100 - 25 * _stage)) - { - _banished = true; - _banishedTimer = 60000; - - me->InterruptNonMeleeSpells(false); - DoStopAttack(); - - Talk(SAY_TAERAR_SUMMON_SHADES); - - uint32 count = sizeof(TaerarShadeSpells) / sizeof(uint32); - for (uint32 i = 0; i < count; ++i) - DoCastVictim(TaerarShadeSpells[i], true); - _shades += count; - - DoCast(SPELL_SHADE); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); - me->SetReactState(REACT_PASSIVE); - - ++_stage; - } - } - - void ExecuteEvent(uint32 eventId) - { - switch (eventId) - { - case EVENT_ARCANE_BLAST: - DoCast(SPELL_ARCANE_BLAST); - events.ScheduleEvent(EVENT_ARCANE_BLAST, urand(7000, 12000)); - break; - case EVENT_BELLOWING_ROAR: - DoCast(SPELL_BELLOWING_ROAR); - events.ScheduleEvent(EVENT_BELLOWING_ROAR, urand(20000, 30000)); - break; - default: - emerald_dragonAI::ExecuteEvent(eventId); - break; - } - } - - void UpdateAI(uint32 diff) - { - if (!me->IsInCombat()) - return; - - if (_banished) - { - // If all three shades are dead, OR it has taken too long, end the current event and get Taerar back into business - if (_banishedTimer <= diff || !_shades) - { - _banished = false; - - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); - me->RemoveAurasDueToSpell(SPELL_SHADE); - me->SetReactState(REACT_AGGRESSIVE); - } - // _banishtimer has not expired, and we still have active shades: - else - _banishedTimer -= diff; - - // Update the events before we return (handled under emerald_dragonAI::UpdateAI(diff); if we're not inside this check) - events.Update(diff); - - return; - } - - emerald_dragonAI::UpdateAI(diff); - } - - private: - bool _banished; // used for shades activation testing - uint32 _banishedTimer; // counter for banishment timeout - uint8 _shades; // keep track of how many shades are dead - uint8 _stage; // check which "shade phase" we're at (75-50-25 percentage counters) - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_taerarAI(creature); } + + void Reset() + { + me->RemoveAurasDueToSpell(SPELL_SHADE); + _stage = 1; + + _shades = 0; + _banished = false; + _banishedTimer = 0; + + emerald_dragonAI::Reset(); + events.ScheduleEvent(EVENT_ARCANE_BLAST, 12000); + events.ScheduleEvent(EVENT_BELLOWING_ROAR, 30000); + } + + void EnterCombat(Unit* who) + { + Talk(SAY_TAERAR_AGGRO); + emerald_dragonAI::EnterCombat(who); + } + + void SummonedCreatureDies(Creature* /*summon*/, Unit*) + { + --_shades; + } + + void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask) + { + // At 75, 50 or 25 percent health, we need to activate the shades and go "banished" + // Note: _stage holds the amount of times they have been summoned + if (!_banished && !HealthAbovePct(100 - 25 * _stage)) + { + _banished = true; + _banishedTimer = 60000; + + me->InterruptNonMeleeSpells(false); + DoStopAttack(); + + Talk(SAY_TAERAR_SUMMON_SHADES); + + uint32 count = sizeof(TaerarShadeSpells) / sizeof(uint32); + for (uint32 i = 0; i < count; ++i) + DoCastVictim(TaerarShadeSpells[i], true); + _shades += count; + + DoCast(SPELL_SHADE); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); + me->SetReactState(REACT_PASSIVE); + + ++_stage; + } + } + + void ExecuteEvent(uint32 eventId) + { + switch (eventId) + { + case EVENT_ARCANE_BLAST: + DoCast(SPELL_ARCANE_BLAST); + events.ScheduleEvent(EVENT_ARCANE_BLAST, urand(7000, 12000)); + break; + case EVENT_BELLOWING_ROAR: + DoCast(SPELL_BELLOWING_ROAR); + events.ScheduleEvent(EVENT_BELLOWING_ROAR, urand(20000, 30000)); + break; + default: + emerald_dragonAI::ExecuteEvent(eventId); + break; + } + } + + void UpdateAI(uint32 diff) + { + if (!me->IsInCombat()) + return; + + if (_banished) + { + // If all three shades are dead, OR it has taken too long, end the current event and get Taerar back into business + if (_banishedTimer <= diff || !_shades) + { + _banished = false; + + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); + me->RemoveAurasDueToSpell(SPELL_SHADE); + me->SetReactState(REACT_AGGRESSIVE); + } + // _banishtimer has not expired, and we still have active shades: + else + _banishedTimer -= diff; + + // Update the events before we return (handled under emerald_dragonAI::UpdateAI(diff); if we're not inside this check) + events.Update(diff); + + return; + } + + emerald_dragonAI::UpdateAI(diff); + } + + private: + bool _banished; // used for shades activation testing + uint32 _banishedTimer; // counter for banishment timeout + uint8 _shades; // keep track of how many shades are dead + uint8 _stage; // check which "shade phase" we're at (75-50-25 percentage counters) + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_taerarAI(creature); + } }; /* @@ -662,28 +662,28 @@ class boss_taerar : public CreatureScript class spell_dream_fog_sleep : public SpellScriptLoader { - public: - spell_dream_fog_sleep() : SpellScriptLoader("spell_dream_fog_sleep") { } +public: + spell_dream_fog_sleep() : SpellScriptLoader("spell_dream_fog_sleep") { } - class spell_dream_fog_sleep_SpellScript : public SpellScript + class spell_dream_fog_sleep_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dream_fog_sleep_SpellScript); + + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_dream_fog_sleep_SpellScript); - - void FilterTargets(std::list& targets) - { - targets.remove_if(acore::UnitAuraCheck(true, SPELL_SLEEP)); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dream_fog_sleep_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dream_fog_sleep_SpellScript(); + targets.remove_if(acore::UnitAuraCheck(true, SPELL_SLEEP)); } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dream_fog_sleep_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dream_fog_sleep_SpellScript(); + } }; /* @@ -692,58 +692,58 @@ class spell_dream_fog_sleep : public SpellScriptLoader class MarkOfNatureTargetSelector { - public: - MarkOfNatureTargetSelector() { } +public: + MarkOfNatureTargetSelector() { } - bool operator()(WorldObject* object) - { - // return those not tagged or already under the influence of Aura of Nature - if (Unit* unit = object->ToUnit()) - return !(unit->HasAura(SPELL_MARK_OF_NATURE) && !unit->HasAura(SPELL_AURA_OF_NATURE)); - return true; - } + bool operator()(WorldObject* object) + { + // return those not tagged or already under the influence of Aura of Nature + if (Unit* unit = object->ToUnit()) + return !(unit->HasAura(SPELL_MARK_OF_NATURE) && !unit->HasAura(SPELL_AURA_OF_NATURE)); + return true; + } }; class spell_mark_of_nature : public SpellScriptLoader { - public: - spell_mark_of_nature() : SpellScriptLoader("spell_mark_of_nature") { } +public: + spell_mark_of_nature() : SpellScriptLoader("spell_mark_of_nature") { } - class spell_mark_of_nature_SpellScript : public SpellScript + class spell_mark_of_nature_SpellScript : public SpellScript + { + PrepareSpellScript(spell_mark_of_nature_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) { - PrepareSpellScript(spell_mark_of_nature_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) - { - if (!sSpellMgr->GetSpellInfo(SPELL_MARK_OF_NATURE)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_AURA_OF_NATURE)) - return false; - return true; - } - - void FilterTargets(std::list& targets) - { - targets.remove_if(MarkOfNatureTargetSelector()); - } - - void HandleEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetHitUnit()->CastSpell(GetHitUnit(), SPELL_AURA_OF_NATURE, true); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mark_of_nature_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - OnEffectHitTarget += SpellEffectFn(spell_mark_of_nature_SpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_APPLY_AURA); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_mark_of_nature_SpellScript(); + if (!sSpellMgr->GetSpellInfo(SPELL_MARK_OF_NATURE)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_AURA_OF_NATURE)) + return false; + return true; } + + void FilterTargets(std::list& targets) + { + targets.remove_if(MarkOfNatureTargetSelector()); + } + + void HandleEffect(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_AURA_OF_NATURE, true); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mark_of_nature_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_mark_of_nature_SpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_APPLY_AURA); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_mark_of_nature_SpellScript(); + } }; void AddSC_emerald_dragons() diff --git a/src/server/scripts/World/character_creation.cpp b/src/server/scripts/World/character_creation.cpp index 0dcf82cc4..986f1ac8c 100644 --- a/src/server/scripts/World/character_creation.cpp +++ b/src/server/scripts/World/character_creation.cpp @@ -26,26 +26,26 @@ public: switch (player->getClass()) { // Only two classes posses an aura on creation; - case CLASS_WARRIOR: - player->CastSpell(player, WARRIOR_CREATION_BATTLE_STANCE, true); - return; - case CLASS_DEATH_KNIGHT: - player->CastSpell(player, DEATH_KNIGHT_CREATION_BLOOD_PRESENCE, true); - return; + case CLASS_WARRIOR: + player->CastSpell(player, WARRIOR_CREATION_BATTLE_STANCE, true); + return; + case CLASS_DEATH_KNIGHT: + player->CastSpell(player, DEATH_KNIGHT_CREATION_BLOOD_PRESENCE, true); + return; // We include, but do not change the other classes - case CLASS_NONE: - case CLASS_PALADIN: - case CLASS_HUNTER: - case CLASS_ROGUE: - case CLASS_PRIEST: - case CLASS_SHAMAN: - case CLASS_MAGE: - case CLASS_WARLOCK: + case CLASS_NONE: + case CLASS_PALADIN: + case CLASS_HUNTER: + case CLASS_ROGUE: + case CLASS_PRIEST: + case CLASS_SHAMAN: + case CLASS_MAGE: + case CLASS_WARLOCK: // case CLASS_UNK: // Does not exist! - case CLASS_DRUID: - default: - // Can be modified based on personal needs; - return; + case CLASS_DRUID: + default: + // Can be modified based on personal needs; + return; } } }; diff --git a/src/server/scripts/World/chat_log.cpp b/src/server/scripts/World/chat_log.cpp index 0343057df..f19897070 100644 --- a/src/server/scripts/World/chat_log.cpp +++ b/src/server/scripts/World/chat_log.cpp @@ -21,25 +21,25 @@ public: case CHAT_MSG_ADDON: if (sWorld->getBoolConfig(CONFIG_CHATLOG_ADDON)) sLog->outChat("[ADDON] Player %s sends: %s", - player->GetName().c_str(), msg.c_str()); + player->GetName().c_str(), msg.c_str()); break; case CHAT_MSG_SAY: if (sWorld->getBoolConfig(CONFIG_CHATLOG_PUBLIC)) sLog->outChat("[SAY] Player %s says (language %u): %s", - player->GetName().c_str(), lang, msg.c_str()); + player->GetName().c_str(), lang, msg.c_str()); break; case CHAT_MSG_EMOTE: if (sWorld->getBoolConfig(CONFIG_CHATLOG_PUBLIC)) sLog->outChat("[TEXTEMOTE] Player %s emotes: %s", - player->GetName().c_str(), msg.c_str()); + player->GetName().c_str(), msg.c_str()); break; case CHAT_MSG_YELL: if (sWorld->getBoolConfig(CONFIG_CHATLOG_PUBLIC)) sLog->outChat("[YELL] Player %s yells (language %u): %s", - player->GetName().c_str(), lang, msg.c_str()); + player->GetName().c_str(), lang, msg.c_str()); break; } } @@ -48,10 +48,10 @@ public: { if (lang != LANG_ADDON && sWorld->getBoolConfig(CONFIG_CHATLOG_WHISPER)) sLog->outChat("[WHISPER] Player %s tells %s: %s", - player->GetName().c_str(), receiver ? receiver->GetName().c_str() : "", msg.c_str()); + player->GetName().c_str(), receiver ? receiver->GetName().c_str() : "", msg.c_str()); else if (lang == LANG_ADDON && sWorld->getBoolConfig(CONFIG_CHATLOG_ADDON)) sLog->outChat("[ADDON] Player %s tells %s: %s", - player->GetName().c_str(), receiver ? receiver->GetName().c_str() : "", msg.c_str()); + player->GetName().c_str(), receiver ? receiver->GetName().c_str() : "", msg.c_str()); } void OnChat(Player* player, uint32 type, uint32 lang, std::string& msg, Group* group) @@ -63,52 +63,52 @@ public: case CHAT_MSG_PARTY: if (lang != LANG_ADDON && sWorld->getBoolConfig(CONFIG_CHATLOG_PARTY)) sLog->outChat("[PARTY] Player %s tells group with leader %s: %s", - player->GetName().c_str(), group ? group->GetLeaderName() : "", msg.c_str()); + player->GetName().c_str(), group ? group->GetLeaderName() : "", msg.c_str()); else if (lang == LANG_ADDON && sWorld->getBoolConfig(CONFIG_CHATLOG_ADDON)) sLog->outChat("[ADDON] Player %s tells group with leader %s: %s", - player->GetName().c_str(), group ? group->GetLeaderName() : "", msg.c_str()); + player->GetName().c_str(), group ? group->GetLeaderName() : "", msg.c_str()); break; case CHAT_MSG_PARTY_LEADER: if (sWorld->getBoolConfig(CONFIG_CHATLOG_PARTY)) sLog->outChat("[PARTY] Leader %s tells group: %s", - player->GetName().c_str(), msg.c_str()); + player->GetName().c_str(), msg.c_str()); break; case CHAT_MSG_RAID: if (lang != LANG_ADDON && sWorld->getBoolConfig(CONFIG_CHATLOG_RAID)) sLog->outChat("[RAID] Player %s tells raid with leader %s: %s", - player->GetName().c_str(), group ? group->GetLeaderName() : "", msg.c_str()); + player->GetName().c_str(), group ? group->GetLeaderName() : "", msg.c_str()); else if (lang == LANG_ADDON && sWorld->getBoolConfig(CONFIG_CHATLOG_ADDON)) sLog->outChat("[ADDON] Player %s tells raid with leader %s: %s", - player->GetName().c_str(), group ? group->GetLeaderName() : "", msg.c_str()); + player->GetName().c_str(), group ? group->GetLeaderName() : "", msg.c_str()); break; case CHAT_MSG_RAID_LEADER: if (sWorld->getBoolConfig(CONFIG_CHATLOG_RAID)) sLog->outChat("[RAID] Leader player %s tells raid: %s", - player->GetName().c_str(), msg.c_str()); + player->GetName().c_str(), msg.c_str()); break; case CHAT_MSG_RAID_WARNING: if (sWorld->getBoolConfig(CONFIG_CHATLOG_RAID)) sLog->outChat("[RAID] Leader player %s warns raid with: %s", - player->GetName().c_str(), msg.c_str()); + player->GetName().c_str(), msg.c_str()); break; case CHAT_MSG_BATTLEGROUND: if (lang != LANG_ADDON && sWorld->getBoolConfig(CONFIG_CHATLOG_BGROUND)) sLog->outChat("[BATTLEGROUND] Player %s tells battleground with leader %s: %s", - player->GetName().c_str(), group ? group->GetLeaderName() : "", msg.c_str()); + player->GetName().c_str(), group ? group->GetLeaderName() : "", msg.c_str()); else if (lang == LANG_ADDON && sWorld->getBoolConfig(CONFIG_CHATLOG_ADDON)) sLog->outChat("[ADDON] Player %s tells battleground with leader %s: %s", - player->GetName().c_str(), group ? group->GetLeaderName() : "", msg.c_str()); + player->GetName().c_str(), group ? group->GetLeaderName() : "", msg.c_str()); break; case CHAT_MSG_BATTLEGROUND_LEADER: if (sWorld->getBoolConfig(CONFIG_CHATLOG_BGROUND)) sLog->outChat("[BATTLEGROUND] Leader player %s tells battleground: %s", - player->GetName().c_str(), msg.c_str()); + player->GetName().c_str(), msg.c_str()); break; } } @@ -120,16 +120,16 @@ public: case CHAT_MSG_GUILD: if (lang != LANG_ADDON && sWorld->getBoolConfig(CONFIG_CHATLOG_GUILD)) sLog->outChat("[GUILD] Player %s tells guild %s: %s", - player->GetName().c_str(), guild ? guild->GetName().c_str() : "", msg.c_str()); + player->GetName().c_str(), guild ? guild->GetName().c_str() : "", msg.c_str()); else if (lang == LANG_ADDON && sWorld->getBoolConfig(CONFIG_CHATLOG_ADDON)) sLog->outChat("[ADDON] Player %s sends to guild %s: %s", - player->GetName().c_str(), guild ? guild->GetName().c_str() : "", msg.c_str()); + player->GetName().c_str(), guild ? guild->GetName().c_str() : "", msg.c_str()); break; case CHAT_MSG_OFFICER: if (sWorld->getBoolConfig(CONFIG_CHATLOG_GUILD)) sLog->outChat("[OFFICER] Player %s tells guild %s officers: %s", - player->GetName().c_str(), guild ? guild->GetName().c_str() : "", msg.c_str()); + player->GetName().c_str(), guild ? guild->GetName().c_str() : "", msg.c_str()); break; } } @@ -144,10 +144,10 @@ public: if (sWorld->getBoolConfig(CONFIG_CHATLOG_SYSCHAN) && isSystem) sLog->outChat("[SYSCHAN] Player %s tells channel %s: %s", - player->GetName().c_str(), channel->GetName().c_str(), msg.c_str()); + player->GetName().c_str(), channel->GetName().c_str(), msg.c_str()); else if (sWorld->getBoolConfig(CONFIG_CHATLOG_CHANNEL)) sLog->outChat("[CHANNEL] Player %s tells channel %s: %s", - player->GetName().c_str(), channel ? channel->GetName().c_str() : "", msg.c_str()); + player->GetName().c_str(), channel ? channel->GetName().c_str() : "", msg.c_str()); } }; diff --git a/src/server/scripts/World/go_scripts.cpp b/src/server/scripts/World/go_scripts.cpp index 4e2e5a395..83891d3eb 100644 --- a/src/server/scripts/World/go_scripts.cpp +++ b/src/server/scripts/World/go_scripts.cpp @@ -75,11 +75,11 @@ class go_mistwhisper_treasure : public GameObjectScript public: go_mistwhisper_treasure() : GameObjectScript("go_mistwhisper_treasure") { } - bool OnGossipHello(Player* pPlayer, GameObject *go) override + bool OnGossipHello(Player* pPlayer, GameObject* go) override { if (!go->FindNearestCreature(28105, 30.0f)) // Tartek { - if (Creature *cr = go->SummonCreature(28105, 6708.7f, 5115.45f, -18.3f, 0.7f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000)) + if (Creature* cr = go->SummonCreature(28105, 6708.7f, 5115.45f, -18.3f, 0.7f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000)) { cr->MonsterYell("My treasure! You no steal from Tartek, dumb big-tongue traitor thing. Tartek and nasty dragon going to kill you! You so dumb.", LANG_UNIVERSAL, 0); cr->AI()->AttackStart(pPlayer); @@ -91,37 +91,37 @@ public: class go_witherbark_totem_bundle : public GameObjectScript { - public: - go_witherbark_totem_bundle() : GameObjectScript("go_witherbark_totem_bundle") { } +public: + go_witherbark_totem_bundle() : GameObjectScript("go_witherbark_totem_bundle") { } - struct go_witherbark_totem_bundleAI : public GameObjectAI + struct go_witherbark_totem_bundleAI : public GameObjectAI + { + go_witherbark_totem_bundleAI(GameObject* gameObject) : GameObjectAI(gameObject) { - go_witherbark_totem_bundleAI(GameObject* gameObject) : GameObjectAI(gameObject) - { - _timer = 1; - } + _timer = 1; + } - void UpdateAI(uint32 diff) + void UpdateAI(uint32 diff) + { + if (_timer) { - if (_timer) + _timer += diff; + if (_timer > 5000) { - _timer += diff; - if (_timer > 5000) - { - go->CastSpell(nullptr, 9056); - go->DestroyForNearbyPlayers(); - _timer = 0; - } + go->CastSpell(nullptr, 9056); + go->DestroyForNearbyPlayers(); + _timer = 0; } } - - uint32 _timer; - }; - - GameObjectAI* GetAI(GameObject* go) const - { - return new go_witherbark_totem_bundleAI(go); } + + uint32 _timer; + }; + + GameObjectAI* GetAI(GameObject* go) const + { + return new go_witherbark_totem_bundleAI(go); + } }; class go_arena_ready_marker : public GameObjectScript @@ -129,7 +129,7 @@ class go_arena_ready_marker : public GameObjectScript public: go_arena_ready_marker() : GameObjectScript("go_arena_ready_marker") { } - bool OnGossipHello(Player* player, GameObject * /*go*/) override + bool OnGossipHello(Player* player, GameObject* /*go*/) override { if (Battleground* bg = player->GetBattleground()) bg->ReadyMarkerClicked(player); @@ -168,7 +168,7 @@ public: int Random = rand() % (sizeof(NpcPrisonEntry) / sizeof(uint32)); if (Creature* creature = player->SummonCreature(NpcPrisonEntry[Random], go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), go->GetAngle(player), - TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000)) + TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000)) { if (!creature->IsHostileTo(player)) { @@ -176,12 +176,24 @@ public: switch (creature->GetEntry()) { - case 22811: Spell = SPELL_REP_LC; break; - case 22812: Spell = SPELL_REP_SHAT; break; - case 22810: Spell = SPELL_REP_CE; break; - case 22813: Spell = SPELL_REP_CON; break; - case 22815: Spell = SPELL_REP_KT; break; - case 22814: Spell = SPELL_REP_SPOR; break; + case 22811: + Spell = SPELL_REP_LC; + break; + case 22812: + Spell = SPELL_REP_SHAT; + break; + case 22810: + Spell = SPELL_REP_CE; + break; + case 22813: + Spell = SPELL_REP_CON; + break; + case 22815: + Spell = SPELL_REP_KT; + break; + case 22814: + Spell = SPELL_REP_SPOR; + break; } if (Spell) @@ -212,7 +224,7 @@ public: int Random = rand() % (sizeof(NpcStasisEntry) / sizeof(uint32)); player->SummonCreature(NpcStasisEntry[Random], go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), go->GetAngle(player), - TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); return false; } @@ -234,7 +246,7 @@ public: bool OnGossipHello(Player* /*player*/, GameObject* go) override { - // xinef: prevent spawning hundreds of them + // xinef: prevent spawning hundreds of them if (go->GetGoType() == GAMEOBJECT_TYPE_GOOBER && !go->FindNearestCreature(NPC_GOGGEROC, 20.0f)) go->SummonCreature(NPC_GOGGEROC, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 300000); @@ -272,7 +284,7 @@ public: requireSummon = 0; int8 count = urand(1, 3); for (int8 i = 0; i < count; ++i) - go->SummonCreature(NPC_WINTERFIN_TADPOLE, go->GetPositionX()+cos(2*M_PI*i/3.0f)*0.60f, go->GetPositionY()+sin(2*M_PI*i/3.0f)*0.60f, go->GetPositionZ()+0.5f, go->GetOrientation(), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); + go->SummonCreature(NPC_WINTERFIN_TADPOLE, go->GetPositionX() + cos(2 * M_PI * i / 3.0f) * 0.60f, go->GetPositionY() + sin(2 * M_PI * i / 3.0f) * 0.60f, go->GetPositionZ() + 0.5f, go->GetOrientation(), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); } void OnStateChanged(uint32 state, Unit* /*unit*/) @@ -301,7 +313,7 @@ public: { player->KilledMonsterCredit(NPC_WINTERFIN_TADPOLE, 0); (*itr)->DespawnOrUnsummon(urand(45000, 60000)); - (*itr)->GetMotionMaster()->MoveFollow(player, 1.0f, frand(0.0f, 2*M_PI), MOTION_SLOT_CONTROLLED); + (*itr)->GetMotionMaster()->MoveFollow(player, 1.0f, frand(0.0f, 2 * M_PI), MOTION_SLOT_CONTROLLED); } } return false; @@ -417,7 +429,7 @@ public: enum BrewfestMusic { EVENT_BREWFESTDWARF01 = 11810, // 1.35 min - EVENT_BREWFESTDWARF02 = 11812, // 1.55 min + EVENT_BREWFESTDWARF02 = 11812, // 1.55 min EVENT_BREWFESTDWARF03 = 11813, // 0.23 min EVENT_BREWFESTGOBLIN01 = 11811, // 1.08 min EVENT_BREWFESTGOBLIN02 = 11814, // 1.33 min @@ -477,104 +489,104 @@ public: { switch (eventId) { - case EVENT_BM_SELECT_MUSIC: - { - if (!IsHolidayActive(HOLIDAY_BREWFEST)) // Check if Brewfest is active + case EVENT_BM_SELECT_MUSIC: + { + if (!IsHolidayActive(HOLIDAY_BREWFEST)) // Check if Brewfest is active + break; + // Select random music sample + uint32 rnd = urand(0, 2); + uint32 musicTime = 1000; + //Restart the current selected music + _currentMusicEvent = 0; + //Check zone to play correct music + if (go->GetAreaId() == SILVERMOON || go->GetAreaId() == UNDERCITY || go->GetAreaId() == ORGRIMMAR_1 || go->GetAreaId() == ORGRIMMAR_2 || go->GetAreaId() == THUNDERBLUFF) + { + switch (rnd) + { + case 0: + _currentMusicEvent = EVENT_BREWFESTGOBLIN01; + musicTime = EVENT_BREWFESTGOBLIN01_TIME; + break; + case 1: + _currentMusicEvent = EVENT_BREWFESTGOBLIN02; + musicTime = EVENT_BREWFESTGOBLIN02_TIME; + break; + case 2: + _currentMusicEvent = EVENT_BREWFESTGOBLIN03; + musicTime = EVENT_BREWFESTGOBLIN03_TIME; + break; + default: + break; + } + } + else if (go->GetAreaId() == IRONFORGE_1 || go->GetAreaId() == IRONFORGE_2 || go->GetAreaId() == STORMWIND || go->GetAreaId() == EXODAR || go->GetAreaId() == DARNASSUS) + { + switch (rnd) + { + case 0: + _currentMusicEvent = EVENT_BREWFESTDWARF01; + musicTime = EVENT_BREWFESTDWARF01_TIME; + break; + case 1: + _currentMusicEvent = EVENT_BREWFESTDWARF02; + musicTime = EVENT_BREWFESTDWARF02_TIME; + break; + case 2: + _currentMusicEvent = EVENT_BREWFESTDWARF03; + musicTime = EVENT_BREWFESTDWARF03_TIME; + break; + default: + break; + } + } + else if (go->GetAreaId() == SHATTRATH) + { + rnd = urand(0, 5); + switch (rnd) + { + case 0: + _currentMusicEvent = EVENT_BREWFESTGOBLIN01; + musicTime = EVENT_BREWFESTGOBLIN01_TIME; + break; + case 1: + _currentMusicEvent = EVENT_BREWFESTGOBLIN02; + musicTime = EVENT_BREWFESTGOBLIN02_TIME; + break; + case 2: + _currentMusicEvent = EVENT_BREWFESTGOBLIN03; + musicTime = EVENT_BREWFESTGOBLIN03_TIME; + break; + case 3: + _currentMusicEvent = EVENT_BREWFESTDWARF01; + musicTime = EVENT_BREWFESTDWARF01_TIME; + break; + case 4: + _currentMusicEvent = EVENT_BREWFESTDWARF02; + musicTime = EVENT_BREWFESTDWARF02_TIME; + break; + case 5: + _currentMusicEvent = EVENT_BREWFESTDWARF03; + musicTime = EVENT_BREWFESTDWARF03_TIME; + break; + default: + break; + } + } + _events.ScheduleEvent(EVENT_BM_SELECT_MUSIC, musicTime); // Select new song music after play time is over + break; + } + case EVENT_BM_START_MUSIC: + if (!IsHolidayActive(HOLIDAY_BREWFEST)) // Check if Brewfest is active + break; + // Play selected music + if (_currentMusicEvent != 0) + { + go->PlayDirectMusic(_currentMusicEvent); + } + _events.ScheduleEvent(EVENT_BM_START_MUSIC, 5000); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client break; - // Select random music sample - uint32 rnd = urand(0, 2); - uint32 musicTime = 1000; - //Restart the current selected music - _currentMusicEvent = 0; - //Check zone to play correct music - if (go->GetAreaId() == SILVERMOON || go->GetAreaId() == UNDERCITY || go->GetAreaId() == ORGRIMMAR_1 || go->GetAreaId() == ORGRIMMAR_2 || go->GetAreaId() == THUNDERBLUFF) - { - switch (rnd) - { - case 0: - _currentMusicEvent = EVENT_BREWFESTGOBLIN01; - musicTime = EVENT_BREWFESTGOBLIN01_TIME; - break; - case 1: - _currentMusicEvent = EVENT_BREWFESTGOBLIN02; - musicTime = EVENT_BREWFESTGOBLIN02_TIME; - break; - case 2: - _currentMusicEvent = EVENT_BREWFESTGOBLIN03; - musicTime = EVENT_BREWFESTGOBLIN03_TIME; - break; - default: - break; - } - } - else if (go->GetAreaId() == IRONFORGE_1 || go->GetAreaId() == IRONFORGE_2 || go->GetAreaId() == STORMWIND || go->GetAreaId() == EXODAR || go->GetAreaId() == DARNASSUS) - { - switch (rnd) - { - case 0: - _currentMusicEvent = EVENT_BREWFESTDWARF01; - musicTime = EVENT_BREWFESTDWARF01_TIME; - break; - case 1: - _currentMusicEvent = EVENT_BREWFESTDWARF02; - musicTime = EVENT_BREWFESTDWARF02_TIME; - break; - case 2: - _currentMusicEvent = EVENT_BREWFESTDWARF03; - musicTime = EVENT_BREWFESTDWARF03_TIME; - break; - default: - break; - } - } - else if (go->GetAreaId() == SHATTRATH) - { - rnd = urand(0, 5); - switch (rnd) - { - case 0: - _currentMusicEvent = EVENT_BREWFESTGOBLIN01; - musicTime = EVENT_BREWFESTGOBLIN01_TIME; - break; - case 1: - _currentMusicEvent = EVENT_BREWFESTGOBLIN02; - musicTime = EVENT_BREWFESTGOBLIN02_TIME; - break; - case 2: - _currentMusicEvent = EVENT_BREWFESTGOBLIN03; - musicTime = EVENT_BREWFESTGOBLIN03_TIME; - break; - case 3: - _currentMusicEvent = EVENT_BREWFESTDWARF01; - musicTime = EVENT_BREWFESTDWARF01_TIME; - break; - case 4: - _currentMusicEvent = EVENT_BREWFESTDWARF02; - musicTime = EVENT_BREWFESTDWARF02_TIME; - break; - case 5: - _currentMusicEvent = EVENT_BREWFESTDWARF03; - musicTime = EVENT_BREWFESTDWARF03_TIME; - break; - default: - break; - } - } - _events.ScheduleEvent(EVENT_BM_SELECT_MUSIC, musicTime); // Select new song music after play time is over - break; - } - case EVENT_BM_START_MUSIC: - if (!IsHolidayActive(HOLIDAY_BREWFEST)) // Check if Brewfest is active + default: break; - // Play selected music - if (_currentMusicEvent != 0) - { - go->PlayDirectMusic(_currentMusicEvent); - } - _events.ScheduleEvent(EVENT_BM_START_MUSIC, 5000); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client - break; - default: - break; } } } @@ -624,14 +636,14 @@ public: { switch (eventId) { - case EVENT_PDM_START_MUSIC: - if (!IsHolidayActive(HOLIDAY_PIRATES_DAY)) + case EVENT_PDM_START_MUSIC: + if (!IsHolidayActive(HOLIDAY_PIRATES_DAY)) + break; + go->PlayDirectMusic(MUSIC_PIRATE_DAY_MUSIC); + _events.ScheduleEvent(EVENT_PDM_START_MUSIC, 5000); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client (sniffed value) + break; + default: break; - go->PlayDirectMusic(MUSIC_PIRATE_DAY_MUSIC); - _events.ScheduleEvent(EVENT_PDM_START_MUSIC, 5000); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client (sniffed value) - break; - default: - break; } } } @@ -679,14 +691,14 @@ public: { switch (eventId) { - case EVENT_DFM_START_MUSIC: - if (!IsHolidayActive(HOLIDAY_DARKMOON_FAIRE_ELWYNN) || !IsHolidayActive(HOLIDAY_DARKMOON_FAIRE_THUNDER) || !IsHolidayActive(HOLIDAY_DARKMOON_FAIRE_SHATTRATH)) + case EVENT_DFM_START_MUSIC: + if (!IsHolidayActive(HOLIDAY_DARKMOON_FAIRE_ELWYNN) || !IsHolidayActive(HOLIDAY_DARKMOON_FAIRE_THUNDER) || !IsHolidayActive(HOLIDAY_DARKMOON_FAIRE_SHATTRATH)) + break; + go->PlayDirectMusic(MUSIC_DARKMOON_FAIRE_MUSIC); + _events.ScheduleEvent(EVENT_DFM_START_MUSIC, 5000); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client (sniffed value) + break; + default: break; - go->PlayDirectMusic(MUSIC_DARKMOON_FAIRE_MUSIC); - _events.ScheduleEvent(EVENT_DFM_START_MUSIC, 5000); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client (sniffed value) - break; - default: - break; } } } @@ -707,7 +719,7 @@ public: enum MidsummerMusic { EVENTMIDSUMMERFIREFESTIVAL_A = 12319, // 1.08 min - EVENTMIDSUMMERFIREFESTIVAL_H = 12325, // 1.12 min + EVENTMIDSUMMERFIREFESTIVAL_H = 12325, // 1.12 min }; enum MidsummerMusicEvents @@ -734,32 +746,32 @@ public: { switch (eventId) { - case EVENT_MM_START_MUSIC: - { - if (!IsHolidayActive(HOLIDAY_FIRE_FESTIVAL)) - break; - - Map::PlayerList const& players = go->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) - { - if (Player* player = itr->GetSource()) + case EVENT_MM_START_MUSIC: { - if (player->GetTeamId() == TEAM_HORDE) - { - go->PlayDirectMusic(EVENTMIDSUMMERFIREFESTIVAL_H, player); - } - else - { - go->PlayDirectMusic(EVENTMIDSUMMERFIREFESTIVAL_A, player); - } - } - } + if (!IsHolidayActive(HOLIDAY_FIRE_FESTIVAL)) + break; - _events.ScheduleEvent(EVENT_MM_START_MUSIC, 5000); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client (sniffed value) - break; - } - default: - break; + Map::PlayerList const& players = go->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + { + if (Player* player = itr->GetSource()) + { + if (player->GetTeamId() == TEAM_HORDE) + { + go->PlayDirectMusic(EVENTMIDSUMMERFIREFESTIVAL_H, player); + } + else + { + go->PlayDirectMusic(EVENTMIDSUMMERFIREFESTIVAL_A, player); + } + } + } + + _events.ScheduleEvent(EVENT_MM_START_MUSIC, 5000); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client (sniffed value) + break; + } + default: + break; } } } @@ -1064,12 +1076,12 @@ public: { case GOSSIP_ACTION_INFO_DEF: player->CastSpell(player, SPELL_CREATE_1_FLASK_OF_BEAST, false); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_ITEM_TEXT_RETURN, go->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF + 1: player->CastSpell(player, SPELL_CREATE_5_FLASK_OF_BEAST, false); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_ITEM_TEXT_RETURN, go->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF + 2: @@ -1123,12 +1135,12 @@ public: { case GOSSIP_ACTION_INFO_DEF: player->CastSpell(player, SPELL_CREATE_1_FLASK_OF_SORCERER, false); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_TEXT_RETURN, go->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF + 1: player->CastSpell(player, SPELL_CREATE_5_FLASK_OF_SORCERER, false); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_TEXT_RETURN, go->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF + 2: @@ -1291,27 +1303,27 @@ enum InconspicuousLandmark class go_inconspicuous_landmark : public GameObjectScript { - public: - go_inconspicuous_landmark() : GameObjectScript("go_inconspicuous_landmark") - { - _lastUsedTime = time(nullptr); - } +public: + go_inconspicuous_landmark() : GameObjectScript("go_inconspicuous_landmark") + { + _lastUsedTime = time(nullptr); + } - bool OnGossipHello(Player* player, GameObject* /*go*/) override - { - if (player->HasItemCount(ITEM_CUERGOS_KEY)) - return true; - - if (_lastUsedTime > time(nullptr)) - return true; - - _lastUsedTime = time(nullptr) + MINUTE; - player->CastSpell(player, SPELL_SUMMON_PIRATES_TREASURE_AND_TRIGGER_MOB, true); + bool OnGossipHello(Player* player, GameObject* /*go*/) override + { + if (player->HasItemCount(ITEM_CUERGOS_KEY)) return true; - } - private: - uint32 _lastUsedTime; + if (_lastUsedTime > time(nullptr)) + return true; + + _lastUsedTime = time(nullptr) + MINUTE; + player->CastSpell(player, SPELL_SUMMON_PIRATES_TREASURE_AND_TRIGGER_MOB, true); + return true; + } + +private: + uint32 _lastUsedTime; }; /*###### @@ -1337,98 +1349,98 @@ enum SoulWellData class go_soulwell : public GameObjectScript { - public: - go_soulwell() : GameObjectScript("go_soulwell") { } +public: + go_soulwell() : GameObjectScript("go_soulwell") { } - struct go_soulwellAI : public GameObjectAI + struct go_soulwellAI : public GameObjectAI + { + go_soulwellAI(GameObject* go) : GameObjectAI(go) { - go_soulwellAI(GameObject* go) : GameObjectAI(go) + _stoneSpell = 0; + _stoneId = 0; + switch (go->GetEntry()) { - _stoneSpell = 0; - _stoneId = 0; - switch (go->GetEntry()) - { - case GO_SOUL_WELL_R1: - _stoneSpell = SPELL_CREATE_MASTER_HEALTH_STONE_R0; - if (Unit* owner = go->GetOwner()) - { - if (owner->HasAura(SPELL_IMPROVED_HEALTH_STONE_R1)) - _stoneSpell = SPELL_CREATE_MASTER_HEALTH_STONE_R1; - else if (owner->HasAura(SPELL_CREATE_MASTER_HEALTH_STONE_R2)) - _stoneSpell = SPELL_CREATE_MASTER_HEALTH_STONE_R2; - } - break; - case GO_SOUL_WELL_R2: - _stoneSpell = SPELL_CREATE_FEL_HEALTH_STONE_R0; - if (Unit* owner = go->GetOwner()) - { - if (owner->HasAura(SPELL_IMPROVED_HEALTH_STONE_R1)) - _stoneSpell = SPELL_CREATE_FEL_HEALTH_STONE_R1; - else if (owner->HasAura(SPELL_CREATE_MASTER_HEALTH_STONE_R2)) - _stoneSpell = SPELL_CREATE_FEL_HEALTH_STONE_R2; - } - break; - } - if (_stoneSpell == 0) // Should never happen - return; - - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(_stoneSpell); - if (!spellInfo) - return; - - _stoneId = spellInfo->Effects[EFFECT_0].ItemType; + case GO_SOUL_WELL_R1: + _stoneSpell = SPELL_CREATE_MASTER_HEALTH_STONE_R0; + if (Unit* owner = go->GetOwner()) + { + if (owner->HasAura(SPELL_IMPROVED_HEALTH_STONE_R1)) + _stoneSpell = SPELL_CREATE_MASTER_HEALTH_STONE_R1; + else if (owner->HasAura(SPELL_CREATE_MASTER_HEALTH_STONE_R2)) + _stoneSpell = SPELL_CREATE_MASTER_HEALTH_STONE_R2; + } + break; + case GO_SOUL_WELL_R2: + _stoneSpell = SPELL_CREATE_FEL_HEALTH_STONE_R0; + if (Unit* owner = go->GetOwner()) + { + if (owner->HasAura(SPELL_IMPROVED_HEALTH_STONE_R1)) + _stoneSpell = SPELL_CREATE_FEL_HEALTH_STONE_R1; + else if (owner->HasAura(SPELL_CREATE_MASTER_HEALTH_STONE_R2)) + _stoneSpell = SPELL_CREATE_FEL_HEALTH_STONE_R2; + } + break; } + if (_stoneSpell == 0) // Should never happen + return; - /// Due to the fact that this GameObject triggers CMSG_GAMEOBJECT_USE - /// _and_ CMSG_GAMEOBJECT_REPORT_USE, this GossipHello hook is called - /// twice. The script's handling is fine as it won't remove two charges - /// on the well. We have to find how to segregate REPORT_USE and USE. - bool GossipHello(Player* player, bool reportUse) + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(_stoneSpell); + if (!spellInfo) + return; + + _stoneId = spellInfo->Effects[EFFECT_0].ItemType; + } + + /// Due to the fact that this GameObject triggers CMSG_GAMEOBJECT_USE + /// _and_ CMSG_GAMEOBJECT_REPORT_USE, this GossipHello hook is called + /// twice. The script's handling is fine as it won't remove two charges + /// on the well. We have to find how to segregate REPORT_USE and USE. + bool GossipHello(Player* player, bool reportUse) + { + if (reportUse) + return false; + + Unit* owner = go->GetOwner(); + if (_stoneSpell == 0 || _stoneId == 0) { - if (reportUse) - return false; - - Unit* owner = go->GetOwner(); - if (_stoneSpell == 0 || _stoneId == 0) - { - if (SpellInfo const* spell = sSpellMgr->GetSpellInfo(_stoneSpell)) - Spell::SendCastResult(player, spell, 0, SPELL_FAILED_ERROR); - return true; - } - - if (!owner || owner->GetTypeId() != TYPEID_PLAYER || !player->IsInSameRaidWith(owner->ToPlayer())) - { - if (SpellInfo const* spell = sSpellMgr->GetSpellInfo(_stoneSpell)) - Spell::SendCastResult(player, spell, 0, SPELL_FAILED_TARGET_NOT_IN_RAID); - return true; - } - - // Don't try to add a stone if we already have one. - if (player->HasItemCount(_stoneId)) - { - if (SpellInfo const* spell = sSpellMgr->GetSpellInfo(_stoneSpell)) - Spell::SendCastResult(player, spell, 0, SPELL_FAILED_TOO_MANY_OF_ITEM); - return true; - } - - player->CastSpell(player, _stoneSpell, false); - - // Item has to actually be created to remove a charge on the well. - if (player->HasItemCount(_stoneId)) - go->AddUse(); - + if (SpellInfo const* spell = sSpellMgr->GetSpellInfo(_stoneSpell)) + Spell::SendCastResult(player, spell, 0, SPELL_FAILED_ERROR); return true; } - private: - uint32 _stoneSpell; - uint32 _stoneId; - }; + if (!owner || owner->GetTypeId() != TYPEID_PLAYER || !player->IsInSameRaidWith(owner->ToPlayer())) + { + if (SpellInfo const* spell = sSpellMgr->GetSpellInfo(_stoneSpell)) + Spell::SendCastResult(player, spell, 0, SPELL_FAILED_TARGET_NOT_IN_RAID); + return true; + } - GameObjectAI* GetAI(GameObject* go) const - { - return new go_soulwellAI(go); + // Don't try to add a stone if we already have one. + if (player->HasItemCount(_stoneId)) + { + if (SpellInfo const* spell = sSpellMgr->GetSpellInfo(_stoneSpell)) + Spell::SendCastResult(player, spell, 0, SPELL_FAILED_TOO_MANY_OF_ITEM); + return true; + } + + player->CastSpell(player, _stoneSpell, false); + + // Item has to actually be created to remove a charge on the well. + if (player->HasItemCount(_stoneId)) + go->AddUse(); + + return true; } + + private: + uint32 _stoneSpell; + uint32 _stoneId; + }; + + GameObjectAI* GetAI(GameObject* go) const + { + return new go_soulwellAI(go); + } }; /*###### @@ -1523,7 +1535,7 @@ public: bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 action) override { ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF +1) + if (action == GOSSIP_ACTION_INFO_DEF + 1) { CloseGossipMenuFor(player); Creature* target = GetClosestCreatureWithEntry(player, NPC_OUTHOUSE_BUNNY, 3.0f); @@ -1570,22 +1582,22 @@ public: if (go->FindNearestCreature(NPC_HIVE_AMBUSHER, 20.0f)) return true; - go->SummonCreature(NPC_HIVE_AMBUSHER, go->GetPositionX()+1, go->GetPositionY(), go->GetPositionZ(), go->GetAngle(player), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); - go->SummonCreature(NPC_HIVE_AMBUSHER, go->GetPositionX(), go->GetPositionY()+1, go->GetPositionZ(), go->GetAngle(player), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); + go->SummonCreature(NPC_HIVE_AMBUSHER, go->GetPositionX() + 1, go->GetPositionY(), go->GetPositionZ(), go->GetAngle(player), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); + go->SummonCreature(NPC_HIVE_AMBUSHER, go->GetPositionX(), go->GetPositionY() + 1, go->GetPositionZ(), go->GetAngle(player), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); return true; } }; class go_massive_seaforium_charge : public GameObjectScript { - public: - go_massive_seaforium_charge() : GameObjectScript("go_massive_seaforium_charge") { } +public: + go_massive_seaforium_charge() : GameObjectScript("go_massive_seaforium_charge") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override - { - go->SetLootState(GO_JUST_DEACTIVATED); - return true; - } + bool OnGossipHello(Player* /*player*/, GameObject* go) override + { + go->SetLootState(GO_JUST_DEACTIVATED); + return true; + } }; /*######## @@ -1594,9 +1606,9 @@ class go_massive_seaforium_charge : public GameObjectScript enum MissingFriends { - QUEST_MISSING_FRIENDS = 10852, - NPC_CAPTIVE_CHILD = 22314, - SAY_FREE_0 = 0, + QUEST_MISSING_FRIENDS = 10852, + NPC_CAPTIVE_CHILD = 22314, + SAY_FREE_0 = 0, }; class go_veil_skith_cage : public GameObjectScript @@ -1615,7 +1627,7 @@ public: { player->KilledMonsterCredit(NPC_CAPTIVE_CHILD, (*itr)->GetGUID()); (*itr)->DespawnOrUnsummon(5000); - (*itr)->GetMotionMaster()->MovePoint(1, go->GetPositionX()+5, go->GetPositionY(), go->GetPositionZ()); + (*itr)->GetMotionMaster()->MovePoint(1, go->GetPositionX() + 5, go->GetPositionY(), go->GetPositionZ()); (*itr)->AI()->Talk(SAY_FREE_0); (*itr)->GetMotionMaster()->Clear(); } diff --git a/src/server/scripts/World/guards.cpp b/src/server/scripts/World/guards.cpp index c7df5bdc4..1b89f0349 100644 --- a/src/server/scripts/World/guards.cpp +++ b/src/server/scripts/World/guards.cpp @@ -65,7 +65,8 @@ public: playerGUID = 0; exileTimer = 8500; canTeleport = false; - } else exileTimer -= diff; + } + else exileTimer -= diff; } else if (banishTimer <= diff) { @@ -78,7 +79,8 @@ public: if (playerGUID) canTeleport = true; } - } else banishTimer -= diff; + } + else banishTimer -= diff; DoMeleeAttackIfReady(); } @@ -130,7 +132,8 @@ public: playerGUID = 0; exileTimer = 8500; canTeleport = false; - } else exileTimer -= diff; + } + else exileTimer -= diff; } else if (banishTimer <= diff) { @@ -143,7 +146,8 @@ public: if (playerGUID) canTeleport = true; } - } else banishTimer -= diff; + } + else banishTimer -= diff; DoMeleeAttackIfReady(); } diff --git a/src/server/scripts/World/item_scripts.cpp b/src/server/scripts/World/item_scripts.cpp index 328c894e2..57d7d9f70 100644 --- a/src/server/scripts/World/item_scripts.cpp +++ b/src/server/scripts/World/item_scripts.cpp @@ -45,15 +45,15 @@ public: //for special scripts switch (itemId) { - case 24538: + case 24538: if (player->GetAreaId() != 3628) disabled = true; break; - case 34489: + case 34489: if (player->GetZoneId() != 4080) disabled = true; break; - case 34475: + case 34475: if (const SpellInfo* spellInfo = sSpellMgr->GetSpellInfo(SPELL_ARCANE_CHARGES)) Spell::SendCastResult(player, spellInfo, 1, SPELL_FAILED_NOT_ON_GROUND); break; @@ -82,10 +82,10 @@ public: { if (player->GetQuestStatus(10832) == QUEST_STATUS_INCOMPLETE) { - if (Creature* nether = player->SummonCreature(22408, player->GetPositionX(), player->GetPositionY()+20, player->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 180000)) + if (Creature* nether = player->SummonCreature(22408, player->GetPositionX(), player->GetPositionY() + 20, player->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 180000)) nether->AI()->AttackStart(player); - if (Creature* nether = player->SummonCreature(22408, player->GetPositionX(), player->GetPositionY()-20, player->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 180000)) + if (Creature* nether = player->SummonCreature(22408, player->GetPositionX(), player->GetPositionY() - 20, player->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 180000)) nether->AI()->AttackStart(player); } return false; @@ -104,7 +104,7 @@ public: bool OnUse(Player* player, Item* item, SpellCastTargets const& targets) { if (targets.GetUnitTarget() && targets.GetUnitTarget()->GetTypeId() == TYPEID_UNIT && - targets.GetUnitTarget()->GetEntry() == 20748 && !targets.GetUnitTarget()->HasAura(32578)) + targets.GetUnitTarget()->GetEntry() == 20748 && !targets.GetUnitTarget()->HasAura(32578)) return false; player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, item, nullptr); @@ -121,7 +121,7 @@ class item_incendiary_explosives : public ItemScript public: item_incendiary_explosives() : ItemScript("item_incendiary_explosives") { } - bool OnUse(Player* player, Item* item, SpellCastTargets const & /*targets*/) + bool OnUse(Player* player, Item* item, SpellCastTargets const& /*targets*/) { if (player->FindNearestCreature(26248, 15) || player->FindNearestCreature(26249, 15)) return false; @@ -189,7 +189,7 @@ class item_petrov_cluster_bombs : public ItemScript public: item_petrov_cluster_bombs() : ItemScript("item_petrov_cluster_bombs") { } - bool OnUse(Player* player, Item* item, const SpellCastTargets & /*targets*/) + bool OnUse(Player* player, Item* item, const SpellCastTargets& /*targets*/) { if (player->GetZoneId() != ZONE_ID_HOWLING) return false; diff --git a/src/server/scripts/World/mob_generic_creature.cpp b/src/server/scripts/World/mob_generic_creature.cpp index afd1ad822..709ea8d63 100644 --- a/src/server/scripts/World/mob_generic_creature.cpp +++ b/src/server/scripts/World/mob_generic_creature.cpp @@ -70,7 +70,8 @@ public: BuffTimer = 600000; }//Try agian in 30 seconds else BuffTimer = 30000; - } else BuffTimer -= diff; + } + else BuffTimer -= diff; } //Return since we have no target diff --git a/src/server/scripts/World/npc_innkeeper.cpp b/src/server/scripts/World/npc_innkeeper.cpp index 0bb23c1a8..9270df2b7 100644 --- a/src/server/scripts/World/npc_innkeeper.cpp +++ b/src/server/scripts/World/npc_innkeeper.cpp @@ -22,7 +22,7 @@ public: bool OnGossipHello(Player* player, Creature* creature) override { if (IsEventActive(HALLOWEEN_EVENTID) && !player->HasAura(SPELL_TRICKED_OR_TREATED)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Trick or Treat!", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+HALLOWEEN_EVENTID); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Trick or Treat!", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + HALLOWEEN_EVENTID); if (creature->IsQuestGiver()) player->PrepareQuestMenu(creature->GetGUID()); @@ -41,7 +41,7 @@ public: bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override { ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+HALLOWEEN_EVENTID && IsEventActive(HALLOWEEN_EVENTID) && !player->HasAura(SPELL_TRICKED_OR_TREATED)) + if (action == GOSSIP_ACTION_INFO_DEF + HALLOWEEN_EVENTID && IsEventActive(HALLOWEEN_EVENTID) && !player->HasAura(SPELL_TRICKED_OR_TREATED)) { player->CastSpell(player, SPELL_TRICKED_OR_TREATED, true); creature->CastSpell(player, roll_chance_i(50) ? SPELL_TRICK : SPELL_TREAT, true); @@ -54,8 +54,12 @@ public: switch (action) { - case GOSSIP_ACTION_TRADE: player->GetSession()->SendListInventory(creature->GetGUID()); break; - case GOSSIP_ACTION_INN: player->SetBindPoint(creature->GetGUID()); break; + case GOSSIP_ACTION_TRADE: + player->GetSession()->SendListInventory(creature->GetGUID()); + break; + case GOSSIP_ACTION_INN: + player->SetBindPoint(creature->GetGUID()); + break; } return true; } diff --git a/src/server/scripts/World/npc_professions.cpp b/src/server/scripts/World/npc_professions.cpp index eb0c9a629..8fbf01498 100644 --- a/src/server/scripts/World/npc_professions.cpp +++ b/src/server/scripts/World/npc_professions.cpp @@ -487,7 +487,7 @@ public: case GOSSIP_ACTION_TRAIN: player->GetSession()->SendTrainerList(creature->GetGUID()); break; - //Learn Alchemy + //Learn Alchemy case GOSSIP_ACTION_INFO_DEF + 1: ProcessCastaction(player, creature, S_TRANSMUTE, S_LEARN_TRANSMUTE, DoLearnCost(player)); break; @@ -497,7 +497,7 @@ public: case GOSSIP_ACTION_INFO_DEF + 3: ProcessCastaction(player, creature, S_POTION, S_LEARN_POTION, DoLearnCost(player)); break; - //Unlearn Alchemy + //Unlearn Alchemy case GOSSIP_ACTION_INFO_DEF + 4: ProcessUnlearnAction(player, creature, S_UNLEARN_TRANSMUTE, 0, DoHighUnlearnCost(player)); break; @@ -518,17 +518,17 @@ public: { case N_TRAINER_TRANSMUTE: AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_TRANSMUTE, GOSSIP_SENDER_CHECK, action); - //unknown textID () + //unknown textID () SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); break; case N_TRAINER_ELIXIR: AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_ELIXIR, GOSSIP_SENDER_CHECK, action); - //unknown textID () + //unknown textID () SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); break; case N_TRAINER_POTION: AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_POTION, GOSSIP_SENDER_CHECK, action); - //unknown textID () + //unknown textID () SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); break; } @@ -543,17 +543,17 @@ public: { case N_TRAINER_TRANSMUTE: //Zarevhi AddGossipItemFor(player, 0, GOSSIP_UNLEARN_TRANSMUTE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ALCHEMY_SPEC, DoHighUnlearnCost(player), false); - //unknown textID () + //unknown textID () SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); break; case N_TRAINER_ELIXIR: //Lorokeem AddGossipItemFor(player, 0, GOSSIP_UNLEARN_ELIXIR, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ALCHEMY_SPEC, DoHighUnlearnCost(player), false); - //unknown textID () + //unknown textID () SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); break; case N_TRAINER_POTION: //Lauranna Thar'well AddGossipItemFor(player, 0, GOSSIP_UNLEARN_POTION, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ALCHEMY_SPEC, DoHighUnlearnCost(player), false); - //unknown textID () + //unknown textID () SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); break; } @@ -678,14 +678,14 @@ public: case GOSSIP_ACTION_TRAIN: player->GetSession()->SendTrainerList(creature->GetGUID()); break; - //Learn Armor/Weapon + //Learn Armor/Weapon case GOSSIP_ACTION_INFO_DEF + 1: ProcessCastaction(player, creature, S_ARMOR, S_LEARN_ARMOR, 0); break; case GOSSIP_ACTION_INFO_DEF + 2: ProcessCastaction(player, creature, S_WEAPON, S_LEARN_WEAPON, 0); break; - //Unlearn Armor/Weapon + //Unlearn Armor/Weapon case GOSSIP_ACTION_INFO_DEF + 3: if (HasWeaponSub(player)) SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); @@ -695,7 +695,7 @@ public: case GOSSIP_ACTION_INFO_DEF + 4: ProcessUnlearnAction(player, creature, S_UNLEARN_ARMOR, S_REP_WEAPON, DoLowUnlearnCost(player)); break; - //Learn Hammer/Axe/Sword + //Learn Hammer/Axe/Sword case GOSSIP_ACTION_INFO_DEF + 5: ProcessCastaction(player, creature, S_HAMMER, S_LEARN_HAMMER, 0); break; @@ -705,7 +705,7 @@ public: case GOSSIP_ACTION_INFO_DEF + 7: ProcessCastaction(player, creature, S_SWORD, S_LEARN_SWORD, 0); break; - //Unlearn Hammer/Axe/Sword + //Unlearn Hammer/Axe/Sword case GOSSIP_ACTION_INFO_DEF + 8: ProcessUnlearnAction(player, creature, S_UNLEARN_HAMMER, 0, DoMedUnlearnCost(player)); break; @@ -726,17 +726,17 @@ public: { case N_TRAINER_HAMMER: AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_HAMMER, GOSSIP_SENDER_CHECK, action); - //unknown textID (TALK_HAMMER_LEARN) + //unknown textID (TALK_HAMMER_LEARN) SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); break; case N_TRAINER_AXE: AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_AXE, GOSSIP_SENDER_CHECK, action); - //unknown textID (TALK_AXE_LEARN) + //unknown textID (TALK_AXE_LEARN) SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); break; case N_TRAINER_SWORD: AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SWORD, GOSSIP_SENDER_CHECK, action); - //unknown textID (TALK_SWORD_LEARN) + //unknown textID (TALK_SWORD_LEARN) SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); break; } @@ -754,23 +754,23 @@ public: case N_TRAINER_ARMOR1: //Grumnus Steelshaper case N_TRAINER_ARMOR2: //Okothos Ironrager AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SMITH_SPEC, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ARMORORWEAPON, DoLowUnlearnCost(player), false); - //unknown textID (TALK_UNLEARN_AXEORWEAPON) + //unknown textID (TALK_UNLEARN_AXEORWEAPON) SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); break; case N_TRAINER_HAMMER: AddGossipItemFor(player, 0, GOSSIP_UNLEARN_HAMMER, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false); - //unknown textID (TALK_HAMMER_UNLEARN) + //unknown textID (TALK_HAMMER_UNLEARN) SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); break; case N_TRAINER_AXE: AddGossipItemFor(player, 0, GOSSIP_UNLEARN_AXE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false); - //unknown textID (TALK_AXE_UNLEARN) + //unknown textID (TALK_AXE_UNLEARN) SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); break; case N_TRAINER_SWORD: AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SWORD, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false); - //unknown textID (TALK_SWORD_UNLEARN) + //unknown textID (TALK_SWORD_UNLEARN) SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); break; } @@ -1031,7 +1031,7 @@ public: if (creature->IsTrainer()) AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); - //TAILORING SPEC + //TAILORING SPEC if (player->HasSkill(SKILL_TAILORING) && player->GetBaseSkillValue(SKILL_TAILORING) >= 350 && player->getLevel() > 59) { if (player->GetQuestRewardStatus(10831) || player->GetQuestRewardStatus(10832) || player->GetQuestRewardStatus(10833)) @@ -1074,7 +1074,7 @@ public: case GOSSIP_ACTION_TRAIN: player->GetSession()->SendTrainerList(creature->GetGUID()); break; - //Learn Tailor + //Learn Tailor case GOSSIP_ACTION_INFO_DEF + 1: ProcessCastaction(player, creature, S_SPELLFIRE, S_LEARN_SPELLFIRE, DoLearnCost(player)); break; @@ -1084,7 +1084,7 @@ public: case GOSSIP_ACTION_INFO_DEF + 3: ProcessCastaction(player, creature, S_SHADOWEAVE, S_LEARN_SHADOWEAVE, DoLearnCost(player)); break; - //Unlearn Tailor + //Unlearn Tailor case GOSSIP_ACTION_INFO_DEF + 4: ProcessUnlearnAction(player, creature, S_UNLEARN_SPELLFIRE, 0, DoHighUnlearnCost(player)); break; @@ -1105,17 +1105,17 @@ public: { case N_TRAINER_SPELLFIRE: AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SPELLFIRE, GOSSIP_SENDER_CHECK, action); - //unknown textID () + //unknown textID () SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); break; case N_TRAINER_MOONCLOTH: AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_MOONCLOTH, GOSSIP_SENDER_CHECK, action); - //unknown textID () + //unknown textID () SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); break; case N_TRAINER_SHADOWEAVE: AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SHADOWEAVE, GOSSIP_SENDER_CHECK, action); - //unknown textID () + //unknown textID () SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); break; } @@ -1130,17 +1130,17 @@ public: { case N_TRAINER_SPELLFIRE: //Gidge Spellweaver AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SPELLFIRE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false); - //unknown textID () + //unknown textID () SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); break; case N_TRAINER_MOONCLOTH: //Nasmara Moonsong AddGossipItemFor(player, 0, GOSSIP_UNLEARN_MOONCLOTH, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false); - //unknown textID () + //unknown textID () SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); break; case N_TRAINER_SHADOWEAVE: //Andrion Darkspinner AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SHADOWEAVE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false); - //unknown textID () + //unknown textID () SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); break; } @@ -1178,7 +1178,8 @@ public: go_evil_book_for_dummies() : GameObjectScript("go_evil_book_for_dummies") { } bool OnGossipHello(Player* player, GameObject* gameobject) override - { //TAILORING SPEC + { + //TAILORING SPEC if (player->HasSkill(SKILL_ENGINEERING) && player->GetBaseSkillValue(SKILL_ENGINEERING) >= 225 && player->getLevel() >= 35) { if (player->GetQuestRewardStatus(3643) || player->GetQuestRewardStatus(3641) || player->GetQuestRewardStatus(3639)) @@ -1265,8 +1266,12 @@ public: ClearGossipMenuFor(player); switch(uiSender) { - case GOSSIP_SENDER_LEARN: SendActionMenu(player, gameobject, uiAction); break; - case GOSSIP_SENDER_UNLEARN: SendActionMenu(player, gameobject, uiAction); break; + case GOSSIP_SENDER_LEARN: + SendActionMenu(player, gameobject, uiAction); + break; + case GOSSIP_SENDER_UNLEARN: + SendActionMenu(player, gameobject, uiAction); + break; } return true; } diff --git a/src/server/scripts/World/npc_taxi.cpp b/src/server/scripts/World/npc_taxi.cpp index e5d85aa1e..53ac29b47 100644 --- a/src/server/scripts/World/npc_taxi.cpp +++ b/src/server/scripts/World/npc_taxi.cpp @@ -55,90 +55,90 @@ public: switch (creature->GetEntry()) { - case 17435: // Azuremyst Isle - Susurrus - if (player->HasItemCount(23843, 1, true)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_SUSURRUS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - break; - case 20903: // Netherstorm - Protectorate Nether Drake - if (player->GetQuestStatus(10438) == QUEST_STATUS_INCOMPLETE && player->HasItemCount(29778)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_NETHER_DRAKE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - break; - case 29154: // Stormwind City - Thargold Ironwing - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_IRONWING, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - break; - case 19409: // Hellfire Peninsula - Wing Commander Dabir'ee - //Mission: The Murketh and Shaadraz Gateways - if (player->GetQuestStatus(10146) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_DABIREE1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); + case 17435: // Azuremyst Isle - Susurrus + if (player->HasItemCount(23843, 1, true)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_SUSURRUS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + break; + case 20903: // Netherstorm - Protectorate Nether Drake + if (player->GetQuestStatus(10438) == QUEST_STATUS_INCOMPLETE && player->HasItemCount(29778)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_NETHER_DRAKE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + break; + case 29154: // Stormwind City - Thargold Ironwing + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_IRONWING, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + break; + case 19409: // Hellfire Peninsula - Wing Commander Dabir'ee + //Mission: The Murketh and Shaadraz Gateways + if (player->GetQuestStatus(10146) == QUEST_STATUS_INCOMPLETE) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_DABIREE1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); - //Shatter Point - if (!player->GetQuestRewardStatus(10340)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_DABIREE2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); - break; - case 19401: // Hellfire Peninsula - Wing Commander Brack - //Mission: The Murketh and Shaadraz Gateways - if (player->GetQuestStatus(10129) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BRACK1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 8); + //Shatter Point + if (!player->GetQuestRewardStatus(10340)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_DABIREE2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); + break; + case 19401: // Hellfire Peninsula - Wing Commander Brack + //Mission: The Murketh and Shaadraz Gateways + if (player->GetQuestStatus(10129) == QUEST_STATUS_INCOMPLETE) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BRACK1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 8); - //Mission: The Abyssal Shelf || Return to the Abyssal Shelf - if (player->GetQuestStatus(10162) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(10347) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BRACK2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9); + //Mission: The Abyssal Shelf || Return to the Abyssal Shelf + if (player->GetQuestStatus(10162) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(10347) == QUEST_STATUS_INCOMPLETE) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BRACK2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9); - //Spinebreaker Post - if (player->GetQuestStatus(10242) == QUEST_STATUS_COMPLETE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BRACK3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 10); - break; - case 23413: // Blade's Edge Mountains - Skyguard Handler Irena - if (player->GetReputationRank(1031) >= REP_HONORED) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_IRENA, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11); - break; - case 25059: // Isle of Quel'Danas - Ayren Cloudbreaker - if (player->GetQuestStatus(11532) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(11533) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_CLOUDBREAKER1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 12); + //Spinebreaker Post + if (player->GetQuestStatus(10242) == QUEST_STATUS_COMPLETE) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BRACK3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 10); + break; + case 23413: // Blade's Edge Mountains - Skyguard Handler Irena + if (player->GetReputationRank(1031) >= REP_HONORED) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_IRENA, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11); + break; + case 25059: // Isle of Quel'Danas - Ayren Cloudbreaker + if (player->GetQuestStatus(11532) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(11533) == QUEST_STATUS_INCOMPLETE) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_CLOUDBREAKER1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 12); - if (player->GetQuestStatus(11542) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(11543) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_CLOUDBREAKER2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 13); - break; - case 25236: // Isle of Quel'Danas - Unrestrained Dragonhawk - if (player->GetQuestStatus(11542) == QUEST_STATUS_COMPLETE || player->GetQuestStatus(11543) == QUEST_STATUS_COMPLETE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_DRAGONHAWK, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 14); - break; - case 20162: // Netherstorm - Veronia - //Behind Enemy Lines - if (player->GetQuestStatus(10652) != QUEST_STATUS_REWARDED) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_VERONIA, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 15); - break; - case 23415: // Terokkar Forest - Skyguard Handler Deesak - if (player->GetReputationRank(1031) >= REP_HONORED) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_DEESAK, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 16); - break; - case 27575: // Dragonblight - Lord Afrasastrasz - // middle -> ground - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_AFRASASTRASZ1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 17); - // middle -> top - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_AFRASASTRASZ2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 18); - break; - case 26443: // Dragonblight - Tariolstrasz //need to check if quests are required before gossip available (12123, 12124) - // ground -> top - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_TARIOLSTRASZ1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 19); - // ground -> middle - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_TARIOLSTRASZ2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 20); - break; - case 26949: // Dragonblight - Torastrasza - // top -> middle - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_TORASTRASZA1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 21); - // top -> ground - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_TORASTRASZA2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 22); - break; - case 23704: // Dustwallow Marsh - Cassa Crimsonwing - if (player->GetQuestStatus(11142) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_CRIMSONWING, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+25); - break; - case 17209: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_WILLIAMKEILAR1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 26); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_WILLIAMKEILAR2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 27); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_WILLIAMKEILAR3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 28); - break; + if (player->GetQuestStatus(11542) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(11543) == QUEST_STATUS_INCOMPLETE) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_CLOUDBREAKER2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 13); + break; + case 25236: // Isle of Quel'Danas - Unrestrained Dragonhawk + if (player->GetQuestStatus(11542) == QUEST_STATUS_COMPLETE || player->GetQuestStatus(11543) == QUEST_STATUS_COMPLETE) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_DRAGONHAWK, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 14); + break; + case 20162: // Netherstorm - Veronia + //Behind Enemy Lines + if (player->GetQuestStatus(10652) != QUEST_STATUS_REWARDED) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_VERONIA, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 15); + break; + case 23415: // Terokkar Forest - Skyguard Handler Deesak + if (player->GetReputationRank(1031) >= REP_HONORED) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_DEESAK, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 16); + break; + case 27575: // Dragonblight - Lord Afrasastrasz + // middle -> ground + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_AFRASASTRASZ1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 17); + // middle -> top + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_AFRASASTRASZ2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 18); + break; + case 26443: // Dragonblight - Tariolstrasz //need to check if quests are required before gossip available (12123, 12124) + // ground -> top + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_TARIOLSTRASZ1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 19); + // ground -> middle + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_TARIOLSTRASZ2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 20); + break; + case 26949: // Dragonblight - Torastrasza + // top -> middle + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_TORASTRASZA1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 21); + // top -> ground + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_TORASTRASZA2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 22); + break; + case 23704: // Dustwallow Marsh - Cassa Crimsonwing + if (player->GetQuestStatus(11142) == QUEST_STATUS_INCOMPLETE) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_CRIMSONWING, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 25); + break; + case 17209: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_WILLIAMKEILAR1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 26); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_WILLIAMKEILAR2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 27); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_WILLIAMKEILAR3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 28); + break; } SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); @@ -150,112 +150,112 @@ public: ClearGossipMenuFor(player); switch (action) { - case GOSSIP_ACTION_INFO_DEF: - //spellId is correct, however it gives flight a somewhat funny effect //TaxiPath 506. - CloseGossipMenuFor(player); - player->CastSpell(player, 32474, true); - break; - case GOSSIP_ACTION_INFO_DEF + 1: - CloseGossipMenuFor(player); - player->ActivateTaxiPathTo(627); //TaxiPath 627 (possibly 627+628(152->153->154->155)) - break; - case GOSSIP_ACTION_INFO_DEF + 3: - CloseGossipMenuFor(player); - player->CastSpell(player, 53335, true); //TaxiPath 1041 (Stormwind Harbor) - break; - case GOSSIP_ACTION_INFO_DEF + 4: - CloseGossipMenuFor(player); - player->CastSpell(player, 33768, true); //TaxiPath 585 (Gateways Murket and Shaadraz) - break; - case GOSSIP_ACTION_INFO_DEF + 5: - CloseGossipMenuFor(player); - player->CastSpell(player, 35069, true); //TaxiPath 612 (Taxi - Hellfire Peninsula - Expedition Point to Shatter Point) - break; - case GOSSIP_ACTION_INFO_DEF + 8: - CloseGossipMenuFor(player); - player->CastSpell(player, 33659, true); //TaxiPath 584 (Gateways Murket and Shaadraz) - break; - case GOSSIP_ACTION_INFO_DEF + 9: - CloseGossipMenuFor(player); - player->CastSpell(player, 33825, true); //TaxiPath 587 (Aerial Assault Flight (Horde)) - break; - case GOSSIP_ACTION_INFO_DEF + 10: - CloseGossipMenuFor(player); - player->CastSpell(player, 34578, true); //TaxiPath 604 (Taxi - Reaver's Fall to Spinebreaker Ridge) - break; - case GOSSIP_ACTION_INFO_DEF + 11: - CloseGossipMenuFor(player); - player->CastSpell(player, 41278, true); //TaxiPath 706 - break; - case GOSSIP_ACTION_INFO_DEF + 12: - CloseGossipMenuFor(player); - player->CastSpell(player, 45071, true); //TaxiPath 779 - break; - case GOSSIP_ACTION_INFO_DEF + 13: - CloseGossipMenuFor(player); - player->CastSpell(player, 45113, true); //TaxiPath 784 - break; - case GOSSIP_ACTION_INFO_DEF + 14: - CloseGossipMenuFor(player); - player->CastSpell(player, 45353, true); //TaxiPath 788 - break; - case GOSSIP_ACTION_INFO_DEF + 15: - CloseGossipMenuFor(player); - player->CastSpell(player, 34905, true); //TaxiPath 606 - break; - case GOSSIP_ACTION_INFO_DEF + 16: - CloseGossipMenuFor(player); - player->CastSpell(player, 41279, true); //TaxiPath 705 (Taxi - Skettis to Skyguard Outpost) - break; - case GOSSIP_ACTION_INFO_DEF + 17: - CloseGossipMenuFor(player); - player->ActivateTaxiPathTo(882); - break; - case GOSSIP_ACTION_INFO_DEF + 18: - CloseGossipMenuFor(player); - player->ActivateTaxiPathTo(881); - break; - case GOSSIP_ACTION_INFO_DEF + 19: - CloseGossipMenuFor(player); - player->ActivateTaxiPathTo(878); - break; - case GOSSIP_ACTION_INFO_DEF + 20: - CloseGossipMenuFor(player); - player->ActivateTaxiPathTo(883); - break; - case GOSSIP_ACTION_INFO_DEF + 21: - CloseGossipMenuFor(player); - player->ActivateTaxiPathTo(880); - break; - case GOSSIP_ACTION_INFO_DEF + 22: - CloseGossipMenuFor(player); - player->ActivateTaxiPathTo(879); - break; - case GOSSIP_ACTION_INFO_DEF + 23: - CloseGossipMenuFor(player); - player->CastSpell(player, 43074, true); //TaxiPath 736 - break; - case GOSSIP_ACTION_INFO_DEF + 24: - CloseGossipMenuFor(player); - //player->ActivateTaxiPathTo(738); - player->CastSpell(player, 43136, false); - break; - case GOSSIP_ACTION_INFO_DEF + 25: - CloseGossipMenuFor(player); - player->CastSpell(player, 42295, true); - break; - case GOSSIP_ACTION_INFO_DEF + 26: - CloseGossipMenuFor(player); - player->ActivateTaxiPathTo(494); - break; - case GOSSIP_ACTION_INFO_DEF + 27: - CloseGossipMenuFor(player); - player->ActivateTaxiPathTo(495); - break; - case GOSSIP_ACTION_INFO_DEF + 28: - CloseGossipMenuFor(player); - player->ActivateTaxiPathTo(496); - break; + case GOSSIP_ACTION_INFO_DEF: + //spellId is correct, however it gives flight a somewhat funny effect //TaxiPath 506. + CloseGossipMenuFor(player); + player->CastSpell(player, 32474, true); + break; + case GOSSIP_ACTION_INFO_DEF + 1: + CloseGossipMenuFor(player); + player->ActivateTaxiPathTo(627); //TaxiPath 627 (possibly 627+628(152->153->154->155)) + break; + case GOSSIP_ACTION_INFO_DEF + 3: + CloseGossipMenuFor(player); + player->CastSpell(player, 53335, true); //TaxiPath 1041 (Stormwind Harbor) + break; + case GOSSIP_ACTION_INFO_DEF + 4: + CloseGossipMenuFor(player); + player->CastSpell(player, 33768, true); //TaxiPath 585 (Gateways Murket and Shaadraz) + break; + case GOSSIP_ACTION_INFO_DEF + 5: + CloseGossipMenuFor(player); + player->CastSpell(player, 35069, true); //TaxiPath 612 (Taxi - Hellfire Peninsula - Expedition Point to Shatter Point) + break; + case GOSSIP_ACTION_INFO_DEF + 8: + CloseGossipMenuFor(player); + player->CastSpell(player, 33659, true); //TaxiPath 584 (Gateways Murket and Shaadraz) + break; + case GOSSIP_ACTION_INFO_DEF + 9: + CloseGossipMenuFor(player); + player->CastSpell(player, 33825, true); //TaxiPath 587 (Aerial Assault Flight (Horde)) + break; + case GOSSIP_ACTION_INFO_DEF + 10: + CloseGossipMenuFor(player); + player->CastSpell(player, 34578, true); //TaxiPath 604 (Taxi - Reaver's Fall to Spinebreaker Ridge) + break; + case GOSSIP_ACTION_INFO_DEF + 11: + CloseGossipMenuFor(player); + player->CastSpell(player, 41278, true); //TaxiPath 706 + break; + case GOSSIP_ACTION_INFO_DEF + 12: + CloseGossipMenuFor(player); + player->CastSpell(player, 45071, true); //TaxiPath 779 + break; + case GOSSIP_ACTION_INFO_DEF + 13: + CloseGossipMenuFor(player); + player->CastSpell(player, 45113, true); //TaxiPath 784 + break; + case GOSSIP_ACTION_INFO_DEF + 14: + CloseGossipMenuFor(player); + player->CastSpell(player, 45353, true); //TaxiPath 788 + break; + case GOSSIP_ACTION_INFO_DEF + 15: + CloseGossipMenuFor(player); + player->CastSpell(player, 34905, true); //TaxiPath 606 + break; + case GOSSIP_ACTION_INFO_DEF + 16: + CloseGossipMenuFor(player); + player->CastSpell(player, 41279, true); //TaxiPath 705 (Taxi - Skettis to Skyguard Outpost) + break; + case GOSSIP_ACTION_INFO_DEF + 17: + CloseGossipMenuFor(player); + player->ActivateTaxiPathTo(882); + break; + case GOSSIP_ACTION_INFO_DEF + 18: + CloseGossipMenuFor(player); + player->ActivateTaxiPathTo(881); + break; + case GOSSIP_ACTION_INFO_DEF + 19: + CloseGossipMenuFor(player); + player->ActivateTaxiPathTo(878); + break; + case GOSSIP_ACTION_INFO_DEF + 20: + CloseGossipMenuFor(player); + player->ActivateTaxiPathTo(883); + break; + case GOSSIP_ACTION_INFO_DEF + 21: + CloseGossipMenuFor(player); + player->ActivateTaxiPathTo(880); + break; + case GOSSIP_ACTION_INFO_DEF + 22: + CloseGossipMenuFor(player); + player->ActivateTaxiPathTo(879); + break; + case GOSSIP_ACTION_INFO_DEF + 23: + CloseGossipMenuFor(player); + player->CastSpell(player, 43074, true); //TaxiPath 736 + break; + case GOSSIP_ACTION_INFO_DEF + 24: + CloseGossipMenuFor(player); + //player->ActivateTaxiPathTo(738); + player->CastSpell(player, 43136, false); + break; + case GOSSIP_ACTION_INFO_DEF + 25: + CloseGossipMenuFor(player); + player->CastSpell(player, 42295, true); + break; + case GOSSIP_ACTION_INFO_DEF + 26: + CloseGossipMenuFor(player); + player->ActivateTaxiPathTo(494); + break; + case GOSSIP_ACTION_INFO_DEF + 27: + CloseGossipMenuFor(player); + player->ActivateTaxiPathTo(495); + break; + case GOSSIP_ACTION_INFO_DEF + 28: + CloseGossipMenuFor(player); + player->ActivateTaxiPathTo(496); + break; } return true; diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index e9d3dab3c..0790d50a0 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -71,7 +71,7 @@ public: struct npc_elder_clearwaterAI : public ScriptedAI { - npc_elder_clearwaterAI(Creature *c) : ScriptedAI(c) + npc_elder_clearwaterAI(Creature* c) : ScriptedAI(c) { events.Reset(); events.ScheduleEvent(EVENT_CLEARWATER_ANNOUNCE, 1000, 1, 0); @@ -107,37 +107,37 @@ public: switch (events.GetEvent()) { case EVENT_CLEARWATER_ANNOUNCE: - { - time_t curtime = time(nullptr); - tm strdate; - localtime_r(&curtime, &strdate); + { + time_t curtime = time(nullptr); + tm strdate; + localtime_r(&curtime, &strdate); - if (!preWarning && strdate.tm_hour == 13 && strdate.tm_min == 55) - { - sCreatureTextMgr->SendChat(me, CLEARWATER_SAY_PRE, 0, CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, TEXT_RANGE_MAP); - preWarning = true; - } - if (!startWarning && strdate.tm_hour == 14 && strdate.tm_min == 0) - { - sCreatureTextMgr->SendChat(me, CLEARWATER_SAY_START, 0, CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, TEXT_RANGE_MAP); - startWarning = true; - } - if (!finishWarning && strdate.tm_hour == 15 && strdate.tm_min == 0) - { - sCreatureTextMgr->SendChat(me, CLEARWATER_SAY_END, 0, CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, TEXT_RANGE_MAP); - finishWarning = true; - // no one won - despawn - if (!finished) + if (!preWarning && strdate.tm_hour == 13 && strdate.tm_min == 55) { - me->DespawnOrUnsummon(); - events.PopEvent(); - break; + sCreatureTextMgr->SendChat(me, CLEARWATER_SAY_PRE, 0, CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, TEXT_RANGE_MAP); + preWarning = true; + } + if (!startWarning && strdate.tm_hour == 14 && strdate.tm_min == 0) + { + sCreatureTextMgr->SendChat(me, CLEARWATER_SAY_START, 0, CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, TEXT_RANGE_MAP); + startWarning = true; + } + if (!finishWarning && strdate.tm_hour == 15 && strdate.tm_min == 0) + { + sCreatureTextMgr->SendChat(me, CLEARWATER_SAY_END, 0, CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, TEXT_RANGE_MAP); + finishWarning = true; + // no one won - despawn + if (!finished) + { + me->DespawnOrUnsummon(); + events.PopEvent(); + break; + } } - } - events.RepeatEvent(1000); - break; - } + events.RepeatEvent(1000); + break; + } } } }; @@ -156,7 +156,7 @@ public: else return true; - QuestMenu &qm = player->PlayerTalkClass->GetQuestMenu(); + QuestMenu& qm = player->PlayerTalkClass->GetQuestMenu(); qm.ClearMenu(); for (QuestRelations::const_iterator i = pObjectQIR.first; i != pObjectQIR.second; ++i) @@ -218,7 +218,7 @@ public: struct npc_riggle_bassbaitAI : public ScriptedAI { - npc_riggle_bassbaitAI(Creature *c) : ScriptedAI(c) + npc_riggle_bassbaitAI(Creature* c) : ScriptedAI(c) { events.Reset(); events.ScheduleEvent(EVENT_RIGGLE_ANNOUNCE, 1000, 1, 0); @@ -252,31 +252,31 @@ public: switch (events.GetEvent()) { case EVENT_RIGGLE_ANNOUNCE: - { - time_t curtime = time(nullptr); - tm strdate; - localtime_r(&curtime, &strdate); - if (!startWarning && strdate.tm_hour == 14 && strdate.tm_min == 0) { - sCreatureTextMgr->SendChat(me, RIGGLE_SAY_START, 0, CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, TEXT_RANGE_ZONE); - startWarning = true; - } - if (!finishWarning && strdate.tm_hour == 16 && strdate.tm_min == 0) - { - sCreatureTextMgr->SendChat(me, RIGGLE_SAY_END, 0, CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, TEXT_RANGE_ZONE); - finishWarning = true; - // no one won - despawn - if (!finished) + time_t curtime = time(nullptr); + tm strdate; + localtime_r(&curtime, &strdate); + if (!startWarning && strdate.tm_hour == 14 && strdate.tm_min == 0) { - me->DespawnOrUnsummon(); - events.PopEvent(); - break; + sCreatureTextMgr->SendChat(me, RIGGLE_SAY_START, 0, CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, TEXT_RANGE_ZONE); + startWarning = true; + } + if (!finishWarning && strdate.tm_hour == 16 && strdate.tm_min == 0) + { + sCreatureTextMgr->SendChat(me, RIGGLE_SAY_END, 0, CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, TEXT_RANGE_ZONE); + finishWarning = true; + // no one won - despawn + if (!finished) + { + me->DespawnOrUnsummon(); + events.PopEvent(); + break; + } } - } - events.RepeatEvent(1000); - break; - } + events.RepeatEvent(1000); + break; + } } } }; @@ -578,55 +578,55 @@ public: switch (SpawnAssoc->spawnType) { case SPAWNTYPE_ALARMBOT: - { - if (!who->IsWithinDistInMap(me, RANGE_GUARDS_MARK)) - return; - - Aura* markAura = who->GetAura(SPELL_GUARDS_MARK); - if (markAura) { - // the target wasn't able to move out of our range within 25 seconds - if (!lastSpawnedGuard) + if (!who->IsWithinDistInMap(me, RANGE_GUARDS_MARK)) + return; + + Aura* markAura = who->GetAura(SPELL_GUARDS_MARK); + if (markAura) { - lastSpawnedGuard = SummonGuard(); + // the target wasn't able to move out of our range within 25 seconds + if (!lastSpawnedGuard) + { + lastSpawnedGuard = SummonGuard(); + + if (!lastSpawnedGuard) + return; + } + + if (markAura->GetDuration() < AURA_DURATION_TIME_LEFT) + if (!lastSpawnedGuard->GetVictim()) + lastSpawnedGuard->AI()->AttackStart(who); + } + else + { + if (!lastSpawnedGuard) + lastSpawnedGuard = SummonGuard(); if (!lastSpawnedGuard) return; - } - if (markAura->GetDuration() < AURA_DURATION_TIME_LEFT) - if (!lastSpawnedGuard->GetVictim()) - lastSpawnedGuard->AI()->AttackStart(who); + lastSpawnedGuard->CastSpell(who, SPELL_GUARDS_MARK, true); + } + break; } - else + case SPAWNTYPE_TRIPWIRE_ROOFTOP: { + if (!who->IsWithinDistInMap(me, RANGE_TRIPWIRE)) + return; + if (!lastSpawnedGuard) lastSpawnedGuard = SummonGuard(); if (!lastSpawnedGuard) return; - lastSpawnedGuard->CastSpell(who, SPELL_GUARDS_MARK, true); + // ROOFTOP only triggers if the player is on the ground + if (!playerTarget->IsFlying() && !lastSpawnedGuard->GetVictim()) + lastSpawnedGuard->AI()->AttackStart(who); + + break; } - break; - } - case SPAWNTYPE_TRIPWIRE_ROOFTOP: - { - if (!who->IsWithinDistInMap(me, RANGE_TRIPWIRE)) - return; - - if (!lastSpawnedGuard) - lastSpawnedGuard = SummonGuard(); - - if (!lastSpawnedGuard) - return; - - // ROOFTOP only triggers if the player is on the ground - if (!playerTarget->IsFlying() && !lastSpawnedGuard->GetVictim()) - lastSpawnedGuard->AI()->AttackStart(who); - - break; - } } } } @@ -885,7 +885,7 @@ struct Location float x, y, z, o; }; -static Location AllianceCoords[]= +static Location AllianceCoords[] = { {-3757.38f, -4533.05f, 14.16f, 3.62f}, // Top-far-right bunk as seen from entrance {-3754.36f, -4539.13f, 14.16f, 5.13f}, // Top-far-left bunk @@ -901,7 +901,7 @@ static Location AllianceCoords[]= #define A_RUNTOY -4531.52f #define A_RUNTOZ 11.91f -static Location HordeCoords[]= +static Location HordeCoords[] = { {-1013.75f, -3492.59f, 62.62f, 4.34f}, // Left, Behind {-1017.72f, -3490.92f, 62.62f, 4.34f}, // Right, Behind @@ -1107,7 +1107,8 @@ public: uint32 mobId = me->GetEntry(); switch (mobId) - { //lower max health + { + //lower max health case 12923: case 12938: //Injured Soldier me->SetHealth(me->CountPctFromMaxHealth(75)); @@ -1557,13 +1558,13 @@ public: player->PrepareQuestMenu(creature->GetGUID()); if (player->HasSpellCooldown(SPELL_INT) || - player->HasSpellCooldown(SPELL_ARM) || - player->HasSpellCooldown(SPELL_DMG) || - player->HasSpellCooldown(SPELL_RES) || - player->HasSpellCooldown(SPELL_STR) || - player->HasSpellCooldown(SPELL_AGI) || - player->HasSpellCooldown(SPELL_STM) || - player->HasSpellCooldown(SPELL_SPI)) + player->HasSpellCooldown(SPELL_ARM) || + player->HasSpellCooldown(SPELL_DMG) || + player->HasSpellCooldown(SPELL_RES) || + player->HasSpellCooldown(SPELL_STR) || + player->HasSpellCooldown(SPELL_AGI) || + player->HasSpellCooldown(SPELL_STM) || + player->HasSpellCooldown(SPELL_SPI)) SendGossipMenuFor(player, 7393, creature->GetGUID()); else { @@ -1630,42 +1631,42 @@ public: break; case GOSSIP_SENDER_MAIN + 1: creature->CastSpell(player, SPELL_DMG, false); - player->AddSpellCooldown(SPELL_DMG, 0, 2*HOUR*IN_MILLISECONDS); + player->AddSpellCooldown(SPELL_DMG, 0, 2 * HOUR * IN_MILLISECONDS); SendAction(player, creature, action); break; case GOSSIP_SENDER_MAIN + 2: creature->CastSpell(player, SPELL_RES, false); - player->AddSpellCooldown(SPELL_RES, 0, 2*HOUR*IN_MILLISECONDS); + player->AddSpellCooldown(SPELL_RES, 0, 2 * HOUR * IN_MILLISECONDS); SendAction(player, creature, action); break; case GOSSIP_SENDER_MAIN + 3: creature->CastSpell(player, SPELL_ARM, false); - player->AddSpellCooldown(SPELL_ARM, 0, 2*HOUR*IN_MILLISECONDS); + player->AddSpellCooldown(SPELL_ARM, 0, 2 * HOUR * IN_MILLISECONDS); SendAction(player, creature, action); break; case GOSSIP_SENDER_MAIN + 4: creature->CastSpell(player, SPELL_SPI, false); - player->AddSpellCooldown(SPELL_SPI, 0, 2*HOUR*IN_MILLISECONDS); + player->AddSpellCooldown(SPELL_SPI, 0, 2 * HOUR * IN_MILLISECONDS); SendAction(player, creature, action); break; case GOSSIP_SENDER_MAIN + 5: creature->CastSpell(player, SPELL_INT, false); - player->AddSpellCooldown(SPELL_INT, 0, 2*HOUR*IN_MILLISECONDS); + player->AddSpellCooldown(SPELL_INT, 0, 2 * HOUR * IN_MILLISECONDS); SendAction(player, creature, action); break; case GOSSIP_SENDER_MAIN + 6: creature->CastSpell(player, SPELL_STM, false); - player->AddSpellCooldown(SPELL_STM, 0, 2*HOUR*IN_MILLISECONDS); + player->AddSpellCooldown(SPELL_STM, 0, 2 * HOUR * IN_MILLISECONDS); SendAction(player, creature, action); break; case GOSSIP_SENDER_MAIN + 7: creature->CastSpell(player, SPELL_STR, false); - player->AddSpellCooldown(SPELL_STR, 0, 2*HOUR*IN_MILLISECONDS); + player->AddSpellCooldown(SPELL_STR, 0, 2 * HOUR * IN_MILLISECONDS); SendAction(player, creature, action); break; case GOSSIP_SENDER_MAIN + 8: creature->CastSpell(player, SPELL_AGI, false); - player->AddSpellCooldown(SPELL_AGI, 0, 2*HOUR*IN_MILLISECONDS); + player->AddSpellCooldown(SPELL_AGI, 0, 2 * HOUR * IN_MILLISECONDS); SendAction(player, creature, action); break; } @@ -1733,88 +1734,88 @@ enum WormholeSpells class npc_wormhole : public CreatureScript { - public: - npc_wormhole() : CreatureScript("npc_wormhole") { } +public: + npc_wormhole() : CreatureScript("npc_wormhole") { } - struct npc_wormholeAI : public PassiveAI + struct npc_wormholeAI : public PassiveAI + { + npc_wormholeAI(Creature* creature) : PassiveAI(creature) { } + + void InitializeAI() { - npc_wormholeAI(Creature* creature) : PassiveAI(creature) { } - - void InitializeAI() - { - _showUnderground = urand(0, 100) == 0; // Guessed value, it is really rare though - } - - uint32 GetData(uint32 type) const - { - return (type == DATA_SHOW_UNDERGROUND && _showUnderground) ? 1 : 0; - } - - private: - bool _showUnderground; - }; - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsSummon()) - { - if (player == creature->ToTempSummon()->GetSummoner()) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ENGINEERING1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ENGINEERING2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ENGINEERING3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ENGINEERING4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ENGINEERING5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); - - if (creature->AI()->GetData(DATA_SHOW_UNDERGROUND)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ENGINEERING6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); - - SendGossipMenuFor(player, TEXT_WORMHOLE, creature); - } - } - - return true; + _showUnderground = urand(0, 100) == 0; // Guessed value, it is really rare though } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override + uint32 GetData(uint32 type) const { - ClearGossipMenuFor(player); + return (type == DATA_SHOW_UNDERGROUND && _showUnderground) ? 1 : 0; + } - switch (action) + private: + bool _showUnderground; + }; + + bool OnGossipHello(Player* player, Creature* creature) override + { + if (creature->IsSummon()) + { + if (player == creature->ToTempSummon()->GetSummoner()) { - case GOSSIP_ACTION_INFO_DEF + 1: // Borean Tundra - CloseGossipMenuFor(player); - creature->CastSpell(player, SPELL_BOREAN_TUNDRA, false); - break; - case GOSSIP_ACTION_INFO_DEF + 2: // Howling Fjord - CloseGossipMenuFor(player); - creature->CastSpell(player, SPELL_HOWLING_FJORD, false); - break; - case GOSSIP_ACTION_INFO_DEF + 3: // Sholazar Basin - CloseGossipMenuFor(player); - creature->CastSpell(player, SPELL_SHOLAZAR_BASIN, false); - break; - case GOSSIP_ACTION_INFO_DEF + 4: // Icecrown - CloseGossipMenuFor(player); - creature->CastSpell(player, SPELL_ICECROWN, false); - break; - case GOSSIP_ACTION_INFO_DEF + 5: // Storm peaks - CloseGossipMenuFor(player); - creature->CastSpell(player, SPELL_STORM_PEAKS, false); - break; - case GOSSIP_ACTION_INFO_DEF + 6: // Underground - CloseGossipMenuFor(player); - creature->CastSpell(player, SPELL_UNDERGROUND, false); - break; + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ENGINEERING1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ENGINEERING2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ENGINEERING3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ENGINEERING4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ENGINEERING5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); + + if (creature->AI()->GetData(DATA_SHOW_UNDERGROUND)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ENGINEERING6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); + + SendGossipMenuFor(player, TEXT_WORMHOLE, creature); } - - return true; } - CreatureAI* GetAI(Creature* creature) const override + return true; + } + + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override + { + ClearGossipMenuFor(player); + + switch (action) { - return new npc_wormholeAI(creature); + case GOSSIP_ACTION_INFO_DEF + 1: // Borean Tundra + CloseGossipMenuFor(player); + creature->CastSpell(player, SPELL_BOREAN_TUNDRA, false); + break; + case GOSSIP_ACTION_INFO_DEF + 2: // Howling Fjord + CloseGossipMenuFor(player); + creature->CastSpell(player, SPELL_HOWLING_FJORD, false); + break; + case GOSSIP_ACTION_INFO_DEF + 3: // Sholazar Basin + CloseGossipMenuFor(player); + creature->CastSpell(player, SPELL_SHOLAZAR_BASIN, false); + break; + case GOSSIP_ACTION_INFO_DEF + 4: // Icecrown + CloseGossipMenuFor(player); + creature->CastSpell(player, SPELL_ICECROWN, false); + break; + case GOSSIP_ACTION_INFO_DEF + 5: // Storm peaks + CloseGossipMenuFor(player); + creature->CastSpell(player, SPELL_STORM_PEAKS, false); + break; + case GOSSIP_ACTION_INFO_DEF + 6: // Underground + CloseGossipMenuFor(player); + creature->CastSpell(player, SPELL_UNDERGROUND, false); + break; } + + return true; + } + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_wormholeAI(creature); + } }; /*###### @@ -1917,12 +1918,12 @@ public: // Skeleton Key if ((player->GetQuestRewardStatus(QUEST_THE_KEY_TO_SCHOLOMANCE_A) || player->GetQuestRewardStatus(QUEST_THE_KEY_TO_SCHOLOMANCE_H)) && - !player->HasItemCount(ITEM_SKELETON_KEY, 1, true)) + !player->HasItemCount(ITEM_SKELETON_KEY, 1, true)) AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LOST_SKELETON_KEY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); // Shatered Halls Key if ((player->GetQuestRewardStatus(QUEST_HOTTER_THAN_HELL_A) || player->GetQuestRewardStatus(QUEST_HOTTER_THAN_HELL_H)) && - !player->HasItemCount(ITEM_SHATTERED_HALLS_KEY, 1, true)) + !player->HasItemCount(ITEM_SHATTERED_HALLS_KEY, 1, true)) AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LOST_SHATTERED_HALLS_KEY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); // Master's Key @@ -2292,7 +2293,7 @@ public: if (GameObject* launcher = FindNearestLauncher()) { launcher->SendCustomAnim(ANIM_GO_LAUNCH_FIREWORK); - me->SetOrientation(launcher->GetOrientation() + M_PI/2); + me->SetOrientation(launcher->GetOrientation() + M_PI / 2); } else return; @@ -2310,7 +2311,7 @@ public: case 1: case 2: case 3: - if (Creature* minion = me->SummonCreature(NPC_MINION_OF_OMEN, me->GetPositionX()+frand(-5.0f, 5.0f), me->GetPositionY()+frand(-5.0f, 5.0f), me->GetPositionZ(), 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000)) + if (Creature* minion = me->SummonCreature(NPC_MINION_OF_OMEN, me->GetPositionX() + frand(-5.0f, 5.0f), me->GetPositionY() + frand(-5.0f, 5.0f), me->GetPositionZ(), 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000)) minion->AI()->AttackStart(me->SelectNearestPlayer(20.0f)); break; case 9: @@ -2324,7 +2325,7 @@ public: float displacement = 0.7f; for (uint8 i = 0; i < 4; i++) - me->SummonGameObject(GetFireworkGameObjectId(), me->GetPositionX() + (i%2 == 0 ? displacement : -displacement), me->GetPositionY() + (i > 1 ? displacement : -displacement), me->GetPositionZ() + 4.0f, me->GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 1); + me->SummonGameObject(GetFireworkGameObjectId(), me->GetPositionX() + (i % 2 == 0 ? displacement : -displacement), me->GetPositionY() + (i > 1 ? displacement : -displacement), me->GetPositionZ() + 4.0f, me->GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 1); } else //me->CastSpell(me, GetFireworkSpell(me->GetEntry()), true); @@ -2401,13 +2402,15 @@ public: if (Unit* rabbit = ObjectAccessor::GetUnit(*me, rabbitGUID)) DoCast(rabbit, SPELL_SPRING_RABBIT_JUMP); jumpTimer = urand(5000, 10000); - } else jumpTimer -= diff; + } + else jumpTimer -= diff; if (bunnyTimer <= diff) { DoCast(SPELL_SUMMON_BABY_BUNNY); bunnyTimer = urand(20000, 40000); - } else bunnyTimer -= diff; + } + else bunnyTimer -= diff; } else { @@ -2426,7 +2429,8 @@ public: rabbitGUID = rabbit->GetGUID(); } searchTimer = urand(5000, 10000); - } else searchTimer -= diff; + } + else searchTimer -= diff; } } }; @@ -2447,54 +2451,54 @@ enum StableMasters class npc_stable_master : public CreatureScript { - public: - npc_stable_master() : CreatureScript("npc_stable_master") { } +public: + npc_stable_master() : CreatureScript("npc_stable_master") { } - struct npc_stable_masterAI : public SmartAI + struct npc_stable_masterAI : public SmartAI + { + npc_stable_masterAI(Creature* creature) : SmartAI(creature) { } + + void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) { - npc_stable_masterAI(Creature* creature) : SmartAI(creature) { } + SmartAI::sGossipSelect(player, menuId, gossipListId); + if (menuId != STABLE_MASTER_GOSSIP_SUB_MENU) + return; - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) + switch (gossipListId) { - SmartAI::sGossipSelect(player, menuId, gossipListId); - if (menuId != STABLE_MASTER_GOSSIP_SUB_MENU) + case 0: + player->CastSpell(player, SPELL_MINIWING, false); + break; + case 1: + player->CastSpell(player, SPELL_JUBLING, false); + break; + case 2: + player->CastSpell(player, SPELL_DARTER, false); + break; + case 3: + player->CastSpell(player, SPELL_WORG, false); + break; + case 4: + player->CastSpell(player, SPELL_SMOLDERWEB, false); + break; + case 5: + player->CastSpell(player, SPELL_CHIKEN, false); + break; + case 6: + player->CastSpell(player, SPELL_WOLPERTINGER, false); + break; + default: return; - - switch (gossipListId) - { - case 0: - player->CastSpell(player, SPELL_MINIWING, false); - break; - case 1: - player->CastSpell(player, SPELL_JUBLING, false); - break; - case 2: - player->CastSpell(player, SPELL_DARTER, false); - break; - case 3: - player->CastSpell(player, SPELL_WORG, false); - break; - case 4: - player->CastSpell(player, SPELL_SMOLDERWEB, false); - break; - case 5: - player->CastSpell(player, SPELL_CHIKEN, false); - break; - case 6: - player->CastSpell(player, SPELL_WOLPERTINGER, false); - break; - default: - return; - } - - player->PlayerTalkClass->SendCloseGossip(); } - }; - CreatureAI* GetAI(Creature* creature) const - { - return new npc_stable_masterAI(creature); + player->PlayerTalkClass->SendCloseGossip(); } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_stable_masterAI(creature); + } }; void AddSC_npcs_special()