diff options
Diffstat (limited to 'src/server/scripts')
150 files changed, 11189 insertions, 16418 deletions
diff --git a/src/server/scripts/CMakeLists.txt b/src/server/scripts/CMakeLists.txt index f193cf4aa6a..334920d9c8b 100644 --- a/src/server/scripts/CMakeLists.txt +++ b/src/server/scripts/CMakeLists.txt @@ -37,6 +37,7 @@ if(SCRIPTS)    include(Kalimdor/CMakeLists.txt)    include(Outland/CMakeLists.txt)    include(Northrend/CMakeLists.txt) +  include(Maelstrom/CMakeLists.txt)    include(Events/CMakeLists.txt)    include(Pet/CMakeLists.txt)  endif() @@ -91,6 +92,7 @@ include_directories(    ${CMAKE_SOURCE_DIR}/src/server/game/Combat    ${CMAKE_SOURCE_DIR}/src/server/game/DataStores    ${CMAKE_SOURCE_DIR}/src/server/game/DungeonFinding +  ${CMAKE_SOURCE_DIR}/src/server/game/Entities/AreaTrigger    ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Corpse    ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Creature    ${CMAKE_SOURCE_DIR}/src/server/game/Entities/DynamicObject diff --git a/src/server/scripts/Commands/cs_account.cpp b/src/server/scripts/Commands/cs_account.cpp index 4b7aa8ecad3..bef9ae9532e 100644 --- a/src/server/scripts/Commands/cs_account.cpp +++ b/src/server/scripts/Commands/cs_account.cpp @@ -126,10 +126,9 @@ public:          if (!accountName || !password)              return false; -        AccountOpResult result = sAccountMgr->CreateAccount(std::string(accountName), std::string(password), email); -        switch (result) +        switch (sAccountMgr->CreateAccount(std::string(accountName), std::string(password), email))          { -            case AOR_OK: +            case AccountOpResult::AOR_OK:                  handler->PSendSysMessage(LANG_ACCOUNT_CREATED, accountName);                  if (handler->GetSession())                  { @@ -139,15 +138,15 @@ public:                          accountName, email.c_str());                  }                  break; -            case AOR_NAME_TOO_LONG: +            case AccountOpResult::AOR_NAME_TOO_LONG:                  handler->SendSysMessage(LANG_ACCOUNT_TOO_LONG);                  handler->SetSentErrorMessage(true);                  return false; -            case AOR_NAME_ALREADY_EXIST: +            case AccountOpResult::AOR_NAME_ALREADY_EXIST:                  handler->SendSysMessage(LANG_ACCOUNT_ALREADY_EXIST);                  handler->SetSentErrorMessage(true);                  return false; -            case AOR_DB_INTERNAL_ERROR: +            case AccountOpResult::AOR_DB_INTERNAL_ERROR:                  handler->PSendSysMessage(LANG_ACCOUNT_NOT_CREATED_SQL_ERROR, accountName);                  handler->SetSentErrorMessage(true);                  return false; @@ -173,7 +172,7 @@ public:              return false;          std::string accountName = account; -        if (!AccountMgr::normalizeString(accountName)) +        if (!Utf8ToUpperOnlyLatin(accountName))          {              handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str());              handler->SetSentErrorMessage(true); @@ -197,14 +196,14 @@ public:          AccountOpResult result = AccountMgr::DeleteAccount(accountId);          switch (result)          { -            case AOR_OK: +            case AccountOpResult::AOR_OK:                  handler->PSendSysMessage(LANG_ACCOUNT_DELETED, accountName.c_str());                  break; -            case AOR_NAME_NOT_EXIST: +            case AccountOpResult::AOR_NAME_NOT_EXIST:                  handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str());                  handler->SetSentErrorMessage(true);                  return false; -            case AOR_DB_INTERNAL_ERROR: +            case AccountOpResult::AOR_DB_INTERNAL_ERROR:                  handler->PSendSysMessage(LANG_ACCOUNT_NOT_DELETED_SQL_ERROR, accountName.c_str());                  handler->SetSentErrorMessage(true);                  return false; @@ -420,7 +419,7 @@ public:          AccountOpResult result = AccountMgr::ChangeEmail(handler->GetSession()->GetAccountId(), std::string(email));          switch (result)          { -            case AOR_OK: +            case AccountOpResult::AOR_OK:                  handler->SendSysMessage(LANG_COMMAND_EMAIL);                  sScriptMgr->OnEmailChange(handler->GetSession()->GetAccountId());                  TC_LOG_INFO("entities.player.character", "Account: %u (IP: %s) Character:[%s] (GUID: %u) Changed Email from [%s] to [%s].", @@ -428,7 +427,7 @@ public:                      handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow(),                      oldEmail, email);                  break; -            case AOR_EMAIL_TOO_LONG: +            case AccountOpResult::AOR_EMAIL_TOO_LONG:                  handler->SendSysMessage(LANG_EMAIL_TOO_LONG);                  sScriptMgr->OnFailedEmailChange(handler->GetSession()->GetAccountId());                  handler->SetSentErrorMessage(true); @@ -510,14 +509,14 @@ public:          AccountOpResult result = AccountMgr::ChangePassword(handler->GetSession()->GetAccountId(), std::string(newPassword));          switch (result)          { -            case AOR_OK: +            case AccountOpResult::AOR_OK:                  handler->SendSysMessage(LANG_COMMAND_PASSWORD);                  sScriptMgr->OnPasswordChange(handler->GetSession()->GetAccountId());                  TC_LOG_INFO("entities.player.character", "Account: %u (IP: %s) Character:[%s] (GUID: %u) Changed Password.",                      handler->GetSession()->GetAccountId(), handler->GetSession()->GetRemoteAddress().c_str(),                      handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow());                  break; -            case AOR_PASS_TOO_LONG: +            case AccountOpResult::AOR_PASS_TOO_LONG:                  handler->SendSysMessage(LANG_PASSWORD_TOO_LONG);                  sScriptMgr->OnFailedPasswordChange(handler->GetSession()->GetAccountId());                  handler->SetSentErrorMessage(true); @@ -597,7 +596,7 @@ public:          {              ///- Convert Account name to Upper Format              accountName = account; -            if (!AccountMgr::normalizeString(accountName)) +            if (!Utf8ToUpperOnlyLatin(accountName))              {                  handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str());                  handler->SetSentErrorMessage(true); @@ -667,7 +666,7 @@ public:          if (isAccountNameGiven)          {              targetAccountName = arg1; -            if (!AccountMgr::normalizeString(targetAccountName)) +            if (!Utf8ToUpperOnlyLatin(targetAccountName))              {                  handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, targetAccountName.c_str());                  handler->SetSentErrorMessage(true); @@ -755,7 +754,7 @@ public:              return false;          std::string accountName = account; -        if (!AccountMgr::normalizeString(accountName)) +        if (!Utf8ToUpperOnlyLatin(accountName))          {              handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str());              handler->SetSentErrorMessage(true); @@ -786,14 +785,14 @@ public:          switch (result)          { -            case AOR_OK: +            case AccountOpResult::AOR_OK:                  handler->SendSysMessage(LANG_COMMAND_PASSWORD);                  break; -            case AOR_NAME_NOT_EXIST: +            case AccountOpResult::AOR_NAME_NOT_EXIST:                  handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str());                  handler->SetSentErrorMessage(true);                  return false; -            case AOR_PASS_TOO_LONG: +            case AccountOpResult::AOR_PASS_TOO_LONG:                  handler->SendSysMessage(LANG_PASSWORD_TOO_LONG);                  handler->SetSentErrorMessage(true);                  return false; @@ -824,7 +823,7 @@ public:          }          std::string accountName = account; -        if (!AccountMgr::normalizeString(accountName)) +        if (!Utf8ToUpperOnlyLatin(accountName))          {              handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str());              handler->SetSentErrorMessage(true); @@ -854,16 +853,16 @@ public:          AccountOpResult result = AccountMgr::ChangeEmail(targetAccountId, email);          switch (result)          { -            case AOR_OK: +            case AccountOpResult::AOR_OK:                  handler->SendSysMessage(LANG_COMMAND_EMAIL);                  TC_LOG_INFO("entities.player.character", "ChangeEmail: Account %s [Id: %u] had it's email changed to %s.",                      accountName.c_str(), targetAccountId, email);                  break; -            case AOR_NAME_NOT_EXIST: +            case AccountOpResult::AOR_NAME_NOT_EXIST:                  handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str());                  handler->SetSentErrorMessage(true);                  return false; -            case AOR_EMAIL_TOO_LONG: +            case AccountOpResult::AOR_EMAIL_TOO_LONG:                  handler->SendSysMessage(LANG_EMAIL_TOO_LONG);                  handler->SetSentErrorMessage(true);                  return false; @@ -900,7 +899,7 @@ public:          }          std::string accountName = account; -        if (!AccountMgr::normalizeString(accountName)) +        if (!Utf8ToUpperOnlyLatin(accountName))          {              handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str());              handler->SetSentErrorMessage(true); @@ -930,16 +929,16 @@ public:          AccountOpResult result = AccountMgr::ChangeRegEmail(targetAccountId, email);          switch (result)          { -            case AOR_OK: +            case AccountOpResult::AOR_OK:                  handler->SendSysMessage(LANG_COMMAND_EMAIL);                  TC_LOG_INFO("entities.player.character", "ChangeRegEmail: Account %s [Id: %u] had it's Registration Email changed to %s.",                      accountName.c_str(), targetAccountId, email);                  break; -            case AOR_NAME_NOT_EXIST: +            case AccountOpResult::AOR_NAME_NOT_EXIST:                  handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str());                  handler->SetSentErrorMessage(true);                  return false; -            case AOR_EMAIL_TOO_LONG: +            case AccountOpResult::AOR_EMAIL_TOO_LONG:                  handler->SendSysMessage(LANG_EMAIL_TOO_LONG);                  handler->SetSentErrorMessage(true);                  return false; diff --git a/src/server/scripts/Commands/cs_ban.cpp b/src/server/scripts/Commands/cs_ban.cpp index 6143a4ca344..880cf1eac1f 100644 --- a/src/server/scripts/Commands/cs_ban.cpp +++ b/src/server/scripts/Commands/cs_ban.cpp @@ -176,7 +176,7 @@ public:          switch (mode)          {              case BAN_ACCOUNT: -                if (!AccountMgr::normalizeString(nameOrIP)) +                if (!Utf8ToUpperOnlyLatin(nameOrIP))                  {                      handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, nameOrIP.c_str());                      handler->SetSentErrorMessage(true); @@ -249,7 +249,7 @@ public:              return false;          std::string accountName = nameStr; -        if (!AccountMgr::normalizeString(accountName)) +        if (!Utf8ToUpperOnlyLatin(accountName))          {              handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str());              handler->SetSentErrorMessage(true); @@ -717,7 +717,7 @@ public:          switch (mode)          {              case BAN_ACCOUNT: -                if (!AccountMgr::normalizeString(nameOrIP)) +                if (!Utf8ToUpperOnlyLatin(nameOrIP))                  {                      handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, nameOrIP.c_str());                      handler->SetSentErrorMessage(true); diff --git a/src/server/scripts/Commands/cs_battlenet_account.cpp b/src/server/scripts/Commands/cs_battlenet_account.cpp new file mode 100644 index 00000000000..dfbff501144 --- /dev/null +++ b/src/server/scripts/Commands/cs_battlenet_account.cpp @@ -0,0 +1,336 @@ +/* + * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "BattlenetAccountMgr.h" +#include "AccountMgr.h" +#include "Chat.h" +#include "Language.h" +#include "Player.h" +#include "ScriptMgr.h" + +class battlenet_account_commandscript : public CommandScript +{ +public: +    battlenet_account_commandscript() : CommandScript("battlenet_account_commandscript") { } + +    ChatCommand* GetCommands() const override +    { +        static ChatCommand accountSetCommandTable[] = +        { +            { "password", rbac::RBAC_PERM_COMMAND_BNET_ACCOUNT_SET_PASSWORD, true,  &HandleAccountSetPasswordCommand, "", NULL }, +            { NULL,       0,                                                 false, NULL,                             "", NULL } +        }; + +        static ChatCommand accountLockCommandTable[] = +        { +            { "country", rbac::RBAC_PERM_COMMAND_BNET_ACCOUNT_LOCK_COUNTRY, true,  &HandleAccountLockCountryCommand, "", NULL }, +            { "ip",      rbac::RBAC_PERM_COMMAND_BNET_ACCOUNT_LOCK_IP,      true,  &HandleAccountLockIpCommand,      "", NULL }, +            { NULL,      0,                                                 false, NULL,                             "", NULL } +        }; + +        static ChatCommand accountCommandTable[] = +        { +            { "create",     rbac::RBAC_PERM_COMMAND_BNET_ACCOUNT_CREATE,      true,  &HandleAccountCreateCommand,     "", NULL                    }, +            { "lock",       rbac::RBAC_PERM_COMMAND_BNET_ACCOUNT,             false, NULL,                            "", accountLockCommandTable }, +            { "set",        rbac::RBAC_PERM_COMMAND_BNET_ACCOUNT_SET,         true,  NULL,                            "", accountSetCommandTable  }, +            { "password",   rbac::RBAC_PERM_COMMAND_BNET_ACCOUNT_PASSWORD,    false, &HandleAccountPasswordCommand,   "", NULL                    }, +            { NULL,         0,                                                false, NULL,                            "", NULL                    } +        }; + +        static ChatCommand commandTable[] = +        { +            { "battlenetaccount", rbac::RBAC_PERM_COMMAND_BNET_ACCOUNT, true,  NULL, "", accountCommandTable }, +            { NULL,               0,                                    false, NULL, "", NULL                } +        }; + +        return commandTable; +    } + +    /// Create an account +    static bool HandleAccountCreateCommand(ChatHandler* handler, char const* args) +    { +        if (!*args) +            return false; + +        std::string email; + +        ///- %Parse the command line arguments +        char* accountName = strtok((char*)args, " "); +        char* password = strtok(NULL, " "); +        if (!accountName || !password) +            return false; + +        if (!strchr(accountName, '@')) +        { +            handler->SendSysMessage(LANG_ACCOUNT_INVALID_BNET_NAME); +            handler->SetSentErrorMessage(true); +            return false; +        } + +        switch (Battlenet::AccountMgr::CreateBattlenetAccount(std::string(accountName), std::string(password))) +        { +            case AccountOpResult::AOR_OK: +                handler->PSendSysMessage(LANG_ACCOUNT_CREATED, accountName); +                if (handler->GetSession()) +                { +                    TC_LOG_INFO("entities.player.character", "Battle.net account: %d (IP: %s) Character:[%s] (GUID: %u) created Account %s", +                        handler->GetSession()->GetAccountId(), handler->GetSession()->GetRemoteAddress().c_str(), +                        handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow(), +                        accountName); +                } +                break; +            case AccountOpResult::AOR_NAME_TOO_LONG: +                handler->SendSysMessage(LANG_ACCOUNT_TOO_LONG); +                handler->SetSentErrorMessage(true); +                return false; +            case AccountOpResult::AOR_NAME_ALREADY_EXIST: +                handler->SendSysMessage(LANG_ACCOUNT_ALREADY_EXIST); +                handler->SetSentErrorMessage(true); +                return false; +            case AccountOpResult::AOR_PASS_TOO_LONG: +                handler->SendSysMessage(LANG_PASSWORD_TOO_LONG); +                handler->SetSentErrorMessage(true); +                return false; +            default: +                break; +        } + +        return true; +    } + +    // Sets country lock on own account +    static bool HandleAccountLockCountryCommand(ChatHandler* handler, char const* args) +    { +        if (!*args) +        { +            handler->SendSysMessage(LANG_USE_BOL); +            handler->SetSentErrorMessage(true); +            return false; +        } + +        std::string param = (char*)args; +        if (!param.empty()) +        { +            if (param == "on") +            { +                PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_LOGON_COUNTRY); +                uint32 ip = inet_addr(handler->GetSession()->GetRemoteAddress().c_str()); +                EndianConvertReverse(ip); +                stmt->setUInt32(0, ip); +                PreparedQueryResult result = LoginDatabase.Query(stmt); +                if (result) +                { +                    Field* fields = result->Fetch(); +                    std::string country = fields[0].GetString(); +                    stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_BNET_ACCOUNT_LOCK_CONTRY); +                    stmt->setString(0, country); +                    stmt->setUInt32(1, handler->GetSession()->GetBattlenetAccountId()); +                    LoginDatabase.Execute(stmt); +                    handler->PSendSysMessage(LANG_COMMAND_ACCLOCKLOCKED); +                } +                else +                { +                    handler->PSendSysMessage("[IP2NATION] Table empty"); +                    TC_LOG_DEBUG("server.authserver", "[IP2NATION] Table empty"); +                } +            } +            else if (param == "off") +            { +                PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_BNET_ACCOUNT_LOCK_CONTRY); +                stmt->setString(0, "00"); +                stmt->setUInt32(1, handler->GetSession()->GetBattlenetAccountId()); +                LoginDatabase.Execute(stmt); +                handler->PSendSysMessage(LANG_COMMAND_ACCLOCKUNLOCKED); +            } +            return true; +        } + +        handler->SendSysMessage(LANG_USE_BOL); +        handler->SetSentErrorMessage(true); +        return false; +    } + +    // Sets ip lock on own account +    static bool HandleAccountLockIpCommand(ChatHandler* handler, char const* args) +    { +        if (!*args) +        { +            handler->SendSysMessage(LANG_USE_BOL); +            handler->SetSentErrorMessage(true); +            return false; +        } + +        std::string param = (char*)args; + +        if (!param.empty()) +        { +            PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_BNET_ACCOUNT_LOCK); + +            if (param == "on") +            { +                stmt->setBool(0, true);                                     // locked +                handler->PSendSysMessage(LANG_COMMAND_ACCLOCKLOCKED); +            } +            else if (param == "off") +            { +                stmt->setBool(0, false);                                    // unlocked +                handler->PSendSysMessage(LANG_COMMAND_ACCLOCKUNLOCKED); +            } + +            stmt->setUInt32(1, handler->GetSession()->GetBattlenetAccountId()); + +            LoginDatabase.Execute(stmt); +            return true; +        } + +        handler->SendSysMessage(LANG_USE_BOL); +        handler->SetSentErrorMessage(true); +        return false; +    } + +    static bool HandleAccountPasswordCommand(ChatHandler* handler, char const* args) +    { +        // If no args are given at all, we can return false right away. +        if (!*args) +        { +            handler->SendSysMessage(LANG_CMD_SYNTAX); +            handler->SetSentErrorMessage(true); +            return false; +        } + +        // Command is supposed to be: .account password [$oldpassword] [$newpassword] [$newpasswordconfirmation] [$emailconfirmation] +        char* oldPassword = strtok((char*)args, " ");       // This extracts [$oldpassword] +        char* newPassword = strtok(NULL, " ");              // This extracts [$newpassword] +        char* passwordConfirmation = strtok(NULL, " ");     // This extracts [$newpasswordconfirmation] + +        //Is any of those variables missing for any reason ? We return false. +        if (!oldPassword || !newPassword || !passwordConfirmation) +        { +            handler->SendSysMessage(LANG_CMD_SYNTAX); +            handler->SetSentErrorMessage(true); +            return false; +        } + +        // We compare the old, saved password to the entered old password - no chance for the unauthorized. +        if (!Battlenet::AccountMgr::CheckPassword(handler->GetSession()->GetAccountId(), std::string(oldPassword))) +        { +            handler->SendSysMessage(LANG_COMMAND_WRONGOLDPASSWORD); +            handler->SetSentErrorMessage(true); +            TC_LOG_INFO("entities.player.character", "Battle.net account: %u (IP: %s) Character:[%s] (GUID: %u) Tried to change password, but the provided old password is wrong.", +                handler->GetSession()->GetAccountId(), handler->GetSession()->GetRemoteAddress().c_str(), +                handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow()); +            return false; +        } + +        // Making sure that newly entered password is correctly entered. +        if (strcmp(newPassword, passwordConfirmation) != 0) +        { +            handler->SendSysMessage(LANG_NEW_PASSWORDS_NOT_MATCH); +            handler->SetSentErrorMessage(true); +            return false; +        } + +        // Changes password and prints result. +        AccountOpResult result = Battlenet::AccountMgr::ChangePassword(handler->GetSession()->GetBattlenetAccountId(), std::string(newPassword)); +        switch (result) +        { +            case AccountOpResult::AOR_OK: +                handler->SendSysMessage(LANG_COMMAND_PASSWORD); +                TC_LOG_INFO("entities.player.character", "Battle.net account: %u (IP: %s) Character:[%s] (GUID: %u) Changed Password.", +                    handler->GetSession()->GetBattlenetAccountId(), handler->GetSession()->GetRemoteAddress().c_str(), +                    handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow()); +                break; +            case AccountOpResult::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; +    } + +    /// Set password for account +    static bool HandleAccountSetPasswordCommand(ChatHandler* handler, char const* args) +    { +        if (!*args) +        { +            handler->SendSysMessage(LANG_CMD_SYNTAX); +            handler->SetSentErrorMessage(true); +            return false; +        } + +        ///- Get the command line arguments +        char* account = strtok((char*)args, " "); +        char* password = strtok(NULL, " "); +        char* passwordConfirmation = strtok(NULL, " "); + +        if (!account || !password || !passwordConfirmation) +            return false; + +        std::string accountName = account; +        if (!Utf8ToUpperOnlyLatin(accountName)) +        { +            handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str()); +            handler->SetSentErrorMessage(true); +            return false; +        } + +        uint32 targetAccountId = Battlenet::AccountMgr::GetId(accountName); +        if (!targetAccountId) +        { +            handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str()); +            handler->SetSentErrorMessage(true); +            return false; +        } + +        if (strcmp(password, passwordConfirmation)) +        { +            handler->SendSysMessage(LANG_NEW_PASSWORDS_NOT_MATCH); +            handler->SetSentErrorMessage(true); +            return false; +        } + +        AccountOpResult result = Battlenet::AccountMgr::ChangePassword(targetAccountId, password); + +        switch (result) +        { +            case AccountOpResult::AOR_OK: +                handler->SendSysMessage(LANG_COMMAND_PASSWORD); +                break; +            case AccountOpResult::AOR_NAME_NOT_EXIST: +                handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str()); +                handler->SetSentErrorMessage(true); +                return false; +            case AccountOpResult::AOR_PASS_TOO_LONG: +                handler->SendSysMessage(LANG_PASSWORD_TOO_LONG); +                handler->SetSentErrorMessage(true); +                return false; +            default: +                break; +        } +        return true; +    } +}; + +void AddSC_battlenet_account_commandscript() +{ +    new battlenet_account_commandscript(); +} diff --git a/src/server/scripts/Commands/cs_character.cpp b/src/server/scripts/Commands/cs_character.cpp index 7722c330e5f..0c6d495a360 100644 --- a/src/server/scripts/Commands/cs_character.cpp +++ b/src/server/scripts/Commands/cs_character.cpp @@ -277,7 +277,7 @@ public:              if (titleInfo && target->HasTitle(titleInfo))              { -                std::string name = target->getGender() == GENDER_MALE ? titleInfo->nameMale[loc] : titleInfo->nameFemale[loc]; +                std::string name = target->getGender() == GENDER_MALE ? titleInfo->nameMale : titleInfo->nameFemale;                  if (name.empty())                      continue; @@ -566,7 +566,7 @@ public:          {              FactionState const& faction = itr->second;              FactionEntry const* factionEntry = sFactionStore.LookupEntry(faction.ID); -            char const* factionName = factionEntry ? factionEntry->name[loc] : "#Not found#"; +            char const* factionName = factionEntry ? factionEntry->name : "#Not found#";              ReputationRank rank = target->GetReputationMgr().GetRank(factionEntry);              std::string rankName = handler->GetTrinityString(ReputationRankStrIndex[rank]);              std::ostringstream ss; @@ -858,7 +858,7 @@ public:              return false;          std::string accountName = accountStr; -        if (!AccountMgr::normalizeString(accountName)) +        if (!Utf8ToUpperOnlyLatin(accountName))          {              handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str());              handler->SetSentErrorMessage(true); diff --git a/src/server/scripts/Commands/cs_cheat.cpp b/src/server/scripts/Commands/cs_cheat.cpp index b61cf2c54fe..1fe7c6adf5b 100644 --- a/src/server/scripts/Commands/cs_cheat.cpp +++ b/src/server/scripts/Commands/cs_cheat.cpp @@ -185,10 +185,11 @@ public:          std::string argstr = (char*)args; +        Player* target = handler->GetSession()->GetPlayer();          if (!*args)          { -            argstr = (handler->GetSession()->GetPlayer()->GetCommandStatus(CHEAT_WATERWALK)) ? "off" : "on"; -            if (handler->GetSession()->GetPlayer()->GetCommandStatus(CHEAT_WATERWALK)) +            argstr = (target->GetCommandStatus(CHEAT_WATERWALK)) ? "off" : "on"; +            if (target->GetCommandStatus(CHEAT_WATERWALK))                  argstr = "off";              else                  argstr = "on"; @@ -196,15 +197,15 @@ public:          if (argstr == "off")          { -            handler->GetSession()->GetPlayer()->SetCommandStatusOff(CHEAT_WATERWALK); -            handler->GetSession()->GetPlayer()->SetMovement(MOVE_LAND_WALK);                // OFF +            target->SetCommandStatusOff(CHEAT_WATERWALK); +            target->SetWaterWalking(false);              handler->SendSysMessage("Waterwalking is OFF. You can't walk on water.");              return true;          }          else if (argstr == "on")          { -            handler->GetSession()->GetPlayer()->SetCommandStatusOn(CHEAT_WATERWALK); -            handler->GetSession()->GetPlayer()->SetMovement(MOVE_WATER_WALK);               // ON +            target->SetCommandStatusOn(CHEAT_WATERWALK); +            target->SetWaterWalking(true);              handler->SendSysMessage("Waterwalking is ON. You can walk on water.");              return true;          } diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index 1dc0cdef330..4ff7efd2f0a 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -93,6 +93,7 @@ public:              { "los",           rbac::RBAC_PERM_COMMAND_DEBUG_LOS,           false, &HandleDebugLoSCommand,              "", NULL },              { "moveflags",     rbac::RBAC_PERM_COMMAND_DEBUG_MOVEFLAGS,     false, &HandleDebugMoveflagsCommand,        "", NULL },              { "transport",     rbac::RBAC_PERM_COMMAND_DEBUG_TRANSPORT,     false, &HandleDebugTransportCommand,        "", NULL }, +            { "phase",         rbac::RBAC_PERM_COMMAND_DEBUG_PHASE,         false, &HandleDebugPhaseCommand,            "", NULL },              { NULL,            0,                                     false, NULL,                                "", NULL }          };          static ChatCommand commandTable[] = @@ -239,7 +240,7 @@ public:              return false;          SellResult msg = SellResult(atoi(args)); -        handler->GetSession()->GetPlayer()->SendSellError(msg, 0, 0, 0); +        handler->GetSession()->GetPlayer()->SendSellError(msg, 0, 0);          return true;      } @@ -313,7 +314,7 @@ public:          uint32 opcode;          parsedStream >> opcode; -        WorldPacket data(opcode, 0); +        WorldPacket data(Opcodes(opcode), 0);          while (!parsedStream.eof())          { @@ -419,7 +420,7 @@ public:          }          TC_LOG_DEBUG("network", "Sending opcode %u", data.GetOpcode());          data.hexlike(); -        player->GetSession()->SendPacket(&data); +        player->GetSession()->SendPacket(&data, true);          handler->PSendSysMessage(LANG_COMMAND_OPCODESENT, data.GetOpcode(), unit->GetName().c_str());          return true;      } @@ -933,6 +934,9 @@ public:              return false;          } +        for (auto phase : handler->GetSession()->GetPlayer()->GetPhases()) +            v->SetInPhase(phase, false, true); +          map->AddToMap(v->ToCreature());          return true; @@ -953,8 +957,22 @@ public:          if (!*args)              return false; -        uint32 PhaseShift = atoi(args); -        handler->GetSession()->SendSetPhaseShift(PhaseShift); +        char* t = strtok((char*)args, " "); +        char* p = strtok(NULL, " "); + +        if (!t) +            return false; + +        std::set<uint32> terrainswap; +        std::set<uint32> phaseId; +        std::set<uint32> worldMapSwap; + +        terrainswap.insert((uint32)atoi(t)); + +        if (p) +            phaseId.insert((uint32)atoi(p)); + +        handler->GetSession()->SendSetPhaseShift(phaseId, terrainswap, worldMapSwap);          return true;      } @@ -1311,35 +1329,9 @@ public:              char* mask2 = strtok(NULL, " \n");              uint32 moveFlags = (uint32)atoi(mask1); +            target->SetUnitMovementFlags(moveFlags); -            static uint32 const FlagsWithHandlers = MOVEMENTFLAG_MASK_HAS_PLAYER_STATUS_OPCODE | -                                                    MOVEMENTFLAG_WALKING | MOVEMENTFLAG_SWIMMING | -                                                    MOVEMENTFLAG_SPLINE_ENABLED; - -            bool unhandledFlag = ((moveFlags ^ target->GetUnitMovementFlags()) & ~FlagsWithHandlers) != 0; - -            target->SetWalk((moveFlags & MOVEMENTFLAG_WALKING) != 0); -            target->SetDisableGravity((moveFlags & MOVEMENTFLAG_DISABLE_GRAVITY) != 0); -            target->SetSwim((moveFlags & MOVEMENTFLAG_SWIMMING) != 0); -            target->SetCanFly((moveFlags & MOVEMENTFLAG_CAN_FLY) != 0); -            target->SetWaterWalking((moveFlags & MOVEMENTFLAG_WATERWALKING) != 0); -            target->SetFeatherFall((moveFlags & MOVEMENTFLAG_FALLING_SLOW) != 0); -            target->SetHover((moveFlags & MOVEMENTFLAG_HOVER) != 0); - -            if (moveFlags & (MOVEMENTFLAG_DISABLE_GRAVITY | MOVEMENTFLAG_CAN_FLY)) -                moveFlags &= ~MOVEMENTFLAG_FALLING; - -            if (moveFlags & MOVEMENTFLAG_ROOT) -            { -                target->SetControlled(true, UNIT_STATE_ROOT); -                moveFlags &= ~MOVEMENTFLAG_MASK_MOVING; -            } - -            if (target->HasUnitMovementFlag(MOVEMENTFLAG_SPLINE_ENABLED) && !(moveFlags & MOVEMENTFLAG_SPLINE_ENABLED)) -                target->StopMoving(); - -            if (unhandledFlag) -                target->SetUnitMovementFlags(moveFlags); +            /// @fixme: port master's HandleDebugMoveflagsCommand; flags need different handling              if (mask2)              { @@ -1347,8 +1339,14 @@ public:                  target->SetExtraUnitMovementFlags(moveFlagsExtra);              } -            if (mask2 || unhandledFlag) -                target->SendMovementFlagUpdate(); +            if (target->GetTypeId() != TYPEID_PLAYER) +                target->DestroyForNearbyPlayers();  // Force new SMSG_UPDATE_OBJECT:CreateObject +            else +            { +                WorldPacket data(SMSG_PLAYER_MOVE); +                target->WriteMovementInfo(data); +                target->SendMessageToSet(&data, true); +            }              handler->PSendSysMessage(LANG_MOVEFLAGS_SET, target->GetUnitMovementFlags(), target->GetExtraUnitMovementFlags());          } @@ -1391,6 +1389,17 @@ public:          handler->PSendSysMessage("Transport %s %s", transport->GetName().c_str(), start ? "started" : "stopped");          return true;      } + +    static bool HandleDebugPhaseCommand(ChatHandler* /*handler*/, char const* /*args*/) +    { +        /*/ +        Unit* unit = handler->getSelectedUnit(); +        Player* player = handler->GetSession()->GetPlayer(); +        if (unit && unit->GetTypeId() == TYPEID_PLAYER) +            player = unit->ToPlayer(); +        */ +        return true; +    }  };  void AddSC_debug_commandscript() diff --git a/src/server/scripts/Commands/cs_gm.cpp b/src/server/scripts/Commands/cs_gm.cpp index 90fd0bdd71c..d12ba9ad9b4 100644 --- a/src/server/scripts/Commands/cs_gm.cpp +++ b/src/server/scripts/Commands/cs_gm.cpp @@ -101,19 +101,16 @@ public:          if (!target)              target = handler->GetSession()->GetPlayer(); -        WorldPacket data(12); +        WorldPacket data;          if (strncmp(args, "on", 3) == 0) -            data.SetOpcode(SMSG_MOVE_SET_CAN_FLY); +            target->SetCanFly(true);          else if (strncmp(args, "off", 4) == 0) -            data.SetOpcode(SMSG_MOVE_UNSET_CAN_FLY); +            target->SetCanFly(false);          else          {              handler->SendSysMessage(LANG_USE_BOL);              return false;          } -        data.append(target->GetPackGUID()); -        data << uint32(0);                                      // unknown -        target->SendMessageToSet(&data, true);          handler->PSendSysMessage(LANG_COMMAND_FLYMODE_STATUS, handler->GetNameLink(target).c_str(), args);          return true;      } diff --git a/src/server/scripts/Commands/cs_go.cpp b/src/server/scripts/Commands/cs_go.cpp index 44ebb1ea4e0..6c321a66c48 100644 --- a/src/server/scripts/Commands/cs_go.cpp +++ b/src/server/scripts/Commands/cs_go.cpp @@ -455,7 +455,7 @@ public:          if (map->Instanceable())          { -            handler->PSendSysMessage(LANG_INVALID_ZONE_MAP, areaEntry->ID, areaEntry->area_name[handler->GetSessionDbcLocale()], map->GetId(), map->GetMapName()); +            handler->PSendSysMessage(LANG_INVALID_ZONE_MAP, areaEntry->ID, areaEntry->area_name, map->GetId(), map->GetMapName());              handler->SetSentErrorMessage(true);              return false;          } diff --git a/src/server/scripts/Commands/cs_gobject.cpp b/src/server/scripts/Commands/cs_gobject.cpp index ed5b39e476d..d7b7adc05ba 100644 --- a/src/server/scripts/Commands/cs_gobject.cpp +++ b/src/server/scripts/Commands/cs_gobject.cpp @@ -152,12 +152,15 @@ public:          GameObject* object = new GameObject;          uint32 guidLow = sObjectMgr->GenerateLowGuid(HIGHGUID_GAMEOBJECT); -        if (!object->Create(guidLow, objectInfo->entry, map, player->GetPhaseMaskForSpawn(), x, y, z, o, 0.0f, 0.0f, 0.0f, 0.0f, 0, GO_STATE_READY)) +        if (!object->Create(guidLow, objectInfo->entry, map, 0, x, y, z, o, 0.0f, 0.0f, 0.0f, 0.0f, 0, GO_STATE_READY))          {              delete object;              return false;          } +        for (auto phase : player->GetPhases()) +            object->SetInPhase(phase, false, true); +          if (spawntimeSecs)          {              uint32 value = atoi((char*)spawntimeSecs); @@ -165,7 +168,7 @@ public:          }          // fill the gameobject data and save to the db -        object->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), player->GetPhaseMaskForSpawn()); +        object->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), player->GetPhaseMask());          // delete the old object and do a clean load from DB with a fresh new GameObject instance.          // this is required to avoid weird behavior and memory leaks          delete object; @@ -505,9 +508,9 @@ public:      }      //set phasemask for selected object -    static bool HandleGameObjectSetPhaseCommand(ChatHandler* handler, char const* args) +    static bool HandleGameObjectSetPhaseCommand(ChatHandler* /*handler*/, char const* /*args*/)      { -        // number or [name] Shift-click form |color|Hgameobject:go_id|h[name]|h|r +        /*// number or [name] Shift-click form |color|Hgameobject:go_id|h[name]|h|r          char* id = handler->extractKeyFromLink((char*)args, "Hgameobject");          if (!id)              return false; @@ -539,7 +542,7 @@ public:          }          object->SetPhaseMask(phaseMask, true); -        object->SaveToDB(); +        object->SaveToDB();*/          return true;      } diff --git a/src/server/scripts/Commands/cs_guild.cpp b/src/server/scripts/Commands/cs_guild.cpp index 7b074087c0f..362f16d29a3 100644 --- a/src/server/scripts/Commands/cs_guild.cpp +++ b/src/server/scripts/Commands/cs_guild.cpp @@ -22,12 +22,14 @@ Comment: All guild related commands  Category: commandscripts  EndScriptData */ +#include "AchievementMgr.h"  #include "Chat.h"  #include "Language.h"  #include "Guild.h"  #include "GuildMgr.h"  #include "ObjectAccessor.h"  #include "ScriptMgr.h" +#include <iomanip>  class guild_commandscript : public CommandScript  { @@ -283,6 +285,7 @@ public:          handler->PSendSysMessage(LANG_GUILD_INFO_CREATION_DATE, createdDateStr); // Creation Date          handler->PSendSysMessage(LANG_GUILD_INFO_MEMBER_COUNT, guild->GetMemberCount()); // Number of Members          handler->PSendSysMessage(LANG_GUILD_INFO_BANK_GOLD, guild->GetBankMoney() / 100 / 100); // Bank Gold (in gold coins) +        handler->PSendSysMessage(LANG_GUILD_INFO_LEVEL, guild->GetLevel()); // Level          handler->PSendSysMessage(LANG_GUILD_INFO_MOTD, guild->GetMOTD().c_str()); // Message of the Day          handler->PSendSysMessage(LANG_GUILD_INFO_EXTRA_INFO, guild->GetInfo().c_str()); // Extra Information          return true; diff --git a/src/server/scripts/Commands/cs_learn.cpp b/src/server/scripts/Commands/cs_learn.cpp index 88acd491427..60523428e6f 100644 --- a/src/server/scripts/Commands/cs_learn.cpp +++ b/src/server/scripts/Commands/cs_learn.cpp @@ -400,33 +400,14 @@ public:                  !skillInfo->canLink)                            // only prof with recipes have set                  continue; -            int locale = handler->GetSessionDbcLocale(); -            name = skillInfo->name[locale]; +            name = skillInfo->name;              if (name.empty())                  continue;              if (!Utf8FitTo(name, namePart)) -            { -                locale = 0; -                for (; locale < TOTAL_LOCALES; ++locale) -                { -                    if (locale == handler->GetSessionDbcLocale()) -                        continue; - -                    name = skillInfo->name[locale]; -                    if (name.empty()) -                        continue; - -                    if (Utf8FitTo(name, namePart)) -                        break; -                } -            } +                continue; -            if (locale < TOTAL_LOCALES) -            { -                targetSkillInfo = skillInfo; -                break; -            } +            targetSkillInfo = skillInfo;          }          if (!targetSkillInfo) diff --git a/src/server/scripts/Commands/cs_list.cpp b/src/server/scripts/Commands/cs_list.cpp index 6a0755b82e8..ff0a5519495 100644 --- a/src/server/scripts/Commands/cs_list.cpp +++ b/src/server/scripts/Commands/cs_list.cpp @@ -439,7 +439,7 @@ public:              AuraApplication const* aurApp = itr->second;              Aura const* aura = aurApp->GetBase(); -            char const* name = aura->GetSpellInfo()->SpellName[handler->GetSessionDbcLocale()]; +            char const* name = aura->GetSpellInfo()->SpellName;              std::ostringstream ss_name;              ss_name << "|cffffffff|Hspell:" << aura->GetId() << "|h[" << name << "]|h|r"; diff --git a/src/server/scripts/Commands/cs_lookup.cpp b/src/server/scripts/Commands/cs_lookup.cpp index dc00ad047da..4c4bd5fb297 100644 --- a/src/server/scripts/Commands/cs_lookup.cpp +++ b/src/server/scripts/Commands/cs_lookup.cpp @@ -106,48 +106,30 @@ public:              AreaTableEntry const* areaEntry = sAreaStore.LookupEntry(areaflag);              if (areaEntry)              { -                int locale = handler->GetSessionDbcLocale(); -                std::string name = areaEntry->area_name[locale]; +                std::string name = areaEntry->area_name;                  if (name.empty())                      continue;                  if (!Utf8FitTo(name, wNamePart)) -                { -                    locale = 0; -                    for (; locale < TOTAL_LOCALES; ++locale) -                    { -                        if (locale == handler->GetSessionDbcLocale()) -                            continue; - -                        name = areaEntry->area_name[locale]; -                        if (name.empty()) -                            continue; - -                        if (Utf8FitTo(name, wNamePart)) -                            break; -                    } -                } +                    continue; -                if (locale < TOTAL_LOCALES) +                if (maxResults && count++ == maxResults)                  { -                    if (maxResults && count++ == maxResults) -                    { -                        handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults); -                        return true; -                    } +                    handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults); +                    return true; +                } -                    // 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"; -                    else -                        ss << areaEntry->ID << " - " << name << ' ' << localeNames[locale]; +                // send area in "id - [name]" format +                std::ostringstream ss; +                if (handler->GetSession()) +                    ss << areaEntry->ID << " - |cffffffff|Harea:" << areaEntry->ID << "|h[" << name<< "]|h|r"; +                else +                    ss << areaEntry->ID << " - " << name; -                    handler->SendSysMessage(ss.str().c_str()); +                handler->SendSysMessage(ss.str().c_str()); -                    if (!found) -                        found = true; -                } +                if (!found) +                    found = true;              }          } @@ -313,77 +295,58 @@ public:          for (uint32 id = 0; id < sFactionStore.GetNumRows(); ++id)          { -            FactionEntry const* factionEntry = sFactionStore.LookupEntry(id); -            if (factionEntry) +            if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(id))              {                  FactionState const* factionState = target ? target->GetReputationMgr().GetState(factionEntry) : NULL; -                int locale = handler->GetSessionDbcLocale(); -                std::string name = factionEntry->name[locale]; +                std::string name = factionEntry->name;                  if (name.empty())                      continue;                  if (!Utf8FitTo(name, wNamePart)) -                { -                    locale = 0; -                    for (; locale < TOTAL_LOCALES; ++locale) -                    { -                        if (locale == handler->GetSessionDbcLocale()) -                            continue; - -                        name = factionEntry->name[locale]; -                        if (name.empty()) -                            continue; - -                        if (Utf8FitTo(name, wNamePart)) -                            break; -                    } -                } +                    continue; -                if (locale < TOTAL_LOCALES) +                if (maxResults && count++ == maxResults)                  { -                    if (maxResults && count++ == maxResults) -                    { -                        handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults); -                        return true; -                    } +                    handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults); +                    return true; +                } -                    // send faction in "id - [faction] rank reputation [visible] [at war] [own team] [unknown] [invisible] [inactive]" format -                    // or              "id - [faction] [no reputation]" format -                    std::ostringstream ss; -                    if (handler->GetSession()) -                        ss << id << " - |cffffffff|Hfaction:" << id << "|h[" << name << ' ' << localeNames[locale] << "]|h|r"; -                    else -                        ss << id << " - " << name << ' ' << localeNames[locale]; +                // send faction in "id - [faction] rank reputation [visible] [at war] [own team] [unknown] [invisible] [inactive]" format +                // or              "id - [faction] [no reputation]" format +                std::ostringstream ss; +                if (handler->GetSession()) +                    ss << id << " - |cffffffff|Hfaction:" << id << "|h[" << name << "]|h|r"; +                else +                    ss << id << " - " << name; -                    if (factionState) // and then target != NULL also -                    { -                        uint32 index = target->GetReputationMgr().GetReputationRankStrIndex(factionEntry); -                        std::string rankName = handler->GetTrinityString(index); - -                        ss << ' ' << rankName << "|h|r (" << target->GetReputationMgr().GetReputation(factionEntry) << ')'; - -                        if (factionState->Flags & FACTION_FLAG_VISIBLE) -                            ss << handler->GetTrinityString(LANG_FACTION_VISIBLE); -                        if (factionState->Flags & FACTION_FLAG_AT_WAR) -                            ss << handler->GetTrinityString(LANG_FACTION_ATWAR); -                        if (factionState->Flags & FACTION_FLAG_PEACE_FORCED) -                            ss << handler->GetTrinityString(LANG_FACTION_PEACE_FORCED); -                        if (factionState->Flags & FACTION_FLAG_HIDDEN) -                            ss << handler->GetTrinityString(LANG_FACTION_HIDDEN); -                        if (factionState->Flags & FACTION_FLAG_INVISIBLE_FORCED) -                            ss << handler->GetTrinityString(LANG_FACTION_INVISIBLE_FORCED); -                        if (factionState->Flags & FACTION_FLAG_INACTIVE) -                            ss << handler->GetTrinityString(LANG_FACTION_INACTIVE); -                    } -                    else -                        ss << handler->GetTrinityString(LANG_FACTION_NOREPUTATION); +                if (factionState) // and then target != NULL also +                { +                    uint32 index = target->GetReputationMgr().GetReputationRankStrIndex(factionEntry); +                    std::string rankName = handler->GetTrinityString(index); + +                    ss << ' ' << rankName << "|h|r (" << target->GetReputationMgr().GetReputation(factionEntry) << ')'; + +                    if (factionState->Flags & FACTION_FLAG_VISIBLE) +                        ss << handler->GetTrinityString(LANG_FACTION_VISIBLE); +                    if (factionState->Flags & FACTION_FLAG_AT_WAR) +                        ss << handler->GetTrinityString(LANG_FACTION_ATWAR); +                    if (factionState->Flags & FACTION_FLAG_PEACE_FORCED) +                        ss << handler->GetTrinityString(LANG_FACTION_PEACE_FORCED); +                    if (factionState->Flags & FACTION_FLAG_HIDDEN) +                        ss << handler->GetTrinityString(LANG_FACTION_HIDDEN); +                    if (factionState->Flags & FACTION_FLAG_INVISIBLE_FORCED) +                        ss << handler->GetTrinityString(LANG_FACTION_INVISIBLE_FORCED); +                    if (factionState->Flags & FACTION_FLAG_INACTIVE) +                        ss << handler->GetTrinityString(LANG_FACTION_INACTIVE); +                } +                else +                    ss << handler->GetTrinityString(LANG_FACTION_NOREPUTATION); -                    handler->SendSysMessage(ss.str().c_str()); +                handler->SendSysMessage(ss.str().c_str()); -                    if (!found) -                        found = true; -                } +                if (!found) +                    found = true;              }          } @@ -498,45 +461,27 @@ public:              ItemSetEntry const* set = sItemSetStore.LookupEntry(id);              if (set)              { -                int locale = handler->GetSessionDbcLocale(); -                std::string name = set->name[locale]; +                std::string name = set->name;                  if (name.empty())                      continue;                  if (!Utf8FitTo(name, wNamePart)) -                { -                    locale = 0; -                    for (; locale < TOTAL_LOCALES; ++locale) -                    { -                        if (locale == handler->GetSessionDbcLocale()) -                            continue; - -                        name = set->name[locale]; -                        if (name.empty()) -                            continue; - -                        if (Utf8FitTo(name, wNamePart)) -                            break; -                    } -                } +                    continue; -                if (locale < TOTAL_LOCALES) +                if (maxResults && count++ == maxResults)                  { -                    if (maxResults && count++ == maxResults) -                    { -                        handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults); -                        return true; -                    } +                    handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults); +                    return true; +                } -                    // send item set in "id - [namedlink locale]" format -                    if (handler->GetSession()) -                        handler->PSendSysMessage(LANG_ITEMSET_LIST_CHAT, id, id, name.c_str(), localeNames[locale]); -                    else -                        handler->PSendSysMessage(LANG_ITEMSET_LIST_CONSOLE, id, name.c_str(), localeNames[locale]); +                // send item set in "id - [namedlink locale]" format +                if (handler->GetSession()) +                    handler->PSendSysMessage(LANG_ITEMSET_LIST_CHAT, id, id, name.c_str(), ""); +                else +                    handler->PSendSysMessage(LANG_ITEMSET_LIST_CONSOLE, id, name.c_str(), ""); -                    if (!found) -                        found = true; -                } +                if (!found) +                    found = true;              }          }          if (!found) @@ -779,59 +724,41 @@ public:              SkillLineEntry const* skillInfo = sSkillLineStore.LookupEntry(id);              if (skillInfo)              { -                int locale = handler->GetSessionDbcLocale(); -                std::string name = skillInfo->name[locale]; +                std::string name = skillInfo->name;                  if (name.empty())                      continue;                  if (!Utf8FitTo(name, wNamePart)) -                { -                    locale = 0; -                    for (; locale < TOTAL_LOCALES; ++locale) -                    { -                        if (locale == handler->GetSessionDbcLocale()) -                            continue; - -                        name = skillInfo->name[locale]; -                        if (name.empty()) -                            continue; +                    continue; -                        if (Utf8FitTo(name, wNamePart)) -                            break; -                    } +                if (maxResults && count++ == maxResults) +                { +                    handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults); +                    return true;                  } -                if (locale < TOTAL_LOCALES) +                char valStr[50] = ""; +                char const* knownStr = ""; +                if (target && target->HasSkill(id))                  { -                    if (maxResults && count++ == maxResults) -                    { -                        handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults); -                        return true; -                    } - -                    char valStr[50] = ""; -                    char const* knownStr = ""; -                    if (target && target->HasSkill(id)) -                    { -                        knownStr = handler->GetTrinityString(LANG_KNOWN); -                        uint32 curValue = target->GetPureSkillValue(id); -                        uint32 maxValue  = target->GetPureMaxSkillValue(id); -                        uint32 permValue = target->GetSkillPermBonusValue(id); -                        uint32 tempValue = target->GetSkillTempBonusValue(id); - -                        char const* valFormat = handler->GetTrinityString(LANG_SKILL_VALUES); -                        snprintf(valStr, 50, valFormat, curValue, maxValue, permValue, tempValue); -                    } +                    knownStr = handler->GetTrinityString(LANG_KNOWN); +                    uint32 curValue = target->GetPureSkillValue(id); +                    uint32 maxValue  = target->GetPureMaxSkillValue(id); +                    uint32 permValue = target->GetSkillPermBonusValue(id); +                    uint32 tempValue = target->GetSkillTempBonusValue(id); + +                    char const* valFormat = handler->GetTrinityString(LANG_SKILL_VALUES); +                    snprintf(valStr, 50, valFormat, curValue, maxValue, permValue, tempValue); +                } -                    // send skill in "id - [namedlink locale]" format -                    if (handler->GetSession()) -                        handler->PSendSysMessage(LANG_SKILL_LIST_CHAT, id, id, name.c_str(), localeNames[locale], knownStr, valStr); -                    else -                        handler->PSendSysMessage(LANG_SKILL_LIST_CONSOLE, id, name.c_str(), localeNames[locale], knownStr, valStr); +                // send skill in "id - [namedlink locale]" format +                if (handler->GetSession()) +                    handler->PSendSysMessage(LANG_SKILL_LIST_CHAT, id, id, name.c_str(), "", knownStr, valStr); +                else +                    handler->PSendSysMessage(LANG_SKILL_LIST_CONSOLE, id, name.c_str(), "", knownStr, valStr); -                    if (!found) -                        found = true; -                } +                if (!found) +                    found = true;              }          }          if (!found) @@ -867,83 +794,63 @@ public:              SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(id);              if (spellInfo)              { -                int locale = handler->GetSessionDbcLocale(); -                std::string name = spellInfo->SpellName[locale]; +                std::string name = spellInfo->SpellName;                  if (name.empty())                      continue;                  if (!Utf8FitTo(name, wNamePart)) +                    continue; + +                if (maxResults && count++ == maxResults)                  { -                    locale = 0; -                    for (; locale < TOTAL_LOCALES; ++locale) -                    { -                        if (locale == handler->GetSessionDbcLocale()) -                            continue; +                    handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults); +                    return true; +                } -                        name = spellInfo->SpellName[locale]; -                        if (name.empty()) -                            continue; +                bool known = target && target->HasSpell(id); +                bool learn = (spellInfo->Effects[0].Effect == SPELL_EFFECT_LEARN_SPELL); -                        if (Utf8FitTo(name, wNamePart)) -                            break; -                    } -                } +                SpellInfo const* learnSpellInfo = sSpellMgr->GetSpellInfo(spellInfo->Effects[0].TriggerSpell); -                if (locale < TOTAL_LOCALES) -                { -                    if (maxResults && count++ == maxResults) -                    { -                        handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults); -                        return true; -                    } +                uint32 talentCost = GetTalentSpellCost(id); -                    bool known = target && target->HasSpell(id); -                    bool learn = (spellInfo->Effects[0].Effect == SPELL_EFFECT_LEARN_SPELL); +                bool talent = (talentCost > 0); +                bool passive = spellInfo->IsPassive(); +                bool active = target && target->HasAura(id); -                    SpellInfo const* learnSpellInfo = sSpellMgr->GetSpellInfo(spellInfo->Effects[0].TriggerSpell); +                // unit32 used to prevent interpreting uint8 as char at output +                // find rank of learned spell for learning spell, or talent rank +                uint32 rank = talentCost ? talentCost : learn && learnSpellInfo ? learnSpellInfo->GetRank() : spellInfo->GetRank(); -                    uint32 talentCost = GetTalentSpellCost(id); +                // send spell in "id - [name, rank N] [talent] [passive] [learn] [known]" format +                std::ostringstream ss; +                if (handler->GetSession()) +                    ss << id << " - |cffffffff|Hspell:" << id << "|h[" << name; +                else +                    ss << id << " - " << name; -                    bool talent = (talentCost > 0); -                    bool passive = spellInfo->IsPassive(); -                    bool active = target && target->HasAura(id); +                // include rank in link name +                if (rank) +                    ss << handler->GetTrinityString(LANG_SPELL_RANK) << rank; -                    // unit32 used to prevent interpreting uint8 as char at output -                    // find rank of learned spell for learning spell, or talent rank -                    uint32 rank = talentCost ? talentCost : learn && learnSpellInfo ? learnSpellInfo->GetRank() : spellInfo->GetRank(); +                if (handler->GetSession()) +                    ss << "]|h|r"; -                    // send spell in "id - [name, rank N] [talent] [passive] [learn] [known]" format -                    std::ostringstream ss; -                    if (handler->GetSession()) -                        ss << id << " - |cffffffff|Hspell:" << id << "|h[" << name; -                    else -                        ss << id << " - " << name; - -                    // include rank in link name -                    if (rank) -                        ss << handler->GetTrinityString(LANG_SPELL_RANK) << rank; - -                    if (handler->GetSession()) -                        ss << ' ' << localeNames[locale] << "]|h|r"; -                    else -                        ss << ' ' << localeNames[locale]; - -                    if (talent) -                        ss << handler->GetTrinityString(LANG_TALENT); -                    if (passive) -                        ss << handler->GetTrinityString(LANG_PASSIVE); -                    if (learn) -                        ss << handler->GetTrinityString(LANG_LEARN); -                    if (known) -                        ss << handler->GetTrinityString(LANG_KNOWN); -                    if (active) -                        ss << handler->GetTrinityString(LANG_ACTIVE); +                if (talent) +                    ss << handler->GetTrinityString(LANG_TALENT); +                if (passive) +                    ss << handler->GetTrinityString(LANG_PASSIVE); +                if (learn) +                    ss << handler->GetTrinityString(LANG_LEARN); +                if (known) +                    ss << handler->GetTrinityString(LANG_KNOWN); +                if (active) +                    ss << handler->GetTrinityString(LANG_ACTIVE); -                    handler->SendSysMessage(ss.str().c_str()); +                handler->SendSysMessage(ss.str().c_str()); -                    if (!found) -                        found = true; -                } +                if (!found) +                    found = true;              }          }          if (!found) @@ -965,7 +872,7 @@ public:          if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(id))          {              int locale = handler->GetSessionDbcLocale(); -            std::string name = spellInfo->SpellName[locale]; +            std::string name = spellInfo->SpellName;              if (name.empty())              {                  handler->SendSysMessage(LANG_COMMAND_NOSPELLFOUND); @@ -1046,47 +953,29 @@ public:              TaxiNodesEntry const* nodeEntry = sTaxiNodesStore.LookupEntry(id);              if (nodeEntry)              { -                int locale = handler->GetSessionDbcLocale(); -                std::string name = nodeEntry->name[locale]; +                std::string name = nodeEntry->name;                  if (name.empty())                      continue;                  if (!Utf8FitTo(name, wNamePart)) -                { -                    locale = 0; -                    for (; locale < TOTAL_LOCALES; ++locale) -                    { -                        if (locale == handler->GetSessionDbcLocale()) -                            continue; - -                        name = nodeEntry->name[locale]; -                        if (name.empty()) -                            continue; - -                        if (Utf8FitTo(name, wNamePart)) -                            break; -                    } -                } +                    continue; -                if (locale < TOTAL_LOCALES) +                if (maxResults && count++ == maxResults)                  { -                    if (maxResults && count++ == maxResults) -                    { -                        handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults); -                        return true; -                    } +                    handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults); +                    return true; +                } -                    // 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); -                    else -                        handler->PSendSysMessage(LANG_TAXINODE_ENTRY_LIST_CONSOLE, id, name.c_str(), localeNames[locale], -                            nodeEntry->map_id, nodeEntry->x, nodeEntry->y, nodeEntry->z); +                // 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(), "", +                        nodeEntry->map_id, nodeEntry->x, nodeEntry->y, nodeEntry->z); +                else +                    handler->PSendSysMessage(LANG_TAXINODE_ENTRY_LIST_CONSOLE, id, name.c_str(), "", +                        nodeEntry->map_id, nodeEntry->x, nodeEntry->y, nodeEntry->z); -                    if (!found) -                        found = true; -                } +                if (!found) +                    found = true;              }          }          if (!found) @@ -1183,54 +1072,36 @@ public:              CharTitlesEntry const* titleInfo = sCharTitlesStore.LookupEntry(id);              if (titleInfo)              { -                /// @todo: implement female support -                int locale = handler->GetSessionDbcLocale(); -                std::string name = titleInfo->nameMale[locale]; +                std::string name = target->getGender() == GENDER_MALE ? titleInfo->nameMale : titleInfo->nameFemale; +                  if (name.empty())                      continue;                  if (!Utf8FitTo(name, wNamePart)) -                { -                    locale = 0; -                    for (; locale < TOTAL_LOCALES; ++locale) -                    { -                        if (locale == handler->GetSessionDbcLocale()) -                            continue; - -                        name = titleInfo->nameMale[locale]; -                        if (name.empty()) -                            continue; - -                        if (Utf8FitTo(name, wNamePart)) -                            break; -                    } -                } +                    continue; -                if (locale < TOTAL_LOCALES) +                if (maxResults && counter == maxResults)                  { -                    if (maxResults && counter == maxResults) -                    { -                        handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults); -                        return true; -                    } +                    handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults); +                    return true; +                } -                    char const* knownStr = target && target->HasTitle(titleInfo) ? handler->GetTrinityString(LANG_KNOWN) : ""; +                char const* knownStr = target && target->HasTitle(titleInfo) ? handler->GetTrinityString(LANG_KNOWN) : ""; -                    char const* activeStr = target && target->GetUInt32Value(PLAYER_CHOSEN_TITLE) == titleInfo->bit_index -                        ? handler->GetTrinityString(LANG_ACTIVE) -                        : ""; +                char const* activeStr = target && target->GetUInt32Value(PLAYER_CHOSEN_TITLE) == titleInfo->bit_index +                    ? handler->GetTrinityString(LANG_ACTIVE) +                    : ""; -                    char titleNameStr[80]; -                    snprintf(titleNameStr, 80, name.c_str(), targetName); +                char titleNameStr[80]; +                snprintf(titleNameStr, 80, name.c_str(), targetName); -                    // send title in "id (idx:idx) - [namedlink locale]" format -                    if (handler->GetSession()) -                        handler->PSendSysMessage(LANG_TITLE_LIST_CHAT, id, titleInfo->bit_index, id, titleNameStr, localeNames[locale], knownStr, activeStr); -                    else -                        handler->PSendSysMessage(LANG_TITLE_LIST_CONSOLE, id, titleInfo->bit_index, titleNameStr, localeNames[locale], knownStr, activeStr); +                // send title in "id (idx:idx) - [namedlink locale]" format +                if (handler->GetSession()) +                    handler->PSendSysMessage(LANG_TITLE_LIST_CHAT, id, titleInfo->bit_index, id, titleNameStr, "", knownStr, activeStr); +                else +                    handler->PSendSysMessage(LANG_TITLE_LIST_CONSOLE, id, titleInfo->bit_index, titleNameStr, "", knownStr, activeStr); -                    ++counter; -                } +                ++counter;              }          }          if (counter == 0)  // if counter == 0 then we found nth @@ -1261,7 +1132,7 @@ public:          {              if (MapEntry const* mapInfo = sMapStore.LookupEntry(id))              { -                std::string name = mapInfo->name[locale]; +                std::string name = mapInfo->name;                  if (name.empty())                      continue; @@ -1347,8 +1218,7 @@ public:          char* limitStr = strtok(NULL, " ");          int32 limit = limitStr ? atoi(limitStr) : -1; -        if (!AccountMgr::normalizeString -            (account)) +        if (!Utf8ToUpperOnlyLatin(account))              return false;          PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_LIST_BY_NAME); diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index e248a835ee0..319151141b7 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -60,7 +60,6 @@ public:              { "die",              rbac::RBAC_PERM_COMMAND_DIE,              false, &HandleDieCommand,              "", NULL },              { "dismount",         rbac::RBAC_PERM_COMMAND_DISMOUNT,         false, &HandleDismountCommand,         "", NULL },              { "distance",         rbac::RBAC_PERM_COMMAND_DISTANCE,         false, &HandleGetDistanceCommand,      "", NULL }, -            { "flusharenapoints", rbac::RBAC_PERM_COMMAND_FLUSHARENAPOINTS, false, &HandleFlushArenaPointsCommand, "", NULL },              { "freeze",           rbac::RBAC_PERM_COMMAND_FREEZE,           false, &HandleFreezeCommand,           "", NULL },              { "gps",              rbac::RBAC_PERM_COMMAND_GPS,              false, &HandleGPSCommand,              "", NULL },              { "guid",             rbac::RBAC_PERM_COMMAND_GUID,             false, &HandleGUIDCommand,             "", NULL }, @@ -200,9 +199,9 @@ public:              handler->PSendSysMessage(LANG_GPS_NO_VMAP);          handler->PSendSysMessage(LANG_MAP_POSITION, -            mapId, (mapEntry ? mapEntry->name[handler->GetSessionDbcLocale()] : handler->GetTrinityString(LANG_UNKNOWN)), -            zoneId, (zoneEntry ? zoneEntry->area_name[handler->GetSessionDbcLocale()] : handler->GetTrinityString(LANG_UNKNOWN)), -            areaId, (areaEntry ? areaEntry->area_name[handler->GetSessionDbcLocale()] : handler->GetTrinityString(LANG_UNKNOWN)), +            mapId, (mapEntry ? mapEntry->name : handler->GetTrinityString(LANG_UNKNOWN)), +            zoneId, (zoneEntry ? zoneEntry->area_name : handler->GetTrinityString(LANG_UNKNOWN)), +            areaId, (areaEntry ? areaEntry->area_name : handler->GetTrinityString(LANG_UNKNOWN)),              object->GetPhaseMask(),              object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), object->GetOrientation(),              cell.GridX(), cell.GridY(), cell.CellX(), cell.CellY(), object->GetInstanceId(), @@ -370,7 +369,8 @@ public:              target->GetContactPoint(_player, x, y, z);              _player->TeleportTo(target->GetMapId(), x, y, z, _player->GetAngle(target), TELE_TO_GM_MODE); -            _player->SetPhaseMask(target->GetPhaseMask(), true); +            for (auto phase : target->GetPhases()) +                _player->SetInPhase(phase, true, true);          }          else          { @@ -494,7 +494,8 @@ public:              float x, y, z;              handler->GetSession()->GetPlayer()->GetClosePoint(x, y, z, target->GetObjectSize());              target->TeleportTo(handler->GetSession()->GetPlayer()->GetMapId(), x, y, z, target->GetOrientation()); -            target->SetPhaseMask(handler->GetSession()->GetPlayer()->GetPhaseMask(), true); +            for (auto phase : handler->GetSession()->GetPlayer()->GetPhases()) +                target->SetInPhase(phase, true, true);          }          else          { @@ -1345,7 +1346,7 @@ public:          // If our target does not yet have the skill they are trying to add to them, the chosen level also becomes          // the max level of the new profession. -        uint16 max = maxPureSkill ? atol (maxPureSkill) : targetHasSkill ? target->GetPureMaxSkillValue(skill) : uint16(level); +        uint16 max = maxPureSkill ? atol(maxPureSkill) : targetHasSkill ? target->GetPureMaxSkillValue(skill) : uint16(level);          if (level <= 0 || level > max || max <= 0)              return false; @@ -1354,7 +1355,7 @@ public:          // add the skill to the player's book with step 1 (which is the first rank, in most cases something          // like 'Apprentice <skill>'.          target->SetSkill(skill, targetHasSkill ? target->GetSkillStep(skill) : 1, level, max); -        handler->PSendSysMessage(LANG_SET_SKILL, skill, skillLine->name[handler->GetSessionDbcLocale()], handler->GetNameLink(target).c_str(), level, max); +        handler->PSendSysMessage(LANG_SET_SKILL, skill, skillLine->name, handler->GetNameLink(target).c_str(), level, max);          return true;      } @@ -1703,15 +1704,15 @@ public:          AreaTableEntry const* area = GetAreaEntryByAreaID(areaId);          if (area)          { -            areaName = area->area_name[locale]; +            areaName = area->area_name;              AreaTableEntry const* zone = GetAreaEntryByAreaID(area->zone);              if (zone) -                zoneName = zone->area_name[locale]; +                zoneName = zone->area_name;          }          if (target) -            handler->PSendSysMessage(LANG_PINFO_CHR_MAP, map->name[locale], (!zoneName.empty() ? zoneName.c_str() : handler->GetTrinityString(LANG_UNKNOWN)), (!areaName.empty() ? areaName.c_str() : handler->GetTrinityString(LANG_UNKNOWN))); +            handler->PSendSysMessage(LANG_PINFO_CHR_MAP, map->name, (!zoneName.empty() ? zoneName.c_str() : handler->GetTrinityString(LANG_UNKNOWN)), (!areaName.empty() ? areaName.c_str() : handler->GetTrinityString(LANG_UNKNOWN)));          // Output XVII. - XVIX. if they are not empty          if (!guildName.empty()) @@ -2213,12 +2214,6 @@ public:          return true;      } -    static bool HandleFlushArenaPointsCommand(ChatHandler* /*handler*/, char const* /*args*/) -    { -        sArenaTeamMgr->DistributeArenaPoints(); -        return true; -    } -      static bool HandleRepairitemsCommand(ChatHandler* handler, char const* args)      {          Player* target; @@ -2451,8 +2446,9 @@ public:              return false;          } -        WorldPacket data(SMSG_PLAY_SOUND, 4); +        WorldPacket data(SMSG_PLAY_SOUND, 4 + 8);          data << uint32(soundId); +        data << uint64(handler->GetSession()->GetPlayer()->GetGUID());          sWorld->SendGlobalMessage(&data);          handler->PSendSysMessage(LANG_COMMAND_PLAYED_TO_ALL, soundId); diff --git a/src/server/scripts/Commands/cs_mmaps.cpp b/src/server/scripts/Commands/cs_mmaps.cpp index 0be5994e8ed..969027139fc 100644 --- a/src/server/scripts/Commands/cs_mmaps.cpp +++ b/src/server/scripts/Commands/cs_mmaps.cpp @@ -1,19 +1,19 @@  /* - * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ +* Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License as published by the +* Free Software Foundation; either version 2 of the License, or (at your +* option) any later version. +* +* This program is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +* more details. +* +* You should have received a copy of the GNU General Public License along +* with this program. If not, see <http://www.gnu.org/licenses/>. +*/  /**  * @file cs_mmaps.cpp @@ -46,17 +46,17 @@ public:          static ChatCommand mmapCommandTable[] =          {              { "loadedtiles", rbac::RBAC_PERM_COMMAND_MMAP_LOADEDTILES, false, &HandleMmapLoadedTilesCommand, "", NULL }, -            { "loc",         rbac::RBAC_PERM_COMMAND_MMAP_LOC,         false, &HandleMmapLocCommand,         "", NULL }, -            { "path",        rbac::RBAC_PERM_COMMAND_MMAP_PATH,        false, &HandleMmapPathCommand,        "", NULL }, -            { "stats",       rbac::RBAC_PERM_COMMAND_MMAP_STATS,       false, &HandleMmapStatsCommand,       "", NULL }, -            { "testarea",    rbac::RBAC_PERM_COMMAND_MMAP_TESTAREA,    false, &HandleMmapTestArea,           "", NULL }, -            { NULL,          0,                                  false, NULL,                          "", NULL } +            { "loc", rbac::RBAC_PERM_COMMAND_MMAP_LOC, false, &HandleMmapLocCommand, "", NULL }, +            { "path", rbac::RBAC_PERM_COMMAND_MMAP_PATH, false, &HandleMmapPathCommand, "", NULL }, +            { "stats", rbac::RBAC_PERM_COMMAND_MMAP_STATS, false, &HandleMmapStatsCommand, "", NULL }, +            { "testarea", rbac::RBAC_PERM_COMMAND_MMAP_TESTAREA, false, &HandleMmapTestArea, "", NULL }, +            { NULL, 0, false, NULL, "", NULL }          };          static ChatCommand commandTable[] =          { -            { "mmap", rbac::RBAC_PERM_COMMAND_MMAP, true, NULL, "", mmapCommandTable  }, -            { NULL,   0,                     false, NULL, "", NULL } +            { "mmap", rbac::RBAC_PERM_COMMAND_MMAP, true, NULL, "", mmapCommandTable }, +            { NULL, 0, false, NULL, "", NULL }          };          return commandTable;      } @@ -142,8 +142,8 @@ public:          float const* min = navmesh->getParams()->orig;          float x, y, z;          player->GetPosition(x, y, z); -        float location[VERTEX_SIZE] = {y, z, x}; -        float extents[VERTEX_SIZE] = {3.0f, 5.0f, 3.0f}; +        float location[VERTEX_SIZE] = { y, z, x }; +        float extents[VERTEX_SIZE] = { 3.0f, 5.0f, 3.0f };          int32 tilex = int32((y - min[0]) / SIZE_OF_GRIDS);          int32 tiley = int32((x - min[2]) / SIZE_OF_GRIDS); diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index f70f17232eb..36182a535a7 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -23,6 +23,7 @@ Category: commandscripts  EndScriptData */  #include "Chat.h" +#include <stdlib.h>  #include "ObjectMgr.h"  #include "Opcodes.h"  #include "Pet.h" @@ -50,8 +51,8 @@ public:          };          static ChatCommand modifyCommandTable[] =          { -            { "arenapoints",  rbac::RBAC_PERM_COMMAND_MODIFY_ARENAPOINTS,  false, &HandleModifyArenaCommand,         "", NULL },              { "bit",          rbac::RBAC_PERM_COMMAND_MODIFY_BIT,          false, &HandleModifyBitCommand,           "", NULL }, +            { "currency",     rbac::RBAC_PERM_COMMAND_MODIFY_CURRENCY,     false, &HandleModifyCurrencyCommand,      "", NULL },              { "drunk",        rbac::RBAC_PERM_COMMAND_MODIFY_DRUNK,        false, &HandleModifyDrunkCommand,         "", NULL },              { "energy",       rbac::RBAC_PERM_COMMAND_MODIFY_ENERGY,       false, &HandleModifyEnergyCommand,        "", NULL },              { "faction",      rbac::RBAC_PERM_COMMAND_MODIFY_FACTION,      false, &HandleModifyFactionCommand,       "", NULL }, @@ -963,14 +964,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_MOVE_SET_RUN_SPEED, (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_MOVE_SET_SWIM_SPEED, (8+4+4));          data.append(target->GetPackGUID());          data << (uint32)0;          data << float(speed); @@ -997,19 +998,19 @@ public:          if (handler->HasLowerSecurity(target, 0))              return false; -        int32 moneyToAdd = 0; +        int64 moneyToAdd = 0;          if (strchr(args, 'g') || strchr(args, 's') || strchr(args, 'c'))              moneyToAdd = MoneyStringToMoney(std::string(args));          else -            moneyToAdd = atoi(args); +            moneyToAdd = atol(args); -        uint32 targetMoney = target->GetMoney(); +        uint64 targetMoney = target->GetMoney();          if (moneyToAdd < 0)          { -            int32 newmoney = int32(targetMoney) + moneyToAdd; +            int64 newmoney = int64(targetMoney) + moneyToAdd; -            TC_LOG_DEBUG("misc", handler->GetTrinityString(LANG_CURRENT_MONEY), targetMoney, moneyToAdd, newmoney); +            TC_LOG_DEBUG("misc", handler->GetTrinityString(LANG_CURRENT_MONEY), uint32(targetMoney), int32(moneyToAdd), uint32(newmoney));              if (newmoney <= 0)              {                  handler->PSendSysMessage(LANG_YOU_TAKE_ALL_MONEY, handler->GetNameLink(target).c_str()); @@ -1020,28 +1021,32 @@ public:              }              else              { -                if (newmoney > static_cast<int32>(MAX_MONEY_AMOUNT)) +                uint64 moneyToAddMsg = moneyToAdd * -1; +                if (newmoney > static_cast<int64>(MAX_MONEY_AMOUNT))                      newmoney = MAX_MONEY_AMOUNT; -                handler->PSendSysMessage(LANG_YOU_TAKE_MONEY, abs(moneyToAdd), handler->GetNameLink(target).c_str()); +                handler->PSendSysMessage(LANG_YOU_TAKE_MONEY, moneyToAddMsg, handler->GetNameLink(target).c_str());                  if (handler->needReportToTarget(target)) -                    ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_MONEY_TAKEN, handler->GetNameLink().c_str(), abs(moneyToAdd)); +                    ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_MONEY_TAKEN, handler->GetNameLink().c_str(), moneyToAddMsg);                  target->SetMoney(newmoney);              }          }          else          { -            handler->PSendSysMessage(LANG_YOU_GIVE_MONEY, moneyToAdd, handler->GetNameLink(target).c_str()); +            handler->PSendSysMessage(LANG_YOU_GIVE_MONEY, uint32(moneyToAdd), handler->GetNameLink(target).c_str());              if (handler->needReportToTarget(target)) -                ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_MONEY_GIVEN, handler->GetNameLink().c_str(), moneyToAdd); +                ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_MONEY_GIVEN, handler->GetNameLink().c_str(), uint32(moneyToAdd)); -            if (targetMoney >= MAX_MONEY_AMOUNT - moneyToAdd) +            if (moneyToAdd >= int64(MAX_MONEY_AMOUNT)) +                moneyToAdd = MAX_MONEY_AMOUNT; + +            if (targetMoney >= uint64(MAX_MONEY_AMOUNT) - moneyToAdd)                  moneyToAdd -= targetMoney;              target->ModifyMoney(moneyToAdd);          } -        TC_LOG_DEBUG("misc", handler->GetTrinityString(LANG_NEW_MONEY), targetMoney, moneyToAdd, target->GetMoney()); +        TC_LOG_DEBUG("misc", handler->GetTrinityString(LANG_NEW_MONEY), uint32(targetMoney), int32(moneyToAdd), uint32(target->GetMoney()));          return true;      } @@ -1101,7 +1106,7 @@ public:          return true;      } -    static bool HandleModifyHonorCommand (ChatHandler* handler, const char* args) +    static bool HandleModifyHonorCommand(ChatHandler* handler, const char* args)      {          if (!*args)              return false; @@ -1120,9 +1125,9 @@ public:          int32 amount = (uint32)atoi(args); -        target->ModifyHonorPoints(amount); +        target->ModifyCurrency(CURRENCY_TYPE_HONOR_POINTS, amount, true, true); -        handler->PSendSysMessage(LANG_COMMAND_MODIFY_HONOR, handler->GetNameLink(target).c_str(), target->GetHonorPoints()); +        handler->PSendSysMessage(LANG_COMMAND_MODIFY_HONOR, handler->GetNameLink(target).c_str(), target->GetCurrency(CURRENCY_TYPE_HONOR_POINTS, false));          return true;      } @@ -1230,14 +1235,14 @@ public:          if (factionEntry->reputationListID < 0)          { -            handler->PSendSysMessage(LANG_COMMAND_FACTION_NOREP_ERROR, factionEntry->name[handler->GetSessionDbcLocale()], factionId); +            handler->PSendSysMessage(LANG_COMMAND_FACTION_NOREP_ERROR, factionEntry->name, factionId);              handler->SetSentErrorMessage(true);              return false;          }          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->PSendSysMessage(LANG_COMMAND_MODIFY_REP, factionEntry->name, factionId,              handler->GetNameLink(target).c_str(), target->GetReputationMgr().GetReputation(factionEntry));          return true;      } @@ -1263,23 +1268,19 @@ public:          return true;      } -    //set temporary phase mask for player +    // Toggles a phaseid on a player      static bool HandleModifyPhaseCommand(ChatHandler* handler, const char* args)      {          if (!*args)              return false; -        uint32 phasemask = (uint32)atoi((char*)args); +        uint32 phase = (uint32)atoi((char*)args);          Unit* target = handler->getSelectedUnit(); -        if (!target) -            target = handler->GetSession()->GetPlayer(); - -        // check online security -        else if (target->GetTypeId() == TYPEID_PLAYER && handler->HasLowerSecurity(target->ToPlayer(), 0)) -            return false; - -        target->SetPhaseMask(phasemask, true); +        if (target) +            target->SetInPhase(phase, true, !target->IsInPhase(phase)); +        else +            handler->GetSession()->GetPlayer()->SetInPhase(phase, true, !handler->GetSession()->GetPlayer()->IsInPhase(phase));          return true;      } @@ -1296,28 +1297,6 @@ public:          return true;      } -    static bool HandleModifyArenaCommand(ChatHandler* handler, const char* args) -    { -        if (!*args) -            return false; - -        Player* target = handler->getSelectedPlayer(); -        if (!target) -        { -            handler->SendSysMessage(LANG_PLAYER_NOT_FOUND); -            handler->SetSentErrorMessage(true); -            return false; -        } - -        int32 amount = (uint32)atoi(args); - -        target->ModifyArenaPoints(amount); - -        handler->PSendSysMessage(LANG_COMMAND_MODIFY_ARENA, handler->GetNameLink(target).c_str(), target->GetArenaPoints()); - -        return true; -    } -      static bool HandleModifyGenderCommand(ChatHandler* handler, const char* args)      {          if (!*args) @@ -1393,6 +1372,33 @@ public:          return true;      } + +    static bool HandleModifyCurrencyCommand(ChatHandler* handler, const char* args) +    { +        if (!*args) +            return false; + +        Player* target = handler->getSelectedPlayer(); +        if (!target) +        { +            handler->PSendSysMessage(LANG_PLAYER_NOT_FOUND); +            handler->SetSentErrorMessage(true); +            return false; +        } + +        uint32 currencyId = atoi(strtok((char*)args, " ")); +        const CurrencyTypesEntry* currencyType =  sCurrencyTypesStore.LookupEntry(currencyId); +        if (!currencyType) +            return false; + +        uint32 amount = atoi(strtok(NULL, " ")); +        if (!amount) +            return false; + +        target->ModifyCurrency(currencyId, amount, true, true); + +        return true; +    }  };  void AddSC_modify_commandscript() diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index 79a707f1377..c82ab30eaae 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -106,7 +106,8 @@ EnumName<Mechanics> const mechanicImmunes[MAX_MECHANIC] =      CREATE_NAMED_ENUM(MECHANIC_DISCOVERY),      CREATE_NAMED_ENUM(MECHANIC_IMMUNE_SHIELD),      CREATE_NAMED_ENUM(MECHANIC_SAPPED), -    CREATE_NAMED_ENUM(MECHANIC_ENRAGED) +    CREATE_NAMED_ENUM(MECHANIC_ENRAGED), +    CREATE_NAMED_ENUM(MECHANIC_WOUNDED)  };  EnumName<UnitFlags> const unitFlags[MAX_UNIT_FLAGS] = @@ -263,7 +264,7 @@ public:              uint32 guid = sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT);              CreatureData& data = sObjectMgr->NewOrExistCreatureData(guid);              data.id = id; -            data.phaseMask = chr->GetPhaseMaskForSpawn(); +            data.phaseMask = chr->GetPhaseMask();              data.posX = chr->GetTransOffsetX();              data.posY = chr->GetTransOffsetY();              data.posZ = chr->GetTransOffsetZ(); @@ -271,20 +272,23 @@ public:              Creature* creature = trans->CreateNPCPassenger(guid, &data); -            creature->SaveToDB(trans->GetGOInfo()->moTransport.mapID, 1 << map->GetSpawnMode(), chr->GetPhaseMaskForSpawn()); +            creature->SaveToDB(trans->GetGOInfo()->moTransport.mapID, 1 << map->GetSpawnMode(), chr->GetPhaseMask());              sObjectMgr->AddCreatureToGrid(guid, &data);              return true;          }          Creature* creature = new Creature(); -        if (!creature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), id, x, y, z, o)) +        if (!creature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMask(), id, x, y, z, o))          {              delete creature;              return false;          } -        creature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn()); +        for (auto phase : chr->GetPhases()) +            creature->SetInPhase(phase, false, true); + +        creature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMask());          uint32 db_guid = creature->GetDBTableGUIDLow(); @@ -309,6 +313,8 @@ public:          if (!*args)              return false; +        const uint8 type = 1; // FIXME: make type (1 item, 2 currency) an argument +          char* pitem  = handler->extractKeyFromLink((char*)args, "Hitem");          if (!pitem)          { @@ -345,13 +351,13 @@ public:          uint32 vendor_entry = vendor->GetEntry(); -        if (!sObjectMgr->IsVendorItemValid(vendor_entry, itemId, maxcount, incrtime, extendedcost, handler->GetSession()->GetPlayer())) +        if (!sObjectMgr->IsVendorItemValid(vendor_entry, itemId, maxcount, incrtime, extendedcost, type, handler->GetSession()->GetPlayer()))          {              handler->SetSentErrorMessage(true);              return false;          } -        sObjectMgr->AddVendorItem(vendor_entry, itemId, maxcount, incrtime, extendedcost); +        sObjectMgr->AddVendorItem(vendor_entry, itemId, maxcount, incrtime, extendedcost, type);          ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(itemId); @@ -566,7 +572,9 @@ public:          }          uint32 itemId = atol(pitem); -        if (!sObjectMgr->RemoveVendorItem(vendor->GetEntry(), itemId)) +        const uint8 type = 1; // FIXME: make type (1 item, 2 currency) an argument + +        if (!sObjectMgr->RemoveVendorItem(vendor->GetEntry(), itemId, type))          {              handler->PSendSysMessage(LANG_ITEM_NOT_IN_LIST, itemId);              handler->SetSentErrorMessage(true); @@ -1091,20 +1099,14 @@ public:          return true;      } -    //npc phasemask handling -    //change phasemask of creature or pet +    //npc phase handling +    //change phase of creature or pet      static bool HandleNpcSetPhaseCommand(ChatHandler* handler, char const* args)      {          if (!*args)              return false; -        uint32 phasemask = (uint32) atoi((char*)args); -        if (phasemask == 0) -        { -            handler->SendSysMessage(LANG_BAD_VALUE); -            handler->SetSentErrorMessage(true); -            return false; -        } +        uint32 phase = (uint32) atoi((char*)args);          Creature* creature = handler->getSelectedCreature();          if (!creature) @@ -1114,7 +1116,7 @@ public:              return false;          } -        creature->SetPhaseMask(phasemask, true); +        creature->SetInPhase(phase, true, !creature->IsInPhase(phase));          if (!creature->IsPet())              creature->SaveToDB(); diff --git a/src/server/scripts/Commands/cs_rbac.cpp b/src/server/scripts/Commands/cs_rbac.cpp index 1c11ef0cd2a..95ef5ab6984 100644 --- a/src/server/scripts/Commands/cs_rbac.cpp +++ b/src/server/scripts/Commands/cs_rbac.cpp @@ -142,7 +142,7 @@ public:          {
              accountName = param1;
 -            if (AccountMgr::normalizeString(accountName))
 +            if (Utf8ToUpperOnlyLatin(accountName))
                  accountId = AccountMgr::GetId(accountName);
              if (!accountId)
 diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp index 5f061fab595..987f6c479ec 100644 --- a/src/server/scripts/Commands/cs_reload.cpp +++ b/src/server/scripts/Commands/cs_reload.cpp @@ -102,7 +102,6 @@ public:              { "gossip_menu_option",            rbac::RBAC_PERM_COMMAND_RELOAD_GOSSIP_MENU_OPTION,               true,  &HandleReloadGossipMenuOptionCommand,           "", NULL },              { "item_enchantment_template",     rbac::RBAC_PERM_COMMAND_RELOAD_ITEM_ENCHANTMENT_TEMPLATE,        true,  &HandleReloadItemEnchantementsCommand,          "", NULL },              { "item_loot_template",            rbac::RBAC_PERM_COMMAND_RELOAD_ITEM_LOOT_TEMPLATE,               true,  &HandleReloadLootTemplatesItemCommand,          "", NULL }, -            { "item_set_names",                rbac::RBAC_PERM_COMMAND_RELOAD_ITEM_SET_NAMES,                   true,  &HandleReloadItemSetNamesCommand,               "", NULL },              { "lfg_dungeon_rewards",           rbac::RBAC_PERM_COMMAND_RELOAD_LFG_DUNGEON_REWARDS,              true,  &HandleReloadLfgRewardsCommand,                 "", NULL },              { "locales_achievement_reward",    rbac::RBAC_PERM_COMMAND_RELOAD_LOCALES_ACHIEVEMENT_REWARD,       true,  &HandleReloadLocalesAchievementRewardCommand,   "", NULL },              { "locales_creature",              rbac::RBAC_PERM_COMMAND_RELOAD_LOCALES_CRETURE,                  true,  &HandleReloadLocalesCreatureCommand,            "", NULL }, @@ -110,7 +109,6 @@ public:              { "locales_gameobject",            rbac::RBAC_PERM_COMMAND_RELOAD_LOCALES_GAMEOBJECT,               true,  &HandleReloadLocalesGameobjectCommand,          "", NULL },              { "locales_gossip_menu_option",    rbac::RBAC_PERM_COMMAND_RELOAD_LOCALES_GOSSIP_MENU_OPTION,       true,  &HandleReloadLocalesGossipMenuOptionCommand,    "", NULL },              { "locales_item",                  rbac::RBAC_PERM_COMMAND_RELOAD_LOCALES_ITEM,                     true,  &HandleReloadLocalesItemCommand,                "", NULL }, -            { "locales_item_set_name",         rbac::RBAC_PERM_COMMAND_RELOAD_LOCALES_ITEM_SET_NAME,            true,  &HandleReloadLocalesItemSetNameCommand,         "", NULL },              { "locales_npc_text",              rbac::RBAC_PERM_COMMAND_RELOAD_LOCALES_NPC_TEXT,                 true,  &HandleReloadLocalesNpcTextCommand,             "", NULL },              { "locales_page_text",             rbac::RBAC_PERM_COMMAND_RELOAD_LOCALES_PAGE_TEXT,                true,  &HandleReloadLocalesPageTextCommand,            "", NULL },              { "locales_points_of_interest",    rbac::RBAC_PERM_COMMAND_RELOAD_LOCALES_POINTS_OF_INTEREST,       true,  &HandleReloadLocalesPointsOfInterestCommand,    "", NULL }, @@ -877,14 +875,6 @@ public:          return true;      } -    static bool HandleReloadItemSetNamesCommand(ChatHandler* handler, const char* /*args*/) -    { -        TC_LOG_INFO("misc", "Re-Loading Item set names..."); -        sObjectMgr->LoadItemSetNames(); -        handler->SendGlobalGMSysMessage("DB table `item_set_names` reloaded."); -        return true; -    } -      static bool HandleReloadEventScriptsCommand(ChatHandler* handler, const char* args)      {          if (sScriptMgr->IsScriptScheduled()) @@ -1046,14 +1036,6 @@ public:          return true;      } -    static bool HandleReloadLocalesItemSetNameCommand(ChatHandler* handler, const char* /*args*/) -    { -        TC_LOG_INFO("misc", "Re-Loading Locales Item set name... "); -        sObjectMgr->LoadItemSetNameLocales(); -        handler->SendGlobalGMSysMessage("DB table `locales_item_set_name` reloaded."); -        return true; -    } -      static bool HandleReloadLocalesNpcTextCommand(ChatHandler* handler, const char* /*args*/)      {          TC_LOG_INFO("misc", "Re-Loading Locales NPC Text ... "); @@ -1144,6 +1126,16 @@ public:          return true;      } + +    static bool HandleReloadPhaseDefinitionsCommand(ChatHandler* handler, const char* /*args*/) +    { +        TC_LOG_INFO("misc", "Reloading phase_definitions table..."); +        sObjectMgr->LoadPhaseDefinitions(); +        sWorld->UpdatePhaseDefinitions(); +        handler->SendGlobalGMSysMessage("Phase Definitions reloaded."); +        return true; +    } +      static bool HandleReloadRBACCommand(ChatHandler* handler, const char* /*args*/)      {          TC_LOG_INFO("misc", "Reloading RBAC tables..."); diff --git a/src/server/scripts/Commands/cs_reset.cpp b/src/server/scripts/Commands/cs_reset.cpp index 00a669609f9..495dc522414 100644 --- a/src/server/scripts/Commands/cs_reset.cpp +++ b/src/server/scripts/Commands/cs_reset.cpp @@ -66,7 +66,7 @@ public:          if (target)              target->ResetAchievements();          else -            AchievementMgr::DeleteFromDB(GUID_LOPART(targetGuid)); +            AchievementMgr<Player>::DeleteFromDB(GUID_LOPART(targetGuid));          return true;      } @@ -77,11 +77,8 @@ public:          if (!handler->extractPlayerTarget((char*)args, &target))              return false; -        target->SetHonorPoints(0);          target->SetUInt32Value(PLAYER_FIELD_KILLS, 0);          target->SetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, 0); -        target->SetUInt32Value(PLAYER_FIELD_TODAY_CONTRIBUTION, 0); -        target->SetUInt32Value(PLAYER_FIELD_YESTERDAY_CONTRIBUTION, 0);          target->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL);          return true; diff --git a/src/server/scripts/Commands/cs_titles.cpp b/src/server/scripts/Commands/cs_titles.cpp index dee9c33ae99..b1e5bd0ca98 100644 --- a/src/server/scripts/Commands/cs_titles.cpp +++ b/src/server/scripts/Commands/cs_titles.cpp @@ -96,8 +96,7 @@ public:          target->SetTitle(titleInfo);                            // to be sure that title now known          target->SetUInt32Value(PLAYER_CHOSEN_TITLE, titleInfo->bit_index); -        handler->PSendSysMessage(LANG_TITLE_CURRENT_RES, id, target->getGender() == GENDER_MALE ? titleInfo->nameMale[handler->GetSessionDbcLocale()] : titleInfo->nameFemale[handler->GetSessionDbcLocale()], tNameLink.c_str()); - +        handler->PSendSysMessage(LANG_TITLE_CURRENT_RES, id, target->getGender() == GENDER_MALE ? titleInfo->nameMale : titleInfo->nameFemale, tNameLink.c_str());          return true;      } @@ -139,7 +138,7 @@ public:          std::string tNameLink = handler->GetNameLink(target);          char titleNameStr[80]; -        snprintf(titleNameStr, 80, target->getGender() == GENDER_MALE ? titleInfo->nameMale[handler->GetSessionDbcLocale()] : titleInfo->nameFemale[handler->GetSessionDbcLocale()], target->GetName().c_str()); +        snprintf(titleNameStr, 80, target->getGender() == GENDER_MALE ? titleInfo->nameMale : titleInfo->nameFemale, target->GetName().c_str());          target->SetTitle(titleInfo);          handler->PSendSysMessage(LANG_TITLE_ADD_RES, id, titleNameStr, tNameLink.c_str()); @@ -187,7 +186,7 @@ public:          std::string tNameLink = handler->GetNameLink(target);          char titleNameStr[80]; -        snprintf(titleNameStr, 80, target->getGender() == GENDER_MALE ? titleInfo->nameMale[handler->GetSessionDbcLocale()] : titleInfo->nameFemale[handler->GetSessionDbcLocale()], target->GetName().c_str()); +        snprintf(titleNameStr, 80, target->getGender() == GENDER_MALE ? titleInfo->nameMale : titleInfo->nameFemale, target->GetName().c_str());          handler->PSendSysMessage(LANG_TITLE_REMOVE_RES, id, titleNameStr, tNameLink.c_str()); diff --git a/src/server/scripts/Commands/cs_wp.cpp b/src/server/scripts/Commands/cs_wp.cpp index 0c11c77af6a..5698366acc9 100644 --- a/src/server/scripts/Commands/cs_wp.cpp +++ b/src/server/scripts/Commands/cs_wp.cpp @@ -242,37 +242,40 @@ public:          if (!target)          { -            handler->PSendSysMessage("%s%s|r", "|cff33ffff", "You must select target."); +            handler->PSendSysMessage("%s%s|r", "|cff33ffff", "You must select a target.");              return true;          } -        uint32 guildLow = target->GetDBTableGUIDLow(); +        uint32 guidLow = target->GetDBTableGUIDLow(); +        if (guidLow == 0) +        { +            handler->PSendSysMessage("%s%s|r", "|cffff33ff", "Target is not saved to DB."); +            return true; +        } -        if (target->GetCreatureAddon()) +        CreatureAddon const* addon = sObjectMgr->GetCreatureAddon(guidLow); +        if (!addon || addon->path_id == 0)          { -            if (target->GetCreatureAddon()->path_id != 0) -            { -                stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_CREATURE_ADDON); -                stmt->setUInt32(0, guildLow); -                WorldDatabase.Execute(stmt); +            handler->PSendSysMessage("%s%s|r", "|cffff33ff", "Target does not have a loaded path."); +            return true; +        } -                target->UpdateWaypointID(0); +        stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_CREATURE_ADDON); +        stmt->setUInt32(0, guidLow); +        WorldDatabase.Execute(stmt); -                stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_CREATURE_MOVEMENT_TYPE); -                stmt->setUInt8(0, uint8(IDLE_MOTION_TYPE)); -                stmt->setUInt32(1, guildLow); -                WorldDatabase.Execute(stmt); +        target->UpdateWaypointID(0); -                target->LoadPath(0); -                target->SetDefaultMovementType(IDLE_MOTION_TYPE); -                target->GetMotionMaster()->MoveTargetedHome(); -                target->GetMotionMaster()->Initialize(); -                target->Say("Path unloaded.", LANG_UNIVERSAL); +        stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_CREATURE_MOVEMENT_TYPE); +        stmt->setUInt8(0, uint8(IDLE_MOTION_TYPE)); +        stmt->setUInt32(1, guidLow); +        WorldDatabase.Execute(stmt); -                return true; -            } -            handler->PSendSysMessage("%s%s|r", "|cffff33ff", "Target have no loaded path."); -        } +        target->LoadPath(0); +        target->SetDefaultMovementType(IDLE_MOTION_TYPE); +        target->GetMotionMaster()->MoveTargetedHome(); +        target->GetMotionMaster()->Initialize(); +        target->Say("Path unloaded.", LANG_UNIVERSAL);          return true;      } @@ -669,7 +672,7 @@ public:                      }                      // re-create                      Creature* wpCreature2 = new Creature(); -                    if (!wpCreature2->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), VISUAL_WAYPOINT, chr->GetPositionX(), chr->GetPositionY(), chr->GetPositionZ(), chr->GetOrientation())) +                    if (!wpCreature2->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMask(), VISUAL_WAYPOINT, chr->GetPositionX(), chr->GetPositionY(), chr->GetPositionZ(), chr->GetOrientation()))                      {                          handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, VISUAL_WAYPOINT);                          delete wpCreature2; @@ -677,7 +680,10 @@ public:                          return false;                      } -                    wpCreature2->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn()); +                    for (auto phase : chr->GetPhases()) +                        wpCreature2->SetInPhase(phase, false, true); + +                    wpCreature2->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMask());                      // To call _LoadGoods(); _LoadQuests(); CreateTrainerSpells();                      /// @todo Should we first use "Create" then use "LoadFromDB"?                      if (!wpCreature2->LoadCreatureFromDB(wpCreature2->GetDBTableGUIDLow(), map)) @@ -886,13 +892,16 @@ public:                  float o = chr->GetOrientation();                  Creature* wpCreature = new Creature(); -                if (!wpCreature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), id, x, y, z, o)) +                if (!wpCreature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMask(), id, x, y, z, o))                  {                      handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, id);                      delete wpCreature;                      return false;                  } +                for (auto phase : chr->GetPhases()) +                    wpCreature->SetInPhase(phase, false, true); +                  // Set "wpguid" column to the visual waypoint                  stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_WAYPOINT_DATA_WPGUID);                  stmt->setInt32(0, int32(wpCreature->GetGUIDLow())); @@ -900,7 +909,7 @@ public:                  stmt->setUInt32(2, point);                  WorldDatabase.Execute(stmt); -                wpCreature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn()); +                wpCreature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMask());                  // To call _LoadGoods(); _LoadQuests(); CreateTrainerSpells();                  if (!wpCreature->LoadCreatureFromDB(wpCreature->GetDBTableGUIDLow(), map))                  { @@ -948,14 +957,17 @@ public:              Map* map = chr->GetMap();              Creature* creature = new Creature(); -            if (!creature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), id, x, y, z, o)) +            if (!creature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMask(), id, x, y, z, o))              {                  handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, id);                  delete creature;                  return false;              } -            creature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn()); +            for (auto phase : chr->GetPhases()) +                creature->SetInPhase(phase, false, true); + +            creature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMask());              if (!creature->LoadCreatureFromDB(creature->GetDBTableGUIDLow(), map))              {                  handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, id); @@ -997,14 +1009,17 @@ public:              Map* map = chr->GetMap();              Creature* creature = new Creature(); -            if (!creature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), id, x, y, z, o)) +            if (!creature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMask(), id, x, y, z, o))              {                  handler->PSendSysMessage(LANG_WAYPOINT_NOTCREATED, id);                  delete creature;                  return false;              } -            creature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn()); +            for (auto phase : chr->GetPhases()) +                creature->SetInPhase(phase, false, true); + +            creature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMask());              if (!creature->LoadCreatureFromDB(creature->GetDBTableGUIDLow(), map))              {                  handler->PSendSysMessage(LANG_WAYPOINT_NOTCREATED, id); diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/baradin_hold.h b/src/server/scripts/EasternKingdoms/BaradinHold/baradin_hold.h new file mode 100644 index 00000000000..2ae40d1d39a --- /dev/null +++ b/src/server/scripts/EasternKingdoms/BaradinHold/baradin_hold.h @@ -0,0 +1,65 @@ +/* +* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/> +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License as published by the +* Free Software Foundation; either version 3 of the License, or (at your +* option) any later version. +* +* This program is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +* more details. +* +* You should have received a copy of the GNU General Public License along +* with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef DEF_BARADIN_HOLD_H_ +#define DEF_BARADIN_HOLD_H_ + +#include "Map.h" +#include "Creature.h" +#include "ObjectMgr.h" + +#define DataHeader "BH" +#define BHScriptName "instance_baradin_hold" + +uint32 const EncounterCount = 3; + +enum DataTypes +{ +    DATA_ARGALOTH           = 0, +    DATA_OCCUTHAR           = 1, +    DATA_ALIZABAL           = 2 +}; + +enum CreatureIds +{ +    BOSS_ARGALOTH           = 47120, +    BOSS_OCCUTHAR           = 52363, +    BOSS_ALIZABAL           = 55869, + +    NPC_EYE_OF_OCCUTHAR     = 52389, +    NPC_FOCUS_FIRE_DUMMY    = 52369, +    NPC_OCCUTHAR_EYE        = 52368 +}; + +enum GameObjectIds +{ +    GO_ARGALOTH_DOOR        = 207619, +    GO_OCCUTHAR_DOOR        = 208953, +    GO_ALIZABAL_DOOR        = 209849 +}; + +template<class AI> +CreatureAI* GetBaradinHoldAI(Creature* creature) +{ +    if (InstanceMap* instance = creature->GetMap()->ToInstanceMap()) +        if (instance->GetInstanceScript()) +            if (instance->GetScriptId() == sObjectMgr->GetScriptId(BHScriptName)) +                return new AI(creature); +    return NULL; +} + +#endif diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp new file mode 100644 index 00000000000..52eac77cd46 --- /dev/null +++ b/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp @@ -0,0 +1,270 @@ +/* + * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "Player.h" +#include "ObjectAccessor.h" +#include "baradin_hold.h" + +enum Texts +{ +    SAY_INTRO               = 1, +    SAY_AGGRO               = 2, +    SAY_HATE                = 3, +    SAY_SKEWER              = 4, +    SAY_SKEWER_ANNOUNCE     = 5, +    SAY_BLADE_STORM         = 6, +    SAY_SLAY                = 10, +    SAY_DEATH               = 12 +}; + +enum Spells +{ +    SPELL_BLADE_DANCE       = 105784, +    SPELL_BLADE_DANCE_DUMMY = 105828, +    SPELL_SEETHING_HATE     = 105067, +    SPELL_SKEWER            = 104936, +    SPELL_BERSERK           = 47008 +}; + +enum Actions +{ +    ACTION_INTRO            = 1 +}; + +    enum Points +{ +    POINT_STORM             = 1 +}; + +enum Events +{ +    EVENT_RANDOM_CAST       = 1, +    EVENT_STOP_STORM        = 2, +    EVENT_MOVE_STORM        = 3, +    EVENT_CAST_STORM        = 4 +}; + +class at_alizabal_intro : public AreaTriggerScript +{ +    public: +        at_alizabal_intro() : AreaTriggerScript("at_alizabal_intro") { } + +        bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) +        { +            if (InstanceScript* instance = player->GetInstanceScript()) +                if (Creature* alizabal = ObjectAccessor::GetCreature(*player, instance->GetData64(DATA_ALIZABAL))) +                    alizabal->AI()->DoAction(ACTION_INTRO); +            return true; +        } +}; + +class boss_alizabal : public CreatureScript +{ +    public: +        boss_alizabal() : CreatureScript("boss_alizabal") { } + +        struct boss_alizabalAI : public BossAI +        { +            boss_alizabalAI(Creature* creature) : BossAI(creature, DATA_ALIZABAL) +            { +                _intro = false; +            } + +            void Reset() override +            { +                _Reset(); +                _hate = false; +                _skewer = false; +            } + +            void EnterCombat(Unit* /*who*/) override +            { +                _EnterCombat(); +                Talk(SAY_AGGRO); +                instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me); +                events.ScheduleEvent(EVENT_RANDOM_CAST, 10000); +            } + +            void JustDied(Unit* /*killer*/) override +            { +                _JustDied(); +                Talk(SAY_DEATH); +                instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); +            } + +            void KilledUnit(Unit* who) override +            { +                if (who->GetTypeId() == TYPEID_PLAYER) +                    Talk(SAY_SLAY); +            } + +            void EnterEvadeMode() override +            { +                instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); +                me->GetMotionMaster()->MoveTargetedHome(); +                _DespawnAtEvade(); +            } + +            void DoAction(int32 action) override +            { +                switch (action) +                { +                    case ACTION_INTRO: +                        if (!_intro) +                        { +                            Talk(SAY_INTRO); +                            _intro = true; +                        } +                        break; +                } +            } + +            void MovementInform(uint32 /*type*/, uint32 pointId) override +            { +                switch (pointId) +                { +                    case POINT_STORM: +                        events.ScheduleEvent(EVENT_CAST_STORM, 1); +                        break; +                } +            } + +            void UpdateAI(uint32 diff) override +            { +                if (!UpdateVictim()) +                    return; + +                events.Update(diff); + +                while (uint32 eventId = events.ExecuteEvent()) +                { +                    switch (eventId) +                    { +                        case EVENT_RANDOM_CAST: +                            switch (urand(0, 1)) +                            { +                                case 0: +                                    if (!_skewer) +                                    { +                                        if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 0)) +                                        { +                                            DoCast(target, SPELL_SKEWER, true); +                                            Talk(SAY_SKEWER); +                                            Talk(SAY_SKEWER_ANNOUNCE, target); +                                        } +                                        _skewer = true; +                                        events.ScheduleEvent(EVENT_RANDOM_CAST, urand(7000, 10000)); +                                    } +                                    else if (!_hate) +                                    { +                                        if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(me))) +                                        { +                                            DoCast(target, SPELL_SEETHING_HATE, true); +                                            Talk(SAY_HATE); +                                        } +                                        _hate = true; +                                        events.ScheduleEvent(EVENT_RANDOM_CAST, urand(7000, 10000)); +                                    } +                                    else if (_hate && _skewer) +                                    { +                                        Talk(SAY_BLADE_STORM); +                                        DoCastAOE(SPELL_BLADE_DANCE_DUMMY); +                                        DoCastAOE(SPELL_BLADE_DANCE); +                                        events.ScheduleEvent(EVENT_RANDOM_CAST, 21000); +                                        events.ScheduleEvent(EVENT_MOVE_STORM, 4050); +                                        events.ScheduleEvent(EVENT_STOP_STORM, 13000); +                                    } +                                    break; +                                case 1: +                                    if (!_hate) +                                    { +                                        if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(me))) +                                        { +                                            DoCast(target, SPELL_SEETHING_HATE, true); +                                            Talk(SAY_HATE); +                                        } +                                        _hate = true; +                                        events.ScheduleEvent(EVENT_RANDOM_CAST, urand(7000, 10000)); +                                    } +                                    else if (!_skewer) +                                    { +                                        if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 0)) +                                        { +                                            DoCast(target, SPELL_SKEWER, true); +                                            Talk(SAY_SKEWER); +                                            Talk(SAY_SKEWER_ANNOUNCE, target); +                                        } +                                        _skewer = true; +                                        events.ScheduleEvent(EVENT_RANDOM_CAST, urand(7000, 10000)); +                                    } +                                    else if (_hate && _skewer) +                                    { +                                        Talk(SAY_BLADE_STORM); +                                        DoCastAOE(SPELL_BLADE_DANCE_DUMMY); +                                        DoCastAOE(SPELL_BLADE_DANCE); +                                        events.ScheduleEvent(EVENT_RANDOM_CAST, 21000); +                                        events.ScheduleEvent(EVENT_MOVE_STORM, 4050); +                                        events.ScheduleEvent(EVENT_STOP_STORM, 13000); +                                    } +                                    break; +                            } +                            break; +                        case EVENT_MOVE_STORM: +                            me->SetSpeed(MOVE_RUN, 4.0f); +                            me->SetSpeed(MOVE_WALK, 4.0f); +                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(me))) +                                me->GetMotionMaster()->MovePoint(POINT_STORM, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ()); +                            events.ScheduleEvent(EVENT_MOVE_STORM, 4050); +                            break; +                        case EVENT_STOP_STORM: +                            me->RemoveAura(SPELL_BLADE_DANCE); +                            me->RemoveAura(SPELL_BLADE_DANCE_DUMMY); +                            me->SetSpeed(MOVE_WALK, 1.0f); +                            me->SetSpeed(MOVE_RUN, 1.14f); +                            me->GetMotionMaster()->MoveChase(me->GetVictim()); +                            _hate = false; +                            _skewer = false; +                            break; +                        case EVENT_CAST_STORM: +                            DoCastAOE(SPELL_BLADE_DANCE); +                            break; +                    } +                } + +                DoMeleeAttackIfReady(); +            } + +        private: +            bool _intro; +            bool _hate; +            bool _skewer; + +        }; + +        CreatureAI* GetAI(Creature* creature) const override +        { +            return GetBaradinHoldAI<boss_alizabalAI>(creature); +        } +}; + +void AddSC_boss_alizabal() +{ +    new boss_alizabal(); +    new at_alizabal_intro(); +} diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/boss_occuthar.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/boss_occuthar.cpp new file mode 100644 index 00000000000..ca2679b042a --- /dev/null +++ b/src/server/scripts/EasternKingdoms/BaradinHold/boss_occuthar.cpp @@ -0,0 +1,392 @@ +/* + * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "Vehicle.h" +#include "SpellScript.h" +#include "SpellAuraEffects.h" +#include "baradin_hold.h" + +enum Spells +{ +    SPELL_SEARING_SHADOWS               = 96913, +    SPELL_FOCUSED_FIRE_FIRST_DAMAGE     = 97212, +    SPELL_FOCUSED_FIRE_TRIGGER          = 96872, +    SPELL_FOCUSED_FIRE_VISUAL           = 96886, +    SPELL_FOCUSED_FIRE                  = 96884, +    SPELL_EYES_OF_OCCUTHAR              = 96920, +    SPELL_GAZE_OF_OCCUTHAR              = 96942, +    SPELL_OCCUTHARS_DESTUCTION          = 96968, +    SPELL_BERSERK                       = 47008 +}; + +enum Events +{ +    EVENT_SEARING_SHADOWS               = 1, +    EVENT_FOCUSED_FIRE                  = 2, +    EVENT_EYES_OF_OCCUTHAR              = 3, +    EVENT_BERSERK                       = 4, + +    EVENT_FOCUSED_FIRE_FIRST_DAMAGE     = 1 +}; + +enum Misc +{ +    MAX_OCCUTHAR_VEHICLE_SEATS          = 7 +}; + +class boss_occuthar : public CreatureScript +{ +    public: +        boss_occuthar() : CreatureScript("boss_occuthar") { } + +        struct boss_occutharAI : public BossAI +        { +            boss_occutharAI(Creature* creature) : BossAI(creature, DATA_OCCUTHAR), +                _vehicle(me->GetVehicleKit()) +            { +                ASSERT(_vehicle); +            } + +            void EnterCombat(Unit* /*who*/) override +            { +                _EnterCombat(); +                instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me); +                events.ScheduleEvent(EVENT_SEARING_SHADOWS, 8 * IN_MILLISECONDS); +                events.ScheduleEvent(EVENT_FOCUSED_FIRE, 15 * IN_MILLISECONDS); +                events.ScheduleEvent(EVENT_EYES_OF_OCCUTHAR, 30 * IN_MILLISECONDS); +                events.ScheduleEvent(EVENT_BERSERK, 5 * MINUTE * IN_MILLISECONDS); +            } + +            void EnterEvadeMode() override +            { +                BossAI::EnterEvadeMode(); +                instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); +                _DespawnAtEvade(); +            } + +            void JustDied(Unit* /*killer*/) override +            { +                _JustDied(); +                instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); +            } + +            void JustSummoned(Creature* summon) override +            { +                summons.Summon(summon); + +                if (summon->GetEntry() == NPC_FOCUS_FIRE_DUMMY) +                { +                    DoCast(summon, SPELL_FOCUSED_FIRE); + +                    for (uint8 i = 0; i < MAX_OCCUTHAR_VEHICLE_SEATS; ++i) +                    { +                        if (Unit* vehicle = _vehicle->GetPassenger(i)) +                            vehicle->CastSpell(summon, SPELL_FOCUSED_FIRE_VISUAL); +                    } +                } +            } + +            void UpdateAI(uint32 diff) override +            { +                if (!UpdateVictim()) +                    return; + +                events.Update(diff); + +                if (me->HasUnitState(UNIT_STATE_CASTING)) +                    return; + +                while (uint32 eventId = events.ExecuteEvent()) +                { +                    switch (eventId) +                    { +                        case EVENT_SEARING_SHADOWS: +                            DoCastAOE(SPELL_SEARING_SHADOWS); +                            events.ScheduleEvent(EVENT_SEARING_SHADOWS, 25 * IN_MILLISECONDS); +                            break; +                        case EVENT_FOCUSED_FIRE: +                            DoCastAOE(SPELL_FOCUSED_FIRE_TRIGGER, true); +                            events.ScheduleEvent(EVENT_FOCUSED_FIRE, 15 * IN_MILLISECONDS); +                            break; +                        case EVENT_EYES_OF_OCCUTHAR: +                            DoCastAOE(SPELL_EYES_OF_OCCUTHAR); +                            events.RescheduleEvent(EVENT_FOCUSED_FIRE, 15 * IN_MILLISECONDS); +                            events.ScheduleEvent(EVENT_EYES_OF_OCCUTHAR, 60 * IN_MILLISECONDS); +                            break; +                        case EVENT_BERSERK: +                            DoCast(me, SPELL_BERSERK, true); +                            break; +                        default: +                            break; +                    } +                } + +                DoMeleeAttackIfReady(); +            } + +        private: +            Vehicle* _vehicle; +        }; + +        CreatureAI* GetAI(Creature* creature) const override +        { +            return GetBaradinHoldAI<boss_occutharAI>(creature); +        } +}; + +class npc_eyestalk : public CreatureScript +{ +    public: +        npc_eyestalk() : CreatureScript("npc_eyestalk") { } + +        struct npc_eyestalkAI : public ScriptedAI +        { +            npc_eyestalkAI(Creature* creature) : ScriptedAI(creature), +                _instance(creature->GetInstanceScript()) +            { +                _damageCount = 0; +            } + +            void IsSummonedBy(Unit* /*summoner*/) override +            { +                // player is the spellcaster so register summon manually +                if (Creature* occuthar = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_OCCUTHAR))) +                    occuthar->AI()->JustSummoned(me); +            } + +            void Reset() override +            { +                _events.Reset(); +                _events.ScheduleEvent(EVENT_FOCUSED_FIRE_FIRST_DAMAGE, 0); +            } + +            void UpdateAI(uint32 diff) override +            { +                _events.Update(diff); + +                if (_events.ExecuteEvent() == EVENT_FOCUSED_FIRE_FIRST_DAMAGE) +                { +                    DoCastAOE(SPELL_FOCUSED_FIRE_FIRST_DAMAGE); +                    if (++_damageCount < 2) +                        _events.ScheduleEvent(EVENT_FOCUSED_FIRE_FIRST_DAMAGE, 1 * IN_MILLISECONDS); +                } +            } + +            void EnterEvadeMode() override { } // Never evade + +        private: +            InstanceScript* _instance; +            EventMap _events; +            uint8 _damageCount; +        }; + +        CreatureAI* GetAI(Creature* creature) const override +        { +            return GetBaradinHoldAI<npc_eyestalkAI>(creature); +        } +}; + +class FocusedFireTargetSelector : public std::unary_function<Unit *, bool> +{ +    public: +        FocusedFireTargetSelector(Creature* me, const Unit* victim) : _me(me), _victim(victim) { } + +        bool operator() (WorldObject* target) +        { +            if (target == _victim && _me->getThreatManager().getThreatList().size() > 1) +                return true; + +            if (target->GetTypeId() != TYPEID_PLAYER) +                return true; + +            return false; +        } + +        Creature* _me; +        Unit const* _victim; +}; + +// 96872 - Focused Fire +class spell_occuthar_focused_fire : public SpellScriptLoader +{ +    public: +        spell_occuthar_focused_fire() : SpellScriptLoader("spell_occuthar_focused_fire") { } + +        class spell_occuthar_focused_fire_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_occuthar_focused_fire_SpellScript); + +            void FilterTargets(std::list<WorldObject*>& targets) +            { +                if (targets.empty()) +                    return; + +                targets.remove_if(FocusedFireTargetSelector(GetCaster()->ToCreature(), GetCaster()->GetVictim())); +                WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets); +                targets.clear(); +                targets.push_back(target); +            } + +            void Register() override +            { +                OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_occuthar_focused_fire_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); +            } +        }; + +        SpellScript* GetSpellScript() const override +        { +            return new spell_occuthar_focused_fire_SpellScript(); +        } +}; + +// ID - 96931 Eyes of Occu'thar +class spell_occuthar_eyes_of_occuthar : public SpellScriptLoader +{ +    public: +        spell_occuthar_eyes_of_occuthar() : SpellScriptLoader("spell_occuthar_eyes_of_occuthar") { } + +        class spell_occuthar_eyes_of_occuthar_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_occuthar_eyes_of_occuthar_SpellScript); + +            bool Validate(SpellInfo const* spellInfo) override +            { +                if (!sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_0].CalcValue())) +                    return false; +                return true; +            } + +            bool Load() override +            { +                return GetCaster()->GetTypeId() == TYPEID_PLAYER; +            } + +            void FilterTargets(std::list<WorldObject*>& targets) +            { +                if (targets.empty()) +                    return; + +                WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets); +                targets.clear(); +                targets.push_back(target); +            } + +            void HandleScript(SpellEffIndex /*effIndex*/) +            { +                GetHitUnit()->CastSpell(GetCaster(), GetEffectValue(), true); +            } + +            void Register() override +            { +                OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_occuthar_eyes_of_occuthar_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); +                OnEffectHitTarget += SpellEffectFn(spell_occuthar_eyes_of_occuthar_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); +            } +        }; + +        SpellScript* GetSpellScript() const override +        { +            return new spell_occuthar_eyes_of_occuthar_SpellScript(); +        } +}; + +// ID - 96932 Eyes of Occu'thar +class spell_occuthar_eyes_of_occuthar_vehicle : public SpellScriptLoader +{ +    public: +        spell_occuthar_eyes_of_occuthar_vehicle() : SpellScriptLoader("spell_occuthar_eyes_of_occuthar_vehicle") { } + +        class spell_occuthar_eyes_of_occuthar_vehicle_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_occuthar_eyes_of_occuthar_vehicle_SpellScript); + +            bool Load() override +            { +                return GetCaster()->GetInstanceScript() != NULL; +            } + +            void HandleScript() +            { +                Position pos = GetHitUnit()->GetPosition(); + +                if (Creature* occuthar = ObjectAccessor::GetCreature(*GetCaster(), GetCaster()->GetInstanceScript()->GetData64(DATA_OCCUTHAR))) +                { +                    if (Creature* creature = occuthar->SummonCreature(NPC_EYE_OF_OCCUTHAR, pos)) +                        creature->CastSpell(GetHitUnit(), SPELL_GAZE_OF_OCCUTHAR, false); +                } +            } + +            void Register() override +            { +                AfterHit += SpellHitFn(spell_occuthar_eyes_of_occuthar_vehicle_SpellScript::HandleScript); +            } +        }; + +        SpellScript* GetSpellScript() const override +        { +            return new spell_occuthar_eyes_of_occuthar_vehicle_SpellScript(); +        } +}; + +// 96942 / 101009 - Gaze of Occu'thar +class spell_occuthar_occuthars_destruction : public SpellScriptLoader +{ +    public: +        spell_occuthar_occuthars_destruction() : SpellScriptLoader("spell_occuthar_occuthars_destruction") { } + +        class spell_occuthar_occuthars_destruction_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_occuthar_occuthars_destruction_AuraScript); + +            bool Load() override +            { +                return GetCaster() && GetCaster()->GetTypeId() == TYPEID_UNIT; +            } + +            void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) +            { +                if (Unit* caster = GetCaster()) +                { +                    if (IsExpired()) +                        caster->CastSpell((Unit*)NULL, SPELL_OCCUTHARS_DESTUCTION, true, NULL, aurEff); + +                    caster->ToCreature()->DespawnOrUnsummon(500); +                } +            } + +            void Register() override +            { +                OnEffectRemove += AuraEffectRemoveFn(spell_occuthar_occuthars_destruction_AuraScript::OnRemove, EFFECT_2, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_occuthar_occuthars_destruction_AuraScript(); +        } +}; + +void AddSC_boss_occuthar() +{ +    new boss_occuthar(); +    new npc_eyestalk(); +    new spell_occuthar_focused_fire(); +    new spell_occuthar_eyes_of_occuthar(); +    new spell_occuthar_eyes_of_occuthar_vehicle(); +    new spell_occuthar_occuthars_destruction(); +} diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/boss_pit_lord_argaloth.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/boss_pit_lord_argaloth.cpp new file mode 100644 index 00000000000..008803f9a52 --- /dev/null +++ b/src/server/scripts/EasternKingdoms/BaradinHold/boss_pit_lord_argaloth.cpp @@ -0,0 +1,200 @@ +/* + * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "SpellScript.h" +#include "baradin_hold.h" + +/* TODO: +- Fel Firestorm need completion +- Need Correct timer +*/ + +enum Spells +{ +    SPELL_METEOR_SLASH          = 88942, +    SPELL_CONSUMING_DARKNESS    = 88954, +    SPELL_FEL_FIRESTORM         = 88972, +    SPELL_BERSERK               = 47008 +}; + +enum Events +{ +    EVENT_METEOR_SLASH          = 1, +    EVENT_CONSUMING_DARKNESS    = 2, +    EVENT_BERSERK               = 3 +}; + +class boss_pit_lord_argaloth : public CreatureScript +{ +    public: +        boss_pit_lord_argaloth() : CreatureScript("boss_pit_lord_argaloth") { } + +        struct boss_pit_lord_argalothAI : public BossAI +        { +            boss_pit_lord_argalothAI(Creature* creature) : BossAI(creature, DATA_ARGALOTH) { } + +            void EnterCombat(Unit* /*who*/) override +            { +                _EnterCombat(); +                instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me); +                events.ScheduleEvent(EVENT_METEOR_SLASH, urand(10 * IN_MILLISECONDS, 20 * IN_MILLISECONDS)); +                events.ScheduleEvent(EVENT_CONSUMING_DARKNESS, urand(20 * IN_MILLISECONDS, 25 * IN_MILLISECONDS)); +                events.ScheduleEvent(EVENT_BERSERK, 5 * MINUTE * IN_MILLISECONDS); +            } + +            void EnterEvadeMode() override +            { +                me->GetMotionMaster()->MoveTargetedHome(); +                instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); +                _DespawnAtEvade(); +            } + +            void DamageTaken(Unit* /*attacker*/, uint32& damage) override +            { +                if (me->HealthBelowPctDamaged(33, damage) || +                    me->HealthBelowPctDamaged(66, damage)) +                { +                    DoCastAOE(SPELL_FEL_FIRESTORM); +                } +            } + +            void JustDied(Unit* /*killer*/) override +            { +                _JustDied(); +                instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); +            } + +            void UpdateAI(uint32 diff) override +            { +                if (!UpdateVictim()) +                    return; + +                events.Update(diff); + +                if (me->HasUnitState(UNIT_STATE_CASTING)) +                    return; + +                while (uint32 eventId = events.ExecuteEvent()) +                { +                    switch (eventId) +                    { +                        case EVENT_METEOR_SLASH: +                            DoCastAOE(SPELL_METEOR_SLASH); +                            events.ScheduleEvent(EVENT_METEOR_SLASH, urand(15 * IN_MILLISECONDS, 20 * IN_MILLISECONDS)); +                            break; +                        case EVENT_CONSUMING_DARKNESS: +                            DoCastAOE(SPELL_CONSUMING_DARKNESS, true); +                            events.ScheduleEvent(EVENT_CONSUMING_DARKNESS, urand(20 * IN_MILLISECONDS, 25 * IN_MILLISECONDS)); +                            break; +                        case EVENT_BERSERK: +                            DoCast(me, SPELL_BERSERK, true); +                            break; +                        default: +                            break; +                    } +                } + +                DoMeleeAttackIfReady(); +            } +        }; + +        CreatureAI* GetAI(Creature* creature) const override +        { +            return GetBaradinHoldAI<boss_pit_lord_argalothAI>(creature); +        } +}; + +// 88954 / 95173 - Consuming Darkness +class spell_argaloth_consuming_darkness : public SpellScriptLoader +{ +    public: +        spell_argaloth_consuming_darkness() : SpellScriptLoader("spell_argaloth_consuming_darkness") { } + +        class spell_argaloth_consuming_darkness_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_argaloth_consuming_darkness_SpellScript); + +            void FilterTargets(std::list<WorldObject*>& targets) +            { +                Trinity::Containers::RandomResizeList(targets, GetCaster()->GetMap()->Is25ManRaid() ? 8 : 3); +            } + +            void Register() override +            { +                OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_argaloth_consuming_darkness_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); +            } +        }; + +        SpellScript* GetSpellScript() const override +        { +            return new spell_argaloth_consuming_darkness_SpellScript(); +        } +}; + +// 88942 / 95172 - Meteor Slash +class spell_argaloth_meteor_slash : public SpellScriptLoader +{ +    public: +        spell_argaloth_meteor_slash() : SpellScriptLoader("spell_argaloth_meteor_slash") { } + +        class spell_argaloth_meteor_slash_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_argaloth_meteor_slash_SpellScript); + +            bool Load() override +            { +                _targetCount = 0; +                return true; +            } + +            void CountTargets(std::list<WorldObject*>& targets) +            { +                _targetCount = targets.size(); +            } + +            void SplitDamage() +            { +                if (!_targetCount) +                    return; + +                SetHitDamage(GetHitDamage() / _targetCount); +            } + +            void Register() override +            { +                OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_argaloth_meteor_slash_SpellScript::CountTargets, EFFECT_0, TARGET_UNIT_CONE_ENEMY_104); +                OnHit += SpellHitFn(spell_argaloth_meteor_slash_SpellScript::SplitDamage); +            } + +        private: +            uint32 _targetCount; +        }; + +        SpellScript* GetSpellScript() const override +        { +            return new spell_argaloth_meteor_slash_SpellScript(); +        } +}; + +void AddSC_boss_pit_lord_argaloth() +{ +    new boss_pit_lord_argaloth(); +    new spell_argaloth_consuming_darkness(); +    new spell_argaloth_meteor_slash(); +} diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp new file mode 100644 index 00000000000..0f9102a2485 --- /dev/null +++ b/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp @@ -0,0 +1,120 @@ +/* + * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 3 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "ScriptMgr.h" +#include "InstanceScript.h" +#include "baradin_hold.h" + +DoorData const doorData[] = +{ +    { GO_ARGALOTH_DOOR,  DATA_ARGALOTH, DOOR_TYPE_ROOM, BOUNDARY_NONE }, +    { GO_OCCUTHAR_DOOR,  DATA_OCCUTHAR, DOOR_TYPE_ROOM, BOUNDARY_NONE }, +    { GO_ALIZABAL_DOOR,  DATA_ALIZABAL, DOOR_TYPE_ROOM, BOUNDARY_NONE }, +    { 0,                 0,             DOOR_TYPE_ROOM, BOUNDARY_NONE }  // END +}; + +class instance_baradin_hold: public InstanceMapScript +{ +    public: +        instance_baradin_hold() : InstanceMapScript(BHScriptName, 757) { } + +        struct instance_baradin_hold_InstanceMapScript: public InstanceScript +        { +            instance_baradin_hold_InstanceMapScript(InstanceMap* map) : InstanceScript(map) +            { +                SetHeaders(DataHeader); +                SetBossNumber(EncounterCount); +                LoadDoorData(doorData); + +                ArgalothGUID = 0; +                OccutharGUID = 0; +                AlizabalGUID = 0; +            } + +            void OnCreatureCreate(Creature* creature) override +            { +                switch(creature->GetEntry()) +                { +                    case BOSS_ARGALOTH: +                        ArgalothGUID = creature->GetGUID(); +                        break; +                    case BOSS_OCCUTHAR: +                        OccutharGUID = creature->GetGUID(); +                        break; +                    case BOSS_ALIZABAL: +                        AlizabalGUID = creature->GetGUID(); +                        break; +                } +            } + +            void OnGameObjectCreate(GameObject* go) override +            { +                switch(go->GetEntry()) +                { +                    case GO_ARGALOTH_DOOR: +                    case GO_OCCUTHAR_DOOR: +                    case GO_ALIZABAL_DOOR: +                        AddDoor(go, true); +                        break; +                } +            } + +            uint64 GetData64(uint32 data) const override +            { +                switch (data) +                { +                    case DATA_ARGALOTH: +                        return ArgalothGUID; +                    case DATA_OCCUTHAR: +                        return OccutharGUID; +                    case DATA_ALIZABAL: +                        return AlizabalGUID; +                    default: +                        break; +                } + +                return 0; +            } + +            void OnGameObjectRemove(GameObject* go) override +            { +                switch(go->GetEntry()) +                { +                    case GO_ARGALOTH_DOOR: +                    case GO_OCCUTHAR_DOOR: +                    case GO_ALIZABAL_DOOR: +                        AddDoor(go, false); +                        break; +                } +            } + +        protected: +            uint64 ArgalothGUID; +            uint64 OccutharGUID; +            uint64 AlizabalGUID; +        }; + +        InstanceScript* GetInstanceScript(InstanceMap* map) const +        { +            return new instance_baradin_hold_InstanceMapScript(map); +        } +}; + +void AddSC_instance_baradin_hold() +{ +    new instance_baradin_hold(); +} diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp index d5a08d157d0..2793a6a0510 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp @@ -186,7 +186,6 @@ public:                      _Reset();                  me->SetVisible(true); -                me->SetPhaseMask(1, true);                  me->SetUInt32Value(UNIT_NPC_FLAGS, 1);                  me->setFaction(35);                  me->SetStandState(UNIT_STAND_STATE_SIT_HIGH_CHAIR); @@ -270,7 +269,7 @@ public:                          case EVENT_SUCCESS_1:                              if (Unit* player = me->SelectNearestPlayer(60.0f))                              { -                                me->SetInFront(player); +                                me->SetFacingToObject(player);                                  Talk(SAY_SUCCESS);                                  if (GameObject* portcullis1 = me->FindNearestGameObject(GO_PORTCULLIS_ACTIVE, 65.0f))                                      portcullis1->SetGoState(GO_STATE_ACTIVE); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp index 1282cdcd313..49e6faa340b 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp @@ -151,8 +151,8 @@ public:                              break;                          case EVENT_SPEECH_4:                              me->setFaction(103); -                            if (PlayerGUID && ObjectAccessor::GetUnit(*me, PlayerGUID)) -                                AttackStart(ObjectAccessor::GetUnit(*me, PlayerGUID));; +                            if (Player* player = ObjectAccessor::GetPlayer(*me, PlayerGUID)) +                                AttackStart(player);                              break;                      }                  } 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 ae52e281c9d..8cb3c37a7a2 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp @@ -156,7 +156,7 @@ public:              {                  case 177807: // Egg                      if (GetBossState(BOSS_FIREMAW) == DONE) -                        go->SetPhaseMask(2, true); +                        go->SetLootState(GO_JUST_DEACTIVATED);                      else                          EggList.push_back(go->GetGUID());                      break; @@ -202,7 +202,7 @@ public:                      {                          for (std::list<uint64>::const_iterator itr = EggList.begin(); itr != EggList.end(); ++itr)                              if (GameObject* egg = instance->GetGameObject((*itr))) -                                egg->SetPhaseMask(2, true); +                                egg->SetLootState(GO_JUST_DEACTIVATED);                      }                      SetData(DATA_EGG_EVENT, NOT_STARTED);                      break; diff --git a/src/server/scripts/EasternKingdoms/CMakeLists.txt b/src/server/scripts/EasternKingdoms/CMakeLists.txt index d9ab6fa18ce..7f3ca8c6b3f 100644 --- a/src/server/scripts/EasternKingdoms/CMakeLists.txt +++ b/src/server/scripts/EasternKingdoms/CMakeLists.txt @@ -16,6 +16,10 @@ set(scripts_STAT_SRCS    EasternKingdoms/AlteracValley/boss_drekthar.cpp    EasternKingdoms/AlteracValley/boss_vanndar.cpp    EasternKingdoms/AlteracValley/alterac_valley.cpp +  EasternKingdoms/BaradinHold/boss_alizabal.cpp +  EasternKingdoms/BaradinHold/boss_occuthar.cpp +  EasternKingdoms/BaradinHold/boss_pit_lord_argaloth.cpp +  EasternKingdoms/BaradinHold/instance_baradin_hold.cpp    EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_high_interrogator_gerstahn.cpp    EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_gorosh_the_dervish.cpp    EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp @@ -84,21 +88,17 @@ set(scripts_STAT_SRCS    EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp    EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp    EasternKingdoms/zone_isle_of_queldanas.cpp -  EasternKingdoms/ZulGurub/boss_hakkar.cpp -  EasternKingdoms/ZulGurub/boss_mandokir.cpp -  EasternKingdoms/ZulGurub/boss_marli.cpp -  EasternKingdoms/ZulGurub/boss_hazzarah.cpp -  EasternKingdoms/ZulGurub/boss_jeklik.cpp    EasternKingdoms/ZulGurub/boss_grilek.cpp -  EasternKingdoms/ZulGurub/zulgurub.h +  EasternKingdoms/ZulGurub/boss_hazzarah.cpp +  EasternKingdoms/ZulGurub/boss_jindo_the_godbreaker.cpp +  EasternKingdoms/ZulGurub/boss_kilnara.cpp +  EasternKingdoms/ZulGurub/boss_mandokir.cpp    EasternKingdoms/ZulGurub/boss_renataki.cpp -  EasternKingdoms/ZulGurub/boss_arlokk.cpp -  EasternKingdoms/ZulGurub/boss_gahzranka.cpp    EasternKingdoms/ZulGurub/boss_venoxis.cpp -  EasternKingdoms/ZulGurub/instance_zulgurub.cpp -  EasternKingdoms/ZulGurub/boss_jindo.cpp    EasternKingdoms/ZulGurub/boss_wushoolay.cpp -  EasternKingdoms/ZulGurub/boss_thekal.cpp +  EasternKingdoms/ZulGurub/boss_zanzil.cpp +  EasternKingdoms/ZulGurub/instance_zulgurub.cpp +  EasternKingdoms/ZulGurub/zulgurub.h    EasternKingdoms/zone_wetlands.cpp    EasternKingdoms/zone_arathi_highlands.cpp    EasternKingdoms/Gnomeregan/instance_gnomeregan.cpp @@ -178,7 +178,7 @@ set(scripts_STAT_SRCS    EasternKingdoms/zone_stormwind_city.cpp    EasternKingdoms/ZulAman/boss_halazzi.cpp    EasternKingdoms/ZulAman/boss_hexlord.cpp -  EasternKingdoms/ZulAman/boss_zuljin.cpp +  EasternKingdoms/ZulAman/boss_daakara.cpp    EasternKingdoms/ZulAman/boss_akilzon.cpp    EasternKingdoms/ZulAman/instance_zulaman.cpp    EasternKingdoms/ZulAman/boss_janalai.cpp diff --git a/src/server/scripts/EasternKingdoms/Deadmines/deadmines.cpp b/src/server/scripts/EasternKingdoms/Deadmines/deadmines.cpp index 15d3f6225e1..59610b20015 100644 --- a/src/server/scripts/EasternKingdoms/Deadmines/deadmines.cpp +++ b/src/server/scripts/EasternKingdoms/Deadmines/deadmines.cpp @@ -1,6 +1,5 @@  /*   * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>   *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License as published by the @@ -16,13 +15,6 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -/* ScriptData -SDName: Deadmines -SD%Complete: 0 -SDComment: Placeholder -SDCategory: Deadmines -EndScriptData */ -  #include "ScriptMgr.h"  #include "ScriptedCreature.h"  #include "deadmines.h" @@ -30,37 +22,6 @@ EndScriptData */  #include "Player.h"  #include "WorldSession.h" -/*##### -# item_Defias_Gunpowder -#####*/ - -class item_defias_gunpowder : public ItemScript -{ -public: -    item_defias_gunpowder() : ItemScript("item_defias_gunpowder") { } - -    bool OnUse(Player* player, Item* item, SpellCastTargets const& targets) override -    { -        InstanceScript* instance = player->GetInstanceScript(); - -        if (!instance) -        { -            player->GetSession()->SendNotification("Instance script not initialized"); -            return true; -        } - -        if (instance->GetData(EVENT_STATE) != CANNON_NOT_USED) -            return false; - -        if (targets.GetGOTarget() && targets.GetGOTarget()->GetEntry() == GO_DEFIAS_CANNON) -            instance->SetData(EVENT_STATE, CANNON_GUNPOWDER_USED); - -        player->DestroyItemCount(item->GetEntry(), 1, true); -        return true; -    } -}; -  void AddSC_deadmines()  { -    new item_defias_gunpowder();  } diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp index ed40c18f70e..d27caea573e 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp @@ -64,7 +64,6 @@ enum Creatures      NPC_KILREK                  = 17229  }; -  class npc_kilrek : public CreatureScript  {  public: diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp index 58ebef77425..6c48ee7f348 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp @@ -1171,6 +1171,8 @@ class npc_scarlet_miner : public CreatureScript                          if (Unit* car = ObjectAccessor::GetCreature(*me, carGUID))                          {                              me->SetFacingToObject(car); +                            car->Relocate(car->GetPositionX(), car->GetPositionY(), me->GetPositionZ() + 1); +                            car->StopMoving();                              car->RemoveAura(SPELL_CART_DRAG);                          }                          Talk(SAY_SCARLET_MINER_1); 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 8f61aadb99b..efba7040b76 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp @@ -109,7 +109,7 @@ public:                          FlyBackTimer = 4500;                          break;                      case 2: -                        if (!player->isResurrectRequested()) +                        if (!player->IsResurrectRequested())                          {                              me->HandleEmoteCommand(EMOTE_ONESHOT_CUSTOM_SPELL_01);                              DoCast(player, SPELL_REVIVE, true); diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp index b15fdd85a00..f67e8d2712e 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp @@ -1,6 +1,5 @@  /*   * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>   *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License as published by the @@ -16,67 +15,19 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -/* ScriptData -SDName: boss_Akilzon -SD%Complete: 75% -SDComment: Missing timer for Call Lightning and Sound ID's -SQLUpdate: -#Temporary fix for Soaring Eagles - -EndScriptData */ -  #include "ScriptMgr.h"  #include "ScriptedCreature.h" -#include "GridNotifiers.h" -#include "GridNotifiersImpl.h" -#include "Cell.h" -#include "CellImpl.h"  #include "zulaman.h" -#include "Weather.h" - -enum Spells -{ -    SPELL_STATIC_DISRUPTION     = 43622, -    SPELL_STATIC_VISUAL         = 45265, -    SPELL_CALL_LIGHTNING        = 43661, // Missing timer -    SPELL_GUST_OF_WIND          = 43621, -    SPELL_ELECTRICAL_STORM      = 43648, -    SPELL_BERSERK               = 45078, -    SPELL_ELECTRICAL_OVERLOAD   = 43658, -    SPELL_EAGLE_SWOOP           = 44732, -    SPELL_ZAP                   = 43137, -    SPELL_SAND_STORM            = 25160 -};  enum Says  { -    SAY_AGGRO                   = 0, -    SAY_SUMMON                  = 1, -    SAY_INTRO                   = 2, // Not used in script -    SAY_ENRAGE                  = 3, -    SAY_KILL                    = 4, -    SAY_DEATH                   = 5 -}; - -enum Misc -{ -    NPC_SOARING_EAGLE           = 24858, -    SE_LOC_X_MAX                = 400, -    SE_LOC_X_MIN                = 335, -    SE_LOC_Y_MAX                = 1435, -    SE_LOC_Y_MIN                = 1370 -}; - -enum Events -{ -    EVENT_STATIC_DISRUPTION     = 1, -    EVENT_GUST_OF_WIND          = 2, -    EVENT_CALL_LIGHTNING        = 3, -    EVENT_ELECTRICAL_STORM      = 4, -    EVENT_RAIN                  = 5, -    EVENT_SUMMON_EAGLES         = 6, -    EVENT_STORM_SEQUENCE        = 7, -    EVENT_ENRAGE                = 8 +    SAY_AGGRO               = 0, +    SAY_PLAYER_KILL         = 1, +    EMOTE_ELECTRICAL_STORM  = 2, +    SAY_SUMMON_EAGLE        = 3, +    SAY_SUMMON_BIRDS        = 4, +    SAY_BERSERK             = 5, +    SAY_DEATH               = 6  };  class boss_akilzon : public CreatureScript @@ -86,42 +37,17 @@ class boss_akilzon : public CreatureScript          struct boss_akilzonAI : public BossAI          { -            boss_akilzonAI(Creature* creature) : BossAI(creature, DATA_AKILZONEVENT) -            { -                Initialize(); -            } - -            void Initialize() -            { -                TargetGUID = 0; -                CloudGUID = 0; -                CycloneGUID = 0; -                memset(BirdGUIDs, 0, sizeof(BirdGUIDs)); -                StormCount = 0; -                isRaining = false; -            } +            boss_akilzonAI(Creature* creature) : BossAI(creature, DATA_AKILZON) { }              void Reset() override              {                  _Reset(); - -                Initialize(); - -                SetWeather(WEATHER_STATE_FINE, 0.0f);              }              void EnterCombat(Unit* /*who*/) override              { -                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(); -                instance->SetData(DATA_AKILZONEVENT, IN_PROGRESS); +                _EnterCombat();              }              void JustDied(Unit* /*killer*/) override @@ -133,91 +59,7 @@ class boss_akilzon : public CreatureScript              void KilledUnit(Unit* who) override              {                  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) -                { -                    // deal damage -                    int32 bp0 = 800; -                    for (uint8 i = 2; i < StormCount; ++i) -                        bp0 *= 2; - -                    CellCoord p(Trinity::ComputeCellCoord(me->GetPositionX(), me->GetPositionY())); -                    Cell cell(p); -                    cell.SetNoCreate(); - -                    std::list<Unit*> tempUnitMap; - -                    { -                        Trinity::AnyAoETargetUnitInObjectRangeCheck u_check(me, me, SIZE_OF_GRIDS); -                        Trinity::UnitListSearcher<Trinity::AnyAoETargetUnitInObjectRangeCheck> searcher(me, tempUnitMap, u_check); - -                        TypeContainerVisitor<Trinity::UnitListSearcher<Trinity::AnyAoETargetUnitInObjectRangeCheck>, WorldTypeMapContainer > world_unit_searcher(searcher); -                        TypeContainerVisitor<Trinity::UnitListSearcher<Trinity::AnyAoETargetUnitInObjectRangeCheck>, 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<Unit*>::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, NULL, NULL, true, 0, 0, me->GetGUID()); -                        } -                    } - -                    // visual -                    float x, y, z; -                    z = me->GetPositionZ(); -                    uint8 maxCount = 5 + rand32() % 5; -                    for (uint8 i = 0; i < maxCount; ++i) -                    { -                        x = 343.0f + rand32() % 60; -                        y = 1380.0f + rand32() % 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, NULL, NULL, 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) -                        Cloud->DealDamage(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); +                    Talk(SAY_PLAYER_KILL);              }              void UpdateAI(uint32 diff) override @@ -227,149 +69,21 @@ class boss_akilzon : public CreatureScript                  events.Update(diff); +                if (me->HasUnitState(UNIT_STATE_CASTING)) +                    return; +                /*                  while (uint32 eventId = events.ExecuteEvent())                  {                      switch (eventId)                      { -                        case EVENT_STATIC_DISRUPTION: -                            { -                            Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1); -                            if (!target) -                                target = me->GetVictim(); -                            if (target) -                            { -                                TargetGUID = target->GetGUID(); -                                DoCast(target, SPELL_STATIC_DISRUPTION, false); -                                me->SetInFront(me->GetVictim()); -                            } -                            /*if (float dist = me->IsWithinDist3d(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 5.0f) dist = 5.0f; -                            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 -                            break; -                        case EVENT_ELECTRICAL_STORM: -                            { -                                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; -                            } -                        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)) -                                    { -                                        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;                      }                  } +                */                  DoMeleeAttackIfReady();              } - -            private: -                uint64 BirdGUIDs[8]; -                uint64 TargetGUID; -                uint64 CycloneGUID; -                uint64 CloudGUID; -                uint8  StormCount; -                bool   isRaining;          };          CreatureAI* GetAI(Creature* creature) const override @@ -378,99 +92,7 @@ class boss_akilzon : public CreatureScript          }  }; -class npc_akilzon_eagle : public CreatureScript -{ -    public: -        npc_akilzon_eagle() : CreatureScript("npc_akilzon_eagle") { } - -        struct npc_akilzon_eagleAI : public ScriptedAI -        { -            npc_akilzon_eagleAI(Creature* creature) : ScriptedAI(creature) -            { -                Initialize(); -            } - -            void Initialize() -            { -                EagleSwoop_Timer = urand(5000, 10000); -                arrived = true; -                TargetGUID = 0; -            } - -            uint32 EagleSwoop_Timer; -            bool arrived; -            uint64 TargetGUID; - -            void Reset() override -            { -                Initialize(); -                me->SetDisableGravity(true); -            } - -            void EnterCombat(Unit* /*who*/) override -            { -                DoZoneInCombat(); -            } - -            void MoveInLineOfSight(Unit* /*who*/) override { } - - -            void MovementInform(uint32, uint32) override -            { -                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) override -            { -                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 override -        { -            return new npc_akilzon_eagleAI(creature); -        } -}; -  void AddSC_boss_akilzon()  {      new boss_akilzon(); -    new npc_akilzon_eagle();  } - diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_daakara.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_daakara.cpp new file mode 100644 index 00000000000..dd5fdf989fd --- /dev/null +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_daakara.cpp @@ -0,0 +1,113 @@ +/* + * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "zulaman.h" + +enum Says +{ +    SAY_INTRO                       = 0, +    SAY_AGGRO                       = 1, +    SAY_PLAYER_KILL                 = 2, +    SAY_FIRE_BREATH                 = 3, +    SAY_TRANSFORMS_BEAR             = 4, +    SAY_TRANSFORMS_EAGLE            = 5, +    SAY_TRANSFORMS_LYNX             = 6, +    SAY_TRANSFORMS_DRAGONHAWK       = 7, +    SAY_ABSORBS_BEAR_SPIRIT         = 8, +    SAY_ABSORBS_EAGLE_SPIRIT        = 9, +    SAY_ABSORBS_LYNX_SPIRIT         = 10, +    SAY_ABSORBS_DRAGONHAWK_SPIRIT   = 11, +    SAY_DEATH                       = 12 +}; + +enum Spells +{ +}; + +enum Events +{ +}; + +class boss_daakara : public CreatureScript +{ +    public: + +        boss_daakara() : CreatureScript("boss_daakara") { } + +        struct boss_daakaraAI : public BossAI +        { +            boss_daakaraAI(Creature* creature) : BossAI(creature, DATA_DAAKARA) { } + +            void Reset() override +            { +                _Reset(); +            } + +            void EnterCombat(Unit* /*who*/) override +            { +                Talk(SAY_AGGRO); +                _EnterCombat(); +            } + +            void JustDied(Unit* /*killer*/) override +            { +                Talk(SAY_DEATH); +                _JustDied(); +            } + +            void KilledUnit(Unit* victim) override +            { +                if (victim->GetTypeId() == TYPEID_PLAYER) +                    Talk(SAY_PLAYER_KILL); +            } + +            void UpdateAI(uint32 diff) override +            { +                if (!UpdateVictim()) +                    return; + +                events.Update(diff); + +                if (me->HasUnitState(UNIT_STATE_CASTING)) +                    return; +                /* +                while (uint32 eventId = events.ExecuteEvent()) +                { +                    switch (eventId) +                    { +                        default: +                            break; +                    } +                } +                */ + +                DoMeleeAttackIfReady(); +            } +        }; + +        CreatureAI* GetAI(Creature* creature) const override +        { +            return GetZulAmanAI<boss_daakaraAI>(creature); +        } +}; + +void AddSC_boss_daakara() +{ +    new boss_daakara(); +} diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp index 0cf1f932f10..d10d749be81 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp @@ -1,6 +1,5 @@  /*   * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>   *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License as published by the @@ -19,187 +18,56 @@  #include "ScriptMgr.h"  #include "ScriptedCreature.h"  #include "zulaman.h" -#include "SpellInfo.h" -enum Spells -{ -    SPELL_DUAL_WIELD            = 29651, -    SPELL_SABER_LASH            = 43267, -    SPELL_FRENZY                = 43139, -    SPELL_FLAMESHOCK            = 43303, -    SPELL_EARTHSHOCK            = 43305, -    SPELL_TRANSFORM_SPLIT       = 43142, -    SPELL_TRANSFORM_SPLIT2      = 43573, -    SPELL_TRANSFORM_MERGE       = 43271, -    SPELL_SUMMON_LYNX           = 43143, -    SPELL_SUMMON_TOTEM          = 43302, -    SPELL_BERSERK               = 45078, -    SPELL_LYNX_FRENZY           = 43290, // Used by Spirit Lynx -    SPELL_SHRED_ARMOR           = 43243  // Used by Spirit Lynx -}; - -enum Hal_CreatureIds +enum Says  { -    NPC_SPIRIT_LYNX             = 24143, -    NPC_TOTEM                   = 24224 +    SAY_AGGRO               = 0, +    SAY_PLAYER_KILL         = 1, +    SAY_MELEE               = 2, +    SAY_SPLIT               = 3, +    SAY_COMBINE             = 4, +    SAY_DEATH               = 5  }; -enum PhaseHalazzi +enum Spells  { -    PHASE_NONE                  = 0, -    PHASE_LYNX                  = 1, -    PHASE_SPLIT                 = 2, -    PHASE_HUMAN                 = 3, -    PHASE_MERGE                 = 4, -    PHASE_ENRAGE                = 5  }; -enum Yells +enum Events  { -    SAY_AGGRO                   = 0, -    SAY_SABER                   = 1, -    SAY_SPLIT                   = 2, -    SAY_MERGE                   = 3, -    SAY_KILL                    = 4, -    SAY_DEATH                   = 5, -    SAY_BERSERK                 = 6  };  class boss_halazzi : public CreatureScript  {      public: +          boss_halazzi() : CreatureScript("boss_halazzi") { } -        struct boss_halazziAI : public ScriptedAI +        struct boss_halazziAI : public BossAI          { -            boss_halazziAI(Creature* creature) : ScriptedAI(creature), summons(me) -            { -                Initialize(); -                instance = creature->GetInstanceScript(); -                Phase = PHASE_NONE; -                FrenzyTimer = 0; -                SaberlashTimer = 0; -                ShockTimer = 0; -                TotemTimer = 0; -            } - -            void Initialize() -            { -                LynxGUID = 0; -                TransformCount = 0; -                BerserkTimer = 600000; -                CheckTimer = 1000; -            } - -            InstanceScript* instance; -            SummonList summons; -            PhaseHalazzi Phase; - -            uint32 FrenzyTimer; -            uint32 SaberlashTimer; -            uint32 ShockTimer; -            uint32 TotemTimer; -            uint32 CheckTimer; -            uint32 BerserkTimer; -            uint32 TransformCount; - -            uint64 LynxGUID; +            boss_halazziAI(Creature* creature) : BossAI(creature, DATA_HALAZZI) { }              void Reset() override              { -                instance->SetData(DATA_HALAZZIEVENT, NOT_STARTED); -                summons.DespawnAll(); - -                Initialize(); - -                DoCast(me, SPELL_DUAL_WIELD, true); - -                Phase = PHASE_NONE; -                EnterPhase(PHASE_LYNX); +                _Reset();              }              void EnterCombat(Unit* /*who*/) override              { -                instance->SetData(DATA_HALAZZIEVENT, IN_PROGRESS);                  Talk(SAY_AGGRO); -                EnterPhase(PHASE_LYNX); +                _EnterCombat();              } -            void JustSummoned(Creature* summon) override -            { -                summon->AI()->AttackStart(me->GetVictim()); -                if (summon->GetEntry() == NPC_SPIRIT_LYNX) -                    LynxGUID = summon->GetGUID(); -                summons.Summon(summon); -            } - -            void DamageTaken(Unit* /*done_by*/, uint32 &damage) override -            { -                if (damage >= me->GetHealth() && Phase != PHASE_ENRAGE) -                    damage = 0; -            } - -            void SpellHit(Unit*, const SpellInfo* spell) override -            { -                if (spell->Id == SPELL_TRANSFORM_SPLIT2) -                    EnterPhase(PHASE_HUMAN); -            } - -            void AttackStart(Unit* who) override +            void JustDied(Unit* /*killer*/) override              { -                if (Phase != PHASE_MERGE) -                    ScriptedAI::AttackStart(who); +                Talk(SAY_DEATH); +                _JustDied();              } -            void EnterPhase(PhaseHalazzi NextPhase) +            void KilledUnit(Unit* victim) override              { -                switch (NextPhase) -                { -                case PHASE_LYNX: -                case PHASE_ENRAGE: -                    if (Phase == PHASE_MERGE) -                    { -                        DoCast(me, SPELL_TRANSFORM_MERGE, true); -                        me->Attack(me->GetVictim(), true); -                        me->GetMotionMaster()->MoveChase(me->GetVictim()); -                    } -                    if (Creature* Lynx = ObjectAccessor::GetCreature(*me, LynxGUID)) -                        Lynx->DisappearAndDie(); -                    me->SetMaxHealth(600000); -                    me->SetHealth(600000 - 150000 * TransformCount); -                    FrenzyTimer = 16000; -                    SaberlashTimer = 20000; -                    ShockTimer = 10000; -                    TotemTimer = 12000; -                    break; -                case PHASE_SPLIT: -                    Talk(SAY_SPLIT); -                    DoCast(me, SPELL_TRANSFORM_SPLIT, true); -                    break; -                case PHASE_HUMAN: -                    //DoCast(me, SPELL_SUMMON_LYNX, true); -                    DoSpawnCreature(NPC_SPIRIT_LYNX, 5, 5, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 0); -                    me->SetMaxHealth(400000); -                    me->SetHealth(400000); -                    ShockTimer = 10000; -                    TotemTimer = 12000; -                    break; -                case PHASE_MERGE: -                    if (Unit* pLynx = ObjectAccessor::GetUnit(*me, LynxGUID)) -                    { -                        Talk(SAY_MERGE); -                        pLynx->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); -                        pLynx->GetMotionMaster()->Clear(); -                        pLynx->GetMotionMaster()->MoveFollow(me, 0, 0); -                        me->GetMotionMaster()->Clear(); -                        me->GetMotionMaster()->MoveFollow(pLynx, 0, 0); -                        ++TransformCount; -                    } -                    break; -                default: -                    break; -                } -                Phase = NextPhase; +                if (victim->GetTypeId() == TYPEID_PLAYER) +                    Talk(SAY_PLAYER_KILL);              }              void UpdateAI(uint32 diff) override @@ -207,194 +75,32 @@ class boss_halazzi : public CreatureScript                  if (!UpdateVictim())                      return; -                if (BerserkTimer <= 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; +                events.Update(diff); -                    if (Phase == PHASE_LYNX) -                    { -                        if (CheckTimer <= diff) -                        { -                            if (HealthBelowPct(25 * (3 - TransformCount))) -                                EnterPhase(PHASE_SPLIT); -                            CheckTimer = 1000; -                        } else CheckTimer -= diff; -                    } -                } - -                if (Phase == PHASE_HUMAN || Phase == PHASE_ENRAGE) +                if (me->HasUnitState(UNIT_STATE_CASTING)) +                    return; +                /* +                while (uint32 eventId = events.ExecuteEvent())                  { -                    if (TotemTimer <= diff) +                    switch (eventId)                      { -                        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; +                        default: +                            break;                      }                  } - -                if (Phase == PHASE_MERGE) -                { -                    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; -                } +                */                  DoMeleeAttackIfReady();              } - -            void KilledUnit(Unit* victim) override -            { -                if (victim->GetTypeId() != TYPEID_PLAYER) -                    return; - -                Talk(SAY_KILL); -            } - -            void JustDied(Unit* /*killer*/) override -            { -                instance->SetData(DATA_HALAZZIEVENT, DONE); -                Talk(SAY_DEATH); -            } -        }; - -        CreatureAI* GetAI(Creature* creature) const override -        { -            return GetInstanceAI<boss_halazziAI>(creature); -        } -}; - -// Spirits Lynx AI -class npc_halazzi_lynx : public CreatureScript -{ -    public: -        npc_halazzi_lynx() : CreatureScript("npc_halazzi_lynx") { } - -        struct npc_halazzi_lynxAI : public ScriptedAI -        { -            npc_halazzi_lynxAI(Creature* creature) : ScriptedAI(creature) -            { -                Initialize(); -            } - -            void Initialize() -            { -                FrenzyTimer = urand(30000, 50000);  //frenzy every 30-50 seconds -                shredder_timer = 4000; -            } - -            uint32 FrenzyTimer; -            uint32 shredder_timer; - -            void Reset() override -            { -                Initialize(); -            } - -            void DamageTaken(Unit* /*done_by*/, uint32 &damage) override -            { -                if (damage >= me->GetHealth()) -                    damage = 0; -            } - -            void AttackStart(Unit* who) override -            { -                if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) -                    ScriptedAI::AttackStart(who); -            } - -            void EnterCombat(Unit* /*who*/) override {/*DoZoneInCombat();*/ } - -            void UpdateAI(uint32 diff) override -            { -                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 override          { -            return new npc_halazzi_lynxAI(creature); +            return GetZulAmanAI<boss_halazziAI>(creature);          }  };  void AddSC_boss_halazzi()  {      new boss_halazzi(); -    new npc_halazzi_lynx();  } diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp index 077597e4706..7219d6e5f9e 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp @@ -1,6 +1,5 @@  /*   * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2007 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>   *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License as published by the @@ -16,375 +15,63 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -/* ScriptData -SDName: Boss_Hex_Lord_Malacrass -SD%Complete: -SDComment: -SDCategory: Zul'Aman -EndScriptData */ -  #include "ScriptMgr.h"  #include "ScriptedCreature.h"  #include "SpellScript.h"  #include "SpellAuraEffects.h"  #include "zulaman.h" -#define YELL_AGGRO              "Da shadow gonna fall on you... " -#define SOUND_YELL_AGGRO        12041 -#define YELL_SPIRIT_BOLTS       "Your soul gonna bleed!" -#define SOUND_YELL_SPIRIT_BOLTS 12047 -#define YELL_DRAIN_POWER        "Darkness comin\' for you" -#define SOUND_YELL_DRAIN_POWER  12046 -#define YELL_KILL_ONE           "Dis a nightmare ya don\' wake up from!" -#define SOUND_YELL_KILL_ONE     12043 -#define YELL_KILL_TWO           "Azzaga choogo zinn!" -#define SOUND_YELL_KILL_TWO     12044 -#define YELL_DEATH              "Dis not... da end of me..." -#define SOUND_YELL_DEATH        12051 - - -enum Creatures +enum Says  { -    NPC_TEMP_TRIGGER                = 23920 +    SAY_AGGRO               = 0, +    SAY_PLAYER_KILL         = 1, +    SAY_SPIRIT_BOLTS        = 2, +    SAY_SIPHON_SOUL         = 3, +    SAY_PET_DEATH           = 4, +    SAY_DEATH               = 5  };  enum Spells  { -    SPELL_SPIRIT_BOLTS              = 43383, -    SPELL_DRAIN_POWER               = 44131, -    SPELL_SIPHON_SOUL               = 43501, - -    // Druid -    SPELL_DR_THORNS                 = 43420, -    SPELL_DR_LIFEBLOOM              = 43421, -    SPELL_DR_MOONFIRE               = 43545, - -    // Hunter -    SPELL_HU_EXPLOSIVE_TRAP         = 43444, -    SPELL_HU_FREEZING_TRAP          = 43447, -    SPELL_HU_SNAKE_TRAP             = 43449, - -    // Mage -    SPELL_MG_FIREBALL               = 41383, -    SPELL_MG_FROST_NOVA             = 43426, -    SPELL_MG_ICE_LANCE              = 43427, -    SPELL_MG_FROSTBOLT              = 43428, - -    // Paladin -    SPELL_PA_CONSECRATION           = 43429, -    SPELL_PA_AVENGING_WRATH         = 43430, -    SPELL_PA_HOLY_LIGHT             = 43451, - -    // Priest -    SPELL_PR_HEAL                   = 41372, -    SPELL_PR_MIND_BLAST             = 41374, -    SPELL_PR_SW_DEATH               = 41375, -    SPELL_PR_PSYCHIC_SCREAM         = 43432, -    SPELL_PR_MIND_CONTROL           = 43550, -    SPELL_PR_PAIN_SUPP              = 44416, - -    // Rogue -    SPELL_RO_BLIND                  = 43433, -    SPELL_RO_SLICE_DICE             = 43457, -    SPELL_RO_WOUND_POISON           = 43461, - -    // Shaman -    SPELL_SH_CHAIN_LIGHT            = 43435, -    SPELL_SH_FIRE_NOVA              = 43436, -    SPELL_SH_HEALING_WAVE           = 43548, - -    // Warlock -    SPELL_WL_CURSE_OF_DOOM          = 43439, -    SPELL_WL_RAIN_OF_FIRE           = 43440,      SPELL_WL_UNSTABLE_AFFL          = 43522,      SPELL_WL_UNSTABLE_AFFL_DISPEL   = 43523, - -    // Warrior -    SPELL_WR_MORTAL_STRIKE          = 43441, -    SPELL_WR_WHIRLWIND              = 43442, -    SPELL_WR_SPELL_REFLECT          = 43443, - -    // Thurg -    SPELL_BLOODLUST                 = 43578, -    SPELL_CLEAVE                    = 15496, - -    // Gazakroth -    SPELL_FIREBOLT                  = 43584, - -    // Alyson Antille -    SPELL_FLASH_HEAL                = 43575, -    SPELL_DISPEL_MAGIC              = 43577, - -    // Lord Raadan -    SPELL_FLAME_BREATH              = 43582, -    SPELL_THUNDERCLAP               = 43583, - -    // Darkheart -    SPELL_PSYCHIC_WAIL              = 43590, - -    // Slither -    SPELL_VENOM_SPIT                = 43579, - -    // Fenstalker -    SPELL_VOLATILE_INFECTION        = 43586, - -    // Koragg -    SPELL_COLD_STARE                = 43593, -    SPELL_MIGHTY_BLOW               = 43592 - -}; - -#define ORIENT                  1.5696f -#define POS_Y                   921.2795f -#define POS_Z                   33.8883f - -static float Pos_X[4] = {112.8827f, 107.8827f, 122.8827f, 127.8827f}; - -static uint32 AddEntryList[8]= -{ -    24240, //Alyson Antille -    24241, //Thurg -    24242, //Slither -    24243, //Lord Raadan -    24244, //Gazakroth -    24245, //Fenstalker -    24246, //Darkheart -    24247  //Koragg  }; -enum AbilityTarget +enum Events  { -    ABILITY_TARGET_SELF = 0, -    ABILITY_TARGET_VICTIM = 1, -    ABILITY_TARGET_ENEMY = 2, -    ABILITY_TARGET_HEAL = 3, -    ABILITY_TARGET_BUFF = 4, -    ABILITY_TARGET_SPECIAL = 5 -}; - -struct PlayerAbilityStruct -{ -    uint32 spell; -    AbilityTarget target; -    uint32 cooldown; //FIXME - it's never used -}; - -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}}, -    // 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}}, -    // 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}}, -    // 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}}, -    // 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}}, -    // 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}}, -    // 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}}, -    // 8 mage -    {{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}}, -    // 11 druid -    {{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 -{ -    InstanceScript* instance; - -    boss_hexlord_addAI(Creature* creature) : ScriptedAI(creature) -    { -        instance = creature->GetInstanceScript(); -    } - -    void Reset() override { } - -    void EnterCombat(Unit* /*who*/) override -    { -        DoZoneInCombat(); -    } - -    void UpdateAI(uint32 /*diff*/) override -    { -        if (instance->GetData(DATA_HEXLORDEVENT) != IN_PROGRESS) -        { -            EnterEvadeMode(); -            return; -        } - -        DoMeleeAttackIfReady(); -    }  };  class boss_hexlord_malacrass : public CreatureScript  {      public: -        boss_hexlord_malacrass() -            : CreatureScript("boss_hexlord_malacrass") -        { -        } +        boss_hexlord_malacrass() : CreatureScript("boss_hexlord_malacrass") { } -        struct boss_hex_lord_malacrassAI : public ScriptedAI +        struct boss_hex_lord_malacrassAI : public BossAI          { -            boss_hex_lord_malacrassAI(Creature* creature) : ScriptedAI(creature) -            { -                Initialize(); -                instance = creature->GetInstanceScript(); -                SelectAddEntry(); -                for (uint8 i = 0; i < 4; ++i) -                    AddGUID[i] = 0; -                PlayerGUID = 0; -                PlayerClass = CLASS_NONE; -            } - -            void Initialize() -            { -                SpiritBolts_Timer = 20000; -                DrainPower_Timer = 60000; -                SiphonSoul_Timer = 100000; -                PlayerAbility_Timer = 99999; -                CheckAddState_Timer = 5000; -                ResetTimer = 5000; -            } - -            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; +            boss_hex_lord_malacrassAI(Creature* creature) : BossAI(creature, DATA_HEXLORD) { }              void Reset() override              { -                instance->SetData(DATA_HEXLORDEVENT, NOT_STARTED); - -                Initialize(); - -                SpawnAdds(); - -                me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 46916); -                me->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE); +                _Reset();              }              void EnterCombat(Unit* /*who*/) override              { -                instance->SetData(DATA_HEXLORDEVENT, IN_PROGRESS); - -                DoZoneInCombat(); -                me->Yell(YELL_AGGRO, LANG_UNIVERSAL); -                DoPlaySoundToSet(me, SOUND_YELL_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 -                    { -                        EnterEvadeMode(); -                        break; -                    } -                } -            } - -            void KilledUnit(Unit* /*victim*/) override -            { -                switch (urand(0, 1)) -                { -                    case 0: -                        me->Yell(YELL_KILL_ONE, LANG_UNIVERSAL); -                        DoPlaySoundToSet(me, SOUND_YELL_KILL_ONE); -                        break; -                    case 1: -                        me->Yell(YELL_KILL_TWO, LANG_UNIVERSAL); -                        DoPlaySoundToSet(me, SOUND_YELL_KILL_TWO); -                        break; -                } +                Talk(SAY_AGGRO); +                _EnterCombat();              }              void JustDied(Unit* /*killer*/) override              { -                instance->SetData(DATA_HEXLORDEVENT, DONE); - -                me->Yell(YELL_DEATH, LANG_UNIVERSAL); -                DoPlaySoundToSet(me, SOUND_YELL_DEATH); - -                for (uint8 i = 0; i < 4; ++i) -                { -                    Unit* Temp = ObjectAccessor::GetUnit(*me, AddGUID[i]); -                    if (Temp && Temp->IsAlive()) -                        Temp->DealDamage(Temp, Temp->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); -                } -            } - -            void SelectAddEntry() -            { -                std::vector<uint32> AddList; - -                for (uint8 i = 0; i < 8; ++i) -                    AddList.push_back(AddEntryList[i]); - -                while (AddList.size() > 4) -                    AddList.erase(AddList.begin() + rand32() % AddList.size()); - -                uint8 i = 0; -                for (std::vector<uint32>::const_iterator itr = AddList.begin(); itr != AddList.end(); ++itr, ++i) -                    AddEntry[i] = *itr; +                Talk(SAY_DEATH); +                _JustDied();              } -            void SpawnAdds() +            void KilledUnit(Unit* victim) override              { -                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->StopMoving(); -                    } -                } +                if (victim->GetTypeId() == TYPEID_PLAYER) +                    Talk(SAY_PLAYER_KILL);              }              void UpdateAI(uint32 diff) override @@ -392,635 +79,28 @@ class boss_hexlord_malacrass : public CreatureScript                  if (!UpdateVictim())                      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); -                    me->Yell(YELL_DRAIN_POWER, LANG_UNIVERSAL); -                    DoPlaySoundToSet(me, SOUND_YELL_DRAIN_POWER); -                    DrainPower_Timer = urand(40000, 55000);    // must cast in 60 sec, or buff/debuff will disappear -                } else DrainPower_Timer -= diff; - -                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); -                        me->Yell(YELL_SPIRIT_BOLTS, LANG_UNIVERSAL); -                        DoPlaySoundToSet(me, SOUND_YELL_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); +                events.Update(diff); -                        //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 = NULL; -                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<Creature*> 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<boss_hex_lord_malacrassAI>(creature); -        } -}; - -class boss_thurg : public CreatureScript -{ -    public: - -        boss_thurg() -            : CreatureScript("boss_thurg") -        { -        } - -        struct boss_thurgAI : public boss_hexlord_addAI -        { - -            boss_thurgAI(Creature* creature) : boss_hexlord_addAI(creature) -            { -                Initialize(); -            } - -            void Initialize() -            { -                bloodlust_timer = 15000; -                cleave_timer = 10000; -            } - -            uint32 bloodlust_timer; -            uint32 cleave_timer; - -            void Reset() override -            { -                Initialize(); - -                boss_hexlord_addAI::Reset(); -            } - -            void UpdateAI(uint32 diff) override -            { -                if (!UpdateVictim()) -                    return; - -                if (bloodlust_timer <= diff) -                { -                    std::list<Creature*> 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); -            } -        }; - -        CreatureAI* GetAI(Creature* creature) const override -        { -            return GetInstanceAI<boss_thurgAI>(creature); -        } -}; - -class boss_alyson_antille : public CreatureScript -{ -    public: - -        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) -            { -                Initialize(); -            } - -            void Initialize() -            { -                flashheal_timer = 2500; -                dispelmagic_timer = 10000; -            } - -            uint32 flashheal_timer; -            uint32 dispelmagic_timer; - -            void Reset() override -            { -                Initialize(); - -                //AcquireGUID(); - -                boss_hexlord_addAI::Reset(); -            } - -            void AttackStart(Unit* who) override -            { -                if (!who) +                if (me->HasUnitState(UNIT_STATE_CASTING))                      return; - -                if (who->isTargetableForAttack()) +                /* +                while (uint32 eventId = events.ExecuteEvent())                  { -                    if (me->Attack(who, false)) +                    switch (eventId)                      { -                        me->GetMotionMaster()->MoveChase(who, 20); -                        me->AddThreat(who, 0.0f); +                        default: +                            break;                      }                  } -            } - -            void UpdateAI(uint32 diff) override -            { -                if (!UpdateVictim()) -                    return; - -                if (flashheal_timer <= diff) -                { -                    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); -                        } -                    } -                    else -                    { -                        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; - -                /*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<boss_alyson_antilleAI>(creature); -        } -}; - -struct boss_gazakrothAI : public boss_hexlord_addAI -{ -    boss_gazakrothAI(Creature* creature) : boss_hexlord_addAI(creature) -    { -        Initialize(); -    } - -    void Initialize() -    { -        firebolt_timer = 2000; -    } - -    uint32 firebolt_timer; - -    void Reset() override -    { -        Initialize(); -        boss_hexlord_addAI::Reset(); -    } - -    void AttackStart(Unit* who) override -    { -        if (!who) -            return; - -        if (who->isTargetableForAttack()) -        { -            if (me->Attack(who, false)) -            { -                me->GetMotionMaster()->MoveChase(who, 20); -                me->AddThreat(who, 0.0f); -            } -        } -    } - -    void UpdateAI(uint32 diff) override -    { -        if (!UpdateVictim()) -            return; - -        if (firebolt_timer <= diff) -        { -            DoCastVictim(SPELL_FIREBOLT, false); -            firebolt_timer = 700; -        } else firebolt_timer -= diff; - -        boss_hexlord_addAI::UpdateAI(diff); -    } -}; - -class boss_lord_raadan : public CreatureScript -{ -    public: - -        boss_lord_raadan() -            : CreatureScript("boss_lord_raadan") -        { -        } - -        struct boss_lord_raadanAI : public boss_hexlord_addAI -        { -            boss_lord_raadanAI(Creature* creature) : boss_hexlord_addAI(creature) -            { -                Initialize(); -            } - -            void Initialize() -            { -                flamebreath_timer = 8000; -                thunderclap_timer = 13000; -            } - -            uint32 flamebreath_timer; -            uint32 thunderclap_timer; - -            void Reset() override -            { -                Initialize(); - -                boss_hexlord_addAI::Reset(); - -            } -            void UpdateAI(uint32 diff) override -            { -                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); -            } -        }; - -        CreatureAI* GetAI(Creature* creature) const override -        { -            return GetInstanceAI<boss_lord_raadanAI>(creature); -        } -}; - -class boss_darkheart : public CreatureScript -{ -    public: - -        boss_darkheart() -            : CreatureScript("boss_darkheart") -        { -        } - -        struct boss_darkheartAI : public boss_hexlord_addAI -        { -            boss_darkheartAI(Creature* creature) : boss_hexlord_addAI(creature) -            { -                Initialize(); -            } - -            void Initialize() -            { -                psychicwail_timer = 8000; -            } - -            uint32 psychicwail_timer; - -            void Reset() override -            { -                Initialize(); -                boss_hexlord_addAI::Reset(); -            } -            void UpdateAI(uint32 diff) override -            { -                if (!UpdateVictim()) -                    return; - -                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<boss_darkheartAI>(creature); -        } -}; - - -class boss_slither : public CreatureScript -{ -    public: - -        boss_slither() -            : CreatureScript("boss_slither") -        { -        } - -        struct boss_slitherAI : public boss_hexlord_addAI -        { -            boss_slitherAI(Creature* creature) : boss_hexlord_addAI(creature) -            { -                Initialize(); -            } - -            void Initialize() -            { -                venomspit_timer = 5000; -            } - -            uint32 venomspit_timer; - -            void Reset() override -            { -                Initialize(); -                boss_hexlord_addAI::Reset(); -            } - -            void AttackStart(Unit* who) override -            { -                if (!who) -                    return; - -                if (who->isTargetableForAttack()) -                { -                    if (me->Attack(who, false)) -                    { -                        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<boss_slitherAI>(creature); -        } -}; - -class boss_fenstalker : public CreatureScript -{ -    public: - -        boss_fenstalker() -            : CreatureScript("boss_fenstalker") -        { -        } - -        struct boss_fenstalkerAI : public boss_hexlord_addAI -        { -            boss_fenstalkerAI(Creature* creature) : boss_hexlord_addAI(creature) -            { -                Initialize(); -            } - -            void Initialize() -            { -                volatileinf_timer = 15000; -            } - -            uint32 volatileinf_timer; - -            void Reset() override -            { -                Initialize(); -                boss_hexlord_addAI::Reset(); - -            } -            void UpdateAI(uint32 diff) override -            { -                if (!UpdateVictim()) -                    return; - -                if (volatileinf_timer <= diff) -                { -                    // core bug -                    if (me->GetVictim()) -                        me->EnsureVictim()->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<boss_fenstalkerAI>(creature); -        } -}; - -class boss_koragg : public CreatureScript -{ -    public: - -        boss_koragg() -            : CreatureScript("boss_koragg") -        { -        } - -        struct boss_koraggAI : public boss_hexlord_addAI -        { -            boss_koraggAI(Creature* creature) : boss_hexlord_addAI(creature) -            { -                Initialize(); -            } - -            void Initialize() -            { -                coldstare_timer = 15000; -                mightyblow_timer = 10000; -            } - -            uint32 coldstare_timer; -            uint32 mightyblow_timer; - -            void Reset() override -            { -                Initialize(); -                boss_hexlord_addAI::Reset(); - -            } -            void UpdateAI(uint32 diff) override -            { -                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); +                DoMeleeAttackIfReady();              }          };          CreatureAI* GetAI(Creature* creature) const override          { -            return GetInstanceAI<boss_koraggAI>(creature); +            return GetInstanceAI<boss_hex_lord_malacrassAI>(creature);          }  }; @@ -1061,14 +141,5 @@ class spell_hexlord_unstable_affliction : public SpellScriptLoader  void AddSC_boss_hex_lord_malacrass()  {      new boss_hexlord_malacrass(); -    new boss_thurg(); -    // new boss_gazakroth(); -    new boss_lord_raadan(); -    new boss_darkheart(); -    new boss_slither(); -    new boss_fenstalker(); -    new boss_koragg(); -    new boss_alyson_antille();      new spell_hexlord_unstable_affliction();  } - diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp index 2e434ed6ab5..61955d7ae5a 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp @@ -1,6 +1,5 @@  /*   * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>   *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License as published by the @@ -16,430 +15,83 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -/* ScriptData -SDName: Boss_Janalai -SD%Complete: 100 -SDComment: -SDCategory: Zul'Aman -EndScriptData */ -  #include "ScriptMgr.h"  #include "ScriptedCreature.h"  #include "zulaman.h" -#include "GridNotifiers.h" -#include "CellImpl.h" -enum Yells +enum Says  { -    SAY_AGGRO                   = 0, -    SAY_FIRE_BOMBS              = 1, -    SAY_SUMMON_HATCHER          = 2, -    SAY_ALL_EGGS                = 3, -    SAY_BERSERK                 = 4, -    SAY_SLAY                    = 5, -    SAY_DEATH                   = 6, -    SAY_EVENT_STRANGERS         = 7, -    SAY_EVENT_FRIENDS           = 8 +    SAY_AGGRO               = 0, +    SAY_PLAYER_KILL         = 1, +    SAY_SUMMON_HATCHER      = 2, +    SAY_FIRE_BOMB           = 3, +    SAY_HATCH_ALL_EGGS      = 4, +    EMOTE_FRENZY            = 5, +    SAY_DEATH               = 6  };  enum Spells  { -    // Jan'alai -    SPELL_FLAME_BREATH          = 43140, -    SPELL_FIRE_WALL             = 43113, -    SPELL_ENRAGE                = 44779, -    SPELL_SUMMON_PLAYERS        = 43097, -    SPELL_TELE_TO_CENTER        = 43098, // coord -    SPELL_HATCH_ALL             = 43144, -    SPELL_BERSERK               = 45078, - -    // Fire Bob Spells -    SPELL_FIRE_BOMB_CHANNEL     = 42621, // last forever -    SPELL_FIRE_BOMB_THROW       = 42628, // throw visual -    SPELL_FIRE_BOMB_DUMMY       = 42629, // bomb visual -    SPELL_FIRE_BOMB_DAMAGE      = 42630, - -    // Hatcher Spells -    SPELL_HATCH_EGG             = 42471,   // 43734 -    SPELL_SUMMON_HATCHLING      = 42493, - -    // Hatchling Spells -    SPELL_FLAMEBUFFET           = 43299 -}; - -enum Creatures -{ -    NPC_AMANI_HATCHER           = 23818, -    NPC_HATCHLING               = 23598, // 42493 -    NPC_EGG                     = 23817, -    NPC_FIRE_BOMB               = 23920 -}; - -const int area_dx = 44; -const int area_dy = 51; - -float JanalainPos[1][3] = -{ -    {-33.93f, 1149.27f, 19}  }; -float FireWallCoords[4][4] = +enum Events  { -    {-10.13f, 1149.27f, 19, 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}  }; -float hatcherway[2][5][3] = -{ -    { -        {-87.46f, 1170.09f, 6}, -        {-74.41f, 1154.75f, 6}, -        {-52.74f, 1153.32f, 19}, -        {-33.37f, 1172.46f, 19}, -        {-33.09f, 1203.87f, 19} -    }, -    { -        {-86.57f, 1132.85f, 6}, -        {-73.94f, 1146.00f, 6}, -        {-52.29f, 1146.51f, 19}, -        {-33.57f, 1125.72f, 19}, -        {-34.29f, 1095.22f, 19} -    } -};  class boss_janalai : public CreatureScript  {      public: -        boss_janalai() -            : CreatureScript("boss_janalai") -        { -        } +        boss_janalai() : CreatureScript("boss_janalai") { } -        struct boss_janalaiAI : public ScriptedAI +        struct boss_janalaiAI : public BossAI          { -            boss_janalaiAI(Creature* creature) : ScriptedAI(creature) -            { -                Initialize(); -                instance = creature->GetInstanceScript(); -            } - -            void Initialize() -            { -                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; -            } - -            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]; +            boss_janalaiAI(Creature* creature) : BossAI(creature, DATA_JANALAI) { }              void Reset() override              { -                instance->SetData(DATA_JANALAIEVENT, NOT_STARTED); - -                Initialize(); - -                HatchAllEggs(1); -            } - -            void JustDied(Unit* /*killer*/) override -            { -                Talk(SAY_DEATH); - -                instance->SetData(DATA_JANALAIEVENT, DONE); -            } - -            void KilledUnit(Unit* /*victim*/) override -            { -                Talk(SAY_SLAY); +                _Reset();              }              void EnterCombat(Unit* /*who*/) override              { -                instance->SetData(DATA_JANALAIEVENT, IN_PROGRESS); -                  Talk(SAY_AGGRO); -        //        DoZoneInCombat(); -            } - -            void DamageDealt(Unit* target, uint32 &damage, DamageEffectType /*damagetype*/) override -            { -                if (isFlameBreathing) -                { -                    if (!me->HasInArc(float(M_PI) / 6, target)) -                        damage = 0; -                } -            } - -            void FireWall() -            { -                uint8 WallNum; -                Creature* wall = NULL; -                for (uint8 i = 0; i < 4; ++i) -                { -                    if (i == 0 || i == 2) -                        WallNum = 3; -                    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); -                    } -                } -            } - -            void SpawnBombs() -            { -                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)); - -                    Creature* bomb = DoSpawnCreature(NPC_FIRE_BOMB, dx, dy, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 15000); -                    if (bomb) -                        FireBombGUIDs[i] = bomb->GetGUID(); -                } -                BombCount = 0; +                _EnterCombat();              } -            bool HatchAllEggs(uint32 action) //1: reset, 2: isHatching all -            { -                std::list<Creature*> templist; -                float x, y, z; -                me->GetPosition(x, y, z); - -                { -                    CellCoord pair(Trinity::ComputeCellCoord(x, y)); -                    Cell cell(pair); -                    cell.SetNoCreate(); - -                    Trinity::AllCreaturesOfEntryInRange check(me, NPC_EGG, 100); -                    Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange> searcher(me, templist, check); - -                    TypeContainerVisitor<Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange>, GridTypeMapContainer> cSearcher(searcher); - -                    cell.Visit(pair, cSearcher, *me->GetMap(), *me, me->GetGridActivationRange()); -                } - -                //TC_LOG_ERROR("scripts", "Eggs %d at middle", templist.size()); -                if (templist.empty()) -                    return false; - -                for (std::list<Creature*>::const_iterator i = templist.begin(); i != templist.end(); ++i) -                { -                    if (action == 1) -                       (*i)->SetDisplayId(10056); -                    else if (action == 2 &&(*i)->GetDisplayId() != 11686) -                       (*i)->CastSpell(*i, SPELL_HATCH_EGG, false); -                } -                return true; -            } - -            void Boom() +            void JustDied(Unit* /*killer*/) override              { -                std::list<Creature*> templist; -                float x, y, z; -                me->GetPosition(x, y, z); - -                { -                    CellCoord pair(Trinity::ComputeCellCoord(x, y)); -                    Cell cell(pair); -                    cell.SetNoCreate(); - -                    Trinity::AllCreaturesOfEntryInRange check(me, NPC_FIRE_BOMB, 100); -                    Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange> searcher(me, templist, check); - -                    TypeContainerVisitor<Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange>, GridTypeMapContainer> cSearcher(searcher); - -                    cell.Visit(pair, cSearcher, *me->GetMap(), *me, me->GetGridActivationRange()); -                } -                for (std::list<Creature*>::const_iterator i = templist.begin(); i != templist.end(); ++i) -                { -                   (*i)->CastSpell(*i, SPELL_FIRE_BOMB_DAMAGE, true); -                   (*i)->RemoveAllAuras(); -                } +                Talk(SAY_DEATH); +                _JustDied();              } -            void HandleBombSequence() +            void KilledUnit(Unit* victim) override              { -                if (BombCount < 40) -                { -                    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; -                } -                else -                { -                    Boom(); -                    isBombing = false; -                    BombTimer = urand(20000, 40000); -                    me->RemoveAurasDueToSpell(SPELL_FIRE_BOMB_CHANNEL); -                    if (EnrageTimer <= 10000) -                        EnrageTimer = 0; -                    else -                        EnrageTimer -= 10000; -                } +                if (victim->GetTypeId() == TYPEID_PLAYER) +                    Talk(SAY_PLAYER_KILL);              }              void UpdateAI(uint32 diff) override              { -                if (isFlameBreathing) -                { -                    if (!me->IsNonMeleeSpellCast(false)) -                        isFlameBreathing = false; -                    else -                        return; -                } - -                if (isBombing) -                { -                    if (BombSequenceTimer <= diff) -                        HandleBombSequence(); -                    else -                        BombSequenceTimer -= diff; -                    return; -                } -                  if (!UpdateVictim())                      return; -                //enrage if under 25% hp before 5 min. -                if (!enraged && HealthBelowPct(25)) -                    EnrageTimer = 0; +                events.Update(diff); -                if (EnrageTimer <= diff) -                { -                    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); - -                    me->AttackStop(); -                    me->GetMotionMaster()->Clear(); -                    DoTeleportTo(JanalainPos[0][0], JanalainPos[0][1], JanalainPos[0][2]); -                    me->StopMoving(); -                    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 + rand32() % 10, JanalainPos[0][1] - 5 + rand32() % 10, JanalainPos[0][2], 0); -                    //DoCast(Temp, SPELL_SUMMON_PLAYERS, true) // core bug, spell does not work if too far +                if (me->HasUnitState(UNIT_STATE_CASTING))                      return; -                } else BombTimer -= diff; - -                if (!noeggs) +                /* +                while (uint32 eventId = events.ExecuteEvent())                  { -                    if (HealthBelowPct(35)) +                    switch (eventId)                      { -                        Talk(SAY_ALL_EGGS); - -                        me->AttackStop(); -                        me->GetMotionMaster()->Clear(); -                        DoTeleportTo(JanalainPos[0][0], JanalainPos[0][1], JanalainPos[0][2]); -                        me->StopMoving(); -                        DoCast(me, SPELL_HATCH_ALL, false); -                        HatchAllEggs(2); -                        noeggs = true; +                        default: +                            break;                      } -                    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;                  } - -                EnterEvadeIfOutOfCombatArea(diff); +                */                  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;              }          }; @@ -449,283 +101,7 @@ class boss_janalai : public CreatureScript          }  }; -class npc_janalai_firebomb : public CreatureScript -{ -    public: - -        npc_janalai_firebomb() -            : CreatureScript("npc_janalai_firebomb") -        { -        } - -        struct npc_janalai_firebombAI : public ScriptedAI -        { -            npc_janalai_firebombAI(Creature* creature) : ScriptedAI(creature){ } - -            void Reset() override { } - -            void SpellHit(Unit* /*caster*/, const SpellInfo* spell) override -            { -                if (spell->Id == SPELL_FIRE_BOMB_THROW) -                    DoCast(me, SPELL_FIRE_BOMB_DUMMY, true); -            } - -            void EnterCombat(Unit* /*who*/) override { } - -            void AttackStart(Unit* /*who*/) override { } - -            void MoveInLineOfSight(Unit* /*who*/) override { } - - -            void UpdateAI(uint32 /*diff*/) override { } -        }; - -        CreatureAI* GetAI(Creature* creature) const override -        { -            return new npc_janalai_firebombAI(creature); -        } -}; - -class npc_janalai_hatcher : public CreatureScript -{ -    public: - -        npc_janalai_hatcher() -            : CreatureScript("npc_janalai_hatcher") -        { -        } - -        struct npc_janalai_hatcherAI : public ScriptedAI -        { -            npc_janalai_hatcherAI(Creature* creature) : ScriptedAI(creature) -            { -                Initialize(); -                instance = creature->GetInstanceScript(); -            } - -            void Initialize() -            { -                waypoint = 0; -                isHatching = false; -                hasChangedSide = false; -                WaitTimer = 1; -                HatchNum = 0; -                side = false; -            } - -            InstanceScript* instance; - -            uint32 waypoint; -            uint32 HatchNum; -            uint32 WaitTimer; - -            bool side; -            bool hasChangedSide; -            bool isHatching; - -            void Reset() override -            { -                me->SetWalk(true); -                Initialize(); -                side =(me->GetPositionY() < 1150); -            } - -            bool HatchEggs(uint32 num) -            { -                std::list<Creature*> templist; -                float x, y, z; -                me->GetPosition(x, y, z); - -                { -                    CellCoord pair(Trinity::ComputeCellCoord(x, y)); -                    Cell cell(pair); -                    cell.SetNoCreate(); - -                    Trinity::AllCreaturesOfEntryInRange check(me, 23817, 50); -                    Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange> searcher(me, templist, check); - -                    TypeContainerVisitor<Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange>, 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<Creature*>::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*/) override { } -            void AttackStart(Unit* /*who*/) override { } -            void MoveInLineOfSight(Unit* /*who*/) override { } - -            void MovementInform(uint32, uint32) override -            { -                if (waypoint == 5) -                { -                    isHatching = true; -                    HatchNum = 1; -                    WaitTimer = 5000; -                } -                else -                    WaitTimer = 1; -            } - -            void UpdateAI(uint32 diff) override -            { -                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 override -        { -            return GetInstanceAI<npc_janalai_hatcherAI>(creature); -        } -}; - -class npc_janalai_hatchling : public CreatureScript -{ -    public: - -        npc_janalai_hatchling() -            : CreatureScript("npc_janalai_hatchling") -        { -        } - -        struct npc_janalai_hatchlingAI : public ScriptedAI -        { -            npc_janalai_hatchlingAI(Creature* creature) : ScriptedAI(creature) -            { -                Initialize(); -                instance = creature->GetInstanceScript(); -            } - -            void Initialize() -            { -                BuffetTimer = 7000; -            } - -            InstanceScript* instance; -            uint32 BuffetTimer; - -            void Reset() override -            { -                Initialize(); -                if (me->GetPositionY() > 1150) -                    me->GetMotionMaster()->MovePoint(0, hatcherway[0][3][0] + rand32() % 4 - 2, 1150.0f + rand32() % 4 - 2, hatcherway[0][3][2]); -                else -                    me->GetMotionMaster()->MovePoint(0, hatcherway[1][3][0] + rand32() % 4 - 2, 1150.0f + rand32() % 4 - 2, hatcherway[1][3][2]); - -                me->SetDisableGravity(true); -            } - -            void EnterCombat(Unit* /*who*/) override {/*DoZoneInCombat();*/ } - -            void UpdateAI(uint32 diff) override -            { -                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 override -        { -            return GetInstanceAI<npc_janalai_hatchlingAI>(creature); -        } -}; - -class npc_janalai_egg : public CreatureScript -{ -public: -    npc_janalai_egg(): CreatureScript("npc_janalai_egg") { } - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return new npc_janalai_eggAI(creature); -    } - -    struct npc_janalai_eggAI : public ScriptedAI -    { -        npc_janalai_eggAI(Creature* creature) : ScriptedAI(creature){ } - -        void Reset() override { } - -        void UpdateAI(uint32 /*diff*/) override { } - -        void SpellHit(Unit* /*caster*/, const SpellInfo* spell) override -        { -            if (spell->Id == SPELL_HATCH_EGG) -            { -                DoCast(SPELL_SUMMON_HATCHLING); -            } -        } -    }; - -}; -  void AddSC_boss_janalai()  {      new boss_janalai(); -    new npc_janalai_firebomb(); -    new npc_janalai_hatcher(); -    new npc_janalai_hatchling(); -    new npc_janalai_egg();  } - diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp index 279ca60a484..89ee0cfd8d4 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp @@ -1,6 +1,5 @@   /*   * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>   *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License as published by the @@ -16,444 +15,86 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -/* ScriptData -SDName: Boss_Nalorakk -SD%Complete: 100 -SDComment: -SDCategory: Zul'Aman -EndScriptData */ -  #include "ScriptMgr.h"  #include "ScriptedCreature.h"  #include "zulaman.h" -#include "GridNotifiers.h" -#include "GridNotifiersImpl.h" -#include "CellImpl.h" -enum Spells +enum Says  { -    SPELL_BERSERK           = 45078, - -    // Troll form -    SPELL_BRUTALSWIPE       = 42384, -    SPELL_MANGLE            = 42389, -    SPELL_MANGLEEFFECT      = 44955, -    SPELL_SURGE             = 42402, -    SPELL_BEARFORM          = 42377, - -    // Bear form -    SPELL_LACERATINGSLASH   = 42395, -    SPELL_RENDFLESH         = 42397, -    SPELL_DEAFENINGROAR     = 42398 +    SAY_WAVE_1              = 0, +    SAY_WAVE_2              = 1, +    SAY_WAVE_3              = 2, +    SAY_WAVE_4              = 3, +    SAY_AGGRO               = 4, +    SAY_PLAYER_KILL         = 5, +    SAY_SURGE               = 6, +    EMOTE_SURGE             = 7, +    EMOTE_BEAR              = 8, +    SAY_BEAR                = 9, +    SAY_TROLL               = 10, +    SAY_DEATH               = 11  }; -// Trash Waves -float NalorakkWay[8][3] = +enum Spells  { -    { 18.569f, 1414.512f, 11.42f}, // waypoint 1 -    {-17.264f, 1419.551f, 12.62f}, -    {-52.642f, 1419.357f, 27.31f}, // waypoint 2 -    {-69.908f, 1419.721f, 27.31f}, -    {-79.929f, 1395.958f, 27.31f}, -    {-80.072f, 1374.555f, 40.87f}, // waypoint 3 -    {-80.072f, 1314.398f, 40.87f}, -    {-80.072f, 1295.775f, 48.60f} // waypoint 4  }; -#define YELL_NALORAKK_WAVE1     "Get da move on, guards! It be killin' time!" -#define SOUND_NALORAKK_WAVE1    12066 -#define YELL_NALORAKK_WAVE2     "Guards, go already! Who you more afraid of, dem... or me?" -#define SOUND_NALORAKK_WAVE2    12067 -#define YELL_NALORAKK_WAVE3     "Ride now! Ride out dere and bring me back some heads!" -#define SOUND_NALORAKK_WAVE3    12068 -#define YELL_NALORAKK_WAVE4     "I be losin' me patience! Go on: make dem wish dey was never born!" -#define SOUND_NALORAKK_WAVE4    12069 - -//Unimplemented SoundIDs -/* -#define SOUND_NALORAKK_EVENT1   12078 -#define SOUND_NALORAKK_EVENT2   12079 -*/ - -//General defines -#define YELL_AGGRO              "You be dead soon enough!" -#define SOUND_YELL_AGGRO        12070 -#define YELL_KILL_ONE           "Mua-ha-ha! Now whatchoo got to say?" -#define SOUND_YELL_KILL_ONE     12075 -#define YELL_KILL_TWO           "Da Amani gonna rule again!" -#define SOUND_YELL_KILL_TWO     12076 -#define YELL_DEATH              "I... be waitin' on da udda side...." -#define SOUND_YELL_DEATH        12077 -#define YELL_BERSERK            "You had your chance, now it be too late!" //Never seen this being used, so just guessing from what I hear. -#define SOUND_YELL_BERSERK      12074 -#define YELL_SURGE              "I bring da pain!" -#define SOUND_YELL_SURGE        12071 - -#define YELL_SHIFTEDTOTROLL     "Make way for Nalorakk!" -#define SOUND_YELL_TOTROLL      12073 - - -#define YELL_SHIFTEDTOBEAR      "You call on da beast, you gonna get more dan you bargain for!" -#define SOUND_YELL_TOBEAR       12072 +enum Events +{ +};  class boss_nalorakk : public CreatureScript  {      public: -        boss_nalorakk() -            : CreatureScript("boss_nalorakk") -        { -        } +        boss_nalorakk() : CreatureScript("boss_nalorakk") { } -        struct boss_nalorakkAI : public ScriptedAI +        struct boss_nalorakkAI : public BossAI          { -            boss_nalorakkAI(Creature* creature) : ScriptedAI(creature) -            { -                Initialize(); -                inMove = false; -                MoveEvent = true; -                MovePhase = 0; -                waitTimer = 0; -                LaceratingSlash_Timer = 0; -                RendFlesh_Timer = 0; -                DeafeningRoar_Timer = 0; -                instance = creature->GetInstanceScript(); -            } - -            void Initialize() -            { -                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; -            } - -            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; +            boss_nalorakkAI(Creature* creature) : BossAI(creature, DATA_NALORAKK) { }              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); -                }else -                { -                    (*me).GetMotionMaster()->MovePoint(0, NalorakkWay[7][0], NalorakkWay[7][1], NalorakkWay[7][2]); -                } - -                instance->SetData(DATA_NALORAKKEVENT, NOT_STARTED); - -                Initialize(); -                // me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, 5122);  /// @todo find the correct equipment id -            } - -            void SendAttacker(Unit* target) -            { -                std::list<Creature*> templist; -                float x, y, z; -                me->GetPosition(x, y, z); - -                { -                    CellCoord pair(Trinity::ComputeCellCoord(x, y)); -                    Cell cell(pair); -                    cell.SetNoCreate(); - -                    Trinity::AllFriendlyCreaturesInGrid check(me); -                    Trinity::CreatureListSearcher<Trinity::AllFriendlyCreaturesInGrid> searcher(me, templist, check); - -                    TypeContainerVisitor<Trinity::CreatureListSearcher<Trinity::AllFriendlyCreaturesInGrid>, GridTypeMapContainer> cSearcher(searcher); - -                    cell.Visit(pair, cSearcher, *(me->GetMap()), *me, me->GetGridActivationRange()); -                } - -                if (templist.empty()) -                    return; - -                for (std::list<Creature*>::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)) -                                    { -                                        me->Yell(YELL_NALORAKK_WAVE1, LANG_UNIVERSAL); -                                        DoPlaySoundToSet(me, SOUND_NALORAKK_WAVE1); - -                                        (*me).GetMotionMaster()->MovePoint(1, NalorakkWay[1][0], NalorakkWay[1][1], NalorakkWay[1][2]); -                                        MovePhase ++; -                                        inMove = true; - -                                        SendAttacker(who); -                                    } -                                    break; -                                case 2: -                                    if (me->IsWithinDistInMap(who, 40)) -                                    { -                                        me->Yell(YELL_NALORAKK_WAVE2, LANG_UNIVERSAL); -                                        DoPlaySoundToSet(me, SOUND_NALORAKK_WAVE2); - -                                        (*me).GetMotionMaster()->MovePoint(3, NalorakkWay[3][0], NalorakkWay[3][1], NalorakkWay[3][2]); -                                        MovePhase ++; -                                        inMove = true; - -                                        SendAttacker(who); -                                    } -                                    break; -                                case 5: -                                    if (me->IsWithinDistInMap(who, 40)) -                                    { -                                        me->Yell(YELL_NALORAKK_WAVE3, LANG_UNIVERSAL); -                                        DoPlaySoundToSet(me, SOUND_NALORAKK_WAVE3); - -                                        (*me).GetMotionMaster()->MovePoint(6, NalorakkWay[6][0], NalorakkWay[6][1], NalorakkWay[6][2]); -                                        MovePhase ++; -                                        inMove = true; - -                                        SendAttacker(who); -                                    } -                                    break; -                                case 7: -                                    if (me->IsWithinDistInMap(who, 50)) -                                    { -                                        SendAttacker(who); - -                                        me->Yell(YELL_NALORAKK_WAVE4, LANG_UNIVERSAL); -                                        DoPlaySoundToSet(me, SOUND_NALORAKK_WAVE4); - -                                        me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); -                                        me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - -                                        MoveEvent = false; -                                    } -                                    break; -                            } -                        } -                    } -                } +                _Reset();              }              void EnterCombat(Unit* /*who*/) override              { -                instance->SetData(DATA_NALORAKKEVENT, IN_PROGRESS); - -                me->Yell(YELL_AGGRO, LANG_UNIVERSAL); -                DoPlaySoundToSet(me, SOUND_YELL_AGGRO); -                DoZoneInCombat(); +                Talk(SAY_AGGRO); +                _EnterCombat();              }              void JustDied(Unit* /*killer*/) override              { -                instance->SetData(DATA_NALORAKKEVENT, DONE); - -                me->Yell(YELL_DEATH, LANG_UNIVERSAL); -                DoPlaySoundToSet(me, SOUND_YELL_DEATH); +                Talk(SAY_DEATH); +                _JustDied();              } -            void KilledUnit(Unit* /*victim*/) override +            void KilledUnit(Unit* victim) override              { -                switch (urand(0, 1)) -                { -                    case 0: -                        me->Yell(YELL_KILL_ONE, LANG_UNIVERSAL); -                        DoPlaySoundToSet(me, SOUND_YELL_KILL_ONE); -                        break; -                    case 1: -                        me->Yell(YELL_KILL_TWO, LANG_UNIVERSAL); -                        DoPlaySoundToSet(me, SOUND_YELL_KILL_TWO); -                        break; -                } -            } - -            void MovementInform(uint32 type, uint32 id) override -            { -                if (MoveEvent) -                { -                    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; -                    } - -                } +                if (victim->GetTypeId() == TYPEID_PLAYER) +                    Talk(SAY_PLAYER_KILL);              }              void UpdateAI(uint32 diff) override              { -                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; -                } -                  if (!UpdateVictim())                      return; -                if (Berserk_Timer <= diff) -                { -                    DoCast(me, SPELL_BERSERK, true); -                    me->Yell(YELL_BERSERK, LANG_UNIVERSAL); -                    DoPlaySoundToSet(me, SOUND_YELL_BERSERK); -                    Berserk_Timer = 600000; -                } else Berserk_Timer -= diff; +                events.Update(diff); -                if (ShapeShift_Timer <= diff) +                if (me->HasUnitState(UNIT_STATE_CASTING)) +                    return; +                /* +                while (uint32 eventId = events.ExecuteEvent())                  { -                    if (inBearForm) -                    { -                        // me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, 5122); -                        me->Yell(YELL_SHIFTEDTOTROLL, LANG_UNIVERSAL); -                        DoPlaySoundToSet(me, SOUND_YELL_TOTROLL); -                        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 +                    switch (eventId)                      { -                        // me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, 0); -                        me->Yell(YELL_SHIFTEDTOBEAR, LANG_UNIVERSAL); -                        DoPlaySoundToSet(me, SOUND_YELL_TOBEAR); -                        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; +                        default: +                            break;                      } -                } else 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->EnsureVictim()->HasAura(SPELL_MANGLEEFFECT)) -                        { -                            DoCastVictim(SPELL_MANGLE); -                            Mangle_Timer = 1000; -                        } -                        else Mangle_Timer = urand(10000, 15000); -                    } else Mangle_Timer -= diff; - -                    if (Surge_Timer <= diff) -                    { -                        me->Yell(YELL_SURGE, LANG_UNIVERSAL); -                        DoPlaySoundToSet(me, SOUND_YELL_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();              } @@ -469,4 +110,3 @@ void AddSC_boss_nalorakk()  {      new boss_nalorakk();  } - diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp deleted file mode 100644 index 5b9957cb94d..00000000000 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp +++ /dev/null @@ -1,611 +0,0 @@ -/* - * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -/* ScriptData -SDName: Boss_ZulJin -SD%Complete: 85% -SDComment: -EndScriptData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "zulaman.h" -#include "SpellInfo.h" - -enum Says -{ -    YELL_INTRO                    = 0, -    YELL_AGGRO                    = 1, -    YELL_TRANSFORM_TO_BEAR        = 2, -    YELL_TRANSFORM_TO_EAGLE       = 3, -    YELL_TRANSFORM_TO_LYNX        = 4, -    YELL_TRANSFORM_TO_DRAGONHAWK  = 5, -    YELL_FIRE_BREATH              = 6, -    YELL_BERSERK                  = 7, -    YELL_KILL                     = 8, -    YELL_DEATH                    = 9 -}; - -enum Spells -{ -    // Troll Form -    SPELL_WHIRLWIND               = 17207, -    SPELL_GRIEVOUS_THROW          = 43093, // remove debuff after full healed -    // Bear Form -    SPELL_CREEPING_PARALYSIS      = 43095, // should cast on the whole raid -    SPELL_OVERPOWER               = 43456, // use after melee attack dodged -    // Eagle Form -    SPELL_ENERGY_STORM            = 43983, // enemy area aura, trigger 42577 -    SPELL_ZAP_INFORM              = 42577, -    SPELL_ZAP_DAMAGE              = 43137, // 1250 damage -    SPELL_SUMMON_CYCLONE          = 43112, // summon four feather vortex -    CREATURE_FEATHER_VORTEX       = 24136, -    SPELL_CYCLONE_VISUAL          = 43119, // trigger 43147 visual -    SPELL_CYCLONE_PASSIVE         = 43120, // trigger 43121 (4y aoe) every second -    // Lynx Form -    SPELL_CLAW_RAGE_HASTE         = 42583, -    SPELL_CLAW_RAGE_TRIGGER       = 43149, -    SPELL_CLAW_RAGE_DAMAGE        = 43150, -    SPELL_LYNX_RUSH_HASTE         = 43152, -    SPELL_LYNX_RUSH_DAMAGE        = 43153, -    // Dragonhawk Form -    SPELL_FLAME_WHIRL             = 43213, // trigger two spells -    SPELL_FLAME_BREATH            = 43215, -    SPELL_SUMMON_PILLAR           = 43216, // summon 24187 -    CREATURE_COLUMN_OF_FIRE       = 24187, -    SPELL_PILLAR_TRIGGER          = 43218, // trigger 43217 -    // Cosmetic -    SPELL_SPIRIT_AURA             = 42466, -    SPELL_SIPHON_SOUL             = 43501, -    // Transforms: -    SPELL_SHAPE_OF_THE_BEAR       = 42594, // 15% dmg -    SPELL_SHAPE_OF_THE_EAGLE      = 42606, -    SPELL_SHAPE_OF_THE_LYNX       = 42607, // haste melee 30% -    SPELL_SHAPE_OF_THE_DRAGONHAWK = 42608, - -    SPELL_BERSERK                 = 45078 -}; - -enum Phase -{ -    PHASE_BEAR                    = 0, -    PHASE_EAGLE                   = 1, -    PHASE_LYNX                    = 2, -    PHASE_DRAGONHAWK              = 3, -    PHASE_TROLL                   = 4 -}; - -//coords for going for changing form -#define CENTER_X 120.148811f -#define CENTER_Y 703.713684f -#define CENTER_Z 45.111477f - -struct SpiritInfoStruct -{ -    uint32 entry; -    float x, y, z, orient; -}; - -static SpiritInfoStruct SpiritInfo[4] = -{ -    {23878, 147.87f, 706.51f, 45.11f, 3.04f}, -    {23880, 88.95f, 705.49f, 45.11f, 6.11f}, -    {23877, 137.23f, 725.98f, 45.11f, 3.71f}, -    {23879, 104.29f, 726.43f, 45.11f, 5.43f} -}; - -struct TransformStruct -{ -    uint8  text; -    uint32 spell, unaura; -}; - -static TransformStruct Transform[4] = -{ -    {YELL_TRANSFORM_TO_BEAR, SPELL_SHAPE_OF_THE_BEAR, SPELL_WHIRLWIND}, -    {YELL_TRANSFORM_TO_EAGLE, SPELL_SHAPE_OF_THE_EAGLE, SPELL_SHAPE_OF_THE_BEAR}, -    {YELL_TRANSFORM_TO_LYNX, SPELL_SHAPE_OF_THE_LYNX, SPELL_SHAPE_OF_THE_EAGLE}, -    {YELL_TRANSFORM_TO_DRAGONHAWK, SPELL_SHAPE_OF_THE_DRAGONHAWK, SPELL_SHAPE_OF_THE_LYNX} -}; - -class boss_zuljin : public CreatureScript -{ -    public: - -        boss_zuljin() -            : CreatureScript("boss_zuljin") -        { -        } - -        struct boss_zuljinAI : public ScriptedAI -        { -            boss_zuljinAI(Creature* creature) : ScriptedAI(creature), Summons(me) -            { -                Initialize(); -                instance = creature->GetInstanceScript(); -                memset(SpiritGUID, 0, sizeof(SpiritGUID)); -                health_20 = 0; -            } - -            void Initialize() -            { -                Phase = 0; - -                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; -            } - -            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() override -            { -                instance->SetData(DATA_ZULJINEVENT, NOT_STARTED); - -                health_20 = me->CountPctFromMaxHealth(20); - -                Initialize(); - -                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*/) override -            { -                instance->SetData(DATA_ZULJINEVENT, IN_PROGRESS); - -                DoZoneInCombat(); - -                Talk(YELL_INTRO); -                SpawnAdds(); -                EnterPhase(0); -            } - -            void KilledUnit(Unit* /*victim*/) override -            { -                if (Intro_Timer) -                    return; - -                Talk(YELL_KILL); -            } - -            void JustDied(Unit* /*killer*/) override -            { -                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) override -            { -                if (Phase == 2) -                    AttackStartNoMove(who); -                else -                    ScriptedAI::AttackStart(who); -            } - -            void DoMeleeAttackIfReady() -            { -                if (!me->IsNonMeleeSpellCast(false)) -                { -                    if (me->isAttackReady() && me->IsWithinMeleeRange(me->GetVictim())) -                    { -                        if (Phase == 1 && !Overpower_Timer) -                        { -                            uint32 health = me->EnsureVictim()->GetHealth(); -                            me->AttackerStateUpdate(me->GetVictim()); -                            if (me->GetVictim() && health == me->EnsureVictim()->GetHealth()) -                            { -                                DoCastVictim(SPELL_OVERPOWER, false); -                                Overpower_Timer = 5000; -                            } -                        } else me->AttackerStateUpdate(me->GetVictim()); -                        me->resetAttackTimer(); -                    } -                } -            } - -            void SpawnAdds() -            { -                Creature* creature = NULL; -                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); -                        } -                    } -                    SpiritGUID[i] = 0; -                } -            } - -            void JustSummoned(Creature* summon) override -            { -                Summons.Summon(summon); -            } - -            void SummonedCreatureDespawn(Creature* summon) override -            { -                Summons.Despawn(summon); -            } - -            void EnterPhase(uint32 NextPhase) -            { -                switch (NextPhase) -                { -                case 0: -                    break; -                case 1: -                case 2: -                case 3: -                case 4: -                    DoTeleportTo(CENTER_X, CENTER_Y, CENTER_Z, 100); -                    DoResetThreat(); -                    me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 0); -                    me->RemoveAurasDueToSpell(Transform[Phase].unaura); -                    DoCast(me, Transform[Phase].spell); -                    Talk(Transform[Phase].text); -                    if (Phase > 0) -                    { -                        if (Unit* Temp = ObjectAccessor::GetUnit(*me, SpiritGUID[Phase - 1])) -                            Temp->SetUInt32Value(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_DEAD); -                    } -                    if (Unit* Temp = ObjectAccessor::GetUnit(*me, SpiritGUID[NextPhase - 1])) -                        Temp->CastSpell(me, SPELL_SIPHON_SOUL, false); // should m cast on temp -                    if (NextPhase == 2) -                    { -                        me->GetMotionMaster()->Clear(); -                        DoCast(me, SPELL_ENERGY_STORM, true); // enemy aura -                        for (uint8 i = 0; i < 4; ++i) -                        { -                            Creature* Vortex = DoSpawnCreature(CREATURE_FEATHER_VORTEX, 0, 0, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 0); -                            if (Vortex) -                            { -                                Vortex->CastSpell(Vortex, SPELL_CYCLONE_PASSIVE, true); -                                Vortex->CastSpell(Vortex, SPELL_CYCLONE_VISUAL, true); -                                Vortex->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); -                                Vortex->SetSpeed(MOVE_RUN, 1.0f); -                                Vortex->AI()->AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0)); -                                DoZoneInCombat(Vortex); -                            } -                        } -                    } -                    else -                        AttackStart(me->GetVictim()); -                    if (NextPhase == 3) -                    { -                        me->RemoveAurasDueToSpell(SPELL_ENERGY_STORM); -                        Summons.DespawnEntry(CREATURE_FEATHER_VORTEX); -                        me->GetMotionMaster()->MoveChase(me->GetVictim()); -                    } -                    break; -                default: -                    break; -                } -                Phase = NextPhase; -            } - -            void UpdateAI(uint32 diff) override -            { -                if (!TankGUID) -                { -                    if (!UpdateVictim()) -                        return; - -                    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) -                { -                case 0: -                    if (Intro_Timer) -                    { -                        if (Intro_Timer <= diff) -                        { -                            Talk(YELL_AGGRO); -                            Intro_Timer = 0; -                        } else Intro_Timer -= diff; -                    } - -                    if (Whirlwind_Timer <= diff) -                    { -                        DoCast(me, SPELL_WHIRLWIND); -                        Whirlwind_Timer = urand(15000, 20000); -                    } 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; -                    break; - -                case 1: -                    if (Creeping_Paralysis_Timer <= diff) -                    { -                        DoCast(me, SPELL_CREEPING_PARALYSIS); -                        Creeping_Paralysis_Timer = 20000; -                    } else Creeping_Paralysis_Timer -= diff; - -                    if (Overpower_Timer <= diff) -                    { -                        // implemented in DoMeleeAttackIfReady() -                        Overpower_Timer = 0; -                    } else Overpower_Timer -= diff; -                    break; - -                case 2: -                    return; - -                case 3: -                    if (Claw_Rage_Timer <= diff) -                    { -                        if (!TankGUID) -                        { -                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) -                            { -                                if (me->GetVictim()) -                                    TankGUID = me->EnsureVictim()->GetGUID(); -                                me->SetSpeed(MOVE_RUN, 5.0f); -                                AttackStart(target); // change victim -                                Claw_Rage_Timer = 0; -                                Claw_Loop_Timer = 500; -                                Claw_Counter = 0; -                            } -                        } -                        else if (!Claw_Rage_Timer) // do not do this when Lynx_Rush -                        { -                            if (Claw_Loop_Timer <= diff) -                            { -                                Unit* target = me->GetVictim(); -                                if (!target || !target->isTargetableForAttack()) target = ObjectAccessor::GetUnit(*me, TankGUID); -                                if (!target || !target->isTargetableForAttack()) target = SelectTarget(SELECT_TARGET_RANDOM, 0); -                                if (target) -                                { -                                    AttackStart(target); -                                    if (me->IsWithinMeleeRange(target)) -                                    { -                                        DoCast(target, SPELL_CLAW_RAGE_DAMAGE, true); -                                        ++Claw_Counter; -                                        if (Claw_Counter == 12) -                                        { -                                            Claw_Rage_Timer = urand(15000, 20000); -                                            me->SetSpeed(MOVE_RUN, 1.2f); -                                            AttackStart(ObjectAccessor::GetUnit(*me, TankGUID)); -                                            TankGUID = 0; -                                            return; -                                        } -                                        else -                                            Claw_Loop_Timer = 500; -                                    } -                                } -                                else -                                { -                                    EnterEvadeMode(); // if (target) -                                    return; -                                } -                            } else Claw_Loop_Timer -= diff; -                        } //if (TankGUID) -                    } else Claw_Rage_Timer -= diff; - -                    if (Lynx_Rush_Timer <= diff) -                    { -                        if (!TankGUID) -                        { -                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) -                            { -                                TankGUID = me->EnsureVictim()->GetGUID(); -                                me->SetSpeed(MOVE_RUN, 5.0f); -                                AttackStart(target); // change victim -                                Lynx_Rush_Timer = 0; -                                Claw_Counter = 0; -                            } -                        } -                        else if (!Lynx_Rush_Timer) -                        { -                            Unit* target = me->GetVictim(); -                            if (!target || !target->isTargetableForAttack()) -                            { -                                target = SelectTarget(SELECT_TARGET_RANDOM, 0); -                                AttackStart(target); -                            } -                            if (target) -                            { -                                if (me->IsWithinMeleeRange(target)) -                                { -                                    DoCast(target, SPELL_LYNX_RUSH_DAMAGE, true); -                                    ++Claw_Counter; -                                    if (Claw_Counter == 9) -                                    { -                                        Lynx_Rush_Timer = urand(15000, 20000); -                                        me->SetSpeed(MOVE_RUN, 1.2f); -                                        AttackStart(ObjectAccessor::GetUnit(*me, TankGUID)); -                                        TankGUID = 0; -                                    } -                                    else -                                        AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0)); -                                } -                            } -                            else -                            { -                                EnterEvadeMode(); // if (target) -                                return; -                            } -                        } //if (TankGUID) -                    } else Lynx_Rush_Timer -= diff; - -                    break; -                case 4: -                    if (Flame_Whirl_Timer <= diff) -                    { -                        DoCast(me, SPELL_FLAME_WHIRL); -                        Flame_Whirl_Timer = 12000; -                    }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; - -                    if (Flame_Breath_Timer <= diff) -                    { -                        if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) -                            me->SetInFront(target); -                        DoCast(me, SPELL_FLAME_BREATH); -                        Flame_Breath_Timer = 10000; -                    } else Flame_Breath_Timer -= diff; -                    break; - -                default: -                    break; -                } - -                if (!TankGUID) -                    DoMeleeAttackIfReady(); -            } -        }; - -        CreatureAI* GetAI(Creature* creature) const override -        { -            return GetInstanceAI<boss_zuljinAI>(creature); -        } -}; - -class npc_zuljin_vortex : public CreatureScript -{ -    public: - -        npc_zuljin_vortex() -            : CreatureScript("npc_zuljin_vortex") -        { -        } - -        struct npc_zuljin_vortexAI : public ScriptedAI -        { -            npc_zuljin_vortexAI(Creature* creature) : ScriptedAI(creature) { } - -            void Reset() override { } - -            void EnterCombat(Unit* /*target*/) override { } - -            void SpellHit(Unit* caster, const SpellInfo* spell) override -            { -                if (spell->Id == SPELL_ZAP_INFORM) -                    DoCast(caster, SPELL_ZAP_DAMAGE, true); -            } - -            void UpdateAI(uint32 /*diff*/) override -            { -                //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 override -        { -            return new npc_zuljin_vortexAI(creature); -        } -}; - -void AddSC_boss_zuljin() -{ -    new boss_zuljin(); -    new npc_zuljin_vortex(); -} - diff --git a/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp index 6081887e609..11bf47c4cd1 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp @@ -1,6 +1,5 @@ - /* +/*   * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>   *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License as published by the @@ -16,137 +15,70 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -/* ScriptData -SDName: instance_zulaman -SD%Complete: 80 -SDComment: -SDCategory: Zul'Aman -EndScriptData */ -  #include "ScriptMgr.h"  #include "InstanceScript.h" +#include "ScriptedCreature.h"  #include "zulaman.h" -#include "Player.h" -#include "TemporarySummon.h" - -enum Misc -{ -    MAX_ENCOUNTER                  = 7, -    RAND_VENDOR                    = 2, -    WORLDSTATE_SHOW_TIMER          = 3104, -    WORLDSTATE_TIME_TO_SACRIFICE   = 3106 -}; - -// Chests spawn at bear/eagle/dragonhawk/lynx bosses -// The loots depend on how many bosses have been killed, but not the entries of the chests -// But we cannot add loots to gameobject, so we have to use the fixed loot_template -struct SHostageInfo -{ -    uint32 npc, go; // FIXME go Not used -    float x, y, z, o; -}; - -static SHostageInfo HostageInfo[] = -{ -    {23790, 186648, -57, 1343, 40.77f, 3.2f}, // bear -    {23999, 187021, 400, 1414, 74.36f, 3.3f}, // eagle -    {24001, 186672, -35, 1134, 18.71f, 1.9f}, // dragonhawk -    {24024, 186667, 413, 1117,  6.32f, 3.1f}  // lynx -}; - -Position const HarrisonJonesLoc = {120.687f, 1674.0f, 42.0217f, 1.59044f};  class instance_zulaman : public InstanceMapScript  {      public: -        instance_zulaman() -            : InstanceMapScript("instance_zulaman", 568) -        { -        } +        instance_zulaman() : InstanceMapScript(ZulAmanScriptName, 568) { } -        struct instance_zulaman_InstanceMapScript : public InstanceScript +        struct instance_zulaman_InstanceScript : 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() override +            instance_zulaman_InstanceScript(InstanceMap* map) : InstanceScript(map)              {                  SetHeaders(DataHeader); -                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; +                SetBossNumber(EncounterCount); + +                AkilzonGUID             = 0; +                NalorakkGUID            = 0; +                JanalaiGUID             = 0; +                HalazziGUID             = 0; +                HexLordMalacrassGUID    = 0; +                DaakaraGUID             = 0; +                VoljinGUID              = 0; +                HexLordTriggerGUID      = 0; +                SpeedRunTimer           = 16; +                ZulAmanState            = NOT_STARTED; +                ZulAmanBossCount        = 0;              } -            bool IsEncounterInProgress() const override +            void FillInitialWorldStates(WorldPacket& packet) override              { -                for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) -                    if (m_auiEncounter[i] == IN_PROGRESS) -                        return true; - -                return false; -            } - -            void OnPlayerEnter(Player* /*player*/) -            { -                if (!HarrisonJonesGUID) -                    instance->SummonCreature(NPC_HARRISON_JONES, HarrisonJonesLoc); +                packet << uint32(WORLD_STATE_ZULAMAN_TIMER_ENABLED) << uint32(ZulAmanState ? 1 : 0); +                packet << uint32(WORLD_STATE_ZULAMAN_TIMER) << uint32(SpeedRunTimer);              }              void OnCreatureCreate(Creature* creature) override              {                  switch (creature->GetEntry())                  { -                    case NPC_HARRISON_JONES: -                        HarrisonJonesGUID = creature->GetGUID(); +                    case NPC_AKILZON: +                        AkilzonGUID = creature->GetGUID(); +                        break; +                    case NPC_NALORAKK: +                        NalorakkGUID = creature->GetGUID();                          break;                      case NPC_JANALAI: -                    case NPC_ZULJIN: -                    case NPC_HEXLORD: +                        JanalaiGUID = creature->GetGUID(); +                        break;                      case NPC_HALAZZI: -                    case NPC_NALORAKK: +                        HalazziGUID = creature->GetGUID(); +                        break; +                    case NPC_HEXLORD: +                        HexLordMalacrassGUID = creature->GetGUID(); +                        break; +                    case NPC_DAAKARA: +                        DaakaraGUID = creature->GetGUID(); +                        break; +                    case NPC_VOLJIN: +                        VoljinGUID = creature->GetGUID(); +                        break; +                    case NPC_HEXLORD_TRIGGER: +                        HexLordTriggerGUID = creature->GetGUID(); +                        break;                      default:                          break;                  } @@ -156,219 +88,226 @@ class instance_zulaman : public InstanceMapScript              {                  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; +                    case GO_STRANGE_GONG: +                        StrangeGongGUID = go->GetGUID(); +                        break; +                    case GO_MASSIVE_GATE: +                        MasiveGateGUID = go->GetGUID(); +                        AddDoor(go, true); +                        if (ZulAmanState != NOT_STARTED) +                            go->SetGoState(GO_STATE_ACTIVE); +                        break; +                    default: +                        break;                  } -                CheckInstanceStatus();              } -            void SummonHostage(uint8 num) +            void OnGameObjectRemove(GameObject* go) override              { -                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()) +                switch (go->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)) -                    { -                        Hostage->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); -                        Hostage->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); -                    } +                    case GO_MASSIVE_GATE: +                        AddDoor(go, false); +                        break; +                    default: +                        break;                  }              } -            void CheckInstanceStatus() +            uint64 GetData64(uint32 type) const override              { -                if (BossKilled >= DATA_HALAZZIEVENT) -                    HandleGameObject(HexLordGateGUID, true); +                switch (type) +                { +                    case DATA_AKILZON: +                        return AkilzonGUID; +                    case DATA_NALORAKK: +                        return NalorakkGUID; +                    case DATA_JANALAI: +                        return JanalaiGUID; +                    case DATA_HALAZZI: +                        return HalazziGUID; +                    case DATA_HEXLORD: +                        return HexLordMalacrassGUID; +                    case DATA_DAAKARA: +                        return DaakaraGUID; +                    case DATA_HEXLORD_TRIGGER: +                        return HexLordTriggerGUID; +                    case DATA_STRANGE_GONG: +                        return StrangeGongGUID; +                    case DATA_MASSIVE_GATE: +                        return MasiveGateGUID; +                    default: +                        break; +                } -                if (BossKilled >= DATA_HEXLORDEVENT) -                    HandleGameObject(ZulJinGateGUID, true); +                return 0;              } -            std::string GetSaveData() override +            void SetData(uint32 type, uint32 data) override              { -                OUT_SAVE_INST_DATA; - -                std::ostringstream ss; -                ss << "S " << BossKilled << ' ' << ChestLooted << ' ' << QuestMinute; - -                OUT_SAVE_INST_DATA_COMPLETE; -                return ss.str(); +                switch (type) +                { +                    case DATA_ZULAMAN_STATE: +                    { +                        if (data == IN_PROGRESS) +                        { +                            DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER_ENABLED, 1); +                            DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER, 15); +                            events.ScheduleEvent(EVENT_UPDATE_ZULAMAN_TIMER, 60000); +                            SpeedRunTimer = 15; +                            ZulAmanState = data; +                            SaveToDB(); +                        } +                        break; +                    } +                    default: +                        break; +                }              } -            void Load(const char* load) +            uint32 GetData(uint32 type) const override              { -                if (!load) -                    return; - -                std::istringstream ss(load); -                //TC_LOG_ERROR("scripts", "Zul'aman loaded, %s.", ss.str().c_str()); -                char dataHead; // S -                uint16 data1, data2, data3; -                ss >> dataHead >> data1 >> data2 >> data3; -                //TC_LOG_ERROR("scripts", "Zul'aman loaded, %d %d %d.", data1, data2, data3); -                if (dataHead == 'S') +                switch (type)                  { -                    BossKilled = data1; -                    ChestLooted = data2; -                    QuestMinute = data3; -                } else TC_LOG_ERROR("scripts", "Zul'aman: corrupted save data."); +                    case DATA_ZULAMAN_STATE: +                        return ZulAmanState; +                    default: +                        break; +                } + +                return 0;              } -            void SetData(uint32 type, uint32 data) override +            bool SetBossState(uint32 type, EncounterState state) override              { -                switch (type) +                if (!InstanceScript::SetBossState(type, state)) +                    return false; + +                if (state == DONE)                  { -                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 (ZulAmanState == IN_PROGRESS && SpeedRunTimer)                      { -                        if (QuestMinute) +                        ++ZulAmanBossCount; + +                        if (ZulAmanBossCount < 2)                          { -                            QuestMinute += 15; -                            DoUpdateWorldState(WORLDSTATE_TIME_TO_SACRIFICE, QuestMinute); +                            SpeedRunTimer = SpeedRunTimer + 5; +                            DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER, SpeedRunTimer);                          } -                        SummonHostage(0); -                    } -                    break; -                case DATA_AKILZONEVENT: -                    m_auiEncounter[DATA_AKILZONEVENT] = data; -                    HandleGameObject(AkilzonDoorGUID, data != IN_PROGRESS); -                    if (data == DONE) -                    { -                        if (QuestMinute) +                        else if (ZulAmanBossCount == 4)                          { -                            QuestMinute += 10; -                            DoUpdateWorldState(WORLDSTATE_TIME_TO_SACRIFICE, QuestMinute); +                            DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER_ENABLED, 0); +                            events.CancelEvent(EVENT_UPDATE_ZULAMAN_TIMER); +                            ZulAmanState = DONE;                          } -                        SummonHostage(1);                      } -                    break; -                case DATA_JANALAIEVENT: -                    m_auiEncounter[DATA_JANALAIEVENT] = data; -                    if (data == DONE) -                        SummonHostage(2); -                    break; -                case DATA_HALAZZIEVENT: -                    m_auiEncounter[DATA_HALAZZIEVENT] = data; -                    HandleGameObject(HalazziDoorGUID, data != IN_PROGRESS); -                    if (data == DONE) SummonHostage(3); -                    break; -                case DATA_HEXLORDEVENT: -                    m_auiEncounter[DATA_HEXLORDEVENT] = data; -                    if (data == IN_PROGRESS) -                        HandleGameObject(HexLordGateGUID, false); -                    else if (data == NOT_STARTED) -                        CheckInstanceStatus(); -                    break; -                case DATA_ZULJINEVENT: -                    m_auiEncounter[DATA_ZULJINEVENT] = data; -                    HandleGameObject(ZulJinDoorGUID, data != IN_PROGRESS); -                    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) +                switch (type)                  { -                    ++BossKilled; -                    if (QuestMinute && BossKilled >= DATA_HALAZZIEVENT) -                    { -                        QuestMinute = 0; -                        DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 0); -                    } -                    CheckInstanceStatus(); -                    SaveToDB(); +                    case DATA_AKILZON: +                        break; +                    case DATA_NALORAKK: +                        break; +                    case DATA_JANALAI: +                        break; +                    case DATA_HALAZZI: +                    case DATA_HEXLORD: +                    case DATA_DAAKARA: +                        break; +                    default: +                        break;                  } + +                return true;              } -            uint32 GetData(uint32 type) const override +            void ProcessEvent(WorldObject* /*obj*/, uint32 eventId) override              { -                switch (type) +                switch (eventId)                  { -                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; +                    case EVENT_START_ZULAMAN: +                        if (Creature* voljin = instance->GetCreature(VoljinGUID)) +                        { +                            if (voljin->IsAIEnabled) +                                voljin->AI()->DoAction(ACTION_START_ZULAMAN); +                        } +                        break; +                    default: +                        break;                  }              } -            void Update(uint32 diff) override +            void Update(uint32 diff)              { -                if (QuestMinute) +                if (events.Empty()) +                    return; + +                events.Update(diff); + +                while (uint32 eventId = events.ExecuteEvent())                  { -                    if (QuestTimer <= diff) +                    switch (eventId)                      { -                        QuestMinute--; -                        SaveToDB(); -                        QuestTimer += 60000; -                        if (QuestMinute) -                        { -                            DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 1); -                            DoUpdateWorldState(WORLDSTATE_TIME_TO_SACRIFICE, QuestMinute); -                        } else DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 0); +                        case EVENT_UPDATE_ZULAMAN_TIMER: +                            SaveToDB(); +                            DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER, --SpeedRunTimer); +                            if (SpeedRunTimer) +                                events.ScheduleEvent(EVENT_UPDATE_ZULAMAN_TIMER, 60000); +                            else +                            { +                                DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER_ENABLED, 0); +                                events.CancelEvent(EVENT_UPDATE_ZULAMAN_TIMER); +                                ZulAmanState = FAIL; +                            } +                            break; +                        default: +                            break;                      } -                    QuestTimer -= diff;                  }              } -            uint64 GetData64(uint32 type) const override +            void WriteSaveDataMore(std::ostringstream& data) override              { -                switch (type) +                data << ZulAmanState  << ' ' +                     << SpeedRunTimer << ' ' +                     << ZulAmanBossCount; +            } + +            void ReadSaveDataMore(std::istringstream& data) override +            { +                data >> ZulAmanState; +                data >> SpeedRunTimer; +                data >> ZulAmanBossCount; + +                if (ZulAmanState == IN_PROGRESS && SpeedRunTimer && SpeedRunTimer <= 15)                  { -                    case GO_STRANGE_GONG: -                        return StrangeGongGUID; -                    case GO_MASSIVE_GATE: -                        return MassiveGateGUID; +                    events.ScheduleEvent(EVENT_UPDATE_ZULAMAN_TIMER, 60000); +                    DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER_ENABLED, 1); +                    DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER, SpeedRunTimer);                  } - -                return 0;              } +        protected: +            EventMap events; +            uint64 AkilzonGUID; +            uint64 NalorakkGUID; +            uint64 JanalaiGUID; +            uint64 HalazziGUID; +            uint64 HexLordMalacrassGUID; +            uint64 DaakaraGUID; +            uint64 VoljinGUID; +            uint64 HexLordTriggerGUID; +            uint64 StrangeGongGUID; +            uint64 MasiveGateGUID; +            uint32 SpeedRunTimer; +            uint32 ZulAmanState; +            uint32 ZulAmanBossCount;          };          InstanceScript* GetInstanceScript(InstanceMap* map) const override          { -            return new instance_zulaman_InstanceMapScript(map); +            return new instance_zulaman_InstanceScript(map);          }  }; @@ -376,4 +315,3 @@ void AddSC_instance_zulaman()  {      new instance_zulaman();  } - diff --git a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp index 6784ff086c7..d4b4cb3ea6b 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp @@ -1,6 +1,5 @@  /*   * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>   *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License as published by the @@ -16,421 +15,209 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -/* ScriptData -SDName: Zulaman -SD%Complete: 90 -SDComment: Forest Frog will turn into different NPC's. Workaround to prevent new entry from running this script -SDCategory: Zul'Aman -EndScriptData */ - -/* ContentData -npc_forest_frog -EndContentData */ -  #include "ScriptMgr.h"  #include "ScriptedCreature.h"  #include "ScriptedGossip.h" -#include "zulaman.h"  #include "Player.h" -#include "SpellInfo.h" +#include "CreatureTextMgr.h"  #include "SpellScript.h" - -/*###### -## npc_forest_frog -######*/ - -enum ForestFrog -{ -    // Spells -    SPELL_REMOVE_AMANI_CURSE   = 43732, -    SPELL_PUSH_MOJO            = 43923, - -    // Creatures -    NPC_FOREST_FROG             = 24396 - -}; - -class npc_forest_frog : public CreatureScript -{ -    public: - -        npc_forest_frog() -            : CreatureScript("npc_forest_frog") -        { -        } - -        struct npc_forest_frogAI : public ScriptedAI -        { -            npc_forest_frogAI(Creature* creature) : ScriptedAI(creature) -            { -                instance = creature->GetInstanceScript(); -            } - -            InstanceScript* instance; - -            void Reset() override { } - -            void EnterCombat(Unit* /*who*/) override { } - -            void DoSpawnRandom() -            { -                uint32 cEntry = 0; -                switch (rand32() % 10) -                { -                    case 0: cEntry = 24397; break;          //Mannuth -                    case 1: cEntry = 24403; break;          //Deez -                    case 2: cEntry = 24404; break;          //Galathryn -                    case 3: cEntry = 24405; break;          //Adarrah -                    case 4: cEntry = 24406; break;          //Fudgerick -                    case 5: cEntry = 24407; break;          //Darwen -                    case 6: cEntry = 24445; break;          //Mitzi -                    case 7: cEntry = 24448; break;          //Christian -                    case 8: cEntry = 24453; break;          //Brennan -                    case 9: cEntry = 24455; break;          //Hollee -                } - -                if (!instance->GetData(TYPE_RAND_VENDOR_1)) -                    if (rand32() % 10 == 1) cEntry = 24408;      //Gunter -                if (!instance->GetData(TYPE_RAND_VENDOR_2)) -                    if (rand32() % 10 == 1) cEntry = 24409;      //Kyren - -                if (cEntry) me->UpdateEntry(cEntry); - -                if (cEntry == 24408) instance->SetData(TYPE_RAND_VENDOR_1, DONE); -                if (cEntry == 24409) instance->SetData(TYPE_RAND_VENDOR_2, DONE); -            } - -            void SpellHit(Unit* caster, const SpellInfo* spell) override -            { -                if (spell->Id == SPELL_REMOVE_AMANI_CURSE && caster->GetTypeId() == TYPEID_PLAYER && me->GetEntry() == NPC_FOREST_FROG) -                { -                    //increase or decrease chance of mojo? -                    if (rand32() % 99 == 50) DoCast(caster, SPELL_PUSH_MOJO, true); -                    else DoSpawnRandom(); -                } -            } -        }; - -        CreatureAI* GetAI(Creature* creature) const override -        { -            return GetInstanceAI<npc_forest_frogAI>(creature); -        } -}; - -/*###### -## npc_zulaman_hostage -######*/ - -#define GOSSIP_HOSTAGE1        "I am glad to help you." - -static uint32 HostageEntry[] = {23790, 23999, 24024, 24001}; -static uint32 ChestEntry[] = {186648, 187021, 186672, 186667}; - -class npc_zulaman_hostage : public CreatureScript -{ -    public: -        npc_zulaman_hostage() : CreatureScript("npc_zulaman_hostage") { } - -        bool OnGossipHello(Player* player, Creature* creature) override -        { -            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HOSTAGE1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); -            player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); -            return true; -        } - -        bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override -        { -            player->PlayerTalkClass->ClearMenus(); - -            if (action == GOSSIP_ACTION_INFO_DEF + 1) -                player->CLOSE_GOSSIP_MENU(); - -            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) -                { -                    if (HostageEntry[i] == entry) -                    { -                        creature->SummonGameObject(ChestEntry[i], x-2, y, z, 0, 0, 0, 0, 0, 0); -                        break; -                    } -                } -            } -            return true; -        } -}; - -/*###### -## npc_harrison_jones -######*/ +#include "zulaman.h"  enum Says  { -    SAY_HARRISON_0                    = 0, -    SAY_HARRISON_1                    = 1, -    SAY_HARRISON_2                    = 0, -    SAY_HARRISON_3                    = 1 +    // Vol'jin +    SAY_INTRO_1                 = 0, +    SAY_INTRO_2                 = 1, +    SAY_INTRO_3                 = 2, +    SAY_INTRO_4                 = 3, +    SAY_INTRO_FAIL              = 4, + +    // Hex Lord Malacrass +    SAY_HEXLOR_INTRO            = 0  };  enum Spells  { -    SPELL_BANGING_THE_GONG            = 45225, -    SPELL_STEALTH                     = 34189, -    SPELL_COSMETIC_SPEAR_THROW        = 43647 +    // Vol'jin +    SPELL_BANGING_THE_GONG      = 45225  };  enum Events  { -    GONG_EVENT_1                      = 1, -    GONG_EVENT_2                      = 2, -    GONG_EVENT_3                      = 3, -    GONG_EVENT_4                      = 4, -    GONG_EVENT_5                      = 5, -    GONG_EVENT_6                      = 6, -    GONG_EVENT_7                      = 7, -    GONG_EVENT_8                      = 8, -    GONG_EVENT_9                      = 9, -    GONG_EVENT_10                     = 10, -    GONG_EVENT_11                     = 11 -}; - -enum Waypoints -{ -    HARRISON_MOVE_1                   = 860440, -    HARRISON_MOVE_2                   = 860441, -    HARRISON_MOVE_3                   = 860442 +    EVENT_INTRO_MOVEPOINT_1     = 1, +    EVENT_INTRO_MOVEPOINT_2     = 2, +    EVENT_INTRO_MOVEPOINT_3     = 3, +    EVENT_BANGING_THE_GONG      = 4, +    EVENT_START_DOOR_OPENING_1  = 5, +    EVENT_START_DOOR_OPENING_2  = 6, +    EVENT_START_DOOR_OPENING_3  = 7, +    EVENT_START_DOOR_OPENING_4  = 8, +    EVENT_START_DOOR_OPENING_5  = 9, +    EVENT_START_DOOR_OPENING_6  = 10, +    EVENT_START_DOOR_OPENING_7  = 11  }; -enum DisplayIds +enum Points  { -    MODEL_HARRISON_JONES_0              = 22340, -    MODEL_HARRISON_JONES_1              = 22354, -    MODEL_HARRISON_JONES_2              = 22347 +    POINT_INTRO                 = 1, +    POINT_STRANGE_GONG          = 2, +    POINT_START_DOOR_OPENING_1  = 3, +    POINT_START_DOOR_OPENING_2  = 4  }; -enum EntryIds +enum Misc  { -    NPC_HARRISON_JONES_1                = 24375, -    NPC_HARRISON_JONES_2                = 24365, -    NPC_AMANISHI_GUARDIAN               = 23597, +    ITEM_VIRTUAL_ITEM           = 5301  }; -enum Weapons +Position const VoljinIntroWaypoint[4] =  { -    WEAPON_MACE                         = 5301, -    WEAPON_SPEAR                        = 13631 +    { 117.7349f, 1662.77f, 42.02156f, 0.0f }, +    { 132.14f, 1645.143f, 42.02158f, 0.0f }, +    { 121.8901f, 1639.118f, 42.23253f, 0.0f }, +    { 122.618f, 1639.546f, 42.11659f, 0.0f },  }; -class npc_harrison_jones : public CreatureScript +class npc_voljin_zulaman : public CreatureScript  {      public: +        npc_voljin_zulaman() : CreatureScript("npc_voljin_zulaman") { } -        npc_harrison_jones() : CreatureScript("npc_harrison_jones") +        struct npc_voljin_zulamanAI : public ScriptedAI          { -        } - -        struct npc_harrison_jonesAI : public ScriptedAI -        { -            npc_harrison_jonesAI(Creature* creature) : ScriptedAI(creature) -            { -                Initialize(); -                instance = creature->GetInstanceScript(); -            } - -            void Initialize() +            npc_voljin_zulamanAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())              { -                _gongEvent = 0; -                _gongTimer = 0; -                uiTargetGUID = 0; +                me->SetDisplayId(me->GetCreatureTemplate()->Modelid1); +                if (_instance->GetData(DATA_ZULAMAN_STATE) == NOT_STARTED) +                    me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);              } -            InstanceScript* instance; - -            uint8 _gongEvent; -            uint32 _gongTimer; -            uint64 uiTargetGUID; -              void Reset() override              { -                Initialize(); +                _gongCount = 0;              } -            void EnterCombat(Unit* /*who*/) override { } -              void sGossipSelect(Player* player, uint32 sender, uint32 action) override              { -               if (me->GetCreatureTemplate()->GossipMenuId == sender && !action) -               { -                    player->CLOSE_GOSSIP_MENU(); -                    me->SetFacingToObject(player); +                if (_instance->GetData(DATA_ZULAMAN_STATE) != NOT_STARTED) +                    return; + +                if (me->GetCreatureTemplate()->GossipMenuId == sender && !action) +                { +                    _events.Reset(); +                    me->SetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID, 0);                      me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); -                    Talk(SAY_HARRISON_0); -                    _gongEvent = GONG_EVENT_1; -                    _gongTimer = 4000; -               } +                    me->SetUInt32Value(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_NONE); +                    _events.ScheduleEvent(EVENT_INTRO_MOVEPOINT_1, 1000); +                    Talk(SAY_INTRO_1, player); +                    me->SetWalk(true); +                }              } -            void SpellHit(Unit*, const SpellInfo* spell) override +            void DoAction(int32 action) override              { -                if (spell->Id == SPELL_COSMETIC_SPEAR_THROW) +                if (action == ACTION_START_ZULAMAN)                  { -                    me->RemoveAllAuras(); -                    me->SetEntry(NPC_HARRISON_JONES_2); -                    me->SetDisplayId(MODEL_HARRISON_JONES_2); -                    me->SetTarget(0); -                    me->SetByteValue(UNIT_FIELD_BYTES_1, 0, UNIT_STAND_STATE_DEAD); -                    me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); -                    instance->SetData(DATA_GONGEVENT, DONE); +                    if (++_gongCount == 10) +                        _events.ScheduleEvent(EVENT_START_DOOR_OPENING_1, 500);                  }              }              void UpdateAI(uint32 diff) override              { -                if (_gongEvent) +                _events.Update(diff); +                while (uint32 eventId = _events.ExecuteEvent())                  { -                    if (_gongTimer <= diff) +                    switch (eventId)                      { -                        switch (_gongEvent) -                        { -                            case GONG_EVENT_1: -                                me->GetMotionMaster()->MovePath(HARRISON_MOVE_1, false); -                                _gongEvent = GONG_EVENT_2; -                                _gongTimer = 12000; -                                break; -                            case GONG_EVENT_2: -                                me->SetFacingTo(6.235659f); -                                Talk(SAY_HARRISON_1); -                                DoCast(me, SPELL_BANGING_THE_GONG); -                                me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_MACE)); -                                me->SetSheath(SHEATH_STATE_MELEE); -                                _gongEvent = GONG_EVENT_3; -                                _gongTimer = 4000; -                                break; -                            case GONG_EVENT_3: -                                if (GameObject* gong = me->GetMap()->GetGameObject(instance->GetData64(GO_STRANGE_GONG))) -                                    gong->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); -                                _gongEvent = GONG_EVENT_4; -                                _gongTimer = 105000; -                                break; -                            case GONG_EVENT_4: -                                me->RemoveAura(SPELL_BANGING_THE_GONG); -                                if (GameObject* gong = me->GetMap()->GetGameObject(instance->GetData64(GO_STRANGE_GONG))) -                                    gong->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - -                                // trigger or gong will need to be scripted to set IN_PROGRESS after enough hits. -                                // This is temp workaround. -                                instance->SetData(DATA_GONGEVENT, IN_PROGRESS); // to be removed. - -                                if (instance->GetData(DATA_GONGEVENT) == IN_PROGRESS) -                                { -                                    // Players are Now Saved to instance at SPECIAL (Player should be notified?) -                                    me->GetMotionMaster()->MovePath(HARRISON_MOVE_2, false); -                                    _gongEvent = GONG_EVENT_5; -                                    _gongTimer = 5000; -                                } -                                else -                                { -                                    _gongTimer = 1000; -                                    _gongEvent = GONG_EVENT_9; -                                } -                                break; -                            case GONG_EVENT_5: -                                me->SetEntry(NPC_HARRISON_JONES_1); -                                me->SetDisplayId(MODEL_HARRISON_JONES_1); -                                Talk(SAY_HARRISON_2); -                                _gongTimer = 12000; -                                _gongEvent = GONG_EVENT_6; -                                break; -                            case GONG_EVENT_6: -                                me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_USE_STANDING); -                                Talk(SAY_HARRISON_3); -                                _gongTimer = 7000; -                                _gongEvent = GONG_EVENT_7; -                                break; -                            case GONG_EVENT_7: -                                if (!uiTargetGUID) -                                { -                                    std::list<Creature*> targetList; -                                    GetCreatureListWithEntryInGrid(targetList, me, NPC_AMANISHI_GUARDIAN, 26.0f); -                                    if (!targetList.empty()) -                                    { -                                        for (std::list<Creature*>::const_iterator itr = targetList.begin(); itr != targetList.end(); ++itr) -                                        { -                                            if (Creature* ptarget = *itr) -                                            { -                                                if (ptarget->GetPositionX() > 120) -                                                { -                                                    ptarget->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_SPEAR)); -                                                    ptarget->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); -                                                    ptarget->SetReactState(REACT_PASSIVE); -                                                    ptarget->AI()->SetData(0, 1); -                                                } -                                                else -                                                { -                                                    ptarget->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); -                                                    ptarget->SetReactState(REACT_PASSIVE); -                                                    ptarget->AI()->SetData(0, 2); -                                                } -                                            } -                                        } -                                    } -                                } +                        case EVENT_INTRO_MOVEPOINT_1: +                            me->GetMotionMaster()->MovePoint(POINT_INTRO, VoljinIntroWaypoint[0]); +                            _events.ScheduleEvent(EVENT_INTRO_MOVEPOINT_2, 1000); +                            break; +                        case EVENT_INTRO_MOVEPOINT_2: +                            me->GetMotionMaster()->MovePoint(POINT_STRANGE_GONG, VoljinIntroWaypoint[1]); +                            _events.ScheduleEvent(EVENT_INTRO_MOVEPOINT_3, 4000); +                            break; +                        case EVENT_INTRO_MOVEPOINT_3: +                            Talk(SAY_INTRO_2); +                            _events.ScheduleEvent(EVENT_BANGING_THE_GONG, 3000); +                        case EVENT_BANGING_THE_GONG: +                            DoCast(me, SPELL_BANGING_THE_GONG); +                            if (GameObject* strangeGong = ObjectAccessor::GetGameObject(*me, _instance->GetData64(DATA_STRANGE_GONG))) +                                strangeGong->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); +                            me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, uint32(ITEM_VIRTUAL_ITEM)); +                            break; +                        case EVENT_START_DOOR_OPENING_1: +                            me->RemoveAura(SPELL_BANGING_THE_GONG); +                            _events.ScheduleEvent(EVENT_START_DOOR_OPENING_2, 500); +                            break; +                        case EVENT_START_DOOR_OPENING_2: +                            me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, uint32(0)); +                            if (GameObject* strangeGong = ObjectAccessor::GetGameObject(*me, _instance->GetData64(DATA_STRANGE_GONG))) +                                strangeGong->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); +                            _events.ScheduleEvent(EVENT_START_DOOR_OPENING_3, 500); +                            break; +                        case EVENT_START_DOOR_OPENING_3: +                            me->GetMotionMaster()->MovePoint(POINT_START_DOOR_OPENING_1, VoljinIntroWaypoint[2]); +                            break; +                        case EVENT_START_DOOR_OPENING_4: +                            _instance->SetData(DATA_ZULAMAN_STATE, IN_PROGRESS); +                            if (GameObject* masiveGate = ObjectAccessor::GetGameObject(*me, _instance->GetData64(DATA_MASSIVE_GATE))) +                                masiveGate->SetGoState(GO_STATE_ACTIVE); +                            _events.ScheduleEvent(EVENT_START_DOOR_OPENING_5, 3000); +                            break; +                        case EVENT_START_DOOR_OPENING_5: +                            Talk(SAY_INTRO_4); +                            _events.ScheduleEvent(EVENT_START_DOOR_OPENING_6, 6000); +                            break; +                        case EVENT_START_DOOR_OPENING_6: +                            _events.ScheduleEvent(EVENT_START_DOOR_OPENING_7, 6000); +                            break; +                        case EVENT_START_DOOR_OPENING_7: +                            if (Creature* hexLordTrigger = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_HEXLORD_TRIGGER))) +                                sCreatureTextMgr->SendChat(hexLordTrigger, SAY_HEXLOR_INTRO, 0, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_MAP); +                            break; +                        default: +                            break; +                    } +                } +            } -                                if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_MASSIVE_GATE))) -                                    gate->SetGoState(GO_STATE_ACTIVE); -                                _gongTimer = 2000; -                                _gongEvent = GONG_EVENT_8; -                                break; -                            case GONG_EVENT_8: -                                DoCast(me, SPELL_STEALTH); -                                me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(0)); -                                me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); -                                me->GetMotionMaster()->MovePath(HARRISON_MOVE_3, false); -                                _gongTimer = 1000; -                                _gongEvent = 0; -                                break; -                            case GONG_EVENT_9: -                                me->GetMotionMaster()->MovePoint(0, 120.687f, 1674.0f, 42.0217f); -                                _gongTimer = 12000; -                                _gongEvent = GONG_EVENT_10; -                                break; -                            case GONG_EVENT_10: -                                me->SetFacingTo(1.59044f); -                                _gongEvent = 11; -                                _gongTimer = 6000; -                                break; -                            case GONG_EVENT_11: -                                me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); +            void MovementInform(uint32 movementType, uint32 pointId) override +            { +                if (movementType != POINT_MOTION_TYPE) +                    return; -                                instance->SetData(DATA_GONGEVENT, NOT_STARTED); -                                _gongEvent = 0; -                                _gongTimer = 1000; -                                break; -                        } -                    } -                    else -                    _gongTimer -= diff; +                switch (pointId) +                { +                    case POINT_STRANGE_GONG: +                        if (GameObject* strangeGong = ObjectAccessor::GetGameObject(*me, _instance->GetData64(DATA_STRANGE_GONG))) +                            me->SetFacingToObject(strangeGong); // setInFront +                        break; +                    case POINT_START_DOOR_OPENING_1: +                        me->SetFacingTo(4.747295f); +                        me->GetMotionMaster()->MovePoint(POINT_START_DOOR_OPENING_2, VoljinIntroWaypoint[3]); +                        Talk(SAY_INTRO_3); +                        _events.ScheduleEvent(EVENT_START_DOOR_OPENING_4, 4500); +                        break; +                    default: +                        break;                  }              } + +        private: +            InstanceScript* _instance; +            EventMap _events; +            uint8 _gongCount;          };          CreatureAI* GetAI(Creature* creature) const override          { -            return GetInstanceAI<npc_harrison_jonesAI>(creature); +            return GetInstanceAI<npc_voljin_zulamanAI>(creature);          }  }; +// 45226 - Banging the Gong  class spell_banging_the_gong : public SpellScriptLoader  {      public: @@ -458,11 +245,8 @@ class spell_banging_the_gong : public SpellScriptLoader          }  }; -  void AddSC_zulaman()  { -    new npc_forest_frog(); -    new npc_zulaman_hostage(); -    new npc_harrison_jones(); +    new npc_voljin_zulaman();      new spell_banging_the_gong();  } diff --git a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h index 84e1c963832..820788c66ec 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h +++ b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h @@ -1,6 +1,5 @@  /*   * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>   *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License as published by the @@ -19,45 +18,74 @@  #ifndef DEF_ZULAMAN_H  #define DEF_ZULAMAN_H +uint32 const EncounterCount = 6; +#define ZulAmanScriptName "instance_zulaman"  #define DataHeader "ZA"  enum DataTypes  { -    DATA_GONGEVENT                      = 0, -    DATA_NALORAKKEVENT                  = 1, -    DATA_AKILZONEVENT                   = 2, -    DATA_JANALAIEVENT                   = 3, -    DATA_HALAZZIEVENT                   = 4, -    DATA_HEXLORDEVENT                   = 5, -    DATA_ZULJINEVENT                    = 6, -    DATA_CHESTLOOTED                    = 7, -    TYPE_RAND_VENDOR_1                  = 8, -    TYPE_RAND_VENDOR_2                  = 9 +    // BossState +    DATA_AKILZON                = 0, +    DATA_NALORAKK               = 1, +    DATA_JANALAI                = 2, +    DATA_HALAZZI                = 3, +    DATA_HEXLORD                = 4, +    DATA_DAAKARA                = 5, + +    // Data64 +    DATA_HEXLORD_TRIGGER, + +    DATA_STRANGE_GONG, +    DATA_MASSIVE_GATE, + +    // SetData +    DATA_ZULAMAN_STATE  };  enum CreatureIds  { -    NPC_HARRISON_JONES                  = 24358, -    NPC_JANALAI                         = 23578, -    NPC_ZULJIN                          = 23863, -    NPC_HEXLORD                         = 24239, -    NPC_HALAZZI                         = 23577, -    NPC_NALORAKK                        = 23576 +    NPC_AKILZON                 = 23574, +    NPC_NALORAKK                = 23576, +    NPC_JANALAI                 = 23578, +    NPC_HALAZZI                 = 23577, +    NPC_HEXLORD                 = 24239, +    NPC_DAAKARA                 = 23863, + +    NPC_VOLJIN                  = 52924, +    NPC_HEXLORD_TRIGGER         = 24363 +}; + +enum GameObjectIds +{ +    GO_STRANGE_GONG             = 187359, +    GO_MASSIVE_GATE             = 186728,  }; -enum GameobjectIds +enum ZulAmanEvents  { -    GO_DOOR_HALAZZI                     = 186303, -    GO_GATE_ZULJIN                      = 186304, -    GO_GATE_HEXLORD                     = 186305, -    GO_MASSIVE_GATE                     = 186728, -    GO_DOOR_AKILZON                     = 186858, -    GO_DOOR_ZULJIN                      = 186859, -    GO_HARKORS_SATCHEL                  = 187021, -    GO_TANZARS_TRUNK                    = 186648, -    GO_ASHLIS_BAG                       = 186672, -    GO_KRAZS_PACKAGE                    = 186667, -    GO_STRANGE_GONG                     = 187359 +    EVENT_START_ZULAMAN         = 15897, +    EVENT_UPDATE_ZULAMAN_TIMER  = 1,  }; +enum ZulAmanAction +{ +    ACTION_START_ZULAMAN        = 1 +}; + +enum ZulAmanWorldStates +{ +    WORLD_STATE_ZULAMAN_TIMER_ENABLED   = 3104, +    WORLD_STATE_ZULAMAN_TIMER           = 3106, +}; + +template<class AI> +CreatureAI* GetZulAmanAI(Creature* creature) +{ +    if (InstanceMap* instance = creature->GetMap()->ToInstanceMap()) +        if (instance->GetInstanceScript()) +            if (instance->GetScriptId() == sObjectMgr->GetScriptId(ZulAmanScriptName)) +                return new AI(creature); +    return NULL; +} +  #endif diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp deleted file mode 100644 index 0d780da6560..00000000000 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp +++ /dev/null @@ -1,454 +0,0 @@ -/* - * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -/* ScriptData -TCName: Boss_Arlokk -TC%Complete: 95 -TCComment: Wrong cleave and red aura is missing not yet added. -TCComment: Prowlers moving through wall hopefully mmaps will fix. -TCComment: Can't test LOS until mmaps. -TCCategory: Zul'Gurub -EndScriptData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "SpellInfo.h" -#include "zulgurub.h" - -enum Says -{ -    SAY_AGGRO                   = 0, -    SAY_FEAST_PROWLER           = 1, -    SAY_DEATH                   = 2 -}; - -enum Spells -{ -    SPELL_SHADOW_WORD_PAIN      = 24212, // Corrected -    SPELL_GOUGE                 = 12540, // Corrected -    SPELL_MARK_OF_ARLOKK        = 24210, // triggered spell 24211 Added to spell_dbc -    SPELL_RAVAGE                = 24213, // Corrected -    SPELL_CLEAVE                = 25174, // Searching for right spell -    SPELL_PANTHER_TRANSFORM     = 24190, // Transform to panther now used -    SPELL_SUMMON_PROWLER        = 24246, // Added to Spell_dbc -    SPELL_VANISH_VISUAL         = 24222, // Added -    SPELL_VANISH                = 24223, // Added -    SPELL_SUPER_INVIS           = 24235  // Added to Spell_dbc -}; - -enum Events -{ -    EVENT_SHADOW_WORD_PAIN      = 1, -    EVENT_GOUGE                 = 2, -    EVENT_MARK_OF_ARLOKK        = 3, -    EVENT_RAVAGE                = 4, -    EVENT_TRANSFORM             = 5, -    EVENT_VANISH                = 6, -    EVENT_VANISH_2              = 7, -    EVENT_TRANSFORM_BACK        = 8, -    EVENT_VISIBLE               = 9, -    EVENT_SUMMON_PROWLERS       = 10 -}; - -enum Phases -{ -    PHASE_ALL                   = 0, -    PHASE_ONE                   = 1, -    PHASE_TWO                   = 2 -}; - -enum Weapon -{ -    WEAPON_DAGGER               = 10616 -}; - -enum Misc -{ -    MAX_PROWLERS_PER_SIDE       = 15 -}; - -Position const PosMoveOnSpawn[1] = -{ -    { -11561.9f, -1627.868f, 41.29941f, 0.0f } -}; - -class boss_arlokk : public CreatureScript -{ -    public: boss_arlokk() : CreatureScript("boss_arlokk") { } - -        struct boss_arlokkAI : public BossAI -        { -            boss_arlokkAI(Creature* creature) : BossAI(creature, DATA_ARLOKK) -            { -                Initialize(); -                memset(_triggersSideAGUID, 0, sizeof(_triggersSideAGUID)); -                memset(_triggersSideBGUID, 0, sizeof(_triggersSideBGUID)); -            } - -            void Initialize() -            { -                _summonCountA = 0; -                _summonCountB = 0; -            } - -            void Reset() override -            { -                if (events.IsInPhase(PHASE_TWO)) -                    me->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, 35.0f, false); // hack -                _Reset(); -                Initialize(); -                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*/) override -            { -                _JustDied(); -                Talk(SAY_DEATH); -            } - -            void EnterCombat(Unit* /*who*/) override -            { -                _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<Creature*> triggerList; -                GetCreatureListWithEntryInGrid(triggerList, me, NPC_PANTHER_TRIGGER, 100.0f); -                if (!triggerList.empty()) -                { -                    uint8 sideA = 0; -                    uint8 sideB = 0; -                    for (std::list<Creature*>::const_iterator itr = triggerList.begin(); itr != triggerList.end(); ++itr) -                    { -                        if (Creature* trigger = *itr) -                        { -                            if (trigger->GetPositionY() < -1625.0f) -                            { -                                _triggersSideAGUID[sideA] = trigger->GetGUID(); -                                ++sideA; -                            } -                            else -                            { -                                _triggersSideBGUID[sideB] = trigger->GetGUID(); -                                ++sideB; -                            } -                        } -                    } -                } -            } - -            void EnterEvadeMode() override -            { -                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*/) override -            { -                if (id == 1) -                    --_summonCountA; -                else if (id == 2) -                    --_summonCountB; -            } - -            void UpdateAI(uint32 diff) override -            { -                if (!UpdateVictim()) -                    return; - -                events.Update(diff); - -                if (me->HasUnitState(UNIT_STATE_CASTING)) -                    return; - -                while (uint32 eventId = events.ExecuteEvent()) -                { -                    switch (eventId) -                    { -                        case EVENT_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)])) -                                { -                                    trigger->CastSpell(trigger, SPELL_SUMMON_PROWLER); -                                    ++_summonCountA; -                                } -                            } -                            if (_summonCountB < MAX_PROWLERS_PER_SIDE) -                            { -                                if (Unit* trigger = ObjectAccessor::GetUnit(*me, _triggersSideBGUID[urand(0, 4)])) -                                { -                                    trigger->CastSpell(trigger, SPELL_SUMMON_PROWLER); -                                    ++_summonCountB; -                                } -                            } -                            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) -                                target = me->GetVictim(); -                            if (target) -                            { -                                DoCast(target, SPELL_MARK_OF_ARLOKK, true); -                                Talk(SAY_FEAST_PROWLER, target); -                            } -                            events.ScheduleEvent(EVENT_MARK_OF_ARLOKK, urand(120000, 130000)); -                            break; -                        } -                        case EVENT_TRANSFORM: -                        { -                            DoCast(me, SPELL_PANTHER_TRANSFORM); // SPELL_AURA_TRANSFORM -                            me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(EQUIP_UNEQUIP)); -                            me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, uint32(EQUIP_UNEQUIP)); -                            /* -                            const CreatureTemplate* cinfo = me->GetCreatureTemplate(); -                            me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 35))); -                            me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 35))); -                            me->UpdateDamagePhysical(BASE_ATTACK); -                            */ -                            me->AttackStop(); -                            DoResetThreat(); -                            me->SetReactState(REACT_PASSIVE); -                            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: -                        { -                            me->RemoveAura(SPELL_PANTHER_TRANSFORM); // SPELL_AURA_TRANSFORM -                            DoCast(me, SPELL_VANISH_VISUAL); -                            me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_DAGGER)); -                            me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, uint32(WEAPON_DAGGER)); -                            /* -                            const CreatureTemplate* cinfo = me->GetCreatureTemplate(); -                            me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg)); -                            me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg)); -                            me->UpdateDamagePhysical(BASE_ATTACK); -                            */ -                            me->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, 35.0f, false); // hack -                            events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, urand(4000, 7000), 0, PHASE_ONE); -                            events.ScheduleEvent(EVENT_GOUGE, urand(12000, 15000), 0, PHASE_ONE); -                            events.ScheduleEvent(EVENT_TRANSFORM, urand(16000, 20000), 0, PHASE_ONE); -                            events.SetPhase(PHASE_ONE); -                            break; -                        } -                        default: -                            break; -                    } -                } - -                DoMeleeAttackIfReady(); -            } - -        private: -            uint8 _summonCountA; -            uint8 _summonCountB; -            uint64 _triggersSideAGUID[5]; -            uint64 _triggersSideBGUID[5]; -        }; - -        CreatureAI* GetAI(Creature* creature) const override -        { -            return GetZulGurubAI<boss_arlokkAI>(creature); -        } -}; - -/*###### -## npc_zulian_prowler -######*/ - -enum ZulianProwlerSpells -{ -    SPELL_SNEAK_RANK_1_1         = 22766, -    SPELL_SNEAK_RANK_1_2         = 7939,  // Added to Spell_dbc -    SPELL_MARK_OF_ARLOKK_TRIGGER = 24211  // Added to Spell_dbc -}; - -enum ZulianProwlerEvents -{ -    EVENT_ATTACK                 = 1 -}; - -Position const PosProwlerCenter[1] = -{ -    { -11556.7f, -1631.344f, 41.2994f, 0.0f } -}; - -class npc_zulian_prowler : public CreatureScript -{ -    public: npc_zulian_prowler() : CreatureScript("npc_zulian_prowler") { } - -        struct npc_zulian_prowlerAI : public ScriptedAI -        { -            npc_zulian_prowlerAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) -            { -                _sideData = 0; -            } - -            void Reset() override -            { -                if (me->GetPositionY() < -1625.0f) -                    _sideData = 1; -                else -                    _sideData = 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*/) override -            { -                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) override -            { -                if (spell->Id == SPELL_MARK_OF_ARLOKK_TRIGGER) // Should only hit if line of sight -                    me->Attack(caster, true); -            } - -            void JustDied(Unit* /*killer*/) override -            { -                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) override -            { -                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 override -        { -            return GetZulGurubAI<npc_zulian_prowlerAI>(creature); -        } -}; - -/*###### -## go_gong_of_bethekk -######*/ - -Position const PosSummonArlokk[1] = -{ -    { -11507.22f, -1628.062f, 41.38264f, 3.159046f } -}; - -class go_gong_of_bethekk : public GameObjectScript -{ -    public: go_gong_of_bethekk() : GameObjectScript("go_gong_of_bethekk") { } - -        bool OnGossipHello(Player* /*player*/, GameObject* go) override -        { -            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; -        } -}; - -void AddSC_boss_arlokk() -{ -    new boss_arlokk(); -    new npc_zulian_prowler(); -    new go_gong_of_bethekk(); -} diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp index 4ffe7b35240..fccaf768704 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp @@ -16,53 +16,44 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -/* ScriptData -SDName: Boss_Grilek -SD%Complete: 100 -SDComment: -SDCategory: Zul'Gurub -EndScriptData */ - +#include "ObjectMgr.h"  #include "ScriptMgr.h"  #include "ScriptedCreature.h"  #include "zulgurub.h" +enum Yells +{ +}; +  enum Spells  { -    SPELL_AVATAR                    = 24646, // Enrage Spell -    SPELL_GROUND_TREMOR             = 6524  };  enum Events  { -    EVENT_AVATAR                    = 1, -    EVENT_GROUND_TREMOR             = 2  }; -class boss_grilek : public CreatureScript // grilek +class boss_grilek : public CreatureScript  {      public:          boss_grilek() : CreatureScript("boss_grilek") { }          struct boss_grilekAI : public BossAI          { -            boss_grilekAI(Creature* creature) : BossAI(creature, DATA_EDGE_OF_MADNESS) { } +            boss_grilekAI(Creature* creature) : BossAI(creature, DATA_GRILEK) +            { +            }              void Reset() override              { -                _Reset();              } -            void JustDied(Unit* /*killer*/) override +            void EnterCombat(Unit* /*who*/) override              { -                _JustDied();              } -            void EnterCombat(Unit* /*who*/) override +            void JustDied(Unit* /*killer*/) override              { -                _EnterCombat(); -                events.ScheduleEvent(EVENT_AVATAR, urand(15000, 25000)); -                events.ScheduleEvent(EVENT_GROUND_TREMOR, urand(15000, 25000));              }              void UpdateAI(uint32 diff) override @@ -74,31 +65,16 @@ class boss_grilek : public CreatureScript // grilek                  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();              } @@ -114,4 +90,3 @@ void AddSC_boss_grilek()  {      new boss_grilek();  } - diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp deleted file mode 100644 index 2d4a424476d..00000000000 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -/* -Name: Boss_Hakkar -%Complete: 95 -Comment: Blood siphon spell buggy cause of Core Issue. -Category: Zul'Gurub -*/ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "zulgurub.h" - -enum Says -{ -    SAY_AGGRO                   = 0, -    SAY_FLEEING                 = 1, -    SAY_MINION_DESTROY          = 2,     // Where does it belong? -    SAY_PROTECT_ALTAR           = 3      // Where does it belong? -}; - -enum Spells -{ -    SPELL_BLOOD_SIPHON          = 24322, // Buggy ? -    SPELL_CORRUPTED_BLOOD       = 24328, -    SPELL_CAUSE_INSANITY        = 24327, // Spell needs scripting. -    SPELL_WILL_OF_HAKKAR        = 24178, -    SPELL_ENRAGE                = 24318, -    // The Aspects of all High Priests spells -    SPELL_ASPECT_OF_JEKLIK      = 24687, -    SPELL_ASPECT_OF_VENOXIS     = 24688, -    SPELL_ASPECT_OF_MARLI       = 24686, -    SPELL_ASPECT_OF_THEKAL      = 24689, -    SPELL_ASPECT_OF_ARLOKK      = 24690 -}; - -enum Events -{ -    EVENT_BLOOD_SIPHON          = 1, -    EVENT_CORRUPTED_BLOOD       = 2, -    EVENT_CAUSE_INSANITY        = 3,     // Spell needs scripting. Event disabled -    EVENT_WILL_OF_HAKKAR        = 4, -    EVENT_ENRAGE                = 5, -    // The Aspects of all High Priests events -    EVENT_ASPECT_OF_JEKLIK      = 6, -    EVENT_ASPECT_OF_VENOXIS     = 7, -    EVENT_ASPECT_OF_MARLI       = 8, -    EVENT_ASPECT_OF_THEKAL      = 9, -    EVENT_ASPECT_OF_ARLOKK      = 10 -}; - -class boss_hakkar : public CreatureScript -{ -    public: -        boss_hakkar() : CreatureScript("boss_hakkar") { } - -        struct boss_hakkarAI : public BossAI -        { -            boss_hakkarAI(Creature* creature) : BossAI(creature, DATA_HAKKAR) { } - -            void Reset() override -            { -                _Reset(); -            } - -            void JustDied(Unit* /*killer*/) override -            { -                _JustDied(); -            } - -            void EnterCombat(Unit* /*who*/) override -            { -                _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) override -            { -                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: -                            DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 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 override -        { -            return GetInstanceAI<boss_hakkarAI>(creature); -        } -}; - -void AddSC_boss_hakkar() -{ -    new boss_hakkar(); -} - diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp index 6b964d8825f..14d5f301241 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp @@ -16,28 +16,21 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -/* ScriptData -SDName: Boss_Hazzarah -SD%Complete: 100 -SDComment: -SDCategory: Zul'Gurub -EndScriptData */ - +#include "ObjectMgr.h"  #include "ScriptMgr.h"  #include "ScriptedCreature.h"  #include "zulgurub.h" +enum Yells +{ +}; +  enum Spells  { -    SPELL_MANABURN              = 26046, -    SPELL_SLEEP                 = 24664  };  enum Events  { -    EVENT_MANABURN              = 1, -    EVENT_SLEEP                 = 2, -    EVENT_ILLUSIONS             = 3  };  class boss_hazzarah : public CreatureScript @@ -47,24 +40,20 @@ class boss_hazzarah : public CreatureScript          struct boss_hazzarahAI : public BossAI          { -            boss_hazzarahAI(Creature* creature) : BossAI(creature, DATA_EDGE_OF_MADNESS) { } +            boss_hazzarahAI(Creature* creature) : BossAI(creature, DATA_HAZZARAH) +            { +            }              void Reset() override              { -                _Reset();              } -            void JustDied(Unit* /*killer*/) override +            void EnterCombat(Unit* /*who*/) override              { -                _JustDied();              } -            void EnterCombat(Unit* /*who*/) override +            void JustDied(Unit* /*killer*/) override              { -                _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) override @@ -76,34 +65,16 @@ class boss_hazzarah : public CreatureScript                  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)) -                                    if (Creature* Illusion = me->SummonCreature(NPC_NIGHTMARE_ILLUSION, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000)) -                                        Illusion->AI()->AttackStart(target); -                            } -                            events.ScheduleEvent(EVENT_ILLUSIONS, urand(15000, 25000)); -                            break;                          default:                              break;                      }                  } +                */                  DoMeleeAttackIfReady();              } diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp deleted file mode 100644 index f31477e8e35..00000000000 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp +++ /dev/null @@ -1,265 +0,0 @@ -/* - * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "zulgurub.h" - -enum Says -{ -    SAY_AGGRO                   = 0, -    SAY_RAIN_FIRE               = 1, -    SAY_DEATH                   = 2 -}; - -enum Spells -{ -    SPELL_CHARGE                = 22911, -    SPELL_SONICBURST            = 23918, -    SPELL_SCREECH               = 6605, -    SPELL_SHADOW_WORD_PAIN      = 23952, -    SPELL_MIND_FLAY             = 23953, -    SPELL_CHAIN_MIND_FLAY       = 26044, // Right ID unknown. So disabled -    SPELL_GREATERHEAL           = 23954, -    SPELL_BAT_FORM              = 23966, - -    // Batriders Spell -    SPELL_BOMB                  = 40332 // Wrong ID but Magmadars bomb is not working... -}; - -enum BatIds -{ -    NPC_BLOODSEEKER_BAT         = 11368, -    NPC_FRENZIED_BAT            = 14965 -}; - -enum Events -{ -    EVENT_CHARGE_JEKLIK         = 1, -    EVENT_SONIC_BURST, -    EVENT_SCREECH, -    EVENT_SPAWN_BATS, -    EVENT_SHADOW_WORD_PAIN, -    EVENT_MIND_FLAY, -    EVENT_CHAIN_MIND_FLAY, -    EVENT_GREATER_HEAL, -    EVENT_SPAWN_FLYING_BATS -}; - -enum Phase -{ -    PHASE_ONE                   = 1, -    PHASE_TWO                   = 2 -}; - -Position const SpawnBat[6] = -{ -    { -12291.6220f, -1380.2640f, 144.8304f, 5.483f }, -    { -12289.6220f, -1380.2640f, 144.8304f, 5.483f }, -    { -12293.6220f, -1380.2640f, 144.8304f, 5.483f }, -    { -12291.6220f, -1380.2640f, 144.8304f, 5.483f }, -    { -12289.6220f, -1380.2640f, 144.8304f, 5.483f }, -    { -12293.6220f, -1380.2640f, 144.8304f, 5.483f } -}; - -class boss_jeklik : public CreatureScript -{ -    public: boss_jeklik() : CreatureScript("boss_jeklik") { } - -        struct boss_jeklikAI : public BossAI -        { -            boss_jeklikAI(Creature* creature) : BossAI(creature, DATA_JEKLIK) { } - -            void Reset() override -            { -                _Reset(); -            } - -            void JustDied(Unit* /*killer*/) override -            { -                _JustDied(); -                Talk(SAY_DEATH); -            } - -            void EnterCombat(Unit* /*who*/) override -            { -                _EnterCombat(); -                Talk(SAY_AGGRO); -                events.SetPhase(PHASE_ONE); - -                events.ScheduleEvent(EVENT_CHARGE_JEKLIK, 20000, 0, PHASE_ONE); -                events.ScheduleEvent(EVENT_SONIC_BURST, 8000, 0, PHASE_ONE); -                events.ScheduleEvent(EVENT_SCREECH, 13000, 0, PHASE_ONE); -                events.ScheduleEvent(EVENT_SPAWN_BATS, 60000, 0, PHASE_ONE); - -                me->SetCanFly(true); -                DoCast(me, SPELL_BAT_FORM); -            } - -            void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/) override -            { -                if (events.IsInPhase(PHASE_ONE) && !HealthAbovePct(50)) -                { -                    me->RemoveAurasDueToSpell(SPELL_BAT_FORM); -                    me->SetCanFly(false); -                    DoResetThreat(); -                    events.SetPhase(PHASE_TWO); -                    events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 6000, 0, PHASE_TWO); -                    events.ScheduleEvent(EVENT_MIND_FLAY, 11000, 0, PHASE_TWO); -                    events.ScheduleEvent(EVENT_CHAIN_MIND_FLAY, 26000, 0, PHASE_TWO); -                    events.ScheduleEvent(EVENT_GREATER_HEAL, 50000, 0, PHASE_TWO); -                    events.ScheduleEvent(EVENT_SPAWN_FLYING_BATS, 10000, 0, PHASE_TWO); -                    return; -                } -            } - -            void UpdateAI(uint32 diff) override -            { -                if (!UpdateVictim()) -                    return; - -                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 override -        { -            return GetZulGurubAI<boss_jeklikAI>(creature); -        } -}; - -// Flying Bat -class npc_batrider : public CreatureScript -{ -    public: -        npc_batrider() : CreatureScript("npc_batrider") { } - -        struct npc_batriderAI : public ScriptedAI -        { -            npc_batriderAI(Creature* creature) : ScriptedAI(creature) -            { -                Initialize(); -            } - -            void Initialize() -            { -                Bomb_Timer = 2000; -            } - -            uint32 Bomb_Timer; - -            void Reset() override -            { -                Initialize(); -                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); -            } - -            void EnterCombat(Unit* /*who*/) override { } - -            void UpdateAI(uint32 diff) override -            { -                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 override -        { -            return new npc_batriderAI(creature); -        } -}; - -void AddSC_boss_jeklik() -{ -    new boss_jeklik(); -    new npc_batrider(); -} diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp deleted file mode 100644 index d1c9579c027..00000000000 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp +++ /dev/null @@ -1,269 +0,0 @@ -/* - * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "zulgurub.h" - -enum Say -{ -    SAY_AGGRO                       = 1 -}; - -enum Spells -{ -    SPELL_BRAIN_WASH_TOTEM          = 24262, -    SPELL_POWERFULL_HEALING_WARD    = 24309, -    SPELL_HEX                       = 24053, -    SPELL_DELUSIONS_OF_JINDO        = 24306, -    SPELL_SHADE_OF_JINDO            = 24308, -    // Healing Ward Spell -    SPELL_HEAL                      = 24311, -    // Shade of Jindo Spell -    SPELL_SHADOWSHOCK               = 19460, -    SPELL_INVISIBLE                 = 24307 -}; - -enum Events -{ -    EVENT_BRAIN_WASH_TOTEM          = 1, -    EVENT_POWERFULL_HEALING_WARD    = 2, -    EVENT_HEX                       = 3, -    EVENT_DELUSIONS_OF_JINDO        = 4, -    EVENT_TELEPORT                  = 5 -}; - -Position const TeleportLoc = { -11583.7783f, -1249.4278f, 77.5471f, 4.745f }; - -// Formation of summoned trolls -Position const Formation[] = -{ -    { -11582.2998f, -1247.8599f, 77.6298f, 0.0f }, -    { -11585.0996f, -1248.7600f, 77.6298f, 0.0f }, -    { -11586.5996f, -1250.7199f, 77.6298f, 0.0f }, -    { -11586.4003f, -1253.9200f, 77.6298f, 0.0f }, -    { -11584.2001f, -1252.2099f, 77.6298f, 0.0f }, -    { -11582.5000f, -1250.3199f, 77.6298f, 0.0f }, -    { -11583.2001f, -1254.8299f, 77.6298f, 0.0f }, -    { -11581.5000f, -1252.5400f, 77.6298f, 0.0f }, -    { -11580.2001f, -1250.5999f, 77.6298f, 0.0f }, -    { -11580.5996f, -1254.7900f, 77.6298f, 0.0f } -}; - -class boss_jindo : public CreatureScript -{ -    public: -        boss_jindo() : CreatureScript("boss_jindo") { } - -        struct boss_jindoAI : public BossAI -        { -            boss_jindoAI(Creature* creature) : BossAI(creature, DATA_JINDO) { } - -            void Reset() override -            { -                _Reset(); -            } - -            void JustDied(Unit* /*killer*/) override -            { -                _JustDied(); -            } - -            void EnterCombat(Unit* /*who*/) override -            { -                _EnterCombat(); -                events.ScheduleEvent(EVENT_BRAIN_WASH_TOTEM, 20000); -                events.ScheduleEvent(EVENT_POWERFULL_HEALING_WARD, 16000); -                events.ScheduleEvent(EVENT_HEX, 8000); -                events.ScheduleEvent(EVENT_DELUSIONS_OF_JINDO, 10000); -                events.ScheduleEvent(EVENT_TELEPORT, 5000); -                Talk(SAY_AGGRO); -            } - -            void UpdateAI(uint32 diff) override -            { -                if (!UpdateVictim()) -                    return; - -                events.Update(diff); - -                if (me->HasUnitState(UNIT_STATE_CASTING)) -                    return; - -                while (uint32 eventId = events.ExecuteEvent()) -                { -                    switch (eventId) -                    { -                        case EVENT_BRAIN_WASH_TOTEM: -                            DoCast(me, SPELL_BRAIN_WASH_TOTEM); -                            events.ScheduleEvent(EVENT_BRAIN_WASH_TOTEM, urand(18000, 26000)); -                            break; -                        case EVENT_POWERFULL_HEALING_WARD: -                            DoCast(me, SPELL_POWERFULL_HEALING_WARD); -                            events.ScheduleEvent(EVENT_POWERFULL_HEALING_WARD, 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_DELUSIONS_OF_JINDO: -                            // 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, 100.0f, true)) -                            { -                                DoCast(target, SPELL_SHADE_OF_JINDO, true); -                                DoCast(target, SPELL_DELUSIONS_OF_JINDO); -                            } -                            events.ScheduleEvent(EVENT_DELUSIONS_OF_JINDO, urand(4000, 12000)); -                            break; -                        case EVENT_TELEPORT: -                            // Teleports a random player and spawns 9 Sacrificed Trolls to attack player -                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) -                            { -                                DoTeleportPlayer(target, TeleportLoc.GetPositionX(), TeleportLoc.GetPositionY(), TeleportLoc.GetPositionZ(), TeleportLoc.GetOrientation()); -                                if (DoGetThreat(me->GetVictim())) -                                    DoModifyThreatPercent(target, -100); - -                                // Summon a formation of trolls -                                for (uint8 i = 0; i < 10; ++i) -                                    if (Creature* SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, Formation[i].GetPositionX(), Formation[i].GetPositionY(), Formation[i].GetPositionZ(), Formation[i].GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000)) -                                        SacrificedTroll->AI()->AttackStart(target); -                            } -                            events.ScheduleEvent(EVENT_TELEPORT, urand(15000, 23000)); -                            break; -                        default: -                            break; -                    } -                } - -                DoMeleeAttackIfReady(); -            } -        }; - -        CreatureAI* GetAI(Creature* creature) const override -        { -            return new boss_jindoAI(creature); -        } -}; - -// Healing Ward -class npc_healing_ward : public CreatureScript -{ -    public: -        npc_healing_ward() : CreatureScript("npc_healing_ward") { } - -        struct npc_healing_wardAI : public ScriptedAI -        { -            npc_healing_wardAI(Creature* creature) : ScriptedAI(creature) -            { -                Initialize(); -                instance = creature->GetInstanceScript(); -            } - -            void Initialize() -            { -                Heal_Timer = 2000; -            } - -            uint32 Heal_Timer; -            InstanceScript* instance; - -            void Reset() override -            { -                Initialize(); -            } - -            void EnterCombat(Unit* /*who*/) override { } - -            void UpdateAI(uint32 diff) override -            { -                // Heal_Timer -                if (Heal_Timer <= diff) -                { -                    if (Unit* jindo = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_JINDO))) -                        DoCast(jindo, SPELL_HEAL); -                    Heal_Timer = 3000; -                } else Heal_Timer -= diff; - -                DoMeleeAttackIfReady(); -            } -        }; - -        CreatureAI* GetAI(Creature* creature) const override -        { -            return GetInstanceAI<npc_healing_wardAI>(creature); -        } -}; - -//Shade of Jindo -class npc_shade_of_jindo : public CreatureScript -{ -    public: -        npc_shade_of_jindo() : CreatureScript("npc_shade_of_jindo") { } - -        struct npc_shade_of_jindoAI : public ScriptedAI -        { -            npc_shade_of_jindoAI(Creature* creature) : ScriptedAI(creature) -            { -                Initialize(); -            } - -            void Initialize() -            { -                ShadowShock_Timer = 1000; -            } - -            uint32 ShadowShock_Timer; - -            void Reset() override -            { -                Initialize(); -                DoCast(me, SPELL_INVISIBLE, true); -            } - -            void EnterCombat(Unit* /*who*/) override { } - -            void UpdateAI(uint32 diff) override -            { -                // ShadowShock_Timer -                if (ShadowShock_Timer <= diff) -                { -                    DoCastVictim(SPELL_SHADOWSHOCK); -                    ShadowShock_Timer = 2000; -                } else ShadowShock_Timer -= diff; - -                DoMeleeAttackIfReady(); -            } -        }; - -        CreatureAI* GetAI(Creature* creature) const override -        { -            return new npc_shade_of_jindoAI(creature); -        } -}; - -void AddSC_boss_jindo() -{ -    new boss_jindo(); -    new npc_healing_ward(); -    new npc_shade_of_jindo(); -} diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo_the_godbreaker.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo_the_godbreaker.cpp new file mode 100644 index 00000000000..d06fdb2840e --- /dev/null +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo_the_godbreaker.cpp @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "ObjectMgr.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "zulgurub.h" + +enum Yells +{ +    // Jin'do the Godbreaker +    SAY_INTRO                   = 0, +    SAY_AGGRO                   = 1, +    EMOTE_SHADOWS_OF_HAKKAR     = 2, // ID - 97172 Shadows of Hakkar +    SAY_JINDO_SPIRIT_PHASE      = 3, +    //SAY_PLAYER_KILL             = 4, // missing data + +    // Spirit of Hakkar +    SAY_SPIRIT_SPIRIT_PHASE     = 0, +    SAY_SPIRIT_DEFEATED         = 1, + +    // Jin'do the Godbreaker - Trigger +    SAY_JINDO_DEFEATED          = 0, + +    // Shadow of Hakkar +    SAY_SHADOW_DEFEATED         = 0, +}; + +enum Spells +{ +}; + +enum Events +{ +}; + +class boss_jindo_the_godbreaker : public CreatureScript +{ +    public: +        boss_jindo_the_godbreaker() : CreatureScript("boss_jindo_the_godbreaker") { } + +        struct boss_jindo_the_godbreakerAI : public BossAI +        { +            boss_jindo_the_godbreakerAI(Creature* creature) : BossAI(creature, DATA_JINDO) { } + +            void Reset() override +            { +                _Reset(); +            } + +            void EnterCombat(Unit* /*who*/) override +            { +                _EnterCombat(); +                Talk(SAY_AGGRO); +            } + +            void JustDied(Unit* /*killer*/) override +            { +            } + +            void UpdateAI(uint32 diff) override +            { +                if (!UpdateVictim()) +                    return; + +                events.Update(diff); + +                if (me->HasUnitState(UNIT_STATE_CASTING)) +                    return; +                /* +                while (uint32 eventId = events.ExecuteEvent()) +                { +                    switch (eventId) +                    { +                        default: +                            break; +                    } +                } +                */ + +                DoMeleeAttackIfReady(); +            } +        }; + +        CreatureAI* GetAI(Creature* creature) const override +        { +            return GetZulGurubAI<boss_jindo_the_godbreakerAI>(creature); +        } +}; + +void AddSC_boss_jindo_the_godbreaker() +{ +    new boss_jindo_the_godbreaker(); +} diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_kilnara.cpp index 51b00e39fed..b42b6d29731 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_kilnara.cpp @@ -1,6 +1,5 @@  /*   * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>   *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License as published by the @@ -16,56 +15,60 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -/* ScriptData -SDName: Boss_Gahz'ranka -SD%Complete: 85 -SDComment: Massive Geyser with knockback not working. Spell buggy. -SDCategory: Zul'Gurub -EndScriptData */ - +#include "ObjectMgr.h"  #include "ScriptMgr.h"  #include "ScriptedCreature.h" +#include "Spell.h"  #include "zulgurub.h" +enum Yells +{ +    SAY_AGGRO           = 0, +    SAY_WAVE_OF_AGONY   = 1, // ID - 96457 Wave of Agony +    SAY_TRANSFROM_1     = 2, +    SAY_TRANSFROM_2     = 3, +    SAY_PLAYER_KILL     = 4, +    SAY_DEATH           = 5 +}; +  enum Spells  { -    SPELL_FROSTBREATH               = 16099, -    SPELL_MASSIVEGEYSER             = 22421, // Not working. (summon) -    SPELL_SLAM                      = 24326  };  enum Events  { -    EVENT_FROSTBREATH               = 1, -    EVENT_MASSIVEGEYSER             = 2, -    EVENT_SLAM                      = 3  }; -class boss_gahzranka : public CreatureScript // gahzranka +class boss_kilnara : public CreatureScript  {      public: -        boss_gahzranka() : CreatureScript("boss_gahzranka") { } +        boss_kilnara() : CreatureScript("boss_kilnara") { } -        struct boss_gahzrankaAI : public BossAI +        struct boss_kilnaraAI : public BossAI          { -            boss_gahzrankaAI(Creature* creature) : BossAI(creature, DATA_GAHZRANKA) { } +            boss_kilnaraAI(Creature* creature) : BossAI(creature, DATA_KILNARA) { }              void Reset() override              {                  _Reset();              } +            void EnterCombat(Unit* /*who*/) override +            { +                _EnterCombat(); +                Talk(SAY_AGGRO); +            } +              void JustDied(Unit* /*killer*/) override              {                  _JustDied(); +                Talk(SAY_DEATH);              } -            void EnterCombat(Unit* /*who*/) override +            void KilledUnit(Unit* victim) override              { -                _EnterCombat(); -                events.ScheduleEvent(EVENT_FROSTBREATH, 8000); -                events.ScheduleEvent(EVENT_MASSIVEGEYSER, 25000); -                events.ScheduleEvent(EVENT_SLAM, 17000); +                if (victim->GetTypeId() == TYPEID_PLAYER) +                    Talk(SAY_PLAYER_KILL);              }              void UpdateAI(uint32 diff) override @@ -77,27 +80,16 @@ class boss_gahzranka : public CreatureScript // gahzranka                  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();              } @@ -105,11 +97,11 @@ class boss_gahzranka : public CreatureScript // gahzranka          CreatureAI* GetAI(Creature* creature) const override          { -            return new boss_gahzrankaAI(creature); +            return GetZulGurubAI<boss_kilnaraAI>(creature);          }  }; -void AddSC_boss_gahzranka() +void AddSC_boss_kilnara()  { -    new boss_gahzranka(); +    new boss_kilnara();  } diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp index 6244d2b72b1..bb355be52a9 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp @@ -16,224 +16,216 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -/* ScriptData -SDName: Boss_Mandokir -SD%Complete: 90 -SDComment: Ohgan function needs improvements. -SDCategory: Zul'Gurub -EndScriptData */ -  #include "ScriptMgr.h"  #include "ScriptedCreature.h" -#include "Spell.h" -#include "SpellAuras.h"  #include "SpellScript.h" +#include "SpellAuraEffects.h" +#include "Player.h" +#include "GridNotifiers.h"  #include "zulgurub.h" -enum Says +enum Yells  { -    SAY_AGGRO                 = 0, -    SAY_DING_KILL             = 1, -    SAY_WATCH                 = 2, -    SAY_WATCH_WHISPER         = 3, -    SAY_OHGAN_DEAD            = 4, - -    SAY_GRATS_JINDO           = 0 +    SAY_AGGRO                   = 0, +    SAY_PLAYER_KILL             = 1, +    SAY_DISMOUNT_OHGAN          = 2, +    EMOTE_DEVASTATING_SLAM      = 3, +    SAY_REANIMATE_OHGAN         = 4, +    EMOTE_FRENZY                = 5, +    SAY_FRENZY                  = 6, +    SAY_DEATH                   = 7  };  enum Spells  { -    SPELL_CHARGE              = 24408, // seen -    SPELL_OVERPOWER           = 24407, // Seen -    SPELL_FEAR                = 29321, -    SPELL_WHIRLWIND           = 13736, // Triggers 15589 -    SPELL_MORTAL_STRIKE       = 16856, // Seen -    SPELL_FRENZY              = 24318, // seen -    SPELL_WATCH               = 24314, // seen 24315, 24316 -    SPELL_WATCH_CHARGE        = 24315, // Triggers 24316 -    SPELL_LEVEL_UP            = 24312  // +    // Bloodlord Mandokir +    SPELL_BLOODLORD_AURA            = 96480, +    SPELL_SUMMON_OHGAN              = 96717, +    SPELL_REANIMATE_OHGAN           = 96724, +    SPELL_DECAPITATE                = 96682, +    SPELL_BLOODLETTING              = 96776, +    SPELL_BLOODLETTING_DAMAGE       = 96777, +    SPELL_BLOODLETTING_HEAL         = 96778, +    SPELL_FRENZY                    = 96800, +    SPELL_LEVEL_UP                  = 96662, +    SPELL_DEVASTATING_SLAM          = 96740, +    SPELL_DEVASTATING_SLAM_TRIGGER  = 96761, +    SPELL_DEVASTATING_SLAM_DAMAGE   = 97385, +    SPELL_SPIRIT_VENGEANCE_CANCEL   = 96821, + +    // Chained Spirit +    SPELL_REVIVE                    = 96484, + +    // Ohgan +    SPELL_OHGAN_HEART_VISUAL        = 96727, +    SPELL_PERMANENT_FEIGN_DEATH     = 96733, +    SPELL_CLEAR_ALL                 = 28471, +    SPELL_OHGAN_ORDERS              = 96721, +    SPELL_OHGAN_ORDERS_TRIGGER      = 96722  };  enum Events  { -    EVENT_CHECK_SPEAKER       = 1, -    EVENT_CHECK_START         = 2, -    EVENT_STARTED             = 3, -    EVENT_OVERPOWER           = 4, -    EVENT_MORTAL_STRIKE       = 5, -    EVENT_WHIRLWIND           = 6, -    EVENT_CHECK_OHGAN         = 7, -    EVENT_WATCH_PLAYER        = 8, -    EVENT_CHARGE_PLAYER       = 9 +    // Bloodlord Mandokir +    EVENT_SUMMON_OHGAN              = 1, +    EVENT_DECAPITATE                = 2, +    EVENT_BLOODLETTING              = 3, +    EVENT_REANIMATE_OHGAN           = 4, +    EVENT_REANIMATE_OHGAN_COOLDOWN  = 5, +    EVENT_DEVASTATING_SLAM          = 6  }; -enum Misc +enum Action  { -    MODEL_OHGAN_MOUNT         = 15271, -    PATH_MANDOKIR             = 492861, -    POINT_MANDOKIR_END        = 24, -    CHAINED_SPIRT_COUNT       = 20 +    // Bloodlord Mandokir +    ACTION_OHGAN_IS_DEATH       = 1, +    ACTION_START_REVIVE         = 2, + +    // Chained Spirit +    ACTION_REVIVE               = 1  }; -Position const PosSummonChainedSpirits[CHAINED_SPIRT_COUNT] = +enum Misc  { -    { -12167.17f, -1979.330f, 133.0992f, 2.268928f }, -    { -12262.74f, -1953.394f, 133.5496f, 0.593412f }, -    { -12176.89f, -1983.068f, 133.7841f, 2.129302f }, -    { -12226.45f, -1977.933f, 132.7982f, 1.466077f }, -    { -12204.74f, -1890.431f, 135.7569f, 4.415683f }, -    { -12216.70f, -1891.806f, 136.3496f, 4.677482f }, -    { -12236.19f, -1892.034f, 134.1041f, 5.044002f }, -    { -12248.24f, -1893.424f, 134.1182f, 5.270895f }, -    { -12257.36f, -1897.663f, 133.1484f, 5.462881f }, -    { -12265.84f, -1903.077f, 133.1649f, 5.654867f }, -    { -12158.69f, -1972.707f, 133.8751f, 2.408554f }, -    { -12178.82f, -1891.974f, 134.1786f, 3.944444f }, -    { -12193.36f, -1890.039f, 135.1441f, 4.188790f }, -    { -12275.59f, -1932.845f, 134.9017f, 0.174533f }, -    { -12273.51f, -1941.539f, 136.1262f, 0.314159f }, -    { -12247.02f, -1963.497f, 133.9476f, 0.872665f }, -    { -12238.68f, -1969.574f, 133.6273f, 1.134464f }, -    { -12192.78f, -1982.116f, 132.6966f, 1.919862f }, -    { -12210.81f, -1979.316f, 133.8700f, 1.797689f }, -    { -12283.51f, -1924.839f, 133.5170f, 0.069813f } +    POINT_START_REVIVE          = 1, + +    DATA_OHGANOT_SO_FAST        = 5762, + +    FACTION_NONE                = 1665  }; -Position const PosMandokir[2] = +enum SummonGroups  { -    { -12167.8f, -1927.25f, 153.73f, 3.76991f }, -    { -12197.86f, -1949.392f, 130.2745f, 0.0f } +    SUMMON_GROUP_CHAINED_SPIRIT = 0  };  class boss_mandokir : public CreatureScript  {      public: +          boss_mandokir() : CreatureScript("boss_mandokir") { }          struct boss_mandokirAI : public BossAI          { -            boss_mandokirAI(Creature* creature) : BossAI(creature, DATA_MANDOKIR) -            { -                Initialize(); -                memset(chainedSpirtGUIDs, 0, sizeof(chainedSpirtGUIDs)); -            } - -            void Initialize() -            { -                killCount = 0; -            } +            boss_mandokirAI(Creature* creature) : BossAI(creature, DATA_MANDOKIR) { }              void Reset() override              { -                if (me->GetPositionZ() > 140.0f) -                { -                    _Reset(); -                    Initialize(); -                    me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); -                    events.ScheduleEvent(EVENT_CHECK_START, 1000); -                    if (Creature* speaker = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_VILEBRANCH_SPEAKER))) -                        if (!speaker->IsAlive()) -                            speaker->Respawn(true); -                } -                summons.DespawnAll(); -                me->Mount(MODEL_OHGAN_MOUNT); -            } +                DoCastAOE(SPELL_SPIRIT_VENGEANCE_CANCEL); -            void JustDied(Unit* /*killer*/) override -            { -                // 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(); +                _Reset(); + +                me->SummonCreatureGroup(SUMMON_GROUP_CHAINED_SPIRIT); +                _ohganotSoFast = true; +                _reanimateOhganCooldown = false; +                _reviveGUID = 0;              }              void EnterCombat(Unit* /*who*/) override              {                  _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) + +                DoCastAOE(SPELL_BLOODLORD_AURA); + +                if (!summons.empty())                  { -                    Creature* chainedSpirt = me->SummonCreature(NPC_CHAINED_SPIRT, PosSummonChainedSpirits[i], TEMPSUMMON_CORPSE_DESPAWN); -                    chainedSpirtGUIDs[i] = chainedSpirt->GetGUID(); +                    for (std::list<uint64>::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) +                    { +                        if (Creature* chainedSpirit = ObjectAccessor::GetCreature(*me, *itr)) +                            if (chainedSpirit->GetEntry() == NPC_CHAINED_SPIRIT && chainedSpirit->AI()) +                                chainedSpirit->setFaction(FACTION_NONE); +                    }                  } -                DoZoneInCombat(); + +                events.ScheduleEvent(EVENT_DECAPITATE, 10000); +                events.ScheduleEvent(EVENT_BLOODLETTING, 15000); +                events.ScheduleEvent(EVENT_SUMMON_OHGAN, 20000); +                events.ScheduleEvent(EVENT_DEVASTATING_SLAM, 25000);              } -            void KilledUnit(Unit* victim) override +            void JustDied(Unit* /*killer*/) override              { -                if (victim->GetTypeId() != TYPEID_PLAYER) -                    return; +                DoCastAOE(SPELL_SPIRIT_VENGEANCE_CANCEL); +                _JustDied(); +                Talk(SAY_DEATH); +            } -                if (++killCount == 3) +            void KilledUnit(Unit* victim) override +            { +                if (victim->GetTypeId() == TYPEID_PLAYER)                  { -                    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; +                    Talk(SAY_PLAYER_KILL); +                    DoCast(SPELL_LEVEL_UP); +                    _reviveGUID = victim->GetGUID(); +                    DoAction(ACTION_START_REVIVE);                  }              } -            void MovementInform(uint32 type, uint32 id) override +            void DamageTaken(Unit* /*attacker*/, uint32& damage) override              { -                if (type == WAYPOINT_MOTION_TYPE) +                if (me->HealthBelowPctDamaged(20, damage) && !me->HasAura(SPELL_FRENZY))                  { -                    me->SetWalk(false); -                    if (id == POINT_MANDOKIR_END) -                    { -                        me->SetHomePosition(PosMandokir[0]); -                        instance->SetBossState(DATA_MANDOKIR, NOT_STARTED); -                        me->DespawnOrUnsummon(6000); // No idea how to respawn on wipe. -                    } +                    DoCast(me, SPELL_FRENZY, true); +                    Talk(SAY_FRENZY); +                    Talk(EMOTE_FRENZY);                  }              } -            void UpdateAI(uint32 diff) override +            void DoAction(int32 action) override              { -                events.Update(diff); - -                if (!UpdateVictim()) +                switch (action)                  { -                    if (instance->GetBossState(DATA_MANDOKIR) == NOT_STARTED || instance->GetBossState(DATA_MANDOKIR) == SPECIAL) +                    case ACTION_OHGAN_IS_DEATH: +                        events.ScheduleEvent(EVENT_REANIMATE_OHGAN, 4000); +                        _ohganotSoFast = false; +                        break; +                    case ACTION_START_REVIVE:                      { -                        while (uint32 eventId = events.ExecuteEvent()) +                        std::list<Creature*> creatures; +                        GetCreatureListWithEntryInGrid(creatures, me, NPC_CHAINED_SPIRIT, 200.0f); +                        creatures.remove_if(Trinity::AnyDeadUnitCheck()); +                        creatures.remove_if(Trinity::UnitAuraCheck(true, SPELL_OHGAN_ORDERS_TRIGGER)); +                        Trinity::Containers::RandomResizeList(creatures, 1); +                        if (creatures.empty()) +                            return; + +                        for (std::list<Creature*>::iterator itr = creatures.begin(); itr != creatures.end(); ++itr)                          { -                            switch (eventId) +                            if (Creature* chainedSpirit = ObjectAccessor::GetCreature(*me, (*itr)->GetGUID()))                              { -                                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); -                                    me->GetMotionMaster()->MovePath(PATH_MANDOKIR, false); -                                    break; -                                default: -                                    break; +                                chainedSpirit->AI()->SetGUID(_reviveGUID); +                                chainedSpirit->AI()->DoAction(ACTION_REVIVE); +                                _reviveGUID = 0;                              }                          } +                        break;                      } -                    return; +                    default: +                        break; +                  } +            } + +            uint32 GetData(uint32 type) const override +            { +                if (type == DATA_OHGANOT_SO_FAST) +                    return _ohganotSoFast; + +                return 0; +            } + +            void SetGUID(uint64 guid, int32 /*type = 0 */) override +            { +                _reviveGUID = guid; +            } + +            void UpdateAI(uint32 diff) override +            { +                if (!UpdateVictim()) +                    return; + +                events.Update(diff);                  if (me->HasUnitState(UNIT_STATE_CASTING))                      return; @@ -242,39 +234,40 @@ class boss_mandokir : public CreatureScript                  {                      switch (eventId)                      { -                        case EVENT_OVERPOWER: -                            DoCastVictim(SPELL_OVERPOWER, true); -                            events.ScheduleEvent(EVENT_OVERPOWER, urand(6000, 12000)); +                        case EVENT_SUMMON_OHGAN: +                            me->SetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID, 0); +                            DoCast(me, SPELL_SUMMON_OHGAN, true);                              break; -                        case EVENT_MORTAL_STRIKE: -                            if (me->GetVictim() && me->EnsureVictim()->HealthBelowPct(50)) -                                DoCastVictim(SPELL_MORTAL_STRIKE, true); -                            events.ScheduleEvent(EVENT_MORTAL_STRIKE, urand(12000, 18000)); +                        case EVENT_DECAPITATE: +                            DoCastAOE(SPELL_DECAPITATE); +                            events.ScheduleEvent(EVENT_DECAPITATE, me->HasAura(SPELL_FRENZY) ? 17500 : 35000);                              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) +                        case EVENT_BLOODLETTING: +                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true))                              { -                                DoCast(me, SPELL_FRENZY); -                                Talk(SAY_OHGAN_DEAD); +                                DoCast(target, SPELL_BLOODLETTING, true); +                                me->ClearUnitState(UNIT_STATE_CASTING);                              } -                            else -                                events.ScheduleEvent(EVENT_CHECK_OHGAN, 1000); +                            events.ScheduleEvent(EVENT_BLOODLETTING, 25000);                              break; -                        case EVENT_WATCH_PLAYER: -                            if (Unit* player = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) +                        case EVENT_REANIMATE_OHGAN: +                            if (_reanimateOhganCooldown) +                                events.ScheduleEvent(EVENT_REANIMATE_OHGAN, 1000); +                            else                              { -                                DoCast(player, SPELL_WATCH); -                                Talk(SAY_WATCH, player); +                                DoCastAOE(SPELL_REANIMATE_OHGAN); +                                Talk(SAY_REANIMATE_OHGAN); +                                // Cooldown +                                _reanimateOhganCooldown = true; +                                events.ScheduleEvent(EVENT_REANIMATE_OHGAN_COOLDOWN, 20000);                              } -                            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)); +                        case EVENT_REANIMATE_OHGAN_COOLDOWN: +                            _reanimateOhganCooldown = false; +                            break; +                        case EVENT_DEVASTATING_SLAM: +                            DoCastAOE(SPELL_DEVASTATING_SLAM_TRIGGER); +                            events.ScheduleEvent(EVENT_DEVASTATING_SLAM, 30000);                              break;                          default:                              break; @@ -285,8 +278,9 @@ class boss_mandokir : public CreatureScript              }          private: -            uint8 killCount; -            uint64 chainedSpirtGUIDs[CHAINED_SPIRT_COUNT]; +            bool _ohganotSoFast; +            bool _reanimateOhganCooldown; +            uint64 _reviveGUID;          };          CreatureAI* GetAI(Creature* creature) const override @@ -295,13 +289,6 @@ class boss_mandokir : public CreatureScript          }  }; -// Ohgan - -enum OhganSpells -{ -    SPELL_SUNDERARMOR         = 24317 -}; -  class npc_ohgan : public CreatureScript  {      public: @@ -309,156 +296,481 @@ class npc_ohgan : public CreatureScript          struct npc_ohganAI : public ScriptedAI          { -            npc_ohganAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) +            npc_ohganAI(Creature* creature) : ScriptedAI(creature) +            { +                _instance = me->GetInstanceScript(); +            } + +            void EnterCombat(Unit* /*who*/) override              { -                Initialize(); +                DoCastAOE(SPELL_OHGAN_ORDERS, true);              } -            void Initialize() +            void DamageTaken(Unit* /*attacker*/, uint32& damage) override              { -                SunderArmor_Timer = 5000; +                if (damage >= me->GetHealth()) +                { +                    damage = 0; +                    me->AttackStop(); +                    me->SetHealth(0); +                    me->SetTarget(0); +                    DoCast(me, SPELL_CLEAR_ALL, true); +                    DoCast(me, SPELL_PERMANENT_FEIGN_DEATH); + +                    if (Creature* mandokir = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_MANDOKIR))) +                        mandokir->AI()->DoAction(ACTION_OHGAN_IS_DEATH); +                } +            } + +            void KilledUnit(Unit* victim) override +            { +                if (Creature* creature = victim->ToCreature()) +                { +                    if (creature->GetEntry() == NPC_CHAINED_SPIRIT) +                        DoCastAOE(SPELL_OHGAN_ORDERS, true); +                } +            } + +            void UpdateAI(uint32 /*diff*/) override +            { +                if (!UpdateVictim()) +                    return; + +                DoMeleeAttackIfReady(); +            } + +        private: +            InstanceScript* _instance; +        }; + +        CreatureAI* GetAI(Creature* creature) const override +        { +            return GetZulGurubAI<npc_ohganAI>(creature); +        } +}; + +class npc_chained_spirit : public CreatureScript +{ +    public: +        npc_chained_spirit() : CreatureScript("npc_chained_spirit") { } + +        struct npc_chained_spiritAI : public ScriptedAI +        { +            npc_chained_spiritAI(Creature* creature) : ScriptedAI(creature) +            { +                _instance = me->GetInstanceScript(); +                me->AddUnitMovementFlag(MOVEMENTFLAG_HOVER); +                me->SetReactState(REACT_PASSIVE); // correct?              }              void Reset() override              { -                Initialize(); +                _revivePlayerGUID = 0;              } -            void EnterCombat(Unit* /*who*/) override { } +            void SetGUID(uint64 guid, int32 /*type = 0 */) override +            { +                _revivePlayerGUID = guid; +            } -            void JustDied(Unit* /*killer*/) override +            void DoAction(int32 action) override              { -                instance->SetBossState(DATA_OHGAN, DONE); +                if (action == ACTION_REVIVE) +                { +                    Position pos; +                    if (Player* target = ObjectAccessor::GetPlayer(*me, _revivePlayerGUID)) +                    { +                        target->GetNearPoint(me, pos.m_positionX, pos.m_positionY, pos.m_positionZ, 0.0f, 5.0f, target->GetAngle(me)); +                        me->GetMotionMaster()->MovePoint(POINT_START_REVIVE, pos); +                    } +                }              } -            void UpdateAI(uint32 diff) override +            void MovementInform(uint32 type, uint32 pointId) override              { -                // Return since we have no target -                if (!UpdateVictim()) +                if (type != POINT_MOTION_TYPE || !_revivePlayerGUID)                      return; -                if (SunderArmor_Timer <= diff) +                if (pointId == POINT_START_REVIVE)                  { -                    DoCastVictim(SPELL_SUNDERARMOR, true); -                    SunderArmor_Timer = urand(10000, 15000); -                } else SunderArmor_Timer -= diff; +                    if (Player* target = ObjectAccessor::GetPlayer(*me, _revivePlayerGUID)) +                        DoCast(target, SPELL_REVIVE); -                DoMeleeAttackIfReady(); +                    me->DespawnOrUnsummon(2000); +                } +            } + +            void JustDied(Unit* /*killer*/) override +            { +                Player* target = ObjectAccessor::GetPlayer(*me, _revivePlayerGUID); +                if (!target || target->IsAlive()) +                    return; + +                if (Creature* mandokir = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_MANDOKIR))) +                { +                    mandokir->GetAI()->SetGUID(target->GetGUID()); +                    mandokir->GetAI()->DoAction(ACTION_START_REVIVE); +                } + +                me->DespawnOrUnsummon();              } +            void UpdateAI(uint32 /*diff*/) override { } +          private: -            uint32 SunderArmor_Timer; -            InstanceScript* instance; +            InstanceScript* _instance; +            uint64 _revivePlayerGUID;          };          CreatureAI* GetAI(Creature* creature) const override          { -            return GetZulGurubAI<npc_ohganAI>(creature); +            return GetZulGurubAI<npc_chained_spiritAI>(creature);          }  }; -enum VilebranchSpells +class spell_mandokir_decapitate : public SpellScriptLoader  { -    SPELL_DEMORALIZING_SHOUT  = 13730, -    SPELL_CLEAVE              = 15284 +    public: +        spell_mandokir_decapitate() : SpellScriptLoader("spell_mandokir_decapitate") { } + +        class spell_mandokir_decapitate_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_mandokir_decapitate_SpellScript); + +            void FilterTargets(std::list<WorldObject*>& targets) +            { +                if (targets.empty()) +                    return; + +                WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets); +                targets.clear(); +                targets.push_back(target); +            } + +            void HandleScript(SpellEffIndex /*effIndex*/) +            { +                Unit* caster = GetCaster(); +                if (Player* target = GetHitPlayer()) +                    caster->CastSpell(target, uint32(GetEffectValue()), true); +            } + +            void Register() override +            { +                OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mandokir_decapitate_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); +                OnEffectHitTarget += SpellEffectFn(spell_mandokir_decapitate_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); +            } +        }; + +        SpellScript* GetSpellScript() const override +        { +            return new spell_mandokir_decapitate_SpellScript(); +        }  }; -class npc_vilebranch_speaker : public CreatureScript +class spell_mandokir_bloodletting : public SpellScriptLoader  {      public: -        npc_vilebranch_speaker() : CreatureScript("npc_vilebranch_speaker") { } +        spell_mandokir_bloodletting() : SpellScriptLoader("spell_mandokir_bloodletting") { } -        struct npc_vilebranch_speakerAI : public ScriptedAI +        class spell_mandokir_bloodletting_AuraScript : public AuraScript          { -            npc_vilebranch_speakerAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) +            PrepareAuraScript(spell_mandokir_bloodletting_AuraScript); + +            bool Validate(SpellInfo const* /*spell*/) override              { -                Initialize(); +                if (!sSpellMgr->GetSpellInfo(SPELL_BLOODLETTING_DAMAGE)) +                    return false; +                if (!sSpellMgr->GetSpellInfo(SPELL_BLOODLETTING_HEAL)) +                    return false; +                return true;              } -            void Initialize() +            void HandleEffectPeriodic(AuraEffect const* aurEff)              { -                demoralizing_Shout_Timer = urand(2000, 4000); -                cleave_Timer = urand(5000, 8000); +                Unit* target = GetTarget(); +                Unit* caster = GetCaster(); +                if (!caster) +                    return; + +                int32 damage = std::max<int32>(7500, target->CountPctFromCurHealth(aurEff->GetAmount())); + +                caster->CastCustomSpell(target, SPELL_BLOODLETTING_DAMAGE, &damage, 0, 0, true); +                target->CastCustomSpell(caster, SPELL_BLOODLETTING_HEAL, &damage, 0, 0, true);              } -            void Reset() override +            void Register() override              { -                Initialize(); +                OnEffectPeriodic += AuraEffectPeriodicFn(spell_mandokir_bloodletting_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);              } +        }; -            void EnterCombat(Unit* /*who*/) override { } +        AuraScript* GetAuraScript() const override +        { +            return new spell_mandokir_bloodletting_AuraScript(); +        } +}; -            void JustDied(Unit* /*killer*/) override +class spell_mandokir_spirit_vengeance_cancel : public SpellScriptLoader +{ +    public: +        spell_mandokir_spirit_vengeance_cancel() : SpellScriptLoader("spell_mandokir_spirit_vengeance_cancel") { } + +        class spell_mandokir_spirit_vengeance_cancel_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_mandokir_spirit_vengeance_cancel_SpellScript); + +            void HandleScript(SpellEffIndex /*effIndex*/)              { -                instance->SetBossState(DATA_MANDOKIR, SPECIAL); +                if (Player* target = GetHitPlayer()) +                    target->RemoveAura(uint32(GetEffectValue()));              } -            void UpdateAI(uint32 diff) override +            void Register() override              { -                // Return since we have no target -                if (!UpdateVictim()) +                OnEffectHitTarget += SpellEffectFn(spell_mandokir_spirit_vengeance_cancel_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); +                OnEffectHitTarget += SpellEffectFn(spell_mandokir_spirit_vengeance_cancel_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_DUMMY); +            } +        }; + +        SpellScript* GetSpellScript() const override +        { +            return new spell_mandokir_spirit_vengeance_cancel_SpellScript(); +        } +}; + +class DevastatingSlamTargetSelector : public std::unary_function<Unit *, bool> +{ +    public: +        DevastatingSlamTargetSelector(Creature* me, const Unit* victim) : _me(me), _victim(victim) {} + +        bool operator() (WorldObject* target) +        { +            if (target == _victim && _me->getThreatManager().getThreatList().size() > 1) +                return true; + +            if (target->GetTypeId() != TYPEID_PLAYER) +                return true; + +            return false; +        } + +        Creature* _me; +        Unit const* _victim; +}; + +class spell_mandokir_devastating_slam : public SpellScriptLoader +{ +    public: +        spell_mandokir_devastating_slam() : SpellScriptLoader("spell_mandokir_devastating_slam") { } + +        class spell_mandokir_devastating_slam_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_mandokir_devastating_slam_SpellScript); + +            void FilterTargets(std::list<WorldObject*>& targets) +            { +                targets.remove_if(DevastatingSlamTargetSelector(GetCaster()->ToCreature(), GetCaster()->GetVictim())); +                if (targets.empty())                      return; -                if (demoralizing_Shout_Timer <= diff) -                { -                    DoCast(me, SPELL_DEMORALIZING_SHOUT); -                    demoralizing_Shout_Timer = urand(22000, 30000); -                } else demoralizing_Shout_Timer -= diff; +                WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets); +                targets.clear(); +                targets.push_back(target); +            } + +            void HandleScript(SpellEffIndex /*effIndex*/) +            { +                Unit* caster = GetCaster(); +                float angle = 0.0f; +                float x, y, z; -                if (cleave_Timer <= diff) +                if (Player* target = GetHitPlayer())                  { -                    DoCastVictim(SPELL_CLEAVE, true); -                    cleave_Timer = urand(6000, 9000); -                } else cleave_Timer -= diff; +                    caster->AttackStop(); +                    caster->SetOrientation(caster->GetAngle(target)); +                    caster->SetFacingTo(caster->GetAngle(target)); -                DoMeleeAttackIfReady(); +                    caster->CastSpell(caster, SPELL_DEVASTATING_SLAM, false); + +                    // HACK: Need better way for pos calculation +                    for (uint8 i = 0; i <= 50; ++i) +                    { +                        angle = float(rand_norm()) * static_cast<float>(M_PI * 35.0f / 180.0f) - static_cast<float>(M_PI * 17.5f / 180.0f); +                        caster->GetClosePoint(x, y, z, 4.0f, frand(-2.5f, 50.0f), angle); + +                        caster->CastSpell(x, y, z, SPELL_DEVASTATING_SLAM_DAMAGE, true); +                    } +                }              } -        private: -            uint32 demoralizing_Shout_Timer; -            uint32 cleave_Timer; -            InstanceScript* instance; +            void Register() override +            { +                OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mandokir_devastating_slam_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); +                OnEffectHitTarget += SpellEffectFn(spell_mandokir_devastating_slam_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_FORCE_CAST); +            }          }; -        CreatureAI* GetAI(Creature* creature) const override +        SpellScript* GetSpellScript() const override          { -            return GetInstanceAI<npc_vilebranch_speakerAI>(creature); +            return new spell_mandokir_devastating_slam_SpellScript();          }  }; -class spell_threatening_gaze : public SpellScriptLoader +class spell_mandokir_ohgan_orders : public SpellScriptLoader  {      public: -        spell_threatening_gaze() : SpellScriptLoader("spell_threatening_gaze") { } +        spell_mandokir_ohgan_orders() : SpellScriptLoader("spell_mandokir_ohgan_orders") { } -        class spell_threatening_gaze_AuraScript : public AuraScript +        class spell_mandokir_ohgan_orders_SpellScript : public SpellScript          { -            PrepareAuraScript(spell_threatening_gaze_AuraScript); +            PrepareSpellScript(spell_mandokir_ohgan_orders_SpellScript); -            void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) +            void FilterTargets(std::list<WorldObject*>& targets)              { +                if (targets.empty()) +                    return; + +                WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets); +                targets.clear(); +                targets.push_back(target); +            } + +            void HandleScript(SpellEffIndex /*effIndex*/) +            { +                Unit* caster = GetCaster(); +                if (Unit* target = GetHitUnit()) +                    caster->CastSpell(target, uint32(GetEffectValue()), true); +            } + +            void Register() override +            { +                OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mandokir_ohgan_orders_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); +                OnEffectHitTarget += SpellEffectFn(spell_mandokir_ohgan_orders_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); +            } +        }; + +        SpellScript* GetSpellScript() const override +        { +            return new spell_mandokir_ohgan_orders_SpellScript(); +        } +}; + +class spell_mandokir_ohgan_orders_trigger : public SpellScriptLoader +{ +    public: +        spell_mandokir_ohgan_orders_trigger() : SpellScriptLoader("spell_mandokir_ohgan_orders_trigger") { } + +        class spell_mandokir_ohgan_orders_trigger_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_mandokir_ohgan_orders_trigger_AuraScript); + +            void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) +            { +                Unit* target = GetTarget();                  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); +                { +                    // HACK: research better way +                    caster->ClearUnitState(UNIT_STATE_CASTING); +                    caster->GetMotionMaster()->Clear(); +                    caster->DeleteThreatList(); +                    caster->AddThreat(target, 50000000.0f); +                    caster->TauntApply(target); +                }              }              void Register() override              { -                OnEffectRemove += AuraEffectRemoveFn(spell_threatening_gaze_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); +                AfterEffectApply += AuraEffectApplyFn(spell_mandokir_ohgan_orders_trigger_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);              }          };          AuraScript* GetAuraScript() const override          { -            return new spell_threatening_gaze_AuraScript(); +            return new spell_mandokir_ohgan_orders_trigger_AuraScript(); +        } +}; + +class spell_mandokir_reanimate_ohgan : public SpellScriptLoader +{ +    public: +        spell_mandokir_reanimate_ohgan() : SpellScriptLoader("spell_mandokir_reanimate_ohgan") { } + +        class spell_mandokir_reanimate_ohgan_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_mandokir_reanimate_ohgan_SpellScript); + +            void HandleScript(SpellEffIndex /*effIndex*/) +            { +                if (Unit* target = GetHitUnit()) +                { +                    target->RemoveAura(SPELL_PERMANENT_FEIGN_DEATH); +                    target->CastSpell(target, SPELL_OHGAN_HEART_VISUAL, true); +                    target->CastSpell((Unit*)NULL, SPELL_OHGAN_ORDERS, true); +                } +            } + +            void Register() override +            { +                OnEffectHitTarget += SpellEffectFn(spell_mandokir_reanimate_ohgan_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); +            } +        }; + +        SpellScript* GetSpellScript() const override +        { +            return new spell_mandokir_reanimate_ohgan_SpellScript(); +        } +}; + +class spell_clear_all : public SpellScriptLoader +{ +    public: +        spell_clear_all() : SpellScriptLoader("spell_clear_all") { } + +        class spell_clear_all_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_clear_all_SpellScript); + +            void HandleScript(SpellEffIndex /*effIndex*/) +            { +                Unit* caster = GetCaster(); +                caster->RemoveAllAurasOnDeath(); +            } + +            void Register() override +            { +                OnEffectHitTarget += SpellEffectFn(spell_clear_all_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); +            } +        }; + +        SpellScript* GetSpellScript() const override +        { +            return new spell_clear_all_SpellScript();          }  }; +class achievement_ohganot_so_fast : public AchievementCriteriaScript +{ +   public: +       achievement_ohganot_so_fast() : AchievementCriteriaScript("achievement_ohganot_so_fast") { } + +       bool OnCheck(Player* /*player*/, Unit* target) +       { +           return target && target->GetAI()->GetData(DATA_OHGANOT_SO_FAST); +       } +}; +  void AddSC_boss_mandokir()  {      new boss_mandokir();      new npc_ohgan(); -    new npc_vilebranch_speaker(); -    new spell_threatening_gaze(); +    new npc_chained_spirit(); +    new spell_mandokir_decapitate(); +    new spell_mandokir_bloodletting(); +    new spell_mandokir_spirit_vengeance_cancel(); +    new spell_mandokir_devastating_slam(); +    new spell_mandokir_ohgan_orders(); +    new spell_mandokir_ohgan_orders_trigger(); +    new spell_mandokir_reanimate_ohgan(); +    new spell_clear_all(); +    new achievement_ohganot_so_fast();  } diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp deleted file mode 100644 index 8020bced16b..00000000000 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp +++ /dev/null @@ -1,266 +0,0 @@ -/* - * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -/* ScriptData -SDName: Boss_Marli -SD%Complete: 80 -SDComment: Charging healers and casters not working. Perhaps wrong Spell Timers. -SDCategory: Zul'Gurub -EndScriptData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "zulgurub.h" - -enum Says -{ -    SAY_AGGRO                 = 0, -    SAY_TRANSFORM             = 1, -    SAY_SPIDER_SPAWN          = 2, -    SAY_DEATH                 = 3 -}; - -enum Spells -{ -    SPELL_CHARGE              = 22911, -    SPELL_ASPECT_OF_MARLI     = 24686, // A stun spell -    SPELL_ENVOLWINGWEB        = 24110, -    SPELL_POISON_VOLLEY       = 24099, -    SPELL_SPIDER_FORM         = 24084, -    // The Spider Spell -    SPELL_LEVELUP             = 24312  // Not right Spell. -}; - -enum Events -{ -    EVENT_SPAWN_START_SPIDERS = 1, // Phase 1 -    EVENT_POISON_VOLLEY       = 2, // Phase All -    EVENT_SPAWN_SPIDER        = 3, // Phase All -    EVENT_CHARGE_PLAYER       = 4, // Phase 3 -    EVENT_ASPECT_OF_MARLI     = 5, // Phase 2 -    EVENT_TRANSFORM           = 6, // Phase 2 -    EVENT_TRANSFORM_BACK      = 7  // Phase 3 -}; - -enum Phases -{ -    PHASE_ONE                 = 1, -    PHASE_TWO                 = 2, -    PHASE_THREE               = 3 -}; - -enum Misc -{ -    NPC_SPIDER                = 15041 -}; - -class boss_marli : public CreatureScript -{ -    public: boss_marli() : CreatureScript("boss_marli") { } - -        struct boss_marliAI : public BossAI -        { -            boss_marliAI(Creature* creature) : BossAI(creature, DATA_MARLI) { } - -            void Reset() override -            { -                if (events.IsInPhase(PHASE_THREE)) -                    me->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, 35.0f, false); // hack -                _Reset(); -            } - -            void JustDied(Unit* /*killer*/) override -            { -                _JustDied(); -                Talk(SAY_DEATH); -            } - -            void EnterCombat(Unit* /*who*/) override -            { -                _EnterCombat(); -                events.ScheduleEvent(EVENT_SPAWN_START_SPIDERS, 1000, 0, PHASE_ONE); -                Talk(SAY_AGGRO); -            } - -            void UpdateAI(uint32 diff) override -            { -                if (!UpdateVictim()) -                    return; - -                events.Update(diff); - -                if (me->HasUnitState(UNIT_STATE_CASTING)) -                    return; - -                while (uint32 eventId = events.ExecuteEvent()) -                { -                    switch (eventId) -                    { -                        case EVENT_SPAWN_START_SPIDERS: -                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) -                            { -                                Talk(SAY_SPIDER_SPAWN); -                                for (uint8 i = 0; i < 4; ++i) -                                    if (Creature* spider = me->SummonCreature(NPC_SPIDER, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000)) -                                        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)) -                                if (Creature* spider = me->SummonCreature(NPC_SPIDER, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000)) -                                    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 -                            /* -                            CreatureTemplate const* cinfo = me->GetCreatureTemplate(); -                            me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 35))); -                            me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 35))); -                            me->UpdateDamagePhysical(BASE_ATTACK); -                            */ -                            me->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, 35.0f, true); // hack -                            DoCastVictim(SPELL_ENVOLWINGWEB); -                            if (DoGetThreat(me->GetVictim())) -                                DoModifyThreatPercent(me->GetVictim(), -100); -                            events.ScheduleEvent(EVENT_CHARGE_PLAYER, 1500, 0, PHASE_THREE); -                            events.ScheduleEvent(EVENT_TRANSFORM_BACK, 25000, 0, PHASE_THREE); -                            events.SetPhase(PHASE_THREE); -                            break; -                        } -                        case EVENT_CHARGE_PLAYER: -                        { -                            Unit* target = NULL; -                            int i = 0; -                            while (i++ < 3) // max 3 tries to get a random target with power_mana -                            { -                                target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true);  // not aggro leader -                                if (target && target->getPowerType() == POWER_MANA) -                                    break; -                            } -                            if (target) -                            { -                                DoCast(target, SPELL_CHARGE); -                                AttackStart(target); -                            } -                            events.ScheduleEvent(EVENT_CHARGE_PLAYER, 8000, 0, PHASE_THREE); -                            break; -                        } -                        case EVENT_TRANSFORM_BACK: -                        { -                            me->RemoveAura(SPELL_SPIDER_FORM); -                            /* -                            CreatureTemplate const* cinfo = me->GetCreatureTemplate(); -                            me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 1))); -                            me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 1))); -                            me->UpdateDamagePhysical(BASE_ATTACK); -                            */ -                            me->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, 35.0f, false); // hack -                            events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 12000, 0, PHASE_TWO); -                            events.ScheduleEvent(EVENT_TRANSFORM, 45000, 0, PHASE_TWO); -                            events.ScheduleEvent(EVENT_POISON_VOLLEY, 15000); -                            events.ScheduleEvent(EVENT_SPAWN_SPIDER, 30000); -                            events.ScheduleEvent(EVENT_TRANSFORM, urand(35000, 60000), 0, PHASE_TWO); -                            events.SetPhase(PHASE_TWO); -                            break; -                        } -                        default: -                            break; -                    } -                } - -                DoMeleeAttackIfReady(); -            } -        }; - -        CreatureAI* GetAI(Creature* creature) const override -        { -            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") { } - -        struct npc_spawn_of_marliAI : public ScriptedAI -        { -            npc_spawn_of_marliAI(Creature* creature) : ScriptedAI(creature) -            { -                Initialize(); -            } - -            void Initialize() -            { -                LevelUp_Timer = 3000; -            } - -            uint32 LevelUp_Timer; - -            void Reset() override -            { -                Initialize(); -            } - -            void EnterCombat(Unit* /*who*/) override { } - -            void UpdateAI(uint32 diff) override -            { -                //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 override -        { -            return new npc_spawn_of_marliAI(creature); -        } -}; - -void AddSC_boss_marli() -{ -    new boss_marli(); -    new npc_spawn_of_marli(); -} diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp index 4f907098ff4..66955db8163 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp @@ -16,26 +16,21 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -/* ScriptData -SDName: Boss_Renataki -SD%Complete: 100 -SDComment: -SDCategory: Zul'Gurub -EndScriptData */ - +#include "ObjectMgr.h"  #include "ScriptMgr.h"  #include "ScriptedCreature.h"  #include "zulgurub.h" +enum Yells +{ +}; +  enum Spells  { -    SPELL_AMBUSH                = 34794, -    SPELL_THOUSANDBLADES        = 34799  }; -enum Misc +enum Events  { -    EQUIP_ID_MAIN_HAND          = 0  //was item display id 31818, but this id does not exist  };  class boss_renataki : public CreatureScript @@ -45,46 +40,20 @@ class boss_renataki : public CreatureScript          struct boss_renatakiAI : public BossAI          { -            boss_renatakiAI(Creature* creature) : BossAI(creature, DATA_EDGE_OF_MADNESS) +            boss_renatakiAI(Creature* creature) : BossAI(creature, DATA_RENATAKI)              { -                Initialize();              } -            void Initialize() -            { -                Invisible_Timer = urand(8000, 18000); -                Ambush_Timer = 3000; -                Visible_Timer = 4000; -                Aggro_Timer = urand(15000, 25000); -                ThousandBlades_Timer = urand(4000, 8000); - -                Invisible = false; -                Ambushed = false; -            } - -            uint32 Invisible_Timer; -            uint32 Ambush_Timer; -            uint32 Visible_Timer; -            uint32 Aggro_Timer; -            uint32 ThousandBlades_Timer; - -            bool Invisible; -            bool Ambushed; -              void Reset() override              { -                _Reset(); -                Initialize();              } -            void JustDied(Unit* /*killer*/) override +            void EnterCombat(Unit* /*who*/) override              { -                _JustDied();              } -            void EnterCombat(Unit* /*who*/) override +            void JustDied(Unit* /*killer*/) override              { -                _EnterCombat();              }              void UpdateAI(uint32 diff) override @@ -92,72 +61,20 @@ class boss_renataki : public CreatureScript                  if (!UpdateVictim())                      return; -                //Invisible_Timer -                if (Invisible_Timer <= diff) -                { -                    me->InterruptSpell(CURRENT_GENERIC_SPELL); - -                    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; +                events.Update(diff); -                if (Invisible) -                { -                    if (Ambush_Timer <= diff) -                    { -                        if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) -                        { -                            DoTeleportTo(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ()); -                            DoCast(target, SPELL_AMBUSH); -                        } - -                        Ambushed = true; -                        Ambush_Timer = 3000; -                    } else Ambush_Timer -= diff; -                } - -                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 (me->HasUnitState(UNIT_STATE_CASTING)) +                    return; +                /* +                while (uint32 eventId = events.ExecuteEvent())                  { -                    if (Aggro_Timer <= diff) +                    switch (eventId)                      { -                        if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) -                        { -                            if (DoGetThreat(me->GetVictim())) -                                DoModifyThreatPercent(me->GetVictim(), -50); -                            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; +                        default: +                            break; +                    }                  } +                */                  DoMeleeAttackIfReady();              } @@ -173,4 +90,3 @@ void AddSC_boss_renataki()  {      new boss_renataki();  } - diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp deleted file mode 100644 index 57a286c1e58..00000000000 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp +++ /dev/null @@ -1,574 +0,0 @@ -/* - * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -/* ScriptData -SDName: Boss_Thekal -SD%Complete: 95 -SDComment: Almost finished. -SDCategory: Zul'Gurub -EndScriptData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "zulgurub.h" - -enum Says -{ -    SAY_AGGRO                 = 0, -    SAY_DEATH                 = 1 -}; - -enum Spells -{ -    SPELL_MORTALCLEAVE        = 22859, // Phase 1 -    SPELL_SILENCE             = 22666, // Phase 1 -    SPELL_TIGER_FORM          = 24169, // Phase 1 -    SPELL_RESURRECT           = 24173, // Phase 1    // Not used in script. -    SPELL_FRENZY              = 8269,  // Phase 2 -    SPELL_FORCEPUNCH          = 24189, // Phase 2 -    SPELL_CHARGE              = 24193, // Phase 2 -    SPELL_ENRAGE              = 8269,  // Phase 2 -    SPELL_SUMMONTIGERS        = 24183, // Phase 2 -    // Zealot Lor'Khan Spells -    SPELL_SHIELD              = 20545, -    SPELL_BLOODLUST           = 24185, -    SPELL_GREATERHEAL         = 24208, -    SPELL_DISARM              = 6713, -    // Zealot Zath Spells -    SPELL_SWEEPINGSTRIKES     = 18765, -    SPELL_SINISTERSTRIKE      = 15581, -    SPELL_GOUGE               = 12540, -    SPELL_KICK                = 15614, -    SPELL_BLIND               = 21060 -}; - -enum Events -{ -    EVENT_MORTALCLEAVE        = 1, // Phase 1 -    EVENT_SILENCE             = 2, // Phase 1 -    EVENT_CHECK_TIMER         = 3, // Phase 1 -    EVENT_RESURRECT_TIMER     = 4, // Phase 1 -    EVENT_FRENZY              = 5, // Phase 2 -    EVENT_FORCEPUNCH          = 6, // Phase 2 -    EVENT_SPELL_CHARGE        = 7, // Phase 2 -    EVENT_ENRAGE              = 8, // Phase 2 -    EVENT_SUMMONTIGERS        = 9  // Phase 2 -}; - -enum Phases -{ -    PHASE_ONE                 = 1, -    PHASE_TWO                 = 2 -}; - -class boss_thekal : public CreatureScript -{ -    public: -        boss_thekal() : CreatureScript("boss_thekal") { } - -        struct boss_thekalAI : public BossAI -        { -            boss_thekalAI(Creature* creature) : BossAI(creature, DATA_THEKAL) -            { -                Initialize(); -            } - -            void Initialize() -            { -                Enraged = false; -                WasDead = false; -            } - -            bool Enraged; -            bool WasDead; - -            void Reset() override -            { -                if (events.IsInPhase(PHASE_TWO)) -                    me->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, 35.0f, false); // hack -                _Reset(); -                Initialize(); -            } - -            void JustDied(Unit* /*killer*/) override -            { -                _JustDied(); -                Talk(SAY_DEATH); -            } - -            void EnterCombat(Unit* /*who*/) override -            { -                _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() override -            { -                instance->SetBossState(DATA_THEKAL, NOT_STARTED); -            } - -            void UpdateAI(uint32 diff) override -            { -                if (!UpdateVictim()) -                    return; - -                events.Update(diff); - -                if (me->HasUnitState(UNIT_STATE_CASTING)) -                    return; - -                while (uint32 eventId = events.ExecuteEvent()) -                { -                    switch (eventId) -                    { -                        case EVENT_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 override -        { -            return GetInstanceAI<boss_thekalAI>(creature); -        } -}; - -//Zealot Lor'Khan -class npc_zealot_lorkhan : public CreatureScript -{ -    public: npc_zealot_lorkhan() : CreatureScript("npc_zealot_lorkhan") { } - -        struct npc_zealot_lorkhanAI : public ScriptedAI -        { -            npc_zealot_lorkhanAI(Creature* creature) : ScriptedAI(creature) -            { -                Initialize(); -                instance = creature->GetInstanceScript(); -            } - -            void Initialize() -            { -                Shield_Timer = 1000; -                BloodLust_Timer = 16000; -                GreaterHeal_Timer = 32000; -                Disarm_Timer = 6000; -                Check_Timer = 10000; - -                FakeDeath = false; -            } - -            uint32 Shield_Timer; -            uint32 BloodLust_Timer; -            uint32 GreaterHeal_Timer; -            uint32 Disarm_Timer; -            uint32 Check_Timer; - -            bool FakeDeath; - -            InstanceScript* instance; - -            void Reset() override -            { -                Initialize(); - -                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*/) override -            { -            } - -            void UpdateAI(uint32 diff) override -            { -                if (!UpdateVictim()) -                    return; - -                //Shield_Timer -                if (Shield_Timer <= diff) -                { -                    DoCast(me, SPELL_SHIELD); -                    Shield_Timer = 61000; -                } else Shield_Timer -= diff; - -                //BloodLust_Timer -                if (BloodLust_Timer <= diff) -                { -                    DoCast(me, SPELL_BLOODLUST); -                    BloodLust_Timer = 20000 + rand32() % 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 + rand32() % 5000; -                } else GreaterHeal_Timer -= diff; - -                //Disarm_Timer -                if (Disarm_Timer <= diff) -                { -                    DoCastVictim(SPELL_DISARM); -                    Disarm_Timer = 15000 + rand32() % 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 override -        { -            return GetInstanceAI<npc_zealot_lorkhanAI>(creature); -        } -}; - -//Zealot Zath -class npc_zealot_zath : public CreatureScript -{ -    public: -        npc_zealot_zath() : CreatureScript("npc_zealot_zath") { } - -        struct npc_zealot_zathAI : public ScriptedAI -        { -            npc_zealot_zathAI(Creature* creature) : ScriptedAI(creature) -            { -                Initialize(); -                instance = creature->GetInstanceScript(); -            } - -            void Initialize() -            { -                SweepingStrikes_Timer = 13000; -                SinisterStrike_Timer = 8000; -                Gouge_Timer = 25000; -                Kick_Timer = 18000; -                Blind_Timer = 5000; -                Check_Timer = 10000; - -                FakeDeath = false; -            } - -            uint32 SweepingStrikes_Timer; -            uint32 SinisterStrike_Timer; -            uint32 Gouge_Timer; -            uint32 Kick_Timer; -            uint32 Blind_Timer; -            uint32 Check_Timer; - -            bool FakeDeath; - -            InstanceScript* instance; - -            void Reset() override -            { -                Initialize(); - -                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*/) override -            { -            } - -            void UpdateAI(uint32 diff) override -            { -                if (!UpdateVictim()) -                    return; - -                //SweepingStrikes_Timer -                if (SweepingStrikes_Timer <= diff) -                { -                    DoCastVictim(SPELL_SWEEPINGSTRIKES); -                    SweepingStrikes_Timer = 22000 + rand32() % 4000; -                } else SweepingStrikes_Timer -= diff; - -                //SinisterStrike_Timer -                if (SinisterStrike_Timer <= diff) -                { -                    DoCastVictim(SPELL_SINISTERSTRIKE); -                    SinisterStrike_Timer = 8000 + rand32() % 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 + rand32() % 10000; -                } else Gouge_Timer -= diff; - -                //Kick_Timer -                if (Kick_Timer <= diff) -                { -                    DoCastVictim(SPELL_KICK); -                    Kick_Timer = 15000 + rand32() % 10000; -                } else Kick_Timer -= diff; - -                //Blind_Timer -                if (Blind_Timer <= diff) -                { -                    DoCastVictim(SPELL_BLIND); -                    Blind_Timer = 10000 + rand32() % 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))) -                        { -                            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(); -            } -        }; - -        CreatureAI* GetAI(Creature* creature) const override -        { -            return GetInstanceAI<npc_zealot_zathAI>(creature); -        } -}; - -void AddSC_boss_thekal() -{ -    new boss_thekal(); -    new npc_zealot_lorkhan(); -    new npc_zealot_zath(); -} diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp index c7b8a16fae1..b334c611528 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp @@ -22,65 +22,24 @@  #include "Spell.h"  #include "zulgurub.h" -/* - * @todo - * - Fix timers (research some more) - */ - -enum Says +enum Yells  { -    SAY_VENOXIS_TRANSFORM           = 1,        // Let the coils of hate unfurl! -    SAY_VENOXIS_DEATH               = 2         // Ssserenity.. at lassst! +    SAY_AGGRO               = 0, +    SAY_BLOODVENOM          = 1, // ID - 96842 Venomous Effusion +    SAY_TRANSFROM           = 2, // ID - 97354 Blessing of the Snake God +    SAY_WORD_OF_HETHISS     = 3, // ID - 96560 Word of Hethiss +    EMOTE_BLOODVENOM        = 4, // ID - 96842 Bloodvenom +    EMOTE_VENOM_WITHDRAWAL  = 5, // ID - 96653 Venom Withdrawal +    SAY_PLAYER_KILL         = 6, +    SAY_DEATH               = 7  };  enum Spells  { -    // troll form -    SPELL_THRASH                    = 3391, -    SPELL_DISPEL_MAGIC              = 23859, -    SPELL_RENEW                     = 23895, -    SPELL_HOLY_NOVA                 = 23858, -    SPELL_HOLY_FIRE                 = 23860, -    SPELL_HOLY_WRATH                = 23979, -    // snake form -    SPELL_POISON_CLOUD              = 23861, -    SPELL_VENOM_SPIT                = 23862, - -    SPELL_PARASITIC_SERPENT         = 23865, -    SPELL_SUMMON_PARASITIC_SERPENT  = 23866, -    SPELL_PARASITIC_SERPENT_TRIGGER = 23867, -    // used when swapping event-stages -    SPELL_VENOXIS_TRANSFORM         = 23849,    // 50% health - shapechange to cobra -    SPELL_FRENZY                    = 8269      // 20% health - frenzy  };  enum Events  { -    // troll form -    EVENT_THRASH                    = 1, -    EVENT_DISPEL_MAGIC              = 2, -    EVENT_RENEW                     = 3, -    EVENT_HOLY_NOVA                 = 4, -    EVENT_HOLY_FIRE                 = 5, -    EVENT_HOLY_WRATH                = 6, -    // phase-changing -    EVENT_TRANSFORM                 = 7, -    // snake form events -    EVENT_POISON_CLOUD              = 8, -    EVENT_VENOM_SPIT                = 9, -    EVENT_PARASITIC_SERPENT         = 10, -    EVENT_FRENZY                    = 11, -}; - -enum Phases -{ -    PHASE_ONE                       = 1,    // troll form -    PHASE_TWO                       = 2     // snake form -}; - -enum NPCs -{ -    NPC_PARASITIC_SERPENT           = 14884  };  class boss_venoxis : public CreatureScript @@ -90,70 +49,29 @@ class boss_venoxis : public CreatureScript          struct boss_venoxisAI : public BossAI          { -            boss_venoxisAI(Creature* creature) : BossAI(creature, DATA_VENOXIS) -            { -                Initialize(); -            } - -            void Initialize() -            { -                _inMeleeRange = 0; -                _transformed = false; -                _frenzied = false; -            } +            boss_venoxisAI(Creature* creature) : BossAI(creature, DATA_VENOXIS) { }              void Reset() override              {                  _Reset(); -                // remove all spells and auras from previous attempts -                me->RemoveAllAuras(); -                me->SetReactState(REACT_PASSIVE); -                // set some internally used variables to their defaults -                Initialize(); -                events.SetPhase(PHASE_ONE); -            } - -            void JustDied(Unit* /*killer*/) override -            { -                _JustDied(); -                Talk(SAY_VENOXIS_DEATH); -                me->RemoveAllAuras();              }              void EnterCombat(Unit* /*who*/) override              {                  _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); +                Talk(SAY_AGGRO); +            } -                // Set zone in combat -                DoZoneInCombat(); +            void JustDied(Unit* /*killer*/) override +            { +                _JustDied(); +                Talk(SAY_DEATH);              } -            void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/) override +            void KilledUnit(Unit* victim) override              { -                // 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); -                } +                if (victim->GetTypeId() == TYPEID_PLAYER) +                    Talk(SAY_PLAYER_KILL);              }              void UpdateAI(uint32 diff) override @@ -163,116 +81,26 @@ class boss_venoxis : public CreatureScript                  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 override          { -            return new boss_venoxisAI(creature); +            return GetZulGurubAI<boss_venoxisAI>(creature);          }  }; diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp index 6644724a430..997e4ec3077 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp @@ -16,27 +16,21 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -/* ScriptData -SDName: Boss_Wushoolay -SD%Complete: 100 -SDComment: -SDCategory: Zul'Gurub -EndScriptData */ - +#include "ObjectMgr.h"  #include "ScriptMgr.h"  #include "ScriptedCreature.h"  #include "zulgurub.h" +enum Yells +{ +}; +  enum Spells  { -    SPELL_LIGHTNINGCLOUD        = 25033, -    SPELL_LIGHTNINGWAVE         = 24819  };  enum Events  { -    EVENT_LIGHTNINGCLOUD        = 1, -    EVENT_LIGHTNINGWAVE         = 2  };  class boss_wushoolay : public CreatureScript @@ -46,23 +40,20 @@ class boss_wushoolay : public CreatureScript          struct boss_wushoolayAI : public BossAI          { -            boss_wushoolayAI(Creature* creature) : BossAI(creature, DATA_EDGE_OF_MADNESS) { } +            boss_wushoolayAI(Creature* creature) : BossAI(creature, DATA_HAZZARAH) +            { +            }              void Reset() override              { -                _Reset();              } -            void JustDied(Unit* /*killer*/) override +            void EnterCombat(Unit* /*who*/) override              { -                _JustDied();              } -            void EnterCombat(Unit* /*who*/) override +            void JustDied(Unit* /*killer*/) override              { -                _EnterCombat(); -                events.ScheduleEvent(EVENT_LIGHTNINGCLOUD, urand(5000, 10000)); -                events.ScheduleEvent(EVENT_LIGHTNINGWAVE, urand(8000, 16000));              }              void UpdateAI(uint32 diff) override @@ -74,23 +65,16 @@ class boss_wushoolay : public CreatureScript                  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();              } @@ -106,4 +90,3 @@ void AddSC_boss_wushoolay()  {      new boss_wushoolay();  } - diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_zanzil.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_zanzil.cpp new file mode 100644 index 00000000000..6d22284ef62 --- /dev/null +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_zanzil.cpp @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "ObjectMgr.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "zulgurub.h" + +enum Yells +{ +    SAY_AGGRO                       = 0, +    EMOTE_ZANZIL_ZOMBIES            = 1, // ID - 96319 Zanzil's Resurrection Elixir +    SAY_ZANZIL_ZOMBIES              = 2, // ID - 96319 Zanzil's Resurrection Elixir +    EMOTE_ZANZIL_GRAVEYARD_GAS      = 3, // ID - 96338 Zanzil's Graveyard Gas +    SAY_ZANZIL_GRAVEYARD_GAS        = 4, // ID - 96338 Zanzil's Graveyard Gas +    EMOTE_ZANZIL_BERSEKER           = 5, // ID - 96316 Zanzil's Resurrection Elixir +    SAY_ZANZIL_BERSEKER             = 6, // ID - 96316 Zanzil's Resurrection Elixir +    SAY_PLAYER_KILL                 = 7, +    SAY_DEATH                       = 8 +}; + +enum Spells +{ +}; + +enum Events +{ +}; + +class boss_zanzil : public CreatureScript +{ +    public: +        boss_zanzil() : CreatureScript("boss_zanzil") { } + +        struct boss_zanzilAI : public BossAI +        { +            boss_zanzilAI(Creature* creature) : BossAI(creature, DATA_ZANZIL) { } + +            void Reset() override +            { +                _Reset(); +            } + +            void EnterCombat(Unit* /*who*/) override +            { +                _EnterCombat(); +                Talk(SAY_AGGRO); +            } + +            void JustDied(Unit* /*killer*/) override +            { +                _JustDied(); +                Talk(SAY_DEATH); +            } + +            void KilledUnit(Unit* victim) override +            { +                if (victim->GetTypeId() == TYPEID_PLAYER) +                    Talk(SAY_PLAYER_KILL); +            } + +            void UpdateAI(uint32 diff) override +            { +                if (!UpdateVictim()) +                    return; + +                events.Update(diff); + +                if (me->HasUnitState(UNIT_STATE_CASTING)) +                    return; +                /* +                while (uint32 eventId = events.ExecuteEvent()) +                { +                    switch (eventId) +                    { +                        default: +                            break; +                    } +                } +                */ + +                DoMeleeAttackIfReady(); +            } +        }; + +        CreatureAI* GetAI(Creature* creature) const override +        { +            return GetZulGurubAI<boss_zanzilAI>(creature); +        } +}; + +void AddSC_boss_zanzil() +{ +    new boss_zanzil(); +} diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp index 5aa37642798..581839315da 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp @@ -16,26 +16,24 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -/* ScriptData -SDName: Instance_ZulGurub -SD%Complete: 80 -SDComment: Missing reset function after killing a boss for Ohgan, Thekal. -SDCategory: Zul'Gurub -EndScriptData */ -  #include "ScriptMgr.h"  #include "InstanceScript.h"  #include "zulgurub.h"  DoorData const doorData[] =  { -    { GO_FORCEFIELD, DATA_ARLOKK, DOOR_TYPE_ROOM, BOUNDARY_NONE }, -    { 0,             0,           DOOR_TYPE_ROOM, BOUNDARY_NONE } // END +    { GO_VENOXIS_COIL,                  DATA_VENOXIS,   DOOR_TYPE_ROOM, BOUNDARY_NONE }, +    { GO_ARENA_DOOR_1,                  DATA_MANDOKIR,  DOOR_TYPE_ROOM, BOUNDARY_NONE }, +    { GO_FORCEFIELD,                    DATA_KILNARA,   DOOR_TYPE_ROOM, BOUNDARY_NONE }, +    { GO_ZANZIL_DOOR,                   DATA_ZANZIL,    DOOR_TYPE_ROOM, BOUNDARY_NONE }, +    //{ GO_THE_CACHE_OF_MADNESS_DOOR,     DATA_xxxxxxx,   DOOR_TYPE_ROOM, BOUNDARY_NONE }, +    { 0,                                0,              DOOR_TYPE_ROOM, BOUNDARY_NONE }  };  class instance_zulgurub : public InstanceMapScript  { -    public: instance_zulgurub(): InstanceMapScript(ZGScriptName, 309) { } +    public: +        instance_zulgurub() : InstanceMapScript(ZGScriptName, 859) { }          struct instance_zulgurub_InstanceMapScript : public InstanceScript          { @@ -44,46 +42,53 @@ class instance_zulgurub : public InstanceMapScript                  SetHeaders(DataHeader);                  SetBossNumber(EncounterCount);                  LoadDoorData(doorData); -            } - -            void Initialize() override -            { -                _zealotLorkhanGUID = 0; -                _zealotZathGUID = 0; -                _highPriestTekalGUID = 0; -                _jindoTheHexxerGUID = 0; -                _vilebranchSpeakerGUID = 0; -                _arlokkGUID = 0; -                _goGongOfBethekkGUID = 0; -            } - -            bool IsEncounterInProgress() const override -            { -                // not active in Zul'Gurub -                return false; +                venoxisGUID         = 0; +                mandokirGUID        = 0; +                kilnaraGUID         = 0; +                zanzilGUID          = 0; +                jindoGUID           = 0; +                hazzarahGUID        = 0; +                renatakiGUID        = 0; +                wushoolayGUID       = 0; +                grilekGUID          = 0; +                jindoTiggerGUID     = 0;              }              void OnCreatureCreate(Creature* creature) override              {                  switch (creature->GetEntry())                  { -                    case NPC_ZEALOT_LORKHAN: -                        _zealotLorkhanGUID = creature->GetGUID(); +                    case NPC_VENOXIS: +                        venoxisGUID = creature->GetGUID(); +                        break; +                    case NPC_MANDOKIR: +                        mandokirGUID = creature->GetGUID(); +                        break; +                    case NPC_KILNARA: +                        kilnaraGUID = creature->GetGUID(); +                        break; +                    case NPC_ZANZIL: +                        zanzilGUID = creature->GetGUID();                          break; -                    case NPC_ZEALOT_ZATH: -                        _zealotZathGUID = creature->GetGUID(); +                    case NPC_JINDO: +                        jindoGUID = creature->GetGUID();                          break; -                    case NPC_HIGH_PRIEST_THEKAL: -                        _highPriestTekalGUID = creature->GetGUID(); +                    case NPC_HAZZARAH: +                        hazzarahGUID = creature->GetGUID();                          break; -                    case NPC_JINDO_THE_HEXXER: -                        _jindoTheHexxerGUID = creature->GetGUID(); +                    case NPC_RENATAKI: +                        renatakiGUID = creature->GetGUID();                          break; -                    case NPC_VILEBRANCH_SPEAKER: -                        _vilebranchSpeakerGUID = creature->GetGUID(); +                    case NPC_WUSHOOLAY: +                        wushoolayGUID = creature->GetGUID();                          break; -                    case NPC_ARLOKK: -                        _arlokkGUID = creature->GetGUID(); +                    case NPC_GRILEK: +                        grilekGUID = creature->GetGUID(); +                        break; +                    case NPC_JINDO_TRIGGER: +                        jindoTiggerGUID = creature->GetGUID(); +                        break; +                    default:                          break;                  }              } @@ -92,16 +97,13 @@ class instance_zulgurub : public InstanceMapScript              {                  switch (go->GetEntry())                  { +                    case GO_VENOXIS_COIL: +                    case GO_ARENA_DOOR_1:                      case GO_FORCEFIELD: +                    case GO_ZANZIL_DOOR: +                    case GO_THE_CACHE_OF_MADNESS_DOOR:                          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;                  } @@ -111,7 +113,11 @@ class instance_zulgurub : public InstanceMapScript              {                  switch (go->GetEntry())                  { +                    case GO_VENOXIS_COIL: +                    case GO_ARENA_DOOR_1:                      case GO_FORCEFIELD: +                    case GO_ZANZIL_DOOR: +                    case GO_THE_CACHE_OF_MADNESS_DOOR:                          AddDoor(go, false);                          break;                      default: @@ -119,43 +125,90 @@ class instance_zulgurub : public InstanceMapScript                  }              } -            uint64 GetData64(uint32 uiData) const override +            bool SetBossState(uint32 type, EncounterState state) override              { -                switch (uiData) +                if (!InstanceScript::SetBossState(type, state)) +                    return false; + +                switch (type)                  { -                    case DATA_LORKHAN: -                        return _zealotLorkhanGUID; -                        break; -                    case DATA_ZATH: -                        return _zealotZathGUID; -                        break; -                    case DATA_THEKAL: -                        return _highPriestTekalGUID; -                        break; +                    case DATA_VENOXIS: +                    case DATA_MANDOKIR: +                    case DATA_KILNARA: +                    case DATA_ZANZIL:                      case DATA_JINDO: -                        return _jindoTheHexxerGUID; +                    case DATA_HAZZARAH: +                    case DATA_RENATAKI: +                    case DATA_WUSHOOLAY: +                    case DATA_GRILEK:                          break; -                    case NPC_ARLOKK: -                        return _arlokkGUID; +                    default:                          break; -                    case GO_GONG_OF_BETHEKK: -                        return _goGongOfBethekkGUID; +                } + +                return true; +            } + +            /* +            void SetData(uint32 type, uint32 data) override +            { +                switch (type) +                { +                } +            } + +            uint32 GetData(uint32 type) const override +            { +                switch (type) +                { +                } + +                return 0; +            } +            */ + +            uint64 GetData64(uint32 type) const override +            { +                switch (type) +                { +                    case DATA_VENOXIS: +                        return venoxisGUID; +                    case DATA_MANDOKIR: +                        return mandokirGUID; +                    case DATA_KILNARA: +                        return kilnaraGUID; +                    case DATA_ZANZIL: +                        return zanzilGUID; +                    case DATA_JINDO: +                        return jindoGUID; +                    case DATA_HAZZARAH: +                        return hazzarahGUID; +                    case DATA_RENATAKI: +                        return renatakiGUID; +                    case DATA_WUSHOOLAY: +                        return wushoolayGUID; +                    case DATA_GRILEK: +                        return grilekGUID; +                    case DATA_JINDOR_TRIGGER: +                        return jindoTiggerGUID; +                    default:                          break;                  } +                  return 0;              } -        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; +        protected: +             uint64 venoxisGUID; +             uint64 mandokirGUID; +             uint64 kilnaraGUID; +             uint64 zanzilGUID; +             uint64 jindoGUID; +             uint64 hazzarahGUID; +             uint64 renatakiGUID; +             uint64 wushoolayGUID; +             uint64 grilekGUID; +             uint64 jindoTiggerGUID;          };          InstanceScript* GetInstanceScript(InstanceMap* map) const override diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h index 8b9c776dd78..bdb73a77997 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h +++ b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h @@ -1,5 +1,6 @@  /*   * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> + * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>   *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License as published by the @@ -19,52 +20,72 @@  #define DEF_ZULGURUB_H  #define DataHeader "ZG" - -uint32 const EncounterCount = 13; -  #define ZGScriptName "instance_zulgurub" +uint32 const EncounterCount = 5; +  enum DataTypes  { -    DATA_JEKLIK             = 0,  // Main boss -    DATA_VENOXIS            = 1,  // Main boss -    DATA_MARLI              = 2,  // Main boss -    DATA_ARLOKK             = 3,  // Main boss -    DATA_THEKAL             = 4,  // Main boss -    DATA_HAKKAR             = 5,  // End boss -    DATA_MANDOKIR           = 6,  // Optional boss -    DATA_JINDO              = 7,  // Optional boss -    DATA_GAHZRANKA          = 8,  // Optional boss -    DATA_EDGE_OF_MADNESS    = 9,  // Optional Event Edge of Madness - one of: Gri'lek, Renataki, Hazza'rah, or Wushoolay -    DATA_LORKHAN            = 10, // Zealot Lor'Khan add to High priest Thekal! -    DATA_ZATH               = 11, // Zealot Zath add to High priest Thekal! -    DATA_OHGAN              = 12, // Bloodlord Mandokir's raptor mount -    TYPE_EDGE_OF_MADNESS    = 13  // Boss storage +    DATA_VENOXIS                    = 0, +    DATA_MANDOKIR                   = 1, +    DATA_KILNARA                    = 2, +    DATA_ZANZIL                     = 3, +    DATA_JINDO                      = 4, + +    // Cache of Madness +    DATA_HAZZARAH                   = 5, +    DATA_RENATAKI                   = 6, +    DATA_WUSHOOLAY                  = 7, +    DATA_GRILEK                     = 8, + +    // Jin'do the Godbreaker +    DATA_JINDOR_TRIGGER,  };  enum CreatureIds  { -    NPC_ARLOKK              = 14515, // Arlokk Event -    NPC_PANTHER_TRIGGER     = 15091, // Arlokk Event -    NPC_ZULIAN_PROWLER      = 15101, // Arlokk Event -    NPC_ZEALOT_LORKHAN      = 11347, -    NPC_ZEALOT_ZATH         = 11348, -    NPC_HIGH_PRIEST_THEKAL  = 14509, -    NPC_JINDO_THE_HEXXER    = 11380, -    NPC_NIGHTMARE_ILLUSION  = 15163, -    NPC_SHADE_OF_JINDO      = 14986, -    NPC_SACRIFICED_TROLL    = 14826, -    NPC_MANDOKIR            = 11382, // Mandokir Event -    NPC_OHGAN               = 14988, // Mandokir Event -    NPC_VILEBRANCH_SPEAKER  = 11391, // Mandokir Event -    NPC_CHAINED_SPIRT       = 15117  // Mandokir Event +    NPC_VENOXIS                     = 52155, +    NPC_MANDOKIR                    = 52151, +    NPC_KILNARA                     = 52059, +    NPC_ZANZIL                      = 52053, +    NPC_JINDO                       = 52148, + +    // Cache of Madness +    NPC_HAZZARAH                    = 52271, +    NPC_RENATAKI                    = 52269, +    NPC_WUSHOOLAY                   = 52286, +    NPC_GRILEK                      = 52258, +    // Bloodlord Mandokir +    NPC_CHAINED_SPIRIT              = 52156, +    NPC_OHGAN                       = 52157, + +    // Jin'do the Godbreaker +    NPC_JINDO_TRIGGER               = 52150, +    NPC_SPIRIT_OF_HAKKAR            = 52222, +    NPC_SHADOW_OF_HAKKAR            = 52650  }; -enum GameobjectIds +enum GameObjectIds  { -    GO_FORCEFIELD           = 180497, // Arlokk Event -    GO_GONG_OF_BETHEKK      = 180526  // Arlokk Event +    // High Priest Venoxis +    GO_VENOXIS_COIL                 = 208844, + +    // Bloodlord Mandokir +    GO_ARENA_DOOR_1                 = 208845, +    GO_ARENA_DOOR_2                 = 208847, +    GO_ARENA_DOOR_3                 = 208848, +    GO_ARENA_DOOR_4                 = 208846, +    GO_ARENA_DOOR_5                 = 208849, + +    // High Priestess Kilnara +    GO_FORCEFIELD                   = 180497, + +    // Zanzil +    GO_ZANZIL_DOOR                  = 208850, + +    // Cache of Madness +    GO_THE_CACHE_OF_MADNESS_DOOR    = 208843  };  template<class AI> diff --git a/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp b/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp index 0480b99b912..d34dc053fc5 100644 --- a/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp @@ -49,8 +49,13 @@ enum ProfessorPhizzlethorpe      SAY_PROGRESS_7          = 7,      EMOTE_PROGRESS_8        = 8,      SAY_PROGRESS_9          = 9, +    EVENT_SAY_3         = 1, +    EVENT_SAY_6         = 2, +    EVENT_SAY_8         = 3, +      // Quests      QUEST_SUNKEN_TREASURE   = 665, +    QUEST_GOGGLE_BOGGLE     = 26050,      // Creatures      NPC_VENGEFUL_SURGE      = 2776,      FACTION_SUNKEN_TREASURE = 113 @@ -73,33 +78,22 @@ class npc_professor_phizzlethorpe : public CreatureScript                  switch (waypointId)                  { -                    case 4: +                    case 6:                          Talk(SAY_PROGRESS_2, player); -                        break; -                    case 5: -                        Talk(SAY_PROGRESS_3, player); +                        events.ScheduleEvent(EVENT_SAY_3, 3000);                          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); +                        me->SummonCreature(NPC_VENGEFUL_SURGE, -2065.505f, -2136.88f, 22.20362f, 1.0f, TEMPSUMMON_CORPSE_DESPAWN, 0); +                        me->SummonCreature(NPC_VENGEFUL_SURGE, -2059.249f, -2134.88f, 21.51582f, 1.0f, TEMPSUMMON_CORPSE_DESPAWN, 0);                          break;                      case 11: -                        Talk(SAY_PROGRESS_6, player); -                        SetRun(); +                        Talk(SAY_PROGRESS_5, player); +                        events.ScheduleEvent(EVENT_SAY_6, 11000);                          break; -                    case 19: +                    case 17:                          Talk(SAY_PROGRESS_7, player); -                        break; -                    case 20: -                        Talk(EMOTE_PROGRESS_8); -                        Talk(SAY_PROGRESS_9, player); -                        player->GroupEventHappens(QUEST_SUNKEN_TREASURE, me); +                        events.ScheduleEvent(EVENT_SAY_8, 6000);                          break;                  }              } @@ -126,8 +120,34 @@ class npc_professor_phizzlethorpe : public CreatureScript              void UpdateAI(uint32 diff) override              { +                Player* player = GetPlayerForEscort(); +                if (!player) +                    return; + +                events.Update(diff); + +                while (uint32 event = events.ExecuteEvent()) +                { +                    switch (event) +                    { +                        case EVENT_SAY_3: +                            Talk(SAY_PROGRESS_3, player); +                            break; +                        case EVENT_SAY_6: +                            Talk(SAY_PROGRESS_6, player); +                            SetRun(); +                            break; +                        case EVENT_SAY_8: +                            Talk(EMOTE_PROGRESS_8); +                            Talk(SAY_PROGRESS_9, player); +                            player->GroupEventHappens(QUEST_GOGGLE_BOGGLE, me); +                            break; +                    } +                }                  npc_escortAI::UpdateAI(diff);              } + +            EventMap events;          };      CreatureAI* GetAI(Creature* creature) const override diff --git a/src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp b/src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp index 9d046ff16d8..0c45ba98064 100644 --- a/src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp +++ b/src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp @@ -1,6 +1,5 @@  /*   * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>   *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License as published by the @@ -16,152 +15,7 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -/* ScriptData -SDName: Burning_Steppes -SD%Complete: 100 -SDComment: Quest support: 4224, 4866 -SDCategory: Burning Steppes -EndScriptData */ - -/* ContentData -npc_ragged_john -EndContentData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "ScriptedGossip.h" -#include "Player.h" - -/*###### -## npc_ragged_john -######*/ - -#define GOSSIP_HELLO    "Official buisness, John. I need some information about Marsha Windsor. Tell me about the last time you saw him." -#define GOSSIP_SELECT1  "So what did you do?" -#define GOSSIP_SELECT2  "Start making sense, dwarf. I don't want to have anything to do with your cracker, your pappy, or any sort of 'discreditin'." -#define GOSSIP_SELECT3  "Ironfoe?" -#define GOSSIP_SELECT4  "Interesting... continue John." -#define GOSSIP_SELECT5  "So that's how Windsor died..." -#define GOSSIP_SELECT6  "So how did he die?" -#define GOSSIP_SELECT7  "Ok so where the hell is he? Wait a minute! Are you drunk?" -#define GOSSIP_SELECT8  "WHY is he in Blackrock Depths?" -#define GOSSIP_SELECT9  "300? So the Dark Irons killed him and dragged him into the Depths?" -#define GOSSIP_SELECT10 "Ahh... Ironfoe" -#define GOSSIP_SELECT11 "Thanks, Ragged John. Your story was very uplifting and informative" - -enum RaggedJohn -{ -    QUEST_THE_TRUE_MASTERS        = 4224, -    QUEST_MOTHERS_MILK            = 4866, -    SPELL_MOTHERS_MILK            = 16468, -    SPELL_WICKED_MILKING          = 16472 -}; - -class npc_ragged_john : public CreatureScript -{ -public: -    npc_ragged_john() : CreatureScript("npc_ragged_john") { } - -    struct npc_ragged_johnAI : public ScriptedAI -    { -        npc_ragged_johnAI(Creature* creature) : ScriptedAI(creature) { } - -        void Reset() override { } - -        void MoveInLineOfSight(Unit* who) override -        { -            if (who->HasAura(SPELL_MOTHERS_MILK)) -            { -                if (who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 15) && who->isInAccessiblePlaceFor(me)) -                { -                    DoCast(who, SPELL_WICKED_MILKING); -                    if (Player* player = who->ToPlayer()) -                        player->AreaExploredOrEventHappens(QUEST_MOTHERS_MILK); -                } -            } - -            ScriptedAI::MoveInLineOfSight(who); -        } - -        void EnterCombat(Unit* /*who*/) override { } -    }; - -    bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override -    { -        player->PlayerTalkClass->ClearMenus(); -        switch (action) -        { -            case GOSSIP_ACTION_INFO_DEF: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); -                player->SEND_GOSSIP_MENU(2714, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+1: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); -                player->SEND_GOSSIP_MENU(2715, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+2: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); -                player->SEND_GOSSIP_MENU(2716, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+3: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); -                player->SEND_GOSSIP_MENU(2717, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+4: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); -                player->SEND_GOSSIP_MENU(2718, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+5: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); -                player->SEND_GOSSIP_MENU(2719, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+6: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT7, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 7); -                player->SEND_GOSSIP_MENU(2720, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+7: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT8, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 8); -                player->SEND_GOSSIP_MENU(2721, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+8: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT9, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9); -                player->SEND_GOSSIP_MENU(2722, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+9: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT10, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 10); -                player->SEND_GOSSIP_MENU(2723, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+10: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT11, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11); -                player->SEND_GOSSIP_MENU(2725, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+11: -                player->CLOSE_GOSSIP_MENU(); -                player->AreaExploredOrEventHappens(QUEST_THE_TRUE_MASTERS); -                break; -        } -        return true; -    } - -    bool OnGossipHello(Player* player, Creature* creature) override -    { -        if (creature->IsQuestGiver()) -            player->PrepareQuestMenu(creature->GetGUID()); - -        if (player->GetQuestStatus(QUEST_THE_TRUE_MASTERS) == QUEST_STATUS_INCOMPLETE) -            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HELLO, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - -        player->SEND_GOSSIP_MENU(2713, creature->GetGUID()); -        return true; -    } - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return new npc_ragged_johnAI(creature); -    } -}; -  void AddSC_burning_steppes()  { -    new npc_ragged_john(); +  } diff --git a/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp b/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp index 68f41ce6588..db7f027d53d 100644 --- a/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp @@ -19,7 +19,7 @@  /* ScriptData  SDName: Ghostlands  SD%Complete: 100 -SDComment: Quest support: 9212. +SDComment:  SDCategory: Ghostlands  EndScriptData */ @@ -35,6 +35,7 @@ EndContentData */  #include "WorldSession.h"  /*###### +  ## npc_ranger_lilatha  ######*/ diff --git a/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp b/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp index 268a78bb491..8888b662ff6 100644 --- a/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp @@ -19,13 +19,12 @@  /* ScriptData  SDName: Hinterlands  SD%Complete: 100 -SDComment: Quest support: 863, 2742 +SDComment: Quest support: 836  SDCategory: The Hinterlands  EndScriptData */  /* ContentData  npc_oox09hl -npc_rinji  EndContentData */  #include "ScriptMgr.h" @@ -37,7 +36,7 @@ EndContentData */  ## npc_oox09hl  ######*/ -enum OOX +enum eOOX  {      SAY_OOX_START           = 0,      SAY_OOX_AGGRO           = 1, @@ -86,7 +85,7 @@ public:              }          } -        void WaypointReached(uint32 waypointId) override +        void WaypointReached(uint32 waypointId)          {              switch (waypointId)              { @@ -134,205 +133,7 @@ public:      }  }; -/*###### -## npc_rinji -######*/ - -enum Rinji -{ -    SAY_RIN_BY_OUTRUNNER    = 0, -    SAY_RIN_FREE            = 0, // from here -    SAY_RIN_HELP            = 1, -    SAY_RIN_COMPLETE        = 2, -    SAY_RIN_PROGRESS_1      = 3, -    SAY_RIN_PROGRESS_2      = 4, -    QUEST_RINJI_TRAPPED     = 2742, -    NPC_RANGER              = 2694, -    NPC_OUTRUNNER           = 2691, -    GO_RINJI_CAGE           = 142036 -}; - -struct Location -{ -    float posX, posY, posZ; -}; - -Location AmbushSpawn[] = -{ -    { 191.296204f, -2839.329346f, 107.388f }, -    { 70.972466f,  -2848.674805f, 109.459f } -}; - -Location AmbushMoveTo[] = -{ -    { 166.630386f, -2824.780273f, 108.153f }, -    { 70.886589f,  -2874.335449f, 116.675f } -}; - -class npc_rinji : public CreatureScript -{ -public: -    npc_rinji() : CreatureScript("npc_rinji") { } - -    struct npc_rinjiAI : public npc_escortAI -    { -        npc_rinjiAI(Creature* creature) : npc_escortAI(creature) -        { -            Initialize(); -            _IsByOutrunner = false; -            spawnId = 0; -        } - -        void Initialize() -        { -            postEventCount = 0; -            postEventTimer = 3000; -        } - -        void Reset() override -        { -            Initialize(); -        } - -        void JustRespawned() override -        { -            _IsByOutrunner = false; -            spawnId = 0; - -            npc_escortAI::JustRespawned(); -        } - -        void EnterCombat(Unit* who) override -        { -            if (HasEscortState(STATE_ESCORT_ESCORTING)) -            { -                if (who->GetEntry() == NPC_OUTRUNNER && !_IsByOutrunner) -                { -                    if (Creature* talker = who->ToCreature()) -                        talker->AI()->Talk(SAY_RIN_BY_OUTRUNNER); -                    _IsByOutrunner = true; -                } - -                if (rand32() % 4) -                    return; - -                //only if attacked and escorter is not in combat? -                Talk(SAY_RIN_HELP); -            } -        } - -        void DoSpawnAmbush(bool _first) -        { -            if (!_first) -                spawnId = 1; - -            me->SummonCreature(NPC_RANGER, AmbushSpawn[spawnId].posX, AmbushSpawn[spawnId].posY, AmbushSpawn[spawnId].posZ, 0.0f, -                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); -            } -        } - -        void JustSummoned(Creature* summoned) override -        { -            summoned->SetWalk(false); -            summoned->GetMotionMaster()->MovePoint(0, AmbushMoveTo[spawnId].posX, AmbushMoveTo[spawnId].posY, AmbushMoveTo[spawnId].posZ); -        } - -        void sQuestAccept(Player* player, Quest const* quest) -        { -            if (quest->GetQuestId() == QUEST_RINJI_TRAPPED) -            { -                if (GameObject* go = me->FindNearestGameObject(GO_RINJI_CAGE, INTERACTION_DISTANCE)) -                    go->UseDoorOrButton(); - -                npc_escortAI::Start(false, false, player->GetGUID(), quest); -            } -        } - -        void WaypointReached(uint32 waypointId) override -        { -            Player* player = GetPlayerForEscort(); -            if (!player) -                return; - -            switch (waypointId) -            { -                case 1: -                    Talk(SAY_RIN_FREE, player); -                    break; -                case 7: -                    DoSpawnAmbush(true); -                    break; -                case 13: -                    DoSpawnAmbush(false); -                    break; -                case 17: -                    Talk(SAY_RIN_COMPLETE, player); -                    player->GroupEventHappens(QUEST_RINJI_TRAPPED, me); -                    SetRun(); -                    postEventCount = 1; -                    break; -            } -        } - -        void UpdateEscortAI(const uint32 diff) override -        { -            //Check if we have a current target -            if (!UpdateVictim()) -            { -                if (HasEscortState(STATE_ESCORT_ESCORTING) && postEventCount) -                { -                    if (postEventTimer <= diff) -                    { -                        postEventTimer = 3000; - -                        if (Player* player = GetPlayerForEscort()) -                        { -                            switch (postEventCount) -                            { -                                case 1: -                                    Talk(SAY_RIN_PROGRESS_1, player); -                                    ++postEventCount; -                                    break; -                                case 2: -                                    Talk(SAY_RIN_PROGRESS_2, player); -                                    postEventCount = 0; -                                    break; -                            } -                        } -                        else -                        { -                            me->DespawnOrUnsummon(); -                            return; -                        } -                    } -                    else -                        postEventTimer -= diff; -                } -                return; -            } -            DoMeleeAttackIfReady(); -        } - -    private: -        uint32 postEventCount; -        uint32 postEventTimer; -        int    spawnId; -        bool   _IsByOutrunner; -    }; - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return new npc_rinjiAI(creature); -    } -}; -  void AddSC_hinterlands()  {      new npc_oox09hl(); -    new npc_rinji();  } diff --git a/src/server/scripts/EasternKingdoms/zone_ironforge.cpp b/src/server/scripts/EasternKingdoms/zone_ironforge.cpp new file mode 100644 index 00000000000..5a0951c0b23 --- /dev/null +++ b/src/server/scripts/EasternKingdoms/zone_ironforge.cpp @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "ScriptedGossip.h" +#include "Player.h" + +void AddSC_ironforge() +{ +} diff --git a/src/server/scripts/EasternKingdoms/zone_isle_of_queldanas.cpp b/src/server/scripts/EasternKingdoms/zone_isle_of_queldanas.cpp index 4ce30bd5834..24d370155a6 100644 --- a/src/server/scripts/EasternKingdoms/zone_isle_of_queldanas.cpp +++ b/src/server/scripts/EasternKingdoms/zone_isle_of_queldanas.cpp @@ -44,7 +44,6 @@ enum ConvertedSentry      SPELL_CONVERT_CREDIT    = 45009  }; -  class npc_converted_sentry : public CreatureScript  {  public: diff --git a/src/server/scripts/EasternKingdoms/zone_loch_modan.cpp b/src/server/scripts/EasternKingdoms/zone_loch_modan.cpp index 1926a032aeb..95be9c9e8b2 100644 --- a/src/server/scripts/EasternKingdoms/zone_loch_modan.cpp +++ b/src/server/scripts/EasternKingdoms/zone_loch_modan.cpp @@ -18,13 +18,12 @@  /* ScriptData  SDName: Loch_Modan -SD%Complete: 100 -SDComment: Quest support: 3181 +SD%Complete: 0 +SDComment:  SDCategory: Loch Modan  EndScriptData */  /* ContentData -npc_mountaineer_pebblebitty  EndContentData */  #include "ScriptMgr.h" @@ -32,75 +31,6 @@ EndContentData */  #include "ScriptedGossip.h"  #include "Player.h" -/*###### -## npc_mountaineer_pebblebitty -######*/ - -#define GOSSIP_MP "Open the gate please, i need to get to Searing Gorge" - -#define GOSSIP_MP1 "But i need to get there, now open the gate!" -#define GOSSIP_MP2 "Ok, so what is this other way?" -#define GOSSIP_MP3 "Doesn't matter, i'm invulnerable." -#define GOSSIP_MP4 "Yes..." -#define GOSSIP_MP5 "Ok, i'll try to remember that." -#define GOSSIP_MP6 "A key? Ok!" - -class npc_mountaineer_pebblebitty : public CreatureScript -{ -public: -    npc_mountaineer_pebblebitty() : CreatureScript("npc_mountaineer_pebblebitty") { } - -    bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override -    { -        player->PlayerTalkClass->ClearMenus(); -        switch (action) -        { -            case GOSSIP_ACTION_INFO_DEF+1: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_MP1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); -                player->SEND_GOSSIP_MENU(1833, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+2: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_MP2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); -                player->SEND_GOSSIP_MENU(1834, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+3: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_MP3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); -                player->SEND_GOSSIP_MENU(1835, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+4: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_MP4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); -                player->SEND_GOSSIP_MENU(1836, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+5: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_MP5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); -                player->SEND_GOSSIP_MENU(1837, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+6: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_MP6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 7); -                player->SEND_GOSSIP_MENU(1838, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+7: -                player->CLOSE_GOSSIP_MENU(); -                break; -        } -        return true; -    } - -    bool OnGossipHello(Player* player, Creature* creature) override -    { -        if (creature->IsQuestGiver()) -            player->PrepareQuestMenu(creature->GetGUID()); - -        if (!player->GetQuestRewardStatus(3181) == 1) -            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_MP, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - -        player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); - -        return true; -    } -}; -  void AddSC_loch_modan()  { -    new npc_mountaineer_pebblebitty();  } diff --git a/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp b/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp index 5907b0b155f..f71f78fb9cb 100644 --- a/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp +++ b/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp @@ -17,8 +17,8 @@  /* Script Data Start  SDName: Redridge Mountains -SD%Complete: 100% -SDComment: Support for quest 219. +SD%Complete: 0 +SDComment:  Script Data End */  #include "ScriptMgr.h" @@ -26,155 +26,6 @@ Script Data End */  #include "ScriptedEscortAI.h"  #include "Player.h" -enum CorporalKeeshan -{ -    QUEST_MISSING_IN_ACTION = 219, -    SAY_CORPORAL_1          = 0, -    SAY_CORPORAL_2          = 1, -    SAY_CORPORAL_3          = 2, -    SAY_CORPORAL_4          = 3, -    SAY_CORPORAL_5          = 4, -    SPELL_MOCKING_BLOW      = 21008, -    SPELL_SHIELD_BASH       = 11972 -}; - -class npc_corporal_keeshan : public CreatureScript -{ -public: -    npc_corporal_keeshan() : CreatureScript("npc_corporal_keeshan") { } - -    struct npc_corporal_keeshanAI : public npc_escortAI -    { -        npc_corporal_keeshanAI(Creature* creature) : npc_escortAI(creature) -        { -            Initialize(); -        } - -        void Initialize() -        { -            timer = 0; -            phase = 0; -            mockingBlowTimer = 5000; -            shieldBashTimer = 8000; -        } - -        void Reset() override -        { -            Initialize(); -        } - -        void sQuestAccept(Player* player, Quest const* quest) -        { -            if (quest->GetQuestId() == QUEST_MISSING_IN_ACTION) -            { -                Talk(SAY_CORPORAL_1, player); -                npc_escortAI::Start(true, false, player->GetGUID(), quest); -            } -        } - -        void WaypointReached(uint32 waypointId) override -        { -            Player* player = GetPlayerForEscort(); -            if (!player) -                return; - -            if (waypointId >= 65) -                me->SetWalk(false); - -            switch (waypointId) -            { -                case 39: -                    SetEscortPaused(true); -                    timer = 2000; -                    phase = 1; -                    break; -                case 65: -                    me->SetWalk(false); -                    break; -                case 115: -                    player->AreaExploredOrEventHappens(QUEST_MISSING_IN_ACTION); -                    timer = 2000; -                    phase = 4; -                    break; -            } -        } - -        void UpdateAI(uint32 diff) override -        { -            if (HasEscortState(STATE_ESCORT_NONE)) -                return; - -            npc_escortAI::UpdateAI(diff); - -            if (phase) -            { -                if (timer <= diff) -                { -                    switch (phase) -                    { -                        case 1: -                            me->SetStandState(UNIT_STAND_STATE_SIT); -                            timer = 1000; -                            phase = 2; -                            break; -                        case 2: -                            Talk(SAY_CORPORAL_2); -                            timer = 15000; -                            phase = 3; -                            break; -                        case 3: -                            Talk(SAY_CORPORAL_3); -                            me->SetStandState(UNIT_STAND_STATE_STAND); -                            SetEscortPaused(false); -                            timer = 0; -                            phase = 0; -                            break; -                        case 4: -                            Talk(SAY_CORPORAL_4); -                            timer = 2500; -                            phase = 5; -                            break; -                        case 5: -                            Talk(SAY_CORPORAL_5); -                            timer = 0; -                            phase = 0; -                            break; -                    } -                } else timer -= diff; -            } - -            if (!UpdateVictim()) -                return; - -            if (mockingBlowTimer <= diff) -            { -                DoCastVictim(SPELL_MOCKING_BLOW); -                mockingBlowTimer = 5000; -            } else mockingBlowTimer -= diff; - -            if (shieldBashTimer <= diff) -            { -                DoCastVictim(SPELL_MOCKING_BLOW); -                shieldBashTimer = 8000; -            } else shieldBashTimer -= diff; - -            DoMeleeAttackIfReady(); -        } - -    private: -        uint32 phase; -        uint32 timer; -        uint32 mockingBlowTimer; -        uint32 shieldBashTimer; -    }; - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return new npc_corporal_keeshanAI(creature); -    } -}; -  void AddSC_redridge_mountains()  { -    new npc_corporal_keeshan();  } diff --git a/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp index 598717a1c3b..1d68ac01f6d 100644 --- a/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp +++ b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp @@ -19,13 +19,12 @@  /* ScriptData  SDName: Silverpine_Forest  SD%Complete: 100 -SDComment: Quest support: 435, 452 +SDComment: Quest support: 435  SDCategory: Silverpine Forest  EndScriptData */  /* ContentData  npc_deathstalker_erland -pyrewood_ambush  EndContentData */  #include "ScriptMgr.h" @@ -37,7 +36,7 @@ EndContentData */  ## npc_deathstalker_erland  ######*/ -enum Erland +enum eErland  {      SAY_QUESTACCEPT     = 0,      SAY_START           = 1, @@ -67,7 +66,7 @@ public:      {          npc_deathstalker_erlandAI(Creature* creature) : npc_escortAI(creature) { } -        void WaypointReached(uint32 waypointId) override +        void WaypointReached(uint32 waypointId)          {              Player* player = GetPlayerForEscort();              if (!player) @@ -110,13 +109,13 @@ public:          void Reset() override { } -        void EnterCombat(Unit* who) override +        void EnterCombat(Unit* who)          {              Talk(SAY_AGGRO, who);          }      }; -    bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override +    bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest)      {          if (quest->GetQuestId() == QUEST_ESCORTING)          { @@ -136,199 +135,10 @@ public:  };  /*###### -## pyrewood_ambush -#######*/ - -#define QUEST_PYREWOOD_AMBUSH 452 - -#define NPCSAY_INIT "Get ready, they'll be arriving any minute..." //not blizzlike -#define NPCSAY_END "Thanks for your help!" //not blizzlike - -static float PyrewoodSpawnPoints[3][4] = -{ -    //pos_x   pos_y     pos_z    orien -    //outside -    /* -    {-400.85f, 1513.64f, 18.67f, 0}, -    {-397.32f, 1514.12f, 18.67f, 0}, -    {-397.44f, 1511.09f, 18.67f, 0}, -    */ -    //door -    {-396.17f, 1505.86f, 19.77f, 0}, -    {-396.91f, 1505.77f, 19.77f, 0}, -    {-397.94f, 1504.74f, 19.77f, 0}, -}; - -#define WAIT_SECS 6000 - -class pyrewood_ambush : public CreatureScript -{ -public: -    pyrewood_ambush() : CreatureScript("pyrewood_ambush") { } - -    bool OnQuestAccept(Player* player, Creature* creature, const Quest *quest) override -    { -        if (quest->GetQuestId() == QUEST_PYREWOOD_AMBUSH && !ENSURE_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->QuestInProgress) -        { -            ENSURE_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->QuestInProgress = true; -            ENSURE_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->Phase = 0; -            ENSURE_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->KillCount = 0; -            ENSURE_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->PlayerGUID = player->GetGUID(); -        } - -        return true; -    } - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return new pyrewood_ambushAI(creature); -    } - -    struct pyrewood_ambushAI : public ScriptedAI -    { -        pyrewood_ambushAI(Creature* creature) : ScriptedAI(creature), Summons(me) -        { -            Initialize(); -            WaitTimer = WAIT_SECS; -            QuestInProgress = false; -        } - -        void Initialize() -        { -            Phase = 0; -            KillCount = 0; -            PlayerGUID = 0; -        } - -        uint32 Phase; -        int8 KillCount; -        uint32 WaitTimer; -        uint64 PlayerGUID; -        SummonList Summons; - -        bool QuestInProgress; - -        void Reset() override -        { -            WaitTimer = WAIT_SECS; - -            if (!QuestInProgress) //fix reset values (see UpdateVictim) -            { -                Initialize(); -                Summons.DespawnAll(); -            } -        } - -        void EnterCombat(Unit* /*who*/) override { } - -        void JustSummoned(Creature* summoned) override -        { -            Summons.Summon(summoned); -            ++KillCount; -        } - -        void SummonedCreatureDespawn(Creature* summoned) override -        { -            Summons.Despawn(summoned); -            --KillCount; -        } - -        void SummonCreatureWithRandomTarget(uint32 creatureId, int position) -        { -            if (Creature* summoned = me->SummonCreature(creatureId, PyrewoodSpawnPoints[position][0], PyrewoodSpawnPoints[position][1], PyrewoodSpawnPoints[position][2], PyrewoodSpawnPoints[position][3], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15000)) -            { -                Unit* target = NULL; -                if (PlayerGUID) -                    if (Player* player = ObjectAccessor::GetPlayer(*me, PlayerGUID)) -                        if (player->IsAlive() && RAND(0, 1)) -                            target = player; - -                if (!target) -                    target = me; - -                summoned->setFaction(168); -                summoned->AddThreat(target, 32.0f); -                summoned->AI()->AttackStart(target); -            } -        } - -        void JustDied(Unit* /*killer*/) override -        { -            if (PlayerGUID) -                if (Player* player = ObjectAccessor::GetPlayer(*me, PlayerGUID)) -                    if (player->GetQuestStatus(QUEST_PYREWOOD_AMBUSH) == QUEST_STATUS_INCOMPLETE) -                        player->FailQuest(QUEST_PYREWOOD_AMBUSH); -        } - -        void UpdateAI(uint32 diff) override -        { -            //TC_LOG_INFO("scripts", "DEBUG: p(%i) k(%i) d(%u) W(%i)", Phase, KillCount, diff, WaitTimer); - -            if (!QuestInProgress) -                return; - -            if (KillCount && Phase < 6) -            { -                if (!UpdateVictim()) //reset() on target Despawn... -                    return; - -                DoMeleeAttackIfReady(); -                return; -            } - -            switch (Phase) -            { -                case 0: -                    if (WaitTimer == WAIT_SECS) -                        me->Say(NPCSAY_INIT, LANG_UNIVERSAL); //no blizzlike - -                    if (WaitTimer <= diff) -                    { -                        WaitTimer -= diff; -                        return; -                    } -                    break; -                case 1: -                    SummonCreatureWithRandomTarget(2060, 1); -                    break; -                case 2: -                    SummonCreatureWithRandomTarget(2061, 2); -                    SummonCreatureWithRandomTarget(2062, 0); -                    break; -                case 3: -                    SummonCreatureWithRandomTarget(2063, 1); -                    SummonCreatureWithRandomTarget(2064, 2); -                    SummonCreatureWithRandomTarget(2065, 0); -                    break; -                case 4: -                    SummonCreatureWithRandomTarget(2066, 1); -                    SummonCreatureWithRandomTarget(2067, 0); -                    SummonCreatureWithRandomTarget(2068, 2); -                    break; -                case 5: //end -                    if (PlayerGUID) -                    { -                        if (Player* player = ObjectAccessor::GetPlayer(*me, PlayerGUID)) -                        { -                            me->Say(NPCSAY_END, LANG_UNIVERSAL); //not blizzlike -                            player->GroupEventHappens(QUEST_PYREWOOD_AMBUSH, me); -                        } -                    } -                    QuestInProgress = false; -                    Reset(); -                    break; -            } -            ++Phase; //prepare next phase -        } -    }; -}; - -/*######  ## AddSC  ######*/  void AddSC_silverpine_forest()  {      new npc_deathstalker_erland(); -    new pyrewood_ambush();  } diff --git a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp index ee29c0a7b6e..f48c3f7556f 100644 --- a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp +++ b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp @@ -1,6 +1,5 @@  /*   * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>   *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License as published by the @@ -16,645 +15,6 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -/* ScriptData -SDName: Stormwind_City -SD%Complete: 100 -SDComment: Quest support: 1640, 1447, 4185, 11223, 434. -SDCategory: Stormwind City -EndScriptData */ - -/* ContentData -npc_archmage_malin -npc_bartleby -npc_lady_katrana_prestor -npc_tyrion -npc_tyrion_spybot -npc_marzon_silent_blade -npc_lord_gregor_lescovar -EndContentData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "ScriptedGossip.h" -#include "ScriptedEscortAI.h" -#include "Player.h" - -/*###### -## npc_archmage_malin -######*/ - -#define GOSSIP_ITEM_MALIN "Can you send me to Theramore? I have an urgent message for Lady Jaina from Highlord Bolvar." - -class npc_archmage_malin : public CreatureScript -{ -public: -    npc_archmage_malin() : CreatureScript("npc_archmage_malin") { } - -    bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override -    { -        player->PlayerTalkClass->ClearMenus(); -        if (action == GOSSIP_ACTION_INFO_DEF) -        { -            player->CLOSE_GOSSIP_MENU(); -            creature->CastSpell(player, 42711, true); -        } - -        return true; -    } - -    bool OnGossipHello(Player* player, Creature* creature) override -    { -        if (creature->IsQuestGiver()) -            player->PrepareQuestMenu(creature->GetGUID()); - -        if (player->GetQuestStatus(11223) == QUEST_STATUS_COMPLETE) -            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_MALIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - -        player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); - -        return true; -    } -}; - -/*###### -## npc_bartleby -######*/ - -enum Bartleby -{ -    FACTION_ENEMY       = 168, -    QUEST_BEAT          = 1640 -}; - -class npc_bartleby : public CreatureScript -{ -public: -    npc_bartleby() : CreatureScript("npc_bartleby") { } - -    bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override -    { -        if (quest->GetQuestId() == QUEST_BEAT) -        { -            creature->setFaction(FACTION_ENEMY); -            creature->AI()->AttackStart(player); -        } -        return true; -    } - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return new npc_bartlebyAI(creature); -    } - -    struct npc_bartlebyAI : public ScriptedAI -    { -        npc_bartlebyAI(Creature* creature) : ScriptedAI(creature) -        { -            m_uiNormalFaction = creature->getFaction(); -        } - -        uint32 m_uiNormalFaction; - -        void Reset() override -        { -            if (me->getFaction() != m_uiNormalFaction) -                me->setFaction(m_uiNormalFaction); -        } - -        void AttackedBy(Unit* pAttacker) override -        { -            if (me->GetVictim()) -                return; - -            if (me->IsFriendlyTo(pAttacker)) -                return; - -            AttackStart(pAttacker); -        } - -        void DamageTaken(Unit* pDoneBy, uint32 &uiDamage) override -        { -            if (uiDamage > me->GetHealth() || me->HealthBelowPctDamaged(15, uiDamage)) -            { -                //Take 0 damage -                uiDamage = 0; - -                if (Player* player = pDoneBy->ToPlayer()) -                    player->AreaExploredOrEventHappens(QUEST_BEAT); -                EnterEvadeMode(); -            } -        } -    }; -}; - -/*###### -## npc_lady_katrana_prestor -######*/ - -#define GOSSIP_ITEM_KAT_1 "Pardon the intrusion, Lady Prestor, but Highlord Bolvar suggested that I seek your advice." -#define GOSSIP_ITEM_KAT_2 "My apologies, Lady Prestor." -#define GOSSIP_ITEM_KAT_3 "Begging your pardon, Lady Prestor. That was not my intent." -#define GOSSIP_ITEM_KAT_4 "Thank you for your time, Lady Prestor." - -class npc_lady_katrana_prestor : public CreatureScript -{ -public: -    npc_lady_katrana_prestor() : CreatureScript("npc_lady_katrana_prestor") { } - -    bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override -    { -        player->PlayerTalkClass->ClearMenus(); -        switch (action) -        { -            case GOSSIP_ACTION_INFO_DEF: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAT_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); -                player->SEND_GOSSIP_MENU(2694, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+1: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAT_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); -                player->SEND_GOSSIP_MENU(2695, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+2: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAT_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); -                player->SEND_GOSSIP_MENU(2696, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+3: -                player->CLOSE_GOSSIP_MENU(); -                player->AreaExploredOrEventHappens(4185); -                break; -        } -        return true; -    } - -    bool OnGossipHello(Player* player, Creature* creature) override -    { -        if (creature->IsQuestGiver()) -            player->PrepareQuestMenu(creature->GetGUID()); - -        if (player->GetQuestStatus(4185) == QUEST_STATUS_INCOMPLETE) -            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAT_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - -        player->SEND_GOSSIP_MENU(2693, creature->GetGUID()); - -        return true; -    } -}; - -/*###### -## npc_lord_gregor_lescovar -######*/ - -enum LordGregorLescovar -{ -    SAY_GUARD_2    = 0, -    SAY_LESCOVAR_2 = 0, -    SAY_LESCOVAR_3 = 1, -    SAY_LESCOVAR_4 = 2, -    SAY_MARZON_1   = 0, -    SAY_MARZON_2   = 1, -    SAY_TYRION_2   = 1, - -    NPC_STORMWIND_ROYAL = 1756, -    NPC_MARZON_BLADE    = 1755, -    NPC_TYRION          = 7766, - -    QUEST_THE_ATTACK    = 434 -}; - -class npc_lord_gregor_lescovar : public CreatureScript -{ -public: -    npc_lord_gregor_lescovar() : CreatureScript("npc_lord_gregor_lescovar") { } - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return new npc_lord_gregor_lescovarAI(creature); -    } - -    struct npc_lord_gregor_lescovarAI : public npc_escortAI -    { -        npc_lord_gregor_lescovarAI(Creature* creature) : npc_escortAI(creature) -        { -            Initialize(); -        } - -        void Initialize() -        { -            uiTimer = 0; -            uiPhase = 0; - -            MarzonGUID = 0; -        } - -        uint32 uiTimer; -        uint32 uiPhase; - -        uint64 MarzonGUID; - -        void Reset() override -        { -            Initialize(); -        } - -        void EnterEvadeMode() override -        { -            me->DisappearAndDie(); - -            if (Creature* pMarzon = ObjectAccessor::GetCreature(*me, MarzonGUID)) -            { -                if (pMarzon->IsAlive()) -                    pMarzon->DisappearAndDie(); -            } -        } - -        void EnterCombat(Unit* who) override -        { -            if (Creature* pMarzon = ObjectAccessor::GetCreature(*me, MarzonGUID)) -            { -                if (pMarzon->IsAlive() && !pMarzon->IsInCombat()) -                    pMarzon->AI()->AttackStart(who); -            } -        } - -        void WaypointReached(uint32 waypointId) override -        { -            switch (waypointId) -            { -                case 14: -                    SetEscortPaused(true); -                    Talk(SAY_LESCOVAR_2); -                    uiTimer = 3000; -                    uiPhase = 1; -                    break; -                case 16: -                    SetEscortPaused(true); -                    if (Creature* pMarzon = me->SummonCreature(NPC_MARZON_BLADE, -8411.360352f, 480.069733f, 123.760895f, 4.941504f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1000)) -                    { -                        pMarzon->GetMotionMaster()->MovePoint(0, -8408.000977f, 468.611450f, 123.759903f); -                        MarzonGUID = pMarzon->GetGUID(); -                    } -                    uiTimer = 2000; -                    uiPhase = 4; -                    break; -            } -        } -        //TO-DO: We don't have movemaps, also we can't make 2 npcs walks to one point propperly (and we can not use escort ai, because they are 2 different spawns and with same entry), because of it we make them, disappear. -        void DoGuardsDisappearAndDie() -        { -            std::list<Creature*> GuardList; -            me->GetCreatureListWithEntryInGrid(GuardList, NPC_STORMWIND_ROYAL, 8.0f); -            if (!GuardList.empty()) -            { -                for (std::list<Creature*>::const_iterator itr = GuardList.begin(); itr != GuardList.end(); ++itr) -                { -                    if (Creature* pGuard = *itr) -                        pGuard->DisappearAndDie(); -                } -            } -        } - -        void UpdateAI(uint32 uiDiff) override -        { -            if (uiPhase) -            { -                if (uiTimer <= uiDiff) -                { -                    switch (uiPhase) -                    { -                        case 1: -                            if (Creature* pGuard = me->FindNearestCreature(NPC_STORMWIND_ROYAL, 8.0f, true)) -                                pGuard->AI()->Talk(SAY_GUARD_2); -                            uiTimer = 3000; -                            uiPhase = 2; -                            break; -                        case 2: -                            DoGuardsDisappearAndDie(); -                            uiTimer = 2000; -                            uiPhase = 3; -                            break; -                        case 3: -                            SetEscortPaused(false); -                            uiTimer = 0; -                            uiPhase = 0; -                            break; -                        case 4: -                            Talk(SAY_LESCOVAR_3); -                            uiTimer = 0; -                            uiPhase = 0; -                            break; -                        case 5: -                            if (Creature* pMarzon = ObjectAccessor::GetCreature(*me, MarzonGUID)) -                                pMarzon->AI()->Talk(SAY_MARZON_1); -                            uiTimer = 3000; -                            uiPhase = 6; -                            break; -                        case 6: -                            Talk(SAY_LESCOVAR_4); -                            if (Player* player = GetPlayerForEscort()) -                                player->AreaExploredOrEventHappens(QUEST_THE_ATTACK); -                            uiTimer = 2000; -                            uiPhase = 7; -                            break; -                        case 7: -                            if (Creature* pTyrion = me->FindNearestCreature(NPC_TYRION, 20.0f, true)) -                                pTyrion->AI()->Talk(SAY_TYRION_2); -                            if (Creature* pMarzon = ObjectAccessor::GetCreature(*me, MarzonGUID)) -                                pMarzon->setFaction(14); -                            me->setFaction(14); -                            uiTimer = 0; -                            uiPhase = 0; -                            break; -                    } -                } else uiTimer -= uiDiff; -            } -            npc_escortAI::UpdateAI(uiDiff); - -            if (!UpdateVictim()) -                return; - -            DoMeleeAttackIfReady(); -        } -    }; -}; - -/*###### -## npc_marzon_silent_blade -######*/ - -class npc_marzon_silent_blade : public CreatureScript -{ -public: -    npc_marzon_silent_blade() : CreatureScript("npc_marzon_silent_blade") { } - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return new npc_marzon_silent_bladeAI(creature); -    } - -    struct npc_marzon_silent_bladeAI : public ScriptedAI -    { -        npc_marzon_silent_bladeAI(Creature* creature) : ScriptedAI(creature) -        { -            me->SetWalk(true); -        } - -        void Reset() override -        { -            me->RestoreFaction(); -        } - -        void EnterCombat(Unit* who) override -        { -            Talk(SAY_MARZON_2); - -            if (me->IsSummon()) -            { -                if (Unit* summoner = me->ToTempSummon()->GetSummoner()) -                { -                    if (summoner->GetTypeId() == TYPEID_UNIT && summoner->IsAlive() && !summoner->IsInCombat()) -                        summoner->ToCreature()->AI()->AttackStart(who); -                } -            } -        } - -        void EnterEvadeMode() override -        { -            me->DisappearAndDie(); - -            if (me->IsSummon()) -            { -                if (Unit* summoner = me->ToTempSummon()->GetSummoner()) -                { -                    if (summoner->GetTypeId() == TYPEID_UNIT && summoner->IsAlive()) -                        summoner->ToCreature()->DisappearAndDie(); -                } -            } -        } - -        void MovementInform(uint32 uiType, uint32 /*uiId*/) override -        { -            if (uiType != POINT_MOTION_TYPE) -                return; - -            if (me->IsSummon()) -            { -                Unit* summoner = me->ToTempSummon()->GetSummoner(); -                if (summoner && summoner->GetTypeId() == TYPEID_UNIT && summoner->IsAIEnabled) -                { -                    npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI* ai = -                        CAST_AI(npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI, summoner->GetAI()); -                    if (ai) -                    { -                        ai->uiTimer = 2000; -                        ai->uiPhase = 5; -                    } -                    //me->ChangeOrient(0.0f, summoner); -                } -            } -        } - -        void UpdateAI(uint32 /*diff*/) override -        { -            if (!UpdateVictim()) -                return; - -            DoMeleeAttackIfReady(); -        } -    }; -}; - -/*###### -## npc_tyrion_spybot -######*/ - -enum TyrionSpybot -{ -    SAY_QUEST_ACCEPT_ATTACK  = 0, -    SAY_SPYBOT_1             = 1, -    SAY_SPYBOT_2             = 2, -    SAY_SPYBOT_3             = 3, -    SAY_SPYBOT_4             = 4, -    SAY_TYRION_1             = 0, -    SAY_GUARD_1              = 1, -    SAY_LESCOVAR_1           = 3, - -    NPC_PRIESTESS_TYRIONA    = 7779, -    NPC_LORD_GREGOR_LESCOVAR = 1754, -}; - -class npc_tyrion_spybot : public CreatureScript -{ -public: -    npc_tyrion_spybot() : CreatureScript("npc_tyrion_spybot") { } - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return new npc_tyrion_spybotAI(creature); -    } - -    struct npc_tyrion_spybotAI : public npc_escortAI -    { -        npc_tyrion_spybotAI(Creature* creature) : npc_escortAI(creature) -        { -            Initialize(); -        } - -        void Initialize() -        { -            uiTimer = 0; -            uiPhase = 0; -        } - -        uint32 uiTimer; -        uint32 uiPhase; - -        void Reset() override -        { -            Initialize(); -        } - -        void WaypointReached(uint32 waypointId) override -        { -            switch (waypointId) -            { -                case 1: -                    SetEscortPaused(true); -                    uiTimer = 2000; -                    uiPhase = 1; -                    break; -                case 5: -                    SetEscortPaused(true); -                    Talk(SAY_SPYBOT_1); -                    uiTimer = 2000; -                    uiPhase = 5; -                    break; -                case 17: -                    SetEscortPaused(true); -                    Talk(SAY_SPYBOT_3); -                    uiTimer = 3000; -                    uiPhase = 8; -                    break; -            } -        } - -        void UpdateAI(uint32 uiDiff) override -        { -            if (uiPhase) -            { -                if (uiTimer <= uiDiff) -                { -                    switch (uiPhase) -                    { -                        case 1: -                            Talk(SAY_QUEST_ACCEPT_ATTACK); -                            uiTimer = 3000; -                            uiPhase = 2; -                            break; -                        case 2: -                            if (Creature* pTyrion = me->FindNearestCreature(NPC_TYRION, 10.0f)) -                                pTyrion->AI()->Talk(SAY_TYRION_1); -                            uiTimer = 3000; -                            uiPhase = 3; -                            break; -                        case 3: -                            me->UpdateEntry(NPC_PRIESTESS_TYRIONA); -                            uiTimer = 2000; -                            uiPhase = 4; -                            break; -                        case 4: -                           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); -                            uiTimer = 3000; -                            uiPhase = 6; -                            break; -                        case 6: -                            Talk(SAY_SPYBOT_2); -                            uiTimer = 3000; -                            uiPhase = 7; -                            break; -                        case 7: -                            SetEscortPaused(false); -                            uiTimer = 0; -                            uiPhase = 0; -                            break; -                        case 8: -                            if (Creature* pLescovar = me->FindNearestCreature(NPC_LORD_GREGOR_LESCOVAR, 10.0f)) -                                pLescovar->AI()->Talk(SAY_LESCOVAR_1); -                            uiTimer = 3000; -                            uiPhase = 9; -                            break; -                        case 9: -                            Talk(SAY_SPYBOT_4); -                            uiTimer = 3000; -                            uiPhase = 10; -                            break; -                        case 10: -                            if (Creature* pLescovar = me->FindNearestCreature(NPC_LORD_GREGOR_LESCOVAR, 10.0f)) -                            { -                                if (Player* player = GetPlayerForEscort()) -                                { -                                    ENSURE_AI(npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI, pLescovar->AI())->Start(false, false, player->GetGUID()); -                                    ENSURE_AI(npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI, pLescovar->AI())->SetMaxPlayerDistance(200.0f); -                                } -                            } -                            me->DisappearAndDie(); -                            uiTimer = 0; -                            uiPhase = 0; -                            break; -                    } -                } else uiTimer -= uiDiff; -            } -            npc_escortAI::UpdateAI(uiDiff); - -            if (!UpdateVictim()) -                return; - -            DoMeleeAttackIfReady(); -        } -    }; -}; - -/*###### -## npc_tyrion -######*/ - -enum Tyrion -{ -    NPC_TYRION_SPYBOT = 8856 -}; - -class npc_tyrion : public CreatureScript -{ -public: -    npc_tyrion() : CreatureScript("npc_tyrion") { } - -    bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override -    { -        if (quest->GetQuestId() == QUEST_THE_ATTACK) -        { -            if (Creature* pSpybot = creature->FindNearestCreature(NPC_TYRION_SPYBOT, 5.0f, true)) -            { -                ENSURE_AI(npc_tyrion_spybot::npc_tyrion_spybotAI, pSpybot->AI())->Start(false, false, player->GetGUID()); -                ENSURE_AI(npc_tyrion_spybot::npc_tyrion_spybotAI, pSpybot->AI())->SetMaxPlayerDistance(200.0f); -            } -            return true; -        } -        return false; -    } -}; -  void AddSC_stormwind_city()  { -    new npc_archmage_malin(); -    new npc_bartleby(); -    new npc_lady_katrana_prestor(); -    new npc_tyrion(); -    new npc_tyrion_spybot(); -    new npc_lord_gregor_lescovar(); -    new npc_marzon_silent_blade();  } diff --git a/src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp b/src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp index 20e9f28e0b7..69b9ca85a23 100644 --- a/src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp +++ b/src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp @@ -16,136 +16,6 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "ScriptedEscortAI.h" -#include "Player.h" - -/*###### -## npc_galen_goodward -######*/ - -enum Galen -{ -    QUEST_GALENS_ESCAPE     = 1393, -    GO_GALENS_CAGE          = 37118, -    SAY_PERIODIC            = 0, -    SAY_QUEST_ACCEPTED      = 1, -    SAY_ATTACKED            = 2, -    SAY_QUEST_COMPLETE      = 3, -    EMOTE_WHISPER           = 4, -    EMOTE_DISAPPEAR         = 5 -}; - -class npc_galen_goodward : public CreatureScript -{ -public: -    npc_galen_goodward() : CreatureScript("npc_galen_goodward") { } - -    struct npc_galen_goodwardAI : public npc_escortAI -    { -        npc_galen_goodwardAI(Creature* creature) : npc_escortAI(creature) -        { -            galensCageGUID = 0; -            Reset(); -        } - -        void Reset() override -        { -            periodicSay = 6000; -        } - -        void EnterCombat(Unit* who) override -        { -            if (HasEscortState(STATE_ESCORT_ESCORTING)) -                Talk(SAY_ATTACKED, who); -        } - -        void sQuestAccept(Player* player, Quest const* quest) -        { -            if (quest->GetQuestId() == QUEST_GALENS_ESCAPE) -            { -                Talk(SAY_QUEST_ACCEPTED, player); -                npc_escortAI::Start(false, false, player->GetGUID(), quest); -            } -        } - -        void WaypointStart(uint32 uiPointId) override -        { -            switch (uiPointId) -            { -            case 0: -                { -                    GameObject* cage = NULL; -                    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; -            } -        } - -        void WaypointReached(uint32 waypointId) override -        { -            switch (waypointId) -            { -                case 0: -                    if (GameObject* cage = me->GetMap()->GetGameObject(galensCageGUID)) -                        cage->ResetDoorOrButton(); -                    break; -                case 20: -                    if (Player* player = GetPlayerForEscort()) -                    { -                        me->SetFacingToObject(player); -                        Talk(SAY_QUEST_COMPLETE, player); -                        Talk(EMOTE_WHISPER, player); -                        player->GroupEventHappens(QUEST_GALENS_ESCAPE, me); -                    } -                    SetRun(true); -                    break; -            } -        } - -        void UpdateAI(uint32 diff) override -        { -            npc_escortAI::UpdateAI(diff); - -            if (HasEscortState(STATE_ESCORT_NONE)) -                return; - -            if (periodicSay < diff) -            { -                if (!HasEscortState(STATE_ESCORT_ESCORTING)) -                    Talk(SAY_PERIODIC); -                periodicSay = 15000; -            } -            else -                periodicSay -= diff; - -            DoMeleeAttackIfReady(); -        } - -    private: -        uint64 galensCageGUID; -        uint32 periodicSay; -    }; - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return new npc_galen_goodwardAI(creature); -    } -}; -  void AddSC_swamp_of_sorrows()  { -    new npc_galen_goodward();  } diff --git a/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp b/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp index f953742b864..b03965ea9e3 100644 --- a/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp +++ b/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp @@ -1,6 +1,5 @@  /*   * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>   *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License as published by the @@ -16,211 +15,6 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -/* ScriptData -SDName: Tirisfal_Glades -SD%Complete: 100 -SDComment: Quest support: 590, 1819 -SDCategory: Tirisfal Glades -EndScriptData */ - -/* ContentData -npc_calvin_montague -go_mausoleum_door -go_mausoleum_trigger -EndContentData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "Player.h" - -/*###### -## npc_calvin_montague -######*/ - -enum Calvin -{ -    SAY_COMPLETE        = 0, -    SPELL_DRINK         = 2639,                             // possibly not correct spell (but iconId is correct) -    QUEST_590           = 590, -    FACTION_HOSTILE     = 168 -}; - -class npc_calvin_montague : public CreatureScript -{ -public: -    npc_calvin_montague() : CreatureScript("npc_calvin_montague") { } - -    bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override -    { -        if (quest->GetQuestId() == QUEST_590) -        { -            creature->setFaction(FACTION_HOSTILE); -            creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); -            ENSURE_AI(npc_calvin_montague::npc_calvin_montagueAI, creature->AI())->AttackStart(player); -        } -        return true; -    } - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return new npc_calvin_montagueAI(creature); -    } - -    struct npc_calvin_montagueAI : public ScriptedAI -    { -        npc_calvin_montagueAI(Creature* creature) : ScriptedAI(creature) -        { -            Initialize(); -        } - -        void Initialize() -        { -            m_uiPhase = 0; -            m_uiPhaseTimer = 5000; -            m_uiPlayerGUID = 0; -        } - -        uint32 m_uiPhase; -        uint32 m_uiPhaseTimer; -        uint64 m_uiPlayerGUID; - -        void Reset() override -        { -            Initialize(); - -            me->RestoreFaction(); - -            if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC)) -                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); -        } - -        void EnterCombat(Unit* /*who*/) override { } - -        void AttackedBy(Unit* pAttacker) override -        { -            if (me->GetVictim() || me->IsFriendlyTo(pAttacker)) -                return; - -            AttackStart(pAttacker); -        } - -        void DamageTaken(Unit* pDoneBy, uint32 &uiDamage) override -        { -            if (uiDamage > me->GetHealth() || me->HealthBelowPctDamaged(15, uiDamage)) -            { -                uiDamage = 0; - -                me->RestoreFaction(); -                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); -                me->CombatStop(true); - -                m_uiPhase = 1; - -                if (pDoneBy->GetTypeId() == TYPEID_PLAYER) -                    m_uiPlayerGUID = pDoneBy->GetGUID(); -            } -        } - -        void UpdateAI(uint32 diff) override -        { -            if (m_uiPhase) -            { -                if (m_uiPhaseTimer <= diff) -                    m_uiPhaseTimer = 7500; -                else -                { -                    m_uiPhaseTimer -= diff; -                    return; -                } - -                switch (m_uiPhase) -                { -                    case 1: -                        Talk(SAY_COMPLETE); -                        ++m_uiPhase; -                        break; -                    case 2: -                        if (Player* player = ObjectAccessor::GetPlayer(*me, m_uiPlayerGUID)) -                            player->AreaExploredOrEventHappens(QUEST_590); - -                        DoCast(me, SPELL_DRINK, true); -                        ++m_uiPhase; -                        break; -                    case 3: -                        EnterEvadeMode(); -                        break; -                } - -                return; -            } - -            if (!UpdateVictim()) -                return; - -            DoMeleeAttackIfReady(); -        } -    }; -}; - -/*###### -## go_mausoleum_door -## go_mausoleum_trigger -######*/ - -enum Mausoleum -{ -    QUEST_ULAG      = 1819, -    NPC_ULAG        = 6390, -    GO_TRIGGER      = 104593, -    GO_DOOR         = 176594 -}; - -class go_mausoleum_door : public GameObjectScript -{ -public: -    go_mausoleum_door() : GameObjectScript("go_mausoleum_door") { } - -    bool OnGossipHello(Player* player, GameObject* /*go*/) override -    { -        if (player->GetQuestStatus(QUEST_ULAG) != QUEST_STATUS_INCOMPLETE) -            return false; - -        if (!player->FindNearestCreature(NPC_ULAG, 50.0f)) -            if (GameObject* pTrigger = player->FindNearestGameObject(GO_TRIGGER, 30.0f)) -            { -                pTrigger->SetGoState(GO_STATE_READY); -                player->SummonCreature(NPC_ULAG, 2390.26f, 336.47f, 40.01f, 2.26f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 300000); -                return false; -            } - -        return false; -    } -}; - -class go_mausoleum_trigger : public GameObjectScript -{ -public: -    go_mausoleum_trigger() : GameObjectScript("go_mausoleum_trigger") { } - -    bool OnGossipHello(Player* player, GameObject* go) override -    { -        if (player->GetQuestStatus(QUEST_ULAG) != QUEST_STATUS_INCOMPLETE) -            return false; - -        if (GameObject* pDoor = player->FindNearestGameObject(GO_DOOR, 30.0f)) -        { -            go->SetGoState(GO_STATE_ACTIVE); -            pDoor->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND); -            return true; -        } - -        return false; -    } -}; -  void AddSC_tirisfal_glades()  { -    new npc_calvin_montague(); -    new go_mausoleum_door(); -    new go_mausoleum_trigger();  } diff --git a/src/server/scripts/Kalimdor/CMakeLists.txt b/src/server/scripts/Kalimdor/CMakeLists.txt index 1adc8a53271..d52a9aca48b 100644 --- a/src/server/scripts/Kalimdor/CMakeLists.txt +++ b/src/server/scripts/Kalimdor/CMakeLists.txt @@ -106,7 +106,6 @@ set(scripts_STAT_SRCS    Kalimdor/WailingCaverns/wailing_caverns.cpp    Kalimdor/zone_durotar.cpp    Kalimdor/zone_felwood.cpp -  Kalimdor/boss_azuregos.cpp    Kalimdor/zone_tanaris.cpp    Kalimdor/zone_dustwallow_marsh.cpp    Kalimdor/zone_winterspring.cpp @@ -118,6 +117,14 @@ set(scripts_STAT_SRCS    Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp    Kalimdor/RagefireChasm/instance_ragefire_chasm.cpp    Kalimdor/DireMaul/instance_dire_maul.cpp +  Kalimdor/HallsOfOrigination/halls_of_origination.h +  Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp +  Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp +  Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp +  Kalimdor/HallsOfOrigination/boss_anraphet.cpp +  Kalimdor/Firelands/instance_firelands.cpp +  Kalimdor/Firelands/firelands.h +  Kalimdor/Firelands/boss_alysrazor.cpp  )  message("  -> Prepared: Kalimdor") diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp index d3c137b67e8..dcad4480fde 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp @@ -229,7 +229,7 @@ class spell_mark_of_kazrogal : public SpellScriptLoader              }          }; -        SpellScript* GetSpellScript() const +        SpellScript* GetSpellScript() const override          {              return new spell_mark_of_kazrogal_SpellScript();          } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp index 69eba98f406..9bcc7c933fb 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp @@ -30,6 +30,7 @@ EndScriptData */  #include "Player.h"  #include "WorldPacket.h"  #include "Chat.h" +#include "WorldSession.h"  /* Battle of Mount Hyjal encounters:  0 - Rage Winterchill event @@ -187,6 +188,7 @@ public:                                           if (Player* player = i->GetSource())                                           {                                              WorldPacket packet; +                                              ChatHandler::BuildChatPacket(packet, CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, unit, player, YELL_EFFORTS);                                              player->SendDirectMessage(&packet);                                              player->PlayDirectSound(10986, player); diff --git a/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp b/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp new file mode 100644 index 00000000000..d76de6eeb42 --- /dev/null +++ b/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp @@ -0,0 +1,704 @@ +/* + * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "ObjectMgr.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "PassiveAI.h" +#include "SpellScript.h" +#include "MoveSplineInit.h" +#include "Cell.h" +#include "CellImpl.h" +#include "GridNotifiers.h" +#include "GridNotifiersImpl.h" +#include "firelands.h" + +enum Texts +{ +    // Egg Pile +    EMOTE_CRACKING_EGGS         = 0,    // The Molten Eggs begin to crack and splinter! +}; + +enum Spells +{ +    // Harbinger of Flame +    SPELL_FIRE_IT_UP                            = 100093, +    SPELL_FIEROBLAST_TRASH                      = 100094, +    SPELL_FIEROCLAST_BARRAGE                    = 100095, +    SPELL_FIRE_CHANNELING                       = 100109, + +    // Blazing Monstrosity +    SPELL_RIDE_MONSTROSITY                      = 93970, +    SPELL_SHARE_HEALTH_LEFT                     = 101502, +    SPELL_SHARE_HEALTH_RIGHT                    = 101503, +    SPELL_SLEEP_ULTRA_HIGH_PRIORITY             = 99480, +    SPELL_GENERIC_DUMMY_CAST                    = 100088, +    SPELL_LEFT_SIDE_SMACK_L                     = 100076, +    SPELL_RIGHT_SIDE_SMACK_L                    = 100078, +    SPELL_HEAD_BONK_L                           = 100080, +    SPELL_TICKLE_L                              = 100082, +    SPELL_KNOCKBACK_RIGHT                       = 100084, +    SPELL_KNOCKBACK_LEFT                        = 100085, +    SPELL_KNOCKBACK_FORWARD                     = 100086, +    SPELL_KNOCKBACK_BACK                        = 100087, +    SPELL_HEAD_BONK_R                           = 100089, +    SPELL_LEFT_SIDE_SMACK_R                     = 100090, +    SPELL_RIGHT_SIDE_SMACK_R                    = 100091, +    SPELL_TICKLE_R                              = 100092, +    SPELL_MOLTEN_BARRAGE_EFFECT_L               = 100071, +    SPELL_MOLTEN_BARRAGE_LEFT                   = 100072, +    SPELL_MOLTEN_BARRAGE_RIGHT                  = 100073, +    SPELL_MOLTEN_BARRAGE_EFFECT_R               = 100074, +    SPELL_MOLTEN_BARRAGE_VISUAL                 = 100075, +    SPELL_AGGRO_CLOSEST                         = 100462, +    SPELL_INVISIBILITY_AND_STEALTH_DETECTION    = 18950, + +    // Egg Pile +    SPELL_SUMMON_SMOULDERING_HATCHLING          = 100096, +    SPELL_MOLTEN_EGG_TRASH_CALL_L               = 100097, +    SPELL_MOLTEN_EGG_TRASH_CALL_R               = 100098, +    SPELL_ALYSRAZOR_COSMETIC_EGG_XPLOSION       = 100099, +}; + +#define SPELL_SHARE_HEALTH          (me->GetEntry() == NPC_BLAZING_MONSTROSITY_LEFT ? SPELL_SHARE_HEALTH_LEFT : SPELL_SHARE_HEALTH_RIGHT) +#define SPELL_MOLTEN_BARRAGE        (me->GetEntry() == NPC_BLAZING_MONSTROSITY_LEFT ? SPELL_MOLTEN_BARRAGE_LEFT : SPELL_MOLTEN_BARRAGE_RIGHT) +#define SPELL_MOLTEN_BARRAGE_EFFECT (me->GetEntry() == NPC_BLAZING_MONSTROSITY_LEFT ? SPELL_MOLTEN_BARRAGE_EFFECT_L : SPELL_MOLTEN_BARRAGE_EFFECT_R) + +enum Events +{ +    // Blazing Monstrosity +    EVENT_START_SPITTING                = 1, +    EVENT_CONTINUE_SPITTING             = 2, + +    // Harbinger of Flame +    EVENT_FIEROBLAST                    = 1, +    EVENT_FIEROCLAST_BARRAGE            = 2, + +    // Egg Pile +    EVENT_SUMMON_SMOULDERING_HATCHLING  = 1, +}; + +enum MiscData +{ +    MODEL_INVISIBLE_STALKER     = 11686, +    ANIM_KIT_BIRD_WAKE          = 1469, +    ANIM_KIT_BIRD_TURN          = 1473, +}; + +class RespawnEggEvent : public BasicEvent +{ +    public: +        explicit RespawnEggEvent(Creature* egg) : _egg(egg) { } + +        bool Execute(uint64 /*time*/, uint32 /*diff*/) +        { +            _egg->RestoreDisplayId(); +            return true; +        } + +    private: +        Creature* _egg; +}; + +class MoltenEggCheck +{ +    public: +        explicit MoltenEggCheck(Creature* pile) : _eggPile(pile) { } + +        bool operator()(Unit* object) const +        { +            if (object->GetEntry() != NPC_MOLTEN_EGG_TRASH) +                return false; + +            if (object->GetDisplayId() != object->GetNativeDisplayId()) +                return false; + +            if (_eggPile->GetDistance2d(object) > 20.0f) +                return false; + +            return true; +        } + +    private: +        Creature* _eggPile; +}; + +class TrashRespawnWorker +{ +    public: +        void operator()(Creature* creature) const +        { +            switch (creature->GetEntry()) +            { +                case NPC_BLAZING_MONSTROSITY_LEFT: +                case NPC_BLAZING_MONSTROSITY_RIGHT: +                case NPC_EGG_PILE: +                case NPC_HARBINGER_OF_FLAME: +                case NPC_MOLTEN_EGG_TRASH: +                    if (!creature->IsAlive()) +                        creature->Respawn(true); +                    break; +                case NPC_SMOULDERING_HATCHLING: +                    creature->DespawnOrUnsummon(); +                    break; +            } +        } +}; + +static void AlysrazorTrashEvaded(Creature* creature) +{ +    TrashRespawnWorker check; +    Trinity::CreatureWorker<TrashRespawnWorker> worker(creature, check); +    creature->VisitNearbyGridObject(SIZE_OF_GRIDS, worker); +} + +class npc_harbinger_of_flame : public CreatureScript +{ +    public: +        npc_harbinger_of_flame() : CreatureScript("npc_harbinger_of_flame") { } + +        struct npc_harbinger_of_flameAI : public ScriptedAI +        { +            npc_harbinger_of_flameAI(Creature* creature) : ScriptedAI(creature) +            { +            } + +            void EnterCombat(Unit* /*target*/) +            { +                if (Creature* bird = ObjectAccessor::GetCreature(*me, me->GetUInt64Value(UNIT_FIELD_CHANNEL_OBJECT))) +                    DoZoneInCombat(bird, 200.0f); + +                me->InterruptSpell(CURRENT_CHANNELED_SPELL); +                _events.Reset(); +                _events.ScheduleEvent(EVENT_FIEROBLAST, 1); +                _events.ScheduleEvent(EVENT_FIEROCLAST_BARRAGE, 6000); +            } + +            void JustReachedHome() override +            { +                AlysrazorTrashEvaded(me); +            } + +            void MoveInLineOfSight(Unit* unit) override +            { +                if (me->IsInCombat()) +                    return; + +                if (!unit->IsCharmedOwnedByPlayerOrPlayer()) +                    return; + +                ScriptedAI::MoveInLineOfSight(unit); +            } + +            void UpdateAI(uint32 diff) override +            { +                if (!me->IsInCombat()) +                    if (!me->GetCurrentSpell(CURRENT_CHANNELED_SPELL)) +                        if (Creature* fireBird = me->FindNearestCreature((me->GetHomePosition().GetPositionY() > -275.0f ? NPC_BLAZING_MONSTROSITY_LEFT : NPC_BLAZING_MONSTROSITY_RIGHT), 100.0f)) +                            DoCast(fireBird, SPELL_FIRE_CHANNELING); + +                if (!UpdateVictim()) +                    return; + +                _events.Update(diff); + +                if (me->HasUnitState(UNIT_STATE_CASTING)) +                    return; + +                while (uint32 eventId = _events.ExecuteEvent()) +                { +                    switch (eventId) +                    { +                        case EVENT_FIEROBLAST: +                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, false, -SPELL_RIDE_MONSTROSITY)) +                                DoCast(target, SPELL_FIEROBLAST_TRASH); +                            _events.RescheduleEvent(EVENT_FIEROBLAST, 500);  // cast time is longer, but thanks to UNIT_STATE_CASTING check it won't trigger more often (need this because this creature gets a stacking haste aura) +                            break; +                        case EVENT_FIEROCLAST_BARRAGE: +                            DoCastAOE(SPELL_FIEROCLAST_BARRAGE); +                            _events.ScheduleEvent(EVENT_FIEROCLAST_BARRAGE, urand(9000, 12000)); +                            break; +                    } +                } + +                DoMeleeAttackIfReady(); +            } + +        private: +            EventMap _events; +        }; + +        CreatureAI* GetAI(Creature* creature) const override +        { +            return new npc_harbinger_of_flameAI(creature); +        } +}; + +class npc_blazing_monstrosity : public CreatureScript +{ +    public: +        npc_blazing_monstrosity() : CreatureScript("npc_blazing_monstrosity") { } + +        struct npc_blazing_monstrosityAI : public PassiveAI +        { +            npc_blazing_monstrosityAI(Creature* creature) : PassiveAI(creature), _summons(creature) +            { +            } + +            void EnterEvadeMode() override +            { +                _summons.DespawnAll(); +                _events.Reset(); +                PassiveAI::EnterEvadeMode(); +            } + +            void JustDied(Unit* /*killer*/) override +            { +                _summons.DespawnAll(); +                _events.Reset(); +            } + +            void JustReachedHome() override +            { +                AlysrazorTrashEvaded(me); +            } + +            void EnterCombat(Unit* /*target*/) +            { +                DoZoneInCombat(); +                me->RemoveAurasDueToSpell(SPELL_SLEEP_ULTRA_HIGH_PRIORITY); +                me->PlayOneShotAnimKit(ANIM_KIT_BIRD_WAKE); +                _events.Reset(); +                _events.ScheduleEvent(EVENT_START_SPITTING, 6000); +                _events.ScheduleEvent(EVENT_CONTINUE_SPITTING, 9000); +            } + +            void PassengerBoarded(Unit* passenger, int8 /*seat*/, bool apply) override +            { +                if (!apply) +                    return; + +                // Our passenger is another vehicle (boardable by players) +                DoCast(passenger, SPELL_SHARE_HEALTH, true); +                passenger->setFaction(35); +                passenger->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + +                // Hack to relocate vehicle on vehicle so exiting players are not moved under map +                Movement::MoveSplineInit init(passenger); +                init.DisableTransportPathTransformations(); +                init.MoveTo(0.6654003f, 0.0f, 1.9815f); +                init.SetFacing(0.0f); +                init.Launch(); +            } + +            void JustSummoned(Creature* summon) override +            { +                _summons.Summon(summon); +            } + +            void SummonedCreatureDespawn(Creature* summon) override +            { +                _summons.Despawn(summon); +            } + +            void UpdateAI(uint32 diff) override +            { +                if (!UpdateVictim()) +                    return; + +                _events.Update(diff); + +                while (uint32 eventId = _events.ExecuteEvent()) +                { +                    switch (eventId) +                    { +                        case EVENT_START_SPITTING: +                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, false, -SPELL_RIDE_MONSTROSITY)) +                                DoCast(target, SPELL_MOLTEN_BARRAGE); +                            break; +                        case EVENT_CONTINUE_SPITTING: +                            DoCastAOE(SPELL_MOLTEN_BARRAGE_EFFECT); +                            if (Creature* egg = me->FindNearestCreature(NPC_EGG_PILE, 100.0f)) +                                egg->AI()->DoAction(me->GetEntry()); +                            break; +                    } +                } +            } + +        private: +            SummonList _summons; +            EventMap _events; +        }; + +        CreatureAI* GetAI(Creature* creature) const override +        { +            return new npc_blazing_monstrosityAI(creature); +        } +}; + +class npc_molten_barrage : public CreatureScript +{ +    public: +        npc_molten_barrage() : CreatureScript("npc_molten_barrage") { } + +        struct npc_molten_barrageAI : public NullCreatureAI +        { +            npc_molten_barrageAI(Creature* creature) : NullCreatureAI(creature) +            { +            } + +            void AttackStart(Unit* target) override +            { +                if (target) +                    me->GetMotionMaster()->MoveFollow(target, 0.0f, 0.0f, MOTION_SLOT_IDLE); +            } + +            void IsSummonedBy(Unit* /*summoner*/) override +            { +                DoCastAOE(SPELL_AGGRO_CLOSEST, true); +                DoCast(me, SPELL_MOLTEN_BARRAGE_VISUAL); +                DoCast(me, SPELL_INVISIBILITY_AND_STEALTH_DETECTION, true); +            } + +            void MovementInform(uint32 movementType, uint32 /*pointId*/) override +            { +                if (movementType != EFFECT_MOTION_TYPE) +                    return; + +                DoCastAOE(SPELL_AGGRO_CLOSEST); +                me->ClearUnitState(UNIT_STATE_CANNOT_TURN); +            } +        }; + +        CreatureAI* GetAI(Creature* creature) const override +        { +            return new npc_molten_barrageAI(creature); +        } +}; + +class npc_egg_pile : public CreatureScript +{ +    public: +        npc_egg_pile() : CreatureScript("npc_egg_pile") { } + +        struct npc_egg_pileAI : public CreatureAI +        { +            npc_egg_pileAI(Creature* creature) : CreatureAI(creature) +            { +            } + +            void AttackStart(Unit* /*target*/) override { } + +            void Reset() override +            { +                me->SetReactState(REACT_PASSIVE); +                _events.Reset(); +                _callHatchlingSpell = 0; +            } + +            void JustDied(Unit* /*killer*/) override +            { +                _events.Reset(); +                std::list<Creature*> eggs; +                GetCreatureListWithEntryInGrid(eggs, me, NPC_MOLTEN_EGG_TRASH, 20.0f); +                for (std::list<Creature*>::const_iterator itr = eggs.begin(); itr != eggs.end(); ++itr) +                    (*itr)->CastSpell(*itr, SPELL_ALYSRAZOR_COSMETIC_EGG_XPLOSION, TRIGGERED_FULL_MASK); + +                DoCast(me, SPELL_ALYSRAZOR_COSMETIC_EGG_XPLOSION, true); +            } + +            void JustReachedHome() override +            { +                AlysrazorTrashEvaded(me); +            } + +            void DoAction(int32 action) override +            { +                if (action != NPC_BLAZING_MONSTROSITY_LEFT && +                    action != NPC_BLAZING_MONSTROSITY_RIGHT) +                    return; + +                if (action == NPC_BLAZING_MONSTROSITY_LEFT) +                    Talk(EMOTE_CRACKING_EGGS); + +                _callHatchlingSpell = (action == NPC_BLAZING_MONSTROSITY_LEFT) ? SPELL_MOLTEN_EGG_TRASH_CALL_L : SPELL_MOLTEN_EGG_TRASH_CALL_R; +                DoZoneInCombat(); +                _events.Reset(); +                _events.ScheduleEvent(EVENT_SUMMON_SMOULDERING_HATCHLING, 1); +            } + +            void UpdateAI(uint32 diff) override +            { +                if (!UpdateVictim()) +                    return; + +                _events.Update(diff); + +                if (me->HasUnitState(UNIT_STATE_CASTING)) +                    return; + +                while (uint32 eventId = _events.ExecuteEvent()) +                { +                    switch (eventId) +                    { +                        case EVENT_SUMMON_SMOULDERING_HATCHLING: +                        { +                            std::list<Creature*> eggs; +                            MoltenEggCheck check(me); +                            Trinity::CreatureListSearcher<MoltenEggCheck> searcher(me, eggs, check); +                            me->VisitNearbyGridObject(20.0f, searcher); +                            if (!eggs.empty()) +                            { +                                Creature* egg = Trinity::Containers::SelectRandomContainerElement(eggs); +                                egg->CastSpell(egg, SPELL_SUMMON_SMOULDERING_HATCHLING, TRIGGERED_FULL_MASK); +                                egg->SetDisplayId(MODEL_INVISIBLE_STALKER); +                                egg->m_Events.AddEvent(new RespawnEggEvent(egg), egg->m_Events.CalculateTime(5000)); +                            } + +                            if (_callHatchlingSpell) +                                DoCastAOE(_callHatchlingSpell, true); +                            _events.ScheduleEvent(EVENT_SUMMON_SMOULDERING_HATCHLING, urand(6000, 10000)); +                            break; +                        } +                        default: +                            break; +                    } +                } + +                DoMeleeAttackIfReady(); +            } + +        private: +            EventMap _events; +            uint32 _callHatchlingSpell; +        }; + +        CreatureAI* GetAI(Creature* creature) const override +        { +            return new npc_egg_pileAI(creature); +        } +}; + +class spell_alysrazor_cosmetic_egg_xplosion : public SpellScriptLoader +{ +    public: +        spell_alysrazor_cosmetic_egg_xplosion() : SpellScriptLoader("spell_alysrazor_cosmetic_egg_xplosion") { } + +        class spell_alysrazor_cosmetic_egg_xplosion_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_alysrazor_cosmetic_egg_xplosion_SpellScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sCreatureDisplayInfoStore.LookupEntry(MODEL_INVISIBLE_STALKER)) +                    return false; +                return true; +            } + +            void HandleExplosion(SpellEffIndex effIndex) +            { +                PreventHitDefaultEffect(effIndex); +                GetHitUnit()->SetDisplayId(MODEL_INVISIBLE_STALKER); +                if (Creature* creature = GetHitCreature()) +                    creature->DespawnOrUnsummon(4000); +            } + +            void Register() override +            { +                OnEffectHitTarget += SpellEffectFn(spell_alysrazor_cosmetic_egg_xplosion_SpellScript::HandleExplosion, EFFECT_0, SPELL_EFFECT_DUMMY); +            } +        }; + +        SpellScript* GetSpellScript() const override +        { +            return new spell_alysrazor_cosmetic_egg_xplosion_SpellScript(); +        } +}; + +class spell_alysrazor_turn_monstrosity : public SpellScriptLoader +{ +    public: +        spell_alysrazor_turn_monstrosity() : SpellScriptLoader("spell_alysrazor_turn_monstrosity") { } + +        class spell_alysrazor_turn_monstrosity_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_alysrazor_turn_monstrosity_SpellScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_GENERIC_DUMMY_CAST)) +                    return false; +                if (!sSpellMgr->GetSpellInfo(SPELL_KNOCKBACK_RIGHT)) +                    return false; +                if (!sSpellMgr->GetSpellInfo(SPELL_KNOCKBACK_LEFT)) +                    return false; +                if (!sSpellMgr->GetSpellInfo(SPELL_KNOCKBACK_FORWARD)) +                    return false; +                if (!sSpellMgr->GetSpellInfo(SPELL_KNOCKBACK_BACK)) +                    return false; +                return true; +            } + +            void KnockBarrage(SpellEffIndex effIndex) +            { +                PreventHitDefaultEffect(effIndex); +                GetHitUnit()->GetMotionMaster()->MoveIdle(); +                if (TempSummon* summ = GetHitUnit()->ToTempSummon()) +                    if (Unit* summoner = summ->GetSummoner()) +                        GetHitUnit()->CastSpell(summoner, SPELL_GENERIC_DUMMY_CAST, TRIGGERED_FULL_MASK); + +                float angle = 0.0f; +                if (Unit* bird = GetCaster()->GetVehicleBase()) +                { +                    bird->SetInFront(GetHitUnit()); +                    angle = bird->GetOrientation(); +                } + +                uint32 spellId = 0; +                switch (GetSpellInfo()->Id) +                { +                    case SPELL_RIGHT_SIDE_SMACK_R: +                    case SPELL_RIGHT_SIDE_SMACK_L: +                        spellId = SPELL_KNOCKBACK_RIGHT; +                        angle -= float(M_PI) * 0.5f; +                        break; +                    case SPELL_LEFT_SIDE_SMACK_R: +                    case SPELL_LEFT_SIDE_SMACK_L: +                        spellId = SPELL_KNOCKBACK_LEFT; +                        angle += float(M_PI) * 0.5f; +                        break; +                    case SPELL_HEAD_BONK_R: +                    case SPELL_HEAD_BONK_L: +                        spellId = SPELL_KNOCKBACK_FORWARD; +                        break; +                    case SPELL_TICKLE_R: +                    case SPELL_TICKLE_L: +                        spellId = SPELL_KNOCKBACK_BACK; +                        angle -= float(M_PI); +                        break; +                } + +                // Cannot wait for object update to process facing spline, it's needed in next spell cast +                GetHitUnit()->SetOrientation(angle); +                GetHitUnit()->SetFacingTo(angle); +                GetHitUnit()->AddUnitState(UNIT_STATE_CANNOT_TURN); +                GetHitUnit()->CastSpell(GetHitUnit(), spellId, TRIGGERED_FULL_MASK); +            } + +            void TurnBird(SpellEffIndex effIndex) +            { +                PreventHitDefaultEffect(effIndex); +                GetHitUnit()->PlayOneShotAnimKit(ANIM_KIT_BIRD_TURN); +            } + +            void Register() override +            { +                OnEffectHitTarget += SpellEffectFn(spell_alysrazor_turn_monstrosity_SpellScript::KnockBarrage, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); +                OnEffectHitTarget += SpellEffectFn(spell_alysrazor_turn_monstrosity_SpellScript::TurnBird, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); +            } +        }; + +        SpellScript* GetSpellScript() const override +        { +            return new spell_alysrazor_turn_monstrosity_SpellScript(); +        } +}; + +class spell_alysrazor_aggro_closest : public SpellScriptLoader +{ +    public: +        spell_alysrazor_aggro_closest() : SpellScriptLoader("spell_alysrazor_aggro_closest") { } + +        class spell_alysrazor_aggro_closest_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_alysrazor_aggro_closest_SpellScript); + +            bool Load() override +            { +                return GetCaster()->GetTypeId() == TYPEID_UNIT; +            } + +            void HandleEffect(SpellEffIndex effIndex) +            { +                PreventHitDefaultEffect(effIndex); +                float curThreat = GetCaster()->getThreatManager().getThreat(GetHitUnit(), true); +                GetCaster()->getThreatManager().addThreat(GetHitUnit(), -curThreat + 50000.0f / std::min(1.0f, GetCaster()->GetDistance(GetHitUnit()))); +            } + +            void UpdateThreat() +            { +                GetCaster()->ClearUnitState(UNIT_STATE_CASTING); +                GetCaster()->GetAI()->AttackStart(GetCaster()->ToCreature()->SelectVictim()); +            } + +            void Register() override +            { +                OnEffectHitTarget += SpellEffectFn(spell_alysrazor_aggro_closest_SpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_DUMMY); +                AfterCast += SpellCastFn(spell_alysrazor_aggro_closest_SpellScript::UpdateThreat); +            } +        }; + +        SpellScript* GetSpellScript() const override +        { +            return new spell_alysrazor_aggro_closest_SpellScript(); +        } +}; + +class spell_alysrazor_fieroblast : public SpellScriptLoader +{ +    public: +        spell_alysrazor_fieroblast() : SpellScriptLoader("spell_alysrazor_fieroblast") { } + +        class spell_alysrazor_fieroblast_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_alysrazor_fieroblast_SpellScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_FIRE_IT_UP)) +                    return false; +                return true; +            } + +            void FireItUp() +            { +                GetCaster()->CastSpell(GetCaster(), SPELL_FIRE_IT_UP, TRIGGERED_FULL_MASK); +            } + +            void Register() override +            { +                AfterCast += SpellCastFn(spell_alysrazor_fieroblast_SpellScript::FireItUp); +            } +        }; + +        SpellScript* GetSpellScript() const override +        { +            return new spell_alysrazor_fieroblast_SpellScript(); +        } +}; + +void AddSC_boss_alysrazor() +{ +    new npc_harbinger_of_flame(); +    new npc_blazing_monstrosity(); +    new npc_molten_barrage(); +    new npc_egg_pile(); +    new spell_alysrazor_cosmetic_egg_xplosion(); +    new spell_alysrazor_turn_monstrosity(); +    new spell_alysrazor_aggro_closest(); +    new spell_alysrazor_fieroblast(); +} diff --git a/src/server/scripts/Kalimdor/Firelands/firelands.h b/src/server/scripts/Kalimdor/Firelands/firelands.h new file mode 100644 index 00000000000..b6387e40687 --- /dev/null +++ b/src/server/scripts/Kalimdor/Firelands/firelands.h @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef FIRELANDS_H_ +#define FIRELANDS_H_ + +#include "Map.h" +#include "CreatureAI.h" + +#define DataHeader "FL" +#define FirelandsScriptName "instance_firelands" + +uint32 const EncounterCount = 7; + +enum DataTypes +{ +    DATA_BETH_TILAC         = 0, +    DATA_LORD_RHYOLITH      = 1, +    DATA_SHANNOX            = 2, +    DATA_ALYSRAZOR          = 3, +    DATA_BALEROC            = 4, +    DATA_MAJORDOMO_STAGHELM = 5, +    DATA_RAGNAROS           = 6, +}; + +enum CreatureIds +{ +    NPC_BLAZING_MONSTROSITY_LEFT    = 53786, +    NPC_BLAZING_MONSTROSITY_RIGHT   = 53791, +    NPC_EGG_PILE                    = 53795, +    NPC_HARBINGER_OF_FLAME          = 53793, +    NPC_MOLTEN_EGG_TRASH            = 53914, +    NPC_SMOULDERING_HATCHLING       = 53794, +}; + +class DelayedAttackStartEvent : public BasicEvent +{ +    public: +        DelayedAttackStartEvent(Creature* owner) : _owner(owner) { } + +        bool Execute(uint64 /*e_time*/, uint32 /*p_time*/) +        { +            _owner->AI()->DoZoneInCombat(_owner, 200.0f); +            return true; +        } + +    private: +        Creature* _owner; +}; + +template<class AI> +CreatureAI* GetFirelandsAI(Creature* creature) +{ +    if (InstanceMap* instance = creature->GetMap()->ToInstanceMap()) +        if (instance->GetInstanceScript()) +            if (instance->GetScriptId() == sObjectMgr->GetScriptId(FirelandsScriptName)) +                return new AI(creature); +    return NULL; +} + +#endif // FIRELANDS_H_ diff --git a/src/server/scripts/Kalimdor/Firelands/instance_firelands.cpp b/src/server/scripts/Kalimdor/Firelands/instance_firelands.cpp new file mode 100644 index 00000000000..bca31964d24 --- /dev/null +++ b/src/server/scripts/Kalimdor/Firelands/instance_firelands.cpp @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "ScriptMgr.h" +#include "InstanceScript.h" +#include "firelands.h" + +class instance_firelands : public InstanceMapScript +{ +    public: +        instance_firelands() : InstanceMapScript(FirelandsScriptName, 720) { } + +        struct instance_firelands_InstanceScript : public InstanceScript +        { +            instance_firelands_InstanceScript(InstanceMap* map) : InstanceScript(map) +            { +                SetHeaders(DataHeader); +                SetBossNumber(EncounterCount); +            } + +            void OnCreatureCreate(Creature* creature) override +            { +                switch (creature->GetEntry()) +                { +                    case NPC_SMOULDERING_HATCHLING: +                        // Cannot directly start attacking here as the creature is not yet on map +                        creature->m_Events.AddEvent(new DelayedAttackStartEvent(creature), creature->m_Events.CalculateTime(500)); +                        break; +                } +            } +        }; + +        InstanceScript* GetInstanceScript(InstanceMap* map) const override +        { +            return new instance_firelands_InstanceScript(map); +        } +}; + +void AddSC_instance_firelands() +{ +    new instance_firelands(); +} diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp new file mode 100644 index 00000000000..c8963331702 --- /dev/null +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp @@ -0,0 +1,571 @@ +/* + * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "ObjectMgr.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "SpellScript.h" +#include "SpellAuraEffects.h" +#include "GridNotifiers.h" +#include "Player.h" +#include "ObjectAccessor.h" +#include "halls_of_origination.h" + +enum Texts +{ +    ANRAPHET_SAY_INTRO              = 0, +    ANRAPHET_SAY_AGGRO              = 1, +    ANRAPHET_SAY_OMEGA_STANCE       = 2, +    ANRAPHET_SAY_KILL               = 3, +    ANRAPHET_SAY_DEATH              = 4, + +    BRANN_SAY_DOOR_INTRO            = 0,  // Right, let's go! Just need to input the final entry sequence into the door mechanism... and... +    BRANN_SAY_UNLOCK_DOOR           = 1,  // That did the trick! The control room should be right behind this... oh... wow... +    BRANN_SAY_TROGGS                = 2,  // What? This isn't the control room! There's another entire defense mechanism in place, and the blasted Rock Troggs broke into here somehow. Troggs. Why did it have to be Troggs! +    BRANN_SAY_THINK                 = 3,  // Ok, let me think a moment. +    BRANN_SAY_MIRRORS               = 4,  // Mirrors pointing all over the place. +    BRANN_SAY_ELEMENTALS            = 5,  // Four platforms with huge elementals. +    BRANN_SAY_GET_IT                = 6,  // I got it! I saw a tablet that mentioned this chamber. This is the Vault of Lights! Ok, simple enough. I need you adventurers to take out each of the four elementals to trigger the opening sequence for the far door! +    BRANN_1_ELEMENTAL_DEAD          = 7,  // One down! +    BRANN_2_ELEMENTAL_DEAD          = 8,  // Another one down! Just look at those light beams! They seem to be connecting to the far door! +    BRANN_3_ELEMENTAL_DEAD          = 9,  // One more elemental to go! The door is almost open! +    BRANN_4_ELEMENTAL_DEAD          = 10, // That''s it, you''ve done it! The vault door is opening! Now we can... oh, no! +    BRANN_SAY_ANRAPHET_DIED         = 11, // We''ve done it! The control room is breached! +    BRANN_SAY_MOMENT                = 12 // Here we go! Now this should only take a moment... +}; + +enum Events +{ +    EVENT_BRANN_MOVE_INTRO          = 1, +    EVENT_BRANN_UNLOCK_DOOR         = 2, +    EVENT_BRANN_THINK               = 3, +    EVENT_BRANN_SET_ORIENTATION_1   = 4, +    EVENT_BRANN_SET_ORIENTATION_2   = 5, +    EVENT_BRANN_SET_ORIENTATION_3   = 6, +    EVENT_BRANN_SAY_ELEMENTALS      = 7, +    EVENT_BRANN_SAY_GET_IT          = 8, +    EVENT_BRANN_SET_ORIENTATION_4   = 9, + +    EVENT_ANRAPHET_APPEAR           = 10, +    EVENT_ANRAPHET_ACTIVATE         = 11, +    EVENT_ANRAPHET_DESTROY          = 12, +    EVENT_ANRAPHET_READY            = 13, +    EVENT_ANRAPHET_NEMESIS_STRIKE   = 14, +    EVENT_ANRAPHET_ALPHA_BEAMS      = 15, +    EVENT_ANRAPHET_OMEGA_STANCE     = 16, +    EVENT_ANRAPHET_CRUMBLING_RUIN   = 17, +    EVENT_ANRAPHET_ACTIVATE_OMEGA   = 18 +}; + +enum Spells +{ +    SPELL_DESTRUCTION_PROTOCOL          = 77437, + +    SPELL_ALPHA_BEAMS                   = 76184, +    SPELL_ALPHA_BEAMS_BACK_CAST         = 76912, + +    SPELL_CRUMBLING_RUIN                = 75609, + + +    SPELL_NEMESIS_STRIKE                = 75604, + +    SPELL_OMEGA_STANCE_SUMMON           = 77106, +    SPELL_OMEGA_STANCE                  = 75622, +    SPELL_OMEGA_STANCE_SPIDER_TRIGGER   = 77121, +}; + +enum Phases +{ +    PHASE_INTRO         = 1, +    PHASE_COMBAT        = 2, + +    PHASE_MASK_COMBAT   = (1 << PHASE_COMBAT), +}; + +enum Points +{ +    POINT_ANRAPHET_ACTIVATE     = 0, +    MAX_BRANN_WAYPOINTS_INTRO   = 17 +}; + +Position const AnraphetActivatePos = {-193.656f, 366.689f, 75.91001f, 3.138207f}; + +Position const BrannIntroWaypoint[MAX_BRANN_WAYPOINTS_INTRO] = +{ +    {-429.583f,  367.019f,  89.79282f, 0.0f}, +    {-409.9531f, 367.0469f, 89.81111f, 0.0f}, +    {-397.8246f, 366.967f,  86.37722f, 0.0f}, +    {-383.7813f, 366.8229f, 82.07919f, 0.0f}, +    {-368.2604f, 366.7448f, 77.0984f,  0.0f}, +    {-353.6458f, 366.4896f, 75.92504f, 0.0f}, +    {-309.0608f, 366.7205f, 75.91345f, 0.0f}, +    {-276.3303f, 367.0f,    75.92413f, 0.0f}, +    {-246.5104f, 366.6389f, 75.87791f, 0.0f}, +    {-202.0417f, 366.7517f, 75.92508f, 0.0f}, +    {-187.6024f, 366.7656f, 76.23077f, 0.0f}, +    {-155.0938f, 366.783f,  86.45834f, 0.0f}, +    {-143.5694f, 366.8177f, 89.73354f, 0.0f}, +    {-128.5608f, 366.8629f, 89.74199f, 0.0f}, +    {-103.559f,  366.5938f, 89.79725f, 0.0f}, +    {-71.58507f, 367.0278f, 89.77069f, 0.0f}, +    {-35.04861f, 366.6563f, 89.77447f, 0.0f}, +}; + +class boss_anraphet : public CreatureScript +{ +public: +    boss_anraphet() : CreatureScript("boss_anraphet") { } + +    struct boss_anraphetAI : public BossAI +    { +        boss_anraphetAI(Creature* creature) : BossAI(creature, DATA_ANRAPHET) { } + +        void ScheduleCombatEvents() +        { +            events.ScheduleEvent(EVENT_ANRAPHET_NEMESIS_STRIKE, 8000, 0, PHASE_COMBAT); +            events.ScheduleEvent(EVENT_ANRAPHET_ALPHA_BEAMS, 10000, 0, PHASE_COMBAT); +            events.ScheduleEvent(EVENT_ANRAPHET_OMEGA_STANCE, 35000, 0, PHASE_COMBAT); +        } + +        void Reset() override +        { +            _Reset(); +            me->SetWalk(false); +            events.SetPhase(PHASE_INTRO); +            if (instance->GetData(DATA_DEAD_ELEMENTALS) == 4) +            { +                // Set to combat automatically, Brann's event won't repeat +                me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); +                events.SetPhase(PHASE_COMBAT); +                ScheduleCombatEvents(); +                me->SetHomePosition(AnraphetActivatePos); +            } +        } + +        void EnterCombat(Unit* /*who*/) override +        { +            instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1); +            Talk(ANRAPHET_SAY_AGGRO); +            _EnterCombat(); +        } + +        void JustDied(Unit* /*killer*/) override +        { +            instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); +            Talk(ANRAPHET_SAY_DEATH); + +            if (Creature* brann = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BRANN_0_GUID))) +                brann->AI()->DoAction(ACTION_ANRAPHET_DIED); + +            _JustDied(); +        } + +        void KilledUnit(Unit* victim) override +        { +            if (victim->GetTypeId() == TYPEID_PLAYER) +                Talk(ANRAPHET_SAY_KILL); +        } + +        void JustReachedHome() override +        { +            instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); +            _JustReachedHome(); +            instance->SetBossState(DATA_ANRAPHET, FAIL); +        } + +        void DoAction(int32 action) override +        { +            if (action == ACTION_ANRAPHET_INTRO) +                events.ScheduleEvent(EVENT_ANRAPHET_APPEAR, 6000, 0, PHASE_INTRO); +        } + +        void MovementInform(uint32 type, uint32 point) override +        { +            if (type != POINT_MOTION_TYPE) +                return; + +            if (point == POINT_ANRAPHET_ACTIVATE) +            { +                events.ScheduleEvent(EVENT_ANRAPHET_ACTIVATE, 1500, 0, PHASE_INTRO); +                me->SetHomePosition(AnraphetActivatePos); +            } +        } + +        void UpdateAI(uint32 diff) override +        { +            if ((events.GetPhaseMask() & PHASE_MASK_COMBAT) && (!UpdateVictim() || !CheckInRoom())) +                return; + +            events.Update(diff); + +            if (me->HasUnitState(UNIT_STATE_CASTING)) +                return; + +            while (uint32 eventId = events.ExecuteEvent()) +            { +                switch (eventId) +                { +                    case EVENT_ANRAPHET_APPEAR: +                        me->SetWalk(true); +                        me->GetMotionMaster()->MovePoint(POINT_ANRAPHET_ACTIVATE, AnraphetActivatePos); +                        break; +                    case EVENT_ANRAPHET_ACTIVATE: +                        me->SetWalk(false); +                        Talk(ANRAPHET_SAY_INTRO); +                        events.ScheduleEvent(EVENT_ANRAPHET_DESTROY, 17500, 0, PHASE_INTRO); +                        return; +                    case EVENT_ANRAPHET_DESTROY: +                        DoCastAOE(SPELL_DESTRUCTION_PROTOCOL); +                        events.ScheduleEvent(EVENT_ANRAPHET_READY, 6000, 0, PHASE_INTRO); +                        break; +                    case EVENT_ANRAPHET_READY: +                        me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); +                        events.SetPhase(PHASE_COMBAT); +                        ScheduleCombatEvents(); +                        break; +                    case EVENT_ANRAPHET_NEMESIS_STRIKE: +                        DoCastVictim(SPELL_NEMESIS_STRIKE); +                        events.ScheduleEvent(EVENT_ANRAPHET_NEMESIS_STRIKE, 21500, 0, PHASE_COMBAT); +                        break; +                    case EVENT_ANRAPHET_ALPHA_BEAMS: +                        DoCast(me, SPELL_ALPHA_BEAMS); +                        events.ScheduleEvent(EVENT_ANRAPHET_CRUMBLING_RUIN, 12500, 0, PHASE_COMBAT); +                        events.ScheduleEvent(EVENT_ANRAPHET_ALPHA_BEAMS, urand(40000, 45000), 0, PHASE_COMBAT); +                        break; +                    case EVENT_ANRAPHET_OMEGA_STANCE: +                        DoCast(me, SPELL_OMEGA_STANCE_SUMMON); +                        DoCast(me, SPELL_OMEGA_STANCE); +                        Talk(ANRAPHET_SAY_OMEGA_STANCE); +                        events.ScheduleEvent(EVENT_ANRAPHET_OMEGA_STANCE, urand(45000, 50000), 0, PHASE_COMBAT); +                        events.ScheduleEvent(EVENT_ANRAPHET_CRUMBLING_RUIN, 13000, 0, PHASE_COMBAT); +                        break; +                    case EVENT_ANRAPHET_CRUMBLING_RUIN: +                        DoCast(me, SPELL_CRUMBLING_RUIN); +                        break; +                } +            } + +            if (events.GetPhaseMask() & PHASE_MASK_COMBAT) +                DoMeleeAttackIfReady(); +        } +    }; + +    CreatureAI* GetAI(Creature* creature) const override +    { +        return GetHallsOfOriginationAI<boss_anraphetAI>(creature); +    } +}; + +class npc_omega_stance : public CreatureScript +{ +    public: +        npc_omega_stance() : CreatureScript("npc_omega_stance") { } + +        struct npc_omega_stanceAI : public ScriptedAI +        { +            npc_omega_stanceAI(Creature* creature) : ScriptedAI(creature) { } + +            void IsSummonedBy(Unit* /*who*/) override +            { +                DoCast(me, SPELL_OMEGA_STANCE_SPIDER_TRIGGER, true); +            } + +            void EnterEvadeMode() override { } +        }; + +        CreatureAI* GetAI(Creature* creature) const override +        { +            return new npc_omega_stanceAI(creature); +        } +}; + +class npc_alpha_beam : public CreatureScript +{ +    public: +        npc_alpha_beam() : CreatureScript("npc_alpha_beam") { } + +        struct npc_alpha_beamAI : public ScriptedAI +        { +            npc_alpha_beamAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { } + +            void IsSummonedBy(Unit* /*summoner*/) override +            { +                if (Creature* anraphet = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ANRAPHET_GUID))) +                    anraphet->CastSpell(me, SPELL_ALPHA_BEAMS_BACK_CAST); +            } + +            void EnterEvadeMode() override { } // Never evade + +            private: +                InstanceScript* _instance; +        }; + +        CreatureAI* GetAI(Creature* creature) const override +        { +            return GetHallsOfOriginationAI<npc_alpha_beamAI>(creature); +        } +}; + +class npc_brann_bronzebeard_anraphet : public CreatureScript +{ +    public: +        npc_brann_bronzebeard_anraphet() : CreatureScript("npc_brann_bronzebeard_anraphet") { } + +        struct npc_brann_bronzebeard_anraphetAI : public CreatureAI +        { +            npc_brann_bronzebeard_anraphetAI(Creature* creature) : CreatureAI(creature), _currentPoint(0), _instance(creature->GetInstanceScript()) { } + +            void sGossipSelect(Player* /*player*/, uint32 sender, uint32 action) override +            { +                if (_instance->GetBossState(DATA_VAULT_OF_LIGHTS) == DONE) +                    return; + +                if (me->GetCreatureTemplate()->GossipMenuId == sender && !action) +                { +                    _instance->SetBossState(DATA_VAULT_OF_LIGHTS, IN_PROGRESS); +                    _currentPoint = 0; +                    events.Reset(); +                    me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); +                    me->SetWalk(true); +                    Talk(BRANN_SAY_DOOR_INTRO); +                    events.ScheduleEvent(EVENT_BRANN_UNLOCK_DOOR, 7500); +                } +            } + +            void DoAction(int32 action) override +            { +                switch (action) +                { +                    case ACTION_ELEMENTAL_DIED: +                    { +                        uint32 dead = _instance->GetData(DATA_DEAD_ELEMENTALS); +                        Talk(BRANN_1_ELEMENTAL_DEAD + dead - 1); +                        if (dead == 4) +                        { +                            _instance->DoCastSpellOnPlayers(SPELL_VAULT_OF_LIGHTS_CREDIT); +                            if (Creature* anraphet = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ANRAPHET_GUID))) +                                anraphet->AI()->DoAction(ACTION_ANRAPHET_INTRO); +                        } +                        break; +                    } +                    case ACTION_ANRAPHET_DIED: +                        me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); +                        events.ScheduleEvent(EVENT_BRANN_MOVE_INTRO, 1000); +                        break; +                } +            } + +            void UpdateAI(uint32 diff) override +            { +                events.Update(diff); + +                while (uint32 eventId = events.ExecuteEvent()) +                { +                    switch (eventId) +                    { +                        case EVENT_BRANN_MOVE_INTRO: +                            if (_currentPoint < MAX_BRANN_WAYPOINTS_INTRO) +                                me->GetMotionMaster()->MovePoint(_currentPoint, BrannIntroWaypoint[_currentPoint]); +                            break; +                        case EVENT_BRANN_UNLOCK_DOOR: +                            Talk(BRANN_SAY_UNLOCK_DOOR); +                            _instance->SetBossState(DATA_VAULT_OF_LIGHTS, DONE); +                            _instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_VAULT_OF_LIGHTS_EVENT); +                            events.ScheduleEvent(EVENT_BRANN_MOVE_INTRO, 3500); +                            break; +                        case EVENT_BRANN_THINK: +                            Talk(BRANN_SAY_THINK); +                            events.ScheduleEvent(EVENT_BRANN_SET_ORIENTATION_1, 6000); +                            break; +                        case EVENT_BRANN_SET_ORIENTATION_1: +                            me->SetFacingTo(5.445427f); +                            Talk(BRANN_SAY_MIRRORS); +                            events.ScheduleEvent(EVENT_BRANN_SET_ORIENTATION_2, 1000); +                            break; +                        case EVENT_BRANN_SET_ORIENTATION_2: +                            me->SetFacingTo(0.6283185f); +                            events.ScheduleEvent(EVENT_BRANN_SET_ORIENTATION_3, 2500); +                            break; +                        case EVENT_BRANN_SET_ORIENTATION_3: +                            me->SetFacingTo(0.01745329f); +                            events.ScheduleEvent(EVENT_BRANN_SAY_ELEMENTALS, 200); +                            break; +                        case EVENT_BRANN_SAY_ELEMENTALS: +                            Talk(BRANN_SAY_ELEMENTALS); +                            events.ScheduleEvent(EVENT_BRANN_SAY_GET_IT, 3500); +                            break; +                        case EVENT_BRANN_SAY_GET_IT: +                            Talk(BRANN_SAY_GET_IT); +                            me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); +                            break; +                        case EVENT_BRANN_SET_ORIENTATION_4: +                            me->SetFacingTo(3.141593f); +                            break; +                    } +                } +            } + +            void MovementInform(uint32 movementType, uint32 pointId) override +            { +                if (movementType != POINT_MOTION_TYPE) +                    return; + +                _currentPoint = pointId + 1; +                uint32 delay = 1; + +                switch (pointId) +                { +                    case 0: +                        Talk(BRANN_SAY_TROGGS); +                        events.ScheduleEvent(EVENT_BRANN_THINK, 15000); +                        return; +                    case 1: +                        Talk(BRANN_SAY_ANRAPHET_DIED); +                        delay = 1000; +                        break; +                    case 14: +                        Talk(BRANN_SAY_MOMENT); +                        delay = 2200; +                        break; +                    case 16: +                        events.ScheduleEvent(EVENT_BRANN_SET_ORIENTATION_4, 6000); +                        return; +                    default: +                        break; +                } + +                events.ScheduleEvent(EVENT_BRANN_MOVE_INTRO, delay); +            } + +        protected: +            EventMap events; +            uint32 _currentPoint; +            InstanceScript* _instance; +        }; + +        CreatureAI* GetAI(Creature* creature) const override +        { +            return GetHallsOfOriginationAI<npc_brann_bronzebeard_anraphetAI>(creature); +        } +}; + +class spell_anraphet_alpha_beams : public SpellScriptLoader +{ +public: +    spell_anraphet_alpha_beams() : SpellScriptLoader("spell_anraphet_alpha_beams") { } + +    class spell_anraphet_alpha_beams_SpellScript : public SpellScript +    { +        PrepareSpellScript(spell_anraphet_alpha_beams_SpellScript); + +        void FilterTargets(std::list<WorldObject*>& targets) +        { +            if (targets.empty()) +                return; + +            WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets); +            targets.clear(); +            targets.push_back(target); +        } + +        void Register() +        { +            OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_anraphet_alpha_beams_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); +        } +    }; + +    SpellScript* GetSpellScript() const +    { +        return new spell_anraphet_alpha_beams_SpellScript(); +    } +}; + +class spell_anraphet_omega_stance_summon : public SpellScriptLoader +{ +public: +    spell_anraphet_omega_stance_summon() : SpellScriptLoader("spell_anraphet_omega_stance_summon") { } + +    class spell_anraphet_omega_stance_summon_SpellScript : public SpellScript +    { +        PrepareSpellScript(spell_anraphet_omega_stance_summon_SpellScript); + +        void ModDestHeight(SpellEffIndex /*effIndex*/) +        { +            Position offset = {0.0f, 0.0f, 30.0f, 0.0f}; +            const_cast<WorldLocation*>(GetExplTargetDest())->RelocateOffset(offset); +            GetHitDest()->RelocateOffset(offset); +        } + +        void Register() +        { +            OnEffectLaunch += SpellEffectFn(spell_anraphet_omega_stance_summon_SpellScript::ModDestHeight, EFFECT_0, SPELL_EFFECT_SUMMON); +        } +    }; + +    SpellScript* GetSpellScript() const +    { +        return new spell_anraphet_omega_stance_summon_SpellScript(); +    } +}; + +class spell_omega_stance_spider_effect : public SpellScriptLoader +{ +public: +    spell_omega_stance_spider_effect() : SpellScriptLoader("spell_omega_stance_spider_effect") { } + +    class spell_omega_stance_spider_effect_SpellScript : public SpellScript +    { +        PrepareSpellScript(spell_omega_stance_spider_effect_SpellScript); + +        void SetDestPosition(SpellEffIndex effIndex) +        { +            // Do our own calculations for the destination position. +            /// TODO: Remove this once we find a general rule for WorldObject::MovePosition (this spell shouldn't take the Z change into consideration) +            Unit* caster = GetCaster(); +            float angle = float(rand_norm()) * static_cast<float>(2 * M_PI); +            uint32 dist = caster->GetObjectSize() + GetSpellInfo()->Effects[effIndex].CalcRadius(GetCaster()) * (float)rand_norm(); + +            float x = caster->GetPositionX() + dist * std::cos(angle); +            float y = caster->GetPositionY() + dist * std::sin(angle); +            float z = caster->GetMap()->GetHeight(x, y, caster->GetPositionZ()); + +            const_cast<WorldLocation*>(GetExplTargetDest())->Relocate(x, y, z); +            GetHitDest()->Relocate(x, y, z); +        } + +        void Register() +        { +            OnEffectLaunch += SpellEffectFn(spell_omega_stance_spider_effect_SpellScript::SetDestPosition, EFFECT_0, SPELL_EFFECT_DUMMY); +        } +    }; + +    SpellScript* GetSpellScript() const +    { +        return new spell_omega_stance_spider_effect_SpellScript(); +    } +}; + +void AddSC_boss_anraphet() +{ +    new boss_anraphet(); +    new spell_anraphet_alpha_beams(); +    new npc_brann_bronzebeard_anraphet(); +    new npc_alpha_beam(); +    new spell_anraphet_omega_stance_summon(); +    new spell_omega_stance_spider_effect(); +    new npc_omega_stance(); +} diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp new file mode 100644 index 00000000000..81f81fda4c4 --- /dev/null +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp @@ -0,0 +1,326 @@ +/* + * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "ObjectMgr.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "SpellScript.h" +#include "SpellAuraEffects.h" +#include "Player.h" +#include "Weather.h" +#include "WorldSession.h" +#include "halls_of_origination.h" + +enum Texts +{ +    SAY_AGGRO                       = 0, +    SAY_DEATH                       = 1, +}; + +enum Events +{ +    EVENT_RAGING_SMASH              = 1, +    EVENT_FLAME_BOLT                = 2, +    EVENT_EARTH_SPIKE               = 3, +    EVENT_PTAH_EXPLODE              = 4, +    EVENT_QUICKSAND                 = 5, +}; + +enum Spells +{ +    SPELL_RAGING_SMASH              = 83650, +    SPELL_FLAME_BOLT                = 77370, +    SPELL_EARTH_SPIKE_WARN          = 94974, + +    SPELL_PTAH_EXPLOSION            = 75519, +    SPELL_SANDSTORM                 = 75491, + +    SPELL_SUMMON_QUICKSAND          = 75550, // Spell not in DBC, no SMSG_SPELL_START/GO for it + +    SPELL_BEETLE_BURROW             = 75463, + +    SPELL_SUMMON_JEWELED_SCARAB     = 75462, +    SPELL_SUMMON_DUSTBONE_HORROR    = 75521, +}; + +enum Phases +{ +    PHASE_NORMAL                    = 1, +    PHASE_DISPERSE                  = 2, + +    PHASE_MASK_DISPERSE             = (1 << PHASE_DISPERSE), +    PHASE_MASK_NORMAL               = (1 << PHASE_NORMAL), +}; + +enum PtahData +{ +    DATA_SUMMON_DEATHS              = 0 +}; + +class SummonScarab : public BasicEvent +{ +public: +    SummonScarab(Unit* owner, InstanceScript* instance) : _owner(owner), _instance(instance) { } + +    bool Execute(uint64 /*execTime*/, uint32 /*diff*/) +    { +        if (!_instance || _instance->GetBossState(DATA_EARTHRAGER_PTAH) != IN_PROGRESS) +            return true;    // delete event + +        _owner->CastSpell(_owner, SPELL_SUMMON_JEWELED_SCARAB); +        _owner->RemoveAurasDueToSpell(SPELL_BEETLE_BURROW); +        return true; +    } +protected: +    Unit* _owner; +    InstanceScript* _instance; +}; + +class boss_earthrager_ptah : public CreatureScript +{ +public: +    boss_earthrager_ptah() : CreatureScript("boss_earthrager_ptah") { } + +    struct boss_earthrager_ptahAI : public BossAI +    { +        boss_earthrager_ptahAI(Creature* creature) : BossAI(creature, DATA_EARTHRAGER_PTAH), _summonDeaths(0), _hasDispersed(false) { } + +        void Cleanup() +        { +            std::list<Creature*> units; + +            GetCreatureListWithEntryInGrid(units, me, NPC_DUSTBONE_HORROR, 100.0f); +            for (std::list<Creature*>::iterator itr = units.begin(); itr != units.end(); ++itr) +                (*itr)->DespawnOrUnsummon(); + +            GetCreatureListWithEntryInGrid(units, me, NPC_JEWELED_SCARAB, 100.0f); +            for (std::list<Creature*>::iterator itr = units.begin(); itr != units.end(); ++itr) +                (*itr)->DespawnOrUnsummon(); +        } + +        void Reset() override +        { +            _summonDeaths = 0; +            _hasDispersed = false; +            Cleanup(); +            _Reset(); +            events.SetPhase(PHASE_NORMAL); +            events.ScheduleEvent(EVENT_RAGING_SMASH, urand(7000, 12000), 0, PHASE_NORMAL); +            events.ScheduleEvent(EVENT_FLAME_BOLT, 15000, 0, PHASE_NORMAL); +            events.ScheduleEvent(EVENT_EARTH_SPIKE, urand(16000, 21000), 0, PHASE_NORMAL); +        } + +        void DamageTaken(Unit* /*attacker*/, uint32& damage) override +        { +            if (me->HealthBelowPctDamaged(50, damage) && (events.GetPhaseMask() & PHASE_MASK_NORMAL) && !_hasDispersed) +            { +                events.SetPhase(PHASE_DISPERSE); +                _hasDispersed = true; + +                me->AttackStop(); +                DoCast(me, SPELL_SANDSTORM); +                me->GetMap()->SetZoneWeather(AREA_TOMB_OF_THE_EARTHRAGER, WEATHER_STATE_LIGHT_SANDSTORM, 1.0f); +                events.ScheduleEvent(EVENT_PTAH_EXPLODE, 6000, 0, PHASE_DISPERSE); +                events.ScheduleEvent(EVENT_QUICKSAND, 10000, 0, PHASE_DISPERSE); + +                std::list<Creature*> stalkers; +                GetCreatureListWithEntryInGrid(stalkers, me, NPC_BEETLE_STALKER, 100.0f); +                std::list<Creature*> beetlers = stalkers; + +                Trinity::Containers::RandomResizeList(beetlers, 9); // Holds the summoners of Jeweled Scarab + +                for (std::list<Creature*>::iterator itr = beetlers.begin(); itr != beetlers.end(); ++itr) +                { +                    stalkers.remove((*itr)); // Remove it to prevent a single trigger from spawning multiple npcs. +                    (*itr)->CastSpell((*itr), SPELL_BEETLE_BURROW); // Cast visual +                    // Summon after 5 seconds. +                    (*itr)->m_Events.AddEvent(new SummonScarab((*itr), instance), (*itr)->m_Events.CalculateTime(5000)); +                } + +                Trinity::Containers::RandomResizeList(stalkers, 2); // Holds the summoners of Dustbone Horror + +                for (std::list<Creature*>::iterator itr = stalkers.begin(); itr != stalkers.end(); ++itr) +                    (*itr)->CastSpell((*itr), SPELL_SUMMON_DUSTBONE_HORROR); +            } +        } + +        void SetData(uint32 index, uint32 /*value*/) override +        { +            if (index == DATA_SUMMON_DEATHS) +            { +                ++_summonDeaths; +                if (_summonDeaths == 11) // All summons died +                { +                    me->GetMap()->SetZoneWeather(AREA_TOMB_OF_THE_EARTHRAGER, WEATHER_STATE_FOG, 0.0f); +                    me->RemoveAurasDueToSpell(SPELL_PTAH_EXPLOSION); +                    events.SetPhase(PHASE_NORMAL); +                    events.ScheduleEvent(EVENT_RAGING_SMASH, urand(7000, 12000), 0, PHASE_NORMAL); +                    events.ScheduleEvent(EVENT_FLAME_BOLT, 15000, 0, PHASE_NORMAL); +                    events.ScheduleEvent(EVENT_EARTH_SPIKE, urand(16000, 21000), 0, PHASE_NORMAL); +                } +            } +        } + +        void EnterCombat(Unit* /*who*/) override +        { +            instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1); +            Talk(SAY_AGGRO); +            _EnterCombat(); +        } + +        void JustDied(Unit* /*killer*/) override +        { +            instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); +            Talk(SAY_DEATH); +            _JustDied(); +            Cleanup(); +        } + +        void JustReachedHome() override +        { +            instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); +            _JustReachedHome(); +            instance->SetBossState(DATA_EARTHRAGER_PTAH, FAIL); +        } + +        void UpdateAI(uint32 diff) override +        { +            if (!UpdateVictim() || !CheckInRoom()) +                return; + +            events.Update(diff); + +            if (me->HasUnitState(UNIT_STATE_CASTING)) +                return; + +            while (uint32 eventId = events.ExecuteEvent()) +            { +                switch (eventId) +                { +                    case EVENT_RAGING_SMASH: +                        DoCastVictim(SPELL_RAGING_SMASH); +                        events.ScheduleEvent(EVENT_RAGING_SMASH, urand(7000, 12000), 0, PHASE_NORMAL); +                        break; +                    case EVENT_FLAME_BOLT: +                        DoCast(me, SPELL_FLAME_BOLT); +                        events.ScheduleEvent(EVENT_FLAME_BOLT, 15000, 0, PHASE_NORMAL); +                        break; +                    case EVENT_EARTH_SPIKE: +                        if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) +                            DoCast(target, SPELL_EARTH_SPIKE_WARN); +                        events.ScheduleEvent(EVENT_EARTH_SPIKE, urand(16000, 21000), 0, PHASE_NORMAL); +                        break; +                    case EVENT_PTAH_EXPLODE: +                        DoCast(me, SPELL_PTAH_EXPLOSION); +                        break; +                    case EVENT_QUICKSAND: +                        // Spell not in DBC, it is not cast either, according to sniffs +                        if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) +                            if (Creature* quicksand = me->SummonCreature(NPC_QUICKSAND, *target)) +                                quicksand->SetUInt32Value(UNIT_CREATED_BY_SPELL, SPELL_SUMMON_QUICKSAND); +                        events.ScheduleEvent(EVENT_QUICKSAND, 10000, 0, PHASE_DISPERSE); +                        break; +                } +            } + +            if (events.GetPhaseMask() & PHASE_MASK_NORMAL) // Do not melee in the disperse phase +                DoMeleeAttackIfReady(); +        } + +    protected: +        uint8 _summonDeaths; +        bool _hasDispersed; +    }; + +    CreatureAI* GetAI(Creature* creature) const override +    { +        return GetHallsOfOriginationAI<boss_earthrager_ptahAI>(creature); +    } +}; + +class spell_earthrager_ptah_flame_bolt : public SpellScriptLoader +{ +    public: +        spell_earthrager_ptah_flame_bolt() : SpellScriptLoader("spell_earthrager_ptah_flame_bolt") { } + +        class spell_earthrager_ptah_flame_bolt_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_earthrager_ptah_flame_bolt_SpellScript); + +            void FilterTargets(std::list<WorldObject*>& targets) +            { +                Trinity::Containers::RandomResizeList(targets, GetCaster()->GetMap()->IsHeroic() ? 3 : 2); +            } + +            void Register() override +            { +                OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_earthrager_ptah_flame_bolt_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); +            } +        }; + +        SpellScript* GetSpellScript() const override +        { +            return new spell_earthrager_ptah_flame_bolt_SpellScript(); +        } +}; + +class spell_earthrager_ptah_explosion : public SpellScriptLoader +{ +public: +    spell_earthrager_ptah_explosion() : SpellScriptLoader("spell_earthrager_ptah_explosion") { } + +    class spell_earthrager_ptah_explosion_AuraScript : public AuraScript +    { +        PrepareAuraScript(spell_earthrager_ptah_explosion_AuraScript); + +        void SetFlags(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) +        { +            if (Unit* ptah = GetCaster()) +            { +                ptah->SetFlag(UNIT_FIELD_FLAGS, uint32(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_UNK_29 | UNIT_FLAG_UNK_31)); +                ptah->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); +            } +        } + +        void RemoveFlags(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) +        { +            if (Unit* ptah = GetCaster()) +            { +                ptah->RemoveFlag(UNIT_FIELD_FLAGS, uint32(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_UNK_29 | UNIT_FLAG_UNK_31)); +                ptah->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); +            } +        } + +        void Register() +        { +            OnEffectApply += AuraEffectApplyFn(spell_earthrager_ptah_explosion_AuraScript::SetFlags, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); +            OnEffectRemove += AuraEffectRemoveFn(spell_earthrager_ptah_explosion_AuraScript::RemoveFlags, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); +        } +    }; + +    AuraScript* GetAuraScript() const +    { +        return new spell_earthrager_ptah_explosion_AuraScript(); +    } +}; + +void AddSC_boss_earthrager_ptah() +{ +    new boss_earthrager_ptah(); +    new spell_earthrager_ptah_flame_bolt(); +    new spell_earthrager_ptah_explosion(); +} diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp new file mode 100644 index 00000000000..7aed7a66a00 --- /dev/null +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp @@ -0,0 +1,404 @@ +/* + * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "ObjectMgr.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "SpellScript.h" +#include "SpellAuraEffects.h" +#include "GridNotifiers.h" +#include "Player.h" +#include "halls_of_origination.h" + +enum Texts +{ +    SAY_AGGRO                    = 0, +    SAY_SHIELD                   = 1, +    EMOTE_SHIELD                 = 2, +    EMOTE_UNSHIELD               = 3, +    SAY_KILL                     = 4, +    SAY_DEATH                    = 5 +}; + +enum Events +{ +    EVENT_DIVINE_RECKONING       = 1, +    EVENT_BURNING_LIGHT          = 2, +    EVENT_SEAR                   = 3, +}; + +enum Spells +{ +    SPELL_DIVINE_RECKONING       = 75592, +    SPELL_BURNING_LIGHT          = 75115, +    SPELL_REVERBERATING_HYMN     = 75322, +    SPELL_SHIELD_OF_LIGHT        = 74938, + +    SPELL_ACTIVATE_BEACONS       = 76599, +    SPELL_TELEPORT               = 74969, + +    SPELL_SHIELD_VISUAL_RIGHT    = 83698, +    SPELL_BEAM_OF_LIGHT_RIGHT    = 76573, + +    SPELL_SHIELD_VISUAL_LEFT     = 83697, +    SPELL_BEAM_OF_LIGHT_LEFT     = 74930, + +    SPELL_SEARING_LIGHT          = 75194, +}; + +enum Phases +{ +    PHASE_SHIELDED               = 0, +    PHASE_FIRST_SHIELD           = 1, // Ready to be shielded for the first time +    PHASE_SECOND_SHIELD          = 2, // First shield already happened, ready to be shielded a second time +    PHASE_FINAL                  = 3  // Already shielded twice, ready to finish the encounter normally. +}; + +enum Actions +{ +    ACTION_DISABLE_BEACON, +}; + +class boss_temple_guardian_anhuur : public CreatureScript +{ +public: +    boss_temple_guardian_anhuur() : CreatureScript("boss_temple_guardian_anhuur") { } + +    struct boss_temple_guardian_anhuurAI : public BossAI +    { +        boss_temple_guardian_anhuurAI(Creature* creature) : BossAI(creature, DATA_TEMPLE_GUARDIAN_ANHUUR) { } + +        void CleanStalkers() +        { +            std::list<Creature*> stalkers; +            GetCreatureListWithEntryInGrid(stalkers, me, NPC_CAVE_IN_STALKER, 100.0f); +            for (std::list<Creature*>::iterator itr = stalkers.begin(); itr != stalkers.end(); ++itr) +            { +                (*itr)->RemoveAurasDueToSpell(SPELL_BEAM_OF_LIGHT_RIGHT); +                (*itr)->RemoveAurasDueToSpell(SPELL_BEAM_OF_LIGHT_LEFT); +            } +        } + +        void Reset() override +        { +            _phase = PHASE_FIRST_SHIELD; +            _oldPhase = PHASE_FIRST_SHIELD; +            _beacons = 0; +            _Reset(); +            CleanStalkers(); +            me->RemoveAurasDueToSpell(SPELL_SHIELD_OF_LIGHT); +            events.ScheduleEvent(EVENT_DIVINE_RECKONING, urand(10000, 12000)); +            events.ScheduleEvent(EVENT_BURNING_LIGHT, 12000); +        } + +        void DamageTaken(Unit* /*attacker*/, uint32& damage) override +        { +            if ((me->HealthBelowPctDamaged(66, damage) && _phase == PHASE_FIRST_SHIELD) || +                (me->HealthBelowPctDamaged(33, damage) && _phase == PHASE_SECOND_SHIELD)) +            { +                _beacons = 2; +                _phase++; // Increase the phase +                _oldPhase = _phase; + +                _phase = PHASE_SHIELDED; + +                me->InterruptNonMeleeSpells(true); +                me->AttackStop(); +                DoCast(me, SPELL_TELEPORT); + +                DoCast(me, SPELL_SHIELD_OF_LIGHT); +                me->SetFlag(UNIT_FIELD_FLAGS, uint32(UNIT_FLAG_UNK_31)); + +                DoCastAOE(SPELL_ACTIVATE_BEACONS); + +                std::list<Creature*> stalkers; +                GameObject* door = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_ANHUUR_DOOR)); +                GetCreatureListWithEntryInGrid(stalkers, me, NPC_CAVE_IN_STALKER, 100.0f); + +                stalkers.remove_if(Trinity::HeightDifferenceCheck(door, 0.0f, false)); // Target only the bottom ones +                for (std::list<Creature*>::iterator itr = stalkers.begin(); itr != stalkers.end(); ++itr) +                { +                    if ((*itr)->GetPositionX() > door->GetPositionX()) +                    { +                        (*itr)->CastSpell((*itr), SPELL_SHIELD_VISUAL_LEFT, true); +                        (*itr)->CastSpell((*itr), SPELL_BEAM_OF_LIGHT_LEFT, true); +                    } +                    else +                    { +                        (*itr)->CastSpell((*itr), SPELL_SHIELD_VISUAL_RIGHT, true); +                        (*itr)->CastSpell((*itr), SPELL_BEAM_OF_LIGHT_RIGHT, true); +                    } +                } + +                DoCast(me, SPELL_REVERBERATING_HYMN); + +                Talk(EMOTE_SHIELD); +                Talk(SAY_SHIELD); +            } +        } + +        void DoAction(int32 action) override +        { +            if (action == ACTION_DISABLE_BEACON) +            { +                --_beacons; +                if (!_beacons) +                { +                    me->RemoveAurasDueToSpell(SPELL_SHIELD_OF_LIGHT); +                    Talk(EMOTE_UNSHIELD); +                    _phase = _oldPhase; +                } +            } +        } + +        void EnterCombat(Unit* /*who*/) override +        { +            instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1); +            Talk(SAY_AGGRO); +            _EnterCombat(); +        } + +        void JustDied(Unit* /*killer*/) override +        { +            instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); +            Talk(SAY_DEATH); +            _JustDied(); +        } + +        void KilledUnit(Unit* victim) override +        { +            if (victim->GetTypeId() == TYPEID_PLAYER) +                Talk(SAY_KILL); +        } + +        void JustReachedHome() override +        { +            instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); +            _JustReachedHome(); +            instance->SetBossState(DATA_TEMPLE_GUARDIAN_ANHUUR, FAIL); +        } + +        void UpdateAI(uint32 diff) override +        { +            if (!UpdateVictim() || !CheckInRoom() || me->GetCurrentSpell(CURRENT_CHANNELED_SPELL) || _phase == PHASE_SHIELDED) +                return; + +            events.Update(diff); + +            if (me->HasUnitState(UNIT_STATE_CASTING)) +                return; + +            while (uint32 eventId = events.ExecuteEvent()) +            { +                switch (eventId) +                { +                    case EVENT_DIVINE_RECKONING: +                        DoCastVictim(SPELL_DIVINE_RECKONING); +                        events.ScheduleEvent(EVENT_DIVINE_RECKONING, urand(10000, 12000)); +                        break; +                    case EVENT_BURNING_LIGHT: +                    { +                        Unit* unit = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(me)); +                        if (!unit) +                            unit = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true); +                        DoCast(unit, SPELL_BURNING_LIGHT); +                        events.ScheduleEvent(EVENT_SEAR, 2000); +                        events.ScheduleEvent(EVENT_BURNING_LIGHT, 12000); +                        break; +                    } +                    case EVENT_SEAR: +                    { +                        Unit* target = me->FindNearestCreature(NPC_SEARING_LIGHT, 100.0f); +                        if (!target) +                            break; + +                        std::list<Creature*> stalkers; +                        GetCreatureListWithEntryInGrid(stalkers, me, NPC_CAVE_IN_STALKER, 100.0f); +                        stalkers.remove_if(Trinity::HeightDifferenceCheck(ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_ANHUUR_DOOR)), 5.0f, true)); + +                        if (stalkers.empty()) +                            break; + +                        stalkers.sort(Trinity::ObjectDistanceOrderPred(target)); + +                        // Get the closest statue face (any of its eyes) +                        Creature* eye1 = stalkers.front(); +                        stalkers.remove(eye1); // Remove the eye. +                        stalkers.sort(Trinity::ObjectDistanceOrderPred(eye1)); // Find the second eye. +                        Creature* eye2 = stalkers.front(); + +                        eye1->CastSpell(eye1, SPELL_SEARING_LIGHT, true); +                        eye2->CastSpell(eye2, SPELL_SEARING_LIGHT, true); +                        break; +                    } +                } +            } + +            DoMeleeAttackIfReady(); +        } + +    private: +        uint8 _phase; +        uint8 _oldPhase; +        uint8 _beacons; +    }; + +    CreatureAI* GetAI(Creature* creature) const override +    { +        return GetHallsOfOriginationAI<boss_temple_guardian_anhuurAI>(creature); +    } +}; + +class spell_anhuur_shield_of_light : public SpellScriptLoader +{ +    public: +        spell_anhuur_shield_of_light() : SpellScriptLoader("spell_anhuur_shield_of_light") { } + +        class spell_anhuur_shield_of_light_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_anhuur_shield_of_light_SpellScript); + +            void FilterTargets(std::list<WorldObject*>& targets) +            { +                if (InstanceMap* instance = GetCaster()->GetMap()->ToInstanceMap()) +                { +                    if (InstanceScript* const script = instance->GetInstanceScript()) +                    { +                        if (GameObject* go = ObjectAccessor::GetGameObject(*GetCaster(), script->GetData64(DATA_ANHUUR_DOOR))) +                        { +                            targets.remove_if(Trinity::HeightDifferenceCheck(go, 5.0f, false)); +                            targets.remove(GetCaster()); +                            targets.sort(Trinity::ObjectDistanceOrderPred(GetCaster())); +                            targets.resize(2); +                        } +                    } +                } +            } + +            void Register() override +            { +                OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_anhuur_shield_of_light_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENTRY); +            } +        }; + +        SpellScript* GetSpellScript() const override +        { +            return new spell_anhuur_shield_of_light_SpellScript(); +        } +}; + +class spell_anhuur_disable_beacon_beams : public SpellScriptLoader +{ +    public: +        spell_anhuur_disable_beacon_beams() : SpellScriptLoader("spell_anhuur_disable_beacon_beams") { } + +        class spell_anhuur_disable_beacon_beams_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_anhuur_disable_beacon_beams_SpellScript); + +            void HandleScript(SpellEffIndex /*effIndex*/) +            { +                GetHitUnit()->RemoveAurasDueToSpell(GetEffectValue()); +            } + +            void Notify(SpellEffIndex /*index*/) +            { +                if (InstanceMap* instance = GetCaster()->GetMap()->ToInstanceMap()) +                    if (InstanceScript* const script = instance->GetInstanceScript()) +                        if (Creature* anhuur = instance->GetCreature(script->GetData64(DATA_ANHUUR_GUID))) +                            anhuur->AI()->DoAction(ACTION_DISABLE_BEACON); +            } + +            void Register() override +            { +                OnEffectHitTarget += SpellEffectFn(spell_anhuur_disable_beacon_beams_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); +                OnEffectHit += SpellEffectFn(spell_anhuur_disable_beacon_beams_SpellScript::Notify, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); +            } +        }; + +        SpellScript* GetSpellScript() const override +        { +            return new spell_anhuur_disable_beacon_beams_SpellScript(); +        } +}; + +class spell_anhuur_activate_beacons : public SpellScriptLoader +{ +    public: +        spell_anhuur_activate_beacons() : SpellScriptLoader("spell_anhuur_activate_beacons") { } + +        class spell_anhuur_activate_beacons_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_anhuur_activate_beacons_SpellScript); + +            void Activate(SpellEffIndex index) +            { +                PreventHitDefaultEffect(index); +                GetHitGObj()->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); +            } + +            void Register() override +            { +                OnEffectHitTarget += SpellEffectFn(spell_anhuur_activate_beacons_SpellScript::Activate, EFFECT_0, SPELL_EFFECT_ACTIVATE_OBJECT); +            } +        }; + +        SpellScript* GetSpellScript() const override +        { +            return new spell_anhuur_activate_beacons_SpellScript(); +        } +}; + +class spell_anhuur_divine_reckoning : public SpellScriptLoader +{ +public: +    spell_anhuur_divine_reckoning() : SpellScriptLoader("spell_anhuur_divine_reckoning") { } + +    class spell_anhuur_divine_reckoning_AuraScript : public AuraScript +    { +        PrepareAuraScript(spell_anhuur_divine_reckoning_AuraScript); + +        void OnPeriodic(AuraEffect const* aurEff) +        { +            if (Unit* caster = GetCaster()) +            { +                CustomSpellValues values; +                values.AddSpellMod(SPELLVALUE_BASE_POINT0, aurEff->GetAmount()); +                caster->CastCustomSpell(GetSpellInfo()->Effects[EFFECT_0].TriggerSpell, values, GetTarget()); +            } +        } + +        void Register() +        { +            OnEffectPeriodic += AuraEffectPeriodicFn(spell_anhuur_divine_reckoning_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); +        } +    }; + +    AuraScript* GetAuraScript() const +    { +        return new spell_anhuur_divine_reckoning_AuraScript(); +    } +}; + +void AddSC_boss_temple_guardian_anhuur() +{ +    new boss_temple_guardian_anhuur(); +    new spell_anhuur_shield_of_light(); +    new spell_anhuur_disable_beacon_beams(); +    new spell_anhuur_activate_beacons(); +    new spell_anhuur_divine_reckoning(); +} diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h b/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h new file mode 100644 index 00000000000..0359b0fe85a --- /dev/null +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h @@ -0,0 +1,127 @@ +/* + * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef HALLS_OF_ORIGINATION_H +#define HALLS_OF_ORIGINATION_H + +#define DataHeader "HOO" +#define HoOScriptName "instance_halls_of_origination" + +uint32 const EncounterCount = 12; + +enum Data +{ +    // Bosses +    DATA_TEMPLE_GUARDIAN_ANHUUR, +    DATA_EARTHRAGER_PTAH, +    DATA_VAULT_OF_LIGHTS, +    DATA_FIRE_WARDEN, +    DATA_EARTH_WARDEN, +    DATA_WATER_WARDEN, +    DATA_AIR_WARDEN, +    DATA_ANRAPHET, +    DATA_ISISET, +    DATA_AMMUNAE, +    DATA_SETESH, +    DATA_RAJH, + +    // Temple Guardian Anhuur +    DATA_ANHUUR_GUID, +    DATA_ANHUUR_LEFT_BEACON, +    DATA_ANHUUR_RIGHT_BEACON, +    DATA_ANHUUR_BRIDGE, +    DATA_ANHUUR_DOOR, + +    // Anraphet +    DATA_BRANN_0_GUID, +    DATA_DEAD_ELEMENTALS, +    DATA_ANRAPHET_GUID, +}; + +enum Creatures +{ +    BOSS_TEMPLE_GUARDIAN_ANHUUR     = 39425, +    NPC_CAVE_IN_STALKER             = 40183, +    NPC_SEARING_LIGHT               = 40283, + +    BOSS_EARTHRAGER_PTAH            = 39428, +    NPC_BEETLE_STALKER              = 40459, // Summons both Jeweled Scarab and Dustbone Horror +    NPC_JEWELED_SCARAB              = 40458, +    NPC_DUSTBONE_HORROR             = 40450, +    NPC_QUICKSAND                   = 40503, // Summoned by a spell not in dbc (75550) + +    BOSS_ANRAPHET                   = 39788, +    NPC_FIRE_WARDEN                 = 39800, +    NPC_EARTH_WARDEN                = 39801, +    NPC_WATER_WARDEN                = 39802, +    NPC_AIR_WARDEN                  = 39803, + +    WARDEN_ENTRY_DATA_DELTA         = NPC_FIRE_WARDEN - DATA_FIRE_WARDEN, + +    NPC_BRANN_BRONZEBEARD_0         = 39908, +    NPC_OMEGA_STANCE                = 41194, +}; + +enum GameObjects +{ +    GO_ANHUURS_BRIDGE               = 206506, +    GO_DOODAD_ULDUM_ELEVATOR_COL01  = 207725, +    GO_ANHUURS_DOOR                 = 202307, +    GO_ANHUURS_RIGHT_BEACON         = 203136, +    GO_ANHUURS_LEFT_BEACON          = 203133, + +    GO_VAULT_OF_LIGHTS_DOOR         = 202313, +    GO_SUN_MIRROR                   = 207726, +    GO_ANRAPHET_DOOR                = 202314, + +    GO_DOODAD_ULDUM_LIGHTMACHINE_01 = 207375, +    GO_DOODAD_ULDUM_LIGHTMACHINE_02 = 207374, +    GO_DOODAD_ULDUM_LIGHTMACHINE_03 = 207377, +    GO_DOODAD_ULDUM_LIGHTMACHINE_04 = 207376, + +    GO_DOODAD_ULDUM_LASERBEAMS01    = 207662, // Matches GO_DOODAD_ULDUM_LIGHTMACHINE_02 +    GO_DOODAD_ULDUM_LASERBEAMS_01   = 207663, // Matches GO_DOODAD_ULDUM_LIGHTMACHINE_01 +    GO_DOODAD_ULDUM_LASERBEAMS_02   = 207664, // Matches GO_DOODAD_ULDUM_LIGHTMACHINE_04 +    GO_DOODAD_ULDUM_LASERBEAMS_03   = 207665, // Matches GO_DOODAD_ULDUM_LIGHTMACHINE_03 +}; + +enum Misc +{ +    AREA_TOMB_OF_THE_EARTHRAGER     = 4945, +    ACHIEV_VAULT_OF_LIGHTS_EVENT    = 24212, // Faster Than The Speed Of Light +    SPELL_VAULT_OF_LIGHTS_CREDIT    = 94067, // Not in DBC +}; + +enum GlobalActions +{ +    ACTION_ANRAPHET_INTRO, +    ACTION_ELEMENTAL_DIED, +    ACTION_ANRAPHET_DIED, +    ACTION_OMEGA_TRIGGER, +}; + +template<class AI> +CreatureAI* GetHallsOfOriginationAI(Creature* creature) +{ +    if (InstanceMap* instance = creature->GetMap()->ToInstanceMap()) +        if (instance->GetInstanceScript()) +            if (instance->GetScriptId() == sObjectMgr->GetScriptId(HoOScriptName)) +                return new AI(creature); +    return NULL; +} + +#endif // HALLS_OF_ORIGINATION_H diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp new file mode 100644 index 00000000000..3273d3d7850 --- /dev/null +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp @@ -0,0 +1,249 @@ +/* + * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "ObjectMgr.h" +#include "ScriptMgr.h" +#include "InstanceScript.h" +#include "ScriptedCreature.h" +#include "Map.h" +#include "PoolMgr.h" +#include "AccountMgr.h" +#include "halls_of_origination.h" +#include "Player.h" +#include "WorldPacket.h" +#include "WorldSession.h" + +DoorData const doorData[] = +{ +    {GO_ANHUURS_DOOR,                 DATA_TEMPLE_GUARDIAN_ANHUUR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, +    {GO_ANHUURS_BRIDGE,               DATA_TEMPLE_GUARDIAN_ANHUUR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, +    {GO_DOODAD_ULDUM_ELEVATOR_COL01,  DATA_TEMPLE_GUARDIAN_ANHUUR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, +    {GO_VAULT_OF_LIGHTS_DOOR,         DATA_VAULT_OF_LIGHTS,        DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, +    {GO_DOODAD_ULDUM_LIGHTMACHINE_02, DATA_EARTH_WARDEN,           DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, +    {GO_DOODAD_ULDUM_LASERBEAMS01,    DATA_EARTH_WARDEN,           DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, +    {GO_DOODAD_ULDUM_LIGHTMACHINE_01, DATA_FIRE_WARDEN,            DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, +    {GO_DOODAD_ULDUM_LASERBEAMS_01,   DATA_FIRE_WARDEN,            DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, +    {GO_DOODAD_ULDUM_LIGHTMACHINE_03, DATA_WATER_WARDEN,           DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, +    {GO_DOODAD_ULDUM_LASERBEAMS_03,   DATA_WATER_WARDEN,           DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, +    {GO_DOODAD_ULDUM_LIGHTMACHINE_04, DATA_AIR_WARDEN,             DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, +    {GO_DOODAD_ULDUM_LASERBEAMS_02,   DATA_AIR_WARDEN,             DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, +    {0,                              0,                            DOOR_TYPE_ROOM,    BOUNDARY_NONE } +}; + +class instance_halls_of_origination : public InstanceMapScript +{ +    public: +        instance_halls_of_origination() : InstanceMapScript(HoOScriptName, 644) { } + +        struct instance_halls_of_origination_InstanceMapScript : public InstanceScript +        { +            instance_halls_of_origination_InstanceMapScript(InstanceMap* map) : InstanceScript(map) +            { +                SetHeaders(DataHeader); +                SetBossNumber(EncounterCount); +                LoadDoorData(doorData); +                TempleGuardianAnhuurGUID = 0; +                AnhuursBridgeGUID = 0; +                AnhuursDoorGUID = 0; +                AnhuurRightBeaconGUID = 0; +                AnhuurLeftBeaconGUID = 0; +                BrannBronzebeardGUID = 0; +                AnraphetGUID = 0; +                AnraphetDoorGUID = 0; +                SunMirrorGUID = 0; +                _deadElementals = 0; +            } + +            void OnGameObjectCreate(GameObject* go) override +            { +                switch (go->GetEntry()) +                { +                    case GO_ANHUURS_BRIDGE: +                        AnhuursBridgeGUID = go->GetGUID(); +                    case GO_DOODAD_ULDUM_ELEVATOR_COL01: +                    case GO_VAULT_OF_LIGHTS_DOOR: +                    case GO_DOODAD_ULDUM_LIGHTMACHINE_01: +                    case GO_DOODAD_ULDUM_LIGHTMACHINE_02: +                    case GO_DOODAD_ULDUM_LIGHTMACHINE_03: +                    case GO_DOODAD_ULDUM_LIGHTMACHINE_04: +                    case GO_DOODAD_ULDUM_LASERBEAMS01: +                    case GO_DOODAD_ULDUM_LASERBEAMS_01: +                    case GO_DOODAD_ULDUM_LASERBEAMS_02: +                    case GO_DOODAD_ULDUM_LASERBEAMS_03: +                        AddDoor(go, true); +                        break; +                    case GO_ANHUURS_DOOR: +                        AnhuursDoorGUID = go->GetGUID(); +                        AddDoor(go, true); +                        break; +                    case GO_ANHUURS_RIGHT_BEACON: +                        AnhuurRightBeaconGUID = go->GetGUID(); +                        break; +                    case GO_ANHUURS_LEFT_BEACON: +                        AnhuurLeftBeaconGUID = go->GetGUID(); +                        break; +                    case GO_SUN_MIRROR: +                        SunMirrorGUID = go->GetGUID(); +                        break; +                    case GO_ANRAPHET_DOOR: +                        AnraphetDoorGUID = go->GetGUID(); +                        break; +                } +            } + +            void OnGameObjectRemove(GameObject* go) override +            { +                switch (go->GetEntry()) +                { +                    case GO_ANHUURS_BRIDGE: +                    case GO_DOODAD_ULDUM_ELEVATOR_COL01: +                    case GO_ANHUURS_DOOR: +                    case GO_VAULT_OF_LIGHTS_DOOR: +                    case GO_DOODAD_ULDUM_LIGHTMACHINE_01: +                    case GO_DOODAD_ULDUM_LIGHTMACHINE_02: +                    case GO_DOODAD_ULDUM_LIGHTMACHINE_03: +                    case GO_DOODAD_ULDUM_LIGHTMACHINE_04: +                    case GO_DOODAD_ULDUM_LASERBEAMS01: +                    case GO_DOODAD_ULDUM_LASERBEAMS_01: +                    case GO_DOODAD_ULDUM_LASERBEAMS_02: +                    case GO_DOODAD_ULDUM_LASERBEAMS_03: +                        AddDoor(go, false); +                        break; +                } +            } + +            void OnCreatureCreate(Creature* creature) override +            { +                switch (creature->GetEntry()) +                { +                    case BOSS_TEMPLE_GUARDIAN_ANHUUR: +                        TempleGuardianAnhuurGUID = creature->GetGUID(); +                        break; +                    case NPC_BRANN_BRONZEBEARD_0: +                        BrannBronzebeardGUID = creature->GetGUID(); +                        break; +                    case BOSS_ANRAPHET: +                        AnraphetGUID = creature->GetGUID(); +                        break; +                } +            } + +            uint32 GetData(uint32 data) const override +            { +                switch (data) +                { +                    case DATA_DEAD_ELEMENTALS: +                        return _deadElementals; +                    default: +                        break; +                } + +                return 0; +            } + +            uint64 GetData64(uint32 index) const override +            { +                switch (index) +                { +                    case DATA_ANHUUR_BRIDGE: +                        return AnhuursBridgeGUID; +                    case DATA_ANHUUR_DOOR: +                        return AnhuursDoorGUID; +                    case DATA_ANHUUR_LEFT_BEACON: +                        return AnhuurLeftBeaconGUID; +                    case DATA_ANHUUR_RIGHT_BEACON: +                        return AnhuurRightBeaconGUID; +                    case DATA_ANHUUR_GUID: +                        return TempleGuardianAnhuurGUID; +                    case DATA_BRANN_0_GUID: +                        return BrannBronzebeardGUID; +                    case DATA_ANRAPHET_GUID: +                        return AnraphetGUID; +                } + +                return 0; +            } + +            void IncreaseDeadElementals(uint32 inc) +            { +                _deadElementals += inc; +                if (_deadElementals == 4) +                { +                    if (GameObject* mirror = instance->GetGameObject(SunMirrorGUID)) +                        mirror->SetGoState(GO_STATE_ACTIVE); +                    if (GameObject* door = instance->GetGameObject(AnraphetDoorGUID)) +                        door->SetGoState(GO_STATE_ACTIVE); +                } +            } + +            void OnUnitDeath(Unit* unit) override +            { +                Creature* creature = unit->ToCreature(); +                if (!creature) +                    return; + +                switch (creature->GetEntry()) +                { +                    case NPC_FIRE_WARDEN: +                    case NPC_EARTH_WARDEN: +                    case NPC_WATER_WARDEN: +                    case NPC_AIR_WARDEN: +                        uint32 data = creature->GetEntry() - WARDEN_ENTRY_DATA_DELTA; +                        SetBossState(data, IN_PROGRESS); // Needs to be set to IN_PROGRESS or else the gameobjects state won't be updated +                        SetBossState(data, DONE); +                        IncreaseDeadElementals(1); +                        if (Creature* brann = instance->GetCreature(BrannBronzebeardGUID)) +                            brann->AI()->DoAction(ACTION_ELEMENTAL_DIED); +                        break; +                } +            } + +            void WriteSaveDataMore(std::ostringstream& data) override +            { +                data << _deadElementals; +            } + +            void ReadSaveDataMore(std::istringstream& data) override +            { +                uint32 deadElementals; +                data >> deadElementals; +                IncreaseDeadElementals(deadElementals); +            } + +        protected: +            uint64 TempleGuardianAnhuurGUID; +            uint64 AnhuursBridgeGUID; +            uint64 AnhuursDoorGUID; +            uint64 AnhuurRightBeaconGUID; +            uint64 AnhuurLeftBeaconGUID; +            uint64 BrannBronzebeardGUID; +            uint64 AnraphetGUID; +            uint64 AnraphetDoorGUID; +            uint64 SunMirrorGUID; +            uint32 _deadElementals; +        }; + +        InstanceScript* GetInstanceScript(InstanceMap* map) const override +        { +            return new instance_halls_of_origination_InstanceMapScript(map); +        } +}; + +void AddSC_instance_halls_of_origination() +{ +    new instance_halls_of_origination(); +} diff --git a/src/server/scripts/Kalimdor/boss_azuregos.cpp b/src/server/scripts/Kalimdor/boss_azuregos.cpp deleted file mode 100644 index df0c9a9c16c..00000000000 --- a/src/server/scripts/Kalimdor/boss_azuregos.cpp +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "SpellScript.h" -#include "SpellAuraEffects.h" -#include "Player.h" - -enum Say -{ -    SAY_TELEPORT             = 0 -}; - -enum Spells -{ -    SPELL_MARK_OF_FROST      = 23182, -    SPELL_AURA_OF_FROST      = 23186, -    SPELL_MARK_OF_FROST_AURA = 23184, -    SPELL_MANA_STORM         = 21097, -    SPELL_CHILL              = 21098, -    SPELL_FROST_BREATH       = 21099, -    SPELL_REFLECT            = 22067, -    SPELL_CLEAVE             = 8255,     // Perhaps not right ID -    SPELL_ENRAGE             = 23537 -}; - -enum Events -{ -    EVENT_MARK_OF_FROST      = 1, -    EVENT_MANA_STORM, -    EVENT_CHILL, -    EVENT_BREATH, -    EVENT_TELEPORT, -    EVENT_REFLECT, -    EVENT_CLEAVE, -    EVENT_ENRAGE -}; - -class boss_azuregos : public CreatureScript -{ -    public: -        boss_azuregos() : CreatureScript("boss_azuregos") { } - -        struct boss_azuregosAI : public WorldBossAI -        { -            boss_azuregosAI(Creature* creature) : WorldBossAI(creature) -            { -                _enraged = false; -            } - -            void Reset() override -            { -                _Reset(); -            } - -            void EnterCombat(Unit* /*who*/) override -            { -                DoCast(me, SPELL_MARK_OF_FROST_AURA, true); -                _enraged = false; - -                events.ScheduleEvent(EVENT_MARK_OF_FROST, 35000); -                events.ScheduleEvent(EVENT_MANA_STORM, urand(5000, 17000)); -                events.ScheduleEvent(EVENT_CHILL, urand(10000, 30000)); -                events.ScheduleEvent(EVENT_BREATH, urand(2000, 8000)); -                events.ScheduleEvent(EVENT_TELEPORT, 30000); -                events.ScheduleEvent(EVENT_REFLECT, urand(15000, 30000)); -                events.ScheduleEvent(EVENT_CLEAVE, 7000); -            } - -            void KilledUnit(Unit* who) override -            { -                if (who->GetTypeId() == TYPEID_PLAYER) -                    who->CastSpell(who, SPELL_MARK_OF_FROST, true); -            } - -            void UpdateAI(uint32 diff) override -            { -                if (!UpdateVictim()) -                    return; - -                events.Update(diff); - -                if (me->HasUnitState(UNIT_STATE_CASTING)) -                    return; - -                while (uint32 eventId = events.ExecuteEvent()) -                { -                    switch (eventId) -                    { -                        case EVENT_MANA_STORM: -                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 60.0f, true)) -                                DoCast(target, SPELL_MANA_STORM); -                            events.ScheduleEvent(EVENT_MANA_STORM, urand(7500, 12500)); -                            break; -                        case EVENT_CHILL: -                            DoCastVictim(SPELL_CHILL); -                            events.ScheduleEvent(EVENT_CHILL, urand(13000, 25000)); -                            break; -                        case EVENT_BREATH: -                            DoCastVictim(SPELL_FROST_BREATH); -                            events.ScheduleEvent(EVENT_BREATH, urand(10000, 15000)); -                            break; -                        case EVENT_TELEPORT: -                        { -                            Talk(SAY_TELEPORT); -                            ThreatContainer::StorageType const& threatlist = me->getThreatManager().getThreatList(); -                            for (ThreatContainer::StorageType::const_iterator i = threatlist.begin(); i != threatlist.end(); ++i) -                            { -                                if (Player* player = ObjectAccessor::GetPlayer(*me, (*i)->getUnitGuid())) -                                    DoTeleportPlayer(player, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+3, player->GetOrientation()); -                            } - -                            DoResetThreat(); -                            events.ScheduleEvent(EVENT_TELEPORT, 30000); -                            break; -                        } -                        case EVENT_REFLECT: -                            DoCast(me, SPELL_REFLECT); -                            events.ScheduleEvent(EVENT_REFLECT, urand(20000, 35000)); -                            break; -                        case EVENT_CLEAVE: -                            DoCastVictim(SPELL_CLEAVE); -                            events.ScheduleEvent(EVENT_CLEAVE, 7000); -                            break; -                        default: -                            break; -                    } -                } - -                if (HealthBelowPct(26) && !_enraged) -                { -                    DoCast(me, SPELL_ENRAGE); -                    _enraged = true; -                } - -                DoMeleeAttackIfReady(); -            } - -        private: -            bool _enraged; -        }; - -        CreatureAI* GetAI(Creature* creature) const override -        { -            return new boss_azuregosAI(creature); -        } -}; - -class MarkOfFrostTargetSelector -{ -    public: -        MarkOfFrostTargetSelector() { } - -        bool operator()(WorldObject* object) const -        { -            if (Unit* unit = object->ToUnit()) -                return !(unit->HasAura(SPELL_MARK_OF_FROST) && !unit->HasAura(SPELL_AURA_OF_FROST)); -            return true; -        } -}; - -class spell_mark_of_frost : public SpellScriptLoader -{ -    public: -        spell_mark_of_frost() : SpellScriptLoader("spell_mark_of_frost") { } - -        class spell_mark_of_frost_SpellScript : public SpellScript -        { -            PrepareSpellScript(spell_mark_of_frost_SpellScript); - -            bool Validate(SpellInfo const* /*spellInfo*/) override -            { -                if (!sSpellMgr->GetSpellInfo(SPELL_MARK_OF_FROST)) -                    return false; -                if (!sSpellMgr->GetSpellInfo(SPELL_AURA_OF_FROST)) -                    return false; -                return true; -            } - -            void FilterTargets(std::list<WorldObject*>& targets) -            { -                targets.remove_if(MarkOfFrostTargetSelector()); -            } - -            void HandleEffect(SpellEffIndex effIndex) -            { -                PreventHitDefaultEffect(effIndex); -                GetHitUnit()->CastSpell(GetHitUnit(), SPELL_AURA_OF_FROST, true); -            } - -            void Register() override -            { -                OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mark_of_frost_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); -                OnEffectHitTarget += SpellEffectFn(spell_mark_of_frost_SpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_APPLY_AURA); -            } -        }; - -        SpellScript* GetSpellScript() const override -        { -            return new spell_mark_of_frost_SpellScript(); -        } -}; - -void AddSC_boss_azuregos() -{ -    new boss_azuregos(); -    new spell_mark_of_frost(); -} diff --git a/src/server/scripts/Kalimdor/zone_azshara.cpp b/src/server/scripts/Kalimdor/zone_azshara.cpp index cec94617454..b4515da25ef 100644 --- a/src/server/scripts/Kalimdor/zone_azshara.cpp +++ b/src/server/scripts/Kalimdor/zone_azshara.cpp @@ -1,6 +1,5 @@  /*   * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>   *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License as published by the @@ -16,543 +15,6 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -/* ScriptData -SDName: Azshara -SD%Complete: 90 -SDComment: Quest support: 2744, 3141, 9364, 10994 -SDCategory: Azshara -EndScriptData */ - -/* ContentData -npc_spitelashes -npc_loramus_thalipedes -npc_rizzle_sprysprocket -npc_depth_charge -EndContentData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "ScriptedGossip.h" -#include "Player.h" -#include "SpellInfo.h" - -/*###### -## npc_spitelashes -######*/ - -enum Spitelashes -{ -    SPELL_POLYMORPH_RANK1       = 118, -    SPELL_POLYMORPH_RANK2       = 12824, -    SPELL_POLYMORPH_RANK3       = 12825, -    SPELL_POLYMORPH_RANK4       = 12826, -    SPELL_POLYMORPH             = 29124, -    SPELL_POLYMORPH_BACKFIRE    = 28406, -    SPELL_REMOVE_POLYMORPH      = 6924 -}; - -class npc_spitelashes : public CreatureScript -{ -public: -    npc_spitelashes() : CreatureScript("npc_spitelashes") { } - -    struct npc_spitelashesAI : public ScriptedAI -    { -        npc_spitelashesAI(Creature* creature) : ScriptedAI(creature) -        { -            Initialize(); -        } - -        void Initialize() -        { -            morphtimer = 0; -            spellhit = false; -        } - -        uint32 morphtimer; -        bool spellhit; - -        void Reset() override -        { -            Initialize(); -        } - -        void EnterCombat(Unit* /*who*/) override { } - -        void SpellHit(Unit* unit, const SpellInfo* spell) override -        { -            if (spellhit) -                return; - -            switch (spell->Id) -            { -                case SPELL_POLYMORPH_RANK1: -                case SPELL_POLYMORPH_RANK2: -                case SPELL_POLYMORPH_RANK3: -                case SPELL_POLYMORPH_RANK4: -                    if (Player* player = unit->ToPlayer()) -                        if (player->GetQuestStatus(9364) == QUEST_STATUS_INCOMPLETE) -                        { -                            spellhit = true; -                            DoCast(me, SPELL_POLYMORPH); -                        } -                    break; -                default: -                    break; -            } -        } - -        void UpdateAI(uint32 diff) override -        { -            // we mustn't remove the Creature in the same round in which we cast the summon spell, otherwise there will be no summons -            if (spellhit && morphtimer >= 5000) -            { -                me->DespawnOrUnsummon(); -                return; -            } -            // walk 5 seconds before summoning -            if (spellhit && morphtimer<5000) -            { -                morphtimer+=diff; -                if (morphtimer >= 5000) -                { -                    DoCast(me, SPELL_POLYMORPH_BACKFIRE); // summon copies -                    DoCast(me, SPELL_REMOVE_POLYMORPH);   // visual explosion -                } -            } -            if (!UpdateVictim()) -                return; - -            /// @todo add abilities for the different creatures -            DoMeleeAttackIfReady(); -        } -    }; - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return new npc_spitelashesAI(creature); -    } -}; - -/*###### -## npc_loramus_thalipedes -######*/ - -#define GOSSIP_HELLO_LT1    "Can you help me?" -#define GOSSIP_HELLO_LT2    "Tell me your story" -#define GOSSIP_SELECT_LT1   "Please continue" -#define GOSSIP_SELECT_LT2   "I do not understand" -#define GOSSIP_SELECT_LT3   "Indeed" -#define GOSSIP_SELECT_LT4   "I will do this with or your help, Loramus" -#define GOSSIP_SELECT_LT5   "Yes" - -class npc_loramus_thalipedes : public CreatureScript -{ -public: -    npc_loramus_thalipedes() : CreatureScript("npc_loramus_thalipedes") { } - -    bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override -    { -        player->PlayerTalkClass->ClearMenus(); -        switch (action) -        { -            case GOSSIP_ACTION_INFO_DEF+1: -                player->CLOSE_GOSSIP_MENU(); -                player->AreaExploredOrEventHappens(2744); -                break; - -            case GOSSIP_ACTION_INFO_DEF+2: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_LT1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 21); -                player->SEND_GOSSIP_MENU(1813, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+21: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_LT2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 22); -                player->SEND_GOSSIP_MENU(1814, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+22: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_LT3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 23); -                player->SEND_GOSSIP_MENU(1815, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+23: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_LT4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 24); -                player->SEND_GOSSIP_MENU(1816, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+24: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_LT5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 25); -                player->SEND_GOSSIP_MENU(1817, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+25: -                player->CLOSE_GOSSIP_MENU(); -                player->AreaExploredOrEventHappens(3141); -                break; -        } -        return true; -    } - -    bool OnGossipHello(Player* player, Creature* creature) override -    { -        if (creature->IsQuestGiver()) -            player->PrepareQuestMenu(creature->GetGUID()); - -        if (player->GetQuestStatus(2744) == QUEST_STATUS_INCOMPLETE) -            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HELLO_LT1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - -        if (player->GetQuestStatus(3141) == QUEST_STATUS_INCOMPLETE) -            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HELLO_LT2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - -        player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); - -        return true; -    } -}; - -/*#### -# npc_rizzle_sprysprocket -####*/ - -enum RizzleSprysprocketData -{ -    QUEST_CHASING_THE_MOONSTONE     = 10994, - -    NPC_DEPTH_CHARGE                = 23025, - -    SPELL_RIZZLE_BLACKJACK          = 39865, -    SPELL_RIZZLE_ESCAPE             = 39871, -    SPELL_RIZZLE_FROST_GRENADE      = 40525, -    SPELL_DEPTH_CHARGE_TRAP         = 38576, -    SPELL_PERIODIC_DEPTH_CHARGE     = 39912, -    SPELL_GIVE_SOUTHFURY_MOONSTONE  = 39886, - -    SAY_RIZZLE_START                = 0, -    SAY_RIZZLE_GRENADE              = 1, -    SAY_RIZZLE_FINAL                = 2, -    MSG_ESCAPE_NOTICE               = 3 -}; - -#define GOSSIP_GET_MOONSTONE "Hand over the Southfury moonstone and I'll let you go." - -Position const WPs[58] = -{ -    {3691.97f, -3962.41f, 35.9118f, 3.67f}, -    {3675.02f, -3960.49f, 35.9118f, 3.67f}, -    {3653.19f, -3958.33f, 33.9118f, 3.59f}, -    {3621.12f, -3958.51f, 29.9118f, 3.48f}, -    {3604.86f, -3963,     29.9118f, 3.48f}, -    {3569.94f, -3970.25f, 29.9118f, 3.44f}, -    {3541.03f, -3975.64f, 29.9118f, 3.41f}, -    {3510.84f, -3978.71f, 29.9118f, 3.41f}, -    {3472.7f,  -3997.07f, 29.9118f, 3.35f}, -    {3439.15f, -4014.55f, 29.9118f, 3.29f}, -    {3412.8f,  -4025.87f, 29.9118f, 3.25f}, -    {3384.95f, -4038.04f, 29.9118f, 3.24f}, -    {3346.77f, -4052.93f, 29.9118f, 3.22f}, -    {3299.56f, -4071.59f, 29.9118f, 3.20f}, -    {3261.22f, -4080.38f, 30.9118f, 3.19f}, -    {3220.68f, -4083.09f, 31.9118f, 3.18f}, -    {3187.11f, -4070.45f, 33.9118f, 3.16f}, -    {3162.78f, -4062.75f, 33.9118f, 3.15f}, -    {3136.09f, -4050.32f, 33.9118f, 3.07f}, -    {3119.47f, -4044.51f, 36.0363f, 3.07f}, -    {3098.95f, -4019.8f,  33.9118f, 3.07f}, -    {3073.07f, -4011.42f, 33.9118f, 3.07f}, -    {3051.71f, -3993.37f, 33.9118f, 3.02f}, -    {3027.52f, -3978.6f,  33.9118f, 3.00f}, -    {3003.78f, -3960.14f, 33.9118f, 2.98f}, -    {2977.99f, -3941.98f, 31.9118f, 2.96f}, -    {2964.57f, -3932.07f, 30.9118f, 2.96f}, -    {2947.9f,  -3921.31f, 29.9118f, 2.96f}, -    {2924.91f, -3910.8f,  29.9118f, 2.94f}, -    {2903.04f, -3896.42f, 29.9118f, 2.93f}, -    {2884.75f, -3874.03f, 29.9118f, 2.90f}, -    {2868.19f, -3851.48f, 29.9118f, 2.82f}, -    {2854.62f, -3819.72f, 29.9118f, 2.80f}, -    {2825.53f, -3790.4f,  29.9118f, 2.744f}, -    {2804.31f, -3773.05f, 29.9118f, 2.71f}, -    {2769.78f, -3763.57f, 29.9118f, 2.70f}, -    {2727.23f, -3745.92f, 30.9118f, 2.69f}, -    {2680.12f, -3737.49f, 30.9118f, 2.67f}, -    {2647.62f, -3739.94f, 30.9118f, 2.66f}, -    {2616.6f,  -3745.75f, 30.9118f, 2.64f}, -    {2589.38f, -3731.97f, 30.9118f, 2.61f}, -    {2562.94f, -3722.35f, 31.9118f, 2.56f}, -    {2521.05f, -3716.6f,  31.9118f, 2.55f}, -    {2485.26f, -3706.67f, 31.9118f, 2.51f}, -    {2458.93f, -3696.67f, 31.9118f, 2.51f}, -    {2432,     -3692.03f, 31.9118f, 2.46f}, -    {2399.59f, -3681.97f, 31.9118f, 2.45f}, -    {2357.75f, -3666.6f,  31.9118f, 2.44f}, -    {2311.99f, -3656.88f, 31.9118f, 2.94f}, -    {2263.41f, -3649.55f, 31.9118f, 3.02f}, -    {2209.05f, -3641.76f, 31.9118f, 2.99f}, -    {2164.83f, -3637.64f, 31.9118f, 3.15f}, -    {2122.42f,  -3639,    31.9118f, 3.21f}, -    {2075.73f, -3643.59f, 31.9118f, 3.22f}, -    {2033.59f, -3649.52f, 31.9118f, 3.42f}, -    {1985.22f, -3662.99f, 31.9118f, 3.42f}, -    {1927.09f, -3679.56f, 33.9118f, 3.42f}, -    {1873.57f, -3695.32f, 33.9118f, 3.44f} -}; - -class npc_rizzle_sprysprocket : public CreatureScript -{ -public: -    npc_rizzle_sprysprocket() : CreatureScript("npc_rizzle_sprysprocket") { } - -    struct npc_rizzle_sprysprocketAI : public ScriptedAI -    { -        npc_rizzle_sprysprocketAI(Creature* creature) : ScriptedAI(creature) -        { -            Initialize(); -        } - -        void Initialize() -        { -            SpellEscapeTimer = 1300; -            TeleportTimer = 3500; -            CheckTimer = 10000; -            GrenadeTimer = 30000; -            MustDieTimer = 3000; -            CurrWP = 0; - -            PlayerGUID = 0; - -            MustDie = false; -            Escape = false; -            ContinueWP = false; -            Reached = false; -        } - -        void Reset() override -        { -            Initialize(); -        } - -        void EnterCombat(Unit* /*who*/) override { } - -        void AttackStart(Unit* who) override -        { -            if (!who || PlayerGUID) -                return; - -            Player* player = who->ToPlayer(); - -            if (player && player->GetQuestStatus(QUEST_CHASING_THE_MOONSTONE) == QUEST_STATUS_INCOMPLETE) -            { -                PlayerGUID = who->GetGUID(); -                Talk(SAY_RIZZLE_START); -                DoCast(who, SPELL_RIZZLE_BLACKJACK, false); -                return; -            } -        } - -        void sGossipSelect(Player* player, uint32 /*sender*/, uint32 /*action*/) override -        { -            player->CLOSE_GOSSIP_MENU(); -            me->CastSpell(player, SPELL_GIVE_SOUTHFURY_MOONSTONE, true); -            MustDieTimer = 3000; -            MustDie = true; -        } - -        void MovementInform(uint32 type, uint32 id) override -        { -            if (type != POINT_MOTION_TYPE) -                return; - -            if (id == 57) -            { -                me->DespawnOrUnsummon(); -                return; -            } - -            ++CurrWP; -            ContinueWP = true; -        } - -        void UpdateAI(uint32 diff) override -        { -            if (MustDie) -            { -                if (MustDieTimer <= diff) -                { -                    me->DespawnOrUnsummon(); -                    return; -                } else MustDieTimer -= diff; -            } - -            if (!Escape) -            { -                if (!PlayerGUID) -                    return; - -                if (SpellEscapeTimer <= diff) -                { -                    DoCast(me, SPELL_RIZZLE_ESCAPE, false); -                    SpellEscapeTimer = 10000; -                } else SpellEscapeTimer -= diff; - -                if (TeleportTimer <= diff) -                { -                    // temp solution - unit can't be teleported by core using spelleffect 5, only players -                    DoTeleportTo(3706.39f, -3969.15f, 35.9118f); - -                    //begin swimming and summon depth charges -                    Player* player = ObjectAccessor::GetPlayer(*me, PlayerGUID); -                    if (!player) -                        return; - -                    Talk(MSG_ESCAPE_NOTICE, player); -                    DoCast(me, SPELL_PERIODIC_DEPTH_CHARGE); -                    me->SetHover(true); -                    me->SetSwim(true); -                    me->SetSpeed(MOVE_RUN, 0.85f, true); -                    me->GetMotionMaster()->MovementExpired(); -                    me->GetMotionMaster()->MovePoint(CurrWP, WPs[CurrWP]); -                    Escape = true; -                } else TeleportTimer -= diff; - -                return; -            } - -            if (ContinueWP) -            { -                me->GetMotionMaster()->MovePoint(CurrWP, WPs[CurrWP]); -                ContinueWP = false; -            } - -            if (GrenadeTimer <= diff) -            { -                if (Player* player = ObjectAccessor::GetPlayer(*me, PlayerGUID)) -                { -                   Talk(SAY_RIZZLE_GRENADE, player); -                   DoCast(player, SPELL_RIZZLE_FROST_GRENADE, true); -                } -                GrenadeTimer = 30000; -            } else GrenadeTimer -= diff; - -            if (CheckTimer <= diff) -            { -                Player* player = ObjectAccessor::GetPlayer(*me, PlayerGUID); -                if (!player) -                { -                    me->DespawnOrUnsummon(); -                    return; -                } - -                if (me->IsWithinDist(player, 10) && me->GetPositionX() > player->GetPositionX() && !Reached) -                { -                    Talk(SAY_RIZZLE_FINAL); -                    me->SetUInt32Value(UNIT_NPC_FLAGS, 1); -                    me->setFaction(35); -                    me->GetMotionMaster()->MoveIdle(); -                    me->RemoveAurasDueToSpell(SPELL_PERIODIC_DEPTH_CHARGE); -                    Reached = true; -                } - -                CheckTimer = 1000; -            } else CheckTimer -= diff; -        } - -    private: -        uint64 PlayerGUID; -        uint32 SpellEscapeTimer; -        uint32 TeleportTimer; -        uint32 CheckTimer; -        uint32 GrenadeTimer; -        uint32 MustDieTimer; -        uint32 CurrWP; -        bool MustDie; -        bool Escape; -        bool ContinueWP; -        bool Reached; -    }; - -    bool OnGossipHello(Player* player, Creature* creature) override -    { -        if (player->GetQuestStatus(QUEST_CHASING_THE_MOONSTONE) != QUEST_STATUS_INCOMPLETE) -            return true; -        player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_GET_MOONSTONE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); -        player->SEND_GOSSIP_MENU(10811, creature->GetGUID()); -        return true; -    } - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return new npc_rizzle_sprysprocketAI(creature); -    } -}; - -/*#### -# npc_depth_charge -####*/ -class npc_depth_charge : public CreatureScript -{ -public: -    npc_depth_charge() : CreatureScript("npc_depth_charge") { } - -    struct npc_depth_chargeAI : public ScriptedAI -    { -        npc_depth_chargeAI(Creature* creature) : ScriptedAI(creature) -        { -            Initialize(); -        } - -        void Initialize() -        { -            WeMustDie = false; -            WeMustDieTimer = 1000; -        } - -        bool WeMustDie; -        uint32 WeMustDieTimer; - -        void Reset() override -        { -            me->SetHover(true); -            me->SetSwim(true); -            me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); -            Initialize(); -        } - -        void EnterCombat(Unit* /*who*/) override { } - -        void AttackStart(Unit* /*who*/) override { } - -        void MoveInLineOfSight(Unit* who) override -        { -            if (!who) -                return; - -            if (who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 5)) -            { -                DoCast(who, SPELL_DEPTH_CHARGE_TRAP); -                WeMustDie = true; -                return; -            } -        } - -        void UpdateAI(uint32 diff) override -        { -            if (WeMustDie) -            { -                if (WeMustDieTimer <= diff) -                    me->DespawnOrUnsummon(); -                else -                    WeMustDieTimer -= diff; -            } -            return; -        } -    }; - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return new npc_depth_chargeAI(creature); -    } -}; -  void AddSC_azshara()  { -    new npc_spitelashes(); -    new npc_loramus_thalipedes(); -    new npc_rizzle_sprysprocket(); -    new npc_depth_charge();  } diff --git a/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp index e6869dbf0f5..7974e1c0347 100644 --- a/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp +++ b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp @@ -19,7 +19,7 @@  /* ScriptData  SDName: Azuremyst_Isle  SD%Complete: 75 -SDComment: Quest support: 9283, 9537, 9582, 9554, 9531, ? (special flight path, proper model for mount missing). Injured Draenei cosmetic only, 9582. +SDComment: Quest support: 9283, 9537, 9582, 9554, ? (special flight path, proper model for mount missing). Injured Draenei cosmetic only, 9582.  SDCategory: Azuremyst Isle  EndScriptData */ @@ -28,7 +28,6 @@ npc_draenei_survivor  npc_engineer_spark_overgrind  npc_injured_draenei  npc_magwin -npc_geezle  go_ravager_cage  npc_death_ravager  EndContentData */ @@ -775,7 +774,6 @@ void AddSC_azuremyst_isle()      new npc_engineer_spark_overgrind();      new npc_injured_draenei();      new npc_magwin(); -    new npc_geezle();      new npc_death_ravager();      new go_ravager_cage();      new npc_stillpine_capitive(); diff --git a/src/server/scripts/Kalimdor/zone_darkshore.cpp b/src/server/scripts/Kalimdor/zone_darkshore.cpp index 22c619f9a90..1799709c7af 100644 --- a/src/server/scripts/Kalimdor/zone_darkshore.cpp +++ b/src/server/scripts/Kalimdor/zone_darkshore.cpp @@ -1,6 +1,5 @@  /*   * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>   *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License as published by the @@ -16,386 +15,6 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -/* ScriptData -SDName: Darkshore -SD%Complete: 100 -SDComment: Quest support: 731, 2078, 5321 -SDCategory: Darkshore -EndScriptData */ - -/* ContentData -npc_kerlonian -npc_prospector_remtravel -npc_threshwackonator -EndContentData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "ScriptedGossip.h" -#include "ScriptedEscortAI.h" -#include "ScriptedFollowerAI.h" -#include "Player.h" -#include "SpellInfo.h" - -/*#### -# npc_kerlonian -####*/ - -enum Kerlonian -{ -    SAY_KER_START               = 0, -    EMOTE_KER_SLEEP             = 1, -    SAY_KER_SLEEP               = 2, -    SAY_KER_ALERT_1             = 3, -    SAY_KER_END                 = 4, -    EMOTE_KER_AWAKEN            = 5, - -    SPELL_SLEEP_VISUAL          = 25148, -    SPELL_AWAKEN                = 17536, -    QUEST_SLEEPER_AWAKENED      = 5321, -    NPC_LILADRIS                = 11219,                    //attackers entries unknown -    FACTION_KER_ESCORTEE        = 113 -}; - -/// @todo make concept similar as "ringo" -escort. Find a way to run the scripted attacks, _if_ player are choosing road. -class npc_kerlonian : public CreatureScript -{ -public: -    npc_kerlonian() : CreatureScript("npc_kerlonian") { } - -    struct npc_kerlonianAI : public FollowerAI -    { -        npc_kerlonianAI(Creature* creature) : FollowerAI(creature) -        { -            Initialize(); -        } - -        void Initialize() -        { -            FallAsleepTimer = urand(10000, 45000); -        } - -        uint32 FallAsleepTimer; - -        void Reset() override -        { -            Initialize(); -        } - -        void MoveInLineOfSight(Unit* who) override - -        { -            FollowerAI::MoveInLineOfSight(who); - -            if (!me->GetVictim() && !HasFollowState(STATE_FOLLOW_COMPLETE) && who->GetEntry() == NPC_LILADRIS) -            { -                if (me->IsWithinDistInMap(who, INTERACTION_DISTANCE*5)) -                { -                    if (Player* player = GetLeaderForFollower()) -                    { -                        if (player->GetQuestStatus(QUEST_SLEEPER_AWAKENED) == QUEST_STATUS_INCOMPLETE) -                            player->GroupEventHappens(QUEST_SLEEPER_AWAKENED, me); - -                        Talk(SAY_KER_END); -                    } - -                    SetFollowComplete(); -                } -            } -        } - -        void SpellHit(Unit* /*pCaster*/, const SpellInfo* pSpell) override -        { -            if (HasFollowState(STATE_FOLLOW_INPROGRESS | STATE_FOLLOW_PAUSED) && pSpell->Id == SPELL_AWAKEN) -                ClearSleeping(); -        } - -        void SetSleeping() -        { -            SetFollowPaused(true); - -            Talk(EMOTE_KER_SLEEP); - -            Talk(SAY_KER_SLEEP); - -            me->SetStandState(UNIT_STAND_STATE_SLEEP); -            DoCast(me, SPELL_SLEEP_VISUAL, false); -        } - -        void ClearSleeping() -        { -            me->RemoveAurasDueToSpell(SPELL_SLEEP_VISUAL); -            me->SetStandState(UNIT_STAND_STATE_STAND); - -            Talk(EMOTE_KER_AWAKEN); - -            SetFollowPaused(false); -        } - -        void UpdateFollowerAI(uint32 diff) override -        { -            if (!UpdateVictim()) -            { -                if (!HasFollowState(STATE_FOLLOW_INPROGRESS)) -                    return; - -                if (!HasFollowState(STATE_FOLLOW_PAUSED)) -                { -                    if (FallAsleepTimer <= diff) -                    { -                        SetSleeping(); -                        FallAsleepTimer = urand(25000, 90000); -                    } -                    else -                        FallAsleepTimer -= diff; -                } - -                return; -            } - -            DoMeleeAttackIfReady(); -        } -    }; - -    bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override -    { -        if (quest->GetQuestId() == QUEST_SLEEPER_AWAKENED) -        { -            if (npc_kerlonianAI* pKerlonianAI = CAST_AI(npc_kerlonian::npc_kerlonianAI, creature->AI())) -            { -                creature->SetStandState(UNIT_STAND_STATE_STAND); -                creature->AI()->Talk(SAY_KER_START, player); -                pKerlonianAI->StartFollow(player, FACTION_KER_ESCORTEE, quest); -            } -        } - -        return true; -    } - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return new npc_kerlonianAI(creature); -    } -}; - -/*#### -# npc_prospector_remtravel -####*/ - -enum Remtravel -{ -    SAY_REM_START               = 0, -    SAY_REM_AGGRO               = 1, -    SAY_REM_RAMP1_1             = 2, -    SAY_REM_RAMP1_2             = 3, -    SAY_REM_BOOK                = 4, -    SAY_REM_TENT1_1             = 5, -    SAY_REM_TENT1_2             = 6, -    SAY_REM_MOSS                = 7, -    EMOTE_REM_MOSS              = 8, -    SAY_REM_MOSS_PROGRESS       = 9, -    SAY_REM_PROGRESS            = 10, -    SAY_REM_REMEMBER            = 11, -    EMOTE_REM_END               = 12, - -    FACTION_ESCORTEE            = 10, -    QUEST_ABSENT_MINDED_PT2     = 731, -    NPC_GRAVEL_SCOUT            = 2158, -    NPC_GRAVEL_BONE             = 2159, -    NPC_GRAVEL_GEO              = 2160 -}; - -class npc_prospector_remtravel : public CreatureScript -{ -public: -    npc_prospector_remtravel() : CreatureScript("npc_prospector_remtravel") { } - -    struct npc_prospector_remtravelAI : public npc_escortAI -    { -        npc_prospector_remtravelAI(Creature* creature) : npc_escortAI(creature) { } - -        void Reset() override { } - -        void EnterCombat(Unit* who) override -        { -            if (urand(0, 1)) -                Talk(SAY_REM_AGGRO, who); -        } - -        void JustSummoned(Creature* /*pSummoned*/) override -        { -            //unsure if it should be any -            //pSummoned->AI()->AttackStart(me); -        } - -        void WaypointReached(uint32 waypointId) override -        { -            if (Player* player = GetPlayerForEscort()) -            { -                switch (waypointId) -                { -                    case 0: -                        Talk(SAY_REM_START, player); -                        break; -                    case 5: -                        Talk(SAY_REM_RAMP1_1, player); -                        break; -                    case 6: -                        DoSpawnCreature(NPC_GRAVEL_SCOUT, -10.0f, 5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); -                        DoSpawnCreature(NPC_GRAVEL_BONE, -10.0f, 7.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); -                        break; -                    case 9: -                        Talk(SAY_REM_RAMP1_2, player); -                        break; -                    case 14: -                        //depend quest rewarded? -                        Talk(SAY_REM_BOOK, player); -                        break; -                    case 15: -                        Talk(SAY_REM_TENT1_1, player); -                        break; -                    case 16: -                        DoSpawnCreature(NPC_GRAVEL_SCOUT, -10.0f, 5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); -                        DoSpawnCreature(NPC_GRAVEL_BONE, -10.0f, 7.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); -                        break; -                    case 17: -                        Talk(SAY_REM_TENT1_2, player); -                        break; -                    case 26: -                        Talk(SAY_REM_MOSS, player); -                        break; -                    case 27: -                        Talk(EMOTE_REM_MOSS, player); -                        break; -                    case 28: -                        Talk(SAY_REM_MOSS_PROGRESS, player); -                        break; -                    case 29: -                        DoSpawnCreature(NPC_GRAVEL_SCOUT, -15.0f, 3.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); -                        DoSpawnCreature(NPC_GRAVEL_BONE, -15.0f, 5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); -                        DoSpawnCreature(NPC_GRAVEL_GEO, -15.0f, 7.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); -                        break; -                    case 31: -                        Talk(SAY_REM_PROGRESS, player); -                        break; -                    case 41: -                        Talk(SAY_REM_REMEMBER, player); -                        break; -                    case 42: -                        Talk(EMOTE_REM_END, player); -                        player->GroupEventHappens(QUEST_ABSENT_MINDED_PT2, me); -                        break; -                } -            } -        } -    }; - -    bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override -    { -        if (quest->GetQuestId() == QUEST_ABSENT_MINDED_PT2) -        { -            if (npc_escortAI* pEscortAI = CAST_AI(npc_prospector_remtravel::npc_prospector_remtravelAI, creature->AI())) -                pEscortAI->Start(false, false, player->GetGUID()); - -            creature->setFaction(FACTION_ESCORTEE); -        } - -        return true; -    } - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return new npc_prospector_remtravelAI(creature); -    } -}; - -/*#### -# npc_threshwackonator -####*/ - -enum Threshwackonator -{ -    EMOTE_START             = 0, -    SAY_AT_CLOSE            = 1, -    QUEST_GYROMAST_REV      = 2078, -    NPC_GELKAK              = 6667, -    FACTION_HOSTILE         = 14 -}; - -#define GOSSIP_ITEM_INSERT_KEY  "[PH] Insert key" - -class npc_threshwackonator : public CreatureScript -{ -public: -    npc_threshwackonator() : CreatureScript("npc_threshwackonator") { } - -    struct npc_threshwackonatorAI : public FollowerAI -    { -        npc_threshwackonatorAI(Creature* creature) : FollowerAI(creature) { } - -        void Reset() override { } - -        void MoveInLineOfSight(Unit* who) override - -        { -            FollowerAI::MoveInLineOfSight(who); - -            if (!me->GetVictim() && !HasFollowState(STATE_FOLLOW_COMPLETE) && who->GetEntry() == NPC_GELKAK) -            { -                if (me->IsWithinDistInMap(who, 10.0f)) -                { -                    Talk(SAY_AT_CLOSE, who); -                    DoAtEnd(); -                } -            } -        } - -        void DoAtEnd() -        { -            me->setFaction(FACTION_HOSTILE); - -            if (Player* pHolder = GetLeaderForFollower()) -                AttackStart(pHolder); - -            SetFollowComplete(true); -        } -    }; - -    bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override -    { -        player->PlayerTalkClass->ClearMenus(); -        if (action == GOSSIP_ACTION_INFO_DEF+1) -        { -            player->CLOSE_GOSSIP_MENU(); - -            if (npc_threshwackonatorAI* pThreshAI = CAST_AI(npc_threshwackonator::npc_threshwackonatorAI, creature->AI())) -            { -                creature->AI()->Talk(EMOTE_START); -                pThreshAI->StartFollow(player); -            } -        } - -        return true; -    } - -    bool OnGossipHello(Player* player, Creature* creature) override -    { -        if (player->GetQuestStatus(QUEST_GYROMAST_REV) == QUEST_STATUS_INCOMPLETE) -            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_INSERT_KEY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - -        player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); -        return true; -    } - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return new npc_threshwackonatorAI(creature); -    } -}; -  void AddSC_darkshore()  { -    new npc_kerlonian(); -    new npc_prospector_remtravel(); -    new npc_threshwackonator();  } diff --git a/src/server/scripts/Kalimdor/zone_desolace.cpp b/src/server/scripts/Kalimdor/zone_desolace.cpp index 0a56253cabd..5cb58058151 100644 --- a/src/server/scripts/Kalimdor/zone_desolace.cpp +++ b/src/server/scripts/Kalimdor/zone_desolace.cpp @@ -19,14 +19,12 @@  /* ScriptData  SDName: Desolace  SD%Complete: 100 -SDComment: Quest support: 5561 +SDComment: Quest support: 5561, 5581  SDCategory: Desolace  EndScriptData */  /* ContentData  npc_aged_dying_ancient_kodo -go_iruxos -npc_dalinda_malem  go_demon_portal  EndContentData */ @@ -65,8 +63,7 @@ public:      {          npc_aged_dying_ancient_kodoAI(Creature* creature) : ScriptedAI(creature) { } -        void MoveInLineOfSight(Unit* who) override - +        void MoveInLineOfSight(Unit* who)          {              if (who->GetEntry() == NPC_SMEED && me->IsWithinDistInMap(who, 10.0f) && !me->HasAura(SPELL_KODO_KOMBO_GOSSIP))              { @@ -77,7 +74,7 @@ public:              }          } -        void SpellHit(Unit* caster, SpellInfo const* spell) override +        void SpellHit(Unit* caster, SpellInfo const* spell)          {              if (spell->Id == SPELL_KODO_KOMBO_ITEM)              { @@ -119,106 +116,6 @@ public:  };  /*###### -## go_iruxos -## Hand of Iruxos -######*/ - -enum Iruxos -{ -    QUEST_HAND_IRUXOS   = 5381, -    NPC_DEMON_SPIRIT    = 11876 -}; - -class go_iruxos : public GameObjectScript -{ -    public: -        go_iruxos() : GameObjectScript("go_iruxos") { } - -        bool OnGossipHello(Player* player, GameObject* go) override -        { -            if (player->GetQuestStatus(QUEST_HAND_IRUXOS) == QUEST_STATUS_INCOMPLETE && !go->FindNearestCreature(NPC_DEMON_SPIRIT, 25.0f, true)) -                player->SummonCreature(NPC_DEMON_SPIRIT, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); - -            return true; -        } -}; - -/*###### -## npc_dalinda_malem. Quest 1440 -######*/ - -enum Dalinda -{ -    QUEST_RETURN_TO_VAHLARRIEL      = 1440 -}; - -class npc_dalinda : public CreatureScript -{ -public: -    npc_dalinda() : CreatureScript("npc_dalinda") { } - -    struct npc_dalindaAI : public npc_escortAI -    { -        npc_dalindaAI(Creature* creature) : npc_escortAI(creature) { } - -        void Reset() override { } - -        void EnterCombat(Unit* /*who*/) override { } - -        void JustDied(Unit* /*killer*/) override -        { -            if (Player* player = GetPlayerForEscort()) -                player->FailQuest(QUEST_RETURN_TO_VAHLARRIEL); -            return; -        } - -        void WaypointReached(uint32 waypointId) override -        { -            Player* player = GetPlayerForEscort(); - -            switch (waypointId) -            { -                case 1: -                    me->SetStandState(UNIT_STAND_STATE_STAND); -                    break; -                case 15: -                    if (player) -                        player->GroupEventHappens(QUEST_RETURN_TO_VAHLARRIEL, me); -                    break; -            } -        } - -        void UpdateAI(uint32 diff) override -        { -            npc_escortAI::UpdateAI(diff); - -            if (!UpdateVictim()) -                return; - -            DoMeleeAttackIfReady(); -        } -    }; - -    bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override -    { -        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()); -                creature->setFaction(113); -            } -        } -        return true; -    } - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return new npc_dalindaAI(creature); -    } -}; - -/*######  ## go_demon_portal  ######*/ @@ -233,7 +130,7 @@ class go_demon_portal : public GameObjectScript      public:          go_demon_portal() : GameObjectScript("go_demon_portal") { } -        bool OnGossipHello(Player* player, GameObject* go) override +        bool OnGossipHello(Player* player, GameObject* go)          {              if (player->GetQuestStatus(QUEST_PORTAL_OF_THE_LEGION) == QUEST_STATUS_INCOMPLETE && !go->FindNearestCreature(NPC_DEMON_GUARDIAN, 5.0f, true))              { @@ -248,7 +145,5 @@ class go_demon_portal : public GameObjectScript  void AddSC_desolace()  {      new npc_aged_dying_ancient_kodo(); -    new go_iruxos(); -    new npc_dalinda();      new go_demon_portal();  } diff --git a/src/server/scripts/Kalimdor/zone_durotar.cpp b/src/server/scripts/Kalimdor/zone_durotar.cpp index e2f8dd0854d..e677bd24e4a 100644 --- a/src/server/scripts/Kalimdor/zone_durotar.cpp +++ b/src/server/scripts/Kalimdor/zone_durotar.cpp @@ -17,13 +17,12 @@  #include "ScriptMgr.h"  #include "ScriptedCreature.h" -#include "Vehicle.h"  #include "SpellScript.h"  #include "Player.h"  /*###### -##Quest 5441: Lazy Peons -##npc_lazy_peon +## Quest 25134: Lazy Peons +## npc_lazy_peon  ######*/  enum LazyPeonYells @@ -33,10 +32,10 @@ enum LazyPeonYells  enum LazyPeon  { -    QUEST_LAZY_PEONS                              = 5441, -    GO_LUMBERPILE                                 = 175784, -    SPELL_BUFF_SLEEP                              = 17743, -    SPELL_AWAKEN_PEON                             = 19938 +    QUEST_LAZY_PEONS    = 25134, +    GO_LUMBERPILE       = 175784, +    SPELL_BUFF_SLEEP    = 17743, +    SPELL_AWAKEN_PEON   = 19938  };  class npc_lazy_peon : public CreatureScript @@ -73,13 +72,13 @@ public:              Initialize();          } -        void MovementInform(uint32 /*type*/, uint32 id) override +        void MovementInform(uint32 /*type*/, uint32 id)          {              if (id == 1)                  work = true;          } -        void SpellHit(Unit* caster, const SpellInfo* spell) override +        void SpellHit(Unit* caster, const SpellInfo* spell)          {              if (spell->Id != SPELL_AWAKEN_PEON)                  return; @@ -102,7 +101,7 @@ public:              if (RebuffTimer <= diff)              {                  DoCast(me, SPELL_BUFF_SLEEP); -                RebuffTimer = 300000;                 //Rebuff agian in 5 minutes +                RebuffTimer = 300000; //Rebuff agian in 5 minutes              }              else                  RebuffTimer -= diff; @@ -113,441 +112,6 @@ public:      };  }; -enum Texts -{ -    // Tiger Matriarch Credit -    SAY_MATRIARCH_AGGRO     = 0, - -    // Troll Volunteer -    SAY_VOLUNTEER_START     = 0, -    SAY_VOLUNTEER_END       = 1, -}; - -enum Spells -{ -    // Tiger Matriarch Credit -    SPELL_SUMMON_MATRIARCH              = 75187, -    SPELL_NO_SUMMON_AURA                = 75213, -    SPELL_DETECT_INVIS                  = 75180, -    SPELL_SUMMON_ZENTABRA_TRIGGER       = 75212, - -    // Tiger Matriarch -    SPELL_POUNCE                        = 61184, -    SPELL_FURIOUS_BITE                  = 75164, -    SPELL_SUMMON_ZENTABRA               = 75181, -    SPELL_SPIRIT_OF_THE_TIGER_RIDER     = 75166, -    SPELL_EJECT_PASSENGERS              = 50630, - -    // Troll Volunteer -    SPELL_VOLUNTEER_AURA                = 75076, -    SPELL_PETACT_AURA                   = 74071, -    SPELL_QUEST_CREDIT                  = 75106, -    SPELL_MOUNTING_CHECK                = 75420, -    SPELL_TURNIN                        = 73953, -    SPELL_AOE_TURNIN                    = 75107, - -    // Vol'jin War Drums -    SPELL_MOTIVATE_1                    = 75088, -    SPELL_MOTIVATE_2                    = 75086, -}; - -enum Creatures -{ -    // Tiger Matriarch Credit -    NPC_TIGER_VEHICLE                   = 40305, - -    // Troll Volunteer -    NPC_URUZIN                          = 40253, -    NPC_VOLUNTEER_1                     = 40264, -    NPC_VOLUNTEER_2                     = 40260, - -    // Vol'jin War Drums -    NPC_CITIZEN_1                       = 40256, -    NPC_CITIZEN_2                       = 40257, -}; - -enum Events -{ -    // Tiger Matriarch Credit -    EVENT_CHECK_SUMMON_AURA             = 1, - -    // Tiger Matriarch -    EVENT_POUNCE                        = 2, -    EVENT_NOSUMMON                      = 3, -}; - -enum Points -{ -    POINT_URUZIN                        = 4026400, -}; - -class npc_tiger_matriarch_credit : public CreatureScript -{ -    public: -        npc_tiger_matriarch_credit() : CreatureScript("npc_tiger_matriarch_credit") { } - -        struct npc_tiger_matriarch_creditAI : public ScriptedAI -        { -           npc_tiger_matriarch_creditAI(Creature* creature) : ScriptedAI(creature) -           { -               SetCombatMovement(false); -               events.ScheduleEvent(EVENT_CHECK_SUMMON_AURA, 2000); -           } - -            void UpdateAI(uint32 diff) override -            { -                events.Update(diff); - -                if (events.ExecuteEvent() == EVENT_CHECK_SUMMON_AURA) -                { -                    std::list<Creature*> tigers; -                    GetCreatureListWithEntryInGrid(tigers, me, NPC_TIGER_VEHICLE, 15.0f); -                    if (!tigers.empty()) -                    { -                        for (std::list<Creature*>::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 override -        { -            return new npc_tiger_matriarch_creditAI(creature); -        } -}; - -class npc_tiger_matriarch : public CreatureScript -{ -    public: -        npc_tiger_matriarch() : CreatureScript("npc_tiger_matriarch") { } - -        struct npc_tiger_matriarchAI : public ScriptedAI -        { -            npc_tiger_matriarchAI(Creature* creature) : ScriptedAI(creature), -                _tigerGuid(0) -            { -            } - -            void EnterCombat(Unit* /*target*/) override -            { -                _events.Reset(); -                _events.ScheduleEvent(EVENT_POUNCE, 100); -                _events.ScheduleEvent(EVENT_NOSUMMON, 50000); -            } - -            void IsSummonedBy(Unit* summoner) override -            { -                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) override -            { -                if (victim->GetTypeId() != TYPEID_UNIT || !victim->IsSummon()) -                    return; - -                if (Unit* vehSummoner = victim->ToTempSummon()->GetSummoner()) -                { -                    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) override -            { -                if (!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) override -            { -                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 override -        { -            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}; - -class npc_troll_volunteer : public CreatureScript -{ -    public: -        npc_troll_volunteer() : CreatureScript("npc_troll_volunteer") { } - -        struct npc_troll_volunteerAI : public ScriptedAI -        { -            npc_troll_volunteerAI(Creature* creature) : ScriptedAI(creature) -            { -                Initialize(); -                _mountModel = 0; -            } - -            void Initialize() -            { -                _complete = false; -            } - -            void InitializeAI() override -            { -                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) * float(M_PI) / 3.0f * 4.0f); -            } - -            void Reset() override -            { -                Initialize(); -                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) override -            { -                if (type != POINT_MOTION_TYPE) -                    return; -                if (id == POINT_URUZIN) -                    me->DespawnOrUnsummon(); -            } - -            void SpellHit(Unit* caster, SpellInfo const* spell) override -            { -                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 override -        { -            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") { } - -        class spell_mount_check_AuraScript : public AuraScript -        { -            PrepareAuraScript(spell_mount_check_AuraScript); - -            bool Validate(SpellInfo const* /*spellInfo*/) override -            { -                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() override -            { -                OnEffectPeriodic += AuraEffectPeriodicFn(spell_mount_check_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); -            } -        }; - -        AuraScript* GetAuraScript() const override -        { -            return new spell_mount_check_AuraScript(); -        } -}; - -class spell_voljin_war_drums : public SpellScriptLoader -{ -    public: -        spell_voljin_war_drums() : SpellScriptLoader("spell_voljin_war_drums") { } - -        class spell_voljin_war_drums_SpellScript : public SpellScript -        { -            PrepareSpellScript(spell_voljin_war_drums_SpellScript); - -            bool Validate(SpellInfo const* /*spellInfo*/) override -            { -                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() override -            { -                OnEffectHitTarget += SpellEffectFn(spell_voljin_war_drums_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); -            } -        }; - -        SpellScript* GetSpellScript() const override -        { -            return new spell_voljin_war_drums_SpellScript(); -        } -}; -  enum VoodooSpells  {      SPELL_BREW      = 16712, // Special Brew @@ -601,10 +165,5 @@ class spell_voodoo : public SpellScriptLoader  void AddSC_durotar()  {      new npc_lazy_peon(); -    new npc_tiger_matriarch_credit(); -    new npc_tiger_matriarch(); -    new npc_troll_volunteer(); -    new spell_mount_check(); -    new spell_voljin_war_drums();      new spell_voodoo();  } diff --git a/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp b/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp index ee244e51b09..46d4d3cd88c 100644 --- a/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp +++ b/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp @@ -19,16 +19,13 @@  /* ScriptData  SDName: Dustwallow_Marsh  SD%Complete: 95 -SDComment: Quest support: 11180, 558, 11126, 11142, 11174, Vendor Nat Pagle +SDComment: Quest support: 1270, 1222, 27245  SDCategory: Dustwallow Marsh  EndScriptData */  /* ContentData -npc_risen_husk_spirit -npc_lady_jaina_proudmoore -npc_nat_pagle -npc_private_hendel -npc_cassa_crimsonwing - handled by npc_taxi +npc_stinky +go_blackhoof_cage  EndContentData */  #include "ScriptMgr.h" @@ -666,11 +663,6 @@ public:  void AddSC_dustwallow_marsh()  { -    new npc_risen_husk_spirit(); -    new npc_lady_jaina_proudmoore(); -    new npc_nat_pagle(); -    new npc_private_hendel(); -    new npc_zelfrax();      new npc_stinky();      new spell_ooze_zap();      new spell_ooze_zap_channel_end(); diff --git a/src/server/scripts/Kalimdor/zone_felwood.cpp b/src/server/scripts/Kalimdor/zone_felwood.cpp index b79bc1f088b..7e698348a0c 100644 --- a/src/server/scripts/Kalimdor/zone_felwood.cpp +++ b/src/server/scripts/Kalimdor/zone_felwood.cpp @@ -1,106 +1,180 @@  /* - * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -/* ScriptData -SDName: Felwood -SD%Complete: 95 -SDComment: Quest support: 4101, 4102 -SDCategory: Felwood -EndScriptData */ - -/* ContentData -npcs_riverbreeze_and_silversky -EndContentData */ +* Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License as published by the +* Free Software Foundation; either version 2 of the License, or (at your +* option) any later version. +* +* This program is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +* more details. +* +* You should have received a copy of the GNU General Public License along +* with this program. If not, see <http://www.gnu.org/licenses/>. +*/  #include "ScriptMgr.h"  #include "ScriptedCreature.h"  #include "ScriptedGossip.h"  #include "Player.h" +#include "Cell.h" +#include "CellImpl.h" +#include "GridNotifiers.h" +#include "GridNotifiersImpl.h" +#include "SpellScript.h" -/*###### -## npcs_riverbreeze_and_silversky -######*/ +/*##### +# Spell 88254 "Swipe Honey" scripted for quest 27989 "Ruumbo Demands Honey" +#####*/ -#define GOSSIP_ITEM_BEACON  "Please make me a Cenarion Beacon" - -enum RiverbreezeAndSilversky +enum SwipeHoney  { -    SPELL_CENARION_BEACON       = 15120, - -    NPC_ARATHANDRIS_SILVERSKY   = 9528, -    NPC_MAYBESS_RIVERBREEZE     = 9529, - -    QUEST_CLEASING_FELWOOD_A    = 4101, -    QUEST_CLEASING_FELWOOD_H    = 4102 +    NPC_HONEY_BUNNY = 47308, +    ITEM_HONEY_GLOB = 62820, +    SPELL_BEES      = 94064  }; -class npcs_riverbreeze_and_silversky : public CreatureScript +class spell_swipe_honey : public SpellScriptLoader  {  public: -    npcs_riverbreeze_and_silversky() : CreatureScript("npcs_riverbreeze_and_silversky") { } +    spell_swipe_honey() : SpellScriptLoader("spell_swipe_honey") { } -    bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override +    class spell_swipe_honey_SpellScript : public SpellScript      { -        player->PlayerTalkClass->ClearMenus(); -        if (action == GOSSIP_ACTION_INFO_DEF+1) +        PrepareSpellScript(spell_swipe_honey_SpellScript); + +        SpellCastResult CheckTarget()          { -            player->CLOSE_GOSSIP_MENU(); -            creature->CastSpell(player, SPELL_CENARION_BEACON, false); +            if (GetCaster()->FindNearestCreature(NPC_HONEY_BUNNY, 5.0f, true)) +                return SPELL_CAST_OK; +            return SPELL_FAILED_OUT_OF_RANGE;          } -        return true; -    } -    bool OnGossipHello(Player* player, Creature* creature) override +        void HandleDummy(SpellEffIndex /* effIndex */) +        { +            if (Creature* honey = GetCaster()->FindNearestCreature(NPC_HONEY_BUNNY, 5.0f, true)) +            { +                if (Player* player = GetCaster()->ToPlayer()) +                { +                    player->AddItem(ITEM_HONEY_GLOB, 1); + +                    if (urand(1, 100) < 30) +                        honey->CastSpell(player, SPELL_BEES); +                    else +                        honey->DespawnOrUnsummon(); +                } +            } +        } + +        void Register() override +        { +            OnCheckCast += SpellCheckCastFn(spell_swipe_honey_SpellScript::CheckTarget); +            OnEffectHitTarget += SpellEffectFn(spell_swipe_honey_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); +        } +    }; + +    SpellScript* GetSpellScript() const override      { -        if (creature->IsQuestGiver()) -            player->PrepareQuestMenu(creature->GetGUID()); +        return new spell_swipe_honey_SpellScript(); +    } +}; + +/*##### +# Spell 88425 "Bees! BEES!" scripted for quest 27989 "Ruumbo Demands Honey" +#####*/ -        uint32 creatureId = creature->GetEntry(); +enum BeesBEES +{ +    BOSS_EMOTE_BEES = 0, +    SPELL_BEES_BEES = 88425 +}; + +class spell_beesbees : public SpellScriptLoader +{ +public: spell_beesbees() : SpellScriptLoader("spell_beesbees") { } -        if (creatureId == NPC_ARATHANDRIS_SILVERSKY) +        class spell_beesbees_SpellScript : public SpellScript          { -            if (player->GetQuestRewardStatus(QUEST_CLEASING_FELWOOD_A)) +            PrepareSpellScript(spell_beesbees_SpellScript); + +            void HandleScriptEffect(SpellEffIndex /* effIndex */) +            { +                if (Creature* honey = GetCaster()->ToCreature()) +                { +                    if (Player* player = GetHitPlayer()) +                    { +                        honey->AI()->Talk(BOSS_EMOTE_BEES, player); +                        honey->CastSpell(player, SPELL_BEES_BEES); +                        honey->DespawnOrUnsummon(); +                    } +                } +            } + +            void Register() override              { -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_BEACON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); -                player->SEND_GOSSIP_MENU(2848, creature->GetGUID()); -            } else if (player->GetTeam() == HORDE) -            player->SEND_GOSSIP_MENU(2845, creature->GetGUID()); -            else -                player->SEND_GOSSIP_MENU(2844, creature->GetGUID()); +                OnEffectHitTarget += SpellEffectFn(spell_beesbees_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); +            } +        }; + +        SpellScript* GetSpellScript() const override +        { +            return new spell_beesbees_SpellScript();          } +}; + +/*##### +# Spell 88665 "Ruumbo's Silly Dance" scripted for quest 27995 "Dance for Ruumbo!" +#####*/ + +enum RuumbosSillyDance +{ +    NPC_DRIZZLE  = 47556, +    NPC_FERLI    = 47558, +    MAP_KALIMDOR = 1 +}; -        if (creatureId == NPC_MAYBESS_RIVERBREEZE) +Position const DrizzleSpawnPos = { 3852.52f, -1321.92f, 213.3353f, 5.72468f }; +Position const FerliSpawnPos = { 3850.44f, -1323.34f, 213.2113f, 5.637414f }; + +class spell_ruumbos_silly_dance : public SpellScriptLoader +{ +public: spell_ruumbos_silly_dance() : SpellScriptLoader("spell_ruumbos_silly_dance") { } + +        class spell_ruumbos_silly_dance_SpellScript : public SpellScript          { -            if (player->GetQuestRewardStatus(QUEST_CLEASING_FELWOOD_H)) +            PrepareSpellScript(spell_ruumbos_silly_dance_SpellScript); + +            void HandleScriptEffect(SpellEffIndex /* effIndex */)              { -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_BEACON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); -                player->SEND_GOSSIP_MENU(2849, creature->GetGUID()); -            } else if (player->GetTeam() == ALLIANCE) -            player->SEND_GOSSIP_MENU(2843, creature->GetGUID()); -            else -                player->SEND_GOSSIP_MENU(2842, creature->GetGUID()); -        } +                if (Player* player = GetHitPlayer()) +                { +                    player->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_DANCE); + +                    if (player->GetMap()->GetId() == MAP_KALIMDOR) +                    { +                        player->SummonCreature(NPC_DRIZZLE, DrizzleSpawnPos, TEMPSUMMON_TIMED_DESPAWN, 20000); +                        player->SummonCreature(NPC_FERLI, FerliSpawnPos, TEMPSUMMON_TIMED_DESPAWN, 20000); +                    } +                } +            } + +            void Register() override +            { +                OnEffectHitTarget += SpellEffectFn(spell_ruumbos_silly_dance_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); +            } +        }; -        return true; -    } +        SpellScript* GetSpellScript() const override +        { +            return new spell_ruumbos_silly_dance_SpellScript(); +        }  };  void AddSC_felwood()  { -    new npcs_riverbreeze_and_silversky(); +    new spell_swipe_honey(); +    new spell_beesbees(); +    new spell_ruumbos_silly_dance();  } diff --git a/src/server/scripts/Kalimdor/zone_feralas.cpp b/src/server/scripts/Kalimdor/zone_feralas.cpp index 17b5ddaf6bb..2186752b135 100644 --- a/src/server/scripts/Kalimdor/zone_feralas.cpp +++ b/src/server/scripts/Kalimdor/zone_feralas.cpp @@ -16,216 +16,7 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -/* ScriptData -SDName: Feralas -SD%Complete: 100 -SDComment: Quest support: 2767, Special vendor Gregan Brewspewer -SDCategory: Feralas -EndScriptData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "ScriptedEscortAI.h" -#include "ScriptedGossip.h" -#include "SpellScript.h" -#include "Player.h" -#include "WorldSession.h" - -/*###### -## npc_gregan_brewspewer -######*/ - -#define GOSSIP_HELLO "Buy somethin', will ya?" - -class npc_gregan_brewspewer : public CreatureScript -{ -public: -    npc_gregan_brewspewer() : CreatureScript("npc_gregan_brewspewer") { } - -    bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override -    { -        player->PlayerTalkClass->ClearMenus(); -        if (action == GOSSIP_ACTION_INFO_DEF+1) -        { -            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); -            player->SEND_GOSSIP_MENU(2434, creature->GetGUID()); -        } -        if (action == GOSSIP_ACTION_TRADE) -            player->GetSession()->SendListInventory(creature->GetGUID()); -        return true; -    } - -    bool OnGossipHello(Player* player, Creature* creature) override -    { -        if (creature->IsQuestGiver()) -            player->PrepareQuestMenu(creature->GetGUID()); - -        if (creature->IsVendor() && player->GetQuestStatus(3909) == QUEST_STATUS_INCOMPLETE) -            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HELLO, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - -        player->SEND_GOSSIP_MENU(2433, creature->GetGUID()); -        return true; -    } - -}; - -/*###### -## npc_oox22fe -######*/ - -enum OOX -{ -    SAY_OOX_START           = 0, -    SAY_OOX_AGGRO           = 1, -    SAY_OOX_AMBUSH          = 2, -    SAY_OOX_END             = 3, - -    NPC_YETI                = 7848, -    NPC_GORILLA             = 5260, -    NPC_WOODPAW_REAVER      = 5255, -    NPC_WOODPAW_BRUTE       = 5253, -    NPC_WOODPAW_ALPHA       = 5258, -    NPC_WOODPAW_MYSTIC      = 5254, - -    QUEST_RESCUE_OOX22FE    = 2767, -    FACTION_ESCORTEE_A      = 774, -    FACTION_ESCORTEE_H      = 775 -}; - -class npc_oox22fe : public CreatureScript -{ -public: -    npc_oox22fe() : CreatureScript("npc_oox22fe") { } - -    bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override -    { -        if (quest->GetQuestId() == QUEST_RESCUE_OOX22FE) -        { -            creature->AI()->Talk(SAY_OOX_START); -            //change that the npc is not lying dead on the ground -            creature->SetStandState(UNIT_STAND_STATE_STAND); - -            if (player->GetTeam() == ALLIANCE) -                creature->setFaction(FACTION_ESCORTEE_A); - -            if (player->GetTeam() == HORDE) -                creature->setFaction(FACTION_ESCORTEE_H); - -            if (npc_escortAI* pEscortAI = CAST_AI(npc_oox22fe::npc_oox22feAI, creature->AI())) -                pEscortAI->Start(true, false, player->GetGUID()); - -        } -        return true; -    } - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return new npc_oox22feAI(creature); -    } - -    struct npc_oox22feAI : public npc_escortAI -    { -        npc_oox22feAI(Creature* creature) : npc_escortAI(creature) { } - -        void WaypointReached(uint32 waypointId) override -        { -            switch (waypointId) -            { -                // First Ambush(3 Yetis) -                case 11: -                    Talk(SAY_OOX_AMBUSH); -                    me->SummonCreature(NPC_YETI, -4841.01f, 1593.91f, 73.42f, 3.98f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); -                    me->SummonCreature(NPC_YETI, -4837.61f, 1568.58f, 78.21f, 3.13f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); -                    me->SummonCreature(NPC_YETI, -4841.89f, 1569.95f, 76.53f, 0.68f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); -                    break; -                //Second Ambush(3 Gorillas) -                case 21: -                    Talk(SAY_OOX_AMBUSH); -                    me->SummonCreature(NPC_GORILLA, -4595.81f, 2005.99f, 53.08f, 3.74f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); -                    me->SummonCreature(NPC_GORILLA, -4597.53f, 2008.31f, 52.70f, 3.78f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); -                    me->SummonCreature(NPC_GORILLA, -4599.37f, 2010.59f, 52.77f, 3.84f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); -                    break; -                //Third Ambush(4 Gnolls) -                case 30: -                    Talk(SAY_OOX_AMBUSH); -                    me->SummonCreature(NPC_WOODPAW_REAVER, -4425.14f, 2075.87f, 47.77f, 3.77f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); -                    me->SummonCreature(NPC_WOODPAW_BRUTE, -4426.68f, 2077.98f, 47.57f, 3.77f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); -                    me->SummonCreature(NPC_WOODPAW_MYSTIC, -4428.33f, 2080.24f, 47.43f, 3.87f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); -                    me->SummonCreature(NPC_WOODPAW_ALPHA, -4430.04f, 2075.54f, 46.83f, 3.81f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); -                    break; -                case 37: -                    Talk(SAY_OOX_END); -                    // Award quest credit -                    if (Player* player = GetPlayerForEscort()) -                        player->GroupEventHappens(QUEST_RESCUE_OOX22FE, me); -                    break; -            } -        } - -        void Reset() override -        { -            if (!HasEscortState(STATE_ESCORT_ESCORTING)) -                me->SetStandState(UNIT_STAND_STATE_DEAD); -        } - -        void EnterCombat(Unit* /*who*/) override -        { -            //For an small probability the npc says something when he get aggro -            if (urand(0, 9) > 7) -                Talk(SAY_OOX_AGGRO); -        } - -        void JustSummoned(Creature* summoned) override -        { -            summoned->AI()->AttackStart(me); -        } -    }; - -}; - -enum GordunniTrap -{ -    GO_GORDUNNI_DIRT_MOUND = 144064, -}; - -class spell_gordunni_trap : public SpellScriptLoader -{ -    public: -        spell_gordunni_trap() : SpellScriptLoader("spell_gordunni_trap") { } - -        class spell_gordunni_trap_SpellScript : public SpellScript -        { -            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() override -            { -                OnCast += SpellCastFn(spell_gordunni_trap_SpellScript::HandleDummy); -            } -        }; - -        SpellScript* GetSpellScript() const override -        { -            return new spell_gordunni_trap_SpellScript(); -        } -}; - -/*###### -## AddSC -######*/ -  void AddSC_feralas()  { -    new npc_gregan_brewspewer(); -    new npc_oox22fe(); -    new spell_gordunni_trap(); +  } diff --git a/src/server/scripts/Kalimdor/zone_moonglade.cpp b/src/server/scripts/Kalimdor/zone_moonglade.cpp index 268db8da779..901946df74b 100644 --- a/src/server/scripts/Kalimdor/zone_moonglade.cpp +++ b/src/server/scripts/Kalimdor/zone_moonglade.cpp @@ -1,6 +1,5 @@  /*   * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>   *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License as published by the @@ -16,21 +15,6 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -/* ScriptData -SDName: Moonglade -SD%Complete: 100 -SDComment: Quest support: 30, 272, 5929, 5930, 10965. Special Flight Paths for Druid class. -SDCategory: Moonglade -EndScriptData */ - -/* ContentData -npc_bunthen_plainswind -npc_great_bear_spirit -npc_silva_filnaveth -npc_clintar_spirit -npc_clintar_dreamwalker -EndContentData */ -  #include "ScriptMgr.h"  #include "ScriptedCreature.h"  #include "ScriptedEscortAI.h" @@ -42,525 +26,6 @@ EndContentData */  #include "Cell.h"  #include "CellImpl.h" -/*###### -## npc_bunthen_plainswind -######*/ - -enum Bunthen -{ -    QUEST_SEA_LION_HORDE        = 30, -    QUEST_SEA_LION_ALLY         = 272, -    TAXI_PATH_ID_ALLY           = 315, -    TAXI_PATH_ID_HORDE          = 316 -}; - -#define GOSSIP_ITEM_THUNDER     "I'd like to fly to Thunder Bluff." -#define GOSSIP_ITEM_AQ_END      "Do you know where I can find Half Pendant of Aquatic Endurance?" - -class npc_bunthen_plainswind : public CreatureScript -{ -public: -    npc_bunthen_plainswind() : CreatureScript("npc_bunthen_plainswind") { } - -    bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override -    { -        player->PlayerTalkClass->ClearMenus(); -        switch (action) -        { -            case GOSSIP_ACTION_INFO_DEF + 1: -                player->CLOSE_GOSSIP_MENU(); -                if (player->getClass() == CLASS_DRUID && player->GetTeam() == HORDE) -                    player->ActivateTaxiPathTo(TAXI_PATH_ID_HORDE); -                break; -            case GOSSIP_ACTION_INFO_DEF + 2: -                player->SEND_GOSSIP_MENU(5373, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF + 3: -                player->SEND_GOSSIP_MENU(5376, creature->GetGUID()); -                break; -        } -        return true; -    } - -    bool OnGossipHello(Player* player, Creature* creature) override -    { -        if (player->getClass() != CLASS_DRUID) -            player->SEND_GOSSIP_MENU(4916, creature->GetGUID()); -        else if (player->GetTeam() != HORDE) -        { -            if (player->GetQuestStatus(QUEST_SEA_LION_ALLY) == QUEST_STATUS_INCOMPLETE) -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_AQ_END, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - -            player->SEND_GOSSIP_MENU(4917, creature->GetGUID()); -        } -        else if (player->getClass() == CLASS_DRUID && player->GetTeam() == HORDE) -        { -            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_THUNDER, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - -            if (player->GetQuestStatus(QUEST_SEA_LION_HORDE) == QUEST_STATUS_INCOMPLETE) -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_AQ_END, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - -            player->SEND_GOSSIP_MENU(4918, creature->GetGUID()); -        } -        return true; -    } - -}; - -/*###### -## npc_great_bear_spirit -######*/ - -#define GOSSIP_BEAR1 "What do you represent, spirit?" -#define GOSSIP_BEAR2 "I seek to understand the importance of strength of the body." -#define GOSSIP_BEAR3 "I seek to understand the importance of strength of the heart." -#define GOSSIP_BEAR4 "I have heard your words, Great Bear Spirit, and I understand. I now seek your blessings to fully learn the way of the Claw." - -class npc_great_bear_spirit : public CreatureScript -{ -public: -    npc_great_bear_spirit() : CreatureScript("npc_great_bear_spirit") { } - -    bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override -    { -        player->PlayerTalkClass->ClearMenus(); -        switch (action) -        { -            case GOSSIP_ACTION_INFO_DEF: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_BEAR2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); -                player->SEND_GOSSIP_MENU(4721, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF + 1: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_BEAR3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); -                player->SEND_GOSSIP_MENU(4733, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF + 2: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_BEAR4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); -                player->SEND_GOSSIP_MENU(4734, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF + 3: -                player->SEND_GOSSIP_MENU(4735, creature->GetGUID()); -                if (player->GetQuestStatus(5929) == QUEST_STATUS_INCOMPLETE) -                    player->AreaExploredOrEventHappens(5929); -                if (player->GetQuestStatus(5930) == QUEST_STATUS_INCOMPLETE) -                    player->AreaExploredOrEventHappens(5930); -                break; -        } -        return true; -    } - -    bool OnGossipHello(Player* player, Creature* creature) override -    { -        //ally or horde quest -        if (player->GetQuestStatus(5929) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(5930) == QUEST_STATUS_INCOMPLETE) -        { -            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_BEAR1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); -            player->SEND_GOSSIP_MENU(4719, creature->GetGUID()); -        } -        else -            player->SEND_GOSSIP_MENU(4718, creature->GetGUID()); - -        return true; -    } - -}; - -/*###### -## npc_silva_filnaveth -######*/ - -#define GOSSIP_ITEM_RUTHERAN    "I'd like to fly to Rut'theran Village." -#define GOSSIP_ITEM_AQ_AGI      "Do you know where I can find Half Pendant of Aquatic Agility?" - -class npc_silva_filnaveth : public CreatureScript -{ -public: -    npc_silva_filnaveth() : CreatureScript("npc_silva_filnaveth") { } - -    bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override -    { -        player->PlayerTalkClass->ClearMenus(); -        switch (action) -        { -            case GOSSIP_ACTION_INFO_DEF + 1: -                player->CLOSE_GOSSIP_MENU(); -                if (player->getClass() == CLASS_DRUID && player->GetTeam() == ALLIANCE) -                    player->ActivateTaxiPathTo(TAXI_PATH_ID_ALLY); -                break; -            case GOSSIP_ACTION_INFO_DEF + 2: -                player->SEND_GOSSIP_MENU(5374, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF + 3: -                player->SEND_GOSSIP_MENU(5375, creature->GetGUID()); -                break; -        } -        return true; -    } - -    bool OnGossipHello(Player* player, Creature* creature) override -    { -        if (player->getClass() != CLASS_DRUID) -            player->SEND_GOSSIP_MENU(4913, creature->GetGUID()); -        else if (player->GetTeam() != ALLIANCE) -        { -            if (player->GetQuestStatus(QUEST_SEA_LION_HORDE) == QUEST_STATUS_INCOMPLETE) -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_AQ_AGI, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - -            player->SEND_GOSSIP_MENU(4915, creature->GetGUID()); -        } -        else if (player->getClass() == CLASS_DRUID && player->GetTeam() == ALLIANCE) -        { -            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_RUTHERAN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - -            if (player->GetQuestStatus(QUEST_SEA_LION_ALLY) == QUEST_STATUS_INCOMPLETE) -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_AQ_AGI, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - -            player->SEND_GOSSIP_MENU(4914, creature->GetGUID()); -        } -        return true; -    } - -}; - -/*###### -## npc_clintar_spirit -######*/ - -float const Clintar_spirit_WP[41][5] = -{ -     //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}, -    {7472.19f, -3085.06f, 443.142f, 3.07f, 0}, -    {7456.92f, -3085.91f, 438.862f, 3.24f, 0}, -    {7446.68f, -3083.43f, 438.245f, 2.40f, 0}, -    {7446.17f, -3080.21f, 439.826f, 1.10f, 6000}, -    {7452.41f, -3085.8f,  438.984f, 5.78f, 0}, -    {7469.11f, -3084.94f, 443.048f, 6.25f, 0}, -    {7483.79f, -3085.44f, 439.607f, 6.25f, 0}, -    {7491.14f, -3090.96f, 439.983f, 5.44f, 0}, -    {7497.62f, -3098.22f, 436.854f, 5.44f, 0}, -    {7498.72f, -3113.41f, 434.596f, 4.84f, 0}, -    {7500.06f, -3122.51f, 434.749f, 5.17f, 0}, -    {7504.96f, -3131.53f, 434.475f, 4.74f, 0}, -    {7504.31f, -3133.53f, 435.693f, 3.84f, 6000}, -    {7504.55f, -3133.27f, 435.476f, 0.68f, 15000}, -    {7501.99f, -3126.01f, 434.93f,  1.83f, 0}, -    {7490.76f, -3114.97f, 434.431f, 2.51f, 0}, -    {7479.64f, -3105.51f, 431.123f, 1.83f, 0}, -    {7474.63f, -3086.59f, 428.994f, 1.83f, 2000}, -    {7472.96f, -3074.18f, 427.566f, 1.57f, 0}, -    {7472.25f, -3063,    428.268f, 1.55f, 0}, -    {7473.46f, -3054.22f, 427.588f, 0.36f, 0}, -    {7475.08f, -3053.6f,  428.653f, 0.36f, 6000}, -    {7474.66f, -3053.56f, 428.433f, 3.19f, 4000}, -    {7471.81f, -3058.84f, 427.073f, 4.29f, 0}, -    {7472.16f, -3064.91f, 427.772f, 4.95f, 0}, -    {7471.56f, -3085.36f, 428.924f, 4.72f, 0}, -    {7473.56f, -3093.48f, 429.294f, 5.04f, 0}, -    {7478.94f, -3104.29f, 430.638f, 5.23f, 0}, -    {7484.46f, -3109.61f, 432.769f, 5.79f, 0}, -    {7490.23f, -3111.08f, 434.431f, 0.02f, 0}, -    {7496.29f, -3108,    434.783f, 1.15f, 0}, -    {7497.46f, -3100.66f, 436.191f, 1.50f, 0}, -    {7495.64f, -3093.39f, 438.349f, 2.10f, 0}, -    {7492.44f, -3086.01f, 440.267f, 1.38f, 0}, -    {7498.26f, -3076.44f, 440.808f, 0.71f, 0}, -    {7506.4f,  -3067.35f, 443.64f,  0.77f, 0}, -    {7518.37f, -3057.42f, 445.584f, 0.74f, 0}, -    {7517.51f, -3056.3f,  444.568f, 2.49f, 4500} -}; - -Position const AspectRavenSummon    = {7472.96f, -3074.18f, 427.566f, 0.0f}; -Position const ClintarSpiritSummon  = {7459.2275f, -3122.5632f, 438.9842f, 0.8594f}; - -enum ClintarSpirit -{ -    ASPECT_RAVEN                        = 22915, - -    // Texts for EnterCombat, the event and the end of the event are missing -    CLINTAR_SPIRIT_SAY_START            = 0, -}; - -class npc_clintar_spirit : public CreatureScript -{ -public: -    npc_clintar_spirit() : CreatureScript("npc_clintar_spirit") { } - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return new npc_clintar_spiritAI(creature); -    } - -    struct npc_clintar_spiritAI : public npc_escortAI -    { -    public: -        npc_clintar_spiritAI(Creature* creature) : npc_escortAI(creature) -        { -            Initialize(); -            PlayerGUID = 0; -        } - -        void Initialize() -        { -            Step = 0; -            CurrWP = 0; -            EventTimer = 0; -            PlayerGUID = 0; -            checkPlayerTimer = 1000; -            EventOnWait = false; -        } - -        uint8 Step; -        uint32 CurrWP; -        uint32 EventTimer; -        uint32 checkPlayerTimer; - -        uint64 PlayerGUID; - -        bool EventOnWait; - -        void Reset() override -        { -            if (!PlayerGUID) -                Initialize(); -        } - -        void IsSummonedBy(Unit* /*summoner*/) override -        { -            std::list<Player*> playerOnQuestList; -            Trinity::AnyPlayerInObjectRangeCheck checker(me, 5.0f); -            Trinity::PlayerListSearcher<Trinity::AnyPlayerInObjectRangeCheck> searcher(me, playerOnQuestList, checker); -            me->VisitNearbyWorldObject(5.0f, searcher); -            for (std::list<Player*>::const_iterator itr = playerOnQuestList.begin(); itr != playerOnQuestList.end(); ++itr) -            { -                // Check if found player target has active quest -                if (Player* player = (*itr)) -                { -                    if (player->GetQuestStatus(10965) == QUEST_STATUS_INCOMPLETE) -                    { -                        StartEvent(player); -                        break; -                    } -                } -                else -                    break; -            } -        } - -        void JustDied(Unit* /*killer*/) override -        { -            if (!PlayerGUID) -                return; - -            Player* player = ObjectAccessor::GetPlayer(*me, PlayerGUID); -            if (player && player->GetQuestStatus(10965) == QUEST_STATUS_INCOMPLETE) -            { -                player->FailQuest(10965); -                PlayerGUID = 0; -                Reset(); -            } -        } - -        void EnterEvadeMode() override -        { -            Player* player = ObjectAccessor::GetPlayer(*me, PlayerGUID); -            if (player && player->IsInCombat() && player->getAttackerForHelper()) -            { -                AttackStart(player->getAttackerForHelper()); -                return; -            } -            npc_escortAI::EnterEvadeMode(); -        } - -        void StartEvent(Player* player) -        { -            if (player && player->GetQuestStatus(10965) == QUEST_STATUS_INCOMPLETE) -            { -                for (uint8 i = 0; i < 41; ++i) -                { -                    AddWaypoint(i, Clintar_spirit_WP[i][0], Clintar_spirit_WP[i][1], Clintar_spirit_WP[i][2], (uint32)Clintar_spirit_WP[i][4]); -                } -                PlayerGUID = player->GetGUID(); -                Start(true, false, PlayerGUID); -            } -            return; -        } - -        void UpdateAI(uint32 diff) override -        { -            npc_escortAI::UpdateAI(diff); - -            if (!PlayerGUID) -            { -                me->setDeathState(JUST_DIED); -                return; -            } - -            if (!me->IsInCombat() && !EventOnWait) -            { -                if (checkPlayerTimer <= diff) -                { -                    Player* player = ObjectAccessor::GetPlayer(*me, PlayerGUID); -                    if (player && player->IsInCombat() && player->getAttackerForHelper()) -                        AttackStart(player->getAttackerForHelper()); -                    checkPlayerTimer = 1000; -                } else checkPlayerTimer -= diff; -            } - -            if (EventOnWait && EventTimer <= diff) -            { -                Player* player = ObjectAccessor::GetPlayer(*me, PlayerGUID); -                if (!player || player->GetQuestStatus(10965) == QUEST_STATUS_NONE) -                { -                    me->setDeathState(JUST_DIED); -                    return; -                } - -                switch (CurrWP) -                { -                    case 0: -                        switch (Step) -                        { -                            case 0: -                                Talk(CLINTAR_SPIRIT_SAY_START, player); -                                EventTimer = 8000; -                                Step = 1; -                                break; -                            case 1: -                                EventOnWait = false; -                                break; -                        } -                        break; -                    case 6: -                        switch (Step) -                        { -                            case 0: -                                me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 133); -                                EventTimer = 5000; -                                Step = 1; -                                break; -                            case 1: -                                me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); -                                // Needs text -                                EventOnWait = false; -                                break; -                        } -                        break; -                    case 15: -                        switch (Step) -                        { -                            case 0: -                                me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 133); -                                EventTimer = 5000; -                                Step = 1; -                                break; -                            case 1: -                                me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); -                                EventOnWait = false; -                                break; -                        } -                        break; -                    case 16: -                        switch (Step) -                        { -                            case 0: -                                // Needs text -                                EventTimer = 15000; -                                Step = 1; -                                break; -                            case 1: -                                EventOnWait = false; -                                break; -                        } -                        break; -                    case 20: -                        switch (Step) -                        { -                            case 0: -                                if (Creature* mob = me->SummonCreature(ASPECT_RAVEN, AspectRavenSummon, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2000)) -                                { -                                    mob->AddThreat(me, 10000.0f); -                                    mob->AI()->AttackStart(me); -                                } -                                EventTimer = 2000; -                                Step = 1; -                                break; -                            case 1: -                                EventOnWait = false; -                                break; -                        } -                        break; -                    case 24: -                        switch (Step) -                        { -                            case 0: -                                me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 133); -                                EventTimer = 5000; -                                Step = 1; -                                break; -                            case 1: -                                me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); -                                EventOnWait = false; -                                break; -                        } -                        break; -                    case 25: -                        switch (Step) -                        { -                            case 0: -                                // Needs text -                                EventTimer = 4000; -                                Step = 1; -                                break; -                            case 1: -                                EventOnWait = false; -                                break; -                        } -                        break; -                    case 40: -                        switch (Step) -                        { -                            case 0: -                                me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 2); -                                // Needs text -                                player->CompleteQuest(10965); -                                EventTimer = 1500; -                                Step = 1; -                                break; -                            case 1: -                                me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); -                                EventTimer = 3000; -                                Step = 2; -                                break; -                            case 2: -                                player->TalkedToCreature(me->GetEntry(), me->GetGUID()); -                                PlayerGUID = 0; -                                Reset(); -                                me->setDeathState(JUST_DIED); -                                break; -                        } -                        break; -                    default: -                        EventOnWait = false; -                        break; -                } - -            } else if (EventOnWait) EventTimer -= diff; -        } - -        void WaypointReached(uint32 waypointId) override -        { -            CurrWP = waypointId; -            EventTimer = 0; -            Step = 0; -            EventOnWait = true; -        } -    }; - -}; -  /*####  # npc_omen  ####*/ @@ -709,10 +174,6 @@ public:  void AddSC_moonglade()  { -    new npc_bunthen_plainswind(); -    new npc_great_bear_spirit(); -    new npc_silva_filnaveth(); -    new npc_clintar_spirit();      new npc_omen();      new npc_giant_spotlight();  } diff --git a/src/server/scripts/Kalimdor/zone_mulgore.cpp b/src/server/scripts/Kalimdor/zone_mulgore.cpp index 289d7282ac6..0ad44c29b13 100644 --- a/src/server/scripts/Kalimdor/zone_mulgore.cpp +++ b/src/server/scripts/Kalimdor/zone_mulgore.cpp @@ -19,13 +19,12 @@  /* ScriptData  SDName: Mulgore  SD%Complete: 100 -SDComment: Support for quest: 11129, 772 +SDComment: Support for quest: 11129, 861  SDCategory: Mulgore  EndScriptData */  /* ContentData  npc_kyle_frenzied -npc_plains_vision  EndContentData */  #include "ScriptMgr.h" @@ -57,7 +56,7 @@ public:      CreatureAI* GetAI(Creature* creature) const override      { -        return new npc_kyle_frenziedAI(creature); +        return new npc_kyle_frenziedAI (creature);      }      struct npc_kyle_frenziedAI : public ScriptedAI @@ -90,7 +89,7 @@ public:                  me->UpdateEntry(NPC_KYLE_FRENZIED);          } -        void SpellHit(Unit* Caster, SpellInfo const* Spell) override +        void SpellHit(Unit* Caster, SpellInfo const* Spell)          {              if (!me->GetVictim() && !EventActive && Spell->Id == SPELL_LUNCH)              { @@ -110,12 +109,12 @@ public:              }          } -        void MovementInform(uint32 Type, uint32 PointId) override +        void MovementInform(uint32 type, uint32 pointId) override          { -            if (Type != POINT_MOTION_TYPE || !EventActive) +            if (type != POINT_MOTION_TYPE || !EventActive)                  return; -            if (PointId == POINT_ID) +            if (pointId == POINT_ID)                  IsMovingToLunch = false;          } @@ -173,134 +172,7 @@ public:  }; -/*##### -# npc_plains_vision -######*/ - -Position const wpPlainVision[50] = -{ -    {-2226.32f,  -408.095f,   -9.36235f, 0.0f}, -    {-2203.04f,  -437.212f,   -5.72498f, 0.0f}, -    {-2163.91f,  -457.851f,   -7.09049f, 0.0f}, -    {-2123.87f,  -448.137f,   -9.29591f, 0.0f}, -    {-2104.66f,  -427.166f,   -6.49513f, 0.0f}, -    {-2101.48f,  -422.826f,   -5.3567f, 0.0f}, -    {-2097.56f,  -417.083f,   -7.16716f, 0.0f}, -    {-2084.87f,  -398.626f,   -9.88973f, 0.0f}, -    {-2072.71f,  -382.324f,   -10.2488f, 0.0f}, -    {-2054.05f,  -356.728f,   -6.22468f, 0.0f}, -    {-2051.8f,   -353.645f,   -5.35791f, 0.0f}, -    {-2049.08f,  -349.912f,   -6.15723f, 0.0f}, -    {-2030.6f,   -310.724f,   -9.59302f, 0.0f}, -    {-2002.15f,  -249.308f,   -10.8124f, 0.0f}, -    {-1972.85f,  -195.811f,   -10.6316f, 0.0f}, -    {-1940.93f,  -147.652f,   -11.7055f, 0.0f}, -    {-1888.06f,  -81.943f,    -11.4404f, 0.0f}, -    {-1837.05f,  -34.0109f,   -12.258f, 0.0f}, -    {-1796.12f,  -14.6462f,   -10.3581f, 0.0f}, -    {-1732.61f,  -4.27746f,   -10.0213f, 0.0f}, -    {-1688.94f,  -0.829945f,  -11.7103f, 0.0f}, -    {-1681.32f,  13.0313f,    -9.48056f, 0.0f}, -    {-1677.04f,  36.8349f,    -7.10318f, 0.0f}, -    {-1675.2f,   68.559f,     -8.95384f, 0.0f}, -    {-1676.57f,  89.023f,     -9.65104f, 0.0f}, -    {-1678.16f,  110.939f,    -10.1782f, 0.0f}, -    {-1677.86f,  128.681f,    -5.73869f, 0.0f}, -    {-1675.27f,  144.324f,    -3.47916f, 0.0f}, -    {-1671.7f,   163.169f,    -1.23098f, 0.0f}, -    {-1666.61f,  181.584f,    5.26145f, 0.0f}, -    {-1661.51f,  196.154f,    8.95252f, 0.0f}, -    {-1655.47f,  210.811f,    8.38727f, 0.0f}, -    {-1647.07f,  226.947f,    5.27755f, 0.0f}, -    {-1621.65f,  232.91f,     2.69579f, 0.0f}, -    {-1600.23f,  237.641f,    2.98539f, 0.0f}, -    {-1576.07f,  242.546f,    4.66541f, 0.0f}, -    {-1554.57f,  248.494f,    6.60377f, 0.0f}, -    {-1547.53f,  259.302f,    10.6741f, 0.0f}, -    {-1541.7f,   269.847f,    16.4418f, 0.0f}, -    {-1539.83f,  278.989f,    21.0597f, 0.0f}, -    {-1540.16f,  290.219f,    27.8247f, 0.0f}, -    {-1538.99f,  298.983f,    34.0032f, 0.0f}, -    {-1540.38f,  307.337f,    41.3557f, 0.0f}, -    {-1536.61f,  314.884f,    48.0179f, 0.0f}, -    {-1532.42f,  323.277f,    55.6667f, 0.0f}, -    {-1528.77f,  329.774f,    61.1525f, 0.0f}, -    {-1525.65f,  333.18f,     63.2161f, 0.0f}, -    {-1517.01f,  350.713f,    62.4286f, 0.0f}, -    {-1511.39f,  362.537f,    62.4539f, 0.0f}, -    {-1508.68f,  366.822f,    62.733f, 0.0f} -}; - -class npc_plains_vision : public CreatureScript -{ -public: -    npc_plains_vision() : CreatureScript("npc_plains_vision") { } - -    CreatureAI* GetAI(Creature* creature) const override -    { -          return new npc_plains_visionAI(creature); -    } - -    struct npc_plains_visionAI  : public ScriptedAI -    { -        npc_plains_visionAI(Creature* creature) : ScriptedAI(creature) -        { -            Initialize(); -        } - -        void Initialize() -        { -            WayPointId = 0; -            newWaypoint = true; -            amountWP = 49; -        } - -        bool newWaypoint; -        uint8 WayPointId; -        uint8 amountWP; - -        void Reset() override -        { -            Initialize(); -        } - -        void EnterCombat(Unit* /*who*/) override { } - -        void MovementInform(uint32 type, uint32 id) override -        { -            if (type != POINT_MOTION_TYPE) -                return; - -            if (id < amountWP) -            { -                ++WayPointId; -                newWaypoint = true; -            } -            else -            { -                me->setDeathState(JUST_DIED); -                me->RemoveCorpse(); -            } -        } - -        void UpdateAI(uint32 /*diff*/) override -        { -            if (newWaypoint) -            { -                me->GetMotionMaster()->MovePoint(WayPointId, wpPlainVision[WayPointId]); -                newWaypoint = false; -            } -        } -    }; - -}; - -/*##### -# -######*/ -  void AddSC_mulgore()  {      new npc_kyle_frenzied(); -    new npc_plains_vision();  } diff --git a/src/server/scripts/Kalimdor/zone_orgrimmar.cpp b/src/server/scripts/Kalimdor/zone_orgrimmar.cpp index fd666b7fcd7..22daddff5b9 100644 --- a/src/server/scripts/Kalimdor/zone_orgrimmar.cpp +++ b/src/server/scripts/Kalimdor/zone_orgrimmar.cpp @@ -1,6 +1,5 @@  /*   * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>   *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License as published by the @@ -16,255 +15,6 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -/* ScriptData -SDName: Orgrimmar -SD%Complete: 100 -SDComment: Quest support: 2460, 6566 -SDCategory: Orgrimmar -EndScriptData */ - -/* ContentData -npc_shenthul -npc_thrall_warchief -EndContentData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "ScriptedGossip.h" -#include "Player.h" - -/*###### -## npc_shenthul -######*/ - -enum Shenthul -{ -    QUEST_SHATTERED_SALUTE  = 2460 -}; - -class npc_shenthul : public CreatureScript -{ -public: -    npc_shenthul() : CreatureScript("npc_shenthul") { } - -    bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override -    { -        if (quest->GetQuestId() == QUEST_SHATTERED_SALUTE) -        { -            ENSURE_AI(npc_shenthul::npc_shenthulAI, creature->AI())->CanTalk = true; -            ENSURE_AI(npc_shenthul::npc_shenthulAI, creature->AI())->PlayerGUID = player->GetGUID(); -        } -        return true; -    } - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return new npc_shenthulAI(creature); -    } - -    struct npc_shenthulAI : public ScriptedAI -    { -        npc_shenthulAI(Creature* creature) : ScriptedAI(creature) -        { -            Initialize(); -        } - -        void Initialize() -        { -            CanTalk = false; -            CanEmote = false; -            SaluteTimer = 6000; -            ResetTimer = 0; -            PlayerGUID = 0; -        } - -        bool CanTalk; -        bool CanEmote; -        uint32 SaluteTimer; -        uint32 ResetTimer; -        uint64 PlayerGUID; - -        void Reset() override -        { -            Initialize(); -        } - -        void EnterCombat(Unit* /*who*/) override { } - -        void UpdateAI(uint32 diff) override -        { -            if (CanEmote) -            { -                if (ResetTimer <= diff) -                { -                    if (Player* player = ObjectAccessor::GetPlayer(*me, PlayerGUID)) -                    { -                        if (player->GetTypeId() == TYPEID_PLAYER && player->GetQuestStatus(QUEST_SHATTERED_SALUTE) == QUEST_STATUS_INCOMPLETE) -                            player->FailQuest(QUEST_SHATTERED_SALUTE); -                    } -                    Reset(); -                } else ResetTimer -= diff; -            } - -            if (CanTalk && !CanEmote) -            { -                if (SaluteTimer <= diff) -                { -                    me->HandleEmoteCommand(EMOTE_ONESHOT_SALUTE); -                    CanEmote = true; -                    ResetTimer = 60000; -                } else SaluteTimer -= diff; -            } - -            if (!UpdateVictim()) -                return; - -            DoMeleeAttackIfReady(); -        } - -        void ReceiveEmote(Player* player, uint32 emote) override -        { -            if (emote == TEXT_EMOTE_SALUTE && player->GetQuestStatus(QUEST_SHATTERED_SALUTE) == QUEST_STATUS_INCOMPLETE) -            { -                if (CanEmote) -                { -                    player->AreaExploredOrEventHappens(QUEST_SHATTERED_SALUTE); -                    Reset(); -                } -            } -        } -    }; - -}; - -/*###### -## npc_thrall_warchief -######*/ - -enum ThrallWarchief -{ -    QUEST_6566              = 6566, - -    SPELL_CHAIN_LIGHTNING   = 16033, -    SPELL_SHOCK             = 16034 -}; - -#define GOSSIP_HTW "Please share your wisdom with me, Warchief." -#define GOSSIP_STW1 "What discoveries?" -#define GOSSIP_STW2 "Usurper?" -#define GOSSIP_STW3 "With all due respect, Warchief - why not allow them to be destroyed? Does this not strengthen our position?" -#define GOSSIP_STW4 "I... I did not think of it that way, Warchief." -#define GOSSIP_STW5 "I live only to serve, Warchief! My life is empty and meaningless without your guidance." -#define GOSSIP_STW6 "Of course, Warchief!" - -/// @todo verify abilities/timers -class npc_thrall_warchief : public CreatureScript -{ -public: -    npc_thrall_warchief() : CreatureScript("npc_thrall_warchief") { } - -    bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override -    { -        player->PlayerTalkClass->ClearMenus(); -        switch (action) -        { -            case GOSSIP_ACTION_INFO_DEF+1: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_STW1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); -                player->SEND_GOSSIP_MENU(5733, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+2: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_STW2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3); -                player->SEND_GOSSIP_MENU(5734, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+3: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_STW3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4); -                player->SEND_GOSSIP_MENU(5735, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+4: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_STW4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5); -                player->SEND_GOSSIP_MENU(5736, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+5: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_STW5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+6); -                player->SEND_GOSSIP_MENU(5737, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+6: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_STW6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+7); -                player->SEND_GOSSIP_MENU(5738, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+7: -                player->CLOSE_GOSSIP_MENU(); -                player->AreaExploredOrEventHappens(QUEST_6566); -                break; -        } -        return true; -    } - -    bool OnGossipHello(Player* player, Creature* creature) override -    { -        if (creature->IsQuestGiver()) -            player->PrepareQuestMenu(creature->GetGUID()); - -        if (player->GetQuestStatus(QUEST_6566) == QUEST_STATUS_INCOMPLETE) -            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HTW, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - -        player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); -        return true; -    } - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return new npc_thrall_warchiefAI(creature); -    } - -    struct npc_thrall_warchiefAI : public ScriptedAI -    { -        npc_thrall_warchiefAI(Creature* creature) : ScriptedAI(creature) -        { -            Initialize(); -        } - -        void Initialize() -        { -            ChainLightningTimer = 2000; -            ShockTimer = 8000; -        } - -        uint32 ChainLightningTimer; -        uint32 ShockTimer; - -        void Reset() override -        { -            Initialize(); -        } - -        void EnterCombat(Unit* /*who*/) override { } - -        void UpdateAI(uint32 diff) override -        { -            if (!UpdateVictim()) -                return; - -            if (ChainLightningTimer <= diff) -            { -                DoCastVictim(SPELL_CHAIN_LIGHTNING); -                ChainLightningTimer = 9000; -            } else ChainLightningTimer -= diff; - -            if (ShockTimer <= diff) -            { -                DoCastVictim(SPELL_SHOCK); -                ShockTimer = 15000; -            } else ShockTimer -= diff; - -            DoMeleeAttackIfReady(); -        } -    }; - -}; -  void AddSC_orgrimmar()  { -    new npc_shenthul(); -    new npc_thrall_warchief();  } diff --git a/src/server/scripts/Kalimdor/zone_silithus.cpp b/src/server/scripts/Kalimdor/zone_silithus.cpp index 55f36779145..e6e03d923c9 100644 --- a/src/server/scripts/Kalimdor/zone_silithus.cpp +++ b/src/server/scripts/Kalimdor/zone_silithus.cpp @@ -19,13 +19,13 @@  /* ScriptData  SDName: Silithus  SD%Complete: 100 -SDComment: Quest support: 8304, 8507. +SDComment: Quest support: 7785, 8304.  SDCategory: Silithus  EndScriptData */  /* ContentData  npcs_rutgar_and_frankal -quest_a_pawn_on_the_eternal_pawn +go_wind_stone  EndContentData */  #include "ScriptMgr.h" diff --git a/src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp b/src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp index 7b29ced9860..251006ff545 100644 --- a/src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp +++ b/src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp @@ -1,6 +1,5 @@  /*   * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>   *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License as published by the @@ -16,164 +15,6 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -/* ScriptData -SDName: Stonetalon_Mountains -SD%Complete: 95 -SDComment: Quest support: 6627, 6523 -SDCategory: Stonetalon Mountains -EndScriptData */ - -/* ContentData -npc_braug_dimspirit -npc_kaya_flathoof -EndContentData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "ScriptedGossip.h" -#include "ScriptedEscortAI.h" -#include "Player.h" - -/*###### -## npc_braug_dimspirit -######*/ - -#define GOSSIP_HBD1 "Ysera" -#define GOSSIP_HBD2 "Neltharion" -#define GOSSIP_HBD3 "Nozdormu" -#define GOSSIP_HBD4 "Alexstrasza" -#define GOSSIP_HBD5 "Malygos" - -class npc_braug_dimspirit : public CreatureScript -{ -public: -    npc_braug_dimspirit() : CreatureScript("npc_braug_dimspirit") { } - -    bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override -    { -        player->PlayerTalkClass->ClearMenus(); -        if (action == GOSSIP_ACTION_INFO_DEF+1) -        { -            player->CLOSE_GOSSIP_MENU(); -            creature->CastSpell(player, 6766, false); - -        } -        if (action == GOSSIP_ACTION_INFO_DEF+2) -        { -            player->CLOSE_GOSSIP_MENU(); -            player->AreaExploredOrEventHappens(6627); -        } -        return true; -    } - -    bool OnGossipHello(Player* player, Creature* creature) override -    { -        if (creature->IsQuestGiver()) -            player->PrepareQuestMenu(creature->GetGUID()); - -        if (player->GetQuestStatus(6627) == QUEST_STATUS_INCOMPLETE) -        { -            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HBD1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); -            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HBD2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); -            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HBD3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); -            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HBD4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); -            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HBD5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - -            player->SEND_GOSSIP_MENU(5820, creature->GetGUID()); -        } -        else -            player->SEND_GOSSIP_MENU(5819, creature->GetGUID()); - -        return true; -    } - -}; - -/*###### -## npc_kaya_flathoof -######*/ - -enum Kaya -{ -    FACTION_ESCORTEE_H          = 775, - -    NPC_GRIMTOTEM_RUFFIAN       = 11910, -    NPC_GRIMTOTEM_BRUTE         = 11912, -    NPC_GRIMTOTEM_SORCERER      = 11913, - -    SAY_START                   = 0, -    SAY_AMBUSH                  = 1, -    SAY_END                     = 2, - -    QUEST_PROTECT_KAYA          = 6523 -}; - -class npc_kaya_flathoof : public CreatureScript -{ -public: -    npc_kaya_flathoof() : CreatureScript("npc_kaya_flathoof") { } - -    struct npc_kaya_flathoofAI : public npc_escortAI -    { -        npc_kaya_flathoofAI(Creature* creature) : npc_escortAI(creature) { } - -        void WaypointReached(uint32 waypointId) override -        { -            Player* player = GetPlayerForEscort(); -            if (!player) -                return; - -            switch (waypointId) -            { -                case 16: -                    Talk(SAY_AMBUSH); -                    me->SummonCreature(NPC_GRIMTOTEM_BRUTE, -48.53f, -503.34f, -46.31f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); -                    me->SummonCreature(NPC_GRIMTOTEM_RUFFIAN, -38.85f, -503.77f, -45.90f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); -                    me->SummonCreature(NPC_GRIMTOTEM_SORCERER, -36.37f, -496.23f, -45.71f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); -                    break; -                case 18: -                    me->SetInFront(player); -                    Talk(SAY_END); -                    player->GroupEventHappens(QUEST_PROTECT_KAYA, me); -                    break; -            } -        } - -        void JustSummoned(Creature* summoned) override -        { -            summoned->AI()->AttackStart(me); -        } - -        void Reset() override { } -    }; - -    bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override -    { -        if (quest->GetQuestId() == QUEST_PROTECT_KAYA) -        { -            if (npc_escortAI* pEscortAI = CAST_AI(npc_kaya_flathoof::npc_kaya_flathoofAI, creature->AI())) -                pEscortAI->Start(true, false, player->GetGUID()); - -            creature->AI()->Talk(SAY_START); -            creature->setFaction(113); -            creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); -        } -        return true; -    } - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return new npc_kaya_flathoofAI(creature); -    } - -}; - -/*###### -## AddSC -######*/ -  void AddSC_stonetalon_mountains()  { -    new npc_braug_dimspirit(); -    new npc_kaya_flathoof();  } diff --git a/src/server/scripts/Kalimdor/zone_tanaris.cpp b/src/server/scripts/Kalimdor/zone_tanaris.cpp index fce0608faaf..6c0151ff931 100644 --- a/src/server/scripts/Kalimdor/zone_tanaris.cpp +++ b/src/server/scripts/Kalimdor/zone_tanaris.cpp @@ -19,17 +19,14 @@  /* ScriptData  SDName: Tanaris  SD%Complete: 80 -SDComment: Quest support: 648, 1560, 2954, 4005, 10277, 10279(Special flight path). +SDComment: Quest support: 648, 10277, 10279(Special flight path).  SDCategory: Tanaris  EndScriptData */  /* ContentData -npc_aquementas  npc_custodian_of_time  npc_steward_of_time -npc_stone_watcher_of_norgannon  npc_OOX17 -npc_tooga  EndContentData */  #include "ScriptMgr.h" @@ -59,7 +56,7 @@ public:      CreatureAI* GetAI(Creature* creature) const override      { -        return new npc_aquementasAI(creature); +        return new npc_aquementasAI (creature);      }      struct npc_aquementasAI : public ScriptedAI @@ -109,7 +106,7 @@ public:              }          } -        void EnterCombat(Unit* who) override +        void EnterCombat(Unit* who)          {              Talk(AGGRO_YELL_AQUE, who);          } @@ -192,7 +189,7 @@ public:      {          npc_custodian_of_timeAI(Creature* creature) : npc_escortAI(creature) { } -        void WaypointReached(uint32 waypointId) override +        void WaypointReached(uint32 waypointId)          {              if (Player* player = GetPlayerForEscort())              { @@ -259,8 +256,7 @@ public:              }          } -        void MoveInLineOfSight(Unit* who) override - +        void MoveInLineOfSight(Unit* who)          {              if (HasEscortState(STATE_ESCORT_ESCORTING))                  return; @@ -300,7 +296,7 @@ class npc_steward_of_time : public CreatureScript  public:      npc_steward_of_time() : CreatureScript("npc_steward_of_time") { } -    bool OnQuestAccept(Player* player, Creature* /*creature*/, Quest const* quest) override +    bool OnQuestAccept(Player* player, Creature* /*creature*/, Quest const* quest)      {          if (quest->GetQuestId() == 10279)                      //Quest: To The Master's Lair              player->CastSpell(player, 34891, true);               //(Flight through Caverns) @@ -308,7 +304,7 @@ public:          return false;      } -    bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) override +    bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action)      {          player->PlayerTalkClass->ClearMenus();          if (action == GOSSIP_ACTION_INFO_DEF + 1) @@ -317,7 +313,7 @@ public:          return true;      } -    bool OnGossipHello(Player* player, Creature* creature) override +    bool OnGossipHello(Player* player, Creature* creature)      {          if (creature->IsQuestGiver())              player->PrepareQuestMenu(creature->GetGUID()); @@ -336,70 +332,6 @@ public:  };  /*###### -## npc_stone_watcher_of_norgannon -######*/ - -#define GOSSIP_ITEM_NORGANNON_1     "What function do you serve?" -#define GOSSIP_ITEM_NORGANNON_2     "What are the Plates of Uldum?" -#define GOSSIP_ITEM_NORGANNON_3     "Where are the Plates of Uldum?" -#define GOSSIP_ITEM_NORGANNON_4     "Excuse me? We've been \"reschedueled for visitations\"? What does that mean?!" -#define GOSSIP_ITEM_NORGANNON_5     "So, what's inside Uldum?" -#define GOSSIP_ITEM_NORGANNON_6     "I will return when i have the Plates of Uldum." - -class npc_stone_watcher_of_norgannon : public CreatureScript -{ -public: -    npc_stone_watcher_of_norgannon() : CreatureScript("npc_stone_watcher_of_norgannon") { } - -    bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override -    { -        player->PlayerTalkClass->ClearMenus(); -        switch (action) -        { -            case GOSSIP_ACTION_INFO_DEF: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_NORGANNON_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); -                player->SEND_GOSSIP_MENU(1675, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+1: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_NORGANNON_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); -                player->SEND_GOSSIP_MENU(1676, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+2: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_NORGANNON_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3); -                player->SEND_GOSSIP_MENU(1677, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+3: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_NORGANNON_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4); -                player->SEND_GOSSIP_MENU(1678, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+4: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_NORGANNON_6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5); -                player->SEND_GOSSIP_MENU(1679, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+5: -                player->CLOSE_GOSSIP_MENU(); -                player->AreaExploredOrEventHappens(2954); -                break; -        } -        return true; -    } - -    bool OnGossipHello(Player* player, Creature* creature) override -    { -        if (creature->IsQuestGiver()) -            player->PrepareQuestMenu(creature->GetGUID()); - -        if (player->GetQuestStatus(2954) == QUEST_STATUS_INCOMPLETE) -            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_NORGANNON_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - -        player->SEND_GOSSIP_MENU(1674, creature->GetGUID()); - -        return true; -    } - -}; - -/*######  ## npc_OOX17  ######*/ @@ -422,7 +354,7 @@ class npc_OOX17 : public CreatureScript  public:      npc_OOX17() : CreatureScript("npc_OOX17") { } -    bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override +    bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest)      {          if (quest->GetQuestId() == Q_OOX17)          { @@ -447,7 +379,7 @@ public:      {          npc_OOX17AI(Creature* creature) : npc_escortAI(creature) { } -        void WaypointReached(uint32 waypointId) override +        void WaypointReached(uint32 waypointId)          {              if (Player* player = GetPlayerForEscort())              { @@ -517,7 +449,7 @@ class npc_tooga : public CreatureScript  public:      npc_tooga() : CreatureScript("npc_tooga") { } -    bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override +    bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest)      {          if (quest->GetQuestId() == QUEST_TOOGA)          { @@ -560,8 +492,7 @@ public:              Initialize();          } -        void MoveInLineOfSight(Unit* who) override - +        void MoveInLineOfSight(Unit* who)          {              FollowerAI::MoveInLineOfSight(who); @@ -579,7 +510,7 @@ public:              }          } -        void MovementInform(uint32 MotionType, uint32 PointId) override +        void MovementInform(uint32 MotionType, uint32 PointId)          {              FollowerAI::MovementInform(MotionType, PointId); @@ -590,7 +521,7 @@ public:                  SetFollowComplete();          } -        void UpdateFollowerAI(uint32 Diff) override +        void UpdateFollowerAI(uint32 Diff)          {              if (!UpdateVictim())              { @@ -662,10 +593,7 @@ public:  void AddSC_tanaris()  { -    new npc_aquementas();      new npc_custodian_of_time();      new npc_steward_of_time(); -    new npc_stone_watcher_of_norgannon();      new npc_OOX17(); -    new npc_tooga();  } diff --git a/src/server/scripts/Kalimdor/zone_the_barrens.cpp b/src/server/scripts/Kalimdor/zone_the_barrens.cpp index 03507c77efb..3670e225fd7 100644 --- a/src/server/scripts/Kalimdor/zone_the_barrens.cpp +++ b/src/server/scripts/Kalimdor/zone_the_barrens.cpp @@ -19,16 +19,11 @@  /* ScriptData  SDName: The_Barrens  SD%Complete: 90 -SDComment: Quest support: 863, 898, 1719, 2458, 4921, 6981, +SDComment: Quest support: 863  SDCategory: Barrens  EndScriptData */  /* ContentData -npc_beaten_corpse -npc_gilthares -npc_sputtervalve -npc_taskmaster_fizzule -npc_twiggy_flathead  npc_wizzlecrank_shredder  EndContentData */ @@ -674,9 +669,5 @@ public:  void AddSC_the_barrens()  { -    new npc_beaten_corpse(); -    new npc_gilthares(); -    new npc_taskmaster_fizzule(); -    new npc_twiggy_flathead();      new npc_wizzlecrank_shredder();  } diff --git a/src/server/scripts/Kalimdor/zone_thousand_needles.cpp b/src/server/scripts/Kalimdor/zone_thousand_needles.cpp index 9092d4e06e5..46df1cb3397 100644 --- a/src/server/scripts/Kalimdor/zone_thousand_needles.cpp +++ b/src/server/scripts/Kalimdor/zone_thousand_needles.cpp @@ -16,457 +16,6 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -/* ScriptData -SDName: Thousand Needles -SD%Complete: 100 -SDComment: Support for Quest: 1950, 4770, 4904, 4966, 5151. -SDCategory: Thousand Needles -EndScriptData */ - -/* ContentData -npc_kanati -npc_lakota_windsong -npc_swiftmountain -npc_plucky -npc_enraged_panther -go_panther_cage -EndContentData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "ScriptedGossip.h" -#include "ScriptedEscortAI.h" -#include "Player.h" - -/*##### -# npc_kanati -######*/ - -enum Kanati -{ -    SAY_KAN_START              = 0, - -    QUEST_PROTECT_KANATI        = 4966, -    NPC_GALAK_ASS               = 10720 -}; - -Position const GalakLoc = {-4867.387695f, -1357.353760f, -48.226f, 0.0f}; - -class npc_kanati : public CreatureScript -{ -public: -    npc_kanati() : CreatureScript("npc_kanati") { } - -    bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override -    { -        if (quest->GetQuestId() == QUEST_PROTECT_KANATI) -            if (npc_kanatiAI* pEscortAI = CAST_AI(npc_kanati::npc_kanatiAI, creature->AI())) -                pEscortAI->Start(false, false, player->GetGUID(), quest, true); - -        return true; -    } - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return new npc_kanatiAI(creature); -    } - -    struct npc_kanatiAI : public npc_escortAI -    { -        npc_kanatiAI(Creature* creature) : npc_escortAI(creature) { } - -        void Reset() override { } - -        void WaypointReached(uint32 waypointId) override -        { -            switch (waypointId) -            { -                case 0: -                    Talk(SAY_KAN_START); -                    DoSpawnGalak(); -                    break; -                case 1: -                    if (Player* player = GetPlayerForEscort()) -                        player->GroupEventHappens(QUEST_PROTECT_KANATI, me); -                    break; -            } -        } - -        void DoSpawnGalak() -        { -            for (int i = 0; i < 3; ++i) -                me->SummonCreature(NPC_GALAK_ASS, GalakLoc, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); -        } - -        void JustSummoned(Creature* summoned) override -        { -            summoned->AI()->AttackStart(me); -        } -    }; - -}; - -/*###### -# npc_lakota_windsong -######*/ - -enum Lakota -{ -    SAY_LAKO_START              = 0, -    SAY_LAKO_LOOK_OUT           = 1, -    SAY_LAKO_HERE_COME          = 2, -    SAY_LAKO_MORE               = 3, -    SAY_LAKO_END                = 4, - -    QUEST_FREE_AT_LAST          = 4904, -    NPC_GRIM_BANDIT             = 10758, -    FACTION_ESCORTEE_LAKO       = 232,                      //guessed - -    ID_AMBUSH_1                 = 0, -    ID_AMBUSH_2                 = 2, -    ID_AMBUSH_3                 = 4 -}; - -Position const BanditLoc[6] = -{ -    {-4905.479492f, -2062.732666f, 84.352f, 0.0f}, -    {-4915.201172f, -2073.528320f, 84.733f, 0.0f}, -    {-4878.883301f, -1986.947876f, 91.966f, 0.0f}, -    {-4877.503906f, -1966.113403f, 91.859f, 0.0f}, -    {-4767.985352f, -1873.169189f, 90.192f, 0.0f}, -    {-4788.861328f, -1888.007813f, 89.888f, 0.0f} -}; - -class npc_lakota_windsong : public CreatureScript -{ -public: -    npc_lakota_windsong() : CreatureScript("npc_lakota_windsong") { } - -    bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override -    { -        if (quest->GetQuestId() == QUEST_FREE_AT_LAST) -        { -            creature->AI()->Talk(SAY_LAKO_START, player); -            creature->setFaction(FACTION_ESCORTEE_LAKO); - -            if (npc_lakota_windsongAI* pEscortAI = CAST_AI(npc_lakota_windsong::npc_lakota_windsongAI, creature->AI())) -                pEscortAI->Start(false, false, player->GetGUID(), quest); -        } -        return true; -    } - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return new npc_lakota_windsongAI(creature); -    } - -    struct npc_lakota_windsongAI : public npc_escortAI -    { -        npc_lakota_windsongAI(Creature* creature) : npc_escortAI(creature) { } - -        void Reset() override { } - -        void WaypointReached(uint32 waypointId) override -        { -            switch (waypointId) -            { -                case 8: -                    Talk(SAY_LAKO_LOOK_OUT); -                    DoSpawnBandits(ID_AMBUSH_1); -                    break; -                case 14: -                    Talk(SAY_LAKO_HERE_COME); -                    DoSpawnBandits(ID_AMBUSH_2); -                    break; -                case 21: -                    Talk(SAY_LAKO_MORE); -                    DoSpawnBandits(ID_AMBUSH_3); -                    break; -                case 45: -                    if (Player* player = GetPlayerForEscort()) -                        player->GroupEventHappens(QUEST_FREE_AT_LAST, me); -                    break; -            } -        } - -        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); -        } -    }; - -}; - -/*###### -# npc_paoka_swiftmountain -######*/ - -enum Packa -{ -    SAY_START           = 0, -    SAY_WYVERN          = 1, -    SAY_COMPLETE        = 2, - -    QUEST_HOMEWARD      = 4770, -    NPC_WYVERN          = 4107, -    FACTION_ESCORTEE    = 232                               //guessed -}; - -Position const WyvernLoc[3] = -{ -    {-4990.606f, -906.057f, -5.343f, 0.0f}, -    {-4970.241f, -927.378f, -4.951f, 0.0f}, -    {-4985.364f, -952.528f, -5.199f, 0.0f} -}; - -class npc_paoka_swiftmountain : public CreatureScript -{ -public: -    npc_paoka_swiftmountain() : CreatureScript("npc_paoka_swiftmountain") { } - -    bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override -    { -        if (quest->GetQuestId() == QUEST_HOMEWARD) -        { -            creature->AI()->Talk(SAY_START, player); -            creature->setFaction(FACTION_ESCORTEE); - -            if (npc_paoka_swiftmountainAI* pEscortAI = CAST_AI(npc_paoka_swiftmountain::npc_paoka_swiftmountainAI, creature->AI())) -                pEscortAI->Start(false, false, player->GetGUID(), quest); -        } -        return true; -    } - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return new npc_paoka_swiftmountainAI(creature); -    } - -    struct npc_paoka_swiftmountainAI : public npc_escortAI -    { -        npc_paoka_swiftmountainAI(Creature* creature) : npc_escortAI(creature) { } - -        void Reset() override { } - -        void WaypointReached(uint32 waypointId) override -        { -            switch (waypointId) -            { -                case 15: -                    Talk(SAY_WYVERN); -                    DoSpawnWyvern(); -                    break; -                case 26: -                    Talk(SAY_COMPLETE); -                    break; -                case 27: -                    if (Player* player = GetPlayerForEscort()) -                        player->GroupEventHappens(QUEST_HOMEWARD, me); -                    break; -            } -        } - -        void DoSpawnWyvern() -        { -            for (int i = 0; i < 3; ++i) -                me->SummonCreature(NPC_WYVERN, WyvernLoc[i], TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); -        } -    }; -}; - -/*##### -# npc_plucky -######*/ - -#define GOSSIP_P    "Please tell me the Phrase.." - -enum Plucky -{ -    FACTION_FRIENDLY        = 35, -    QUEST_SCOOP             = 1950, -    SPELL_PLUCKY_HUMAN      = 9192, -    SPELL_PLUCKY_CHICKEN    = 9220 -}; - -class npc_plucky : public CreatureScript -{ -public: -    npc_plucky() : CreatureScript("npc_plucky") { } - -    bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) override -    { -        player->PlayerTalkClass->ClearMenus(); -        switch (action) -        { -            case GOSSIP_ACTION_INFO_DEF+1: -                player->CLOSE_GOSSIP_MENU(); -                player->CompleteQuest(QUEST_SCOOP); -            break; -        } -        return true; -    } - -    bool OnGossipHello(Player* player, Creature* creature) override -    { -        if (player->GetQuestStatus(QUEST_SCOOP) == QUEST_STATUS_INCOMPLETE) -            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_P, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - -        player->SEND_GOSSIP_MENU(738, creature->GetGUID()); - -        return true; -    } - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return new npc_pluckyAI(creature); -    } - -    struct npc_pluckyAI : public ScriptedAI -    { -        npc_pluckyAI(Creature* creature) : ScriptedAI(creature) -        { -            Initialize(); -            NormFaction = creature->getFaction(); -        } - -        void Initialize() -        { -            ResetTimer = 120000; -        } - -        uint32 NormFaction; -        uint32 ResetTimer; - -        void Reset() override -        { -            Initialize(); - -            if (me->getFaction() != NormFaction) -                me->setFaction(NormFaction); - -            if (me->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP)) -                me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - -            DoCast(me, SPELL_PLUCKY_CHICKEN, false); -        } - -        void ReceiveEmote(Player* player, uint32 TextEmote) override -        { -            if (player->GetQuestStatus(QUEST_SCOOP) == QUEST_STATUS_INCOMPLETE) -            { -                if (TextEmote == TEXT_EMOTE_BECKON) -                { -                    me->setFaction(FACTION_FRIENDLY); -                    me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); -                    DoCast(me, SPELL_PLUCKY_HUMAN, false); -                } -            } - -            if (TextEmote == TEXT_EMOTE_CHICKEN) -            { -                if (me->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP)) -                    return; -                else -                { -                    me->setFaction(FACTION_FRIENDLY); -                    me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); -                    DoCast(me, SPELL_PLUCKY_HUMAN, false); -                    me->HandleEmoteCommand(EMOTE_ONESHOT_WAVE); -                } -            } -        } - -        void UpdateAI(uint32 Diff) override -        { -            if (me->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP)) -            { -                if (ResetTimer <= Diff) -                { -                    if (!me->GetVictim()) -                        EnterEvadeMode(); -                    else -                        me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - -                    return; -                } -                else -                    ResetTimer -= Diff; -            } - -            if (!UpdateVictim()) -                return; - -            DoMeleeAttackIfReady(); -        } -    }; - -}; - -enum PantherCage -{ -    ENRAGED_PANTHER = 10992 -}; - -class go_panther_cage : public GameObjectScript -{ -public: -    go_panther_cage() : GameObjectScript("go_panther_cage") { } - -    bool OnGossipHello(Player* player, GameObject* go) override -    { -        go->UseDoorOrButton(); -        if (player->GetQuestStatus(5151) == QUEST_STATUS_INCOMPLETE) -        { -            if (Creature* panther = go->FindNearestCreature(ENRAGED_PANTHER, 5, true)) -            { -                panther->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); -                panther->SetReactState(REACT_AGGRESSIVE); -                panther->AI()->AttackStart(player); -            } -        } - -        return true; -    } -}; - -class npc_enraged_panther : public CreatureScript -{ -public: -    npc_enraged_panther() : CreatureScript("npc_enraged_panther") { } - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return new npc_enraged_pantherAI(creature); -    } - -    struct npc_enraged_pantherAI : public ScriptedAI -    { -        npc_enraged_pantherAI(Creature* creature) : ScriptedAI(creature) { } - -        void Reset() override -        { -            me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); -            me->SetReactState(REACT_PASSIVE); -        } - -        void UpdateAI(uint32 /*diff*/) override -        { -            if (!UpdateVictim()) -                return; - -            DoMeleeAttackIfReady(); -        } -    }; - -}; -  void AddSC_thousand_needles()  { -    new npc_kanati(); -    new npc_lakota_windsong(); -    new npc_paoka_swiftmountain(); -    new npc_plucky(); -    new npc_enraged_panther(); -    new go_panther_cage();  } diff --git a/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp b/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp index 40b68270c9d..1c04a6e32dd 100644 --- a/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp +++ b/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp @@ -48,33 +48,9 @@ class npc_cairne_bloodhoof : public CreatureScript  public:      npc_cairne_bloodhoof() : CreatureScript("npc_cairne_bloodhoof") { } -    bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override -    { -        player->PlayerTalkClass->ClearMenus(); -        if (action == GOSSIP_SENDER_INFO) -        { -            player->CastSpell(player, 23123, false); -            player->SEND_GOSSIP_MENU(7014, creature->GetGUID()); -        } -        return true; -    } - -    bool OnGossipHello(Player* player, Creature* creature) override -    { -        if (creature->IsQuestGiver()) -            player->PrepareQuestMenu(creature->GetGUID()); - -        if (player->GetQuestStatus(925) == QUEST_STATUS_INCOMPLETE) -            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HCB, GOSSIP_SENDER_MAIN, GOSSIP_SENDER_INFO); - -        player->SEND_GOSSIP_MENU(7013, creature->GetGUID()); - -        return true; -    } -      CreatureAI* GetAI(Creature* creature) const override      { -        return new npc_cairne_bloodhoofAI(creature); +        return new npc_cairne_bloodhoofAI (creature);      }      struct npc_cairne_bloodhoofAI : public ScriptedAI diff --git a/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp b/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp index ea4c743b8a5..80354cbb1fd 100644 --- a/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp +++ b/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp @@ -16,350 +16,6 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -/* ScriptData -SDName: Ungoro Crater -SD%Complete: 100 -SDComment: Support for Quest: 4245, 4491 -SDCategory: Ungoro Crater -EndScriptData */ - -/* ContentData -npc_a-me -npc_ringo -EndContentData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "ScriptedEscortAI.h" -#include "ScriptedFollowerAI.h" -#include "Player.h" -#include "SpellInfo.h" - -enum AmeData -{ -    SAY_READY               = 0, -    SAY_AGGRO1              = 1, -    SAY_SEARCH              = 2, -    SAY_AGGRO2              = 3, -    SAY_AGGRO3              = 4, -    SAY_FINISH              = 5, - -    SPELL_DEMORALIZINGSHOUT = 13730, - -    QUEST_CHASING_AME       = 4245, -    ENTRY_TARLORD           = 6519, -    ENTRY_TARLORD1          = 6519, -    ENTRY_STOMPER           = 6513, -}; - -class npc_ame : public CreatureScript -{ -public: -    npc_ame() : CreatureScript("npc_ame") { } - -    bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override -    { -        if (quest->GetQuestId() == QUEST_CHASING_AME) -        { -            ENSURE_AI(npc_escortAI, (creature->AI()))->Start(false, false, player->GetGUID()); -            creature->AI()->Talk(SAY_READY, player); -            creature->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); -            // Change faction so mobs attack -            creature->setFaction(113); -        } -        return true; -    } - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return new npc_ameAI(creature); -    } - -    struct npc_ameAI : public npc_escortAI -    { -        npc_ameAI(Creature* creature) : npc_escortAI(creature) -        { -            Initialize(); -        } - -        void Initialize() -        { -            DemoralizingShoutTimer = 5000; -        } - -        uint32 DemoralizingShoutTimer; - -        void WaypointReached(uint32 waypointId) override -        { -            if (Player* player = GetPlayerForEscort()) -            { -                switch (waypointId) -                { -                    case 19: -                        me->SummonCreature(ENTRY_STOMPER, -6391.69f, -1730.49f, -272.83f, 4.96f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); -                        Talk(SAY_AGGRO1, player); -                        break; -                    case 28: -                        Talk(SAY_SEARCH, player); -                        break; -                    case 38: -                        me->SummonCreature(ENTRY_TARLORD, -6370.75f, -1382.84f, -270.51f, 6.06f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); -                        Talk(SAY_AGGRO2, player); -                        break; -                    case 49: -                        me->SummonCreature(ENTRY_TARLORD1, -6324.44f, -1181.05f, -270.17f, 4.34f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); -                        Talk(SAY_AGGRO3, player); -                        break; -                    case 55: -                        Talk(SAY_FINISH, player); -                        player->GroupEventHappens(QUEST_CHASING_AME, me); -                        break; -                } -            } -        } - -        void Reset() override -        { -            Initialize(); -        } - -        void JustSummoned(Creature* summoned) override -        { -            summoned->AI()->AttackStart(me); -        } - -        void JustDied(Unit* /*killer*/) override -        { -            if (Player* player = GetPlayerForEscort()) -                player->FailQuest(QUEST_CHASING_AME); -        } - -        void UpdateAI(uint32 diff) override -        { -            npc_escortAI::UpdateAI(diff); -            if (!UpdateVictim()) -                return; - -            if (DemoralizingShoutTimer <= diff) -            { -                DoCastVictim(SPELL_DEMORALIZINGSHOUT); -                DemoralizingShoutTimer = 70000; -            } else DemoralizingShoutTimer -= diff; -        } -    }; -}; - -/*#### -# npc_ringo -####*/ - -enum Ringo -{ -    SAY_RIN_START               = 0, - -    SAY_FAINT                   = 1, - -    SAY_WAKE                    = 2, - -    SAY_RIN_END_1               = 3, -    SAY_SPR_END_2               = 0, -    SAY_RIN_END_3               = 4, -    EMOTE_RIN_END_4             = 5, -    EMOTE_RIN_END_5             = 6, -    SAY_RIN_END_6               = 7, -    SAY_SPR_END_7               = 1, -    EMOTE_RIN_END_8             = 8, - -    SPELL_REVIVE_RINGO          = 15591, -    QUEST_A_LITTLE_HELP         = 4491, -    NPC_SPRAGGLE                = 9997, -    FACTION_ESCORTEE            = 113 -}; - -class npc_ringo : public CreatureScript -{ -public: -    npc_ringo() : CreatureScript("npc_ringo") { } - -    bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override -    { -        if (quest->GetQuestId() == QUEST_A_LITTLE_HELP) -        { -            if (npc_ringoAI* ringoAI = CAST_AI(npc_ringo::npc_ringoAI, creature->AI())) -            { -                creature->SetStandState(UNIT_STAND_STATE_STAND); -                ringoAI->StartFollow(player, FACTION_ESCORTEE, quest); -            } -        } - -        return true; -    } - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return new npc_ringoAI(creature); -    } - -    struct npc_ringoAI : public FollowerAI -    { -        npc_ringoAI(Creature* creature) : FollowerAI(creature) -        { -            Initialize(); -        } - -        void Initialize() -        { -            FaintTimer = urand(30000, 60000); -            EndEventProgress = 0; -            EndEventTimer = 1000; -            SpraggleGUID = 0; -        } - -        uint32 FaintTimer; -        uint32 EndEventProgress; -        uint32 EndEventTimer; - -        uint64 SpraggleGUID; - -        void Reset() override -        { -            Initialize(); -        } - -        void MoveInLineOfSight(Unit* who) override - -        { -            FollowerAI::MoveInLineOfSight(who); - -            if (!me->GetVictim() && !HasFollowState(STATE_FOLLOW_COMPLETE) && who->GetEntry() == NPC_SPRAGGLE) -            { -                if (me->IsWithinDistInMap(who, INTERACTION_DISTANCE)) -                { -                    if (Player* player = GetLeaderForFollower()) -                    { -                        if (player->GetQuestStatus(QUEST_A_LITTLE_HELP) == QUEST_STATUS_INCOMPLETE) -                            player->GroupEventHappens(QUEST_A_LITTLE_HELP, me); -                    } - -                    SpraggleGUID = who->GetGUID(); -                    SetFollowComplete(true); -                } -            } -        } - -        void SpellHit(Unit* /*pCaster*/, const SpellInfo* pSpell) override -        { -            if (HasFollowState(STATE_FOLLOW_INPROGRESS | STATE_FOLLOW_PAUSED) && pSpell->Id == SPELL_REVIVE_RINGO) -                ClearFaint(); -        } - -        void SetFaint() -        { -            if (!HasFollowState(STATE_FOLLOW_POSTEVENT)) -            { -                SetFollowPaused(true); - -                Talk(SAY_FAINT); -            } - -            //what does actually happen here? Emote? Aura? -            me->SetStandState(UNIT_STAND_STATE_SLEEP); -        } - -        void ClearFaint() -        { -            me->SetStandState(UNIT_STAND_STATE_STAND); - -            if (HasFollowState(STATE_FOLLOW_POSTEVENT)) -                return; - -            Talk(SAY_WAKE); - -            SetFollowPaused(false); -        } - -        void UpdateFollowerAI(uint32 Diff) override -        { -            if (!UpdateVictim()) -            { -                if (HasFollowState(STATE_FOLLOW_POSTEVENT)) -                { -                    if (EndEventTimer <= Diff) -                    { -                        Creature* spraggle = ObjectAccessor::GetCreature(*me, SpraggleGUID); -                        if (!spraggle || !spraggle->IsAlive()) -                        { -                            SetFollowComplete(); -                            return; -                        } - -                        switch (EndEventProgress) -                        { -                            case 1: -                                Talk(SAY_RIN_END_1); -                                EndEventTimer = 3000; -                                break; -                            case 2: -                                spraggle->AI()->Talk(SAY_SPR_END_2); -                                EndEventTimer = 5000; -                                break; -                            case 3: -                                Talk(SAY_RIN_END_3); -                                EndEventTimer = 1000; -                                break; -                            case 4: -                                Talk(EMOTE_RIN_END_4); -                                SetFaint(); -                                EndEventTimer = 9000; -                                break; -                            case 5: -                                Talk(EMOTE_RIN_END_5); -                                ClearFaint(); -                                EndEventTimer = 1000; -                                break; -                            case 6: -                                Talk(SAY_RIN_END_6); -                                EndEventTimer = 3000; -                                break; -                            case 7: -                                spraggle->AI()->Talk(SAY_SPR_END_7); -                                EndEventTimer = 10000; -                                break; -                            case 8: -                                Talk(EMOTE_RIN_END_8); -                                EndEventTimer = 5000; -                                break; -                            case 9: -                                SetFollowComplete(); -                                break; -                        } - -                        ++EndEventProgress; -                    } -                    else -                        EndEventTimer -= Diff; -                } -                else if (HasFollowState(STATE_FOLLOW_INPROGRESS) && !HasFollowState(STATE_FOLLOW_PAUSED)) -                { -                    if (FaintTimer <= Diff) -                    { -                        SetFaint(); -                        FaintTimer = urand(60000, 120000); -                    } -                    else -                        FaintTimer -= Diff; -                } - -                return; -            } - -            DoMeleeAttackIfReady(); -        } -    }; -}; -  void AddSC_ungoro_crater()  { -    new npc_ame(); -    new npc_ringo();  } diff --git a/src/server/scripts/Maelstrom/CMakeLists.txt b/src/server/scripts/Maelstrom/CMakeLists.txt new file mode 100644 index 00000000000..79f0789fd3f --- /dev/null +++ b/src/server/scripts/Maelstrom/CMakeLists.txt @@ -0,0 +1,14 @@ +# This file is free software; as a special exception the author gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +set(scripts_STAT_SRCS +  ${scripts_STAT_SRCS} +  Maelstrom/kezan.cpp +) + +message("  -> Prepared: The Maelstrom") diff --git a/src/server/scripts/Maelstrom/kezan.cpp b/src/server/scripts/Maelstrom/kezan.cpp new file mode 100644 index 00000000000..7deae4267eb --- /dev/null +++ b/src/server/scripts/Maelstrom/kezan.cpp @@ -0,0 +1,18 @@ +/* + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 3 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +void AddSC_kezan() +{ +} 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 b200a4e9825..592d69c5c76 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp @@ -121,8 +121,14 @@ public:                      me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);                      me->SetControlled(true, UNIT_STATE_STUNNED);                  } -                // phase mask -                target->CastSpell(target, SPELL_INSANITY_TARGET+insanityHandled, true); + +                // phase the player +                target->CastSpell(target, SPELL_INSANITY_TARGET + insanityHandled, true); + +                SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_INSANITY_TARGET + insanityHandled); +                if (!spellInfo) +                    return; +                  // summon twisted party members for this target                  Map::PlayerList const &players = me->GetMap()->GetPlayers();                  for (Map::PlayerList::const_iterator i = players.begin(); i != players.end(); ++i) @@ -135,21 +141,22 @@ public:                      {                          // clone                          player->CastSpell(summon, SPELL_CLONE_PLAYER, true); -                        // set phase -                        summon->SetPhaseMask((1<<(4+insanityHandled)), true); +                        // phase the summon +                        summon->SetInPhase(spellInfo->Effects[EFFECT_0].MiscValueB, true, true);                      }                  }                  ++insanityHandled;              }          } -        void ResetPlayersPhaseMask() +        void ResetPlayersPhase()          {              Map::PlayerList const &players = me->GetMap()->GetPlayers();              for (Map::PlayerList::const_iterator i = players.begin(); i != players.end(); ++i)              {                  Player* player = i->GetSource(); -                player->RemoveAurasDueToSpell(GetSpellForPhaseMask(player->GetPhaseMask())); +                for (uint32 index = 0; index <= 4; ++index) +                    player->RemoveAurasDueToSpell(SPELL_INSANITY_TARGET + index);              }          } @@ -161,9 +168,11 @@ public:              instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_QUICK_DEMISE_START_EVENT);              // Visible for all players in insanity -            me->SetPhaseMask((1|16|32|64|128|256), true); +            me->SetInPhase(169, true, true); +            for (uint32 i = 173; i <= 177; ++i) +                me->SetInPhase(i, true, true); -            ResetPlayersPhaseMask(); +            ResetPlayersPhase();              // Cleanup              Summons.DespawnAll(); @@ -184,33 +193,8 @@ public:              Summons.Summon(summon);          } -        uint32 GetSpellForPhaseMask(uint32 phase) -        { -            uint32 spell = 0; -            switch (phase) -            { -                case 16: -                    spell = SPELL_INSANITY_PHASING_1; -                    break; -                case 32: -                    spell = SPELL_INSANITY_PHASING_2; -                    break; -                case 64: -                    spell = SPELL_INSANITY_PHASING_3; -                    break; -                case 128: -                    spell = SPELL_INSANITY_PHASING_4; -                    break; -                case 256: -                    spell = SPELL_INSANITY_PHASING_5; -                    break; -            } -            return spell; -        } -          void SummonedCreatureDespawn(Creature* summon) override          { -            uint32 phase = summon->GetPhaseMask();              uint32 nextPhase = 0;              Summons.Despawn(summon); @@ -220,16 +204,17 @@ public:                  if (Creature* visage = ObjectAccessor::GetCreature(*me, *iter))                  {                      // Not all are dead -                    if (phase == visage->GetPhaseMask()) +                    if (visage->IsInPhase(summon))                          return;                      else -                        nextPhase = visage->GetPhaseMask(); +                    { +                        nextPhase = *visage->GetPhases().begin(); +                        break; +                    }                  }              }              // Roll Insanity -            uint32 spell = GetSpellForPhaseMask(phase); -            uint32 spell2 = GetSpellForPhaseMask(nextPhase);              Map* map = me->GetMap();              if (!map)                  return; @@ -241,12 +226,9 @@ public:                  {                      if (Player* player = i->GetSource())                      { -                        if (player->HasAura(spell)) -                        { -                            player->RemoveAurasDueToSpell(spell); -                            if (spell2) // if there is still some different mask cast spell for it -                                player->CastSpell(player, spell2, true); -                        } +                        for (uint32 index = 0; index <= 4; ++index) +                            player->RemoveAurasDueToSpell(SPELL_INSANITY_TARGET + index); +                        player->CastSpell(player, SPELL_INSANITY_TARGET + nextPhase - 173, true);                      }                  }              } @@ -298,7 +280,7 @@ public:              instance->SetBossState(DATA_HERALD_VOLAZJ, DONE);              Summons.DespawnAll(); -            ResetPlayersPhaseMask(); +            ResetPlayersPhase();          }          void KilledUnit(Unit* who) override diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp index 9d44e7d884f..565c581a727 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp @@ -20,7 +20,6 @@  #include "SpellAuraEffects.h"  #include "Spell.h"  #include "Vehicle.h" -#include "MapManager.h"  #include "GameObjectAI.h"  #include "ScriptedCreature.h"  #include "ruby_sanctum.h" @@ -393,7 +392,7 @@ class boss_halion : public CreatureScript                  if (events.IsInPhase(PHASE_THREE))                  {                      // Don't consider copied damage. -                    if (!me->InSamePhase(attacker)) +                    if (!me->IsInPhase(attacker))                          return;                      if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_HALION_CONTROLLER))) @@ -547,7 +546,7 @@ class boss_twilight_halion : public CreatureScript                  if (events.IsInPhase(PHASE_THREE))                  {                      // Don't consider copied damage. -                    if (!me->InSamePhase(attacker)) +                    if (!me->IsInPhase(attacker))                          return;                      if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_HALION_CONTROLLER))) 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 027238be6d3..a0cb4ca6d6f 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp @@ -132,9 +132,9 @@ bool GrandChampionsOutVehicle(Creature* me)      if (pGrandChampion1 && pGrandChampion2 && pGrandChampion3)      { -        if (!pGrandChampion1->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT) && -            !pGrandChampion2->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT) && -            !pGrandChampion3->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT)) +        if (!pGrandChampion1->m_movementInfo.transport.guid && +            !pGrandChampion2->m_movementInfo.transport.guid && +            !pGrandChampion3->m_movementInfo.transport.guid)              return true;      } @@ -395,7 +395,7 @@ public:                  }              }else uiPhaseTimer -= uiDiff; -            if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT)) +            if (!UpdateVictim() || me->m_movementInfo.transport.guid)                  return;              if (uiInterceptTimer <= uiDiff) @@ -543,7 +543,7 @@ public:                  uiFireBallTimer = 5000;              } else uiFireBallTimer -= uiDiff; -            if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT)) +            if (!UpdateVictim() || me->m_movementInfo.transport.guid)                  return;              if (uiFireBallTimer <= uiDiff) @@ -685,7 +685,7 @@ public:                  }              }else uiPhaseTimer -= uiDiff; -            if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT)) +            if (!UpdateVictim() || me->m_movementInfo.transport.guid)                  return;              if (uiChainLightningTimer <= uiDiff) @@ -835,7 +835,7 @@ public:                  }              }else uiPhaseTimer -= uiDiff; -            if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT)) +            if (!UpdateVictim() || me->m_movementInfo.transport.guid)                  return;              if (uiLightningArrowsTimer <= uiDiff) @@ -987,7 +987,7 @@ public:                  }              } else uiPhaseTimer -= uiDiff; -            if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT)) +            if (!UpdateVictim() || me->m_movementInfo.transport.guid)                  return;              if (uiEviscerateTimer <= uiDiff) 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 b4d1ee2f09b..d0ad42d38e1 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp @@ -636,7 +636,7 @@ class npc_jaina_or_sylvanas_intro_hor : public CreatureScript                          if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID))                          {                              if (GameObject* frostmourne = ObjectAccessor::GetGameObject(*me, _instance->GetData64(DATA_FROSTMOURNE))) -                                frostmourne->SetPhaseMask(2, true); +                                frostmourne->SetLootState(GO_JUST_DEACTIVATED);                              lichking->CastSpell(lichking, SPELL_TAKE_FROSTMOURNE, true);                              lichking->CastSpell(lichking, SPELL_FROSTMOURNE_VISUAL, true);                          } 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 51502b8a336..f73181ba1f3 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 @@ -249,7 +249,7 @@ class instance_halls_of_reflection : public InstanceMapScript                      case GO_FROSTMOURNE:                          FrostmourneGUID = go->GetGUID();                          if (GetData(DATA_INTRO_EVENT) == DONE) -                            go->SetPhaseMask(2, true); +                            go->SetLootState(GO_JUST_DEACTIVATED);                          break;                      case GO_ENTRANCE_DOOR:                          EntranceDoorGUID = go->GetGUID(); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp index bbdca1fa8c5..6cc86ff0096 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp @@ -362,7 +362,7 @@ class boss_lady_deathwhisper : public CreatureScript              void DamageTaken(Unit* /*damageDealer*/, uint32& damage) override              {                  // phase transition -                if (events.IsInPhase(PHASE_ONE) && damage > me->GetPower(POWER_MANA)) +                if (events.IsInPhase(PHASE_ONE) && damage > uint32(me->GetPower(POWER_MANA)))                  {                      Talk(SAY_PHASE_2);                      Talk(EMOTE_PHASE_2); 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 e2fe441dae2..50e98422481 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp @@ -343,9 +343,7 @@ enum MiscData      SOUND_PAIN                  = 17360,    // separate sound, not attached to any text      EQUIP_ASHBRINGER_GLOWING    = 50442, -    EQUIP_BROKEN_FROSTMOURNE    = 50840, - -    MOVIE_FALL_OF_THE_LICH_KING = 16, +    EQUIP_BROKEN_FROSTMOURNE    = 50840  };  enum Misc @@ -377,25 +375,6 @@ class NecroticPlagueTargetCheck : public std::unary_function<Unit*, bool>          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; -}; -  class FrozenThroneResetWorker  {      public: @@ -1499,7 +1478,7 @@ class npc_valkyr_shadowguard : public CreatureScript                              {                                  std::list<Creature*> triggers;                                  GetCreatureListWithEntryInGrid(triggers, me, NPC_WORLD_TRIGGER, 150.0f); -                                triggers.remove_if(HeightDifferenceCheck(platform, 5.0f, true)); +                                triggers.remove_if(Trinity::HeightDifferenceCheck(platform, 5.0f, true));                                  if (triggers.empty())                                      return; @@ -2289,7 +2268,7 @@ class spell_the_lich_king_quake : public SpellScriptLoader              void FilterTargets(std::list<WorldObject*>& targets)              {                  if (GameObject* platform = ObjectAccessor::GetGameObject(*GetCaster(), GetCaster()->GetInstanceScript()->GetData64(DATA_ARTHAS_PLATFORM))) -                    targets.remove_if(HeightDifferenceCheck(platform, 5.0f, false)); +                    targets.remove_if(Trinity::HeightDifferenceCheck(platform, 5.0f, false));              }              void HandleSendEvent(SpellEffIndex /*effIndex*/) @@ -3120,41 +3099,6 @@ class spell_the_lich_king_jump_remove_aura : public SpellScriptLoader          }  }; -class spell_the_lich_king_play_movie : public SpellScriptLoader -{ -    public: -        spell_the_lich_king_play_movie() : SpellScriptLoader("spell_the_lich_king_play_movie") { } - -        class spell_the_lich_king_play_movie_SpellScript : public SpellScript -        { -            PrepareSpellScript(spell_the_lich_king_play_movie_SpellScript); - -            bool Validate(SpellInfo const* /*spell*/) override -            { -                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() override -            { -                OnEffectHitTarget += SpellEffectFn(spell_the_lich_king_play_movie_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); -            } -        }; - -        SpellScript* GetSpellScript() const override -        { -            return new spell_the_lich_king_play_movie_SpellScript(); -        } -}; -  class achievement_been_waiting_long_time : public AchievementCriteriaScript  {      public: @@ -3224,7 +3168,6 @@ void AddSC_boss_the_lich_king()      new spell_the_lich_king_jump();      new spell_the_lich_king_jump_remove_aura();      new spell_trigger_spell_from_caster("spell_the_lich_king_mass_resurrection", SPELL_MASS_RESURRECTION_REAL); -    new spell_the_lich_king_play_movie();      new achievement_been_waiting_long_time();      new achievement_neck_deep_in_vile();  } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp index 2d58a6eeb26..6d297252dcb 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp @@ -625,7 +625,7 @@ class npc_the_lich_king_controller : public CreatureScript              void JustSummoned(Creature* summon) override              {                  // must not be in dream phase -                summon->SetPhaseMask((summon->GetPhaseMask() & ~0x10), true); +                summon->SetInPhase(173, true, false);                  if (summon->GetEntry() != NPC_SUPPRESSER)                      if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))                          summon->AI()->AttackStart(target); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp index 3f429183fa0..9c26f93fd54 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp @@ -656,13 +656,9 @@ class instance_icecrown_citadel : public InstanceMapScript                          go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED | GO_FLAG_NOT_SELECTABLE | GO_FLAG_NODESPAWN);                          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: diff --git a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp index 1c4320fd48b..80bf7e39ad3 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp @@ -316,7 +316,7 @@ public:              if (GameObject* trigger = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_KELTHUZAD_TRIGGER)))              {                  trigger->ResetDoorOrButton(); -                trigger->SetPhaseMask(1, true); +                trigger->SetLootState(GO_READY);              }              for (uint8 i = 0; i <= 3; ++i) @@ -400,7 +400,7 @@ public:                              break;                          case EVENT_TRIGGER:                              if (GameObject* trigger = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_KELTHUZAD_TRIGGER))) -                                trigger->SetPhaseMask(2, true); +                                trigger->SetLootState(GO_JUST_DEACTIVATED);                              break;                          case EVENT_PHASE:                              events.Reset(); diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp index 9ba0806ffd2..8b694bb6a3e 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp @@ -95,8 +95,8 @@ enum Spells      SPELL_RANDOM_PORTAL                      = 56047,      SPELL_PORTAL_BEAM                        = 56046, // Malygos cast on portal to activate it during PHASE_NOT_STARTED -    //Phase I -    SPELL_BERSERK                           = 60670, +    // Phase I +    SPELL_BERSERK                            = 60670,      SPELL_MALYGOS_BERSERK                    = 47008, // it's the berserk spell that will hit only Malygos after 10 min of 60670      SPELL_PORTAL_VISUAL_CLOSED               = 55949,      SPELL_SUMMON_POWER_PARK                  = 56142, @@ -1522,7 +1522,7 @@ public:                  creature->AI()->SetGUID(me->GetGUID(), DATA_LAST_OVERLOAD_GUID);          } -        void UpdateAI(uint32 /*diff*/) +        void UpdateAI(uint32 /*diff*/) override          {          } 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 d8a5cfae60d..45439ced242 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 @@ -93,7 +93,6 @@ public:                  delete go;                  return;              } -              instance->AddToMap(go);          } diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_commander_stoutbeard.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_commander_stoutbeard.cpp index c1ecdff8576..03f1f504e01 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_commander_stoutbeard.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_commander_stoutbeard.cpp @@ -35,7 +35,6 @@ enum CommanderStoutbeard      SPELL_WHIRLWIND_2               = 38618  }; -  class boss_commander_stoutbeard : public CreatureScript  {  public: diff --git a/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp index b758f9c678c..83093234093 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp @@ -70,7 +70,7 @@ class instance_oculus : public InstanceMapScript                      case NPC_VAROS:                          VarosGUID = creature->GetGUID();                          if (GetBossState(DATA_DRAKOS) == DONE) -                           creature->SetPhaseMask(1, true); +                            creature->SetPhaseMask(1, true);                          break;                      case NPC_UROM:                          UromGUID = creature->GetGUID(); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp index 34c5344e1cf..8dd72e5d1a6 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp @@ -541,7 +541,6 @@ class spell_auriaya_sentinel_blast : public SpellScriptLoader          }  }; -  class achievement_nine_lives : public AchievementCriteriaScript  {      public: 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 8091f77a531..5f65d0ea89e 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp @@ -542,7 +542,7 @@ class boss_flame_leviathan : public CreatureScript              }              private: -                //! Copypasta from DoSpellAttackIfReady, only difference is the target - it cannot be selected trough getVictim this way - +                //! Copypasta from DoSpellAttackIfReady, only difference is the target - it cannot be selected trough GetVictim this way -                  //! I also removed the spellInfo check                  void DoBatteringRamIfReady()                  { @@ -1218,7 +1218,7 @@ class npc_lorekeeper : public CreatureScript                              if (Creature* Branz = creature->FindNearestCreature(NPC_BRANZ_BRONZBEARD, 1000, true))                              {                                  Delorah->GetMotionMaster()->MovePoint(0, Branz->GetPositionX()-4, Branz->GetPositionY(), Branz->GetPositionZ()); -                                /// @todo Delorah->AI()->Talk(xxxx, Branz->GetGUID()); when reached at branz +                                /// @todo Delorah->AI()->Talk(xxxx, Branz); when reached at branz                              }                          }                      } diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp index 6e0dbecafb4..ecc6de96daa 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp @@ -356,7 +356,6 @@ class spell_frost_tomb : public SpellScriptLoader          }  }; -  class achievement_on_the_rocks : public AchievementCriteriaScript  {      public: diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp index e54c8847d46..ebd0b4c0bb0 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp @@ -21,6 +21,11 @@  #include "SpellScript.h"  #include "SpellAuraEffects.h" +enum Spells +{ +    SPELL_UK_SECOUND_WIND_TRIGGER    = 42771 +}; +  uint32 ForgeSearch[3] =  {      GO_GLOWING_ANVIL_1, @@ -295,10 +300,56 @@ class npc_enslaved_proto_drake : public CreatureScript          }  }; +class spell_uk_second_wind_proc : public SpellScriptLoader +{ +    public: +        spell_uk_second_wind_proc() : SpellScriptLoader("spell_uk_second_wind_proc") { } + +        class spell_uk_second_wind_proc_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_uk_second_wind_proc_AuraScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_UK_SECOUND_WIND_TRIGGER)) +                    return false; +                return true; +            } + +            bool CheckProc(ProcEventInfo& eventInfo) +            { +                if (eventInfo.GetProcTarget() == GetTarget()) +                    return false; +                if (!(eventInfo.GetDamageInfo() || eventInfo.GetDamageInfo()->GetSpellInfo()->GetAllEffectsMechanicMask() & ((1 << MECHANIC_ROOT) | (1 << MECHANIC_STUN)))) +                    return false; +                return true; +            } + +            void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) +            { +                PreventDefaultAction(); +                GetTarget()->CastCustomSpell(SPELL_UK_SECOUND_WIND_TRIGGER, SPELLVALUE_BASE_POINT0, 5, GetTarget(), true, NULL, aurEff); +            } + +            void Register() override +            { +                DoCheckProc += AuraCheckProcFn(spell_uk_second_wind_proc_AuraScript::CheckProc); +                OnEffectProc += AuraEffectProcFn(spell_uk_second_wind_proc_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); +            } + +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_uk_second_wind_proc_AuraScript(); +        } +}; +  void AddSC_utgarde_keep()  {      new npc_dragonflayer_forge_master();      new npc_enslaved_proto_drake();      new spell_ticking_time_bomb();      new spell_fixate(); +    new spell_uk_second_wind_proc();  } diff --git a/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp b/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp index 7ae1c7840db..753d4ebea01 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp @@ -190,7 +190,8 @@ public:          {              summon->AI()->AttackStart(me->GetVictim());              summon->CastSpell((Unit*)NULL, SPELL_ZURAMAT_ADD_2); -            summon->SetPhaseMask(17, true); +            summon->SetInPhase(169, true, true); // Normal phase +            summon->SetInPhase(173, true, true); // Void phase          }      }; diff --git a/src/server/scripts/Northrend/isle_of_conquest.cpp b/src/server/scripts/Northrend/isle_of_conquest.cpp index 14763577c66..84541eb7b99 100644 --- a/src/server/scripts/Northrend/isle_of_conquest.cpp +++ b/src/server/scripts/Northrend/isle_of_conquest.cpp @@ -124,7 +124,7 @@ class spell_ioc_parachute_ic : public SpellScriptLoader              void HandleTriggerSpell(AuraEffect const* /*aurEff*/)              {                  if (Player* target = GetTarget()->ToPlayer()) -                    if (target->m_movementInfo.fallTime > 2000) +                    if (target->m_movementInfo.GetFallTime() > 2000)                          target->CastSpell(target, SPELL_PARACHUTE_IC, true);              } diff --git a/src/server/scripts/Northrend/zone_borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp index f02edbb5584..a83f4feb70a 100644 --- a/src/server/scripts/Northrend/zone_borean_tundra.cpp +++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp @@ -1733,7 +1733,7 @@ public:                      me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION);                      break;                  case 20: -                    me->SetPhaseMask(1, true); +                    me->SetInPhase(170, true, false);                      Talk(SAY_5);                      me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION);                      player->GroupEventHappens(QUEST_ESCAPING_THE_MIST, me); diff --git a/src/server/scripts/Northrend/zone_dalaran.cpp b/src/server/scripts/Northrend/zone_dalaran.cpp index fb5e63a2301..27d3e6dadc6 100644 --- a/src/server/scripts/Northrend/zone_dalaran.cpp +++ b/src/server/scripts/Northrend/zone_dalaran.cpp @@ -128,50 +128,6 @@ public:      }  }; -/*###### -## npc_hira_snowdawn -######*/ - -enum HiraSnowdawn -{ -    SPELL_COLD_WEATHER_FLYING              = 54197 -}; - -#define GOSSIP_TEXT_TRAIN_HIRA "I seek training to ride a steed." - -class npc_hira_snowdawn : public CreatureScript -{ -public: -    npc_hira_snowdawn() : CreatureScript("npc_hira_snowdawn") { } - -    bool OnGossipHello(Player* player, Creature* creature) override -    { -        if (!creature->IsVendor() || !creature->IsTrainer()) -            return false; - -        player->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, GOSSIP_TEXT_TRAIN_HIRA, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); - -        if (player->getLevel() >= 80 && player->HasSpell(SPELL_COLD_WEATHER_FLYING)) -            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - -        player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); - -        return true; -    } - -    bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override -    { -        player->PlayerTalkClass->ClearMenus(); -        if (action == GOSSIP_ACTION_TRAIN) -            player->GetSession()->SendTrainerList(creature->GetGUID()); - -        if (action == GOSSIP_ACTION_TRADE) -            player->GetSession()->SendListInventory(creature->GetGUID()); - -        return true; -    } -}; -  enum MinigobData  {      ZONE_DALARAN            = 4395, @@ -284,7 +240,6 @@ class npc_minigob_manabonk : public CreatureScript  void AddSC_dalaran()  { -    new npc_mageguard_dalaran; -    new npc_hira_snowdawn; +    new npc_mageguard_dalaran();      new npc_minigob_manabonk();  } diff --git a/src/server/scripts/OutdoorPvP/CMakeLists.txt b/src/server/scripts/OutdoorPvP/CMakeLists.txt index 01347e134ea..3c22f1431d8 100644 --- a/src/server/scripts/OutdoorPvP/CMakeLists.txt +++ b/src/server/scripts/OutdoorPvP/CMakeLists.txt @@ -17,8 +17,6 @@ set(scripts_STAT_SRCS    OutdoorPvP/OutdoorPvPNA.cpp    OutdoorPvP/OutdoorPvPHP.cpp    OutdoorPvP/OutdoorPvPTF.h -  OutdoorPvP/OutdoorPvPEP.h -  OutdoorPvP/OutdoorPvPEP.cpp    OutdoorPvP/OutdoorPvPHP.h    OutdoorPvP/OutdoorPvPZM.h    OutdoorPvP/OutdoorPvPNA.h diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPEP.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPEP.cpp deleted file mode 100644 index 4fb84fa0759..00000000000 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPEP.cpp +++ /dev/null @@ -1,620 +0,0 @@ -/* - * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "ScriptMgr.h" -#include "OutdoorPvPEP.h" -#include "WorldPacket.h" -#include "Player.h" -#include "GameObject.h" -#include "ObjectMgr.h" -#include "ObjectAccessor.h" -#include "OutdoorPvPMgr.h" -#include "Creature.h" -#include "GossipDef.h" - -OPvPCapturePointEP_EWT::OPvPCapturePointEP_EWT(OutdoorPvP* pvp) -: OPvPCapturePoint(pvp), m_TowerState(EP_TS_N), m_UnitsSummonedSide(0) -{ -    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); -} - -void OPvPCapturePointEP_EWT::ChangeState() -{ -    // if changing from controlling alliance to horde or vice versa -    if (m_OldState == OBJECTIVESTATE_ALLIANCE || m_OldState == OBJECTIVESTATE_HORDE) -        ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_EWT, 0); - -    uint32 artkit = 21; - -    switch (m_State) -    { -        case OBJECTIVESTATE_ALLIANCE: -            m_TowerState = EP_TS_A; -            artkit = 2; -            SummonSupportUnitAtNorthpassTower(ALLIANCE); -            ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_EWT, ALLIANCE); -            m_PvP->SendDefenseMessage(EP_GraveYardZone, TEXT_EASTWALL_TOWER_TAKEN_ALLIANCE); -            break; -        case OBJECTIVESTATE_HORDE: -            m_TowerState = EP_TS_H; -            artkit = 1; -            SummonSupportUnitAtNorthpassTower(HORDE); -            ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_EWT, HORDE); -            m_PvP->SendDefenseMessage(EP_GraveYardZone, TEXT_EASTWALL_TOWER_TAKEN_HORDE); -            break; -        case OBJECTIVESTATE_NEUTRAL: -            m_TowerState = EP_TS_N; -            break; -        case OBJECTIVESTATE_NEUTRAL_ALLIANCE_CHALLENGE: -        case OBJECTIVESTATE_HORDE_ALLIANCE_CHALLENGE: -            m_TowerState = EP_TS_N_A; -            break; -        case OBJECTIVESTATE_NEUTRAL_HORDE_CHALLENGE: -        case OBJECTIVESTATE_ALLIANCE_HORDE_CHALLENGE: -            m_TowerState = EP_TS_N_H; -            break; -    } - -    GameObject* flag = HashMapHolder<GameObject>::Find(m_capturePointGUID); -    GameObject* flag2 = HashMapHolder<GameObject>::Find(m_Objects[EP_EWT_FLAGS]); -    if (flag) -    { -        flag->SetGoArtKit(artkit); -    } -    if (flag2) -    { -        flag2->SetGoArtKit(artkit); -    } - -    UpdateTowerState(); - -    // complete quest objective -    if (m_TowerState == EP_TS_A || m_TowerState == EP_TS_H) -        SendObjectiveComplete(EP_EWT_CM, 0); -} - -void OPvPCapturePointEP_EWT::FillInitialWorldStates(WorldPacket &data) -{ -    data << EP_EWT_A << uint32((m_TowerState & EP_TS_A) != 0); -    data << EP_EWT_H << uint32((m_TowerState & EP_TS_H) != 0); -    data << EP_EWT_N_A << uint32((m_TowerState & EP_TS_N_A) != 0); -    data << EP_EWT_N_H << uint32((m_TowerState & EP_TS_N_H) != 0); -    data << EP_EWT_N << uint32((m_TowerState & EP_TS_N) != 0); -} - -void OPvPCapturePointEP_EWT::UpdateTowerState() -{ -    m_PvP->SendUpdateWorldState(EP_EWT_A, (m_TowerState & EP_TS_A) != 0); -    m_PvP->SendUpdateWorldState(EP_EWT_H, (m_TowerState & EP_TS_H) != 0); -    m_PvP->SendUpdateWorldState(EP_EWT_N_A, (m_TowerState & EP_TS_N_A) != 0); -    m_PvP->SendUpdateWorldState(EP_EWT_N_H, (m_TowerState & EP_TS_N_H) != 0); -    m_PvP->SendUpdateWorldState(EP_EWT_N, (m_TowerState & EP_TS_N) != 0); -} - -void OPvPCapturePointEP_EWT::SummonSupportUnitAtNorthpassTower(uint32 team) -{ -    if (m_UnitsSummonedSide != team) -    { -        m_UnitsSummonedSide = team; -        creature_type const* ct = nullptr; -        if (team == ALLIANCE) -            ct = EP_EWT_Summons_A; -        else -            ct = EP_EWT_Summons_H; - -        for (uint8 i = 0; i < EP_EWT_NUM_CREATURES; ++i) -        { -            DelCreature(i); -            AddCreature(i, ct[i].entry, ct[i].map, ct[i].x, ct[i].y, ct[i].z, ct[i].o, OutdoorPvP::GetTeamIdByTeam(team), 1000000); -        } -    } -} - -// NPT -OPvPCapturePointEP_NPT::OPvPCapturePointEP_NPT(OutdoorPvP* pvp) -: OPvPCapturePoint(pvp), m_TowerState(EP_TS_N), m_SummonedGOSide(0) -{ -    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); -} - -void OPvPCapturePointEP_NPT::ChangeState() -{ -    // if changing from controlling alliance to horde or vice versa -    if (m_OldState == OBJECTIVESTATE_ALLIANCE || m_OldState == OBJECTIVESTATE_HORDE) -        ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_NPT, 0); - -    uint32 artkit = 21; - -    switch (m_State) -    { -        case OBJECTIVESTATE_ALLIANCE: -            m_TowerState = EP_TS_A; -            artkit = 2; -            SummonGO(ALLIANCE); -            ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_NPT, ALLIANCE); -            m_PvP->SendDefenseMessage(EP_GraveYardZone, TEXT_NORTHPASS_TOWER_TAKEN_ALLIANCE); -            break; -        case OBJECTIVESTATE_HORDE: -            m_TowerState = EP_TS_H; -            artkit = 1; -            SummonGO(HORDE); -            ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_NPT, HORDE); -            m_PvP->SendDefenseMessage(EP_GraveYardZone, TEXT_NORTHPASS_TOWER_TAKEN_HORDE); -            break; -        case OBJECTIVESTATE_NEUTRAL: -            m_TowerState = EP_TS_N; -            m_SummonedGOSide = 0; -            DelObject(EP_NPT_BUFF); -            break; -        case OBJECTIVESTATE_NEUTRAL_ALLIANCE_CHALLENGE: -            m_TowerState = EP_TS_N_A; -            break; -        case OBJECTIVESTATE_HORDE_ALLIANCE_CHALLENGE: -            m_TowerState = EP_TS_N_A; -            m_SummonedGOSide = 0; -            DelObject(EP_NPT_BUFF); -            break; -        case OBJECTIVESTATE_NEUTRAL_HORDE_CHALLENGE: -            m_TowerState = EP_TS_N_H; -            break; -        case OBJECTIVESTATE_ALLIANCE_HORDE_CHALLENGE: -            m_TowerState = EP_TS_N_H; -            m_SummonedGOSide = 0; -            DelObject(EP_NPT_BUFF); -            break; -    } - -    GameObject* flag = HashMapHolder<GameObject>::Find(m_capturePointGUID); -    GameObject* flag2 = HashMapHolder<GameObject>::Find(m_Objects[EP_NPT_FLAGS]); -    if (flag) -    { -        flag->SetGoArtKit(artkit); -    } -    if (flag2) -    { -        flag2->SetGoArtKit(artkit); -    } - -    UpdateTowerState(); - -    // complete quest objective -    if (m_TowerState == EP_TS_A || m_TowerState == EP_TS_H) -        SendObjectiveComplete(EP_NPT_CM, 0); -} - -void OPvPCapturePointEP_NPT::FillInitialWorldStates(WorldPacket &data) -{ -    data << EP_NPT_A << uint32((m_TowerState & EP_TS_A) != 0); -    data << EP_NPT_H << uint32((m_TowerState & EP_TS_H) != 0); -    data << EP_NPT_N_A << uint32((m_TowerState & EP_TS_N_A) != 0); -    data << EP_NPT_N_H << uint32((m_TowerState & EP_TS_N_H) != 0); -    data << EP_NPT_N << uint32((m_TowerState & EP_TS_N) != 0); -} - -void OPvPCapturePointEP_NPT::UpdateTowerState() -{ -    m_PvP->SendUpdateWorldState(EP_NPT_A, (m_TowerState & EP_TS_A) != 0); -    m_PvP->SendUpdateWorldState(EP_NPT_H, (m_TowerState & EP_TS_H) != 0); -    m_PvP->SendUpdateWorldState(EP_NPT_N_A, (m_TowerState & EP_TS_N_A) != 0); -    m_PvP->SendUpdateWorldState(EP_NPT_N_H, (m_TowerState & EP_TS_N_H) != 0); -    m_PvP->SendUpdateWorldState(EP_NPT_N, (m_TowerState & EP_TS_N) != 0); -} - -void OPvPCapturePointEP_NPT::SummonGO(uint32 team) -{ -    if (m_SummonedGOSide != team) -    { -        m_SummonedGOSide = team; -        DelObject(EP_NPT_BUFF); -        AddObject(EP_NPT_BUFF, EP_NPT_LordaeronShrine.entry, EP_NPT_LordaeronShrine.map, EP_NPT_LordaeronShrine.x, EP_NPT_LordaeronShrine.y, EP_NPT_LordaeronShrine.z, EP_NPT_LordaeronShrine.o, EP_NPT_LordaeronShrine.rot0, EP_NPT_LordaeronShrine.rot1, EP_NPT_LordaeronShrine.rot2, EP_NPT_LordaeronShrine.rot3); -        GameObject* go = HashMapHolder<GameObject>::Find(m_Objects[EP_NPT_BUFF]); -        if (go) -            go->SetUInt32Value(GAMEOBJECT_FACTION, (team == ALLIANCE ? 84 : 83)); -    } -} - -// CGT -OPvPCapturePointEP_CGT::OPvPCapturePointEP_CGT(OutdoorPvP* pvp) -: OPvPCapturePoint(pvp), m_TowerState(EP_TS_N), m_GraveyardSide(0) -{ -    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); -} - -void OPvPCapturePointEP_CGT::ChangeState() -{ -    // if changing from controlling alliance to horde or vice versa -    if (m_OldState == OBJECTIVESTATE_ALLIANCE || m_OldState == OBJECTIVESTATE_HORDE) -        ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_CGT, 0); - -    uint32 artkit = 21; - -    switch (m_State) -    { -        case OBJECTIVESTATE_ALLIANCE: -            m_TowerState = EP_TS_A; -            artkit = 2; -            LinkGraveYard(ALLIANCE); -            ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_CGT, ALLIANCE); -            m_PvP->SendDefenseMessage(EP_GraveYardZone, TEXT_CROWN_GUARD_TOWER_TAKEN_ALLIANCE); -            break; -        case OBJECTIVESTATE_HORDE: -            m_TowerState = EP_TS_H; -            artkit = 1; -            LinkGraveYard(HORDE); -            ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_CGT, HORDE); -            m_PvP->SendDefenseMessage(EP_GraveYardZone, TEXT_CROWN_GUARD_TOWER_TAKEN_HORDE); -            break; -        case OBJECTIVESTATE_NEUTRAL: -            m_TowerState = EP_TS_N; -            break; -        case OBJECTIVESTATE_NEUTRAL_ALLIANCE_CHALLENGE: -        case OBJECTIVESTATE_HORDE_ALLIANCE_CHALLENGE: -            m_TowerState = EP_TS_N_A; -            break; -        case OBJECTIVESTATE_NEUTRAL_HORDE_CHALLENGE: -        case OBJECTIVESTATE_ALLIANCE_HORDE_CHALLENGE: -            m_TowerState = EP_TS_N_H; -            break; -    } - -    GameObject* flag = HashMapHolder<GameObject>::Find(m_capturePointGUID); -    GameObject* flag2 = HashMapHolder<GameObject>::Find(m_Objects[EP_CGT_FLAGS]); -    if (flag) -    { -        flag->SetGoArtKit(artkit); -    } -    if (flag2) -    { -        flag2->SetGoArtKit(artkit); -    } - -    UpdateTowerState(); - -    // complete quest objective -    if (m_TowerState == EP_TS_A || m_TowerState == EP_TS_H) -        SendObjectiveComplete(EP_CGT_CM, 0); -} - -void OPvPCapturePointEP_CGT::FillInitialWorldStates(WorldPacket &data) -{ -    data << EP_CGT_A << uint32((m_TowerState & EP_TS_A) != 0); -    data << EP_CGT_H << uint32((m_TowerState & EP_TS_H) != 0); -    data << EP_CGT_N_A << uint32((m_TowerState & EP_TS_N_A) != 0); -    data << EP_CGT_N_H << uint32((m_TowerState & EP_TS_N_H) != 0); -    data << EP_CGT_N << uint32((m_TowerState & EP_TS_N) != 0); -} - -void OPvPCapturePointEP_CGT::UpdateTowerState() -{ -    m_PvP->SendUpdateWorldState(EP_CGT_A, (m_TowerState & EP_TS_A) != 0); -    m_PvP->SendUpdateWorldState(EP_CGT_H, (m_TowerState & EP_TS_H) != 0); -    m_PvP->SendUpdateWorldState(EP_CGT_N_A, (m_TowerState & EP_TS_N_A) != 0); -    m_PvP->SendUpdateWorldState(EP_CGT_N_H, (m_TowerState & EP_TS_N_H) != 0); -    m_PvP->SendUpdateWorldState(EP_CGT_N, (m_TowerState & EP_TS_N) != 0); -} - -void OPvPCapturePointEP_CGT::LinkGraveYard(uint32 team) -{ -    if (m_GraveyardSide != team) -    { -        m_GraveyardSide = team; -        sObjectMgr->RemoveGraveYardLink(EP_GraveYardId, EP_GraveYardZone, team, false); -        sObjectMgr->AddGraveYardLink(EP_GraveYardId, EP_GraveYardZone, team, false); -    } -} - -// PWT -OPvPCapturePointEP_PWT::OPvPCapturePointEP_PWT(OutdoorPvP* pvp) -: OPvPCapturePoint(pvp), m_FlightMasterSpawned(0), 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); -} - -void OPvPCapturePointEP_PWT::ChangeState() -{ -    // if changing from controlling alliance to horde or vice versa -    if ( m_OldState == OBJECTIVESTATE_ALLIANCE || m_OldState == OBJECTIVESTATE_HORDE) -        ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_PWT, 0); - -    uint32 artkit = 21; - -    switch (m_State) -    { -        case OBJECTIVESTATE_ALLIANCE: -            m_TowerState = EP_TS_A; -            SummonFlightMaster(ALLIANCE); -            artkit = 2; -            ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_PWT, ALLIANCE); -            m_PvP->SendDefenseMessage(EP_GraveYardZone, TEXT_PLAGUEWOOD_TOWER_TAKEN_ALLIANCE); -            break; -        case OBJECTIVESTATE_HORDE: -            m_TowerState = EP_TS_H; -            SummonFlightMaster(HORDE); -            artkit = 1; -            ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_PWT, HORDE); -            m_PvP->SendDefenseMessage(EP_GraveYardZone, TEXT_PLAGUEWOOD_TOWER_TAKEN_HORDE); -            break; -        case OBJECTIVESTATE_NEUTRAL: -            m_TowerState = EP_TS_N; -            DelCreature(EP_PWT_FLIGHTMASTER); -            m_FlightMasterSpawned = 0; -            break; -        case OBJECTIVESTATE_NEUTRAL_ALLIANCE_CHALLENGE: -            m_TowerState = EP_TS_N_A; -            break; -        case OBJECTIVESTATE_HORDE_ALLIANCE_CHALLENGE: -            m_TowerState = EP_TS_N_A; -            DelCreature(EP_PWT_FLIGHTMASTER); -            m_FlightMasterSpawned = 0; -            break; -        case OBJECTIVESTATE_NEUTRAL_HORDE_CHALLENGE: -            m_TowerState = EP_TS_N_H; -            break; -        case OBJECTIVESTATE_ALLIANCE_HORDE_CHALLENGE: -            m_TowerState = EP_TS_N_H; -            DelCreature(EP_PWT_FLIGHTMASTER); -            m_FlightMasterSpawned = 0; -            break; -    } - -    GameObject* flag = HashMapHolder<GameObject>::Find(m_capturePointGUID); -    GameObject* flag2 = HashMapHolder<GameObject>::Find(m_Objects[EP_PWT_FLAGS]); -    if (flag) -    { -        flag->SetGoArtKit(artkit); -    } -    if (flag2) -    { -        flag2->SetGoArtKit(artkit); -    } - -    UpdateTowerState(); - -    // complete quest objective -    if (m_TowerState == EP_TS_A || m_TowerState == EP_TS_H) -        SendObjectiveComplete(EP_PWT_CM, 0); -} - -void OPvPCapturePointEP_PWT::FillInitialWorldStates(WorldPacket &data) -{ -    data << EP_PWT_A << uint32((m_TowerState & EP_TS_A) != 0); -    data << EP_PWT_H << uint32((m_TowerState & EP_TS_H) != 0); -    data << EP_PWT_N_A << uint32((m_TowerState & EP_TS_N_A) != 0); -    data << EP_PWT_N_H << uint32((m_TowerState & EP_TS_N_H) != 0); -    data << EP_PWT_N << uint32((m_TowerState & EP_TS_N) != 0); -} - -void OPvPCapturePointEP_PWT::UpdateTowerState() -{ -    m_PvP->SendUpdateWorldState(EP_PWT_A, (m_TowerState & EP_TS_A) != 0); -    m_PvP->SendUpdateWorldState(EP_PWT_H, (m_TowerState & EP_TS_H) != 0); -    m_PvP->SendUpdateWorldState(EP_PWT_N_A, (m_TowerState & EP_TS_N_A) != 0); -    m_PvP->SendUpdateWorldState(EP_PWT_N_H, (m_TowerState & EP_TS_N_H) != 0); -    m_PvP->SendUpdateWorldState(EP_PWT_N, (m_TowerState & EP_TS_N) != 0); -} - -void OPvPCapturePointEP_PWT::SummonFlightMaster(uint32 team) -{ -    if (m_FlightMasterSpawned != team) -    { -        m_FlightMasterSpawned = team; -        DelCreature(EP_PWT_FLIGHTMASTER); -        AddCreature(EP_PWT_FLIGHTMASTER, EP_PWT_FlightMaster.entry, EP_PWT_FlightMaster.map, EP_PWT_FlightMaster.x, EP_PWT_FlightMaster.y, EP_PWT_FlightMaster.z, EP_PWT_FlightMaster.o, OutdoorPvP::GetTeamIdByTeam(team)); -        /* -        // sky - we need update gso code - -        Creature* c = HashMapHolder<Creature>::Find(m_Creatures[EP_PWT_FLIGHTMASTER]); -        //Spawn flight master as friendly to capturing team -        c->SetUInt32Value(GAMEOBJECT_FACTION, (team == ALLIANCE ? 55 : 68)); -        if (c) -        { -            GossipOption gso; -            gso.Action = GOSSIP_OPTION_OUTDOORPVP; -            gso.GossipId = 0; -            gso.OptionText.assign(sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_FLIGHT_NPT)); -            gso.Id = 50; -            gso.Icon = 0; -            gso.NpcFlag = 0; -            gso.BoxMoney = 0; -            gso.Coded = false; -            c->addGossipOption(gso); - -            gso.Action = GOSSIP_OPTION_OUTDOORPVP; -            gso.GossipId = 0; -            gso.OptionText.assign(sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_FLIGHT_EWT)); -            gso.Id = 50; -            gso.Icon = 0; -            gso.NpcFlag = 0; -            gso.BoxMoney = 0; -            gso.Coded = false; -            c->addGossipOption(gso); - -            gso.Action = GOSSIP_OPTION_OUTDOORPVP; -            gso.GossipId = 0; -            gso.OptionText.assign(sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_FLIGHT_CGT)); -            gso.Id = 50; -            gso.Icon = 0; -            gso.NpcFlag = 0; -            gso.BoxMoney = 0; -            gso.Coded = false; -            c->addGossipOption(gso); -        } -        */ -    } -} - -// ep -OutdoorPvPEP::OutdoorPvPEP() -{ -    m_TypeId = OUTDOOR_PVP_EP; -    memset(EP_Controls, 0, sizeof(EP_Controls)); -    m_AllianceTowersControlled = 0; -    m_HordeTowersControlled = 0; -} - -bool OutdoorPvPEP::SetupOutdoorPvP() -{ -    for (uint8 i = 0; i < EPBuffZonesNum; ++i) -        RegisterZone(EPBuffZones[i]); - -    AddCapturePoint(new OPvPCapturePointEP_EWT(this)); -    AddCapturePoint(new OPvPCapturePointEP_PWT(this)); -    AddCapturePoint(new OPvPCapturePointEP_CGT(this)); -    AddCapturePoint(new OPvPCapturePointEP_NPT(this)); -    return true; -} - -bool OutdoorPvPEP::Update(uint32 diff) -{ -    if (OutdoorPvP::Update(diff)) -    { -        m_AllianceTowersControlled = 0; -        m_HordeTowersControlled = 0; -        for (int i = 0; i < EP_TOWER_NUM; ++i) -        { -            if (EP_Controls[i] == ALLIANCE) -                ++m_AllianceTowersControlled; -            else if (EP_Controls[i] == HORDE) -                ++m_HordeTowersControlled; -            SendUpdateWorldState(EP_UI_TOWER_COUNT_A, m_AllianceTowersControlled); -            SendUpdateWorldState(EP_UI_TOWER_COUNT_H, m_HordeTowersControlled); -            BuffTeams(); -        } -        return true; -    } -    return false; -} - -void OutdoorPvPEP::HandlePlayerEnterZone(Player* player, uint32 zone) -{ -    // add buffs -    if (player->GetTeam() == ALLIANCE) -    { -        if (m_AllianceTowersControlled && m_AllianceTowersControlled < 5) -            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); -    } -    OutdoorPvP::HandlePlayerEnterZone(player, zone); -} - -void OutdoorPvPEP::HandlePlayerLeaveZone(Player* player, uint32 zone) -{ -    // remove buffs -    if (player->GetTeam() == ALLIANCE) -    { -        for (int i = 0; i < 4; ++i) -            player->RemoveAurasDueToSpell(EP_AllianceBuffs[i]); -    } -    else -    { -        for (int i = 0; i < 4; ++i) -            player->RemoveAurasDueToSpell(EP_HordeBuffs[i]); -    } -    OutdoorPvP::HandlePlayerLeaveZone(player, zone); -} - -void OutdoorPvPEP::BuffTeams() -{ -    for (PlayerSet::iterator itr = m_players[0].begin(); itr != m_players[0].end(); ++itr) -    { -        if (Player* player = ObjectAccessor::FindPlayer(*itr)) -        { -            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); -        } -    } -    for (PlayerSet::iterator itr = m_players[1].begin(); itr != m_players[1].end(); ++itr) -    { -        if (Player* player = ObjectAccessor::FindPlayer(*itr)) -        { -            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); -        } -    } -} - -void OutdoorPvPEP::SetControlledState(uint32 index, uint32 state) -{ -    EP_Controls[index] = state; -} - -void OutdoorPvPEP::FillInitialWorldStates(WorldPacket & data) -{ -    data << EP_UI_TOWER_COUNT_A << m_AllianceTowersControlled; -    data << EP_UI_TOWER_COUNT_H << m_HordeTowersControlled; - -    for (OPvPCapturePointMap::iterator itr = m_capturePoints.begin(); itr != m_capturePoints.end(); ++itr) -        itr->second->FillInitialWorldStates(data); -} - -void OutdoorPvPEP::SendRemoveWorldStates(Player* player) -{ -    player->SendUpdateWorldState(EP_UI_TOWER_COUNT_A, 0); -    player->SendUpdateWorldState(EP_UI_TOWER_COUNT_H, 0); - -    player->SendUpdateWorldState(EP_EWT_A, 0); -    player->SendUpdateWorldState(EP_EWT_H, 0); -    player->SendUpdateWorldState(EP_EWT_N, 0); -    player->SendUpdateWorldState(EP_EWT_N_A, 0); -    player->SendUpdateWorldState(EP_EWT_N_H, 0); - -    player->SendUpdateWorldState(EP_PWT_A, 0); -    player->SendUpdateWorldState(EP_PWT_H, 0); -    player->SendUpdateWorldState(EP_PWT_N, 0); -    player->SendUpdateWorldState(EP_PWT_N_A, 0); -    player->SendUpdateWorldState(EP_PWT_N_H, 0); - -    player->SendUpdateWorldState(EP_NPT_A, 0); -    player->SendUpdateWorldState(EP_NPT_H, 0); -    player->SendUpdateWorldState(EP_NPT_N, 0); -    player->SendUpdateWorldState(EP_NPT_N_A, 0); -    player->SendUpdateWorldState(EP_NPT_N_H, 0); - -    player->SendUpdateWorldState(EP_CGT_A, 0); -    player->SendUpdateWorldState(EP_CGT_H, 0); -    player->SendUpdateWorldState(EP_CGT_N, 0); -    player->SendUpdateWorldState(EP_CGT_N_A, 0); -    player->SendUpdateWorldState(EP_CGT_N_H, 0); -} - -class OutdoorPvP_eastern_plaguelands : public OutdoorPvPScript -{ -    public: -        OutdoorPvP_eastern_plaguelands() : OutdoorPvPScript("outdoorpvp_ep") { } - -        OutdoorPvP* GetOutdoorPvP() const override -        { -            return new OutdoorPvPEP(); -        } -}; - -void AddSC_outdoorpvp_ep() -{ -    new OutdoorPvP_eastern_plaguelands(); -} diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPEP.h b/src/server/scripts/OutdoorPvP/OutdoorPvPEP.h deleted file mode 100644 index f6a2354263d..00000000000 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPEP.h +++ /dev/null @@ -1,302 +0,0 @@ -/* - * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef OUTDOOR_PVP_EP_ -#define OUTDOOR_PVP_EP_ - -#include "OutdoorPvP.h" - -enum DefenseMessages -{ -    TEXT_PLAGUEWOOD_TOWER_TAKEN_ALLIANCE    = 13629, // '|cffffff00The Plaguewood Tower has been taken by the Alliance!|r' -    TEXT_NORTHPASS_TOWER_TAKEN_ALLIANCE     = 13630, // '|cffffff00Northpass Tower has been taken by the Alliance!|r' -    TEXT_EASTWALL_TOWER_TAKEN_ALLIANCE      = 13631, // '|cffffff00Eastwall Tower has been taken by the Alliance!|r' -    TEXT_CROWN_GUARD_TOWER_TAKEN_ALLIANCE   = 13632, // '|cffffff00Crown Guard Tower has been taken by the Alliance!|r' -    TEXT_PLAGUEWOOD_TOWER_TAKEN_HORDE       = 13634, // '|cffffff00The Plaguewood Tower has been taken by the Horde!|r' -    TEXT_NORTHPASS_TOWER_TAKEN_HORDE        = 13635, // '|cffffff00Northpass Tower has been taken by the Horde!|r' -    TEXT_EASTWALL_TOWER_TAKEN_HORDE         = 13636, // '|cffffff00Eastwall Tower has been taken by the Horde!|r' -    TEXT_CROWN_GUARD_TOWER_TAKEN_HORDE      = 13633, // '|cffffff00Crown Guard Tower has been taken by the Horde!|r' -    TEXT_ALL_TOWERS_IN_CONTROL_ALLIANCE     = 13638, // (NYI) '|cff33ccffAll four towers are now in control of the Alliance!|r' -    TEXT_ALL_TOWERS_IN_CONTROL_HORDE        = 13637, // (NYI) '|cffff0000All four towers are now in control of the Horde!|r' -}; - -const uint32 EP_AllianceBuffs[4] = {11413, 11414, 11415, 1386}; - -const uint32 EP_HordeBuffs[4] = {30880, 30683, 30682, 29520}; - -const uint32 EP_GraveYardZone = 139; - -const uint32 EP_GraveYardId = 927; - -const uint8 EPBuffZonesNum = 3; - -const uint32 EP_EWT_CM = 17690; -const uint32 EP_CGT_CM = 17689; -const uint32 EP_NPT_CM = 17696; -const uint32 EP_PWT_CM = 17698; - -const uint32 EPBuffZones[EPBuffZonesNum] = {139, 2017, 2057}; - -enum EP_TaxiNodes -{ -    EP_CGT_Taxi = 87, -    EP_EWT_Taxi = 86, -    EP_NPT_Taxi = 85, -    EP_PWT_Taxi = 84 -}; - -enum EP_EastwallTowerWorldStates -{ -    EP_EWT_A = 2354, -    EP_EWT_H = 2356, -    EP_EWT_N_A = 2359, // ally conquested -    EP_EWT_N_H = 2360, -    EP_EWT_N = 2361 -}; - -enum EP_NorthpassTowerWorldStates -{ -    EP_NPT_N = 2352, -    EP_NPT_N_A = 2362, -    EP_NPT_N_H = 2363, -    EP_NPT_A = 2372, -    EP_NPT_H = 2373 -}; - -enum EP_PlagewoodTowerWorldStates -{ -    EP_PWT_N_A = 2366, -    EP_PWT_N_H = 2353, //2367 not present! use neutral! -    EP_PWT_A = 2370, -    EP_PWT_H = 2371, -    EP_PWT_N = 2353 -}; - -enum EP_CrownGuardTowerWorldStates -{ -    EP_CGT_N_A = 2374, -    EP_CGT_N_H = 2375, -    EP_CGT_A = 2378, -    EP_CGT_H = 2379, -    EP_CGT_N = 2355 -}; - -enum EP_WorldStates -{ -    EP_UI_TOWER_COUNT_A = 2327, -    EP_UI_TOWER_COUNT_H = 2328 -}; - -enum EP_Summons -{ -    EP_EWT_COMMANDER = 0, -    EP_EWT_SOLDIER1, -    EP_EWT_SOLDIER2, -    EP_EWT_SOLDIER3, -    EP_EWT_SOLDIER4, -    EP_PWT_FLIGHTMASTER, -}; - -enum EP_GoSummons -{ -    EP_NPT_BUFF = 0, -    EP_NPT_FLAGS, -    EP_EWT_FLAGS, -    EP_CGT_FLAGS, -    EP_PWT_FLAGS -}; - -enum EP_Towers -{ -    EP_EWT = 0, // plaguelands 03 -    EP_NPT, // plaguelands 01 -    EP_PWT, // plaguelands 04 -    EP_CGT, // plaguelands 02 -    EP_TOWER_NUM -}; - -const go_type EPCapturePoints[EP_TOWER_NUM] = -{ -    {182097, 0, 2574.51f, -4794.89f, 144.704f, -1.45003f, -0.097056f, 0.095578f, -0.656229f, 0.742165f}, -    {181899, 0, 3181.08f, -4379.36f, 174.123f, -2.03472f, -0.065392f, 0.119494f, -0.842275f, 0.521553f}, -    {182098, 0, 2962.71f, -3042.31f, 154.789f, 2.08426f, -0.074807f, -0.113837f, 0.855928f, 0.49883f}, -    {182096, 0, 1860.85f, -3731.23f, 196.716f, -2.53214f, 0.033967f, -0.131914f, 0.944741f, -0.298177f} -}; - -const go_type EPTowerFlags[EP_TOWER_NUM] = -{ -    {182106, 0, 2569.60f, -4772.93f, 115.399f, 2.72271f, 0.0f, 0.0f, 0.978148f, 0.207912f}, -    {182106, 0, 3148.17f, -4365.51f, 145.029f, 1.53589f, 0.0f, 0.0f, 0.694658f, 0.71934f}, -    {182106, 0, 2992.63f, -3022.95f, 125.593f, 3.03687f, 0.0f, 0.0f, 0.99863f, 0.052336f}, -    {182106, 0, 1838.42f, -3703.56f, 167.713f, 0.890118f, 0.0f, 0.0f, 0.430511f, 0.902585f} -}; - -const uint32 EPTowerPlayerEnterEvents[EP_TOWER_NUM] = {10691, 10699, 10701, 10705}; - -const uint32 EPTowerPlayerLeaveEvents[EP_TOWER_NUM] = {10692, 10698, 10700, 10704}; - -const uint8 EP_NUM_CREATURES = 6; -const uint8 EP_EWT_NUM_CREATURES = 5; - -// one lordaeron commander, 4 soldiers -// should be spawned at EWT and follow a path, but trans-grid pathing isn't safe, so summon them directly at NPT -const creature_type EP_EWT_Summons_A[EP_EWT_NUM_CREATURES] = -{ -    {17635, 0, 3167.61f, -4352.09f, 138.20f, 4.5811f}, -    {17647, 0, 3172.74f, -4352.99f, 139.14f, 4.9873f}, -    {17647, 0, 3165.89f, -4354.46f, 138.67f, 3.7244f}, -    {17647, 0, 3164.65f, -4350.26f, 138.22f, 2.4794f}, -    {17647, 0, 3169.91f, -4349.68f, 138.37f, 0.7444f} -}; - -const creature_type EP_EWT_Summons_H[EP_EWT_NUM_CREATURES] = -{ -    {17995, 0, 3167.61f, -4352.09f, 138.20f, 4.5811f}, -    {17996, 0, 3172.74f, -4352.99f, 139.14f, 4.9873f}, -    {17996, 0, 3165.89f, -4354.46f, 138.67f, 3.7244f}, -    {17996, 0, 3164.65f, -4350.26f, 138.22f, 2.4794f}, -    {17996, 0, 3169.91f, -4349.68f, 138.37f, 0.7444f} -}; - -enum EP_TowerStates -{ -    EP_TS_N = 1, -    EP_TS_N_A = 2, -    EP_TS_N_H = 4, -    EP_TS_A_P = 8, -    EP_TS_H_P = 16, -    EP_TS_A = 32, -    EP_TS_H = 64 -}; - -// when spawning, pay attention at setting the faction manually! -const creature_type EP_PWT_FlightMaster = {17209, 0, 2987.5f, -3049.11f, 120.126f, 5.75959f}; - -// after spawning, modify the faction so that only the controller will be able to use it with SetUInt32Value(GAMEOBJECT_FACTION, faction_id); -const go_type EP_NPT_LordaeronShrine = {181682, 0, 3167.72f, -4355.91f, 138.785f, 1.69297f, 0.0f, 0.0f, 0.748956f, 0.66262f}; - -class OutdoorPvPEP; - -class OPvPCapturePointEP_EWT : public OPvPCapturePoint -{ -    public: -        OPvPCapturePointEP_EWT(OutdoorPvP* pvp); - -        void ChangeState(); - -        void FillInitialWorldStates(WorldPacket & data); - -    protected: -        void SummonSupportUnitAtNorthpassTower(uint32 team); - -        void UpdateTowerState(); - -    protected: -        uint32 m_TowerState; - -        uint32 m_UnitsSummonedSide; -}; - -class OPvPCapturePointEP_NPT : public OPvPCapturePoint -{ -    public: -        OPvPCapturePointEP_NPT(OutdoorPvP* pvp); - -        void ChangeState(); - -        void FillInitialWorldStates(WorldPacket & data); - -    protected: -        void SummonGO(uint32 team); - -        void UpdateTowerState(); - -    protected: -        uint32 m_TowerState; - -        uint32 m_SummonedGOSide; -}; - -class OPvPCapturePointEP_CGT : public OPvPCapturePoint -{ -    public: -        OPvPCapturePointEP_CGT(OutdoorPvP* pvp); - -        void ChangeState(); - -        void FillInitialWorldStates(WorldPacket & data); - -    protected: -        void LinkGraveYard(uint32 team); - -        void UpdateTowerState(); - -    protected: -        uint32 m_TowerState; - -        uint32 m_GraveyardSide; -}; - -class OPvPCapturePointEP_PWT : public OPvPCapturePoint -{ -    public: -        OPvPCapturePointEP_PWT(OutdoorPvP* pvp); - -        void ChangeState(); - -        void FillInitialWorldStates(WorldPacket & data); - -    protected: -        void SummonFlightMaster(uint32 team); - -        void UpdateTowerState(); - -    protected: -        uint32 m_FlightMasterSpawned; - -        uint32 m_TowerState; -}; - -class OutdoorPvPEP : public OutdoorPvP -{ -    public: -        OutdoorPvPEP(); - -        bool SetupOutdoorPvP(); - -        void HandlePlayerEnterZone(Player* player, uint32 zone); -        void HandlePlayerLeaveZone(Player* player, uint32 zone); - -        bool Update(uint32 diff); - -        void FillInitialWorldStates(WorldPacket &data); - -        void SendRemoveWorldStates(Player* player); - -        void BuffTeams(); - -        void SetControlledState(uint32 index, uint32 state); - -    private: -        // how many towers are controlled -        uint32 EP_Controls[EP_TOWER_NUM]; - -        uint32 m_AllianceTowersControlled; -        uint32 m_HordeTowersControlled; -}; - -#endif diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp index 539f54ab421..62108feaeeb 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp @@ -172,6 +172,9 @@ bool OutdoorPvPSI::HandleDropFlag(Player* player, uint32 spellId)                              return true;                          } +                        for (auto phase : player->GetPhases()) +                            go->SetInPhase(phase, false, true); +                          go->SetRespawnTime(0);                          if (!map->AddToMap(go)) @@ -206,6 +209,9 @@ bool OutdoorPvPSI::HandleDropFlag(Player* player, uint32 spellId)                              return true;                          } +                        for (auto phase : player->GetPhases()) +                            go->SetInPhase(phase, false, true); +                          go->SetRespawnTime(0);                          if (!map->AddToMap(go)) diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp index 681a659ae71..1aa01d7ac7c 100644 --- a/src/server/scripts/Spells/spell_dk.cpp +++ b/src/server/scripts/Spells/spell_dk.cpp @@ -33,46 +33,39 @@ enum DeathKnightSpells      SPELL_DK_BLACK_ICE_R1                       = 49140,      SPELL_DK_BLOOD_BOIL_TRIGGERED               = 65658,      SPELL_DK_BLOOD_GORGED_HEAL                  = 50454, -    SPELL_DK_BLOOD_PRESENCE                     = 48266, +    SPELL_DK_BLOOD_PLAGUE                       = 55078, +    SPELL_DK_BLOOD_PRESENCE                     = 48263, +    SPELL_DK_BLOOD_PRESENCE_TRIGGERED           = 61261, +    SPELL_DK_BLOOD_SHIELD_MASTERY               = 77513, +    SPELL_DK_BLOOD_SHIELD_ABSORB                = 77535, +    SPELL_DK_BUTCHERY                           = 50163,      SPELL_DK_CORPSE_EXPLOSION_TRIGGERED         = 43999, -    SPELL_DK_CORPSE_EXPLOSION_VISUAL            = 51270,      SPELL_DK_DEATH_AND_DECAY_DAMAGE             = 52212,      SPELL_DK_DEATH_COIL_DAMAGE                  = 47632,      SPELL_DK_DEATH_COIL_HEAL                    = 47633,      SPELL_DK_DEATH_STRIKE_HEAL                  = 45470, +    SPELL_DK_DEATH_STRIKE_ENABLER               = 89832,      SPELL_DK_FROST_FEVER                        = 55095, -    SPELL_DK_FROST_PRESENCE                     = 48263, -    SPELL_DK_FROST_PRESENCE_TRIGGERED           = 61261, +    SPELL_DK_FROST_PRESENCE                     = 48266,      SPELL_DK_GHOUL_EXPLODE                      = 47496, -    SPELL_DK_GLYPH_OF_DISEASE                   = 63334,      SPELL_DK_GLYPH_OF_ICEBOUND_FORTITUDE        = 58625, +    SPELL_DK_GLYPH_OF_DISEASE                   = 63334,      SPELL_DK_IMPROVED_BLOOD_PRESENCE_R1         = 50365, +    SPELL_DK_IMPROVED_DEATH_STRIKE              = 62905,      SPELL_DK_IMPROVED_FROST_PRESENCE_R1         = 50384, +    SPELL_DK_IMPROVED_FROST_PRESENCE_TRIGGERED  = 63621,      SPELL_DK_IMPROVED_UNHOLY_PRESENCE_R1        = 50391, -    SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED  = 63611,      SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED = 63622,      SPELL_DK_ITEM_SIGIL_VENGEFUL_HEART          = 64962,      SPELL_DK_ITEM_T8_MELEE_4P_BONUS             = 64736,      SPELL_DK_MASTER_OF_GHOULS                   = 52143, -    SPELL_DK_BLOOD_PLAGUE                       = 55078,      SPELL_DK_RAISE_DEAD_USE_REAGENT             = 48289,      SPELL_DK_RUNIC_POWER_ENERGIZE               = 49088, +    SPELL_DK_RUNE_TAP                           = 48982,      SPELL_DK_SCENT_OF_BLOOD                     = 50422,      SPELL_DK_SCOURGE_STRIKE_TRIGGERED           = 70890,      SPELL_DK_UNHOLY_PRESENCE                    = 48265, -    SPELL_DK_UNHOLY_PRESENCE_TRIGGERED          = 49772, -    SPELL_DK_WILL_OF_THE_NECROPOLIS_TALENT_R1   = 49189, -    SPELL_DK_WILL_OF_THE_NECROPOLIS_AURA_R1     = 52284 -}; - -enum DeathKnightSpellIcons -{ -    DK_ICON_ID_IMPROVED_DEATH_STRIKE            = 2751 -}; - -enum Misc -{ -    NPC_DK_GHOUL                                = 26125 +    SPELL_DK_WILL_OF_THE_NECROPOLIS             = 96171  };  // 50462 - Anti-Magic Shell (on raid member) @@ -302,15 +295,14 @@ class spell_dk_blood_gorged : public SpellScriptLoader              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); +                int32 heal = int32(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), 150)); +                GetTarget()->CastCustomSpell(SPELL_DK_BLOOD_GORGED_HEAL, SPELLVALUE_BASE_POINT0, heal, _procTarget, true, NULL, aurEff);              }              void Register() override              {                  DoCheckProc += AuraCheckProcFn(spell_dk_blood_gorged_AuraScript::CheckProc); -                OnEffectProc += AuraEffectProcFn(spell_dk_blood_gorged_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); +                OnEffectProc += AuraEffectProcFn(spell_dk_blood_gorged_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);              }          private: @@ -323,153 +315,38 @@ class spell_dk_blood_gorged : public SpellScriptLoader          }  }; -// -49027 - Bloodworms -class spell_dk_bloodworms : public SpellScriptLoader -{ -    public: -        spell_dk_bloodworms() : SpellScriptLoader("spell_dk_bloodworms") { } - -        class spell_dk_bloodworms_AuraScript : public AuraScript -        { -            PrepareAuraScript(spell_dk_bloodworms_AuraScript); - -            void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) -            { -                aurEff->GetBase()->RecalculateAmountOfEffects(); -            } - -            void Register() override -            { -                OnEffectProc += AuraEffectProcFn(spell_dk_bloodworms_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE); -            } -        }; - -        AuraScript* GetAuraScript() const override -        { -            return new spell_dk_bloodworms_AuraScript(); -        } -}; - -class CorpseExplosionCheck -{ -public: -    explicit CorpseExplosionCheck(uint64 casterGUID, bool allowGhoul) : _casterGUID(casterGUID), -        _allowGhoul(allowGhoul) { } - -    bool operator()(WorldObject* obj) const -    { -        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()) -                return false; -        } - -        return true; -    } - -private: -    uint64 _casterGUID; -    bool _allowGhoul; -}; - -// 49158 - Corpse Explosion (51325, 51326, 51327, 51328) -class spell_dk_corpse_explosion : public SpellScriptLoader +// -48979 - Butchery +class spell_dk_butchery : public SpellScriptLoader  {      public: -        spell_dk_corpse_explosion() : SpellScriptLoader("spell_dk_corpse_explosion") { } +        spell_dk_butchery() : SpellScriptLoader("spell_dk_butchery") { } -        class spell_dk_corpse_explosion_SpellScript : public SpellScript +        class spell_dk_blood_gorged_AuraScript : public AuraScript          { -            PrepareSpellScript(spell_dk_corpse_explosion_SpellScript); +            PrepareAuraScript(spell_dk_blood_gorged_AuraScript); -            bool Validate(SpellInfo const* spellInfo) override +            bool Validate(SpellInfo const* /*spellInfo*/) override              { -                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())) +                if (!sSpellMgr->GetSpellInfo(SPELL_DK_BUTCHERY))                      return false;                  return true;              } -            bool Load() override -            { -                _target = NULL; -                return true; -            } - -            void CheckTarget(WorldObject*& target) -            { -                if (CorpseExplosionCheck(GetCaster()->GetGUID(), true)(target)) -                    target = NULL; - -                _target = target; -            } - -            void CheckTargets(std::list<WorldObject*>& 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 = Trinity::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()->CalculateDamage(EFFECT_0, NULL), target, true); -            } - -            void HandleCorpseExplosion(SpellEffIndex effIndex) +            void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)              { -                if (Unit* unitTarget = GetHitUnit()) -                { -                    if (unitTarget->IsAlive())  // Living ghoul as a target -                    { -                        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); -                    } -                } +                PreventDefaultAction(); +                GetTarget()->CastCustomSpell(SPELL_DK_BUTCHERY, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetTarget(), true, NULL, aurEff);              }              void Register() override              { -                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); +                OnEffectProc += AuraEffectProcFn(spell_dk_blood_gorged_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);              } - -        private: -            WorldObject* _target;          }; -        SpellScript* GetSpellScript() const override +        AuraScript* GetAuraScript() const override          { -            return new spell_dk_corpse_explosion_SpellScript(); +            return new spell_dk_blood_gorged_AuraScript();          }  }; @@ -500,7 +377,6 @@ class spell_dk_death_and_decay : public SpellScriptLoader          }  }; -// -47541, 52375, 59134, -62900 - Death Coil  class spell_dk_death_coil : public SpellScriptLoader  {      public: @@ -698,7 +574,7 @@ class spell_dk_death_pact : public SpellScriptLoader          }  }; -// -49998 - Death Strike +// 49998 - Death Strike  class spell_dk_death_strike : public SpellScriptLoader  {      public: @@ -710,30 +586,39 @@ class spell_dk_death_strike : public SpellScriptLoader              bool Validate(SpellInfo const* /*spellInfo*/) override              { -                if (!sSpellMgr->GetSpellInfo(SPELL_DK_DEATH_STRIKE_HEAL)) +                if (!sSpellMgr->GetSpellInfo(SPELL_DK_DEATH_STRIKE_ENABLER) || +                    !sSpellMgr->GetSpellInfo(SPELL_DK_DEATH_STRIKE_HEAL) || +                    !sSpellMgr->GetSpellInfo(SPELL_DK_BLOOD_SHIELD_MASTERY) || +                    !sSpellMgr->GetSpellInfo(SPELL_DK_BLOOD_SHIELD_ABSORB))                      return false;                  return true;              }              void HandleDummy(SpellEffIndex /*effIndex*/)              { -                Unit* caster = GetCaster(); -                if (Unit* target = GetHitUnit()) +                if (AuraEffect* enabler = GetCaster()->GetAuraEffect(SPELL_DK_DEATH_STRIKE_ENABLER, EFFECT_0, GetCaster()->GetGUID()))                  { -                    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, NULL, NULL, false); +                    // Call CalculateAmount() to constantly fire the AuraEffect's HandleCalcAmount method +                    int32 heal = CalculatePct(enabler->CalculateAmount(GetCaster()), GetSpellInfo()->Effects[EFFECT_0].DamageMultiplier); + +                    if (AuraEffect const* aurEff = GetCaster()->GetAuraEffectOfRankedSpell(SPELL_DK_IMPROVED_DEATH_STRIKE, EFFECT_2)) +                        heal = AddPct(heal, aurEff->GetAmount()); + +                    heal = std::max(heal, int32(GetCaster()->CountPctFromMaxHealth(GetEffectValue()))); +                    GetCaster()->CastCustomSpell(SPELL_DK_DEATH_STRIKE_HEAL, SPELLVALUE_BASE_POINT0, heal, GetCaster(), true);                  } + +                if (!GetCaster()->HasAura(SPELL_DK_BLOOD_PRESENCE)) +                    return; + +                if (AuraEffect const* aurEff = GetCaster()->GetAuraEffect(SPELL_DK_BLOOD_SHIELD_MASTERY, EFFECT_0)) +                    GetCaster()->CastCustomSpell(SPELL_DK_BLOOD_SHIELD_ABSORB, SPELLVALUE_BASE_POINT0, GetCaster()->CountPctFromMaxHealth(aurEff->GetAmount()), GetCaster());              }              void Register() override              {                  OnEffectHitTarget += SpellEffectFn(spell_dk_death_strike_SpellScript::HandleDummy, EFFECT_2, SPELL_EFFECT_DUMMY);              } -          };          SpellScript* GetSpellScript() const override @@ -742,6 +627,80 @@ class spell_dk_death_strike : public SpellScriptLoader          }  }; +// 89832 - Death Strike (Save damage taken in last 5 sec) +class spell_dk_death_strike_enabler : public SpellScriptLoader +{ +    public: +        spell_dk_death_strike_enabler() : SpellScriptLoader("spell_dk_death_strike_enabler") { } + +        class spell_dk_death_strike_enabler_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_dk_death_strike_enabler_AuraScript); + +            bool Load() override +            { +                for (uint8 i = 0; i < 5; ++i) +                    _damagePerSecond[i] = 0; +                return true; +            } + +            bool CheckProc(ProcEventInfo& eventInfo) +            { +                return eventInfo.GetDamageInfo() != nullptr; +            } + +            void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) +            { +                if (!GetUnitOwner()->HasAura(SPELL_DK_BLOOD_PRESENCE)) +                { +                    for (uint8 i = 0; i < 5; ++i) +                        _damagePerSecond[i] = 0; +                } +                else +                    _damagePerSecond[0] += eventInfo.GetDamageInfo()->GetDamage(); +            } + +            // Cheap hack to have update calls +            void CalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude) +            { +                isPeriodic = true; +                amplitude = 1000; +            } + +            void Update(AuraEffect* /*aurEff*/) +            { +                // Move backwards all datas by one +                for (uint8 i = 4; i > 0; --i) +                    _damagePerSecond[i] = _damagePerSecond[i - 1]; +                _damagePerSecond[0] = 0; +            } + +            void HandleCalcAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) +            { +                canBeRecalculated = true; +                amount = 0; +                for (uint8 i = 0; i < 5; ++i) +                    amount += int32(_damagePerSecond[i]); +            } + +            void Register() override +            { +                DoCheckProc += AuraCheckProcFn(spell_dk_death_strike_enabler_AuraScript::CheckProc); +                OnEffectProc += AuraEffectProcFn(spell_dk_death_strike_enabler_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); +                DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_dk_death_strike_enabler_AuraScript::CalcPeriodic, EFFECT_0, SPELL_AURA_DUMMY); +                OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_dk_death_strike_enabler_AuraScript::Update, EFFECT_0, SPELL_AURA_DUMMY); +                DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_death_strike_enabler_AuraScript::HandleCalcAmount, EFFECT_0, SPELL_AURA_DUMMY); +            } + +            uint32 _damagePerSecond[5]; +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_dk_death_strike_enabler_AuraScript(); +        } +}; +  // 47496 - Explode, Ghoul spell for Corpse Explosion  class spell_dk_ghoul_explode : public SpellScriptLoader  { @@ -752,34 +711,24 @@ class spell_dk_ghoul_explode : public SpellScriptLoader          {              PrepareSpellScript(spell_dk_ghoul_explode_SpellScript); -            bool Validate(SpellInfo const* spellInfo) override +            bool Validate(SpellInfo const* /*spellInfo*/) override              { -                if (!sSpellMgr->GetSpellInfo(SPELL_DK_CORPSE_EXPLOSION_TRIGGERED) -                    || spellInfo->Effects[EFFECT_2].CalcValue() <= 0) +                if (!sSpellMgr->GetSpellInfo(SPELL_DK_CORPSE_EXPLOSION_TRIGGERED))                      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() override              { -                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);              }          }; @@ -854,29 +803,44 @@ class spell_dk_improved_blood_presence : public SpellScriptLoader                  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)) +                    || !sSpellMgr->GetSpellInfo(SPELL_DK_BLOOD_PRESENCE_TRIGGERED))                      return false;                  return true;              } -            void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) +            void HandleModDamagePctTaken(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); +                if ((target->HasAura(SPELL_DK_FROST_PRESENCE) || target->HasAura(SPELL_DK_UNHOLY_PRESENCE)) && !target->HasAura(SPELL_DK_BLOOD_PRESENCE_TRIGGERED)) +                    target->CastCustomSpell(SPELL_DK_BLOOD_PRESENCE_TRIGGERED, SPELLVALUE_BASE_POINT0, -aurEff->GetAmount(), target, true, NULL, aurEff); +            } + +            void HandleModAttackerMeleeCritChance(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) +            { +                Unit* target = GetTarget(); +                if (target->HasAura(SPELL_DK_BLOOD_PRESENCE)) +                    if (AuraEffect* triggeredEff = target->GetAuraEffect(SPELL_DK_BLOOD_PRESENCE_TRIGGERED, EFFECT_1)) +                        triggeredEff->SetAmount(aurEff->GetAmount());              }              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); + +                if (target->HasAura(SPELL_DK_BLOOD_PRESENCE)) +                { +                    if (AuraEffect* triggeredEff = target->GetAuraEffect(SPELL_DK_BLOOD_PRESENCE_TRIGGERED, EFFECT_1)) +                        triggeredEff->SetAmount(0); +                } +                else +                    target->RemoveAura(SPELL_DK_BLOOD_PRESENCE_TRIGGERED);              }              void Register() override              { -                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); +                AfterEffectApply += AuraEffectApplyFn(spell_dk_improved_blood_presence_AuraScript::HandleModDamagePctTaken, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); +                AfterEffectApply += AuraEffectApplyFn(spell_dk_improved_blood_presence_AuraScript::HandleModAttackerMeleeCritChance, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); +                AfterEffectRemove += AuraEffectRemoveFn(spell_dk_improved_blood_presence_AuraScript::HandleEffectRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);              }          }; @@ -899,9 +863,8 @@ class spell_dk_improved_frost_presence : public SpellScriptLoader              bool Validate(SpellInfo const* /*spellInfo*/) override              {                  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)) +                    || !sSpellMgr->GetSpellInfo(SPELL_DK_IMPROVED_FROST_PRESENCE_TRIGGERED))                      return false;                  return true;              } @@ -909,15 +872,13 @@ class spell_dk_improved_frost_presence : public SpellScriptLoader              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); +                if ((target->HasAura(SPELL_DK_BLOOD_PRESENCE) || target->HasAura(SPELL_DK_UNHOLY_PRESENCE)) && !target->HasAura(SPELL_DK_IMPROVED_FROST_PRESENCE_TRIGGERED)) +                    target->CastCustomSpell(SPELL_DK_IMPROVED_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); +                GetTarget()->RemoveAura(SPELL_DK_IMPROVED_FROST_PRESENCE_TRIGGERED);              }              void Register() override @@ -947,9 +908,7 @@ class spell_dk_improved_unholy_presence : public SpellScriptLoader              {                  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)) +                    || !sSpellMgr->GetSpellInfo(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED))                      return false;                  return true;              } @@ -957,25 +916,13 @@ class spell_dk_improved_unholy_presence : public SpellScriptLoader              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); +                if ((target->HasAura(SPELL_DK_BLOOD_PRESENCE) || target->HasAura(SPELL_DK_FROST_PRESENCE)) && !target->HasAura(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED)) +                    target->CastCustomSpell(SPELL_DK_IMPROVED_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); +                GetTarget()->RemoveAura(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED);              }              void Register() override @@ -991,6 +938,34 @@ class spell_dk_improved_unholy_presence : public SpellScriptLoader          }  }; +// 73975 - Necrotic Strike +class spell_dk_necrotic_strike : public SpellScriptLoader +{ +    public: +        spell_dk_necrotic_strike() : SpellScriptLoader("spell_dk_necrotic_strike") { } + +        class spell_dk_necrotic_strike_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_dk_necrotic_strike_AuraScript); + +            void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool & /*canBeRecalculated*/) +            { +                if (Unit* caster = GetCaster()) +                    amount = int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * 0.7f); +            } + +            void Register() override +            { +                DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_necrotic_strike_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_HEAL_ABSORB); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_dk_necrotic_strike_AuraScript(); +        } +}; +  // ID - 50842 Pestilence  class spell_dk_pestilence : public SpellScriptLoader  { @@ -1075,7 +1050,6 @@ class spell_dk_pestilence : public SpellScriptLoader          }  }; -  // 48266 - Blood Presence  // 48263 - Frost Presence  // 48265 - Unholy Presence @@ -1096,10 +1070,9 @@ class spell_dk_presence : public SpellScriptLoader                      || !sSpellMgr->GetSpellInfo(SPELL_DK_IMPROVED_BLOOD_PRESENCE_R1)                      || !sSpellMgr->GetSpellInfo(SPELL_DK_IMPROVED_FROST_PRESENCE_R1)                      || !sSpellMgr->GetSpellInfo(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_R1) -                    || !sSpellMgr->GetSpellInfo(SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED) +                    || !sSpellMgr->GetSpellInfo(SPELL_DK_BLOOD_PRESENCE_TRIGGERED)                      || !sSpellMgr->GetSpellInfo(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED) -                    || !sSpellMgr->GetSpellInfo(SPELL_DK_FROST_PRESENCE_TRIGGERED) -                    || !sSpellMgr->GetSpellInfo(SPELL_DK_UNHOLY_PRESENCE_TRIGGERED)) +                    || !sSpellMgr->GetSpellInfo(SPELL_DK_IMPROVED_FROST_PRESENCE_TRIGGERED))                      return false;                  return true; @@ -1107,53 +1080,57 @@ class spell_dk_presence : public SpellScriptLoader              void HandleImprovedBloodPresence(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)              { +                /// @todo: rune regg (effect 2)                  Unit* target = GetTarget(); +                if (Aura const* aura = target->GetAuraOfRankedSpell(SPELL_DK_IMPROVED_BLOOD_PRESENCE_R1)) +                { +                    CustomSpellValues val; +                    if (GetSpellInfo()->Id == SPELL_DK_BLOOD_PRESENCE) +                    { +                        if (AuraEffect const* impAurEff = aura->GetEffect(EFFECT_1)) +                            val.AddSpellMod(SPELLVALUE_BASE_POINT1, impAurEff->GetAmount()); +                    } +                    else +                    { +                        if (AuraEffect const* impAurEff = aura->GetEffect(EFFECT_0)) +                            val.AddSpellMod(SPELLVALUE_BASE_POINT0, -impAurEff->GetAmount()); +                    } -                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); +                    if (!target->HasAura(SPELL_DK_BLOOD_PRESENCE_TRIGGERED)) +                        target->CastCustomSpell(SPELL_DK_BLOOD_PRESENCE_TRIGGERED, val, target, TRIGGERED_FULL_MASK, NULL, aurEff); +                } +                else if (GetSpellInfo()->Id == SPELL_DK_BLOOD_PRESENCE) +                    target->CastSpell(target, SPELL_DK_BLOOD_PRESENCE_TRIGGERED, true, NULL, aurEff);              }              void HandleImprovedFrostPresence(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)              { -                Unit* target = GetTarget(); +                if (GetSpellInfo()->Id != SPELL_DK_BLOOD_PRESENCE && GetSpellInfo()->Id != SPELL_DK_UNHOLY_PRESENCE) +                    return; -                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); +                Unit* target = GetTarget(); +                if (AuraEffect const* impAurEff = target->GetAuraEffectOfRankedSpell(SPELL_DK_IMPROVED_FROST_PRESENCE_R1, EFFECT_0)) +                    if (!target->HasAura(SPELL_DK_IMPROVED_FROST_PRESENCE_TRIGGERED)) +                        target->CastCustomSpell(SPELL_DK_IMPROVED_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 (GetSpellInfo()->Id != SPELL_DK_BLOOD_PRESENCE && GetSpellInfo()->Id != SPELL_DK_FROST_PRESENCE) +                    return; +                Unit* target = GetTarget();                  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); -                } +                    if (!target->HasAura(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED)) +                        target->CastCustomSpell(SPELL_DK_IMPROVED_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_BLOOD_PRESENCE_TRIGGERED); +                target->RemoveAura(SPELL_DK_IMPROVED_FROST_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() override @@ -1173,27 +1150,28 @@ class spell_dk_presence : public SpellScriptLoader  class RaiseDeadCheck  { -    public: -        explicit RaiseDeadCheck(Player const* caster) : _caster(caster) { } +public: +    explicit RaiseDeadCheck(Player const* caster) : _caster(caster) { } -        bool operator()(WorldObject* obj) const +    bool operator()(WorldObject* obj) const +    { +        if (Unit* target = obj->ToUnit())          { -            if (Unit* target = obj->ToUnit()) -            { -                if (!target->IsAlive() -                    && _caster->isHonorOrXPTarget(target) -                    && target->GetCreatureType() == CREATURE_TYPE_HUMANOID -                    && target->GetDisplayId() == target->GetNativeDisplayId()) -                    return false; -            } - -            return true; +            if (!target->IsAlive() +                && _caster->isHonorOrXPTarget(target) +                && target->GetCreatureType() == CREATURE_TYPE_HUMANOID +                && target->GetDisplayId() == target->GetNativeDisplayId()) +                return false;          } -    private: -        Player const* _caster; +        return true; +    } + +private: +    Player const* _caster;  }; +  // 46584 - Raise Dead  class spell_dk_raise_dead : public SpellScriptLoader  { @@ -1371,16 +1349,16 @@ class spell_dk_scent_of_blood : public SpellScriptLoader                  return true;              } -            void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) +            void OnProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)              {                  PreventDefaultAction();                  GetTarget()->CastSpell(GetTarget(), SPELL_DK_SCENT_OF_BLOOD, true, NULL, aurEff); -                GetTarget()->RemoveAuraFromStack(GetSpellInfo()->Id); +                GetTarget()->RemoveAuraFromStack(GetId());              }              void Register() override              { -                OnEffectProc += AuraEffectProcFn(spell_dk_scent_of_blood_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); +                OnEffectProc += AuraEffectProcFn(spell_dk_scent_of_blood_AuraScript::OnProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);              }          }; @@ -1453,50 +1431,6 @@ class spell_dk_scourge_strike : public SpellScriptLoader          }  }; -// 49145 - Spell Deflection -class spell_dk_spell_deflection : public SpellScriptLoader -{ -    public: -        spell_dk_spell_deflection() : SpellScriptLoader("spell_dk_spell_deflection") { } - -        class spell_dk_spell_deflection_AuraScript : public AuraScript -        { -            PrepareAuraScript(spell_dk_spell_deflection_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) -            { -                // You have a chance equal to your Parry chance -                if ((dmgInfo.GetDamageType() == SPELL_DIRECT_DAMAGE) && roll_chance_f(GetTarget()->GetUnitParryChance())) -                    absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct); -            } - -            void Register() override -            { -                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 override -        { -            return new spell_dk_spell_deflection_AuraScript(); -        } -}; -  // 55233 - Vampiric Blood  class spell_dk_vampiric_blood : public SpellScriptLoader  { @@ -1524,7 +1458,7 @@ class spell_dk_vampiric_blood : public SpellScriptLoader          }  }; -// 52284 - Will of the Necropolis +// -52284 - Will of the Necropolis  class spell_dk_will_of_the_necropolis : public SpellScriptLoader  {      public: @@ -1534,55 +1468,38 @@ class spell_dk_will_of_the_necropolis : public SpellScriptLoader          {              PrepareAuraScript(spell_dk_will_of_the_necropolis_AuraScript); -            bool Validate(SpellInfo const* spellInfo) override +            bool Validate(SpellInfo const* /*spellInfo*/) override              { -                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)) +                if (!sSpellMgr->GetSpellInfo(SPELL_DK_WILL_OF_THE_NECROPOLIS))                      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() override +            bool CheckProc(ProcEventInfo& eventInfo)              { -                absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); -                return true; -            } +                //! HACK due to currenct proc system implementation +                if (Player* player = GetTarget()->ToPlayer()) +                    if (player->HasSpellCooldown(GetId())) +                        return false; -            void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) -            { -                // Set absorbtion amount to unlimited -                amount = -1; +               return GetTarget()->HealthBelowPctDamaged(30, eventInfo.GetDamageInfo()->GetDamage());              } -            void Absorb(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount) +            void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)              { -                // min pct of hp is stored in effect 0 of talent spell -                uint8 rank = GetSpellInfo()->GetRank(); -                SpellInfo const* talentProto = sSpellMgr->EnsureSpellInfo(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()))); +                GetTarget()->CastSpell(GetTarget(), SPELL_DK_WILL_OF_THE_NECROPOLIS, true, NULL, aurEff); -                // Damage that would take you below [effect0] health or taken while you are at [effect0] -                if (remainingHp < minHp) -                    absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct); +                if (Player* player = GetTarget()->ToPlayer()) +                { +                    player->RemoveSpellCooldown(SPELL_DK_RUNE_TAP, true); +                    player->AddSpellCooldown(GetId(), 0, time(NULL) + 45); +                }              }              void Register() override              { -                 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); +                DoCheckProc += AuraCheckProcFn(spell_dk_will_of_the_necropolis_AuraScript::CheckProc); +                OnEffectProc += AuraEffectProcFn(spell_dk_will_of_the_necropolis_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE);              }          }; @@ -1599,26 +1516,26 @@ void AddSC_deathknight_spell_scripts()      new spell_dk_anti_magic_zone();      new spell_dk_blood_boil();      new spell_dk_blood_gorged(); -    new spell_dk_bloodworms(); -    new spell_dk_corpse_explosion(); +    new spell_dk_butchery();      new spell_dk_death_and_decay();      new spell_dk_death_coil();      new spell_dk_death_gate();      new spell_dk_death_grip();      new spell_dk_death_pact();      new spell_dk_death_strike(); +    new spell_dk_death_strike_enabler();      new spell_dk_ghoul_explode();      new spell_dk_icebound_fortitude();      new spell_dk_improved_blood_presence();      new spell_dk_improved_frost_presence();      new spell_dk_improved_unholy_presence(); +    new spell_dk_necrotic_strike();      new spell_dk_pestilence();      new spell_dk_presence();      new spell_dk_raise_dead();      new spell_dk_rune_tap_party();      new spell_dk_scent_of_blood();      new spell_dk_scourge_strike(); -    new spell_dk_spell_deflection();      new spell_dk_vampiric_blood();      new spell_dk_will_of_the_necropolis();  } diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp index 5f432bb8b61..0d7d8b61501 100644 --- a/src/server/scripts/Spells/spell_druid.cpp +++ b/src/server/scripts/Spells/spell_druid.cpp @@ -29,24 +29,41 @@  enum DruidSpells  { +    SPELL_DRUID_WRATH                       = 5176, +    SPELL_DRUID_STARFIRE                    = 2912, +    SPELL_DRUID_STARSURGE                   = 78674, +    SPELL_DRUID_ECLIPSE_GENERAL_ENERGIZE    = 89265, +    SPELL_DRUID_STARSURGE_ENERGIZE          = 86605, +    SPELL_DRUID_LUNAR_ECLIPSE_MARKER        = 67484, // Will make the yellow arrow on eclipse bar point to the blue side (lunar) +    SPELL_DRUID_SOLAR_ECLIPSE_MARKER        = 67483, // Will make the yellow arrow on eclipse bar point to the yellow side (solar) +    SPELL_DRUID_SOLAR_ECLIPSE               = 48517, +    SPELL_DRUID_LUNAR_ECLIPSE               = 48518,      SPELL_DRUID_ENRAGE_MOD_DAMAGE           = 51185, +    SPELL_DRUID_FERAL_CHARGE_BEAR           = 16979, +    SPELL_DRUID_FERAL_CHARGE_CAT            = 49376, +    SPELL_DRUID_GLYPH_OF_INNERVATE          = 54833, +    SPELL_DRUID_GLYPH_OF_STARFIRE           = 54846,      SPELL_DRUID_GLYPH_OF_TYPHOON            = 62135,      SPELL_DRUID_IDOL_OF_FERAL_SHADOWS       = 34241,      SPELL_DRUID_IDOL_OF_WORSHIP             = 60774,      SPELL_DRUID_INCREASED_MOONFIRE_DURATION = 38414, +    SPELL_DRUID_ITEM_T8_BALANCE_RELIC       = 64950,      SPELL_DRUID_KING_OF_THE_JUNGLE          = 48492,      SPELL_DRUID_LIFEBLOOM_ENERGIZE          = 64372,      SPELL_DRUID_LIFEBLOOM_FINAL_HEAL        = 33778,      SPELL_DRUID_LIVING_SEED_HEAL            = 48503,      SPELL_DRUID_LIVING_SEED_PROC            = 48504, -    SPELL_DRUID_NATURES_SPLENDOR            = 57865, +    SPELL_DRUID_NATURES_GRACE               = 16880, +    SPELL_DRUID_NATURES_GRACE_TRIGGER       = 16886,      SPELL_DRUID_SURVIVAL_INSTINCTS          = 50322,      SPELL_DRUID_SAVAGE_ROAR                 = 62071, -    SPELL_DRUID_TIGER_S_FURY_ENERGIZE       = 51178, -    SPELL_DRUID_ITEM_T8_BALANCE_RELIC       = 64950, +    SPELL_DRUID_STAMPEDE_BAER_RANK_1        = 81016, +    SPELL_DRUID_STAMPEDE_CAT_RANK_1         = 81021, +    SPELL_DRUID_STAMPEDE_CAT_STATE          = 109881, +    SPELL_DRUID_TIGER_S_FURY_ENERGIZE       = 51178  }; -// -1850 - Dash +// 1850 - Dash  class spell_dru_dash : public SpellScriptLoader  {      public: @@ -75,6 +92,162 @@ class spell_dru_dash : public SpellScriptLoader          }  }; +// 48517 - Eclipse (Solar) +// 48518 - Eclipse (Lunar) +class spell_dru_eclipse : public SpellScriptLoader +{ +    public: +        spell_dru_eclipse(char const* scriptName) : SpellScriptLoader(scriptName) { } + +        class spell_dru_eclipse_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_dru_eclipse_AuraScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_NATURES_GRACE) || +                    !sSpellMgr->GetSpellInfo(SPELL_DRUID_NATURES_GRACE_TRIGGER)) +                    return false; +                return true; +            } + +            bool Load() override +            { +                return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER; +            } + +            void ApplyEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) +            { +                Unit* caster = GetCaster(); +                if (!caster) +                    return; + +                if (caster->ToPlayer()->GetAuraOfRankedSpell(SPELL_DRUID_NATURES_GRACE)) +                    caster->ToPlayer()->RemoveSpellCooldown(SPELL_DRUID_NATURES_GRACE_TRIGGER, true); +            } + +            void Register() override +            { +                OnEffectApply += AuraEffectApplyFn(spell_dru_eclipse_AuraScript::ApplyEffect, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, AURA_EFFECT_HANDLE_REAL); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_dru_eclipse_AuraScript(); +        } +}; + +// 2912, 5176, 78674 - Starfire, Wrath, and Starsurge +class spell_dru_eclipse_energize : public SpellScriptLoader +{ +    public: +        spell_dru_eclipse_energize() : SpellScriptLoader("spell_dru_eclipse_energize") { } + +        class spell_dru_eclipse_energize_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_dru_eclipse_energize_SpellScript); + +            int32 energizeAmount; + +            bool Load() override +            { +                if (GetCaster()->GetTypeId() != TYPEID_PLAYER) +                    return false; + +                if (GetCaster()->ToPlayer()->getClass() != CLASS_DRUID) +                    return false; + +                energizeAmount = 0; + +                return true; +            } + +            void HandleEnergize(SpellEffIndex effIndex) +            { +                Player* caster = GetCaster()->ToPlayer(); + +                // No boomy, no deal. +                if (caster->GetPrimaryTalentTree(caster->GetActiveSpec()) != TALENT_TREE_DRUID_BALANCE) +                    return; + +                switch (GetSpellInfo()->Id) +                { +                    case SPELL_DRUID_WRATH: +                    { +                        energizeAmount = -GetSpellInfo()->Effects[effIndex].BasePoints; // -13 +                        // If we are set to fill the lunar side or we've just logged in with 0 power.. +                        if ((!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER)) +                            || caster->GetPower(POWER_ECLIPSE) == 0) +                        { +                            caster->CastCustomSpell(caster, SPELL_DRUID_ECLIPSE_GENERAL_ENERGIZE, &energizeAmount, 0, 0, true); +                            // If the energize was due to 0 power, cast the eclipse marker aura +                            if (!caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER)) +                                caster->CastSpell(caster, SPELL_DRUID_LUNAR_ECLIPSE_MARKER, true); +                        } +                        // The energizing effect brought us out of the solar eclipse, remove the aura +                        if (caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) <= 0) +                            caster->RemoveAurasDueToSpell(SPELL_DRUID_SOLAR_ECLIPSE); +                        break; +                    } +                    case SPELL_DRUID_STARFIRE: +                    { +                        energizeAmount = GetSpellInfo()->Effects[effIndex].BasePoints; // 20 +                        // If we are set to fill the solar side or we've just logged in with 0 power.. +                        if ((!caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) +                            || caster->GetPower(POWER_ECLIPSE) == 0) +                        { +                            caster->CastCustomSpell(caster, SPELL_DRUID_ECLIPSE_GENERAL_ENERGIZE, &energizeAmount, 0, 0, true); +                            // If the energize was due to 0 power, cast the eclipse marker aura +                            if (!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) +                                caster->CastSpell(caster, SPELL_DRUID_SOLAR_ECLIPSE_MARKER, true); +                        } +                        // The energizing effect brought us out of the lunar eclipse, remove the aura +                        if (caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) >= 0) +                            caster->RemoveAura(SPELL_DRUID_LUNAR_ECLIPSE); +                        break; +                    } +                    case SPELL_DRUID_STARSURGE: +                    { +                        // If we are set to fill the solar side or we've just logged in with 0 power (confirmed with sniffs) +                        if ((!caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) +                            || caster->GetPower(POWER_ECLIPSE) == 0) +                        { +                            energizeAmount = GetSpellInfo()->Effects[effIndex].BasePoints; // 15 +                            caster->CastCustomSpell(caster, SPELL_DRUID_STARSURGE_ENERGIZE, &energizeAmount, 0, 0, true); + +                            // If the energize was due to 0 power, cast the eclipse marker aura +                            if (!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) +                                caster->CastSpell(caster, SPELL_DRUID_SOLAR_ECLIPSE_MARKER, true); +                        } +                        else if (!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER)) +                        { +                            energizeAmount = -GetSpellInfo()->Effects[effIndex].BasePoints; // -15 +                            caster->CastCustomSpell(caster, SPELL_DRUID_STARSURGE_ENERGIZE, &energizeAmount, 0, 0, true); +                        } +                        // The energizing effect brought us out of the lunar eclipse, remove the aura +                        if (caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) >= 0) +                            caster->RemoveAura(SPELL_DRUID_LUNAR_ECLIPSE); +                        // The energizing effect brought us out of the solar eclipse, remove the aura +                        else if (caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) <= 0) +                            caster->RemoveAura(SPELL_DRUID_SOLAR_ECLIPSE); +                        break; +                    } +                } +            } + +            void Register() override +            { +                OnEffectHitTarget += SpellEffectFn(spell_dru_eclipse_energize_SpellScript::HandleEnergize, EFFECT_1, SPELL_EFFECT_DUMMY); +            } +        }; + +        SpellScript* GetSpellScript() const override +        { +            return new spell_dru_eclipse_energize_SpellScript; +        } +}; +  // 5229 - Enrage  class spell_dru_enrage : public SpellScriptLoader  { @@ -111,6 +284,48 @@ class spell_dru_enrage : public SpellScriptLoader          }  }; +// 54832 - Glyph of Innervate +class spell_dru_glyph_of_innervate : public SpellScriptLoader +{ +    public: +        spell_dru_glyph_of_innervate() : SpellScriptLoader("spell_dru_glyph_of_innervate") { } + +        class spell_dru_glyph_of_innervate_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_dru_glyph_of_innervate_AuraScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_GLYPH_OF_INNERVATE)) +                    return false; +                return true; +            } + +            bool CheckProc(ProcEventInfo& eventInfo) +            { +                // Not proc from self Innervate +                return GetTarget() != eventInfo.GetProcTarget(); +            } + +            void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) +            { +                PreventDefaultAction(); +                GetTarget()->CastSpell(GetTarget(), SPELL_DRUID_GLYPH_OF_INNERVATE, true, NULL, aurEff); +            } + +            void Register() override +            { +                DoCheckProc += AuraCheckProcFn(spell_dru_glyph_of_innervate_AuraScript::CheckProc); +                OnEffectProc += AuraEffectProcFn(spell_dru_glyph_of_innervate_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_dru_glyph_of_innervate_AuraScript(); +        } +}; +  // 54846 - Glyph of Starfire  class spell_dru_glyph_of_starfire : public SpellScriptLoader  { @@ -123,7 +338,7 @@ class spell_dru_glyph_of_starfire : public SpellScriptLoader              bool Validate(SpellInfo const* /*spellInfo*/) override              { -                if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_INCREASED_MOONFIRE_DURATION) || !sSpellMgr->GetSpellInfo(SPELL_DRUID_NATURES_SPLENDOR)) +                if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_INCREASED_MOONFIRE_DURATION))                      return false;                  return true;              } @@ -132,7 +347,7 @@ class spell_dru_glyph_of_starfire : public SpellScriptLoader              {                  Unit* caster = GetCaster();                  if (Unit* unitTarget = GetHitUnit()) -                    if (AuraEffect const* aurEff = unitTarget->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x00000002, 0, 0, caster->GetGUID())) +                    if (AuraEffect const* aurEff = unitTarget->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x2, 0, 0, caster->GetGUID()))                      {                          Aura* aura = aurEff->GetBase(); @@ -140,8 +355,6 @@ class spell_dru_glyph_of_starfire : public SpellScriptLoader                          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)                          { @@ -163,6 +376,41 @@ class spell_dru_glyph_of_starfire : public SpellScriptLoader          }  }; +// 54845 - Glyph of Starfire +class spell_dru_glyph_of_starfire_proc : public SpellScriptLoader +{ +    public: +        spell_dru_glyph_of_starfire_proc() : SpellScriptLoader("spell_dru_glyph_of_starfire_proc") { } + +        class spell_dru_glyph_of_starfire_proc_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_dru_glyph_of_starfire_proc_AuraScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_GLYPH_OF_STARFIRE)) +                    return false; +                return true; +            } + +            void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) +            { +                PreventDefaultAction(); +                GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_DRUID_GLYPH_OF_STARFIRE, true, NULL, aurEff); +            } + +            void Register() override +            { +                OnEffectProc += AuraEffectProcFn(spell_dru_glyph_of_starfire_proc_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_dru_glyph_of_starfire_proc_AuraScript(); +        } +}; +  // 34246 - Idol of the Emerald Queen  // 60779 - Idol of Lush Moss  class spell_dru_idol_lifebloom : public SpellScriptLoader @@ -226,7 +474,7 @@ class spell_dru_innervate : public SpellScriptLoader          }  }; -// -5570 - Insect Swarm +// 5570 - Insect Swarm  class spell_dru_insect_swarm : public SpellScriptLoader  {      public: @@ -255,7 +503,7 @@ class spell_dru_insect_swarm : public SpellScriptLoader          }  }; -// -33763 - Lifebloom +// 33763 - Lifebloom  class spell_dru_lifebloom : public SpellScriptLoader  {      public: @@ -408,77 +656,6 @@ class spell_dru_living_seed_proc : public SpellScriptLoader          }  }; -// 69366 - Moonkin Form passive -class spell_dru_moonkin_form_passive : public SpellScriptLoader -{ -    public: -        spell_dru_moonkin_form_passive() : SpellScriptLoader("spell_dru_moonkin_form_passive") { } - -        class spell_dru_moonkin_form_passive_AuraScript : public AuraScript -        { -            PrepareAuraScript(spell_dru_moonkin_form_passive_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) -            { -                // 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() override -            { -                 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 override -        { -            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") { } - -        class spell_dru_owlkin_frenzy_AuraScript : public AuraScript -        { -            PrepareAuraScript(spell_dru_owlkin_frenzy_AuraScript); - -            void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) -            { -                amount = CalculatePct(GetUnitOwner()->GetCreatePowers(POWER_MANA), amount); -            } - -            void Register() override -            { -                DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_owlkin_frenzy_AuraScript::CalculateAmount, EFFECT_2, SPELL_AURA_PERIODIC_ENERGIZE); -            } -        }; - -        AuraScript* GetAuraScript() const override -        { -            return new spell_dru_owlkin_frenzy_AuraScript(); -        } -}; -  // -16972 - Predatory Strikes  class spell_dru_predatory_strikes : public SpellScriptLoader  { @@ -508,51 +685,7 @@ class spell_dru_predatory_strikes : public SpellScriptLoader          }  }; -// 33851 - Primal Tenacity -class spell_dru_primal_tenacity : public SpellScriptLoader -{ -    public: -        spell_dru_primal_tenacity() : SpellScriptLoader("spell_dru_primal_tenacity") { } - -        class spell_dru_primal_tenacity_AuraScript : public AuraScript -        { -            PrepareAuraScript(spell_dru_primal_tenacity_AuraScript); - -            uint32 absorbPct; - -            bool Load() override -            { -                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<<MECHANIC_STUN)) -                    absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct); -            } - -            void Register() override -            { -                 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 override -        { -            return new spell_dru_primal_tenacity_AuraScript(); -        } -}; - -// -1079 - Rip +// 1079 - Rip  class spell_dru_rip : public SpellScriptLoader  {      public: @@ -672,7 +805,7 @@ class spell_dru_savage_roar : public SpellScriptLoader          {              PrepareAuraScript(spell_dru_savage_roar_AuraScript); -            bool Validate(SpellInfo const* /*spell*/) override +            bool Validate(SpellInfo const* /*spellInfo*/) override              {                  if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_SAVAGE_ROAR))                      return false; @@ -708,34 +841,7 @@ class spell_dru_savage_roar : public SpellScriptLoader          }  }; -// -50294 - Starfall (AOE) -class spell_dru_starfall_aoe : public SpellScriptLoader -{ -    public: -        spell_dru_starfall_aoe() : SpellScriptLoader("spell_dru_starfall_aoe") { } - -        class spell_dru_starfall_aoe_SpellScript : public SpellScript -        { -            PrepareSpellScript(spell_dru_starfall_aoe_SpellScript); - -            void FilterTargets(std::list<WorldObject*>& targets) -            { -                targets.remove(GetExplTargetUnit()); -            } - -            void Register() override -            { -                OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dru_starfall_aoe_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); -            } -        }; - -        SpellScript* GetSpellScript() const override -        { -            return new spell_dru_starfall_aoe_SpellScript(); -        } -}; - -// -50286 - Starfall (Dummy) +// 50286 - Starfall (Dummy)  class spell_dru_starfall_dummy : public SpellScriptLoader  {      public: @@ -781,6 +887,59 @@ class spell_dru_starfall_dummy : public SpellScriptLoader          }  }; +// -78892 - Stampede +class spell_dru_stampede : public SpellScriptLoader +{ +    public: +        spell_dru_stampede() : SpellScriptLoader("spell_dru_stampede") { } + +        class spell_dru_stampede_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_dru_stampede_AuraScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_STAMPEDE_BAER_RANK_1) || +                    !sSpellMgr->GetSpellInfo(SPELL_DRUID_STAMPEDE_CAT_RANK_1) || +                    !sSpellMgr->GetSpellInfo(SPELL_DRUID_STAMPEDE_CAT_STATE) || +                    !sSpellMgr->GetSpellInfo(SPELL_DRUID_FERAL_CHARGE_CAT) || +                    !sSpellMgr->GetSpellInfo(SPELL_DRUID_FERAL_CHARGE_BEAR)) +                    return false; +                return true; +            } + +            void HandleEffectCatProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) +            { +                PreventDefaultAction(); +                if (GetTarget()->GetShapeshiftForm() != FORM_CAT || eventInfo.GetDamageInfo()->GetSpellInfo()->Id != SPELL_DRUID_FERAL_CHARGE_CAT) +                    return; + +                GetTarget()->CastSpell(GetTarget(), sSpellMgr->GetSpellWithRank(SPELL_DRUID_STAMPEDE_CAT_RANK_1, GetSpellInfo()->GetRank()), true, NULL, aurEff); +                GetTarget()->CastSpell(GetTarget(), SPELL_DRUID_STAMPEDE_CAT_STATE, true, NULL, aurEff); +            } + +            void HandleEffectBearProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) +            { +                PreventDefaultAction(); +                if (GetTarget()->GetShapeshiftForm() != FORM_BEAR || eventInfo.GetDamageInfo()->GetSpellInfo()->Id != SPELL_DRUID_FERAL_CHARGE_BEAR) +                    return; + +                GetTarget()->CastSpell(GetTarget(), sSpellMgr->GetSpellWithRank(SPELL_DRUID_STAMPEDE_BAER_RANK_1, GetSpellInfo()->GetRank()), true, NULL, aurEff); +            } + +            void Register() override +            { +                OnEffectProc += AuraEffectProcFn(spell_dru_stampede_AuraScript::HandleEffectCatProc, EFFECT_0, SPELL_AURA_DUMMY); +                OnEffectProc += AuraEffectProcFn(spell_dru_stampede_AuraScript::HandleEffectBearProc, EFFECT_1, SPELL_AURA_DUMMY); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_dru_stampede_AuraScript(); +        } +}; +  // 61336 - Survival Instincts  class spell_dru_survival_instincts : public SpellScriptLoader  { @@ -865,7 +1024,7 @@ class spell_dru_swift_flight_passive : public SpellScriptLoader              void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/)              {                  if (Player* caster = GetCaster()->ToPlayer()) -                    if (caster->Has310Flyer(false)) +                    if (caster->GetSkillValue(SKILL_RIDING) >= 375)                          amount = 310;              } @@ -881,7 +1040,7 @@ class spell_dru_swift_flight_passive : public SpellScriptLoader          }  }; -// -5217 - Tiger's Fury +// 5217 - Tiger's Fury  class spell_dru_tiger_s_fury : public SpellScriptLoader  {      public: @@ -909,7 +1068,7 @@ class spell_dru_tiger_s_fury : public SpellScriptLoader          }  }; -// -61391 - Typhoon +// 61391 - Typhoon  class spell_dru_typhoon : public SpellScriptLoader  {      public: @@ -1010,7 +1169,7 @@ class RaidCheck          Unit const* _caster;  }; -// -48438 - Wild Growth +// 48438 - Wild Growth  class spell_dru_wild_growth : public SpellScriptLoader  {      public: @@ -1066,23 +1225,25 @@ class spell_dru_wild_growth : public SpellScriptLoader  void AddSC_druid_spell_scripts()  {      new spell_dru_dash(); +    new spell_dru_eclipse("spell_dru_eclipse_lunar"); +    new spell_dru_eclipse("spell_dru_eclipse_solar"); +    new spell_dru_eclipse_energize();      new spell_dru_enrage(); +    new spell_dru_glyph_of_innervate();      new spell_dru_glyph_of_starfire(); +    new spell_dru_glyph_of_starfire_proc();      new spell_dru_idol_lifebloom();      new spell_dru_innervate();      new spell_dru_insect_swarm();      new spell_dru_lifebloom();      new spell_dru_living_seed();      new spell_dru_living_seed_proc(); -    new spell_dru_moonkin_form_passive(); -    new spell_dru_owlkin_frenzy();      new spell_dru_predatory_strikes(); -    new spell_dru_primal_tenacity();      new spell_dru_rip();      new spell_dru_savage_defense();      new spell_dru_savage_roar(); -    new spell_dru_starfall_aoe();      new spell_dru_starfall_dummy(); +    new spell_dru_stampede();      new spell_dru_survival_instincts();      new spell_dru_swift_flight_passive();      new spell_dru_tiger_s_fury(); diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index e198a6a0c61..35d3985cfa1 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -164,6 +164,67 @@ class spell_gen_adaptive_warding : public SpellScriptLoader          }  }; +enum AlchemistStone +{ +    ALECHEMIST_STONE_HEAL      = 21399, +    ALECHEMIST_STONE_MANA      = 21400, +}; + +// 17619 - Alchemist Stone +class spell_gen_alchemist_stone : public SpellScriptLoader +{ +    public: +        spell_gen_alchemist_stone() : SpellScriptLoader("spell_gen_alchemist_stone") { } + +        class spell_gen_alchemist_stone_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_gen_alchemist_stone_AuraScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(ALECHEMIST_STONE_HEAL) || +                    !sSpellMgr->GetSpellInfo(ALECHEMIST_STONE_MANA)) +                    return false; +                return true; +            } + +            bool CheckProc(ProcEventInfo& eventInfo) +            { +                return eventInfo.GetDamageInfo()->GetSpellInfo()->SpellFamilyName == SPELLFAMILY_POTION; +            } + +            void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) +            { +                PreventDefaultAction(); + +                uint32 spellId = 0; +                int32 bp = int32(eventInfo.GetDamageInfo()->GetDamage() * 0.4f); + +                if (eventInfo.GetDamageInfo()->GetSpellInfo()->HasEffect(SPELL_EFFECT_HEAL)) +                    spellId = ALECHEMIST_STONE_HEAL; +                else if (eventInfo.GetDamageInfo()->GetSpellInfo()->HasEffect(SPELL_EFFECT_ENERGIZE)) +                    spellId = ALECHEMIST_STONE_MANA; + +                if (!spellId) +                    return; + +                GetTarget()->CastCustomSpell(spellId, SPELLVALUE_BASE_POINT0, bp, GetTarget(), true, NULL, aurEff); +            } + + +            void Register() override +            { +                DoCheckProc += AuraCheckProcFn(spell_gen_alchemist_stone_AuraScript::CheckProc); +                OnEffectProc += AuraEffectProcFn(spell_gen_alchemist_stone_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_gen_alchemist_stone_AuraScript(); +        } +}; +  class spell_gen_allow_cast_from_item_only : public SpellScriptLoader  {      public: @@ -699,6 +760,11 @@ class spell_gen_chaos_blast : public SpellScriptLoader          }  }; +enum Clone +{ +    SPELL_NIGHTMARE_FIGMENT_MIRROR_IMAGE        = 57528 +}; +  class spell_gen_clone : public SpellScriptLoader  {      public: @@ -716,8 +782,16 @@ class spell_gen_clone : public SpellScriptLoader              void Register() override              { -                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); +                if (m_scriptSpellId == SPELL_NIGHTMARE_FIGMENT_MIRROR_IMAGE) +                { +                    OnEffectHitTarget += SpellEffectFn(spell_gen_clone_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_DUMMY); +                    OnEffectHitTarget += SpellEffectFn(spell_gen_clone_SpellScript::HandleScriptEffect, EFFECT_2, SPELL_EFFECT_DUMMY); +                } +                else +                { +                    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); +                }              }          }; @@ -1080,63 +1154,6 @@ class spell_gen_dalaran_disguise : public SpellScriptLoader          }  }; -enum DamageReductionAura -{ -    SPELL_BLESSING_OF_SANCTUARY         = 20911, -    SPELL_GREATER_BLESSING_OF_SANCTUARY = 25899, -    SPELL_RENEWED_HOPE                  = 63944, -    SPELL_VIGILANCE                     = 50720, -    SPELL_DAMAGE_REDUCTION_AURA         = 68066 -}; - -class spell_gen_damage_reduction_aura : public SpellScriptLoader -{ -    public: -        spell_gen_damage_reduction_aura() : SpellScriptLoader("spell_gen_damage_reduction_aura") { } - -        class spell_gen_damage_reduction_AuraScript : public AuraScript -        { -            PrepareAuraScript(spell_gen_damage_reduction_AuraScript); - -            bool Validate(SpellInfo const* /*spellInfo*/) override -            { -                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 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() override -            { -                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 override -        { -            return new spell_gen_damage_reduction_AuraScript(); -        } -}; -  enum DefendVisuals  {      SPELL_VISUAL_SHIELD_1 = 63130, @@ -1640,314 +1657,131 @@ class spell_gen_gnomish_transporter : public SpellScriptLoader          }  }; -class spell_gen_lifeblood : public SpellScriptLoader -{ -    public: -        spell_gen_lifeblood() : SpellScriptLoader("spell_gen_lifeblood") { } - -        class spell_gen_lifeblood_AuraScript : public AuraScript -        { -            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() override -            { -                DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_lifeblood_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_HEAL); -            } -        }; - -        AuraScript* GetAuraScript() const override -        { -            return new spell_gen_lifeblood_AuraScript(); -        } -}; - -enum GenericLifebloom +enum Interrupt  { -    SPELL_HEXLORD_MALACRASS_LIFEBLOOM_FINAL_HEAL        = 43422, -    SPELL_TUR_RAGEPAW_LIFEBLOOM_FINAL_HEAL              = 52552, -    SPELL_CENARION_SCOUT_LIFEBLOOM_FINAL_HEAL           = 53692, -    SPELL_TWISTED_VISAGE_LIFEBLOOM_FINAL_HEAL           = 57763, -    SPELL_FACTION_CHAMPIONS_DRU_LIFEBLOOM_FINAL_HEAL    = 66094 +    SPELL_GEN_THROW_INTERRUPT           = 32747  }; -class spell_gen_lifebloom : public SpellScriptLoader +// 32748 - Deadly Throw Interrupt +// 44835 - Maim Interrupt +class spell_gen_interrupt : public SpellScriptLoader  {      public: -        spell_gen_lifebloom(const char* name, uint32 spellId) : SpellScriptLoader(name), _spellId(spellId) { } +        spell_gen_interrupt() : SpellScriptLoader("spell_gen_interrupt") { } -        class spell_gen_lifebloom_AuraScript : public AuraScript +        class spell_gen_interrupt_AuraScript : public AuraScript          { -            PrepareAuraScript(spell_gen_lifebloom_AuraScript); - -        public: -            spell_gen_lifebloom_AuraScript(uint32 spellId) : AuraScript(), _spellId(spellId) { } +            PrepareAuraScript(spell_gen_interrupt_AuraScript);              bool Validate(SpellInfo const* /*spellInfo*/) override              { -                if (!sSpellMgr->GetSpellInfo(_spellId)) +                if (!sSpellMgr->GetSpellInfo(SPELL_GEN_THROW_INTERRUPT))                      return false;                  return true;              } -            void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) +            void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)              { -                // 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()); +                PreventDefaultAction(); +                GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_GEN_THROW_INTERRUPT, true, NULL, aurEff);              }              void Register() override              { -                AfterEffectRemove += AuraEffectRemoveFn(spell_gen_lifebloom_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_PERIODIC_HEAL, AURA_EFFECT_HANDLE_REAL); +                OnEffectProc += AuraEffectProcFn(spell_gen_interrupt_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);              } - -        private: -            uint32 _spellId;          };          AuraScript* GetAuraScript() const override          { -            return new spell_gen_lifebloom_AuraScript(_spellId); +            return new spell_gen_interrupt_AuraScript();          } - -    private: -        uint32 _spellId;  }; -enum MagicRoosterSpells -{ -    SPELL_MAGIC_ROOSTER_NORMAL          = 66122, -    SPELL_MAGIC_ROOSTER_DRAENEI_MALE    = 66123, -    SPELL_MAGIC_ROOSTER_TAUREN_MALE     = 66124 -}; - -class spell_gen_magic_rooster : public SpellScriptLoader +class spell_gen_increase_stats_buff : public SpellScriptLoader  {      public: -        spell_gen_magic_rooster() : SpellScriptLoader("spell_gen_magic_rooster") { } +        spell_gen_increase_stats_buff(char const* scriptName) : SpellScriptLoader(scriptName) { } -        class spell_gen_magic_rooster_SpellScript : public SpellScript +        class spell_gen_increase_stats_buff_SpellScript : public SpellScript          { -            PrepareSpellScript(spell_gen_magic_rooster_SpellScript); +            PrepareSpellScript(spell_gen_increase_stats_buff_SpellScript); -            void HandleScript(SpellEffIndex effIndex) +            void HandleDummy(SpellEffIndex /*effIndex*/)              { -                PreventHitDefaultEffect(effIndex); -                if (Player* target = GetHitPlayer()) -                { -                    // 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 (GetHitUnit()->IsInRaidWith(GetCaster())) +                    GetCaster()->CastSpell(GetCaster(), GetEffectValue() + 1, true); // raid buff +                else +                    GetCaster()->CastSpell(GetHitUnit(), GetEffectValue(), true); // single-target buff              }              void Register() override              { -                OnEffectHitTarget += SpellEffectFn(spell_gen_magic_rooster_SpellScript::HandleScript, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); +                OnEffectHitTarget += SpellEffectFn(spell_gen_increase_stats_buff_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);              }          };          SpellScript* GetSpellScript() const override          { -            return new spell_gen_magic_rooster_SpellScript(); +            return new spell_gen_increase_stats_buff_SpellScript();          }  }; -enum Mounts +enum GenericLifebloom  { -    SPELL_COLD_WEATHER_FLYING           = 54197, - -    // Magic Broom -    SPELL_MAGIC_BROOM_60                = 42680, -    SPELL_MAGIC_BROOM_100               = 42683, -    SPELL_MAGIC_BROOM_150               = 42667, -    SPELL_MAGIC_BROOM_280               = 42668, - -    // Headless Horseman's Mount -    SPELL_HEADLESS_HORSEMAN_MOUNT_60    = 51621, -    SPELL_HEADLESS_HORSEMAN_MOUNT_100   = 48024, -    SPELL_HEADLESS_HORSEMAN_MOUNT_150   = 51617, -    SPELL_HEADLESS_HORSEMAN_MOUNT_280   = 48023, - -    // Winged Steed of the Ebon Blade -    SPELL_WINGED_STEED_150              = 54726, -    SPELL_WINGED_STEED_280              = 54727, - -    // Big Love Rocket -    SPELL_BIG_LOVE_ROCKET_0             = 71343, -    SPELL_BIG_LOVE_ROCKET_60            = 71344, -    SPELL_BIG_LOVE_ROCKET_100           = 71345, -    SPELL_BIG_LOVE_ROCKET_150           = 71346, -    SPELL_BIG_LOVE_ROCKET_310           = 71347, - -    // Invincible -    SPELL_INVINCIBLE_60                 = 72281, -    SPELL_INVINCIBLE_100                = 72282, -    SPELL_INVINCIBLE_150                = 72283, -    SPELL_INVINCIBLE_310                = 72284, - -    // Blazing Hippogryph -    SPELL_BLAZING_HIPPOGRYPH_150        = 74854, -    SPELL_BLAZING_HIPPOGRYPH_280        = 74855, - -    // Celestial Steed -    SPELL_CELESTIAL_STEED_60            = 75619, -    SPELL_CELESTIAL_STEED_100           = 75620, -    SPELL_CELESTIAL_STEED_150           = 75617, -    SPELL_CELESTIAL_STEED_280           = 75618, -    SPELL_CELESTIAL_STEED_310           = 76153, - -    // X-53 Touring Rocket -    SPELL_X53_TOURING_ROCKET_150        = 75957, -    SPELL_X53_TOURING_ROCKET_280        = 75972, -    SPELL_X53_TOURING_ROCKET_310        = 76154 +    SPELL_HEXLORD_MALACRASS_LIFEBLOOM_FINAL_HEAL        = 43422, +    SPELL_TUR_RAGEPAW_LIFEBLOOM_FINAL_HEAL              = 52552, +    SPELL_CENARION_SCOUT_LIFEBLOOM_FINAL_HEAL           = 53692, +    SPELL_TWISTED_VISAGE_LIFEBLOOM_FINAL_HEAL           = 57763, +    SPELL_FACTION_CHAMPIONS_DRU_LIFEBLOOM_FINAL_HEAL    = 66094  }; -class spell_gen_mount : public SpellScriptLoader +class spell_gen_lifebloom : 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) { } +        spell_gen_lifebloom(const char* name, uint32 spellId) : SpellScriptLoader(name), _spellId(spellId) { } -        class spell_gen_mount_SpellScript : public SpellScript +        class spell_gen_lifebloom_AuraScript : public AuraScript          { -            PrepareSpellScript(spell_gen_mount_SpellScript); +            PrepareAuraScript(spell_gen_lifebloom_AuraScript);          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) { } +            spell_gen_lifebloom_AuraScript(uint32 spellId) : AuraScript(), _spellId(spellId) { }              bool Validate(SpellInfo const* /*spellInfo*/) override              { -                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)) +                if (!sSpellMgr->GetSpellInfo(_spellId))                      return false;                  return true;              } -            void HandleMount(SpellEffIndex effIndex) +            void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)              { -                PreventHitDefaultEffect(effIndex); - -                if (Player* target = GetHitPlayer()) -                { -                    // 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; - -                    float x, y, z; -                    target->GetPosition(x, y, z); -                    uint32 areaFlag = target->GetBaseMap()->GetAreaFlag(x, y, z); -                    AreaTableEntry const* area = sAreaStore.LookupEntry(areaFlag); -                    if (!area || (canFly && (area->flags & AREA_FLAG_NO_FLY_ZONE))) -                        canFly = false; - -                    uint32 mount = 0; -                    switch (target->GetBaseSkillValue(SKILL_RIDING)) -                    { -                        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 300: -                            if (canFly) -                            { -                                if (_mount310 && target->Has310Flyer(false)) -                                    mount = _mount310; -                                else -                                    mount = _mount280; -                            } -                            else -                                mount = _mount100; -                            break; -                        default: -                            break; -                    } +                // Final heal only on duration end +                if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE && GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_ENEMY_SPELL) +                    return; -                    if (mount) -                    { -                        PreventHitAura(); -                        target->CastSpell(target, mount, true); -                    } -                } +                // final heal +                GetTarget()->CastSpell(GetTarget(), _spellId, true, NULL, aurEff, GetCasterGUID());              }              void Register() override              { -                 OnEffectHitTarget += SpellEffectFn(spell_gen_mount_SpellScript::HandleMount, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); +                AfterEffectRemove += AuraEffectRemoveFn(spell_gen_lifebloom_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_PERIODIC_HEAL, AURA_EFFECT_HANDLE_REAL);              }          private: -            uint32 _mount0; -            uint32 _mount60; -            uint32 _mount100; -            uint32 _mount150; -            uint32 _mount280; -            uint32 _mount310; +            uint32 _spellId;          }; -        SpellScript* GetSpellScript() const override +        AuraScript* GetAuraScript() const override          { -            return new spell_gen_mount_SpellScript(_mount0, _mount60, _mount100, _mount150, _mount280, _mount310); +            return new spell_gen_lifebloom_AuraScript(_spellId);          }      private: -        uint32 _mount0; -        uint32 _mount60; -        uint32 _mount100; -        uint32 _mount150; -        uint32 _mount280; -        uint32 _mount310; +        uint32 _spellId;  };  /* DOCUMENTATION: Charge spells @@ -2937,6 +2771,160 @@ class spell_gen_replenishment : public SpellScriptLoader          }  }; + +enum RunningWildMountIds +{ +    RUNNING_WILD_MODEL_MALE     = 29422, +    RUNNING_WILD_MODEL_FEMALE   = 29423, +    SPELL_ALTERED_FORM          = 97709 +}; + +class spell_gen_running_wild : public SpellScriptLoader +{ +    public: +        spell_gen_running_wild() : SpellScriptLoader("spell_gen_running_wild") { } + +        class spell_gen_running_wild_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_gen_running_wild_AuraScript); + +            bool Validate(SpellInfo const* /*spell*/) override +            { +                if (!sCreatureDisplayInfoStore.LookupEntry(RUNNING_WILD_MODEL_MALE)) +                    return false; +                if (!sCreatureDisplayInfoStore.LookupEntry(RUNNING_WILD_MODEL_FEMALE)) +                    return false; +                return true; +            } + +            void HandleMount(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) +            { +                Unit* target = GetTarget(); +                PreventDefaultAction(); + +                target->Mount(target->getGender() == GENDER_FEMALE ? RUNNING_WILD_MODEL_FEMALE : RUNNING_WILD_MODEL_MALE, 0, 0); + +                // cast speed aura +                if (MountCapabilityEntry const* mountCapability = sMountCapabilityStore.LookupEntry(aurEff->GetAmount())) +                    target->CastSpell(target, mountCapability->SpeedModSpell, TRIGGERED_FULL_MASK); +            } + +            void Register() override +            { +                OnEffectApply += AuraEffectApplyFn(spell_gen_running_wild_AuraScript::HandleMount, EFFECT_1, SPELL_AURA_MOUNTED, AURA_EFFECT_HANDLE_REAL); +            } +        }; + +        class spell_gen_running_wild_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_gen_running_wild_SpellScript); + +            bool Validate(SpellInfo const* /*spell*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_ALTERED_FORM)) +                    return false; +                return true; +            } + +            bool Load() override +            { +                // Definitely not a good thing, but currently the only way to do something at cast start +                // Should be replaced as soon as possible with a new hook: BeforeCastStart +                GetCaster()->CastSpell(GetCaster(), SPELL_ALTERED_FORM, TRIGGERED_FULL_MASK); +                return false; +            } + +            void Register() override +            { +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_gen_running_wild_AuraScript(); +        } + +        SpellScript* GetSpellScript() const override +        { +            return new spell_gen_running_wild_SpellScript(); +        } +}; + +class spell_gen_two_forms : public SpellScriptLoader +{ +    public: +        spell_gen_two_forms() : SpellScriptLoader("spell_gen_two_forms") { } + +        class spell_gen_two_forms_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_gen_two_forms_SpellScript); + +            SpellCastResult CheckCast() +            { +                if (GetCaster()->IsInCombat()) +                { +                    SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_CANT_TRANSFORM); +                    return SPELL_FAILED_CUSTOM_ERROR; +                } + +                // Player cannot transform to human form if he is forced to be worgen for some reason (Darkflight) +                if (GetCaster()->GetAuraEffectsByType(SPELL_AURA_WORGEN_ALTERED_FORM).size() > 1) +                { +                    SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_CANT_TRANSFORM); +                    return SPELL_FAILED_CUSTOM_ERROR; +                } + +                return SPELL_CAST_OK; +            } + +            void HandleTransform(SpellEffIndex effIndex) +            { +                Unit* target = GetHitUnit(); +                PreventHitDefaultEffect(effIndex); +                if (target->HasAuraType(SPELL_AURA_WORGEN_ALTERED_FORM)) +                    target->RemoveAurasByType(SPELL_AURA_WORGEN_ALTERED_FORM); +                else    // Basepoints 1 for this aura control whether to trigger transform transition animation or not. +                    target->CastCustomSpell(SPELL_ALTERED_FORM, SPELLVALUE_BASE_POINT0, 1, target, TRIGGERED_FULL_MASK); +            } + +            void Register() override +            { +                OnCheckCast += SpellCheckCastFn(spell_gen_two_forms_SpellScript::CheckCast); +                OnEffectHitTarget += SpellEffectFn(spell_gen_two_forms_SpellScript::HandleTransform, EFFECT_0, SPELL_EFFECT_DUMMY); +            } +        }; + +        SpellScript* GetSpellScript() const override +        { +            return new spell_gen_two_forms_SpellScript(); +        } +}; + +class spell_gen_darkflight : public SpellScriptLoader +{ +    public: +        spell_gen_darkflight() : SpellScriptLoader("spell_gen_darkflight") { } + +        class spell_gen_darkflight_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_gen_darkflight_SpellScript); + +            void TriggerTransform() +            { +                GetCaster()->CastSpell(GetCaster(), SPELL_ALTERED_FORM, TRIGGERED_FULL_MASK); +            } + +            void Register() override +            { +                AfterCast += SpellCastFn(spell_gen_darkflight_SpellScript::TriggerTransform); +            } +        }; + +        SpellScript* GetSpellScript() const override +        { +            return new spell_gen_darkflight_SpellScript(); +        } +};  enum SeaforiumSpells  {      SPELL_PLANT_CHARGES_CREDIT_ACHIEVEMENT  = 60937 @@ -3686,6 +3674,7 @@ void AddSC_generic_spell_scripts()  {      new spell_gen_absorb0_hitlimit1();      new spell_gen_adaptive_warding(); +    new spell_gen_alchemist_stone();      new spell_gen_allow_cast_from_item_only();      new spell_gen_animal_blood();      new spell_gen_aura_of_anger(); @@ -3707,7 +3696,6 @@ void AddSC_generic_spell_scripts()      new spell_gen_creature_permanent_feign_death();      new spell_gen_dalaran_disguise("spell_gen_sunreaver_disguise");      new spell_gen_dalaran_disguise("spell_gen_silver_covenant_disguise"); -    new spell_gen_damage_reduction_aura();      new spell_gen_defend();      new spell_gen_despawn_self();      new spell_gen_divine_storm_cd_reset(); @@ -3718,24 +3706,21 @@ void AddSC_generic_spell_scripts()      new spell_gen_gadgetzan_transporter_backfire();      new spell_gen_gift_of_naaru();      new spell_gen_gnomish_transporter(); -    new spell_gen_lifeblood(); +    new spell_gen_increase_stats_buff("spell_pal_blessing_of_kings"); +    new spell_gen_increase_stats_buff("spell_pal_blessing_of_might"); +    new spell_gen_increase_stats_buff("spell_dru_mark_of_the_wild"); +    new spell_gen_increase_stats_buff("spell_pri_power_word_fortitude"); +    new spell_gen_increase_stats_buff("spell_pri_shadow_protection"); +    new spell_gen_increase_stats_buff("spell_mage_arcane_brilliance"); +    new spell_gen_increase_stats_buff("spell_mage_dalaran_brilliance"); +    new spell_gen_interrupt();      new spell_gen_lifebloom("spell_hexlord_lifebloom", SPELL_HEXLORD_MALACRASS_LIFEBLOOM_FINAL_HEAL);      new spell_gen_lifebloom("spell_tur_ragepaw_lifebloom", SPELL_TUR_RAGEPAW_LIFEBLOOM_FINAL_HEAL);      new spell_gen_lifebloom("spell_cenarion_scout_lifebloom", SPELL_CENARION_SCOUT_LIFEBLOOM_FINAL_HEAL);      new spell_gen_lifebloom("spell_twisted_visage_lifebloom", SPELL_TWISTED_VISAGE_LIFEBLOOM_FINAL_HEAL);      new spell_gen_lifebloom("spell_faction_champion_dru_lifebloom", SPELL_FACTION_CHAMPIONS_DRU_LIFEBLOOM_FINAL_HEAL); -    new spell_gen_magic_rooster(); -    new spell_gen_mount("spell_magic_broom", 0, SPELL_MAGIC_BROOM_60, SPELL_MAGIC_BROOM_100, SPELL_MAGIC_BROOM_150, SPELL_MAGIC_BROOM_280); -    new spell_gen_mount("spell_headless_horseman_mount", 0, SPELL_HEADLESS_HORSEMAN_MOUNT_60, SPELL_HEADLESS_HORSEMAN_MOUNT_100, SPELL_HEADLESS_HORSEMAN_MOUNT_150, SPELL_HEADLESS_HORSEMAN_MOUNT_280); -    new spell_gen_mount("spell_winged_steed_of_the_ebon_blade", 0, 0, 0, SPELL_WINGED_STEED_150, SPELL_WINGED_STEED_280); -    new spell_gen_mount("spell_big_love_rocket", SPELL_BIG_LOVE_ROCKET_0, SPELL_BIG_LOVE_ROCKET_60, SPELL_BIG_LOVE_ROCKET_100, SPELL_BIG_LOVE_ROCKET_150, SPELL_BIG_LOVE_ROCKET_310); -    new spell_gen_mount("spell_invincible", 0, SPELL_INVINCIBLE_60, SPELL_INVINCIBLE_100, SPELL_INVINCIBLE_150, SPELL_INVINCIBLE_310); -    new spell_gen_mount("spell_blazing_hippogryph", 0, 0, 0, SPELL_BLAZING_HIPPOGRYPH_150, SPELL_BLAZING_HIPPOGRYPH_280); -    new spell_gen_mount("spell_celestial_steed", 0, SPELL_CELESTIAL_STEED_60, SPELL_CELESTIAL_STEED_100, SPELL_CELESTIAL_STEED_150, SPELL_CELESTIAL_STEED_280, SPELL_CELESTIAL_STEED_310); -    new spell_gen_mount("spell_x53_touring_rocket", 0, 0, 0, SPELL_X53_TOURING_ROCKET_150, SPELL_X53_TOURING_ROCKET_280, SPELL_X53_TOURING_ROCKET_310);      new spell_gen_mounted_charge();      new spell_gen_netherbloom(); -    new spell_gen_nightmare_vine();      new spell_gen_obsidian_armor();      new spell_gen_on_tournament_mount();      new spell_gen_oracle_wolvar_reputation(); @@ -3745,6 +3730,11 @@ void AddSC_generic_spell_scripts()      new spell_gen_profession_research();      new spell_gen_remove_flight_auras();      new spell_gen_replenishment(); +    // Running Wild +    new spell_gen_running_wild(); +    new spell_gen_two_forms(); +    new spell_gen_darkflight(); +    /*                          */      new spell_gen_seaforium_blast();      new spell_gen_spectator_cheer_trigger();      new spell_gen_spirit_healer_res(); diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp index 22968d70ff1..892853b600f 100644 --- a/src/server/scripts/Spells/spell_hunter.cpp +++ b/src/server/scripts/Spells/spell_hunter.cpp @@ -32,16 +32,14 @@  enum HunterSpells  { -    SPELL_HUNTER_ASPECT_OF_THE_BEAST_PET            = 61669, -    SPELL_HUNTER_ASPECT_OF_THE_VIPER                = 34074, -    SPELL_HUNTER_ASPECT_OF_THE_VIPER_ENERGIZE       = 34075,      SPELL_HUNTER_BESTIAL_WRATH                      = 19574, -    SPELL_HUNTER_CHIMERA_SHOT_SERPENT               = 53353, -    SPELL_HUNTER_CHIMERA_SHOT_VIPER                 = 53358, -    SPELL_HUNTER_CHIMERA_SHOT_SCORPID               = 53359, -    SPELL_HUNTER_GLYPH_OF_ASPECT_OF_THE_VIPER       = 56851, +    SPELL_HUNTER_CHIMERA_SHOT_HEAL                  = 53353, +    SPELL_HUNTER_FIRE                               = 82926, +    SPELL_HUNTER_GENERIC_ENERGIZE_FOCUS             = 91954,      SPELL_HUNTER_IMPROVED_MEND_PET                  = 24406, +    SPELL_HUNTER_INSANITY                           = 95809,      SPELL_HUNTER_INVIGORATION_TRIGGERED             = 53398, +    SPELL_HUNTER_LOCK_AND_LOAD                      = 56453,      SPELL_HUNTER_MASTERS_CALL_TRIGGERED             = 62305,      SPELL_HUNTER_MISDIRECTION_PROC                  = 35079,      SPELL_HUNTER_PET_LAST_STAND_TRIGGERED           = 53479, @@ -49,219 +47,156 @@ enum HunterSpells      SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_TRIGGERED = 54114,      SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_DEBUFF    = 55711,      SPELL_HUNTER_PET_CARRION_FEEDER_TRIGGERED       = 54045, +    SPELL_HUNTER_RAPID_RECUPERATION                 = 58883,      SPELL_HUNTER_READINESS                          = 23989, +    SPELL_HUNTER_SERPENT_STING                      = 1978,      SPELL_HUNTER_SNIPER_TRAINING_R1                 = 53302,      SPELL_HUNTER_SNIPER_TRAINING_BUFF_R1            = 64418, -    SPELL_HUNTER_VICIOUS_VIPER                      = 61609, -    SPELL_HUNTER_VIPER_ATTACK_SPEED                 = 60144, -    SPELL_DRAENEI_GIFT_OF_THE_NAARU                 = 59543 +    SPELL_HUNTER_STEADY_SHOT_FOCUS                  = 77443, +    SPELL_HUNTER_THRILL_OF_THE_HUNT                 = 34720  }; -// 13161 - Aspect of the Beast -class spell_hun_aspect_of_the_beast : public SpellScriptLoader +enum MiscSpells +{ +    SPELL_DRAENEI_GIFT_OF_THE_NAARU                 = 59543, +    SPELL_MAGE_TEMPORAL_DISPLACEMENT                = 80354, +    SPELL_SHAMAN_EXHAUSTION                         = 57723, +    SPELL_SHAMAN_SATED                              = 57724 +}; + +// 90355 - Ancient Hysteria +class spell_hun_ancient_hysteria : public SpellScriptLoader  {      public: -        spell_hun_aspect_of_the_beast() : SpellScriptLoader("spell_hun_aspect_of_the_beast") { } +        spell_hun_ancient_hysteria() : SpellScriptLoader("spell_hun_ancient_hysteria") { } -        class spell_hun_aspect_of_the_beast_AuraScript : public AuraScript +        class spell_hun_ancient_hysteria_SpellScript : public SpellScript          { -            PrepareAuraScript(spell_hun_aspect_of_the_beast_AuraScript); - -            bool Load() override -            { -                return GetCaster()->GetTypeId() == TYPEID_PLAYER; -            } +            PrepareSpellScript(spell_hun_ancient_hysteria_SpellScript);              bool Validate(SpellInfo const* /*spellInfo*/) override              { -                if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_ASPECT_OF_THE_BEAST_PET)) +                if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_INSANITY) +                    || !sSpellMgr->GetSpellInfo(SPELL_MAGE_TEMPORAL_DISPLACEMENT) +                    || !sSpellMgr->GetSpellInfo(SPELL_SHAMAN_EXHAUSTION) +                    || !sSpellMgr->GetSpellInfo(SPELL_SHAMAN_SATED))                      return false;                  return true;              } -            void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) +            void RemoveInvalidTargets(std::list<WorldObject*>& targets)              { -                if (Player* caster = GetCaster()->ToPlayer()) -                    if (Pet* pet = caster->GetPet()) -                        pet->RemoveAurasDueToSpell(SPELL_HUNTER_ASPECT_OF_THE_BEAST_PET); +                targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_HUNTER_INSANITY)); +                targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_MAGE_TEMPORAL_DISPLACEMENT)); +                targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_SHAMAN_EXHAUSTION)); +                targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_SHAMAN_SATED));              } -            void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) +            void ApplyDebuff()              { -                if (Player* caster = GetCaster()->ToPlayer()) -                    if (caster->GetPet()) -                        caster->CastSpell(caster, SPELL_HUNTER_ASPECT_OF_THE_BEAST_PET, true); +                if (Unit* target = GetHitUnit()) +                    target->CastSpell(target, SPELL_HUNTER_INSANITY, true);              }              void Register() override              { -                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); +                OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_hun_ancient_hysteria_SpellScript::RemoveInvalidTargets, EFFECT_ALL, TARGET_UNIT_CASTER_AREA_RAID); +                AfterHit += SpellHitFn(spell_hun_ancient_hysteria_SpellScript::ApplyDebuff);              }          }; -        AuraScript* GetAuraScript() const override +        SpellScript* GetSpellScript() const override          { -            return new spell_hun_aspect_of_the_beast_AuraScript(); +            return new spell_hun_ancient_hysteria_SpellScript();          }  }; -// 34074 - Aspect of the Viper -class spell_hun_ascpect_of_the_viper : public SpellScriptLoader +// 53209 - Chimera Shot +class spell_hun_chimera_shot : public SpellScriptLoader  {      public: -        spell_hun_ascpect_of_the_viper() : SpellScriptLoader("spell_hun_ascpect_of_the_viper") { } +        spell_hun_chimera_shot() : SpellScriptLoader("spell_hun_chimera_shot") { } -        class spell_hun_ascpect_of_the_viper_AuraScript : public AuraScript +        class spell_hun_chimera_shot_SpellScript : public SpellScript          { -            PrepareAuraScript(spell_hun_ascpect_of_the_viper_AuraScript); +            PrepareSpellScript(spell_hun_chimera_shot_SpellScript);              bool Validate(SpellInfo const* /*spellInfo*/) override              { -                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)) +                if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_CHIMERA_SHOT_HEAL) || +                    !sSpellMgr->GetSpellInfo(SPELL_HUNTER_SERPENT_STING))                      return false;                  return true;              } -            void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) +            bool Load() override              { -                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); +                return GetCaster()->GetTypeId() == TYPEID_PLAYER;              } -            void OnApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) +            void HandleScriptEffect(SpellEffIndex /*effIndex*/)              { -                // Hunter T7 4P Bonus -                if (GetTarget()->HasAura(SPELL_HUNTER_VIPER_ATTACK_SPEED)) -                    GetTarget()->CastSpell(GetTarget(), SPELL_HUNTER_VICIOUS_VIPER, true, NULL, aurEff); -            } +                GetCaster()->CastSpell(GetCaster(), SPELL_HUNTER_CHIMERA_SHOT_HEAL, true); -            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); +                if (Aura* aur = GetHitUnit()->GetAura(SPELL_HUNTER_SERPENT_STING, GetCaster()->GetGUID())) +                    aur->SetDuration(aur->GetSpellInfo()->GetMaxDuration(), true);              }              void Register() override              { -                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); +                OnEffectHitTarget += SpellEffectFn(spell_hun_chimera_shot_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);              }          }; -        AuraScript* GetAuraScript() const override +        SpellScript* GetSpellScript() const override          { -            return new spell_hun_ascpect_of_the_viper_AuraScript(); +            return new spell_hun_chimera_shot_SpellScript();          }  }; -// 53209 - Chimera Shot -class spell_hun_chimera_shot : public SpellScriptLoader +// 77767 - Cobra Shot +class spell_hun_cobra_shot : public SpellScriptLoader  {      public: -        spell_hun_chimera_shot() : SpellScriptLoader("spell_hun_chimera_shot") { } +        spell_hun_cobra_shot() : SpellScriptLoader("spell_hun_cobra_shot") { } -        class spell_hun_chimera_shot_SpellScript : public SpellScript +        class spell_hun_cobra_shot_SpellScript : public SpellScript          { -            PrepareSpellScript(spell_hun_chimera_shot_SpellScript); +            PrepareSpellScript(spell_hun_cobra_shot_SpellScript);              bool Validate(SpellInfo const* /*spellInfo*/) override              { -                if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_CHIMERA_SHOT_SERPENT) || !sSpellMgr->GetSpellInfo(SPELL_HUNTER_CHIMERA_SHOT_VIPER) || !sSpellMgr->GetSpellInfo(SPELL_HUNTER_CHIMERA_SHOT_SCORPID)) +                if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_GENERIC_ENERGIZE_FOCUS) || +                    !sSpellMgr->GetSpellInfo(SPELL_HUNTER_SERPENT_STING))                      return false;                  return true;              } +            bool Load() override +            { +                return GetCaster()->GetTypeId() == TYPEID_PLAYER; +            } +              void HandleScriptEffect(SpellEffIndex /*effIndex*/)              { -                Unit* caster = GetCaster(); -                if (Unit* unitTarget = GetHitUnit()) +                GetCaster()->CastSpell(GetCaster(), SPELL_HUNTER_GENERIC_ENERGIZE_FOCUS, true); + +                if (Aura* aur = GetHitUnit()->GetAura(SPELL_HUNTER_SERPENT_STING, GetCaster()->GetGUID()))                  { -                    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->GetDamage(); -                                ApplyPct(basePoint, TickCount * 40); -                                basePoint = unitTarget->SpellDamageBonusTaken(caster, aura->GetSpellInfo(), basePoint, DOT, aura->GetStackAmount()); - -                                // Recalculate bonus damage on roll. -                                uint32 damage = std::max(aurEff->GetAmount(), 0); -                                sScriptMgr->ModifyPeriodicDamageAurasTick(unitTarget, caster, damage); -                                aurEff->SetDamage(caster->SpellDamageBonusDone(unitTarget, aurEff->GetSpellInfo(), damage, DOT) * aurEff->GetDonePct()); -                            } -                            // 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) -                                spellId = SPELL_HUNTER_CHIMERA_SHOT_SCORPID; -                            // ?? nothing say in spell desc (possibly need addition check) -                            //if (familyFlag & 0x0000010000000000LL || // dot -                            //    familyFlag & 0x0000100000000000LL)   // stun -                            //{ -                            //    spellId = 53366; // 53366 Chimera Shot - Wyvern -                            //} - -                            // Refresh aura duration -                            aura->RefreshDuration(); -                        } -                        break; -                    } -                    if (spellId) -                        caster->CastCustomSpell(unitTarget, spellId, &basePoint, 0, 0, true); -                    if (spellId == SPELL_HUNTER_CHIMERA_SHOT_SCORPID && caster->ToPlayer()) // Scorpid Sting - Add 1 minute cooldown -                        caster->ToPlayer()->AddSpellCooldown(spellId, 0, uint32(time(NULL) + 60)); +                    int32 newDuration = aur->GetDuration() + GetEffectValue() * IN_MILLISECONDS; +                    aur->SetDuration(std::min(newDuration, aur->GetMaxDuration()), true);                  }              }              void Register() override              { -                OnEffectHitTarget += SpellEffectFn(spell_hun_chimera_shot_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); +                OnEffectHitTarget += SpellEffectFn(spell_hun_cobra_shot_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);              }          };          SpellScript* GetSpellScript() const override          { -            return new spell_hun_chimera_shot_SpellScript(); +            return new spell_hun_cobra_shot_SpellScript();          }  }; @@ -296,6 +231,42 @@ class spell_hun_disengage : public SpellScriptLoader          }  }; +// 82926 - Fire! +class spell_hun_fire : public SpellScriptLoader +{ +    public: +        spell_hun_fire() : SpellScriptLoader("spell_hun_fire") { } + +        class spell_hun_fire_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_hun_fire_AuraScript); + +            void HandleEffectCalcSpellMod(AuraEffect const* aurEff, SpellModifier*& spellMod) +            { +                if (!spellMod) +                { +                    spellMod = new SpellModifier(GetAura()); +                    spellMod->op = SPELLMOD_CASTING_TIME; +                    spellMod->type = SPELLMOD_PCT; +                    spellMod->spellId = GetId(); +                    spellMod->mask = GetSpellInfo()->Effects[aurEff->GetEffIndex()].SpellClassMask; +                } + +                spellMod->value = -aurEff->GetAmount(); +            } + +            void Register() override +            { +                DoEffectCalcSpellMod += AuraEffectCalcSpellModFn(spell_hun_fire_AuraScript::HandleEffectCalcSpellMod, EFFECT_0, SPELL_AURA_DUMMY); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_hun_fire_AuraScript(); +        } +}; +  // -19572 - Improved Mend Pet  class spell_hun_improved_mend_pet : public SpellScriptLoader  { @@ -336,6 +307,43 @@ class spell_hun_improved_mend_pet : public SpellScriptLoader              return new spell_hun_improved_mend_pet_AuraScript();          }  }; + +// -19464 Improved Serpent Sting +class spell_hun_improved_serpent_sting : public SpellScriptLoader +{ +    public: +        spell_hun_improved_serpent_sting() : SpellScriptLoader("spell_hun_improved_serpent_sting") { } + +        class spell_hun_improved_serpent_sting_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_hun_improved_serpent_sting_AuraScript); + +            void HandleEffectCalcSpellMod(AuraEffect const* aurEff, SpellModifier*& spellMod) +            { +                if (!spellMod) +                { +                    spellMod = new SpellModifier(GetAura()); +                    spellMod->op = SpellModOp(aurEff->GetMiscValue()); +                    spellMod->type = SPELLMOD_PCT; +                    spellMod->spellId = GetId(); +                    spellMod->mask = GetSpellInfo()->Effects[aurEff->GetEffIndex()].SpellClassMask; +                } + +                spellMod->value = aurEff->GetAmount(); +            } + +            void Register() override +            { +                DoEffectCalcSpellMod += AuraEffectCalcSpellModFn(spell_hun_improved_serpent_sting_AuraScript::HandleEffectCalcSpellMod, EFFECT_0, SPELL_AURA_DUMMY); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_hun_improved_serpent_sting_AuraScript(); +        } +}; +  // 53412 - Invigoration  class spell_hun_invigoration : public SpellScriptLoader  { @@ -421,7 +429,8 @@ class spell_hun_masters_call : public SpellScriptLoader              bool Validate(SpellInfo const* spellInfo) override              { -                if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_MASTERS_CALL_TRIGGERED) || !sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_0].CalcValue()) || !sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_1].CalcValue())) +                if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_MASTERS_CALL_TRIGGERED) || +                    !sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_0].CalcValue()))                      return false;                  return true;              } @@ -434,7 +443,6 @@ class spell_hun_masters_call : public SpellScriptLoader                          {                              TriggerCastFlags castMask = TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_IGNORE_CASTER_AURASTATE);                              target->CastSpell(ally, GetEffectValue(), castMask); -                            target->CastSpell(ally, GetSpellInfo()->Effects[EFFECT_0].CalcValue(), castMask);                          }              } @@ -640,6 +648,54 @@ class spell_hun_pet_heart_of_the_phoenix : public SpellScriptLoader          }  }; +// -53228 - Rapid Recuperation +class spell_hun_rapid_recuperation : public SpellScriptLoader +{ +    public: +        spell_hun_rapid_recuperation() : SpellScriptLoader("spell_hun_rapid_recuperation") { } + +        class spell_hun_rapid_recuperation_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_hun_rapid_recuperation_AuraScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_RAPID_RECUPERATION)) +                    return false; +                return true; +            } + +            void HandleAbilityCast(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) +            { +                // This effect only from Rapid Fire (ability cast) +                if (!(eventInfo.GetDamageInfo()->GetSpellInfo()->SpellFamilyFlags[0] & 0x20)) +                    PreventDefaultAction(); +            } + +            void HandleFocusRegen(AuraEffect const* aurEff, ProcEventInfo& eventInfo) +            { +                PreventDefaultAction(); +                // This effect only from Rapid Killing (focus regen) +                if (!(eventInfo.GetDamageInfo()->GetSpellInfo()->SpellFamilyFlags[1] & 0x01000000)) +                    return; + +                int32 focus = aurEff->GetAmount(); +                GetTarget()->CastCustomSpell(SPELL_HUNTER_RAPID_RECUPERATION, SPELLVALUE_BASE_POINT0, focus, GetTarget(), true, NULL, aurEff); +            } + +            void Register() override +            { +                OnEffectProc += AuraEffectProcFn(spell_hun_rapid_recuperation_AuraScript::HandleAbilityCast, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); +                OnEffectProc += AuraEffectProcFn(spell_hun_rapid_recuperation_AuraScript::HandleFocusRegen, EFFECT_1, SPELL_AURA_DUMMY); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_hun_rapid_recuperation_AuraScript(); +        } +}; +  // 23989 - Readiness  class spell_hun_readiness : public SpellScriptLoader  { @@ -689,6 +745,44 @@ class spell_hun_readiness : public SpellScriptLoader          }  }; +// 82925 - Ready, Set, Aim... +class spell_hun_ready_set_aim : public SpellScriptLoader +{ +    public: +        spell_hun_ready_set_aim() : SpellScriptLoader("spell_hun_ready_set_aim") { } + +        class spell_hun_ready_set_aim_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_hun_ready_set_aim_AuraScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_FIRE)) +                    return false; +                return true; +            } + +            void OnApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) +            { +                if (GetStackAmount() == 5) +                { +                    GetTarget()->CastSpell(GetTarget(), SPELL_HUNTER_FIRE, true, NULL, aurEff); +                    GetTarget()->RemoveAura(GetId()); +                } +            } + +            void Register() override +            { +                AfterEffectApply += AuraEffectApplyFn(spell_hun_ready_set_aim_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_hun_ready_set_aim_AuraScript(); +        } +}; +  // 37506 - Scatter Shot  class spell_hun_scatter_shot : public SpellScriptLoader  { @@ -737,7 +831,8 @@ class spell_hun_sniper_training : public SpellScriptLoader              bool Validate(SpellInfo const* /*spellInfo*/) override              { -                if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_SNIPER_TRAINING_R1) || !sSpellMgr->GetSpellInfo(SPELL_HUNTER_SNIPER_TRAINING_BUFF_R1)) +                if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_SNIPER_TRAINING_R1) || +                    !sSpellMgr->GetSpellInfo(SPELL_HUNTER_SNIPER_TRAINING_BUFF_R1))                      return false;                  return true;              } @@ -749,6 +844,7 @@ class spell_hun_sniper_training : public SpellScriptLoader                  {                      Unit* target = GetTarget();                      uint32 spellId = SPELL_HUNTER_SNIPER_TRAINING_BUFF_R1 + GetId() - SPELL_HUNTER_SNIPER_TRAINING_R1; +                      target->CastSpell(target, spellId, true, 0, aurEff);                      if (Player* playerTarget = GetUnitOwner()->ToPlayer())                      { @@ -784,6 +880,45 @@ class spell_hun_sniper_training : public SpellScriptLoader          }  }; +// 56641 - Steady Shot +class spell_hun_steady_shot : public SpellScriptLoader +{ +    public: +        spell_hun_steady_shot() : SpellScriptLoader("spell_hun_steady_shot") { } + +        class spell_hun_steady_shot_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_hun_steady_shot_SpellScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_STEADY_SHOT_FOCUS)) +                    return false; +                return true; +            } + +            bool Load() override +            { +                return GetCaster()->GetTypeId() == TYPEID_PLAYER; +            } + +            void HandleOnHit() +            { +                GetCaster()->CastSpell(GetCaster(), SPELL_HUNTER_STEADY_SHOT_FOCUS, true); +            } + +            void Register() override +            { +                OnHit += SpellHitFn(spell_hun_steady_shot_SpellScript::HandleOnHit); +            } +        }; + +        SpellScript* GetSpellScript() const override +        { +            return new spell_hun_steady_shot_SpellScript(); +        } +}; +  // 1515 - Tame Beast  class spell_hun_tame_beast : public SpellScriptLoader  { @@ -836,7 +971,6 @@ class spell_hun_tame_beast : public SpellScriptLoader          }  }; -// -24604 - Furious Howl  //  53434 - Call of the Wild  class spell_hun_target_only_pet_and_owner : public SpellScriptLoader  { @@ -868,56 +1002,94 @@ class spell_hun_target_only_pet_and_owner : public SpellScriptLoader          }  }; -// 60144 - Viper Attack Speed -class spell_hun_viper_attack_speed : public SpellScriptLoader +// 34497 - Thrill of the Hunt +class spell_hun_thrill_of_the_hunt : public SpellScriptLoader  {      public: -        spell_hun_viper_attack_speed() : SpellScriptLoader("spell_hun_viper_attack_speed") { } +        spell_hun_thrill_of_the_hunt() : SpellScriptLoader("spell_hun_thrill_of_the_hunt") { } -        class spell_hun_viper_attack_speed_AuraScript : public AuraScript +        class spell_hun_thrill_of_the_hunt_AuraScript : public AuraScript          { -            PrepareAuraScript(spell_hun_viper_attack_speed_AuraScript); +            PrepareAuraScript(spell_hun_thrill_of_the_hunt_AuraScript);              bool Validate(SpellInfo const* /*spellInfo*/) override              { -                if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_ASPECT_OF_THE_VIPER) || -                    !sSpellMgr->GetSpellInfo(SPELL_HUNTER_VICIOUS_VIPER)) +                if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_THRILL_OF_THE_HUNT))                      return false;                  return true;              } -            void OnApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) +            void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)              { -                if (GetTarget()->HasAura(SPELL_HUNTER_ASPECT_OF_THE_VIPER)) -                    GetTarget()->CastSpell(GetTarget(), SPELL_HUNTER_VICIOUS_VIPER, true, NULL, aurEff); +                PreventDefaultAction(); +                int32 focus = eventInfo.GetDamageInfo()->GetSpellInfo()->CalcPowerCost(GetTarget(), SpellSchoolMask(eventInfo.GetDamageInfo()->GetSchoolMask())); +                focus = CalculatePct(focus, aurEff->GetAmount()); + +                GetTarget()->CastCustomSpell(GetTarget(), SPELL_HUNTER_THRILL_OF_THE_HUNT, &focus, NULL, NULL, true, NULL, aurEff);              } -            void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) +            void Register() override              { -                // possible exploit -                GetTarget()->RemoveAurasDueToSpell(SPELL_HUNTER_VICIOUS_VIPER); +                OnEffectProc += AuraEffectProcFn(spell_hun_thrill_of_the_hunt_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_hun_thrill_of_the_hunt_AuraScript(); +        } +}; + +// -56333 - T.N.T. +class spell_hun_tnt : public SpellScriptLoader +{ +    public: +        spell_hun_tnt() : SpellScriptLoader("spell_hun_tnt") { } + +        class spell_hun_tnt_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_hun_tnt_AuraScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_LOCK_AND_LOAD)) +                    return false; +                return true; +            } + +            bool CheckProc(ProcEventInfo& /*eventInfo*/) +            { +                return roll_chance_i(GetEffect(EFFECT_0)->GetAmount()); +            } + +            void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) +            { +                PreventDefaultAction(); +                GetTarget()->CastSpell(GetTarget(), SPELL_HUNTER_LOCK_AND_LOAD, true, NULL, aurEff);              }              void Register() override              { -                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); +                DoCheckProc += AuraCheckProcFn(spell_hun_tnt_AuraScript::CheckProc); +                OnEffectProc += AuraEffectProcFn(spell_hun_tnt_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);              }          };          AuraScript* GetAuraScript() const override          { -            return new spell_hun_viper_attack_speed_AuraScript(); +            return new spell_hun_tnt_AuraScript();          }  };  void AddSC_hunter_spell_scripts()  { -    new spell_hun_aspect_of_the_beast(); -    new spell_hun_ascpect_of_the_viper(); +    new spell_hun_ancient_hysteria();      new spell_hun_chimera_shot(); +    new spell_hun_cobra_shot();      new spell_hun_disengage(); +    new spell_hun_fire();      new spell_hun_improved_mend_pet(); +    new spell_hun_improved_serpent_sting();      new spell_hun_invigoration();      new spell_hun_last_stand_pet();      new spell_hun_masters_call(); @@ -925,10 +1097,14 @@ void AddSC_hunter_spell_scripts()      new spell_hun_misdirection_proc();      new spell_hun_pet_carrion_feeder();      new spell_hun_pet_heart_of_the_phoenix(); +    new spell_hun_rapid_recuperation();      new spell_hun_readiness(); +    new spell_hun_ready_set_aim();      new spell_hun_scatter_shot();      new spell_hun_sniper_training(); +    new spell_hun_steady_shot();      new spell_hun_tame_beast();      new spell_hun_target_only_pet_and_owner(); -    new spell_hun_viper_attack_speed(); +    new spell_hun_thrill_of_the_hunt(); +    new spell_hun_tnt();  } diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp index 41239b12921..a8f8dc1f31c 100644 --- a/src/server/scripts/Spells/spell_item.cpp +++ b/src/server/scripts/Spells/spell_item.cpp @@ -2525,51 +2525,6 @@ class spell_item_chicken_cover : public SpellScriptLoader          }  }; -enum Refocus -{ -    SPELL_AIMED_SHOT    = 19434, -    SPELL_MULTISHOT     = 2643, -    SPELL_VOLLEY        = 42243, -}; - -class spell_item_refocus : public SpellScriptLoader -{ -    public: -        spell_item_refocus() : SpellScriptLoader("spell_item_refocus") { } - -        class spell_item_refocus_SpellScript : public SpellScript -        { -            PrepareSpellScript(spell_item_refocus_SpellScript); - -            void HandleDummy(SpellEffIndex /*effIndex*/) -            { -                Player* caster = GetCaster()->ToPlayer(); - -                if (!caster || caster->getClass() != CLASS_HUNTER) -                    return; - -                if (caster->HasSpellCooldown(SPELL_AIMED_SHOT)) -                    caster->RemoveSpellCooldown(SPELL_AIMED_SHOT, true); - -                if (caster->HasSpellCooldown(SPELL_MULTISHOT)) -                    caster->RemoveSpellCooldown(SPELL_MULTISHOT, true); - -                if (caster->HasSpellCooldown(SPELL_VOLLEY)) -                    caster->RemoveSpellCooldown(SPELL_VOLLEY, true); -            } - -            void Register() override -            { -                OnEffectHitTarget += SpellEffectFn(spell_item_refocus_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); -            } -        }; - -        SpellScript* GetSpellScript() const override -        { -            return new spell_item_refocus_SpellScript(); -        } -}; -  class spell_item_muisek_vessel : public SpellScriptLoader  {      public: @@ -2677,7 +2632,6 @@ void AddSC_item_spell_scripts()      new spell_item_ashbringer();      new spell_magic_eater_food(); -    new spell_item_refocus();      new spell_item_shimmering_vessel();      new spell_item_purify_helboar_meat();      new spell_item_crystal_prison_dummy_dnd(); diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index a19a24d47e9..f72f6435b0c 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -25,18 +25,31 @@  #include "ScriptMgr.h"  #include "SpellScript.h"  #include "SpellAuraEffects.h" +#include "Pet.h" +#include "GridNotifiers.h"  enum MageSpells  { +    SPELL_ARCANCE_POTENCY_RANK_1                 = 31571, +    SPELL_ARCANCE_POTENCY_RANK_2                 = 31572, +    SPELL_ARCANCE_POTENCY_TRIGGER_RANK_1         = 57529, +    SPELL_ARCANCE_POTENCY_TRIGGER_RANK_2         = 57531, +    SPELL_MAGE_BLAZING_SPEED                     = 31643,      SPELL_MAGE_BURNOUT                           = 29077,      SPELL_MAGE_COLD_SNAP                         = 11958,      SPELL_MAGE_FOCUS_MAGIC_PROC                  = 54648, +    SPELL_MAGE_FROST_NOVA                        = 122,      SPELL_MAGE_FROST_WARDING_R1                  = 11189,      SPELL_MAGE_FROST_WARDING_TRIGGERED           = 57776, +    SPELL_MAGE_IMPROVED_POLYMORPH_RANK_1         = 11210, +    SPELL_MAGE_IMPROVED_POLYMORPH_STUN_RANK_1    = 83046, +    SPELL_MAGE_IMPROVED_POLYMORPH_MARKER         = 87515,      SPELL_MAGE_INCANTERS_ABSORBTION_R1           = 44394,      SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED    = 44413,      SPELL_MAGE_IGNITE                            = 12654,      SPELL_MAGE_MASTER_OF_ELEMENTS_ENERGIZE       = 29077, +    SPELL_MAGE_PERMAFROST                        = 91394, +    SPELL_MAGE_SLOW                              = 31589,      SPELL_MAGE_SQUIRREL_FORM                     = 32813,      SPELL_MAGE_GIRAFFE_FORM                      = 32816,      SPELL_MAGE_SERPENT_FORM                      = 32817, @@ -47,6 +60,95 @@ enum MageSpells      SPELL_MAGE_SUMMON_WATER_ELEMENTAL_PERMANENT  = 70908,      SPELL_MAGE_SUMMON_WATER_ELEMENTAL_TEMPORARY  = 70907,      SPELL_MAGE_GLYPH_OF_BLAST_WAVE               = 62126, + +    SPELL_MAGE_FLAMESTRIKE                       = 2120, + +    SPELL_MAGE_CHILLED_R1                        = 12484, +    SPELL_MAGE_CHILLED_R2                        = 12485, + +    SPELL_MAGE_CONE_OF_COLD_AURA_R1              = 11190, +    SPELL_MAGE_CONE_OF_COLD_AURA_R2              = 12489, +    SPELL_MAGE_CONE_OF_COLD_TRIGGER_R1           = 83301, +    SPELL_MAGE_CONE_OF_COLD_TRIGGER_R2           = 83302, + +    SPELL_MAGE_SHATTERED_BARRIER_R1              = 44745, +    SPELL_MAGE_SHATTERED_BARRIER_R2              = 54787, +    SPELL_MAGE_SHATTERED_BARRIER_FREEZE_R1       = 55080, +    SPELL_MAGE_SHATTERED_BARRIER_FREEZE_R2       = 83073, + +    SPELL_MAGE_IMPROVED_MANA_GEM_TRIGGERED       = 83098, + +    SPELL_MAGE_RING_OF_FROST_SUMMON              = 82676, +    SPELL_MAGE_RING_OF_FROST_FREEZE              = 82691, +    SPELL_MAGE_RING_OF_FROST_DUMMY               = 91264, + +    SPELL_MAGE_FINGERS_OF_FROST                  = 44544, +    SPELL_MAGE_TEMPORAL_DISPLACEMENT             = 80354, +}; + +enum MageIcons +{ +    ICON_MAGE_SHATTER                            = 976, +    ICON_MAGE_IMPROVED_FLAMESTRIKE               = 37, +    ICON_MAGE_IMPROVED_FREEZE                    = 94, +    ICON_MAGE_INCANTER_S_ABSORPTION              = 2941, +    ICON_MAGE_IMPROVED_MANA_GEM                  = 1036 +}; + +enum MiscSpells +{ +    SPELL_HUNTER_INSANITY                        = 95809, +    SPELL_PRIEST_SHADOW_WORD_DEATH               = 32409, +    SPELL_SHAMAN_EXHAUSTION                      = 57723, +    SPELL_SHAMAN_SATED                           = 57724 +}; + +// -31571 - Arcane Potency +class spell_mage_arcane_potency : public SpellScriptLoader +{ +    public: +        spell_mage_arcane_potency () : SpellScriptLoader("spell_mage_arcane_potency") { } + +        class spell_mage_arcane_potency_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_mage_arcane_potency_AuraScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_ARCANCE_POTENCY_RANK_1) || +                    !sSpellMgr->GetSpellInfo(SPELL_ARCANCE_POTENCY_RANK_2) || +                    !sSpellMgr->GetSpellInfo(SPELL_ARCANCE_POTENCY_TRIGGER_RANK_1) || +                    !sSpellMgr->GetSpellInfo(SPELL_ARCANCE_POTENCY_TRIGGER_RANK_2)) +                    return false; +                return true; +            } + +            void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) +            { +                PreventDefaultAction(); +                uint32 spellId = 0; + +                if (GetSpellInfo()->Id == SPELL_ARCANCE_POTENCY_RANK_1) +                    spellId = SPELL_ARCANCE_POTENCY_TRIGGER_RANK_1; +                else if (GetSpellInfo()->Id == SPELL_ARCANCE_POTENCY_RANK_2) +                    spellId = SPELL_ARCANCE_POTENCY_TRIGGER_RANK_2; +                if (!spellId) +                    return; + +                GetTarget()->CastSpell(GetTarget(), spellId, true, NULL, aurEff); + +            } + +            void Register() override +            { +                OnEffectProc += AuraEffectProcFn(spell_mage_arcane_potency_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_mage_arcane_potency_AuraScript(); +        }  };  // Incanter's Absorbtion @@ -74,7 +176,7 @@ class spell_mage_incanters_absorbtion_base_AuraScript : public AuraScript          }  }; -// -11113 - Blast Wave +// 11113 - Blast Wave  class spell_mage_blast_wave : public SpellScriptLoader  {      public: @@ -86,21 +188,40 @@ class spell_mage_blast_wave : public SpellScriptLoader              bool Validate(SpellInfo const* /*spellInfo*/) override              { -                if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_GLYPH_OF_BLAST_WAVE)) +                if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_FLAMESTRIKE))                      return false;                  return true;              } -            void HandleKnockBack(SpellEffIndex effIndex) +            void CountTargets(std::list<WorldObject*>& targetList)              { -                if (GetCaster()->HasAura(SPELL_MAGE_GLYPH_OF_BLAST_WAVE)) -                    PreventHitDefaultEffect(effIndex); +                _targetCount = targetList.size(); +            } + +            void HandleImprovedFlamestrike() +            { +                if (_targetCount >= 2) +                    if (AuraEffect* aurEff = GetCaster()->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_MAGE, ICON_MAGE_IMPROVED_FLAMESTRIKE, EFFECT_0)) +                        if (roll_chance_i(aurEff->GetAmount())) +                        { +                            float x, y, z; +                            WorldLocation const* loc = GetExplTargetDest(); +                            if (!loc) +                                return; + +                            loc->GetPosition(x, y, z); +                            GetCaster()->CastSpell(x, y, z, SPELL_MAGE_FLAMESTRIKE, true); +                        }              }              void Register() override              { -                OnEffectHitTarget += SpellEffectFn(spell_mage_blast_wave_SpellScript::HandleKnockBack, EFFECT_2, SPELL_EFFECT_KNOCK_BACK); +                OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mage_blast_wave_SpellScript::CountTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); +                AfterCast += SpellCastFn(spell_mage_blast_wave_SpellScript::HandleImprovedFlamestrike);              } + +        private: +            uint32 _targetCount;          };          SpellScript* GetSpellScript() const override @@ -109,51 +230,85 @@ class spell_mage_blast_wave : public SpellScriptLoader          }  }; -// -44449 - Burnout -class spell_mage_burnout : public SpellScriptLoader +// -31641 - Blazing Speed +class spell_mage_blazing_speed : public SpellScriptLoader  {      public: -        spell_mage_burnout() : SpellScriptLoader("spell_mage_burnout") { } +        spell_mage_blazing_speed() : SpellScriptLoader("spell_mage_blazing_speed") { } -        class spell_mage_burnout_AuraScript : public AuraScript +        class spell_mage_blazing_speed_AuraScript : public AuraScript          { -            PrepareAuraScript(spell_mage_burnout_AuraScript); +            PrepareAuraScript(spell_mage_blazing_speed_AuraScript);              bool Validate(SpellInfo const* /*spellInfo*/) override              { -                if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_BURNOUT)) +                if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_BLAZING_SPEED))                      return false;                  return true;              } -            bool CheckProc(ProcEventInfo& eventInfo) -            { -                return eventInfo.GetDamageInfo()->GetSpellInfo() != nullptr; -            } - -            void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) +            void OnProc(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, SPELLVALUE_BASE_POINT0, mana, GetTarget(), true, NULL, aurEff); +                GetTarget()->CastSpell(GetTarget(), SPELL_MAGE_BLAZING_SPEED, true, NULL, aurEff);              }              void Register() override              { -                DoCheckProc += AuraCheckProcFn(spell_mage_burnout_AuraScript::CheckProc); -                OnEffectProc += AuraEffectProcFn(spell_mage_burnout_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_DUMMY); +                OnEffectProc += AuraEffectProcFn(spell_mage_blazing_speed_AuraScript::OnProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);              }          };          AuraScript* GetAuraScript() const override          { -            return new spell_mage_burnout_AuraScript(); +            return new spell_mage_blazing_speed_AuraScript();          }  }; +// 42208 - Blizzard +/// Updated 4.3.4 +class spell_mage_blizzard : public SpellScriptLoader +{ +   public: +       spell_mage_blizzard() : SpellScriptLoader("spell_mage_blizzard") { } + +       class spell_mage_blizzard_SpellScript : public SpellScript +       { +           PrepareSpellScript(spell_mage_blizzard_SpellScript); + +           bool Validate(SpellInfo const* /*spellInfo*/) +           { +               if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_CHILLED_R1)) +                   return false; +               if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_CHILLED_R2)) +                   return false; +               return true; +           } + +           void AddChillEffect(SpellEffIndex /*effIndex*/) +           { +               Unit* caster = GetCaster(); +               if (Unit* unitTarget = GetHitUnit()) +               { +                   if (caster->IsScriptOverriden(GetSpellInfo(), 836)) +                       caster->CastSpell(unitTarget, SPELL_MAGE_CHILLED_R1, true); +                   else if (caster->IsScriptOverriden(GetSpellInfo(), 988)) +                       caster->CastSpell(unitTarget, SPELL_MAGE_CHILLED_R2, true); +               } +           } + +           void Register() +           { +               OnEffectHitTarget += SpellEffectFn(spell_mage_blizzard_SpellScript::AddChillEffect, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); +           } +       }; + +       SpellScript* GetSpellScript() const +       { +           return new spell_mage_blizzard_SpellScript(); +       } +}; +  // 11958 - Cold Snap  class spell_mage_cold_snap : public SpellScriptLoader  { @@ -201,8 +356,113 @@ class spell_mage_cold_snap : public SpellScriptLoader          }  }; -// -543  - Fire Ward -// -6143 - Frost Ward +// 120 - Cone of Cold +/// Updated 4.3.4 +class spell_mage_cone_of_cold : public SpellScriptLoader +{ +    public: +        spell_mage_cone_of_cold() : SpellScriptLoader("spell_mage_cone_of_cold") { } + +        class spell_mage_cone_of_cold_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_mage_cone_of_cold_SpellScript); + +            void HandleConeOfColdScript(SpellEffIndex /*effIndex*/) +            { +                Unit* caster = GetCaster(); +                if (Unit* unitTarget = GetHitUnit()) +                { +                    if (caster->HasAura(SPELL_MAGE_CONE_OF_COLD_AURA_R1)) // Improved Cone of Cold Rank 1 +                        unitTarget->CastSpell(unitTarget, SPELL_MAGE_CONE_OF_COLD_TRIGGER_R1, true); +                    else if (caster->HasAura(SPELL_MAGE_CONE_OF_COLD_AURA_R2)) // Improved Cone of Cold Rank 2 +                        unitTarget->CastSpell(unitTarget, SPELL_MAGE_CONE_OF_COLD_TRIGGER_R2, true); +                } +            } + +            void Register() override +            { +                OnEffectHitTarget += SpellEffectFn(spell_mage_cone_of_cold_SpellScript::HandleConeOfColdScript, EFFECT_0, SPELL_EFFECT_APPLY_AURA); +            } +        }; + +        SpellScript* GetSpellScript() const override +        { +            return new spell_mage_cone_of_cold_SpellScript(); +        } +}; + +// 42955 Conjure Refreshment +/// Updated 4.3.4 +struct ConjureRefreshmentData +{ +    uint32 minLevel; +    uint32 maxLevel; +    uint32 spellId; +}; + +uint8 const MAX_CONJURE_REFRESHMENT_SPELLS = 7; +ConjureRefreshmentData const _conjureData[MAX_CONJURE_REFRESHMENT_SPELLS] = +{ +    { 33, 43, 92739 }, +    { 44, 53, 92799 }, +    { 54, 63, 92802 }, +    { 64, 73, 92805 }, +    { 74, 79, 74625 }, +    { 80, 84, 92822 }, +    { 85, 85, 92727 } +}; + +// 42955 - Conjure Refreshment +class spell_mage_conjure_refreshment : public SpellScriptLoader +{ +    public: +        spell_mage_conjure_refreshment() : SpellScriptLoader("spell_mage_conjure_refreshment") { } + +        class spell_mage_conjure_refreshment_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_mage_conjure_refreshment_SpellScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                for (uint8 i = 0; i < MAX_CONJURE_REFRESHMENT_SPELLS; ++i) +                    if (!sSpellMgr->GetSpellInfo(_conjureData[i].spellId)) +                        return false; +                return true; +            } + +            bool Load() override +            { +                if (GetCaster()->GetTypeId() != TYPEID_PLAYER) +                    return false; +                return true; +            } + +            void HandleDummy(SpellEffIndex /*effIndex*/) +            { +                uint8 level = GetHitUnit()->getLevel(); +                for (uint8 i = 0; i < MAX_CONJURE_REFRESHMENT_SPELLS; ++i) +                { +                    ConjureRefreshmentData const& spellData = _conjureData[i]; +                    if (level < spellData.minLevel || level > spellData.maxLevel) +                        continue; +                    GetHitUnit()->CastSpell(GetHitUnit(), spellData.spellId); +                    break; +                } +            } + +            void Register() override +            { +                OnEffectHitTarget += SpellEffectFn(spell_mage_conjure_refreshment_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); +            } +        }; + +        SpellScript* GetSpellScript() const override +        { +            return new spell_mage_conjure_refreshment_SpellScript(); +        } +}; + +// 543  - Fire War  class spell_mage_fire_frost_ward : public SpellScriptLoader  {      public: @@ -214,9 +474,8 @@ class spell_mage_fire_frost_ward : public SpellScriptLoader              bool Validate(SpellInfo const* /*spellInfo*/) override              { -                if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_FROST_WARDING_TRIGGERED)) -                    return false; -                if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_FROST_WARDING_R1)) +                if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_FROST_WARDING_TRIGGERED) || +                    !sSpellMgr->GetSpellInfo(SPELL_MAGE_FROST_WARDING_R1))                      return false;                  return true;              } @@ -319,97 +578,154 @@ class spell_mage_focus_magic : public SpellScriptLoader          }  }; -// -11426 - Ice Barrier -class spell_mage_ice_barrier : public SpellScriptLoader +// 116 - Frostbolt +/// Updated 4.3.4 +class spell_mage_frostbolt : public SpellScriptLoader +{ +   public: +       spell_mage_frostbolt() : SpellScriptLoader("spell_mage_frostbolt") { } + +       class spell_mage_frostbolt_SpellScript : public SpellScript +       { +           PrepareSpellScript(spell_mage_frostbolt_SpellScript); + +           void RecalculateDamage(SpellEffIndex /*effIndex*/) +           { +               if (GetHitUnit() && GetHitUnit()->HasAuraState(AURA_STATE_FROZEN, GetSpellInfo(), GetCaster())) +               { +                   if (AuraEffect* aurEff = GetCaster()->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_MAGE, ICON_MAGE_SHATTER, EFFECT_1)) +                   { +                       int32 damage = GetHitDamage(); +                       AddPct(damage, aurEff->GetAmount()); +                       SetHitDamage(damage); +                   } +               } +           } + +           void Register() +           { +               OnEffectHitTarget += SpellEffectFn(spell_mage_frostbolt_SpellScript::RecalculateDamage, EFFECT_1, SPELL_EFFECT_SCHOOL_DAMAGE); +           } +       }; + +       SpellScript* GetSpellScript() const +       { +           return new spell_mage_frostbolt_SpellScript(); +       } +}; + +// 56372 - Glyph of Ice Block +class spell_mage_glyph_of_ice_block : public SpellScriptLoader  {      public: -        spell_mage_ice_barrier() : SpellScriptLoader("spell_mage_ice_barrier") { } +        spell_mage_glyph_of_ice_block() : SpellScriptLoader("spell_mage_glyph_of_ice_block") { } -        class spell_mage_ice_barrier_AuraScript : public spell_mage_incanters_absorbtion_base_AuraScript +        class spell_mage_glyph_of_ice_block_AuraScript : public AuraScript          { -            PrepareAuraScript(spell_mage_ice_barrier_AuraScript); +            PrepareAuraScript(spell_mage_glyph_of_ice_block_AuraScript); -            void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& canBeRecalculated) +            bool Validate(SpellInfo const* /*spellInfo*/) override              { -                canBeRecalculated = false; -                if (Unit* caster = GetCaster()) -                { -                    // +80.68% from sp bonus -                    float bonus = 0.8068f; +                if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_FROST_NOVA)) +                    return false; +                return true; +            } -                    bonus *= caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask()); +            bool CheckProc(ProcEventInfo& /*eventInfo*/) +            { +                return GetTarget()->GetTypeId() == TYPEID_PLAYER; +            } -                    // 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(GetSpellInfo(), aurEff->GetEffIndex(), bonus); +            void HandleEffectProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) +            { +                PreventDefaultAction(); +                // Remove Frost Nova cooldown +                GetTarget()->ToPlayer()->RemoveSpellCooldown(SPELL_MAGE_FROST_NOVA, true); +            } -                    bonus *= caster->CalculateLevelPenalty(GetSpellInfo()); +            void Register() override +            { +                DoCheckProc += AuraCheckProcFn(spell_mage_glyph_of_ice_block_AuraScript::CheckProc); +                OnEffectProc += AuraEffectProcFn(spell_mage_glyph_of_ice_block_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY); +            } +        }; -                    amount += int32(bonus); -                } +        AuraScript* GetAuraScript() const override +        { +            return new spell_mage_glyph_of_ice_block_AuraScript(); +        } +}; + +// 56374 - Glyph of Icy Veins +class spell_mage_glyph_of_icy_veins : public SpellScriptLoader +{ +    public: +        spell_mage_glyph_of_icy_veins() : SpellScriptLoader("spell_mage_glyph_of_icy_veins") { } + +        class spell_mage_glyph_of_icy_veins_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_mage_glyph_of_icy_veins_AuraScript); + +            void HandleEffectProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) +            { +                PreventDefaultAction(); + +                GetTarget()->RemoveAurasByType(SPELL_AURA_HASTE_SPELLS, 0, 0, true, false); +                GetTarget()->RemoveAurasByType(SPELL_AURA_MOD_DECREASE_SPEED);              }              void Register() override              { -                DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_ice_barrier_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); -                AfterEffectAbsorb += AuraEffectAbsorbFn(spell_mage_ice_barrier_AuraScript::Trigger, EFFECT_0); +                OnEffectProc += AuraEffectProcFn(spell_mage_glyph_of_icy_veins_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);              }          };          AuraScript* GetAuraScript() const override          { -            return new spell_mage_ice_barrier_AuraScript(); +            return new spell_mage_glyph_of_icy_veins_AuraScript();          }  }; -// -11119 - Ignite -class spell_mage_ignite : public SpellScriptLoader +// 56375 - Glyph of Polymorph +class spell_mage_glyph_of_polymorph : public SpellScriptLoader  {      public: -        spell_mage_ignite() : SpellScriptLoader("spell_mage_ignite") { } +        spell_mage_glyph_of_polymorph() : SpellScriptLoader("spell_mage_glyph_of_polymorph") { } -        class spell_mage_ignite_AuraScript : public AuraScript +        class spell_mage_glyph_of_polymorph_AuraScript : public AuraScript          { -            PrepareAuraScript(spell_mage_ignite_AuraScript); +            PrepareAuraScript(spell_mage_glyph_of_polymorph_AuraScript);              bool Validate(SpellInfo const* /*spellInfo*/) override              { -                if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_IGNITE)) +                if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_SHADOW_WORD_DEATH))                      return false;                  return true;              } -            bool CheckProc(ProcEventInfo& eventInfo) -            { -                return eventInfo.GetProcTarget() != nullptr; -            } - -            void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) +            void HandleEffectProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo)              {                  PreventDefaultAction(); +                Unit* target = eventInfo.GetProcTarget(); -                SpellInfo const* igniteDot = sSpellMgr->EnsureSpellInfo(SPELL_MAGE_IGNITE); -                int32 pct = 8 * GetSpellInfo()->GetRank(); - -                int32 amount = int32(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), pct) / igniteDot->GetMaxTicks()); -                amount += eventInfo.GetProcTarget()->GetRemainingPeriodicAmount(eventInfo.GetActor()->GetGUID(), SPELL_MAGE_IGNITE, SPELL_AURA_PERIODIC_DAMAGE); -                GetTarget()->CastCustomSpell(SPELL_MAGE_IGNITE, SPELLVALUE_BASE_POINT0, amount, eventInfo.GetProcTarget(), true, NULL, aurEff); +                target->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE, 0, target->GetAura(SPELL_PRIEST_SHADOW_WORD_DEATH)); // SW:D shall not be removed. +                target->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT); +                target->RemoveAurasByType(SPELL_AURA_PERIODIC_LEECH);              }              void Register() override              { -                DoCheckProc += AuraCheckProcFn(spell_mage_ignite_AuraScript::CheckProc); -                OnEffectProc += AuraEffectProcFn(spell_mage_ignite_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); +                OnEffectProc += AuraEffectProcFn(spell_mage_glyph_of_polymorph_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);              }          };          AuraScript* GetAuraScript() const override          { -            return new spell_mage_ignite_AuraScript(); +            return new spell_mage_glyph_of_polymorph_AuraScript();          }  }; -// -44457 - Living Bomb +// 44457 - Living Bomb  class spell_mage_living_bomb : public SpellScriptLoader  {      public: @@ -419,9 +735,9 @@ class spell_mage_living_bomb : public SpellScriptLoader          {              PrepareAuraScript(spell_mage_living_bomb_AuraScript); -            bool Validate(SpellInfo const* spell) override +            bool Validate(SpellInfo const* spellInfo)              { -                if (!sSpellMgr->GetSpellInfo(uint32(spell->Effects[EFFECT_1].CalcValue()))) +                if (!sSpellMgr->GetSpellInfo(uint32(spellInfo->Effects[EFFECT_1].CalcValue())))                      return false;                  return true;              } @@ -448,44 +764,166 @@ class spell_mage_living_bomb : public SpellScriptLoader          }  }; -// -1463 - Mana Shield -class spell_mage_mana_shield : public SpellScriptLoader +// 11426 - Ice Barrier +/// Updated 4.3.4 +class spell_mage_ice_barrier : public SpellScriptLoader +{ +   public: +       spell_mage_ice_barrier() : SpellScriptLoader("spell_mage_ice_barrier") { } + +       class spell_mage_ice_barrier_AuraScript : public AuraScript +       { +           PrepareAuraScript(spell_mage_ice_barrier_AuraScript); + +           void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) +           { +               canBeRecalculated = false; +               if (Unit* caster = GetCaster()) +                   amount += int32(0.87f * caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask())); +           } + +           void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) +           { +               if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_ENEMY_SPELL) +                   return; + +               if (GetTarget()->HasAura(SPELL_MAGE_SHATTERED_BARRIER_R1)) +                   GetTarget()->CastSpell(GetTarget(), SPELL_MAGE_SHATTERED_BARRIER_FREEZE_R1, true); +               else if (GetTarget()->HasAura(SPELL_MAGE_SHATTERED_BARRIER_R2)) +                   GetTarget()->CastSpell(GetTarget(), SPELL_MAGE_SHATTERED_BARRIER_FREEZE_R2, true); +           } + +           void Register() +           { +                DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_ice_barrier_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); +                AfterEffectRemove += AuraEffectRemoveFn(spell_mage_ice_barrier_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB, AURA_EFFECT_HANDLE_REAL); +           } +       }; + +       AuraScript* GetAuraScript() const override +       { +           return new spell_mage_ice_barrier_AuraScript(); +       } +}; + +// -11119 - Ignite +class spell_mage_ignite : public SpellScriptLoader  {      public: -        spell_mage_mana_shield() : SpellScriptLoader("spell_mage_mana_shield") { } +        spell_mage_ignite() : SpellScriptLoader("spell_mage_ignite") { } -        class spell_mage_mana_shield_AuraScript : public spell_mage_incanters_absorbtion_base_AuraScript +        class spell_mage_ignite_AuraScript : public AuraScript          { -            PrepareAuraScript(spell_mage_mana_shield_AuraScript); +            PrepareAuraScript(spell_mage_ignite_AuraScript); -            void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) +            bool Validate(SpellInfo const* /*spellInfo*/) override              { -                canBeRecalculated = false; -                if (Unit* caster = GetCaster()) -                { -                    // +80.53% from sp bonus -                    float bonus = 0.8053f; +                if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_IGNITE)) +                    return false; +                return true; +            } -                    bonus *= caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask()); -                    bonus *= caster->CalculateLevelPenalty(GetSpellInfo()); +            bool CheckProc(ProcEventInfo& eventInfo) +            { +                return eventInfo.GetProcTarget() != nullptr; +            } -                    amount += int32(bonus); -                } +            void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) +            { +                PreventDefaultAction(); + +                SpellInfo const* igniteDot = sSpellMgr->EnsureSpellInfo(SPELL_MAGE_IGNITE); +                int32 pct = 8 * GetSpellInfo()->GetRank(); + +                int32 amount = int32(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), pct) / igniteDot->GetMaxTicks()); +                amount += eventInfo.GetProcTarget()->GetRemainingPeriodicAmount(eventInfo.GetActor()->GetGUID(), SPELL_MAGE_IGNITE, SPELL_AURA_PERIODIC_DAMAGE); +                GetTarget()->CastCustomSpell(SPELL_MAGE_IGNITE, SPELLVALUE_BASE_POINT0, amount, eventInfo.GetProcTarget(), true, NULL, aurEff);              }              void Register() override              { -                DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_mana_shield_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MANA_SHIELD); -                AfterEffectManaShield += AuraEffectManaShieldFn(spell_mage_mana_shield_AuraScript::Trigger, EFFECT_0); +                DoCheckProc += AuraCheckProcFn(spell_mage_ignite_AuraScript::CheckProc); +                OnEffectProc += AuraEffectProcFn(spell_mage_ignite_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);              }          };          AuraScript* GetAuraScript() const override          { -            return new spell_mage_mana_shield_AuraScript(); +            return new spell_mage_ignite_AuraScript();          }  }; +// 543 - Mage Ward +/// Updated 4.3.4 +class spell_mage_mage_ward : public SpellScriptLoader +{ +   public: +       spell_mage_mage_ward() : SpellScriptLoader("spell_mage_mage_ward") { } + +       class spell_mage_mage_ward_AuraScript : public AuraScript +       { +           PrepareAuraScript(spell_mage_mage_ward_AuraScript); + +           void HandleAbsorb(AuraEffect* /*aurEff*/, DamageInfo & /*dmgInfo*/, uint32 & absorbAmount) +           { +               if (AuraEffect* aurEff = GetTarget()->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_GENERIC, ICON_MAGE_INCANTER_S_ABSORPTION, EFFECT_0)) +               { +                   int32 bp = CalculatePct(absorbAmount, aurEff->GetAmount()); +                   GetTarget()->CastCustomSpell(GetTarget(), SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED, &bp, NULL, NULL, true); +               } +           } + +            void Register() override +           { +               AfterEffectAbsorb += AuraEffectAbsorbFn(spell_mage_mage_ward_AuraScript::HandleAbsorb, EFFECT_0); +           } +       }; + +        AuraScript* GetAuraScript() const override +       { +           return new spell_mage_mage_ward_AuraScript(); +       } +}; + +// 1463 - Mana Shield +/// Updated 4.3.4 +class spell_mage_mana_shield : public SpellScriptLoader +{ +    public: +       spell_mage_mana_shield() : SpellScriptLoader("spell_mage_mana_shield") { } + +       class spell_mage_mana_shield_AuraScript : public AuraScript +       { +           PrepareAuraScript(spell_mage_mana_shield_AuraScript); + +           void HandleAbsorb(AuraEffect* /*aurEff*/, DamageInfo & /*dmgInfo*/, uint32 & absorbAmount) +           { +               if (AuraEffect* aurEff = GetTarget()->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_GENERIC, ICON_MAGE_INCANTER_S_ABSORPTION, EFFECT_0)) +               { +                   int32 bp = CalculatePct(absorbAmount, aurEff->GetAmount()); +                   GetTarget()->CastCustomSpell(GetTarget(), SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED, &bp, NULL, NULL, true); +               } +           } + +           void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) +           { +               if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_ENEMY_SPELL) +                   GetTarget()->CastSpell(GetTarget(), SPELL_MAGE_INCANTERS_ABSORBTION_R1, true); +           } + +           void Register() override +           { +                AfterEffectManaShield += AuraEffectManaShieldFn(spell_mage_mana_shield_AuraScript::HandleAbsorb, EFFECT_0); +                AfterEffectRemove += AuraEffectRemoveFn(spell_mage_mana_shield_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_MANA_SHIELD, AURA_EFFECT_HANDLE_REAL); +           } +       }; + +        AuraScript* GetAuraScript() const override +       { +           return new spell_mage_mana_shield_AuraScript(); +       } +}; +  // -29074 - Master of Elements  class spell_mage_master_of_elements : public SpellScriptLoader  { @@ -532,9 +970,158 @@ class spell_mage_master_of_elements : public SpellScriptLoader          }  }; +// 86181 - Nether Vortex +class spell_mage_nether_vortex : public SpellScriptLoader +{ +    public: +        spell_mage_nether_vortex() : SpellScriptLoader("spell_mage_nether_vortex") { } + +        class spell_mage_nether_vortex_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_mage_nether_vortex_AuraScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_SLOW)) +                    return false; +               return true; +            } + +            bool DoCheck(ProcEventInfo& eventInfo) +            { +                if (Aura* aura = eventInfo.GetProcTarget()->GetAura(SPELL_MAGE_SLOW)) +                    if (aura->GetCasterGUID() != GetTarget()->GetGUID()) +                        return false; + +                return true; +            } + +            void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) +            { +                PreventDefaultAction(); +                GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_MAGE_SLOW, true, NULL, aurEff); +            } + +            void Register() override +            { +                DoCheckProc += AuraCheckProcFn(spell_mage_nether_vortex_AuraScript::DoCheck); +                OnEffectProc += AuraEffectProcFn(spell_mage_nether_vortex_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_mage_nether_vortex_AuraScript(); +        } +}; + +// -11175 - Permafrost +class spell_mage_permafrost : public SpellScriptLoader +{ +    public: +        spell_mage_permafrost() : SpellScriptLoader("spell_mage_permafrost") { } + +        class spell_mage_permafrost_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_mage_permafrost_AuraScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_PERMAFROST)) +                    return false; +               return true; +            } + +            bool DoCheck(ProcEventInfo& eventInfo) +            { +                return GetTarget()->GetGuardianPet() && eventInfo.GetDamageInfo()->GetDamage(); +            } + +            void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) +            { +                PreventDefaultAction(); + +                int32 heal = int32(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount())); +                GetTarget()->CastCustomSpell(SPELL_MAGE_PERMAFROST, SPELLVALUE_BASE_POINT0, heal, (Unit*)NULL, true, NULL, aurEff); +            } + +            void Register() override +            { +                DoCheckProc += AuraCheckProcFn(spell_mage_permafrost_AuraScript::DoCheck); +                OnEffectProc += AuraEffectProcFn(spell_mage_permafrost_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_mage_permafrost_AuraScript(); +        } +}; + +// 118 - Polymorph +class spell_mage_polymorph : public SpellScriptLoader +{ +    public: +        spell_mage_polymorph() : SpellScriptLoader("spell_mage_polymorph") { } + +        class spell_mage_polymorph_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_mage_polymorph_AuraScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_IMPROVED_POLYMORPH_RANK_1) || +                    !sSpellMgr->GetSpellInfo(SPELL_MAGE_IMPROVED_POLYMORPH_STUN_RANK_1) || +                    !sSpellMgr->GetSpellInfo(SPELL_MAGE_IMPROVED_POLYMORPH_MARKER)) +                    return false; +               return true; +            } + +            bool Load() override +            { +                _caster = NULL; +                return true; +            } + +            bool DoCheck(ProcEventInfo& eventInfo) +            { +                _caster = GetCaster(); +                return _caster && eventInfo.GetDamageInfo(); +            } + +            void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) +            { +                PreventDefaultAction(); +                // Improved Polymorph +                if (AuraEffect const* improvedPolymorph = _caster->GetAuraEffectOfRankedSpell(SPELL_MAGE_IMPROVED_POLYMORPH_RANK_1, EFFECT_0)) +                { +                    if (_caster->HasAura(SPELL_MAGE_IMPROVED_POLYMORPH_MARKER)) +                        return; + +                    GetTarget()->CastSpell(GetTarget(), sSpellMgr->GetSpellWithRank(SPELL_MAGE_IMPROVED_POLYMORPH_STUN_RANK_1, improvedPolymorph->GetSpellInfo()->GetRank()), true, NULL, aurEff); +                    _caster->CastSpell(_caster, SPELL_MAGE_IMPROVED_POLYMORPH_MARKER, true, NULL, aurEff); +                } +            } + +            void Register() override +            { +                DoCheckProc += AuraCheckProcFn(spell_mage_polymorph_AuraScript::DoCheck); +                OnEffectProc += AuraEffectProcFn(spell_mage_polymorph_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_MOD_CONFUSE); +            } + +        private: +            Unit* _caster; +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_mage_polymorph_AuraScript(); +        } +}; +  enum SilvermoonPolymorph  { -    NPC_AUROSALIA   = 18744, +    NPC_AUROSALIA       = 18744  };  /// @todo move out of here and rename - not a mage spell @@ -553,7 +1140,7 @@ class spell_mage_polymorph_cast_visual : public SpellScriptLoader              bool Validate(SpellInfo const* /*spellInfo*/) override              {                  // check if spell ids exist in dbc -                for (uint32 i = 0; i < 6; ++i) +                for (uint32 i = 0; i < 6; i++)                      if (!sSpellMgr->GetSpellInfo(PolymorhForms[i]))                          return false;                  return true; @@ -568,6 +1155,7 @@ class spell_mage_polymorph_cast_visual : public SpellScriptLoader              void Register() override              { +                // add dummy effect spell handler to Polymorph visual                  OnEffectHitTarget += SpellEffectFn(spell_mage_polymorph_cast_visual_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);              }          }; @@ -578,7 +1166,7 @@ class spell_mage_polymorph_cast_visual : public SpellScriptLoader          }  }; -const uint32 spell_mage_polymorph_cast_visual::spell_mage_polymorph_cast_visual_SpellScript::PolymorhForms[6] = +uint32 const spell_mage_polymorph_cast_visual::spell_mage_polymorph_cast_visual_SpellScript::PolymorhForms[6] =  {      SPELL_MAGE_SQUIRREL_FORM,      SPELL_MAGE_GIRAFFE_FORM, @@ -588,57 +1176,322 @@ const uint32 spell_mage_polymorph_cast_visual::spell_mage_polymorph_cast_visual_      SPELL_MAGE_SHEEP_FORM  }; -// 31687 - Summon Water Elemental -class spell_mage_summon_water_elemental : public SpellScriptLoader +// 5405  - Replenish Mana (Mana Gem) +/// Updated 4.3.4 +class spell_mage_replenish_mana : public SpellScriptLoader +{ +   public: +       spell_mage_replenish_mana() : SpellScriptLoader("spell_mage_replenish_mana") { } + +       class spell_mage_replenish_mana_SpellScript : public SpellScript +       { +           PrepareSpellScript(spell_mage_replenish_mana_SpellScript); + +           bool Validate(SpellInfo const* /*spellInfo*/) +           { +               if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_IMPROVED_MANA_GEM_TRIGGERED)) +                   return false; +               return true; +           } + +           void HandleImprovedManaGem() +           { +               if (AuraEffect* aurEff = GetCaster()->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_MAGE, ICON_MAGE_IMPROVED_MANA_GEM, EFFECT_0)) +               { +                   int32 bp = CalculatePct(GetCaster()->GetMaxPower(POWER_MANA), aurEff->GetAmount()); +                   GetCaster()->CastCustomSpell(GetCaster(), SPELL_MAGE_IMPROVED_MANA_GEM_TRIGGERED, &bp, &bp, NULL, true); +               } +           } + +           void Register() +           { +               AfterCast += SpellCastFn(spell_mage_replenish_mana_SpellScript::HandleImprovedManaGem); +           } +       }; + +       SpellScript* GetSpellScript() const +       { +           return new spell_mage_replenish_mana_SpellScript(); +       } +}; + +// 82676 - Ring of Frost +/// Updated 4.3.4 +class spell_mage_ring_of_frost : public SpellScriptLoader  {      public: -        spell_mage_summon_water_elemental() : SpellScriptLoader("spell_mage_summon_water_elemental") { } +        spell_mage_ring_of_frost() : SpellScriptLoader("spell_mage_ring_of_frost") { } -        class spell_mage_summon_water_elemental_SpellScript : public SpellScript +        class spell_mage_ring_of_frost_AuraScript : public AuraScript          { -            PrepareSpellScript(spell_mage_summon_water_elemental_SpellScript); +            PrepareAuraScript(spell_mage_ring_of_frost_AuraScript);              bool Validate(SpellInfo const* /*spellInfo*/) override              { -                if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_GLYPH_OF_ETERNAL_WATER) || !sSpellMgr->GetSpellInfo(SPELL_MAGE_SUMMON_WATER_ELEMENTAL_TEMPORARY) || !sSpellMgr->GetSpellInfo(SPELL_MAGE_SUMMON_WATER_ELEMENTAL_PERMANENT)) +                if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_RING_OF_FROST_SUMMON)) +                    return false; +                if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_RING_OF_FROST_FREEZE)) +                    return false; +                if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_RING_OF_FROST_DUMMY))                      return false;                  return true;              } -            void HandleDummy(SpellEffIndex /*effIndex*/) +            bool Load() override              { -                Unit* caster = GetCaster(); -                // 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); +                ringOfFrost = NULL; +                return true; +            } + +            void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) +            { +                if (ringOfFrost) +                    if (GetMaxDuration() - (int32)ringOfFrost->GetTimer() >= sSpellMgr->GetSpellInfo(SPELL_MAGE_RING_OF_FROST_DUMMY)->GetDuration()) +                        GetTarget()->CastSpell(ringOfFrost->GetPositionX(), ringOfFrost->GetPositionY(), ringOfFrost->GetPositionZ(), SPELL_MAGE_RING_OF_FROST_FREEZE, true); +            } + +            void Apply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) +            { +                std::list<Creature*> MinionList; +                GetTarget()->GetAllMinionsByEntry(MinionList, GetSpellInfo()->Effects[EFFECT_0].MiscValue); + +                // Get the last summoned RoF, save it and despawn older ones +                for (std::list<Creature*>::iterator itr = MinionList.begin(); itr != MinionList.end(); itr++) +                { +                    TempSummon* summon = (*itr)->ToTempSummon(); + +                    if (ringOfFrost && summon) +                    { +                        if (summon->GetTimer() > ringOfFrost->GetTimer()) +                        { +                            ringOfFrost->DespawnOrUnsummon(); +                            ringOfFrost = summon; +                        } +                        else +                            summon->DespawnOrUnsummon(); +                    } +                    else if (summon) +                        ringOfFrost = summon; +                } +            } + +            TempSummon* ringOfFrost; + +            void Register() override +            { +                 OnEffectPeriodic += AuraEffectPeriodicFn(spell_mage_ring_of_frost_AuraScript::HandleEffectPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL); +                 OnEffectApply += AuraEffectApplyFn(spell_mage_ring_of_frost_AuraScript::Apply, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_mage_ring_of_frost_AuraScript(); +        } +}; + +// 82691 - Ring of Frost (freeze efect) +/// Updated 4.3.4 +class spell_mage_ring_of_frost_freeze : public SpellScriptLoader +{ +    public: +        spell_mage_ring_of_frost_freeze() : SpellScriptLoader("spell_mage_ring_of_frost_freeze") { } + +        class spell_mage_ring_of_frost_freeze_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_mage_ring_of_frost_freeze_SpellScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_RING_OF_FROST_SUMMON)) +                    return false; +                if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_RING_OF_FROST_FREEZE)) +                    return false; +                return true; +            } + +            void FilterTargets(std::list<WorldObject*>& targets) +            { +                float outRadius = sSpellMgr->GetSpellInfo(SPELL_MAGE_RING_OF_FROST_SUMMON)->Effects[EFFECT_0].CalcRadius(); +                float inRadius  = 4.7f; + +                for (std::list<WorldObject*>::iterator itr = targets.begin(); itr != targets.end(); ++itr) +                    if (Unit* unit = (*itr)->ToUnit()) +                        if (unit->HasAura(SPELL_MAGE_RING_OF_FROST_DUMMY) || unit->HasAura(SPELL_MAGE_RING_OF_FROST_FREEZE) || unit->GetExactDist(GetExplTargetDest()) > outRadius || unit->GetExactDist(GetExplTargetDest()) < inRadius) +                            targets.erase(itr--); +            } + +            void Register() override +            { +                OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mage_ring_of_frost_freeze_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); +            } +        }; + +        SpellScript* GetSpellScript() const override +        { +            return new spell_mage_ring_of_frost_freeze_SpellScript(); +        } + +        class spell_mage_ring_of_frost_freeze_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_mage_ring_of_frost_freeze_AuraScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_RING_OF_FROST_DUMMY)) +                    return false; +                return true; +            } + +            void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) +            { +                if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) +                    if (GetCaster()) +                        GetCaster()->CastSpell(GetTarget(), SPELL_MAGE_RING_OF_FROST_DUMMY, true); +            } + +            void Register() override +            { +                AfterEffectRemove += AuraEffectRemoveFn(spell_mage_ring_of_frost_freeze_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_mage_ring_of_frost_freeze_AuraScript(); +        } +}; + +// 80353 - Time Warp +class spell_mage_time_warp : public SpellScriptLoader +{ +    public: +        spell_mage_time_warp() : SpellScriptLoader("spell_mage_time_warp") { } + +        class spell_mage_time_warp_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_mage_time_warp_SpellScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_TEMPORAL_DISPLACEMENT) +                    || !sSpellMgr->GetSpellInfo(SPELL_HUNTER_INSANITY) +                    || !sSpellMgr->GetSpellInfo(SPELL_SHAMAN_EXHAUSTION) +                    || !sSpellMgr->GetSpellInfo(SPELL_SHAMAN_SATED)) +                    return false; +                return true; +            } + +            void RemoveInvalidTargets(std::list<WorldObject*>& targets) +            { +                targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_MAGE_TEMPORAL_DISPLACEMENT)); +                targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_HUNTER_INSANITY)); +                targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_SHAMAN_EXHAUSTION)); +                targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_SHAMAN_SATED)); +            } + +            void ApplyDebuff() +            { +                if (Unit* target = GetHitUnit()) +                    target->CastSpell(target, SPELL_MAGE_TEMPORAL_DISPLACEMENT, true);              }              void Register() override              { -                OnEffectHit += SpellEffectFn(spell_mage_summon_water_elemental_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); +                OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mage_time_warp_SpellScript::RemoveInvalidTargets, EFFECT_ALL, TARGET_UNIT_CASTER_AREA_RAID); +                AfterHit += SpellHitFn(spell_mage_time_warp_SpellScript::ApplyDebuff);              }          };          SpellScript* GetSpellScript() const override          { -            return new spell_mage_summon_water_elemental_SpellScript(); +            return new spell_mage_time_warp_SpellScript();          }  }; +// 33395 Water Elemental's Freeze +/// Updated 4.3.4 +class spell_mage_water_elemental_freeze : public SpellScriptLoader +{ +   public: +       spell_mage_water_elemental_freeze() : SpellScriptLoader("spell_mage_water_elemental_freeze") { } + +       class spell_mage_water_elemental_freeze_SpellScript : public SpellScript +       { +           PrepareSpellScript(spell_mage_water_elemental_freeze_SpellScript); + +           bool Validate(SpellInfo const* /*spellInfo*/) +           { +               if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_FINGERS_OF_FROST)) +                   return false; +               return true; +           } + +           void CountTargets(std::list<WorldObject*>& targetList) +           { +               _didHit = !targetList.empty(); +           } + +           void HandleImprovedFreeze() +           { +               if (!_didHit) +                   return; + +               Unit* owner = GetCaster()->GetOwner(); +               if (!owner) +                   return; + +               if (AuraEffect* aurEff = owner->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_MAGE, ICON_MAGE_IMPROVED_FREEZE, EFFECT_0)) +               { +                   if (roll_chance_i(aurEff->GetAmount())) +                       owner->CastCustomSpell(SPELL_MAGE_FINGERS_OF_FROST, SPELLVALUE_AURA_STACK, 2, owner, true); +               } +           } + +           void Register() +           { +               OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mage_water_elemental_freeze_SpellScript::CountTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); +               AfterCast += SpellCastFn(spell_mage_water_elemental_freeze_SpellScript::HandleImprovedFreeze); +           } + +       private: +           bool _didHit; +       }; + +       SpellScript* GetSpellScript() const +       { +           return new spell_mage_water_elemental_freeze_SpellScript(); +       } +}; +  void AddSC_mage_spell_scripts()  { +    new spell_mage_arcane_potency();      new spell_mage_blast_wave(); -    new spell_mage_burnout(); +    new spell_mage_blazing_speed(); +    new spell_mage_blizzard();      new spell_mage_cold_snap(); +    new spell_mage_cone_of_cold(); +    new spell_mage_conjure_refreshment();      new spell_mage_fire_frost_ward();      new spell_mage_focus_magic(); +    new spell_mage_frostbolt();      new spell_mage_ice_barrier();      new spell_mage_ignite(); +    new spell_mage_glyph_of_ice_block(); +    new spell_mage_glyph_of_icy_veins(); +    new spell_mage_glyph_of_polymorph();      new spell_mage_living_bomb(); +    new spell_mage_mage_ward();      new spell_mage_mana_shield();      new spell_mage_master_of_elements(); +    new spell_mage_nether_vortex(); +    new spell_mage_permafrost(); +    new spell_mage_polymorph();      new spell_mage_polymorph_cast_visual(); -    new spell_mage_summon_water_elemental(); +    new spell_mage_replenish_mana(); +    new spell_mage_ring_of_frost(); +    new spell_mage_ring_of_frost_freeze(); +    new spell_mage_time_warp(); +    new spell_mage_water_elemental_freeze();  } diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp index 2d32341757f..e6ad3e83477 100644 --- a/src/server/scripts/Spells/spell_paladin.cpp +++ b/src/server/scripts/Spells/spell_paladin.cpp @@ -29,57 +29,45 @@  enum PaladinSpells  { -    SPELL_PALADIN_DIVINE_PLEA                    = 54428, -    SPELL_PALADIN_BLESSING_OF_SANCTUARY_BUFF     = 67480, -    SPELL_PALADIN_BLESSING_OF_SANCTUARY_ENERGIZE = 57319, - -    SPELL_PALADIN_HOLY_SHOCK_R1                  = 20473, -    SPELL_PALADIN_HOLY_SHOCK_R1_DAMAGE           = 25912, -    SPELL_PALADIN_HOLY_SHOCK_R1_HEALING          = 25914, - +    SPELL_PALADIN_AVENGERS_SHIELD               = 31935, +    SPELL_PALADIN_AURA_MASTERY_IMMUNE            = 64364, +    SPELL_PALADIN_BEACON_OF_LIGHT_MARKER         = 53563, +    SPELL_PALADIN_BEACON_OF_LIGHT_HEAL           = 53652,      SPELL_PALADIN_BLESSING_OF_LOWER_CITY_DRUID   = 37878,      SPELL_PALADIN_BLESSING_OF_LOWER_CITY_PALADIN = 37879,      SPELL_PALADIN_BLESSING_OF_LOWER_CITY_PRIEST  = 37880,      SPELL_PALADIN_BLESSING_OF_LOWER_CITY_SHAMAN  = 37881, - +    SPELL_PALADIN_CONCENTRACTION_AURA            = 19746, +    SPELL_PALADIN_DIVINE_PURPOSE_PROC            = 90174, +    SPELL_PALADIN_DIVINE_SACRIFICE               = 64205,      SPELL_PALADIN_DIVINE_STORM                   = 53385,      SPELL_PALADIN_DIVINE_STORM_DUMMY             = 54171,      SPELL_PALADIN_DIVINE_STORM_HEAL              = 54172, - +    SPELL_PALADIN_EYE_FOR_AN_EYE_RANK_1          = 9799,      SPELL_PALADIN_EYE_FOR_AN_EYE_DAMAGE          = 25997, -      SPELL_PALADIN_FORBEARANCE                    = 25771, -    SPELL_PALADIN_AVENGING_WRATH_MARKER          = 61987, -    SPELL_PALADIN_IMMUNE_SHIELD_MARKER           = 61988, - +    SPELL_PALADIN_GLYPH_OF_SALVATION             = 63225,      SPELL_PALADIN_HAND_OF_SACRIFICE              = 6940, -    SPELL_PALADIN_DIVINE_SACRIFICE               = 64205, - +    SPELL_PALADIN_HOLY_LIGHT                     = 635, +    SPELL_PALADIN_HOLY_SHOCK_R1                  = 20473, +    SPELL_PALADIN_HOLY_SHOCK_R1_DAMAGE           = 25912, +    SPELL_PALADIN_HOLY_SHOCK_R1_HEALING          = 25914, +    SPELL_PALADIN_IMMUNE_SHIELD_MARKER           = 61988, +    SPELL_PALADIN_IMPROVED_CONCENTRACTION_AURA   = 63510, +    SPELL_PALADIN_IMPROVED_DEVOTION_AURA         = 63514,      SPELL_PALADIN_ITEM_HEALING_TRANCE            = 37706, -      SPELL_PALADIN_JUDGEMENT_DAMAGE               = 54158, -    SPELL_PALADIN_JUDGEMENT_OF_JUSTICE           = 20184, -    SPELL_PALADIN_JUDGEMENT_OF_LIGHT             = 20185, -    SPELL_PALADIN_JUDGEMENT_OF_WISDOM            = 20186, - -    SPELL_PALADIN_GLYPH_OF_SALVATION             = 63225, -      SPELL_PALADIN_RIGHTEOUS_DEFENSE_TAUNT        = 31790, - +    SPELL_PALADIN_SANCTIFIED_RETRIBUTION_AURA    = 63531, +    SPELL_PALADIN_SANCTIFIED_RETRIBUTION_R1      = 31869,      SPELL_PALADIN_SANCTIFIED_WRATH               = 57318,      SPELL_PALADIN_SANCTIFIED_WRATH_TALENT_R1     = 53375, -      SPELL_PALADIN_SEAL_OF_RIGHTEOUSNESS          = 25742, +    SPELL_PALADIN_SWIFT_RETRIBUTION_R1           = 53379 +}; -    SPELL_PALADIN_CONCENTRACTION_AURA            = 19746, -    SPELL_PALADIN_SANCTIFIED_RETRIBUTION_R1      = 31869, -    SPELL_PALADIN_SWIFT_RETRIBUTION_R1           = 53379, - -    SPELL_PALADIN_IMPROVED_CONCENTRACTION_AURA   = 63510, -    SPELL_PALADIN_IMPROVED_DEVOTION_AURA         = 63514, -    SPELL_PALADIN_SANCTIFIED_RETRIBUTION_AURA    = 63531, -    SPELL_PALADIN_AURA_MASTERY_IMMUNE            = 64364, - +enum MiscSpells +{      SPELL_GENERIC_ARENA_DAMPENING                = 74410,      SPELL_GENERIC_BATTLEGROUND_DAMPENING         = 74411  }; @@ -89,6 +77,7 @@ enum PaladinSpellIcons      PALADIN_ICON_ID_RETRIBUTION_AURA             = 555  }; +/*  // 31850 - Ardent Defender  class spell_pal_ardent_defender : public SpellScriptLoader  { @@ -113,7 +102,7 @@ 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; @@ -164,6 +153,7 @@ class spell_pal_ardent_defender : public SpellScriptLoader              return new spell_pal_ardent_defender_AuraScript();          }  }; +*/  // 31821 - Aura Mastery  class spell_pal_aura_mastery : public SpellScriptLoader @@ -285,6 +275,68 @@ class spell_pal_avenging_wrath : public SpellScriptLoader          }  }; +// 53651 - Beacon of Light +class spell_pal_beacon_of_light : public SpellScriptLoader +{ +    public: +        spell_pal_beacon_of_light() : SpellScriptLoader("spell_pal_beacon_of_light") { } + +        class spell_pal_beacon_of_light_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_pal_beacon_of_light_AuraScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_BEACON_OF_LIGHT_HEAL)) +                    return false; +                return true; +            } + +            bool CheckProc(ProcEventInfo& eventInfo) +            { +                if (eventInfo.GetActionTarget()->GetAura(SPELL_PALADIN_BEACON_OF_LIGHT_MARKER, GetCasterGUID())) +                    return false; +                return true; +            } + +            void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) +            { +                PreventDefaultAction(); +                int32 heal = eventInfo.GetHealInfo()->GetHeal(); + +                if (eventInfo.GetDamageInfo()->GetSpellInfo()->Id != SPELL_PALADIN_HOLY_LIGHT) +                    heal = int32(CalculatePct(heal, aurEff->GetAmount())); + +                Unit::AuraList const& auras = GetCaster()->GetSingleCastAuras(); +                for (Unit::AuraList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr) +                { +                    if ((*itr)->GetId() == SPELL_PALADIN_BEACON_OF_LIGHT_MARKER) +                    { +                        std::list<AuraApplication*> applications; +                        (*itr)->GetApplicationList(applications); +                        if (applications.empty()) +                            return; + +                        GetCaster()->CastCustomSpell(SPELL_PALADIN_BEACON_OF_LIGHT_HEAL, SPELLVALUE_BASE_POINT0, heal, applications.front()->GetTarget(), true, NULL, aurEff); +                        return; +                    } +                } +            } + +            void Register() override +            { +                DoCheckProc += AuraCheckProcFn(spell_pal_beacon_of_light_AuraScript::CheckProc); +                OnEffectProc += AuraEffectProcFn(spell_pal_beacon_of_light_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_pal_beacon_of_light_AuraScript(); +        } +}; + +  // 37877 - Blessing of Faith  class spell_pal_blessing_of_faith : public SpellScriptLoader  { @@ -341,65 +393,6 @@ class spell_pal_blessing_of_faith : public SpellScriptLoader          }  }; -// 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") { } - -        class spell_pal_blessing_of_sanctuary_AuraScript : public AuraScript -        { -            PrepareAuraScript(spell_pal_blessing_of_sanctuary_AuraScript); - -            bool Validate(SpellInfo const* /*spellInfo*/) override -            { -                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()) -                    caster->CastSpell(target, SPELL_PALADIN_BLESSING_OF_SANCTUARY_BUFF, 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() override -            { -                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 override -        { -            return new spell_pal_blessing_of_sanctuary_AuraScript(); -        } -}; -  // 64205 - Divine Sacrifice  class spell_pal_divine_sacrifice : public SpellScriptLoader  { @@ -415,6 +408,7 @@ class spell_pal_divine_sacrifice : public SpellScriptLoader              bool Load() override              { +                  if (Unit* caster = GetCaster())                  {                      if (caster->GetTypeId() == TYPEID_PLAYER) @@ -597,17 +591,16 @@ class spell_pal_eye_for_an_eye : public SpellScriptLoader                  return true;              } -            void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) +            void HandleEffectProc(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)); +                int32 damage = CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount());                  GetTarget()->CastCustomSpell(SPELL_PALADIN_EYE_FOR_AN_EYE_DAMAGE, SPELLVALUE_BASE_POINT0, damage, eventInfo.GetProcTarget(), true, NULL, aurEff);              }              void Register() override              { -                OnEffectProc += AuraEffectProcFn(spell_pal_eye_for_an_eye_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY); +                OnEffectProc += AuraEffectProcFn(spell_pal_eye_for_an_eye_AuraScript::HandleEffectProc, EFFECT_0, m_scriptSpellId == SPELL_PALADIN_EYE_FOR_AN_EYE_RANK_1 ? SPELL_AURA_DUMMY : SPELL_AURA_PROC_TRIGGER_SPELL);              }          }; @@ -617,72 +610,76 @@ class spell_pal_eye_for_an_eye : public SpellScriptLoader          }  }; -// 54968 - Glyph of Holy Light -class spell_pal_glyph_of_holy_light : public SpellScriptLoader +// -75806 - Grand Crusader +class spell_pal_grand_crusader : public SpellScriptLoader  {      public: -        spell_pal_glyph_of_holy_light() : SpellScriptLoader("spell_pal_glyph_of_holy_light") { } +        spell_pal_grand_crusader() : SpellScriptLoader("spell_pal_grand_crusader") { } -        class spell_pal_glyph_of_holy_light_SpellScript : public SpellScript +        class spell_pal_grand_crusader_AuraScript : public AuraScript          { -            PrepareSpellScript(spell_pal_glyph_of_holy_light_SpellScript); +            PrepareAuraScript(spell_pal_grand_crusader_AuraScript); -            void FilterTargets(std::list<WorldObject*>& targets) +            bool Validate(SpellInfo const* /*spellInfo*/) override              { -                uint32 const maxTargets = GetSpellInfo()->MaxAffectedTargets; +                if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_AVENGERS_SHIELD)) +                    return false; +                return true; +            } -                if (targets.size() > maxTargets) -                { -                    targets.sort(Trinity::HealthPctOrderPred()); -                    targets.resize(maxTargets); -                } +            bool CheckProc(ProcEventInfo& /*eventInfo*/) +            { +                return GetTarget()->GetTypeId() == TYPEID_PLAYER; +            } + +            void HandleEffectProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) +            { +                GetTarget()->ToPlayer()->RemoveSpellCooldown(SPELL_PALADIN_AVENGERS_SHIELD, true);              }              void Register() override              { -                OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pal_glyph_of_holy_light_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY); +                DoCheckProc += AuraCheckProcFn(spell_pal_grand_crusader_AuraScript::CheckProc); +                OnEffectProc += AuraEffectProcFn(spell_pal_grand_crusader_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);              }          }; -        SpellScript* GetSpellScript() const override +        AuraScript* GetAuraScript() const override          { -            return new spell_pal_glyph_of_holy_light_SpellScript(); +            return new spell_pal_grand_crusader_AuraScript();          }  }; -// 63521 - Guarded by The Light -class spell_pal_guarded_by_the_light : public SpellScriptLoader +// 54968 - Glyph of Holy Light +class spell_pal_glyph_of_holy_light : public SpellScriptLoader  {      public: -        spell_pal_guarded_by_the_light() : SpellScriptLoader("spell_pal_guarded_by_the_light") { } +        spell_pal_glyph_of_holy_light() : SpellScriptLoader("spell_pal_glyph_of_holy_light") { } -        class spell_pal_guarded_by_the_light_SpellScript : public SpellScript +        class spell_pal_glyph_of_holy_light_SpellScript : public SpellScript          { -            PrepareSpellScript(spell_pal_guarded_by_the_light_SpellScript); +            PrepareSpellScript(spell_pal_glyph_of_holy_light_SpellScript); -            bool Validate(SpellInfo const* /*spellInfo*/) override +            void FilterTargets(std::list<WorldObject*>& targets)              { -                if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_DIVINE_PLEA)) -                    return false; -                return true; -            } +                uint32 const maxTargets = GetSpellInfo()->MaxAffectedTargets; -            void HandleScriptEffect(SpellEffIndex /*effIndex*/) -            { -                // Divine Plea -                if (Aura* aura = GetCaster()->GetAura(SPELL_PALADIN_DIVINE_PLEA)) -                    aura->RefreshDuration(); +                if (targets.size() > maxTargets) +                { +                    targets.sort(Trinity::HealthPctOrderPred()); +                    targets.resize(maxTargets); +                }              }              void Register() override              { -                OnEffectHitTarget += SpellEffectFn(spell_pal_guarded_by_the_light_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); +                OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pal_glyph_of_holy_light_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY);              }          };          SpellScript* GetSpellScript() const override          { -            return new spell_pal_guarded_by_the_light_SpellScript(); +            return new spell_pal_glyph_of_holy_light_SpellScript();          }  }; @@ -730,40 +727,7 @@ class spell_pal_hand_of_sacrifice : public SpellScriptLoader          }  }; -// 1038 - Hand of Salvation -class spell_pal_hand_of_salvation : public SpellScriptLoader -{ -    public: -        spell_pal_hand_of_salvation() : SpellScriptLoader("spell_pal_hand_of_salvation") { } - -        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*/) -            { -                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(); -                } -            } - -            void Register() override -            { -                DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pal_hand_of_salvation_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN); -            } -        }; - -        AuraScript* GetAuraScript() const override -        { -            return new spell_pal_hand_of_salvation_AuraScript(); -        } -}; - -// -20473 - Holy Shock +// 20473 - Holy Shock  class spell_pal_holy_shock : public SpellScriptLoader  {      public: @@ -835,71 +799,6 @@ class spell_pal_holy_shock : public SpellScriptLoader          }  }; -// Maybe this is incorrect -// These spells should always be cast on login, regardless of whether the player has the talent or not - -// -20254 - Improved Concentration Aura -// -20138 - Improved Devotion Aura -//  31869 - Sanctified Retribution -// -53379 - Swift Retribution -class spell_pal_improved_aura : public SpellScriptLoader -{ -    public: -        spell_pal_improved_aura(char const* name, uint32 spellId) : SpellScriptLoader(name), _spellId(spellId) { } - -        class spell_pal_improved_aura_AuraScript : public AuraScript -        { -            PrepareAuraScript(spell_pal_improved_aura_AuraScript); - -        public: -            spell_pal_improved_aura_AuraScript(uint32 spellId) : AuraScript(), _spellId(spellId) { } - -            bool Validate(SpellInfo const* /*spellInfo*/) override -            { -                if (!sSpellMgr->GetSpellInfo(_spellId) -                    || !sSpellMgr->GetSpellInfo(SPELL_PALADIN_SANCTIFIED_RETRIBUTION_R1) -                    || !sSpellMgr->GetSpellInfo(SPELL_PALADIN_SWIFT_RETRIBUTION_R1)) -                    return false; -                return true; -            } - -            void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) -            { -                Unit* target = GetTarget(); -                GetTarget()->RemoveOwnedAura(_spellId, GetCasterGUID()); // need to remove to reapply spellmods -                target->CastSpell(target, _spellId, true); -            } - -            void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) -            { -                uint32 spellId = GetSpellInfo()->GetFirstRankSpell()->Id; - -                if ((spellId == SPELL_PALADIN_SANCTIFIED_RETRIBUTION_R1 && GetTarget()->GetAuraOfRankedSpell(SPELL_PALADIN_SWIFT_RETRIBUTION_R1)) -                    || (spellId == SPELL_PALADIN_SWIFT_RETRIBUTION_R1 && GetTarget()->GetAuraOfRankedSpell(SPELL_PALADIN_SANCTIFIED_RETRIBUTION_R1))) -                    return; - -                GetTarget()->RemoveOwnedAura(_spellId, GetCasterGUID()); -            } - -            void Register() override -            { -                AfterEffectApply += AuraEffectApplyFn(spell_pal_improved_aura_AuraScript::HandleEffectApply, EFFECT_FIRST_FOUND, SPELL_AURA_ADD_FLAT_MODIFIER, AURA_EFFECT_HANDLE_REAL); -                AfterEffectRemove += AuraEffectRemoveFn(spell_pal_improved_aura_AuraScript::HandleEffectRemove, EFFECT_FIRST_FOUND, SPELL_AURA_ADD_FLAT_MODIFIER, AURA_EFFECT_HANDLE_REAL); -            } - -        private: -            uint32 _spellId; -        }; - -        AuraScript* GetAuraScript() const override -        { -            return new spell_pal_improved_aura_AuraScript(_spellId); -        } - -    private: -        uint32 _spellId; -}; -  // 63510 - Improved Concentraction Aura (Area Aura)  // 63514 - Improved Devotion Aura (Area Aura)  // 63531 - Sanctified Retribution (Area Aura) @@ -977,32 +876,27 @@ class spell_pal_item_healing_discount : public SpellScriptLoader          }  }; -// 53407 - Judgement of Justice -// 20271 - Judgement of Light -// 53408 - Judgement of Wisdom +// 20271 - Judgement +/// Updated 4.3.4  class spell_pal_judgement : public SpellScriptLoader  {      public: -        spell_pal_judgement(char const* scriptName, uint32 spellId) : SpellScriptLoader(scriptName), _spellId(spellId) { } +        spell_pal_judgement() : SpellScriptLoader("spell_pal_judgement") { }          class spell_pal_judgement_SpellScript : public SpellScript          {              PrepareSpellScript(spell_pal_judgement_SpellScript); -        public: -            spell_pal_judgement_SpellScript(uint32 spellId) : SpellScript(), _spellId(spellId) { } -              bool Validate(SpellInfo const* /*spellInfo*/) override              { -                if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_JUDGEMENT_DAMAGE) -                    || !sSpellMgr->GetSpellInfo(_spellId)) +                if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_JUDGEMENT_DAMAGE))                      return false;                  return true;              }              void HandleScriptEffect(SpellEffIndex /*effIndex*/)              { -                uint32 spellId2 = SPELL_PALADIN_JUDGEMENT_DAMAGE; +                uint32 spellId = SPELL_PALADIN_JUDGEMENT_DAMAGE;                  // some seals have SPELL_AURA_DUMMY in EFFECT_2                  Unit::AuraEffectList const& auras = GetCaster()->GetAuraEffectsByType(SPELL_AURA_DUMMY); @@ -1011,63 +905,27 @@ class spell_pal_judgement : public SpellScriptLoader                      if ((*i)->GetSpellInfo()->GetSpellSpecific() == SPELL_SPECIFIC_SEAL && (*i)->GetEffIndex() == EFFECT_2)                          if (sSpellMgr->GetSpellInfo((*i)->GetAmount()))                          { -                            spellId2 = (*i)->GetAmount(); +                            spellId = (*i)->GetAmount();                              break;                          }                  } -                GetCaster()->CastSpell(GetHitUnit(), _spellId, true); -                GetCaster()->CastSpell(GetHitUnit(), spellId2, true); -            } - -            void Register() override -            { -                OnEffectHitTarget += SpellEffectFn(spell_pal_judgement_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); -            } - -        private: -            uint32 const _spellId; -        }; - -        SpellScript* GetSpellScript() const override -        { -            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") { } - -        class spell_pal_judgement_of_command_SpellScript : public SpellScript -        { -            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, NULL); +                GetCaster()->CastSpell(GetHitUnit(), spellId, true);              }              void Register() override              { -                OnEffectHitTarget += SpellEffectFn(spell_pal_judgement_of_command_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); +                OnEffectHitTarget += SpellEffectFn(spell_pal_judgement_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_DUMMY);              }          };          SpellScript* GetSpellScript() const override          { -            return new spell_pal_judgement_of_command_SpellScript(); +            return new spell_pal_judgement_SpellScript();          }  }; -// -633 - Lay on Hands +// 633 - Lay on Hands  class spell_pal_lay_on_hands : public SpellScriptLoader  {      public: @@ -1079,11 +937,8 @@ class spell_pal_lay_on_hands : public SpellScriptLoader              bool Validate(SpellInfo const* /*spell*/) override              { -                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)) +                if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_FORBEARANCE) || +                    !sSpellMgr->GetSpellInfo(SPELL_PALADIN_IMMUNE_SHIELD_MARKER))                      return false;                  return true;              } @@ -1093,8 +948,11 @@ class spell_pal_lay_on_hands : public SpellScriptLoader                  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)) +                        if (target->HasAura(SPELL_PALADIN_FORBEARANCE) || +                            target->HasAura(SPELL_PALADIN_IMMUNE_SHIELD_MARKER)) +                        {                              return SPELL_FAILED_TARGET_AURASTATE; +                        }                  return SPELL_CAST_OK;              } @@ -1105,7 +963,6 @@ class spell_pal_lay_on_hands : public SpellScriptLoader                  if (caster == GetHitUnit())                  {                      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);                  }              } @@ -1187,47 +1044,154 @@ class spell_pal_righteous_defense : public SpellScriptLoader          }  }; -// 58597 - Sacred Shield +// 85285 - Sacred Shield  class spell_pal_sacred_shield : public SpellScriptLoader  {      public:          spell_pal_sacred_shield() : SpellScriptLoader("spell_pal_sacred_shield") { } -        class spell_pal_sacred_shield_AuraScript : public AuraScript +        class spell_pal_sacred_shield_SpellScript : public SpellScript          { -            PrepareAuraScript(spell_pal_sacred_shield_AuraScript); +            PrepareSpellScript(spell_pal_sacred_shield_SpellScript); -            void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) +            SpellCastResult CheckCast()              { -                if (Unit* caster = GetCaster()) -                { -                    // +75.00% from sp bonus -                    float bonus = CalculatePct(caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask()), 75.0f); +                Unit* caster = GetCaster(); +                if (caster->GetTypeId() != TYPEID_PLAYER) +                    return SPELL_FAILED_DONT_REPORT; + +                if (!caster->HealthBelowPct(30)) +                    return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; + +                return SPELL_CAST_OK; +            } + +            void Register() override +            { +                OnCheckCast += SpellCheckCastFn(spell_pal_sacred_shield_SpellScript::CheckCast); +            } +        }; + +        SpellScript* GetSpellScript() const override +        { +            return new spell_pal_sacred_shield_SpellScript(); +        } +}; -                    // Divine Guardian is only applied at the spell healing bonus because it was already applied to the base value in CalculateSpellDamage -                    bonus = caster->ApplyEffectModifiers(GetSpellInfo(), aurEff->GetEffIndex(), bonus); -                    bonus *= caster->CalculateLevelPenalty(GetSpellInfo()); +// 53600 - Shield of the Righteous +/// Updated 4.3.4 +class spell_pal_shield_of_the_righteous : public SpellScriptLoader +{ +    public: +        spell_pal_shield_of_the_righteous() : SpellScriptLoader("spell_pal_shield_of_the_righteous") { } -                    amount += int32(bonus); +        class spell_pal_shield_of_the_righteous_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_pal_shield_of_the_righteous_SpellScript); + +            bool Load() +            { +                if (GetCaster()->GetTypeId() != TYPEID_PLAYER) +                    return false; + +                if (GetCaster()->ToPlayer()->getClass() != CLASS_PALADIN) +                    return false; -                    // Arena - Dampening -                    if (AuraEffect const* auraEffArenaDampening = caster->GetAuraEffect(SPELL_GENERIC_ARENA_DAMPENING, EFFECT_0)) -                        AddPct(amount, auraEffArenaDampening->GetAmount()); -                    // Battleground - Dampening -                    else if (AuraEffect const* auraEffBattlegroudDampening = caster->GetAuraEffect(SPELL_GENERIC_BATTLEGROUND_DAMPENING, EFFECT_0)) -                        AddPct(amount, auraEffBattlegroudDampening->GetAmount()); +                return true; +            } + +            void ChangeDamage(SpellEffIndex /*effIndex*/) +            { +                int32 damage = GetHitDamage(); + +                // Because 1 Holy Power (HP) is consumed when casting spell, +                // GetPower(POWER_HOLY_POWER) will return 0 when player has 1 HP, +                // return 1 at 2 HP, and 2 at 3 HP +                int32 hp = GetCaster()->GetPower(POWER_HOLY_POWER); + +                // Holy Power Scaling: 3 times damage at 2 HP, 6 times at 3 HP +                damage *= 0.5*hp*hp + 1.5*hp + 1; + +                SetHitDamage(damage); +            } + +            void Register() +            { +                OnEffectHitTarget += SpellEffectFn(spell_pal_shield_of_the_righteous_SpellScript::ChangeDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); +            } +        }; + +        SpellScript* GetSpellScript() const +        { +            return new spell_pal_shield_of_the_righteous_SpellScript(); +        } +}; + +// 85256 - Templar's Verdict +/// Updated 4.3.4 +class spell_pal_templar_s_verdict : public SpellScriptLoader +{ +    public: +        spell_pal_templar_s_verdict() : SpellScriptLoader("spell_pal_templar_s_verdict") { } + +        class spell_pal_templar_s_verdict_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_pal_templar_s_verdict_SpellScript); + +            bool Validate (SpellInfo const* /*spellEntry*/) +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_DIVINE_PURPOSE_PROC)) +                    return false; + +                return true; +            } + +            bool Load() override +            { +                if (GetCaster()->GetTypeId() != TYPEID_PLAYER) +                    return false; + +                if (GetCaster()->ToPlayer()->getClass() != CLASS_PALADIN) +                    return false; + +                return true; +            } + +            void ChangeDamage(SpellEffIndex /*effIndex*/) +            { +                Unit* caster = GetCaster(); +                int32 damage = GetHitDamage(); + +                if (caster->HasAura(SPELL_PALADIN_DIVINE_PURPOSE_PROC)) +                    damage *= 7.5;  // 7.5*30% = 225% +                else +                { +                    switch (caster->GetPower(POWER_HOLY_POWER)) +                    { +                        case 0: // 1 Holy Power +                            // same damage +                            break; +                        case 1: // 2 Holy Power +                            damage *= 3;    // 3*30 = 90% +                            break; +                        case 2: // 3 Holy Power +                            damage *= 7.5;  // 7.5*30% = 225% +                            break; +                    }                  } + +                SetHitDamage(damage);              }              void Register() override              { -                DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pal_sacred_shield_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); +                OnEffectHitTarget += SpellEffectFn(spell_pal_templar_s_verdict_SpellScript::ChangeDamage, EFFECT_0, SPELL_EFFECT_WEAPON_PERCENT_DAMAGE);              }          }; -        AuraScript* GetAuraScript() const override +        SpellScript* GetSpellScript() const override          { -            return new spell_pal_sacred_shield_AuraScript(); +            return new spell_pal_templar_s_verdict_SpellScript();          }  }; @@ -1277,38 +1241,33 @@ class spell_pal_seal_of_righteousness : public SpellScriptLoader          }  }; +  void AddSC_paladin_spell_scripts()  { -    new spell_pal_ardent_defender(); +    //new spell_pal_ardent_defender();      new spell_pal_aura_mastery();      new spell_pal_aura_mastery_immune();      new spell_pal_avenging_wrath(); +    new spell_pal_beacon_of_light();      new spell_pal_blessing_of_faith(); -    new spell_pal_blessing_of_sanctuary();      new spell_pal_divine_sacrifice();      new spell_pal_divine_storm();      new spell_pal_divine_storm_dummy();      new spell_pal_exorcism_and_holy_wrath_damage();      new spell_pal_eye_for_an_eye();      new spell_pal_glyph_of_holy_light(); -    new spell_pal_guarded_by_the_light(); +    new spell_pal_grand_crusader();      new spell_pal_hand_of_sacrifice(); -    new spell_pal_hand_of_salvation();      new spell_pal_holy_shock(); -    new spell_pal_improved_aura("spell_pal_improved_concentraction_aura", SPELL_PALADIN_IMPROVED_CONCENTRACTION_AURA); -    new spell_pal_improved_aura("spell_pal_improved_devotion_aura", SPELL_PALADIN_IMPROVED_DEVOTION_AURA); -    new spell_pal_improved_aura("spell_pal_sanctified_retribution", SPELL_PALADIN_SANCTIFIED_RETRIBUTION_AURA); -    new spell_pal_improved_aura("spell_pal_swift_retribution", SPELL_PALADIN_SANCTIFIED_RETRIBUTION_AURA);      new spell_pal_improved_aura_effect("spell_pal_improved_concentraction_aura_effect");      new spell_pal_improved_aura_effect("spell_pal_improved_devotion_aura_effect");      new spell_pal_improved_aura_effect("spell_pal_sanctified_retribution_effect");      new spell_pal_item_healing_discount(); -    new spell_pal_judgement("spell_pal_judgement_of_justice", SPELL_PALADIN_JUDGEMENT_OF_JUSTICE); -    new spell_pal_judgement("spell_pal_judgement_of_light", SPELL_PALADIN_JUDGEMENT_OF_LIGHT); -    new spell_pal_judgement("spell_pal_judgement_of_wisdom", SPELL_PALADIN_JUDGEMENT_OF_WISDOM); -    new spell_pal_judgement_of_command(); +    new spell_pal_judgement();      new spell_pal_lay_on_hands();      new spell_pal_righteous_defense();      new spell_pal_sacred_shield(); +    new spell_pal_shield_of_the_righteous(); +    new spell_pal_templar_s_verdict();      new spell_pal_seal_of_righteousness();  } diff --git a/src/server/scripts/Spells/spell_pet.cpp b/src/server/scripts/Spells/spell_pet.cpp index 775f9f505f9..f8466eb1f74 100644 --- a/src/server/scripts/Spells/spell_pet.cpp +++ b/src/server/scripts/Spells/spell_pet.cpp @@ -536,7 +536,6 @@ public:      }  }; -  class spell_warl_pet_scaling_04 : public SpellScriptLoader  {  public: @@ -813,7 +812,6 @@ public:      }  }; -  class spell_sha_pet_scaling_04 : public SpellScriptLoader  {  public: @@ -1347,24 +1345,6 @@ public:                  return;              if (GetCaster()->GetOwner()->ToPlayer())              { -                //  Pet's base damage changes depending on happiness -                if (GetCaster()->IsPet() && GetCaster()->ToPet()->IsHunterPet()) -                { -                    switch (GetCaster()->ToPet()->GetHappinessState()) -                    { -                    case HAPPY: -                        // 125% of normal damage -                        amount += 25.0f; -                        break; -                    case CONTENT: -                        // 100% of normal damage, nothing to modify -                        break; -                    case UNHAPPY: -                        // 75% of normal damage -                        amount += -25.0f; -                        break; -                    } -                }                  // Cobra Reflexes                  if (AuraEffect* cobraReflexes = GetCaster()->GetAuraEffectOfRankedSpell(61682, EFFECT_0))                      amount -= cobraReflexes->GetAmount(); @@ -1424,7 +1404,6 @@ public:      }  }; -  class spell_dk_avoidance_passive : public SpellScriptLoader  {  public: diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp index a128c30ad50..3bd61ddf465 100644 --- a/src/server/scripts/Spells/spell_priest.cpp +++ b/src/server/scripts/Spells/spell_priest.cpp @@ -29,29 +29,51 @@  enum PriestSpells  { +    SPELL_PRIEST_ABSOLUTION                         = 33167, +    SPELL_PRIEST_BODY_AND_SOUL_DISPEL               = 64136, +    SPELL_PRIEST_BODY_AND_SOUL_SPEED                = 65081, +    SPELL_PRIEST_CURE_DISEASE                       = 528, +    SPELL_PRIEST_DISPEL_MAGIC_FRIENDLY              = 97690, +    SPELL_PRIEST_DISPEL_MAGIC_HOSTILE               = 97691,      SPELL_PRIEST_DIVINE_AEGIS                       = 47753, -    SPELL_PRIEST_EMPOWERED_RENEW                    = 63544, +    SPELL_PRIEST_DIVINE_TOUCH                       = 63544,      SPELL_PRIEST_GLYPH_OF_CIRCLE_OF_HEALING         = 55675, +    SPELL_PRIEST_GLYPH_OF_DISPEL_MAGIC              = 55677, +    SPELL_PRIEST_GLYPH_OF_DISPEL_MAGIC_HEAL         = 56131,      SPELL_PRIEST_GLYPH_OF_LIGHTWELL                 = 55673,      SPELL_PRIEST_GLYPH_OF_PRAYER_OF_HEALING_HEAL    = 56161, +    SPELL_PRIEST_GLYPH_OF_SHADOW                    = 107906,      SPELL_PRIEST_GUARDIAN_SPIRIT_HEAL               = 48153,      SPELL_PRIEST_ITEM_EFFICIENCY                    = 37595, +    SPELL_PRIEST_LEAP_OF_FAITH                      = 73325, +    SPELL_PRIEST_LEAP_OF_FAITH_EFFECT               = 92832, +    SPELL_PRIEST_LEAP_OF_FAITH_EFFECT_TRIGGER       = 92833, +    SPELL_PRIEST_LEAP_OF_FAITH_TRIGGERED            = 92572,      SPELL_PRIEST_MANA_LEECH_PROC                    = 34650,      SPELL_PRIEST_PENANCE_R1                         = 47540,      SPELL_PRIEST_PENANCE_R1_DAMAGE                  = 47758,      SPELL_PRIEST_PENANCE_R1_HEAL                    = 47757, -    SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED        = 33619,      SPELL_PRIEST_REFLECTIVE_SHIELD_R1               = 33201, +    SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED        = 33619, +    SPELL_PRIEST_SHADOWFORM_VISUAL_WITHOUT_GLYPH    = 107903, +    SPELL_PRIEST_SHADOWFORM_VISUAL_WITH_GLYPH       = 107904,      SPELL_PRIEST_SHADOW_WORD_DEATH                  = 32409, +    SPELL_PRIEST_TWIN_DISCIPLINES_RANK_1            = 47586,      SPELL_PRIEST_T9_HEALING_2P                      = 67201, -    SPELL_PRIEST_VAMPIRIC_TOUCH_DISPEL              = 64085, +    SPELL_PRIEST_VAMPIRIC_EMBRACE_HEAL              = 15290, +    SPELL_PRIEST_VAMPIRIC_TOUCH_DISPEL              = 64085  };  enum PriestSpellIcons  {      PRIEST_ICON_ID_BORROWED_TIME                    = 2899, -    PRIEST_ICON_ID_EMPOWERED_RENEW_TALENT           = 3021, -    PRIEST_ICON_ID_PAIN_AND_SUFFERING               = 2874, +    PRIEST_ICON_ID_DIVINE_TOUCH_TALENT              = 3021, +    PRIEST_ICON_ID_PAIN_AND_SUFFERING               = 2874 +}; + +enum MiscSpells +{ +    SPELL_GEN_REPLENISHMENT                         = 57669  };  class PowerCheck @@ -88,7 +110,58 @@ class RaidCheck          Unit const* _caster;  }; -// -34861 - Circle of Healing +class spell_pri_body_and_soul : public SpellScriptLoader +{ +    public: +        spell_pri_body_and_soul() : SpellScriptLoader("spell_pri_body_and_soul") { } + +        class spell_pri_body_and_soul_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_pri_body_and_soul_AuraScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_CURE_DISEASE) || +                    !sSpellMgr->GetSpellInfo(SPELL_PRIEST_BODY_AND_SOUL_DISPEL)) +                    return false; +                return true; +            } + +            void HandleEffectSpeedProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) +            { +                PreventDefaultAction(); +                // Proc only with Power Word: Shield or Leap of Faith +                if (!(eventInfo.GetDamageInfo()->GetSpellInfo()->SpellFamilyFlags[0] & 0x1 || eventInfo.GetDamageInfo()->GetSpellInfo()->SpellFamilyFlags[2] & 0x80000)) +                    return; + +                GetTarget()->CastCustomSpell(SPELL_PRIEST_BODY_AND_SOUL_SPEED, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), eventInfo.GetProcTarget(), true, NULL, aurEff); +            } + +            void HandleEffectDispelProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) +            { +                PreventDefaultAction(); +                // Proc only with Cure Disease +                if (eventInfo.GetDamageInfo()->GetSpellInfo()->Id != SPELL_PRIEST_CURE_DISEASE || eventInfo.GetProcTarget() != GetTarget()) +                    return; + +                if (roll_chance_i(aurEff->GetAmount())) +                    GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_PRIEST_BODY_AND_SOUL_DISPEL, true, NULL, aurEff); +            } + +            void Register() override +            { +                OnEffectProc += AuraEffectProcFn(spell_pri_body_and_soul_AuraScript::HandleEffectSpeedProc, EFFECT_0, SPELL_AURA_DUMMY); +                OnEffectProc += AuraEffectProcFn(spell_pri_body_and_soul_AuraScript::HandleEffectDispelProc, EFFECT_1, SPELL_AURA_DUMMY); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_pri_body_and_soul_AuraScript(); +        } +}; + +// 34861 - Circle of Healing  class spell_pri_circle_of_healing : public SpellScriptLoader  {      public: @@ -130,6 +203,65 @@ class spell_pri_circle_of_healing : public SpellScriptLoader          }  }; +// 527 - Dispel magic +class spell_pri_dispel_magic : public SpellScriptLoader +{ +public: +    spell_pri_dispel_magic() : SpellScriptLoader("spell_pri_dispel_magic") { } + +    class spell_pri_dispel_magic_SpellScript : public SpellScript +    { +        PrepareSpellScript(spell_pri_dispel_magic_SpellScript); + +        bool Validate(SpellInfo const* /*spellInfo*/) +        { +            if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_ABSOLUTION)) +                return false; +            if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_GLYPH_OF_DISPEL_MAGIC_HEAL)) +                return false; +            if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_GLYPH_OF_DISPEL_MAGIC)) +                return false; +            return true; +        } + +        SpellCastResult CheckCast() +        { +            Unit* caster = GetCaster(); +            Unit* target = GetExplTargetUnit(); + +            if (!target || (!caster->HasAura(SPELL_PRIEST_ABSOLUTION) && caster != target && target->IsFriendlyTo(caster))) +                return SPELL_FAILED_BAD_TARGETS; +            return SPELL_CAST_OK; +        } + +        void AfterEffectHit(SpellEffIndex /*effIndex*/) +        { +            if (GetHitUnit()->IsFriendlyTo(GetCaster())) +            { +                GetCaster()->CastSpell(GetHitUnit(), SPELL_PRIEST_DISPEL_MAGIC_FRIENDLY, true); +                if (AuraEffect const* aurEff = GetHitUnit()->GetAuraEffect(SPELL_PRIEST_GLYPH_OF_DISPEL_MAGIC, EFFECT_0)) +                { +                    int32 heal = GetHitUnit()->CountPctFromMaxHealth(aurEff->GetAmount()); +                    GetCaster()->CastCustomSpell(SPELL_PRIEST_GLYPH_OF_DISPEL_MAGIC_HEAL, SPELLVALUE_BASE_POINT0, heal, GetHitUnit()); +                } +            } +            else +                GetCaster()->CastSpell(GetHitUnit(), SPELL_PRIEST_DISPEL_MAGIC_HOSTILE, true); +        } + +        void Register() +        { +            OnCheckCast += SpellCheckCastFn(spell_pri_dispel_magic_SpellScript::CheckCast); +            OnEffectHitTarget += SpellEffectFn(spell_pri_dispel_magic_SpellScript::AfterEffectHit, EFFECT_0, SPELL_EFFECT_DUMMY); +        } +    }; + +    SpellScript* GetSpellScript() const +    { +        return new spell_pri_dispel_magic_SpellScript(); +    } +}; +  // -47509 - Divine Aegis  class spell_pri_divine_aegis : public SpellScriptLoader  { @@ -253,6 +385,76 @@ class spell_pri_glyph_of_prayer_of_healing : public SpellScriptLoader          }  }; +class spell_pri_improved_power_word_shield : public SpellScriptLoader +{ +    public: +        spell_pri_improved_power_word_shield() : SpellScriptLoader("spell_pri_improved_power_word_shield") { } + +        class spell_pri_improved_power_word_shield_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_pri_improved_power_word_shield_AuraScript); + +            void HandleEffectCalcSpellMod(AuraEffect const* aurEff, SpellModifier*& spellMod) +            { +                if (!spellMod) +                { +                    spellMod = new SpellModifier(GetAura()); +                    spellMod->op = SpellModOp(aurEff->GetMiscValue()); +                    spellMod->type = SPELLMOD_PCT; +                    spellMod->spellId = GetId(); +                    spellMod->mask = GetSpellInfo()->Effects[aurEff->GetEffIndex()].SpellClassMask; +                } + +                spellMod->value = aurEff->GetAmount(); +            } + +            void Register() override +            { +                DoEffectCalcSpellMod += AuraEffectCalcSpellModFn(spell_pri_improved_power_word_shield_AuraScript::HandleEffectCalcSpellMod, EFFECT_0, SPELL_AURA_DUMMY); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_pri_improved_power_word_shield_AuraScript(); +        } +}; + +// 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") { } + +        class spell_pri_item_greater_heal_refund_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_pri_item_greater_heal_refund_AuraScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_ITEM_EFFICIENCY)) +                    return false; +                return true; +            } + +            void OnProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) +            { +                PreventDefaultAction(); +                GetTarget()->CastSpell(GetTarget(), SPELL_PRIEST_ITEM_EFFICIENCY, true, NULL, aurEff); +            } + +            void Register() override +            { +                OnEffectProc += AuraEffectProcFn(spell_pri_item_greater_heal_refund_AuraScript::OnProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_pri_item_greater_heal_refund_AuraScript(); +        } +}; +  // 47788 - Guardian Spirit  class spell_pri_guardian_spirit : public SpellScriptLoader  { @@ -346,42 +548,46 @@ class spell_pri_hymn_of_hope : public SpellScriptLoader          }  }; -// 37594 - Greater Heal Refund -class spell_pri_item_greater_heal_refund : public SpellScriptLoader +// 92833 - Leap of Faith +class spell_pri_leap_of_faith_effect_trigger : public SpellScriptLoader  {      public: -        spell_pri_item_greater_heal_refund() : SpellScriptLoader("spell_pri_item_greater_heal_refund") { } +        spell_pri_leap_of_faith_effect_trigger() : SpellScriptLoader("spell_pri_leap_of_faith_effect_trigger") { } -        class spell_pri_item_greater_heal_refund_AuraScript : public AuraScript +        class spell_pri_leap_of_faith_effect_trigger_SpellScript : public SpellScript          { -            PrepareAuraScript(spell_pri_item_greater_heal_refund_AuraScript); +            PrepareSpellScript(spell_pri_leap_of_faith_effect_trigger_SpellScript);              bool Validate(SpellInfo const* /*spellInfo*/) override              { -                if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_ITEM_EFFICIENCY)) +                if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_LEAP_OF_FAITH_EFFECT))                      return false;                  return true;              } -            void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) +            void HandleEffectDummy(SpellEffIndex /*effIndex*/)              { -                PreventDefaultAction(); -                GetTarget()->CastSpell(GetTarget(), SPELL_PRIEST_ITEM_EFFICIENCY, true, NULL, aurEff); +                Position destPos = GetHitDest()->GetPosition(); + +                SpellCastTargets targets; +                targets.SetDst(destPos); +                targets.SetUnitTarget(GetCaster()); +                GetHitUnit()->CastSpell(targets, sSpellMgr->GetSpellInfo(GetEffectValue()), NULL);              }              void Register() override              { -                OnEffectProc += AuraEffectProcFn(spell_pri_item_greater_heal_refund_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); +                OnEffectHitTarget += SpellEffectFn(spell_pri_leap_of_faith_effect_trigger_SpellScript::HandleEffectDummy, EFFECT_0, SPELL_EFFECT_DUMMY);              }          }; -        AuraScript* GetAuraScript() const override +        SpellScript* GetSpellScript() const override          { -            return new spell_pri_item_greater_heal_refund_AuraScript(); +            return new spell_pri_leap_of_faith_effect_trigger_SpellScript();          }  }; -// -7001 - Lightwell Renew +// 7001 - Lightwell Renew  class spell_pri_lightwell_renew : public SpellScriptLoader  {      public: @@ -492,7 +698,7 @@ class spell_pri_mana_leech : public SpellScriptLoader          }  }; -// -49821 - Mind Sear +// 49821 - Mind Sear  class spell_pri_mind_sear : public SpellScriptLoader  {      public: @@ -556,7 +762,7 @@ class spell_pri_pain_and_suffering_proc : public SpellScriptLoader          }  }; -// -47540 - Penance +// 47540 - Penance  class spell_pri_penance : public SpellScriptLoader  {      public: @@ -629,7 +835,41 @@ class spell_pri_penance : public SpellScriptLoader          }  }; -// -17 - Power Word: Shield +// -47569 - Phantasm +class spell_pri_phantasm : public SpellScriptLoader +{ +    public: +        spell_pri_phantasm() : SpellScriptLoader("spell_pri_phantasm") { } + +        class spell_pri_phantasm_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_pri_phantasm_AuraScript); + +            bool CheckProc(ProcEventInfo& /*eventInfo*/) +            { +                return roll_chance_i(GetEffect(EFFECT_0)->GetAmount()); +            } + +            void HandleEffectProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) +            { +                PreventDefaultAction(); +                GetTarget()->RemoveMovementImpairingAuras(); +            } + +            void Register() override +            { +                DoCheckProc += AuraCheckProcFn(spell_pri_phantasm_AuraScript::CheckProc); +                OnEffectProc += AuraEffectProcFn(spell_pri_phantasm_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_pri_phantasm_AuraScript(); +        } +}; + +// 17 - Power Word: Shield  class spell_pri_power_word_shield : public SpellScriptLoader  {      public: @@ -653,8 +893,8 @@ class spell_pri_power_word_shield : public SpellScriptLoader                  canBeRecalculated = false;                  if (Unit* caster = GetCaster())                  { -                    // +80.68% from sp bonus -                    float bonus = 0.8068f; +                    // +87% from sp bonus +                    float bonus = 0.87f;                      // Borrowed Time                      if (AuraEffect const* borrowedTime = caster->GetDummyAuraEffect(SPELLFAMILY_PRIEST, PRIEST_ICON_ID_BORROWED_TIME, EFFECT_1)) @@ -670,7 +910,7 @@ class spell_pri_power_word_shield : public SpellScriptLoader                      amount += int32(bonus);                      // Twin Disciplines -                    if (AuraEffect const* twinDisciplines = caster->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_PRIEST, 0x400000, 0, 0, GetCasterGUID())) +                    if (AuraEffect const* twinDisciplines = caster->GetAuraEffectOfRankedSpell(SPELL_PRIEST_TWIN_DISCIPLINES_RANK_1, EFFECT_1))                          AddPct(amount, twinDisciplines->GetAmount());                      // Focused Power @@ -684,7 +924,7 @@ class spell_pri_power_word_shield : public SpellScriptLoader                  if (dmgInfo.GetAttacker() == target)                      return; -                if (AuraEffect* talentAurEff = target->GetAuraEffectOfRankedSpell(SPELL_PRIEST_REFLECTIVE_SHIELD_R1, EFFECT_0)) +                if (AuraEffect const* talentAurEff = target->GetAuraEffectOfRankedSpell(SPELL_PRIEST_REFLECTIVE_SHIELD_R1, EFFECT_0))                  {                      int32 bp = CalculatePct(absorbAmount, talentAurEff->GetAmount());                      target->CastCustomSpell(dmgInfo.GetAttacker(), SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED, &bp, NULL, NULL, true, NULL, aurEff); @@ -739,7 +979,7 @@ class spell_pri_prayer_of_mending_heal : public SpellScriptLoader          }  }; -// -139 - Renew +// 139 - Renew  class spell_pri_renew : public SpellScriptLoader  {      public: @@ -749,6 +989,13 @@ class spell_pri_renew : public SpellScriptLoader          {              PrepareAuraScript(spell_pri_renew_AuraScript); +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_DIVINE_TOUCH)) +                    return false; +                return true; +            } +              bool Load() override              {                  return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER; @@ -758,14 +1005,13 @@ class spell_pri_renew : public SpellScriptLoader              {                  if (Unit* caster = GetCaster())                  { -                    // Empowered Renew -                    if (AuraEffect const* empoweredRenewAurEff = caster->GetDummyAuraEffect(SPELLFAMILY_PRIEST, PRIEST_ICON_ID_EMPOWERED_RENEW_TALENT, EFFECT_1)) +                    // Divine Touch +                    if (AuraEffect const* empoweredRenewAurEff = caster->GetDummyAuraEffect(SPELLFAMILY_PRIEST, PRIEST_ICON_ID_DIVINE_TOUCH_TALENT, EFFECT_0))                      { -                        uint32 heal = caster->SpellHealingBonusDone(GetTarget(), GetSpellInfo(), GetEffect(EFFECT_0)->GetAmount(), DOT); +                        uint32 heal = caster->SpellHealingBonusDone(GetTarget(), GetSpellInfo(), aurEff->GetAmount(), DOT);                          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, NULL, NULL, true, NULL, aurEff); +                        int32 basepoints0 = CalculatePct(int32(heal) * aurEff->GetTotalTicks(), empoweredRenewAurEff->GetAmount()); +                        caster->CastCustomSpell(GetTarget(), SPELL_PRIEST_DIVINE_TOUCH, &basepoints0, NULL, NULL, true, NULL, aurEff);                      }                  }              } @@ -782,7 +1028,7 @@ class spell_pri_renew : public SpellScriptLoader          }  }; -// -32379 - Shadow Word Death +// 32379 - Shadow Word Death  class spell_pri_shadow_word_death : public SpellScriptLoader  {      public: @@ -815,7 +1061,120 @@ class spell_pri_shadow_word_death : public SpellScriptLoader          }  }; -// -34914 - Vampiric Touch +// 15473 - Shadowform +class spell_pri_shadowform : public SpellScriptLoader +{ +    public: +        spell_pri_shadowform() : SpellScriptLoader("spell_pri_shadowform") { } + +        class spell_pri_shadowform_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_pri_shadowform_AuraScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_SHADOWFORM_VISUAL_WITHOUT_GLYPH) || +                    !sSpellMgr->GetSpellInfo(SPELL_PRIEST_SHADOWFORM_VISUAL_WITH_GLYPH)) +                    return false; +                return true; +            } + +            void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) +            { +                GetTarget()->CastSpell(GetTarget(), GetTarget()->HasAura(SPELL_PRIEST_GLYPH_OF_SHADOW) ? SPELL_PRIEST_SHADOWFORM_VISUAL_WITH_GLYPH : SPELL_PRIEST_SHADOWFORM_VISUAL_WITHOUT_GLYPH, true); +            } + +            void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) +            { +                GetTarget()->RemoveAurasDueToSpell(GetTarget()->HasAura(SPELL_PRIEST_GLYPH_OF_SHADOW) ? SPELL_PRIEST_SHADOWFORM_VISUAL_WITH_GLYPH : SPELL_PRIEST_SHADOWFORM_VISUAL_WITHOUT_GLYPH); +            } + +            void Register() override +            { +                AfterEffectApply += AuraEffectApplyFn(spell_pri_shadowform_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_MOD_SHAPESHIFT, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); +                AfterEffectRemove += AuraEffectRemoveFn(spell_pri_shadowform_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_MOD_SHAPESHIFT, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_pri_shadowform_AuraScript(); +        } +}; + +// 15286 - Vampiric Embrace +class spell_pri_vampiric_embrace : public SpellScriptLoader +{ +    public: +        spell_pri_vampiric_embrace() : SpellScriptLoader("spell_pri_vampiric_embrace") { } + +        class spell_pri_vampiric_embrace_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_pri_vampiric_embrace_AuraScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_VAMPIRIC_EMBRACE_HEAL)) +                    return false; +                return true; +            } + +            bool CheckProc(ProcEventInfo& eventInfo) +            { +                // Not proc from Mind Sear +                return !(eventInfo.GetDamageInfo()->GetSpellInfo()->SpellFamilyFlags[1] & 0x80000); +            } + +            void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) +            { +                PreventDefaultAction(); +                int32 self = int32(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount())); +                int32 team = int32(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount() / 2)); + +                GetTarget()->CastCustomSpell((Unit*)NULL, SPELL_PRIEST_VAMPIRIC_EMBRACE_HEAL, &team, &self, NULL, true, NULL, aurEff); +            } + +            void Register() override +            { +                DoCheckProc += AuraCheckProcFn(spell_pri_vampiric_embrace_AuraScript::CheckProc); +                OnEffectProc += AuraEffectProcFn(spell_pri_vampiric_embrace_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_pri_vampiric_embrace_AuraScript(); +        } +}; + +// 15290 - Vampiric Embrace (heal) +class spell_pri_vampiric_embrace_target : public SpellScriptLoader +{ +    public: +        spell_pri_vampiric_embrace_target() : SpellScriptLoader("spell_pri_vampiric_embrace_target") { } + +        class spell_pri_vampiric_embrace_target_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_pri_vampiric_embrace_target_SpellScript); + +            void FilterTargets(std::list<WorldObject*>& unitList) +            { +                unitList.remove(GetCaster()); +            } + +            void Register() override +            { +                OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_vampiric_embrace_target_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_PARTY); +            } +        }; + +        SpellScript* GetSpellScript() const override +        { +            return new spell_pri_vampiric_embrace_target_SpellScript(); +        } +}; + +// 34914 - Vampiric Touch  class spell_pri_vampiric_touch : public SpellScriptLoader  {      public: @@ -827,7 +1186,8 @@ class spell_pri_vampiric_touch : public SpellScriptLoader              bool Validate(SpellInfo const* /*spellInfo*/) override              { -                if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_VAMPIRIC_TOUCH_DISPEL)) +                if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_VAMPIRIC_TOUCH_DISPEL) || +                    !sSpellMgr->GetSpellInfo(SPELL_GEN_REPLENISHMENT))                      return false;                  return true;              } @@ -844,9 +1204,21 @@ class spell_pri_vampiric_touch : public SpellScriptLoader                          }              } +            bool CheckProc(ProcEventInfo& eventInfo) +            { +                return eventInfo.GetProcTarget() == GetCaster(); +            } + +            void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) +            { +                eventInfo.GetProcTarget()->CastSpell((Unit*)NULL, SPELL_GEN_REPLENISHMENT, true, NULL, aurEff); +            } +              void Register() override              {                  AfterDispel += AuraDispelFn(spell_pri_vampiric_touch_AuraScript::HandleDispel); +                DoCheckProc += AuraCheckProcFn(spell_pri_vampiric_touch_AuraScript::CheckProc); +                OnEffectProc += AuraEffectProcFn(spell_pri_vampiric_touch_AuraScript::HandleEffectProc, EFFECT_2, SPELL_AURA_DUMMY);              }          }; @@ -858,22 +1230,30 @@ class spell_pri_vampiric_touch : public SpellScriptLoader  void AddSC_priest_spell_scripts()  { +    new spell_pri_body_and_soul();      new spell_pri_circle_of_healing(); +    new spell_pri_dispel_magic();      new spell_pri_divine_aegis();      new spell_pri_divine_hymn();      new spell_pri_glyph_of_prayer_of_healing(); -    new spell_pri_guardian_spirit();      new spell_pri_hymn_of_hope(); +    new spell_pri_improved_power_word_shield();      new spell_pri_item_greater_heal_refund(); +    new spell_pri_guardian_spirit(); +    new spell_pri_leap_of_faith_effect_trigger();      new spell_pri_lightwell_renew();      new spell_pri_mana_burn();      new spell_pri_mana_leech();      new spell_pri_mind_sear();      new spell_pri_pain_and_suffering_proc();      new spell_pri_penance(); +    new spell_pri_phantasm();      new spell_pri_power_word_shield();      new spell_pri_prayer_of_mending_heal();      new spell_pri_renew();      new spell_pri_shadow_word_death(); +    new spell_pri_shadowform(); +    new spell_pri_vampiric_embrace(); +    new spell_pri_vampiric_embrace_target();      new spell_pri_vampiric_touch();  } diff --git a/src/server/scripts/Spells/spell_rogue.cpp b/src/server/scripts/Spells/spell_rogue.cpp index a04fdba57b9..e8546c4214e 100644 --- a/src/server/scripts/Spells/spell_rogue.cpp +++ b/src/server/scripts/Spells/spell_rogue.cpp @@ -29,17 +29,33 @@  enum RogueSpells  { -    SPELL_ROGUE_BLADE_FLURRY_EXTRA_ATTACK       = 22482, -    SPELL_ROGUE_CHEAT_DEATH_COOLDOWN            = 31231, -    SPELL_ROGUE_GLYPH_OF_PREPARATION            = 56819, -    SPELL_ROGUE_KILLING_SPREE                   = 51690, -    SPELL_ROGUE_KILLING_SPREE_TELEPORT          = 57840, -    SPELL_ROGUE_KILLING_SPREE_WEAPON_DMG        = 57841, -    SPELL_ROGUE_KILLING_SPREE_DMG_BUFF          = 61851, -    SPELL_ROGUE_PREY_ON_THE_WEAK                = 58670, -    SPELL_ROGUE_SHIV_TRIGGERED                  = 5940, -    SPELL_ROGUE_TRICKS_OF_THE_TRADE_DMG_BOOST   = 57933, -    SPELL_ROGUE_TRICKS_OF_THE_TRADE_PROC        = 59628, +    SPELL_ROGUE_BLADE_FLURRY                        = 13877, +    SPELL_ROGUE_BLADE_FLURRY_EXTRA_ATTACK           = 22482, +    SPELL_ROGUE_CHEAT_DEATH_COOLDOWN                = 31231, +    SPELL_ROGUE_CRIPPLING_POISON                    = 3409, +    SPELL_ROGUE_GLYPH_OF_PREPARATION                = 56819, +    SPELL_ROGUE_KILLING_SPREE                       = 51690, +    SPELL_ROGUE_KILLING_SPREE_TELEPORT              = 57840, +    SPELL_ROGUE_KILLING_SPREE_WEAPON_DMG            = 57841, +    SPELL_ROGUE_KILLING_SPREE_DMG_BUFF              = 61851, +    SPELL_ROGUE_MASTER_OF_SUBTLETY_DAMAGE_PERCENT   = 31665, +    SPELL_ROGUE_MASTER_OF_SUBTLETY_PASSIVE          = 31223, +    SPELL_ROGUE_MASTER_OF_SUBTLETY_PERIODIC         = 31666, +    SPELL_ROGUE_OVERKILL_TALENT                     = 58426, +    SPELL_ROGUE_OVERKILL_PERIODIC                   = 58428, +    SPELL_ROGUE_OVERKILL_POWER_REGEN                = 58427, +    SPELL_ROGUE_PREY_ON_THE_WEAK                    = 58670, +    SPELL_ROGUE_SHIV_TRIGGERED                      = 5940, +    SPELL_ROGUE_SILCE_AND_DICE                      = 5171, +    SPELL_ROGUE_TRICKS_OF_THE_TRADE_DMG_BOOST       = 57933, +    SPELL_ROGUE_TRICKS_OF_THE_TRADE_PROC            = 59628, +    SPELL_ROGUE_SERRATED_BLADES_R1                  = 14171, +    SPELL_ROGUE_RUPTURE                             = 1943, +}; + +enum RogueSpellIcons +{ +    ICON_ROGUE_IMPROVED_RECUPERATE                  = 4819  };  // 13877, 33735, (check 51211, 65956) - Blade Flurry @@ -67,24 +83,27 @@ class spell_rog_blade_flurry : public SpellScriptLoader              bool CheckProc(ProcEventInfo& eventInfo)              { -                _procTarget = eventInfo.GetActor()->SelectNearbyTarget(eventInfo.GetProcTarget()); -                return _procTarget != nullptr; +                _procTarget = GetTarget()->SelectNearbyTarget(eventInfo.GetProcTarget()); +                return _procTarget && eventInfo.GetDamageInfo();              }              void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)              {                  PreventDefaultAction(); -                if (eventInfo.GetDamageInfo()) -                { -                    int32 damage = eventInfo.GetDamageInfo()->GetDamage(); -                    GetTarget()->CastCustomSpell(SPELL_ROGUE_BLADE_FLURRY_EXTRA_ATTACK, SPELLVALUE_BASE_POINT0, damage, _procTarget, true, NULL, aurEff); -                } + +                TC_LOG_ERROR("misc", "damage: %u procSpell: %u", +                    eventInfo.GetDamageInfo()->GetDamage(), eventInfo.GetDamageInfo()->GetSpellInfo() ? eventInfo.GetDamageInfo()->GetSpellInfo()->Id : 0); + +                GetTarget()->CastCustomSpell(SPELL_ROGUE_BLADE_FLURRY_EXTRA_ATTACK, SPELLVALUE_BASE_POINT0, eventInfo.GetDamageInfo()->GetDamage(), _procTarget, true, NULL, aurEff);              }              void Register() override              {                  DoCheckProc += AuraCheckProcFn(spell_rog_blade_flurry_AuraScript::CheckProc); -                OnEffectProc += AuraEffectProcFn(spell_rog_blade_flurry_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_MOD_MELEE_HASTE); +                if (m_scriptSpellId == SPELL_ROGUE_BLADE_FLURRY) +                    OnEffectProc += AuraEffectProcFn(spell_rog_blade_flurry_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_MOD_POWER_REGEN_PERCENT); +                else +                    OnEffectProc += AuraEffectProcFn(spell_rog_blade_flurry_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_MOD_MELEE_HASTE);              }          private: @@ -97,7 +116,7 @@ class spell_rog_blade_flurry : public SpellScriptLoader          }  }; -// -31228 - Cheat Death +// 31228 - Cheat Death  class spell_rog_cheat_death : public SpellScriptLoader  {      public: @@ -160,7 +179,71 @@ class spell_rog_cheat_death : public SpellScriptLoader          }  }; -// -2818 - Deadly Poison +// -51625 - Deadly Brew +class spell_rog_crippling_poison : public SpellScriptLoader +{ +    public: +        spell_rog_crippling_poison() : SpellScriptLoader("spell_rog_crippling_poison") { } + +        class spell_rog_crippling_poison_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_rog_crippling_poison_AuraScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_CRIPPLING_POISON)) +                    return false; +                return true; +            } + +            void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) +            { +                PreventDefaultAction(); +                GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_ROGUE_CRIPPLING_POISON, true, NULL, aurEff); +            } + +            void Register() override +            { +                OnEffectProc += AuraEffectProcFn(spell_rog_crippling_poison_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_rog_crippling_poison_AuraScript(); +        } +}; + +// -51664 - Cut to the Chase +class spell_rog_cut_to_the_chase : public SpellScriptLoader +{ +    public: +        spell_rog_cut_to_the_chase () : SpellScriptLoader("spell_rog_cut_to_the_chase") { } + +        class spell_rog_cut_to_the_chase_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_rog_cut_to_the_chase_AuraScript); + +            void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) +            { +                PreventDefaultAction(); +                if (Aura* aur = GetTarget()->GetAura(SPELL_ROGUE_SILCE_AND_DICE)) +                    aur->SetDuration(aur->GetSpellInfo()->GetMaxDuration(), true); +            } + +            void Register() override +            { +                OnEffectProc += AuraEffectProcFn(spell_rog_cut_to_the_chase_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_rog_cut_to_the_chase_AuraScript(); +        } +}; + +// 2818 - Deadly Poison  class spell_rog_deadly_poison : public SpellScriptLoader  {      public: @@ -206,6 +289,9 @@ class spell_rog_deadly_poison : public SpellScriptLoader                      // item combat enchantments                      for (uint8 slot = 0; slot < MAX_ENCHANTMENT_SLOT; ++slot)                      { +                        if (slot > PRISMATIC_ENCHANTMENT_SLOT && slot < PROP_ENCHANTMENT_SLOT_0)    // not holding enchantment id +                            continue; +                          SpellItemEnchantmentEntry const* enchant = sSpellItemEnchantmentStore.LookupEntry(item->GetEnchantmentId(EnchantmentSlot(slot)));                          if (!enchant)                              continue; @@ -354,7 +440,44 @@ class spell_rog_killing_spree : public SpellScriptLoader          }  }; -// -31130 - Nerves of Steel +// 31666 - Master of Subtlety +class spell_rog_master_of_subtlety : public SpellScriptLoader +{ +    public: +        spell_rog_master_of_subtlety() : SpellScriptLoader("spell_rog_master_of_subtlety") { } + +        class spell_rog_master_of_subtlety_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_rog_master_of_subtlety_AuraScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_MASTER_OF_SUBTLETY_DAMAGE_PERCENT)) +                    return false; +                return true; +            } + +            void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) +            { +                Unit* target = GetTarget(); + +                if (!target->HasAuraType(SPELL_AURA_MOD_STEALTH)) +                    target->RemoveAurasDueToSpell(SPELL_ROGUE_MASTER_OF_SUBTLETY_DAMAGE_PERCENT); +            } + +            void Register() +            { +                OnEffectPeriodic += AuraEffectPeriodicFn(spell_rog_master_of_subtlety_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); +            } +        }; + +        AuraScript* GetAuraScript() const +        { +            return new spell_rog_master_of_subtlety_AuraScript(); +        } +}; + +// 31130 - Nerves of Steel  class spell_rog_nerves_of_steel : public SpellScriptLoader  {      public: @@ -398,6 +521,43 @@ class spell_rog_nerves_of_steel : public SpellScriptLoader          }  }; +// 58428 - Overkill +class spell_rog_overkill : public SpellScriptLoader +{ +    public: +        spell_rog_overkill() : SpellScriptLoader("spell_rog_overkill") { } + +        class spell_rog_overkill_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_rog_overkill_AuraScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_OVERKILL_POWER_REGEN)) +                    return false; +                return true; +            } + +            void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) +            { +                Unit* target = GetTarget(); + +                if (!target->HasAuraType(SPELL_AURA_MOD_STEALTH)) +                    target->RemoveAurasDueToSpell(SPELL_ROGUE_OVERKILL_POWER_REGEN); +            } + +            void Register() +            { +                OnEffectPeriodic += AuraEffectPeriodicFn(spell_rog_overkill_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); +            } +        }; + +        AuraScript* GetAuraScript() const +        { +            return new spell_rog_overkill_AuraScript(); +        } +}; +  // 14185 - Preparation  class spell_rog_preparation : public SpellScriptLoader  { @@ -424,29 +584,25 @@ class spell_rog_preparation : public SpellScriptLoader              {                  Player* caster = GetCaster()->ToPlayer(); -                //immediately finishes the cooldown on certain Rogue abilities -                const SpellCooldowns& cm = caster->GetSpellCooldownMap(); +                // immediately finishes the cooldown on certain Rogue abilities +                SpellCooldowns const& cm = caster->GetSpellCooldownMap();                  for (SpellCooldowns::const_iterator itr = cm.begin(); itr != cm.end();)                  {                      SpellInfo const* spellInfo = sSpellMgr->EnsureSpellInfo(itr->first); +                    if (spellInfo->SpellFamilyName != SPELLFAMILY_ROGUE) +                    { +                        ++itr; +                        continue; +                    } -                    if (spellInfo->SpellFamilyName == SPELLFAMILY_ROGUE) +                    if ((spellInfo->SpellFamilyFlags[1] & SPELLFAMILYFLAG1_ROGUE_SHADOWSTEP ||              // Shadowstep +                        spellInfo->SpellFamilyFlags[0] & SPELLFAMILYFLAG0_ROGUE_VAN_SPRINT) ||              // Vanish, Sprint +                        // Glyph of Preparation +                        (caster->HasAura(SPELL_ROGUE_GLYPH_OF_PREPARATION) && +                        (spellInfo->SpellFamilyFlags[1] & SPELLFAMILYFLAG1_ROGUE_DISMANTLE_SMOKE_BOMB ||    // Dismantle, Smoke Bomb +                        spellInfo->SpellFamilyFlags[0] & SPELLFAMILYFLAG0_ROGUE_KICK)))                     // Kick                      { -                        if (spellInfo->SpellFamilyFlags[1] & SPELLFAMILYFLAG1_ROGUE_COLDB_SHADOWSTEP ||      // Cold Blood, Shadowstep -                            spellInfo->SpellFamilyFlags[0] & SPELLFAMILYFLAG_ROGUE_VAN_EVAS_SPRINT)           // Vanish, Evasion, Sprint -                            caster->RemoveSpellCooldown((itr++)->first, true); -                        else if (caster->HasAura(SPELL_ROGUE_GLYPH_OF_PREPARATION)) -                        { -                            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)) -                                caster->RemoveSpellCooldown((itr++)->first, true); -                            else -                                ++itr; -                        } -                        else -                            ++itr; +                        caster->RemoveSpellCooldown((itr++)->first, true);                      }                      else                          ++itr; @@ -465,7 +621,7 @@ class spell_rog_preparation : public SpellScriptLoader          }  }; -// -51685 - Prey on the Weak +// 51685 - Prey on the Weak  class spell_rog_prey_on_the_weak : public SpellScriptLoader  {      public: @@ -510,7 +666,56 @@ class spell_rog_prey_on_the_weak : public SpellScriptLoader          }  }; -// -1943 - Rupture +// 73651 - Recuperate +class spell_rog_recuperate : public SpellScriptLoader +{ +    public: +        spell_rog_recuperate() : SpellScriptLoader("spell_rog_recuperate") { } + +        class spell_rog_recuperate_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_rog_recuperate_AuraScript); + +            bool Load() override +            { +                return GetCaster()->GetTypeId() == TYPEID_PLAYER; +            } + +            void OnPeriodic(AuraEffect const* /*aurEff*/) +            { +                if (Unit* caster = GetCaster()) +                    if (AuraEffect* effect = GetAura()->GetEffect(EFFECT_0)) +                        effect->RecalculateAmount(caster); +            } + +            void CalculateBonus(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) +            { +                canBeRecalculated = false; +                if (Unit* caster = GetCaster()) +                { +                    int32 baseAmount = GetSpellInfo()->Effects[EFFECT_0].CalcValue(caster) * 1000; +                    // Improved Recuperate +                    if (AuraEffect const* auraEffect = caster->GetDummyAuraEffect(SPELLFAMILY_ROGUE, ICON_ROGUE_IMPROVED_RECUPERATE, EFFECT_0)) +                        baseAmount += auraEffect->GetAmount(); + +                    amount = CalculatePct(caster->GetMaxHealth(), float(baseAmount) / 1000.0f); +                } +            } + +            void Register() override +            { +                OnEffectPeriodic += AuraEffectPeriodicFn(spell_rog_recuperate_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_HEAL); +                DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_rog_recuperate_AuraScript::CalculateBonus, EFFECT_0, SPELL_AURA_PERIODIC_HEAL); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_rog_recuperate_AuraScript(); +        } +}; + +// 1943 - Rupture  class spell_rog_rupture : public SpellScriptLoader  {      public: @@ -603,6 +808,70 @@ class spell_rog_shiv : public SpellScriptLoader          }  }; +// 1784 - Stealth +class spell_rog_stealth : public SpellScriptLoader +{ +    public: +        spell_rog_stealth() : SpellScriptLoader("spell_rog_stealth") { } + +        class spell_rog_stealth_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_rog_stealth_AuraScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_MASTER_OF_SUBTLETY_PASSIVE) || +                    !sSpellMgr->GetSpellInfo(SPELL_ROGUE_MASTER_OF_SUBTLETY_DAMAGE_PERCENT) || +                    !sSpellMgr->GetSpellInfo(SPELL_ROGUE_MASTER_OF_SUBTLETY_PERIODIC) || +                    !sSpellMgr->GetSpellInfo(SPELL_ROGUE_OVERKILL_TALENT) || +                    !sSpellMgr->GetSpellInfo(SPELL_ROGUE_OVERKILL_POWER_REGEN) || +                    !sSpellMgr->GetSpellInfo(SPELL_ROGUE_OVERKILL_PERIODIC)) +                    return false; +                return true; +            } + +            void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) +            { +                Unit* target = GetTarget(); + +                // Master of Subtlety +                if (AuraEffect const* aurEff = target->GetAuraEffect(SPELL_ROGUE_MASTER_OF_SUBTLETY_PASSIVE, EFFECT_0)) +                { +                    int32 basepoints0 = aurEff->GetAmount(); +                    target->CastCustomSpell(target, SPELL_ROGUE_MASTER_OF_SUBTLETY_DAMAGE_PERCENT, &basepoints0, NULL, NULL, true); +                } + +                // Overkill +                if (target->HasAura(SPELL_ROGUE_OVERKILL_TALENT)) +                    target->CastSpell(target, SPELL_ROGUE_OVERKILL_POWER_REGEN, true); +            } + +            void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) +            { +                Unit* target = GetTarget(); + +                // Master of subtlety +                if (target->HasAura(SPELL_ROGUE_MASTER_OF_SUBTLETY_PASSIVE)) +                    target->CastSpell(target, SPELL_ROGUE_MASTER_OF_SUBTLETY_PERIODIC, true); + +                // Overkill +                if (target->HasAura(SPELL_ROGUE_OVERKILL_TALENT)) +                    target->CastSpell(target, SPELL_ROGUE_OVERKILL_PERIODIC, true); +            } + +            void Register() +            { +                AfterEffectApply += AuraEffectApplyFn(spell_rog_stealth_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_MOD_SHAPESHIFT, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); +                AfterEffectRemove += AuraEffectRemoveFn(spell_rog_stealth_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_MOD_SHAPESHIFT, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); +            } +        }; + +        AuraScript* GetAuraScript() const +        { +            return new spell_rog_stealth_AuraScript(); +        } +}; +  // 57934 - Tricks of the Trade  class spell_rog_tricks_of_the_trade : public SpellScriptLoader  { @@ -694,17 +963,58 @@ class spell_rog_tricks_of_the_trade_proc : public SpellScriptLoader          }  }; +class spell_rog_serrated_blades : public SpellScriptLoader +{ +public: +    spell_rog_serrated_blades() : SpellScriptLoader("spell_rog_serrated_blades") { } + +    class spell_rog_serrated_blades_SpellScript : public SpellScript +    { +        PrepareSpellScript(spell_rog_serrated_blades_SpellScript); + +        void HandleHit() +        { +            if (AuraEffect* blade = GetCaster()->GetAuraEffectOfRankedSpell(SPELL_ROGUE_SERRATED_BLADES_R1, EFFECT_0)) +            { +                uint8 combo = GetCaster()->ToPlayer()->GetComboPoints(); + +                if (roll_chance_i(blade->GetAmount() * combo)) +                    if (Aura* dot = GetHitUnit()->GetAura(SPELL_ROGUE_RUPTURE, GetCaster()->GetGUID())) +                        dot->RefreshDuration(); + +            } +        } + +        void Register() +        { +            OnHit += SpellHitFn(spell_rog_serrated_blades_SpellScript::HandleHit); +        } +    }; + +    SpellScript* GetSpellScript() const override +    { +        return new spell_rog_serrated_blades_SpellScript(); +    } +}; +  void AddSC_rogue_spell_scripts()  {      new spell_rog_blade_flurry();      new spell_rog_cheat_death(); +    new spell_rog_crippling_poison(); +    new spell_rog_cut_to_the_chase();      new spell_rog_deadly_poison();      new spell_rog_killing_spree(); +    new spell_rog_master_of_subtlety();      new spell_rog_nerves_of_steel(); +    new spell_rog_overkill();      new spell_rog_preparation();      new spell_rog_prey_on_the_weak(); +    new spell_rog_recuperate();      new spell_rog_rupture();      new spell_rog_shiv(); +    new spell_rog_stealth();      new spell_rog_tricks_of_the_trade();      new spell_rog_tricks_of_the_trade_proc(); +    new spell_rog_serrated_blades();  } diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp index bba1f4e298b..b9f34bafedf 100644 --- a/src/server/scripts/Spells/spell_shaman.cpp +++ b/src/server/scripts/Spells/spell_shaman.cpp @@ -30,133 +30,138 @@  enum ShamanSpells  { +    SPELL_SHAMAN_ANCESTRAL_AWAKENING            = 52759,      SPELL_SHAMAN_ANCESTRAL_AWAKENING_PROC       = 52752,      SPELL_SHAMAN_BIND_SIGHT                     = 6277, -    SPELL_SHAMAN_CLEANSING_TOTEM_EFFECT         = 52025,      SPELL_SHAMAN_EARTH_SHIELD_HEAL              = 379,      SPELL_SHAMAN_ELEMENTAL_MASTERY              = 16166,      SPELL_SHAMAN_EXHAUSTION                     = 57723, -    SPELL_SHAMAN_FIRE_NOVA_R1                   = 1535,      SPELL_SHAMAN_FIRE_NOVA_TRIGGERED_R1         = 8349, +    SPELL_SHAMAN_FLAME_SHOCK                    = 8050, +    SPELL_SHAMAN_FOCUSED_INSIGHT                = 77800,      SPELL_SHAMAN_GLYPH_OF_EARTH_SHIELD          = 63279,      SPELL_SHAMAN_GLYPH_OF_HEALING_STREAM_TOTEM  = 55456, +    SPELL_SHAMAN_GLYPH_OF_HEALING_WAVE          = 55533,      SPELL_SHAMAN_GLYPH_OF_MANA_TIDE             = 55441,      SPELL_SHAMAN_GLYPH_OF_THUNDERSTORM          = 62132, +    SPELL_SHAMAN_LAVA_BURST                     = 51505, +    SPELL_SHAMAN_LAVA_FLOWS_R1                  = 51480, +    SPELL_SHAMAN_LAVA_FLOWS_TRIGGERED_R1        = 65264, +    SPELL_SHAMAN_LAVA_SURGE                     = 77762,      SPELL_SHAMAN_ITEM_LIGHTNING_SHIELD          = 23552,      SPELL_SHAMAN_ITEM_LIGHTNING_SHIELD_DAMAGE   = 27635,      SPELL_SHAMAN_ITEM_MANA_SURGE                = 23571, -    SPELL_SHAMAN_LAVA_FLOWS_R1                  = 51480, -    SPELL_SHAMAN_LAVA_FLOWS_TRIGGERED_R1        = 64694, -    SPELL_SHAMAN_MANA_SPRING_TOTEM_ENERGIZE     = 52032, -    SPELL_SHAMAN_MANA_TIDE_TOTEM                = 39609, +    SPELL_SHAMAN_LIGHTNING_SHIELD               = 324, +    SPELL_SHAMAN_NATURE_GUARDIAN                = 31616,      SPELL_SHAMAN_SATED                          = 57724,      SPELL_SHAMAN_STORM_EARTH_AND_FIRE           = 51483, +    SPELL_SHAMAN_TELLURIC_CURRENTS              = 82987,      SPELL_SHAMAN_TOTEM_EARTHBIND_EARTHGRAB      = 64695,      SPELL_SHAMAN_TOTEM_EARTHBIND_TOTEM          = 6474,      SPELL_SHAMAN_TOTEM_EARTHEN_POWER            = 59566, -    SPELL_SHAMAN_TOTEM_HEALING_STREAM_HEAL      = 52042 +    SPELL_SHAMAN_TOTEM_HEALING_STREAM_HEAL      = 52042, +    SPELL_SHAMAN_TIDAL_WAVES                    = 53390  };  enum ShamanSpellIcons  { -    SHAMAN_ICON_ID_RESTORATIVE_TOTEMS           = 338, +    SHAMAN_ICON_ID_SOOTHING_RAIN                = 2011,      SHAMAN_ICON_ID_SHAMAN_LAVA_FLOW             = 3087  }; -// 52759 - Ancestral Awakening (Proc) -class spell_sha_ancestral_awakening_proc : public SpellScriptLoader +enum MiscSpells +{ +    SPELL_HUNTER_INSANITY                       = 95809, +    SPELL_MAGE_TEMPORAL_DISPLACEMENT            = 80354 +}; + +// -51556 - Ancestral Awakening +class spell_sha_ancestral_awakening : public SpellScriptLoader  {      public: -        spell_sha_ancestral_awakening_proc() : SpellScriptLoader("spell_sha_ancestral_awakening_proc") { } +        spell_sha_ancestral_awakening() : SpellScriptLoader("spell_sha_ancestral_awakening") { } -        class spell_sha_ancestral_awakening_proc_SpellScript : public SpellScript +        class spell_sha_ancestral_awakening_AuraScript : public AuraScript          { -            PrepareSpellScript(spell_sha_ancestral_awakening_proc_SpellScript); +            PrepareAuraScript(spell_sha_ancestral_awakening_AuraScript);              bool Validate(SpellInfo const* /*spellInfo*/) override              { -                if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_ANCESTRAL_AWAKENING_PROC)) +                if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_TIDAL_WAVES))                      return false;                  return true;              } -            void FilterTargets(std::list<WorldObject*>& targets) +            void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)              { -                if (targets.size() < 2) -                    return; - -                targets.sort(Trinity::HealthPctOrderPred()); - -                WorldObject* target = targets.front(); -                targets.clear(); -                targets.push_back(target); -            } +                PreventDefaultAction(); +                int32 heal = int32(CalculatePct(eventInfo.GetHealInfo()->GetHeal(), aurEff->GetAmount())); -            void HandleDummy(SpellEffIndex /*effIndex*/) -            { -                int32 damage = GetEffectValue(); -                if (GetHitUnit()) -                    GetCaster()->CastCustomSpell(GetHitUnit(), SPELL_SHAMAN_ANCESTRAL_AWAKENING_PROC, &damage, NULL, NULL, true); +                GetTarget()->CastCustomSpell(SPELL_SHAMAN_ANCESTRAL_AWAKENING, SPELLVALUE_BASE_POINT0, heal, (Unit*)NULL, true, NULL, aurEff);              }              void Register() override              { -                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); +                OnEffectProc += AuraEffectProcFn(spell_sha_ancestral_awakening_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);              }          }; -        SpellScript* GetSpellScript() const override +        AuraScript* GetAuraScript() const override          { -            return new spell_sha_ancestral_awakening_proc_SpellScript(); +            return new spell_sha_ancestral_awakening_AuraScript();          }  }; -// 51474 - Astral Shift -class spell_sha_astral_shift : public SpellScriptLoader +// 52759 - Ancestral Awakening +/// Updated 4.3.4 +class spell_sha_ancestral_awakening_proc : public SpellScriptLoader  {      public: -        spell_sha_astral_shift() : SpellScriptLoader("spell_sha_astral_shift") { } +        spell_sha_ancestral_awakening_proc() : SpellScriptLoader("spell_sha_ancestral_awakening_proc") { } -        class spell_sha_astral_shift_AuraScript : public AuraScript +        class spell_sha_ancestral_awakening_proc_SpellScript : public SpellScript          { -            PrepareAuraScript(spell_sha_astral_shift_AuraScript); - -            uint32 absorbPct; +            PrepareSpellScript(spell_sha_ancestral_awakening_proc_SpellScript); -            bool Load() override +            bool Validate(SpellInfo const* /*spellInfo*/) override              { -                absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); +                if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_ANCESTRAL_AWAKENING_PROC)) +                    return false;                  return true;              } -            void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) +            void FilterTargets(std::list<WorldObject*>& targets)              { -                // Set absorbtion amount to unlimited -                amount = -1; +                if (targets.size() < 2) +                    return; + +                targets.sort(Trinity::HealthPctOrderPred()); + +                WorldObject* target = targets.front(); +                targets.clear(); +                targets.push_back(target);              } -            void Absorb(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount) +            void HandleDummy(SpellEffIndex /*effIndex*/)              { -                // 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); +                GetCaster()->CastCustomSpell(SPELL_SHAMAN_ANCESTRAL_AWAKENING_PROC, SPELLVALUE_BASE_POINT0, GetEffectValue(), GetHitUnit(), true);              }              void Register() override              { -                DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_sha_astral_shift_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); -                OnEffectAbsorb += AuraEffectAbsorbFn(spell_sha_astral_shift_AuraScript::Absorb, EFFECT_0); +                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);              }          }; -        AuraScript* GetAuraScript() const override +        SpellScript* GetSpellScript() const override          { -            return new spell_sha_astral_shift_AuraScript(); +            return new spell_sha_ancestral_awakening_proc_SpellScript();          }  };  // 2825 - Bloodlust +/// Updated 4.3.4  class spell_sha_bloodlust : public SpellScriptLoader  {      public: @@ -168,7 +173,9 @@ class spell_sha_bloodlust : public SpellScriptLoader              bool Validate(SpellInfo const* /*spellInfo*/) override              { -                if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_SATED)) +                if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_SATED) +                    || !sSpellMgr->GetSpellInfo(SPELL_HUNTER_INSANITY) +                    || !sSpellMgr->GetSpellInfo(SPELL_MAGE_TEMPORAL_DISPLACEMENT))                      return false;                  return true;              } @@ -176,6 +183,8 @@ class spell_sha_bloodlust : public SpellScriptLoader              void RemoveInvalidTargets(std::list<WorldObject*>& targets)              {                  targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_SHAMAN_SATED)); +                targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_HUNTER_INSANITY)); +                targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_MAGE_TEMPORAL_DISPLACEMENT));              }              void ApplyDebuff() @@ -199,7 +208,8 @@ class spell_sha_bloodlust : public SpellScriptLoader          }  }; -// -1064 - Chain Heal +// 1064 - Chain Heal +/// Updated 4.3.4  class spell_sha_chain_heal : public SpellScriptLoader  {      public: @@ -213,6 +223,7 @@ class spell_sha_chain_heal : public SpellScriptLoader              {                  firstHeal = true;                  riptide = false; +                amount = 0;                  return true;              } @@ -224,6 +235,7 @@ class spell_sha_chain_heal : public SpellScriptLoader                      if (AuraEffect* aurEff = GetHitUnit()->GetAuraEffect(SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_SHAMAN, 0, 0, 0x10, GetCaster()->GetGUID()))                      {                          riptide = true; +                        amount = aurEff->GetSpellInfo()->Effects[EFFECT_2].CalcValue();                          // Consume it                          GetHitUnit()->RemoveAura(aurEff->GetBase());                      } @@ -231,7 +243,10 @@ class spell_sha_chain_heal : public SpellScriptLoader                  }                  // Riptide increases the Chain Heal effect by 25%                  if (riptide) -                    SetHitHeal(GetHitHeal() * 1.25f); +                { +                    uint32 bonus = CalculatePct(GetHitHeal(), amount); +                    SetHitHeal(GetHitHeal() + bonus); +                }              }              void Register() override @@ -241,6 +256,7 @@ class spell_sha_chain_heal : public SpellScriptLoader              bool firstHeal;              bool riptide; +            uint32 amount;          };          SpellScript* GetSpellScript() const override @@ -249,43 +265,7 @@ class spell_sha_chain_heal : public SpellScriptLoader          }  }; -// 8171 - Cleansing Totem (Pulse) -class spell_sha_cleansing_totem_pulse : public SpellScriptLoader -{ -    public: -        spell_sha_cleansing_totem_pulse() : SpellScriptLoader("spell_sha_cleansing_totem_pulse") { } - -        class spell_sha_cleansing_totem_pulse_SpellScript : public SpellScript -        { -            PrepareSpellScript(spell_sha_cleansing_totem_pulse_SpellScript); - -            bool Validate(SpellInfo const* /*spellInfo*/) override -            { -                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, NULL, NULL, GetOriginalCaster()->GetGUID()); -            } - -            void Register() override -            { -                OnEffectHitTarget += SpellEffectFn(spell_sha_cleansing_totem_pulse_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); -            } -        }; - -        SpellScript* GetSpellScript() const override -        { -            return new spell_sha_cleansing_totem_pulse_SpellScript(); -        } -}; - -// -974 - Earth Shield +// 974 - Earth Shield  class spell_sha_earth_shield : public SpellScriptLoader  {      public: @@ -297,9 +277,8 @@ class spell_sha_earth_shield : public SpellScriptLoader              bool Validate(SpellInfo const* /*spellInfo*/) override              { -                if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_EARTH_SHIELD_HEAL)) -                    return false; -                if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_GLYPH_OF_EARTH_SHIELD)) +                if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_EARTH_SHIELD_HEAL) || +                    !sSpellMgr->GetSpellInfo(SPELL_SHAMAN_GLYPH_OF_EARTH_SHIELD))                      return false;                  return true;              } @@ -360,7 +339,8 @@ class spell_sha_earth_shield : public SpellScriptLoader          }  }; -// 6474 - Earthbind Totem - Fix Talent: Earthen Power +// 6474 - Earthbind Totem - Fix Talent:Earthen Power, Earth's Grasp +/// Updated 4.3.4  class spell_sha_earthbind_totem : public SpellScriptLoader  {      public: @@ -372,7 +352,8 @@ class spell_sha_earthbind_totem : public SpellScriptLoader              bool Validate(SpellInfo const* /*spellInfo*/) override              { -                if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_TOTEM_EARTHBIND_TOTEM) || !sSpellMgr->GetSpellInfo(SPELL_SHAMAN_TOTEM_EARTHEN_POWER)) +                if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_TOTEM_EARTHBIND_TOTEM) || +                    !sSpellMgr->GetSpellInfo(SPELL_SHAMAN_TOTEM_EARTHEN_POWER))                      return false;                  return true;              } @@ -394,7 +375,7 @@ class spell_sha_earthbind_totem : public SpellScriptLoader                  Player* owner = GetCaster()->GetCharmerOrOwnerPlayerOrPlayerItself();                  if (!owner)                      return; -                // Storm, Earth and Fire +                // Earth's Grasp                  if (AuraEffect* aurEff = owner->GetAuraEffectOfRankedSpell(SPELL_SHAMAN_STORM_EARTH_AND_FIRE, EFFECT_1))                  {                      if (roll_chance_i(aurEff->GetAmount())) @@ -459,54 +440,68 @@ class spell_sha_earthen_power : public SpellScriptLoader          }  }; -// -1535 - Fire Nova -class spell_sha_fire_nova : public SpellScriptLoader +// 86185 Feedback +class spell_sha_feedback : public SpellScriptLoader  {      public: -        spell_sha_fire_nova() : SpellScriptLoader("spell_sha_fire_nova") { } +        spell_sha_feedback() : SpellScriptLoader("spell_sha_feedback") { } -        class spell_sha_fire_nova_SpellScript : public SpellScript +        class spell_sha_feedback_AuraScript : public AuraScript          { -            PrepareSpellScript(spell_sha_fire_nova_SpellScript); +            PrepareAuraScript(spell_sha_feedback_AuraScript); -            bool Validate(SpellInfo const* spellInfo) override +            bool Validate(SpellInfo const* /*spellInfo*/) override              { -                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)) +                if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_ELEMENTAL_MASTERY))                      return false;                  return true;              } -            SpellCastResult CheckFireTotem() +            void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)              { -                // fire totem -                if (!GetCaster()->m_SummonSlot[1]) -                { -                    SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_MUST_HAVE_FIRE_TOTEM); -                    return SPELL_FAILED_CUSTOM_ERROR; -                } +                PreventDefaultAction(); // will prevent default effect execution +                if (Player* target = GetTarget()->ToPlayer()) +                    target->ModifySpellCooldown(SPELL_SHAMAN_ELEMENTAL_MASTERY, aurEff->GetBaseAmount()); +            } -                return SPELL_CAST_OK; +            void Register() override +            { +                OnEffectProc += AuraEffectProcFn(spell_sha_feedback_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);              } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_sha_feedback_AuraScript(); +        } +}; + +// 1535 Fire Nova +/// Updated 4.3.4 +class spell_sha_fire_nova : public SpellScriptLoader +{ +    public: +        spell_sha_fire_nova() : SpellScriptLoader("spell_sha_fire_nova") { } + +        class spell_sha_fire_nova_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_sha_fire_nova_SpellScript);              void HandleDummy(SpellEffIndex /*effIndex*/)              {                  Unit* caster = GetCaster(); -                if (Creature* totem = caster->GetMap()->GetCreature(caster->m_SummonSlot[1])) +                if (Unit* target = GetHitUnit())                  { -                    uint8 rank = GetSpellInfo()->GetRank(); -                    if (totem->IsTotem()) -                        caster->CastSpell(totem, sSpellMgr->GetSpellWithRank(SPELL_SHAMAN_FIRE_NOVA_TRIGGERED_R1, rank), true); +                    if (target->HasAura(SPELL_SHAMAN_FLAME_SHOCK)) +                    { +                        caster->CastSpell(target, SPELL_SHAMAN_FIRE_NOVA_TRIGGERED_R1, true); +                        target->RemoveAurasDueToSpell(SPELL_SHAMAN_FLAME_SHOCK); +                    }                  }              }              void Register() override              { -                OnCheckCast += SpellCheckCastFn(spell_sha_fire_nova_SpellScript::CheckFireTotem);                  OnEffectHitTarget += SpellEffectFn(spell_sha_fire_nova_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);              }          }; @@ -517,7 +512,8 @@ class spell_sha_fire_nova : public SpellScriptLoader          }  }; -// -8050 - Flame Shock +// 8050 -Flame Shock +/// Updated 4.3.4  class spell_sha_flame_shock : public SpellScriptLoader  {      public: @@ -529,9 +525,8 @@ class spell_sha_flame_shock : public SpellScriptLoader              bool Validate(SpellInfo const* /*spell*/) override              { -                if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_LAVA_FLOWS_R1)) -                    return false; -                if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_LAVA_FLOWS_TRIGGERED_R1)) +                if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_LAVA_FLOWS_R1) || +                    !sSpellMgr->GetSpellInfo(SPELL_SHAMAN_LAVA_FLOWS_TRIGGERED_R1))                      return false;                  return true;              } @@ -539,6 +534,7 @@ class spell_sha_flame_shock : public SpellScriptLoader              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))                      { @@ -546,9 +542,10 @@ class spell_sha_flame_shock : public SpellScriptLoader                              if (!aurEff->GetSpellInfo()->IsRankOf(firstRankSpellInfo))                                  return; -                        uint8 rank = aurEff->GetSpellInfo()->GetRank(); -                        caster->CastSpell(caster, sSpellMgr->GetSpellWithRank(SPELL_SHAMAN_LAVA_FLOWS_TRIGGERED_R1, rank), true); +                        int32 basepoints = aurEff->GetAmount(); +                        caster->CastCustomSpell(caster, SPELL_SHAMAN_LAVA_FLOWS_TRIGGERED_R1, &basepoints, NULL, NULL, true);                      } +                }              }              void Register() override @@ -563,7 +560,90 @@ class spell_sha_flame_shock : public SpellScriptLoader          }  }; -// 52041, 52046, 52047, 52048, 52049, 52050, 58759, 58760, 58761 - Healing Stream Totem +// 77794 - Focused Insight +class spell_sha_focused_insight : public SpellScriptLoader +{ +    public: +        spell_sha_focused_insight() : SpellScriptLoader("spell_sha_focused_insight") { } + +        class spell_sha_focused_insight_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_sha_focused_insight_AuraScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_FOCUSED_INSIGHT)) +                    return false; +                return true; +            } + +            void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) +            { +                PreventDefaultAction(); +                int32 basePoints0 = aurEff->GetAmount(); +                int32 basePoints1 = aurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue(); + +                GetTarget()->CastCustomSpell(GetTarget(), SPELL_SHAMAN_FOCUSED_INSIGHT, &basePoints0, &basePoints1, &basePoints1, true, NULL, aurEff); +            } + +            void Register() override +            { +                OnEffectProc += AuraEffectProcFn(spell_sha_focused_insight_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_sha_focused_insight_AuraScript(); +        } +}; + +// 55440 - Glyph of Healing Wave +class spell_sha_glyph_of_healing_wave : public SpellScriptLoader +{ +    public: +        spell_sha_glyph_of_healing_wave() : SpellScriptLoader("spell_sha_glyph_of_healing_wave") { } + +        class spell_sha_glyph_of_healing_wave_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_sha_glyph_of_healing_wave_AuraScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_GLYPH_OF_HEALING_WAVE)) +                    return false; +                return true; +            } + +            bool CheckProc(ProcEventInfo& eventInfo) +            { +                // Not proc from self heals +                return GetTarget() != eventInfo.GetProcTarget(); +            } + +            void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) +            { +                PreventDefaultAction(); +                int32 heal = CalculatePct(int32(eventInfo.GetHealInfo()->GetHeal()), aurEff->GetAmount()); + +                GetTarget()->CastCustomSpell(SPELL_SHAMAN_GLYPH_OF_HEALING_WAVE, SPELLVALUE_BASE_POINT0, heal, (Unit*)NULL, true, NULL, aurEff); +            } + +            void Register() override +            { +                DoCheckProc += AuraCheckProcFn(spell_sha_glyph_of_healing_wave_AuraScript::CheckProc); +                OnEffectProc += AuraEffectProcFn(spell_sha_glyph_of_healing_wave_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_sha_glyph_of_healing_wave_AuraScript(); +        } +}; + +// 52041 - Healing Stream Totem +/// Updated 4.3.4  class spell_sha_healing_stream_totem : public SpellScriptLoader  {      public: @@ -575,12 +655,10 @@ class spell_sha_healing_stream_totem : public SpellScriptLoader              bool Validate(SpellInfo const* /*spellInfo*/) override              { -                if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_GLYPH_OF_HEALING_STREAM_TOTEM) || !sSpellMgr->GetSpellInfo(SPELL_SHAMAN_TOTEM_HEALING_STREAM_HEAL)) -                    return false; -                return true; +                return sSpellMgr->GetSpellInfo(SPELL_SHAMAN_TOTEM_HEALING_STREAM_HEAL) != nullptr;              } -            void HandleDummy(SpellEffIndex /*effIndex*/) +            void HandleDummy(SpellEffIndex /* effIndex */)              {                  int32 damage = GetEffectValue();                  SpellInfo const* triggeringSpell = GetTriggeringSpell(); @@ -592,14 +670,10 @@ class spell_sha_healing_stream_totem : public SpellScriptLoader                              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)) +                            // Soothing Rains +                            if (AuraEffect* dummy = owner->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, SHAMAN_ICON_ID_SOOTHING_RAIN, EFFECT_0))                                  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()); @@ -619,6 +693,7 @@ class spell_sha_healing_stream_totem : public SpellScriptLoader  };  // 32182 - Heroism +/// Updated 4.3.4  class spell_sha_heroism : public SpellScriptLoader  {      public: @@ -630,7 +705,9 @@ class spell_sha_heroism : public SpellScriptLoader              bool Validate(SpellInfo const* /*spellInfo*/) override              { -                if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_EXHAUSTION)) +                if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_EXHAUSTION) +                    || !sSpellMgr->GetSpellInfo(SPELL_HUNTER_INSANITY) +                    || !sSpellMgr->GetSpellInfo(SPELL_MAGE_TEMPORAL_DISPLACEMENT))                      return false;                  return true;              } @@ -638,6 +715,8 @@ class spell_sha_heroism : public SpellScriptLoader              void RemoveInvalidTargets(std::list<WorldObject*>& targets)              {                  targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_SHAMAN_EXHAUSTION)); +                targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_HUNTER_INSANITY)); +                targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_MAGE_TEMPORAL_DISPLACEMENT));              }              void ApplyDebuff() @@ -678,7 +757,7 @@ class spell_sha_item_lightning_shield : public SpellScriptLoader                  return true;              } -            void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) +            void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)              {                  PreventDefaultAction();                  GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_SHAMAN_ITEM_LIGHTNING_SHIELD, true, NULL, aurEff); @@ -686,7 +765,7 @@ class spell_sha_item_lightning_shield : public SpellScriptLoader              void Register() override              { -                OnEffectProc += AuraEffectProcFn(spell_sha_item_lightning_shield_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); +                OnEffectProc += AuraEffectProcFn(spell_sha_item_lightning_shield_AuraScript::OnProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);              }          }; @@ -713,7 +792,7 @@ class spell_sha_item_lightning_shield_trigger : public SpellScriptLoader                  return true;              } -            void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) +            void OnProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)              {                  PreventDefaultAction();                  GetTarget()->CastSpell(GetTarget(), SPELL_SHAMAN_ITEM_LIGHTNING_SHIELD_DAMAGE, true, NULL, aurEff); @@ -721,7 +800,7 @@ class spell_sha_item_lightning_shield_trigger : public SpellScriptLoader              void Register() override              { -                OnEffectProc += AuraEffectProcFn(spell_sha_item_lightning_shield_trigger_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); +                OnEffectProc += AuraEffectProcFn(spell_sha_item_lightning_shield_trigger_AuraScript::OnProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);              }          }; @@ -748,24 +827,18 @@ class spell_sha_item_mana_surge : public SpellScriptLoader                  return true;              } -            bool CheckProc(ProcEventInfo& eventInfo) -            { -                return eventInfo.GetDamageInfo()->GetSpellInfo() != nullptr; -            } - -            void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) +            void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)              {                  PreventDefaultAction(); -                int32 mana = eventInfo.GetDamageInfo()->GetSpellInfo()->CalcPowerCost(GetTarget(), eventInfo.GetSchoolMask()); -                int32 damage = CalculatePct(mana, 35); +                int32 mana = eventInfo.GetDamageInfo()->GetSpellInfo()->CalcPowerCost(GetTarget(), SpellSchoolMask(eventInfo.GetDamageInfo()->GetSchoolMask())); +                mana = int32(CalculatePct(mana, 35)); -                GetTarget()->CastCustomSpell(SPELL_SHAMAN_ITEM_MANA_SURGE, SPELLVALUE_BASE_POINT0, damage, GetTarget(), true, NULL, aurEff); +                GetTarget()->CastCustomSpell(SPELL_SHAMAN_ITEM_MANA_SURGE, SPELLVALUE_BASE_POINT0, mana, GetTarget(), true, NULL, aurEff);              }              void Register() override              { -                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); +                OnEffectProc += AuraEffectProcFn(spell_sha_item_mana_surge_AuraScript::OnProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);              }          }; @@ -812,6 +885,7 @@ class spell_sha_item_t10_elemental_2p_bonus : public SpellScriptLoader  };  // 60103 - Lava Lash +/// Updated 4.3.4  class spell_sha_lava_lash : public SpellScriptLoader  {      public: @@ -855,139 +929,240 @@ class spell_sha_lava_lash : public SpellScriptLoader          }  }; -// 52031, 52033, 52034, 52035, 52036, 58778, 58779, 58780 - Mana Spring Totem -class spell_sha_mana_spring_totem : public SpellScriptLoader +class spell_sha_lava_surge : public SpellScriptLoader +{ +    public: +        spell_sha_lava_surge() : SpellScriptLoader("spell_sha_lava_surge") { } + +        class spell_sha_lava_surge_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_sha_lava_surge_AuraScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_LAVA_SURGE)) +                    return false; +                return true; +            } + +            void HandleEffectProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) +            { +                PreventDefaultAction(); +                GetTarget()->CastSpell(GetTarget(), SPELL_SHAMAN_LAVA_SURGE, true); +            } + +            void Register() override +            { +                OnEffectProc += AuraEffectProcFn(spell_sha_lava_surge_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_sha_lava_surge_AuraScript(); +        } +}; + +class spell_sha_lava_surge_proc : public SpellScriptLoader  {      public: -        spell_sha_mana_spring_totem() : SpellScriptLoader("spell_sha_mana_spring_totem") { } +        spell_sha_lava_surge_proc() : SpellScriptLoader("spell_sha_lava_surge_proc") { } -        class spell_sha_mana_spring_totem_SpellScript : public SpellScript +        class spell_sha_lava_surge_proc_SpellScript : public SpellScript          { -            PrepareSpellScript(spell_sha_mana_spring_totem_SpellScript); +            PrepareSpellScript(spell_sha_lava_surge_proc_SpellScript);              bool Validate(SpellInfo const* /*spellInfo*/) override              { -                if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_MANA_SPRING_TOTEM_ENERGIZE)) +                if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_LAVA_BURST))                      return false;                  return true;              } +            bool Load() override +            { +                return GetCaster()->GetTypeId() == TYPEID_PLAYER; +            } +              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, nullptr, nullptr, true, nullptr, nullptr, GetOriginalCaster()->GetGUID()); +                GetCaster()->ToPlayer()->RemoveSpellCooldown(SPELL_SHAMAN_LAVA_BURST, true);              }              void Register() override              { -                OnEffectHitTarget += SpellEffectFn(spell_sha_mana_spring_totem_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); +                OnEffectHitTarget += SpellEffectFn(spell_sha_lava_surge_proc_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);              }          };          SpellScript* GetSpellScript() const override          { -            return new spell_sha_mana_spring_totem_SpellScript(); +            return new spell_sha_lava_surge_proc_SpellScript();          }  }; -// 39610 - Mana Tide Totem +// 16191 - Mana Tide +/// Updated 4.3.4  class spell_sha_mana_tide_totem : public SpellScriptLoader  {      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_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_sha_mana_tide_totem_AuraScript); + +            void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) +            { +                ///@TODO: Exclude the "short term" buffs from the stat value +                if (Unit* caster = GetCaster()) +                    if (Unit* owner = caster->GetOwner()) +                        amount = CalculatePct(owner->GetStat(STAT_SPIRIT), aurEff->GetAmount()); +            } + +            void Register() override +            { +                DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_sha_mana_tide_totem_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_STAT); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_sha_mana_tide_totem_AuraScript(); +        } +}; + +// -30881 - Nature's Guardian +class spell_sha_nature_guardian : public SpellScriptLoader +{ +    public: +        spell_sha_nature_guardian() : SpellScriptLoader("spell_sha_nature_guardian") { } + +        class spell_sha_nature_guardian_AuraScript : public AuraScript          { -            PrepareSpellScript(spell_sha_mana_tide_totem_SpellScript); +            PrepareAuraScript(spell_sha_nature_guardian_AuraScript);              bool Validate(SpellInfo const* /*spellInfo*/) override              { -                if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_GLYPH_OF_MANA_TIDE) || !sSpellMgr->GetSpellInfo(SPELL_SHAMAN_MANA_TIDE_TOTEM)) +                if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_NATURE_GUARDIAN))                      return false;                  return true;              } -            void HandleDummy(SpellEffIndex /*effIndex*/) +            bool CheckProc(ProcEventInfo& eventInfo)              { -                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, NULL, NULL, true, NULL, NULL, GetOriginalCaster()->GetGUID()); -                        } -                    } +                //! HACK due to currenct proc system implementation +                if (Player* player = GetTarget()->ToPlayer()) +                    if (player->HasSpellCooldown(GetSpellInfo()->Id)) +                        return false; + +                return GetTarget()->HealthBelowPctDamaged(30, eventInfo.GetDamageInfo()->GetDamage()); +            } + +            void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) +            { +                PreventDefaultAction(); +                int32 basePoints0 = GetTarget()->CountPctFromMaxHealth(aurEff->GetAmount()); + +                GetTarget()->CastCustomSpell(GetTarget(), SPELL_SHAMAN_NATURE_GUARDIAN, &basePoints0, NULL, NULL, true); + +                if (eventInfo.GetProcTarget() && eventInfo.GetProcTarget()->IsAlive()) +                    eventInfo.GetProcTarget()->getThreatManager().modifyThreatPercent(GetTarget(), -10); + +                if (Player* player = GetTarget()->ToPlayer()) +                    player->AddSpellCooldown(GetSpellInfo()->Id, 0, time(NULL) + aurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue());              }              void Register() override              { -                OnEffectHitTarget += SpellEffectFn(spell_sha_mana_tide_totem_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); +                DoCheckProc += AuraCheckProcFn(spell_sha_nature_guardian_AuraScript::CheckProc); +                OnEffectProc += AuraEffectProcFn(spell_sha_nature_guardian_AuraScript::OnProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);              }          }; -        SpellScript* GetSpellScript() const override +        AuraScript* GetAuraScript() const override          { -            return new spell_sha_mana_tide_totem_SpellScript(); +            return new spell_sha_nature_guardian_AuraScript();          }  }; -// 6495 - Sentry Totem -class spell_sha_sentry_totem : public SpellScriptLoader +// 88756 - Rolling Thunder +class spell_sha_rolling_thunder : public SpellScriptLoader  {      public: -        spell_sha_sentry_totem() : SpellScriptLoader("spell_sha_sentry_totem") { } +        spell_sha_rolling_thunder() : SpellScriptLoader("spell_sha_rolling_thunder") { } -        class spell_sha_sentry_totem_AuraScript : public AuraScript +        class spell_sha_rolling_thunder_AuraScript : public AuraScript          { -            PrepareAuraScript(spell_sha_sentry_totem_AuraScript); +            PrepareAuraScript(spell_sha_rolling_thunder_AuraScript); -            bool Validate(SpellInfo const* /*spell*/) override +            bool Validate(SpellInfo const* /*spellInfo*/) override              { -                if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_BIND_SIGHT)) +                if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_LIGHTNING_SHIELD))                      return false;                  return true;              } -            void AfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) +            void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)              { -                if (Unit* caster = GetCaster()) -                    if (Creature* totem = caster->GetMap()->GetCreature(caster->m_SummonSlot[4])) -                        if (totem->IsTotem()) -                            caster->CastSpell(totem, SPELL_SHAMAN_BIND_SIGHT, true); +                if (Aura* aura = GetTarget()->GetAura(SPELL_SHAMAN_LIGHTNING_SHIELD)) +                { +                    aura->SetCharges(std::min(aura->GetCharges() + 1, aurEff->GetAmount())); +                    aura->RefreshDuration(); +                }              } -            void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) +            void Register() override              { -                if (Unit* caster = GetCaster()) -                    if (caster->GetTypeId() == TYPEID_PLAYER) -                        caster->ToPlayer()->StopCastingBindSight(); +                OnEffectProc += AuraEffectProcFn(spell_sha_rolling_thunder_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_sha_rolling_thunder_AuraScript(); +        } +}; + +// 82984 - Telluric Currents +class spell_sha_telluric_currents : public SpellScriptLoader +{ +    public: +        spell_sha_telluric_currents() : SpellScriptLoader("spell_sha_telluric_currents") { } + +        class spell_sha_telluric_currents_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_sha_telluric_currents_AuraScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_TELLURIC_CURRENTS)) +                    return false; +                return true; +            } + +            void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) +            { +                PreventDefaultAction(); +                int32 basePoints0 = CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount()); + +                GetTarget()->CastCustomSpell(GetTarget(), SPELL_SHAMAN_TELLURIC_CURRENTS, &basePoints0, NULL, NULL, true);              }              void Register() override              { -                 AfterEffectApply += AuraEffectApplyFn(spell_sha_sentry_totem_AuraScript::AfterApply, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); -                 AfterEffectRemove += AuraEffectRemoveFn(spell_sha_sentry_totem_AuraScript::AfterRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); +                OnEffectProc += AuraEffectProcFn(spell_sha_telluric_currents_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);              }          };          AuraScript* GetAuraScript() const override          { -            return new spell_sha_sentry_totem_AuraScript(); +            return new spell_sha_telluric_currents_AuraScript();          }  }; -// -51490 - Thunderstorm +// 51490 - Thunderstorm  class spell_sha_thunderstorm : public SpellScriptLoader  {      public: @@ -1016,18 +1191,58 @@ class spell_sha_thunderstorm : public SpellScriptLoader          }  }; +// 51562 - Tidal Waves +class spell_sha_tidal_waves : public SpellScriptLoader +{ +    public: +        spell_sha_tidal_waves() : SpellScriptLoader("spell_sha_tidal_waves") { } + +        class spell_sha_tidal_waves_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_sha_tidal_waves_AuraScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_TIDAL_WAVES)) +                    return false; +                return true; +            } + +            void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) +            { +                PreventDefaultAction(); +                int32 basePoints0 = -aurEff->GetAmount(); +                int32 basePoints1 = aurEff->GetAmount(); + +                GetTarget()->CastCustomSpell(GetTarget(), SPELL_SHAMAN_TIDAL_WAVES, &basePoints0, &basePoints1, NULL, true, NULL, aurEff); +            } + +            void Register() override +            { +                OnEffectProc += AuraEffectProcFn(spell_sha_tidal_waves_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_sha_tidal_waves_AuraScript(); +        } +}; +  void AddSC_shaman_spell_scripts()  { +    new spell_sha_ancestral_awakening();      new spell_sha_ancestral_awakening_proc(); -    new spell_sha_astral_shift();      new spell_sha_bloodlust();      new spell_sha_chain_heal(); -    new spell_sha_cleansing_totem_pulse();      new spell_sha_earth_shield();      new spell_sha_earthbind_totem();      new spell_sha_earthen_power(); +    new spell_sha_feedback();      new spell_sha_fire_nova();      new spell_sha_flame_shock(); +    new spell_sha_focused_insight(); +    new spell_sha_glyph_of_healing_wave();      new spell_sha_healing_stream_totem();      new spell_sha_heroism();      new spell_sha_item_lightning_shield(); @@ -1035,8 +1250,12 @@ void AddSC_shaman_spell_scripts()      new spell_sha_item_mana_surge();      new spell_sha_item_t10_elemental_2p_bonus();      new spell_sha_lava_lash(); -    new spell_sha_mana_spring_totem(); +    new spell_sha_lava_surge(); +    new spell_sha_lava_surge_proc();      new spell_sha_mana_tide_totem(); -    new spell_sha_sentry_totem(); +    new spell_sha_nature_guardian(); +    new spell_sha_rolling_thunder(); +    new spell_sha_telluric_currents();      new spell_sha_thunderstorm(); +    new spell_sha_tidal_waves();  } diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp index 4571798506e..4c6e2b942da 100644 --- a/src/server/scripts/Spells/spell_warlock.cpp +++ b/src/server/scripts/Spells/spell_warlock.cpp @@ -25,33 +25,55 @@  #include "ScriptMgr.h"  #include "SpellScript.h"  #include "SpellAuraEffects.h" +#include "SpellAuras.h"  enum WarlockSpells  { +    SPELL_WARLOCK_AFTERMATH_STUN                    = 85387, +    SPELL_WARLOCK_BANE_OF_DOOM_EFFECT               = 18662, +    SPELL_WARLOCK_CREATE_HEALTHSTONE                = 34130,      SPELL_WARLOCK_CURSE_OF_DOOM_EFFECT              = 18662, +    SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST         = 62388,      SPELL_WARLOCK_DEMONIC_CIRCLE_SUMMON             = 48018,      SPELL_WARLOCK_DEMONIC_CIRCLE_TELEPORT           = 48020, -    SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST         = 62388, -    SPELL_WARLOCK_DEMONIC_EMPOWERMENT_SUCCUBUS      = 54435, -    SPELL_WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER    = 54443,      SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELGUARD      = 54508,      SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELHUNTER     = 54509,      SPELL_WARLOCK_DEMONIC_EMPOWERMENT_IMP           = 54444, +    SPELL_WARLOCK_DEMONIC_EMPOWERMENT_SUCCUBUS      = 54435, +    SPELL_WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER    = 54443, +    SPELL_WARLOCK_DEMON_SOUL_IMP                    = 79459, +    SPELL_WARLOCK_DEMON_SOUL_FELHUNTER              = 79460, +    SPELL_WARLOCK_DEMON_SOUL_FELGUARD               = 79452, +    SPELL_WARLOCK_DEMON_SOUL_SUCCUBUS               = 79453, +    SPELL_WARLOCK_DEMON_SOUL_VOIDWALKER             = 79454,      SPELL_WARLOCK_FEL_SYNERGY_HEAL                  = 54181,      SPELL_WARLOCK_GLYPH_OF_SHADOWFLAME              = 63311,      SPELL_WARLOCK_GLYPH_OF_SIPHON_LIFE              = 63106, +    SPELL_WARLOCK_GLYPH_OF_SOUL_SWAP                = 56226, +    SPELL_WARLOCK_GLYPH_OF_SUCCUBUS                 = 56250,      SPELL_WARLOCK_HAUNT                             = 48181,      SPELL_WARLOCK_HAUNT_HEAL                        = 48210, -    SPELL_WARLOCK_IMPROVED_HEALTHSTONE_R1           = 18692, -    SPELL_WARLOCK_IMPROVED_HEALTHSTONE_R2           = 18693, -    SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R1         = 18703, -    SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R2         = 18704, +    SPELL_WARLOCK_IMMOLATE                          = 348,      SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R1    = 60955,      SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R2    = 60956, +    SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R1         = 18703, +    SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R2         = 18704, +    SPELL_WARLOCK_IMPROVED_SOUL_FIRE_PCT            = 85383, +    SPELL_WARLOCK_IMPROVED_SOUL_FIRE_STATE          = 85385,      SPELL_WARLOCK_LIFE_TAP_ENERGIZE                 = 31818,      SPELL_WARLOCK_LIFE_TAP_ENERGIZE_2               = 32553, -    SPELL_WARLOCK_SOULSHATTER                       = 32835, +    SPELL_WARLOCK_NETHER_WARD                       = 91711, +    SPELL_WARLOCK_NETHER_TALENT                     = 91713, +    SPELL_WARLOCK_RAIN_OF_FIRE                      = 42223, +    SPELL_WARLOCK_SHADOW_TRANCE                     = 17941,      SPELL_WARLOCK_SIPHON_LIFE_HEAL                  = 63106, +    SPELL_WARLOCK_SHADOW_WARD                       = 6229, +    SPELL_WARLOCK_SOULSHATTER                       = 32835, +    SPELL_WARLOCK_SOUL_SWAP_CD_MARKER               = 94229, +    SPELL_WARLOCK_SOUL_SWAP_OVERRIDE                = 86211, +    SPELL_WARLOCK_SOUL_SWAP_MOD_COST                = 92794, +    SPELL_WARLOCK_SOUL_SWAP_DOT_MARKER              = 92795, +    SPELL_WARLOCK_UNSTABLE_AFFLICTION               = 30108,      SPELL_WARLOCK_UNSTABLE_AFFLICTION_DISPEL        = 31117  }; @@ -61,7 +83,53 @@ enum WarlockSpellIcons      WARLOCK_ICON_ID_MANA_FEED                       = 1982  }; -// -710 - Banish +enum MiscSpells +{ +    SPELL_GEN_REPLENISHMENT                         = 57669, +    SPELL_PRIEST_SHADOW_WORD_DEATH                  = 32409 +}; + +// -85113 - Aftermath +class spell_warl_aftermath : public SpellScriptLoader +{ +    public: +        spell_warl_aftermath() : SpellScriptLoader("spell_warl_aftermath") { } + +        class spell_warl_aftermath_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_warl_aftermath_AuraScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_AFTERMATH_STUN)) +                    return false; +                return true; +            } + +            void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) +            { +                if (eventInfo.GetDamageInfo()->GetSpellInfo()->Id == SPELL_WARLOCK_RAIN_OF_FIRE) +                { +                    PreventDefaultAction(); + +                    if (eventInfo.GetProcTarget() && roll_chance_i(aurEff->GetAmount())) +                        GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_WARLOCK_AFTERMATH_STUN, true, NULL, aurEff); +                } +            } + +            void Register() override +            { +                OnEffectProc += AuraEffectProcFn(spell_warl_aftermath_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_warl_aftermath_AuraScript(); +        } +}; + +// 710 - Banish  class spell_warl_banish : public SpellScriptLoader  {      public: @@ -79,6 +147,8 @@ class spell_warl_banish : public SpellScriptLoader              void HandleBanish()              { +                /// Casting Banish on a banished target will cancel the effect +                /// Check if the target already has Banish, if so, do nothing.                  if (Unit* target = GetHitUnit())                  {                      if (target->GetAuraEffect(SPELL_AURA_SCHOOL_IMMUNITY, SPELLFAMILY_WARLOCK, 0, 0x08000000, 0)) @@ -113,7 +183,42 @@ class spell_warl_banish : public SpellScriptLoader          }  }; -// 6201 - Create Healthstone (and ranks) +// 17962 - Conflagrate - Updated to 4.3.4 +class spell_warl_conflagrate : public SpellScriptLoader +{ +    public: +        spell_warl_conflagrate() : SpellScriptLoader("spell_warl_conflagrate") { } + +        class spell_warl_conflagrate_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_warl_conflagrate_SpellScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_IMMOLATE)) +                    return false; +                return true; +            } + +            void HandleHit(SpellEffIndex /*effIndex*/) +            { +                if (AuraEffect const* aurEff = GetHitUnit()->GetAuraEffect(SPELL_WARLOCK_IMMOLATE, EFFECT_2, GetCaster()->GetGUID())) +                    SetHitDamage(CalculatePct(aurEff->GetAmount(), GetSpellInfo()->Effects[EFFECT_1].CalcValue(GetCaster()))); +            } + +            void Register() override +            { +                OnEffectHitTarget += SpellEffectFn(spell_warl_conflagrate_SpellScript::HandleHit, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); +            } +        }; + +        SpellScript* GetSpellScript() const override +        { +            return new spell_warl_conflagrate_SpellScript(); +        } +}; + +// 6201 - Create Healthstone  class spell_warl_create_healthstone : public SpellScriptLoader  {      public: @@ -123,59 +228,26 @@ class spell_warl_create_healthstone : public SpellScriptLoader          {              PrepareSpellScript(spell_warl_create_healthstone_SpellScript); -            static uint32 const iTypes[8][3]; -              bool Validate(SpellInfo const* /*spellInfo*/) override              { -                if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_IMPROVED_HEALTHSTONE_R1) || !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_IMPROVED_HEALTHSTONE_R2)) +                if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_CREATE_HEALTHSTONE))                      return false;                  return true;              } -            SpellCastResult CheckCast() +            bool Load() override              { -                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, NULL); -                    if (msg != EQUIP_ERR_OK) -                        return SPELL_FAILED_TOO_MANY_OF_ITEM; -                } -                return SPELL_CAST_OK; +                return GetCaster()->GetTypeId() == TYPEID_PLAYER;              } -            void HandleScriptEffect(SpellEffIndex effIndex) +            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: -                                TC_LOG_ERROR("spells", "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]); -                } +                GetCaster()->CastSpell(GetCaster(), SPELL_WARLOCK_CREATE_HEALTHSTONE, true);              }              void Register() override              {                  OnEffectHitTarget += SpellEffectFn(spell_warl_create_healthstone_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); -                OnCheckCast += SpellCheckCastFn(spell_warl_create_healthstone_SpellScript::CheckCast);              }          }; @@ -185,22 +257,12 @@ class spell_warl_create_healthstone : public SpellScriptLoader          }  }; -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 -    { 5510, 19010, 19011},              // Greater Healthstone -    { 9421, 19012, 19013},              // Major Healthstone -    {22103, 22104, 22105},              // Master Healthstone -    {36889, 36890, 36891},              // Demonic Healthstone -    {36892, 36893, 36894}               // Fel Healthstone -}; - -// -603 - Curse of Doom -class spell_warl_curse_of_doom : public SpellScriptLoader +// 603 - Bane of Doom +/// Updated 4.3.4 +class spell_warl_bane_of_doom : public SpellScriptLoader  {      public: -        spell_warl_curse_of_doom() : SpellScriptLoader("spell_warl_curse_of_doom") { } +        spell_warl_bane_of_doom() : SpellScriptLoader("spell_warl_bane_of_doom") { }          class spell_warl_curse_of_doom_AuraScript : public AuraScript          { @@ -208,7 +270,7 @@ class spell_warl_curse_of_doom : public SpellScriptLoader              bool Validate(SpellInfo const* /*spellInfo*/) override              { -                if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_CURSE_OF_DOOM_EFFECT)) +                if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_BANE_OF_DOOM_EFFECT))                      return false;                  return true;              } @@ -228,7 +290,7 @@ class spell_warl_curse_of_doom : public SpellScriptLoader                      return;                  if (GetCaster()->ToPlayer()->isHonorOrXPTarget(GetTarget())) -                    GetCaster()->CastSpell(GetTarget(), SPELL_WARLOCK_CURSE_OF_DOOM_EFFECT, true, NULL, aurEff); +                    GetCaster()->CastSpell(GetTarget(), SPELL_WARLOCK_BANE_OF_DOOM_EFFECT, true, NULL, aurEff);              }              void Register() override @@ -244,6 +306,7 @@ class spell_warl_curse_of_doom : public SpellScriptLoader  };  // 48018 - Demonic Circle: Summon +/// Updated 4.3.4  class spell_warl_demonic_circle_summon : public SpellScriptLoader  {      public: @@ -296,6 +359,7 @@ class spell_warl_demonic_circle_summon : public SpellScriptLoader  };  // 48020 - Demonic Circle: Teleport +/// Updated 4.3.4  class spell_warl_demonic_circle_teleport : public SpellScriptLoader  {      public: @@ -329,7 +393,75 @@ class spell_warl_demonic_circle_teleport : public SpellScriptLoader          }  }; +// 77801 - Demon Soul - Updated to 4.3.4 +class spell_warl_demon_soul : public SpellScriptLoader +{ +    public: +        spell_warl_demon_soul() : SpellScriptLoader("spell_warl_demon_soul") { } + +        class spell_warl_demon_soul_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_warl_demon_soul_SpellScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMON_SOUL_IMP)) +                    return false; +                if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMON_SOUL_FELHUNTER)) +                    return false; +                if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMON_SOUL_FELGUARD)) +                    return false; +                if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMON_SOUL_SUCCUBUS)) +                    return false; +                if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMON_SOUL_VOIDWALKER)) +                    return false; +                return true; +            } + +            void OnHitTarget(SpellEffIndex /*effIndex*/) +            { +                Unit* caster = GetCaster(); +                if (Creature* targetCreature = GetHitCreature()) +                { +                    if (targetCreature->IsPet()) +                    { +                        CreatureTemplate const* ci = sObjectMgr->GetCreatureTemplate(targetCreature->GetEntry()); +                        switch (ci->family) +                        { +                            case CREATURE_FAMILY_SUCCUBUS: +                                caster->CastSpell(caster, SPELL_WARLOCK_DEMON_SOUL_SUCCUBUS); +                                break; +                            case CREATURE_FAMILY_VOIDWALKER: +                                caster->CastSpell(caster, SPELL_WARLOCK_DEMON_SOUL_VOIDWALKER); +                                break; +                            case CREATURE_FAMILY_FELGUARD: +                                caster->CastSpell(caster, SPELL_WARLOCK_DEMON_SOUL_FELGUARD); +                                break; +                            case CREATURE_FAMILY_FELHUNTER: +                                caster->CastSpell(caster, SPELL_WARLOCK_DEMON_SOUL_FELHUNTER); +                                break; +                            case CREATURE_FAMILY_IMP: +                                caster->CastSpell(caster, SPELL_WARLOCK_DEMON_SOUL_IMP); +                                break; +                        } +                    } +                } +            } + +            void Register() override +            { +                OnEffectHitTarget += SpellEffectFn(spell_warl_demon_soul_SpellScript::OnHitTarget, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); +            } +        }; + +        SpellScript* GetSpellScript() const override +        { +            return new spell_warl_demon_soul_SpellScript; +        } +}; +  // 47193 - Demonic Empowerment +/// Updated 4.3.4  class spell_warl_demonic_empowerment : public SpellScriptLoader  {      public: @@ -364,7 +496,6 @@ class spell_warl_demonic_empowerment : public SpellScriptLoader                                  SpellInfo const* spellInfo = sSpellMgr->EnsureSpellInfo(SPELL_WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER);                                  int32 hp = int32(targetCreature->CountPctFromMaxHealth(GetCaster()->CalculateSpellDamage(targetCreature, spellInfo, 0)));                                  targetCreature->CastCustomSpell(targetCreature, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER, &hp, NULL, NULL, true); -                                //unitTarget->CastSpell(unitTarget, 54441, true);                                  break;                              }                              case CREATURE_FAMILY_FELGUARD: @@ -394,6 +525,7 @@ class spell_warl_demonic_empowerment : public SpellScriptLoader  };  // 47422 - Everlasting Affliction +/// Updated 4.3.4  class spell_warl_everlasting_affliction : public SpellScriptLoader  {      public: @@ -408,13 +540,13 @@ class spell_warl_everlasting_affliction : public SpellScriptLoader                  Unit* caster = GetCaster();                  if (Unit* target = GetHitUnit())                      // Refresh corruption on target -                    if (AuraEffect* aur = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_WARLOCK, 0x2, 0, 0, caster->GetGUID())) +                    if (AuraEffect* aurEff = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_WARLOCK, 0x2, 0, 0, caster->GetGUID()))                      { -                        uint32 damage = std::max(aur->GetAmount(), 0); +                        uint32 damage = std::max(aurEff->GetAmount(), 0);                          sScriptMgr->ModifyPeriodicDamageAurasTick(target, caster, damage); -                        aur->SetDamage(caster->SpellDamageBonusDone(target, aur->GetSpellInfo(), damage, DOT) * aur->GetDonePct()); -                        aur->CalculatePeriodic(caster, false, false); -                        aur->GetBase()->RefreshDuration(true); +                        aurEff->SetDamage(caster->SpellDamageBonusDone(target, aurEff->GetSpellInfo(), damage, DOT) * aurEff->GetDonePct()); +                        aurEff->CalculatePeriodic(caster, false, false); +                        aurEff->GetBase()->RefreshDuration(true);                      }              } @@ -430,6 +562,43 @@ class spell_warl_everlasting_affliction : public SpellScriptLoader          }  }; +// 77799 - Fel Flame - Updated to 4.3.4 +class spell_warl_fel_flame : public SpellScriptLoader +{ +    public: +        spell_warl_fel_flame() : SpellScriptLoader("spell_warl_fel_flame") { } + +        class spell_warl_fel_flame_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_warl_fel_flame_SpellScript); + +            void OnHitTarget(SpellEffIndex /*effIndex*/) +            { +                Unit* caster = GetCaster(); +                Unit* target = GetHitUnit(); +                Aura* aura = target->GetAura(SPELL_WARLOCK_UNSTABLE_AFFLICTION, caster->GetGUID()); +                if (!aura) +                    aura = target->GetAura(SPELL_WARLOCK_IMMOLATE, caster->GetGUID()); + +                if (!aura) +                    return; + +                int32 newDuration = aura->GetDuration() + GetSpellInfo()->Effects[EFFECT_1].CalcValue() * 1000; +                aura->SetDuration(std::min(newDuration, aura->GetMaxDuration())); +            } + +            void Register() override +            { +                OnEffectHitTarget += SpellEffectFn(spell_warl_fel_flame_SpellScript::OnHitTarget, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); +            } +        }; + +        SpellScript* GetSpellScript() const override +        { +            return new spell_warl_fel_flame_SpellScript; +        } +}; +  // -47230 - Fel Synergy  class spell_warl_fel_synergy : public SpellScriptLoader  { @@ -490,7 +659,7 @@ class spell_warl_glyph_of_shadowflame : public SpellScriptLoader                  return true;              } -            void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) +            void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)              {                  PreventDefaultAction();                  GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_WARLOCK_GLYPH_OF_SHADOWFLAME, true, NULL, aurEff); @@ -498,7 +667,7 @@ class spell_warl_glyph_of_shadowflame : public SpellScriptLoader              void Register() override              { -                OnEffectProc += AuraEffectProcFn(spell_warl_glyph_of_shadowflame_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); +                OnEffectProc += AuraEffectProcFn(spell_warl_glyph_of_shadowflame_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY);              }          }; @@ -508,7 +677,8 @@ class spell_warl_glyph_of_shadowflame : public SpellScriptLoader          }  }; -// -48181 - Haunt +// 48181 - Haunt +/// Updated 4.3.4  class spell_warl_haunt : public SpellScriptLoader  {      public: @@ -568,7 +738,8 @@ class spell_warl_haunt : public SpellScriptLoader          }  }; -// -755 - Health Funnel +// 755 - Health Funnel +/// Updated 4.3.4  class spell_warl_health_funnel : public SpellScriptLoader  {      public: @@ -598,10 +769,28 @@ class spell_warl_health_funnel : public SpellScriptLoader                  target->RemoveAurasDueToSpell(SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R2);              } +            void OnPeriodic(AuraEffect const* aurEff) +            { +                Unit* caster = GetCaster(); +                if (!caster) +                    return; +                //! HACK for self damage, is not blizz :/ +                uint32 damage = caster->CountPctFromMaxHealth(aurEff->GetBaseAmount()); + +                if (Player* modOwner = caster->GetSpellModOwner()) +                    modOwner->ApplySpellMod(GetId(), SPELLMOD_COST, damage); + +                SpellNonMeleeDamage damageInfo(caster, caster, GetSpellInfo()->Id, GetSpellInfo()->SchoolMask); +                damageInfo.damage = damage; +                caster->SendSpellNonMeleeDamageLog(&damageInfo); +                caster->DealSpellDamage(&damageInfo, false); +            } +              void Register() override              { -                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); +                OnEffectApply += AuraEffectApplyFn(spell_warl_health_funnel_AuraScript::ApplyEffect, EFFECT_0, SPELL_AURA_OBS_MOD_HEALTH, AURA_EFFECT_HANDLE_REAL); +                OnEffectRemove += AuraEffectRemoveFn(spell_warl_health_funnel_AuraScript::RemoveEffect, EFFECT_0, SPELL_AURA_OBS_MOD_HEALTH, AURA_EFFECT_HANDLE_REAL); +                OnEffectPeriodic += AuraEffectPeriodicFn(spell_warl_health_funnel_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_OBS_MOD_HEALTH);              }          }; @@ -611,7 +800,73 @@ class spell_warl_health_funnel : public SpellScriptLoader          }  }; -// -1454 - Life Tap +// 6262 - Healthstone +class spell_warl_healthstone_heal : public SpellScriptLoader +{ +    public: +        spell_warl_healthstone_heal() : SpellScriptLoader("spell_warl_healthstone_heal") { } + +        class spell_warl_healthstone_heal_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_warl_healthstone_heal_SpellScript); + +            void HandleOnHit() +            { +                int32 heal = int32(CalculatePct(GetCaster()->GetCreateHealth(), GetHitHeal())); +                SetHitHeal(heal); +            } + +            void Register() override +            { +                OnHit += SpellHitFn(spell_warl_healthstone_heal_SpellScript::HandleOnHit); +            } +        }; + +        SpellScript* GetSpellScript() const override +        { +            return new spell_warl_healthstone_heal_SpellScript(); +        } +}; + +// -18119 - Improved Soul Fire +class spell_warl_improved_soul_fire : public SpellScriptLoader +{ +    public: +        spell_warl_improved_soul_fire() : SpellScriptLoader("spell_warl_improved_soul_fire") { } + +        class spell_warl_improved_soul_fire_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_warl_improved_soul_fire_AuraScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_IMPROVED_SOUL_FIRE_PCT) || +                    !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_IMPROVED_SOUL_FIRE_STATE)) +                    return false; +                return true; +            } + +            void OnProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) +            { +                PreventDefaultAction(); +                GetTarget()->CastCustomSpell(SPELL_WARLOCK_IMPROVED_SOUL_FIRE_PCT, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetTarget(), true, NULL, aurEff); +                GetTarget()->CastSpell(GetTarget(), SPELL_WARLOCK_IMPROVED_SOUL_FIRE_STATE, true, NULL, aurEff); +            } + +            void Register() override +            { +                OnEffectProc += AuraEffectProcFn(spell_warl_improved_soul_fire_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_warl_improved_soul_fire_AuraScript(); +        } +}; + +// 1454 - Life Tap +/// Updated 4.3.4  class spell_warl_life_tap : public SpellScriptLoader  {      public: @@ -626,9 +881,10 @@ class spell_warl_life_tap : public SpellScriptLoader                  return GetCaster()->GetTypeId() == TYPEID_PLAYER;              } -            bool Validate(SpellInfo const* /*spell*/) override +             bool Validate(SpellInfo const* /*spellInfo*/) override              { -                if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_LIFE_TAP_ENERGIZE) || !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_LIFE_TAP_ENERGIZE_2)) +                if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_LIFE_TAP_ENERGIZE) || +                    !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_LIFE_TAP_ENERGIZE_2))                      return false;                  return true;              } @@ -638,8 +894,8 @@ class spell_warl_life_tap : public SpellScriptLoader                  Player* caster = GetCaster()->ToPlayer();                  if (Unit* target = GetHitUnit())                  { -                    int32 damage = GetEffectValue(); -                    int32 mana = int32(damage + (caster->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS+SPELL_SCHOOL_SHADOW) * 0.5f)); +                    int32 damage = caster->CountPctFromMaxHealth(GetSpellInfo()->Effects[EFFECT_2].CalcValue()); +                    int32 mana = CalculatePct(damage, GetSpellInfo()->Effects[EFFECT_1].CalcValue());                      // Shouldn't Appear in Combat Log                      target->ModifyHealth(-damage); @@ -651,12 +907,9 @@ class spell_warl_life_tap : public SpellScriptLoader                      caster->CastCustomSpell(target, SPELL_WARLOCK_LIFE_TAP_ENERGIZE, &mana, NULL, NULL, 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 manaFeedVal = aurEff->GetAmount();                          ApplyPct(manaFeedVal, mana);                          caster->CastCustomSpell(caster, SPELL_WARLOCK_LIFE_TAP_ENERGIZE_2, &manaFeedVal, NULL, NULL, true, NULL);                      } @@ -665,7 +918,7 @@ class spell_warl_life_tap : public SpellScriptLoader              SpellCastResult CheckCast()              { -                if ((int32(GetCaster()->GetHealth()) > int32(GetSpellInfo()->Effects[EFFECT_0].CalcValue() + (6.3875 * GetSpellInfo()->BaseLevel)))) +                if (int32(GetCaster()->GetHealth()) > int32(GetCaster()->CountPctFromMaxHealth(GetSpellInfo()->Effects[EFFECT_2].CalcValue())))                      return SPELL_CAST_OK;                  return SPELL_FAILED_FIZZLE;              } @@ -683,35 +936,92 @@ class spell_warl_life_tap : public SpellScriptLoader          }  }; -// 18541 - Ritual of Doom Effect -class spell_warl_ritual_of_doom_effect : public SpellScriptLoader +// 687 - Demon Armor +// 28176 - Fel Armor +class spell_warl_nether_ward_overrride : public SpellScriptLoader  {      public: -        spell_warl_ritual_of_doom_effect() : SpellScriptLoader("spell_warl_ritual_of_doom_effect") { } +        spell_warl_nether_ward_overrride() : SpellScriptLoader("spell_warl_nether_ward_overrride") { } -        class spell_warl_ritual_of_doom_effect_SpellScript : public SpellScript +        class spell_warl_nether_ward_overrride_AuraScript : public AuraScript          { -            PrepareSpellScript(spell_warl_ritual_of_doom_effect_SpellScript); +            PrepareAuraScript(spell_warl_nether_ward_overrride_AuraScript); -            void HandleDummy(SpellEffIndex /*effIndex*/) +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_NETHER_TALENT) || +                    !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_NETHER_WARD) || +                    !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_SHADOW_WARD)) +                    return false; +                return true; +            } + +            void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) +            { +                if (GetUnitOwner()->HasAura(SPELL_WARLOCK_NETHER_TALENT)) +                    amount = SPELL_WARLOCK_NETHER_WARD; +                else +                    amount = SPELL_WARLOCK_SHADOW_WARD; +            } + +            void Register() override +            { +                DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warl_nether_ward_overrride_AuraScript::CalculateAmount, EFFECT_2, SPELL_AURA_OVERRIDE_ACTIONBAR_SPELLS); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_warl_nether_ward_overrride_AuraScript(); +        } +}; + +// 6358 - Seduction (Special Ability) +class spell_warl_seduction : public SpellScriptLoader +{ +    public: +        spell_warl_seduction() : SpellScriptLoader("spell_warl_seduction") { } + +        class spell_warl_seduction_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_warl_seduction_SpellScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_GLYPH_OF_SUCCUBUS) || +                    !sSpellMgr->GetSpellInfo(SPELL_PRIEST_SHADOW_WORD_DEATH)) +                    return false; +                return true; +            } + +            void HandleScriptEffect(SpellEffIndex /*effIndex*/)              {                  Unit* caster = GetCaster(); -                caster->CastSpell(caster, GetEffectValue(), true); +                if (Unit* target = GetHitUnit()) +                { +                    if (caster->GetOwner() && caster->GetOwner()->HasAura(SPELL_WARLOCK_GLYPH_OF_SUCCUBUS)) +                    { +                        target->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE, 0, target->GetAura(SPELL_PRIEST_SHADOW_WORD_DEATH)); // SW:D shall not be removed. +                        target->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT); +                        target->RemoveAurasByType(SPELL_AURA_PERIODIC_LEECH); +                    } +                }              }              void Register() override              { -                OnEffectHit += SpellEffectFn(spell_warl_ritual_of_doom_effect_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); +                OnEffectHitTarget += SpellEffectFn(spell_warl_seduction_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_APPLY_AURA);              }          };          SpellScript* GetSpellScript() const override          { -            return new spell_warl_ritual_of_doom_effect_SpellScript(); +            return new spell_warl_seduction_SpellScript();          }  }; -// -27285 - Seed of Corruption +// 27285 - Seed of Corruption +/// Updated 4.3.4  class spell_warl_seed_of_corruption : public SpellScriptLoader  {      public: @@ -739,6 +1049,42 @@ class spell_warl_seed_of_corruption : public SpellScriptLoader          }  }; +// -18094 - Nightfall +// 56218 - Glyph of Corruption +class spell_warl_shadow_trance_proc : public SpellScriptLoader +{ +    public: +        spell_warl_shadow_trance_proc() : SpellScriptLoader("spell_warl_shadow_trance_proc") { } + +        class spell_warl_shadow_trance_proc_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_warl_shadow_trance_proc_AuraScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_SHADOW_TRANCE)) +                    return false; +                return true; +            } + +            void OnProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) +            { +                PreventDefaultAction(); +                GetTarget()->CastSpell(GetTarget(), SPELL_WARLOCK_SHADOW_TRANCE, true, NULL, aurEff); +            } + +            void Register() override +            { +                OnEffectProc += AuraEffectProcFn(spell_warl_shadow_trance_proc_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_warl_shadow_trance_proc_AuraScript(); +        } +}; +  // -7235 - Shadow Ward  class spell_warl_shadow_ward : public SpellScriptLoader  { @@ -776,56 +1122,246 @@ class spell_warl_shadow_ward : public SpellScriptLoader          }  }; -// 63108 - Siphon Life -class spell_warl_siphon_life : public SpellScriptLoader +// -30293 - Soul Leech +class spell_warl_soul_leech : public SpellScriptLoader  {      public: -        spell_warl_siphon_life() : SpellScriptLoader("spell_warl_siphon_life") { } +        spell_warl_soul_leech() : SpellScriptLoader("spell_warl_soul_leech") { } -        class spell_warl_siphon_life_AuraScript : public AuraScript +        class spell_warl_soul_leech_AuraScript : public AuraScript          { -            PrepareAuraScript(spell_warl_siphon_life_AuraScript); +            PrepareAuraScript(spell_warl_soul_leech_AuraScript);              bool Validate(SpellInfo const* /*spellInfo*/) override              { -                if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_SIPHON_LIFE_HEAL)) -                    return false; -                if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_GLYPH_OF_SIPHON_LIFE)) +                if (!sSpellMgr->GetSpellInfo(SPELL_GEN_REPLENISHMENT))                      return false;                  return true;              } -            bool CheckProc(ProcEventInfo& eventInfo) +            void OnProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)              { -                return eventInfo.GetDamageInfo()->GetDamage() && GetTarget()->IsAlive(); +                GetTarget()->CastSpell((Unit*)NULL, SPELL_GEN_REPLENISHMENT, true, NULL, aurEff);              } -            void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) +            void Register() override              { -                PreventDefaultAction(); +                OnEffectProc += AuraEffectProcFn(spell_warl_soul_leech_AuraScript::OnProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_warl_soul_leech_AuraScript(); +        } +}; + +// 86121 - Soul Swap +class spell_warl_soul_swap : public SpellScriptLoader +{ +    public: +        spell_warl_soul_swap() : SpellScriptLoader("spell_warl_soul_swap") { } + +        class spell_warl_soul_swap_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_warl_soul_swap_SpellScript); -                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()); +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_GLYPH_OF_SOUL_SWAP) || +                    !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_SOUL_SWAP_CD_MARKER) || +                    !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_SOUL_SWAP_OVERRIDE)) +                    return false; +                return true; +            } -                GetTarget()->CastCustomSpell(SPELL_WARLOCK_SIPHON_LIFE_HEAL, SPELLVALUE_BASE_POINT0, amount, GetTarget(), true, NULL, aurEff); +            void HandleHit(SpellEffIndex /*effIndex*/) +            { +                GetCaster()->CastSpell(GetCaster(), SPELL_WARLOCK_SOUL_SWAP_OVERRIDE, true); +                GetHitUnit()->CastSpell(GetCaster(), SPELL_WARLOCK_SOUL_SWAP_DOT_MARKER, true);              }              void Register() override              { -                DoCheckProc += AuraCheckProcFn(spell_warl_siphon_life_AuraScript::CheckProc); -                OnEffectProc += AuraEffectProcFn(spell_warl_siphon_life_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY); +                OnEffectHitTarget += SpellEffectFn(spell_warl_soul_swap_SpellScript::HandleHit, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);              }          }; +        SpellScript* GetSpellScript() const override +        { +            return new spell_warl_soul_swap_SpellScript(); +        } +}; + +// 86211 - Soul Swap Override - Also acts as a dot container +class spell_warl_soul_swap_override : public SpellScriptLoader +{ +    public: +        spell_warl_soul_swap_override() : SpellScriptLoader("spell_warl_soul_swap_override") { } + +        class spell_warl_soul_swap_override_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_warl_soul_swap_override_AuraScript); + +            bool Load() override +            { +                _swapCaster = NULL; +                return true; +            } + +            //! Forced to, pure virtual functions must have a body when linking +            void Register() override { } + +        public: +            void AddDot(uint32 id)                          { _dotList.push_back(id); } +            std::list<uint32> const GetDotList() const      { return _dotList; } +            Unit* GetOriginalSwapSource() const             { return _swapCaster; } +            void SetOriginalSwapSource(Unit* victim)        { _swapCaster = victim; } + +        private: +            std::list<uint32> _dotList; +            Unit* _swapCaster; +        }; +          AuraScript* GetAuraScript() const override          { -            return new spell_warl_siphon_life_AuraScript(); +            return new spell_warl_soul_swap_override_AuraScript();          }  }; +typedef spell_warl_soul_swap_override::spell_warl_soul_swap_override_AuraScript SoulSwapOverrideAuraScript; + +//! Soul Swap Copy Spells - 92795 - Simply copies spell IDs. +class spell_warl_soul_swap_dot_marker : public SpellScriptLoader +{ +    public: +        spell_warl_soul_swap_dot_marker() : SpellScriptLoader("spell_warl_soul_swap_dot_marker") { } + +        class spell_warl_soul_swap_dot_marker_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_warl_soul_swap_dot_marker_SpellScript); + +            void HandleHit(SpellEffIndex effIndex) +            { +                Unit* swapVictim = GetCaster(); +                Unit* warlock    = GetHitUnit(); +                if (!warlock || !swapVictim) +                    return; + +                flag96 classMask = GetSpellInfo()->Effects[effIndex].SpellClassMask; + +                Unit::AuraApplicationMap const& appliedAuras = swapVictim->GetAppliedAuras(); +                SoulSwapOverrideAuraScript* swapSpellScript = NULL; +                if (Aura* swapOverrideAura = warlock->GetAura(SPELL_WARLOCK_SOUL_SWAP_OVERRIDE)) +                    swapSpellScript = dynamic_cast<SoulSwapOverrideAuraScript*>(swapOverrideAura->GetScriptByName("spell_warl_soul_swap_override")); + +                if (swapSpellScript == NULL) +                    return; + +                for (Unit::AuraApplicationMap::const_iterator itr = appliedAuras.begin(); itr != appliedAuras.end(); ++itr) +                { +                    SpellInfo const* spellProto = itr->second->GetBase()->GetSpellInfo(); +                    if (itr->second->GetBase()->GetCaster() == warlock) +                        if (spellProto->SpellFamilyName == SPELLFAMILY_WARLOCK && (spellProto->SpellFamilyFlags & classMask)) +                            swapSpellScript->AddDot(itr->first); +                } + +                swapSpellScript->SetOriginalSwapSource(swapVictim); +            } + +            void Register() override +            { +                OnEffectHitTarget += SpellEffectFn(spell_warl_soul_swap_dot_marker_SpellScript::HandleHit, EFFECT_0, SPELL_EFFECT_DUMMY); +            } +        }; + +        SpellScript* GetSpellScript() const override +        { +            return new spell_warl_soul_swap_dot_marker_SpellScript(); +        } +}; + +// 86213 - Soul Swap Exhale +class spell_warl_soul_swap_exhale : public SpellScriptLoader +{ +public: +    spell_warl_soul_swap_exhale() : SpellScriptLoader("spell_warl_soul_swap_exhale") { } + +    class spell_warl_soul_swap_exhale_SpellScript : public SpellScript +    { +        PrepareSpellScript(spell_warl_soul_swap_exhale_SpellScript); + +        bool Validate(SpellInfo const* /*spellInfo*/) override +        { +            if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_SOUL_SWAP_MOD_COST) || +                !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_SOUL_SWAP_OVERRIDE)) +                return false; +            return true; +        } + +        SpellCastResult CheckCast() +        { +            Unit* currentTarget = GetExplTargetUnit(); +            Unit* swapTarget = NULL; +            if (Aura const* swapOverride = GetCaster()->GetAura(SPELL_WARLOCK_SOUL_SWAP_OVERRIDE)) +                if (SoulSwapOverrideAuraScript* swapScript = dynamic_cast<SoulSwapOverrideAuraScript*>(swapOverride->GetScriptByName("spell_warl_soul_swap_override"))) +                    swapTarget = swapScript->GetOriginalSwapSource(); + +            // Soul Swap Exhale can't be cast on the same target than Soul Swap +            if (swapTarget && currentTarget && swapTarget == currentTarget) +                return SPELL_FAILED_BAD_TARGETS; + +            return SPELL_CAST_OK; +        } + +        void OnEffectHit(SpellEffIndex /*effIndex*/) +        { +            GetCaster()->CastSpell(GetCaster(), SPELL_WARLOCK_SOUL_SWAP_MOD_COST, true); +            bool hasGlyph = GetCaster()->HasAura(SPELL_WARLOCK_GLYPH_OF_SOUL_SWAP); + +            std::list<uint32> dotList; +            Unit* swapSource = NULL; +            if (Aura const* swapOverride = GetCaster()->GetAura(SPELL_WARLOCK_SOUL_SWAP_OVERRIDE)) +            { +                SoulSwapOverrideAuraScript* swapScript = dynamic_cast<SoulSwapOverrideAuraScript*>(swapOverride->GetScriptByName("spell_warl_soul_swap_override")); +                if (!swapScript) +                    return; +                dotList = swapScript->GetDotList(); +                swapSource = swapScript->GetOriginalSwapSource(); +            } + +            if (dotList.empty()) +                return; + +            for (std::list<uint32>::const_iterator itr = dotList.begin(); itr != dotList.end(); ++itr) +            { +                GetCaster()->AddAura(*itr, GetHitUnit()); +                if (!hasGlyph && swapSource) +                    swapSource->RemoveAurasDueToSpell(*itr); +            } + +            // Remove Soul Swap Exhale buff +            GetCaster()->RemoveAurasDueToSpell(SPELL_WARLOCK_SOUL_SWAP_OVERRIDE); + +            if (hasGlyph) // Add a cooldown on Soul Swap if caster has the glyph +                GetCaster()->CastSpell(GetCaster(), SPELL_WARLOCK_SOUL_SWAP_CD_MARKER, false); +        } + +        void Register() override +        { +            OnCheckCast += SpellCheckCastFn(spell_warl_soul_swap_exhale_SpellScript::CheckCast); +            OnEffectHitTarget += SpellEffectFn(spell_warl_soul_swap_exhale_SpellScript::OnEffectHit, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); +        } +    }; + +    SpellScript* GetSpellScript() const override +    { +        return new spell_warl_soul_swap_exhale_SpellScript(); +    } +}; +  // 29858 - Soulshatter +/// Updated 4.3.4  class spell_warl_soulshatter : public SpellScriptLoader  {      public: @@ -846,10 +1382,8 @@ class spell_warl_soulshatter : public SpellScriptLoader              {                  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() override @@ -864,7 +1398,8 @@ class spell_warl_soulshatter : public SpellScriptLoader          }  }; -// -30108 - Unstable Affliction +// 30108, 34438, 34439, 35183 - Unstable Affliction +/// Updated 4.3.4  class spell_warl_unstable_affliction : public SpellScriptLoader  {      public: @@ -884,7 +1419,7 @@ class spell_warl_unstable_affliction : public SpellScriptLoader              void HandleDispel(DispelInfo* dispelInfo)              {                  if (Unit* caster = GetCaster()) -                    if (AuraEffect const* aurEff = GetEffect(EFFECT_0)) +                    if (AuraEffect const* aurEff = GetEffect(EFFECT_1))                      {                          int32 damage = aurEff->GetAmount() * 9;                          // backfire damage and silence @@ -906,22 +1441,34 @@ class spell_warl_unstable_affliction : public SpellScriptLoader  void AddSC_warlock_spell_scripts()  { +    new spell_warl_aftermath(); +    new spell_warl_bane_of_doom();      new spell_warl_banish(); +    new spell_warl_conflagrate();      new spell_warl_create_healthstone(); -    new spell_warl_curse_of_doom();      new spell_warl_demonic_circle_summon();      new spell_warl_demonic_circle_teleport();      new spell_warl_demonic_empowerment(); +    new spell_warl_demon_soul();      new spell_warl_everlasting_affliction(); +    new spell_warl_fel_flame();      new spell_warl_fel_synergy();      new spell_warl_glyph_of_shadowflame();      new spell_warl_haunt();      new spell_warl_health_funnel(); +    new spell_warl_healthstone_heal(); +    new spell_warl_improved_soul_fire();      new spell_warl_life_tap(); -    new spell_warl_ritual_of_doom_effect(); +    new spell_warl_nether_ward_overrride(); +    new spell_warl_seduction();      new spell_warl_seed_of_corruption(); +    new spell_warl_shadow_trance_proc();      new spell_warl_shadow_ward(); -    new spell_warl_siphon_life(); +    new spell_warl_soul_leech(); +    new spell_warl_soul_swap(); +    new spell_warl_soul_swap_dot_marker(); +    new spell_warl_soul_swap_exhale(); +    new spell_warl_soul_swap_override();      new spell_warl_soulshatter();      new spell_warl_unstable_affliction();  } diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp index 58820b1e215..ecbc6ca1bdc 100644 --- a/src/server/scripts/Spells/spell_warrior.cpp +++ b/src/server/scripts/Spells/spell_warrior.cpp @@ -32,19 +32,26 @@ enum WarriorSpells      SPELL_WARRIOR_BLOODTHIRST                       = 23885,      SPELL_WARRIOR_BLOODTHIRST_DAMAGE                = 23881,      SPELL_WARRIOR_CHARGE                            = 34846, -    SPELL_WARRIOR_DAMAGE_SHIELD_DAMAGE              = 59653, +    SPELL_WARRIOR_COLOSSUS_SMASH                    = 86346,      SPELL_WARRIOR_DEEP_WOUNDS_RANK_1                = 12162,      SPELL_WARRIOR_DEEP_WOUNDS_RANK_2                = 12850,      SPELL_WARRIOR_DEEP_WOUNDS_RANK_3                = 12868,      SPELL_WARRIOR_DEEP_WOUNDS_PERIODIC              = 12721,      SPELL_WARRIOR_EXECUTE                           = 20647,      SPELL_WARRIOR_GLYPH_OF_EXECUTION                = 58367, -    SPELL_WARRIOR_GLYPH_OF_VIGILANCE                = 63326,      SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_BUFF        = 65156,      SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_TALENT      = 64976,      SPELL_WARRIOR_LAST_STAND_TRIGGERED              = 12976, +    SPELL_WARRIOR_MORTAL_STRIKE                     = 12294, +    SPELL_WARRIOR_RALLYING_CRY                      = 97463, +    SPELL_WARRIOR_REND                              = 94009,      SPELL_WARRIOR_RETALIATION_DAMAGE                = 22858, -    SPELL_WARRIOR_SLAM                              = 50783, +    SPELL_WARRIOR_SECOUND_WIND_PROC_RANK_1          = 29834, +    SPELL_WARRIOR_SECOUND_WIND_PROC_RANK_2          = 29838, +    SPELL_WARRIOR_SECOUND_WIND_TRIGGER_RANK_1       = 29841, +    SPELL_WARRIOR_SECOUND_WIND_TRIGGER_RANK_2       = 29842, +    SPELL_WARRIOR_SHIELD_SLAM                       = 23922, +    SPELL_WARRIOR_SLAM                              = 50782,      SPELL_WARRIOR_SUNDER_ARMOR                      = 58567,      SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK_1   = 12723,      SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK_2   = 26654, @@ -54,7 +61,7 @@ enum WarriorSpells      SPELL_WARRIOR_UNRELENTING_ASSAULT_TRIGGER_1     = 64849,      SPELL_WARRIOR_UNRELENTING_ASSAULT_TRIGGER_2     = 64850,      SPELL_WARRIOR_VIGILANCE_PROC                    = 50725, -    SPELL_WARRIOR_VIGILANCE_REDIRECT_THREAT         = 59665 +    SPELL_WARRIOR_VENGEANCE                         = 76691  };  enum WarriorSpellIcons @@ -62,15 +69,15 @@ enum WarriorSpellIcons      WARRIOR_ICON_ID_SUDDEN_DEATH                    = 1989  }; +  enum MiscSpells  {      SPELL_PALADIN_BLESSING_OF_SANCTUARY             = 20911,      SPELL_PALADIN_GREATER_BLESSING_OF_SANCTUARY     = 25899, -    SPELL_PRIEST_RENEWED_HOPE                       = 63944, -    SPELL_GEN_DAMAGE_REDUCTION_AURA                 = 68066, +    SPELL_PRIEST_RENEWED_HOPE                       = 63944  }; -// 23881 - Bloodthirst +/// Updated 4.3.4  class spell_warr_bloodthirst : public SpellScriptLoader  {      public: @@ -112,7 +119,7 @@ class spell_warr_bloodthirst : public SpellScriptLoader          }  }; -// 23880 - Bloodthirst (Heal) +/// Updated 4.3.4  class spell_warr_bloodthirst_heal : public SpellScriptLoader  {      public: @@ -125,7 +132,7 @@ class spell_warr_bloodthirst_heal : public SpellScriptLoader              void HandleHeal(SpellEffIndex /*effIndex*/)              {                  if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_WARRIOR_BLOODTHIRST_DAMAGE)) -                    SetHitHeal(GetCaster()->CountPctFromMaxHealth(spellInfo->Effects[EFFECT_1].CalcValue(GetCaster()))); +                    SetHitHeal(GetCaster()->CountPctFromMaxHealth(spellInfo->Effects[EFFECT_1].CalcValue(GetCaster())) / 100);              }              void Register() override @@ -140,7 +147,7 @@ class spell_warr_bloodthirst_heal : public SpellScriptLoader          }  }; -// -100 - Charge +/// Updated 4.3.4  class spell_warr_charge : public SpellScriptLoader  {      public: @@ -152,7 +159,9 @@ class spell_warr_charge : public SpellScriptLoader              bool Validate(SpellInfo const* /*spellInfo*/) override              { -                if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_TALENT) || !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_BUFF) || !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_CHARGE)) +                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;              } @@ -180,7 +189,7 @@ class spell_warr_charge : public SpellScriptLoader          }  }; -// 12809 - Concussion Blow +/// Updated 4.3.4  class spell_warr_concussion_blow : public SpellScriptLoader  {      public: @@ -207,44 +216,6 @@ class spell_warr_concussion_blow : public SpellScriptLoader          }  }; -// -58872 - Damage Shield -class spell_warr_damage_shield : public SpellScriptLoader -{ -    public: -        spell_warr_damage_shield() : SpellScriptLoader("spell_warr_damage_shield") { } - -        class spell_warr_damage_shield_AuraScript : public AuraScript -        { -            PrepareAuraScript(spell_warr_damage_shield_AuraScript); - -            bool Validate(SpellInfo const* /*spellInfo*/) override -            { -                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() override -            { -                OnEffectProc += AuraEffectProcFn(spell_warr_damage_shield_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY); -            } -        }; - -        AuraScript* GetAuraScript() const override -        { -            return new spell_warr_damage_shield_AuraScript(); -        } -}; -  // -12162 - Deep Wounds  class spell_warr_deep_wounds : public SpellScriptLoader  { @@ -257,7 +228,10 @@ class spell_warr_deep_wounds : public SpellScriptLoader              bool Validate(SpellInfo const* /*spellInfo*/) override              { -                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)) +                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) || +                    !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_DEEP_WOUNDS_PERIODIC))                      return false;                  return true;              } @@ -295,7 +269,7 @@ class spell_warr_deep_wounds : public SpellScriptLoader          }  }; -// -5308 - Execute +/// Updated 4.3.4  class spell_warr_execute : public SpellScriptLoader  {      public: @@ -305,43 +279,35 @@ class spell_warr_execute : public SpellScriptLoader          {              PrepareSpellScript(spell_warr_execute_SpellScript); -            bool Validate(SpellInfo const* /*spellInfo*/) override -            { -                if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_EXECUTE) || !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_GLYPH_OF_EXECUTION)) -                    return false; -                return true; -            } - -            void HandleEffect(SpellEffIndex effIndex) +            void HandleEffect(SpellEffIndex /*effIndex*/)              {                  Unit* caster = GetCaster(); -                if (Unit* target = GetHitUnit()) +                if (GetHitUnit())                  {                      SpellInfo const* spellInfo = GetSpellInfo(); -                    int32 rageUsed = std::min<int32>(300 - spellInfo->CalcPowerCost(caster, SpellSchoolMask(spellInfo->SchoolMask)), caster->GetPower(POWER_RAGE)); +                    int32 rageUsed = std::min<int32>(200 - spellInfo->CalcPowerCost(caster, SpellSchoolMask(spellInfo->SchoolMask)), caster->GetPower(POWER_RAGE));                      int32 newRage = std::max<int32>(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; +                        int32 ragesave = aurEff->GetSpellInfo()->Effects[EFFECT_0].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, NULL, NULL, true, NULL, NULL, GetOriginalCaster()->GetGUID()); +                    /// Formula taken from the DBC: "${10+$AP*0.437*$m1/100}" +                    int32 baseDamage = int32(10 + caster->GetTotalAttackPowerValue(BASE_ATTACK) * 0.437f * GetEffectValue() / 100.0f); +                    /// Formula taken from the DBC: "${$ap*0.874*$m1/100-1} = 20 rage" +                    int32 moreDamage = int32(rageUsed * (caster->GetTotalAttackPowerValue(BASE_ATTACK) * 0.874f * GetEffectValue() / 100.0f - 1) / 200); +                    SetHitDamage(baseDamage + moreDamage);                  }              }              void Register() override              { -                OnEffectHitTarget += SpellEffectFn(spell_warr_execute_SpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_DUMMY); +                OnEffectHitTarget += SpellEffectFn(spell_warr_execute_SpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);              }          }; @@ -443,6 +409,44 @@ class spell_warr_intimidating_shout : public SpellScriptLoader          }  }; +// -84583 Lambs to the Slaughter +class spell_warr_lambs_to_the_slaughter : public SpellScriptLoader +{ +    public: +        spell_warr_lambs_to_the_slaughter() : SpellScriptLoader("spell_warr_lambs_to_the_slaughter") { } + +        class spell_warr_lambs_to_the_slaughter_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_warr_lambs_to_the_slaughter_AuraScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_MORTAL_STRIKE) || +                    !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_REND)) +                    return false; +                return true; +            } + +            void OnProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) +            { +                if (Aura* aur = eventInfo.GetProcTarget()->GetAura(SPELL_WARRIOR_REND, GetTarget()->GetGUID())) +                    aur->SetDuration(aur->GetSpellInfo()->GetMaxDuration(), true); + +            } + +            void Register() override +            { +                OnEffectProc += AuraEffectProcFn(spell_warr_lambs_to_the_slaughter_AuraScript::OnProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_warr_lambs_to_the_slaughter_AuraScript(); +        } +}; + +/// Updated 4.3.4  // 12975 - Last Stand  class spell_warr_last_stand : public SpellScriptLoader  { @@ -469,6 +473,7 @@ class spell_warr_last_stand : public SpellScriptLoader              void Register() override              { +                // add dummy effect spell handler to Last Stand                  OnEffectHit += SpellEffectFn(spell_warr_last_stand_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);              }          }; @@ -479,7 +484,7 @@ class spell_warr_last_stand : public SpellScriptLoader          }  }; -// 7384, 7887, 11584, 11585 - Overpower +// 7384 - Overpower  class spell_warr_overpower : public SpellScriptLoader  {      public: @@ -517,7 +522,48 @@ class spell_warr_overpower : public SpellScriptLoader          }  }; -// -772 - Rend +// 97462 - Rallying Cry +class spell_warr_rallying_cry : public SpellScriptLoader +{ +    public: +        spell_warr_rallying_cry() : SpellScriptLoader("spell_warr_rallying_cry") { } + +        class spell_warr_rallying_cry_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_warr_rallying_cry_SpellScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_RALLYING_CRY)) +                    return false; +                return true; +            } + +            bool Load() override +            { +                return GetCaster()->GetTypeId() ==  TYPEID_PLAYER; +            } + +            void HandleScript(SpellEffIndex /*effIndex*/) +            { +                int32 basePoints0 = int32(GetHitUnit()->CountPctFromMaxHealth(GetEffectValue())); + +                GetCaster()->CastCustomSpell(GetHitUnit(), SPELL_WARRIOR_RALLYING_CRY, &basePoints0, NULL, NULL, true); +            } + +            void Register() override +            { +                OnEffectHitTarget += SpellEffectFn(spell_warr_rallying_cry_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); +            } +        }; + +        SpellScript* GetSpellScript() const override +        { +            return new spell_warr_rallying_cry_SpellScript(); +        } +}; + +// 94009 - Rend  class spell_warr_rend : public SpellScriptLoader  {      public: @@ -533,21 +579,13 @@ class spell_warr_rend : public SpellScriptLoader                  {                      canBeRecalculated = false; -                    // $0.2 * (($MWB + $mwb) / 2 + $AP / 14 * $MWS) bonus per tick +                    // $0.25 * (($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; +                    float mwb = ((mwbMin + mwbMax) / 2 + ap * mws / 14000) * 0.25f;                      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)); -                    }                  }              } @@ -636,7 +674,7 @@ class spell_warr_shattering_throw : public SpellScriptLoader          }  }; -// -1464 - Slam +/// Updated 4.3.4  class spell_warr_slam : public SpellScriptLoader  {      public: @@ -671,6 +709,126 @@ class spell_warr_slam : public SpellScriptLoader          }  }; +class spell_warr_second_wind_proc : public SpellScriptLoader +{ +    public: +        spell_warr_second_wind_proc() : SpellScriptLoader("spell_warr_second_wind_proc") { } + +        class spell_warr_second_wind_proc_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_warr_second_wind_proc_AuraScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_SECOUND_WIND_PROC_RANK_1) || +                    !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_SECOUND_WIND_PROC_RANK_2) || +                    !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_SECOUND_WIND_TRIGGER_RANK_1) || +                    !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_SECOUND_WIND_TRIGGER_RANK_2)) +                    return false; +                return true; +            } + +            bool CheckProc(ProcEventInfo& eventInfo) +            { +                if (eventInfo.GetProcTarget() == GetTarget()) +                    return false; +                if (!eventInfo.GetDamageInfo()->GetSpellInfo() || !(eventInfo.GetDamageInfo()->GetSpellInfo()->GetAllEffectsMechanicMask() & ((1 << MECHANIC_ROOT) | (1 << MECHANIC_STUN)))) +                    return false; +                return true; +            } + +            void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) +            { +                PreventDefaultAction(); +                uint32 spellId = 0; + +                if (GetSpellInfo()->Id == SPELL_WARRIOR_SECOUND_WIND_PROC_RANK_1) +                    spellId = SPELL_WARRIOR_SECOUND_WIND_TRIGGER_RANK_1; +                else if (GetSpellInfo()->Id == SPELL_WARRIOR_SECOUND_WIND_PROC_RANK_2) +                    spellId = SPELL_WARRIOR_SECOUND_WIND_TRIGGER_RANK_2; +                if (!spellId) +                    return; + +                GetTarget()->CastSpell(GetTarget(), spellId, true, NULL, aurEff); + +            } + +            void Register() override +            { +                DoCheckProc += AuraCheckProcFn(spell_warr_second_wind_proc_AuraScript::CheckProc); +                OnEffectProc += AuraEffectProcFn(spell_warr_second_wind_proc_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); +            } + +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_warr_second_wind_proc_AuraScript(); +        } +}; + +class spell_warr_second_wind_trigger : public SpellScriptLoader +{ +    public: +        spell_warr_second_wind_trigger() : SpellScriptLoader("spell_warr_second_wind_trigger") { } + +        class spell_warr_second_wind_trigger_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_warr_second_wind_trigger_AuraScript); + +            void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) +            { +                amount = int32(GetUnitOwner()->CountPctFromMaxHealth(amount)); +            } + +            void Register() override +            { +                DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warr_second_wind_trigger_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_PERIODIC_HEAL); +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_warr_second_wind_trigger_AuraScript(); +        } +}; + +// 52437 - Sudden Death +class spell_warr_sudden_death : public SpellScriptLoader +{ +    public: +        spell_warr_sudden_death() : SpellScriptLoader("spell_warr_sudden_death") { } + +        class spell_warr_sudden_death_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_warr_sudden_death_AuraScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_COLOSSUS_SMASH)) +                    return false; +                return true; +            } + +            void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) +            { +                // Remove cooldown on Colossus Smash +                if (Player* player = GetTarget()->ToPlayer()) +                    player->RemoveSpellCooldown(SPELL_WARRIOR_COLOSSUS_SMASH, true); +            } + +            void Register() override +            { +                AfterEffectApply += AuraEffectRemoveFn(spell_warr_sudden_death_AuraScript::HandleApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); // correct? +            } +        }; + +        AuraScript* GetAuraScript() const override +        { +            return new spell_warr_sudden_death_AuraScript(); +        } +}; +  // 12328, 18765, 35429 - Sweeping Strikes  class spell_warr_sweeping_strikes : public SpellScriptLoader  { @@ -735,88 +893,123 @@ class spell_warr_sweeping_strikes : public SpellScriptLoader          }  }; -// 50720 - Vigilance -class spell_warr_vigilance : public SpellScriptLoader +// -46951 - Sword and Board +class spell_warr_sword_and_board : public SpellScriptLoader  {      public: -        spell_warr_vigilance() : SpellScriptLoader("spell_warr_vigilance") { } +        spell_warr_sword_and_board() : SpellScriptLoader("spell_warr_sword_and_board") { } -        class spell_warr_vigilance_AuraScript : public AuraScript +        class spell_warr_sword_and_board_AuraScript : public AuraScript          { -            PrepareAuraScript(spell_warr_vigilance_AuraScript); +            PrepareAuraScript(spell_warr_sword_and_board_AuraScript);              bool Validate(SpellInfo const* /*spellInfo*/) override              { -                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)) +                if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_SHIELD_SLAM))                      return false;                  return true;              } -            bool Load() override +            void OnProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/)              { -                _procTarget = NULL; -                return true; +                // Remove cooldown on Shield Slam +                if (Player* player = GetTarget()->ToPlayer()) +                    player->RemoveSpellCooldown(SPELL_WARRIOR_SHIELD_SLAM, true);              } -            void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) +            void Register() override              { -                Unit* target = GetTarget(); -                target->CastSpell(target, SPELL_GEN_DAMAGE_REDUCTION_AURA, true); +                OnEffectProc += AuraEffectProcFn(spell_warr_sword_and_board_AuraScript::OnProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); +            } +        }; -                if (Unit* caster = GetCaster()) -                    target->CastSpell(caster, SPELL_WARRIOR_VIGILANCE_REDIRECT_THREAT, true); +        AuraScript* GetAuraScript() const override +        { +            return new spell_warr_sword_and_board_AuraScript(); +        } +}; + +// 32216 - Victorious +// 82368 - Victorious +class spell_warr_victorious : public SpellScriptLoader +{ +    public: +        spell_warr_victorious() : SpellScriptLoader("spell_warr_victorious") { } + +        class spell_warr_victorious_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_warr_victorious_AuraScript); + +            void HandleEffectProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) +            { +                PreventDefaultAction(); +                GetTarget()->RemoveAura(GetId());              } -            void HandleAfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) +            void Register() override              { -                //! 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()); -                } +                OnEffectProc += AuraEffectProcFn(spell_warr_victorious_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);              } +        }; -            void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) +        AuraScript* GetAuraScript() const override +        { +            return new spell_warr_victorious_AuraScript(); +        } +}; + +// 50720 - Vigilance +class spell_warr_vigilance : public SpellScriptLoader +{ +    public: +        spell_warr_vigilance() : SpellScriptLoader("spell_warr_vigilance") { } + +        class spell_warr_vigilance_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_warr_vigilance_AuraScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) override              { -                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); -                } +                if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_VENGEANCE)) +                    return false; +                return true; +            } -                target->ResetRedirectThreat(); +            bool Load() override +            { +                _procTarget = NULL; +                return true;              } -            bool CheckProc(ProcEventInfo& /*eventInfo*/) +            bool CheckProc(ProcEventInfo& eventInfo)              {                  _procTarget = GetCaster(); -                return _procTarget != nullptr; +                return _procTarget && eventInfo.GetDamageInfo();              } -            void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) +            void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)              {                  PreventDefaultAction(); +                int32 damage = int32(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue())); +                  GetTarget()->CastSpell(_procTarget, SPELL_WARRIOR_VIGILANCE_PROC, true, NULL, aurEff); +                _procTarget->CastCustomSpell(_procTarget, SPELL_WARRIOR_VENGEANCE, &damage, &damage, &damage, true, NULL, aurEff); +            } + +            void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) +            { +                if (Unit* caster = GetCaster()) +                { +                    if (caster->HasAura(SPELL_WARRIOR_VENGEANCE)) +                        caster->RemoveAurasDueToSpell(SPELL_WARRIOR_VENGEANCE); +                }              }              void Register() override              { -                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); +                OnEffectRemove += AuraEffectRemoveFn(spell_warr_vigilance_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);              }          private: @@ -829,7 +1022,7 @@ class spell_warr_vigilance : public SpellScriptLoader          }  }; -// 50725 - Vigilance +// 50725 Vigilance  class spell_warr_vigilance_trigger : public SpellScriptLoader  {      public: @@ -866,19 +1059,25 @@ void AddSC_warrior_spell_scripts()      new spell_warr_bloodthirst_heal();      new spell_warr_charge();      new spell_warr_concussion_blow(); -    new spell_warr_damage_shield();      new spell_warr_deep_wounds();      new spell_warr_execute();      new spell_warr_glyph_of_sunder_armor();      new spell_warr_improved_spell_reflection();      new spell_warr_intimidating_shout(); +    new spell_warr_lambs_to_the_slaughter();      new spell_warr_last_stand();      new spell_warr_overpower(); +    new spell_warr_rallying_cry();      new spell_warr_rend();      new spell_warr_retaliation(); +    new spell_warr_second_wind_proc(); +    new spell_warr_second_wind_trigger();      new spell_warr_shattering_throw();      new spell_warr_slam(); +    new spell_warr_sudden_death();      new spell_warr_sweeping_strikes(); +    new spell_warr_sword_and_board(); +    new spell_warr_victorious();      new spell_warr_vigilance();      new spell_warr_vigilance_trigger();  } diff --git a/src/server/scripts/World/go_scripts.cpp b/src/server/scripts/World/go_scripts.cpp index 7ba043f2a2e..1fdd314a9ed 100644 --- a/src/server/scripts/World/go_scripts.cpp +++ b/src/server/scripts/World/go_scripts.cpp @@ -843,23 +843,6 @@ public:  ## go_soulwell  ######*/ -enum SoulWellData -{ -    GO_SOUL_WELL_R1                     = 181621, -    GO_SOUL_WELL_R2                     = 193169, - -    SPELL_IMPROVED_HEALTH_STONE_R1      = 18692, -    SPELL_IMPROVED_HEALTH_STONE_R2      = 18693, - -    SPELL_CREATE_MASTER_HEALTH_STONE_R0 = 34130, -    SPELL_CREATE_MASTER_HEALTH_STONE_R1 = 34149, -    SPELL_CREATE_MASTER_HEALTH_STONE_R2 = 34150, - -    SPELL_CREATE_FEL_HEALTH_STONE_R0    = 58890, -    SPELL_CREATE_FEL_HEALTH_STONE_R1    = 58896, -    SPELL_CREATE_FEL_HEALTH_STONE_R2    = 58898, -}; -  class go_soulwell : public GameObjectScript  {      public: @@ -869,39 +852,6 @@ class go_soulwell : public GameObjectScript          {              go_soulwellAI(GameObject* go) : GameObjectAI(go)              { -                _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;              }              /// Due to the fact that this GameObject triggers CMSG_GAMEOBJECT_USE @@ -911,31 +861,10 @@ class go_soulwell : public GameObjectScript              bool GossipHello(Player* player) override              {                  Unit* owner = go->GetOwner(); -                if (_stoneSpell == 0 || _stoneId == 0) -                    return true; -                  if (!owner || owner->GetTypeId() != TYPEID_PLAYER || !player->IsInSameRaidWith(owner->ToPlayer()))                      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; -                } - -                owner->CastSpell(player, _stoneSpell, true); -                // Item has to actually be created to remove a charge on the well. -                if (player->HasItemCount(_stoneId)) -                    go->AddUse(); -                  return false;              } - -        private: -            uint32 _stoneSpell; -            uint32 _stoneId;          };          GameObjectAI* GetAI(GameObject* go) const override diff --git a/src/server/scripts/World/item_scripts.cpp b/src/server/scripts/World/item_scripts.cpp index a191f37c76c..45886fd4361 100644 --- a/src/server/scripts/World/item_scripts.cpp +++ b/src/server/scripts/World/item_scripts.cpp @@ -76,7 +76,7 @@ public:              return false;          // error -        player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, item, NULL); +        player->SendEquipError(EQUIP_ERR_CLIENT_LOCKED_OUT, item, NULL);          return true;      }  }; @@ -119,7 +119,7 @@ public:              targets.GetUnitTarget()->GetEntry() == 20748 && !targets.GetUnitTarget()->HasAura(32578))              return false; -        player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, item, NULL); +        player->SendEquipError(EQUIP_ERR_CLIENT_LOCKED_OUT, item, NULL);          return true;      }  }; @@ -268,15 +268,13 @@ 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*/) override +    bool OnUse(Player* player, Item* /*item*/, const SpellCastTargets & /*targets*/) override      {          if (player->GetZoneId() != ZONE_ID_HOWLING)              return false;          if (!player->GetTransport() || player->GetAreaId() != AREA_ID_SHATTERED_STRAITS)          { -            player->SendEquipError(EQUIP_ERR_NONE, item, NULL); -              if (const SpellInfo* spellInfo = sSpellMgr->GetSpellInfo(SPELL_PETROV_BOMB))                  Spell::SendCastResult(player, spellInfo, 1, SPELL_FAILED_NOT_HERE); @@ -381,7 +379,7 @@ public:              } else                  player->SendEquipError(EQUIP_ERR_OUT_OF_RANGE, item, NULL);          } else -            player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, item, NULL); +            player->SendEquipError(EQUIP_ERR_CLIENT_LOCKED_OUT, item, NULL);          return true;      }  }; @@ -407,7 +405,7 @@ public:                  player->SendEquipError(EQUIP_ERR_OUT_OF_RANGE, item, NULL);          }          else -            player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, item, NULL); +            player->SendEquipError(EQUIP_ERR_CLIENT_LOCKED_OUT, item, NULL);          return true;      }  }; diff --git a/src/server/scripts/World/npc_professions.cpp b/src/server/scripts/World/npc_professions.cpp index 083105b6aa4..17c37c7eba0 100644 --- a/src/server/scripts/World/npc_professions.cpp +++ b/src/server/scripts/World/npc_professions.cpp @@ -214,7 +214,7 @@ int32 DoLowUnlearnCost(Player* player)                     //blacksmith  void ProcessCastaction(Player* player, Creature* creature, uint32 spellId, uint32 triggeredSpellId, int32 cost)  { -    if (!(spellId && player->HasSpell(spellId)) && player->HasEnoughMoney(cost)) +    if (!(spellId && player->HasSpell(spellId)) && player->HasEnoughMoney((int64)cost))      {          player->CastSpell(player, triggeredSpellId, true);          player->ModifyMoney(-cost); @@ -352,11 +352,11 @@ void ProcessUnlearnAction(Player* player, Creature* creature, uint32 spellId, ui  {      if (EquippedOk(player, spellId))      { -        if (player->HasEnoughMoney(cost)) +        if (player->HasEnoughMoney(int64(cost)))          {              player->CastSpell(player, spellId, true);              ProfessionUnlearnSpells(player, spellId); -            player->ModifyMoney(-cost); +            player->ModifyMoney(-int64(cost));              if (alternativeSpellId)                  creature->CastSpell(player, alternativeSpellId, true);          } @@ -364,7 +364,7 @@ void ProcessUnlearnAction(Player* player, Creature* creature, uint32 spellId, ui              player->SendBuyError(BUY_ERR_NOT_ENOUGHT_MONEY, creature, 0, 0);      }      else -        player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, NULL, NULL); +        player->SendEquipError(EQUIP_ERR_CLIENT_LOCKED_OUT, NULL, NULL);      player->CLOSE_GOSSIP_MENU();  } diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index ff42743c496..d04b25147c7 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -455,9 +455,6 @@ public:              me->Relocate(x, y, z + 0.94f);              me->SetDisableGravity(true);              me->HandleEmoteCommand(EMOTE_ONESHOT_DANCE); -            WorldPacket data;                       //send update position to client -            me->BuildHeartBeatMsg(&data); -            me->SendMessageToSet(&data, true);          }          void UpdateAI(uint32 diff) override @@ -484,9 +481,6 @@ public:                  me->SetInFront(player);                  Active = false; -                WorldPacket data; -                me->BuildHeartBeatMsg(&data); -                me->SendMessageToSet(&data, true);                  switch (emote)                  {                      case TEXT_EMOTE_KISS: @@ -1931,11 +1925,11 @@ public:          }          if (doSwitch)          { -            if (!player->HasEnoughMoney(EXP_COST)) +            if (!player->HasEnoughMoney(uint64(EXP_COST)))                  player->SendBuyError(BUY_ERR_NOT_ENOUGHT_MONEY, 0, 0, 0);              else if (noXPGain)              { -                player->ModifyMoney(-EXP_COST); +                player->ModifyMoney(-int64(EXP_COST));                  player->RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_NO_XP_GAIN);              }              else if (!noXPGain)  | 
